Task 7 of the slice plan. Implements the full repository surface backing every IPC inbox/capture path: create (UUID v7 + atomic notes + pending_jobs insert), insertMedia, findById/list, updateAiResult (CASE WHEN guard against title/summary overwrite when *_edited_by_user flips), markAiFailed (truncates ai_error to 500 chars + clears pending job), updateUserAiFields (sets edited flags as a side effect, replaces user-source tags), setIntent + dismissIntent (intent_prompted_at uses COALESCE so the first stamp wins), delete, getPendingCount, getAllPendingJobs, incrementJobAttempt, and a private hydrate that joins notes with note_tags + media. Plan deviation: list/list-with-cursor query gets a secondary "id DESC" tiebreaker. Two notes created in the same millisecond shared created_at and reordered nondeterministically; UUID v7 sorts monotonically with creation order, so id DESC restores "newest first" within ties. Verification: `npx vitest run tests/unit/NoteRepository.test.ts` 12 passed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.4 KiB
5.4 KiB