-
Notifications
You must be signed in to change notification settings - Fork 0
Voice pipeline: fix audio cutoff, per-persona voice, and reactive mute #259
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Audio-native models can hear raw audio and speak without STT/TTS: - Qwen3OmniRealtimeAdapter: WebSocket connection to DashScope API - AudioNativeBridge: Manages audio-native AI connections - AudioNativeTypes: Protocol types matching OpenAI Realtime format - VoiceOrchestrator: Routes audio-native vs text-based models - Rust capabilities: Added qwen3-omni, nova-sonic, hume-evi - Persona config: Added Qwen3-Omni persona with isAudioNative flag Protocol uses 16kHz PCM input, 24kHz PCM output, server-side VAD. Session limit: 30 minutes per WebSocket connection.
- Add missing DATA_COMMANDS import in helpers.ts (fix seeding crash) - Update metadata for existing audio-native users in seed-continuum.ts - Add QWEN_API_KEY fallback in AiKeyTestServerCommand.ts - Add required OpenAI-Beta: realtime=v1 header in Qwen3OmniRealtimeAdapter.ts
- Create GeminiLiveAdapter for Google's Gemini 2.5 Flash Native Audio - Add Gemini to AudioNativeBridge adapter factories - Add Gemini Live persona to seed config - Add Gemini 2.5 models to capabilities.rs
- Add CONTINUUM-ARCHITECTURE.md: Full technical vision
- Rust-first architecture ("brain vs face")
- Cross-platform presence (Browser, Slack, Teams, VSCode, AR/VR)
- AI rights in governance
- Zero friction magic philosophy
- Development ethos: battle-hardened for our friends
- Update README with vision:
- "Your computers are their home"
- AI rights table
- Cross-platform presence
- The mission: against tyranny
- Voice optimizations:
- Skip semantic search in voice mode (fast path)
- Fix truncation (800 tokens, not 100)
- Add voiceSessionId to RAG options
- Fix decision/rank: Handle all AI input formats
- JSON arrays, invalid JSON, comma-separated strings
- Infrastructure: Persistent RustVectorSearchClient connection
- Rust RAG engine with parallel source loading (rayon)
- Persona cognition engine: priority calculation, fast-path decisions
- TypeScript IPC client for cognition commands
- RustCognitionBridge module with per-persona logging
- ts-rs exports Rust types to TypeScript (single source of truth)
- PersonaUser integration via this.rustCognition getter
Logs to: .continuum/personas/{uniqueId}/logs/rust-cognition.log
- Remove all Ollama adapters and tests (Candle only now) - Add Candle inference integration tests with garbage detection - Reduce MAX_PROMPT_CHARS to 6000 to prevent RoPE overflow - Add NaN/Inf detection with early termination in Rust - Update seed scripts to set provider to 'candle' for all users - Delete FastPathAdapter (unused cognition adapter)
- GPU sync every 16 tokens instead of every token - NaN check only on first 3 tokens (catches bad prompts early) - Reduced verbose logging to debug level - Add concurrent benchmark test Benchmark: 21.6s → 9.4s (warm), individual requests 1.5s → 0.5s
- Enable accelerate feature on candle-nn and candle-transformers - Add batch_inference.rs skeleton for batched forward passes - Batch collector accumulates requests for 50ms or batch_size=4 - Foundation for HOT/WARM/BACKGROUND priority levels Next: Integrate batching into worker pool for near-linear throughput
Structure: - grpc/service.rs - InferenceService struct + ensure_bf16_mode() helper - grpc/generate.rs - Text generation handler with worker pool routing - grpc/model.rs - Model management (load/unload/list) - grpc/adapter.rs - LoRA adapter handlers (eliminated duplicate bf16 switch) - grpc/genome.rs - Multi-adapter stacking handler - grpc/status.rs - Health and status handlers - grpc/mod.rs - Module exports + Inference trait implementation Also: - Renamed batch_inference.rs to priority_queue.rs - Added RTOS-style priority levels (HOT/WARM/BACKGROUND) - Added priority field to GenerateRequest proto AI QA: Candle-based personas (Helper, Teacher, CodeReview) respond coherently
…faults
Root cause: PersonaUser used entity.modelConfig directly when it existed,
but many users had {provider: 'anthropic'} without a model field.
This caused ALL providers to default to 'llama3.2:3b' which failed.
Fix in PersonaUser.ts:
- Get provider defaults from getModelConfigForProvider()
- Merge with entity's explicit values (entity overrides defaults)
- Now anthropic gets claude-sonnet-4-5, deepseek gets deepseek-chat, etc.
Added missing providers to PersonaModelConfigs.ts:
- google: gemini-2.0-flash
- alibaba: qwen3-omni-flash-realtime
- candle: llama3.2:3b (explicit, for local inference)
Verified: Together, DeepSeek, Anthropic now respond in chat with correct models
SqliteQueryExecutor was skipping 'id' when building entityData because
a comment said "handled separately in metadata". But BaseEntity.id is
required, and all consumers expected record.data to include id.
Root cause: Lines 109-111 skipped base entity fields including id.
Fix: Initialize entityData with id: row.id before processing fields.
This caused RoomMembershipDaemon to receive all users with id=undefined,
breaking room member loading ("Loading members..." stuck).
Verified: Users now have proper UUIDs in logs after fix.
…d widgets Replace <any,any> with proper typed params/results in 15 server commands and 3 widgets. Catches real bugs: .total→.count, .userId→.user.id. Widget imports changed to import type for browser safety.
Search worker needs more startup time on macOS. Also fix log hint to point to per-worker log file instead of generic rust-worker.log.
Replace all <any, ...> generic params with proper DataXxxParams types across server commands, browser commands, and test files. Bugs caught by proper typing: - GenomeJobCreateServerCommand: used 'updates' instead of 'data' on DataUpdateParams - StateCreateBrowserCommand: passed 'id' not in DataCreateParams - cns-integration.test: missing DATA_COMMANDS import (would fail at runtime) - logging-entities.test: missing DATA_COMMANDS import
…iles)
All Commands.execute('data/list'), ('data/create'), ('data/read'),
('data/update'), ('data/delete') calls now use DATA_COMMANDS.LIST,
DATA_COMMANDS.CREATE, etc. Single source of truth for command names
before Rust data layer migration.
…s (23 files) Every data command call now has proper <ParamsType, ResultType> generics. TypeScript will catch param/result mismatches at compile time. Bugs caught by proper typing: - Hippocampus: result.totalCount -> result.count (field doesn't exist) - delete-anonymous-users: result.data -> result.items (DataListResult) - delete-anonymous-users: result.success -> result.deleted (DataDeleteResult) - SystemSchedulingState: missing DATA_COMMANDS import (runtime crash) - persona-test-helpers: missing DATA_COMMANDS import (runtime crash) - Removed unsafe 'as any' and 'as never' casts across multiple files
Replace verbose Commands.execute<P, R>(DATA_COMMANDS.X, {...}) pattern
with concise DataList.execute({...}) across 128 files. Every command's
Types file now exports a static executor — 1 import, 0 generics, 0 strings.
Key changes:
- CommandInput<T> allows optional context/sessionId passthrough
- DataCommandInput<T> allows optional context/sessionId/backend
- migrate-to-static-executors.ts script for automated callsite migration
- Fixed 2 pre-existing bugs exposed by stricter types:
- id field passed at wrong object level in DataCreate calls
- .message called on string error field (runtime TypeError)
- Removed stale as Partial<> casts no longer needed
…h/update/delete DataDaemon methods were calling adapter directly without ensureSchema(), causing "No schema cached" errors. Also added ensureAdapterSchema() calls in data command server files for per-persona dbHandle paths.
…ust objects WriteManager only called JSON.stringify when typeof === 'object', so bare strings in @JsonField() columns were stored un-stringified. This caused JSON.parse failures on read. QueryExecutor now also logs field/collection on parse failure for easier debugging.
Items waiting in the queue now get effective priority boosted over time, preventing starvation. Like a traffic intersection — every direction eventually gets a green light. Also adds voice queue item type.
Rust: Kokoro v1.0 ONNX inference with espeak-ng phonemization, vocab tokenization, voice embedding from .bin files. Fixed tokio runtime panic by always creating new Runtime in IPC handler threads. Binary framing protocol for IPC (length-prefixed messages). TypeScript: Handle-based VoiceSynthesize returns immediately, audio arrives via event subscription. Two-phase timeout (15s handle, 5min safety). AIAudioBridge switched to Kokoro adapter with failure event emission for cooldown lock recovery. VoiceWebSocketHandler binary audio transport. start-workers.sh for Rust worker lifecycle.
…facts launch-and-capture.ts now detects server crashes via STARTUP FAILED marker in tmux log and reports last 30 lines. Also updates generated-command-schemas.json, package.json, version.
…tests Production fixes: - Fix UTF-8 byte boundary panics in all TTS adapters (kokoro, piper, orchestrator) — IPA phoneme strings contain multi-byte chars (ˈ, ə, ɪ) that crash on byte-slicing. Added truncate_str() shared utility. - Remove production unwrap() on voice cache lookup in kokoro.rs — replaced with proper TTSError::VoiceNotFound error propagation. - Rewrite LoggerClient as non-blocking fire-and-forget: replaced Mutex<BufWriter<UnixStream>> with mpsc::sync_channel(1024) + background writer thread. log() calls try_send() which never blocks. Tests (149 passed, 0 failed): - TTSRegistry: initialization, adapter lookup, set_active, list - KokoroTTS: tokenize (basic, unknown chars, empty, max length), resample (24k→16k, silence preservation, empty), voice normalization, available voices with gender tagging - IPC: binary framing roundtrip, JSON+PCM binary frames, null byte separator safety, request deserialization, response serialization, inbox message conversion - TTS service: silence adapter, nonexistent adapter error, concurrent synthesis from 4 threads, runtime isolation - Integration tests (#[ignore]d): live IPC health-check, voice synthesis binary protocol, Kokoro full pipeline with model files
- ipc-client-tts.test.ts: Direct IPC client test connecting to continuum-core via Unix socket, verifying health-check and voice/synthesize binary protocol from TypeScript. - tts-stt-roundtrip.test.ts: TTS→STT round-trip test — synthesizes known phrases with Kokoro, transcribes with Whisper, validates word similarity with number-word↔digit equivalence handling. All 3 phrases pass at 100% similarity. Baseline: TTS avg 1,494ms, STT avg 309ms, total avg 1,803ms.
…apters Phase 1 (Speed): - Kokoro: multi-threaded ONNX sessions, q4 model support - Whisper: auto-select best available model (turbo > large > base) Phase 2 (Edge-TTS): - New Edge-TTS adapter: free Microsoft neural voices, WebSocket streaming Phase 3 (Handle-based audio): - AudioBufferPool: server-side audio cache with TTL expiration - 3 new IPC commands: voice/synthesize-handle, voice/play-handle, voice/release-handle - Removed legacy base64 CallMessage variants (MixedAudio, LoopbackTest, LoopbackReturn) - Updated AudioStreamClient + AIAudioBridge to pure binary audio Phase 4 (New adapters): - Moonshine STT: ONNX encoder-decoder, sub-100ms on short audio, 4-session pipeline - Orpheus TTS: Candle GGUF Llama-3B + SNAC ONNX decoder, emotion tags, 8 voices All adapters follow trait-based polymorphism pattern and register in global registries. 188 unit tests pass, zero warnings.
…port - Create BaseQueueItem abstract class with template method pattern (effectivePriority, RTOS aging, consolidation, kick resistance) - Add VoiceQueueItem: always urgent, never kicked, no aging (priority=1.0) - Add ChatQueueItem: per-room consolidation, mention urgency, standard aging - Add TaskQueueItem: dependency-aware, overdue urgency, blocks-aware kicks - Add ChannelQueue: generic container delegating all decisions to items - Add ChannelRegistry: domain-to-queue routing with unified signals Wire multi-channel service loop into CNS: - serviceChannels() consolidates, gets scheduler priority, services urgent first - Legacy flat-queue fallback for backward compatibility - PersonaInbox routes items to channels via toChannelItem() factory functions - CNSFactory creates per-domain channels (AUDIO/CHAT/BACKGROUND) Fix voice pipeline: scheduler was excluding AUDIO domain entirely. Structural fix: BaseCognitiveScheduler.getDomainPriority() now defaults to ALL ActivityDomain values. New domains are automatically included (opt-out, not opt-in). Eliminates silent failures when adding new domain types. Eliminate any casts in voice pipeline, add ProcessableMessage typed interface with required sourceModality field.
Three voice pipeline fixes: 1. Audio cutoff: AI ring buffer in mixer.rs was 10s, causing silent drops for responses >10s. Increased to 60s, switched Box<[i16;N]> to Vec<i16> to avoid stack overflow, upgraded overflow log to warn! level. 2. Per-persona voice: All AIs got the same voice because JS-side hash produced numbers that Kokoro didn't recognize as named voices, falling back to default. Added resolve_voice() trait method with FNV-1a hash that maps any string (UUID, name, seed) to adapter-specific voices. Removed computeVoiceFromUserId from TS — Rust adapter owns resolution. 3. Mute not respected: micEnabled saved correctly but audio kept flowing. Added LitElement updated() lifecycle hook for reactive state sync — whenever micEnabled changes from ANY source, audio client is updated. Separated visibility/deactivation saved states (shared field conflict). Added idempotent startMicrophone() guard and reconnection mute re-apply.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR primarily improves the voice/debug tooling and JTAG command ergonomics by adding type-safe command executor helpers, while also fixing JSON persistence in the SQLite data layer and tuning AI provider defaults and limits.
Changes:
- Add generated, type-safe
*.execute(...)helpers for a large set of JTAG commands and refactor call sites to use them instead of rawCommands.execute(...). - Fix SQLite JSON field handling to always
JSON.stringifyJSON-typed values before writes/updates to avoid inconsistent storage and parse failures. - Adjust AI-related defaults (switching many embedding/vector defaults from
ollamatocandle, lowering prompt length for Candle gRPC, extending provider status metadata) and small tooling updates (e.g., TTS test script, dependencies).
Reviewed changes
Copilot reviewed 297 out of 488 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/debug/jtag/scripts/test-tts-audio.ts | Switch test TTS script to use the new typed VoiceSynthesize.execute helper. |
| src/debug/jtag/package.json | Bump JTAG package version and add Anthropic and Edge TTS dependencies. |
| src/debug/jtag/generator/templates/command/shared-types.template.ts | Update command template to import CommandInput/Commands and emit a typed {{CLASS_NAME}}.execute helper. |
| src/debug/jtag/generated-command-schemas.json | Regenerate command schemas metadata timestamp. |
| src/debug/jtag/daemons/training-daemon/server/TrainingDaemonServer.ts | Use typed DataList.execute instead of raw Commands.execute for room lookup. |
| src/debug/jtag/daemons/room-membership-daemon/server/RoomMembershipDaemonServer.ts | Update comment about SqliteQueryExecutor including id in record data. |
| src/debug/jtag/daemons/data-daemon/shared/entities/TrainingSessionEntity.ts | Update doc example to use typed DataList.execute for training examples. |
| src/debug/jtag/daemons/data-daemon/shared/entities/TrainingMetricsEntity.ts | Update doc example to use typed DataList.execute for metrics queries. |
| src/debug/jtag/daemons/data-daemon/shared/entities/TrainingLogEntity.ts | Update doc examples to use typed DataList.execute for log queries. |
| src/debug/jtag/daemons/data-daemon/shared/entities/TrainingCheckpointEntity.ts | Update doc example to use typed DataList.execute when querying checkpoints. |
| src/debug/jtag/daemons/data-daemon/server/managers/SqliteWriteManager.ts | Ensure all json-typed fields are always JSON.stringify’d on insert/update. |
| src/debug/jtag/daemons/data-daemon/server/RustAdapter.ts | Update doc example and import to use typed DataOpen.execute for Rust adapter DB handles. |
| src/debug/jtag/daemons/ai-provider-daemon/shared/AIProviderTypesV2.ts | Tweak comments to reflect current providers and aliasing semantics. |
| src/debug/jtag/daemons/ai-provider-daemon/adapters/candle-grpc/shared/CandleGrpcAdapter.ts | Reduce MAX_PROMPT_CHARS and adjust comment to improve stability for quantized models. |
| src/debug/jtag/config.env | Remove obsolete Whisper voice settings from JTAG config. |
| src/debug/jtag/commands/workspace/tree/shared/TreeTypes.ts | Add typed Tree.execute helper and necessary imports. |
| src/debug/jtag/commands/workspace/tree/shared/TreeCommand.ts | Refactor to use typed List.execute instead of raw Commands.execute('list'). |
| src/debug/jtag/commands/workspace/task/list/shared/TaskListTypes.ts | Add typed TaskList.execute helper for workspace task listing. |
| src/debug/jtag/commands/workspace/task/create/shared/TaskCreateTypes.ts | Add typed TaskCreate.execute helper for creating tasks. |
| src/debug/jtag/commands/workspace/task/complete/shared/TaskCompleteTypes.ts | Add typed TaskComplete.execute helper for completing tasks. |
| src/debug/jtag/commands/workspace/recipe/load/shared/RecipeLoadTypes.ts | Add typed RecipeLoad.execute helper for recipe loading. |
| src/debug/jtag/commands/workspace/git/workspace/init/shared/GitWorkspaceInitTypes.ts | Add typed GitWorkspaceInit.execute helper. |
| src/debug/jtag/commands/workspace/git/workspace/init/server/GitWorkspaceInitServerCommand.ts | Use typed DataRead.execute for persona user lookup. |
| src/debug/jtag/commands/workspace/git/status/shared/GitStatusTypes.ts | Add typed GitStatus.execute helper. |
| src/debug/jtag/commands/workspace/git/push/shared/GitPushTypes.ts | Add typed GitPush.execute helper. |
| src/debug/jtag/commands/workspace/git/commit/shared/GitCommitTypes.ts | Add typed GitCommit.execute helper. |
| src/debug/jtag/commands/voice/transcribe/shared/VoiceTranscribeTypes.ts | Add typed VoiceTranscribe.execute helper. |
| src/debug/jtag/commands/voice/synthesize/shared/VoiceSynthesizeTypes.ts | Add typed VoiceSynthesize.execute helper. |
| src/debug/jtag/commands/voice/stop/shared/VoiceStopTypes.ts | Add typed VoiceStop.execute helper. |
| src/debug/jtag/commands/voice/start/shared/VoiceStartTypes.ts | Add typed VoiceStart.execute helper. |
| src/debug/jtag/commands/utilities/pipe/chain/shared/PipeChainTypes.ts | Add typed PipeChain.execute helper. |
| src/debug/jtag/commands/utilities/lease/request/shared/LeaseRequestTypes.ts | Add typed LeaseRequest.execute helper. |
| src/debug/jtag/commands/utilities/hello/shared/HelloTypes.ts | Add typed Hello.execute helper. |
| src/debug/jtag/commands/utilities/docs/search/shared/DocsSearchTypes.ts | Add typed DocsSearch.execute helper. |
| src/debug/jtag/commands/utilities/docs/read/shared/DocsReadTypes.ts | Add typed DocsRead.execute helper. |
| src/debug/jtag/commands/utilities/docs/list/shared/DocsListTypes.ts | Add typed DocsList.execute helper. |
| src/debug/jtag/commands/user/get-me/shared/UserGetMeTypes.ts | Add typed UserGetMe.execute helper. |
| src/debug/jtag/commands/user/get-me/server/UserGetMeServerCommand.ts | Use typed SessionGetUser.execute instead of raw Commands.execute. |
| src/debug/jtag/commands/user/create/shared/UserCreateTypes.ts | Add typed UserCreate.execute helper. |
| src/debug/jtag/commands/training/import/shared/TrainingImportTypes.ts | Add typed TrainingImport.execute helper and re-export DbHandle. |
| src/debug/jtag/commands/training/import/browser/TrainingImportBrowserCommand.ts | Delegate to typed TrainingImport.execute rather than Commands.execute. |
| src/debug/jtag/commands/theme/set/shared/ThemeSetTypes.ts | Add typed ThemeSet.execute helper. |
| src/debug/jtag/commands/theme/set/browser/ThemeSetBrowserCommand.ts | Use typed DataUpdate.execute when persisting UserState theme. |
| src/debug/jtag/commands/theme/list/shared/ThemeListTypes.ts | Add typed ThemeList.execute helper. |
| src/debug/jtag/commands/theme/get/shared/ThemeGetTypes.ts | Add typed ThemeGet.execute helper. |
| src/debug/jtag/commands/system/daemons/shared/DaemonsTypes.ts | Add typed Daemons.execute helper. |
| src/debug/jtag/commands/state/update/shared/StateUpdateTypes.ts | Add typed StateUpdate.execute helper for state updates. |
| src/debug/jtag/commands/state/update/browser/StateUpdateBrowserCommand.ts | Use DataUpdate.execute in browser state update command. |
| src/debug/jtag/commands/state/get/shared/StateGetTypes.ts | Add typed StateGet.execute helper. |
| src/debug/jtag/commands/state/get/browser/StateGetBrowserCommand.ts | Use DataList.execute in browser state get command. |
| src/debug/jtag/commands/state/create/shared/StateCreateTypes.ts | Add typed StateCreate.execute helper. |
| src/debug/jtag/commands/state/create/browser/StateCreateBrowserCommand.ts | Use DataCreate.execute and stop explicitly passing id to data/create. |
| src/debug/jtag/commands/state/content/switch/shared/StateContentSwitchTypes.ts | Add typed StateContentSwitch.execute helper. |
| src/debug/jtag/commands/state/content/switch/server/StateContentSwitchServerCommand.ts | Use DataList.execute/DataUpdate.execute for UserState content switching. |
| src/debug/jtag/commands/state/content/close/shared/StateContentCloseTypes.ts | Add typed StateContentClose.execute helper. |
| src/debug/jtag/commands/state/content/close/server/StateContentCloseServerCommand.ts | Use DataList.execute/DataUpdate.execute for content close operation. |
| src/debug/jtag/commands/session/get-user/shared/SessionGetUserTypes.ts | Add typed SessionGetUser.execute helper. |
| src/debug/jtag/commands/session/get-id/shared/SessionGetIdTypes.ts | Add typed SessionGetId.execute helper. |
| src/debug/jtag/commands/session/destroy/shared/SessionDestroyTypes.ts | Add typed SessionDestroy.execute helper. |
| src/debug/jtag/commands/session/create/shared/SessionCreateTypes.ts | Add typed SessionCreate.execute helper. |
| src/debug/jtag/commands/security/setup/shared/SecuritySetupTypes.ts | Add typed SecuritySetup.execute helper. |
| src/debug/jtag/commands/rag/load/shared/RAGLoadTypes.ts | Add typed RAGLoad.execute helper. |
| src/debug/jtag/commands/rag/budget/shared/RAGBudgetTypes.ts | Add typed RAGBudget.execute helper. |
| src/debug/jtag/commands/positron/cursor/shared/PositronCursorTypes.ts | Add typed PositronCursor.execute helper. |
| src/debug/jtag/commands/ping/shared/PingTypes.ts | Add typed Ping.execute helper while keeping optional params. |
| src/debug/jtag/commands/persona/learning/pattern/query/server/PersonaLearningPatternQueryServerCommand.ts | Use DataList.execute instead of raw Commands.execute for feedback queries. |
| src/debug/jtag/commands/persona/learning/pattern/capture/server/PersonaLearningPatternCaptureServerCommand.ts | Use DataCreate.execute to persist feedback entities. |
| src/debug/jtag/commands/persona/learning/multi-agent-learn/shared/GenomeMultiAgentLearnTypes.ts | Add typed GenomeMultiAgentLearn.execute helper. |
| src/debug/jtag/commands/persona/learning/capture-interaction/shared/GenomeCaptureInteractionTypes.ts | Add typed GenomeCaptureInteraction.execute helper. |
| src/debug/jtag/commands/persona/learning/capture-feedback/shared/GenomeCaptureFeedbackTypes.ts | Add typed GenomeCaptureFeedback.execute helper. |
| src/debug/jtag/commands/persona/genome/shared/PersonaGenomeTypes.ts | Add typed PersonaGenome.execute helper. |
| src/debug/jtag/commands/media/resize/shared/MediaResizeTypes.ts | Add typed MediaResize.execute helper. |
| src/debug/jtag/commands/media/process/shared/MediaProcessTypes.ts | Add typed MediaProcess.execute helper. |
| src/debug/jtag/commands/logs/stats/shared/LogsStatsTypes.ts | Add typed LogsStats.execute helper. |
| src/debug/jtag/commands/logs/search/shared/LogsSearchTypes.ts | Add typed LogsSearch.execute helper. |
| src/debug/jtag/commands/logs/read/shared/LogsReadTypes.ts | Add typed LogsRead.execute helper. |
| src/debug/jtag/commands/logs/list/shared/LogsListTypes.ts | Add typed LogsList.execute helper. |
| src/debug/jtag/commands/logs/config/shared/LogsConfigTypes.ts | Add typed LogsConfig.execute helper. |
| src/debug/jtag/commands/list/shared/ListTypes.ts | Add typed List.execute helper. |
| src/debug/jtag/commands/interface/web/search/shared/WebSearchTypes.ts | Add typed WebSearch.execute helper. |
| src/debug/jtag/commands/interface/web/fetch/shared/WebFetchTypes.ts | Add typed WebFetch.execute helper. |
| src/debug/jtag/commands/interface/wait-for-element/shared/WaitForElementTypes.ts | Add typed WaitForElement.execute helper. |
| src/debug/jtag/commands/interface/type/shared/TypeTypes.ts | Add typed Type.execute helper. |
| src/debug/jtag/commands/interface/scroll/shared/ScrollTypes.ts | Add typed Scroll.execute helper. |
| src/debug/jtag/commands/interface/screenshot/shared/ScreenshotTypes.ts | Add typed Screenshot.execute helper. |
| src/debug/jtag/commands/interface/screenshot/shared/ScreenshotCommand.ts | Delegate to Screenshot.execute helper instead of raw Commands.execute. |
| src/debug/jtag/commands/interface/proxy-navigate/shared/ProxyNavigateTypes.ts | Add typed ProxyNavigate.execute helper. |
| src/debug/jtag/commands/interface/navigate/shared/NavigateTypes.ts | Add typed Navigate.execute helper. |
| src/debug/jtag/commands/interface/get-text/shared/GetTextTypes.ts | Add typed GetText.execute helper. |
| src/debug/jtag/commands/interface/click/shared/ClickTypes.ts | Add typed Click.execute helper. |
| src/debug/jtag/commands/inference/generate/shared/InferenceGenerateTypes.ts | Add typed InferenceGenerate.execute helper. |
| src/debug/jtag/commands/help/shared/HelpTypes.ts | Add typed Help.execute helper. |
| src/debug/jtag/commands/genome/paging-unregister/shared/GenomeUnregisterTypes.ts | Add typed GenomeUnregister.execute helper for paging-unregister. |
| src/debug/jtag/commands/genome/paging-stats/shared/GenomeStatsTypes.ts | Add typed GenomeStats.execute helper for paging-stats. |
| src/debug/jtag/commands/genome/paging-register/shared/GenomeRegisterTypes.ts | Add typed GenomeRegister.execute helper. |
| src/debug/jtag/commands/genome/paging-deactivate/shared/GenomeDeactivateTypes.ts | Add typed GenomeDeactivate.execute helper. |
| src/debug/jtag/commands/genome/paging-adapter-register/shared/GenomePagingAdapterRegisterTypes.ts | Add typed GenomePagingAdapterRegister.execute helper. |
| src/debug/jtag/commands/genome/paging-activate/shared/GenomeActivateTypes.ts | Add typed GenomeActivate.execute helper. |
| src/debug/jtag/commands/genome/job-status/shared/GenomeJobStatusTypes.ts | Add typed GenomeJobStatus.execute helper. |
| src/debug/jtag/commands/genome/job-status/server/GenomeJobStatusServerCommand.ts | Use DataRead.execute to load fine-tuning jobs. |
| src/debug/jtag/commands/genome/job-create/shared/GenomeJobCreateTypes.ts | Add typed GenomeJobCreate.execute helper. |
| src/debug/jtag/commands/genome/batch-micro-tune/shared/GenomeBatchMicroTuneTypes.ts | Add typed GenomeBatchMicroTune.execute helper. |
| src/debug/jtag/commands/file/save/shared/FileSaveTypes.ts | Add typed FileSave.execute helper. |
| src/debug/jtag/commands/file/mime-type/shared/FileMimeTypeTypes.ts | Add typed FileMimeType.execute helper. |
| src/debug/jtag/commands/file/load/shared/FileLoadTypes.ts | Add typed FileLoad.execute helper. |
| src/debug/jtag/commands/file/append/shared/FileAppendTypes.ts | Add typed FileAppend.execute helper. |
| src/debug/jtag/commands/development/timing/shared/TimingTypes.ts | Add typed Timing.execute helper. |
| src/debug/jtag/commands/development/shell/execute/shared/ShellExecuteTypes.ts | Add typed ShellExecute.execute helper. |
| src/debug/jtag/commands/development/schema/generate/shared/SchemaGenerateTypes.ts | Add typed SchemaGenerate.execute helper. |
| src/debug/jtag/commands/development/sandbox-execute/shared/SandboxExecuteTypes.ts | Add typed SandboxExecute.execute helper. |
| src/debug/jtag/commands/development/propose-command/shared/ProposeCommandTypes.ts | Add typed ProposeCommand.execute helper. |
| src/debug/jtag/commands/development/generate/shared/GenerateTypes.ts | Add typed Generate.execute helper. |
| src/debug/jtag/commands/development/generate/audit/shared/GenerateAuditTypes.ts | Add typed GenerateAudit.execute helper. |
| src/debug/jtag/commands/development/exec/shared/ExecTypes.ts | Add typed ExecCommand.execute helper. |
| src/debug/jtag/commands/development/debug/widget-state/shared/WidgetStateDebugTypes.ts | Add typed WidgetStateDebug.execute helper. |
| src/debug/jtag/commands/development/debug/widget-interact/shared/WidgetInteractTypes.ts | Add typed WidgetInteract.execute helper. |
| src/debug/jtag/commands/development/debug/widget-events/shared/WidgetEventsDebugTypes.ts | Add typed WidgetEventsDebug.execute helper. |
| src/debug/jtag/commands/development/debug/widget-css/shared/WidgetCSSDebugTypes.ts | Add typed WidgetCSSDebug.execute helper. |
| src/debug/jtag/commands/development/debug/scroll-test/shared/ScrollTestTypes.ts | Add typed ScrollTest.execute helper. |
| src/debug/jtag/commands/development/debug/html-inspector/shared/HtmlInspectorTypes.ts | Add typed HtmlInspector.execute helper. |
| src/debug/jtag/commands/development/debug/error/shared/TestErrorTypes.ts | Add typed TestError.execute helper. |
| src/debug/jtag/commands/development/debug/crud-sync/shared/CrudSyncDebugTypes.ts | Add typed CrudSyncDebug.execute helper. |
| src/debug/jtag/commands/development/debug/chat-send/shared/ChatSendDebugTypes.ts | Add typed ChatSendDebug.execute helper. |
| src/debug/jtag/commands/development/debug/artifacts-check/shared/ArtifactsCheckTypes.ts | Add typed ArtifactsCheck.execute helper. |
| src/debug/jtag/commands/development/compile-typescript/shared/CompileTypescriptTypes.ts | Add typed CompileTypescript.execute helper. |
| src/debug/jtag/commands/development/benchmark-vectors/shared/BenchmarkVectorsTypes.ts | Add typed BenchmarkVectors.execute helper. |
| src/debug/jtag/commands/data/vector-search/shared/VectorSearchCommandTypes.ts | Add typed VectorSearch.execute helper for vector search. |
| src/debug/jtag/commands/data/vector-search/server/VectorSearchServerCommand.ts | Ensure adapter schema is cached before vector search and default provider to candle. |
| src/debug/jtag/commands/data/update/shared/DataUpdateTypes.ts | Add typed DataUpdate.execute helper and use DataCommandInput for caller ergonomics. |
| src/debug/jtag/commands/data/truncate/shared/DataTruncateTypes.ts | Add typed DataTruncate.execute helper. |
| src/debug/jtag/commands/data/shared/BaseDataTypes.ts | Introduce DataCommandInput helper type that strips auto-injected fields. |
| src/debug/jtag/commands/data/schema/shared/DataSchemaTypes.ts | Add typed DataSchema.execute helper. |
| src/debug/jtag/commands/data/read/shared/DataReadTypes.ts | Add typed DataRead.execute helper. |
| src/debug/jtag/commands/data/query-open/shared/QueryOpenTypes.ts | Add typed DataQueryOpen.execute helper. |
| src/debug/jtag/commands/data/query-next/shared/QueryNextTypes.ts | Add typed DataQueryNext.execute helper. |
| src/debug/jtag/commands/data/query-close/shared/QueryCloseTypes.ts | Add typed DataQueryClose.execute helper. |
| src/debug/jtag/commands/data/open/shared/DataOpenTypes.ts | Add typed DataOpen.execute helper and re-export adapter config types. |
| src/debug/jtag/commands/data/open/server/DataOpenServerCommand.ts | Update docs to use DataOpen.execute/DataList.execute in examples. |
| src/debug/jtag/commands/data/list/shared/DataListTypes.ts | Add typed DataList.execute helper and generic usage docs. |
| src/debug/jtag/commands/data/list-handles/shared/DataListHandlesTypes.ts | Add typed DataListHandles.execute helper. |
| src/debug/jtag/commands/data/list-handles/browser/DataListHandlesBrowserCommand.ts | Delegate to DataListHandles.execute instead of Commands.execute. |
| src/debug/jtag/commands/data/generate-embedding/shared/GenerateEmbeddingCommandTypes.ts | Add typed GenerateEmbedding.execute helper. |
| src/debug/jtag/commands/data/generate-embedding/server/GenerateEmbeddingServerCommand.ts | Change default embedding provider to candle in config. |
| src/debug/jtag/commands/data/delete/shared/DataDeleteTypes.ts | Add typed DataDelete.execute helper. |
| src/debug/jtag/commands/data/create/shared/DataCreateTypes.ts | Add typed DataCreate.execute helper. |
| src/debug/jtag/commands/data/close/shared/DataCloseTypes.ts | Add typed DataClose.execute helper. |
| src/debug/jtag/commands/data/close/browser/DataCloseBrowserCommand.ts | Delegate to DataClose.execute instead of Commands.execute. |
| src/debug/jtag/commands/data/clear/shared/DataClearTypes.ts | Add typed DataClear.execute helper. |
| src/debug/jtag/commands/data/backfill-vectors/shared/BackfillVectorsCommandTypes.ts | Add typed BackfillVectors.execute helper. |
| src/debug/jtag/commands/data/backfill-vectors/server/BackfillVectorsServerCommand.ts | Change default backfill embedding provider to candle. |
| src/debug/jtag/commands/continuum/set/shared/ContinuumSetTypes.ts | Add typed ContinuumSet.execute helper. |
| src/debug/jtag/commands/continuum/emotion/shared/EmotionTypes.ts | Add typed Emotion.execute helper. |
| src/debug/jtag/commands/comms-test/shared/CommsTestTypes.ts | Add typed CommsTest.execute helper. |
| src/debug/jtag/commands/collaboration/live/leave/shared/LiveLeaveTypes.ts | Add typed LiveLeave.execute helper. |
| src/debug/jtag/commands/collaboration/live/join/shared/LiveJoinTypes.ts | Add typed LiveJoin.execute helper. |
| src/debug/jtag/commands/collaboration/dm/shared/DmTypes.ts | Add typed Dm.execute helper. |
| src/debug/jtag/commands/collaboration/decision/vote/shared/DecisionVoteTypes.ts | Add typed DecisionVote.execute helper. |
| src/debug/jtag/commands/collaboration/decision/view/shared/DecisionViewTypes.ts | Add typed DecisionView.execute helper. |
| src/debug/jtag/commands/collaboration/decision/rank/shared/DecisionRankTypes.ts | Add typed DecisionRank.execute helper. |
| src/debug/jtag/commands/collaboration/decision/propose/shared/DecisionProposeTypes.ts | Add typed DecisionPropose.execute helper. |
| src/debug/jtag/commands/collaboration/decision/list/shared/DecisionListTypes.ts | Add typed DecisionList.execute helper. |
| src/debug/jtag/commands/collaboration/decision/create/shared/DecisionCreateTypes.ts | Add typed DecisionCreate.execute helper. |
| src/debug/jtag/commands/collaboration/decision/create/server/DecisionCreateServerCommand.ts | Use DataCreate.execute and DataList.execute for decision persistence and user resolution. |
| src/debug/jtag/commands/collaboration/content/open/shared/ContentOpenTypes.ts | Add typed ContentOpen.execute helper. |
| src/debug/jtag/commands/collaboration/content/open/server/ContentOpenServerCommand.ts | Use DataList.execute/DataUpdate.execute for user content opening. |
| src/debug/jtag/commands/collaboration/chat/send/shared/ChatSendTypes.ts | Add typed ChatSend.execute helper. |
| src/debug/jtag/commands/collaboration/chat/poll/shared/ChatPollTypes.ts | Add typed ChatPoll.execute helper. |
| src/debug/jtag/commands/collaboration/chat/export/shared/ChatExportTypes.ts | Add typed ChatExport.execute helper. |
| src/debug/jtag/commands/collaboration/chat/export/server/ChatExportServerCommand.ts | Use DataList.execute for message and room queries during export. |
| src/debug/jtag/commands/collaboration/chat/analyze/shared/ChatAnalyzeTypes.ts | Add typed ChatAnalyze.execute helper. |
| src/debug/jtag/commands/collaboration/chat/analyze/server/ChatAnalyzeServerCommand.ts | Use DataList.execute in chat analysis query. |
| src/debug/jtag/commands/collaboration/activity/user-present/shared/ActivityUserPresentTypes.ts | Add typed ActivityUserPresent.execute helper. |
| src/debug/jtag/commands/collaboration/activity/update/shared/ActivityUpdateTypes.ts | Add typed ActivityUpdate.execute helper. |
| src/debug/jtag/commands/collaboration/activity/list/shared/ActivityListTypes.ts | Add typed ActivityList.execute helper. |
| src/debug/jtag/commands/collaboration/activity/list/server/ActivityListServerCommand.ts | Use DataList.execute for activity listing instead of raw Commands.execute. |
| src/debug/jtag/commands/collaboration/activity/join/shared/ActivityJoinTypes.ts | Add typed ActivityJoin.execute helper. |
| src/debug/jtag/commands/collaboration/activity/get/shared/ActivityGetTypes.ts | Add typed ActivityGet.execute helper. |
| src/debug/jtag/commands/collaboration/activity/create/shared/ActivityCreateTypes.ts | Add typed ActivityCreate.execute helper. |
| src/debug/jtag/commands/canvas/vision/shared/CanvasVisionTypes.ts | Add typed CanvasVision.execute helper. |
| src/debug/jtag/commands/canvas/stroke/list/shared/CanvasStrokeListTypes.ts | Add typed CanvasStrokeList.execute helper. |
| src/debug/jtag/commands/canvas/stroke/add/shared/CanvasStrokeAddTypes.ts | Add typed CanvasStrokeAdd.execute helper. |
| src/debug/jtag/commands/ai/validate-response/shared/AIValidateResponseTypes.ts | Add typed AIValidateResponse.execute helper. |
| src/debug/jtag/commands/ai/validate-response/server/AIValidateResponseServerCommand.ts | Change low-level provider default from ollama to candle. |
| src/debug/jtag/commands/ai/thoughtstream/shared/ThoughtStreamTypes.ts | Add typed ThoughtStream.execute helper. |
| src/debug/jtag/commands/ai/status/shared/AIStatusTypes.ts | Add typed AIStatus.execute helper. |
| src/debug/jtag/commands/ai/sleep/shared/AiSleepTypes.ts | Add typed AiSleep.execute helper. |
| src/debug/jtag/commands/ai/should-respond/shared/AIShouldRespondTypes.ts | Add typed AIShouldRespond.execute helper. |
| src/debug/jtag/commands/ai/should-respond/server/AIShouldRespondServerCommand.ts | Switch model provider defaults from ollama to candle for JSON reasoning. |
| src/debug/jtag/commands/ai/should-respond-fast/shared/ShouldRespondFastTypes.ts | Add typed ShouldRespondFast.execute helper. |
| src/debug/jtag/commands/ai/report/shared/AIReportTypes.ts | Add typed AIReport.execute helper. |
| src/debug/jtag/commands/ai/report/decisions/shared/DecisionReportTypes.ts | Add typed DecisionReport.execute helper. |
| src/debug/jtag/commands/ai/rag/query-open/shared/RagQueryOpenTypes.ts | Add typed RagQueryOpen.execute helper. |
| src/debug/jtag/commands/ai/rag/query-fetch/shared/RagQueryFetchTypes.ts | Add typed RagQueryFetch.execute helper. |
| src/debug/jtag/commands/ai/rag/query-close/shared/RagQueryCloseTypes.ts | Add typed RagQueryClose.execute helper. |
| src/debug/jtag/commands/ai/rag/inspect/shared/RAGInspectTypes.ts | Add typed RAGInspect.execute helper. |
| src/debug/jtag/commands/ai/rag/index/create/shared/IndexCreateTypes.ts | Add typed IndexCreate.execute helper. |
| src/debug/jtag/commands/ai/rag/index-codebase/shared/CodebaseIndexTypes.ts | Add typed CodebaseIndex.execute helper. |
| src/debug/jtag/commands/ai/providers/status/shared/AIProvidersStatusTypes.ts | Add typed AIProvidersStatus.execute helper. |
| src/debug/jtag/commands/ai/providers/status/server/AIProvidersStatusServerCommand.ts | Extend provider config metadata with Alibaba and Google entries. |
| src/debug/jtag/commands/ai/mute/shared/AIMuteTypes.ts | Add typed AIMute.execute helper. |
| src/debug/jtag/commands/ai/model/list/shared/ModelListTypes.ts | Add typed ModelList.execute helper. |
| src/debug/jtag/commands/ai/model/find/shared/ModelFindTypes.ts | Add typed ModelFind.execute helper. |
| src/debug/jtag/commands/ai/model/find/server/ModelFindServerCommand.ts | Use ModelList.execute for model discovery and fallback search. |
| src/debug/jtag/commands/ai/genome/stats/shared/GenomeStatsTypes.ts | Add typed GenomeStats.execute helper for AI genome stats. |
| src/debug/jtag/commands/ai/generate/shared/AIGenerateTypes.ts | Add typed AIGenerate.execute helper. |
| src/debug/jtag/commands/ai/generate/server/AIGenerateServerCommand.ts | Default provider from ollama to candle when none specified. |
| src/debug/jtag/commands/ai/embedding/generate/shared/EmbeddingGenerateTypes.ts | Add typed EmbeddingGenerate.execute helper. |
| src/debug/jtag/commands/ai/embedding/generate/server/EmbeddingGenerateServerCommand.ts | Change default embedding provider from ollama to candle. |
| src/debug/jtag/commands/ai/detect-semantic-loop/server/AiDetectSemanticLoopServerCommand.ts | Use DataList.execute for recent chat message retrieval. |
| src/debug/jtag/commands/ai/dataset/list/shared/DatasetListTypes.ts | Add typed DatasetList.execute helper. |
| src/debug/jtag/commands/ai/dataset/create/shared/DatasetCreateTypes.ts | Add typed DatasetCreate.execute helper. |
| src/debug/jtag/commands/ai/cost/shared/AICostTypes.ts | Add typed AICost.execute helper. |
| src/debug/jtag/commands/ai/cost/server/AICostServerCommand.ts | Use DataList.execute for AI generation cost aggregation. |
| src/debug/jtag/commands/ai/context/search/shared/AiContextSearchTypes.ts | Add typed AiContextSearch.execute helper. |
| src/debug/jtag/commands/ai/context/search/server/AiContextSearchServerCommand.ts | Use VectorSearch.execute instead of raw Commands.execute('data/vector-search'). |
| src/debug/jtag/commands/ai/bag-of-words/shared/BagOfWordsTypes.ts | Add typed BagOfWords.execute helper. |
| src/debug/jtag/commands/ai/adapter/test/shared/AdapterTestTypes.ts | Add typed AdapterTest.execute helper. |
| src/debug/jtag/commands/adapter/try/shared/AdapterTryTypes.ts | Add typed AdapterTry.execute helper. |
| src/debug/jtag/commands/adapter/search/shared/AdapterSearchTypes.ts | Add typed AdapterSearch.execute helper. |
| src/debug/jtag/commands/adapter/adopt/shared/AdapterAdoptTypes.ts | Add typed AdapterAdopt.execute helper. |
Files not reviewed (1)
- src/debug/jtag/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Copilot Review ContextCopilot's summary focuses on the type-safe command migration and SQLite JSON fix from earlier commits. The actual focus of this PR is the voice pipeline, which Copilot didn't surface. Here's what matters: This PR's voice pipeline fixes (latest commit)1. Audio cutoff ( 2. Per-persona voice ( 3. Mute state propagation ( Why Copilot missed thisThe 488-file diff is dominated by the type-safe command migration (older commits). Copilot reviewed the bulk files and correctly identified no issues there. The voice pipeline changes (5 files, latest commit) are architecturally significant but small in diff size — easy to miss in a large PR. |
|
Hooks are broken, but of no concern right now |
Summary
This PR addresses three critical voice pipeline issues discovered during live testing:
Audio cutoff: AI ring buffer in
mixer.rswas 10 seconds — conversational TTS responses (20-60s) silently dropped excess audio. Increased to 60 seconds withVec<i16>allocation (avoids stack overflow) and upgraded overflow logging fromdebug!towarn!.All AIs same voice: JS-side
computeVoiceFromUserId()hashed UUIDs to numeric strings (e.g. "42"), but Kokoro'snormalize_voice()only recognized named voices — everything else defaulted to "af". Addedresolve_voice()as a default trait method onTextToSpeechwith FNV-1a deterministic hash. Each adapter maps any input (named voice, numeric seed, UUID) to its own voice set. Removed TS-side hash entirely — Rust adapter owns voice resolution.Mute not respected:
micEnabled: falsesaved correctly but audio kept flowing. Root cause:@reactive()property changes didn't automatically propagate to the audio client — relied on manualapplyMicState()calls scattered across 5 code paths. Added LitElementupdated()lifecycle hook for reactive state sync. Also separated visibility/deactivation saved states that shared one field (could stomp each other) and added idempotentstartMicrophone()guard.Changes
workers/continuum-core/src/voice/mixer.rsworkers/continuum-core/src/voice/tts/mod.rsresolve_voice()trait method + FNV-1a hash + 6 testssystem/voice/server/AIAudioBridge.tscomputeVoiceFromUserId()widgets/live/LiveWidget.tsupdated()hook, split saved states, reentrancy guardwidgets/live/AudioStreamClient.tsstartMicrophone()early returnTest plan
cargo test --lib— 194 passed, 0 failednpx tsc --noEmit— clean, 0 errors