Skip to content

feat(meetings): global recording, persistence, summary, tools, discreet detection - #350

Merged
cabcookie merged 4 commits into
mainfrom
feat/sonic-meeting-stage2
Sep 23, 2026
Merged

cabcookie merged 4 commits into
mainfrom
feat/sonic-meeting-stage2

Conversation

@cabcookie

Copy link
Copy Markdown
Owner

Summary

Stage 2 of the Nova 2 Sonic meeting features. The recording now survives navigation, is controllable from the header, persists its transcript + summary, and the person detection is far less intrusive.

Recording survives navigation

  • Lifts the Sonic engine into a global RecordingProvider (contexts/RecordingContext.tsx) mounted in _app.tsx — the only boundary that survives page navigation. A live recording keeps running when leaving the meeting page.
  • Adds stream cleanup on app-level unmount (fixes the previous mic/system-audio + Bedrock stream leak when the meeting page unmounted).
  • useSonicTranscription no longer takes a fixed meetingId; the meeting page binds its meeting via bindMeeting(...), and activeMeetingId tracks which meeting the single session belongs to.

Header indicator

  • RecordingIndicator in the header: audio pulse, elapsed time, a link back to the meeting being recorded, and a stop button usable from anywhere.

Provisional persistence

  • New Meeting fields sonicTranscript (json), sonicSummary (json), sonicTranscriptUpdatedAt (datetime). Wired into useMeetings (type, selection set, mapper).
  • Transcript is persisted periodically while recording and on stop; summary is persisted after generation. Both rehydrate when returning to the meeting.

Discreet person detection

  • Replaces the always-on detected-people bar with a discreet marker (unconfirmed-count badge + transient detected hint that self-clears + a knocking popover). Reused on the meeting page and in the header.

Server-side summarizer + context

  • summarize-meeting Lambda + query (Sonnet 4.5): per-project accomplishments / new tasks / blockers grounded in the transcript.
  • Meeting context enrichment for Sonic: participants + open-project list at startup and cross-modal updates; suggest_project tool; suggested-projects bar + summary view.

User prompt (Tools)

  • Per-context user background fed into the Sonic system prompt. /profile/tools tab with on-blur autosave.

Dev helper

  • scripts/copy-project-to-sandbox.js: multiple --project ids + --skip-images.

Testing

  • tsc --noEmit (root) — green
  • tsc --noEmit -p amplify/tsconfig.json — green
  • npm run lint — 0 errors (2 pre-existing TanStack Table warnings, unrelated)
  • Deployed to sandbox; recording survives navigation, header stop works, transcript/summary rehydrate.

Notes / follow-ups

  • Transcript/summary persistence is intentionally provisional (to be folded into meeting notes later).
  • Known follow-up (separate work, Block A): the person data layer still loads all people into memory; a meeting participant not in the loaded set renders no name. Addressed next.

…et detection

Stage 2 of the Nova 2 Sonic meeting features:

- Recording survives navigation: the Sonic engine is lifted into a global
  RecordingProvider (contexts/RecordingContext.tsx) mounted in _app.tsx, so a
  live meeting recording keeps running when leaving the meeting page. Streams
  are cleaned up on app-level unmount (fixes the previous stream leak).
- Header recording indicator: audio pulse, elapsed time, link back to the
  active meeting, and a stop control usable from anywhere in the app.
- Provisional transcript + summary persistence on the Meeting
  (sonicTranscript, sonicSummary, sonicTranscriptUpdatedAt), rehydrated when
  returning to the meeting; transcript persisted periodically while recording.
- Discreet person detection: replaces the always-on detected-people bar with a
  marker (unconfirmed-count badge + transient "detected" hint + knocking
  popover) reused on the meeting page and in the header.
- Server-side meeting summarizer (summarize-meeting Lambda + query, Sonnet 4.5)
  producing per-project accomplishments/tasks/blockers grounded in the
  transcript; suggested-projects bar + summary view.
- Meeting context enrichment for Sonic: participants + open-project list at
  startup and cross-modal updates, suggest_project tool.
- User prompt (Tools): per-context user background fed into the Sonic system
  prompt; /profile/tools tab with on-blur autosave.
- Dev helper: copy-project-to-sandbox supports multiple projects + skip-images.
Carsten Koch added 3 commits September 22, 2026 21:12
The PR gate ran `npm run build` (tsc + next build), but amplify_outputs.json is
generated by the Amplify backend deploy and is git-ignored, so it is absent in
the CI checkout. tsc/next then fail with "Cannot find module
'@/amplify_outputs.json'". Amplify Hosting generates the real file at deploy
time; for the type-check/build gate we only need a type-satisfying placeholder.

Adds a step (after npm ci, before build) that writes a minimal placeholder ONLY
when the file is absent, so it never clobbers a real one. The shape mirrors the
fields the app reads (storage.buckets[].{name,bucket_name,aws_region}); the rest
is passed opaquely to Amplify.configure. Verified the placeholder compiles under
tsc --noEmit.
The backend type-check (tsc -p amplify/tsconfig.json) resolves $amplify/env/<name>
via the tsconfig path .amplify/generated/env, which Amplify generates and
git-ignores — so it's absent in CI and tsc fails with "Cannot find module
'$amplify/env/...'". Add a step that writes a permissive stub
(`export const env: any = process.env`) for every env module name the backend
imports (grepped from source, so it auto-tracks new functions), only when
absent. Real typings come from the Amplify build; this only unblocks the
offline type-check gate.
Drop next build and the Amplify tsc type-checks from the PR gate. They import
artifacts that only exist after an Amplify backend deploy (amplify_outputs.json,
.amplify/generated/env/*), which are git-ignored and absent in a bare CI
checkout — forcing placeholder hacks that add maintenance and can mask real
type errors. The gate's real purpose is the lockfile/platform class that broke a
past prod deploy, so it now runs just `npm ci` (clean Linux + Node 22) + lint.
Full type-check/build against the real generated schema runs in the Amplify
deploy and locally. Reverts the two placeholder steps.
@cabcookie
cabcookie merged commit 2f26c68 into main Sep 23, 2026
1 check passed
@cabcookie
cabcookie deleted the feat/sonic-meeting-stage2 branch September 23, 2026 07:37
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.

1 participant