Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
6fbb12f
chore(backend): high-confidence hygiene cleanup
cursoragent Aug 10, 2026
419c4b2
chore(app): remove dead UI code and dedupe local helpers
cursoragent Aug 10, 2026
b50f52e
chore(scripts): harden ops helpers and fix stale Desktop paths
cursoragent Aug 10, 2026
097bc54
chore(app): drop trailing blank line for diff-hygiene
cursoragent Aug 10, 2026
4392324
chore(backend): keep shared edit_distance in ids.py
cursoragent Aug 10, 2026
f5e5d6c
chore(backend): move shared edit_distance into ids.py
cursoragent Aug 10, 2026
698a684
style(app): apply dart format to touched files
undivisible Aug 10, 2026
fed8bee
chore(scripts): drop cm-builds.sh alias and restore curl line continu…
undivisible Aug 10, 2026
647dd30
chore(scripts): drop duplicated || true in figma sync pkill
undivisible Aug 10, 2026
ee2b4b4
test(app): cover extracted phone call duration formatter
undivisible Aug 10, 2026
844bfa2
revert(app): restore generated files and pubspec.lock swept in by mis…
undivisible Aug 10, 2026
5d6313e
style(app): reformat with resolved package config to match CI dart fo…
undivisible Aug 10, 2026
ef69c72
fix(review): address Git & cubic review comments on PR 11303
undivisible Aug 12, 2026
bf27b10
style(app): apply dart format to changed files
undivisible Aug 12, 2026
14d2e20
style(app): apply dart format with resolved package language version
undivisible Aug 14, 2026
dd44d2c
fix(hygiene): restore pinned generated outputs
undivisible Aug 18, 2026
9f116a9
fix(web): replace nested ternary in getPlatformLink
undivisible Aug 22, 2026
8301615
fix(backend): restore webhook URL parsing in first-time setup
cursoragent Aug 25, 2026
ad37543
test(desktop): isolate Rewind owner snapshot authority
aryanorastar Aug 25, 2026
9b3cbab
chore(hygiene): high-confidence dead code, imports, and helper cleanu…
undivisible Aug 27, 2026
5428c6e
fix: remove unused get_byok_keys import in subscription.py
undivisible Aug 27, 2026
a112b2f
fix: remove unused get_byok_keys import in subscription.py
undivisible Aug 27, 2026
0b6132f
fix(ci): point the dev deploy smoke at development's real API host (#…
Git-on-my-level Aug 27, 2026
2bbb2ba
test(desktop): enroll BYOK fingerprints so paywall/agent tests match …
Git-on-my-level Aug 27, 2026
140e6c7
chore: consolidate changelog for v0.12.223
github-actions[bot] Aug 27, 2026
6b4158f
Update desktop changelog for v0.12.223 [skip ci] (#12280)
omi-ci-bot[bot] Aug 27, 2026
5c254e7
fix(desktop): make every chat_agent_error explain itself (#12267)
Git-on-my-level Aug 27, 2026
e5b562e
chore: consolidate changelog for v0.12.224
github-actions[bot] Aug 27, 2026
ed5a6fc
Update desktop changelog for v0.12.224 [skip ci] (#12282)
omi-ci-bot[bot] Aug 27, 2026
351ec09
test(desktop): isolate Rewind owner snapshot authority (#12192)
undivisible Aug 27, 2026
2be1992
fix(web): add the pinned prettier deps to web/app's lockfile (#12288)
aryanorastar Aug 27, 2026
2371629
test(desktop): isolate FloatingBar notification owner authority (#12259)
aryanorastar Aug 27, 2026
b2ed944
chore: consolidate changelog for v0.12.225
github-actions[bot] Aug 27, 2026
ac9cc46
Update desktop changelog for v0.12.225 [skip ci] (#12291)
omi-ci-bot[bot] Aug 27, 2026
3b73b26
feat(stt): admit Soniox as a streaming provider in the policy
mdmohsin7 Aug 27, 2026
a5c45b3
feat(stt): add Soniox real-time socket and connector
mdmohsin7 Aug 27, 2026
b88a5da
feat(stt): dispatch a Soniox primary with the standard fallback chain
mdmohsin7 Aug 27, 2026
57527ef
chore(charts): pass SONIOX_API_KEY to backend-listen when the secret …
mdmohsin7 Aug 27, 2026
47d06f1
test(stt): cover Soniox token assembly, diarization and opt-in default
mdmohsin7 Aug 27, 2026
01d392a
fix(stt): derive Soniox segment end from the next token start
mdmohsin7 Aug 27, 2026
7c900a9
refactor(stt): move the Soniox client into its own module
mdmohsin7 Aug 27, 2026
a700baa
feat(stt): add Soniox as an opt-in streaming provider (#12295)
mdmohsin7 Aug 27, 2026
da624d5
fix(deploy): classify SONIOX_API_KEY as a secret
mdmohsin7 Aug 27, 2026
f96cb3d
fix(deploy): classify SONIOX_API_KEY as a secret (#12296)
mdmohsin7 Aug 27, 2026
01623c7
fix(app): surface Limitless flash-drain stalls instead of silent succ…
formed2forge Aug 27, 2026
e161944
fix(desktop): ground legacy sidebars and keep them clickable (#12294)
igor-popov-dev Aug 27, 2026
994bc3b
fix(desktop): count a failed update check once, not once per Sparkle …
Git-on-my-level Aug 27, 2026
26f33b9
fix(backend): declare the rest of the missing composite indexes (mess…
igor-popov-dev Aug 27, 2026
8dca39d
docs(desktop-windows): surface pnpm/Wayland/verification notes from A…
formed2forge Aug 27, 2026
da3d62a
fix(desktop-windows): wire chat quota gate into main-window send path…
formed2forge Aug 27, 2026
2c31a9a
chore: consolidate changelog for v0.12.226
github-actions[bot] Aug 27, 2026
6c0d9e4
Update desktop changelog for v0.12.226 [skip ci] (#12297)
omi-ci-bot[bot] Aug 27, 2026
1f7b94f
fix(stt): keep Soniox sockets alive through VAD-gated silence
mdmohsin7 Aug 27, 2026
c5172aa
test(stt): cover the Soniox keepalive
mdmohsin7 Aug 27, 2026
932e2f5
fix(stt): keep Soniox sockets alive through VAD-gated silence (#12301)
mdmohsin7 Aug 27, 2026
e248aff
fix(app): correct recording size estimates
arhxam Aug 27, 2026
2af0832
feat: add JIT knowledge ledger foundation and guarded adoption (#12084)
Git-on-my-level Aug 27, 2026
ad68b70
fix(app): correct recording size estimates (#12303)
mdmohsin7 Aug 27, 2026
91fdbfa
fix(desktop): keep the notch island on screen after hovering
kodjima33 Aug 27, 2026
4fcb0ac
chore: consolidate changelog for v0.12.227
github-actions[bot] Aug 27, 2026
3da9634
Update desktop changelog for v0.12.227 [skip ci] (#12310)
omi-ci-bot[bot] Aug 27, 2026
a62b15e
fix(desktop): keep the notch island on screen after hovering (#12311)
kodjima33 Aug 27, 2026
2fdebd1
fix(desktop-windows): wire AutoCreatedTasksStep as step 14 of onboarding
Aug 25, 2026
52c382c
fix(desktop-windows): remove dead finishToChat after onboarding step-…
Aug 25, 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: 4 additions & 1 deletion .github/actions/deploy-backend-stack/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,10 @@ runs:
ADMIN_KEY="$(gcloud secrets versions access latest --secret=ADMIN_KEY --project="$PROJECT_ID")"
export ADMIN_KEY
trap 'unset ADMIN_KEY' EXIT
python3 "$DEPLOY_CONTROL_SCRIPTS/smoke_what_matters_now.py" --base-url https://api.omi.dev
# api.omi.dev has never resolved (NXDOMAIN), so this smoke could not reach
# anything; api.omiapi.com is development's real public API host, matching
# the rest of the dev domain family (parakeet/nllb/pusher.omiapi.com).
python3 "$DEPLOY_CONTROL_SCRIPTS/smoke_what_matters_now.py" --base-url https://api.omiapi.com

- name: Restore Cloud Run traffic snapshot after failed promotion
if: >-
Expand Down
5 changes: 5 additions & 0 deletions .github/checks-manifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,11 @@ checks:
triggers: ["backend/**/*.py", "backend/scripts/scan_async_blockers.py"]
lanes: ["local", "ci"]
reason: "backend Python changed"
- id: legacy-memory-surface-ratchet
command: ["python3", "backend/scripts/legacy_memory_surface_inventory.py", "--check-ratchet", "--base-ref", "{base}"]
triggers: ["backend/scripts/legacy_memory_surface_inventory.py", "backend/scripts/legacy_memory_surface_baseline.json", "backend/tests/unit/test_legacy_memory_surface_inventory.py", "backend/utils/conversations/process_conversation.py", "backend/utils/conversations/merge_conversations.py", "backend/utils/sync/pipeline.py", "backend/utils/memory/*.py", "backend/jobs/short_term_lifecycle_worker.py", "backend/modal/memory_maintenance_job.py", "backend/routers/conversations.py", "backend/routers/developer.py", "backend/routers/listen/conversations.py", "backend/routers/mcp.py", "backend/routers/mcp_sse.py", "backend/routers/memory_admin.py", "backend/routers/users.py", "backend/database/product_memory_items.py", "backend/database/users.py", "backend/runtime_images.json", "backend/utils/llm/ai_user_profile.py", "backend/deploy/runtime_env/*.yaml", "backend/scripts/memory-continuity-gauntlet.py", "backend/scripts/validate_memory_maintenance_scheduler.py", "desktop/macos/Desktop/Sources/ProactiveAssistants/**/*.swift", "desktop/macos/Desktop/Sources/Providers/ChatProvider.swift", "desktop/macos/Desktop/Sources/Rewind/Core/RewindDatabase.swift", "desktop/windows/src/main/assistants/**/*.ts", "desktop/windows/src/main/agentKernel/desktopChatPrompt.ts", "desktop/windows/src/main/ipc/mainChatPersonalization.ts", "desktop/windows/src/main/ipc/db.ts", ".github/workflows/gcp_memory_maintenance_job*.yml"]
lanes: ["local", "ci"]
reason: "Gate F legacy memory surfaces may shrink during the JIT-processing migration but must not gain new source or deployment references"
- id: backend-datetime-sort-sentinel-ratchet
command: ["python3", "backend/scripts/check_datetime_sort_sentinel_ratchet.py"]
triggers: ["backend/**/*.py", "backend/scripts/check_datetime_sort_sentinel_ratchet.py"]
Expand Down
19 changes: 19 additions & 0 deletions .github/failure-classes/FC-daily-memory-sweep-fence.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"schema_version": 1,
"id": "FC-daily-memory-sweep-fence",
"violated_contract": "A completed-day memory sweep must never advance or recreate canonical state across an account-deletion, owner, generation, source-completeness, or concurrent-runner boundary.",
"canonical_prevention": "Read deletion and live generation markers inside the canonical apply, receipt, and cursor transactions; require immutable complete-day packets; use generation-scoped leased receipts and prove crash, wipe, rollover, and overlapping-runner recovery against the Firestore emulator.",
"canonical_prevention_artifact": [
"backend/database/memory_apply_store.py",
"backend/utils/memory/daily_memory_sweep.py",
"backend/scripts/daily_memory_sweep_emulator_test.py"
],
"evidence_prs": [
12084
],
"scope_hints": [
"backend/utils/memory/daily_memory_sweep.py",
"backend/database/memory_apply_store.py"
],
"status": "open"
}
16 changes: 16 additions & 0 deletions .github/failure-classes/FC-drain-stall-completes-silently.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"schema_version": 1,
"id": "FC-drain-stall-completes-silently",
"violated_contract": "When a device-storage drain protocol enters a state where it is structurally unable to serve stored data — e.g. a mode that makes drain and recording mutually exclusive, or full storage that stays armed for recording and yields no pages — a stall caused by that state must be classified and surfaced to the user as an actionable error, never allowed to fall through to a generic \"completed, nothing new\" success state. Silent completion after a classifiable stall hides that the transfer never happened and that the user must act (e.g. stop recording) to unblock it.",
"canonical_prevention": "FlashPageWalSyncImpl re-queries device status on a stall while still in batch mode and classifies it via FlashSyncStallReason (recordingSuspected, deviceFull), exposed through WalSyncs.flashStallReason. SyncProvider._performSync checks the classified reason before its fallback branch and maps a classified stall with no new conversations to a user-facing, localized error state instead of toCompleted(). Regression tests replay each classified-stall path and assert the state is error, not completed.",
"canonical_prevention_artifact": [
"app/test/unit/flash_page_stall_classification_test.dart",
"app/test/providers/sync_provider_flash_stall_test.dart"
],
"evidence_prs": [],
"scope_hints": [
"app/lib/services/wals/**",
"app/lib/providers/sync_provider.dart"
],
"status": "open"
}
4 changes: 4 additions & 0 deletions .github/failure-classes/FC-malformed-doc-read.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
"id": "FC-malformed-doc-read",
"violated_contract": "A malformed persisted document must not turn a read path into a 500 response.",
"canonical_prevention": "Validate persisted documents at the shared read boundary and treat invalid records according to that boundary's explicit absent-or-skipped policy.",
"canonical_prevention_artifact": [
"backend/database/read_boundary.py",
".github/scripts/check_firestore_model_read_boundary.py"
],
"evidence_prs": [9494, 9696],
"scope_hints": ["backend/**"],
"status": "open"
Expand Down
12 changes: 12 additions & 0 deletions .github/scripts/check-deployment-concurrency.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,20 @@ class LockContract:
"gcp_frontend.yml": LockContract(
"deploy-cloud-run-frontend-${{ github.event_name == 'workflow_dispatch' && github.event.inputs.environment || github.ref == 'refs/heads/development' && 'development' || github.ref == 'refs/heads/main' && 'prod' || format('nondeploy-{0}', github.run_id) }}"
),
"gcp_frame_request_retention_job.yml": LockContract(
"deploy-frame-request-retention-${{ github.event.inputs.environment }}"
),
"gcp_llm_gateway.yml": LockContract("deploy-backend-stack-${{ github.event.inputs.environment }}"),
"gcp_memory_maintenance_job.yml": LockContract(
"deploy-cloud-run-memory-maintenance-job-${{ github.event.inputs.environment }}"
),
"gcp_memory_maintenance_job_auto_dev.yml": LockContract("deploy-cloud-run-memory-maintenance-job-development"),
"gcp_daily_memory_sweep_job.yml": LockContract(
"deploy-cloud-run-daily-memory-sweep-job-${{ github.event.inputs.environment }}"
),
"gcp_daily_memory_sweep_job_auto_dev.yml": LockContract(
"deploy-cloud-run-daily-memory-sweep-job-development"
),
"gcp_models.yml": LockContract("deploy-gke-vad-${{ github.event.inputs.environment }}"),
"gcp_nllb_translation.yml": LockContract("deploy-gke-nllb-translation-${{ github.event.inputs.environment }}"),
"gcp_notifications_job.yml": LockContract(
Expand Down Expand Up @@ -667,6 +676,7 @@ def validate_shared_families(groups: dict[str, str]) -> list[str]:
("gcp_backend_listen_helm.yml", "gcp_backend_auto_dev.yml"),
("gcp_llm_gateway.yml", "gcp_backend_auto_dev.yml"),
("gcp_memory_maintenance_job.yml", "gcp_memory_maintenance_job_auto_dev.yml"),
("gcp_daily_memory_sweep_job.yml", "gcp_daily_memory_sweep_job_auto_dev.yml"),
("gcp_backend_pusher.yml", "gcp_backend_pusher_auto_deploy.yml"),
)
for manual, automatic in family_pairs:
Expand All @@ -681,8 +691,10 @@ def validate_shared_families(groups: dict[str, str]) -> list[str]:
"gcp_firestore_indexes.yml",
"gcp_backend_listen_helm.yml",
"gcp_diarizer.yml",
"gcp_frame_request_retention_job.yml",
"gcp_llm_gateway.yml",
"gcp_memory_maintenance_job.yml",
"gcp_daily_memory_sweep_job.yml",
"gcp_models.yml",
"gcp_nllb_translation.yml",
"gcp_notifications_job.yml",
Expand Down
2 changes: 2 additions & 0 deletions .github/scripts/check-desktop-backend-release-policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def _validate_production_python_runtime(text: str, *, workflow: str) -> list[str
"GOOGLE_CLOUD_PROJECT=${{ vars.GCP_PROJECT_ID }}",
"GCP_LOCATION=us-central1",
"/secrets/firebase/service-account.json=SERVICE_ACCOUNT_JSON:latest",
"POSTHOG_PROJECT_API_KEY=POSTHOG_PROJECT_API_KEY:latest",
"GEMINI_API_KEY=DESKTOP_GEMINI_API_KEY:latest",
"FIREBASE_API_KEY=DESKTOP_FIREBASE_API_KEY:latest",
"REDIS_DB_PASSWORD=DESKTOP_REDIS_DB_PASSWORD:latest",
Expand Down Expand Up @@ -154,6 +155,7 @@ def validate_deploy_workflow(text: str, *, production: bool) -> list[str]:
"cloud_run_gmp_sidecar.yaml",
"PROMETHEUS_SIDECAR_PORT=9090",
"METRICS_SECRET=METRICS_SECRET:latest",
"POSTHOG_PROJECT_API_KEY=POSTHOG_PROJECT_API_KEY:latest",
"Attach Managed Prometheus sidecar",
"Verify candidate image lineage",
"@${{ steps.build-image.outputs.digest }}",
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/backend-unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ on:
- 'scripts/install-git-hooks.sh'
- 'scripts/pre-push'
- 'scripts/pre-push-singleflight'
- 'scripts/dev-harness/dev_harness/jit_vertex_gateway.py'
- 'scripts/voice-provider-probe.sh'
pull_request:
paths:
Expand Down Expand Up @@ -92,6 +93,7 @@ on:
- 'scripts/install-git-hooks.sh'
- 'scripts/pre-push'
- 'scripts/pre-push-singleflight'
- 'scripts/dev-harness/dev_harness/jit_vertex_gateway.py'
- 'scripts/voice-provider-probe.sh'
workflow_dispatch:

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/desktop_backend_auto_dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ jobs:
GOOGLE_CALENDAR_API_KEY=DESKTOP_GOOGLE_CALENDAR_API_KEY:latest
OMI_LLM_GATEWAY_SERVICE_TOKEN=OMI_LLM_GATEWAY_SERVICE_TOKEN:latest
METRICS_SECRET=METRICS_SECRET:latest
POSTHOG_PROJECT_API_KEY=POSTHOG_PROJECT_API_KEY:latest

# See desktop_backend_prod.yml: the expectation is rendered from the
# manifest so it cannot drift from the values actually deployed.
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/desktop_backend_prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,8 @@ jobs:
DESKTOP_REDIS_DB_PASSWORD \
DESKTOP_REDIS_DB_HOST \
DESKTOP_REDIS_DB_PORT \
METRICS_SECRET; do
METRICS_SECRET \
POSTHOG_PROJECT_API_KEY; do
gcloud secrets describe "$secret" \
--project="$PROJECT_ID" \
--format='none'
Expand Down Expand Up @@ -342,6 +343,7 @@ jobs:
GOOGLE_CALENDAR_API_KEY=DESKTOP_GOOGLE_CALENDAR_API_KEY:latest
OMI_LLM_GATEWAY_SERVICE_TOKEN=OMI_LLM_GATEWAY_SERVICE_TOKEN:latest
METRICS_SECRET=METRICS_SECRET:latest
POSTHOG_PROJECT_API_KEY=POSTHOG_PROJECT_API_KEY:latest

# The sidecar attach re-serialises the live Cloud Run export, so it verifies
# the ingress env it is about to rewrite against what the manifest says it
Expand Down
Loading