feat: whisper context lifecycle, constrained generation, and a home slot - #626
feat: whisper context lifecycle, constrained generation, and a home slot#626dishit-wednesday wants to merge 22 commits into
Conversation
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
…on disk Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
…sion Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
…eak contexts Observed on device: 4 native contexts at 406MB each, none releasable, kernel killed the foreground app at 1.85GB swap. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Unloading mid-decode cancels the native job and whisper.rn returns empty, so the clip reads as transcribed-to-nothing rather than as interrupted. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
…babel config Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
… platforms Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
pro/ has its own package.json, so a test living inside it resolved no Babel config at all. Naming the config crosses that boundary - scoped to pro's own tests, because setting it globally disables per-package .babelrc lookup inside node_modules, which several React Native libraries rely on. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
… forever Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Pointer only. Everything the bump carries is private to the pro submodule - the native VAD sidecar, the logical conversation projection, and the conversation-first worker that finishes the oldest ended conversation before touching anything newer. Nothing in core changes: locket is still reached through the same feature registry entry it was before, which is what makes a change of this size a one-line commit here. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
… doc Carries the todo source-playback fixes - per-clip ranges for a conversation that crossed a file roll, and resolving a recording's stored `.wav` name to the `.m4a` that replaced it - plus the pipeline architecture document. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
|
ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
A local notification has to be scheduled with the OS to arrive while the app is closed, and nothing in this repo could do that - there was no notification library at all. THE SMALLEST CHOICE THAT WORKS ON BOTH PLATFORMS. The alternative considered was a small native module over AlarmManager, reusing the notification channel and PendingIntent patterns the recorder already has: no dependency, but Android only. This is cross-platform and is what recorder-v3 used, so the shape is already known to fit. It is used by exactly one file in the pro submodule and nothing in core. REQUIRES A NATIVE BUILD. Android needs a gradle sync and iOS needs `pod install`; neither has been run, and neither platform has been built against it. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Pointer only. Everything it carries is private to the pro submodule: speaker labelling corrected across every clip of a conversation, the detail screen showing who spoke and what the conversation is made of, a line saying which older conversation the loop is working on, a deadline on native calls that never answer, and meeting reminders. Nothing in core changes beyond the notifee dependency the reminders need - locket is still reached through the same feature registry entry it always was. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
Two app-level requirements for the ambient recorder on iOS, plus the pro pointer. UIBackgroundModes audio. Without it iOS suspends the audio session the moment the app leaves the foreground, so the recorder stops the instant the screen locks - which is most of when an ambient recorder is meant to work. It does not survive a force-quit or an OS termination; that is a platform limit, not a setting. onnxruntime-objc with modular_headers. It ships no module map, and OffgridPro is a Swift pod that imports it for the recorder's Silero VAD, so without this line pod install fails outright: "The Swift pod `OffgridPro` depends upon `onnxruntime-objc`, which does not define modules". This is what makes the recorder buildable on iOS at all, not a tuning preference. Podfile.lock follows. No pro source or docs in this commit - the pro submodule pointer only. Co-Authored-By: Dishit Karia <hanmadishit74@gmail.com>
|



Core capabilities plus a submodule pointer bump. No product code here - the changes are to whisper's context lifecycle, model loading, constrained generation, and the home slot registry.
Whisper context lifecycle
The transcription context is now safe under a second, long-running consumer. Three ways it could be lost or corrupted underneath a caller:
maxThreadsis also passed throughtranscribeFile, where it was being silently dropped.Model loading
skipVision- a text-only load that leaves the projector on disk, for callers that will never send an image.skipVisioncould poison a later vision request.Constrained generation
llmConstraintscollects grammar, repeat-penalty and thinking overrides into one module, accepted bygenerateWithMaxTokensasConstrainedCompletionOpts. Each override was previously threaded through separately.Slots
A
home.recorderslot, rendered above recent conversations. Core declares the slot; anything may fill it or not. A build without the submodule renders nothing and behaves exactly as before.Build and test config
ios/Podfile.lock,jest.config.jsandreact-native.config.jsmove so the submodule autolinks by root only, declares its own platforms, and runs its suite from the root config.Reviewing this
19 commits, 14 files, +233/-45. Three are submodule pointer bumps; the rest are the changes above, from a lineage that had no open PR - so this is the first time they are proposed for
dev.Not device-verified. The whisper changes in particular are reasoned and unit-tested, not observed on hardware under real memory pressure.
Greptile Summary
The PR adds Whisper context-lifecycle coordination, text-only model loading, consolidated constrained-generation options, and a home-screen extension slot. It also updates the Pro submodule integration and associated iOS, React Native, and Jest configuration.
skipVisionloading and vision-aware active-model compatibility checks.home.recorderslot.Confidence Score: 3/5
The PR is not yet safe to merge because vision upgrades can falsely succeed and Whisper eviction can still release a context during file-transcription startup.
A same-path model load returns before attaching the requested projector, while Whisper marks file transcription active only after starting native decoding, leaving both previously reported runtime failures outstanding.
Files Needing Attention: src/services/llm.ts, src/services/activeModelService/index.ts, src/services/whisperService.ts, src/stores/whisperStore.ts
Important Files Changed
maxThreadsforwarding.Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[Model request] --> B{Whisper or text model?} B -->|Whisper| C[Residency coordination] C --> D[Shared context load] D --> E[File transcription] B -->|Text model| F{skipVision?} F -->|Yes| G[Load text context only] F -->|No| H[Load text context and projector] G --> I[Constrained generation] H --> I J[Home screen] --> K[home.recorder slot] K --> L[Optional Pro implementation]Reviews (2): Last reviewed commit: "chore(ios): background audio and the pod..." | Re-trigger Greptile