feat: ambient AI visit scribe (record/paste → reviewed SOAP note)

Record a clinician↔patient visit (or paste a transcript) on the patient
sheet; the backend transcribes it (OpenAI Whisper / Gemini), de-identifies
the transcript + context through Veil, and drafts a structured SOAP note
the clinician reviews and edits before saving — the same write-approval
gate as the chat agent.

Backend: POST /api/scribe/{transcribe,draft,save} (routes/scribe.ts,
services/ai/transcribe.ts), veil.redactText() free-text redactor,
appendEncounter service, audio MIME types on attachments. Gated by
patient:write + the clinic AI policy (reception/disabled-AI excluded).
Frontend: ScribeDialog + lib/scribe.ts, "Record visit" on the patient
detail, gated by clinical access + AI availability. New `scribe` locale
namespace across all five languages. Bumps to v0.4.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalid Abdi
2026-07-03 18:33:30 +03:00
parent d237504af9
commit b29fdff1cb
19 changed files with 1207 additions and 4 deletions
+16
View File
@@ -7,6 +7,22 @@ for how releases are cut and published.
## [Unreleased]
## [0.4.0] — 2026-07-03
### Added
- **Ambient AI visit scribe** — a **Record visit** action on the patient sheet turns a
clinician↔patient conversation into a draft **SOAP** encounter note. Record with the
microphone (`MediaRecorder`, stored as an auditable patient attachment) or paste a
transcript; the backend transcribes via the user's **OpenAI (Whisper)** or **Gemini**
key, de-identifies the transcript + patient context through **Veil**, and the model
drafts a structured note that the clinician **reviews and edits before saving** — the
same write-approval gate as the chat agent. New `POST /api/scribe/{transcribe,draft,save}`
(`backend/src/routes/scribe.ts`, `services/ai/transcribe.ts`), a `veil.redactText()`
free-text redactor, and an `appendEncounter` service that adds one note without touching
the rest of the record. Gated by `patient:write` + the clinic AI policy (reception and
disabled-AI accounts don't see it). New `scribe` locale namespace across all five
languages. Drafting also works with local Ollama from a pasted transcript.
## [0.3.0] — 2026-07-02
### Added