From 064634d8ad35ff523711f14f1e7ef3cf124559ae Mon Sep 17 00:00:00 2001 From: agentforce314 Date: Fri, 7 Aug 2026 23:02:58 -0700 Subject: [PATCH] feat(desktop): import ui-desktop, the ClawCodex Desktop app shell (stage 1) Ports the desktop app from the reference implementation into ui-desktop/ as a standalone npm project, fully rebranded for ClawCodex: - Electron + Vite + React renderer, main process, e2e specs, build scripts, and the shared types package vendored at ui-desktop/packages/shared (@clawcodex/shared), mirroring the ui-tui/packages convention. - Identity map applied throughout: product/app names, com.clawcodex.desktop appId, clawcodex:// deep-link scheme, CLAWCODEX_* env surface (profile dir maps to CLAWCODEX_CONFIG_DIR), config paths, i18n strings across all 5 locales, installer metadata. - New ClawCodex claw-mark icon set (icns/ico/png) and brand mark; upstream mascot art dropped (unreferenced) or replaced. - Self-contained build: local node_modules resolution (vite aliases, fs.allow, electron-rebuild, root-install assert), vendored shared eslint flat config, lint toolchain as exact-pinned devDeps, fresh committed package-lock.json. - Cloud-portal/billing surfaces kept compiling but quarantined behind an inert portal.invalid base URL, following the TUI port precedent. Gates measured against the reference on the same machine: - typecheck (renderer + electron + e2e tsconfigs): green, matches reference - eslint: 0 errors / 88 warnings, identical to reference - vitest: 4,249 passed / 274 failed / 38 failing files - failure set is byte-identical to the reference baseline (pre-existing upstream failures) Backend wiring (clawcodex serve + boot ladder) is stage 2; this stage makes no wiring claims - the app still targets the reference backend contract under renamed identifiers. Co-Authored-By: Claude Fable 5 --- ui-desktop/AGENTS.md | 210 + ui-desktop/DESIGN.md | 337 + ui-desktop/README.md | 41 + ui-desktop/assets/icon.icns | Bin 0 -> 323399 bytes ui-desktop/assets/icon.ico | Bin 0 -> 360414 bytes ui-desktop/assets/icon.png | Bin 0 -> 157814 bytes ui-desktop/components.json | 21 + ui-desktop/e2e/boot-failure.spec.ts | 53 + ui-desktop/e2e/boot.spec.ts | 63 + ui-desktop/e2e/chat.spec.ts | 138 + .../e2e/correction-session-switch.spec.ts | 249 + ui-desktop/e2e/fix-electron-tracing.ts | 72 + ui-desktop/e2e/fixtures.ts | 735 + .../e2e/hidden-history-messages.spec.ts | 147 + .../e2e/image-attachment-resume.spec.ts | 197 + ui-desktop/e2e/interim-messages.spec.ts | 215 + ui-desktop/e2e/large-session-resume.spec.ts | 255 + ui-desktop/e2e/launch-packaged-app.spec.ts | 88 + ui-desktop/e2e/mock-backend-setup.spec.ts | 87 + ui-desktop/e2e/mock-server.ts | 869 + ui-desktop/e2e/onboarding.spec.ts | 76 + ui-desktop/e2e/queue-turn-boundary.spec.ts | 119 + ui-desktop/e2e/real-session-builder.ts | 239 + ui-desktop/e2e/right-pane.spec.ts | 138 + ...session-compression-and-queue-stop.spec.ts | 139 + ui-desktop/e2e/sidebar-states.spec.ts | 268 + ui-desktop/e2e/submit-drift.spec.ts | 75 + ui-desktop/e2e/test.ts | 166 + ui-desktop/e2e/tile-unread-bug.spec.ts | 240 + ui-desktop/e2e/visual-snapshot.ts | 150 + ui-desktop/e2e/warm-resume-jitter.spec.ts | 460 + ui-desktop/e2e/worktree-branch-status.spec.ts | 243 + .../electron/active-runtime-state.test.ts | 60 + ui-desktop/electron/active-runtime-state.ts | 58 + ui-desktop/electron/backend-child.ts | 55 + ui-desktop/electron/backend-command.test.ts | 65 + ui-desktop/electron/backend-command.ts | 48 + .../electron/backend-connection-state.test.ts | 70 + .../electron/backend-connection-state.ts | 84 + ui-desktop/electron/backend-env.test.ts | 191 + ui-desktop/electron/backend-env.ts | 161 + ui-desktop/electron/backend-health.test.ts | 340 + ui-desktop/electron/backend-health.ts | 169 + ui-desktop/electron/backend-probes.test.ts | 127 + ui-desktop/electron/backend-probes.ts | 221 + ui-desktop/electron/backend-ready.test.ts | 218 + ui-desktop/electron/backend-ready.ts | 206 + .../electron/backend-start-failure.test.ts | 52 + ui-desktop/electron/backend-start-failure.ts | 72 + .../electron/bootstrap-platform.test.ts | 86 + ui-desktop/electron/bootstrap-platform.ts | 110 + .../electron/bootstrap-repair-guard.test.ts | 109 + ui-desktop/electron/bootstrap-repair-guard.ts | 121 + ui-desktop/electron/bootstrap-runner.test.ts | 274 + ui-desktop/electron/bootstrap-runner.ts | 1037 + ui-desktop/electron/connection-apply.test.ts | 100 + ui-desktop/electron/connection-apply.ts | 57 + ui-desktop/electron/connection-config.test.ts | 700 + ui-desktop/electron/connection-config.ts | 589 + ui-desktop/electron/crash-forensics.test.ts | 70 + ui-desktop/electron/crash-forensics.ts | 51 + ui-desktop/electron/dashboard-token.test.ts | 147 + ui-desktop/electron/dashboard-token.ts | 112 + .../electron/desktop-electron-pin.test.ts | 109 + .../electron/desktop-installation.test.ts | 105 + ui-desktop/electron/desktop-installation.ts | 137 + ui-desktop/electron/desktop-uninstall.test.ts | 251 + ui-desktop/electron/desktop-uninstall.ts | 268 + ui-desktop/electron/dev-cdp.test.ts | 94 + ui-desktop/electron/dev-cdp.ts | 108 + ui-desktop/electron/embed-referer.ts | 48 + .../electron/entitlements.mac.inherit.plist | 16 + ui-desktop/electron/entitlements.mac.plist | 16 + ui-desktop/electron/event-dedupe.test.ts | 37 + ui-desktop/electron/event-dedupe.ts | 32 + ui-desktop/electron/find-git-bash.test.ts | 54 + ui-desktop/electron/find-git-bash.ts | 67 + ui-desktop/electron/find-in-page.test.ts | 222 + ui-desktop/electron/find-in-page.ts | 120 + .../electron/first-run-setup-gate.test.ts | 133 + ui-desktop/electron/first-run-setup-gate.ts | 146 + .../first-run-setup-main-process.test.ts | 119 + ui-desktop/electron/fs-read-dir.test.ts | 375 + ui-desktop/electron/fs-read-dir.ts | 111 + ui-desktop/electron/gateway-ws-probe.test.ts | 134 + ui-desktop/electron/gateway-ws-probe.ts | 227 + ui-desktop/electron/git-repo-scan.test.ts | 79 + ui-desktop/electron/git-repo-scan.ts | 168 + ui-desktop/electron/git-review-ops.test.ts | 119 + ui-desktop/electron/git-review-ops.ts | 725 + ui-desktop/electron/git-root.test.ts | 42 + ui-desktop/electron/git-root.ts | 50 + ui-desktop/electron/git-worktree-ops.test.ts | 437 + ui-desktop/electron/git-worktree-ops.ts | 518 + ui-desktop/electron/hardening.test.ts | 354 + ui-desktop/electron/hardening.ts | 366 + ui-desktop/electron/link-title-window.test.ts | 130 + ui-desktop/electron/link-title-window.ts | 75 + .../electron/main-window-lifecycle.test.ts | 72 + ui-desktop/electron/main-window-lifecycle.ts | 28 + ui-desktop/electron/main.ts | 12038 +++++++++++ .../electron/native-auth-decisions.test.ts | 132 + ui-desktop/electron/native-auth-decisions.ts | 144 + .../electron/native-oauth-login.test.ts | 173 + ui-desktop/electron/native-oauth-login.ts | 215 + ui-desktop/electron/native-oauth.test.ts | 225 + ui-desktop/electron/native-oauth.ts | 239 + .../electron/native-token-store.test.ts | 423 + ui-desktop/electron/native-token-store.ts | 165 + ui-desktop/electron/oauth-net-request.test.ts | 39 + ui-desktop/electron/oauth-net-request.ts | 17 + ui-desktop/electron/power-save.test.ts | 58 + ui-desktop/electron/power-save.ts | 50 + ui-desktop/electron/preload.ts | 355 + .../electron/primary-backend-startup.test.ts | 110 + .../electron/primary-backend-startup.ts | 65 + .../electron/primary-connection-rehome.ts | 35 + .../electron/profile-delete-routing.test.ts | 82 + ui-desktop/electron/profile-delete-routing.ts | 95 + .../electron/profile-session-routing.test.ts | 30 + .../electron/profile-session-routing.ts | 19 + ui-desktop/electron/quick-entry.test.ts | 240 + ui-desktop/electron/quick-entry.ts | 421 + ui-desktop/electron/quit-guard.test.ts | 62 + ui-desktop/electron/quit-guard.ts | 92 + ui-desktop/electron/remote-lifecycle.test.ts | 1093 + ui-desktop/electron/remote-lifecycle.ts | 907 + ui-desktop/electron/remote-liveness.test.ts | 353 + ui-desktop/electron/remote-liveness.ts | 244 + ui-desktop/electron/session-windows.test.ts | 223 + ui-desktop/electron/session-windows.ts | 162 + .../electron/spawn-helper-perms.test.ts | 159 + ui-desktop/electron/spawn-helper-perms.ts | 122 + .../ssh-bootstrap-coordinator.test.ts | 193 + .../electron/ssh-bootstrap-coordinator.ts | 131 + ui-desktop/electron/ssh-config.test.ts | 104 + ui-desktop/electron/ssh-config.ts | 175 + ui-desktop/electron/ssh-connection.test.ts | 866 + ui-desktop/electron/ssh-connection.ts | 921 + ui-desktop/electron/stream-throttle.test.ts | 152 + ui-desktop/electron/stream-throttle.ts | 119 + .../electron/titlebar-overlay-width.test.ts | 55 + ui-desktop/electron/titlebar-overlay-width.ts | 42 + ui-desktop/electron/update-count.test.ts | 128 + ui-desktop/electron/update-count.ts | 30 + ui-desktop/electron/update-gate.test.ts | 144 + ui-desktop/electron/update-gate.ts | 95 + ui-desktop/electron/update-marker.test.ts | 179 + ui-desktop/electron/update-marker.ts | 182 + ui-desktop/electron/update-rebuild.test.ts | 65 + ui-desktop/electron/update-rebuild.ts | 29 + ui-desktop/electron/update-relaunch.test.ts | 244 + ui-desktop/electron/update-relaunch.ts | 314 + ui-desktop/electron/update-remote.test.ts | 79 + ui-desktop/electron/update-remote.ts | 65 + ui-desktop/electron/updater-process.test.ts | 167 + ui-desktop/electron/updater-process.ts | 141 + ui-desktop/electron/venv-blocker-scan.test.ts | 218 + ui-desktop/electron/venv-blocker-scan.ts | 214 + .../electron/vscode-marketplace.test.ts | 113 + ui-desktop/electron/vscode-marketplace.ts | 337 + ui-desktop/electron/wake-indicator-window.ts | 174 + ui-desktop/electron/wake-indicator.test.ts | 143 + ui-desktop/electron/wake-indicator.ts | 34 + ui-desktop/electron/window-state.test.ts | 157 + ui-desktop/electron/window-state.ts | 148 + .../electron/windows-child-options.test.ts | 132 + ui-desktop/electron/windows-child-options.ts | 37 + .../electron/windows-clawcodex-path.test.ts | 214 + ui-desktop/electron/windows-clawcodex-path.ts | 291 + .../electron/windows-remote-lifecycle.test.ts | 149 + .../electron/windows-remote-lifecycle.ts | 462 + .../electron/windows-remote-live.test.ts | 106 + .../electron/windows-sandbox-fallback.test.ts | 366 + .../electron/windows-sandbox-fallback.ts | 394 + ui-desktop/electron/windows-system-ca.test.ts | 96 + ui-desktop/electron/windows-system-ca.ts | 53 + ui-desktop/electron/windows-user-env.test.ts | 87 + ui-desktop/electron/windows-user-env.ts | 99 + ui-desktop/electron/workspace-cwd.test.ts | 34 + ui-desktop/electron/workspace-cwd.ts | 34 + .../electron/wsl-clipboard-image.test.ts | 124 + ui-desktop/electron/wsl-clipboard-image.ts | 102 + ui-desktop/electron/wsl-path-bridge.test.ts | 41 + ui-desktop/electron/wsl-path-bridge.ts | 137 + ui-desktop/electron/zoom.test.ts | 221 + ui-desktop/electron/zoom.ts | 117 + ui-desktop/eslint.config.mjs | 81 + ui-desktop/eslint.config.shared.mjs | 106 + ui-desktop/index.html | 39 + ui-desktop/package-lock.json | 17078 ++++++++++++++++ ui-desktop/package.json | 282 + ui-desktop/packages/shared/eslint.config.mjs | 5 + ui-desktop/packages/shared/package.json | 24 + .../src/billing-payment-method.test-d.ts | 24 + .../packages/shared/src/billing-policy.ts | 46 + .../packages/shared/src/billing-types.ts | 363 + .../packages/shared/src/charge-settlement.ts | 89 + ui-desktop/packages/shared/src/index.ts | 68 + .../packages/shared/src/json-rpc-gateway.ts | 429 + .../shared/src/skill-scaffold.test.ts | 61 + .../packages/shared/src/skill-scaffold.ts | 69 + ui-desktop/packages/shared/src/skin.ts | 110 + .../packages/shared/src/websocket-url.ts | 151 + ui-desktop/packages/shared/tsconfig.json | 15 + ui-desktop/playwright.config.ts | 63 + ui-desktop/preview-demo.html | 65 + ui-desktop/public/apple-touch-icon.png | Bin 0 -> 26396 bytes ui-desktop/public/clawcodex-mark.png | Bin 0 -> 14603 bytes ui-desktop/public/ds-assets/filler-bg0.jpg | Bin 0 -> 3871968 bytes ui-desktop/scripts/.gitignore | 1 + ui-desktop/scripts/after-pack.mjs | 41 + ui-desktop/scripts/assert-dist-built.mjs | 69 + ui-desktop/scripts/assert-dist-built.test.mjs | 84 + ui-desktop/scripts/assert-root-install.mjs | 11 + ui-desktop/scripts/before-build.mjs | 11 + ui-desktop/scripts/before-pack.mjs | 154 + ui-desktop/scripts/before-pack.test.mjs | 155 + ui-desktop/scripts/bundle-electron-main.mjs | 65 + ui-desktop/scripts/click-session.mjs | 51 + ui-desktop/scripts/dev-mock.mjs | 237 + ui-desktop/scripts/dev-no-hmr.mjs | 22 + ui-desktop/scripts/diag-code-live.mjs | 25 + ui-desktop/scripts/diag-drag-churn.mjs | 158 + ui-desktop/scripts/diag-drag-trace.mjs | 217 + ui-desktop/scripts/diag-jump.mjs | 115 + ui-desktop/scripts/diag-key-latency.mjs | 47 + ui-desktop/scripts/diag-live-state.mjs | 21 + ui-desktop/scripts/diag-overlay-ab.mjs | 61 + ui-desktop/scripts/diag-overlay-churn.mjs | 161 + ui-desktop/scripts/diag-overlay-full.mjs | 201 + ui-desktop/scripts/diag-overlay-sweep.mjs | 110 + ui-desktop/scripts/diag-real-loop.mjs | 149 + ui-desktop/scripts/diag-ro-storm.mjs | 170 + ui-desktop/scripts/diag-scroll-reset.mjs | 229 + ui-desktop/scripts/diag-sidebar-dom.mjs | 27 + ui-desktop/scripts/diag-switch-autopsy.mjs | 52 + ui-desktop/scripts/diag-switch-trace.mjs | 74 + ui-desktop/scripts/eval.mjs | 46 + ui-desktop/scripts/gen-share-codes.ts | 171 + ui-desktop/scripts/live-drive.mjs | 290 + ui-desktop/scripts/notarize-artifact.mjs | 77 + ui-desktop/scripts/notarize.mjs | 100 + .../patch-electron-builder-mac-binary.mjs | 64 + ui-desktop/scripts/perf/README.md | 93 + ui-desktop/scripts/perf/baseline.json | 79 + ui-desktop/scripts/perf/run.mjs | 221 + .../scripts/perf/scenarios/cold-start.mjs | 18 + .../scripts/perf/scenarios/first-token.mjs | 84 + .../scripts/perf/scenarios/idle-cost.mjs | 284 + ui-desktop/scripts/perf/scenarios/index.mjs | 39 + .../scripts/perf/scenarios/keystroke.mjs | 99 + .../scripts/perf/scenarios/multitab.mjs | 246 + .../scripts/perf/scenarios/profile-switch.mjs | 60 + .../scripts/perf/scenarios/render-churn.mjs | 259 + .../scripts/perf/scenarios/right-pane.mjs | 315 + .../scripts/perf/scenarios/session-load.mjs | 136 + .../scripts/perf/scenarios/session-switch.mjs | 80 + .../scripts/perf/scenarios/stream-history.mjs | 18 + ui-desktop/scripts/perf/scenarios/stream.mjs | 215 + ui-desktop/scripts/perf/scenarios/submit.mjs | 87 + .../scripts/perf/scenarios/transcript.mjs | 50 + ui-desktop/scripts/perf/serve.mjs | 40 + ui-desktop/scripts/probe-command-palette.mjs | 146 + ui-desktop/scripts/probe-model-picker.mjs | 80 + ui-desktop/scripts/probe-renderer.mjs | 38 + ui-desktop/scripts/probe-thread.mjs | 40 + ui-desktop/scripts/profile-model-picker.mjs | 60 + ui-desktop/scripts/profile-typing-lag.md | 388 + ui-desktop/scripts/rebuild-native.mjs | 22 + ui-desktop/scripts/reload-renderer.mjs | 25 + ui-desktop/scripts/reload.mjs | 36 + ui-desktop/scripts/run-electron-builder.mjs | 58 + ui-desktop/scripts/set-exe-identity.mjs | 88 + ui-desktop/scripts/stage-native-deps.mjs | 356 + ui-desktop/scripts/stage-native-deps.test.mjs | 359 + ui-desktop/scripts/test-desktop.mjs | 442 + ui-desktop/scripts/utils.mjs | 8 + ui-desktop/scripts/write-build-stamp.mjs | 176 + ui-desktop/scripts/write-build-stamp.test.mjs | 86 + ui-desktop/src/app/agents/index.tsx | 393 + .../src/app/artifacts/artifact-utils.ts | 282 + ui-desktop/src/app/artifacts/index.test.ts | 91 + ui-desktop/src/app/artifacts/index.tsx | 687 + ui-desktop/src/app/chat/chat-drop-overlay.tsx | 48 + ui-desktop/src/app/chat/chat-swap-overlay.tsx | 47 + ui-desktop/src/app/chat/close-tab.test.ts | 142 + ui-desktop/src/app/chat/close-tab.ts | 89 + .../composer/at-folder-navigation.test.tsx | 180 + .../app/chat/composer/attachments.test.tsx | 111 + .../src/app/chat/composer/attachments.tsx | 169 + .../app/chat/composer/completion-drawer.tsx | 51 + .../composer/composer-text-guard.test.tsx | 106 + .../app/chat/composer/composer-utils.test.ts | 129 + .../src/app/chat/composer/composer-utils.ts | 136 + .../src/app/chat/composer/context-menu.tsx | 201 + .../src/app/chat/composer/contrib.test.ts | 54 + ui-desktop/src/app/chat/composer/contrib.ts | 139 + .../src/app/chat/composer/controls.test.tsx | 139 + ui-desktop/src/app/chat/composer/controls.tsx | 414 + .../chat/composer/directive-actions.test.tsx | 150 + .../app/chat/composer/directive-actions.tsx | 154 + .../app/chat/composer/directive-label.test.ts | 131 + .../app/chat/composer/directive-scope.test.ts | 164 + .../src/app/chat/composer/drop-affordance.ts | 2 + .../app/chat/composer/empty-composer.test.ts | 270 + .../composer/enter-submit-dom-race.test.tsx | 275 + .../src/app/chat/composer/focus.test.ts | 285 + ui-desktop/src/app/chat/composer/focus.ts | 337 + .../src/app/chat/composer/help-hint.tsx | 84 + .../composer/hooks/use-at-completions.test.ts | 107 + .../chat/composer/hooks/use-at-completions.ts | 170 + .../composer/hooks/use-auto-speak-replies.ts | 91 + .../composer/hooks/use-composer-branch.ts | 98 + .../hooks/use-composer-draft.test.tsx | 177 + .../chat/composer/hooks/use-composer-draft.ts | 437 + .../chat/composer/hooks/use-composer-drop.ts | 164 + .../composer/hooks/use-composer-esc-cancel.ts | 65 + .../composer/hooks/use-composer-metrics.ts | 197 + .../hooks/use-composer-placeholder.ts | 61 + .../composer/hooks/use-composer-popout.ts | 169 + .../hooks/use-composer-queue.test.tsx | 130 + .../chat/composer/hooks/use-composer-queue.ts | 383 + .../hooks/use-composer-submit.test.tsx | 265 + .../composer/hooks/use-composer-submit.ts | 239 + .../hooks/use-composer-trigger.test.ts | 294 + .../composer/hooks/use-composer-trigger.ts | 458 + .../composer/hooks/use-composer-undo.test.tsx | 193 + .../chat/composer/hooks/use-composer-undo.ts | 119 + .../hooks/use-composer-url-dialog.test.tsx | 48 + .../composer/hooks/use-composer-url-dialog.ts | 50 + .../chat/composer/hooks/use-composer-voice.ts | 296 + .../composer/hooks/use-emoji-completions.ts | 122 + .../hooks/use-live-completion-adapter.ts | 154 + .../chat/composer/hooks/use-mic-recorder.ts | 295 + .../chat/composer/hooks/use-micro-actions.ts | 47 + .../chat/composer/hooks/use-popout-drag.ts | 367 + .../hooks/use-slash-completions.test.tsx | 157 + .../composer/hooks/use-slash-completions.ts | 300 + .../composer/hooks/use-status-presence.ts | 44 + .../use-voice-conversation-rearm.test.tsx | 258 + .../hooks/use-voice-conversation.test.tsx | 266 + .../composer/hooks/use-voice-conversation.ts | 736 + .../chat/composer/hooks/use-voice-recorder.ts | 116 + .../ime-composition-dom-repro.test.tsx | 108 + ui-desktop/src/app/chat/composer/index.tsx | 1310 ++ .../chat/composer/inline-references.test.ts | 72 + .../src/app/chat/composer/inline-refs.ts | 181 + .../src/app/chat/composer/micro-actions.tsx | 71 + .../src/app/chat/composer/model-pill.test.tsx | 116 + .../src/app/chat/composer/model-pill.tsx | 174 + .../src/app/chat/composer/path-refs.test.ts | 103 + ui-desktop/src/app/chat/composer/path-refs.ts | 103 + .../src/app/chat/composer/queue-panel.tsx | 143 + .../src/app/chat/composer/rich-editor.test.ts | 382 + .../src/app/chat/composer/rich-editor.ts | 774 + ui-desktop/src/app/chat/composer/scope.tsx | 45 + .../composer/slash-nav-dom-repro.test.tsx | 186 + .../src/app/chat/composer/slash-refs.test.ts | 45 + .../src/app/chat/composer/slash-refs.ts | 105 + .../composer/status-stack/coding-row.test.tsx | 93 + .../chat/composer/status-stack/coding-row.tsx | 311 + .../status-stack/goal-indicator.test.tsx | 87 + .../app/chat/composer/status-stack/index.tsx | 256 + .../status-stack/preview-row.test.tsx | 155 + .../composer/status-stack/preview-row.tsx | 136 + .../chat/composer/status-stack/status-row.tsx | 171 + .../src/app/chat/composer/text-utils.test.ts | 264 + .../src/app/chat/composer/text-utils.ts | 231 + .../composer/trigger-popover-parity.test.tsx | 151 + .../chat/composer/trigger-popover.test.tsx | 57 + .../src/app/chat/composer/trigger-popover.tsx | 174 + ui-desktop/src/app/chat/composer/types.ts | 65 + .../app/chat/composer/undo-history.test.ts | 245 + .../src/app/chat/composer/undo-history.ts | 126 + .../src/app/chat/composer/url-dialog.tsx | 82 + .../src/app/chat/composer/url-refs.test.ts | 98 + ui-desktop/src/app/chat/composer/url-refs.ts | 103 + .../src/app/chat/composer/voice-activity.tsx | 252 + .../chat/hooks/use-composer-actions.test.ts | 246 + .../app/chat/hooks/use-composer-actions.ts | 662 + .../src/app/chat/hooks/use-file-drop-zone.ts | 148 + ui-desktop/src/app/chat/index.test.tsx | 164 + ui-desktop/src/app/chat/index.tsx | 630 + ui-desktop/src/app/chat/pane-mirror.ts | 136 + ui-desktop/src/app/chat/perf-probe.tsx | 464 + ui-desktop/src/app/chat/preview-tile.tsx | 143 + ui-desktop/src/app/chat/profile-tag.test.tsx | 49 + ui-desktop/src/app/chat/profile-tag.tsx | 36 + ui-desktop/src/app/chat/right-rail/index.ts | 1 + .../chat/right-rail/preview-artifact.test.tsx | 112 + .../app/chat/right-rail/preview-artifact.tsx | 263 + .../chat/right-rail/preview-console-state.ts | 82 + .../app/chat/right-rail/preview-console.tsx | 279 + .../src/app/chat/right-rail/preview-file.tsx | 1111 + .../app/chat/right-rail/preview-pane.test.tsx | 338 + .../src/app/chat/right-rail/preview-pane.tsx | 725 + .../chat/right-rail/preview-reader.test.ts | 140 + .../src/app/chat/right-rail/preview-reader.ts | 122 + .../chat/right-rail/preview-strip-tools.tsx | 97 + .../src/app/chat/right-rail/preview.tsx | 43 + ui-desktop/src/app/chat/route-tile.tsx | 90 + .../src/app/chat/runtime-repository.test.ts | 82 + ui-desktop/src/app/chat/runtime-repository.ts | 78 + .../app/chat/scroll-to-bottom-button.test.tsx | 67 + .../src/app/chat/scroll-to-bottom-button.tsx | 74 + ui-desktop/src/app/chat/session-drag.test.ts | 113 + ui-desktop/src/app/chat/session-drag.ts | 207 + .../src/app/chat/session-status-dot.tsx | 167 + .../src/app/chat/session-tile-actions.ts | 501 + .../src/app/chat/session-tile-row.test.ts | 82 + ui-desktop/src/app/chat/session-tile.tsx | 609 + ui-desktop/src/app/chat/session-view.test.ts | 88 + ui-desktop/src/app/chat/session-view.tsx | 99 + ui-desktop/src/app/chat/sidebar/chrome.tsx | 168 + .../app/chat/sidebar/cron-jobs-section.tsx | 408 + ui-desktop/src/app/chat/sidebar/index.tsx | 1553 ++ .../app/chat/sidebar/load-more-row.test.tsx | 54 + .../src/app/chat/sidebar/load-more-row.tsx | 36 + ui-desktop/src/app/chat/sidebar/order.test.ts | 146 + ui-desktop/src/app/chat/sidebar/order.ts | 206 + .../src/app/chat/sidebar/profile-switcher.tsx | 748 + .../app/chat/sidebar/project-dialog.test.tsx | 87 + .../src/app/chat/sidebar/project-dialog.tsx | 305 + .../sidebar/projects/base-branch-picker.tsx | 160 + .../chat/sidebar/projects/entered-content.tsx | 287 + .../src/app/chat/sidebar/projects/index.ts | 22 + .../app/chat/sidebar/projects/model.test.ts | 78 + .../src/app/chat/sidebar/projects/model.ts | 177 + .../sidebar/projects/overview-row.test.tsx | 81 + .../chat/sidebar/projects/overview-row.tsx | 173 + .../sidebar/projects/project-appearance.tsx | 83 + .../sidebar/projects/project-menu.test.tsx | 118 + .../chat/sidebar/projects/project-menu.tsx | 345 + .../chat/sidebar/projects/workspace-group.tsx | 164 + .../sidebar/projects/workspace-groups.test.ts | 967 + .../chat/sidebar/projects/workspace-groups.ts | 753 + .../projects/workspace-header.test.tsx | 81 + .../sidebar/projects/workspace-header.tsx | 228 + .../chat/sidebar/projects/worktree-dialog.tsx | 373 + .../src/app/chat/sidebar/reorderable-list.tsx | 81 + .../src/app/chat/sidebar/section-states.tsx | 52 + .../chat/sidebar/session-actions-menu.test.ts | 112 + .../sidebar/session-actions-menu.test.tsx | 116 + .../app/chat/sidebar/session-actions-menu.tsx | 570 + .../app/chat/sidebar/session-index.test.ts | 48 + .../src/app/chat/sidebar/session-index.ts | 33 + .../chat/sidebar/session-row-state.test.ts | 43 + .../src/app/chat/sidebar/session-row-state.ts | 42 + .../src/app/chat/sidebar/session-row.test.tsx | 187 + .../src/app/chat/sidebar/session-row.tsx | 278 + .../chat/sidebar/sessions-section.test.tsx | 184 + .../src/app/chat/sidebar/sessions-section.tsx | 490 + .../src/app/chat/sidebar/split-submenu.tsx | 92 + .../app/chat/sidebar/use-profile-prewarm.ts | 38 + .../app/chat/sidebar/virtual-session-list.tsx | 188 + ui-desktop/src/app/chat/surface-vars.test.ts | 89 + ui-desktop/src/app/chat/surface-vars.ts | 51 + .../src/app/chat/thread-loading.test.ts | 34 + ui-desktop/src/app/chat/thread-loading.ts | 31 + .../src/app/chat/transcript-window.test.ts | 139 + ui-desktop/src/app/chat/transcript-window.ts | 108 + ui-desktop/src/app/command-center/index.tsx | 692 + .../src/app/command-center/maintenance.tsx | 416 + ui-desktop/src/app/command-palette/contrib.ts | 66 + ui-desktop/src/app/command-palette/index.tsx | 1358 ++ .../marketplace-theme-page.tsx | 172 + .../app/command-palette/pet-palette-page.tsx | 214 + ui-desktop/src/app/contrib/context.tsx | 36 + ui-desktop/src/app/contrib/controller.tsx | 768 + .../app/contrib/dev/credits-notice-demo.ts | 128 + .../contrib/hooks/live-status-reap.test.ts | 79 + .../contrib/hooks/live-status-spinner.test.ts | 77 + .../contrib/hooks/use-background-sync.test.ts | 75 + .../app/contrib/hooks/use-background-sync.ts | 407 + .../hooks/use-desktop-integrations.test.tsx | 415 + .../contrib/hooks/use-desktop-integrations.ts | 242 + .../src/app/contrib/hooks/use-pet-bridge.ts | 68 + .../contrib/hooks/use-quick-entry-bridge.ts | 128 + .../hooks/use-session-tile-delegate.test.ts | 102 + .../hooks/use-session-tile-delegate.ts | 161 + ui-desktop/src/app/contrib/index.ts | 7 + .../src/app/contrib/latest-actions.test.ts | 125 + ui-desktop/src/app/contrib/latest-actions.ts | 73 + ui-desktop/src/app/contrib/panes.tsx | 179 + ui-desktop/src/app/contrib/surfaces.tsx | 192 + ui-desktop/src/app/contrib/types.ts | 79 + ui-desktop/src/app/contrib/wiring.tsx | 1123 + ui-desktop/src/app/cron/blueprints.test.ts | 105 + ui-desktop/src/app/cron/blueprints.tsx | 91 + .../src/app/cron/cron-job-model.test.ts | 93 + ui-desktop/src/app/cron/cron-job-model.ts | 72 + ui-desktop/src/app/cron/index.tsx | 1225 ++ ui-desktop/src/app/cron/job-state.ts | 29 + ui-desktop/src/app/floating-hud.ts | 53 + .../hooks/gateway-hmr-survivor.test.ts | 71 + .../app/gateway/hooks/gateway-hmr-survivor.ts | 56 + .../gateway/hooks/use-gateway-boot.test.tsx | 340 + .../src/app/gateway/hooks/use-gateway-boot.ts | 638 + .../gateway/hooks/use-gateway-request.test.ts | 39 + .../app/gateway/hooks/use-gateway-request.ts | 148 + ui-desktop/src/app/hooks/use-config-record.ts | 22 + ui-desktop/src/app/hooks/use-debounced.ts | 15 + ui-desktop/src/app/hooks/use-keybinds.ts | 421 + .../src/app/hooks/use-on-profile-switch.ts | 25 + .../src/app/hooks/use-refresh-hotkey.ts | 45 + .../src/app/hooks/use-route-enum-param.ts | 38 + .../src/app/hooks/use-route-overlay-active.ts | 19 + ui-desktop/src/app/index.tsx | 6 + ui-desktop/src/app/layout-constants.ts | 25 + .../learning/archive-skill-confirm-dialog.tsx | 74 + ui-desktop/src/app/master-detail.tsx | 406 + ui-desktop/src/app/messaging/index.test.tsx | 204 + ui-desktop/src/app/messaging/index.tsx | 933 + .../src/app/messaging/platform-icon.tsx | 131 + ui-desktop/src/app/model-picker-overlay.tsx | 61 + .../src/app/model-visibility-overlay.tsx | 33 + ui-desktop/src/app/open-session.test.ts | 206 + ui-desktop/src/app/open-session.ts | 132 + .../src/app/overlays/overlay-chrome.tsx | 24 + .../src/app/overlays/overlay-split-layout.tsx | 224 + ui-desktop/src/app/overlays/overlay-view.tsx | 127 + ui-desktop/src/app/overlays/panel.test.tsx | 32 + ui-desktop/src/app/overlays/panel.tsx | 430 + ui-desktop/src/app/page-search-shell.tsx | 115 + .../pet-generate/components/draft-grid.tsx | 125 + .../pet-generate/components/empty-hint.tsx | 27 + .../components/generate-unavailable.tsx | 54 + .../pet-generate/components/hatch-preview.tsx | 154 + .../pet-generate/components/hatching-view.tsx | 24 + .../components/provider-picker.tsx | 51 + .../components/reference-chip.tsx | 48 + .../app/pet-generate/pet-generate-content.tsx | 336 + .../app/pet-generate/pet-generate-overlay.tsx | 94 + .../src/app/pet-overlay/overlay-root.tsx | 38 + .../src/app/pet-overlay/pet-overlay-app.tsx | 481 + .../app/profiles/create-profile-dialog.tsx | 166 + .../app/profiles/delete-profile-dialog.tsx | 65 + ui-desktop/src/app/profiles/index.test.tsx | 155 + ui-desktop/src/app/profiles/index.tsx | 388 + .../app/profiles/rename-profile-dialog.tsx | 129 + .../src/app/quick-entry/quick-entry-app.tsx | 197 + .../src/app/quick-entry/quick-entry-root.tsx | 38 + .../src/app/right-sidebar/file-actions.tsx | 202 + .../app/right-sidebar/files/dnd-manager.ts | 27 + .../src/app/right-sidebar/files/ipc.test.ts | 127 + ui-desktop/src/app/right-sidebar/files/ipc.ts | 165 + .../app/right-sidebar/files/remote-picker.tsx | 201 + .../right-sidebar/files/tree-sizing.test.ts | 29 + .../src/app/right-sidebar/files/tree.tsx | 384 + .../files/use-project-tree.test.ts | 272 + .../right-sidebar/files/use-project-tree.ts | 510 + .../src/app/right-sidebar/index.test.tsx | 57 + ui-desktop/src/app/right-sidebar/index.tsx | 335 + .../app/right-sidebar/review/churn-bar.tsx | 59 + .../right-sidebar/review/file-tree.test.tsx | 130 + .../app/right-sidebar/review/file-tree.tsx | 520 + .../src/app/right-sidebar/review/index.tsx | 240 + .../src/app/right-sidebar/review/ship-bar.tsx | 154 + .../right-sidebar/review/tree-data.test.ts | 108 + .../src/app/right-sidebar/review/tree-data.ts | 173 + ui-desktop/src/app/right-sidebar/store.ts | 30 + .../terminal/active-resize.test.ts | 159 + .../right-sidebar/terminal/active-resize.ts | 78 + .../terminal/agent-terminal-stream.ts | 100 + .../src/app/right-sidebar/terminal/buffer.ts | 80 + .../src/app/right-sidebar/terminal/chrome.tsx | 24 + .../right-sidebar/terminal/clipboard.test.ts | 124 + .../app/right-sidebar/terminal/clipboard.ts | 88 + .../app/right-sidebar/terminal/instance.tsx | 116 + .../app/right-sidebar/terminal/links.test.ts | 75 + .../src/app/right-sidebar/terminal/links.ts | 35 + .../terminal/persistent.test.tsx | 413 + .../app/right-sidebar/terminal/persistent.tsx | 263 + .../app/right-sidebar/terminal/rail.test.tsx | 49 + .../src/app/right-sidebar/terminal/rail.tsx | 160 + .../terminal/revive-buffer.test.ts | 97 + .../app/right-sidebar/terminal/selection.ts | 136 + .../terminal/terminal-font.test.ts | 124 + .../right-sidebar/terminal/terminal-font.ts | 138 + .../right-sidebar/terminal/terminals.test.ts | 190 + .../app/right-sidebar/terminal/terminals.ts | 399 + .../terminal/use-agent-terminal.test.tsx | 156 + .../terminal/use-agent-terminal.ts | 224 + .../terminal/use-terminal-font.test.tsx | 40 + .../terminal/use-terminal-font.ts | 53 + .../terminal/use-terminal-session.ts | 1059 + .../app/right-sidebar/terminal/workspace.tsx | 66 + ui-desktop/src/app/routes.test.ts | 30 + ui-desktop/src/app/routes.ts | 263 + .../src/app/routes.workspace-reveal.test.ts | 189 + ui-desktop/src/app/session-picker-overlay.tsx | 32 + ui-desktop/src/app/session-switcher.tsx | 120 + .../app/session/hooks/preview-open.test.tsx | 202 + .../hooks/session-context-drift.test.ts | 198 + .../session/hooks/session-context-drift.ts | 116 + .../hooks/use-background-queue-drain.test.tsx | 225 + .../hooks/use-background-queue-drain.ts | 199 + .../hooks/use-clawcodex-config.test.ts | 193 + .../app/session/hooks/use-clawcodex-config.ts | 124 + .../session/hooks/use-context-suggestions.ts | 58 + .../session/hooks/use-cwd-actions.test.tsx | 97 + .../src/app/session/hooks/use-cwd-actions.ts | 124 + .../agent-init-error.test.tsx | 131 + .../approval-mode-event.test.tsx | 102 + .../clarify-hydration.test.tsx | 116 + .../compaction-event.test.tsx | 92 + .../composer-model-event.test.tsx | 99 + .../use-message-stream/delta-flush.test.tsx | 421 + .../hooks/use-message-stream/gateway-event.ts | 1284 ++ .../session/hooks/use-message-stream/index.ts | 781 + .../interim-sealing.test.tsx | 314 + .../moa-progress-event.test.tsx | 123 + .../moa-reference-event.test.tsx | 114 + .../session-info-side-effects.test.tsx | 158 + .../session-reclaimed.test.tsx | 125 + .../stale-pending-settle.test.tsx | 128 + .../use-message-stream/stream-flush.test.tsx | 96 + .../terminal-error-frame.test.tsx | 119 + .../use-message-stream/todo-cleanup.test.tsx | 93 + .../tool-drafting-event.test.tsx | 124 + .../hooks/use-message-stream/utils.test.ts | 66 + .../session/hooks/use-message-stream/utils.ts | 185 + .../session/hooks/use-model-controls.test.tsx | 561 + .../app/session/hooks/use-model-controls.ts | 264 + .../app/session/hooks/use-preview-routing.ts | 124 + .../hooks/use-prompt-actions/index.test.tsx | 4452 ++++ .../session/hooks/use-prompt-actions/index.ts | 968 + .../resolve-target-session.test.ts | 144 + .../resolve-target-session.ts | 111 + .../hooks/use-prompt-actions/rewind.test.ts | 33 + .../hooks/use-prompt-actions/rewind.ts | 325 + .../session/hooks/use-prompt-actions/slash.ts | 1116 + .../hooks/use-prompt-actions/submit.ts | 748 + .../hooks/use-prompt-actions/utils.test.ts | 495 + .../session/hooks/use-prompt-actions/utils.ts | 545 + .../session/hooks/use-route-resume.test.tsx | 519 + .../src/app/session/hooks/use-route-resume.ts | 306 + .../hooks/use-session-actions.test.tsx | 1711 ++ .../hooks/use-session-actions/index.ts | 1504 ++ .../resolve-stored-session.test.ts | 109 + .../resume-structural-parts.test.ts | 142 + .../hooks/use-session-actions/utils.test.ts | 1289 ++ .../hooks/use-session-actions/utils.ts | 1127 + .../hooks/use-session-list-actions.test.tsx | 251 + .../session/hooks/use-session-list-actions.ts | 282 + .../hooks/use-session-state-cache.test.tsx | 495 + .../session/hooks/use-session-state-cache.ts | 341 + .../session/workspace-session-target.test.ts | 81 + .../app/session/workspace-session-target.ts | 64 + .../src/app/settings/about-settings.tsx | 183 + .../src/app/settings/appearance-settings.tsx | 549 + .../settings/billing/account-row-value.tsx | 48 + .../src/app/settings/billing/api.test.ts | 214 + ui-desktop/src/app/settings/billing/api.ts | 193 + .../app/settings/billing/auto-reload-row.tsx | 293 + .../app/settings/billing/billing-amounts.ts | 123 + .../settings/billing/current-plan-card.tsx | 57 + .../src/app/settings/billing/dev-fixtures.ts | 469 + .../src/app/settings/billing/errors.test.ts | 84 + ui-desktop/src/app/settings/billing/errors.ts | 163 + .../settings/billing/fixtures.test-util.ts | 35 + .../src/app/settings/billing/index.test.tsx | 693 + ui-desktop/src/app/settings/billing/index.tsx | 584 + .../app/settings/billing/inline-feedback.tsx | 70 + .../src/app/settings/billing/open-external.ts | 9 + .../src/app/settings/billing/plans-view.tsx | 229 + .../settings/billing/simulated-api.test.ts | 57 + .../src/app/settings/billing/simulated-api.ts | 89 + .../src/app/settings/billing/tier-art.test.ts | 25 + .../src/app/settings/billing/tier-art.tsx | 69 + .../src/app/settings/billing/types.test.ts | 117 + ui-desktop/src/app/settings/billing/types.ts | 35 + .../billing/use-billing-state.test.ts | 765 + .../app/settings/billing/use-billing-state.ts | 840 + .../billing/use-charge-poller.test.ts | 232 + .../app/settings/billing/use-charge-poller.ts | 297 + .../app/settings/billing/use-step-up.test.tsx | 132 + .../src/app/settings/billing/use-step-up.ts | 143 + .../billing/use-subscription-change.test.tsx | 171 + .../billing/use-subscription-change.ts | 177 + .../src/app/settings/combobox-input.tsx | 114 + .../src/app/settings/computer-use-panel.tsx | 240 + ui-desktop/src/app/settings/config-field.tsx | 235 + .../src/app/settings/config-settings.tsx | 432 + ui-desktop/src/app/settings/constants.ts | 794 + .../src/app/settings/credential-key-ui.tsx | 406 + .../settings/custom-endpoints-settings.tsx | 403 + .../src/app/settings/env-credentials.tsx | 199 + .../src/app/settings/env-var-actions-menu.tsx | 179 + .../settings/fallback-models-field.test.tsx | 129 + .../app/settings/fallback-models-field.tsx | 170 + ui-desktop/src/app/settings/field-copy.ts | 57 + .../src/app/settings/gateway-settings.test.ts | 19 + .../app/settings/gateway-settings.test.tsx | 121 + .../src/app/settings/gateway-settings.tsx | 1521 ++ ui-desktop/src/app/settings/helpers.test.ts | 366 + ui-desktop/src/app/settings/helpers.ts | 319 + ui-desktop/src/app/settings/index.tsx | 342 + .../src/app/settings/keybind-settings.tsx | 276 + ui-desktop/src/app/settings/keys-settings.tsx | 108 + .../src/app/settings/memory/connect.tsx | 162 + .../src/app/settings/memory/field-control.tsx | 129 + .../memory/provider-config-modal.test.tsx | 115 + .../settings/memory/provider-config-modal.tsx | 159 + .../memory/provider-config-panel.test.tsx | 209 + .../settings/memory/provider-config-panel.tsx | 163 + .../src/app/settings/model-settings.test.tsx | 567 + .../src/app/settings/model-settings.tsx | 1280 ++ .../app/settings/notifications-settings.tsx | 119 + ui-desktop/src/app/settings/pet-settings.tsx | 403 + .../src/app/settings/plugins-settings.tsx | 132 + ui-desktop/src/app/settings/primitives.tsx | 244 + .../app/settings/providers-settings.test.tsx | 206 + .../src/app/settings/providers-settings.tsx | 526 + .../src/app/settings/quick-entry-settings.tsx | 103 + .../app/settings/searchable-select.test.tsx | 137 + .../src/app/settings/searchable-select.tsx | 115 + .../src/app/settings/sessions-settings.tsx | 391 + .../app/settings/ssh-host-selection.test.ts | 46 + .../src/app/settings/ssh-host-selection.ts | 43 + .../settings/terminal-backend-panel.test.tsx | 127 + .../app/settings/terminal-backend-panel.tsx | 160 + .../settings/terminal-font-setting.test.tsx | 152 + .../app/settings/terminal-font-setting.tsx | 169 + .../settings/toolset-config-panel.test.tsx | 1068 + .../src/app/settings/toolset-config-panel.tsx | 880 + ui-desktop/src/app/settings/types.ts | 52 + .../src/app/settings/uninstall-section.tsx | 186 + .../app/settings/use-deep-link-highlight.ts | 80 + .../app/settings/voice-field-visible.test.ts | 48 + .../settings/voice-provider-fields.test.ts | 77 + .../app/settings/voice-provider-fields.tsx | 141 + .../src/app/settings/with-active.test.ts | 31 + .../src/app/shell/approval-mode-menu.test.tsx | 89 + .../src/app/shell/approval-mode-menu.tsx | 76 + .../app/shell/context-usage-panel.test.tsx | 93 + .../src/app/shell/context-usage-panel.tsx | 147 + .../src/app/shell/gateway-menu-panel.tsx | 239 + ui-desktop/src/app/shell/group-setter.ts | 6 + .../app/shell/hooks/use-overlay-routing.ts | 90 + .../shell/hooks/use-status-snapshot.test.ts | 170 + .../app/shell/hooks/use-status-snapshot.ts | 106 + .../app/shell/hooks/use-statusbar-items.tsx | 603 + .../use-window-controls-overlay-width.ts | 68 + .../src/app/shell/model-catalog-menu.test.tsx | 108 + .../src/app/shell/model-catalog-menu.tsx | 589 + .../src/app/shell/model-edit-submenu.test.tsx | 131 + .../src/app/shell/model-edit-submenu.tsx | 179 + .../src/app/shell/model-menu-panel.test.tsx | 402 + ui-desktop/src/app/shell/model-menu-panel.tsx | 244 + ui-desktop/src/app/shell/sidebar-label.tsx | 22 + .../src/app/shell/statusbar-controls.tsx | 342 + .../app/shell/statusbar-visibility.test.tsx | 149 + .../src/app/shell/titlebar-controls.tsx | 321 + ui-desktop/src/app/shell/titlebar.test.ts | 26 + ui-desktop/src/app/shell/titlebar.ts | 48 + ui-desktop/src/app/skills/hub.tsx | 468 + ui-desktop/src/app/skills/index.test.tsx | 157 + ui-desktop/src/app/skills/index.tsx | 824 + ui-desktop/src/app/skills/mcp-tab.tsx | 1689 ++ ui-desktop/src/app/skills/store.ts | 6 + ui-desktop/src/app/starmap/color.ts | 138 + ui-desktop/src/app/starmap/constants.ts | 62 + ui-desktop/src/app/starmap/geometry.ts | 132 + ui-desktop/src/app/starmap/index.tsx | 58 + .../src/app/starmap/node-context-menu.tsx | 219 + ui-desktop/src/app/starmap/render.ts | 864 + ui-desktop/src/app/starmap/share-code.test.ts | 173 + ui-desktop/src/app/starmap/share-code.ts | 188 + .../src/app/starmap/share-controls.test.tsx | 24 + ui-desktop/src/app/starmap/share-controls.tsx | 134 + ui-desktop/src/app/starmap/simulation.ts | 298 + ui-desktop/src/app/starmap/star-map.tsx | 980 + ui-desktop/src/app/starmap/text.ts | 90 + ui-desktop/src/app/starmap/time-axis.ts | 105 + ui-desktop/src/app/starmap/timeline.tsx | 289 + ui-desktop/src/app/starmap/types.ts | 97 + ui-desktop/src/app/types.ts | 206 + ui-desktop/src/app/updates-overlay.tsx | 470 + .../app/wake-indicator/wake-indicator-app.tsx | 42 + .../wake-indicator/wake-indicator-root.tsx | 26 + .../src/app/wake-indicator/wake-indicator.css | 61 + ui-desktop/src/app/webhooks/index.tsx | 609 + .../src/assets/tiers/feature-automation.webp | Bin 0 -> 5410 bytes .../src/assets/tiers/feature-connect.webp | Bin 0 -> 7670 bytes .../src/assets/tiers/feature-memory.webp | Bin 0 -> 5214 bytes .../src/assets/tiers/feature-sandbox.webp | Bin 0 -> 7854 bytes ui-desktop/src/clawcodex-cron-scope.test.ts | 74 + ui-desktop/src/clawcodex-parity.test.ts | 140 + .../src/clawcodex-profile-scope.test.ts | 83 + ui-desktop/src/clawcodex.test.ts | 413 + ui-desktop/src/clawcodex.ts | 1842 ++ ui-desktop/src/components/Backdrop.tsx | 24 + .../src/components/assistant-ui/ansi-text.tsx | 33 + .../components/assistant-ui/artifact-card.tsx | 136 + .../assistant-ui/clarify-tool.test.tsx | 343 + .../components/assistant-ui/clarify-tool.tsx | 645 + .../assistant-ui/directive-text.test.ts | 96 + .../assistant-ui/directive-text.tsx | 566 + .../assistant-ui/embeds/alert.test.tsx | 39 + .../components/assistant-ui/embeds/alert.tsx | 125 + .../assistant-ui/embeds/embed-consent.tsx | 55 + .../assistant-ui/embeds/embed-size.ts | 4 + .../assistant-ui/embeds/escape-html.ts | 3 + .../components/assistant-ui/embeds/fail.tsx | 7 + .../assistant-ui/embeds/frame-embed.tsx | 55 + .../components/assistant-ui/embeds/index.ts | 5 + .../assistant-ui/embeds/mermaid-embed.tsx | 113 + .../embeds/providers/detect.test.ts | 133 + .../assistant-ui/embeds/providers/index.ts | 54 + .../embeds/providers/instagram.ts | 26 + .../assistant-ui/embeds/providers/maps.ts | 95 + .../embeds/providers/pinterest.ts | 28 + .../assistant-ui/embeds/providers/spotify.ts | 34 + .../assistant-ui/embeds/providers/tiktok.ts | 28 + .../assistant-ui/embeds/providers/twitter.ts | 27 + .../assistant-ui/embeds/providers/types.ts | 52 + .../assistant-ui/embeds/providers/vimeo.ts | 32 + .../assistant-ui/embeds/providers/youtube.ts | 65 + .../assistant-ui/embeds/registry.tsx | 39 + .../assistant-ui/embeds/rich-boundary.tsx | 34 + .../assistant-ui/embeds/scroll-gate.tsx | 33 + .../assistant-ui/embeds/social-embed.tsx | 131 + .../assistant-ui/embeds/spotify-embed.tsx | 45 + .../assistant-ui/embeds/svg-embed.tsx | 32 + .../components/assistant-ui/embeds/types.ts | 8 + .../assistant-ui/embeds/url-embed.tsx | 84 + .../assistant-ui/embeds/use-is-dark.ts | 18 + .../assistant-ui/embeds/youtube-embed.tsx | 47 + .../markdown-text.artifacts.test.tsx | 75 + .../assistant-ui/markdown-text.media.test.tsx | 81 + .../markdown-text.session.test.tsx | 66 + .../assistant-ui/markdown-text.test.ts | 309 + .../components/assistant-ui/markdown-text.tsx | 642 + .../message-render-boundary.test.tsx | 270 + .../assistant-ui/message-render-boundary.tsx | 103 + .../assistant-ui/reference-kinds.ts | 173 + .../assistant-ui/session-ref-open.test.tsx | 66 + .../assistant-ui/thread-remount.test.tsx | 125 + .../thread/assistant-message.test.tsx | 92 + .../assistant-ui/thread/assistant-message.tsx | 341 + .../thread/block-direction.test.tsx | 130 + .../thread/changed-files-card.tsx | 73 + .../assistant-ui/thread/changed-files.ts | 69 + .../assistant-ui/thread/content.test.ts | 86 + .../components/assistant-ui/thread/content.ts | 63 + .../thread/double-click-reaction.test.tsx | 118 + .../assistant-ui/thread/edit-context.test.tsx | 191 + .../components/assistant-ui/thread/index.tsx | 187 + .../assistant-ui/thread/list.test.ts | 228 + .../components/assistant-ui/thread/list.tsx | 658 + .../assistant-ui/thread/message-parts.tsx | 271 + .../assistant-ui/thread/message-reactions.tsx | 208 + .../thread/status-tail-only.test.tsx | 107 + .../assistant-ui/thread/status.test.tsx | 71 + .../components/assistant-ui/thread/status.tsx | 253 + .../assistant-ui/thread/streaming.test.tsx | 695 + .../assistant-ui/thread/system-message.tsx | 81 + .../assistant-ui/thread/timeline-data.test.ts | 78 + .../assistant-ui/thread/timeline-data.ts | 89 + .../thread/timeline-idle.test.tsx | 166 + .../assistant-ui/thread/timeline.test.ts | 42 + .../assistant-ui/thread/timeline.tsx | 419 + .../assistant-ui/thread/timestamp.test.ts | 36 + .../assistant-ui/thread/timestamp.ts | 32 + .../thread/transcript-window.test.ts | 18 + .../assistant-ui/thread/transcript-window.tsx | 34 + .../components/assistant-ui/thread/types.ts | 4 + .../thread/use-message-reactions.ts | 146 + .../thread/user-edit-composer.tsx | 852 + .../thread/user-message-edit-gesture.test.tsx | 157 + .../thread/user-message-edit.test.tsx | 186 + .../thread/user-message-selection.test.ts | 28 + .../thread/user-message-text.test.tsx | 61 + .../assistant-ui/thread/user-message-text.tsx | 175 + .../assistant-ui/thread/user-message.tsx | 438 + .../assistant-ui/tool/approval.test.tsx | 183 + .../components/assistant-ui/tool/approval.tsx | 300 + .../assistant-ui/tool/delegate-model.test.ts | 133 + .../assistant-ui/tool/delegate-model.ts | 150 + .../components/assistant-ui/tool/delegate.tsx | 158 + .../assistant-ui/tool/fallback-model.test.ts | 452 + .../tool/fallback-model/format.ts | 132 + .../assistant-ui/tool/fallback-model/index.ts | 1499 ++ .../tool/fallback-model/targets.ts | 74 + .../assistant-ui/tool/fallback-model/types.ts | 86 + .../tool/fallback-preview-scope.test.tsx | 76 + .../assistant-ui/tool/fallback.test.ts | 80 + .../components/assistant-ui/tool/fallback.tsx | 985 + .../assistant-ui/tool/run-summary.test.ts | 60 + .../assistant-ui/tool/run-summary.ts | 156 + .../assistant-ui/tool/run-ticker.tsx | 28 + .../assistant-ui/tool/tool-group.test.tsx | 655 + .../assistant-ui/tooltip-icon-button.tsx | 33 + ui-desktop/src/components/billing-banner.tsx | 72 + .../components/boot-failure-overlay.test.tsx | 101 + .../src/components/boot-failure-overlay.tsx | 363 + .../components/boot-failure-reauth.test.ts | 177 + .../src/components/boot-failure-reauth.ts | 153 + ui-desktop/src/components/brand-mark.tsx | 19 + .../components/chat/activity-timer-text.tsx | 25 + .../components/chat/activity-timer.test.tsx | 156 + .../src/components/chat/activity-timer.ts | 115 + ui-desktop/src/components/chat/code-card.tsx | 48 + .../src/components/chat/code-editor-theme.ts | 104 + .../src/components/chat/code-editor.tsx | 392 + .../src/components/chat/compact-markdown.tsx | 115 + .../src/components/chat/composer-dock.ts | 70 + ui-desktop/src/components/chat/diff-lines.tsx | 677 + .../src/components/chat/disclosure-row.tsx | 72 + .../components/chat/expandable-block.test.tsx | 74 + .../src/components/chat/expandable-block.tsx | 67 + .../src/components/chat/fixed-row-window.ts | 155 + .../chat/generated-image-result.tsx | 180 + .../chat/image-generation-placeholder.tsx | 315 + .../src/components/chat/intro-copy.jsonl | 75 + ui-desktop/src/components/chat/intro.tsx | 184 + .../components/chat/json-document-editor.tsx | 97 + ui-desktop/src/components/chat/log-tail.tsx | 67 + .../components/chat/preview-attachment.tsx | 115 + .../src/components/chat/scaffold-row.tsx | 45 + .../src/components/chat/shiki-block.tsx | 15 + .../components/chat/shiki-highlighter.test.ts | 37 + .../src/components/chat/shiki-highlighter.tsx | 181 + ui-desktop/src/components/chat/skeletons.tsx | 47 + .../src/components/chat/stable-text.tsx | 23 + ui-desktop/src/components/chat/status-row.tsx | 79 + .../src/components/chat/status-section.tsx | 42 + .../src/components/chat/syntax-diff.tsx | 27 + .../src/components/chat/terminal-output.tsx | 61 + .../src/components/chat/vibe-hearts.tsx | 115 + .../src/components/chat/widget-shell.ts | 12 + .../src/components/chat/zoomable-image.tsx | 134 + .../desktop-install-overlay.test.tsx | 576 + .../components/desktop-install-overlay.tsx | 723 + .../src/components/error-boundary.test.tsx | 220 + ui-desktop/src/components/error-boundary.tsx | 148 + ui-desktop/src/components/find-bar.test.tsx | 613 + ui-desktop/src/components/find-bar.tsx | 222 + .../src/components/first-run-remote-form.tsx | 346 + .../gateway-connecting-overlay.test.tsx | 199 + .../components/gateway-connecting-overlay.tsx | 160 + .../src/components/haptics-provider.tsx | 43 + ui-desktop/src/components/idle-mount.test.tsx | 50 + ui-desktop/src/components/idle-mount.tsx | 28 + .../src/components/language-switcher.test.tsx | 53 + .../src/components/language-switcher.tsx | 175 + ui-desktop/src/components/model-picker.tsx | 351 + .../components/model-visibility-dialog.tsx | 188 + ui-desktop/src/components/notifications.tsx | 301 + ui-desktop/src/components/onboarding/flow.tsx | 351 + .../src/components/onboarding/glyph.tsx | 170 + .../src/components/onboarding/index.test.tsx | 127 + .../src/components/onboarding/index.tsx | 699 + .../src/components/onboarding/providers.tsx | 129 + ui-desktop/src/components/page-loader.tsx | 34 + .../src/components/pane-shell/edit-mode.tsx | 59 + .../src/components/pane-shell/geometry.ts | 308 + ui-desktop/src/components/pane-shell/index.ts | 7 + .../pane-shell/pane-visibility.test.ts | 41 + .../components/pane-shell/pane-visibility.ts | 54 + .../pane-shell/tree/floating-adoption.test.ts | 98 + .../pane-shell/tree/focus-tab-hijack.test.ts | 75 + .../tree/focused-session-tab.test.ts | 124 + .../components/pane-shell/tree/grid-model.ts | 624 + .../pane-shell/tree/grid-to-tree.ts | 198 + .../pane-shell/tree/hovered-zone-tabs.test.ts | 147 + .../src/components/pane-shell/tree/model.ts | 584 + .../pane-shell/tree/multi-tab-drag.test.ts | 147 + .../pane-shell/tree/pane-reload.test.ts | 28 + .../tree/pane-toggle-visibility.test.ts | 126 + .../src/components/pane-shell/tree/presets.ts | 111 + .../pane-shell/tree/reactive-unhide.test.ts | 197 + .../pane-shell/tree/remove-pane.test.ts | 42 + .../pane-shell/tree/renderer/drag-session.ts | 620 + .../pane-shell/tree/renderer/edit-bar.tsx | 113 + .../tree/renderer/floating-panes.test.tsx | 203 + .../tree/renderer/floating-panes.tsx | 206 + .../tree/renderer/floating-rect.test.ts | 86 + .../pane-shell/tree/renderer/floating-rect.ts | 109 + .../pane-shell/tree/renderer/index.tsx | 84 + .../tree/renderer/layout-picker.tsx | 203 + .../tree/renderer/lone-header.test.ts | 37 + .../pane-shell/tree/renderer/lone-header.ts | 35 + .../tree/renderer/narrow-overlays.tsx | 146 + .../tree/renderer/tab-strip-scroll.test.ts | 38 + .../tree/renderer/tab-strip-scroll.ts | 97 + .../tree/renderer/tool-panel-close.test.tsx | 185 + .../renderer/track-model-absorber.test.ts | 43 + .../pane-shell/tree/renderer/track-model.ts | 327 + .../pane-shell/tree/renderer/tree-group.tsx | 830 + .../pane-shell/tree/renderer/tree-node.tsx | 33 + .../pane-shell/tree/renderer/tree-split.tsx | 658 + .../src/components/pane-shell/tree/store.ts | 1681 ++ .../pane-shell/tree/tab-selection.ts | 99 + .../pane-shell/tree/tab-slot-shown.test.ts | 81 + .../pane-shell/tree/tool-pane-toggle.test.ts | 401 + .../pane-shell/tree/zone-editor.tsx | 512 + .../pane-shell/tree/zones-engine.ts | 367 + .../components/particles/particle-field.css | 126 + .../components/particles/particle-field.tsx | 204 + .../src/components/pet/floating-pet.tsx | 479 + ui-desktop/src/components/pet/pet-bubble.tsx | 165 + .../src/components/pet/pet-egg-hatch.tsx | 64 + .../src/components/pet/pet-egg-sheet.png | Bin 0 -> 1797 bytes .../src/components/pet/pet-sprite.test.tsx | 228 + ui-desktop/src/components/pet/pet-sprite.tsx | 373 + .../src/components/pet/pet-star-shower.tsx | 241 + ui-desktop/src/components/pet/pet-thumb.tsx | 79 + .../src/components/pet/pixel-egg-sprite.tsx | 259 + .../src/components/pet/roam-behavior.test.ts | 105 + .../src/components/pet/roam-behavior.ts | 97 + .../src/components/pet/roam-geometry.test.ts | 51 + .../src/components/pet/roam-geometry.ts | 130 + .../src/components/pet/use-pet-roam.test.tsx | 166 + ui-desktop/src/components/pet/use-pet-roam.ts | 392 + .../components/pet/use-pet-zoom-gesture.ts | 58 + .../src/components/prompt-overlays.test.tsx | 67 + ui-desktop/src/components/prompt-overlays.tsx | 253 + .../src/components/remote-display-banner.tsx | 25 + ui-desktop/src/components/session-picker.tsx | 97 + ui-desktop/src/components/status-dot.tsx | 27 + .../ui/__tests__/no-native-title.test.ts | 70 + .../src/components/ui/action-status.tsx | 25 + ui-desktop/src/components/ui/actions-menu.tsx | 180 + ui-desktop/src/components/ui/alert.tsx | 53 + ui-desktop/src/components/ui/badge.tsx | 39 + ui-desktop/src/components/ui/button.tsx | 94 + .../src/components/ui/checkbox.test.tsx | 62 + ui-desktop/src/components/ui/checkbox.tsx | 30 + ui-desktop/src/components/ui/codicon.tsx | 32 + .../src/components/ui/color-swatches.tsx | 50 + ui-desktop/src/components/ui/command.tsx | 124 + .../src/components/ui/confirm-dialog.tsx | 136 + ui-desktop/src/components/ui/context-menu.tsx | 180 + ui-desktop/src/components/ui/control.ts | 25 + .../src/components/ui/copy-button.test.tsx | 36 + ui-desktop/src/components/ui/copy-button.tsx | 243 + ui-desktop/src/components/ui/decode-text.tsx | 126 + .../ui/dialog-dismiss-repro.test.tsx | 87 + .../components/ui/dialog-portal-context.ts | 29 + ui-desktop/src/components/ui/dialog.test.tsx | 104 + ui-desktop/src/components/ui/dialog.tsx | 277 + ui-desktop/src/components/ui/diff-count.tsx | 52 + .../src/components/ui/disclosure-caret.tsx | 20 + .../src/components/ui/drop-affordance.tsx | 11 + .../src/components/ui/dropdown-menu.tsx | 296 + ui-desktop/src/components/ui/empty-state.tsx | 24 + ui-desktop/src/components/ui/error-state.tsx | 68 + .../src/components/ui/fade-scroll.test.ts | 52 + ui-desktop/src/components/ui/fade-scroll.tsx | 102 + ui-desktop/src/components/ui/fade-text.tsx | 117 + ui-desktop/src/components/ui/field.tsx | 41 + .../src/components/ui/file-type-icon.tsx | 22 + .../src/components/ui/generate-button.tsx | 62 + .../src/components/ui/glyph-spinner.test.tsx | 167 + .../src/components/ui/glyph-spinner.tsx | 109 + .../components/ui/highlight-matches.test.tsx | 45 + .../src/components/ui/highlight-matches.tsx | 91 + ui-desktop/src/components/ui/input.test.tsx | 66 + ui-desktop/src/components/ui/input.tsx | 73 + ui-desktop/src/components/ui/kbd.tsx | 108 + .../src/components/ui/keyboard-first.test.ts | 69 + .../src/components/ui/keyboard-first.ts | 75 + ui-desktop/src/components/ui/loader.tsx | 558 + ui-desktop/src/components/ui/log-view.tsx | 19 + ui-desktop/src/components/ui/pagination.tsx | 114 + .../src/components/ui/pane-tab.test.tsx | 94 + ui-desktop/src/components/ui/pane-tab.tsx | 329 + ui-desktop/src/components/ui/popover.tsx | 67 + ui-desktop/src/components/ui/progress.tsx | 82 + .../src/components/ui/row-button.test.tsx | 39 + ui-desktop/src/components/ui/row-button.tsx | 13 + .../src/components/ui/sanitized-input.tsx | 17 + ui-desktop/src/components/ui/scroll-area.tsx | 43 + ui-desktop/src/components/ui/search-field.tsx | 104 + .../src/components/ui/segmented-control.tsx | 61 + ui-desktop/src/components/ui/select.tsx | 112 + ui-desktop/src/components/ui/separator.tsx | 26 + ui-desktop/src/components/ui/sheet.tsx | 116 + ui-desktop/src/components/ui/sidebar.tsx | 676 + ui-desktop/src/components/ui/skeleton.tsx | 18 + ui-desktop/src/components/ui/split-button.tsx | 98 + .../src/components/ui/status-pulse.test.tsx | 131 + ui-desktop/src/components/ui/status-pulse.tsx | 142 + ui-desktop/src/components/ui/switch.tsx | 49 + ui-desktop/src/components/ui/tab-dropdown.tsx | 137 + ui-desktop/src/components/ui/tabs.tsx | 36 + ui-desktop/src/components/ui/text-tab.tsx | 43 + ui-desktop/src/components/ui/textarea.tsx | 23 + .../src/components/ui/title-menu-trigger.tsx | 33 + ui-desktop/src/components/ui/tool-icon.tsx | 67 + ui-desktop/src/components/ui/tooltip.test.tsx | 82 + ui-desktop/src/components/ui/tooltip.tsx | 234 + ui-desktop/src/components/ui/use-zoom-pan.ts | 107 + ui-desktop/src/components/ui/zoomable.tsx | 175 + ui-desktop/src/contrib/events.ts | 45 + ui-desktop/src/contrib/index.ts | 6 + ui-desktop/src/contrib/plugin.test.ts | 62 + ui-desktop/src/contrib/plugin.ts | 180 + ui-desktop/src/contrib/plugins-store.ts | 124 + ui-desktop/src/contrib/plugins.ts | 74 + ui-desktop/src/contrib/react/boundary.tsx | 59 + ui-desktop/src/contrib/react/contribute.tsx | 51 + ui-desktop/src/contrib/react/slot.tsx | 26 + .../src/contrib/react/use-contributions.ts | 14 + ui-desktop/src/contrib/registry.ts | 162 + ui-desktop/src/contrib/runtime-loader.test.ts | 77 + ui-desktop/src/contrib/runtime-loader.ts | 395 + ui-desktop/src/contrib/types.ts | 43 + ui-desktop/src/debug/README.md | 111 + ui-desktop/src/debug/atom-churn.ts | 132 + ui-desktop/src/debug/dev-only.noop.ts | 8 + ui-desktop/src/debug/dev-only.ts | 19 + ui-desktop/src/debug/index.ts | 36 + ui-desktop/src/debug/perf-live.ts | 306 + ui-desktop/src/debug/render-counter.ts | 308 + ui-desktop/src/debug/right-pane-events.ts | 25 + ui-desktop/src/debug/right-pane-probe.ts | 58 + ui-desktop/src/debug/watched-atoms.ts | 81 + ui-desktop/src/fonts/JetBrainsMono-Bold.woff2 | Bin 0 -> 94628 bytes .../src/fonts/JetBrainsMono-Italic.woff2 | Bin 0 -> 96428 bytes .../src/fonts/JetBrainsMono-Regular.woff2 | Bin 0 -> 92380 bytes ui-desktop/src/global.d.ts | 946 + ui-desktop/src/hooks/use-delayed-true.ts | 26 + ui-desktop/src/hooks/use-grab-scroll.ts | 77 + ui-desktop/src/hooks/use-image-download.ts | 85 + ui-desktop/src/hooks/use-media-query.ts | 24 + ui-desktop/src/hooks/use-mobile.ts | 3 + ui-desktop/src/hooks/use-resize-observer.ts | 134 + ui-desktop/src/hooks/use-theme-epoch.ts | 32 + ui-desktop/src/i18n/ar.ts | 2611 +++ ui-desktop/src/i18n/catalog.ts | 14 + ui-desktop/src/i18n/context.test.tsx | 250 + ui-desktop/src/i18n/context.tsx | 196 + ui-desktop/src/i18n/define-locale.ts | 41 + ui-desktop/src/i18n/en.ts | 2984 +++ ui-desktop/src/i18n/index.ts | 31 + ui-desktop/src/i18n/ja.ts | 2824 +++ ui-desktop/src/i18n/languages.test.ts | 48 + ui-desktop/src/i18n/languages.ts | 103 + ui-desktop/src/i18n/plugin-i18n.test.tsx | 126 + ui-desktop/src/i18n/plugin-i18n.ts | 116 + ui-desktop/src/i18n/runtime.test.ts | 75 + ui-desktop/src/i18n/runtime.ts | 66 + ui-desktop/src/i18n/types.ts | 2537 +++ ui-desktop/src/i18n/zh-hant.ts | 2710 +++ ui-desktop/src/i18n/zh.ts | 3145 +++ ui-desktop/src/main.tsx | 82 + ui-desktop/src/pairing-scope.test.ts | 43 + ui-desktop/src/plugins/README.md | 16 + ui-desktop/src/plugins/example/plugin.tsx | 125 + .../plugins/hello-runtime/plugin.runtime.js | 38 + ui-desktop/src/plugins/kanban/api.ts | 253 + .../src/plugins/kanban/board-switcher.tsx | 243 + ui-desktop/src/plugins/kanban/board.tsx | 1430 ++ ui-desktop/src/plugins/kanban/drawer.tsx | 958 + ui-desktop/src/plugins/kanban/i18n.ts | 991 + ui-desktop/src/plugins/kanban/kanban.css | 46 + .../plugins/kanban/model-override.test.tsx | 148 + .../src/plugins/kanban/model-override.tsx | 170 + .../src/plugins/kanban/orchestration.tsx | 183 + ui-desktop/src/plugins/kanban/plugin.tsx | 160 + ui-desktop/src/plugins/kanban/types.ts | 214 + ui-desktop/src/plugins/kanban/ui.tsx | 283 + ui-desktop/src/sdk/index.ts | 279 + ui-desktop/src/sdk/runtime.ts | 54 + ui-desktop/src/store/active-work.test.ts | 60 + ui-desktop/src/store/active-work.ts | 42 + ui-desktop/src/store/activity.ts | 100 + ui-desktop/src/store/agent-notices.test.ts | 231 + ui-desktop/src/store/agent-notices.ts | 206 + ui-desktop/src/store/ambient.ts | 18 + ui-desktop/src/store/approval-mode.test.ts | 109 + ui-desktop/src/store/approval-mode.ts | 97 + ui-desktop/src/store/artifacts.test.ts | 164 + ui-desktop/src/store/artifacts.ts | 227 + ui-desktop/src/store/backdrop.ts | 14 + .../src/store/background-delegation.test.ts | 65 + ui-desktop/src/store/background-delegation.ts | 48 + ui-desktop/src/store/billing-block.test.ts | 86 + ui-desktop/src/store/billing-block.ts | 76 + ui-desktop/src/store/boot.ts | 95 + ui-desktop/src/store/clarify.test.ts | 166 + ui-desktop/src/store/clarify.ts | 144 + ui-desktop/src/store/coding-status.test.ts | 287 + ui-desktop/src/store/coding-status.ts | 525 + ui-desktop/src/store/command-palette.ts | 49 + ui-desktop/src/store/compaction.test.ts | 41 + ui-desktop/src/store/compaction.ts | 37 + ui-desktop/src/store/completion-sound.ts | 32 + ui-desktop/src/store/composer-actions.ts | 69 + .../src/store/composer-input-history.test.ts | 138 + .../src/store/composer-input-history.ts | 164 + ui-desktop/src/store/composer-popout.test.ts | 130 + ui-desktop/src/store/composer-popout.ts | 255 + ui-desktop/src/store/composer-queue.test.ts | 262 + ui-desktop/src/store/composer-queue.ts | 358 + ui-desktop/src/store/composer-status.test.ts | 153 + ui-desktop/src/store/composer-status.ts | 447 + ui-desktop/src/store/composer.test.ts | 151 + ui-desktop/src/store/composer.ts | 386 + ui-desktop/src/store/cron.ts | 19 + .../src/store/data-url-read-max.test.ts | 63 + ui-desktop/src/store/data-url-read-max.ts | 76 + ui-desktop/src/store/embed-consent.ts | 37 + ui-desktop/src/store/file-actions.ts | 89 + ui-desktop/src/store/find-in-page.ts | 130 + ui-desktop/src/store/gateway-switch.test.ts | 61 + ui-desktop/src/store/gateway-switch.ts | 79 + ui-desktop/src/store/gateway.ts | 385 + ui-desktop/src/store/goals.test.ts | 73 + ui-desktop/src/store/goals.ts | 177 + ui-desktop/src/store/haptics.ts | 17 + ui-desktop/src/store/hub-actions.ts | 146 + ui-desktop/src/store/keep-awake.test.ts | 33 + ui-desktop/src/store/keep-awake.ts | 29 + ui-desktop/src/store/keybinds.ts | 143 + .../store/layout-dismissed-projects.test.ts | 29 + .../src/store/layout-pinned-order.test.ts | 49 + ui-desktop/src/store/layout.ts | 454 + ui-desktop/src/store/live-sync.ts | 65 + ui-desktop/src/store/model-presets.test.ts | 58 + ui-desktop/src/store/model-presets.ts | 98 + ui-desktop/src/store/model-visibility.test.ts | 329 + ui-desktop/src/store/model-visibility.ts | 262 + .../src/store/native-notifications.test.ts | 265 + ui-desktop/src/store/native-notifications.ts | 257 + ui-desktop/src/store/notifications.test.ts | 57 + ui-desktop/src/store/notifications.ts | 221 + ui-desktop/src/store/notify-baseline.ts | 30 + ui-desktop/src/store/onboarding.test.ts | 593 + ui-desktop/src/store/onboarding.ts | 922 + ui-desktop/src/store/pane-focus.test.ts | 42 + ui-desktop/src/store/pane-focus.ts | 30 + ui-desktop/src/store/panes.test.ts | 146 + ui-desktop/src/store/panes.ts | 183 + ui-desktop/src/store/pet-gallery.test.ts | 210 + ui-desktop/src/store/pet-gallery.ts | 537 + ui-desktop/src/store/pet-generate.ts | 652 + ui-desktop/src/store/pet-overlay.ts | 306 + ui-desktop/src/store/pet.test.ts | 146 + ui-desktop/src/store/pet.ts | 259 + ui-desktop/src/store/power.ts | 30 + ui-desktop/src/store/preview-edit.ts | 30 + .../src/store/preview-persistence.test.ts | 97 + ui-desktop/src/store/preview-status.test.ts | 41 + ui-desktop/src/store/preview-status.ts | 79 + ui-desktop/src/store/preview.test.ts | 167 + ui-desktop/src/store/preview.ts | 326 + ui-desktop/src/store/profile-share.test.ts | 126 + ui-desktop/src/store/profile-share.ts | 218 + ui-desktop/src/store/profile.test.ts | 174 + ui-desktop/src/store/profile.ts | 442 + ui-desktop/src/store/projects.test.ts | 546 + ui-desktop/src/store/projects.ts | 1269 ++ ui-desktop/src/store/prompts.test.ts | 158 + ui-desktop/src/store/prompts.ts | 176 + ui-desktop/src/store/provider-collapse.ts | 28 + ui-desktop/src/store/quick-entry.test.ts | 216 + ui-desktop/src/store/quick-entry.ts | 310 + ui-desktop/src/store/reactions-enabled.ts | 40 + ui-desktop/src/store/reactions-local.ts | 67 + ui-desktop/src/store/reactions.test.ts | 59 + ui-desktop/src/store/reactions.ts | 90 + ui-desktop/src/store/review.test.ts | 490 + ui-desktop/src/store/review.ts | 597 + ui-desktop/src/store/route-tiles.ts | 50 + ui-desktop/src/store/session-color.test.ts | 141 + ui-desktop/src/store/session-color.ts | 80 + ui-desktop/src/store/session-pin-sync.test.ts | 290 + ui-desktop/src/store/session-pin-sync.ts | 202 + ui-desktop/src/store/session-states.test.ts | 229 + ui-desktop/src/store/session-states.ts | 811 + ui-desktop/src/store/session-switcher.test.ts | 115 + ui-desktop/src/store/session-switcher.ts | 127 + ui-desktop/src/store/session-sync.ts | 25 + ui-desktop/src/store/session-watchdog.test.ts | 256 + ui-desktop/src/store/session.test.ts | 679 + ui-desktop/src/store/session.ts | 728 + .../sidebar-collapse-persistence.test.ts | 64 + ui-desktop/src/store/starmap.ts | 65 + ui-desktop/src/store/statusbar-prefs.ts | 54 + ui-desktop/src/store/subagents.test.ts | 193 + ui-desktop/src/store/subagents.ts | 296 + ui-desktop/src/store/system-actions.ts | 48 + ui-desktop/src/store/thread-scroll.ts | 64 + ui-desktop/src/store/todos.test.ts | 105 + ui-desktop/src/store/todos.ts | 90 + ui-desktop/src/store/tool-diffs.test.ts | 47 + ui-desktop/src/store/tool-diffs.ts | 38 + ui-desktop/src/store/tool-dismiss.ts | 45 + ui-desktop/src/store/tool-drafting.ts | 45 + ui-desktop/src/store/tool-view.ts | 110 + ui-desktop/src/store/translucency.ts | 38 + ui-desktop/src/store/updates.test.ts | 930 + ui-desktop/src/store/updates.ts | 790 + ui-desktop/src/store/voice-playback.ts | 24 + ui-desktop/src/store/voice-prefs.test.ts | 38 + ui-desktop/src/store/voice-prefs.ts | 74 + ui-desktop/src/store/wake-word.test.ts | 373 + ui-desktop/src/store/wake-word.ts | 408 + ui-desktop/src/store/windows.test.ts | 160 + ui-desktop/src/store/windows.ts | 103 + .../src/store/working-ids-stored-id.test.ts | 32 + ui-desktop/src/store/workspace-events.ts | 123 + ui-desktop/src/store/zoom.ts | 24 + ui-desktop/src/styles.css | 2266 ++ ui-desktop/src/themes/backend-sync.test.ts | 109 + ui-desktop/src/themes/backend-sync.ts | 94 + ui-desktop/src/themes/color.ts | 148 + ui-desktop/src/themes/context.test.tsx | 70 + ui-desktop/src/themes/context.tsx | 413 + ui-desktop/src/themes/index.ts | 6 + ui-desktop/src/themes/install.test.ts | 132 + ui-desktop/src/themes/install.ts | 92 + ui-desktop/src/themes/presets.test.ts | 33 + ui-desktop/src/themes/presets.ts | 291 + ui-desktop/src/themes/profile-theme.test.ts | 48 + ui-desktop/src/themes/skin.test.ts | 50 + ui-desktop/src/themes/skin.ts | 117 + ui-desktop/src/themes/types.ts | 101 + ui-desktop/src/themes/use-skin-command.ts | 60 + ui-desktop/src/themes/user-themes.test.ts | 105 + ui-desktop/src/themes/user-themes.ts | 193 + ui-desktop/src/themes/vscode.test.ts | 171 + ui-desktop/src/themes/vscode.ts | 370 + ui-desktop/src/types/clawcodex.ts | 1417 ++ ui-desktop/src/vite-env.d.ts | 1 + ui-desktop/src/webhooks-rest.test.ts | 65 + ui-desktop/tsconfig.e2e.json | 9 + ui-desktop/tsconfig.electron.json | 20 + ui-desktop/tsconfig.json | 28 + ui-desktop/vite.config.ts | 169 + ui-desktop/vitest.config.ts | 31 + ui-desktop/vitest.setup.ts | 40 + 1337 files changed, 309648 insertions(+) create mode 100644 ui-desktop/AGENTS.md create mode 100644 ui-desktop/DESIGN.md create mode 100644 ui-desktop/README.md create mode 100644 ui-desktop/assets/icon.icns create mode 100644 ui-desktop/assets/icon.ico create mode 100644 ui-desktop/assets/icon.png create mode 100644 ui-desktop/components.json create mode 100644 ui-desktop/e2e/boot-failure.spec.ts create mode 100644 ui-desktop/e2e/boot.spec.ts create mode 100644 ui-desktop/e2e/chat.spec.ts create mode 100644 ui-desktop/e2e/correction-session-switch.spec.ts create mode 100644 ui-desktop/e2e/fix-electron-tracing.ts create mode 100644 ui-desktop/e2e/fixtures.ts create mode 100644 ui-desktop/e2e/hidden-history-messages.spec.ts create mode 100644 ui-desktop/e2e/image-attachment-resume.spec.ts create mode 100644 ui-desktop/e2e/interim-messages.spec.ts create mode 100644 ui-desktop/e2e/large-session-resume.spec.ts create mode 100644 ui-desktop/e2e/launch-packaged-app.spec.ts create mode 100644 ui-desktop/e2e/mock-backend-setup.spec.ts create mode 100644 ui-desktop/e2e/mock-server.ts create mode 100644 ui-desktop/e2e/onboarding.spec.ts create mode 100644 ui-desktop/e2e/queue-turn-boundary.spec.ts create mode 100644 ui-desktop/e2e/real-session-builder.ts create mode 100644 ui-desktop/e2e/right-pane.spec.ts create mode 100644 ui-desktop/e2e/session-compression-and-queue-stop.spec.ts create mode 100644 ui-desktop/e2e/sidebar-states.spec.ts create mode 100644 ui-desktop/e2e/submit-drift.spec.ts create mode 100644 ui-desktop/e2e/test.ts create mode 100644 ui-desktop/e2e/tile-unread-bug.spec.ts create mode 100644 ui-desktop/e2e/visual-snapshot.ts create mode 100644 ui-desktop/e2e/warm-resume-jitter.spec.ts create mode 100644 ui-desktop/e2e/worktree-branch-status.spec.ts create mode 100644 ui-desktop/electron/active-runtime-state.test.ts create mode 100644 ui-desktop/electron/active-runtime-state.ts create mode 100644 ui-desktop/electron/backend-child.ts create mode 100644 ui-desktop/electron/backend-command.test.ts create mode 100644 ui-desktop/electron/backend-command.ts create mode 100644 ui-desktop/electron/backend-connection-state.test.ts create mode 100644 ui-desktop/electron/backend-connection-state.ts create mode 100644 ui-desktop/electron/backend-env.test.ts create mode 100644 ui-desktop/electron/backend-env.ts create mode 100644 ui-desktop/electron/backend-health.test.ts create mode 100644 ui-desktop/electron/backend-health.ts create mode 100644 ui-desktop/electron/backend-probes.test.ts create mode 100644 ui-desktop/electron/backend-probes.ts create mode 100644 ui-desktop/electron/backend-ready.test.ts create mode 100644 ui-desktop/electron/backend-ready.ts create mode 100644 ui-desktop/electron/backend-start-failure.test.ts create mode 100644 ui-desktop/electron/backend-start-failure.ts create mode 100644 ui-desktop/electron/bootstrap-platform.test.ts create mode 100644 ui-desktop/electron/bootstrap-platform.ts create mode 100644 ui-desktop/electron/bootstrap-repair-guard.test.ts create mode 100644 ui-desktop/electron/bootstrap-repair-guard.ts create mode 100644 ui-desktop/electron/bootstrap-runner.test.ts create mode 100644 ui-desktop/electron/bootstrap-runner.ts create mode 100644 ui-desktop/electron/connection-apply.test.ts create mode 100644 ui-desktop/electron/connection-apply.ts create mode 100644 ui-desktop/electron/connection-config.test.ts create mode 100644 ui-desktop/electron/connection-config.ts create mode 100644 ui-desktop/electron/crash-forensics.test.ts create mode 100644 ui-desktop/electron/crash-forensics.ts create mode 100644 ui-desktop/electron/dashboard-token.test.ts create mode 100644 ui-desktop/electron/dashboard-token.ts create mode 100644 ui-desktop/electron/desktop-electron-pin.test.ts create mode 100644 ui-desktop/electron/desktop-installation.test.ts create mode 100644 ui-desktop/electron/desktop-installation.ts create mode 100644 ui-desktop/electron/desktop-uninstall.test.ts create mode 100644 ui-desktop/electron/desktop-uninstall.ts create mode 100644 ui-desktop/electron/dev-cdp.test.ts create mode 100644 ui-desktop/electron/dev-cdp.ts create mode 100644 ui-desktop/electron/embed-referer.ts create mode 100644 ui-desktop/electron/entitlements.mac.inherit.plist create mode 100644 ui-desktop/electron/entitlements.mac.plist create mode 100644 ui-desktop/electron/event-dedupe.test.ts create mode 100644 ui-desktop/electron/event-dedupe.ts create mode 100644 ui-desktop/electron/find-git-bash.test.ts create mode 100644 ui-desktop/electron/find-git-bash.ts create mode 100644 ui-desktop/electron/find-in-page.test.ts create mode 100644 ui-desktop/electron/find-in-page.ts create mode 100644 ui-desktop/electron/first-run-setup-gate.test.ts create mode 100644 ui-desktop/electron/first-run-setup-gate.ts create mode 100644 ui-desktop/electron/first-run-setup-main-process.test.ts create mode 100644 ui-desktop/electron/fs-read-dir.test.ts create mode 100644 ui-desktop/electron/fs-read-dir.ts create mode 100644 ui-desktop/electron/gateway-ws-probe.test.ts create mode 100644 ui-desktop/electron/gateway-ws-probe.ts create mode 100644 ui-desktop/electron/git-repo-scan.test.ts create mode 100644 ui-desktop/electron/git-repo-scan.ts create mode 100644 ui-desktop/electron/git-review-ops.test.ts create mode 100644 ui-desktop/electron/git-review-ops.ts create mode 100644 ui-desktop/electron/git-root.test.ts create mode 100644 ui-desktop/electron/git-root.ts create mode 100644 ui-desktop/electron/git-worktree-ops.test.ts create mode 100644 ui-desktop/electron/git-worktree-ops.ts create mode 100644 ui-desktop/electron/hardening.test.ts create mode 100644 ui-desktop/electron/hardening.ts create mode 100644 ui-desktop/electron/link-title-window.test.ts create mode 100644 ui-desktop/electron/link-title-window.ts create mode 100644 ui-desktop/electron/main-window-lifecycle.test.ts create mode 100644 ui-desktop/electron/main-window-lifecycle.ts create mode 100644 ui-desktop/electron/main.ts create mode 100644 ui-desktop/electron/native-auth-decisions.test.ts create mode 100644 ui-desktop/electron/native-auth-decisions.ts create mode 100644 ui-desktop/electron/native-oauth-login.test.ts create mode 100644 ui-desktop/electron/native-oauth-login.ts create mode 100644 ui-desktop/electron/native-oauth.test.ts create mode 100644 ui-desktop/electron/native-oauth.ts create mode 100644 ui-desktop/electron/native-token-store.test.ts create mode 100644 ui-desktop/electron/native-token-store.ts create mode 100644 ui-desktop/electron/oauth-net-request.test.ts create mode 100644 ui-desktop/electron/oauth-net-request.ts create mode 100644 ui-desktop/electron/power-save.test.ts create mode 100644 ui-desktop/electron/power-save.ts create mode 100644 ui-desktop/electron/preload.ts create mode 100644 ui-desktop/electron/primary-backend-startup.test.ts create mode 100644 ui-desktop/electron/primary-backend-startup.ts create mode 100644 ui-desktop/electron/primary-connection-rehome.ts create mode 100644 ui-desktop/electron/profile-delete-routing.test.ts create mode 100644 ui-desktop/electron/profile-delete-routing.ts create mode 100644 ui-desktop/electron/profile-session-routing.test.ts create mode 100644 ui-desktop/electron/profile-session-routing.ts create mode 100644 ui-desktop/electron/quick-entry.test.ts create mode 100644 ui-desktop/electron/quick-entry.ts create mode 100644 ui-desktop/electron/quit-guard.test.ts create mode 100644 ui-desktop/electron/quit-guard.ts create mode 100644 ui-desktop/electron/remote-lifecycle.test.ts create mode 100644 ui-desktop/electron/remote-lifecycle.ts create mode 100644 ui-desktop/electron/remote-liveness.test.ts create mode 100644 ui-desktop/electron/remote-liveness.ts create mode 100644 ui-desktop/electron/session-windows.test.ts create mode 100644 ui-desktop/electron/session-windows.ts create mode 100644 ui-desktop/electron/spawn-helper-perms.test.ts create mode 100644 ui-desktop/electron/spawn-helper-perms.ts create mode 100644 ui-desktop/electron/ssh-bootstrap-coordinator.test.ts create mode 100644 ui-desktop/electron/ssh-bootstrap-coordinator.ts create mode 100644 ui-desktop/electron/ssh-config.test.ts create mode 100644 ui-desktop/electron/ssh-config.ts create mode 100644 ui-desktop/electron/ssh-connection.test.ts create mode 100644 ui-desktop/electron/ssh-connection.ts create mode 100644 ui-desktop/electron/stream-throttle.test.ts create mode 100644 ui-desktop/electron/stream-throttle.ts create mode 100644 ui-desktop/electron/titlebar-overlay-width.test.ts create mode 100644 ui-desktop/electron/titlebar-overlay-width.ts create mode 100644 ui-desktop/electron/update-count.test.ts create mode 100644 ui-desktop/electron/update-count.ts create mode 100644 ui-desktop/electron/update-gate.test.ts create mode 100644 ui-desktop/electron/update-gate.ts create mode 100644 ui-desktop/electron/update-marker.test.ts create mode 100644 ui-desktop/electron/update-marker.ts create mode 100644 ui-desktop/electron/update-rebuild.test.ts create mode 100644 ui-desktop/electron/update-rebuild.ts create mode 100644 ui-desktop/electron/update-relaunch.test.ts create mode 100644 ui-desktop/electron/update-relaunch.ts create mode 100644 ui-desktop/electron/update-remote.test.ts create mode 100644 ui-desktop/electron/update-remote.ts create mode 100644 ui-desktop/electron/updater-process.test.ts create mode 100644 ui-desktop/electron/updater-process.ts create mode 100644 ui-desktop/electron/venv-blocker-scan.test.ts create mode 100644 ui-desktop/electron/venv-blocker-scan.ts create mode 100644 ui-desktop/electron/vscode-marketplace.test.ts create mode 100644 ui-desktop/electron/vscode-marketplace.ts create mode 100644 ui-desktop/electron/wake-indicator-window.ts create mode 100644 ui-desktop/electron/wake-indicator.test.ts create mode 100644 ui-desktop/electron/wake-indicator.ts create mode 100644 ui-desktop/electron/window-state.test.ts create mode 100644 ui-desktop/electron/window-state.ts create mode 100644 ui-desktop/electron/windows-child-options.test.ts create mode 100644 ui-desktop/electron/windows-child-options.ts create mode 100644 ui-desktop/electron/windows-clawcodex-path.test.ts create mode 100644 ui-desktop/electron/windows-clawcodex-path.ts create mode 100644 ui-desktop/electron/windows-remote-lifecycle.test.ts create mode 100644 ui-desktop/electron/windows-remote-lifecycle.ts create mode 100644 ui-desktop/electron/windows-remote-live.test.ts create mode 100644 ui-desktop/electron/windows-sandbox-fallback.test.ts create mode 100644 ui-desktop/electron/windows-sandbox-fallback.ts create mode 100644 ui-desktop/electron/windows-system-ca.test.ts create mode 100644 ui-desktop/electron/windows-system-ca.ts create mode 100644 ui-desktop/electron/windows-user-env.test.ts create mode 100644 ui-desktop/electron/windows-user-env.ts create mode 100644 ui-desktop/electron/workspace-cwd.test.ts create mode 100644 ui-desktop/electron/workspace-cwd.ts create mode 100644 ui-desktop/electron/wsl-clipboard-image.test.ts create mode 100644 ui-desktop/electron/wsl-clipboard-image.ts create mode 100644 ui-desktop/electron/wsl-path-bridge.test.ts create mode 100644 ui-desktop/electron/wsl-path-bridge.ts create mode 100644 ui-desktop/electron/zoom.test.ts create mode 100644 ui-desktop/electron/zoom.ts create mode 100644 ui-desktop/eslint.config.mjs create mode 100644 ui-desktop/eslint.config.shared.mjs create mode 100644 ui-desktop/index.html create mode 100644 ui-desktop/package-lock.json create mode 100644 ui-desktop/package.json create mode 100644 ui-desktop/packages/shared/eslint.config.mjs create mode 100644 ui-desktop/packages/shared/package.json create mode 100644 ui-desktop/packages/shared/src/billing-payment-method.test-d.ts create mode 100644 ui-desktop/packages/shared/src/billing-policy.ts create mode 100644 ui-desktop/packages/shared/src/billing-types.ts create mode 100644 ui-desktop/packages/shared/src/charge-settlement.ts create mode 100644 ui-desktop/packages/shared/src/index.ts create mode 100644 ui-desktop/packages/shared/src/json-rpc-gateway.ts create mode 100644 ui-desktop/packages/shared/src/skill-scaffold.test.ts create mode 100644 ui-desktop/packages/shared/src/skill-scaffold.ts create mode 100644 ui-desktop/packages/shared/src/skin.ts create mode 100644 ui-desktop/packages/shared/src/websocket-url.ts create mode 100644 ui-desktop/packages/shared/tsconfig.json create mode 100644 ui-desktop/playwright.config.ts create mode 100644 ui-desktop/preview-demo.html create mode 100644 ui-desktop/public/apple-touch-icon.png create mode 100644 ui-desktop/public/clawcodex-mark.png create mode 100644 ui-desktop/public/ds-assets/filler-bg0.jpg create mode 100644 ui-desktop/scripts/.gitignore create mode 100644 ui-desktop/scripts/after-pack.mjs create mode 100644 ui-desktop/scripts/assert-dist-built.mjs create mode 100644 ui-desktop/scripts/assert-dist-built.test.mjs create mode 100644 ui-desktop/scripts/assert-root-install.mjs create mode 100644 ui-desktop/scripts/before-build.mjs create mode 100644 ui-desktop/scripts/before-pack.mjs create mode 100644 ui-desktop/scripts/before-pack.test.mjs create mode 100644 ui-desktop/scripts/bundle-electron-main.mjs create mode 100644 ui-desktop/scripts/click-session.mjs create mode 100644 ui-desktop/scripts/dev-mock.mjs create mode 100644 ui-desktop/scripts/dev-no-hmr.mjs create mode 100644 ui-desktop/scripts/diag-code-live.mjs create mode 100644 ui-desktop/scripts/diag-drag-churn.mjs create mode 100644 ui-desktop/scripts/diag-drag-trace.mjs create mode 100644 ui-desktop/scripts/diag-jump.mjs create mode 100644 ui-desktop/scripts/diag-key-latency.mjs create mode 100644 ui-desktop/scripts/diag-live-state.mjs create mode 100644 ui-desktop/scripts/diag-overlay-ab.mjs create mode 100644 ui-desktop/scripts/diag-overlay-churn.mjs create mode 100644 ui-desktop/scripts/diag-overlay-full.mjs create mode 100644 ui-desktop/scripts/diag-overlay-sweep.mjs create mode 100644 ui-desktop/scripts/diag-real-loop.mjs create mode 100644 ui-desktop/scripts/diag-ro-storm.mjs create mode 100644 ui-desktop/scripts/diag-scroll-reset.mjs create mode 100644 ui-desktop/scripts/diag-sidebar-dom.mjs create mode 100644 ui-desktop/scripts/diag-switch-autopsy.mjs create mode 100644 ui-desktop/scripts/diag-switch-trace.mjs create mode 100644 ui-desktop/scripts/eval.mjs create mode 100644 ui-desktop/scripts/gen-share-codes.ts create mode 100644 ui-desktop/scripts/live-drive.mjs create mode 100644 ui-desktop/scripts/notarize-artifact.mjs create mode 100644 ui-desktop/scripts/notarize.mjs create mode 100644 ui-desktop/scripts/patch-electron-builder-mac-binary.mjs create mode 100644 ui-desktop/scripts/perf/README.md create mode 100644 ui-desktop/scripts/perf/baseline.json create mode 100644 ui-desktop/scripts/perf/run.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/cold-start.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/first-token.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/idle-cost.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/index.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/keystroke.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/multitab.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/profile-switch.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/render-churn.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/right-pane.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/session-load.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/session-switch.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/stream-history.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/stream.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/submit.mjs create mode 100644 ui-desktop/scripts/perf/scenarios/transcript.mjs create mode 100644 ui-desktop/scripts/perf/serve.mjs create mode 100644 ui-desktop/scripts/probe-command-palette.mjs create mode 100644 ui-desktop/scripts/probe-model-picker.mjs create mode 100644 ui-desktop/scripts/probe-renderer.mjs create mode 100644 ui-desktop/scripts/probe-thread.mjs create mode 100644 ui-desktop/scripts/profile-model-picker.mjs create mode 100644 ui-desktop/scripts/profile-typing-lag.md create mode 100644 ui-desktop/scripts/rebuild-native.mjs create mode 100644 ui-desktop/scripts/reload-renderer.mjs create mode 100644 ui-desktop/scripts/reload.mjs create mode 100644 ui-desktop/scripts/run-electron-builder.mjs create mode 100644 ui-desktop/scripts/set-exe-identity.mjs create mode 100644 ui-desktop/scripts/stage-native-deps.mjs create mode 100644 ui-desktop/scripts/stage-native-deps.test.mjs create mode 100644 ui-desktop/scripts/test-desktop.mjs create mode 100644 ui-desktop/scripts/utils.mjs create mode 100644 ui-desktop/scripts/write-build-stamp.mjs create mode 100644 ui-desktop/scripts/write-build-stamp.test.mjs create mode 100644 ui-desktop/src/app/agents/index.tsx create mode 100644 ui-desktop/src/app/artifacts/artifact-utils.ts create mode 100644 ui-desktop/src/app/artifacts/index.test.ts create mode 100644 ui-desktop/src/app/artifacts/index.tsx create mode 100644 ui-desktop/src/app/chat/chat-drop-overlay.tsx create mode 100644 ui-desktop/src/app/chat/chat-swap-overlay.tsx create mode 100644 ui-desktop/src/app/chat/close-tab.test.ts create mode 100644 ui-desktop/src/app/chat/close-tab.ts create mode 100644 ui-desktop/src/app/chat/composer/at-folder-navigation.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/attachments.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/attachments.tsx create mode 100644 ui-desktop/src/app/chat/composer/completion-drawer.tsx create mode 100644 ui-desktop/src/app/chat/composer/composer-text-guard.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/composer-utils.test.ts create mode 100644 ui-desktop/src/app/chat/composer/composer-utils.ts create mode 100644 ui-desktop/src/app/chat/composer/context-menu.tsx create mode 100644 ui-desktop/src/app/chat/composer/contrib.test.ts create mode 100644 ui-desktop/src/app/chat/composer/contrib.ts create mode 100644 ui-desktop/src/app/chat/composer/controls.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/controls.tsx create mode 100644 ui-desktop/src/app/chat/composer/directive-actions.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/directive-actions.tsx create mode 100644 ui-desktop/src/app/chat/composer/directive-label.test.ts create mode 100644 ui-desktop/src/app/chat/composer/directive-scope.test.ts create mode 100644 ui-desktop/src/app/chat/composer/drop-affordance.ts create mode 100644 ui-desktop/src/app/chat/composer/empty-composer.test.ts create mode 100644 ui-desktop/src/app/chat/composer/enter-submit-dom-race.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/focus.test.ts create mode 100644 ui-desktop/src/app/chat/composer/focus.ts create mode 100644 ui-desktop/src/app/chat/composer/help-hint.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-at-completions.test.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-at-completions.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-auto-speak-replies.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-branch.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-draft.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-draft.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-drop.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-esc-cancel.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-metrics.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-placeholder.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-popout.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-queue.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-queue.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-submit.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-submit.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-trigger.test.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-trigger.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-undo.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-undo.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-url-dialog.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-url-dialog.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-composer-voice.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-emoji-completions.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-live-completion-adapter.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-mic-recorder.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-micro-actions.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-popout-drag.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-slash-completions.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-slash-completions.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-status-presence.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-voice-conversation-rearm.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-voice-conversation.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-voice-conversation.ts create mode 100644 ui-desktop/src/app/chat/composer/hooks/use-voice-recorder.ts create mode 100644 ui-desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/index.tsx create mode 100644 ui-desktop/src/app/chat/composer/inline-references.test.ts create mode 100644 ui-desktop/src/app/chat/composer/inline-refs.ts create mode 100644 ui-desktop/src/app/chat/composer/micro-actions.tsx create mode 100644 ui-desktop/src/app/chat/composer/model-pill.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/model-pill.tsx create mode 100644 ui-desktop/src/app/chat/composer/path-refs.test.ts create mode 100644 ui-desktop/src/app/chat/composer/path-refs.ts create mode 100644 ui-desktop/src/app/chat/composer/queue-panel.tsx create mode 100644 ui-desktop/src/app/chat/composer/rich-editor.test.ts create mode 100644 ui-desktop/src/app/chat/composer/rich-editor.ts create mode 100644 ui-desktop/src/app/chat/composer/scope.tsx create mode 100644 ui-desktop/src/app/chat/composer/slash-nav-dom-repro.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/slash-refs.test.ts create mode 100644 ui-desktop/src/app/chat/composer/slash-refs.ts create mode 100644 ui-desktop/src/app/chat/composer/status-stack/coding-row.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/coding-row.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/goal-indicator.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/index.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/preview-row.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/preview-row.tsx create mode 100644 ui-desktop/src/app/chat/composer/status-stack/status-row.tsx create mode 100644 ui-desktop/src/app/chat/composer/text-utils.test.ts create mode 100644 ui-desktop/src/app/chat/composer/text-utils.ts create mode 100644 ui-desktop/src/app/chat/composer/trigger-popover-parity.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/trigger-popover.test.tsx create mode 100644 ui-desktop/src/app/chat/composer/trigger-popover.tsx create mode 100644 ui-desktop/src/app/chat/composer/types.ts create mode 100644 ui-desktop/src/app/chat/composer/undo-history.test.ts create mode 100644 ui-desktop/src/app/chat/composer/undo-history.ts create mode 100644 ui-desktop/src/app/chat/composer/url-dialog.tsx create mode 100644 ui-desktop/src/app/chat/composer/url-refs.test.ts create mode 100644 ui-desktop/src/app/chat/composer/url-refs.ts create mode 100644 ui-desktop/src/app/chat/composer/voice-activity.tsx create mode 100644 ui-desktop/src/app/chat/hooks/use-composer-actions.test.ts create mode 100644 ui-desktop/src/app/chat/hooks/use-composer-actions.ts create mode 100644 ui-desktop/src/app/chat/hooks/use-file-drop-zone.ts create mode 100644 ui-desktop/src/app/chat/index.test.tsx create mode 100644 ui-desktop/src/app/chat/index.tsx create mode 100644 ui-desktop/src/app/chat/pane-mirror.ts create mode 100644 ui-desktop/src/app/chat/perf-probe.tsx create mode 100644 ui-desktop/src/app/chat/preview-tile.tsx create mode 100644 ui-desktop/src/app/chat/profile-tag.test.tsx create mode 100644 ui-desktop/src/app/chat/profile-tag.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/index.ts create mode 100644 ui-desktop/src/app/chat/right-rail/preview-artifact.test.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-artifact.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-console-state.ts create mode 100644 ui-desktop/src/app/chat/right-rail/preview-console.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-file.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-pane.test.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-pane.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview-reader.test.ts create mode 100644 ui-desktop/src/app/chat/right-rail/preview-reader.ts create mode 100644 ui-desktop/src/app/chat/right-rail/preview-strip-tools.tsx create mode 100644 ui-desktop/src/app/chat/right-rail/preview.tsx create mode 100644 ui-desktop/src/app/chat/route-tile.tsx create mode 100644 ui-desktop/src/app/chat/runtime-repository.test.ts create mode 100644 ui-desktop/src/app/chat/runtime-repository.ts create mode 100644 ui-desktop/src/app/chat/scroll-to-bottom-button.test.tsx create mode 100644 ui-desktop/src/app/chat/scroll-to-bottom-button.tsx create mode 100644 ui-desktop/src/app/chat/session-drag.test.ts create mode 100644 ui-desktop/src/app/chat/session-drag.ts create mode 100644 ui-desktop/src/app/chat/session-status-dot.tsx create mode 100644 ui-desktop/src/app/chat/session-tile-actions.ts create mode 100644 ui-desktop/src/app/chat/session-tile-row.test.ts create mode 100644 ui-desktop/src/app/chat/session-tile.tsx create mode 100644 ui-desktop/src/app/chat/session-view.test.ts create mode 100644 ui-desktop/src/app/chat/session-view.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/chrome.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/cron-jobs-section.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/index.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/load-more-row.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/load-more-row.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/order.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/order.ts create mode 100644 ui-desktop/src/app/chat/sidebar/profile-switcher.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/project-dialog.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/project-dialog.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/base-branch-picker.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/entered-content.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/index.ts create mode 100644 ui-desktop/src/app/chat/sidebar/projects/model.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/projects/model.ts create mode 100644 ui-desktop/src/app/chat/sidebar/projects/overview-row.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/overview-row.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/project-appearance.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/project-menu.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/project-menu.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/workspace-group.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/workspace-groups.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/projects/workspace-groups.ts create mode 100644 ui-desktop/src/app/chat/sidebar/projects/workspace-header.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/workspace-header.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/projects/worktree-dialog.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/reorderable-list.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/section-states.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/session-actions-menu.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/session-actions-menu.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/session-actions-menu.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/session-index.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/session-index.ts create mode 100644 ui-desktop/src/app/chat/sidebar/session-row-state.test.ts create mode 100644 ui-desktop/src/app/chat/sidebar/session-row-state.ts create mode 100644 ui-desktop/src/app/chat/sidebar/session-row.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/session-row.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/sessions-section.test.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/sessions-section.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/split-submenu.tsx create mode 100644 ui-desktop/src/app/chat/sidebar/use-profile-prewarm.ts create mode 100644 ui-desktop/src/app/chat/sidebar/virtual-session-list.tsx create mode 100644 ui-desktop/src/app/chat/surface-vars.test.ts create mode 100644 ui-desktop/src/app/chat/surface-vars.ts create mode 100644 ui-desktop/src/app/chat/thread-loading.test.ts create mode 100644 ui-desktop/src/app/chat/thread-loading.ts create mode 100644 ui-desktop/src/app/chat/transcript-window.test.ts create mode 100644 ui-desktop/src/app/chat/transcript-window.ts create mode 100644 ui-desktop/src/app/command-center/index.tsx create mode 100644 ui-desktop/src/app/command-center/maintenance.tsx create mode 100644 ui-desktop/src/app/command-palette/contrib.ts create mode 100644 ui-desktop/src/app/command-palette/index.tsx create mode 100644 ui-desktop/src/app/command-palette/marketplace-theme-page.tsx create mode 100644 ui-desktop/src/app/command-palette/pet-palette-page.tsx create mode 100644 ui-desktop/src/app/contrib/context.tsx create mode 100644 ui-desktop/src/app/contrib/controller.tsx create mode 100644 ui-desktop/src/app/contrib/dev/credits-notice-demo.ts create mode 100644 ui-desktop/src/app/contrib/hooks/live-status-reap.test.ts create mode 100644 ui-desktop/src/app/contrib/hooks/live-status-spinner.test.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-background-sync.test.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-background-sync.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-desktop-integrations.test.tsx create mode 100644 ui-desktop/src/app/contrib/hooks/use-desktop-integrations.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-pet-bridge.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-quick-entry-bridge.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-session-tile-delegate.test.ts create mode 100644 ui-desktop/src/app/contrib/hooks/use-session-tile-delegate.ts create mode 100644 ui-desktop/src/app/contrib/index.ts create mode 100644 ui-desktop/src/app/contrib/latest-actions.test.ts create mode 100644 ui-desktop/src/app/contrib/latest-actions.ts create mode 100644 ui-desktop/src/app/contrib/panes.tsx create mode 100644 ui-desktop/src/app/contrib/surfaces.tsx create mode 100644 ui-desktop/src/app/contrib/types.ts create mode 100644 ui-desktop/src/app/contrib/wiring.tsx create mode 100644 ui-desktop/src/app/cron/blueprints.test.ts create mode 100644 ui-desktop/src/app/cron/blueprints.tsx create mode 100644 ui-desktop/src/app/cron/cron-job-model.test.ts create mode 100644 ui-desktop/src/app/cron/cron-job-model.ts create mode 100644 ui-desktop/src/app/cron/index.tsx create mode 100644 ui-desktop/src/app/cron/job-state.ts create mode 100644 ui-desktop/src/app/floating-hud.ts create mode 100644 ui-desktop/src/app/gateway/hooks/gateway-hmr-survivor.test.ts create mode 100644 ui-desktop/src/app/gateway/hooks/gateway-hmr-survivor.ts create mode 100644 ui-desktop/src/app/gateway/hooks/use-gateway-boot.test.tsx create mode 100644 ui-desktop/src/app/gateway/hooks/use-gateway-boot.ts create mode 100644 ui-desktop/src/app/gateway/hooks/use-gateway-request.test.ts create mode 100644 ui-desktop/src/app/gateway/hooks/use-gateway-request.ts create mode 100644 ui-desktop/src/app/hooks/use-config-record.ts create mode 100644 ui-desktop/src/app/hooks/use-debounced.ts create mode 100644 ui-desktop/src/app/hooks/use-keybinds.ts create mode 100644 ui-desktop/src/app/hooks/use-on-profile-switch.ts create mode 100644 ui-desktop/src/app/hooks/use-refresh-hotkey.ts create mode 100644 ui-desktop/src/app/hooks/use-route-enum-param.ts create mode 100644 ui-desktop/src/app/hooks/use-route-overlay-active.ts create mode 100644 ui-desktop/src/app/index.tsx create mode 100644 ui-desktop/src/app/layout-constants.ts create mode 100644 ui-desktop/src/app/learning/archive-skill-confirm-dialog.tsx create mode 100644 ui-desktop/src/app/master-detail.tsx create mode 100644 ui-desktop/src/app/messaging/index.test.tsx create mode 100644 ui-desktop/src/app/messaging/index.tsx create mode 100644 ui-desktop/src/app/messaging/platform-icon.tsx create mode 100644 ui-desktop/src/app/model-picker-overlay.tsx create mode 100644 ui-desktop/src/app/model-visibility-overlay.tsx create mode 100644 ui-desktop/src/app/open-session.test.ts create mode 100644 ui-desktop/src/app/open-session.ts create mode 100644 ui-desktop/src/app/overlays/overlay-chrome.tsx create mode 100644 ui-desktop/src/app/overlays/overlay-split-layout.tsx create mode 100644 ui-desktop/src/app/overlays/overlay-view.tsx create mode 100644 ui-desktop/src/app/overlays/panel.test.tsx create mode 100644 ui-desktop/src/app/overlays/panel.tsx create mode 100644 ui-desktop/src/app/page-search-shell.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/draft-grid.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/empty-hint.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/generate-unavailable.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/hatch-preview.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/hatching-view.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/provider-picker.tsx create mode 100644 ui-desktop/src/app/pet-generate/components/reference-chip.tsx create mode 100644 ui-desktop/src/app/pet-generate/pet-generate-content.tsx create mode 100644 ui-desktop/src/app/pet-generate/pet-generate-overlay.tsx create mode 100644 ui-desktop/src/app/pet-overlay/overlay-root.tsx create mode 100644 ui-desktop/src/app/pet-overlay/pet-overlay-app.tsx create mode 100644 ui-desktop/src/app/profiles/create-profile-dialog.tsx create mode 100644 ui-desktop/src/app/profiles/delete-profile-dialog.tsx create mode 100644 ui-desktop/src/app/profiles/index.test.tsx create mode 100644 ui-desktop/src/app/profiles/index.tsx create mode 100644 ui-desktop/src/app/profiles/rename-profile-dialog.tsx create mode 100644 ui-desktop/src/app/quick-entry/quick-entry-app.tsx create mode 100644 ui-desktop/src/app/quick-entry/quick-entry-root.tsx create mode 100644 ui-desktop/src/app/right-sidebar/file-actions.tsx create mode 100644 ui-desktop/src/app/right-sidebar/files/dnd-manager.ts create mode 100644 ui-desktop/src/app/right-sidebar/files/ipc.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/files/ipc.ts create mode 100644 ui-desktop/src/app/right-sidebar/files/remote-picker.tsx create mode 100644 ui-desktop/src/app/right-sidebar/files/tree-sizing.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/files/tree.tsx create mode 100644 ui-desktop/src/app/right-sidebar/files/use-project-tree.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/files/use-project-tree.ts create mode 100644 ui-desktop/src/app/right-sidebar/index.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/index.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/churn-bar.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/file-tree.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/file-tree.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/index.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/ship-bar.tsx create mode 100644 ui-desktop/src/app/right-sidebar/review/tree-data.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/review/tree-data.ts create mode 100644 ui-desktop/src/app/right-sidebar/store.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/active-resize.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/active-resize.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/agent-terminal-stream.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/buffer.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/chrome.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/clipboard.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/clipboard.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/instance.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/links.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/links.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/persistent.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/persistent.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/rail.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/rail.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/revive-buffer.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/selection.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/terminal-font.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/terminal-font.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/terminals.test.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/terminals.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/use-agent-terminal.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/use-agent-terminal.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/use-terminal-font.test.tsx create mode 100644 ui-desktop/src/app/right-sidebar/terminal/use-terminal-font.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/use-terminal-session.ts create mode 100644 ui-desktop/src/app/right-sidebar/terminal/workspace.tsx create mode 100644 ui-desktop/src/app/routes.test.ts create mode 100644 ui-desktop/src/app/routes.ts create mode 100644 ui-desktop/src/app/routes.workspace-reveal.test.ts create mode 100644 ui-desktop/src/app/session-picker-overlay.tsx create mode 100644 ui-desktop/src/app/session-switcher.tsx create mode 100644 ui-desktop/src/app/session/hooks/preview-open.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/session-context-drift.test.ts create mode 100644 ui-desktop/src/app/session/hooks/session-context-drift.ts create mode 100644 ui-desktop/src/app/session/hooks/use-background-queue-drain.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-background-queue-drain.ts create mode 100644 ui-desktop/src/app/session/hooks/use-clawcodex-config.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-clawcodex-config.ts create mode 100644 ui-desktop/src/app/session/hooks/use-context-suggestions.ts create mode 100644 ui-desktop/src/app/session/hooks/use-cwd-actions.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-cwd-actions.ts create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/agent-init-error.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/approval-mode-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/clarify-hydration.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/compaction-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/composer-model-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/delta-flush.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/gateway-event.ts create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/index.ts create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/interim-sealing.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/moa-progress-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/moa-reference-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/session-info-side-effects.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/session-reclaimed.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/stale-pending-settle.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/stream-flush.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/terminal-error-frame.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/todo-cleanup.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/tool-drafting-event.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/utils.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-message-stream/utils.ts create mode 100644 ui-desktop/src/app/session/hooks/use-model-controls.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-model-controls.ts create mode 100644 ui-desktop/src/app/session/hooks/use-preview-routing.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/index.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/index.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/resolve-target-session.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/resolve-target-session.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/rewind.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/rewind.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/slash.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/submit.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/utils.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-prompt-actions/utils.ts create mode 100644 ui-desktop/src/app/session/hooks/use-route-resume.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-route-resume.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions/index.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions/resolve-stored-session.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions/resume-structural-parts.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions/utils.test.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-actions/utils.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-list-actions.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-session-list-actions.ts create mode 100644 ui-desktop/src/app/session/hooks/use-session-state-cache.test.tsx create mode 100644 ui-desktop/src/app/session/hooks/use-session-state-cache.ts create mode 100644 ui-desktop/src/app/session/workspace-session-target.test.ts create mode 100644 ui-desktop/src/app/session/workspace-session-target.ts create mode 100644 ui-desktop/src/app/settings/about-settings.tsx create mode 100644 ui-desktop/src/app/settings/appearance-settings.tsx create mode 100644 ui-desktop/src/app/settings/billing/account-row-value.tsx create mode 100644 ui-desktop/src/app/settings/billing/api.test.ts create mode 100644 ui-desktop/src/app/settings/billing/api.ts create mode 100644 ui-desktop/src/app/settings/billing/auto-reload-row.tsx create mode 100644 ui-desktop/src/app/settings/billing/billing-amounts.ts create mode 100644 ui-desktop/src/app/settings/billing/current-plan-card.tsx create mode 100644 ui-desktop/src/app/settings/billing/dev-fixtures.ts create mode 100644 ui-desktop/src/app/settings/billing/errors.test.ts create mode 100644 ui-desktop/src/app/settings/billing/errors.ts create mode 100644 ui-desktop/src/app/settings/billing/fixtures.test-util.ts create mode 100644 ui-desktop/src/app/settings/billing/index.test.tsx create mode 100644 ui-desktop/src/app/settings/billing/index.tsx create mode 100644 ui-desktop/src/app/settings/billing/inline-feedback.tsx create mode 100644 ui-desktop/src/app/settings/billing/open-external.ts create mode 100644 ui-desktop/src/app/settings/billing/plans-view.tsx create mode 100644 ui-desktop/src/app/settings/billing/simulated-api.test.ts create mode 100644 ui-desktop/src/app/settings/billing/simulated-api.ts create mode 100644 ui-desktop/src/app/settings/billing/tier-art.test.ts create mode 100644 ui-desktop/src/app/settings/billing/tier-art.tsx create mode 100644 ui-desktop/src/app/settings/billing/types.test.ts create mode 100644 ui-desktop/src/app/settings/billing/types.ts create mode 100644 ui-desktop/src/app/settings/billing/use-billing-state.test.ts create mode 100644 ui-desktop/src/app/settings/billing/use-billing-state.ts create mode 100644 ui-desktop/src/app/settings/billing/use-charge-poller.test.ts create mode 100644 ui-desktop/src/app/settings/billing/use-charge-poller.ts create mode 100644 ui-desktop/src/app/settings/billing/use-step-up.test.tsx create mode 100644 ui-desktop/src/app/settings/billing/use-step-up.ts create mode 100644 ui-desktop/src/app/settings/billing/use-subscription-change.test.tsx create mode 100644 ui-desktop/src/app/settings/billing/use-subscription-change.ts create mode 100644 ui-desktop/src/app/settings/combobox-input.tsx create mode 100644 ui-desktop/src/app/settings/computer-use-panel.tsx create mode 100644 ui-desktop/src/app/settings/config-field.tsx create mode 100644 ui-desktop/src/app/settings/config-settings.tsx create mode 100644 ui-desktop/src/app/settings/constants.ts create mode 100644 ui-desktop/src/app/settings/credential-key-ui.tsx create mode 100644 ui-desktop/src/app/settings/custom-endpoints-settings.tsx create mode 100644 ui-desktop/src/app/settings/env-credentials.tsx create mode 100644 ui-desktop/src/app/settings/env-var-actions-menu.tsx create mode 100644 ui-desktop/src/app/settings/fallback-models-field.test.tsx create mode 100644 ui-desktop/src/app/settings/fallback-models-field.tsx create mode 100644 ui-desktop/src/app/settings/field-copy.ts create mode 100644 ui-desktop/src/app/settings/gateway-settings.test.ts create mode 100644 ui-desktop/src/app/settings/gateway-settings.test.tsx create mode 100644 ui-desktop/src/app/settings/gateway-settings.tsx create mode 100644 ui-desktop/src/app/settings/helpers.test.ts create mode 100644 ui-desktop/src/app/settings/helpers.ts create mode 100644 ui-desktop/src/app/settings/index.tsx create mode 100644 ui-desktop/src/app/settings/keybind-settings.tsx create mode 100644 ui-desktop/src/app/settings/keys-settings.tsx create mode 100644 ui-desktop/src/app/settings/memory/connect.tsx create mode 100644 ui-desktop/src/app/settings/memory/field-control.tsx create mode 100644 ui-desktop/src/app/settings/memory/provider-config-modal.test.tsx create mode 100644 ui-desktop/src/app/settings/memory/provider-config-modal.tsx create mode 100644 ui-desktop/src/app/settings/memory/provider-config-panel.test.tsx create mode 100644 ui-desktop/src/app/settings/memory/provider-config-panel.tsx create mode 100644 ui-desktop/src/app/settings/model-settings.test.tsx create mode 100644 ui-desktop/src/app/settings/model-settings.tsx create mode 100644 ui-desktop/src/app/settings/notifications-settings.tsx create mode 100644 ui-desktop/src/app/settings/pet-settings.tsx create mode 100644 ui-desktop/src/app/settings/plugins-settings.tsx create mode 100644 ui-desktop/src/app/settings/primitives.tsx create mode 100644 ui-desktop/src/app/settings/providers-settings.test.tsx create mode 100644 ui-desktop/src/app/settings/providers-settings.tsx create mode 100644 ui-desktop/src/app/settings/quick-entry-settings.tsx create mode 100644 ui-desktop/src/app/settings/searchable-select.test.tsx create mode 100644 ui-desktop/src/app/settings/searchable-select.tsx create mode 100644 ui-desktop/src/app/settings/sessions-settings.tsx create mode 100644 ui-desktop/src/app/settings/ssh-host-selection.test.ts create mode 100644 ui-desktop/src/app/settings/ssh-host-selection.ts create mode 100644 ui-desktop/src/app/settings/terminal-backend-panel.test.tsx create mode 100644 ui-desktop/src/app/settings/terminal-backend-panel.tsx create mode 100644 ui-desktop/src/app/settings/terminal-font-setting.test.tsx create mode 100644 ui-desktop/src/app/settings/terminal-font-setting.tsx create mode 100644 ui-desktop/src/app/settings/toolset-config-panel.test.tsx create mode 100644 ui-desktop/src/app/settings/toolset-config-panel.tsx create mode 100644 ui-desktop/src/app/settings/types.ts create mode 100644 ui-desktop/src/app/settings/uninstall-section.tsx create mode 100644 ui-desktop/src/app/settings/use-deep-link-highlight.ts create mode 100644 ui-desktop/src/app/settings/voice-field-visible.test.ts create mode 100644 ui-desktop/src/app/settings/voice-provider-fields.test.ts create mode 100644 ui-desktop/src/app/settings/voice-provider-fields.tsx create mode 100644 ui-desktop/src/app/settings/with-active.test.ts create mode 100644 ui-desktop/src/app/shell/approval-mode-menu.test.tsx create mode 100644 ui-desktop/src/app/shell/approval-mode-menu.tsx create mode 100644 ui-desktop/src/app/shell/context-usage-panel.test.tsx create mode 100644 ui-desktop/src/app/shell/context-usage-panel.tsx create mode 100644 ui-desktop/src/app/shell/gateway-menu-panel.tsx create mode 100644 ui-desktop/src/app/shell/group-setter.ts create mode 100644 ui-desktop/src/app/shell/hooks/use-overlay-routing.ts create mode 100644 ui-desktop/src/app/shell/hooks/use-status-snapshot.test.ts create mode 100644 ui-desktop/src/app/shell/hooks/use-status-snapshot.ts create mode 100644 ui-desktop/src/app/shell/hooks/use-statusbar-items.tsx create mode 100644 ui-desktop/src/app/shell/hooks/use-window-controls-overlay-width.ts create mode 100644 ui-desktop/src/app/shell/model-catalog-menu.test.tsx create mode 100644 ui-desktop/src/app/shell/model-catalog-menu.tsx create mode 100644 ui-desktop/src/app/shell/model-edit-submenu.test.tsx create mode 100644 ui-desktop/src/app/shell/model-edit-submenu.tsx create mode 100644 ui-desktop/src/app/shell/model-menu-panel.test.tsx create mode 100644 ui-desktop/src/app/shell/model-menu-panel.tsx create mode 100644 ui-desktop/src/app/shell/sidebar-label.tsx create mode 100644 ui-desktop/src/app/shell/statusbar-controls.tsx create mode 100644 ui-desktop/src/app/shell/statusbar-visibility.test.tsx create mode 100644 ui-desktop/src/app/shell/titlebar-controls.tsx create mode 100644 ui-desktop/src/app/shell/titlebar.test.ts create mode 100644 ui-desktop/src/app/shell/titlebar.ts create mode 100644 ui-desktop/src/app/skills/hub.tsx create mode 100644 ui-desktop/src/app/skills/index.test.tsx create mode 100644 ui-desktop/src/app/skills/index.tsx create mode 100644 ui-desktop/src/app/skills/mcp-tab.tsx create mode 100644 ui-desktop/src/app/skills/store.ts create mode 100644 ui-desktop/src/app/starmap/color.ts create mode 100644 ui-desktop/src/app/starmap/constants.ts create mode 100644 ui-desktop/src/app/starmap/geometry.ts create mode 100644 ui-desktop/src/app/starmap/index.tsx create mode 100644 ui-desktop/src/app/starmap/node-context-menu.tsx create mode 100644 ui-desktop/src/app/starmap/render.ts create mode 100644 ui-desktop/src/app/starmap/share-code.test.ts create mode 100644 ui-desktop/src/app/starmap/share-code.ts create mode 100644 ui-desktop/src/app/starmap/share-controls.test.tsx create mode 100644 ui-desktop/src/app/starmap/share-controls.tsx create mode 100644 ui-desktop/src/app/starmap/simulation.ts create mode 100644 ui-desktop/src/app/starmap/star-map.tsx create mode 100644 ui-desktop/src/app/starmap/text.ts create mode 100644 ui-desktop/src/app/starmap/time-axis.ts create mode 100644 ui-desktop/src/app/starmap/timeline.tsx create mode 100644 ui-desktop/src/app/starmap/types.ts create mode 100644 ui-desktop/src/app/types.ts create mode 100644 ui-desktop/src/app/updates-overlay.tsx create mode 100644 ui-desktop/src/app/wake-indicator/wake-indicator-app.tsx create mode 100644 ui-desktop/src/app/wake-indicator/wake-indicator-root.tsx create mode 100644 ui-desktop/src/app/wake-indicator/wake-indicator.css create mode 100644 ui-desktop/src/app/webhooks/index.tsx create mode 100644 ui-desktop/src/assets/tiers/feature-automation.webp create mode 100644 ui-desktop/src/assets/tiers/feature-connect.webp create mode 100644 ui-desktop/src/assets/tiers/feature-memory.webp create mode 100644 ui-desktop/src/assets/tiers/feature-sandbox.webp create mode 100644 ui-desktop/src/clawcodex-cron-scope.test.ts create mode 100644 ui-desktop/src/clawcodex-parity.test.ts create mode 100644 ui-desktop/src/clawcodex-profile-scope.test.ts create mode 100644 ui-desktop/src/clawcodex.test.ts create mode 100644 ui-desktop/src/clawcodex.ts create mode 100644 ui-desktop/src/components/Backdrop.tsx create mode 100644 ui-desktop/src/components/assistant-ui/ansi-text.tsx create mode 100644 ui-desktop/src/components/assistant-ui/artifact-card.tsx create mode 100644 ui-desktop/src/components/assistant-ui/clarify-tool.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/clarify-tool.tsx create mode 100644 ui-desktop/src/components/assistant-ui/directive-text.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/directive-text.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/alert.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/alert.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/embed-consent.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/embed-size.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/escape-html.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/fail.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/frame-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/index.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/mermaid-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/detect.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/index.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/instagram.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/maps.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/pinterest.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/spotify.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/tiktok.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/twitter.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/types.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/vimeo.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/providers/youtube.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/registry.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/rich-boundary.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/scroll-gate.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/social-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/spotify-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/svg-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/types.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/url-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/embeds/use-is-dark.ts create mode 100644 ui-desktop/src/components/assistant-ui/embeds/youtube-embed.tsx create mode 100644 ui-desktop/src/components/assistant-ui/markdown-text.artifacts.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/markdown-text.media.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/markdown-text.session.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/markdown-text.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/markdown-text.tsx create mode 100644 ui-desktop/src/components/assistant-ui/message-render-boundary.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/message-render-boundary.tsx create mode 100644 ui-desktop/src/components/assistant-ui/reference-kinds.ts create mode 100644 ui-desktop/src/components/assistant-ui/session-ref-open.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread-remount.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/assistant-message.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/assistant-message.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/block-direction.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/changed-files-card.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/changed-files.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/content.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/content.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/double-click-reaction.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/edit-context.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/index.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/list.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/list.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/message-parts.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/message-reactions.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/status-tail-only.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/status.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/status.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/streaming.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/system-message.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/timeline-data.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/timeline-data.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/timeline-idle.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/timeline.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/timeline.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/timestamp.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/timestamp.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/transcript-window.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/transcript-window.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/types.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/use-message-reactions.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-edit-composer.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message-edit-gesture.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message-edit.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message-selection.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message-text.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message-text.tsx create mode 100644 ui-desktop/src/components/assistant-ui/thread/user-message.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/approval.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/approval.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/delegate-model.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/delegate-model.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/delegate.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-model.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-model/format.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-model/index.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-model/targets.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-model/types.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback-preview-scope.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/fallback.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/run-summary.test.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/run-summary.ts create mode 100644 ui-desktop/src/components/assistant-ui/tool/run-ticker.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tool/tool-group.test.tsx create mode 100644 ui-desktop/src/components/assistant-ui/tooltip-icon-button.tsx create mode 100644 ui-desktop/src/components/billing-banner.tsx create mode 100644 ui-desktop/src/components/boot-failure-overlay.test.tsx create mode 100644 ui-desktop/src/components/boot-failure-overlay.tsx create mode 100644 ui-desktop/src/components/boot-failure-reauth.test.ts create mode 100644 ui-desktop/src/components/boot-failure-reauth.ts create mode 100644 ui-desktop/src/components/brand-mark.tsx create mode 100644 ui-desktop/src/components/chat/activity-timer-text.tsx create mode 100644 ui-desktop/src/components/chat/activity-timer.test.tsx create mode 100644 ui-desktop/src/components/chat/activity-timer.ts create mode 100644 ui-desktop/src/components/chat/code-card.tsx create mode 100644 ui-desktop/src/components/chat/code-editor-theme.ts create mode 100644 ui-desktop/src/components/chat/code-editor.tsx create mode 100644 ui-desktop/src/components/chat/compact-markdown.tsx create mode 100644 ui-desktop/src/components/chat/composer-dock.ts create mode 100644 ui-desktop/src/components/chat/diff-lines.tsx create mode 100644 ui-desktop/src/components/chat/disclosure-row.tsx create mode 100644 ui-desktop/src/components/chat/expandable-block.test.tsx create mode 100644 ui-desktop/src/components/chat/expandable-block.tsx create mode 100644 ui-desktop/src/components/chat/fixed-row-window.ts create mode 100644 ui-desktop/src/components/chat/generated-image-result.tsx create mode 100644 ui-desktop/src/components/chat/image-generation-placeholder.tsx create mode 100644 ui-desktop/src/components/chat/intro-copy.jsonl create mode 100644 ui-desktop/src/components/chat/intro.tsx create mode 100644 ui-desktop/src/components/chat/json-document-editor.tsx create mode 100644 ui-desktop/src/components/chat/log-tail.tsx create mode 100644 ui-desktop/src/components/chat/preview-attachment.tsx create mode 100644 ui-desktop/src/components/chat/scaffold-row.tsx create mode 100644 ui-desktop/src/components/chat/shiki-block.tsx create mode 100644 ui-desktop/src/components/chat/shiki-highlighter.test.ts create mode 100644 ui-desktop/src/components/chat/shiki-highlighter.tsx create mode 100644 ui-desktop/src/components/chat/skeletons.tsx create mode 100644 ui-desktop/src/components/chat/stable-text.tsx create mode 100644 ui-desktop/src/components/chat/status-row.tsx create mode 100644 ui-desktop/src/components/chat/status-section.tsx create mode 100644 ui-desktop/src/components/chat/syntax-diff.tsx create mode 100644 ui-desktop/src/components/chat/terminal-output.tsx create mode 100644 ui-desktop/src/components/chat/vibe-hearts.tsx create mode 100644 ui-desktop/src/components/chat/widget-shell.ts create mode 100644 ui-desktop/src/components/chat/zoomable-image.tsx create mode 100644 ui-desktop/src/components/desktop-install-overlay.test.tsx create mode 100644 ui-desktop/src/components/desktop-install-overlay.tsx create mode 100644 ui-desktop/src/components/error-boundary.test.tsx create mode 100644 ui-desktop/src/components/error-boundary.tsx create mode 100644 ui-desktop/src/components/find-bar.test.tsx create mode 100644 ui-desktop/src/components/find-bar.tsx create mode 100644 ui-desktop/src/components/first-run-remote-form.tsx create mode 100644 ui-desktop/src/components/gateway-connecting-overlay.test.tsx create mode 100644 ui-desktop/src/components/gateway-connecting-overlay.tsx create mode 100644 ui-desktop/src/components/haptics-provider.tsx create mode 100644 ui-desktop/src/components/idle-mount.test.tsx create mode 100644 ui-desktop/src/components/idle-mount.tsx create mode 100644 ui-desktop/src/components/language-switcher.test.tsx create mode 100644 ui-desktop/src/components/language-switcher.tsx create mode 100644 ui-desktop/src/components/model-picker.tsx create mode 100644 ui-desktop/src/components/model-visibility-dialog.tsx create mode 100644 ui-desktop/src/components/notifications.tsx create mode 100644 ui-desktop/src/components/onboarding/flow.tsx create mode 100644 ui-desktop/src/components/onboarding/glyph.tsx create mode 100644 ui-desktop/src/components/onboarding/index.test.tsx create mode 100644 ui-desktop/src/components/onboarding/index.tsx create mode 100644 ui-desktop/src/components/onboarding/providers.tsx create mode 100644 ui-desktop/src/components/page-loader.tsx create mode 100644 ui-desktop/src/components/pane-shell/edit-mode.tsx create mode 100644 ui-desktop/src/components/pane-shell/geometry.ts create mode 100644 ui-desktop/src/components/pane-shell/index.ts create mode 100644 ui-desktop/src/components/pane-shell/pane-visibility.test.ts create mode 100644 ui-desktop/src/components/pane-shell/pane-visibility.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/floating-adoption.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/focus-tab-hijack.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/focused-session-tab.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/grid-model.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/grid-to-tree.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/hovered-zone-tabs.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/model.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/multi-tab-drag.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/pane-reload.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/pane-toggle-visibility.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/presets.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/reactive-unhide.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/remove-pane.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/drag-session.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/edit-bar.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/floating-panes.test.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/floating-panes.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/floating-rect.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/floating-rect.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/index.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/layout-picker.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/lone-header.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/lone-header.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/narrow-overlays.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tab-strip-scroll.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tab-strip-scroll.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tool-panel-close.test.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/track-model-absorber.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/track-model.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tree-group.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tree-node.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/renderer/tree-split.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/store.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/tab-selection.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/tab-slot-shown.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/tool-pane-toggle.test.ts create mode 100644 ui-desktop/src/components/pane-shell/tree/zone-editor.tsx create mode 100644 ui-desktop/src/components/pane-shell/tree/zones-engine.ts create mode 100644 ui-desktop/src/components/particles/particle-field.css create mode 100644 ui-desktop/src/components/particles/particle-field.tsx create mode 100644 ui-desktop/src/components/pet/floating-pet.tsx create mode 100644 ui-desktop/src/components/pet/pet-bubble.tsx create mode 100644 ui-desktop/src/components/pet/pet-egg-hatch.tsx create mode 100644 ui-desktop/src/components/pet/pet-egg-sheet.png create mode 100644 ui-desktop/src/components/pet/pet-sprite.test.tsx create mode 100644 ui-desktop/src/components/pet/pet-sprite.tsx create mode 100644 ui-desktop/src/components/pet/pet-star-shower.tsx create mode 100644 ui-desktop/src/components/pet/pet-thumb.tsx create mode 100644 ui-desktop/src/components/pet/pixel-egg-sprite.tsx create mode 100644 ui-desktop/src/components/pet/roam-behavior.test.ts create mode 100644 ui-desktop/src/components/pet/roam-behavior.ts create mode 100644 ui-desktop/src/components/pet/roam-geometry.test.ts create mode 100644 ui-desktop/src/components/pet/roam-geometry.ts create mode 100644 ui-desktop/src/components/pet/use-pet-roam.test.tsx create mode 100644 ui-desktop/src/components/pet/use-pet-roam.ts create mode 100644 ui-desktop/src/components/pet/use-pet-zoom-gesture.ts create mode 100644 ui-desktop/src/components/prompt-overlays.test.tsx create mode 100644 ui-desktop/src/components/prompt-overlays.tsx create mode 100644 ui-desktop/src/components/remote-display-banner.tsx create mode 100644 ui-desktop/src/components/session-picker.tsx create mode 100644 ui-desktop/src/components/status-dot.tsx create mode 100644 ui-desktop/src/components/ui/__tests__/no-native-title.test.ts create mode 100644 ui-desktop/src/components/ui/action-status.tsx create mode 100644 ui-desktop/src/components/ui/actions-menu.tsx create mode 100644 ui-desktop/src/components/ui/alert.tsx create mode 100644 ui-desktop/src/components/ui/badge.tsx create mode 100644 ui-desktop/src/components/ui/button.tsx create mode 100644 ui-desktop/src/components/ui/checkbox.test.tsx create mode 100644 ui-desktop/src/components/ui/checkbox.tsx create mode 100644 ui-desktop/src/components/ui/codicon.tsx create mode 100644 ui-desktop/src/components/ui/color-swatches.tsx create mode 100644 ui-desktop/src/components/ui/command.tsx create mode 100644 ui-desktop/src/components/ui/confirm-dialog.tsx create mode 100644 ui-desktop/src/components/ui/context-menu.tsx create mode 100644 ui-desktop/src/components/ui/control.ts create mode 100644 ui-desktop/src/components/ui/copy-button.test.tsx create mode 100644 ui-desktop/src/components/ui/copy-button.tsx create mode 100644 ui-desktop/src/components/ui/decode-text.tsx create mode 100644 ui-desktop/src/components/ui/dialog-dismiss-repro.test.tsx create mode 100644 ui-desktop/src/components/ui/dialog-portal-context.ts create mode 100644 ui-desktop/src/components/ui/dialog.test.tsx create mode 100644 ui-desktop/src/components/ui/dialog.tsx create mode 100644 ui-desktop/src/components/ui/diff-count.tsx create mode 100644 ui-desktop/src/components/ui/disclosure-caret.tsx create mode 100644 ui-desktop/src/components/ui/drop-affordance.tsx create mode 100644 ui-desktop/src/components/ui/dropdown-menu.tsx create mode 100644 ui-desktop/src/components/ui/empty-state.tsx create mode 100644 ui-desktop/src/components/ui/error-state.tsx create mode 100644 ui-desktop/src/components/ui/fade-scroll.test.ts create mode 100644 ui-desktop/src/components/ui/fade-scroll.tsx create mode 100644 ui-desktop/src/components/ui/fade-text.tsx create mode 100644 ui-desktop/src/components/ui/field.tsx create mode 100644 ui-desktop/src/components/ui/file-type-icon.tsx create mode 100644 ui-desktop/src/components/ui/generate-button.tsx create mode 100644 ui-desktop/src/components/ui/glyph-spinner.test.tsx create mode 100644 ui-desktop/src/components/ui/glyph-spinner.tsx create mode 100644 ui-desktop/src/components/ui/highlight-matches.test.tsx create mode 100644 ui-desktop/src/components/ui/highlight-matches.tsx create mode 100644 ui-desktop/src/components/ui/input.test.tsx create mode 100644 ui-desktop/src/components/ui/input.tsx create mode 100644 ui-desktop/src/components/ui/kbd.tsx create mode 100644 ui-desktop/src/components/ui/keyboard-first.test.ts create mode 100644 ui-desktop/src/components/ui/keyboard-first.ts create mode 100644 ui-desktop/src/components/ui/loader.tsx create mode 100644 ui-desktop/src/components/ui/log-view.tsx create mode 100644 ui-desktop/src/components/ui/pagination.tsx create mode 100644 ui-desktop/src/components/ui/pane-tab.test.tsx create mode 100644 ui-desktop/src/components/ui/pane-tab.tsx create mode 100644 ui-desktop/src/components/ui/popover.tsx create mode 100644 ui-desktop/src/components/ui/progress.tsx create mode 100644 ui-desktop/src/components/ui/row-button.test.tsx create mode 100644 ui-desktop/src/components/ui/row-button.tsx create mode 100644 ui-desktop/src/components/ui/sanitized-input.tsx create mode 100644 ui-desktop/src/components/ui/scroll-area.tsx create mode 100644 ui-desktop/src/components/ui/search-field.tsx create mode 100644 ui-desktop/src/components/ui/segmented-control.tsx create mode 100644 ui-desktop/src/components/ui/select.tsx create mode 100644 ui-desktop/src/components/ui/separator.tsx create mode 100644 ui-desktop/src/components/ui/sheet.tsx create mode 100644 ui-desktop/src/components/ui/sidebar.tsx create mode 100644 ui-desktop/src/components/ui/skeleton.tsx create mode 100644 ui-desktop/src/components/ui/split-button.tsx create mode 100644 ui-desktop/src/components/ui/status-pulse.test.tsx create mode 100644 ui-desktop/src/components/ui/status-pulse.tsx create mode 100644 ui-desktop/src/components/ui/switch.tsx create mode 100644 ui-desktop/src/components/ui/tab-dropdown.tsx create mode 100644 ui-desktop/src/components/ui/tabs.tsx create mode 100644 ui-desktop/src/components/ui/text-tab.tsx create mode 100644 ui-desktop/src/components/ui/textarea.tsx create mode 100644 ui-desktop/src/components/ui/title-menu-trigger.tsx create mode 100644 ui-desktop/src/components/ui/tool-icon.tsx create mode 100644 ui-desktop/src/components/ui/tooltip.test.tsx create mode 100644 ui-desktop/src/components/ui/tooltip.tsx create mode 100644 ui-desktop/src/components/ui/use-zoom-pan.ts create mode 100644 ui-desktop/src/components/ui/zoomable.tsx create mode 100644 ui-desktop/src/contrib/events.ts create mode 100644 ui-desktop/src/contrib/index.ts create mode 100644 ui-desktop/src/contrib/plugin.test.ts create mode 100644 ui-desktop/src/contrib/plugin.ts create mode 100644 ui-desktop/src/contrib/plugins-store.ts create mode 100644 ui-desktop/src/contrib/plugins.ts create mode 100644 ui-desktop/src/contrib/react/boundary.tsx create mode 100644 ui-desktop/src/contrib/react/contribute.tsx create mode 100644 ui-desktop/src/contrib/react/slot.tsx create mode 100644 ui-desktop/src/contrib/react/use-contributions.ts create mode 100644 ui-desktop/src/contrib/registry.ts create mode 100644 ui-desktop/src/contrib/runtime-loader.test.ts create mode 100644 ui-desktop/src/contrib/runtime-loader.ts create mode 100644 ui-desktop/src/contrib/types.ts create mode 100644 ui-desktop/src/debug/README.md create mode 100644 ui-desktop/src/debug/atom-churn.ts create mode 100644 ui-desktop/src/debug/dev-only.noop.ts create mode 100644 ui-desktop/src/debug/dev-only.ts create mode 100644 ui-desktop/src/debug/index.ts create mode 100644 ui-desktop/src/debug/perf-live.ts create mode 100644 ui-desktop/src/debug/render-counter.ts create mode 100644 ui-desktop/src/debug/right-pane-events.ts create mode 100644 ui-desktop/src/debug/right-pane-probe.ts create mode 100644 ui-desktop/src/debug/watched-atoms.ts create mode 100644 ui-desktop/src/fonts/JetBrainsMono-Bold.woff2 create mode 100644 ui-desktop/src/fonts/JetBrainsMono-Italic.woff2 create mode 100644 ui-desktop/src/fonts/JetBrainsMono-Regular.woff2 create mode 100644 ui-desktop/src/global.d.ts create mode 100644 ui-desktop/src/hooks/use-delayed-true.ts create mode 100644 ui-desktop/src/hooks/use-grab-scroll.ts create mode 100644 ui-desktop/src/hooks/use-image-download.ts create mode 100644 ui-desktop/src/hooks/use-media-query.ts create mode 100644 ui-desktop/src/hooks/use-mobile.ts create mode 100644 ui-desktop/src/hooks/use-resize-observer.ts create mode 100644 ui-desktop/src/hooks/use-theme-epoch.ts create mode 100644 ui-desktop/src/i18n/ar.ts create mode 100644 ui-desktop/src/i18n/catalog.ts create mode 100644 ui-desktop/src/i18n/context.test.tsx create mode 100644 ui-desktop/src/i18n/context.tsx create mode 100644 ui-desktop/src/i18n/define-locale.ts create mode 100644 ui-desktop/src/i18n/en.ts create mode 100644 ui-desktop/src/i18n/index.ts create mode 100644 ui-desktop/src/i18n/ja.ts create mode 100644 ui-desktop/src/i18n/languages.test.ts create mode 100644 ui-desktop/src/i18n/languages.ts create mode 100644 ui-desktop/src/i18n/plugin-i18n.test.tsx create mode 100644 ui-desktop/src/i18n/plugin-i18n.ts create mode 100644 ui-desktop/src/i18n/runtime.test.ts create mode 100644 ui-desktop/src/i18n/runtime.ts create mode 100644 ui-desktop/src/i18n/types.ts create mode 100644 ui-desktop/src/i18n/zh-hant.ts create mode 100644 ui-desktop/src/i18n/zh.ts create mode 100644 ui-desktop/src/main.tsx create mode 100644 ui-desktop/src/pairing-scope.test.ts create mode 100644 ui-desktop/src/plugins/README.md create mode 100644 ui-desktop/src/plugins/example/plugin.tsx create mode 100644 ui-desktop/src/plugins/hello-runtime/plugin.runtime.js create mode 100644 ui-desktop/src/plugins/kanban/api.ts create mode 100644 ui-desktop/src/plugins/kanban/board-switcher.tsx create mode 100644 ui-desktop/src/plugins/kanban/board.tsx create mode 100644 ui-desktop/src/plugins/kanban/drawer.tsx create mode 100644 ui-desktop/src/plugins/kanban/i18n.ts create mode 100644 ui-desktop/src/plugins/kanban/kanban.css create mode 100644 ui-desktop/src/plugins/kanban/model-override.test.tsx create mode 100644 ui-desktop/src/plugins/kanban/model-override.tsx create mode 100644 ui-desktop/src/plugins/kanban/orchestration.tsx create mode 100644 ui-desktop/src/plugins/kanban/plugin.tsx create mode 100644 ui-desktop/src/plugins/kanban/types.ts create mode 100644 ui-desktop/src/plugins/kanban/ui.tsx create mode 100644 ui-desktop/src/sdk/index.ts create mode 100644 ui-desktop/src/sdk/runtime.ts create mode 100644 ui-desktop/src/store/active-work.test.ts create mode 100644 ui-desktop/src/store/active-work.ts create mode 100644 ui-desktop/src/store/activity.ts create mode 100644 ui-desktop/src/store/agent-notices.test.ts create mode 100644 ui-desktop/src/store/agent-notices.ts create mode 100644 ui-desktop/src/store/ambient.ts create mode 100644 ui-desktop/src/store/approval-mode.test.ts create mode 100644 ui-desktop/src/store/approval-mode.ts create mode 100644 ui-desktop/src/store/artifacts.test.ts create mode 100644 ui-desktop/src/store/artifacts.ts create mode 100644 ui-desktop/src/store/backdrop.ts create mode 100644 ui-desktop/src/store/background-delegation.test.ts create mode 100644 ui-desktop/src/store/background-delegation.ts create mode 100644 ui-desktop/src/store/billing-block.test.ts create mode 100644 ui-desktop/src/store/billing-block.ts create mode 100644 ui-desktop/src/store/boot.ts create mode 100644 ui-desktop/src/store/clarify.test.ts create mode 100644 ui-desktop/src/store/clarify.ts create mode 100644 ui-desktop/src/store/coding-status.test.ts create mode 100644 ui-desktop/src/store/coding-status.ts create mode 100644 ui-desktop/src/store/command-palette.ts create mode 100644 ui-desktop/src/store/compaction.test.ts create mode 100644 ui-desktop/src/store/compaction.ts create mode 100644 ui-desktop/src/store/completion-sound.ts create mode 100644 ui-desktop/src/store/composer-actions.ts create mode 100644 ui-desktop/src/store/composer-input-history.test.ts create mode 100644 ui-desktop/src/store/composer-input-history.ts create mode 100644 ui-desktop/src/store/composer-popout.test.ts create mode 100644 ui-desktop/src/store/composer-popout.ts create mode 100644 ui-desktop/src/store/composer-queue.test.ts create mode 100644 ui-desktop/src/store/composer-queue.ts create mode 100644 ui-desktop/src/store/composer-status.test.ts create mode 100644 ui-desktop/src/store/composer-status.ts create mode 100644 ui-desktop/src/store/composer.test.ts create mode 100644 ui-desktop/src/store/composer.ts create mode 100644 ui-desktop/src/store/cron.ts create mode 100644 ui-desktop/src/store/data-url-read-max.test.ts create mode 100644 ui-desktop/src/store/data-url-read-max.ts create mode 100644 ui-desktop/src/store/embed-consent.ts create mode 100644 ui-desktop/src/store/file-actions.ts create mode 100644 ui-desktop/src/store/find-in-page.ts create mode 100644 ui-desktop/src/store/gateway-switch.test.ts create mode 100644 ui-desktop/src/store/gateway-switch.ts create mode 100644 ui-desktop/src/store/gateway.ts create mode 100644 ui-desktop/src/store/goals.test.ts create mode 100644 ui-desktop/src/store/goals.ts create mode 100644 ui-desktop/src/store/haptics.ts create mode 100644 ui-desktop/src/store/hub-actions.ts create mode 100644 ui-desktop/src/store/keep-awake.test.ts create mode 100644 ui-desktop/src/store/keep-awake.ts create mode 100644 ui-desktop/src/store/keybinds.ts create mode 100644 ui-desktop/src/store/layout-dismissed-projects.test.ts create mode 100644 ui-desktop/src/store/layout-pinned-order.test.ts create mode 100644 ui-desktop/src/store/layout.ts create mode 100644 ui-desktop/src/store/live-sync.ts create mode 100644 ui-desktop/src/store/model-presets.test.ts create mode 100644 ui-desktop/src/store/model-presets.ts create mode 100644 ui-desktop/src/store/model-visibility.test.ts create mode 100644 ui-desktop/src/store/model-visibility.ts create mode 100644 ui-desktop/src/store/native-notifications.test.ts create mode 100644 ui-desktop/src/store/native-notifications.ts create mode 100644 ui-desktop/src/store/notifications.test.ts create mode 100644 ui-desktop/src/store/notifications.ts create mode 100644 ui-desktop/src/store/notify-baseline.ts create mode 100644 ui-desktop/src/store/onboarding.test.ts create mode 100644 ui-desktop/src/store/onboarding.ts create mode 100644 ui-desktop/src/store/pane-focus.test.ts create mode 100644 ui-desktop/src/store/pane-focus.ts create mode 100644 ui-desktop/src/store/panes.test.ts create mode 100644 ui-desktop/src/store/panes.ts create mode 100644 ui-desktop/src/store/pet-gallery.test.ts create mode 100644 ui-desktop/src/store/pet-gallery.ts create mode 100644 ui-desktop/src/store/pet-generate.ts create mode 100644 ui-desktop/src/store/pet-overlay.ts create mode 100644 ui-desktop/src/store/pet.test.ts create mode 100644 ui-desktop/src/store/pet.ts create mode 100644 ui-desktop/src/store/power.ts create mode 100644 ui-desktop/src/store/preview-edit.ts create mode 100644 ui-desktop/src/store/preview-persistence.test.ts create mode 100644 ui-desktop/src/store/preview-status.test.ts create mode 100644 ui-desktop/src/store/preview-status.ts create mode 100644 ui-desktop/src/store/preview.test.ts create mode 100644 ui-desktop/src/store/preview.ts create mode 100644 ui-desktop/src/store/profile-share.test.ts create mode 100644 ui-desktop/src/store/profile-share.ts create mode 100644 ui-desktop/src/store/profile.test.ts create mode 100644 ui-desktop/src/store/profile.ts create mode 100644 ui-desktop/src/store/projects.test.ts create mode 100644 ui-desktop/src/store/projects.ts create mode 100644 ui-desktop/src/store/prompts.test.ts create mode 100644 ui-desktop/src/store/prompts.ts create mode 100644 ui-desktop/src/store/provider-collapse.ts create mode 100644 ui-desktop/src/store/quick-entry.test.ts create mode 100644 ui-desktop/src/store/quick-entry.ts create mode 100644 ui-desktop/src/store/reactions-enabled.ts create mode 100644 ui-desktop/src/store/reactions-local.ts create mode 100644 ui-desktop/src/store/reactions.test.ts create mode 100644 ui-desktop/src/store/reactions.ts create mode 100644 ui-desktop/src/store/review.test.ts create mode 100644 ui-desktop/src/store/review.ts create mode 100644 ui-desktop/src/store/route-tiles.ts create mode 100644 ui-desktop/src/store/session-color.test.ts create mode 100644 ui-desktop/src/store/session-color.ts create mode 100644 ui-desktop/src/store/session-pin-sync.test.ts create mode 100644 ui-desktop/src/store/session-pin-sync.ts create mode 100644 ui-desktop/src/store/session-states.test.ts create mode 100644 ui-desktop/src/store/session-states.ts create mode 100644 ui-desktop/src/store/session-switcher.test.ts create mode 100644 ui-desktop/src/store/session-switcher.ts create mode 100644 ui-desktop/src/store/session-sync.ts create mode 100644 ui-desktop/src/store/session-watchdog.test.ts create mode 100644 ui-desktop/src/store/session.test.ts create mode 100644 ui-desktop/src/store/session.ts create mode 100644 ui-desktop/src/store/sidebar-collapse-persistence.test.ts create mode 100644 ui-desktop/src/store/starmap.ts create mode 100644 ui-desktop/src/store/statusbar-prefs.ts create mode 100644 ui-desktop/src/store/subagents.test.ts create mode 100644 ui-desktop/src/store/subagents.ts create mode 100644 ui-desktop/src/store/system-actions.ts create mode 100644 ui-desktop/src/store/thread-scroll.ts create mode 100644 ui-desktop/src/store/todos.test.ts create mode 100644 ui-desktop/src/store/todos.ts create mode 100644 ui-desktop/src/store/tool-diffs.test.ts create mode 100644 ui-desktop/src/store/tool-diffs.ts create mode 100644 ui-desktop/src/store/tool-dismiss.ts create mode 100644 ui-desktop/src/store/tool-drafting.ts create mode 100644 ui-desktop/src/store/tool-view.ts create mode 100644 ui-desktop/src/store/translucency.ts create mode 100644 ui-desktop/src/store/updates.test.ts create mode 100644 ui-desktop/src/store/updates.ts create mode 100644 ui-desktop/src/store/voice-playback.ts create mode 100644 ui-desktop/src/store/voice-prefs.test.ts create mode 100644 ui-desktop/src/store/voice-prefs.ts create mode 100644 ui-desktop/src/store/wake-word.test.ts create mode 100644 ui-desktop/src/store/wake-word.ts create mode 100644 ui-desktop/src/store/windows.test.ts create mode 100644 ui-desktop/src/store/windows.ts create mode 100644 ui-desktop/src/store/working-ids-stored-id.test.ts create mode 100644 ui-desktop/src/store/workspace-events.ts create mode 100644 ui-desktop/src/store/zoom.ts create mode 100644 ui-desktop/src/styles.css create mode 100644 ui-desktop/src/themes/backend-sync.test.ts create mode 100644 ui-desktop/src/themes/backend-sync.ts create mode 100644 ui-desktop/src/themes/color.ts create mode 100644 ui-desktop/src/themes/context.test.tsx create mode 100644 ui-desktop/src/themes/context.tsx create mode 100644 ui-desktop/src/themes/index.ts create mode 100644 ui-desktop/src/themes/install.test.ts create mode 100644 ui-desktop/src/themes/install.ts create mode 100644 ui-desktop/src/themes/presets.test.ts create mode 100644 ui-desktop/src/themes/presets.ts create mode 100644 ui-desktop/src/themes/profile-theme.test.ts create mode 100644 ui-desktop/src/themes/skin.test.ts create mode 100644 ui-desktop/src/themes/skin.ts create mode 100644 ui-desktop/src/themes/types.ts create mode 100644 ui-desktop/src/themes/use-skin-command.ts create mode 100644 ui-desktop/src/themes/user-themes.test.ts create mode 100644 ui-desktop/src/themes/user-themes.ts create mode 100644 ui-desktop/src/themes/vscode.test.ts create mode 100644 ui-desktop/src/themes/vscode.ts create mode 100644 ui-desktop/src/types/clawcodex.ts create mode 100644 ui-desktop/src/vite-env.d.ts create mode 100644 ui-desktop/src/webhooks-rest.test.ts create mode 100644 ui-desktop/tsconfig.e2e.json create mode 100644 ui-desktop/tsconfig.electron.json create mode 100644 ui-desktop/tsconfig.json create mode 100644 ui-desktop/vite.config.ts create mode 100644 ui-desktop/vitest.config.ts create mode 100644 ui-desktop/vitest.setup.ts diff --git a/ui-desktop/AGENTS.md b/ui-desktop/AGENTS.md new file mode 100644 index 000000000..8f2cd2819 --- /dev/null +++ b/ui-desktop/AGENTS.md @@ -0,0 +1,210 @@ +# Desktop Engineering Guide + +How to build ClawCodex 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. + +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. + +## What this app is + +Desktop is its own native chat surface. It is not the browser dashboard and it +does not embed the TUI. Three parties, each authoritative for one thing: + +- **Electron** owns the machine: process lifecycle, native filesystem/git/ + windows, install/update, and a narrow, typed capability bridge. +- **The renderer** owns the experience: navigation, presentation, and ephemeral + interaction state. +- **The agent backend** owns the work: sessions, tools, model calls, streaming. + +Keep the seams clean. The renderer never reaches for Node or Electron directly; +native power arrives through a deliberate capability, not a general escape hatch. +Agent behavior lives behind the gateway, never reimplemented in React. When a +change blurs a seam, that is the smell — fix the seam, don't widen it. + +## Decide state by authority + +The first question for any piece of state is *who is allowed to be right about +it*, not where it is convenient to store it. Put state with its authority: + +- The **backend** is authoritative for anything another ClawCodex surface can also + change. Treat the renderer's copy as a cache of that truth. +- **Electron** is authoritative for machine and runtime facts. +- The **renderer** owns only what is purely about this window's presentation. + +From that, everything else follows: shared renderer state lives in small stores +owned by the feature that owns the concern; request-shaped server data that wants +invalidation lives in the query layer; short-lived interaction detail stays in +the component; hot coordination that must not paint stays in a ref. Reach for the +narrowest home that still lets the state be correct. A new global store is a +claim that many distant surfaces need it — earn that claim. + +Persisted state must declare its scope in its own key: is this global, or does it +belong to a connection, a profile, a stored session, a project, or a window? +Getting the scope wrong is how one profile's setting bleeds into another. + +## Identity is not incidental + +Sessions have more than one identity, and conflating them is a recurring source +of "session not found" and vanishing history. Reason about which identity a +surface needs: durable navigation and anything the user pins or persists key off +the stable/durable identity; live streaming keys off the runtime identity; state +that must outlive compression keys off the lineage root. Keep the mapping between +them explicit and translate at the boundary rather than passing the wrong id +inward. + +## Server truth is cached, not owned + +The renderer paints from a cache of backend truth, so it must reconcile, not +assume: + +- **Merge, don't clobber.** A refresh is new information layered over what you + already know, not a replacement that can drop live or pinned rows. +- **Be optimistic, then honest.** Direct manipulation should paint immediately + from a snapshot; a failed write rolls back visibly and an authoritative + refresh gets the last word. +- **Guard against the past.** Async results can arrive out of order; a stale + response must never overwrite newer intent. Generation counters and request + tokens exist for this. +- **Isolate the foreground.** Only the surface the user is looking at may publish + into the shared view; background work updates its own cache quietly. +- **Coalesce noise, flush signal.** Batch high-frequency cosmetic updates, but + let terminal transitions (a turn finishing, needing input, failing) reach the + user immediately. +- **Preserve reference identity on no-ops.** Handing React a fresh array that + contains the same data re-renders expensive trees for nothing. + +## Switching context is a re-home, not a reboot + +Changing profile, connection, or mode is a workspace switch, not a cold start. +The shell and whatever the user was doing stay put; only the gateway-bound view +is cleared and repopulated, and the previous context must not leak into the next +one. Reserve the full-screen boot/connecting experience for a genuinely unusable +backend. + +There are three distinct switch shapes, and conflating them is the classic bug: + +- A **connection/mode apply** (local ↔ remote ↔ cloud) is the soft re-home: + shell mounted, gateway-bound stores explicitly wiped, then reconnect. Query + invalidation alone cannot evict live session stores — wipe them. +- A **runtime home change** (switching the underlying `CLAWCODEX_CONFIG_DIR` profile) is + a hard re-home: the window legitimately reloads and state resets by remount. +- A **live profile swap** in the same window activates another profile's socket + while background profiles keep streaming; lists merge rather than wipe, and + only an explicit user selection starts a fresh foreground draft. + +Treating a soft switch as hard flickers the app; treating a hard one as soft +strands stale rows. After any swap, the active socket, active profile, and +connection atoms must agree, or REST and filesystem calls route to the wrong +backend. + +## Cross everything as an observable ladder + +Desktop lives at the seams: versions, profiles, local vs remote vs cloud, +partially installed runtimes, stale caches, older backends. The durable technique +for all of it is the same — an ordered ladder of candidates: + +1. Precedence is written down, in one place, as data or a pure function. +2. A candidate is trusted only after it is validated at the right boundary. + Existence is not proof; probe what you're about to rely on. +3. A failed *read* falls to the next rung; a failed *authoritative write* + surfaces or rolls back rather than silently retargeting. +4. A missing capability and a transient failure are different: the first may + enable a compatibility path or a disabled state; the second should retry. +5. Retries are bounded and end in a real recovery affordance — never an infinite + spinner or a hot loop. +6. One resolver owns each policy so every caller gets the same answer. Scatter is + how two call sites drift apart. + +This is the shape of backend discovery, command/version fallbacks, connection and +auth resolution, workspace-cwd selection, capability detection, and preview +normalization alike. Learn the shape, not a snapshot of the current rungs. + +Two auth-flavored corollaries worth naming because they are easy to get wrong: + +- **One-time credentials are never reused.** An OAuth gateway connection mints a + fresh WebSocket ticket on every dial and never falls back to the cached URL. + Only a confirmed 401/403 (or an explicitly tagged auth rejection) means + reauthentication; timeout, network, malformed-response, and server failures + remain connectivity errors. Only long-lived token/local auth may reuse a + cached URL as a lower rung. +- **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." + +## Compatibility without carrying the past forever + +Desktop and its runtime update on separate clocks, so a change can meet an older +backend. Keep those users working: preserve the current feature, keep the +fallback narrow and tied to an identified older runtime, and cover it with a +test. A fallback that quietly degrades the feature it's meant to protect is worse +than the crash it replaced. + +## Keep the waist narrow, grow at the edges + +The root contribution rubric governs here too. New capability should arrive at +the smallest surface that solves it: extend what exists, add a feature locally, +lean on an existing seam — before you invent a framework. The shell's internal +registries are composition seams, not a public plugin ABI; do not build a +universal extension system, a manifest, or a plugin adapter for a single +consumer. Design a shared contract only once more than one real consumer proves +its shape. "Plugin" means several unrelated things across ClawCodex — do not assume +one surface's extension model runs in another. + +When the new capability is an **agent-callable** one — a tool that acts on this +renderer (open a pane, read the in-app browser, react to a message) — it is a +property of the SESSION's client, not of the backend host. Wire its +availability off the session source the app already sends on `session.create` +(`source: 'desktop'`), never off an env var on the backend process: that +process might be a remote or cloud gateway this app merely connected to. See +the root AGENTS.md, "Surface capability is a property of the SESSION." + +## Respect the person using it + +Design and engineering meet at intent. The user's attention and context are +sacred: + +- Never navigate, move focus, or open a surface because something *happened* in + the background. Offer; don't hijack. +- The states around loading are distinct experiences — empty, loading, + reconnecting, degraded/stale, and exhausted-recovery each deserve their own + honest copy and their own way out. +- Keyboard ownership follows focus. The focused surface wins its keys; one + cancel gesture does exactly one thing. +- Expensive, stateful surfaces (terminals, live tools) stay alive when hidden. + Visibility is not lifecycle. + +## Make it feel instant + +Performance is a feature the user feels, especially in drag, resize, scroll, +typing, streaming, and terminals. The principles are timeless even as the code +changes: keep hot-path state local or narrowly derived; don't subscribe heavy +trees to per-frame updates; coalesce pointer work; avoid reading layout right +after writing style; and don't mount expensive content mid-gesture. Prove speed +against realistic content — a fast empty demo proves nothing about a long +transcript. If motion is masking latency, remove the motion, don't tune it. + +## Testing as a habit of proof + +Test the behavior that would actually break a user, not a snapshot of today's +data. Favor invariants over frozen values. Exercise the real path for anything +at a seam — resolver precedence and its failure rungs, identity and scope +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. + +## The taste test before you hand off + +- Does every piece of state live with its authority, at the narrowest scope? +- Would a background event ever steal the foreground or the user's focus? +- Does each resolver have one home, a validated ladder, and a bounded, recoverable + end? +- Do local, remote, and profile routing still agree? +- Does async failure leave a usable UI and a way forward? +- Do hot interactions stay cheap under realistic load? +- Does the change pass the [`DESIGN.md`](./DESIGN.md) checklist and update all + locales? + +If any answer is "not sure," that's the part to go verify. diff --git a/ui-desktop/DESIGN.md b/ui-desktop/DESIGN.md new file mode 100644 index 000000000..2256ab683 --- /dev/null +++ b/ui-desktop/DESIGN.md @@ -0,0 +1,337 @@ +# Desktop Design System + +Conventions for the Electron desktop app (`apps/desktop`). Read this before +adding a component, overlay, or style. The rule of thumb: **one source per +concern, tokens over literals, flat over boxed.** If you reach for a raw color, +a one-off shadow, a bespoke button, or a hardcoded `px-*` on a control — stop, +there's already a primitive for it. + +This file owns the visual and interaction contract. Read +[`AGENTS.md`](./AGENTS.md) for architecture, state, resolver, transport, and +testing rules. + +This doc contains two kinds of content, maintained differently: + +- **Principles** (flatness, intent, feedback, motion, cancellation) are durable. + They hold as components come and go. +- **Named contracts** (tokens, `Button` variants, primitive names) are the + design system's current API. They are maintained *with* the code: if you + change a primitive, token, or variant, update its entry here **in the same + change** — a stale name in this file is a bug, exactly like a stale type. + +When a rule and the code disagree, fix whichever is wrong rather than forking a +one-off at the call site. + +## Principles + +1. **Flat, not boxed.** No card-in-card, no divider borders inside a panel. + Group with whitespace and a single hairline, never nested rounded boxes. +2. **Borderless elevation for floating panels.** Overlays float on + `shadow-nous` + a `--stroke-nous` hairline, not thick framed boxes. In-panel + structure may use token hairlines sparingly. +3. **One primitive per concern.** One `Button`, one set of control variants, + one `SearchField`, one `Loader`, one `ErrorState`. Migrate onto them; don't + fork. +4. **Tokens, not literals.** Reference CSS vars (`--ui-*`, `--shadow-nous`, + `--theme-*`), never raw hex / ad-hoc rgba in components. +5. **Style lives in the primitive.** Variants and sizes own padding, radius, + color, chrome. Call sites pass a `variant`/`size`, not `className` overrides + that re-specify those. +6. **Intent before automation.** Surface useful actions and previews, but do not + open panes, move focus, or navigate because a tool happened to produce + something. +7. **Immediate feedback.** Direct manipulation updates the view first. Network + or disk persistence reconciles afterward and rolls back visibly on failure. + +## Information architecture + +- **Chat is the home surface.** The transcript and composer stay primary; tools, + previews, files, review, and terminal complement the conversation. +- **Pages are durable destinations.** Chat, Skills, Messaging, and Artifacts + remain in shell chrome. Do not hide a distinct product noun inside an + unrelated page. +- **Route overlays are short tasks.** Settings, Command Center, Cron, Profiles, + Agents, and Starmap render as `OverlayView` cards and return to the previous + route on close. Model/session pickers and dialogs layer above the current + surface; they are not navigation stacks. +- **Panes are working context.** Preview, files, review, and terminal remain + attached to the current task. Their state survives temporary hiding and chat + switches where the underlying tool is meant to persist. +- **One action, one home.** A command may have keyboard, palette, and visible + affordances, but they invoke the same action and state. Do not fork behavior + per entry point. +- **Projects own workspace cwd.** Use Sidebar → Projects for local folders and + worktrees; do not reintroduce a per-session/right-sidebar folder-picker flow. + +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. + +## Surfaces & elevation + +Floating panels (base `Dialog`, route overlays, boot/install/update surfaces, +model-picker, onboarding, prompt overlays, notifications) use: + +``` +shadow-nous /* downward-weighted, layered contact→ambient falloff */ +border-(--stroke-nous) /* currentColor hairline, theme-adaptive */ +``` + +Both are CSS vars in `src/styles.css` — tune in one place, everything inherits. +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 +dashed targets and local blur. These are semantic surface classes, not licenses +for call-site shadow or border inventions. + +## Stroke & color tokens + +| Token | Use | +| --- | --- | +| `--ui-stroke-primary…quaternary` | hairlines, in descending strength | +| `--ui-stroke-tertiary` | the default in-panel divider / list hairline — and every bordered surface in the transcript | +| `--stroke-nous` | the overlay hairline (pairs with `shadow-nous`) | +| `--ui-text-primary / -secondary / -tertiary` | text hierarchy | +| `--ui-bg-quaternary` | soft control fill (secondary button) | +| `--ui-widget-surface-background` | fill for inline chat widgets (`WIDGET_SHELL_CLASS`) | +| `--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). + +## Buttons — one component + +`src/components/ui/button.tsx` is the single source. Pick a `variant` + `size`; +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"). + +**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` +(status-stack/table-footers), and the icon family `icon` / `icon-xs` / +`icon-sm` / `icon-lg` / `icon-titlebar`. + +**Tooltips only when hover teaches something new.** `` is for discovery, +not a tax on every icon. Ask: does hover reveal something the user cannot +already see or infer? If not, skip the tip; keep an `aria-label` for a11y. + +Tip unlabeled chrome when the job (or a keybind / truncated path / host / +other detail) is not already on screen — toolbar / titlebar / statusbar icons, +`TipKeybindLabel` shortcuts, ownership chips, unlabeled icon grids. + +Do **not** tip: + +- Menu triggers (kebabs / ⋯ / `ActionsMenu` / `DropdownMenuTrigger`) — the + affordance is "open menu"; verbs live in the menu. Never tip + `"Actions for ${row title}"` / `"Project actions"` / `"Actions"`. +- Close / dismiss X buttons — the glyph is the label (`aria-label` only). +- Controls whose visible label already says what the tip would ("click to…", + paraphrases of the same words, timer labels restating "Running"). + +Never use native HTML `title=` on buttons — unstyled, ~500ms OS delay, clashes +with the themed `Tip`. `src/components/ui/__tests__/no-native-title.test.ts` +fails on any ` + {openFailed && } + + ) +} + +function MediaAttachment({ path }: { path: string }) { + const [src, setSrc] = useState('') + const [failed, setFailed] = useState(false) + const { open, openFailed } = useOpenMediaFile(path) + const kind = mediaKind(path) + const name = mediaName(path) + + useEffect(() => { + let cancelled = false + let objectUrl = '' + + setFailed(false) + setSrc('') + + if (kind === 'file') { + setFailed(true) + + return () => { + cancelled = true + } + } + + void resolveMediaPlaybackSrc(path) + .then(value => { + if (value.startsWith('blob:')) { + objectUrl = value + } + + if (!cancelled) { + setSrc(value) + } else if (objectUrl) { + URL.revokeObjectURL(objectUrl) + } + }) + .catch(() => { + if (!cancelled) { + setFailed(true) + } + }) + + return () => { + cancelled = true + + if (objectUrl) { + URL.revokeObjectURL(objectUrl) + } + } + }, [kind, path]) + + if (kind === 'image' && src) { + return ( + + + + ) + } + + if (kind === 'audio' && src) { + return ( + + {name} + + ) + } + + if (kind === 'video' && src) { + return ( + + {name} + + ) + } + + return ( + + { + event.preventDefault() + open() + }} + > + {failed ? `Open ${name}` : `Loading ${name}...`} + + {openFailed && } + + ) +} + +function childrenToText(children: unknown): string { + if (typeof children === 'string' || typeof children === 'number') { + return String(children).trim() + } + + if (Array.isArray(children) && children.every(c => typeof c === 'string' || typeof c === 'number')) { + return children.join('').trim() + } + + return '' +} + +function MarkdownLink({ children, className, href, ...props }: ComponentProps<'a'>) { + const mediaPath = mediaPathFromMarkdownHref(href) + + if (mediaPath) { + return + } + + const previewTarget = previewTargetFromMarkdownHref(href) + + if (previewTarget) { + return + } + + const sessionRef = sessionRefFromMarkdownHref(href) + + if (sessionRef) { + return + } + + const target = href ? normalizeExternalUrl(href) : href + + if (!target || !/^https?:\/\//i.test(target)) { + return ( + + {children} + + ) + } + + const text = childrenToText(children) + + // Bare autolink → inline rich embed when a provider matches. Labeled links + // (`[watch](url)`) stay plain. Desktop only (webview / iframe renderers). + if (window.clawcodexDesktop && text && normalizeExternalUrl(text) === target) { + const embed = detectEmbed(target) + + if (embed) { + return + } + } + + const fallbackLabel = text && normalizeExternalUrl(text) !== target ? text : undefined + + return ( + + ) +} + +// Generated/inline media often arrives as image markdown — `![clip](clip.mp4)`. +// A raw with a video/audio source renders a broken-image icon (the file is +// valid, the browser just can't paint it as an image), so route those sources to +// MediaAttachment, which picks the right