Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
f58c3cb
feat(desktop): hide the assistant panes and three floating-bar rows f…
kodjima33 Aug 27, 2026
2ad044e
chore(deps): bump @tschk/moonshine packages to 0.4.1
undivisible Aug 28, 2026
262ac09
feat(monitoring): add PTT transport-health section to Omi Core Featur…
Git-on-my-level Aug 28, 2026
d5cadca
feat(desktop): add source attribution to floating_bar_query_sent (#12…
Git-on-my-level Aug 28, 2026
c3ca88b
chore: consolidate changelog for v0.12.232
github-actions[bot] Aug 28, 2026
cd6765b
Update desktop changelog for v0.12.232 [skip ci] (#12338)
omi-ci-bot[bot] Aug 28, 2026
0303fd2
feat(desktop): hide the assistant panes and three floating-bar rows f…
kodjima33 Aug 28, 2026
ed58b52
fix(desktop): no visible control deep-links to the hidden Task Assist…
kodjima33 Aug 28, 2026
10134e6
test(desktop): pin the hidden-surface decisions through a production …
kodjima33 Aug 28, 2026
716bf6e
test(desktop): exercise the hidden-gear and deep-link decisions, not …
kodjima33 Aug 28, 2026
3b62476
chore: consolidate changelog for v0.12.233
github-actions[bot] Aug 28, 2026
2f2be5a
Update desktop changelog for v0.12.233 [skip ci] (#12342)
omi-ci-bot[bot] Aug 28, 2026
08a304b
fix(desktop): render chat execute_sql datetime columns in local time …
kodjima33 Aug 28, 2026
7074d8e
chore: consolidate changelog for v0.12.234
github-actions[bot] Aug 28, 2026
23aadea
Update desktop changelog for v0.12.234 [skip ci] (#12353)
omi-ci-bot[bot] Aug 28, 2026
cf0e80e
fix(macos): restore shell clicks after reopening (#12261)
aryanorastar Aug 28, 2026
cdca0c8
test(ci): restore backend unit and ratchet checks (#12339)
aryanorastar Aug 28, 2026
b3300c1
fix(ci): keep desktop main health current (#12285)
aryanorastar Aug 28, 2026
ed2b015
fix(desktop): make post-rating referral button readable (#12336)
Git-on-my-level Aug 28, 2026
32e2f4f
chore: consolidate changelog for v0.12.235
github-actions[bot] Aug 28, 2026
5011632
Update desktop changelog for v0.12.235 [skip ci] (#12357)
omi-ci-bot[bot] Aug 28, 2026
82a67a6
fix(ci): retire superseded Windows release sync PRs (#10727) (#10960)
aryanorastar Aug 28, 2026
fe3df5a
SCA-365: route remaining HTTP LLM surfaces through the gateway (#12337)
Git-on-my-level Aug 28, 2026
7893776
refactor(desktop): one voice authority per realtime provider, with tests
kodjima33 Aug 27, 2026
91c5fa3
test(desktop): assert voices through the production payload seams
kodjima33 Aug 27, 2026
12d0b9c
fix(desktop): presence-gate the realtime hub's idle re-warm loop
kodjima33 Aug 27, 2026
361717e
test(desktop): cover new realtime-hub files in e2e flow source lists
kodjima33 Aug 27, 2026
7e91a7e
fix(desktop): passive lifecycle warms cannot clear the away deferral
kodjima33 Aug 28, 2026
1765554
fix(desktop): speaker naming works from every surface and for unsynce…
kodjima33 Aug 28, 2026
af329ea
fix(desktop): presence poll accepts input across a delayed sample gap
kodjima33 Aug 28, 2026
8f874ba
fix(desktop): speaker naming works from every surface and for unsynce…
kodjima33 Aug 28, 2026
fb9a971
fix(desktop): no visible control deep-links to the hidden Task Assist…
kodjima33 Aug 28, 2026
692dc82
fix(desktop): presence-gate the realtime hub's idle re-warm loop (Gem…
kodjima33 Aug 28, 2026
69be6a1
fix(desktop): speaker assignments resolve positional targets and pers…
kodjima33 Aug 28, 2026
552bfb6
fix(desktop): surface local speaker-assignment persistence failures
kodjima33 Aug 28, 2026
bc21530
feat(desktop): polish unified navigation and search surfaces (#12334)
Git-on-my-level Aug 28, 2026
095389f
fix(desktop): speaker assignments resolve positional targets and pers…
kodjima33 Aug 28, 2026
33939d3
chore: consolidate changelog for v0.12.236
github-actions[bot] Aug 28, 2026
7257a9c
Update desktop changelog for v0.12.236 [skip ci] (#12365)
omi-ci-bot[bot] Aug 28, 2026
17b29d5
feat(macos): route voice deep answers through chat
Git-on-my-level Aug 28, 2026
82d79df
chore(ci): drop false Gate F hit in Windows insight prompt comment
Git-on-my-level Aug 28, 2026
ac67839
test(macos): align PTT kernel-context contract with chat-lane escalation
Git-on-my-level Aug 28, 2026
25501d3
fix(macos): isolate voice tool deadlines and chat-lane interrupts
Git-on-my-level Aug 28, 2026
953630a
fix(macos): expose web search to realtime voice
Git-on-my-level Aug 28, 2026
2f4219c
fix(macos): isolate realtime web lookup context
Git-on-my-level Aug 28, 2026
d8bf7e8
Improve realtime deep-answer routing
Git-on-my-level Aug 28, 2026
7ea1efa
feat(desktop): rename the Brain tab to Memories
kodjima33 Aug 28, 2026
21b96d7
feat(backend): admit JIT from one flag plus a two-UID allowlist
Git-on-my-level Aug 28, 2026
f735cb6
fix(macos): acknowledge slow voice tools immediately
Git-on-my-level Aug 28, 2026
5524d87
fix(backend): admit daily sweep from the shared JIT helper at the job
Git-on-my-level Aug 28, 2026
b8c6e0c
fix(macos): preserve voice tool authorization hashes
Git-on-my-level Aug 28, 2026
31a6415
feat(desktop): rename the Brain tab to Memories (#12366)
kodjima33 Aug 28, 2026
cf4ceb6
Merge remote-tracking branch 'origin/main' into agent/m5-mbp-codex-so…
Git-on-my-level Aug 28, 2026
bc1ccef
SCA-367: feat(backend): one JIT flag + two-UID allowlist (#12369)
Git-on-my-level Aug 28, 2026
befdfe9
chore: consolidate changelog for v0.12.237
github-actions[bot] Aug 28, 2026
99bfd5e
Update desktop changelog for v0.12.237 [skip ci] (#12371)
omi-ci-bot[bot] Aug 28, 2026
b723a24
fix(macos): match realtime voice and preserve long playback
Git-on-my-level Aug 28, 2026
13b1451
Merge remote-tracking branch 'origin/main' into agent/m5-mbp-codex-so…
Git-on-my-level Aug 28, 2026
3447cdc
fix(desktop): simplify screen recording drag guidance
Git-on-my-level Aug 28, 2026
b6f1526
test(macos): cover realtime voice phrase assets
Git-on-my-level Aug 28, 2026
a250990
fix(app): distinguish cutover outages from migration
Git-on-my-level Aug 28, 2026
e03351a
fix(desktop-backend): admit the gateway route in the candidate probe
Git-on-my-level Aug 28, 2026
65f0be2
test(backend): isolate onboarding admission bootstrap
Git-on-my-level Aug 28, 2026
ecec0c2
fix(desktop-backend): admit the gateway route in the candidate probe …
Git-on-my-level Aug 28, 2026
602de88
Simplify Screen Recording drag guidance (#12372)
Git-on-my-level Aug 29, 2026
4732f42
fix(app): distinguish cutover outages from migration (#12373)
Git-on-my-level Aug 29, 2026
a8bbdcf
Merge remote-tracking branch 'origin/main' into agent/m5-mbp-codex-so…
Git-on-my-level Aug 29, 2026
a8f4048
SCA-363: macOS in-app CSAT + admin copy/stats (#12330)
Git-on-my-level Aug 29, 2026
97c22b9
Merge remote-tracking branch 'origin/main' into agent/m5-mbp-codex-so…
Git-on-my-level Aug 29, 2026
9edc513
fix(macos): keep recent voice conversations model-visible
Git-on-my-level Aug 29, 2026
9817869
chore: consolidate changelog for v0.12.238
github-actions[bot] Aug 29, 2026
0bc0c0f
Update desktop changelog for v0.12.238 [skip ci] (#12378)
omi-ci-bot[bot] Aug 29, 2026
3adbf6b
SCA-366: route realtime deep answers through Chat (#12335)
Git-on-my-level Aug 29, 2026
15be65c
chore: consolidate changelog for v0.12.239
github-actions[bot] Aug 29, 2026
da5dfcc
Update desktop changelog for v0.12.239 [skip ci] (#12379)
omi-ci-bot[bot] Aug 29, 2026
8c10a50
fix(desktop): download JIT trigger snapshot when effective=enabled
Git-on-my-level Aug 29, 2026
a9eb98e
chore: register FC-client-rederives-authority-verdict
Git-on-my-level Aug 29, 2026
0efe9c3
fix(desktop): download JIT trigger snapshot when effective=enabled (#…
Git-on-my-level Aug 29, 2026
37794e5
chore: consolidate changelog for v0.12.240
github-actions[bot] Aug 29, 2026
811c129
Update desktop changelog for v0.12.240 [skip ci] (#12382)
omi-ci-bot[bot] Aug 29, 2026
d08c202
fix(desktop): sync JIT trigger snapshot on signed-in startup without …
Git-on-my-level Aug 29, 2026
43050a7
fix(desktop): sync JIT trigger snapshot on signed-in startup without …
Git-on-my-level Aug 29, 2026
bf4def8
chore: consolidate changelog for v0.12.241
github-actions[bot] Aug 29, 2026
0adac6a
Update desktop changelog for v0.12.241 [skip ci] (#12387)
omi-ci-bot[bot] Aug 29, 2026
5a7cae2
feat(action-items): add cleanup endpoint and fetch_action_item_vectors
Jun 10, 2026
9510924
chore(backend): wire action_items_cleanup router; use public Python b…
Jun 10, 2026
4412d46
feat(desktop-windows): task cleanup UI in Advanced settings
Aug 26, 2026
8a50705
test(action-items): add tests for cleanup strategies, router, and fro…
Aug 26, 2026
e9fb53d
fix(action-items): guard cleanup preview against empty strategy list
Aug 26, 2026
dc16d1c
fix(action-items): fix pyright errors in cleanup router and utils
Aug 26, 2026
1c1b882
chore(api): regenerate app-client OpenAPI spec with cleanup endpoints
Aug 26, 2026
633e0a4
chore(backend): add route policy manifest entries for cleanup endpoints
Aug 26, 2026
a3c7e93
style(backend): apply black formatting to cleanup files
Aug 26, 2026
250320d
fix(action-items): stop flagging concrete "the <noun>" tasks as vague
formed2forge Aug 26, 2026
f58de85
feat(action-items): let cleanup execute honor per-item exclusions
formed2forge Aug 26, 2026
a927f97
feat(desktop-windows): review and exclude candidates before task cleanup
formed2forge Aug 26, 2026
40da780
chore(api): regenerate app-client OpenAPI spec and TS clients for cle…
formed2forge Aug 26, 2026
95fc09a
feat(action-items): rate-limit the cleanup preview/execute endpoints
formed2forge Aug 26, 2026
5b4805a
revert(backend): restore private base image for diarizer/modal Docker…
formed2forge Aug 26, 2026
1cb7e1c
feat(action-items): surface silent 2000-task cleanup scan truncation
formed2forge Aug 26, 2026
9b7f2c8
feat(desktop-windows): show a notice when cleanup preview is scan-tru…
formed2forge Aug 26, 2026
5b6ff0b
chore(api): regenerate app-client OpenAPI spec and TS clients for sca…
formed2forge Aug 26, 2026
cdd8a1c
fix(action-items): register cleanup router in task_intelligence_sourc…
Aug 27, 2026
596f5b3
fix(action-items): harden cleanup preview/execute production boundaries
formed2forge Aug 29, 2026
9a104e2
chore(api): regenerate app-client spec and clients for cleanup scan c…
formed2forge Aug 29, 2026
834f81f
fix(action-items): generalize LLM batch helper for pyright
formed2forge Aug 29, 2026
45a5980
refactor(database): split cleanup scan and generic cache for line-cou…
formed2forge Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/checks-manifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,11 @@ checks:
triggers: [".github/scripts/check_runner_cost_policy.py", ".github/scripts/test_check_runner_cost_policy.py"]
lanes: ["local", "ci"]
reason: "runner cost-policy fixtures must keep rejecting the paid larger-runner label"
- id: windows-sync-pr-retirement-contract
command: ["python3", ".github/scripts/test_retire_superseded_sync_prs.py"]
triggers: [".github/workflows/desktop_windows_release.yml", ".github/scripts/retire_superseded_sync_prs.py", ".github/scripts/test_retire_superseded_sync_prs.py"]
lanes: ["local", "ci"]
reason: "#10727: the Windows release sync-PR cleanup must retain the current PR, only close same-repo release/windows-v* heads, and never block the release"
- id: telegram-deployment-notifier
command: ["bash", ".github/actions/deployment-notifier/test-check-configuration.sh"]
triggers: [".github/actions/deployment-notifier/**", ".github/checks-manifest.yaml"]
Expand Down
18 changes: 18 additions & 0 deletions .github/failure-classes/FC-client-rederives-authority-verdict.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"schema_version": 1,
"id": "FC-client-rederives-authority-verdict",
"violated_contract": "A client that consumes an authority's decision response must act on the authority's own verdict field, never re-derive a stricter verdict from the raw inputs the authority also returns. The re-derivation diverges silently the day the authority's computation changes: the client keeps issuing the decision read, receives a 200, and gates off anyway — no decode error, no failing test, and the server log looks healthy. #12369 collapsed backend JIT admission onto one exposure flag plus a two-UID allowlist and returns effective=enabled for admitted owners; the macOS client kept requiring rollout == enabled && kill_switch == .disabled, so Omi Beta 12237 repeatedly read /v1/jit/rollout-decision with a 200, never issued GET /v1/jit/trigger-snapshot, and persisted zero jit_trigger_snapshot_receipts rows. The Windows client parses and uses effective and was not affected.",
"canonical_prevention": "Point the admission predicate at the same value the authority computes: JITProactivityFlags.permitsNewLane admits on effective == .enabled and fails closed on .disabled, keeping the raw rollout + kill-switch pair only as an older-server fallback that distinguishes an absent kill_switch (wire compatibility) from a present unknown (fail closed). Exercise the full truth table through URLProtocol-level wire tests against the response shape the router actually emits, plus a runtime test that an effective-enabled authority reads the trigger snapshot and persists its receipt even for a complete empty watchlist. A downstream projection failure (ledger mirror sync) must fail that projection closed, not the authoritative receipt the client already holds.",
"canonical_prevention_artifact": [
"desktop/macos/Desktop/Sources/ProactiveAssistants/Core/JITProactivityPolicy.swift",
"desktop/macos/Desktop/Sources/ProactiveAssistants/Core/ProactiveLaneClient.swift",
"desktop/macos/Desktop/Tests/ProactiveLaneClientTests.swift",
"desktop/macos/Desktop/Tests/JITProactivityRuntimeTests.swift"
],
"evidence_prs": [],
"scope_hints": [
"desktop/macos/Desktop/Sources/ProactiveAssistants/**",
"desktop/windows/src/main/jit/**"
],
"status": "open"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"schema_version": 1,
"id": "FC-naive-utc-timestamp-in-llm-surface",
"violated_contract": "A timestamp value handed to the chat model as tool output or prompt context must carry an explicit time zone; a naive datetime string must never be presented as if it were already local time.",
"canonical_prevention": "Convert database-stored UTC datetime values to TimeZone.current with an explicit zone abbreviation/offset in the formatter that renders them for the model, rather than relying on prompt instructions asking the model to apply the offset itself.",
"evidence_prs": [],
"scope_hints": ["desktop/macos/Desktop/Sources/Chat/**", "desktop/macos/Desktop/Sources/Providers/ChatToolExecutor.swift"],
"status": "open"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"schema_version": 1,
"id": "FC-path-filter-masks-default-branch-health",
"violated_contract": "A path-filtered workflow answers whether one diff requires a component check; it does not establish that the component still compiles at the current default-branch SHA. Treating a later unrelated commit's skipped component jobs or overall green workflow as refreshed health evidence lets an older compiler failure remain on main behind a newer green run (#12275).",
"canonical_prevention": "Keep ordinary push and pull-request path filtering for cost control, but give the component an authoritative recurring health event and an operator recovery event that force its real compile/test phases against the current SHA regardless of changed paths. Guard both sides: authoritative events must select the full phases, while unrelated ordinary pushes must remain filtered.",
"canonical_prevention_artifact": [
".github/scripts/test_pre_push_ci_prediction.py",
".github/scripts/test_desktop_swift_ci_contract.py"
],
"evidence_prs": [],
"scope_hints": [
".github/workflows/",
"scripts/pre_push_ci_prediction.py"
],
"status": "open"
}
18 changes: 18 additions & 0 deletions .github/failure-classes/FC-sync-gated-on-consumer-trigger.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"schema_version": 1,
"id": "FC-sync-gated-on-consumer-trigger",
"violated_contract": "A durable state sync whose authority is cheap to read (a snapshot plus its receipt) must be driven by the lifecycle event of the scope that owns it — signed-in admitted startup, owner change — never only by the opportunistic consumer path that happens to need it next. Binding the sync to the consumer's trigger silently couples availability to an unrelated subsystem: the JIT trigger snapshot download only ran inside JITProactivityRuntime.admission, reached solely after a notify-worthy screen-capture context visit, so an allowlisted owner whose TCC Screen Recording grant dropped (Sparkle replaced the signed binary) held a valid authority, kept the routes it did hit green, and stayed at zero jit_trigger_snapshot_receipts forever — the client fix in #12381 shipped in Beta 12240 but could never execute. No decode error, no failing test, and the server log looks healthy because the gating read simply never happens.",
"canonical_prevention": "Hook the same flag → fetch → reconcile chain the consumer uses onto the owner-ready startup path: DesktopHomeSignedInStartup.runProductServicesIfAdmitted fires JITProactivityRuntime.syncTriggerSnapshot once after isProductShellAdmitted, and the .task(id: productShellAdmissionToken) restart supplies the owner-change retry. Fire-and-forget so a slow authority route never gates startup; keep the consumer's fail-closed gate (permitsNewLane) and the complete-empty-snapshot receipt contract. Behavioral coverage: a runtime test that fetches and persists a receipt with zero context visits, fail-closed tests that every non-permitting authority performs no snapshot read, and URLProtocol-level wire tests asserting the GET sequence rollout-decision → trigger-snapshot.",
"canonical_prevention_artifact": [
"desktop/macos/Desktop/Sources/AccountCutover/DesktopHomeSignedInStartup.swift",
"desktop/macos/Desktop/Sources/ProactiveAssistants/Core/JITProactivityRuntime.swift",
"desktop/macos/Desktop/Tests/JITProactivityRuntimeTests.swift",
"desktop/macos/Desktop/Tests/ProactiveLaneClientTests.swift"
],
"evidence_prs": [],
"scope_hints": [
"desktop/macos/Desktop/Sources/ProactiveAssistants/**",
"desktop/windows/src/main/jit/**"
],
"status": "open"
}
14 changes: 14 additions & 0 deletions .github/failure-classes/FC-unattended-warm-resource-loop.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"schema_version": 1,
"id": "FC-unattended-warm-resource-loop",
"violated_contract": "A warm resource kept open purely to hide first-use latency (a pre-warmed provider session, connection, or cache) exists for the user's presence; its refresh loop must be gated on evidence the user can still benefit. Rebuilding it unconditionally after every provider-side idle teardown turns a latency optimization into an unbounded background spend loop — per running app, around the clock — whose cost (metered tokens re-billed on every rebuild) accrues while the user is asleep or away, and whose fleet-wide aggregate can exhaust a shared project quota and degrade every user at once.",
"canonical_prevention": "Gate idle-teardown re-warms behind RealtimeHubWarmPresencePolicy: defer the rebuild once HID input idle exceeds the threshold, resume on the first returned input event, and fail open (always warm) when the presence sample is unavailable. Any explicit warm intent (PTT-down, settings change) clears the deferral so a present user never waits on the gate.",
"canonical_prevention_artifact": [
"desktop/macos/Desktop/Tests/RealtimeHubWarmPresencePolicyTests.swift"
],
"evidence_prs": [],
"scope_hints": [
"desktop/macos/Desktop/Sources/FloatingControlBar/RealtimeHub*"
],
"status": "open"
}
26 changes: 15 additions & 11 deletions .github/scripts/analytics_reachability_baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"memoriesPageCreateMemoryBtn": 2,
"omiDoubleTap": 5,
"onboardingStepCompleted": 11,
"pageOpened": 30,
"pageOpened": 31,
"paywallOpened": 4,
"permissionChanged": 5,
"permissionsSettingsOpened": 2,
Expand All @@ -49,7 +49,7 @@
"taskIntegrationAuthFailed": 8,
"taskIntegrationEnabled": 5,
"taskIntegrationSettingsOpened": 4,
"track": 27,
"track": 28,
"transcriptionSourceSelected": 4,
"uncheckedActionItem": 2,
"upgradeSucceeded": 2,
Expand All @@ -59,36 +59,40 @@
},
"macos": {
"appDetailViewed": 3,
"chatAppSelected": 2,
"chatFirst": 37,
"chatFirst": 41,
"chatMessageSent": 8,
"conversationCreated": 2,
"desktopPromptAnswered": 2,
"floatingBarAskOmiOpened": 2,
"floatingBarPTTEnded": 7,
"floatingBarPTTStarted": 2,
"floatingBarQuerySent": 2,
"floatingBarQuerySent": 3,
"floatingBarToggled": 4,
"identify": 3,
"insightAssistantDeliveryOutcome": 3,
"integrationNudgeActioned": 3,
"knowledgeGraphBuildCompleted": 2,
"languageChanged": 2,
"launchAtLoginChanged": 4,
"memoryAssistantAnalysisRun": 2,
"memoryListItemClicked": 2,
"menuBarActionClicked": 8,
"notificationClicked": 3,
"notificationDismissed": 2,
"notificationDismissed": 3,
"notificationRepairTriggered": 2,
"notificationSent": 2,
"onboardingChatMessageDetailed": 3,
"onboardingChatToolUsed": 11,
"onboardingCompleted": 3,
"onboardingCompleted": 2,
"onboardingHowDidYouHear": 2,
"onboardingStepCompleted": 32,
"recordingError": 4,
"rewindTimelineNavigated": 2,
"screenCaptureBrokenDetected": 3,
"screenCaptureBrokenDetected": 4,
"screenCaptureResetClicked": 3,
"screenCaptureResetCompleted": 2,
"settingToggled": 16,
"shareAction": 4,
"settingToggled": 14,
"shareAction": 5,
"signInCompleted": 2,
"signInFailed": 2,
"signInStarted": 2,
Expand Down Expand Up @@ -172,8 +176,8 @@
"wrappedBannerClicked"
],
"macos": [
"chatAppSelected",
"claudeOAuthCallbackTimeout",
"focusAlertDismissed",
"memoryShareButtonClicked",
"onboardingChatMessage",
"optInTracking",
Expand Down
8 changes: 7 additions & 1 deletion .github/scripts/desktop_backend_candidate_probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,13 @@
MAX_FIRST_EVENT_SECONDS = 20
SHA_PATTERN = re.compile(r"^[0-9a-f]{40}$")
CONTRACT_PATTERN = re.compile(r"^[1-9][0-9]{0,5}$")
REAL_GEMINI_PROVIDER_ROUTES = frozenset({"vertex_ai", "ai_studio", "ai_studio_byok"})
REAL_GEMINI_PROVIDER_ROUTES = frozenset({"vertex_ai", "ai_studio", "ai_studio_byok", "llm_gateway"})
# `llm_gateway` is the route the desktop proxy stamps on X-Omi-Provider for
# company-paid Gemini traffic since #12337 routed it through the LLM gateway
# (backend/utils/llm/desktop_gemini_gateway.py proxy_company_paid_via_gateway).
# The gateway's desktop-vertex lanes pin the Vertex provider with no fallbacks
# (backend/llm_gateway/gateway/config_loader.py), so the hop is still real
# Gemini-on-Vertex; stub and unknown routes stay rejected fail-closed.


class ProbeError(RuntimeError):
Expand Down
Loading