Skip to content

feat(ai-partner): Amicus conversation persistence (#1457)#1483

Merged
CraigBuckmaster merged 1 commit into
masterfrom
claude/issue-1457-conversation-persistence
Apr 17, 2026
Merged

feat(ai-partner): Amicus conversation persistence (#1457)#1483
CraigBuckmaster merged 1 commit into
masterfrom
claude/issue-1457-conversation-persistence

Conversation

@CraigBuckmaster
Copy link
Copy Markdown
Owner

Closes #1457. Phase 2 of epic #1446. Stacked on #1452.

Summary

Persistence foundation for Amicus — threads, messages, usage. Local-only to user.db; never synced (Supabase phase 14 may revisit).

Migration v16

CREATE TABLE amicus_threads (thread_id PK, title, chapter_ref, pinned, created_at, last_message_at);
CREATE TABLE amicus_messages (message_id PK, thread_id FK CASCADE, role, content, citations_json, follow_ups_json, created_at);
CREATE TABLE amicus_usage (day PK, query_count);

New API surface

QuerieslistAmicusThreads, getAmicusThread, listAmicusMessages, getAmicusUsageToday, getAmicusUsageThisMonth.
MutationscreateAmicusThread, appendAmicusMessage (tx: insert + touch parent), updateThreadTitle, toggleThreadPin, deleteAmicusThread, clearAllAmicusData, incrementAmicusUsage.
TypesAmicusThread, AmicusMessage, AmicusCitation.
HookuseAmicusThreads() with optimistic pin/unpin/remove/rename.

Test plan

  • npx tsc --noEmit clean
  • npx jest — 3,218 tests pass
  • 19 new tests cover: pinned ordering, JSON hydration, transaction behavior, dedup of pin toggle, cascade delete, usage upsert
  • Migration count tests bumped 15 → 16

Out of scope

https://claude.ai/code/session_01Pht3kzgdvkn81DDfL9SnFe

Adds user.db migration v16 with amicus_threads + amicus_messages +
amicus_usage tables, plus typed read queries, write mutations, and a
useAmicusThreads hook.

New migration v16 (stacked on v15 from #1452):
- amicus_threads (pinned-first index)
- amicus_messages (CASCADE on thread delete)
- amicus_usage (day-keyed upsert table)

New types: AmicusThread, AmicusMessage, AmicusCitation.

New queries (app/src/db/userQueries.ts):
- listAmicusThreads(limit, offset)
- getAmicusThread(threadId)
- listAmicusMessages(threadId)
- getAmicusUsageToday / getAmicusUsageThisMonth

New mutations (app/src/db/userMutations.ts):
- createAmicusThread
- appendAmicusMessage (tx: insert + touch parent last_message_at)
- updateThreadTitle
- toggleThreadPin (returns new state)
- deleteAmicusThread (CASCADE handles messages)
- clearAllAmicusData (tx-wrapped wipe of all three tables)
- incrementAmicusUsage (upsert today row)

New hook useAmicusThreads — refresh + optimistic pin/unpin/remove/rename.

Citations + follow-ups are JSON-hydrated in the query layer so callers
receive typed objects. All IDs are caller-generated UUIDs (not
autoincrement) for future sync.

Tests: 19 new tests for queries + mutations; migration-count tests
bumped 15 → 16. All 3,218 app tests pass; tsc clean.

https://claude.ai/code/session_01Pht3kzgdvkn81DDfL9SnFe
@github-actions
Copy link
Copy Markdown

Test Results

✅ All tests passed

Passed Failed Total
Tests ✅ 3258 ❌ 0 3258
Suites ✅ 435 ❌ 0 435

Coverage

Statements Branches Functions Lines

⏱️ Duration: 75.1s

@CraigBuckmaster CraigBuckmaster merged commit e90d92c into master Apr 17, 2026
6 checks passed
@CraigBuckmaster CraigBuckmaster deleted the claude/issue-1457-conversation-persistence branch April 17, 2026 11:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ai-partner: conversation persistence (user.db)

2 participants