Repository navigation
Conversation
configure_startup_runtime gated SKIP_VOICE on the BYO env keys alone, so a managed-only install (G8: desktop mints <workspace>/state/auth/ managed-credentials.json, voice-key.ts resolves it at runtime) booted with voice disabled even though the voice-agent connects fine when launched. Observed live 2026-07-23: managed credential present, voice-agent down, manual launch connected to Gemini Live immediately. Teach the gate the managed tier as a second source, mirroring the resolver's presence semantics (gemini-voice falls back to gemini-text, non-empty key counts, expiry stays the resolver's concern). With no managed file the behavior is byte-identical to the env-only chain. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Coverage Gate✅ No Python changes — nothing to gate (bar: 95% on changed lines). |
|
The startup-gate logic is correct in isolation (fail-closed on malformed JSON / missing file, This gate depends on #2197 ( Concretely, if #2287 merges before #2197, a managed-only install (minted
That's a regression from today's clean Non-blocking (maintainability): the gate re-implements the G8 shape ( Not blocking on the code itself — flagging the dependency so it doesn't merge out of order. |
Problem
configure_startup_runtime(src/startup-runtime.sh) decidesSKIP_VOICEfrom the BYO env keys alone (GEMINI_VOICE_API_KEY/GEMINI_API_KEY). On a managed-mode install there are no env keys — the desktop app mints<workspace>/state/auth/managed-credentials.json(G8 contract,src/credential-resolver.ts) andvoice-key.tsresolves it at runtime. Result: startup setsSKIP_VOICE=1and the voice-agent never launches, even though it would connect fine.Observed live 2026-07-23 on a managed-only install: credential minted and valid, voice-agent down; launching
dist/voice-agent.jsmanually connected to Gemini Live immediately ([VoiceSession] LLM transport connected).Fix
If no env key is present, check the managed file for a
gemini-voice(fallbackgemini-text) capability with a non-empty key — the same presence semantics the resolver uses. Expiry/refresh remain the resolver's concern. When the managed tier is what enabled voice, print✓ voice credential: managed (…)per G8's source-observability goal.Compatibility: with no managed file the gate behaves byte-identically to today, so this is inert on plain/BYOK installs and on main until the G8 writer lands (#2131 / #2262 / #2197 — none of which touch this gate).
Tests
Extended
tests/startup-voice-optional.test.sh: a minted managed file enables voice (SKIP_VOICE=0 + managed message); a keyless managed file does not (SKIP_VOICE=1). All pre-existing cases pass unchanged.🤖 Generated with Claude Code