From 0c3ef0f1b6601276994049f5f24636d6b8a57eef Mon Sep 17 00:00:00 2001 From: Kyzcreig <9063726+Kyzcreig@users.noreply.github.com> Date: Fri, 25 Sep 2026 15:09:08 -0700 Subject: [PATCH 1/4] revert(desktop): take upstream apps/desktop wholesale (D9, fork-PR audit auto-desktop-retired, 37 rows) git rm -r apps/desktop && git checkout upstream/main -- apps/desktop. Proof: git diff upstream/main -- apps/desktop is empty. Lead card t_03e35f0e. Refreshed apps/desktop to upstream/main 0bd1991db1 after rebase on fork main aff7aea248 (t_899f0539). git diff upstream/main -- apps/desktop is empty. --- .../home/.hermes-update-in-progress.mutex' | 0 .../home/.hermes-update-in-progress.mutex' | 0 apps/desktop/AGENTS.md | 81 +- apps/desktop/BUILDING.md | 355 + apps/desktop/DESIGN.md | 261 +- apps/desktop/README.md | 63 +- .../assets/appx/Square150x150Logo-dark.png | Bin 0 -> 9914 bytes .../desktop/assets/appx/Square150x150Logo.png | Bin 0 -> 6594 bytes .../assets/appx/Square44x44Logo-dark.png | Bin 0 -> 2262 bytes apps/desktop/assets/appx/Square44x44Logo.png | Bin 0 -> 1683 bytes apps/desktop/assets/appx/StoreLogo-dark.png | Bin 0 -> 2560 bytes apps/desktop/assets/appx/StoreLogo.png | Bin 0 -> 1818 bytes .../assets/appx/Wide310x150Logo-dark.png | Bin 0 -> 7320 bytes apps/desktop/assets/appx/Wide310x150Logo.png | Bin 0 -> 5143 bytes apps/desktop/assets/icon-dark.icns | Bin 0 -> 361309 bytes apps/desktop/assets/icon-dark.ico | Bin 0 -> 57815 bytes apps/desktop/assets/icon-dark.png | Bin 0 -> 90044 bytes apps/desktop/assets/icon.icns | Bin 574273 -> 255392 bytes apps/desktop/assets/icon.ico | Bin 96648 -> 42373 bytes apps/desktop/assets/icon.png | Bin 574273 -> 67243 bytes apps/desktop/assets/msix-manifest.xml | 62 + .../e2e/at-rest-connection-token.spec.ts | 213 +- apps/desktop/e2e/batch-clarify.spec.ts | 3 +- apps/desktop/e2e/boot.spec.ts | 18 - .../bot-mode-closed-chat-stays-closed.spec.ts | 208 - .../e2e/bot-screen-stale-status-reply.spec.ts | 299 + apps/desktop/e2e/chat.spec.ts | 92 +- .../e2e/completed-reply-refresh.spec.ts | 147 + .../e2e/context-menu-editables.spec.ts | 123 - apps/desktop/e2e/core/README.md | 88 + apps/desktop/e2e/core/boot-lifecycle.spec.ts | 278 + apps/desktop/e2e/core/harness.ts | 670 ++ .../e2e/core/interactive-prompts.spec.ts | 167 + apps/desktop/e2e/core/known.ts | 50 + .../core/lineage-compaction-prompt.spec.ts | 340 + .../desktop/e2e/core/lineage-rotation.spec.ts | 276 + apps/desktop/e2e/core/lineage-sidebar.spec.ts | 182 + .../e2e/core/onboarding-first-chat.spec.ts | 143 + apps/desktop/e2e/core/oracle.ts | 478 + apps/desktop/e2e/core/packaged-smoke.spec.ts | 546 ++ apps/desktop/e2e/core/playwright.config.ts | 32 + apps/desktop/e2e/core/provider.ts | 321 + apps/desktop/e2e/core/remote-helpers.ts | 331 + .../desktop/e2e/core/remote-secondary.spec.ts | 342 + apps/desktop/e2e/core/remote-topology.spec.ts | 229 + .../desktop/e2e/core/switch-back-race.spec.ts | 156 + .../e2e/core/transcript-integrity.spec.ts | 336 + .../e2e/correction-session-switch.spec.ts | 35 +- apps/desktop/e2e/electron-binary.ts | 100 + apps/desktop/e2e/electron-binary.unit.test.ts | 43 + apps/desktop/e2e/fixtures.ts | 195 +- apps/desktop/e2e/fleet-profile-rail.spec.ts | 27 +- apps/desktop/e2e/glyph-spinner.spec.ts | 198 - .../e2e/group-approval-click-submits.spec.ts | 128 + .../e2e/group-member-backend-failure.spec.ts | 148 + .../e2e/group-to-local-bot-handoff.spec.ts | 70 - apps/desktop/e2e/group-turn-integrity.spec.ts | 239 + .../e2e/hidden-history-messages.spec.ts | 33 +- .../e2e/image-attachment-resume.spec.ts | 20 +- apps/desktop/e2e/interim-messages.spec.ts | 102 +- apps/desktop/e2e/large-session-resume.spec.ts | 22 +- apps/desktop/e2e/launch-packaged-app.spec.ts | 156 - apps/desktop/e2e/mock-backend-setup.spec.ts | 87 - apps/desktop/e2e/mock-server.ts | 984 -- .../e2e/new-bot-config-on-disk.spec.ts | 81 + apps/desktop/e2e/onboarding.spec.ts | 31 +- apps/desktop/e2e/peer-device-reset.spec.ts | 313 + apps/desktop/e2e/provider-setup-owner.spec.ts | 451 + apps/desktop/e2e/queue-turn-boundary.spec.ts | 2 +- .../desktop/e2e/remote-oauth-recovery.spec.ts | 111 + apps/desktop/e2e/right-pane.spec.ts | 138 - ...session-compression-and-queue-stop.spec.ts | 27 +- apps/desktop/e2e/sidebar-states.spec.ts | 107 +- apps/desktop/e2e/task-panel-clearance.spec.ts | 145 - apps/desktop/e2e/tile-unread-bug.spec.ts | 250 - apps/desktop/e2e/unread-dot-restart.spec.ts | 2 +- apps/desktop/e2e/warm-resume-jitter.spec.ts | 130 +- apps/desktop/e2e/window-input.unit.test.ts | 94 + .../e2e/worktree-branch-status.spec.ts | 243 - apps/desktop/e2e/zoom-preservation.spec.ts | 87 - apps/desktop/electron-builder.config.cjs | 330 + apps/desktop/electron/active-runtime-state.ts | 4 + apps/desktop/electron/api-transport.test.ts | 84 +- apps/desktop/electron/api-transport.ts | 105 + apps/desktop/electron/app-icon.test.ts | 101 +- apps/desktop/electron/app-icon.ts | 21 +- .../electron/app-installer-file.test.ts | 51 + apps/desktop/electron/app-installer-file.ts | 59 + apps/desktop/electron/app-updater.ts | 126 + apps/desktop/electron/app-version.test.ts | 85 + apps/desktop/electron/app-version.ts | 82 + .../electron/appinstaller-checker.test.ts | 161 + apps/desktop/electron/appinstaller-checker.ts | 119 + .../electron/application-menu-startup.test.ts | 32 + .../electron/application-menu-startup.ts | 34 + apps/desktop/electron/backend-child.ts | 102 +- apps/desktop/electron/backend-claim.test.ts | 56 +- apps/desktop/electron/backend-claim.ts | 54 +- apps/desktop/electron/backend-command.test.ts | 19 - .../electron/backend-connection-state.test.ts | 130 + .../electron/backend-connection-state.ts | 119 +- .../electron/backend-dial-claim.test.ts | 110 +- .../electron/backend-discovery.test.ts | 211 + apps/desktop/electron/backend-discovery.ts | 164 + apps/desktop/electron/backend-env.test.ts | 299 +- apps/desktop/electron/backend-env.ts | 189 +- .../electron/backend-exit-recovery.test.ts | 154 + .../desktop/electron/backend-exit-recovery.ts | 97 + apps/desktop/electron/backend-exit.test.ts | 55 + apps/desktop/electron/backend-health.test.ts | 50 +- apps/desktop/electron/backend-health.ts | 23 +- .../electron/backend-ownership.test.ts | 53 +- apps/desktop/electron/backend-ownership.ts | 50 +- .../electron/backend-probes-runtime.test.ts | 109 + apps/desktop/electron/backend-probes.test.ts | 120 +- apps/desktop/electron/backend-probes.ts | 134 +- .../electron/backend-python-coherence.test.ts | 114 - apps/desktop/electron/backend-ready.test.ts | 90 +- apps/desktop/electron/backend-ready.ts | 47 +- apps/desktop/electron/backend-recycle.test.ts | 92 + apps/desktop/electron/backend-recycle.ts | 47 + .../electron/backend-release-gate.test.ts | 3 +- apps/desktop/electron/backend-release-gate.ts | 12 +- .../backend-release-gate.windows-live.test.ts | 146 - .../electron/backend-serve-support.test.ts | 49 + .../desktop/electron/backend-serve-support.ts | 105 + .../electron/backend-start-cancellation.ts | 24 + .../electron/backend-start-failure.test.ts | 78 +- .../desktop/electron/backend-start-failure.ts | 88 +- .../electron/backend-stop-overlap.test.ts | 194 + .../electron/bootstrap-failure-copy.ts | 88 + .../electron/bootstrap-platform.test.ts | 7 - apps/desktop/electron/bootstrap-platform.ts | 12 +- apps/desktop/electron/bootstrap-quit.test.ts | 65 + .../electron/bootstrap-repair-guard.test.ts | 36 - .../bootstrap-runner-git-binary.test.ts | 21 + .../desktop/electron/bootstrap-runner.test.ts | 55 +- apps/desktop/electron/bootstrap-runner.ts | 113 +- apps/desktop/electron/bootstrap-state.test.ts | 38 + apps/desktop/electron/bootstrap-state.ts | 8 + apps/desktop/electron/bundle-skew.test.ts | 239 +- apps/desktop/electron/bundle-skew.ts | 71 +- apps/desktop/electron/bundle-swap.test.ts | 66 + apps/desktop/electron/bundle-swap.ts | 74 + .../electron/channel-build-version.test.ts | 458 + .../electron/chat-onboarding-window.ts | 45 + apps/desktop/electron/cli-provision.test.ts | 169 + apps/desktop/electron/cli-provision.ts | 127 + apps/desktop/electron/close-stop-kill.test.ts | 118 + apps/desktop/electron/close-stop-kill.ts | 125 + .../electron/cloud-boot-cascade.test.ts | 60 + apps/desktop/electron/cloud-boot-cascade.ts | 57 + apps/desktop/electron/cloud-discovery.test.ts | 73 + apps/desktop/electron/cloud-discovery.ts | 22 + .../electron/cloud-session-recovery.test.ts | 107 + .../electron/cloud-session-recovery.ts | 76 + .../command-screenshot-capture.test.ts | 66 + .../electron/command-screenshot-capture.ts | 92 + .../command-screenshot-monitor.test.ts | 126 + .../electron/command-screenshot-monitor.ts | 82 + .../electron/command-screenshot-types.ts | 22 + apps/desktop/electron/command-screenshot.ts | 250 + apps/desktop/electron/composer-paste.test.ts | 27 + apps/desktop/electron/composer-paste.ts | 27 + .../desktop/electron/connection-apply.test.ts | 84 +- apps/desktop/electron/connection-apply.ts | 26 + .../electron/connection-caches.test.ts | 75 + apps/desktop/electron/connection-caches.ts | 52 + .../electron/connection-config.test.ts | 423 +- apps/desktop/electron/connection-config.ts | 270 +- .../electron/connection-registry.test.ts | 390 +- apps/desktop/electron/connection-registry.ts | 236 +- apps/desktop/electron/crash-forensics.test.ts | 10 +- apps/desktop/electron/dashboard-token.test.ts | 12 - apps/desktop/electron/data-paths.d.mts | 17 + apps/desktop/electron/data-paths.mjs | 66 + apps/desktop/electron/data-paths.test.ts | 78 + apps/desktop/electron/data-paths.ts | 6 + .../electron/desktop-boot-preference.test.ts | 25 + .../electron/desktop-boot-preference.ts | 120 + .../electron/desktop-electron-pin.test.ts | 19 +- .../electron/desktop-installation.test.ts | 5 +- .../desktop/electron/desktop-log-line.test.ts | 6 - .../electron/desktop-plugin-install.test.ts | 103 +- .../electron/desktop-plugin-install.ts | 98 +- .../electron/desktop-plugin-remove.test.ts | 89 + .../desktop/electron/desktop-plugin-remove.ts | 60 + .../electron/desktop-plugins-root.test.ts | 239 + apps/desktop/electron/desktop-plugins-root.ts | 347 + .../electron/desktop-profile-mutation.test.ts | 87 + .../electron/desktop-profile-preload.test.ts | 56 + apps/desktop/electron/desktop-profile.test.ts | 216 + apps/desktop/electron/desktop-profile.ts | 206 + .../electron/desktop-remote-route.test.ts | 71 +- apps/desktop/electron/desktop-remote-route.ts | 29 + .../electron/desktop-uninstall-ipc.test.ts | 134 + .../electron/desktop-uninstall.test.ts | 188 +- apps/desktop/electron/desktop-uninstall.ts | 195 +- apps/desktop/electron/dev-cdp.test.ts | 6 - .../electron/dock-launch-order.test.ts | 17 + apps/desktop/electron/dock-launch-order.ts | 33 + apps/desktop/electron/entry.ts | 26 + apps/desktop/electron/event-dedupe.test.ts | 22 +- apps/desktop/electron/event-dedupe.ts | 18 + apps/desktop/electron/external-open.test.ts | 136 + apps/desktop/electron/external-open.ts | 121 + apps/desktop/electron/f12-shortcut.test.ts | 32 + apps/desktop/electron/f12-shortcut.ts | 40 + apps/desktop/electron/feature-flags.test.ts | 33 + apps/desktop/electron/feature-flags.ts | 21 + .../electron/fetch-json-oauth-session.test.ts | 116 + apps/desktop/electron/find-git-bash.test.ts | 54 - apps/desktop/electron/find-git-bash.ts | 67 - apps/desktop/electron/find-in-page.test.ts | 13 - .../electron/first-run-setup-gate.test.ts | 1 + apps/desktop/electron/first-run-setup-gate.ts | 2 + .../first-run-setup-main-process.test.ts | 8 +- .../electron/fixtures/source-backend.py | 100 + .../electron/fixtures/windows-system-ca.ts | 37 + apps/desktop/electron/fs-ipc.test.ts | 82 + apps/desktop/electron/fs-ipc.ts | 80 +- apps/desktop/electron/fs-read-dir.test.ts | 34 - .../gateway-file-download-transport.test.ts | 421 +- .../gateway-file-download-transport.ts | 161 + .../electron/gateway-file-download.test.ts | 115 +- .../desktop/electron/gateway-file-download.ts | 155 +- .../gateway-stop-before-update.test.ts | 95 + .../electron/gateway-stop-before-update.ts | 59 + apps/desktop/electron/gateway-version.test.ts | 40 + apps/desktop/electron/gateway-version.ts | 22 + .../desktop/electron/gateway-ws-probe.test.ts | 227 +- apps/desktop/electron/gateway-ws-probe.ts | 108 +- apps/desktop/electron/git-ipc.ts | 4 - apps/desktop/electron/git-repo-scan.test.ts | 2 +- apps/desktop/electron/git-review-ops.test.ts | 20 - apps/desktop/electron/git-review-ops.ts | 123 +- apps/desktop/electron/git-worktree-ops.ts | 37 +- apps/desktop/electron/gitlock.test.ts | 71 - apps/desktop/electron/gitlock.ts | 96 - .../electron/guest-onboarding-flag.test.ts | 57 + apps/desktop/electron/guest-onboarding.ts | 36 + apps/desktop/electron/hardening.test.ts | 514 +- apps/desktop/electron/hardening.ts | 41 + apps/desktop/electron/host-backend-attach.ts | 206 + .../electron/host-backend-singleton.test.ts | 81 + .../electron/host-backend-singleton.ts | 90 + .../electron/host-published-token.test.ts | 155 + apps/desktop/electron/host-published-token.ts | 180 + apps/desktop/electron/hud-close.test.ts | 69 + apps/desktop/electron/hud-close.ts | 53 + .../desktop/electron/hud-game-overlay.test.ts | 19 - apps/desktop/electron/hud-geometry.test.ts | 20 +- apps/desktop/electron/hud-hyprland.ts | 4 +- .../electron/hud-modifier-monitor.test.ts | 93 + apps/desktop/electron/hud-modifier-monitor.ts | 56 + .../electron/hud-modifier-native.test.ts | 37 + apps/desktop/electron/hud-modifier-types.ts | 12 + apps/desktop/electron/hud-modifier.test.ts | 135 + apps/desktop/electron/hud-modifier.ts | 172 + apps/desktop/electron/hud-overlay.test.ts | 2 +- apps/desktop/electron/install-stamp.ts | 135 + apps/desktop/electron/intro-reveal-window.ts | 259 + apps/desktop/electron/link-title-curl.test.ts | 38 + apps/desktop/electron/link-title-curl.ts | 17 + apps/desktop/electron/link-title-wall.test.ts | 79 + apps/desktop/electron/link-title-wall.ts | 128 + .../electron/link-title-window.test.ts | 8 +- apps/desktop/electron/link-title-window.ts | 5 + .../electron/linux-crash-diagnostics.test.ts | 85 + .../electron/linux-crash-diagnostics.ts | 99 + .../electron/linux-launcher-ready.test.ts | 48 + apps/desktop/electron/linux-launcher-ready.ts | 48 + .../linux-nvidia-egl-fallback.test.ts | 101 + .../electron/linux-nvidia-egl-fallback.ts | 109 + .../electron/local-backend-lifecycle.test.ts | 181 + .../electron/local-backend-lifecycle.ts | 118 + apps/desktop/electron/local-read-path.test.ts | 83 + apps/desktop/electron/local-read-path.ts | 33 + apps/desktop/electron/local-skin.test.ts | 101 + apps/desktop/electron/local-skin.ts | 192 + apps/desktop/electron/log-rotation.test.ts | 93 + apps/desktop/electron/log-rotation.ts | 74 + .../electron/mac-usage-strings.test.ts | 31 + apps/desktop/electron/machine-profile.test.ts | 59 + apps/desktop/electron/machine-profile.ts | 72 + .../main-process-lag-watchdog.test.ts | 81 + .../electron/main-process-lag-watchdog.ts | 65 + apps/desktop/electron/main.ts | 8216 ++++++++++------- .../electron/managed-ssh-update.test.ts | 237 +- .../electron/mcp-oauth-callback-ipc.test.ts | 37 +- .../electron/mcp-oauth-callback-ipc.ts | 14 +- apps/desktop/electron/media-protocol.test.ts | 80 + apps/desktop/electron/media-protocol.ts | 45 +- apps/desktop/electron/media-range.test.ts | 105 + apps/desktop/electron/media-range.ts | 189 + .../minimize-to-tray-native-fixture/main.ts | 128 + .../desktop/electron/minimize-to-tray.test.ts | 292 + apps/desktop/electron/minimize-to-tray.ts | 310 + .../electron/native-access-token.test.ts | 224 + apps/desktop/electron/native-access-token.ts | 134 + .../electron/native-auth-decisions.test.ts | 33 +- .../desktop/electron/native-auth-decisions.ts | 21 + .../electron/native-gesture-monitor.ts | 195 + .../electron/native-token-store.test.ts | 41 - .../native/command-screenshot-monitor.m | 187 + .../electron/native/hud-modifier-gesture.cs | 31 + .../electron/native/hud-modifier-gesture.h | 35 + .../native/hud-modifier-gesture.test.c | 59 + .../native/hud-modifier-monitor-win.cs | 212 + .../native/hud-modifier-monitor-x11.c | 163 + .../electron/native/hud-modifier-monitor.m | 161 + .../electron/native/hud-modifier-x11.test.py | 114 + apps/desktop/electron/no-console-git.test.ts | 135 + apps/desktop/electron/no-console-git.ts | 311 + .../electron/notification-actions.test.ts | 22 + apps/desktop/electron/notification-actions.ts | 29 + .../desktop/electron/notification-ipc.test.ts | 132 + apps/desktop/electron/notification-ipc.ts | 125 + .../electron/notification-linux.test.ts | 350 + apps/desktop/electron/notification-linux.ts | 339 + .../electron/notification-registry.test.ts | 71 + .../desktop/electron/notification-registry.ts | 42 + apps/desktop/electron/notification-types.ts | 18 + .../oauth-auth-recovery.integration.test.ts | 282 + apps/desktop/electron/oauth-partition.test.ts | 18 + apps/desktop/electron/oauth-partition.ts | 17 +- .../electron/oauth-rest-request.test.ts | 124 + apps/desktop/electron/oauth-rest-request.ts | 116 + .../electron/oauth-session-response.ts | 82 + .../electron/package-process-reap.test.ts | 227 + apps/desktop/electron/package-process-reap.ts | 300 + apps/desktop/electron/payload-backend.test.ts | 82 + apps/desktop/electron/payload-backend.ts | 59 + apps/desktop/electron/pet-overlay-ipc.ts | 50 +- apps/desktop/electron/pet-overlay.test.ts | 193 + apps/desktop/electron/pet-overlay.ts | 130 + .../electron/plugin-compat-notice.test.ts | 81 + apps/desktop/electron/plugin-compat-notice.ts | 143 + apps/desktop/electron/pool-child-exit.test.ts | 141 + apps/desktop/electron/pool-eviction.test.ts | 153 - apps/desktop/electron/pool-eviction.ts | 58 - apps/desktop/electron/pool-limits.test.ts | 53 + apps/desktop/electron/pool-limits.ts | 81 + .../desktop/electron/pool-reclamation.test.ts | 139 + apps/desktop/electron/pool-retire-http.ts | 54 + apps/desktop/electron/pool-retire.test.ts | 85 + apps/desktop/electron/pool-retire.ts | 175 + .../pool-retirement-live-fixture/README.md | 59 + .../pool-retirement-live-fixture/cron_work.py | 20 + .../pool-retirement-live-fixture/main.ts | 475 + .../pool-retirement-live-fixture/preload.ts | 12 + .../pool-retirement-live-fixture/serve.py | 61 + .../vitest.config.ts | 9 + .../electron/pool-retirement-live.test.ts | 148 + .../electron/pool-spawn-coordinator.test.ts | 467 + .../electron/pool-spawn-coordinator.ts | 422 + apps/desktop/electron/pool-stop.test.ts | 111 + apps/desktop/electron/pool-stop.ts | 44 +- apps/desktop/electron/portal-cookies.test.ts | 44 + apps/desktop/electron/portal-cookies.ts | 24 + .../portal-session-live-fixture/main.ts | 215 + .../electron/portal-session-live.test.ts | 85 + apps/desktop/electron/portal-session.ts | 262 + .../power-resume-remote-revalidation.test.ts | 42 - apps/desktop/electron/power-save.test.ts | 7 - .../electron/pre-update-backup-config.test.ts | 62 + .../electron/pre-update-backup-config.ts | 48 + apps/desktop/electron/preload-flags.test.ts | 36 + .../electron/preload-local-skin.test.ts | 30 + apps/desktop/electron/preload.ts | 155 +- apps/desktop/electron/preview-capture.test.ts | 97 + apps/desktop/electron/preview-capture.ts | 131 + .../electron/preview-file-watch.test.ts | 133 + apps/desktop/electron/preview-file-watch.ts | 61 + .../electron/preview-guest-preload-entry.ts | 27 + .../electron/preview-guest-preload.test.ts | 51 + .../desktop/electron/preview-guest-preload.ts | 66 + .../primary-backend-cancellation.test.ts | 47 + .../electron/primary-backend-startup.test.ts | 101 +- .../electron/primary-backend-startup.ts | 81 +- .../electron/primary-profile-pin.test.ts | 65 + apps/desktop/electron/primary-profile-pin.ts | 70 + .../desktop/electron/product-identity.test.ts | 304 + apps/desktop/electron/product-identity.ts | 48 + .../electron/profile-delete-routing.test.ts | 4 - .../electron/profile-migration.test.ts | 687 ++ apps/desktop/electron/profile-migration.ts | 311 + .../electron/profile-session-routing.test.ts | 256 +- .../electron/profile-session-routing.ts | 184 +- .../electron/quit-finalization.test.ts | 63 + apps/desktop/electron/quit-finalization.ts | 70 + apps/desktop/electron/quit-guard.test.ts | 47 +- apps/desktop/electron/quit-guard.ts | 40 +- apps/desktop/electron/quit-teardown.test.ts | 127 + apps/desktop/electron/quit-teardown.ts | 75 + .../registry-primary-profile-scope.test.ts | 137 + .../electron/remote-lifecycle-spawn.test.ts | 310 + .../desktop/electron/remote-lifecycle.test.ts | 523 +- apps/desktop/electron/remote-lifecycle.ts | 264 +- apps/desktop/electron/remote-liveness.test.ts | 63 +- apps/desktop/electron/remote-liveness.ts | 31 +- .../electron/remote-oauth-ticket.test.ts | 80 + apps/desktop/electron/remote-oauth-ticket.ts | 39 + .../electron/remote-reauth-latch.test.ts | 71 + .../electron/remote-ws-headers.test.ts | 50 +- apps/desktop/electron/remote-ws-headers.ts | 94 + apps/desktop/electron/renderer-bundle.test.ts | 82 +- apps/desktop/electron/renderer-bundle.ts | 94 +- .../electron/renderer-heap-flags.test.ts | 71 + apps/desktop/electron/renderer-heap-flags.ts | 189 + .../electron/renderer-load-error-page.test.ts | 9 - .../electron/renderer-load-error-page.ts | 4 +- apps/desktop/electron/renderer-log.test.ts | 7 - .../electron/renderer-manifest.test.ts | 58 + .../electron/roster-source-fetch.test.ts | 61 + apps/desktop/electron/roster-source-fetch.ts | 8 + .../electron/roster-source-status.test.ts | 13 + apps/desktop/electron/roster-source-status.ts | 7 + .../electron/select-paths-dialog.test.ts | 26 + apps/desktop/electron/select-paths-dialog.ts | 16 + .../electron/select-runnable-binary.test.ts | 82 + .../electron/select-runnable-binary.ts | 70 + apps/desktop/electron/semver.d.cts | 6 + apps/desktop/electron/session-windows.test.ts | 30 + apps/desktop/electron/session-windows.ts | 42 +- apps/desktop/electron/shell-path.test.ts | 41 + apps/desktop/electron/shell-path.ts | 24 + apps/desktop/electron/source-backend.test.ts | 235 + apps/desktop/electron/source-backend.ts | 108 + apps/desktop/electron/source-python.test.ts | 69 + apps/desktop/electron/source-python.ts | 57 + .../ssh-bootstrap-coordinator.test.ts | 75 + .../electron/ssh-bootstrap-coordinator.ts | 31 +- apps/desktop/electron/ssh-config.test.ts | 11 +- apps/desktop/electron/ssh-connection.test.ts | 464 +- apps/desktop/electron/ssh-connection.ts | 468 +- .../electron/ssh-isolated-keepalive.test.ts | 119 + .../electron/ssh-isolated-keepalive.ts | 197 + apps/desktop/electron/ssh-teardown.test.ts | 55 + apps/desktop/electron/ssh-teardown.ts | 38 + apps/desktop/electron/terminal-ipc.ts | 54 +- .../electron/terminal-lc-ctype.test.ts | 17 + .../electron/terminal-output-gate.test.ts | 57 + apps/desktop/electron/terminal-output-gate.ts | 62 + .../electron/titlebar-overlay-width.test.ts | 44 +- .../electron/titlebar-overlay-width.ts | 47 +- apps/desktop/electron/translucency.test.ts | 94 +- apps/desktop/electron/tray-host.test.ts | 53 + apps/desktop/electron/tray-host.ts | 109 + .../desktop/electron/update-api-proxy.test.ts | 86 + apps/desktop/electron/update-api-proxy.ts | 9 + apps/desktop/electron/update-count.test.ts | 302 - apps/desktop/electron/update-count.ts | 92 - .../electron/update-gate-cancellation.test.ts | 42 + apps/desktop/electron/update-gate.test.ts | 49 +- apps/desktop/electron/update-gate.ts | 76 +- .../electron/update-handoff-marker.test.ts | 42 +- apps/desktop/electron/update-marker.test.ts | 9 - .../electron/update-prerequisites.test.ts | 84 + apps/desktop/electron/update-remote.test.ts | 79 - apps/desktop/electron/update-remote.ts | 65 - apps/desktop/electron/updater-process.test.ts | 21 +- apps/desktop/electron/updater-process.ts | 191 +- .../updater/app-installer-recovery.test.ts | 164 + .../updater/app-installer-strategy.test.ts | 214 + .../desktop/electron/updater/app-installer.ts | 233 + apps/desktop/electron/updater/artifact.ts | 81 + .../updater/channel-artifact-lifetime.test.ts | 130 + .../electron/updater/channel-native.test.ts | 31 + .../electron/updater/channel-native.ts | 173 + .../electron/updater/channel-protocol.ts | 480 + .../electron/updater/channel-strategy.ts | 157 + .../electron/updater/channel-windows-host.ts | 75 + apps/desktop/electron/updater/channel.test.ts | 761 ++ apps/desktop/electron/updater/channel.ts | 272 + .../electron/updater/checkout-handoff.test.ts | 126 + .../electron/updater/checkout-legacy.test.ts | 125 + .../updater/checkout-ownership.test.ts | 41 + .../electron/updater/checkout-source.test.ts | 485 + .../electron/updater/checkout-source.ts | 121 + apps/desktop/electron/updater/checkout.ts | 490 + .../electron/updater/commit-build.test.ts | 44 + apps/desktop/electron/updater/external.ts | 37 + .../electron/updater/feed-config.test.ts | 73 + apps/desktop/electron/updater/feed-config.ts | 52 + apps/desktop/electron/updater/index.ts | 91 + .../electron/updater/mac-client.test.ts | 116 + apps/desktop/electron/updater/mac-client.ts | 74 + apps/desktop/electron/updater/mac.test.ts | 172 + apps/desktop/electron/updater/mac.ts | 142 + .../electron/updater/operation.test.ts | 85 + apps/desktop/electron/updater/operation.ts | 38 + .../electron/updater/packaged-handoff.ts | 62 + .../updater/relaunch-isolation.test.ts | 201 + .../updater/relaunch-waiter-lifecycle.test.ts | 197 + .../electron/updater/relaunch-waiter.ts | 229 + .../relaunch-waiter.windows-live.test.ts | 76 + apps/desktop/electron/updater/relaunch.ts | 177 + .../updater/state-db-preflight.test.ts | 108 + .../electron/updater/state-db-preflight.ts | 34 + .../electron/updater/store-client.test.ts | 90 + apps/desktop/electron/updater/store-client.ts | 83 + apps/desktop/electron/updater/store.test.ts | 107 + apps/desktop/electron/updater/store.ts | 90 + apps/desktop/electron/updater/updater.test.ts | 68 + .../electron/venv-blocker-scan.test.ts | 346 - apps/desktop/electron/venv-blocker-scan.ts | 308 - .../electron/venv-holder-select.test.ts | 57 + apps/desktop/electron/venv-holder-select.ts | 36 + apps/desktop/electron/wake-indicator.test.ts | 14 +- .../desktop/electron/web-text-decoder.test.ts | 64 + apps/desktop/electron/web-text-decoder.ts | 51 + .../electron/window-accelerator.test.ts | 138 + apps/desktop/electron/window-accelerator.ts | 81 + apps/desktop/electron/window-below.test.ts | 40 +- apps/desktop/electron/window-below.ts | 25 +- .../electron/window-chrome-events.test.ts | 39 + apps/desktop/electron/window-chrome-events.ts | 21 + .../electron/window-connection-route.test.ts | 18 + .../electron/window-connection-route.ts | 24 + apps/desktop/electron/window-controls.test.ts | 143 + apps/desktop/electron/window-controls.ts | 101 + apps/desktop/electron/window-growth.ts | 76 + apps/desktop/electron/window-open-policy.ts | 58 + .../window-renderer-lifecycle.test.ts | 125 +- .../electron/window-renderer-lifecycle.ts | 57 +- apps/desktop/electron/window-reveal.test.ts | 173 +- apps/desktop/electron/window-reveal.ts | 107 +- apps/desktop/electron/window-state.test.ts | 41 +- apps/desktop/electron/window-state.ts | 56 +- .../electron/windows-child-options.test.ts | 52 +- .../electron/windows-hermes-path.test.ts | 156 +- apps/desktop/electron/windows-hermes-path.ts | 131 +- .../electron/windows-remote-lifecycle.test.ts | 45 +- .../electron/windows-remote-lifecycle.ts | 18 +- .../electron/windows-remote-live.test.ts | 106 - .../windows-stack-cookie-fallback.test.ts | 326 + .../electron/windows-stack-cookie-fallback.ts | 322 + .../electron/windows-system-ca.test.ts | 34 +- apps/desktop/electron/windows-system-ca.ts | 30 +- .../electron/wsl-clipboard-image.test.ts | 7 - .../electron/wsl-path-bridge-gate.test.ts | 75 - .../electron/wsl-path-bridge-profile.test.ts | 5 +- apps/desktop/electron/wsl-path-bridge.test.ts | 47 +- apps/desktop/electron/wsl-path-bridge.ts | 14 +- .../electron/wslg-launch-process.test.ts | 240 + apps/desktop/electron/wslg-launch-process.ts | 53 + apps/desktop/electron/wslg-launch.test.ts | 42 + apps/desktop/electron/wslg-launch.ts | 26 + apps/desktop/electron/zoom.test.ts | 31 - apps/desktop/index.html | 33 +- apps/desktop/package.json | 155 +- apps/desktop/packaging/nous-dmg-2b.tiff | Bin 0 -> 1285534 bytes apps/desktop/playwright.config.ts | 5 + .../desktop/pr-assets/profile-launch-menu.png | Bin 0 -> 53335 bytes apps/desktop/product-identity.cjs | 94 + apps/desktop/product-identity.d.cts | 35 + apps/desktop/public/apple-touch-icon.png | Bin 541053 -> 67243 bytes apps/desktop/public/intro-nous-girl.png | Bin 0 -> 30960 bytes apps/desktop/public/nous-badge.png | Bin 0 -> 154037 bytes apps/desktop/public/nous-girl-dark.png | Bin 0 -> 18282 bytes apps/desktop/public/nous-girl.jpg | Bin 20026 -> 0 bytes apps/desktop/public/nous-girl.png | Bin 0 -> 12423 bytes apps/desktop/scripts/after-extract.mjs | 47 + apps/desktop/scripts/after-extract.test.mjs | 44 + .../scripts/after-pack-digests.test.mjs | 91 + .../scripts/after-pack-toolchain.test.mjs | 46 + apps/desktop/scripts/after-pack.mjs | 117 +- apps/desktop/scripts/after-pack.test.mjs | 66 + apps/desktop/scripts/assert-dist-built.mjs | 70 + .../scripts/assert-dist-built.test.mjs | 73 + apps/desktop/scripts/assert-root-install.mjs | 169 +- .../scripts/assert-root-install.test.mjs | 184 + apps/desktop/scripts/audit-bundle-arch.mjs | 337 + .../scripts/audit-bundle-arch.test.mjs | 206 + apps/desktop/scripts/batch-sign-binaries.mjs | 431 + .../scripts/batch-sign-binaries.test.mjs | 344 + apps/desktop/scripts/before-build.mjs | 177 +- apps/desktop/scripts/before-pack.mjs | 75 +- .../build-command-screenshot-monitor.mjs | 49 + .../build-command-screenshot-monitor.test.mjs | 47 + .../scripts/build-hud-modifier-monitor.mjs | 123 + apps/desktop/scripts/build.mjs | 29 + apps/desktop/scripts/bundle-electron-main.mjs | 145 +- apps/desktop/scripts/bundle-env.d.mts | 8 + apps/desktop/scripts/bundle-env.mjs | 50 + apps/desktop/scripts/bundle-env.test.mjs | 94 + .../scripts/check-appinstaller-update.py | 97 + apps/desktop/scripts/check-store-update.py | 101 + apps/desktop/scripts/cli-launchers.test.mjs | 23 + .../scripts/commit-bundles.windows.test.mjs | 152 + .../scripts/commit-stamp-identity.test.mjs | 77 + apps/desktop/scripts/connector-rehearsal.mjs | 62 + .../scripts/desktop-update-ui.test.mjs | 96 + apps/desktop/scripts/dev-mock.mjs | 237 - apps/desktop/scripts/dmgbuild-diagnostics.cjs | 62 + .../scripts/dmgbuild-diagnostics.test.mjs | 80 + apps/desktop/scripts/gen-msix-manifest.mjs | 119 + .../scripts/local-pack-publish.test.mjs | 145 +- apps/desktop/scripts/mac-sign.mjs | 28 + apps/desktop/scripts/mac-sign.test.mjs | 171 + .../scripts/macos-sysroot-native.test.mjs | 65 + apps/desktop/scripts/macos-sysroot.mjs | 56 + apps/desktop/scripts/macos-sysroot.test.mjs | 109 + .../scripts/msix-manifest-roundtrip.test.mjs | 104 + apps/desktop/scripts/msix-shared.test.mjs | 67 + apps/desktop/scripts/native-quad.test.mjs | 44 + apps/desktop/scripts/notarize.mjs | 132 +- apps/desktop/scripts/osx-sign-inputs.test.mjs | 39 + .../patch-electron-builder-mac-binary.mjs | 110 +- apps/desktop/scripts/payload-digests.mjs | 12 + apps/desktop/scripts/payload-sign-cache.mjs | 137 + .../scripts/payload-sign-cache.test.mjs | 203 + apps/desktop/scripts/perf/README.md | 15 + .../scripts/perf/gateway_attach_bench.py | 4 +- apps/desktop/scripts/perf/scenarios/index.mjs | 2 + .../scripts/perf/scenarios/live-window.mjs | 87 + .../scripts/perf/scenarios/multitab.mjs | 2 +- apps/desktop/scripts/prepare-dmgbuild.mjs | 26 + .../desktop/scripts/prepare-dmgbuild.test.mjs | 36 + .../scripts/prepare-packaging-tools.mjs | 134 + apps/desktop/scripts/prepare_dmgbuild.py | 33 + apps/desktop/scripts/prepared-native-deps.mjs | 75 + .../scripts/prepared-native-deps.test.mjs | 69 + apps/desktop/scripts/prepared-packaging.mjs | 132 + .../scripts/prepared-packaging.test.mjs | 61 + .../scripts/prepared-windows-tools.test.mjs | 59 + .../desktop/scripts/probe-prepared-native.mjs | 88 + .../scripts/probe-prepared-native.test.mjs | 36 + apps/desktop/scripts/profile-model-picker.mjs | 4 +- apps/desktop/scripts/profile-typing-lag.md | 8 +- apps/desktop/scripts/rebuild-native.mjs | 22 - apps/desktop/scripts/run-electron-builder.mjs | 200 +- .../scripts/run-electron-builder.test.mjs | 68 + .../run-short-session-hang-repro.test.mjs | 171 - .../scripts/sanitize-pe-signatures.mjs | 212 + .../scripts/sanitize-pe-signatures.test.mjs | 55 + apps/desktop/scripts/set-exe-identity.mjs | 52 +- .../desktop/scripts/set-exe-identity.test.mjs | 87 + .../scripts/side-by-side-launchers.test.mjs | 64 + .../scripts/side-by-side.windows.test.mjs | 218 + apps/desktop/scripts/sign-msix.mjs | 171 + apps/desktop/scripts/sign-msix.test.mjs | 110 + apps/desktop/scripts/sign-nested-chromium.mjs | 217 + .../scripts/sign-nested-chromium.test.mjs | 179 + apps/desktop/scripts/sign-wheel-zips.mjs | 117 + apps/desktop/scripts/sign-wheel-zips.test.mjs | 175 + .../scripts/signing-resources.test.mjs | 179 + apps/desktop/scripts/stage-native-deps.mjs | 266 +- .../scripts/stage-native-deps.test.mjs | 211 +- .../scripts/store-package-version.test.mjs | 122 + apps/desktop/scripts/test-desktop.mjs | 318 +- .../scripts/update-relaunch-waiter.ps1 | 47 + apps/desktop/scripts/utils.mjs | 9 +- .../scripts/verify-side-by-side-macos.mjs | 314 + .../scripts/verify-signed-payloads.ps1 | 35 + apps/desktop/scripts/windows-bundle-tools.mjs | 81 + .../scripts/windows-bundle-tools.test.mjs | 110 + apps/desktop/scripts/write-build-stamp.mjs | 188 +- .../scripts/write-build-stamp.test.mjs | 69 +- apps/desktop/src/AGENTS.md | 109 + apps/desktop/src/api/client.ts | 97 +- .../src/api/config-route-binding.test.ts | 60 + apps/desktop/src/api/config.ts | 185 +- .../src/api/local-models-owner.test.ts | 50 + apps/desktop/src/api/local-models.ts | 208 + apps/desktop/src/api/mcp.ts | 66 +- apps/desktop/src/api/messaging.ts | 79 +- apps/desktop/src/api/models.ts | 36 +- apps/desktop/src/api/plugins.ts | 3 +- apps/desktop/src/api/profiles.ts | 3 +- .../src/api/session-transcript-paging.test.ts | 200 + apps/desktop/src/api/sessions.test.ts | 208 +- apps/desktop/src/api/sessions.ts | 197 +- apps/desktop/src/api/skills.ts | 17 +- apps/desktop/src/api/system.ts | 45 +- apps/desktop/src/app/agents/index.tsx | 34 +- .../src/app/artifacts/artifact-utils.ts | 166 +- apps/desktop/src/app/artifacts/index.test.ts | 225 + apps/desktop/src/app/artifacts/index.tsx | 22 +- .../src/app/artifacts/remote-open.test.tsx | 90 + .../capabilities/catalog/catalog-alert.tsx | 31 + .../catalog/catalog-browser.test.tsx | 142 + .../capabilities/catalog/catalog-browser.tsx | 460 + .../app/capabilities/catalog/catalog-card.tsx | 127 + .../capabilities/catalog/catalog-data.test.ts | 145 + .../app/capabilities/catalog/catalog-data.ts | 221 + .../catalog/catalog-detail-dialog.tsx | 93 + .../capabilities/catalog/catalog-detail.tsx | 196 + .../capabilities/catalog/catalog-filters.tsx | 141 + .../catalog/catalog-install-switch.tsx | 35 + .../capabilities/catalog/catalog-list-row.tsx | 66 + .../capabilities/catalog/catalog-metadata.tsx | 187 + .../capabilities/catalog/catalog-pointer.ts | 55 + .../app/capabilities/catalog/catalog-query.ts | 127 + .../src/app/capabilities/catalog/catalog.css | 87 + .../capabilities/catalog/skill-catalog.tsx | 299 + .../src/app/capabilities/catalog/store.ts | 4 + .../catalog/update-skills-button.tsx | 26 + .../catalog/use-catalog-filters.ts | 41 + .../capabilities/connectors/add-dialog.tsx | 126 + .../connectors/add-server-draft.ts | 151 + .../connectors/add-server-form.tsx | 326 + .../capabilities/connectors/catalog-mark.tsx | 21 + .../connectors/category-picker.tsx | 79 + .../connectors/connect-element.tsx | 49 + .../connectors/connector-dialog.tsx | 417 + .../capabilities/connectors/connector-kind.ts | 19 + .../connectors/connector-row-card.tsx | 200 + .../connectors/connectors-directory.tsx | 224 + .../connectors/connectors-tab.tsx | 392 + .../connectors/data/account-operations.ts | 166 + .../capabilities/connectors/data/deep-link.ts | 29 + .../app/capabilities/connectors/data/join.ts | 303 + .../app/capabilities/connectors/data/keys.ts | 60 + .../capabilities/connectors/data/mutations.ts | 243 + .../capabilities/connectors/data/persist.ts | 283 + .../capabilities/connectors/data/portal.ts | 29 + .../capabilities/connectors/data/prefetch.ts | 44 + .../capabilities/connectors/data/queries.ts | 233 + .../app/capabilities/connectors/data/rpc.ts | 152 + .../capabilities/connectors/derive-page.ts | 94 + .../capabilities/connectors/derive-tools.ts | 312 + .../src/app/capabilities/connectors/derive.ts | 411 + .../capabilities/connectors/dialog-menu.tsx | 60 + .../connectors/hint-vocabulary.ts | 108 + .../capabilities/connectors/hosted-dialog.tsx | 153 + .../capabilities/connectors/local-dialog.tsx | 120 + .../connectors/local-server-control.tsx | 56 + .../capabilities/connectors/local-slots.tsx | 71 + .../connectors/plugin-tools-panel.tsx | 108 + .../app/capabilities/connectors/tool-row.tsx | 146 + .../connectors/tools-filter-bar.tsx | 142 + .../capabilities/connectors/tools-list.tsx | 533 ++ .../capabilities/connectors/tools-panel.tsx | 160 + .../capabilities/connectors/tools-status.tsx | 120 + .../capabilities/connectors/tools-summary.tsx | 127 + .../src/app/capabilities/connectors/types.ts | 219 + .../connectors/use-tools-editor.ts | 176 + .../capabilities/connectors/ways-section.tsx | 186 + .../{skills => capabilities}/index.test.tsx | 277 +- apps/desktop/src/app/capabilities/index.tsx | 210 + .../capabilities/mcp/install-catalog-entry.ts | 36 + .../src/app/capabilities/mcp/mcp-doc.ts | 196 + .../src/app/capabilities/mcp/mcp-editor.tsx | 98 + .../src/app/capabilities/mcp/mcp-logs.tsx | 64 + .../src/app/capabilities/mcp/mcp-status.ts | 157 + .../src/app/capabilities/mcp/use-mcp-draft.ts | 192 + .../app/capabilities/mcp/use-mcp-probes.ts | 160 + .../app/capabilities/mcp/use-mcp-servers.ts | 428 + .../plugins/plugin-packages.test.ts | 126 + .../capabilities/plugins/plugin-packages.ts | 135 + .../plugins/plugin-settings-form.test.tsx | 77 + .../plugins/plugin-settings-form.tsx | 299 + .../plugins/plugins-page-header.test.tsx | 48 + .../capabilities/plugins/plugins-tab.test.tsx | 754 ++ .../app/capabilities/plugins/plugins-tab.tsx | 762 ++ .../src/app/capabilities/primitives.tsx | 60 + .../src/app/capabilities/scope-selector.tsx | 233 + .../capabilities/skills/frontmatter.test.ts | 28 + .../app/capabilities/skills/frontmatter.ts | 39 + .../skills/official-skill-detail.tsx | 83 + .../app/capabilities/skills/skill-detail.tsx | 66 + .../app/capabilities/skills/skills-data.ts | 76 + .../app/capabilities/skills/skills-tab.tsx | 356 + .../app/capabilities/toolsets/tool-calls.ts | 77 + .../capabilities/toolsets/toolset-detail.tsx | 89 + .../capabilities/toolsets/toolsets-data.ts | 75 + .../capabilities/toolsets/toolsets-tab.tsx | 196 + .../src/app/chat/chat-swap-overlay.test.tsx | 17 - .../src/app/chat/chat-swap-overlay.tsx | 12 + apps/desktop/src/app/chat/close-tab.test.ts | 35 +- apps/desktop/src/app/chat/close-tab.ts | 6 + .../app/chat/composer/attachments.test.tsx | 23 - .../src/app/chat/composer/attachments.tsx | 15 +- .../composer/composer-text-guard.test.tsx | 145 +- .../app/chat/composer/composer-utils.test.ts | 83 +- .../src/app/chat/composer/composer-utils.ts | 38 +- .../src/app/chat/composer/context-menu.tsx | 2 +- apps/desktop/src/app/chat/composer/contrib.ts | 62 +- .../src/app/chat/composer/controls.test.tsx | 62 +- .../src/app/chat/composer/controls.tsx | 138 +- .../chat/composer/directive-actions.test.tsx | 70 +- .../app/chat/composer/directive-actions.tsx | 28 +- .../composer/enter-submit-dom-race.test.tsx | 43 + .../src/app/chat/composer/floating-state.ts | 12 + .../chat/composer/floating-surface.test.tsx | 126 + .../app/chat/composer/floating-surface.tsx | 83 + .../floating-target-editable-guard.test.ts | 76 + .../floating-target-floating-layer.test.ts | 66 + .../floating-target-selection-guard.test.ts | 90 + .../src/app/chat/composer/floating-target.ts | 307 + .../src/app/chat/composer/focus.test.ts | 207 + apps/desktop/src/app/chat/composer/focus.ts | 347 +- .../hooks/slash-localization.test.tsx | 139 + .../use-auto-speak-replies.owner.test.tsx | 84 + .../hooks/use-auto-speak-replies.test.tsx | 204 + .../composer/hooks/use-auto-speak-replies.ts | 53 +- .../hooks/use-composer-draft.test.tsx | 284 +- .../chat/composer/hooks/use-composer-draft.ts | 159 +- .../chat/composer/hooks/use-composer-drop.ts | 7 + .../hooks/use-composer-metrics.test.tsx | 110 + .../composer/hooks/use-composer-metrics.ts | 36 +- .../hooks/use-composer-popout.test.tsx | 11 +- .../composer/hooks/use-composer-popout.ts | 95 +- .../hooks/use-composer-queue.test.tsx | 93 + .../chat/composer/hooks/use-composer-queue.ts | 37 +- .../hooks/use-composer-screenshot.test.tsx | 108 + .../composer/hooks/use-composer-screenshot.ts | 103 + .../hooks/use-composer-submit.test.tsx | 145 +- .../composer/hooks/use-composer-submit.ts | 107 +- .../composer/hooks/use-composer-undo.test.tsx | 16 +- .../use-composer-voice-shortcuts.test.tsx | 174 + .../chat/composer/hooks/use-composer-voice.ts | 175 +- .../hooks/use-live-completion-adapter.ts | 2 +- .../composer/hooks/use-mic-recorder.test.tsx | 190 + .../chat/composer/hooks/use-mic-recorder.ts | 77 +- .../composer/hooks/use-popout-drag.test.tsx | 1 - .../chat/composer/hooks/use-popout-drag.ts | 17 +- .../hooks/use-slash-completions.test.tsx | 10 - .../composer/hooks/use-slash-completions.ts | 50 +- .../composer/hooks/use-status-drawer.test.tsx | 33 + .../chat/composer/hooks/use-status-drawer.ts | 50 + .../hooks/use-status-presence.test.ts | 200 + .../composer/hooks/use-status-presence.ts | 22 +- .../use-voice-conversation-boundary.test.tsx | 142 + .../use-voice-conversation-meter.test.tsx | 131 + .../use-voice-conversation-rearm.test.tsx | 165 +- .../composer/hooks/use-voice-conversation.ts | 212 +- ...use-voice-live-conversation.owner.test.tsx | 80 + .../hooks/use-voice-live-conversation.test.ts | 166 + .../hooks/use-voice-live-conversation.ts | 494 + .../ime-composition-dom-repro.test.tsx | 197 - apps/desktop/src/app/chat/composer/index.tsx | 328 +- .../chat/composer/inline-references.test.ts | 32 +- .../src/app/chat/composer/inline-refs.ts | 29 +- .../src/app/chat/composer/large-paste.test.ts | 16 + .../src/app/chat/composer/large-paste.ts | 42 + .../src/app/chat/composer/model-pill.test.tsx | 137 +- .../src/app/chat/composer/model-pill.tsx | 68 +- .../chat/composer/paste-url-is-text.test.tsx | 126 + .../src/app/chat/composer/queue-panel.tsx | 30 +- .../app/chat/composer/reasoning-pill.test.tsx | 172 + .../src/app/chat/composer/reasoning-pill.tsx | 97 + .../chat/composer/restored-draft-notice.tsx | 63 + .../src/app/chat/composer/rich-editor.test.ts | 256 +- .../src/app/chat/composer/rich-editor.ts | 156 +- apps/desktop/src/app/chat/composer/scope.tsx | 7 + .../composer/slash-nav-dom-repro.test.tsx | 186 - .../app/chat/composer/start-voice-button.tsx | 74 + .../composer/status-stack/coding-row.test.tsx | 25 - .../status-stack/collapsed-indicator.test.tsx | 16 - .../status-stack/default-collapse.test.tsx | 109 + .../app/chat/composer/status-stack/drawer.css | 56 + .../app/chat/composer/status-stack/drawer.tsx | 59 + .../status-stack/goal-indicator.test.tsx | 20 +- .../hidden-pane-subagent-polls.test.tsx | 113 + .../app/chat/composer/status-stack/index.tsx | 190 +- .../status-stack/polling-guard.test.tsx | 157 + .../status-stack/preview-order.test.tsx | 81 + .../status-stack/preview-row.test.tsx | 20 - .../composer/status-stack/preview-row.tsx | 36 +- .../status-stack/session-control-goal.tsx | 643 ++ .../session-control-heartbeat.tsx | 215 + .../status-stack/session-control-loop.tsx | 238 + .../status-stack/session-control-utils.ts | 96 + .../status-stack/session-control.test.tsx | 383 + .../composer/status-stack/session-control.tsx | 110 + .../chat/composer/status-stack/status-row.tsx | 40 +- .../status-stack/subagent-controls.test.tsx | 64 + .../status-stack/subagent-controls.tsx | 90 + .../status-stack/subagent-hydration.test.tsx | 99 + .../status-stack/subagent-lifecycle.test.tsx | 51 + .../status-stack/subagent-section.test.tsx | 98 + .../status-stack/subagent-section.tsx | 101 + .../status-stack/subagent-transcript.tsx | 80 + .../status-stack/use-subagent-snapshot.ts | 91 + .../trigger-popover-description.test.tsx | 31 + .../composer/trigger-popover-parity.test.tsx | 151 - .../chat/composer/trigger-popover.test.tsx | 47 - .../src/app/chat/composer/trigger-popover.tsx | 61 +- apps/desktop/src/app/chat/composer/types.ts | 13 +- .../app/chat/composer/undo-cut-drag.test.tsx | 140 + .../src/app/chat/composer/url-refs.test.ts | 110 +- .../desktop/src/app/chat/composer/url-refs.ts | 66 + .../src/app/chat/composer/visibility.ts | 14 + .../app/chat/composer/voice-activity.test.tsx | 26 + .../src/app/chat/composer/voice-activity.tsx | 2 +- .../app/chat/composer/voice-engine-rows.tsx | 80 + .../src/app/chat/composer/voice-fan.tsx | 110 + .../src/app/chat/composer/voice-menu.tsx | 5 +- .../src/app/chat/history-window.test.tsx | 367 + apps/desktop/src/app/chat/history-window.ts | 251 + .../chat/hooks/use-composer-actions.test.ts | 189 +- .../app/chat/hooks/use-composer-actions.ts | 203 +- apps/desktop/src/app/chat/index.test.tsx | 1 + apps/desktop/src/app/chat/index.tsx | 471 +- .../src/app/chat/new-session-drag.test.ts | 373 + apps/desktop/src/app/chat/new-session-drag.ts | 325 + apps/desktop/src/app/chat/pane-mirror.ts | 3 + .../desktop/src/app/chat/preview-tile.test.ts | 41 +- apps/desktop/src/app/chat/preview-tile.tsx | 20 +- .../desktop/src/app/chat/profile-tag.test.tsx | 51 - .../chat/resume-exhausted-overlay.test.tsx | 46 + .../src/app/chat/resume-exhausted-overlay.tsx | 36 + .../app/chat/right-rail/preview-act.test.ts | 82 +- .../src/app/chat/right-rail/preview-act.ts | 5 +- .../right-rail/preview-annotate-card.test.tsx | 31 + .../chat/right-rail/preview-annotate-card.tsx | 119 + .../right-rail/preview-annotate-host.test.ts | 95 + .../chat/right-rail/preview-annotate-host.ts | 126 + .../right-rail/preview-browser-bar.test.tsx | 66 - .../chat/right-rail/preview-browser-bar.tsx | 39 +- .../app/chat/right-rail/preview-file.test.tsx | 82 +- .../src/app/chat/right-rail/preview-file.tsx | 167 +- .../app/chat/right-rail/preview-input.test.ts | 31 + .../src/app/chat/right-rail/preview-input.ts | 20 +- .../app/chat/right-rail/preview-nav.test.ts | 11 + .../src/app/chat/right-rail/preview-nav.ts | 5 +- .../app/chat/right-rail/preview-pane.test.tsx | 328 +- .../src/app/chat/right-rail/preview-pane.tsx | 398 +- .../chat/right-rail/preview-reader.test.ts | 123 +- .../src/app/chat/right-rail/preview-reader.ts | 128 +- .../real-profile-consent-dialog.test.tsx | 156 + .../real-profile-consent-dialog.tsx | 151 + .../src/app/chat/route-session-state.test.ts | 56 + .../src/app/chat/route-session-state.ts | 37 +- .../app/chat/route-tile-reactivity.test.tsx | 44 + .../src/app/chat/route-tile-title.test.tsx | 40 + apps/desktop/src/app/chat/route-tile.tsx | 24 +- .../src/app/chat/runtime-backfill.test.tsx | 112 + .../app/chat/scroll-to-bottom-button.test.tsx | 162 +- .../src/app/chat/scroll-to-bottom-button.tsx | 114 +- .../desktop/src/app/chat/session-drag.test.ts | 52 +- apps/desktop/src/app/chat/session-drag.ts | 41 +- .../src/app/chat/session-tile-actions.test.ts | 91 +- .../src/app/chat/session-tile-actions.ts | 68 +- .../app/chat/session-tile-owner-route.test.ts | 13 - .../src/app/chat/session-tile-owner.test.ts | 71 + .../src/app/chat/session-tile-owner.ts | 37 + .../desktop/src/app/chat/session-tile.test.ts | 162 +- apps/desktop/src/app/chat/session-tile.tsx | 259 +- apps/desktop/src/app/chat/session-view.tsx | 24 + .../src/app/chat/short-session-hang-repro.tsx | 8 +- .../src/app/chat/sidebar/archive-copy.test.ts | 23 + .../sidebar/chat-sidebar.integration.test.tsx | 448 + .../chrome-section-add-button.test.tsx | 87 + apps/desktop/src/app/chat/sidebar/chrome.tsx | 125 +- .../chat/sidebar/connection-switcher.test.tsx | 216 +- .../app/chat/sidebar/connection-switcher.tsx | 59 +- .../app/chat/sidebar/cron-jobs-section.tsx | 10 +- .../src/app/chat/sidebar/filter-menu.test.tsx | 61 + .../src/app/chat/sidebar/filter-menu.tsx | 211 +- .../src/app/chat/sidebar/fleet-rail.test.ts | 19 +- .../src/app/chat/sidebar/fleet-rail.ts | 20 +- .../chat/sidebar/gateway-group-model.test.ts | 62 + .../app/chat/sidebar/gateway-group-model.ts | 68 + .../sidebar/gateway-group-preferences.test.ts | 33 + .../chat/sidebar/gateway-group-preferences.ts | 33 + .../chat/sidebar/gateway-groups-drag.test.tsx | 125 + .../app/chat/sidebar/gateway-groups.test.tsx | 122 + .../src/app/chat/sidebar/gateway-groups.tsx | 403 + apps/desktop/src/app/chat/sidebar/index.tsx | 509 +- .../app/chat/sidebar/load-more-row.test.tsx | 21 - .../app/chat/sidebar/local-device-switch.tsx | 118 + .../src/app/chat/sidebar/order.test.ts | 13 + apps/desktop/src/app/chat/sidebar/order.ts | 14 + .../profile-dropdown-switcher.test.tsx | 92 + .../sidebar/profile-dropdown-switcher.tsx | 324 + .../chat/sidebar/profile-launch-menu.test.tsx | 79 + .../app/chat/sidebar/profile-launch-menu.tsx | 84 + .../sidebar/profile-rail-connect.test.tsx | 37 +- .../chat/sidebar/profile-rail-fleet.test.tsx | 302 +- .../chat/sidebar/profile-rail-status.test.tsx | 187 + .../profile-remote-override-dialog.tsx | 5 +- .../src/app/chat/sidebar/profile-switcher.tsx | 379 +- .../app/chat/sidebar/project-dialog.test.tsx | 123 +- .../src/app/chat/sidebar/project-dialog.tsx | 57 +- .../app/chat/sidebar/project-filter.test.ts | 61 + .../src/app/chat/sidebar/project-filter.ts | 38 + .../sidebar/projects/base-branch-picker.tsx | 45 +- .../chat/sidebar/projects/entered-content.tsx | 66 +- .../src/app/chat/sidebar/projects/index.ts | 4 + .../src/app/chat/sidebar/projects/model.ts | 29 + .../sidebar/projects/overview-row.test.tsx | 142 +- .../chat/sidebar/projects/overview-row.tsx | 163 +- .../sidebar/projects/project-menu.test.tsx | 12 +- .../chat/sidebar/projects/project-menu.tsx | 21 +- .../chat/sidebar/projects/workspace-group.tsx | 115 +- .../sidebar/projects/workspace-groups.test.ts | 276 + .../chat/sidebar/projects/workspace-groups.ts | 228 +- .../projects/workspace-header.test.tsx | 41 +- .../sidebar/projects/workspace-header.tsx | 75 +- .../chat/sidebar/projects/worktree-dialog.tsx | 30 +- .../src/app/chat/sidebar/reorderable-list.tsx | 27 +- .../chat/sidebar/search-results-order.test.ts | 119 + .../src/app/chat/sidebar/section-states.tsx | 73 + .../sidebar/session-actions-menu.test.tsx | 31 +- .../app/chat/sidebar/session-actions-menu.tsx | 18 +- .../chat/sidebar/session-row-details.test.ts | 29 +- .../sidebar/session-row-rename-drag.test.tsx | 393 + .../app/chat/sidebar/session-row-slots.tsx | 57 + .../src/app/chat/sidebar/session-row.test.tsx | 292 +- .../src/app/chat/sidebar/session-row.tsx | 41 +- ...sessions-section-new-session-drag.test.tsx | 640 ++ .../chat/sidebar/sessions-section.test.tsx | 184 - .../src/app/chat/sidebar/sessions-section.tsx | 189 +- .../sidebar/storage-corrupt-notice.test.tsx | 56 + .../use-entered-project-sessions.test.ts | 81 + .../sidebar/use-entered-project-sessions.ts | 69 + .../chat/sidebar/use-profile-prewarm.test.ts | 79 + .../app/chat/sidebar/use-profile-prewarm.ts | 27 +- ...use-profile-rail-refresh-on-active.test.ts | 16 - .../sidebar/virtual-session-list.test.tsx | 113 - .../app/chat/sidebar/virtual-session-list.tsx | 21 +- apps/desktop/src/app/chat/surface-vars.ts | 22 +- .../src/app/chat/thread-loading.test.ts | 39 +- apps/desktop/src/app/chat/thread-loading.ts | 32 + apps/desktop/src/app/chat/tile-zone-host.ts | 23 + .../src/app/chat/transcript-backfill.test.ts | 165 + .../src/app/chat/transcript-backfill.ts | 311 +- .../src/app/chat/transcript-retention.test.ts | 163 + .../src/app/chat/transcript-retention.ts | 133 + .../chat/transcript-window-retention.test.ts | 65 + .../src/app/chat/transcript-window.test.ts | 83 + .../desktop/src/app/chat/transcript-window.ts | 78 +- .../chat/use-transcript-retention.test.tsx | 226 + .../src/app/chat/use-transcript-retention.ts | 74 + .../command-center/delete-confirm.test.tsx | 96 + apps/desktop/src/app/command-center/index.tsx | 34 +- .../highlight-watcher.test.tsx | 17 +- .../desktop/src/app/command-palette/index.tsx | 183 +- .../app/command-palette/pet-palette-page.tsx | 1 - .../context-menu/app-context-menu.test.tsx | 100 +- .../src/app/context-menu/app-context-menu.tsx | 31 +- apps/desktop/src/app/contrib/controller.tsx | 380 +- apps/desktop/src/app/contrib/handoff-leg.ts | 173 + .../src/app/contrib/handoff-receipt.test.ts | 18 + .../src/app/contrib/handoff-receipt.ts | 75 + .../hooks/completed-reply-refresh.test.tsx | 498 + .../hooks/folded-tool-turn-refresh.test.tsx | 198 + .../contrib/hooks/live-status-reap.test.ts | 34 +- .../contrib/hooks/live-status-spinner.test.ts | 90 +- .../contrib/hooks/notification-focus.test.tsx | 110 + .../hooks/restore-late-plugin-route.test.tsx | 110 + .../contrib/hooks/use-background-sync.test.ts | 526 +- .../hooks/use-background-sync.test.tsx | 54 +- .../app/contrib/hooks/use-background-sync.ts | 590 +- .../hooks/use-desktop-integrations.test.tsx | 285 +- .../contrib/hooks/use-desktop-integrations.ts | 120 +- .../hooks/use-session-tile-delegate.test.ts | 284 +- .../hooks/use-session-tile-delegate.ts | 165 +- .../src/app/contrib/latest-actions.test.ts | 12 + .../desktop/src/app/contrib/latest-actions.ts | 3 + .../desktop/src/app/contrib/layout-presets.ts | 105 + apps/desktop/src/app/contrib/layout-sides.ts | 56 + .../contrib/mcp-install-deeplink-dialog.tsx | 2 +- .../src/app/contrib/onboarding-handoff.ts | 356 + .../app/contrib/onboarding-kickoff.test.ts | 106 + .../src/app/contrib/onboarding-kickoff.ts | 238 + apps/desktop/src/app/contrib/panes.tsx | 4 +- .../contrib/session-rpc-dispatcher.test.ts | 140 +- .../src/app/contrib/session-rpc-dispatcher.ts | 42 +- .../contrib/sessions-pane-tab-title.test.tsx | 65 + .../app/contrib/surfaces.app-routes.test.tsx | 55 + .../app/contrib/surfaces.late-routes.test.tsx | 75 + .../desktop/src/app/contrib/surfaces.test.tsx | 1 + apps/desktop/src/app/contrib/surfaces.tsx | 36 +- apps/desktop/src/app/contrib/types.ts | 5 +- .../desktop/src/app/contrib/wiring-routing.ts | 42 +- apps/desktop/src/app/contrib/wiring.tsx | 368 +- .../src/app/cron/cron-job-model.test.ts | 58 + apps/desktop/src/app/cron/cron-job-model.ts | 53 + apps/desktop/src/app/cron/index.tsx | 85 +- apps/desktop/src/app/cron/job-state.ts | 28 + .../app/gateway/gateway-event-dedupe.test.ts | 46 + .../src/app/gateway/gateway-event-dedupe.ts | 117 + .../hooks/gateway-hmr-survivor.test.ts | 10 - .../hooks/use-connections-registry.test.tsx | 90 + .../gateway/hooks/use-connections-registry.ts | 84 + .../hooks/use-default-profile-preference.ts | 14 + .../gateway/hooks/use-gateway-boot.test.tsx | 934 +- .../src/app/gateway/hooks/use-gateway-boot.ts | 564 +- .../gateway/hooks/use-gateway-request.test.ts | 42 +- .../app/gateway/hooks/use-gateway-request.ts | 27 +- .../src/app/hooks/use-config-record.test.tsx | 120 + .../src/app/hooks/use-config-record.ts | 155 +- apps/desktop/src/app/hooks/use-keybinds.ts | 105 +- .../app/hooks/use-on-profile-switch.test.tsx | 24 + .../src/app/hooks/use-on-profile-switch.ts | 9 +- .../hooks/use-profile-switch-latch.test.ts | 34 + .../src/app/hooks/use-profile-switch-latch.ts | 27 + apps/desktop/src/app/hud/glass.test.tsx | 8 + apps/desktop/src/app/hud/glass.ts | 17 +- apps/desktop/src/app/hud/handoff.test.tsx | 61 + apps/desktop/src/app/hud/handoff.ts | 7 +- apps/desktop/src/app/hud/hud-shell.tsx | 148 +- .../hud/hud-shell.viewed-interval.test.tsx | 96 + .../desktop/src/app/hud/resize-frame.test.tsx | 91 + .../desktop/src/app/hud/resize-handle.test.ts | 6 +- .../src/app/hud/transcript-band.test.tsx | 107 + apps/desktop/src/app/hud/transcript-band.ts | 119 + apps/desktop/src/app/layout-constants.ts | 15 +- apps/desktop/src/app/master-detail.tsx | 43 +- apps/desktop/src/app/messaging/index.test.tsx | 171 +- apps/desktop/src/app/messaging/index.tsx | 153 +- .../src/app/messaging/telegram-qr-setup.tsx | 379 + .../src/app/model-picker-overlay.test.tsx | 82 + apps/desktop/src/app/model-picker-overlay.tsx | 50 +- .../src/app/model-visibility-overlay.tsx | 9 +- apps/desktop/src/app/open-session.test.ts | 72 +- apps/desktop/src/app/open-session.ts | 33 +- .../overlays/overlay-split-layout.test.tsx | 42 + .../src/app/overlays/overlay-split-layout.tsx | 169 +- .../desktop/src/app/overlays/overlay-view.tsx | 2 +- .../src/app/overlays/peek-scope.test.ts | 31 - .../pet-generate/components/hatch-preview.tsx | 3 +- .../components/reference-chip.tsx | 2 +- .../app/pet-generate/pet-generate-content.tsx | 3 +- .../src/app/pet-overlay/pet-overlay-app.tsx | 4 +- apps/desktop/src/app/profiles/index.test.tsx | 13 +- .../profiles/rename-profile-dialog.test.tsx | 8 + .../app/profiles/rename-profile-dialog.tsx | 9 + .../src/app/quick-entry/quick-entry-app.tsx | 9 +- apps/desktop/src/app/retirement-view.test.tsx | 65 + apps/desktop/src/app/retirement-view.tsx | 35 + .../src/app/right-sidebar/file-actions.tsx | 3 +- .../src/app/right-sidebar/files/ipc.test.ts | 57 +- .../src/app/right-sidebar/files/ipc.ts | 9 + .../src/app/right-sidebar/files/prefs.test.ts | 58 + .../src/app/right-sidebar/files/prefs.ts | 53 + .../files/remote-picker.test.tsx | 127 + .../app/right-sidebar/files/remote-picker.tsx | 120 +- .../files/use-project-tree.test.ts | 122 + .../right-sidebar/files/use-project-tree.ts | 64 +- apps/desktop/src/app/right-sidebar/index.tsx | 47 +- .../app/right-sidebar/review/file-tree.tsx | 2 +- .../src/app/right-sidebar/review/ship-bar.tsx | 3 +- .../right-sidebar/review/tree-data.test.ts | 24 - apps/desktop/src/app/right-sidebar/store.ts | 11 +- .../terminal/persistent.test.tsx | 14 - .../app/right-sidebar/terminal/persistent.tsx | 2 +- .../app/right-sidebar/terminal/rail.test.tsx | 15 - .../src/app/right-sidebar/terminal/rail.tsx | 9 +- .../terminal/reveal-focus.test.ts | 331 + .../right-sidebar/terminal/reveal-focus.ts | 80 + .../terminal/terminal-font.test.ts | 42 +- .../right-sidebar/terminal/terminals.test.ts | 5 +- .../terminal/use-agent-terminal.test.tsx | 2 +- .../terminal/use-terminal-session.ts | 12 +- apps/desktop/src/app/routes.test.ts | 8 - .../src/app/routes.titlebar-clusters.test.ts | 14 + apps/desktop/src/app/routes.ts | 81 +- .../src/app/routes.workspace-reveal.test.ts | 76 +- apps/desktop/src/app/session-import/api.ts | 49 + .../src/app/session-import/index.test.tsx | 102 + apps/desktop/src/app/session-import/index.tsx | 320 + .../branch-owner-routing.integration.test.ts | 127 + .../hooks/default-new-session.test.tsx | 308 + .../app/session/hooks/preview-open.test.tsx | 22 +- .../profile-rail-fresh-chat-owner.test.tsx | 107 +- .../session/hooks/resume-occurrences.test.tsx | 450 + .../hooks/session-context-drift.test.ts | 26 - .../hooks/use-background-queue-drain.test.tsx | 58 +- .../hooks/use-background-queue-drain.ts | 12 +- ...use-background-queue-preservation.test.tsx | 72 + .../session/hooks/use-hermes-config.test.ts | 34 +- .../app/session/hooks/use-hermes-config.ts | 11 +- .../agent-init-error.test.tsx | 25 +- .../background-review-interrupt.test.tsx | 98 + .../btw-complete-event.test.tsx | 58 + .../clarify-hydration.test.tsx | 33 +- .../collapse-duplicate-final.ts | 56 + .../compaction-event.test.tsx | 131 +- .../completion-boundaries.test.tsx | 359 + .../completion-projections.test.tsx | 114 + .../composer-model-event.test.tsx | 14 - .../confab-notice-event.test.tsx | 107 - .../use-message-stream/delta-flush.test.tsx | 110 - .../duplicate-completion.test.tsx | 120 + .../folded-segment-refresh.test.tsx | 95 + .../gateway-event/desktop-bridge.test.ts | 44 + .../gateway-event/desktop-bridge.ts | 201 +- .../gateway-event/fallback-switch.test.ts | 61 + .../use-message-stream/gateway-event/index.ts | 41 +- .../input-requests.approval-timeout.test.ts | 97 + .../gateway-event/input-requests.test.ts | 66 + .../gateway-event/input-requests.ts | 383 +- .../gateway-event/lifecycle.test.ts | 105 + .../gateway-event/lifecycle.ts | 30 +- .../gateway-event/message-stream.test.ts | 58 + .../gateway-event/message-stream.ts | 42 +- .../gateway-event/server-requests.test.ts | 161 + .../gateway-event/server-requests.ts | 487 + .../gateway-event/session-control.test.ts | 68 + .../gateway-event/session-control.ts | 20 + .../gateway-event/session-info.test.ts | 159 +- .../gateway-event/session-info.ts | 99 +- .../gateway-event/status.test.ts | 91 + .../gateway-event/status.ts | 194 +- .../gateway-event/tools-preview.test.ts | 178 + .../use-message-stream/gateway-event/tools.ts | 36 +- .../use-message-stream/gateway-event/types.ts | 17 +- .../heartbeat-complete-reorder.test.tsx | 202 + .../session/hooks/use-message-stream/index.ts | 296 +- .../interim-history.test.tsx | 110 + .../interim-sealing.test.tsx | 52 +- .../late-tool-events.test.tsx | 119 + .../moa-progress-event.test.tsx | 5 +- .../moa-reference-event.test.tsx | 16 +- .../peer-transcript-notify.test.tsx | 43 + .../pet-tool-failure-event.test.tsx | 4 +- .../provider-wait-event.test.tsx | 4 +- .../response-occurrences.test.tsx | 70 + .../use-message-stream/response-parts.ts | 14 + .../session-info-side-effects.test.tsx | 41 +- .../session-reclaimed.test.tsx | 56 +- .../stale-pending-settle.test.tsx | 5 +- .../steer-arrival-order.test.tsx | 6 +- .../hooks/use-message-stream/test-harness.tsx | 25 +- .../timeline-events.test.tsx | 12 +- .../use-message-stream/todo-cleanup.test.tsx | 28 + .../tool-drafting-event.test.tsx | 8 +- .../transformed-final.test.tsx | 86 + .../hooks/use-message-stream/utils.test.ts | 5 +- .../session/hooks/use-message-stream/utils.ts | 48 +- .../session/hooks/use-model-controls.test.tsx | 222 +- .../app/session/hooks/use-model-controls.ts | 180 +- .../app/session/hooks/use-preview-routing.ts | 7 +- .../hooks/use-prompt-actions/index.test.tsx | 695 +- .../session/hooks/use-prompt-actions/index.ts | 193 +- .../hooks/use-prompt-actions/queue-if-busy.ts | 45 + .../hooks/use-prompt-actions/rewind.test.ts | 72 +- .../hooks/use-prompt-actions/rewind.ts | 28 +- .../session/hooks/use-prompt-actions/slash.ts | 213 +- .../steering-recovery.test.tsx | 428 + .../use-prompt-actions/steering-session.ts | 97 + .../submit-view-binding.test.ts | 122 + .../hooks/use-prompt-actions/submit.ts | 165 +- .../hooks/use-prompt-actions/utils.test.ts | 82 +- .../session/hooks/use-prompt-actions/utils.ts | 34 +- .../session/hooks/use-route-resume.test.tsx | 91 + .../src/app/session/hooks/use-route-resume.ts | 11 +- .../hooks/use-session-actions.test.tsx | 1518 ++- .../use-session-actions/create-overrides.ts | 48 + .../use-session-actions/display-hydration.ts | 68 + .../hooks/use-session-actions/index.ts | 1073 ++- .../live-turn-remainder.test.ts | 146 + .../live-turn-remainder.ts | 121 + .../pending-turn-identity.ts | 78 + .../persisted-live-turn.ts | 330 + .../provisional-transcript.ts | 56 + .../resolve-stored-session.test.ts | 84 +- .../restore-pending-clarify.test.ts | 95 +- .../restore-pending-clarify.ts | 71 +- .../restore-pending-connection.ts | 85 + .../resume-empty-prose-pairing.test.ts | 74 + .../transcript-provenance.test.ts | 67 +- .../transcript-provenance.ts | 68 +- .../unarchive-session.test.tsx | 156 + .../hooks/use-session-actions/utils.test.ts | 650 +- .../hooks/use-session-actions/utils.ts | 660 +- ...session-list-actions.reactivation.test.tsx | 70 + .../hooks/use-session-list-actions.test.tsx | 242 +- .../session/hooks/use-session-list-actions.ts | 202 +- .../hooks/use-session-state-cache.test.tsx | 376 +- .../session/hooks/use-session-state-cache.ts | 71 +- .../hooks/use-transcript-peer-sync.test.tsx | 173 + .../session/hooks/use-transcript-peer-sync.ts | 97 + .../hooks/warm-resume-replay-barrier.test.tsx | 400 + .../hooks/wrong-session-closeout.test.tsx | 167 + .../src/app/session/new-session-route.ts | 70 + .../app/session/session-state-cache.test.ts | 16 +- .../src/app/session/session-state-cache.ts | 16 +- .../session/workspace-session-target.test.ts | 24 +- .../app/session/workspace-session-target.ts | 13 +- .../src/app/settings/about-settings.test.tsx | 153 + .../src/app/settings/about-settings.tsx | 228 +- .../app/settings/appearance-contrib.test.tsx | 68 + .../src/app/settings/appearance-contrib.tsx | 37 + .../appearance-settings.extra-slot.test.tsx | 48 + .../src/app/settings/appearance-settings.tsx | 868 +- .../src/app/settings/appearance-subpages.ts | 10 + .../settings/billing/account-row-value.tsx | 5 +- .../src/app/settings/billing/api.test.ts | 12 - .../app/settings/billing/auto-reload-row.tsx | 41 +- .../app/settings/billing/billing-amounts.ts | 23 +- .../settings/billing/current-plan-card.tsx | 14 +- .../src/app/settings/billing/errors.test.ts | 7 +- .../src/app/settings/billing/errors.ts | 99 +- .../src/app/settings/billing/index.test.tsx | 198 +- .../src/app/settings/billing/index.tsx | 108 +- .../app/settings/billing/inline-feedback.tsx | 17 +- .../src/app/settings/billing/plans-view.tsx | 56 +- .../settings/billing/simulated-api.test.ts | 19 - .../src/app/settings/billing/tier-art.test.ts | 7 - .../src/app/settings/billing/types.test.ts | 117 - .../desktop/src/app/settings/billing/types.ts | 16 +- .../billing/use-billing-state.test.ts | 196 +- .../app/settings/billing/use-billing-state.ts | 333 +- .../billing/use-charge-poller.test.ts | 2 +- .../app/settings/billing/use-charge-poller.ts | 97 +- .../src/app/settings/billing/use-step-up.ts | 51 +- .../billing/use-subscription-change.test.tsx | 37 - .../browser-real-profile-panel.test.tsx | 17 +- .../settings/browser-real-profile-panel.tsx | 13 +- .../app/settings/chat-font-setting.test.tsx | 142 + .../src/app/settings/chat-font-setting.tsx | 163 + .../src/app/settings/cloud-team-change.ts | 59 + .../src/app/settings/combobox-input.tsx | 162 +- .../src/app/settings/computer-use-panel.tsx | 8 +- .../config-field-voice-locale.test.tsx | 78 + .../desktop/src/app/settings/config-field.tsx | 81 +- .../src/app/settings/config-settings.test.tsx | 154 + .../src/app/settings/config-settings.tsx | 147 +- .../src/app/settings/config-subpages.ts | 108 + .../settings/connections-registry.test.tsx | 220 +- .../src/app/settings/connections-registry.tsx | 336 +- apps/desktop/src/app/settings/constants.ts | 80 +- .../src/app/settings/credential-key-ui.tsx | 10 +- .../custom-endpoints-settings.test.tsx | 265 + .../settings/custom-endpoints-settings.tsx | 242 +- .../src/app/settings/env-credentials.tsx | 11 + .../src/app/settings/env-var-actions-menu.tsx | 3 +- .../settings/fallback-models-field.test.tsx | 26 +- .../app/settings/fallback-models-field.tsx | 54 +- .../app/settings/gateway-settings.test.tsx | 485 +- .../src/app/settings/gateway-settings.tsx | 710 +- apps/desktop/src/app/settings/helpers.test.ts | 108 +- apps/desktop/src/app/settings/helpers.ts | 44 +- .../settings/hud-modifier-settings.test.tsx | 103 + .../app/settings/hud-modifier-settings.tsx | 125 + apps/desktop/src/app/settings/index.tsx | 423 +- .../keybind-settings.late-actions.test.tsx | 42 + .../src/app/settings/keybind-settings.tsx | 71 +- .../src/app/settings/keys-settings.test.tsx | 65 +- .../local-model-download-progress.test.tsx | 246 + .../local-model-download-progress.tsx | 266 + .../src/app/settings/local-models-actions.ts | 149 + .../src/app/settings/local-models-browse.tsx | 327 + .../local-models-hardware-section.tsx | 48 + .../app/settings/local-models-model-rows.tsx | 338 + .../settings/local-models-models-section.tsx | 79 + .../src/app/settings/local-models-owner.ts | 20 + .../app/settings/local-models-quickstart.tsx | 131 + .../settings/local-models-runtime-section.tsx | 163 + .../settings/local-models-settings.test.tsx | 745 ++ .../app/settings/local-models-settings.tsx | 129 + .../app/settings/managed-updates-section.tsx | 8 +- .../memory/provider-config-modal.test.tsx | 12 +- .../memory/provider-config-panel.test.tsx | 27 +- .../minimize-to-tray-setting.test.tsx | 95 + .../app/settings/minimize-to-tray-setting.tsx | 104 + .../desktop/src/app/settings/model-select.tsx | 162 + .../src/app/settings/model-settings.test.tsx | 302 +- .../src/app/settings/model-settings.tsx | 947 +- .../src/app/settings/moved-tabs.test.ts | 18 + apps/desktop/src/app/settings/moved-tabs.ts | 20 + .../app/settings/notifications-settings.tsx | 167 +- .../src/app/settings/other-subpages.ts | 31 + .../desktop/src/app/settings/pet-settings.tsx | 59 +- .../settings/plugin-install-modal.test.tsx | 249 + .../src/app/settings/plugin-install-modal.tsx | 298 +- .../app/settings/plugins-settings.test.tsx | 233 - .../src/app/settings/plugins-settings.tsx | 413 - .../src/app/settings/pool-limits-setting.tsx | 118 + apps/desktop/src/app/settings/primitives.tsx | 124 +- .../src/app/settings/profile-scope.test.tsx | 98 +- .../src/app/settings/profile-scope.tsx | 87 +- ...ders-settings.terminal-disconnect.test.tsx | 120 + .../app/settings/providers-settings.test.tsx | 99 +- .../src/app/settings/providers-settings.tsx | 120 +- .../src/app/settings/quick-entry-settings.tsx | 6 +- .../app/settings/screenshot-settings.test.tsx | 159 + .../src/app/settings/screenshot-settings.tsx | 165 + .../app/settings/searchable-select.test.tsx | 30 +- .../src/app/settings/searchable-select.tsx | 32 +- .../app/settings/sessions-settings.test.tsx | 60 + .../src/app/settings/sessions-settings.tsx | 48 +- .../src/app/settings/settings-manifest.ts | 328 + .../src/app/settings/settings-search.ts | 23 +- .../src/app/settings/subpage-navigation.tsx | 36 + .../desktop/src/app/settings/subpages.test.ts | 132 + apps/desktop/src/app/settings/subpages.ts | 139 + .../settings/terminal-backend-panel.test.tsx | 76 +- .../app/settings/terminal-backend-panel.tsx | 21 +- .../settings/terminal-font-setting.test.tsx | 29 +- .../app/settings/terminal-font-setting.tsx | 41 +- .../settings/toolset-config-panel.test.tsx | 252 +- .../src/app/settings/toolset-config-panel.tsx | 37 +- apps/desktop/src/app/settings/types.ts | 2 +- .../app/settings/uninstall-section.test.tsx | 109 + .../src/app/settings/uninstall-section.tsx | 148 +- .../app/settings/use-deep-link-highlight.ts | 2 +- .../src/app/settings/use-setting-deep-link.ts | 24 + .../src/app/settings/use-settings-search.ts | 181 +- .../settings/vault-settings.owner.test.tsx | 169 + .../src/app/settings/vault-settings.test.tsx | 277 + .../src/app/settings/vault-settings.tsx | 831 ++ .../app/settings/voice-field-visible.test.ts | 15 +- .../settings/voice-provider-fields.test.ts | 35 +- .../app/settings/voice-provider-fields.tsx | 54 +- .../src/app/settings/with-active.test.ts | 16 +- .../src/app/shell/approval-mode-menu.test.tsx | 33 +- .../app/shell/context-usage-panel.test.tsx | 34 +- .../src/app/shell/context-usage-panel.tsx | 14 +- .../src/app/shell/gateway-menu-panel.test.tsx | 8 +- .../src/app/shell/gateway-menu-panel.tsx | 27 +- apps/desktop/src/app/shell/group-setter.ts | 2 +- .../app/shell/hooks/use-context-breakdown.ts | 9 +- .../shell/hooks/use-status-snapshot.test.ts | 160 +- .../app/shell/hooks/use-status-snapshot.ts | 110 +- .../use-statusbar-items.lifecycle.test.tsx | 136 + .../shell/hooks/use-statusbar-items.test.tsx | 193 + .../app/shell/hooks/use-statusbar-items.tsx | 200 +- .../model-catalog-menu.search-fold.test.tsx | 76 + .../src/app/shell/model-catalog-menu.test.tsx | 151 +- .../src/app/shell/model-catalog-menu.tsx | 412 +- .../src/app/shell/model-edit-submenu.tsx | 17 +- .../src/app/shell/model-menu-panel.test.tsx | 286 +- .../src/app/shell/model-menu-panel.tsx | 240 +- .../src/app/shell/reasoning-menu-panel.tsx | 60 + apps/desktop/src/app/shell/sidebar-label.tsx | 8 +- .../app/shell/statusbar-visibility.test.tsx | 38 - .../app/shell/system-resources-statusbar.tsx | 171 + .../src/app/shell/titlebar-controls.test.tsx | 208 + .../src/app/shell/titlebar-controls.tsx | 213 +- apps/desktop/src/app/shell/titlebar.test.ts | 22 +- apps/desktop/src/app/shell/titlebar.ts | 5 + .../app/shell/use-model-menu-controller.ts | 208 + .../app/shell/wslg-window-controls.test.tsx | 85 + .../src/app/shell/wslg-window-controls.tsx | 81 + .../src/app/skills/embedded-hub-picker.tsx | 249 - apps/desktop/src/app/skills/index.tsx | 1183 --- apps/desktop/src/app/skills/mcp-tab.tsx | 1860 ---- apps/desktop/src/app/skills/store.ts | 6 - .../app/starmap/node-context-menu.test.tsx | 38 + .../src/app/starmap/node-context-menu.tsx | 57 +- .../src/app/starmap/playback-hotkey.test.ts | 30 + .../src/app/starmap/playback-hotkey.ts | 35 + .../src/app/starmap/share-code.test.ts | 11 +- apps/desktop/src/app/starmap/share-code.ts | 2 +- apps/desktop/src/app/starmap/star-map.tsx | 52 +- apps/desktop/src/app/starmap/text.ts | 2 +- apps/desktop/src/app/starmap/timeline.tsx | 2 - apps/desktop/src/app/types.ts | 62 +- .../src/app/updates-overlay.blockers.test.tsx | 213 - .../src/app/updates-overlay.manual.test.tsx | 48 + apps/desktop/src/app/updates-overlay.tsx | 261 +- apps/desktop/src/app/webhooks/index.tsx | 16 +- .../components/assistant-ui/ask-directive.tsx | 107 + .../assistant-ui/catalog-advanced-dialog.tsx | 372 + .../catalog-install-tool.test.tsx | 257 + .../assistant-ui/catalog-install-tool.tsx | 337 + .../assistant-ui/chat-empty-slot.test.tsx | 6 - .../assistant-ui/clarify-submit-shortcut.ts | 25 + .../assistant-ui/clarify-tool.test.tsx | 552 +- .../components/assistant-ui/clarify-tool.tsx | 234 +- .../assistant-ui/connector-tool.test.tsx | 254 + .../assistant-ui/connector-tool.tsx | 421 + .../directive-chip-links.test.tsx | 62 + .../assistant-ui/directive-text.tsx | 61 +- .../assistant-ui/embeds/listing-embed.tsx | 262 + .../assistant-ui/embeds/registry.tsx | 1 + .../inline-preview-directive.test.ts | 32 +- .../assistant-ui/inline-preview-directive.tsx | 34 +- .../markdown-text.artifacts.test.tsx | 6 - .../markdown-text.media-md.test.tsx | 10 - .../assistant-ui/markdown-text.media.test.tsx | 13 +- .../markdown-text.overflow.test.tsx | 7 +- .../markdown-text.reasoning.test.tsx | 35 + .../assistant-ui/markdown-text.test.ts | 161 +- .../components/assistant-ui/markdown-text.tsx | 295 +- .../assistant-ui/mcp-setup-tool.test.tsx | 157 + .../assistant-ui/mcp-setup-tool.tsx | 757 +- .../message-render-boundary.test.tsx | 36 +- .../assistant-ui/session-ref-open.test.tsx | 4 +- .../thread/agent-avatar-cache.test.ts | 82 + .../assistant-ui/thread/agent-delivery.tsx | 65 +- .../thread/agent-message.test.tsx | 10 + .../thread/assistant-message.test.tsx | 355 +- .../assistant-ui/thread/assistant-message.tsx | 456 +- .../thread/background-resume.test.tsx | 42 + .../thread/block-direction.test.tsx | 8 - .../thread/changed-files-card.tsx | 25 +- .../assistant-ui/thread/changed-files.ts | 4 +- .../components/assistant-ui/thread/content.ts | 2 + .../assistant-ui/thread/index.test.tsx | 73 + .../components/assistant-ui/thread/index.tsx | 13 + .../thread/inter-agent-collapse.test.tsx | 84 +- .../thread/list-auto-show-earlier.test.tsx | 128 + .../list-restore-composer-resize.test.tsx | 252 + .../thread/list-session-scroll.test.tsx | 960 ++ .../assistant-ui/thread/list.test.ts | 171 +- .../components/assistant-ui/thread/list.tsx | 1019 +- .../thread/message-parts-connectors.test.tsx | 125 + .../assistant-ui/thread/message-parts.tsx | 109 +- .../thread/process-notification.test.tsx | 53 + .../reaction-picker-focus-follow.test.tsx | 65 + .../thread/response-group.test.tsx | 112 + .../assistant-ui/thread/response-group.tsx | 105 + .../thread/sealed-tool-parts.test.tsx | 93 + .../thread/should-auto-show-earlier.test.ts | 31 + .../thread/status-tail-only.test.tsx | 5 +- .../assistant-ui/thread/status.test.tsx | 19 +- .../components/assistant-ui/thread/status.tsx | 199 +- .../assistant-ui/thread/streaming.test.tsx | 211 +- .../thread/system-message.test.tsx | 55 +- .../assistant-ui/thread/system-message.tsx | 69 +- .../thread/text-direction.test.tsx | 209 + .../assistant-ui/thread/timeline-data.test.ts | 22 +- .../assistant-ui/thread/timeline-data.ts | 29 +- .../thread/timeline-idle.test.tsx | 96 +- .../thread/timeline-index.test.ts | 103 + .../assistant-ui/thread/timeline-index.ts | 156 + .../thread/timeline-rail.test.tsx | 51 + .../assistant-ui/thread/timeline-rail.tsx | 197 + .../thread/timeline-timestamp.tsx | 6 +- .../assistant-ui/thread/timeline.css | 69 + .../assistant-ui/thread/timeline.tsx | 589 +- .../assistant-ui/thread/timestamp.test.ts | 21 +- .../assistant-ui/thread/transcript-window.tsx | 85 +- .../assistant-ui/thread/turn-activity.test.ts | 9 + .../assistant-ui/thread/turn-activity.ts | 10 +- .../thread/turn-gap-indicator.test.tsx | 31 + .../thread/use-messages-below.test.tsx | 211 + .../assistant-ui/thread/use-messages-below.ts | 124 + .../thread/use-sticky-prompt-clip.test.tsx | 147 + .../thread/use-sticky-prompt-clip.ts | 221 + .../thread/use-timeline-history.test.tsx | 72 + .../thread/use-timeline-history.ts | 104 + .../thread/use-timeline-reveal.test.tsx | 92 + .../thread/use-timeline-reveal.ts | 169 + .../thread/user-edit-composer.tsx | 44 +- ...user-message-edit-shared-composer.test.tsx | 132 + .../user-message-edit-undo-cut-drag.test.tsx | 176 + .../thread/user-message-edit.test.tsx | 179 +- .../thread/user-message-selection.test.ts | 28 - .../assistant-ui/thread/user-message-text.tsx | 7 +- .../assistant-ui/thread/user-message.tsx | 135 +- .../assistant-ui/tool/approval-activity.ts | 21 + .../assistant-ui/tool/approval.test.tsx | 354 +- .../components/assistant-ui/tool/approval.tsx | 495 +- .../assistant-ui/tool/delegate.test.tsx | 96 + .../components/assistant-ui/tool/delegate.tsx | 11 +- .../assistant-ui/tool/fallback-model.test.ts | 176 +- .../assistant-ui/tool/fallback-model/index.ts | 111 +- .../tool/fallback-model/targets.ts | 21 +- .../assistant-ui/tool/fallback-model/types.ts | 6 +- .../tool/fallback-preview-scope.test.tsx | 40 +- .../tool/fallback-vision-image.test.tsx | 113 + .../assistant-ui/tool/fallback.test.ts | 29 - .../components/assistant-ui/tool/fallback.tsx | 326 +- .../tool/hide-code-diffs.test.tsx | 97 + .../tool/inline-edit-persistence.test.tsx | 224 + .../assistant-ui/tool/run-summary.ts | 37 +- .../assistant-ui/tool/skill-activity.test.ts | 23 + .../assistant-ui/tool/skill-activity.ts | 47 + .../assistant-ui/tool/tool-group.test.tsx | 169 +- .../assistant-ui/tooltip-icon-button.tsx | 2 +- .../assistant-ui/transcript-directive.tsx | 166 +- .../desktop/src/components/billing-banner.tsx | 23 +- .../src/components/boot-failure-cause.test.ts | 47 + .../src/components/boot-failure-cause.ts | 64 + .../components/boot-failure-overlay.test.tsx | 234 +- .../src/components/boot-failure-overlay.tsx | 291 +- .../components/boot-failure-reauth.test.ts | 20 +- .../src/components/boot-failure-reauth.ts | 1 + apps/desktop/src/components/brand-mark.tsx | 22 +- .../components/chat/activity-timer-text.tsx | 4 +- .../src/components/chat/composer-dock.ts | 23 +- .../components/chat/expandable-block.test.tsx | 31 - .../chat/generated-image-result.tsx | 103 +- .../image-generation-placeholder.test.tsx | 128 +- .../components/chat/image-geometry.test.tsx | 194 + .../src/components/chat/intro.test.tsx | 91 + apps/desktop/src/components/chat/intro.tsx | 13 +- .../components/chat/preview-attachment.tsx | 7 +- .../src/components/chat/shiki-block.test.tsx | 130 + .../src/components/chat/shiki-block.tsx | 169 +- .../src/components/chat/shiki-config.ts | 33 + .../chat/shiki-highlight-cache.test.ts | 95 + .../components/chat/shiki-highlight-cache.ts | 90 + .../components/chat/shiki-highlighter.test.ts | 4 - .../src/components/chat/shiki-highlighter.tsx | 88 +- .../src/components/chat/shiki-plain.tsx | 10 + .../src/components/chat/stable-text.tsx | 5 +- .../components/chat/status-control-row.tsx | 24 + .../components/chat/status-dismiss-button.tsx | 28 + .../components/chat/status-pending-icon.tsx | 9 + .../src/components/chat/status-row.test.tsx | 59 + .../src/components/chat/status-row.tsx | 39 +- .../src/components/chat/status-section.tsx | 18 +- .../src/components/chat/status-stack.css | 107 + .../src/components/chat/terminal-output.tsx | 6 +- .../components/chat/transcript-video.test.tsx | 59 + .../src/components/chat/transcript-video.tsx | 34 + .../src/components/chat/vibe-hearts.test.ts | 10 - .../components/chat/zoomable-image.test.tsx | 62 + .../src/components/chat/zoomable-image.tsx | 18 +- .../src/components/confirm-host.test.tsx | 39 + apps/desktop/src/components/confirm-host.tsx | 26 +- .../components/desktop-install-local-card.ts | 38 + .../desktop-install-overlay.test.tsx | 221 +- .../components/desktop-install-overlay.tsx | 74 +- .../desktop/src/components/error-boundary.tsx | 18 +- .../external-open-failed-dialog.test.tsx | 74 + .../external-open-failed-dialog.tsx | 56 + apps/desktop/src/components/find-bar.test.tsx | 177 +- apps/desktop/src/components/find-bar.tsx | 25 +- .../src/components/first-run-remote-form.tsx | 346 - .../free-tier/notice-owner.test.tsx | 21 + .../src/components/free-tier/notice-strip.tsx | 102 + .../free-tier/sign-in-dialog.test.tsx | 78 + .../components/free-tier/sign-in-dialog.tsx | 299 + .../gateway-connecting-overlay.test.tsx | 27 +- .../components/gateway-connecting-overlay.tsx | 11 + .../src/components/intro-reveal/README.md | 38 + .../src/components/intro-reveal/index.tsx | 91 + .../intro-reveal/intro-reveal-surface.tsx | 372 + .../components/intro-reveal/intro-reveal.css | 59 + .../components/intro-reveal/intro-root.tsx | 39 + .../components/intro-reveal/scenes/brand.tsx | 36 + .../intro-reveal/scenes/side-agents.tsx | 83 + .../components/intro-reveal/scenes/style.ts | 13 + .../components/intro-reveal/scenes/text.ts | 17 + .../src/components/intro-reveal/sound.ts | 217 + .../src/components/intro-reveal/timeline.ts | 157 + .../intro-reveal/use-intro-clock.ts | 267 + .../components/intro-reveal/viewport-cube.ts | 514 ++ .../src/components/language-switcher.tsx | 62 +- .../src/components/model-picker.test.tsx | 221 + apps/desktop/src/components/model-picker.tsx | 309 +- .../components/model-visibility-dialog.tsx | 92 +- .../src/components/notifications.test.tsx | 72 +- apps/desktop/src/components/notifications.tsx | 145 +- .../components/onboarding-chat/assembly.ts | 243 + .../onboarding-chat/cards/build.tsx | 303 + .../onboarding-chat/cards/connectors.test.tsx | 59 + .../onboarding-chat/cards/frame.tsx | 86 + .../onboarding-chat/cards/look.test.tsx | 70 + .../onboarding-chat/cards/setup.tsx | 298 + .../src/components/onboarding-chat/chip.tsx | 52 + .../components/onboarding-chat/directive.tsx | 69 + .../components/onboarding-chat/first-build.ts | 95 + .../components/onboarding-chat/gate.test.tsx | 83 + .../src/components/onboarding-chat/gate.tsx | 89 + .../onboarding-chat/guide-loading.css | 14 + .../onboarding-chat/guide-loading.test.tsx | 55 + .../onboarding-chat/guide-loading.tsx | 33 + .../onboarding-chat/mode-layout.test.ts | 29 + .../onboarding-first-use.test.ts | 24 + .../components/onboarding-chat/options.tsx | 223 + .../onboarding-chat/persisted-handoff.ts | 47 + .../onboarding-chat/plugins-runbook.test.ts | 37 + .../onboarding-chat/setup-profile.ts | 305 + .../components/onboarding-chat/signpost.ts | 60 + .../src/components/onboarding-chat/skip.tsx | 28 + .../src/components/onboarding/flow.test.tsx | 127 + .../src/components/onboarding/flow.tsx | 54 +- .../onboarding/free-tier-intro.test.ts | 86 + .../free-tier-setup-notice.test.tsx | 116 + .../onboarding/free-tier-setup-notice.tsx | 106 + .../src/components/onboarding/glyph.tsx | 4 +- .../src/components/onboarding/index.test.tsx | 33 +- .../src/components/onboarding/index.tsx | 237 +- .../src/components/onboarding/providers.tsx | 67 +- .../src/components/overlay-error-boundary.tsx | 45 + .../components/pane-shell/edit-mode.test.ts | 30 + .../src/components/pane-shell/edit-mode.tsx | 13 +- .../pane-shell/pane-visibility.test.ts | 13 +- .../pane-shell/tree/dock-enforce.test.ts | 9 +- .../pane-shell/tree/floating-adoption.test.ts | 20 - .../tree/focused-session-tab.test.ts | 11 +- .../tree/hide-only-strip-tabs.test.ts | 26 +- .../tree/lone-chat-sibling-zone.test.ts | 58 + .../tree/mode-layout-memory.test.ts | 199 + .../pane-shell/tree/pane-reload-share.test.ts | 200 + .../src/components/pane-shell/tree/presets.ts | 76 +- .../pane-shell/tree/reactive-unhide.test.ts | 39 - .../collapse-restore-affordance.test.tsx | 24 +- .../pane-shell/tree/renderer/drag-session.ts | 18 +- .../renderer/floating-mode-memory.test.tsx | 50 + .../tree/renderer/floating-panes.test.tsx | 18 +- .../tree/renderer/floating-panes.tsx | 113 +- .../pane-shell/tree/renderer/index.tsx | 40 +- .../tree/renderer/keep-alive-panes.test.tsx | 359 + .../tree/renderer/keep-alive-panes.tsx | 199 + .../tree/renderer/layout-picker.tsx | 212 +- .../tree/renderer/narrow-overlays.tsx | 53 +- .../pane-shell/tree/renderer/pane-body.tsx | 45 + .../panel-titlebar-lifecycle.test.tsx | 217 + .../tree/renderer/panel-titlebar.test.tsx | 86 + .../tree/renderer/panel-titlebar.ts | 113 + .../tree/renderer/strip-visibility.test.ts | 56 +- .../tree/renderer/strip-visibility.ts | 49 +- .../tree/renderer/tab-strip-hide.test.tsx | 7 - .../renderer/track-model-absorber.test.ts | 8 - .../pane-shell/tree/renderer/track-model.ts | 9 + .../tree/renderer/tree-group.test.tsx | 269 +- .../pane-shell/tree/renderer/tree-group.tsx | 524 +- .../pane-shell/tree/renderer/tree-node.tsx | 19 +- .../tree-split-cascade-resize.test.tsx | 233 + .../renderer/tree-split-sash-preview.test.tsx | 221 + .../pane-shell/tree/renderer/tree-split.tsx | 378 +- .../pane-shell/tree/resting-presets.test.ts | 157 + .../src/components/pane-shell/tree/store.ts | 609 +- .../pane-shell/tree/tab-key-hint-state.ts | 45 + .../pane-shell/tree/tab-key-hints.test.tsx | 97 + .../pane-shell/tree/tab-key-hints.tsx | 43 + .../pane-shell/tree/tool-pane-toggle.test.ts | 51 + .../tree/zone-editor-split-preview.test.tsx | 209 + .../pane-shell/tree/zone-editor.tsx | 136 +- .../pane-shell/workspace-scope.test.ts | 30 +- .../components/pane-shell/workspace-scope.ts | 27 + .../components/pet/floating-pet-poll.test.ts | 15 - .../src/components/pet/pet-sprite.test.tsx | 36 +- .../desktop/src/components/pet/pet-sprite.tsx | 4 +- .../src/components/pet/roam-behavior.test.ts | 20 - .../src/components/pet/roam-geometry.test.ts | 9 +- .../src/components/pet/use-pet-roam.test.tsx | 4 +- .../src/components/prompt-overlays.test.tsx | 108 +- .../src/components/prompt-overlays.tsx | 370 +- .../prompt-overlays.vault-code.test.tsx | 73 + .../prompt-overlays.vault-save-login.test.tsx | 92 + .../prompt-overlays.vault-unlock.test.tsx | 56 + .../src/components/remote-setup/fields.tsx | 155 + .../src/components/remote-setup/first-run.tsx | 78 + .../use-remote-connection-test.ts | 141 + .../remote-setup/use-remote-oauth.ts | 136 + .../remote-setup/use-remote-probe.ts | 84 + .../remote-setup/use-remote-setup.test.tsx | 161 + .../remote-setup/use-remote-setup.ts | 198 + .../src/components/sync-status-card.test.tsx | 130 + .../src/components/sync-status-card.tsx | 111 + apps/desktop/src/components/sync-status.ts | 82 + apps/desktop/src/components/tips/index.tsx | 1 + .../tips/local-runtime-update-offer.test.tsx | 295 + .../tips/local-runtime-update-offer.ts | 136 + .../components/tips/local-setup-offer.test.ts | 144 + .../src/components/tips/local-setup-offer.ts | 126 + .../src/components/tips/tip-bubble.tsx | 18 +- .../tips/tutorial-lifetime.test.tsx | 131 + .../components/tips/use-tip-rotation.test.tsx | 232 + .../src/components/tips/use-tip-rotation.ts | 60 +- .../ui/__tests__/no-native-title.test.ts | 155 +- .../src/components/ui/actions-menu.test.tsx | 39 + .../src/components/ui/actions-menu.tsx | 10 +- .../src/components/ui/avatar-chip.test.tsx | 29 - apps/desktop/src/components/ui/badge.tsx | 1 + apps/desktop/src/components/ui/button.tsx | 41 +- .../src/components/ui/card-stack.test.tsx | 57 + apps/desktop/src/components/ui/card-stack.tsx | 321 + .../src/components/ui/checkbox.test.tsx | 62 - apps/desktop/src/components/ui/checkbox.tsx | 23 +- apps/desktop/src/components/ui/command.tsx | 104 +- .../src/components/ui/confirm-dialog.tsx | 7 +- .../src/components/ui/connector-card.test.tsx | 268 +- .../src/components/ui/connector-card.tsx | 385 +- .../src/components/ui/connector-logo.tsx | 32 +- .../src/components/ui/copy-button.test.tsx | 36 - .../src/components/ui/decode-text.test.tsx | 54 + .../desktop/src/components/ui/decode-text.tsx | 12 +- .../desktop/src/components/ui/dialog.test.tsx | 84 +- apps/desktop/src/components/ui/dialog.tsx | 40 +- apps/desktop/src/components/ui/diff-count.tsx | 2 +- .../src/components/ui/dropdown-menu.test.tsx | 247 + .../src/components/ui/dropdown-menu.tsx | 313 +- .../src/components/ui/fade-scroll.test.ts | 18 - .../components/ui/fan-menu-tooltip.test.tsx | 55 + .../src/components/ui/fan-menu.test.ts | 56 + apps/desktop/src/components/ui/fan-menu.tsx | 402 + .../src/components/ui/glyph-spinner.test.tsx | 15 - .../src/components/ui/glyph-spinner.tsx | 2 +- .../ui/highlight-matches-model.test.tsx | 23 + .../src/components/ui/highlight-matches.tsx | 16 +- apps/desktop/src/components/ui/input.test.tsx | 45 +- .../src/components/ui/keyboard-first.test.ts | 8 - apps/desktop/src/components/ui/masonry.css | 21 + apps/desktop/src/components/ui/masonry.tsx | 100 + apps/desktop/src/components/ui/menu.ts | 23 + .../src/components/ui/pane-tab.test.tsx | 37 - apps/desktop/src/components/ui/pane-tab.tsx | 73 +- apps/desktop/src/components/ui/popover.tsx | 37 +- .../src/components/ui/profile-glyph.test.tsx | 43 + .../src/components/ui/profile-glyph.tsx | 3 +- apps/desktop/src/components/ui/reel.tsx | 18 + .../src/components/ui/row-button.test.tsx | 27 +- .../components/ui/sandboxed-frame.test.tsx | 99 + .../src/components/ui/sandboxed-frame.tsx | 118 + .../src/components/ui/search-field.tsx | 25 +- apps/desktop/src/components/ui/select.tsx | 49 +- .../src/components/ui/setup-field-list.tsx | 43 + .../src/components/ui/setup-form-dialog.tsx | 112 + apps/desktop/src/components/ui/sidebar.tsx | 4 +- apps/desktop/src/components/ui/slider.tsx | 18 + .../src/components/ui/status-pulse.test.tsx | 6 +- apps/desktop/src/components/ui/switch.tsx | 2 +- .../src/components/ui/tab-dropdown.tsx | 2 +- .../ui/tooltip-pane-layout.test.tsx | 120 + .../components/ui/tooltip-placement.test.tsx | 138 + .../src/components/ui/tooltip-placement.ts | 10 + .../components/ui/tooltip-rail-edge.test.tsx | 90 + apps/desktop/src/components/ui/tooltip.css | 69 + .../src/components/ui/tooltip.test.tsx | 8 - apps/desktop/src/components/ui/tooltip.tsx | 189 +- .../src/components/ui/zoomable.test.tsx | 26 +- apps/desktop/src/components/ui/zoomable.tsx | 2 +- .../src/components/update-status.test.tsx | 208 + apps/desktop/src/components/update-status.tsx | 350 + .../src/components/version-details.test.tsx | 135 + .../src/components/version-details.tsx | 109 + apps/desktop/src/contrib/events.ts | 27 +- apps/desktop/src/contrib/kanban-i18n.test.tsx | 108 + apps/desktop/src/contrib/plugin.test.ts | 21 + apps/desktop/src/contrib/plugin.ts | 80 +- apps/desktop/src/contrib/plugins-store.ts | 4 + apps/desktop/src/contrib/plugins.ts | 6 +- .../src/contrib/radio-artist-links.test.ts | 84 + apps/desktop/src/contrib/radio-plugin.test.ts | 85 + .../src/contrib/runtime-loader.test.ts | 726 +- apps/desktop/src/contrib/runtime-loader.ts | 522 +- apps/desktop/src/global.d.ts | 341 +- .../src/hermes-capability-scope.test.ts | 64 +- apps/desktop/src/hermes-parity.test.ts | 99 +- apps/desktop/src/hermes.test.ts | 247 +- apps/desktop/src/hermes.ts | 12 +- apps/desktop/src/hooks/use-media-image.ts | 121 + apps/desktop/src/hooks/use-mobile.ts | 7 +- apps/desktop/src/i18n/ar.ts | 957 +- apps/desktop/src/i18n/bots-advanced.test.tsx | 130 + apps/desktop/src/i18n/bots-cron.test.tsx | 128 + apps/desktop/src/i18n/bots-editor.test.tsx | 88 + .../src/i18n/catalog-completeness.test.ts | 101 + apps/desktop/src/i18n/catalog.ts | 10 +- apps/desktop/src/i18n/context.test.tsx | 207 +- apps/desktop/src/i18n/context.tsx | 170 +- apps/desktop/src/i18n/de.ts | 6072 ++++++++++++ apps/desktop/src/i18n/define-locale.ts | 40 +- apps/desktop/src/i18n/en.ts | 2419 ++++- apps/desktop/src/i18n/es.ts | 6062 ++++++++++++ apps/desktop/src/i18n/fr.ts | 6082 ++++++++++++ apps/desktop/src/i18n/index.ts | 1 + apps/desktop/src/i18n/intro-de.ts | 119 + apps/desktop/src/i18n/intro-es.ts | 119 + apps/desktop/src/i18n/intro-fr.ts | 119 + apps/desktop/src/i18n/intro-ja.ts | 119 + apps/desktop/src/i18n/intro-zh-hant.ts | 119 + apps/desktop/src/i18n/intro-zh.ts | 119 + apps/desktop/src/i18n/ja.ts | 1230 ++- apps/desktop/src/i18n/languages.test.ts | 42 +- apps/desktop/src/i18n/languages.ts | 106 +- apps/desktop/src/i18n/localized-tab-title.tsx | 20 + apps/desktop/src/i18n/plugin-i18n.test.tsx | 26 + apps/desktop/src/i18n/plugin-i18n.ts | 6 +- apps/desktop/src/i18n/profile-locale.test.tsx | 147 + apps/desktop/src/i18n/profile-provider.tsx | 25 + apps/desktop/src/i18n/ru.ts | 4264 +++++++++ apps/desktop/src/i18n/runtime.test.ts | 40 +- apps/desktop/src/i18n/runtime.ts | 18 +- apps/desktop/src/i18n/types.ts | 1826 +++- apps/desktop/src/i18n/zh-hant.ts | 1509 ++- apps/desktop/src/i18n/zh.ts | 1784 +++- apps/desktop/src/lib/ansi.test.ts | 29 +- apps/desktop/src/lib/ansi.ts | 11 - apps/desktop/src/lib/artifact-detect.test.ts | 15 +- apps/desktop/src/lib/artifact-detect.ts | 6 +- apps/desktop/src/lib/async-report.test.ts | 48 + apps/desktop/src/lib/budgeted-loop.test.ts | 6 +- apps/desktop/src/lib/budgeted-loop.ts | 8 +- apps/desktop/src/lib/catalog-install.test.ts | 53 + ...ages.codex-commentary-reprojection.test.ts | 251 + .../chat-messages.codex-json-sidecar.test.ts | 49 + ...t-messages.codex-sidecar-hydration.test.ts | 74 + ...chat-messages.interim-preservation.test.ts | 251 + apps/desktop/src/lib/chat-messages.test.ts | 270 +- .../chat-messages/competing-contracts.test.ts | 32 + .../desktop/src/lib/chat-messages/coverage.ts | 55 + .../lib/chat-messages/d1-consumers.test.ts | 57 + .../src/lib/chat-messages/hydration.ts | 248 +- apps/desktop/src/lib/chat-messages/index.ts | 3 + .../src/lib/chat-messages/parts.test.ts | 61 + apps/desktop/src/lib/chat-messages/parts.ts | 269 +- .../lib/chat-messages/reconciliation.test.ts | 217 + .../src/lib/chat-messages/reconciliation.ts | 194 +- .../src/lib/chat-messages/tool-parts.ts | 271 +- .../tool-result-preservation.test.ts | 89 + apps/desktop/src/lib/chat-messages/types.ts | 51 +- apps/desktop/src/lib/chat-runtime.test.ts | 160 +- apps/desktop/src/lib/chat-runtime.ts | 148 +- apps/desktop/src/lib/cloud-agent-session.ts | 74 + apps/desktop/src/lib/code-skew-error.test.ts | 22 + apps/desktop/src/lib/code-skew-error.ts | 12 + .../lib/commit-changelog-localization.test.ts | 27 + apps/desktop/src/lib/commit-changelog.test.ts | 5 +- apps/desktop/src/lib/commit-changelog.ts | 17 +- apps/desktop/src/lib/completion-poll.test.ts | 54 + apps/desktop/src/lib/completion-poll.ts | 41 + .../src/lib/composer-input-sanitize.test.ts | 4 - .../src/lib/confab-notice-hydration.test.ts | 133 - apps/desktop/src/lib/connection-scoped.ts | 3 +- apps/desktop/src/lib/connector-tools.ts | 195 + apps/desktop/src/lib/deeplink-routes.test.ts | 89 + apps/desktop/src/lib/deeplink-routes.ts | 36 +- apps/desktop/src/lib/desktop-fs.test.ts | 18 + apps/desktop/src/lib/desktop-fs.ts | 17 +- apps/desktop/src/lib/desktop-git.test.ts | 13 - apps/desktop/src/lib/desktop-git.ts | 4 - .../src/lib/desktop-remote-auth.test.ts | 5 +- .../src/lib/desktop-slash-commands.test.ts | 224 +- .../desktop/src/lib/desktop-slash-commands.ts | 188 +- .../src/lib/desktop-slash-registry.json | 129 + apps/desktop/src/lib/desktop-toolsets.test.ts | 17 - apps/desktop/src/lib/distribution-label.ts | 91 + apps/desktop/src/lib/docs.ts | 7 + apps/desktop/src/lib/draft-title.ts | 2 +- apps/desktop/src/lib/embedded-images.test.ts | 4 +- apps/desktop/src/lib/embedded-images.ts | 11 +- .../src/lib/error-surface-copy.test.ts | 54 + apps/desktop/src/lib/error-surface-copy.ts | 57 + apps/desktop/src/lib/error-surface.test.ts | 159 +- apps/desktop/src/lib/error-surface.ts | 255 +- apps/desktop/src/lib/external-link.test.tsx | 72 +- apps/desktop/src/lib/external-link.tsx | 26 +- .../src/lib/file-preview-math.render.test.tsx | 23 +- .../src/lib/find-in-page-scope.test.ts | 13 - apps/desktop/src/lib/find-in-page.ts | 11 +- apps/desktop/src/lib/format.ts | 24 - apps/desktop/src/lib/gateway-events.test.ts | 187 +- apps/desktop/src/lib/gateway-events.ts | 150 +- .../src/lib/gateway-liveness-policy.test.ts | 13 +- .../src/lib/gateway-liveness-policy.ts | 3 + apps/desktop/src/lib/gateway-rpc.test.ts | 9 +- apps/desktop/src/lib/gateway-rpc.ts | 17 +- apps/desktop/src/lib/gateway-ws-url.test.ts | 75 + apps/desktop/src/lib/gateway-ws-url.ts | 21 + apps/desktop/src/lib/generated-images.test.ts | 12 +- apps/desktop/src/lib/generated-images.ts | 42 +- .../src/lib/guarded-model-switch.test.tsx | 67 + apps/desktop/src/lib/guarded-model-switch.ts | 95 +- .../src/lib/hermes-open-target.test.ts | 1 + apps/desktop/src/lib/hermes-open-target.ts | 3 +- apps/desktop/src/lib/icons.ts | 10 + apps/desktop/src/lib/image-resize.ts | 2 +- apps/desktop/src/lib/ime.test.ts | 44 + apps/desktop/src/lib/ime.ts | 43 + .../src/lib/inflight-turn-journal.test.ts | 65 +- apps/desktop/src/lib/inflight-turn-journal.ts | 180 +- .../lib/json-rpc-gateway-heartbeat.test.ts | 5 +- .../lib/json-rpc-gateway-url-guard.test.ts | 3 +- apps/desktop/src/lib/keybinds/actions.test.ts | 85 +- apps/desktop/src/lib/keybinds/actions.ts | 41 +- .../desktop/src/lib/keybinds/approval-keys.ts | 95 + apps/desktop/src/lib/keybinds/combo.test.ts | 162 +- apps/desktop/src/lib/keybinds/combo.ts | 29 +- .../lib/keybinds/composer-focus-keys.test.ts | 70 +- .../src/lib/keybinds/composer-focus-keys.ts | 62 +- .../lib/keybinds/contributed-actions.test.ts | 12 +- .../src/lib/layout-persistence.test.ts | 85 + apps/desktop/src/lib/layout-persistence.ts | 170 + apps/desktop/src/lib/listing-embed.test.ts | 108 + apps/desktop/src/lib/listing-embed.ts | 256 + apps/desktop/src/lib/local-preview.test.ts | 32 + apps/desktop/src/lib/local-preview.ts | 49 +- .../lib/markdown-preprocess.autolink.test.ts | 122 + .../markdown-preprocess.directives.test.ts | 65 + .../lib/markdown-preprocess.reasoning.test.ts | 24 + apps/desktop/src/lib/markdown-preprocess.ts | 277 +- .../src/lib/markdown-whitespace.test.ts | 42 + apps/desktop/src/lib/mcp-brands.tsx | 29 + apps/desktop/src/lib/mcp-cost.test.ts | 6 +- .../src/lib/mcp-dashboard-oauth.test.ts | 201 +- apps/desktop/src/lib/mcp-dashboard-oauth.ts | 243 +- apps/desktop/src/lib/mcp-directory.ts | 189 - apps/desktop/src/lib/mcp-enabled-cases.json | 22 + apps/desktop/src/lib/mcp-import.ts | 119 +- apps/desktop/src/lib/mcp-probe-cache.test.ts | 8 +- apps/desktop/src/lib/mcp-servers.test.ts | 11 +- apps/desktop/src/lib/mcp-servers.ts | 13 + apps/desktop/src/lib/mcp-tool-filter.test.ts | 39 +- apps/desktop/src/lib/mcp-tool-filter.ts | 52 +- apps/desktop/src/lib/media-dimensions.test.ts | 77 + .../src/lib/media-file-download.test.ts | 89 + apps/desktop/src/lib/media.remote.test.ts | 24 +- apps/desktop/src/lib/media.ts | 207 +- apps/desktop/src/lib/mic-meter-context.ts | 33 + apps/desktop/src/lib/model-options.test.ts | 135 +- apps/desktop/src/lib/model-options.ts | 168 +- .../src/lib/model-picker-owner.test.ts | 46 + apps/desktop/src/lib/model-picker-owner.ts | 39 + apps/desktop/src/lib/model-search-text.ts | 33 - .../src/lib/model-status-label.test.ts | 64 +- apps/desktop/src/lib/model-status-label.ts | 97 +- apps/desktop/src/lib/onboarding-enabled.ts | 4 + .../lib/onboarding-recommendations.test.ts | 81 + .../src/lib/onboarding-recommendations.ts | 84 + apps/desktop/src/lib/path-compare.test.ts | 12 +- apps/desktop/src/lib/path-compare.ts | 4 + apps/desktop/src/lib/plugin-catalog.ts | 98 + .../src/lib/preview-act/watch-in-page.test.ts | 163 - .../desktop/src/lib/preview-annotate/flush.ts | 41 + .../src/lib/preview-annotate/group.test.ts | 165 + .../desktop/src/lib/preview-annotate/group.ts | 170 + .../src/lib/preview-annotate/identity.ts | 92 + .../src/lib/preview-annotate/in-page.test.ts | 295 + .../src/lib/preview-annotate/in-page.ts | 849 ++ .../desktop/src/lib/preview-annotate/index.ts | 52 + .../src/lib/preview-annotate/pack.test.ts | 261 + apps/desktop/src/lib/preview-annotate/pack.ts | 158 + .../src/lib/preview-annotate/stack.test.ts | 104 + .../desktop/src/lib/preview-annotate/stack.ts | 100 + .../src/lib/preview-annotate/tokens.ts | 61 + apps/desktop/src/lib/preview-external.ts | 26 + .../src/lib/preview-markdown-links.test.ts | 114 + .../desktop/src/lib/preview-markdown-links.ts | 174 + apps/desktop/src/lib/preview-targets.test.ts | 22 +- apps/desktop/src/lib/preview-targets.ts | 59 +- apps/desktop/src/lib/profile-order.ts | 17 + apps/desktop/src/lib/profile-short-label.ts | 12 + apps/desktop/src/lib/query-client.ts | 1 + apps/desktop/src/lib/reasoning-blocks.test.ts | 38 + apps/desktop/src/lib/reasoning-blocks.ts | 8 +- apps/desktop/src/lib/reasoning-effort.test.ts | 26 +- apps/desktop/src/lib/reasoning-effort.ts | 50 +- apps/desktop/src/lib/reasoning-slash.test.ts | 36 + apps/desktop/src/lib/reasoning-slash.ts | 53 + .../desktop/src/lib/reconnect-backoff.test.ts | 92 - apps/desktop/src/lib/reconnect-backoff.ts | 45 - .../src/lib/renderer-loop-pause.test.ts | 4 +- apps/desktop/src/lib/renderer-loop-pause.ts | 9 +- .../desktop/src/lib/runtime-readiness.test.ts | 29 +- apps/desktop/src/lib/runtime-readiness.ts | 38 + .../src/lib/session-branch-tree.test.ts | 65 + apps/desktop/src/lib/session-branch-tree.ts | 63 +- .../src/lib/session-date-groups.test.ts | 68 +- apps/desktop/src/lib/session-date-groups.ts | 36 +- apps/desktop/src/lib/session-project-label.ts | 3 +- apps/desktop/src/lib/session-row-slots.ts | 40 + .../src/lib/session-signatures.test.ts | 6 - apps/desktop/src/lib/session-source.test.ts | 6 +- apps/desktop/src/lib/session-source.ts | 3 +- .../src/lib/session-timer-since.test.ts | 70 + apps/desktop/src/lib/session-timer-since.ts | 50 + .../src/lib/shared-gateway-restart.test.ts | 23 + .../desktop/src/lib/shared-gateway-restart.ts | 23 + apps/desktop/src/lib/sibling-ws-url.test.ts | 55 + apps/desktop/src/lib/sibling-ws-url.ts | 99 + apps/desktop/src/lib/speech-text.test.ts | 170 +- apps/desktop/src/lib/speech-text.ts | 131 +- apps/desktop/src/lib/spoken-reply.test.ts | 51 + apps/desktop/src/lib/spoken-reply.ts | 114 +- .../desktop/src/lib/stale-transcript-guard.ts | 85 + apps/desktop/src/lib/statusbar.test.ts | 17 + apps/desktop/src/lib/statusbar.tsx | 22 +- .../desktop/src/lib/summarize-command.test.ts | 29 - apps/desktop/src/lib/text.ts | 16 + apps/desktop/src/lib/tips/catalog.ts | 4 +- apps/desktop/src/lib/tips/local-cta.test.ts | 86 + apps/desktop/src/lib/tips/local-cta.ts | 55 + apps/desktop/src/lib/tips/rotation.test.ts | 23 + apps/desktop/src/lib/tips/rotation.ts | 25 +- apps/desktop/src/lib/todos.ts | 6 +- apps/desktop/src/lib/tool-render-class.ts | 17 +- apps/desktop/src/lib/tool-result-metadata.ts | 41 + .../src/lib/tool-result-summary.test.ts | 10 + apps/desktop/src/lib/tool-result-summary.ts | 19 +- apps/desktop/src/lib/tour/app-tour.css | 63 + apps/desktop/src/lib/tour/engine.test.ts | 19 +- apps/desktop/src/lib/tour/engine.ts | 6 +- apps/desktop/src/lib/transcript-directives.ts | 103 +- .../src/lib/transcript-occurrences.test.ts | 171 + apps/desktop/src/lib/tts-lease.test.ts | 99 + apps/desktop/src/lib/tts-lease.ts | 76 + apps/desktop/src/lib/update-copy.test.ts | 59 +- apps/desktop/src/lib/update-copy.ts | 48 +- .../src/lib/use-enter-animation.test.tsx | 26 +- apps/desktop/src/lib/use-enter-animation.ts | 32 +- apps/desktop/src/lib/version-label.test.ts | 12 + apps/desktop/src/lib/version-label.ts | 10 + apps/desktop/src/lib/version-status.test.ts | 48 +- apps/desktop/src/lib/version-status.ts | 41 +- apps/desktop/src/lib/voice-barge-in.test.ts | 111 + apps/desktop/src/lib/voice-barge-in.ts | 47 +- .../src/lib/voice-client-direct.test.ts | 101 +- apps/desktop/src/lib/voice-client-direct.ts | 122 +- .../src/lib/voice-live.routing.test.ts | 88 + apps/desktop/src/lib/voice-live.ts | 542 ++ .../src/lib/voice-playback.routing.test.ts | 14 + .../src/lib/voice-playback.same-turn.test.ts | 101 + apps/desktop/src/lib/voice-playback.ts | 79 +- apps/desktop/src/lib/voice-stop-word.test.ts | 42 +- apps/desktop/src/lib/voice-stop-word.ts | 51 +- apps/desktop/src/lib/wake-indicator.test.ts | 13 - apps/desktop/src/lib/wake-sound.test.ts | 14 - apps/desktop/src/main.tsx | 29 +- apps/desktop/src/pairing-scope.test.ts | 13 +- apps/desktop/src/plugins/README.md | 2 +- apps/desktop/src/plugins/accent/picker.tsx | 325 - apps/desktop/src/plugins/accent/plugin.tsx | 70 - .../plugins/hermes-bots/avatar-image.test.ts | 26 + .../src/plugins/hermes-bots/avatar-image.ts | 22 +- .../src/plugins/hermes-bots/avatar-picker.tsx | 17 +- .../hermes-bots/avatar.face-clock.test.ts | 27 - .../src/plugins/hermes-bots/avatar.test.tsx | 31 - .../src/plugins/hermes-bots/avatar.tsx | 67 +- .../bot-open-focus-identity.test.ts | 1 + .../bot-row-keeps-closed-chat.test.ts | 191 - .../bot-row-opens-canonical-chat.test.ts | 167 + .../src/plugins/hermes-bots/bot-row.test.tsx | 66 +- .../src/plugins/hermes-bots/bot-row.tsx | 254 +- .../src/plugins/hermes-bots/bot-state.ts | 9 +- .../canonical-chat-creation.test.ts | 5 +- .../canonical-chat-open-failure-toast.test.ts | 101 + .../canonical-chat-registry.test.ts | 44 +- .../src/plugins/hermes-bots/canonical-chat.ts | 141 +- .../cold-bot-switch-pending.test.ts | 163 + .../hermes-bots/cold-bot-switch-row.test.tsx | 59 + .../create-agent-lazy-profile.test.tsx | 154 +- .../src/plugins/hermes-bots/create-dialog.tsx | 180 +- .../hermes-bots/cron-create-dialog.test.tsx | 11 - .../plugins/hermes-bots/cron-detail.test.tsx | 32 +- .../hermes-bots/cron-rpc-error.test.ts | 16 - .../hermes-bots/cron-selected-bot.test.ts | 2 +- apps/desktop/src/plugins/hermes-bots/cron.tsx | 149 +- .../hermes-bots/cross-connection-bots.test.ts | 45 +- .../plugins/hermes-bots/data.bot-meta.test.ts | 31 + .../plugins/hermes-bots/data.identity.test.ts | 23 +- .../plugins/hermes-bots/data.roster.test.tsx | 36 + apps/desktop/src/plugins/hermes-bots/data.ts | 241 +- .../hermes-bots/edit-profile-dialog.tsx | 12 +- .../hermes-bots/group-activity.test.ts | 136 +- .../src/plugins/hermes-bots/group-activity.ts | 80 +- .../plugins/hermes-bots/group-attachments.ts | 4 +- .../hermes-bots/group-bot-handoff.test.ts | 28 +- .../hermes-bots/group-chat-parts.test.tsx | 39 +- .../plugins/hermes-bots/group-chat-parts.tsx | 56 +- .../hermes-bots/group-chat-timeline.test.tsx | 75 + .../group-chat-view-members.test.ts | 191 + .../hermes-bots/group-chat-view-members.tsx | 241 + .../group-chat-view.inline-code.test.tsx | 86 + .../group-chat-view.render.test.tsx | 118 + .../hermes-bots/group-chat-view.test.ts | 39 + .../plugins/hermes-bots/group-chat-view.tsx | 465 +- .../plugins/hermes-bots/group-chat.test.ts | 315 +- .../src/plugins/hermes-bots/group-chat.ts | 438 +- .../hermes-bots/group-compress.test.tsx | 145 + .../src/plugins/hermes-bots/group-compress.ts | 115 + .../hermes-bots/group-external-writes.test.ts | 184 + .../hermes-bots/group-external-writes.ts | 238 + .../hermes-bots/group-hold-status.test.tsx | 171 + .../plugins/hermes-bots/group-hold-status.tsx | 60 + .../hermes-bots/group-membership.test.ts | 53 + .../plugins/hermes-bots/group-membership.ts | 135 +- .../hermes-bots/group-mention-text.test.tsx | 56 + .../hermes-bots/group-mention-text.tsx | 105 + .../plugins/hermes-bots/group-order.test.ts | 45 + .../src/plugins/hermes-bots/group-order.ts | 47 + .../src/plugins/hermes-bots/group-pin.test.ts | 63 + .../src/plugins/hermes-bots/group-pin.ts | 21 + .../src/plugins/hermes-bots/group-presence.ts | 15 + .../hermes-bots/group-round-members.ts | 347 + .../plugins/hermes-bots/group-round-prompt.ts | 179 + .../group-rounds.primary-alias.test.ts | 73 + .../plugins/hermes-bots/group-rounds.test.ts | 784 +- .../src/plugins/hermes-bots/group-rounds.ts | 846 +- .../plugins/hermes-bots/group-slash.test.ts | 95 + .../src/plugins/hermes-bots/group-slash.ts | 18 + .../plugins/hermes-bots/group-test-utils.ts | 46 +- .../plugins/hermes-bots/group-turns.test.ts | 1015 +- .../src/plugins/hermes-bots/group-turns.ts | 1273 ++- .../hermes-bots/hide-bot-chats.test.ts | 48 +- .../plugins/hermes-bots/i18n-test-helper.ts | 28 +- .../src/plugins/hermes-bots/i18n.test.ts | 70 - apps/desktop/src/plugins/hermes-bots/i18n.ts | 1173 ++- .../hermes-bots/labels.profile-name.test.ts | 36 + .../desktop/src/plugins/hermes-bots/labels.ts | 46 +- .../hermes-bots/legacy-sdk-compat.test.ts | 16 +- .../src/plugins/hermes-bots/mcp-setup.tsx | 225 +- .../plugins/hermes-bots/model-picker.test.tsx | 5 + .../src/plugins/hermes-bots/model-picker.tsx | 38 +- .../src/plugins/hermes-bots/pet.test.tsx | 159 +- apps/desktop/src/plugins/hermes-bots/pet.tsx | 111 +- .../plugins/hermes-bots/plugin-panes.test.tsx | 100 +- .../hermes-bots/plugin.mentions.test.ts | 222 +- .../src/plugins/hermes-bots/plugin.tsx | 168 +- .../profile-config-capabilities.test.tsx | 72 +- .../hermes-bots/profile-config.test.ts | 7 +- .../plugins/hermes-bots/profile-config.tsx | 73 +- .../plugins/hermes-bots/profile-ops.test.ts | 97 +- .../src/plugins/hermes-bots/profile-ops.ts | 77 +- .../hermes-bots/recent-session.test.ts | 76 + .../src/plugins/hermes-bots/recent-session.ts | 79 + .../hermes-bots/relay-deliver-budget.test.ts | 28 +- .../src/plugins/hermes-bots/relay.test.ts | 423 +- apps/desktop/src/plugins/hermes-bots/relay.ts | 353 +- .../hermes-bots/roster-actions.test.ts | 33 + .../src/plugins/hermes-bots/roster-actions.ts | 175 +- .../hermes-bots/roster-pane-content.tsx | 178 + .../hermes-bots/roster-pane-derivation.ts | 237 + .../hermes-bots/roster-pane-dialogs.tsx | 164 + .../hermes-bots/roster-pane-groups.tsx | 81 + .../roster-pane-lifecycle.test.tsx | 124 + .../hermes-bots/roster-pane-lifecycle.ts | 60 + .../hermes-bots/roster-pane-sections.tsx | 209 + .../hermes-bots/roster-pane-toolbar.tsx | 236 + .../src/plugins/hermes-bots/roster-pane.tsx | 875 +- .../plugins/hermes-bots/roster-sections.tsx | 28 +- .../src/plugins/hermes-bots/routing.test.ts | 56 +- .../src/plugins/hermes-bots/routing.ts | 69 +- .../plugins/hermes-bots/row-helpers.test.ts | 46 +- .../src/plugins/hermes-bots/row-helpers.ts | 66 +- .../hermes-bots/screen-autoraise.test.ts | 84 + .../plugins/hermes-bots/screen-autoraise.ts | 164 + .../hermes-bots/screen-connection.test.ts | 88 + .../plugins/hermes-bots/screen-connection.ts | 174 + .../src/plugins/hermes-bots/screen-hero.tsx | 191 + .../screen-install-retention.test.tsx | 137 + .../plugins/hermes-bots/screen-install.tsx | 144 + .../hermes-bots/screen-isolation.test.tsx | 222 + .../src/plugins/hermes-bots/screen-open.tsx | 49 + .../screen-pane-lifecycle.test.tsx | 261 + .../screen-pane-status-events.test.tsx | 123 + .../src/plugins/hermes-bots/screen-pane.tsx | 484 + .../screen-portal-status-request.test.tsx | 92 + .../src/plugins/hermes-bots/screen-portal.tsx | 240 + .../plugins/hermes-bots/screen-state.test.ts | 85 + .../src/plugins/hermes-bots/screen-state.ts | 114 + .../screen-viewer-identity.test.tsx | 177 + .../src/plugins/hermes-bots/session-sweep.ts | 77 +- .../desktop/src/plugins/hermes-bots/shared.ts | 10 +- .../hermes-bots/skills-hub-picker.test.tsx | 71 +- .../src/plugins/hermes-bots/skills-hub.tsx | 57 +- .../src/plugins/hermes-bots/soul.test.ts | 15 - apps/desktop/src/plugins/hermes-bots/types.ts | 75 +- .../hermes-bots/user-sections-ui.test.tsx | 74 + .../plugins/hermes-bots/user-sections-ui.tsx | 345 + .../hermes-bots/user-sections.groups.test.ts | 126 + .../plugins/hermes-bots/user-sections.test.ts | 276 + .../src/plugins/hermes-bots/user-sections.ts | 426 + .../kanban/api.connection-scope.test.ts | 130 + .../plugins/kanban/api.events-cursor.test.ts | 148 + apps/desktop/src/plugins/kanban/api.ts | 224 +- .../plugins/kanban/board-switcher.test.tsx | 14 +- .../src/plugins/kanban/board-switcher.tsx | 57 +- apps/desktop/src/plugins/kanban/board.tsx | 63 +- .../plugins/kanban/completion-notify.test.ts | 54 +- .../src/plugins/kanban/completion-notify.ts | 15 +- .../src/plugins/kanban/drawer.test.tsx | 358 + apps/desktop/src/plugins/kanban/drawer.tsx | 834 +- apps/desktop/src/plugins/kanban/i18n.ts | 37 +- .../plugins/kanban/model-override.test.tsx | 6 - .../src/plugins/kanban/orchestration.tsx | 17 +- apps/desktop/src/plugins/kanban/plugin.tsx | 93 +- apps/desktop/src/plugins/kanban/types.ts | 16 +- apps/desktop/src/plugins/kanban/ui.tsx | 21 +- apps/desktop/src/plugins/radio/README.md | 62 + apps/desktop/src/plugins/radio/plugin.js | 653 ++ apps/desktop/src/sdk/bridge.test.ts | 64 + apps/desktop/src/sdk/bridge.ts | 73 + apps/desktop/src/sdk/composer.ts | 144 + apps/desktop/src/sdk/host-state.test.ts | 29 - apps/desktop/src/sdk/index.test.ts | 282 +- apps/desktop/src/sdk/index.ts | 475 +- apps/desktop/src/sdk/profile-routing.test.ts | 355 +- apps/desktop/src/sdk/runtime.ts | 34 +- apps/desktop/src/sdk/sessions.ts | 79 + apps/desktop/src/sdk/settings.test.ts | 116 + apps/desktop/src/sdk/settings.ts | 90 + apps/desktop/src/store/active-work.test.ts | 10 - apps/desktop/src/store/agent-notices.test.ts | 39 - apps/desktop/src/store/agent-plugins.test.ts | 115 + apps/desktop/src/store/agent-plugins.ts | 310 +- apps/desktop/src/store/artifacts.test.ts | 4 +- .../src/store/background-delegation.test.ts | 87 +- .../src/store/background-delegation.ts | 51 +- apps/desktop/src/store/billing-block.test.ts | 20 - apps/desktop/src/store/bot-chat-scope.test.ts | 15 - apps/desktop/src/store/clarify.test.ts | 19 +- apps/desktop/src/store/clarify.ts | 13 +- apps/desktop/src/store/coding-status.ts | 10 +- apps/desktop/src/store/compaction.test.ts | 19 +- apps/desktop/src/store/compaction.ts | 23 +- .../src/store/composer-input-history.test.ts | 12 - .../store/composer-popout-preference.test.ts | 27 +- .../desktop/src/store/composer-popout.test.ts | 62 +- apps/desktop/src/store/composer-popout.ts | 260 +- apps/desktop/src/store/composer-queue.test.ts | 184 +- apps/desktop/src/store/composer-queue.ts | 84 +- .../src/store/composer-status-drawer.test.ts | 42 + .../src/store/composer-status-drawer.ts | 100 + .../desktop/src/store/composer-status.test.ts | 73 +- apps/desktop/src/store/composer-status.ts | 107 +- .../src/store/composer-suggestions.test.ts | 20 - apps/desktop/src/store/composer.test.ts | 99 +- apps/desktop/src/store/composer.ts | 207 +- apps/desktop/src/store/confirm.ts | 48 +- .../src/store/connection-registry-state.ts | 6 +- .../src/store/connection-request.test.ts | 217 + apps/desktop/src/store/connection-request.ts | 431 + apps/desktop/src/store/connections.test.ts | 150 +- apps/desktop/src/store/connections.ts | 130 +- apps/desktop/src/store/connector-catalog.ts | 88 + .../src/store/cron-model-impact-scope.test.ts | 50 - .../src/store/cron-model-impact-scope.ts | 63 - .../src/store/cron-model-impact.test.ts | 290 - apps/desktop/src/store/cron-model-impact.ts | 262 - apps/desktop/src/store/custom-models.test.ts | 36 + apps/desktop/src/store/custom-models.ts | 156 + .../src/store/default-profile-startup.test.ts | 138 + .../desktop/src/store/default-profile.test.ts | 68 + apps/desktop/src/store/default-profile.ts | 58 + .../desktop/src/store/display-toggles.test.ts | 51 + apps/desktop/src/store/display-toggles.ts | 68 + apps/desktop/src/store/external-links.test.ts | 29 + apps/desktop/src/store/external-links.ts | 34 + apps/desktop/src/store/file-actions.test.ts | 37 +- apps/desktop/src/store/file-actions.ts | 30 +- apps/desktop/src/store/find-in-page.ts | 16 +- apps/desktop/src/store/fleet-roster.test.ts | 85 + apps/desktop/src/store/fleet-roster.ts | 20 +- .../src/store/free-tier-setup-failure.test.ts | 89 + .../src/store/free-tier-sign-in.test.ts | 109 + apps/desktop/src/store/free-tier-sign-in.ts | 339 + apps/desktop/src/store/free-tier.ts | 206 + .../gateway-activation-prune-lease.test.ts | 34 +- .../gateway-connection-lifecycle.test.ts | 638 +- .../store/gateway-connection-scope.test.ts | 20 +- .../gateway-foreground-retention.test.ts | 26 +- ...way-profile-only-owner.integration.test.ts | 194 + .../src/store/gateway-profile-request.test.ts | 267 +- .../src/store/gateway-reconnect.test.ts | 2 +- apps/desktop/src/store/gateway-reconnect.ts | 11 + .../src/store/gateway-relay-retention.test.ts | 11 - .../src/store/gateway-spawn-priority.test.ts | 184 + apps/desktop/src/store/gateway-switch.test.ts | 51 + apps/desktop/src/store/gateway-switch.ts | 30 +- apps/desktop/src/store/gateway.test.ts | 140 +- apps/desktop/src/store/gateway.ts | 899 +- apps/desktop/src/store/goals.test.ts | 54 +- apps/desktop/src/store/goals.ts | 20 +- apps/desktop/src/store/guide-opening.test.ts | 49 + .../src/store/hub-actions.blocked.test.ts | 75 + apps/desktop/src/store/hub-actions.ts | 116 +- apps/desktop/src/store/hud.test.ts | 20 +- apps/desktop/src/store/interface-mode.test.ts | 170 + apps/desktop/src/store/interface-mode.ts | 249 + apps/desktop/src/store/intro-reveal.ts | 95 + .../src/store/kanban-connection-scope.test.ts | 166 + apps/desktop/src/store/keybinds.test.ts | 87 + apps/desktop/src/store/keybinds.ts | 42 +- .../store/layout-dismissed-projects.test.ts | 5 - .../src/store/layout-flipped-sides.test.ts | 42 + .../src/store/layout-pinned-order.test.ts | 8 - .../src/store/layout-sidebar-view.test.ts | 41 +- apps/desktop/src/store/layout.ts | 124 +- apps/desktop/src/store/live-sync.ts | 15 + apps/desktop/src/store/local-models-flag.ts | 14 + .../src/store/local-models-surfaces.test.tsx | 438 + .../src/store/local-runtime-jobs.test.ts | 236 + apps/desktop/src/store/local-runtime-jobs.ts | 497 + apps/desktop/src/store/machine.ts | 139 + .../desktop/src/store/managed-updates.test.ts | 11 - apps/desktop/src/store/mcp-health.test.ts | 236 +- apps/desktop/src/store/mcp-health.ts | 135 +- apps/desktop/src/store/mcp-setup.ts | 118 - apps/desktop/src/store/model-assignment.ts | 83 + apps/desktop/src/store/model-presets.test.ts | 6 +- .../src/store/model-visibility.test.ts | 51 +- apps/desktop/src/store/model-visibility.ts | 114 +- .../src/store/native-notifications.test.ts | 77 +- .../desktop/src/store/native-notifications.ts | 81 +- apps/desktop/src/store/notifications.test.ts | 116 +- apps/desktop/src/store/notifications.ts | 138 +- apps/desktop/src/store/onboarding-answers.ts | 77 + .../src/store/onboarding-capabilities.test.ts | 62 + .../src/store/onboarding-capabilities.ts | 36 + .../desktop/src/store/onboarding-gate.test.ts | 74 + apps/desktop/src/store/onboarding-gate.ts | 201 + .../onboarding-never-forces-sign-in.test.ts | 68 + .../src/store/onboarding-owner.test.ts | 218 + .../store/onboarding-plugin-outcomes.test.ts | 65 + .../src/store/onboarding-plugin-outcomes.ts | 60 + apps/desktop/src/store/onboarding-plugins.ts | 63 + apps/desktop/src/store/onboarding-presence.ts | 36 + apps/desktop/src/store/onboarding-scope.ts | 55 + apps/desktop/src/store/onboarding-script.ts | 237 + apps/desktop/src/store/onboarding.test.ts | 267 +- apps/desktop/src/store/onboarding.ts | 408 +- apps/desktop/src/store/pane-focus.test.ts | 42 - apps/desktop/src/store/pane-focus.ts | 17 + apps/desktop/src/store/panes.test.ts | 24 - apps/desktop/src/store/panes.ts | 62 +- apps/desktop/src/store/pet-generate.ts | 43 +- apps/desktop/src/store/pet-overlay.ts | 14 +- apps/desktop/src/store/pet.test.ts | 54 +- apps/desktop/src/store/pet.ts | 21 +- .../src/store/plugin-catalog-install.test.ts | 104 + .../src/store/plugin-catalog-install.ts | 61 + .../src/store/plugin-install-request.ts | 9 + apps/desktop/src/store/pool-limits.ts | 89 + apps/desktop/src/store/preview-explicit.ts | 69 + .../store/preview-status-edge-cases.test.ts | 49 + .../store/preview-status-lifecycle.test.ts | 65 + apps/desktop/src/store/preview-status.test.ts | 41 +- apps/desktop/src/store/preview-status.ts | 354 +- .../src/store/preview-tabs-scope.test.ts | 80 + apps/desktop/src/store/preview.test.ts | 135 +- apps/desktop/src/store/preview.ts | 238 +- .../store/profile-agent-activation.test.ts | 87 +- apps/desktop/src/store/profile-cache.test.ts | 138 + .../src/store/profile-dot-state.test.ts | 183 + apps/desktop/src/store/profile-dot-state.ts | 274 + apps/desktop/src/store/profile-rail-prefs.ts | 18 + .../src/store/profile-remote-override.test.ts | 11 - .../src/store/profile-select-source.test.ts | 2 + .../src/store/profile-switch-failure.test.ts | 2 + apps/desktop/src/store/profile.test.ts | 135 +- apps/desktop/src/store/profile.ts | 279 +- apps/desktop/src/store/project-scope.ts | 26 + apps/desktop/src/store/projects.test.ts | 224 +- apps/desktop/src/store/projects.ts | 324 +- apps/desktop/src/store/prompts.test.ts | 284 +- apps/desktop/src/store/prompts.ts | 380 +- apps/desktop/src/store/provider-wait.test.ts | 73 + apps/desktop/src/store/provider-wait.ts | 41 +- apps/desktop/src/store/quick-entry.test.ts | 32 - apps/desktop/src/store/reactions-enabled.ts | 20 +- apps/desktop/src/store/reactions.test.ts | 9 +- apps/desktop/src/store/reactions.ts | 20 +- .../desktop/src/store/real-profile-consent.ts | 34 + .../desktop/src/store/reasoning-disclosure.ts | 23 +- apps/desktop/src/store/recovery-requests.ts | 35 + apps/desktop/src/store/review.test.ts | 102 +- apps/desktop/src/store/review.ts | 7 +- apps/desktop/src/store/route-tiles.ts | 2 +- apps/desktop/src/store/runtime-gone.test.ts | 235 + apps/desktop/src/store/runtime-gone.ts | 149 + .../src/store/send-diagnostics.test.ts | 7 - apps/desktop/src/store/server-requests.ts | 46 + apps/desktop/src/store/session-color.test.ts | 9 - apps/desktop/src/store/session-color.ts | 16 +- .../desktop/src/store/session-control.test.ts | 472 + apps/desktop/src/store/session-control.ts | 872 ++ .../src/store/session-event-provenance.ts | 31 + apps/desktop/src/store/session-focus.ts | 46 + apps/desktop/src/store/session-gone-latch.ts | 130 + .../src/store/session-pane-focus.test.ts | 104 + .../src/store/session-pin-sync.test.ts | 51 +- apps/desktop/src/store/session-pin-sync.ts | 33 +- .../desktop/src/store/session-removal.test.ts | 80 + apps/desktop/src/store/session-removal.ts | 95 + .../src/store/session-request-router.test.ts | 67 +- .../src/store/session-request-router.ts | 22 +- .../src/store/session-sidebar-focus.test.ts | 88 + .../session-states-foreground-scopes.test.ts | 19 + .../session-states-profile-rename.test.ts | 75 + .../store/session-states-reconnect.test.ts | 33 + .../store/session-states-runtime-map.test.ts | 186 +- apps/desktop/src/store/session-states.test.ts | 492 +- apps/desktop/src/store/session-states.ts | 900 +- .../src/store/session-unread-tile.test.ts | 48 +- .../src/store/session-watchdog.test.ts | 253 +- apps/desktop/src/store/session.test.ts | 338 +- apps/desktop/src/store/session.ts | 521 +- apps/desktop/src/store/settings-scope.test.ts | 76 +- apps/desktop/src/store/settings-scope.ts | 39 +- .../desktop/src/store/sidebar-archive.test.ts | 26 + apps/desktop/src/store/sidebar-archive.ts | 3 +- .../sidebar-collapse-persistence.test.ts | 107 + apps/desktop/src/store/sidebar-nav.test.ts | 55 + apps/desktop/src/store/sidebar-nav.ts | 86 + .../src/store/skill-deeplink-install.test.ts | 105 + .../src/store/skill-deeplink-install.ts | 64 + .../desktop/src/store/statusbar-prefs.test.ts | 61 + apps/desktop/src/store/statusbar-prefs.ts | 60 +- .../src/store/subagent-snapshot.test.ts | 31 + apps/desktop/src/store/subagents.test.ts | 54 +- apps/desktop/src/store/subagents.ts | 92 +- .../store/suggestion-providers/mcp.test.ts | 32 +- .../src/store/suggestion-providers/mcp.ts | 71 +- .../src/store/suggestion-providers/repair.ts | 8 +- apps/desktop/src/store/system-actions.ts | 84 +- .../store/terminal-backend-warning.test.ts | 61 + .../src/store/terminal-backend-warning.ts | 60 + apps/desktop/src/store/text-direction.ts | 45 + .../src/store/thread-scroll-restore.test.ts | 58 + apps/desktop/src/store/thread-scroll.test.ts | 132 + apps/desktop/src/store/thread-scroll.ts | 372 +- .../desktop/src/store/thread-timeline.test.ts | 28 + apps/desktop/src/store/thread-timeline.ts | 14 + apps/desktop/src/store/tips.test.ts | 43 + apps/desktop/src/store/tips.ts | 102 +- .../src/store/titlebar-app-actions.test.ts | 36 + .../desktop/src/store/titlebar-app-actions.ts | 64 + apps/desktop/src/store/todos.test.ts | 13 + apps/desktop/src/store/todos.ts | 11 +- apps/desktop/src/store/tool-view.ts | 18 +- apps/desktop/src/store/tours.ts | 9 +- apps/desktop/src/store/transcript-sync.ts | 48 + .../src/store/transcript-tail-cache.ts | 61 +- .../desktop/src/store/transcript-tail.test.ts | 157 + apps/desktop/src/store/transcript-tail.ts | 153 +- apps/desktop/src/store/translucency.test.ts | 32 +- .../src/store/translucency.win10.test.ts | 19 +- apps/desktop/src/store/tutorial-lifetime.ts | 45 + apps/desktop/src/store/updates.test.ts | 544 +- apps/desktop/src/store/updates.ts | 312 +- .../src/store/user-bubble-transparency.ts | 41 + .../src/store/vibe-hearts-enabled.test.ts | 11 - .../desktop/src/store/video-playback-speed.ts | 37 + apps/desktop/src/store/voice-live.ts | 55 + apps/desktop/src/store/voice-prefs.test.ts | 137 +- apps/desktop/src/store/voice-prefs.ts | 127 +- apps/desktop/src/store/windows.test.ts | 102 +- apps/desktop/src/store/windows.ts | 43 +- .../src/store/working-ids-stored-id.test.ts | 28 - apps/desktop/src/store/zoom.test.ts | 76 + apps/desktop/src/store/zoom.ts | 15 +- apps/desktop/src/styles.css | 373 +- apps/desktop/src/test/jsdom.ts | 2 +- .../src/test/pool-retirement-renderer.ts | 42 + apps/desktop/src/themes/backend-sync.test.ts | 44 +- apps/desktop/src/themes/backend-sync.ts | 36 +- apps/desktop/src/themes/chat-font.ts | 45 + apps/desktop/src/themes/color.ts | 126 +- apps/desktop/src/themes/context.test.tsx | 97 +- apps/desktop/src/themes/context.tsx | 99 +- apps/desktop/src/themes/install.test.ts | 4 +- apps/desktop/src/themes/presets.test.ts | 52 +- apps/desktop/src/themes/presets.ts | 498 +- apps/desktop/src/themes/profile-theme.test.ts | 18 - apps/desktop/src/themes/retint.test.ts | 48 +- apps/desktop/src/themes/retint.ts | 6 +- apps/desktop/src/themes/skin.ts | 9 +- apps/desktop/src/themes/types.ts | 22 + apps/desktop/src/themes/user-themes.ts | 23 +- apps/desktop/src/themes/vscode.test.ts | 2 +- apps/desktop/src/themes/vscode.ts | 10 +- apps/desktop/src/types/hermes.ts | 478 +- apps/desktop/src/vite-env.d.ts | 26 + apps/desktop/src/webhooks-rest.test.ts | 41 +- apps/desktop/tsconfig.e2e.json | 6 +- apps/desktop/tsconfig.electron.json | 3 +- apps/desktop/tsconfig.json | 4 + apps/desktop/update-feed.cjs | 40 + apps/desktop/update-feed.d.cts | 27 + apps/desktop/vite.config.ts | 51 +- apps/desktop/vitest.config.ts | 15 +- apps/desktop/vitest.setup.ts | 52 +- 2549 files changed, 279171 insertions(+), 49314 deletions(-) delete mode 100644 apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-LMF9y5/home/.hermes-update-in-progress.mutex' delete mode 100644 apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-us8HZu/home/.hermes-update-in-progress.mutex' create mode 100644 apps/desktop/BUILDING.md create mode 100644 apps/desktop/assets/appx/Square150x150Logo-dark.png create mode 100644 apps/desktop/assets/appx/Square150x150Logo.png create mode 100644 apps/desktop/assets/appx/Square44x44Logo-dark.png create mode 100644 apps/desktop/assets/appx/Square44x44Logo.png create mode 100644 apps/desktop/assets/appx/StoreLogo-dark.png create mode 100644 apps/desktop/assets/appx/StoreLogo.png create mode 100644 apps/desktop/assets/appx/Wide310x150Logo-dark.png create mode 100644 apps/desktop/assets/appx/Wide310x150Logo.png create mode 100644 apps/desktop/assets/icon-dark.icns create mode 100644 apps/desktop/assets/icon-dark.ico create mode 100644 apps/desktop/assets/icon-dark.png create mode 100644 apps/desktop/assets/msix-manifest.xml delete mode 100644 apps/desktop/e2e/bot-mode-closed-chat-stays-closed.spec.ts create mode 100644 apps/desktop/e2e/bot-screen-stale-status-reply.spec.ts create mode 100644 apps/desktop/e2e/completed-reply-refresh.spec.ts delete mode 100644 apps/desktop/e2e/context-menu-editables.spec.ts create mode 100644 apps/desktop/e2e/core/README.md create mode 100644 apps/desktop/e2e/core/boot-lifecycle.spec.ts create mode 100644 apps/desktop/e2e/core/harness.ts create mode 100644 apps/desktop/e2e/core/interactive-prompts.spec.ts create mode 100644 apps/desktop/e2e/core/known.ts create mode 100644 apps/desktop/e2e/core/lineage-compaction-prompt.spec.ts create mode 100644 apps/desktop/e2e/core/lineage-rotation.spec.ts create mode 100644 apps/desktop/e2e/core/lineage-sidebar.spec.ts create mode 100644 apps/desktop/e2e/core/onboarding-first-chat.spec.ts create mode 100644 apps/desktop/e2e/core/oracle.ts create mode 100644 apps/desktop/e2e/core/packaged-smoke.spec.ts create mode 100644 apps/desktop/e2e/core/playwright.config.ts create mode 100644 apps/desktop/e2e/core/provider.ts create mode 100644 apps/desktop/e2e/core/remote-helpers.ts create mode 100644 apps/desktop/e2e/core/remote-secondary.spec.ts create mode 100644 apps/desktop/e2e/core/remote-topology.spec.ts create mode 100644 apps/desktop/e2e/core/switch-back-race.spec.ts create mode 100644 apps/desktop/e2e/core/transcript-integrity.spec.ts create mode 100644 apps/desktop/e2e/electron-binary.ts create mode 100644 apps/desktop/e2e/electron-binary.unit.test.ts delete mode 100644 apps/desktop/e2e/glyph-spinner.spec.ts create mode 100644 apps/desktop/e2e/group-approval-click-submits.spec.ts create mode 100644 apps/desktop/e2e/group-member-backend-failure.spec.ts delete mode 100644 apps/desktop/e2e/group-to-local-bot-handoff.spec.ts create mode 100644 apps/desktop/e2e/group-turn-integrity.spec.ts delete mode 100644 apps/desktop/e2e/launch-packaged-app.spec.ts delete mode 100644 apps/desktop/e2e/mock-backend-setup.spec.ts delete mode 100644 apps/desktop/e2e/mock-server.ts create mode 100644 apps/desktop/e2e/new-bot-config-on-disk.spec.ts create mode 100644 apps/desktop/e2e/peer-device-reset.spec.ts create mode 100644 apps/desktop/e2e/provider-setup-owner.spec.ts create mode 100644 apps/desktop/e2e/remote-oauth-recovery.spec.ts delete mode 100644 apps/desktop/e2e/right-pane.spec.ts delete mode 100644 apps/desktop/e2e/task-panel-clearance.spec.ts delete mode 100644 apps/desktop/e2e/tile-unread-bug.spec.ts create mode 100644 apps/desktop/e2e/window-input.unit.test.ts delete mode 100644 apps/desktop/e2e/worktree-branch-status.spec.ts delete mode 100644 apps/desktop/e2e/zoom-preservation.spec.ts create mode 100644 apps/desktop/electron-builder.config.cjs create mode 100644 apps/desktop/electron/app-installer-file.test.ts create mode 100644 apps/desktop/electron/app-installer-file.ts create mode 100644 apps/desktop/electron/app-updater.ts create mode 100644 apps/desktop/electron/app-version.test.ts create mode 100644 apps/desktop/electron/app-version.ts create mode 100644 apps/desktop/electron/appinstaller-checker.test.ts create mode 100644 apps/desktop/electron/appinstaller-checker.ts create mode 100644 apps/desktop/electron/application-menu-startup.test.ts create mode 100644 apps/desktop/electron/application-menu-startup.ts create mode 100644 apps/desktop/electron/backend-discovery.test.ts create mode 100644 apps/desktop/electron/backend-discovery.ts create mode 100644 apps/desktop/electron/backend-exit-recovery.test.ts create mode 100644 apps/desktop/electron/backend-exit-recovery.ts create mode 100644 apps/desktop/electron/backend-exit.test.ts create mode 100644 apps/desktop/electron/backend-probes-runtime.test.ts delete mode 100644 apps/desktop/electron/backend-python-coherence.test.ts create mode 100644 apps/desktop/electron/backend-recycle.test.ts create mode 100644 apps/desktop/electron/backend-recycle.ts delete mode 100644 apps/desktop/electron/backend-release-gate.windows-live.test.ts create mode 100644 apps/desktop/electron/backend-serve-support.test.ts create mode 100644 apps/desktop/electron/backend-serve-support.ts create mode 100644 apps/desktop/electron/backend-start-cancellation.ts create mode 100644 apps/desktop/electron/backend-stop-overlap.test.ts create mode 100644 apps/desktop/electron/bootstrap-failure-copy.ts create mode 100644 apps/desktop/electron/bootstrap-quit.test.ts create mode 100644 apps/desktop/electron/bootstrap-runner-git-binary.test.ts create mode 100644 apps/desktop/electron/bootstrap-state.test.ts create mode 100644 apps/desktop/electron/bootstrap-state.ts create mode 100644 apps/desktop/electron/bundle-swap.test.ts create mode 100644 apps/desktop/electron/bundle-swap.ts create mode 100644 apps/desktop/electron/channel-build-version.test.ts create mode 100644 apps/desktop/electron/chat-onboarding-window.ts create mode 100644 apps/desktop/electron/cli-provision.test.ts create mode 100644 apps/desktop/electron/cli-provision.ts create mode 100644 apps/desktop/electron/close-stop-kill.test.ts create mode 100644 apps/desktop/electron/close-stop-kill.ts create mode 100644 apps/desktop/electron/cloud-boot-cascade.test.ts create mode 100644 apps/desktop/electron/cloud-boot-cascade.ts create mode 100644 apps/desktop/electron/cloud-discovery.test.ts create mode 100644 apps/desktop/electron/cloud-discovery.ts create mode 100644 apps/desktop/electron/cloud-session-recovery.test.ts create mode 100644 apps/desktop/electron/cloud-session-recovery.ts create mode 100644 apps/desktop/electron/command-screenshot-capture.test.ts create mode 100644 apps/desktop/electron/command-screenshot-capture.ts create mode 100644 apps/desktop/electron/command-screenshot-monitor.test.ts create mode 100644 apps/desktop/electron/command-screenshot-monitor.ts create mode 100644 apps/desktop/electron/command-screenshot-types.ts create mode 100644 apps/desktop/electron/command-screenshot.ts create mode 100644 apps/desktop/electron/composer-paste.test.ts create mode 100644 apps/desktop/electron/composer-paste.ts create mode 100644 apps/desktop/electron/connection-caches.test.ts create mode 100644 apps/desktop/electron/connection-caches.ts create mode 100644 apps/desktop/electron/data-paths.d.mts create mode 100644 apps/desktop/electron/data-paths.mjs create mode 100644 apps/desktop/electron/data-paths.test.ts create mode 100644 apps/desktop/electron/data-paths.ts create mode 100644 apps/desktop/electron/desktop-boot-preference.test.ts create mode 100644 apps/desktop/electron/desktop-boot-preference.ts create mode 100644 apps/desktop/electron/desktop-plugin-remove.test.ts create mode 100644 apps/desktop/electron/desktop-plugin-remove.ts create mode 100644 apps/desktop/electron/desktop-plugins-root.test.ts create mode 100644 apps/desktop/electron/desktop-plugins-root.ts create mode 100644 apps/desktop/electron/desktop-profile-mutation.test.ts create mode 100644 apps/desktop/electron/desktop-profile-preload.test.ts create mode 100644 apps/desktop/electron/desktop-profile.test.ts create mode 100644 apps/desktop/electron/desktop-profile.ts create mode 100644 apps/desktop/electron/desktop-uninstall-ipc.test.ts create mode 100644 apps/desktop/electron/dock-launch-order.test.ts create mode 100644 apps/desktop/electron/dock-launch-order.ts create mode 100644 apps/desktop/electron/entry.ts create mode 100644 apps/desktop/electron/external-open.test.ts create mode 100644 apps/desktop/electron/external-open.ts create mode 100644 apps/desktop/electron/f12-shortcut.test.ts create mode 100644 apps/desktop/electron/f12-shortcut.ts create mode 100644 apps/desktop/electron/feature-flags.test.ts create mode 100644 apps/desktop/electron/feature-flags.ts create mode 100644 apps/desktop/electron/fetch-json-oauth-session.test.ts delete mode 100644 apps/desktop/electron/find-git-bash.test.ts delete mode 100644 apps/desktop/electron/find-git-bash.ts create mode 100644 apps/desktop/electron/fixtures/source-backend.py create mode 100644 apps/desktop/electron/fixtures/windows-system-ca.ts create mode 100644 apps/desktop/electron/fs-ipc.test.ts create mode 100644 apps/desktop/electron/gateway-file-download-transport.ts create mode 100644 apps/desktop/electron/gateway-stop-before-update.test.ts create mode 100644 apps/desktop/electron/gateway-stop-before-update.ts create mode 100644 apps/desktop/electron/gateway-version.test.ts create mode 100644 apps/desktop/electron/gateway-version.ts delete mode 100644 apps/desktop/electron/gitlock.test.ts delete mode 100644 apps/desktop/electron/gitlock.ts create mode 100644 apps/desktop/electron/guest-onboarding-flag.test.ts create mode 100644 apps/desktop/electron/guest-onboarding.ts create mode 100644 apps/desktop/electron/host-backend-attach.ts create mode 100644 apps/desktop/electron/host-backend-singleton.test.ts create mode 100644 apps/desktop/electron/host-backend-singleton.ts create mode 100644 apps/desktop/electron/host-published-token.test.ts create mode 100644 apps/desktop/electron/host-published-token.ts create mode 100644 apps/desktop/electron/hud-close.test.ts create mode 100644 apps/desktop/electron/hud-close.ts create mode 100644 apps/desktop/electron/hud-modifier-monitor.test.ts create mode 100644 apps/desktop/electron/hud-modifier-monitor.ts create mode 100644 apps/desktop/electron/hud-modifier-native.test.ts create mode 100644 apps/desktop/electron/hud-modifier-types.ts create mode 100644 apps/desktop/electron/hud-modifier.test.ts create mode 100644 apps/desktop/electron/hud-modifier.ts create mode 100644 apps/desktop/electron/install-stamp.ts create mode 100644 apps/desktop/electron/intro-reveal-window.ts create mode 100644 apps/desktop/electron/link-title-curl.test.ts create mode 100644 apps/desktop/electron/link-title-curl.ts create mode 100644 apps/desktop/electron/link-title-wall.test.ts create mode 100644 apps/desktop/electron/link-title-wall.ts create mode 100644 apps/desktop/electron/linux-crash-diagnostics.test.ts create mode 100644 apps/desktop/electron/linux-crash-diagnostics.ts create mode 100644 apps/desktop/electron/linux-launcher-ready.test.ts create mode 100644 apps/desktop/electron/linux-launcher-ready.ts create mode 100644 apps/desktop/electron/linux-nvidia-egl-fallback.test.ts create mode 100644 apps/desktop/electron/linux-nvidia-egl-fallback.ts create mode 100644 apps/desktop/electron/local-backend-lifecycle.test.ts create mode 100644 apps/desktop/electron/local-backend-lifecycle.ts create mode 100644 apps/desktop/electron/local-read-path.test.ts create mode 100644 apps/desktop/electron/local-read-path.ts create mode 100644 apps/desktop/electron/local-skin.test.ts create mode 100644 apps/desktop/electron/local-skin.ts create mode 100644 apps/desktop/electron/log-rotation.test.ts create mode 100644 apps/desktop/electron/log-rotation.ts create mode 100644 apps/desktop/electron/mac-usage-strings.test.ts create mode 100644 apps/desktop/electron/machine-profile.test.ts create mode 100644 apps/desktop/electron/machine-profile.ts create mode 100644 apps/desktop/electron/main-process-lag-watchdog.test.ts create mode 100644 apps/desktop/electron/main-process-lag-watchdog.ts create mode 100644 apps/desktop/electron/media-range.test.ts create mode 100644 apps/desktop/electron/media-range.ts create mode 100644 apps/desktop/electron/minimize-to-tray-native-fixture/main.ts create mode 100644 apps/desktop/electron/minimize-to-tray.test.ts create mode 100644 apps/desktop/electron/minimize-to-tray.ts create mode 100644 apps/desktop/electron/native-access-token.test.ts create mode 100644 apps/desktop/electron/native-access-token.ts create mode 100644 apps/desktop/electron/native-gesture-monitor.ts create mode 100644 apps/desktop/electron/native/command-screenshot-monitor.m create mode 100644 apps/desktop/electron/native/hud-modifier-gesture.cs create mode 100644 apps/desktop/electron/native/hud-modifier-gesture.h create mode 100644 apps/desktop/electron/native/hud-modifier-gesture.test.c create mode 100644 apps/desktop/electron/native/hud-modifier-monitor-win.cs create mode 100644 apps/desktop/electron/native/hud-modifier-monitor-x11.c create mode 100644 apps/desktop/electron/native/hud-modifier-monitor.m create mode 100644 apps/desktop/electron/native/hud-modifier-x11.test.py create mode 100644 apps/desktop/electron/no-console-git.test.ts create mode 100644 apps/desktop/electron/no-console-git.ts create mode 100644 apps/desktop/electron/notification-actions.test.ts create mode 100644 apps/desktop/electron/notification-actions.ts create mode 100644 apps/desktop/electron/notification-ipc.test.ts create mode 100644 apps/desktop/electron/notification-ipc.ts create mode 100644 apps/desktop/electron/notification-linux.test.ts create mode 100644 apps/desktop/electron/notification-linux.ts create mode 100644 apps/desktop/electron/notification-registry.test.ts create mode 100644 apps/desktop/electron/notification-registry.ts create mode 100644 apps/desktop/electron/notification-types.ts create mode 100644 apps/desktop/electron/oauth-auth-recovery.integration.test.ts create mode 100644 apps/desktop/electron/oauth-rest-request.test.ts create mode 100644 apps/desktop/electron/oauth-rest-request.ts create mode 100644 apps/desktop/electron/oauth-session-response.ts create mode 100644 apps/desktop/electron/package-process-reap.test.ts create mode 100644 apps/desktop/electron/package-process-reap.ts create mode 100644 apps/desktop/electron/payload-backend.test.ts create mode 100644 apps/desktop/electron/payload-backend.ts create mode 100644 apps/desktop/electron/pet-overlay.test.ts create mode 100644 apps/desktop/electron/pet-overlay.ts create mode 100644 apps/desktop/electron/plugin-compat-notice.test.ts create mode 100644 apps/desktop/electron/plugin-compat-notice.ts create mode 100644 apps/desktop/electron/pool-child-exit.test.ts delete mode 100644 apps/desktop/electron/pool-eviction.test.ts delete mode 100644 apps/desktop/electron/pool-eviction.ts create mode 100644 apps/desktop/electron/pool-limits.test.ts create mode 100644 apps/desktop/electron/pool-limits.ts create mode 100644 apps/desktop/electron/pool-reclamation.test.ts create mode 100644 apps/desktop/electron/pool-retire-http.ts create mode 100644 apps/desktop/electron/pool-retire.test.ts create mode 100644 apps/desktop/electron/pool-retire.ts create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/README.md create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/cron_work.py create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/main.ts create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/preload.ts create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/serve.py create mode 100644 apps/desktop/electron/pool-retirement-live-fixture/vitest.config.ts create mode 100644 apps/desktop/electron/pool-retirement-live.test.ts create mode 100644 apps/desktop/electron/pool-spawn-coordinator.test.ts create mode 100644 apps/desktop/electron/pool-spawn-coordinator.ts create mode 100644 apps/desktop/electron/portal-cookies.test.ts create mode 100644 apps/desktop/electron/portal-cookies.ts create mode 100644 apps/desktop/electron/portal-session-live-fixture/main.ts create mode 100644 apps/desktop/electron/portal-session-live.test.ts create mode 100644 apps/desktop/electron/portal-session.ts create mode 100644 apps/desktop/electron/pre-update-backup-config.test.ts create mode 100644 apps/desktop/electron/pre-update-backup-config.ts create mode 100644 apps/desktop/electron/preload-flags.test.ts create mode 100644 apps/desktop/electron/preload-local-skin.test.ts create mode 100644 apps/desktop/electron/preview-capture.test.ts create mode 100644 apps/desktop/electron/preview-capture.ts create mode 100644 apps/desktop/electron/preview-file-watch.test.ts create mode 100644 apps/desktop/electron/preview-file-watch.ts create mode 100644 apps/desktop/electron/preview-guest-preload-entry.ts create mode 100644 apps/desktop/electron/preview-guest-preload.test.ts create mode 100644 apps/desktop/electron/preview-guest-preload.ts create mode 100644 apps/desktop/electron/primary-backend-cancellation.test.ts create mode 100644 apps/desktop/electron/primary-profile-pin.test.ts create mode 100644 apps/desktop/electron/primary-profile-pin.ts create mode 100644 apps/desktop/electron/product-identity.test.ts create mode 100644 apps/desktop/electron/product-identity.ts create mode 100644 apps/desktop/electron/profile-migration.test.ts create mode 100644 apps/desktop/electron/profile-migration.ts create mode 100644 apps/desktop/electron/quit-finalization.test.ts create mode 100644 apps/desktop/electron/quit-finalization.ts create mode 100644 apps/desktop/electron/quit-teardown.test.ts create mode 100644 apps/desktop/electron/quit-teardown.ts create mode 100644 apps/desktop/electron/registry-primary-profile-scope.test.ts create mode 100644 apps/desktop/electron/remote-lifecycle-spawn.test.ts create mode 100644 apps/desktop/electron/remote-oauth-ticket.test.ts create mode 100644 apps/desktop/electron/remote-oauth-ticket.ts create mode 100644 apps/desktop/electron/remote-reauth-latch.test.ts create mode 100644 apps/desktop/electron/renderer-heap-flags.test.ts create mode 100644 apps/desktop/electron/renderer-heap-flags.ts create mode 100644 apps/desktop/electron/renderer-manifest.test.ts create mode 100644 apps/desktop/electron/roster-source-fetch.test.ts create mode 100644 apps/desktop/electron/roster-source-fetch.ts create mode 100644 apps/desktop/electron/roster-source-status.test.ts create mode 100644 apps/desktop/electron/roster-source-status.ts create mode 100644 apps/desktop/electron/select-paths-dialog.test.ts create mode 100644 apps/desktop/electron/select-paths-dialog.ts create mode 100644 apps/desktop/electron/select-runnable-binary.test.ts create mode 100644 apps/desktop/electron/select-runnable-binary.ts create mode 100644 apps/desktop/electron/semver.d.cts create mode 100644 apps/desktop/electron/source-backend.test.ts create mode 100644 apps/desktop/electron/source-backend.ts create mode 100644 apps/desktop/electron/source-python.test.ts create mode 100644 apps/desktop/electron/source-python.ts create mode 100644 apps/desktop/electron/ssh-isolated-keepalive.test.ts create mode 100644 apps/desktop/electron/ssh-isolated-keepalive.ts create mode 100644 apps/desktop/electron/ssh-teardown.test.ts create mode 100644 apps/desktop/electron/ssh-teardown.ts create mode 100644 apps/desktop/electron/terminal-lc-ctype.test.ts create mode 100644 apps/desktop/electron/terminal-output-gate.test.ts create mode 100644 apps/desktop/electron/terminal-output-gate.ts create mode 100644 apps/desktop/electron/tray-host.test.ts create mode 100644 apps/desktop/electron/tray-host.ts create mode 100644 apps/desktop/electron/update-api-proxy.test.ts create mode 100644 apps/desktop/electron/update-api-proxy.ts delete mode 100644 apps/desktop/electron/update-count.test.ts delete mode 100644 apps/desktop/electron/update-count.ts create mode 100644 apps/desktop/electron/update-gate-cancellation.test.ts create mode 100644 apps/desktop/electron/update-prerequisites.test.ts delete mode 100644 apps/desktop/electron/update-remote.test.ts delete mode 100644 apps/desktop/electron/update-remote.ts create mode 100644 apps/desktop/electron/updater/app-installer-recovery.test.ts create mode 100644 apps/desktop/electron/updater/app-installer-strategy.test.ts create mode 100644 apps/desktop/electron/updater/app-installer.ts create mode 100644 apps/desktop/electron/updater/artifact.ts create mode 100644 apps/desktop/electron/updater/channel-artifact-lifetime.test.ts create mode 100644 apps/desktop/electron/updater/channel-native.test.ts create mode 100644 apps/desktop/electron/updater/channel-native.ts create mode 100644 apps/desktop/electron/updater/channel-protocol.ts create mode 100644 apps/desktop/electron/updater/channel-strategy.ts create mode 100644 apps/desktop/electron/updater/channel-windows-host.ts create mode 100644 apps/desktop/electron/updater/channel.test.ts create mode 100644 apps/desktop/electron/updater/channel.ts create mode 100644 apps/desktop/electron/updater/checkout-handoff.test.ts create mode 100644 apps/desktop/electron/updater/checkout-legacy.test.ts create mode 100644 apps/desktop/electron/updater/checkout-ownership.test.ts create mode 100644 apps/desktop/electron/updater/checkout-source.test.ts create mode 100644 apps/desktop/electron/updater/checkout-source.ts create mode 100644 apps/desktop/electron/updater/checkout.ts create mode 100644 apps/desktop/electron/updater/commit-build.test.ts create mode 100644 apps/desktop/electron/updater/external.ts create mode 100644 apps/desktop/electron/updater/feed-config.test.ts create mode 100644 apps/desktop/electron/updater/feed-config.ts create mode 100644 apps/desktop/electron/updater/index.ts create mode 100644 apps/desktop/electron/updater/mac-client.test.ts create mode 100644 apps/desktop/electron/updater/mac-client.ts create mode 100644 apps/desktop/electron/updater/mac.test.ts create mode 100644 apps/desktop/electron/updater/mac.ts create mode 100644 apps/desktop/electron/updater/operation.test.ts create mode 100644 apps/desktop/electron/updater/operation.ts create mode 100644 apps/desktop/electron/updater/packaged-handoff.ts create mode 100644 apps/desktop/electron/updater/relaunch-isolation.test.ts create mode 100644 apps/desktop/electron/updater/relaunch-waiter-lifecycle.test.ts create mode 100644 apps/desktop/electron/updater/relaunch-waiter.ts create mode 100644 apps/desktop/electron/updater/relaunch-waiter.windows-live.test.ts create mode 100644 apps/desktop/electron/updater/relaunch.ts create mode 100644 apps/desktop/electron/updater/state-db-preflight.test.ts create mode 100644 apps/desktop/electron/updater/state-db-preflight.ts create mode 100644 apps/desktop/electron/updater/store-client.test.ts create mode 100644 apps/desktop/electron/updater/store-client.ts create mode 100644 apps/desktop/electron/updater/store.test.ts create mode 100644 apps/desktop/electron/updater/store.ts create mode 100644 apps/desktop/electron/updater/updater.test.ts delete mode 100644 apps/desktop/electron/venv-blocker-scan.test.ts delete mode 100644 apps/desktop/electron/venv-blocker-scan.ts create mode 100644 apps/desktop/electron/venv-holder-select.test.ts create mode 100644 apps/desktop/electron/venv-holder-select.ts create mode 100644 apps/desktop/electron/web-text-decoder.test.ts create mode 100644 apps/desktop/electron/web-text-decoder.ts create mode 100644 apps/desktop/electron/window-accelerator.test.ts create mode 100644 apps/desktop/electron/window-accelerator.ts create mode 100644 apps/desktop/electron/window-chrome-events.test.ts create mode 100644 apps/desktop/electron/window-chrome-events.ts create mode 100644 apps/desktop/electron/window-controls.test.ts create mode 100644 apps/desktop/electron/window-controls.ts create mode 100644 apps/desktop/electron/window-growth.ts create mode 100644 apps/desktop/electron/window-open-policy.ts delete mode 100644 apps/desktop/electron/windows-remote-live.test.ts create mode 100644 apps/desktop/electron/windows-stack-cookie-fallback.test.ts create mode 100644 apps/desktop/electron/windows-stack-cookie-fallback.ts delete mode 100644 apps/desktop/electron/wsl-path-bridge-gate.test.ts create mode 100644 apps/desktop/electron/wslg-launch-process.test.ts create mode 100644 apps/desktop/electron/wslg-launch-process.ts create mode 100644 apps/desktop/electron/wslg-launch.test.ts create mode 100644 apps/desktop/electron/wslg-launch.ts create mode 100644 apps/desktop/packaging/nous-dmg-2b.tiff create mode 100644 apps/desktop/pr-assets/profile-launch-menu.png create mode 100644 apps/desktop/product-identity.cjs create mode 100644 apps/desktop/product-identity.d.cts create mode 100644 apps/desktop/public/intro-nous-girl.png create mode 100644 apps/desktop/public/nous-badge.png create mode 100644 apps/desktop/public/nous-girl-dark.png delete mode 100644 apps/desktop/public/nous-girl.jpg create mode 100644 apps/desktop/public/nous-girl.png create mode 100644 apps/desktop/scripts/after-extract.mjs create mode 100644 apps/desktop/scripts/after-extract.test.mjs create mode 100644 apps/desktop/scripts/after-pack-digests.test.mjs create mode 100644 apps/desktop/scripts/after-pack-toolchain.test.mjs create mode 100644 apps/desktop/scripts/after-pack.test.mjs create mode 100644 apps/desktop/scripts/assert-root-install.test.mjs create mode 100644 apps/desktop/scripts/audit-bundle-arch.mjs create mode 100644 apps/desktop/scripts/audit-bundle-arch.test.mjs create mode 100644 apps/desktop/scripts/batch-sign-binaries.mjs create mode 100644 apps/desktop/scripts/batch-sign-binaries.test.mjs create mode 100644 apps/desktop/scripts/build-command-screenshot-monitor.mjs create mode 100644 apps/desktop/scripts/build-command-screenshot-monitor.test.mjs create mode 100644 apps/desktop/scripts/build-hud-modifier-monitor.mjs create mode 100644 apps/desktop/scripts/build.mjs create mode 100644 apps/desktop/scripts/bundle-env.d.mts create mode 100644 apps/desktop/scripts/bundle-env.mjs create mode 100644 apps/desktop/scripts/bundle-env.test.mjs create mode 100644 apps/desktop/scripts/check-appinstaller-update.py create mode 100644 apps/desktop/scripts/check-store-update.py create mode 100644 apps/desktop/scripts/cli-launchers.test.mjs create mode 100644 apps/desktop/scripts/commit-bundles.windows.test.mjs create mode 100644 apps/desktop/scripts/commit-stamp-identity.test.mjs create mode 100644 apps/desktop/scripts/connector-rehearsal.mjs create mode 100644 apps/desktop/scripts/desktop-update-ui.test.mjs delete mode 100644 apps/desktop/scripts/dev-mock.mjs create mode 100644 apps/desktop/scripts/dmgbuild-diagnostics.cjs create mode 100644 apps/desktop/scripts/dmgbuild-diagnostics.test.mjs create mode 100644 apps/desktop/scripts/gen-msix-manifest.mjs create mode 100644 apps/desktop/scripts/mac-sign.mjs create mode 100644 apps/desktop/scripts/mac-sign.test.mjs create mode 100644 apps/desktop/scripts/macos-sysroot-native.test.mjs create mode 100644 apps/desktop/scripts/macos-sysroot.mjs create mode 100644 apps/desktop/scripts/macos-sysroot.test.mjs create mode 100644 apps/desktop/scripts/msix-manifest-roundtrip.test.mjs create mode 100644 apps/desktop/scripts/msix-shared.test.mjs create mode 100644 apps/desktop/scripts/native-quad.test.mjs create mode 100644 apps/desktop/scripts/osx-sign-inputs.test.mjs create mode 100644 apps/desktop/scripts/payload-digests.mjs create mode 100644 apps/desktop/scripts/payload-sign-cache.mjs create mode 100644 apps/desktop/scripts/payload-sign-cache.test.mjs create mode 100644 apps/desktop/scripts/perf/scenarios/live-window.mjs create mode 100644 apps/desktop/scripts/prepare-dmgbuild.mjs create mode 100644 apps/desktop/scripts/prepare-dmgbuild.test.mjs create mode 100644 apps/desktop/scripts/prepare-packaging-tools.mjs create mode 100644 apps/desktop/scripts/prepare_dmgbuild.py create mode 100644 apps/desktop/scripts/prepared-native-deps.mjs create mode 100644 apps/desktop/scripts/prepared-native-deps.test.mjs create mode 100644 apps/desktop/scripts/prepared-packaging.mjs create mode 100644 apps/desktop/scripts/prepared-packaging.test.mjs create mode 100644 apps/desktop/scripts/prepared-windows-tools.test.mjs create mode 100644 apps/desktop/scripts/probe-prepared-native.mjs create mode 100644 apps/desktop/scripts/probe-prepared-native.test.mjs delete mode 100644 apps/desktop/scripts/rebuild-native.mjs create mode 100644 apps/desktop/scripts/run-electron-builder.test.mjs delete mode 100644 apps/desktop/scripts/run-short-session-hang-repro.test.mjs create mode 100644 apps/desktop/scripts/sanitize-pe-signatures.mjs create mode 100644 apps/desktop/scripts/sanitize-pe-signatures.test.mjs create mode 100644 apps/desktop/scripts/set-exe-identity.test.mjs create mode 100644 apps/desktop/scripts/side-by-side-launchers.test.mjs create mode 100644 apps/desktop/scripts/side-by-side.windows.test.mjs create mode 100644 apps/desktop/scripts/sign-msix.mjs create mode 100644 apps/desktop/scripts/sign-msix.test.mjs create mode 100644 apps/desktop/scripts/sign-nested-chromium.mjs create mode 100644 apps/desktop/scripts/sign-nested-chromium.test.mjs create mode 100644 apps/desktop/scripts/sign-wheel-zips.mjs create mode 100644 apps/desktop/scripts/sign-wheel-zips.test.mjs create mode 100644 apps/desktop/scripts/signing-resources.test.mjs create mode 100644 apps/desktop/scripts/store-package-version.test.mjs create mode 100644 apps/desktop/scripts/update-relaunch-waiter.ps1 create mode 100644 apps/desktop/scripts/verify-side-by-side-macos.mjs create mode 100644 apps/desktop/scripts/verify-signed-payloads.ps1 create mode 100644 apps/desktop/scripts/windows-bundle-tools.mjs create mode 100644 apps/desktop/scripts/windows-bundle-tools.test.mjs create mode 100644 apps/desktop/src/AGENTS.md create mode 100644 apps/desktop/src/api/config-route-binding.test.ts create mode 100644 apps/desktop/src/api/local-models-owner.test.ts create mode 100644 apps/desktop/src/api/local-models.ts create mode 100644 apps/desktop/src/api/session-transcript-paging.test.ts create mode 100644 apps/desktop/src/app/artifacts/remote-open.test.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-alert.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-browser.test.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-browser.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-card.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-data.test.ts create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-data.ts create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-detail-dialog.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-detail.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-filters.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-install-switch.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-list-row.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-metadata.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-pointer.ts create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog-query.ts create mode 100644 apps/desktop/src/app/capabilities/catalog/catalog.css create mode 100644 apps/desktop/src/app/capabilities/catalog/skill-catalog.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/store.ts create mode 100644 apps/desktop/src/app/capabilities/catalog/update-skills-button.tsx create mode 100644 apps/desktop/src/app/capabilities/catalog/use-catalog-filters.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/add-dialog.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/add-server-draft.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/add-server-form.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/catalog-mark.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/category-picker.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/connect-element.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/connector-dialog.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/connector-kind.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/connector-row-card.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/connectors-directory.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/connectors-tab.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/data/account-operations.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/deep-link.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/join.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/keys.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/mutations.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/persist.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/portal.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/prefetch.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/queries.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/data/rpc.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/derive-page.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/derive-tools.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/derive.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/dialog-menu.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/hint-vocabulary.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/hosted-dialog.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/local-dialog.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/local-server-control.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/local-slots.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/plugin-tools-panel.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tool-row.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tools-filter-bar.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tools-list.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tools-panel.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tools-status.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/tools-summary.tsx create mode 100644 apps/desktop/src/app/capabilities/connectors/types.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/use-tools-editor.ts create mode 100644 apps/desktop/src/app/capabilities/connectors/ways-section.tsx rename apps/desktop/src/app/{skills => capabilities}/index.test.tsx (60%) create mode 100644 apps/desktop/src/app/capabilities/index.tsx create mode 100644 apps/desktop/src/app/capabilities/mcp/install-catalog-entry.ts create mode 100644 apps/desktop/src/app/capabilities/mcp/mcp-doc.ts create mode 100644 apps/desktop/src/app/capabilities/mcp/mcp-editor.tsx create mode 100644 apps/desktop/src/app/capabilities/mcp/mcp-logs.tsx create mode 100644 apps/desktop/src/app/capabilities/mcp/mcp-status.ts create mode 100644 apps/desktop/src/app/capabilities/mcp/use-mcp-draft.ts create mode 100644 apps/desktop/src/app/capabilities/mcp/use-mcp-probes.ts create mode 100644 apps/desktop/src/app/capabilities/mcp/use-mcp-servers.ts create mode 100644 apps/desktop/src/app/capabilities/plugins/plugin-packages.test.ts create mode 100644 apps/desktop/src/app/capabilities/plugins/plugin-packages.ts create mode 100644 apps/desktop/src/app/capabilities/plugins/plugin-settings-form.test.tsx create mode 100644 apps/desktop/src/app/capabilities/plugins/plugin-settings-form.tsx create mode 100644 apps/desktop/src/app/capabilities/plugins/plugins-page-header.test.tsx create mode 100644 apps/desktop/src/app/capabilities/plugins/plugins-tab.test.tsx create mode 100644 apps/desktop/src/app/capabilities/plugins/plugins-tab.tsx create mode 100644 apps/desktop/src/app/capabilities/primitives.tsx create mode 100644 apps/desktop/src/app/capabilities/scope-selector.tsx create mode 100644 apps/desktop/src/app/capabilities/skills/frontmatter.test.ts create mode 100644 apps/desktop/src/app/capabilities/skills/frontmatter.ts create mode 100644 apps/desktop/src/app/capabilities/skills/official-skill-detail.tsx create mode 100644 apps/desktop/src/app/capabilities/skills/skill-detail.tsx create mode 100644 apps/desktop/src/app/capabilities/skills/skills-data.ts create mode 100644 apps/desktop/src/app/capabilities/skills/skills-tab.tsx create mode 100644 apps/desktop/src/app/capabilities/toolsets/tool-calls.ts create mode 100644 apps/desktop/src/app/capabilities/toolsets/toolset-detail.tsx create mode 100644 apps/desktop/src/app/capabilities/toolsets/toolsets-data.ts create mode 100644 apps/desktop/src/app/capabilities/toolsets/toolsets-tab.tsx create mode 100644 apps/desktop/src/app/chat/composer/floating-state.ts create mode 100644 apps/desktop/src/app/chat/composer/floating-surface.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/floating-surface.tsx create mode 100644 apps/desktop/src/app/chat/composer/floating-target-editable-guard.test.ts create mode 100644 apps/desktop/src/app/chat/composer/floating-target-floating-layer.test.ts create mode 100644 apps/desktop/src/app/chat/composer/floating-target-selection-guard.test.ts create mode 100644 apps/desktop/src/app/chat/composer/floating-target.ts create mode 100644 apps/desktop/src/app/chat/composer/hooks/slash-localization.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-auto-speak-replies.owner.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-composer-metrics.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-composer-screenshot.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-composer-screenshot.ts create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-composer-voice-shortcuts.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-mic-recorder.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-status-drawer.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-status-drawer.ts create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-status-presence.test.ts create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-voice-conversation-boundary.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-voice-conversation-meter.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-voice-live-conversation.owner.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-voice-live-conversation.test.ts create mode 100644 apps/desktop/src/app/chat/composer/hooks/use-voice-live-conversation.ts delete mode 100644 apps/desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/large-paste.test.ts create mode 100644 apps/desktop/src/app/chat/composer/large-paste.ts create mode 100644 apps/desktop/src/app/chat/composer/paste-url-is-text.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/reasoning-pill.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/reasoning-pill.tsx create mode 100644 apps/desktop/src/app/chat/composer/restored-draft-notice.tsx delete mode 100644 apps/desktop/src/app/chat/composer/slash-nav-dom-repro.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/start-voice-button.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/default-collapse.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/drawer.css create mode 100644 apps/desktop/src/app/chat/composer/status-stack/drawer.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/hidden-pane-subagent-polls.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/polling-guard.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/preview-order.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control-goal.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control-heartbeat.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control-loop.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control-utils.ts create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/session-control.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-controls.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-controls.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-hydration.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-lifecycle.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-section.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-section.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/subagent-transcript.tsx create mode 100644 apps/desktop/src/app/chat/composer/status-stack/use-subagent-snapshot.ts create mode 100644 apps/desktop/src/app/chat/composer/trigger-popover-description.test.tsx delete mode 100644 apps/desktop/src/app/chat/composer/trigger-popover-parity.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/undo-cut-drag.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/visibility.ts create mode 100644 apps/desktop/src/app/chat/composer/voice-activity.test.tsx create mode 100644 apps/desktop/src/app/chat/composer/voice-engine-rows.tsx create mode 100644 apps/desktop/src/app/chat/composer/voice-fan.tsx create mode 100644 apps/desktop/src/app/chat/history-window.test.tsx create mode 100644 apps/desktop/src/app/chat/history-window.ts create mode 100644 apps/desktop/src/app/chat/new-session-drag.test.ts create mode 100644 apps/desktop/src/app/chat/new-session-drag.ts delete mode 100644 apps/desktop/src/app/chat/profile-tag.test.tsx create mode 100644 apps/desktop/src/app/chat/resume-exhausted-overlay.test.tsx create mode 100644 apps/desktop/src/app/chat/resume-exhausted-overlay.tsx create mode 100644 apps/desktop/src/app/chat/right-rail/preview-annotate-card.test.tsx create mode 100644 apps/desktop/src/app/chat/right-rail/preview-annotate-card.tsx create mode 100644 apps/desktop/src/app/chat/right-rail/preview-annotate-host.test.ts create mode 100644 apps/desktop/src/app/chat/right-rail/preview-annotate-host.ts create mode 100644 apps/desktop/src/app/chat/right-rail/preview-input.test.ts create mode 100644 apps/desktop/src/app/chat/right-rail/real-profile-consent-dialog.test.tsx create mode 100644 apps/desktop/src/app/chat/right-rail/real-profile-consent-dialog.tsx create mode 100644 apps/desktop/src/app/chat/route-tile-reactivity.test.tsx create mode 100644 apps/desktop/src/app/chat/route-tile-title.test.tsx create mode 100644 apps/desktop/src/app/chat/runtime-backfill.test.tsx delete mode 100644 apps/desktop/src/app/chat/session-tile-owner-route.test.ts create mode 100644 apps/desktop/src/app/chat/session-tile-owner.test.ts create mode 100644 apps/desktop/src/app/chat/session-tile-owner.ts create mode 100644 apps/desktop/src/app/chat/sidebar/archive-copy.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/chat-sidebar.integration.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/chrome-section-add-button.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/filter-menu.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-group-model.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-group-model.ts create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-group-preferences.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-group-preferences.ts create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-groups-drag.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-groups.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/gateway-groups.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/local-device-switch.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/profile-dropdown-switcher.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/profile-dropdown-switcher.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/profile-launch-menu.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/profile-launch-menu.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/profile-rail-status.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/project-filter.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/project-filter.ts create mode 100644 apps/desktop/src/app/chat/sidebar/search-results-order.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/session-row-rename-drag.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/session-row-slots.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/sessions-section-new-session-drag.test.tsx delete mode 100644 apps/desktop/src/app/chat/sidebar/sessions-section.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/storage-corrupt-notice.test.tsx create mode 100644 apps/desktop/src/app/chat/sidebar/use-entered-project-sessions.test.ts create mode 100644 apps/desktop/src/app/chat/sidebar/use-entered-project-sessions.ts create mode 100644 apps/desktop/src/app/chat/sidebar/use-profile-prewarm.test.ts delete mode 100644 apps/desktop/src/app/chat/sidebar/virtual-session-list.test.tsx create mode 100644 apps/desktop/src/app/chat/tile-zone-host.ts create mode 100644 apps/desktop/src/app/chat/transcript-retention.test.ts create mode 100644 apps/desktop/src/app/chat/transcript-retention.ts create mode 100644 apps/desktop/src/app/chat/transcript-window-retention.test.ts create mode 100644 apps/desktop/src/app/chat/use-transcript-retention.test.tsx create mode 100644 apps/desktop/src/app/chat/use-transcript-retention.ts create mode 100644 apps/desktop/src/app/command-center/delete-confirm.test.tsx create mode 100644 apps/desktop/src/app/contrib/handoff-leg.ts create mode 100644 apps/desktop/src/app/contrib/handoff-receipt.test.ts create mode 100644 apps/desktop/src/app/contrib/handoff-receipt.ts create mode 100644 apps/desktop/src/app/contrib/hooks/completed-reply-refresh.test.tsx create mode 100644 apps/desktop/src/app/contrib/hooks/folded-tool-turn-refresh.test.tsx create mode 100644 apps/desktop/src/app/contrib/hooks/notification-focus.test.tsx create mode 100644 apps/desktop/src/app/contrib/hooks/restore-late-plugin-route.test.tsx create mode 100644 apps/desktop/src/app/contrib/layout-presets.ts create mode 100644 apps/desktop/src/app/contrib/layout-sides.ts create mode 100644 apps/desktop/src/app/contrib/onboarding-handoff.ts create mode 100644 apps/desktop/src/app/contrib/onboarding-kickoff.test.ts create mode 100644 apps/desktop/src/app/contrib/onboarding-kickoff.ts create mode 100644 apps/desktop/src/app/contrib/sessions-pane-tab-title.test.tsx create mode 100644 apps/desktop/src/app/contrib/surfaces.app-routes.test.tsx create mode 100644 apps/desktop/src/app/contrib/surfaces.late-routes.test.tsx create mode 100644 apps/desktop/src/app/gateway/gateway-event-dedupe.test.ts create mode 100644 apps/desktop/src/app/gateway/gateway-event-dedupe.ts create mode 100644 apps/desktop/src/app/gateway/hooks/use-connections-registry.test.tsx create mode 100644 apps/desktop/src/app/gateway/hooks/use-connections-registry.ts create mode 100644 apps/desktop/src/app/gateway/hooks/use-default-profile-preference.ts create mode 100644 apps/desktop/src/app/hooks/use-config-record.test.tsx create mode 100644 apps/desktop/src/app/hooks/use-on-profile-switch.test.tsx create mode 100644 apps/desktop/src/app/hooks/use-profile-switch-latch.test.ts create mode 100644 apps/desktop/src/app/hooks/use-profile-switch-latch.ts create mode 100644 apps/desktop/src/app/hud/handoff.test.tsx create mode 100644 apps/desktop/src/app/hud/hud-shell.viewed-interval.test.tsx create mode 100644 apps/desktop/src/app/hud/resize-frame.test.tsx create mode 100644 apps/desktop/src/app/hud/transcript-band.test.tsx create mode 100644 apps/desktop/src/app/hud/transcript-band.ts create mode 100644 apps/desktop/src/app/messaging/telegram-qr-setup.tsx create mode 100644 apps/desktop/src/app/model-picker-overlay.test.tsx create mode 100644 apps/desktop/src/app/overlays/overlay-split-layout.test.tsx delete mode 100644 apps/desktop/src/app/overlays/peek-scope.test.ts create mode 100644 apps/desktop/src/app/retirement-view.test.tsx create mode 100644 apps/desktop/src/app/retirement-view.tsx create mode 100644 apps/desktop/src/app/right-sidebar/files/prefs.test.ts create mode 100644 apps/desktop/src/app/right-sidebar/files/prefs.ts create mode 100644 apps/desktop/src/app/right-sidebar/files/remote-picker.test.tsx create mode 100644 apps/desktop/src/app/right-sidebar/terminal/reveal-focus.test.ts create mode 100644 apps/desktop/src/app/right-sidebar/terminal/reveal-focus.ts create mode 100644 apps/desktop/src/app/routes.titlebar-clusters.test.ts create mode 100644 apps/desktop/src/app/session-import/api.ts create mode 100644 apps/desktop/src/app/session-import/index.test.tsx create mode 100644 apps/desktop/src/app/session-import/index.tsx create mode 100644 apps/desktop/src/app/session/hooks/branch-owner-routing.integration.test.ts create mode 100644 apps/desktop/src/app/session/hooks/default-new-session.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/resume-occurrences.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-background-queue-preservation.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/background-review-interrupt.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/btw-complete-event.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/collapse-duplicate-final.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/completion-boundaries.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/completion-projections.test.tsx delete mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/confab-notice-event.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/duplicate-completion.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/folded-segment-refresh.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/desktop-bridge.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/fallback-switch.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/input-requests.approval-timeout.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/input-requests.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/lifecycle.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/message-stream.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/server-requests.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/server-requests.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/session-control.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/session-control.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/status.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/gateway-event/tools-preview.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/heartbeat-complete-reorder.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/interim-history.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/late-tool-events.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/peer-transcript-notify.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/response-occurrences.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/response-parts.ts create mode 100644 apps/desktop/src/app/session/hooks/use-message-stream/transformed-final.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-prompt-actions/queue-if-busy.ts create mode 100644 apps/desktop/src/app/session/hooks/use-prompt-actions/steering-recovery.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-prompt-actions/steering-session.ts create mode 100644 apps/desktop/src/app/session/hooks/use-prompt-actions/submit-view-binding.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/create-overrides.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/display-hydration.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/live-turn-remainder.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/live-turn-remainder.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/pending-turn-identity.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/persisted-live-turn.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/provisional-transcript.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/restore-pending-connection.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/resume-empty-prose-pairing.test.ts create mode 100644 apps/desktop/src/app/session/hooks/use-session-actions/unarchive-session.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-session-list-actions.reactivation.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-transcript-peer-sync.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/use-transcript-peer-sync.ts create mode 100644 apps/desktop/src/app/session/hooks/warm-resume-replay-barrier.test.tsx create mode 100644 apps/desktop/src/app/session/hooks/wrong-session-closeout.test.tsx create mode 100644 apps/desktop/src/app/session/new-session-route.ts create mode 100644 apps/desktop/src/app/settings/about-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/appearance-contrib.test.tsx create mode 100644 apps/desktop/src/app/settings/appearance-contrib.tsx create mode 100644 apps/desktop/src/app/settings/appearance-settings.extra-slot.test.tsx create mode 100644 apps/desktop/src/app/settings/appearance-subpages.ts delete mode 100644 apps/desktop/src/app/settings/billing/types.test.ts create mode 100644 apps/desktop/src/app/settings/chat-font-setting.test.tsx create mode 100644 apps/desktop/src/app/settings/chat-font-setting.tsx create mode 100644 apps/desktop/src/app/settings/cloud-team-change.ts create mode 100644 apps/desktop/src/app/settings/config-field-voice-locale.test.tsx create mode 100644 apps/desktop/src/app/settings/config-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/config-subpages.ts create mode 100644 apps/desktop/src/app/settings/custom-endpoints-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/hud-modifier-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/hud-modifier-settings.tsx create mode 100644 apps/desktop/src/app/settings/keybind-settings.late-actions.test.tsx create mode 100644 apps/desktop/src/app/settings/local-model-download-progress.test.tsx create mode 100644 apps/desktop/src/app/settings/local-model-download-progress.tsx create mode 100644 apps/desktop/src/app/settings/local-models-actions.ts create mode 100644 apps/desktop/src/app/settings/local-models-browse.tsx create mode 100644 apps/desktop/src/app/settings/local-models-hardware-section.tsx create mode 100644 apps/desktop/src/app/settings/local-models-model-rows.tsx create mode 100644 apps/desktop/src/app/settings/local-models-models-section.tsx create mode 100644 apps/desktop/src/app/settings/local-models-owner.ts create mode 100644 apps/desktop/src/app/settings/local-models-quickstart.tsx create mode 100644 apps/desktop/src/app/settings/local-models-runtime-section.tsx create mode 100644 apps/desktop/src/app/settings/local-models-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/local-models-settings.tsx create mode 100644 apps/desktop/src/app/settings/minimize-to-tray-setting.test.tsx create mode 100644 apps/desktop/src/app/settings/minimize-to-tray-setting.tsx create mode 100644 apps/desktop/src/app/settings/model-select.tsx create mode 100644 apps/desktop/src/app/settings/moved-tabs.test.ts create mode 100644 apps/desktop/src/app/settings/moved-tabs.ts create mode 100644 apps/desktop/src/app/settings/other-subpages.ts create mode 100644 apps/desktop/src/app/settings/plugin-install-modal.test.tsx delete mode 100644 apps/desktop/src/app/settings/plugins-settings.test.tsx delete mode 100644 apps/desktop/src/app/settings/plugins-settings.tsx create mode 100644 apps/desktop/src/app/settings/pool-limits-setting.tsx create mode 100644 apps/desktop/src/app/settings/providers-settings.terminal-disconnect.test.tsx create mode 100644 apps/desktop/src/app/settings/screenshot-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/screenshot-settings.tsx create mode 100644 apps/desktop/src/app/settings/sessions-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/settings-manifest.ts create mode 100644 apps/desktop/src/app/settings/subpage-navigation.tsx create mode 100644 apps/desktop/src/app/settings/subpages.test.ts create mode 100644 apps/desktop/src/app/settings/subpages.ts create mode 100644 apps/desktop/src/app/settings/uninstall-section.test.tsx create mode 100644 apps/desktop/src/app/settings/use-setting-deep-link.ts create mode 100644 apps/desktop/src/app/settings/vault-settings.owner.test.tsx create mode 100644 apps/desktop/src/app/settings/vault-settings.test.tsx create mode 100644 apps/desktop/src/app/settings/vault-settings.tsx create mode 100644 apps/desktop/src/app/shell/hooks/use-statusbar-items.lifecycle.test.tsx create mode 100644 apps/desktop/src/app/shell/hooks/use-statusbar-items.test.tsx create mode 100644 apps/desktop/src/app/shell/model-catalog-menu.search-fold.test.tsx create mode 100644 apps/desktop/src/app/shell/reasoning-menu-panel.tsx create mode 100644 apps/desktop/src/app/shell/system-resources-statusbar.tsx create mode 100644 apps/desktop/src/app/shell/titlebar-controls.test.tsx create mode 100644 apps/desktop/src/app/shell/use-model-menu-controller.ts create mode 100644 apps/desktop/src/app/shell/wslg-window-controls.test.tsx create mode 100644 apps/desktop/src/app/shell/wslg-window-controls.tsx delete mode 100644 apps/desktop/src/app/skills/embedded-hub-picker.tsx delete mode 100644 apps/desktop/src/app/skills/index.tsx delete mode 100644 apps/desktop/src/app/skills/mcp-tab.tsx delete mode 100644 apps/desktop/src/app/skills/store.ts create mode 100644 apps/desktop/src/app/starmap/node-context-menu.test.tsx create mode 100644 apps/desktop/src/app/starmap/playback-hotkey.test.ts create mode 100644 apps/desktop/src/app/starmap/playback-hotkey.ts delete mode 100644 apps/desktop/src/app/updates-overlay.blockers.test.tsx create mode 100644 apps/desktop/src/app/updates-overlay.manual.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/ask-directive.tsx create mode 100644 apps/desktop/src/components/assistant-ui/catalog-advanced-dialog.tsx create mode 100644 apps/desktop/src/components/assistant-ui/catalog-install-tool.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/catalog-install-tool.tsx create mode 100644 apps/desktop/src/components/assistant-ui/clarify-submit-shortcut.ts create mode 100644 apps/desktop/src/components/assistant-ui/connector-tool.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/connector-tool.tsx create mode 100644 apps/desktop/src/components/assistant-ui/directive-chip-links.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/embeds/listing-embed.tsx create mode 100644 apps/desktop/src/components/assistant-ui/markdown-text.reasoning.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/mcp-setup-tool.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/agent-avatar-cache.test.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/background-resume.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/index.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/list-auto-show-earlier.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/list-restore-composer-resize.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/list-session-scroll.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/message-parts-connectors.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/process-notification.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/reaction-picker-focus-follow.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/response-group.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/response-group.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/sealed-tool-parts.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/should-auto-show-earlier.test.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/text-direction.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/timeline-index.test.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/timeline-index.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/timeline-rail.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/timeline-rail.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/timeline.css create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-messages-below.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-messages-below.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-sticky-prompt-clip.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-sticky-prompt-clip.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-timeline-history.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-timeline-history.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-timeline-reveal.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/use-timeline-reveal.ts create mode 100644 apps/desktop/src/components/assistant-ui/thread/user-message-edit-shared-composer.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/thread/user-message-edit-undo-cut-drag.test.tsx delete mode 100644 apps/desktop/src/components/assistant-ui/thread/user-message-selection.test.ts create mode 100644 apps/desktop/src/components/assistant-ui/tool/approval-activity.ts create mode 100644 apps/desktop/src/components/assistant-ui/tool/delegate.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/tool/fallback-vision-image.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/tool/hide-code-diffs.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/tool/inline-edit-persistence.test.tsx create mode 100644 apps/desktop/src/components/assistant-ui/tool/skill-activity.test.ts create mode 100644 apps/desktop/src/components/assistant-ui/tool/skill-activity.ts create mode 100644 apps/desktop/src/components/boot-failure-cause.test.ts create mode 100644 apps/desktop/src/components/boot-failure-cause.ts create mode 100644 apps/desktop/src/components/chat/image-geometry.test.tsx create mode 100644 apps/desktop/src/components/chat/intro.test.tsx create mode 100644 apps/desktop/src/components/chat/shiki-block.test.tsx create mode 100644 apps/desktop/src/components/chat/shiki-config.ts create mode 100644 apps/desktop/src/components/chat/shiki-highlight-cache.test.ts create mode 100644 apps/desktop/src/components/chat/shiki-highlight-cache.ts create mode 100644 apps/desktop/src/components/chat/shiki-plain.tsx create mode 100644 apps/desktop/src/components/chat/status-control-row.tsx create mode 100644 apps/desktop/src/components/chat/status-dismiss-button.tsx create mode 100644 apps/desktop/src/components/chat/status-pending-icon.tsx create mode 100644 apps/desktop/src/components/chat/status-row.test.tsx create mode 100644 apps/desktop/src/components/chat/status-stack.css create mode 100644 apps/desktop/src/components/chat/transcript-video.test.tsx create mode 100644 apps/desktop/src/components/chat/transcript-video.tsx create mode 100644 apps/desktop/src/components/chat/zoomable-image.test.tsx create mode 100644 apps/desktop/src/components/desktop-install-local-card.ts create mode 100644 apps/desktop/src/components/external-open-failed-dialog.test.tsx create mode 100644 apps/desktop/src/components/external-open-failed-dialog.tsx delete mode 100644 apps/desktop/src/components/first-run-remote-form.tsx create mode 100644 apps/desktop/src/components/free-tier/notice-owner.test.tsx create mode 100644 apps/desktop/src/components/free-tier/notice-strip.tsx create mode 100644 apps/desktop/src/components/free-tier/sign-in-dialog.test.tsx create mode 100644 apps/desktop/src/components/free-tier/sign-in-dialog.tsx create mode 100644 apps/desktop/src/components/intro-reveal/README.md create mode 100644 apps/desktop/src/components/intro-reveal/index.tsx create mode 100644 apps/desktop/src/components/intro-reveal/intro-reveal-surface.tsx create mode 100644 apps/desktop/src/components/intro-reveal/intro-reveal.css create mode 100644 apps/desktop/src/components/intro-reveal/intro-root.tsx create mode 100644 apps/desktop/src/components/intro-reveal/scenes/brand.tsx create mode 100644 apps/desktop/src/components/intro-reveal/scenes/side-agents.tsx create mode 100644 apps/desktop/src/components/intro-reveal/scenes/style.ts create mode 100644 apps/desktop/src/components/intro-reveal/scenes/text.ts create mode 100644 apps/desktop/src/components/intro-reveal/sound.ts create mode 100644 apps/desktop/src/components/intro-reveal/timeline.ts create mode 100644 apps/desktop/src/components/intro-reveal/use-intro-clock.ts create mode 100644 apps/desktop/src/components/intro-reveal/viewport-cube.ts create mode 100644 apps/desktop/src/components/model-picker.test.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/assembly.ts create mode 100644 apps/desktop/src/components/onboarding-chat/cards/build.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/cards/connectors.test.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/cards/frame.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/cards/look.test.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/cards/setup.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/chip.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/directive.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/first-build.ts create mode 100644 apps/desktop/src/components/onboarding-chat/gate.test.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/gate.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/guide-loading.css create mode 100644 apps/desktop/src/components/onboarding-chat/guide-loading.test.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/guide-loading.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/mode-layout.test.ts create mode 100644 apps/desktop/src/components/onboarding-chat/onboarding-first-use.test.ts create mode 100644 apps/desktop/src/components/onboarding-chat/options.tsx create mode 100644 apps/desktop/src/components/onboarding-chat/persisted-handoff.ts create mode 100644 apps/desktop/src/components/onboarding-chat/plugins-runbook.test.ts create mode 100644 apps/desktop/src/components/onboarding-chat/setup-profile.ts create mode 100644 apps/desktop/src/components/onboarding-chat/signpost.ts create mode 100644 apps/desktop/src/components/onboarding-chat/skip.tsx create mode 100644 apps/desktop/src/components/onboarding/flow.test.tsx create mode 100644 apps/desktop/src/components/onboarding/free-tier-intro.test.ts create mode 100644 apps/desktop/src/components/onboarding/free-tier-setup-notice.test.tsx create mode 100644 apps/desktop/src/components/onboarding/free-tier-setup-notice.tsx create mode 100644 apps/desktop/src/components/overlay-error-boundary.tsx create mode 100644 apps/desktop/src/components/pane-shell/edit-mode.test.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/lone-chat-sibling-zone.test.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/mode-layout-memory.test.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/pane-reload-share.test.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/floating-mode-memory.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/keep-alive-panes.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/keep-alive-panes.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/pane-body.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/panel-titlebar-lifecycle.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/panel-titlebar.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/panel-titlebar.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/tree-split-cascade-resize.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/tree-split-sash-preview.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/resting-presets.test.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/tab-key-hint-state.ts create mode 100644 apps/desktop/src/components/pane-shell/tree/tab-key-hints.test.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/tab-key-hints.tsx create mode 100644 apps/desktop/src/components/pane-shell/tree/zone-editor-split-preview.test.tsx delete mode 100644 apps/desktop/src/components/pet/floating-pet-poll.test.ts create mode 100644 apps/desktop/src/components/prompt-overlays.vault-code.test.tsx create mode 100644 apps/desktop/src/components/prompt-overlays.vault-save-login.test.tsx create mode 100644 apps/desktop/src/components/prompt-overlays.vault-unlock.test.tsx create mode 100644 apps/desktop/src/components/remote-setup/fields.tsx create mode 100644 apps/desktop/src/components/remote-setup/first-run.tsx create mode 100644 apps/desktop/src/components/remote-setup/use-remote-connection-test.ts create mode 100644 apps/desktop/src/components/remote-setup/use-remote-oauth.ts create mode 100644 apps/desktop/src/components/remote-setup/use-remote-probe.ts create mode 100644 apps/desktop/src/components/remote-setup/use-remote-setup.test.tsx create mode 100644 apps/desktop/src/components/remote-setup/use-remote-setup.ts create mode 100644 apps/desktop/src/components/sync-status-card.test.tsx create mode 100644 apps/desktop/src/components/sync-status-card.tsx create mode 100644 apps/desktop/src/components/sync-status.ts create mode 100644 apps/desktop/src/components/tips/local-runtime-update-offer.test.tsx create mode 100644 apps/desktop/src/components/tips/local-runtime-update-offer.ts create mode 100644 apps/desktop/src/components/tips/local-setup-offer.test.ts create mode 100644 apps/desktop/src/components/tips/local-setup-offer.ts create mode 100644 apps/desktop/src/components/tips/tutorial-lifetime.test.tsx create mode 100644 apps/desktop/src/components/tips/use-tip-rotation.test.tsx create mode 100644 apps/desktop/src/components/ui/actions-menu.test.tsx create mode 100644 apps/desktop/src/components/ui/card-stack.test.tsx create mode 100644 apps/desktop/src/components/ui/card-stack.tsx delete mode 100644 apps/desktop/src/components/ui/checkbox.test.tsx delete mode 100644 apps/desktop/src/components/ui/copy-button.test.tsx create mode 100644 apps/desktop/src/components/ui/decode-text.test.tsx create mode 100644 apps/desktop/src/components/ui/dropdown-menu.test.tsx create mode 100644 apps/desktop/src/components/ui/fan-menu-tooltip.test.tsx create mode 100644 apps/desktop/src/components/ui/fan-menu.test.ts create mode 100644 apps/desktop/src/components/ui/fan-menu.tsx create mode 100644 apps/desktop/src/components/ui/highlight-matches-model.test.tsx create mode 100644 apps/desktop/src/components/ui/masonry.css create mode 100644 apps/desktop/src/components/ui/masonry.tsx create mode 100644 apps/desktop/src/components/ui/menu.ts create mode 100644 apps/desktop/src/components/ui/profile-glyph.test.tsx create mode 100644 apps/desktop/src/components/ui/reel.tsx create mode 100644 apps/desktop/src/components/ui/sandboxed-frame.test.tsx create mode 100644 apps/desktop/src/components/ui/sandboxed-frame.tsx create mode 100644 apps/desktop/src/components/ui/setup-field-list.tsx create mode 100644 apps/desktop/src/components/ui/setup-form-dialog.tsx create mode 100644 apps/desktop/src/components/ui/slider.tsx create mode 100644 apps/desktop/src/components/ui/tooltip-pane-layout.test.tsx create mode 100644 apps/desktop/src/components/ui/tooltip-placement.test.tsx create mode 100644 apps/desktop/src/components/ui/tooltip-placement.ts create mode 100644 apps/desktop/src/components/ui/tooltip-rail-edge.test.tsx create mode 100644 apps/desktop/src/components/ui/tooltip.css create mode 100644 apps/desktop/src/components/update-status.test.tsx create mode 100644 apps/desktop/src/components/update-status.tsx create mode 100644 apps/desktop/src/components/version-details.test.tsx create mode 100644 apps/desktop/src/components/version-details.tsx create mode 100644 apps/desktop/src/contrib/kanban-i18n.test.tsx create mode 100644 apps/desktop/src/contrib/radio-artist-links.test.ts create mode 100644 apps/desktop/src/contrib/radio-plugin.test.ts create mode 100644 apps/desktop/src/hooks/use-media-image.ts create mode 100644 apps/desktop/src/i18n/bots-advanced.test.tsx create mode 100644 apps/desktop/src/i18n/bots-cron.test.tsx create mode 100644 apps/desktop/src/i18n/bots-editor.test.tsx create mode 100644 apps/desktop/src/i18n/catalog-completeness.test.ts create mode 100644 apps/desktop/src/i18n/de.ts create mode 100644 apps/desktop/src/i18n/es.ts create mode 100644 apps/desktop/src/i18n/fr.ts create mode 100644 apps/desktop/src/i18n/intro-de.ts create mode 100644 apps/desktop/src/i18n/intro-es.ts create mode 100644 apps/desktop/src/i18n/intro-fr.ts create mode 100644 apps/desktop/src/i18n/intro-ja.ts create mode 100644 apps/desktop/src/i18n/intro-zh-hant.ts create mode 100644 apps/desktop/src/i18n/intro-zh.ts create mode 100644 apps/desktop/src/i18n/localized-tab-title.tsx create mode 100644 apps/desktop/src/i18n/profile-locale.test.tsx create mode 100644 apps/desktop/src/i18n/profile-provider.tsx create mode 100644 apps/desktop/src/i18n/ru.ts create mode 100644 apps/desktop/src/lib/async-report.test.ts create mode 100644 apps/desktop/src/lib/catalog-install.test.ts create mode 100644 apps/desktop/src/lib/chat-messages.codex-commentary-reprojection.test.ts create mode 100644 apps/desktop/src/lib/chat-messages.codex-json-sidecar.test.ts create mode 100644 apps/desktop/src/lib/chat-messages.codex-sidecar-hydration.test.ts create mode 100644 apps/desktop/src/lib/chat-messages.interim-preservation.test.ts create mode 100644 apps/desktop/src/lib/chat-messages/competing-contracts.test.ts create mode 100644 apps/desktop/src/lib/chat-messages/coverage.ts create mode 100644 apps/desktop/src/lib/chat-messages/d1-consumers.test.ts create mode 100644 apps/desktop/src/lib/chat-messages/parts.test.ts create mode 100644 apps/desktop/src/lib/chat-messages/reconciliation.test.ts create mode 100644 apps/desktop/src/lib/chat-messages/tool-result-preservation.test.ts create mode 100644 apps/desktop/src/lib/cloud-agent-session.ts create mode 100644 apps/desktop/src/lib/code-skew-error.test.ts create mode 100644 apps/desktop/src/lib/code-skew-error.ts create mode 100644 apps/desktop/src/lib/commit-changelog-localization.test.ts create mode 100644 apps/desktop/src/lib/completion-poll.test.ts create mode 100644 apps/desktop/src/lib/completion-poll.ts delete mode 100644 apps/desktop/src/lib/confab-notice-hydration.test.ts create mode 100644 apps/desktop/src/lib/connector-tools.ts create mode 100644 apps/desktop/src/lib/desktop-slash-registry.json delete mode 100644 apps/desktop/src/lib/desktop-toolsets.test.ts create mode 100644 apps/desktop/src/lib/distribution-label.ts create mode 100644 apps/desktop/src/lib/docs.ts create mode 100644 apps/desktop/src/lib/error-surface-copy.test.ts create mode 100644 apps/desktop/src/lib/error-surface-copy.ts delete mode 100644 apps/desktop/src/lib/format.ts create mode 100644 apps/desktop/src/lib/gateway-ws-url.ts create mode 100644 apps/desktop/src/lib/guarded-model-switch.test.tsx create mode 100644 apps/desktop/src/lib/ime.test.ts create mode 100644 apps/desktop/src/lib/ime.ts create mode 100644 apps/desktop/src/lib/keybinds/approval-keys.ts create mode 100644 apps/desktop/src/lib/layout-persistence.test.ts create mode 100644 apps/desktop/src/lib/layout-persistence.ts create mode 100644 apps/desktop/src/lib/listing-embed.test.ts create mode 100644 apps/desktop/src/lib/listing-embed.ts create mode 100644 apps/desktop/src/lib/markdown-preprocess.autolink.test.ts create mode 100644 apps/desktop/src/lib/markdown-preprocess.directives.test.ts create mode 100644 apps/desktop/src/lib/markdown-preprocess.reasoning.test.ts create mode 100644 apps/desktop/src/lib/markdown-whitespace.test.ts delete mode 100644 apps/desktop/src/lib/mcp-directory.ts create mode 100644 apps/desktop/src/lib/mcp-enabled-cases.json create mode 100644 apps/desktop/src/lib/media-dimensions.test.ts create mode 100644 apps/desktop/src/lib/media-file-download.test.ts create mode 100644 apps/desktop/src/lib/mic-meter-context.ts create mode 100644 apps/desktop/src/lib/model-picker-owner.test.ts create mode 100644 apps/desktop/src/lib/model-picker-owner.ts delete mode 100644 apps/desktop/src/lib/model-search-text.ts create mode 100644 apps/desktop/src/lib/onboarding-enabled.ts create mode 100644 apps/desktop/src/lib/onboarding-recommendations.test.ts create mode 100644 apps/desktop/src/lib/onboarding-recommendations.ts create mode 100644 apps/desktop/src/lib/plugin-catalog.ts create mode 100644 apps/desktop/src/lib/preview-annotate/flush.ts create mode 100644 apps/desktop/src/lib/preview-annotate/group.test.ts create mode 100644 apps/desktop/src/lib/preview-annotate/group.ts create mode 100644 apps/desktop/src/lib/preview-annotate/identity.ts create mode 100644 apps/desktop/src/lib/preview-annotate/in-page.test.ts create mode 100644 apps/desktop/src/lib/preview-annotate/in-page.ts create mode 100644 apps/desktop/src/lib/preview-annotate/index.ts create mode 100644 apps/desktop/src/lib/preview-annotate/pack.test.ts create mode 100644 apps/desktop/src/lib/preview-annotate/pack.ts create mode 100644 apps/desktop/src/lib/preview-annotate/stack.test.ts create mode 100644 apps/desktop/src/lib/preview-annotate/stack.ts create mode 100644 apps/desktop/src/lib/preview-annotate/tokens.ts create mode 100644 apps/desktop/src/lib/preview-external.ts create mode 100644 apps/desktop/src/lib/preview-markdown-links.test.ts create mode 100644 apps/desktop/src/lib/preview-markdown-links.ts create mode 100644 apps/desktop/src/lib/profile-order.ts create mode 100644 apps/desktop/src/lib/profile-short-label.ts create mode 100644 apps/desktop/src/lib/reasoning-slash.test.ts create mode 100644 apps/desktop/src/lib/reasoning-slash.ts delete mode 100644 apps/desktop/src/lib/reconnect-backoff.test.ts delete mode 100644 apps/desktop/src/lib/reconnect-backoff.ts create mode 100644 apps/desktop/src/lib/session-row-slots.ts create mode 100644 apps/desktop/src/lib/session-timer-since.test.ts create mode 100644 apps/desktop/src/lib/session-timer-since.ts create mode 100644 apps/desktop/src/lib/shared-gateway-restart.test.ts create mode 100644 apps/desktop/src/lib/shared-gateway-restart.ts create mode 100644 apps/desktop/src/lib/sibling-ws-url.test.ts create mode 100644 apps/desktop/src/lib/sibling-ws-url.ts create mode 100644 apps/desktop/src/lib/stale-transcript-guard.ts create mode 100644 apps/desktop/src/lib/statusbar.test.ts create mode 100644 apps/desktop/src/lib/tips/local-cta.test.ts create mode 100644 apps/desktop/src/lib/tips/local-cta.ts create mode 100644 apps/desktop/src/lib/tips/rotation.test.ts create mode 100644 apps/desktop/src/lib/tool-result-metadata.ts create mode 100644 apps/desktop/src/lib/transcript-occurrences.test.ts create mode 100644 apps/desktop/src/lib/tts-lease.test.ts create mode 100644 apps/desktop/src/lib/tts-lease.ts create mode 100644 apps/desktop/src/lib/version-label.test.ts create mode 100644 apps/desktop/src/lib/version-label.ts create mode 100644 apps/desktop/src/lib/voice-barge-in.test.ts create mode 100644 apps/desktop/src/lib/voice-live.routing.test.ts create mode 100644 apps/desktop/src/lib/voice-live.ts create mode 100644 apps/desktop/src/lib/voice-playback.same-turn.test.ts delete mode 100644 apps/desktop/src/plugins/accent/picker.tsx delete mode 100644 apps/desktop/src/plugins/accent/plugin.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/avatar-image.test.ts delete mode 100644 apps/desktop/src/plugins/hermes-bots/bot-row-keeps-closed-chat.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/bot-row-opens-canonical-chat.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/canonical-chat-open-failure-toast.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/cold-bot-switch-pending.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/cold-bot-switch-row.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-chat-timeline.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-chat-view-members.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-chat-view-members.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-chat-view.inline-code.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-chat-view.render.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-compress.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-compress.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-external-writes.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-external-writes.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-hold-status.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-hold-status.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-mention-text.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-mention-text.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/group-order.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-order.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-pin.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-pin.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-presence.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-round-members.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-round-prompt.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-rounds.primary-alias.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-slash.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/group-slash.ts delete mode 100644 apps/desktop/src/plugins/hermes-bots/i18n.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/labels.profile-name.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/recent-session.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/recent-session.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-content.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-derivation.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-dialogs.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-groups.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-lifecycle.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-lifecycle.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-sections.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/roster-pane-toolbar.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-autoraise.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-autoraise.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-connection.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-connection.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-hero.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-install-retention.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-install.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-isolation.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-open.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-pane-lifecycle.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-pane-status-events.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-pane.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-portal-status-request.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-portal.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-state.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-state.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/screen-viewer-identity.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/user-sections-ui.test.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/user-sections-ui.tsx create mode 100644 apps/desktop/src/plugins/hermes-bots/user-sections.groups.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/user-sections.test.ts create mode 100644 apps/desktop/src/plugins/hermes-bots/user-sections.ts create mode 100644 apps/desktop/src/plugins/kanban/api.connection-scope.test.ts create mode 100644 apps/desktop/src/plugins/kanban/api.events-cursor.test.ts create mode 100644 apps/desktop/src/plugins/kanban/drawer.test.tsx create mode 100644 apps/desktop/src/plugins/radio/README.md create mode 100644 apps/desktop/src/plugins/radio/plugin.js create mode 100644 apps/desktop/src/sdk/bridge.test.ts create mode 100644 apps/desktop/src/sdk/bridge.ts create mode 100644 apps/desktop/src/sdk/composer.ts create mode 100644 apps/desktop/src/sdk/sessions.ts create mode 100644 apps/desktop/src/sdk/settings.test.ts create mode 100644 apps/desktop/src/sdk/settings.ts create mode 100644 apps/desktop/src/store/agent-plugins.test.ts create mode 100644 apps/desktop/src/store/composer-status-drawer.test.ts create mode 100644 apps/desktop/src/store/composer-status-drawer.ts create mode 100644 apps/desktop/src/store/connection-request.test.ts create mode 100644 apps/desktop/src/store/connection-request.ts create mode 100644 apps/desktop/src/store/connector-catalog.ts delete mode 100644 apps/desktop/src/store/cron-model-impact-scope.test.ts delete mode 100644 apps/desktop/src/store/cron-model-impact-scope.ts delete mode 100644 apps/desktop/src/store/cron-model-impact.test.ts delete mode 100644 apps/desktop/src/store/cron-model-impact.ts create mode 100644 apps/desktop/src/store/custom-models.test.ts create mode 100644 apps/desktop/src/store/custom-models.ts create mode 100644 apps/desktop/src/store/default-profile-startup.test.ts create mode 100644 apps/desktop/src/store/default-profile.test.ts create mode 100644 apps/desktop/src/store/default-profile.ts create mode 100644 apps/desktop/src/store/display-toggles.test.ts create mode 100644 apps/desktop/src/store/display-toggles.ts create mode 100644 apps/desktop/src/store/external-links.test.ts create mode 100644 apps/desktop/src/store/external-links.ts create mode 100644 apps/desktop/src/store/fleet-roster.test.ts create mode 100644 apps/desktop/src/store/free-tier-setup-failure.test.ts create mode 100644 apps/desktop/src/store/free-tier-sign-in.test.ts create mode 100644 apps/desktop/src/store/free-tier-sign-in.ts create mode 100644 apps/desktop/src/store/free-tier.ts create mode 100644 apps/desktop/src/store/gateway-profile-only-owner.integration.test.ts create mode 100644 apps/desktop/src/store/gateway-spawn-priority.test.ts create mode 100644 apps/desktop/src/store/guide-opening.test.ts create mode 100644 apps/desktop/src/store/hub-actions.blocked.test.ts create mode 100644 apps/desktop/src/store/interface-mode.test.ts create mode 100644 apps/desktop/src/store/interface-mode.ts create mode 100644 apps/desktop/src/store/intro-reveal.ts create mode 100644 apps/desktop/src/store/kanban-connection-scope.test.ts create mode 100644 apps/desktop/src/store/keybinds.test.ts create mode 100644 apps/desktop/src/store/layout-flipped-sides.test.ts create mode 100644 apps/desktop/src/store/local-models-flag.ts create mode 100644 apps/desktop/src/store/local-models-surfaces.test.tsx create mode 100644 apps/desktop/src/store/local-runtime-jobs.test.ts create mode 100644 apps/desktop/src/store/local-runtime-jobs.ts create mode 100644 apps/desktop/src/store/machine.ts delete mode 100644 apps/desktop/src/store/mcp-setup.ts create mode 100644 apps/desktop/src/store/model-assignment.ts create mode 100644 apps/desktop/src/store/onboarding-answers.ts create mode 100644 apps/desktop/src/store/onboarding-capabilities.test.ts create mode 100644 apps/desktop/src/store/onboarding-capabilities.ts create mode 100644 apps/desktop/src/store/onboarding-gate.test.ts create mode 100644 apps/desktop/src/store/onboarding-gate.ts create mode 100644 apps/desktop/src/store/onboarding-never-forces-sign-in.test.ts create mode 100644 apps/desktop/src/store/onboarding-owner.test.ts create mode 100644 apps/desktop/src/store/onboarding-plugin-outcomes.test.ts create mode 100644 apps/desktop/src/store/onboarding-plugin-outcomes.ts create mode 100644 apps/desktop/src/store/onboarding-plugins.ts create mode 100644 apps/desktop/src/store/onboarding-presence.ts create mode 100644 apps/desktop/src/store/onboarding-scope.ts create mode 100644 apps/desktop/src/store/onboarding-script.ts delete mode 100644 apps/desktop/src/store/pane-focus.test.ts create mode 100644 apps/desktop/src/store/plugin-catalog-install.test.ts create mode 100644 apps/desktop/src/store/plugin-catalog-install.ts create mode 100644 apps/desktop/src/store/pool-limits.ts create mode 100644 apps/desktop/src/store/preview-explicit.ts create mode 100644 apps/desktop/src/store/preview-status-edge-cases.test.ts create mode 100644 apps/desktop/src/store/preview-status-lifecycle.test.ts create mode 100644 apps/desktop/src/store/preview-tabs-scope.test.ts create mode 100644 apps/desktop/src/store/profile-cache.test.ts create mode 100644 apps/desktop/src/store/profile-dot-state.test.ts create mode 100644 apps/desktop/src/store/profile-dot-state.ts create mode 100644 apps/desktop/src/store/profile-rail-prefs.ts create mode 100644 apps/desktop/src/store/project-scope.ts create mode 100644 apps/desktop/src/store/provider-wait.test.ts create mode 100644 apps/desktop/src/store/real-profile-consent.ts create mode 100644 apps/desktop/src/store/recovery-requests.ts create mode 100644 apps/desktop/src/store/runtime-gone.test.ts create mode 100644 apps/desktop/src/store/runtime-gone.ts create mode 100644 apps/desktop/src/store/server-requests.ts create mode 100644 apps/desktop/src/store/session-control.test.ts create mode 100644 apps/desktop/src/store/session-control.ts create mode 100644 apps/desktop/src/store/session-event-provenance.ts create mode 100644 apps/desktop/src/store/session-focus.ts create mode 100644 apps/desktop/src/store/session-gone-latch.ts create mode 100644 apps/desktop/src/store/session-pane-focus.test.ts create mode 100644 apps/desktop/src/store/session-removal.test.ts create mode 100644 apps/desktop/src/store/session-removal.ts create mode 100644 apps/desktop/src/store/session-sidebar-focus.test.ts create mode 100644 apps/desktop/src/store/session-states-profile-rename.test.ts create mode 100644 apps/desktop/src/store/sidebar-archive.test.ts create mode 100644 apps/desktop/src/store/sidebar-nav.test.ts create mode 100644 apps/desktop/src/store/sidebar-nav.ts create mode 100644 apps/desktop/src/store/skill-deeplink-install.test.ts create mode 100644 apps/desktop/src/store/skill-deeplink-install.ts create mode 100644 apps/desktop/src/store/statusbar-prefs.test.ts create mode 100644 apps/desktop/src/store/subagent-snapshot.test.ts create mode 100644 apps/desktop/src/store/terminal-backend-warning.test.ts create mode 100644 apps/desktop/src/store/terminal-backend-warning.ts create mode 100644 apps/desktop/src/store/text-direction.ts create mode 100644 apps/desktop/src/store/thread-scroll-restore.test.ts create mode 100644 apps/desktop/src/store/thread-scroll.test.ts create mode 100644 apps/desktop/src/store/thread-timeline.test.ts create mode 100644 apps/desktop/src/store/thread-timeline.ts create mode 100644 apps/desktop/src/store/tips.test.ts create mode 100644 apps/desktop/src/store/titlebar-app-actions.test.ts create mode 100644 apps/desktop/src/store/titlebar-app-actions.ts create mode 100644 apps/desktop/src/store/transcript-sync.ts create mode 100644 apps/desktop/src/store/transcript-tail.test.ts create mode 100644 apps/desktop/src/store/tutorial-lifetime.ts create mode 100644 apps/desktop/src/store/user-bubble-transparency.ts create mode 100644 apps/desktop/src/store/video-playback-speed.ts create mode 100644 apps/desktop/src/store/voice-live.ts delete mode 100644 apps/desktop/src/store/working-ids-stored-id.test.ts create mode 100644 apps/desktop/src/store/zoom.test.ts create mode 100644 apps/desktop/src/test/pool-retirement-renderer.ts create mode 100644 apps/desktop/src/themes/chat-font.ts create mode 100644 apps/desktop/update-feed.cjs create mode 100644 apps/desktop/update-feed.d.cts diff --git a/apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-LMF9y5/home/.hermes-update-in-progress.mutex' b/apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-LMF9y5/home/.hermes-update-in-progress.mutex' deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-us8HZu/home/.hermes-update-in-progress.mutex' b/apps/desktop/'/var/folders/5h/qzgt02rn619fttp2d7zdxj600000gn/T/hermes-update-mutex-us8HZu/home/.hermes-update-in-progress.mutex' deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/apps/desktop/AGENTS.md b/apps/desktop/AGENTS.md index c59d13e8b1cdf..34f6bab173256 100644 --- a/apps/desktop/AGENTS.md +++ b/apps/desktop/AGENTS.md @@ -3,7 +3,8 @@ How to build Hermes Desktop well. This is a judgment guide, not an inventory — it teaches the invariants and the reasoning behind them so a change fits the app even as files move. Read it with the repository `AGENTS.md` (root rules still -apply) and [`DESIGN.md`](./DESIGN.md) for the visual and interaction contract. +apply), [`DESIGN.md`](./DESIGN.md) for the visual and interaction contract, and +`src/AGENTS.md` for the backend contract, slash-palette curation, and Bot Mode. When a rule here and the code disagree, trust the code and fix whichever is wrong — but never break an invariant to make a change easier. @@ -55,6 +56,28 @@ that must outlive compression keys off the lineage root. Keep the mapping betwee them explicit and translate at the boundary rather than passing the wrong id inward. +Two guarantees follow from this (#111868). The user's message is durable at +send: `prompt.submit` writes the session row AND the user row before the agent +build starts, and the turn adopts that row (`_adopt_submit_user_row` → +`agent._pending_cli_user_message`) instead of appending a second one, so a +freeze or force-quit during a slow first build leaves a resumable transcript +(user message present, no reply). And renderer state keyed by profile name — +persisted tabs (`tilesByProfile`), Bot tile owner routes, cached transcript +tails, remembered session/route, session owner hints — follows a profile +rename via `migrateTilesForProfile(old, new)` (`store/session-states.ts`), the +rename sibling of `dropTilesForProfile`. Add any new profile-keyed localStorage +family to BOTH, or a rename leaves it pointing at a backend that no longer +exists ("Couldn't open this session" on every restore). + +When an id is verifiably gone anyway (`goneSessionVerdict` → `'draft'`), the +window drops to a fresh draft without toasting or looping — and the unsent +text stashed under the dead key follows it: the verdict calls +`announceGoneSessionDraft(id)` and the composer's swap onto the fresh scope +consumes it once (`adoptGoneSessionDraft`, `store/composer.ts`), seeding the +composer and publishing the inline, undoable `$restoredDraftNotice`. Offer, +don't hijack: no navigation beyond the drop itself, no focus steal, no toast, +and an already non-empty fresh draft is never clobbered. + ## Server truth is cached, not owned The renderer paints from a cache of backend truth, so it must reconcile, not @@ -133,6 +156,40 @@ Two auth-flavored corollaries worth naming because they are easy to get wrong: - **A connection test must exercise the leg you'll actually use.** An HTTP status probe passing while the WebSocket/auth leg fails is a false positive that ships as "it said connected but nothing works." +- **Cookie-jar partition names contain nothing Electron percent-escapes.** A + `persist:` partition becomes a `Partitions/` folder; a folder + name with `%3A` (an escaped `:`) gets a cookie store Windows can neither read + nor write, so the session silently never persists. `electron/oauth-partition.ts` + pins the invariant; renaming a partition signs its users out once — say so. + +## Guest content never opens anything by itself + +Untrusted HTML runs in two places: sandboxed `allow-scripts` iframes (artifact +previews) and the preview pane's `` (`persist:hermes-preview`). Neither +may drive the OS browser without the user's hand on it (GHSA-9f4c-93c8-jc8g): +`setWindowOpenHandler` denies everything and never opens a URL as a side +effect (`electron/window-open-policy.ts`), and the webview has no +`allowpopups` — do not add it. + +A guest page's `target="_blank"` links (Streamlit's "Ask Google" traceback +button) reach the OS browser through one explicit bridge instead: + +- `main.ts` installs `electron/preview-guest-preload-entry.ts` via + `will-attach-webview`, keyed on the `persist:hermes-preview` partition only. + It is the app's only guest preload; a new webview does not inherit it unless + it opts into that partition. +- The preload runs in the isolated world, exposes nothing to the page, and + forwards only a **trusted** (`event.isTrusted`) primary-button click on an + `a[target="_blank"]` to the host via `ipcRenderer.sendToHost`. A synthetic + `dispatchEvent(click)` from page script is dropped there; page `window.open` + stays blocked. +- `PreviewPane` admits `http:`/`https:` only (`src/lib/preview-external.ts`) + and hands the URL to the existing `hermes:openExternal` IPC, which applies + main's URL policy. `file:` is excluded on purpose: a guest must never reach + `shell.openPath`. + +Widening any of those three (partition key, trusted-click gate, scheme set) +reopens the gesture-less forced-navigation class the advisory closed. ## Compatibility without carrying the past forever @@ -195,6 +252,14 @@ boundaries, optimistic rollback and stale-response ordering, and both sides of a local/remote adapter with its profile routing intact. Match how the suite is actually run rather than inventing a command; when in doubt, read the scripts. +## Rehearsing the guided onboarding + +From `apps/desktop`, use a fresh temporary directory for each rehearsal and run +`env -u NODE_ENV HERMES_GUEST_ONBOARDING=1 HERMES_HOME=/.hermes HERMES_DESKTOP_USER_DATA_DIR=/electron-user-data npm run dev` +(replace `` with that directory). To use the portal stand-in, add +`HERMES_PORTAL_BASE_URL=http://127.0.0.1:8765 HERMES_ANON_API_SECRET=test-secret HERMES_SHARED_AUTH_DIR=/.hermes/shared` +before `npm run dev`. Stop Electron and its dev server after the run. + ## The taste test before you hand off - Does every piece of state live with its authority, at the narrowest scope? @@ -208,3 +273,17 @@ actually run rather than inventing a command; when in doubt, read the scripts. locales? If any answer is "not sure," that's the part to go verify. + +## Nous free tier: state is pulled, never latched in the renderer + +The free tier (a Nous identity with no account, `hermes_cli/anon_auth.py`) reaches the renderer +through one JSON-RPC pair: `free_tier.status` (has_guest, enabled, available, +notice_pending, model, label) read from local auth state with zero network, and +`free_tier.ack_notice`, which persists the one-time notice flag on the identity itself. The +first-launch ready screen and the own-key strip are the SAME state rendered for two situations, +keyed on `notice_pending`; there is no localStorage latch, so the CLI and the desktop cannot +disagree about whether the notice was shown. Sign-in goes through the existing +`POST /api/providers/oauth/nous/start` + poll route, which over a free-tier identity registers the +connector transfer and reports `reason`, `account_email` and `model` on completion; every entry +point (Billing, status chip, ready screen) opens the one free-tier sign-in dialog. Never branch on +provider display names: the picker row carries `free_tier_row`, status cards carry `free_tier`. diff --git a/apps/desktop/BUILDING.md b/apps/desktop/BUILDING.md new file mode 100644 index 0000000000000..013581c951db6 --- /dev/null +++ b/apps/desktop/BUILDING.md @@ -0,0 +1,355 @@ +# Building the Desktop Installers + +Use the complete bundle builder for release artifacts. Ordinary `dist:*` +commands package the current desktop build; they do not stage a fresh runtime. + +## Artifact and update ownership + +| Target | Artifact | Update owner | +|---|---|---| +| Windows x64 / ARM64, sideload | Signed per-architecture MSIX packages, combined into a universal `.msixbundle`; `.appinstaller` descriptor | Windows App Installer | +| Windows x64 / ARM64, Store | Store-identity MSIX packages and a separate Store bundle | Microsoft Store | +| macOS ARM64 / x64 | Signed, notarized `Hermes.app` in DMG and ZIP artifacts | `electron-updater` with Squirrel.Mac | +| Linux x64 / ARM64 | Local builder can produce AppImage | External replacement; Linux desktop release legs are disabled | + +The current MSIX manifest requires Windows 11 22H2 (`10.0.22621.0`). +The source-script Windows support range is separate from this package floor. +Windows desktop packaging uses MSIX, not NSIS or MSI. + +`bundled` carries the local runtime. `store` carries the same runtime under +Partner Center's package identity. `light` is a remote-only client without +Python or a local agent. Light has build/feed support but no release matrix leg. + +## Payload contents + +The bundled payload contains: + +- The release's source snapshot without `.git`. +- Pinned CPython and uv, plus a ready Python dependency tree. +- Node.js, npm, supported managed tools, and prebuilt TUI/dashboard assets. +- A manifest, tool facts, the installed feature list, and build provenance. +- Generated CLI launchers from the archived project's script declarations. + +`pm/lock.json` owns managed-tool pins. `pyproject.toml` and `uv.lock` own Python +requirements. Native staging uses `--all-extras`, subject to platform markers, +minus the extras `[tool.hermes] opt-in-extras` names (installed only when the +user selects them). This is broader than the source installer's extra named `all`. + +The backend runs from app resources. Launchers execute the store interpreter +with the source and dependency paths; they do not boot through a relocated +venv executable. Startup can create user-state records and CLI links. +Provider calls, model downloads, and optional integration setup can still use +the network. + +Git is a platform exception: Windows stages Git for Windows with Bash. +POSIX targets use system Git. A Mac without Command Line Tools can therefore +need them for Git-dependent operations. + +User data remains outside the package. Optional additions use writable PM +storage and complete Python environment generations, not writes into the app. +See [Package management](../../website/docs/reference/package-management.md). + +## Python runtime contract + +The PM bundle builder records interpreter and dependency paths in the payload +manifest. `scripts/write-build-stamp.mjs` copies that runtime contract into the +desktop stamp. The desktop build embeds the stamp in Electron. +`electron/payload-backend.ts` reads `runtime.sitePackages` from this stamp. +It does not select a Python version or search for dependency directories. + +Staging does not prove native startup or package replacement. Those checks +use the [bundled-update acceptance suite](../../tests/install/BUNDLED_UPDATES.md). +Acceptance requires a native run with the actual signed release artifacts. + +Packaged tool facts describe the final bytes, not only the staged archives. +Windows refreshes the tool digests after sanitization and batch signing. +The macOS custom signer retains the builder's entitlements and file selection. +It refreshes digests after child signatures and before the outer app signature. +Unsigned macOS builds refresh them at the end of `afterPack`. +Do not refresh facts in `afterSign`: that changes resources covered by the signature. + +## Complete native build + +From a clean checkout whose `HEAD` equals the release tag, run: + +```sh +python scripts/bundles/desktop.py --tag=vX.Y.Z +``` + +Replace `vX.Y.Z` with an actual immutable tag. Stable tags must match the +version in `pyproject.toml`. Canary tags use the release script's tag grammar. +Start with host Python 3.11+ and Git. Use `python3` if that is your host's command. +Preparation asks PM for the pinned Python, Node, npm and private installer; +preinstalling a separate Node/npm/uv toolchain is not required. Native dependency +builds still need the platform's compiler, SDK and libraries. Windows ARM64 uses +the shared Visual Studio/Clang/Rust/static OpenSSL preparation provider, which +can require Administrator permissions for missing system components. macOS +requires its native developer tools. This is not a hermetic host SDK. + +The builder: + +1. Admits the clean source revision and prepares managed tools in isolated build state. +2. Prepares the locked JS workspace union, icon environment, Electron-native bindings, + packaging utilities, and the application/independent PM environments when selected. +3. Compiles icons and the selected TUI, dashboard and desktop products. +4. Assembles the PM payload, places JS assets, relocates links, and generates launchers. +5. Consumes the prepared Electron archive and utilities to package the current OS. + +Use `--variant store` with a stable tag on Windows, or `--variant light` for the remote client. +Arguments after `--` go to the prepared wrapper, which rejects overrides of +the admitted target, tools, output and configuration. `electron-builder.config.cjs` +is the sole packaging configuration. The wrapper disables automatic publishing; +the release workflow owns uploads and channel promotion. + +`pm bundle --out DIR --ref REF` stages the native runtime only. +`scripts/bundles/stage.py` also builds the TUI/dashboard unless both products +are supplied explicitly. Both generate launchers; neither creates an Electron installer. +The launcher stage checks the payload and records its relative launch paths. +The Electron build bakes these paths into its stamp. Desktop startup does not +inspect, create, or repair a PM payload. Non-bundled builds carry no placeholder payload. +See [shared bundle builds](../../docs/shared-bundle-builds.md) for Termux reuse. + +### Prepare once, then build + +CI and local builds share the same split interface: + +```sh +python scripts/bundles/desktop.py --tag vX.Y.Z --variant bundled --prepare-only \ + --work "$PWD/.build/desktop-job" --cache "$PWD/.cache/desktop-inputs" +python scripts/bundles/desktop.py --prepared "$PWD/.build/desktop-job/prepared.json" +``` + +The displayed paths are the defaults. Use separate build-owned work/cache roots; +do not pre-create the work directory. `prepared.json` is published after every +provider succeeds and contains absolute paths for this job, not a portable cache. +After relocation or a source/lock/tool change, prepare again. Consumption rejects +missing or changed dependencies without repairing or downloading them. Stable +Windows builds can consume one preparation for `--variant bundled` and then +`--variant store`; light and commit preparations cannot switch to Store. + +Release jobs restore candidates, prepare, save reusable inputs, and only then +build/sign. Job-local environments, credentials, products and signature results +are not dependency snapshot inputs. The signature cache retains its own lifetime. +Commit jobs request token-enforced read-only cache access; the conditional YAML +mode still needs GitHub acceptance (see the +[cache-policy caveat](../../docs/shared-bundle-builds.md#cache-ownership)). A +separate key or skipped save alone would not protect release caches. Archival remains an independent +prerequisite, and R2 upload credentials are not exposed to desktop preparation. + +Strict consumption means no dependency acquisition, not offline signing. +Timestamp services, Azure signing, Apple notarization and publication remain +online operations. Validate unsigned packaging with dependency networking denied +on each target, then verify signed installers and launchers on their native hosts. + +macOS packaging retains the caller's login `HOME` for keychain import and signing. +An explicit keychain path does not make Security.framework work under a scratch +home. Dependency preparation and product compilation still use the isolated home. +Hermes state and explicit dependency-cache paths remain build-owned during packaging. + +## Commit-only builds + +To preview a build for a pushed revision, run: + +```sh +python scripts/release.py --build-commit REV --remote origin +``` + +The command fetches the remote and resolves `REV` to a full commit SHA. +It prints the dispatch command without changing local branches, tags, or releases. +Add `--publish` to dispatch that build. This flag does not publish a release +in commit-build mode. + +Use repeatable `--bundle-env NAME=VALUE` options to bake non-secret runtime +defaults into the desktop app, for example: + +```sh +python scripts/release.py --build-commit REV --remote fork --publish \ + --bundle-env HERMES_GUEST_ONBOARDING=1 \ + --bundle-env HERMES_DATA_DIR_SUFFIX=magic-test \ + --bundle-unset HERMES_HOME +``` + +These defaults run before Electron initializes its paths and are inherited by +local backend processes. Explicit runtime environment values win, including +empty values. Do not pass secrets: the values are visible in the workflow inputs +and packaged JavaScript. This option affects desktop bundles, not Termux. +The suffix is appended literally; include a leading hyphen if desired. +`--bundle-unset NAME` explicitly clears an inherited value at app launch, even +if the caller supplied it. Internally it sets the value to an empty string, not +an absent key. Clearing `HERMES_HOME` also disables the Windows registry fallback: +older installers saved that variable permanently, which otherwise takes priority +over the test suffix. It does not edit the registry or the existing install. +For full data-path isolation, also clear `HERMES_DESKTOP_USER_DATA_DIR` if that +machine uses an explicit Electron directory. Ordinary defaults still preserve +runtime overrides; `--bundle-env HERMES_HOME=` is a default, not a forced clear. + +For local commit builds, `HERMES_BUNDLE_ENV_JSON` accepts a JSON object whose +string values are defaults and whose `null` values are explicit clears. For example, +`{"HERMES_HOME":null,"HERMES_DATA_DIR_SUFFIX":"magic-test"}`. Only +`HERMES_HOME`, `HERMES_DATA_DIR_SUFFIX`, `HERMES_DESKTOP_USER_DATA_DIR`, +`HERMES_SHARED_AUTH_DIR`, `HERMES_GUEST_ONBOARDING`, and `HERMES_SKIP_INTRO` +are accepted. Process-control variables such as `NODE_OPTIONS` and `PATH` +are rejected. These settings are not applied to the build runner itself. +Commit archive keys still use the SHA, so use a fresh commit for different +defaults: an existing artifact is never overwritten with different bytes. + +The workflow must exist on the repository's default branch. Admission requires +a default-branch `workflow_dispatch` and repository write, maintain, or admin +permission for both the original actor and the actor who reruns it. +It rejects mixed tag, release-phase, channel-publication, and upgrade inputs. + +Builder jobs check out the admitted SHA. Their artifacts and completion receipts +go to `releases/commit/FULL_SHA/`, separate from tag archives and update channels. +The run summary lists Windows sideload packages and their universal bundle, macOS DMG/ZIP +files, and the Termux package. Linux release legs remain disabled and are listed +as not built. Only receipt-listed artifacts that exist in storage get download +links. Missing receipts show the failed or incomplete leg. + +Each commit build also writes a downloads page to +`releases/commit//index.html` on the R2 public origin; a tag run +writes its channel page instead (`releases/stable/index.html` or +`releases/canary/index.html`). Pages list only objects the build actually +staged, and a re-run of an older tag never replaces a newer channel page. +`release.py --build-commit` prints the commit page URL before dispatching. + +Commit builds require the signing credentials used by their release legs. +They do not produce Store packages or submit to Partner Center. No GitHub +release, updater feed, or APT channel is changed. +An identical upload retry can succeed. Different bytes at an existing commit +object key fail rather than replace that object. + +For a local native build, check out the exact SHA and run: + +```sh +python scripts/bundles/desktop.py --commit=FULL_SHA --variant=bundled +``` + +The builder uses that commit's project version. Sideload MSIX versions append +`.0`. The shared MSIX version helper can derive Store versions from commit timestamps, +but this desktop preparation interface only admits Store packaging for stable tags. +Commit-built stamps disable automatic release-channel updates. Local command and transport tests do not +replace signed-package installation and update acceptance on each native host. + +## Windows signing and App Installer + +The signing jobs provide `AZURE_SIGN_ENDPOINT`, `AZURE_SIGN_ACCOUNT`, +`AZURE_SIGN_PROFILE`, `AZURE_SIGN_PUBLISHER`, and `AZURE_CLIENT_ID`, plus +Azure authentication. Do not pass publisher names through shell-split `-c` +arguments. Local unsigned builds are not release-acceptance artifacts. + +The packaging hooks sanitize invalid PE certificate tables, then sign and +timestamp payload EXEs/DLLs. The product EXE receives its signature after +resource edits. `scripts/sign-msix.mjs` signs the sideload package envelope. +Store package envelopes remain unsigned for Partner Center to sign. + +Unchanged payload files reuse verified signatures from +`${ELECTRON_BUILDER_CACHE}-payload-signatures`. The key binds input bytes, +Azure policy, signing tools, and timestamp policy. Filenames and release +versions do not determine identity. A hit must match executable content and +pass Authenticode publisher/timestamp checks. Invalid entries become misses. +The product EXE and package envelopes still receive fresh signatures. + +The `before-build.mjs` hook generates MSIX extensions from payload launcher +names. One execution-alias extension carries the CLI aliases. The manifest +also registers the Copilot hardware-key provider. Its minimum Windows version +is part of the package contract. + +The release job combines only matching sideload packages from both architectures. +Store packages never enter the sideload bundle. It publishes bundle bytes before +the channel descriptor at `releases/win32/CHANNEL/CHANNEL.appinstaller`. +Light uses `releases/win32/light/CHANNEL/`. + +Windows records the descriptor source at installation. The app checks that +registered source through WinRT and distinguishes an unknown result from no +update. Apply downloads the descriptor before teardown, then opens the local +`.appinstaller` file. It does not require the disabled `ms-appinstaller:` protocol. +The app registers a detached relaunch waiter before handoff. + +The build stamp declares `updateMechanism`: `app-installer` for sideload bundles, +`microsoft-store` for Store builds, `electron-updater` for macOS packages, and +`self` for source-built apps. Settings shows Microsoft Store for a Store build. +The runtime does not infer Store ownership from Electron flags or carry a +second Store boolean. Windows Light declares `external` because it has no +bundled Python checker. Its OS-registered App Installer source still owns +automatic updates. + +Store builds use `Windows.Services.Store.StoreContext` to check, download, +and request installation inside Hermes. The native consent UI attaches to the +current desktop window. Download finishes before backend shutdown; the existing +relaunch waiter is registered before the install request. Unknown checks, +cancellation and request failures do not count as successful updates. Native +acceptance requires a Store-acquired package or flight, not a sideloaded MSIX. + +On Windows bundles, PM copies the verified pinned base Python to its writable +store for uv builds. The app and execution aliases retain their signed bundled +launchers and bundled Python, which load the selected dependency generation. +The new venv's generated console scripts must not replace those launchers: +out-of-package Python cannot launch the packaged tools. + +Sideload stable versions are `X.Y.Z.0`. Canary revisions derive from elapsed +minutes after the stable baseline. The release script rejects ambiguous or +overflowing cuts. Store versions use `year.hour-of-year.second-of-hour.0` in UTC, +with the fourth component reserved for Microsoft. App semver and package +version are different facts. `scripts/msix-shared.mjs` owns these derivations. + +## macOS signing and updates + +`CSC_LINK` and `CSC_KEY_PASSWORD` supply the Developer ID identity. +The notarization hook accepts `APPLE_API_KEY`, `APPLE_API_KEY_ID`, and +`APPLE_API_ISSUER`, or a keychain profile. CI materializes the API key from +`APPLE_API_KEY_P8`. + +The app and nested Mach-O binaries, including Chromium, must be signed before +notarization. The existing after-sign hook owns submission and stapling. +Publication checks signatures, the stapled ticket, and Gatekeeper assessment. +Unsigned local builds do not satisfy these gates. + +Both DMG and ZIP artifacts are required by the release pipeline. The ZIP is +the update artifact, not an optional duplicate of the download DMG. +See [macOS bundle updates](../../docs/macos-bundle-updates.md) for feed validation +and native-event ordering. + +### DMG detach diagnostics + +The builder wrapper reports `[dmg-detach]` snapshots when dmgbuild cannot detach +its staging image. It runs `lsof` before the supplier retries or performs forced +cleanup. The snapshot identifies the mounted filesystem, backing image and +devices, then lists process names, PIDs, parent PIDs, users, descriptors and paths. + +The queries use noninteractive `sudo` when available. Permission failures and +query timeouts are reported explicitly. Empty output does not prove that the +image has no holder. The shim does not stop processes or change detach results, +retry settings, signing or notarization. Explicit `CUSTOM_DMGBUILD_PATH` +overrides outside the prepared path are not an escape hatch for strict builds. +Prepared packaging supplies the admitted dmgbuild path to the diagnostics shim. +Changes to its preparation provider need native DMG/detach and +signing/notarization acceptance; a successful download is not native execution proof. + +## Development, assets, and verification + +Prepare and activate the [PM developer environment](../../website/docs/reference/package-management.md#developer-workflow) +first. Use Bash `source ./activate` or PowerShell `. .\activate.ps1`, and keep a +separate development home. Activation supplies the toolchain, not `node_modules`. + +From the repository root: + +```sh +npm ci +npm run dev --workspace apps/desktop +``` + +For an ordinary package of that desktop build, use the workspace's +`dist:win`, `dist:mac`, `dist:linux`, or `pack` command. Those commands do not +replace the complete tagged build described above. + +Icons are generated from `assets/nous-girl-*.svg` and `assets/backgrounds/`. +`node scripts/generate-icons.mjs` renders them with the Hermes runtime Python +(`HERMES_PYTHON`, else `python` on PATH); Pillow and resvg-py are core +dependencies. Generated PNG/ICO/ICNS files are not source assets. + +[Stable release admission](../../docs/stable-releases.md) requires the full +pipeline, not just successful packaging. Native signed-package update tests +live in the [existing install/update family](../../tests/install/BUNDLED_UPDATES.md). +A helper test or unpacked-app smoke is not proof of native install, update, +or automatic relaunch. Historical receipts and current unresolved gates are +separate in [PM audit status](../../docs/pm-audit-status.md). diff --git a/apps/desktop/DESIGN.md b/apps/desktop/DESIGN.md index cfa8ed889ca68..775fc9e5303b4 100644 --- a/apps/desktop/DESIGN.md +++ b/apps/desktop/DESIGN.md @@ -63,6 +63,16 @@ one-off at the call site. - **Projects own workspace cwd.** Use Sidebar → Projects for local folders and worktrees; do not reintroduce a per-session/right-sidebar folder-picker flow. +Profile icons and condensed profile rows offer **Open in new window** and +**Set as default** in their existing context menus. Opening a profile creates a +full peer window without switching the source window. The desktop default +applies at startup and to generic new chats; explicit profile/project actions +and profile-specific windows keep their own destinations. Changing the default +does not move existing sessions or replace the active conversation. +Ordinary **New Window** (`⌘⇧N` / `Ctrl+Shift+N`) inherits its opener's device and +profile only at startup, not as a window-specific default. Later device/profile +selections remain authoritative for new chats unless a desktop default is set. + Navigation must preserve context. A background session finishing, a tool result arriving, or a project refresh may update badges and cached data; it must not replace the foreground transcript or steal focus. @@ -82,10 +92,59 @@ Don't add per-overlay `shadow-[…]` or `border-(--ui-stroke-secondary)` one-offs; if elevation needs to change, change the token. Menus and popovers use their own shared `shadow-md` + -`--ui-stroke-secondary` primitive treatment. Drag affordances may use tokenized +`--ui-stroke-secondary` primitive treatment. Every floating list — +`DropdownMenu`, `Select`, and Popover + cmdk pickers +(`` + ``) — paints +through `src/components/ui/menu.ts`, so a list reads the same wherever it +opens. Typed fields with suggestions use `ComboboxInput`, never +`` + `` (Chromium paints that as its own OS popup). + +Drag affordances may use tokenized dashed targets and local blur. These are semantic surface classes, not licenses for call-site shadow or border inventions. +**Queued cards:** `CardStack` (`src/components/ui/card-stack.tsx`) consumes a live, +keyed list, retaining the current item when more arrive. Inline and floating +approvals and both toast placements share its gesture handling and geometry. +The Cursor-reference treatment uses one 96%-scale silhouette 7px above the +front, 220ms promotion, and 180ms upward clearance; no rotation or lateral throw +on button/keyboard decisions. Consumers supply the existing surface tokens and +own the exact-request response. Gestures never grant approval. Departing cards +are immediately inert; toasts can expand to the full live list. One persistent +transcript-level host owns approvals, independent of tool rows and assistant +message boundaries. Prepared approvals can precede tool.start: execution must +not relocate or remount the stack. While approvals remain, a real activity line +above the cards changes from awaiting approval to current-turn command status; +represented execution rows appear only when explicitly expanded. Empty text +continuations must not introduce paragraph gaps. Keep inline approvals beside +the conversation and let genuine content scroll normally; do not inject padding +or write scroll offsets to pin the decision. Preview this order with delayed +start and completion events, not pre-created tool rows. Final approval removal +retires both the painted card and its measured layout footprint; restoring tool +rows must not insert their full height before the outgoing stack can settle. +No completion callback may clear the measurement of a newly arrived card. +Reduced motion settles immediately without retaining empty clearance. + +## Window background behavior + +Settings → Appearance → Window layout offers **Minimize to tray**, off by default and +local to this desktop installation. When enabled, minimizing ordinary windows +hides them without stopping their work. Close, Alt+F4, and Cmd+Q keep their +normal behavior. The tray's **Show Hermes** restores hidden windows; +**Quit Hermes** keeps the ordinary active-work confirmation and teardown. +On macOS the tray lives in the menu bar; the Dock icon hides only when no normal +window remains visible and returns on restore. If the tray is unavailable, +ordinary minimize/close behavior is retained rather than hiding an unreachable app. + +## Window glass + +Glass defaults to **29% Tint, Sidebar only** in both light and dark appearances. +Fade defaults to zero so the content column and text stay opaque. Native frost +keeps its platform/appearance defaults. Explicitly saved settings take precedence; +changing defaults must not overwrite a user's existing choices. The shared +`apps/shared/src/translucency.ts` resolver owns these defaults for both the +renderer and Electron's first window paint. + ## Stroke & color tokens | Token | Use | @@ -99,8 +158,9 @@ for call-site shadow or border inventions. | `--chrome-action-hover` | hover fill for quiet controls | | `--theme-primary`, `--ui-accent` | brand/accent | -Never hardcode `border-gray-*`, `bg-white`, `text-black`, etc. The white tile in -`BrandMark` is the one sanctioned literal (the mark needs a fixed backdrop). +Never hardcode `border-gray-*`, `bg-white`, `text-black`, etc. The two tiles in +`BrandMark` (white in light mode, `#0d1117` in dark) are the sanctioned literals +(the mark needs a fixed backdrop). ## Buttons — one component @@ -109,9 +169,12 @@ do **not** pass `h-*`, `px-*`, `py-*`, or icon-size overrides. **Variants:** `default` (primary), `destructive`, `secondary` (soft fill — the default non-primary look), `outline` (transparent + 1px inset ring, no -fill/shadow), `ghost`, `link`, `text` (boxless quiet inline — "Cancel", -"Clear"), `textStrong` (bold underlined inline affordance — "Change", -"Open logs"). +fill/shadow), `ghost`, `floating` (a control loose from any surface — opaque +popover fill + `shadow-md`, hover lifts the glyph only), `link`, `text` +(boxless quiet inline — "Cancel", "Clear"), `textStrong` (bold underlined +inline affordance — "Change", "Open logs"). +`grip` is the quiet, fill-free drawer handle; pair it with size `grip` for a +48×16 hit area around a small horizontal ridge. **Sizes:** `default`, `xs`, `sm`, `lg`, `inline` (flush, zero box — for buttons that sit inside a heading/sentence; replaces `h-auto px-0 py-0`), `micro` @@ -143,8 +206,16 @@ fails on any `