Files
FabledScribe/alembic/versions/0022_add_note_versions_and_drafts.py
bvandeusen 9036dfd931 Note editor sidebar, full-doc assist, persistent drafts, version history
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>
2026-03-05 17:10:55 -05:00

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")