mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 20:42:43 +00:00
When the auto-AI-read opt-in is on, a freshly uploaded document is summarised once in the background and the encrypted summary is stored and shown on the document detail view. - A background step runs after upload alongside the existing content-index and thumbnail steps. It generates a short (3-4 sentence) plain-language summary only when the user's documentsAutoAiRead opt-in is on (that flag is also the standing AI-egress consent), skips a document that already has one, and no-ops when no vision provider is configured. It reuses the same provider resolution, egress-consent re-assertion, and AI-budget reserve/reconcile helpers as the on-demand route; a provider error refunds the reservation and never fails the upload. - The summary is stored encrypted (summaryEncrypted Bytes) with a summaryGeneratedAt timestamp on inbound_documents, registered for key rotation, and returned decrypted in the document detail response. - The on-demand transient summary route is unchanged. Gated by the same consent, budget, and module checks.
24 lines
1.2 KiB
SQL
24 lines
1.2 KiB
SQL
-- Persist a short plain-language summary of an uploaded document.
|
|
--
|
|
-- Adds two nullable columns to `inbound_documents`:
|
|
-- - `summary_encrypted` — AES-256-GCM ciphertext of a 3-4 sentence
|
|
-- plain-language description of WHAT the document is, generated ONCE in
|
|
-- the background right after upload when the user's `documents_auto_ai_read`
|
|
-- opt-in is ON (that flag is also the standing AI-egress consent). NULL
|
|
-- when auto-read is OFF, no provider is configured, or generation has not
|
|
-- run yet.
|
|
-- - `summary_generated_at` — when that background summary was generated
|
|
-- (NULL until it runs).
|
|
--
|
|
-- STORAGE CONVENTION: Bytes (`bytea`), matching the dominant free-text
|
|
-- encrypted-note convention already in the schema (the `encrypt()` ciphertext
|
|
-- string stored UTF-8 as `bytea`, the shape the rotation script's
|
|
-- `rotateBytesColumn` already covers). The column is registered in
|
|
-- ENCRYPTED_COLUMNS + the rotation script in the same change.
|
|
--
|
|
-- ADDITIVE ONLY: existing rows keep NULL summaries; the on-demand transient
|
|
-- summary route is unchanged.
|
|
ALTER TABLE "inbound_documents"
|
|
ADD COLUMN IF NOT EXISTS "summary_encrypted" BYTEA,
|
|
ADD COLUMN IF NOT EXISTS "summary_generated_at" TIMESTAMP(3);
|