9036dfd931
NoteEditorView: two-column sidebar layout (project/milestone/tags/assist always visible), removed assist toggle button, InlineAssistPanel removed. Writing assist: whole_doc mode rewrites entire document; DiffView.vue replaces editor during review showing full-document diff. Scope dropdown in sidebar switches between whole-document and section modes. Persistent drafts: migration 0022 adds note_drafts (UNIQUE per note+user) and note_versions (max 20, auto-pruned) tables. Draft saved after generation completes, restored on editor mount, cleared on accept/reject. Version snapshot created automatically whenever note body changes on save. HistoryPanel.vue: version list + DiffView modal, restore button writes body back to editor. Config: OLLAMA_NUM_CTX default raised to 65536; assist num_predict now tracks Config.OLLAMA_NUM_CTX instead of a hardcoded 4096. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
"""Add note_drafts and note_versions tables."""
|
|
|
|
from alembic import op
|
|
|
|
revision = "0022"
|
|
down_revision = "0021"
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.execute("""
|
|
CREATE TABLE IF NOT EXISTS note_drafts (
|
|
id SERIAL PRIMARY KEY,
|
|
note_id INTEGER NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
|
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
proposed_body TEXT NOT NULL,
|
|
original_body TEXT NOT NULL,
|
|
instruction TEXT NOT NULL DEFAULT '',
|
|
scope TEXT NOT NULL DEFAULT 'document',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE (note_id, user_id)
|
|
)
|
|
""")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_note_drafts_note_id ON note_drafts(note_id)")
|
|
|
|
op.execute("""
|
|
CREATE TABLE IF NOT EXISTS note_versions (
|
|
id SERIAL PRIMARY KEY,
|
|
note_id INTEGER NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
|
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
body TEXT NOT NULL,
|
|
title TEXT NOT NULL DEFAULT '',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
)
|
|
""")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_note_versions_note_id ON note_versions(note_id)")
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.execute("DROP INDEX IF EXISTS ix_note_versions_note_id")
|
|
op.execute("DROP TABLE IF EXISTS note_versions")
|
|
op.execute("DROP INDEX IF EXISTS ix_note_drafts_note_id")
|
|
op.execute("DROP TABLE IF EXISTS note_drafts")
|