@vellumai/assistant 0.4.26 → 0.4.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1360) hide show
  1. package/.env.example +2 -2
  2. package/AGENTS.md +5 -0
  3. package/ARCHITECTURE.md +207 -105
  4. package/Dockerfile +1 -1
  5. package/README.md +111 -113
  6. package/bun.lock +0 -3
  7. package/docs/architecture/integrations.md +0 -1
  8. package/docs/architecture/memory.md +100 -63
  9. package/docs/error-handling.md +71 -0
  10. package/docs/runbook-trusted-contacts.md +89 -52
  11. package/docs/trusted-contact-access.md +48 -46
  12. package/package.json +3 -3
  13. package/scripts/compare-benchmarks.sh +12 -5
  14. package/scripts/ipc/check-swift-decoder-drift.ts +5 -3
  15. package/scripts/test.sh +89 -5
  16. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +50 -37
  17. package/src/__tests__/access-request-decision.test.ts +0 -1
  18. package/src/__tests__/account-registry.test.ts +1 -1
  19. package/src/__tests__/actor-token-service.test.ts +40 -26
  20. package/src/__tests__/agent-loop-thinking.test.ts +29 -13
  21. package/src/__tests__/agent-loop.test.ts +2 -1
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
  23. package/src/__tests__/app-executors.test.ts +7 -17
  24. package/src/__tests__/approval-routes-http.test.ts +2 -2
  25. package/src/__tests__/asset-materialize-tool.test.ts +7 -7
  26. package/src/__tests__/asset-search-tool.test.ts +7 -7
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +18 -10
  28. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  29. package/src/__tests__/browser-skill-endstate.test.ts +10 -1
  30. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +218 -0
  31. package/src/__tests__/call-controller.test.ts +99 -69
  32. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  33. package/src/__tests__/channel-approval-routes.test.ts +157 -114
  34. package/src/__tests__/channel-approval.test.ts +8 -0
  35. package/src/__tests__/channel-approvals.test.ts +39 -1
  36. package/src/__tests__/channel-guardian.test.ts +176 -275
  37. package/src/__tests__/channel-readiness-service.test.ts +6 -2
  38. package/src/__tests__/channel-reply-delivery.test.ts +33 -2
  39. package/src/__tests__/channel-retry-sweep.test.ts +14 -14
  40. package/src/__tests__/checker.test.ts +12 -31
  41. package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
  42. package/src/__tests__/commit-message-enrichment-service.test.ts +71 -59
  43. package/src/__tests__/compaction.benchmark.test.ts +6 -2
  44. package/src/__tests__/computer-use-tools.test.ts +1 -1
  45. package/src/__tests__/config-schema.test.ts +66 -7
  46. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
  47. package/src/__tests__/contacts-tools.test.ts +63 -2
  48. package/src/__tests__/context-overflow-approval.test.ts +141 -0
  49. package/src/__tests__/context-overflow-policy.test.ts +171 -0
  50. package/src/__tests__/context-overflow-reducer.test.ts +533 -0
  51. package/src/__tests__/context-window-manager.test.ts +97 -0
  52. package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
  53. package/src/__tests__/conversation-pairing.test.ts +2 -2
  54. package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
  55. package/src/__tests__/conversation-routes.test.ts +4 -7
  56. package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
  57. package/src/__tests__/credential-security-e2e.test.ts +1 -1
  58. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  59. package/src/__tests__/credential-vault-unit.test.ts +1 -1
  60. package/src/__tests__/credential-vault.test.ts +11 -8
  61. package/src/__tests__/daemon-lifecycle.test.ts +2 -2
  62. package/src/__tests__/daemon-server-session-init.test.ts +6 -6
  63. package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
  64. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
  65. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +9 -0
  66. package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
  67. package/src/__tests__/encrypted-store.test.ts +10 -7
  68. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  69. package/src/__tests__/file-edit-tool.test.ts +1 -1
  70. package/src/__tests__/file-read-tool.test.ts +1 -1
  71. package/src/__tests__/file-write-tool.test.ts +1 -1
  72. package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
  73. package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
  74. package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
  75. package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
  76. package/src/__tests__/followup-tools.test.ts +1 -1
  77. package/src/__tests__/gateway-only-guard.test.ts +4 -0
  78. package/src/__tests__/gemini-image-service.test.ts +2 -2
  79. package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
  80. package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
  81. package/src/__tests__/guardian-dispatch.test.ts +79 -1
  82. package/src/__tests__/guardian-grant-minting.test.ts +20 -20
  83. package/src/__tests__/guardian-outbound-http.test.ts +1 -2
  84. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
  85. package/src/__tests__/guardian-routing-invariants.test.ts +36 -16
  86. package/src/__tests__/guardian-routing-state.test.ts +36 -52
  87. package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
  88. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +6 -8
  89. package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
  90. package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
  91. package/src/__tests__/handlers-telegram-config.test.ts +14 -14
  92. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
  93. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  94. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  95. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  96. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  97. package/src/__tests__/heartbeat-service.test.ts +45 -2
  98. package/src/__tests__/host-file-edit-tool.test.ts +1 -1
  99. package/src/__tests__/host-file-read-tool.test.ts +1 -1
  100. package/src/__tests__/host-file-write-tool.test.ts +1 -1
  101. package/src/__tests__/host-shell-tool.test.ts +1 -1
  102. package/src/__tests__/inbound-invite-redemption.test.ts +17 -19
  103. package/src/__tests__/ingress-reconcile.test.ts +2 -2
  104. package/src/__tests__/integrations-cli.test.ts +232 -0
  105. package/src/__tests__/intent-routing.test.ts +7 -5
  106. package/src/__tests__/invite-redemption-service.test.ts +5 -4
  107. package/src/__tests__/{ingress-routes-http.test.ts → invite-routes-http.test.ts} +42 -321
  108. package/src/__tests__/ipc-snapshot.test.ts +32 -31
  109. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
  110. package/src/__tests__/mcp-cli.test.ts +136 -57
  111. package/src/__tests__/mcp-client-auth.test.ts +95 -0
  112. package/src/__tests__/media-generate-image.test.ts +2 -2
  113. package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
  114. package/src/__tests__/memory-regressions.test.ts +6 -6
  115. package/src/__tests__/messaging-send-tool.test.ts +1 -1
  116. package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
  117. package/src/__tests__/migration-export-http.test.ts +540 -0
  118. package/src/__tests__/migration-import-commit-http.test.ts +823 -0
  119. package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
  120. package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
  121. package/src/__tests__/migration-transport.test.ts +904 -0
  122. package/src/__tests__/migration-validate-http.test.ts +698 -0
  123. package/src/__tests__/migration-wizard.test.ts +1289 -0
  124. package/src/__tests__/nl-approval-parser.test.ts +305 -0
  125. package/src/__tests__/non-member-access-request.test.ts +17 -17
  126. package/src/__tests__/notification-decision-strategy.test.ts +110 -2
  127. package/src/__tests__/notification-deep-link.test.ts +18 -0
  128. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  129. package/src/__tests__/oauth-provider-profiles.test.ts +34 -0
  130. package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
  131. package/src/__tests__/playbook-execution.test.ts +1 -1
  132. package/src/__tests__/playbook-tools.test.ts +1 -1
  133. package/src/__tests__/provider-error-scenarios.test.ts +68 -0
  134. package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
  135. package/src/__tests__/proxy-approval-callback.test.ts +1 -1
  136. package/src/__tests__/qdrant-manager.test.ts +40 -11
  137. package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
  138. package/src/__tests__/recording-handler.test.ts +2 -2
  139. package/src/__tests__/recording-intent-handler.test.ts +3 -3
  140. package/src/__tests__/recording-state-machine.test.ts +2 -2
  141. package/src/__tests__/relay-server.test.ts +507 -228
  142. package/src/__tests__/reminder-store.test.ts +8 -0
  143. package/src/__tests__/reminder.test.ts +8 -0
  144. package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
  145. package/src/__tests__/retry-after-extraction.test.ts +111 -0
  146. package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
  147. package/src/__tests__/schedule-tools.test.ts +1 -1
  148. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  149. package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
  150. package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
  151. package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
  152. package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
  153. package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
  154. package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
  155. package/src/__tests__/script-proxy-policy.test.ts +2 -2
  156. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +127 -0
  157. package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
  158. package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
  159. package/src/__tests__/secret-onetime-send.test.ts +4 -4
  160. package/src/__tests__/secret-scanner-executor.test.ts +2 -2
  161. package/src/__tests__/send-endpoint-busy.test.ts +11 -9
  162. package/src/__tests__/send-notification-tool.test.ts +2 -2
  163. package/src/__tests__/session-abort-tool-results.test.ts +17 -2
  164. package/src/__tests__/session-agent-loop.test.ts +456 -35
  165. package/src/__tests__/session-confirmation-signals.test.ts +3 -2
  166. package/src/__tests__/session-conflict-gate.test.ts +20 -3
  167. package/src/__tests__/session-init.benchmark.test.ts +2 -2
  168. package/src/__tests__/session-load-history-repair.test.ts +7 -7
  169. package/src/__tests__/session-media-retry.test.ts +147 -0
  170. package/src/__tests__/session-pre-run-repair.test.ts +17 -2
  171. package/src/__tests__/session-profile-injection.test.ts +20 -3
  172. package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
  173. package/src/__tests__/session-queue.test.ts +33 -18
  174. package/src/__tests__/session-runtime-assembly.test.ts +147 -1
  175. package/src/__tests__/session-runtime-workspace.test.ts +40 -0
  176. package/src/__tests__/session-slash-known.test.ts +21 -3
  177. package/src/__tests__/session-slash-queue.test.ts +17 -2
  178. package/src/__tests__/session-slash-unknown.test.ts +17 -2
  179. package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
  180. package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
  181. package/src/__tests__/session-workspace-injection.test.ts +17 -2
  182. package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
  183. package/src/__tests__/shell-credential-ref.test.ts +1 -1
  184. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  185. package/src/__tests__/skill-feature-flags-integration.test.ts +9 -5
  186. package/src/__tests__/skill-feature-flags.test.ts +18 -12
  187. package/src/__tests__/skill-load-feature-flag.test.ts +5 -4
  188. package/src/__tests__/skill-load-tool.test.ts +1 -1
  189. package/src/__tests__/skill-script-runner-host.test.ts +1 -1
  190. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
  191. package/src/__tests__/skill-script-runner.test.ts +1 -1
  192. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  193. package/src/__tests__/slack-block-formatting.test.ts +100 -0
  194. package/src/__tests__/slack-inbound-verification.test.ts +346 -0
  195. package/src/__tests__/slack-reaction-approvals.test.ts +77 -0
  196. package/src/__tests__/slack-skill.test.ts +4 -2
  197. package/src/__tests__/starter-task-flow.test.ts +0 -1
  198. package/src/__tests__/subagent-tools.test.ts +3 -3
  199. package/src/__tests__/swarm-recursion.test.ts +1 -1
  200. package/src/__tests__/swarm-session-integration.test.ts +1 -1
  201. package/src/__tests__/swarm-tool.test.ts +1 -1
  202. package/src/__tests__/task-management-tools.test.ts +1 -1
  203. package/src/__tests__/task-tools.test.ts +1 -1
  204. package/src/__tests__/terminal-tools.test.ts +1 -1
  205. package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
  206. package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
  207. package/src/__tests__/tool-approval-handler.test.ts +15 -15
  208. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
  209. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  210. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
  211. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  212. package/src/__tests__/tool-executor.test.ts +23 -182
  213. package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
  214. package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
  215. package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
  216. package/src/__tests__/trust-context-guards.test.ts +25 -29
  217. package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
  218. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
  219. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
  220. package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
  221. package/src/__tests__/trusted-contact-verification.test.ts +64 -76
  222. package/src/__tests__/turn-commit.test.ts +18 -18
  223. package/src/__tests__/twilio-provider.test.ts +7 -7
  224. package/src/__tests__/validation-results-screen.test.ts +1107 -0
  225. package/src/__tests__/view-image-tool.test.ts +1 -1
  226. package/src/__tests__/voice-invite-redemption.test.ts +4 -3
  227. package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
  228. package/src/__tests__/voice-session-bridge.test.ts +24 -24
  229. package/src/agent/attachments.ts +3 -1
  230. package/src/agent/loop.ts +13 -13
  231. package/src/agent/message-types.ts +13 -7
  232. package/src/amazon/cart.ts +59 -32
  233. package/src/amazon/checkout.ts +25 -14
  234. package/src/amazon/client.ts +61 -58
  235. package/src/amazon/product-details.ts +3 -3
  236. package/src/amazon/request-extractor.ts +46 -31
  237. package/src/amazon/search.ts +6 -4
  238. package/src/amazon/session.ts +33 -24
  239. package/src/approvals/AGENTS.md +26 -0
  240. package/src/approvals/approval-primitive.ts +87 -64
  241. package/src/approvals/guardian-decision-primitive.ts +172 -81
  242. package/src/approvals/guardian-request-resolvers.ts +262 -155
  243. package/src/autonomy/autonomy-resolver.ts +7 -5
  244. package/src/autonomy/autonomy-store.ts +34 -19
  245. package/src/autonomy/disposition-mapper.ts +5 -5
  246. package/src/autonomy/index.ts +6 -6
  247. package/src/autonomy/types.ts +7 -3
  248. package/src/browser-extension-relay/client.ts +50 -19
  249. package/src/browser-extension-relay/protocol.ts +11 -11
  250. package/src/browser-extension-relay/server.ts +45 -20
  251. package/src/bundler/app-bundler.ts +75 -50
  252. package/src/bundler/bundle-scanner.ts +145 -41
  253. package/src/bundler/bundle-signer.ts +16 -14
  254. package/src/bundler/signature-verifier.ts +36 -33
  255. package/src/calls/call-constants.ts +10 -3
  256. package/src/calls/call-controller.ts +473 -214
  257. package/src/calls/call-conversation-messages.ts +25 -15
  258. package/src/calls/call-domain.ts +401 -148
  259. package/src/calls/call-pointer-message-composer.ts +26 -21
  260. package/src/calls/call-pointer-messages.ts +52 -28
  261. package/src/calls/call-recovery.ts +53 -37
  262. package/src/calls/call-state-machine.ts +37 -7
  263. package/src/calls/call-state.ts +35 -13
  264. package/src/calls/call-store.ts +165 -77
  265. package/src/calls/elevenlabs-client.ts +39 -20
  266. package/src/calls/guardian-action-sweep.ts +42 -24
  267. package/src/calls/guardian-dispatch.ts +79 -56
  268. package/src/calls/guardian-question-copy.ts +28 -23
  269. package/src/calls/relay-server.ts +1149 -532
  270. package/src/calls/speaker-identification.ts +21 -15
  271. package/src/calls/twilio-config.ts +34 -17
  272. package/src/calls/twilio-provider.ts +108 -55
  273. package/src/calls/twilio-rest.ts +212 -100
  274. package/src/calls/twilio-routes.ts +165 -92
  275. package/src/calls/types.ts +55 -7
  276. package/src/calls/voice-quality.ts +6 -4
  277. package/src/calls/voice-session-bridge.ts +181 -133
  278. package/src/channels/config.ts +18 -14
  279. package/src/channels/types.ts +38 -10
  280. package/src/cli/amazon.ts +333 -227
  281. package/src/cli/config-commands.ts +236 -146
  282. package/src/cli/core-commands.ts +403 -329
  283. package/src/cli/email-guardrails.ts +38 -19
  284. package/src/cli/email.ts +207 -153
  285. package/src/cli/influencer.ts +58 -56
  286. package/src/cli/integrations.ts +306 -0
  287. package/src/cli/ipc-client.ts +24 -19
  288. package/src/cli/map.ts +176 -129
  289. package/src/cli/mcp.ts +260 -152
  290. package/src/cli/sequence.ts +165 -107
  291. package/src/cli/twitter.ts +302 -218
  292. package/src/cli.ts +418 -279
  293. package/src/commands/cc-command-registry.ts +52 -27
  294. package/src/config/agent-schema.ts +217 -134
  295. package/src/config/assistant-feature-flags.ts +23 -18
  296. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
  297. package/src/config/bundled-skills/app-builder/SKILL.md +193 -1500
  298. package/src/config/bundled-skills/app-builder/TOOLS.json +70 -18
  299. package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
  300. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
  301. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
  302. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
  303. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
  304. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
  305. package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
  306. package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
  307. package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
  308. package/src/config/bundled-skills/browser/TOOLS.json +59 -2
  309. package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
  310. package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
  311. package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
  312. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
  313. package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
  314. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
  315. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
  316. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
  317. package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
  318. package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
  319. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
  320. package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
  321. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
  322. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
  323. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +4 -0
  324. package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
  325. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
  326. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  327. package/src/config/bundled-skills/computer-use/TOOLS.json +50 -2
  328. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
  329. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
  330. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
  331. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
  332. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
  333. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
  334. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
  335. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
  336. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
  337. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
  338. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
  339. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
  340. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
  341. package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
  342. package/src/config/bundled-skills/contacts/SKILL.md +453 -15
  343. package/src/config/bundled-skills/contacts/TOOLS.json +22 -2
  344. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +79 -20
  345. package/src/config/bundled-skills/contacts/tools/contact-search.ts +55 -18
  346. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +64 -19
  347. package/src/config/bundled-skills/document/TOOLS.json +8 -0
  348. package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
  349. package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
  350. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
  351. package/src/config/bundled-skills/email-setup/SKILL.md +12 -9
  352. package/src/config/bundled-skills/followups/TOOLS.json +12 -0
  353. package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
  354. package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
  355. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
  356. package/src/config/bundled-skills/google-calendar/TOOLS.json +124 -26
  357. package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
  358. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
  359. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
  360. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
  361. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
  362. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
  363. package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
  364. package/src/config/bundled-skills/google-calendar/types.ts +3 -3
  365. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +88 -33
  366. package/src/config/bundled-skills/image-studio/TOOLS.json +12 -2
  367. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +48 -25
  368. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +13 -3
  369. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
  370. package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
  371. package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
  372. package/src/config/bundled-skills/media-processing/TOOLS.json +48 -2
  373. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
  374. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
  375. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
  376. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
  377. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
  378. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
  379. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
  380. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
  381. package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
  382. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
  383. package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
  384. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
  385. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
  386. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +198 -92
  387. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
  388. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
  389. package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
  390. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
  391. package/src/config/bundled-skills/messaging/SKILL.md +7 -5
  392. package/src/config/bundled-skills/messaging/TOOLS.json +232 -186
  393. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
  394. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
  395. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
  396. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
  397. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
  398. package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
  399. package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
  400. package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
  401. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
  402. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
  403. package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
  404. package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
  405. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
  406. package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
  407. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
  408. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
  409. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
  410. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
  411. package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
  412. package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
  413. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
  414. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
  415. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
  416. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
  417. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
  418. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
  419. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
  420. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
  421. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
  422. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
  423. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
  424. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
  425. package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
  426. package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
  427. package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
  428. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
  429. package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
  430. package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
  431. package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
  432. package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
  433. package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
  434. package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
  435. package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
  436. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
  437. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
  438. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
  439. package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
  440. package/src/config/bundled-skills/notifications/SKILL.md +3 -2
  441. package/src/config/bundled-skills/notifications/TOOLS.json +7 -13
  442. package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
  443. package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
  444. package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
  445. package/src/config/bundled-skills/phone-calls/TOOLS.json +13 -1
  446. package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
  447. package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
  448. package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
  449. package/src/config/bundled-skills/playbooks/TOOLS.json +16 -0
  450. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
  451. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
  452. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
  453. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
  454. package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
  455. package/src/config/bundled-skills/reminder/TOOLS.json +15 -2
  456. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
  457. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
  458. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
  459. package/src/config/bundled-skills/schedule/SKILL.md +33 -15
  460. package/src/config/bundled-skills/schedule/TOOLS.json +17 -1
  461. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
  462. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
  463. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
  464. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
  465. package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
  466. package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
  467. package/src/config/bundled-skills/slack/SKILL.md +30 -1
  468. package/src/config/bundled-skills/slack/TOOLS.json +122 -17
  469. package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
  470. package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
  471. package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
  472. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +146 -0
  473. package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
  474. package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
  475. package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
  476. package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
  477. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +120 -0
  478. package/src/config/bundled-skills/slack-app-setup/SKILL.md +200 -0
  479. package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
  480. package/src/config/bundled-skills/subagent/TOOLS.json +22 -2
  481. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
  482. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
  483. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
  484. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
  485. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
  486. package/src/config/bundled-skills/tasks/TOOLS.json +86 -14
  487. package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
  488. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
  489. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
  490. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
  491. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
  492. package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
  493. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
  494. package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
  495. package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
  496. package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
  497. package/src/config/bundled-skills/transcribe/TOOLS.json +4 -0
  498. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
  499. package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
  500. package/src/config/bundled-skills/twitter/SKILL.md +19 -2
  501. package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
  502. package/src/config/bundled-skills/watcher/TOOLS.json +20 -0
  503. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
  504. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
  505. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
  506. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
  507. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
  508. package/src/config/bundled-skills/weather/TOOLS.json +4 -0
  509. package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
  510. package/src/config/bundled-tool-registry.ts +2 -0
  511. package/src/config/calls-schema.ts +108 -63
  512. package/src/config/channel-permission-profiles.ts +155 -0
  513. package/src/config/computer-use-prompt.ts +7 -7
  514. package/src/config/core-schema.ts +239 -155
  515. package/src/config/defaults.ts +2 -2
  516. package/src/config/elevenlabs-schema.ts +15 -15
  517. package/src/config/env-registry.ts +33 -33
  518. package/src/config/env.ts +4 -1
  519. package/src/config/feature-flag-registry.json +31 -7
  520. package/src/config/loader.ts +118 -58
  521. package/src/config/mcp-schema.ts +29 -15
  522. package/src/config/memory-schema.ts +434 -229
  523. package/src/config/notifications-schema.ts +4 -4
  524. package/src/config/sandbox-schema.ts +2 -2
  525. package/src/config/schema.ts +12 -2
  526. package/src/config/skill-state.ts +27 -15
  527. package/src/config/skills-schema.ts +72 -23
  528. package/src/config/skills.ts +303 -143
  529. package/src/config/system-prompt.ts +25 -6
  530. package/src/config/types.ts +1 -1
  531. package/src/config/update-bulletin-format.ts +3 -3
  532. package/src/config/update-bulletin-state.ts +15 -6
  533. package/src/config/update-bulletin-template-path.ts +8 -4
  534. package/src/config/update-bulletin.ts +33 -14
  535. package/src/config/user-reference.ts +8 -8
  536. package/src/contacts/contact-events.ts +21 -0
  537. package/src/contacts/contact-store.ts +813 -100
  538. package/src/contacts/contacts-write.ts +287 -0
  539. package/src/contacts/index.ts +13 -4
  540. package/src/contacts/startup-migration.ts +21 -0
  541. package/src/contacts/types.ts +73 -2
  542. package/src/context/token-estimator.ts +54 -31
  543. package/src/context/tool-result-truncation.ts +41 -7
  544. package/src/context/window-manager.ts +225 -120
  545. package/src/daemon/approval-generators.ts +83 -55
  546. package/src/daemon/approved-devices-store.ts +33 -20
  547. package/src/daemon/assistant-attachments.ts +157 -101
  548. package/src/daemon/auth-manager.ts +17 -15
  549. package/src/daemon/classifier.ts +117 -46
  550. package/src/daemon/computer-use-session.ts +316 -187
  551. package/src/daemon/config-watcher.ts +91 -44
  552. package/src/daemon/connection-policy.ts +18 -10
  553. package/src/daemon/context-overflow-approval.ts +48 -0
  554. package/src/daemon/context-overflow-policy.ts +50 -0
  555. package/src/daemon/context-overflow-reducer.ts +300 -0
  556. package/src/daemon/daemon-control.ts +79 -51
  557. package/src/daemon/date-context.ts +119 -69
  558. package/src/daemon/dictation-profile-store.ts +94 -48
  559. package/src/daemon/dictation-text-processing.ts +33 -12
  560. package/src/daemon/doordash-steps.ts +92 -49
  561. package/src/daemon/guardian-action-generators.ts +62 -46
  562. package/src/daemon/guardian-verification-intent.ts +35 -19
  563. package/src/daemon/handlers/apps.ts +258 -113
  564. package/src/daemon/handlers/avatar.ts +20 -15
  565. package/src/daemon/handlers/computer-use.ts +82 -39
  566. package/src/daemon/handlers/config-channels.ts +146 -69
  567. package/src/daemon/handlers/config-heartbeat.ts +114 -59
  568. package/src/daemon/handlers/config-inbox.ts +213 -160
  569. package/src/daemon/handlers/config-ingress.ts +127 -55
  570. package/src/daemon/handlers/config-integrations.ts +145 -88
  571. package/src/daemon/handlers/config-model.ts +58 -22
  572. package/src/daemon/handlers/config-platform.ts +40 -16
  573. package/src/daemon/handlers/config-scheduling.ts +109 -48
  574. package/src/daemon/handlers/config-slack-channel.ts +67 -35
  575. package/src/daemon/handlers/config-slack.ts +21 -20
  576. package/src/daemon/handlers/config-telegram.ts +100 -70
  577. package/src/daemon/handlers/config-tools.ts +103 -55
  578. package/src/daemon/handlers/config-trust.ts +50 -20
  579. package/src/daemon/handlers/config.ts +72 -24
  580. package/src/daemon/handlers/contacts.ts +163 -0
  581. package/src/daemon/handlers/diagnostics.ts +90 -48
  582. package/src/daemon/handlers/documents.ts +74 -46
  583. package/src/daemon/handlers/guardian-actions.ts +57 -77
  584. package/src/daemon/handlers/home-base.ts +19 -16
  585. package/src/daemon/handlers/identity.ts +65 -45
  586. package/src/daemon/handlers/index.ts +78 -54
  587. package/src/daemon/handlers/misc.ts +664 -234
  588. package/src/daemon/handlers/navigate-settings.ts +14 -11
  589. package/src/daemon/handlers/oauth-connect.ts +48 -35
  590. package/src/daemon/handlers/open-bundle-handler.ts +31 -24
  591. package/src/daemon/handlers/pairing.ts +51 -25
  592. package/src/daemon/handlers/publish.ts +55 -33
  593. package/src/daemon/handlers/recording.ts +378 -162
  594. package/src/daemon/handlers/sessions.ts +922 -423
  595. package/src/daemon/handlers/shared.ts +202 -117
  596. package/src/daemon/handlers/signing.ts +25 -6
  597. package/src/daemon/handlers/subagents.ts +117 -56
  598. package/src/daemon/handlers/twitter-auth.ts +70 -49
  599. package/src/daemon/handlers/work-items.ts +264 -112
  600. package/src/daemon/handlers/workspace-files.ts +27 -20
  601. package/src/daemon/handlers.ts +2 -2
  602. package/src/daemon/history-repair.ts +16 -15
  603. package/src/daemon/identity-helpers.ts +4 -4
  604. package/src/daemon/install-cli-launchers.ts +33 -22
  605. package/src/daemon/ipc-blob-store.ts +38 -24
  606. package/src/daemon/ipc-contract/apps.ts +61 -50
  607. package/src/daemon/ipc-contract/computer-use.ts +47 -37
  608. package/src/daemon/ipc-contract/contacts.ts +69 -0
  609. package/src/daemon/ipc-contract/diagnostics.ts +14 -14
  610. package/src/daemon/ipc-contract/documents.ts +8 -8
  611. package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
  612. package/src/daemon/ipc-contract/inbox.ts +12 -71
  613. package/src/daemon/ipc-contract/integrations.ts +57 -44
  614. package/src/daemon/ipc-contract/memory.ts +3 -5
  615. package/src/daemon/ipc-contract/messages.ts +95 -69
  616. package/src/daemon/ipc-contract/notifications.ts +10 -6
  617. package/src/daemon/ipc-contract/pairing.ts +8 -8
  618. package/src/daemon/ipc-contract/schedules.ts +20 -20
  619. package/src/daemon/ipc-contract/sessions.ts +89 -57
  620. package/src/daemon/ipc-contract/settings.ts +12 -7
  621. package/src/daemon/ipc-contract/shared.ts +9 -7
  622. package/src/daemon/ipc-contract/skills.ts +46 -26
  623. package/src/daemon/ipc-contract/subagents.ts +9 -9
  624. package/src/daemon/ipc-contract/surfaces.ts +0 -1
  625. package/src/daemon/ipc-contract/trust.ts +11 -11
  626. package/src/daemon/ipc-contract/work-items.ts +33 -28
  627. package/src/daemon/ipc-contract/workspace.ts +28 -21
  628. package/src/daemon/ipc-contract-inventory.json +10 -4
  629. package/src/daemon/ipc-contract-inventory.ts +29 -26
  630. package/src/daemon/ipc-contract.ts +111 -44
  631. package/src/daemon/ipc-handler.ts +27 -19
  632. package/src/daemon/ipc-protocol.ts +22 -12
  633. package/src/daemon/ipc-validate.ts +91 -46
  634. package/src/daemon/lifecycle.ts +39 -3
  635. package/src/daemon/main.ts +10 -8
  636. package/src/daemon/media-visibility-policy.ts +3 -1
  637. package/src/daemon/pairing-store.ts +72 -40
  638. package/src/daemon/providers-setup.ts +35 -25
  639. package/src/daemon/recording-executor.ts +37 -30
  640. package/src/daemon/recording-intent-fallback.ts +58 -28
  641. package/src/daemon/recording-intent.ts +71 -61
  642. package/src/daemon/ride-shotgun-handler.ts +201 -121
  643. package/src/daemon/seed-files.ts +28 -17
  644. package/src/daemon/server.ts +23 -14
  645. package/src/daemon/session-agent-loop-handlers.ts +270 -135
  646. package/src/daemon/session-agent-loop.ts +796 -253
  647. package/src/daemon/session-attachments.ts +109 -40
  648. package/src/daemon/session-conflict-gate.ts +72 -28
  649. package/src/daemon/session-dynamic-profile.ts +36 -22
  650. package/src/daemon/session-error.ts +68 -45
  651. package/src/daemon/session-evictor.ts +17 -10
  652. package/src/daemon/session-history.ts +201 -89
  653. package/src/daemon/session-lifecycle.ts +80 -44
  654. package/src/daemon/session-media-retry.ts +104 -42
  655. package/src/daemon/session-memory.ts +77 -55
  656. package/src/daemon/session-messaging.ts +261 -111
  657. package/src/daemon/session-notifiers.ts +57 -45
  658. package/src/daemon/session-process.ts +370 -154
  659. package/src/daemon/session-queue-manager.ts +30 -13
  660. package/src/daemon/session-runtime-assembly.ts +61 -15
  661. package/src/daemon/session-skill-tools.ts +84 -36
  662. package/src/daemon/session-slash.ts +178 -113
  663. package/src/daemon/session-surfaces.ts +498 -212
  664. package/src/daemon/session-tool-setup.ts +24 -16
  665. package/src/daemon/session-usage.ts +26 -13
  666. package/src/daemon/session-workspace.ts +7 -4
  667. package/src/daemon/session.ts +18 -19
  668. package/src/daemon/shutdown-handlers.ts +36 -33
  669. package/src/daemon/tls-certs.ts +90 -57
  670. package/src/daemon/tool-side-effects.ts +97 -65
  671. package/src/daemon/trace-emitter.ts +8 -7
  672. package/src/daemon/video-thumbnail.ts +55 -25
  673. package/src/daemon/watch-handler.ts +164 -86
  674. package/src/email/provider.ts +1 -1
  675. package/src/email/providers/agentmail.ts +87 -45
  676. package/src/email/providers/index.ts +19 -14
  677. package/src/email/service.ts +52 -24
  678. package/src/email/types.ts +2 -2
  679. package/src/errors.ts +1 -1
  680. package/src/events/bus.ts +30 -10
  681. package/src/events/domain-events.ts +20 -13
  682. package/src/events/index.ts +6 -6
  683. package/src/events/tool-audit-listener.ts +34 -20
  684. package/src/events/tool-domain-event-publisher.ts +22 -20
  685. package/src/events/tool-metrics-listener.ts +26 -21
  686. package/src/events/tool-notification-listener.ts +5 -5
  687. package/src/events/tool-profiling-listener.ts +33 -23
  688. package/src/events/tool-trace-listener.ts +70 -46
  689. package/src/export/formatter.ts +38 -32
  690. package/src/followups/followup-store.ts +43 -36
  691. package/src/followups/index.ts +2 -2
  692. package/src/followups/types.ts +1 -1
  693. package/src/gallery/default-gallery.ts +37 -34
  694. package/src/gallery/gallery-manifest.ts +9 -9
  695. package/src/heartbeat/heartbeat-service.ts +59 -37
  696. package/src/home-base/app-link-store.ts +14 -12
  697. package/src/home-base/bootstrap.ts +14 -8
  698. package/src/home-base/prebuilt/seed.ts +34 -26
  699. package/src/home-base/prebuilt-home-base-updater.ts +14 -8
  700. package/src/hooks/cli.ts +56 -43
  701. package/src/hooks/config.ts +27 -14
  702. package/src/hooks/discovery.ts +53 -33
  703. package/src/hooks/manager.ts +50 -26
  704. package/src/hooks/runner.ts +35 -29
  705. package/src/hooks/templates.ts +38 -15
  706. package/src/hooks/types.ts +13 -13
  707. package/src/inbound/platform-callback-registration.ts +21 -15
  708. package/src/inbound/public-ingress-urls.ts +9 -6
  709. package/src/index.ts +20 -19
  710. package/src/influencer/client.ts +261 -117
  711. package/src/instrument.ts +3 -1
  712. package/src/logfire.ts +64 -39
  713. package/src/mcp/client.ts +107 -55
  714. package/src/mcp/manager.ts +45 -18
  715. package/src/mcp/mcp-oauth-provider.ts +114 -62
  716. package/src/media/gemini-image-service.ts +75 -23
  717. package/src/memory/account-store.ts +16 -9
  718. package/src/memory/admin.ts +87 -57
  719. package/src/memory/app-git-service.ts +77 -47
  720. package/src/memory/app-store.ts +148 -78
  721. package/src/memory/attachments-store.ts +123 -53
  722. package/src/memory/canonical-guardian-store.ts +190 -48
  723. package/src/memory/channel-delivery-store.ts +5 -5
  724. package/src/memory/channel-guardian-store.ts +31 -16
  725. package/src/memory/checkpoints.ts +14 -7
  726. package/src/memory/clarification-resolver.ts +219 -104
  727. package/src/memory/conflict-intent.ts +74 -23
  728. package/src/memory/conflict-policy.ts +20 -7
  729. package/src/memory/conflict-store.ts +144 -94
  730. package/src/memory/contradiction-checker.ts +257 -132
  731. package/src/memory/conversation-attention-store.ts +74 -32
  732. package/src/memory/conversation-bootstrap.ts +28 -0
  733. package/src/memory/conversation-crud.ts +12 -5
  734. package/src/memory/conversation-display-order-migration.ts +7 -7
  735. package/src/memory/conversation-key-store.ts +18 -13
  736. package/src/memory/conversation-queries.ts +130 -52
  737. package/src/memory/conversation-store.ts +43 -26
  738. package/src/memory/conversation-title-service.ts +89 -66
  739. package/src/memory/db-init.ts +94 -2
  740. package/src/memory/db.ts +10 -3
  741. package/src/memory/delivery-channels.ts +12 -6
  742. package/src/memory/delivery-crud.ts +26 -12
  743. package/src/memory/delivery-status.ts +19 -16
  744. package/src/memory/embedding-backend.ts +205 -77
  745. package/src/memory/embedding-gemini.ts +23 -10
  746. package/src/memory/embedding-local.ts +89 -44
  747. package/src/memory/embedding-ollama.ts +25 -13
  748. package/src/memory/embedding-openai.ts +20 -11
  749. package/src/memory/embedding-runtime-manager.ts +163 -90
  750. package/src/memory/entity-extractor.ts +185 -123
  751. package/src/memory/external-conversation-store.ts +30 -12
  752. package/src/memory/fingerprint.ts +2 -2
  753. package/src/memory/fts-reconciler.ts +57 -28
  754. package/src/memory/guardian-action-store.ts +162 -100
  755. package/src/memory/guardian-approvals.ts +63 -129
  756. package/src/memory/guardian-rate-limits.ts +20 -9
  757. package/src/memory/guardian-verification.ts +82 -35
  758. package/src/memory/indexer.ts +96 -55
  759. package/src/memory/{ingress-invite-store.ts → invite-store.ts} +28 -169
  760. package/src/memory/items-extractor.ts +313 -157
  761. package/src/memory/job-handlers/backfill.ts +116 -63
  762. package/src/memory/job-handlers/cleanup.ts +64 -41
  763. package/src/memory/job-handlers/conflict.ts +90 -49
  764. package/src/memory/job-handlers/embedding.ts +32 -17
  765. package/src/memory/job-handlers/extraction.ts +58 -33
  766. package/src/memory/job-handlers/index-maintenance.ts +31 -17
  767. package/src/memory/job-handlers/media-processing.ts +65 -24
  768. package/src/memory/job-handlers/summarization.ts +186 -128
  769. package/src/memory/job-utils.ts +100 -57
  770. package/src/memory/jobs-store.ts +235 -142
  771. package/src/memory/jobs-worker.ts +167 -83
  772. package/src/memory/llm-request-log-store.ts +13 -11
  773. package/src/memory/llm-usage-store.ts +35 -26
  774. package/src/memory/media-store.ts +151 -44
  775. package/src/memory/message-content.ts +28 -18
  776. package/src/memory/migrations/001-job-deferrals.ts +11 -5
  777. package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
  778. package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
  779. package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
  780. package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
  781. package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
  782. package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
  783. package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
  784. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
  785. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
  786. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
  787. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
  788. package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
  789. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
  790. package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
  791. package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
  792. package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
  793. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
  794. package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
  795. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
  796. package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
  797. package/src/memory/migrations/022-add-origin-interface.ts +4 -2
  798. package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
  799. package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
  800. package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
  801. package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
  802. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
  803. package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
  804. package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
  805. package/src/memory/migrations/028-call-session-mode.ts +13 -3
  806. package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
  807. package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
  808. package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
  809. package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
  810. package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
  811. package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
  812. package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
  813. package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
  814. package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
  815. package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
  816. package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
  817. package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
  818. package/src/memory/migrations/038-actor-token-records.ts +5 -9
  819. package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
  820. package/src/memory/migrations/100-core-tables.ts +1 -1
  821. package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
  822. package/src/memory/migrations/103-complex-migrations.ts +9 -9
  823. package/src/memory/migrations/104-core-indexes.ts +188 -64
  824. package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
  825. package/src/memory/migrations/106-call-sessions.ts +58 -16
  826. package/src/memory/migrations/107-followups.ts +16 -6
  827. package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
  828. package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
  829. package/src/memory/migrations/110-channel-guardian.ts +48 -10
  830. package/src/memory/migrations/111-media-assets.ts +52 -18
  831. package/src/memory/migrations/112-assistant-inbox.ts +32 -12
  832. package/src/memory/migrations/113-late-migrations.ts +12 -12
  833. package/src/memory/migrations/114-notifications.ts +28 -12
  834. package/src/memory/migrations/115-sequences.ts +10 -4
  835. package/src/memory/migrations/116-messages-fts.ts +1 -1
  836. package/src/memory/migrations/117-conversation-attention.ts +16 -6
  837. package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
  838. package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
  839. package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
  840. package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
  841. package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
  842. package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
  843. package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
  844. package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
  845. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
  846. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
  847. package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
  848. package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
  849. package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
  850. package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
  851. package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
  852. package/src/memory/migrations/133-assistant-contact-metadata.ts +21 -0
  853. package/src/memory/migrations/index.ts +83 -73
  854. package/src/memory/migrations/registry.ts +53 -37
  855. package/src/memory/migrations/validate-migration-state.ts +73 -46
  856. package/src/memory/profile-compiler.ts +58 -24
  857. package/src/memory/published-pages-store.ts +12 -16
  858. package/src/memory/qdrant-circuit-breaker.ts +28 -20
  859. package/src/memory/qdrant-client.ts +99 -63
  860. package/src/memory/qdrant-manager.ts +89 -57
  861. package/src/memory/query-builder.ts +9 -7
  862. package/src/memory/raw-query.ts +63 -14
  863. package/src/memory/recall-cache.ts +15 -8
  864. package/src/memory/retrieval-budget.ts +0 -1
  865. package/src/memory/retriever.ts +385 -192
  866. package/src/memory/schema-migration.ts +1 -1
  867. package/src/memory/schema.ts +56 -56
  868. package/src/memory/scoped-approval-grants.ts +99 -45
  869. package/src/memory/search/entity.ts +102 -40
  870. package/src/memory/search/formatting.ts +70 -52
  871. package/src/memory/search/lexical.ts +82 -43
  872. package/src/memory/search/ranking.ts +103 -39
  873. package/src/memory/search/semantic.ts +59 -35
  874. package/src/memory/search/types.ts +8 -8
  875. package/src/memory/segmenter.ts +20 -12
  876. package/src/memory/shared-app-links-store.ts +21 -16
  877. package/src/memory/slack-thread-store.ts +187 -0
  878. package/src/memory/task-memory-cleanup.ts +18 -8
  879. package/src/memory/tool-usage-store.ts +27 -19
  880. package/src/memory/validation.ts +4 -2
  881. package/src/messaging/activity-analyzer.ts +7 -7
  882. package/src/messaging/draft-store.ts +13 -10
  883. package/src/messaging/email-classifier.ts +73 -37
  884. package/src/messaging/index.ts +3 -3
  885. package/src/messaging/outreach-classifier.ts +76 -38
  886. package/src/messaging/provider-types.ts +2 -4
  887. package/src/messaging/provider.ts +37 -8
  888. package/src/messaging/providers/gmail/adapter.ts +183 -66
  889. package/src/messaging/providers/gmail/client.ts +3 -1
  890. package/src/messaging/providers/gmail/mime-builder.ts +21 -19
  891. package/src/messaging/providers/gmail/people-client.ts +22 -9
  892. package/src/messaging/providers/gmail/types.ts +6 -6
  893. package/src/messaging/providers/slack/adapter.ts +93 -43
  894. package/src/messaging/providers/slack/client.ts +165 -48
  895. package/src/messaging/providers/slack/types.ts +10 -0
  896. package/src/messaging/providers/sms/adapter.ts +76 -40
  897. package/src/messaging/providers/sms/client.ts +4 -4
  898. package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
  899. package/src/messaging/providers/telegram-bot/client.ts +7 -7
  900. package/src/messaging/providers/whatsapp/adapter.ts +58 -31
  901. package/src/messaging/providers/whatsapp/client.ts +4 -4
  902. package/src/messaging/registry.ts +9 -5
  903. package/src/messaging/style-analyzer.ts +69 -39
  904. package/src/messaging/thread-summarizer.ts +101 -53
  905. package/src/messaging/triage-engine.ts +111 -82
  906. package/src/messaging/types.ts +10 -10
  907. package/src/migrations/config-merge.ts +18 -10
  908. package/src/migrations/data-layout.ts +35 -22
  909. package/src/migrations/data-merge.ts +17 -7
  910. package/src/migrations/hooks-merge.ts +43 -16
  911. package/src/migrations/index.ts +6 -6
  912. package/src/migrations/log.ts +9 -5
  913. package/src/migrations/skills-merge.ts +17 -7
  914. package/src/migrations/workspace-layout.ts +39 -25
  915. package/src/notifications/AGENTS.md +5 -0
  916. package/src/notifications/adapters/macos.ts +21 -14
  917. package/src/notifications/adapters/slack.ts +90 -0
  918. package/src/notifications/adapters/sms.ts +28 -15
  919. package/src/notifications/adapters/telegram.ts +24 -15
  920. package/src/notifications/broadcaster.ts +108 -52
  921. package/src/notifications/conversation-pairing.ts +64 -29
  922. package/src/notifications/copy-composer.ts +165 -95
  923. package/src/notifications/decision-engine.ts +353 -147
  924. package/src/notifications/decisions-store.ts +26 -10
  925. package/src/notifications/deliveries-store.ts +23 -13
  926. package/src/notifications/destination-resolver.ts +83 -24
  927. package/src/notifications/deterministic-checks.ts +78 -27
  928. package/src/notifications/emit-signal.ts +95 -41
  929. package/src/notifications/events-store.ts +13 -7
  930. package/src/notifications/guardian-question-mode.ts +125 -75
  931. package/src/notifications/preference-extractor.ts +85 -53
  932. package/src/notifications/preference-summary.ts +31 -18
  933. package/src/notifications/preferences-store.ts +29 -18
  934. package/src/notifications/runtime-dispatch.ts +22 -12
  935. package/src/notifications/signal.ts +4 -4
  936. package/src/notifications/thread-candidates.ts +59 -23
  937. package/src/notifications/thread-seed-composer.ts +45 -27
  938. package/src/notifications/types.ts +19 -10
  939. package/src/oauth/connect-orchestrator.ts +105 -54
  940. package/src/oauth/connect-types.ts +3 -3
  941. package/src/oauth/provider-profiles.ts +102 -59
  942. package/src/oauth/scope-policy.ts +5 -2
  943. package/src/oauth/token-persistence.ts +58 -24
  944. package/src/outbound-proxy/certs.ts +284 -0
  945. package/src/outbound-proxy/config.ts +94 -0
  946. package/src/outbound-proxy/connect-tunnel.ts +84 -0
  947. package/src/outbound-proxy/health.ts +62 -0
  948. package/src/outbound-proxy/host-pattern-match.ts +67 -0
  949. package/src/outbound-proxy/http-forwarder.ts +162 -0
  950. package/src/outbound-proxy/index.ts +80 -0
  951. package/src/outbound-proxy/logging.ts +193 -0
  952. package/src/outbound-proxy/mitm-handler.ts +292 -0
  953. package/src/outbound-proxy/policy.ts +172 -0
  954. package/src/outbound-proxy/router.ts +64 -0
  955. package/src/outbound-proxy/server.ts +145 -0
  956. package/src/outbound-proxy/types.ts +150 -0
  957. package/src/permissions/checker.ts +481 -189
  958. package/src/permissions/defaults.ts +135 -108
  959. package/src/permissions/prompter.ts +53 -27
  960. package/src/permissions/secret-prompter.ts +21 -15
  961. package/src/permissions/shell-identity.ts +47 -16
  962. package/src/permissions/trust-store.ts +185 -73
  963. package/src/permissions/types.ts +22 -12
  964. package/src/permissions/workspace-policy.ts +47 -38
  965. package/src/playbooks/index.ts +10 -2
  966. package/src/playbooks/playbook-compiler.ts +30 -24
  967. package/src/playbooks/types.ts +11 -8
  968. package/src/providers/anthropic/client.ts +328 -168
  969. package/src/providers/failover.ts +57 -22
  970. package/src/providers/fireworks/client.ts +9 -5
  971. package/src/providers/gemini/client.ts +61 -39
  972. package/src/providers/model-intents.ts +40 -33
  973. package/src/providers/ollama/client.ts +7 -7
  974. package/src/providers/openai/client.ts +109 -68
  975. package/src/providers/openrouter/client.ts +9 -5
  976. package/src/providers/provider-send-message.ts +59 -27
  977. package/src/providers/ratelimit.ts +25 -8
  978. package/src/providers/registry.ts +86 -38
  979. package/src/providers/retry.ts +93 -37
  980. package/src/providers/stream-timeout.ts +5 -3
  981. package/src/providers/types.ts +7 -6
  982. package/src/runtime/AGENTS.md +42 -0
  983. package/src/runtime/access-request-helper.ts +118 -68
  984. package/src/runtime/actor-refresh-token-store.ts +21 -16
  985. package/src/runtime/actor-token-store.ts +25 -18
  986. package/src/runtime/actor-trust-resolver.ts +191 -80
  987. package/src/runtime/approval-conversation-turn.ts +39 -26
  988. package/src/runtime/approval-message-composer.ts +116 -84
  989. package/src/runtime/assistant-event-hub.ts +25 -6
  990. package/src/runtime/assistant-event.ts +4 -4
  991. package/src/runtime/assistant-scope.ts +1 -1
  992. package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
  993. package/src/runtime/auth/context.ts +8 -7
  994. package/src/runtime/auth/credential-service.ts +60 -38
  995. package/src/runtime/auth/external-assistant-id.ts +16 -8
  996. package/src/runtime/auth/index.ts +23 -16
  997. package/src/runtime/auth/require-bound-guardian.ts +44 -0
  998. package/src/runtime/auth/route-policy.ts +166 -104
  999. package/src/runtime/auth/scopes.ts +22 -29
  1000. package/src/runtime/auth/subject.ts +19 -13
  1001. package/src/runtime/auth/token-service.ts +3 -3
  1002. package/src/runtime/auth/types.ts +23 -23
  1003. package/src/runtime/channel-approval-parser.ts +37 -14
  1004. package/src/runtime/channel-approval-types.ts +30 -4
  1005. package/src/runtime/channel-approvals.ts +49 -23
  1006. package/src/runtime/channel-guardian-service.ts +144 -103
  1007. package/src/runtime/channel-invite-transport.ts +5 -3
  1008. package/src/runtime/channel-invite-transports/telegram.ts +16 -10
  1009. package/src/runtime/channel-invite-transports/voice.ts +7 -7
  1010. package/src/runtime/channel-readiness-service.ts +139 -90
  1011. package/src/runtime/channel-readiness-types.ts +4 -2
  1012. package/src/runtime/channel-reply-delivery.ts +83 -14
  1013. package/src/runtime/channel-retry-sweep.ts +111 -62
  1014. package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
  1015. package/src/runtime/gateway-client.ts +122 -55
  1016. package/src/runtime/gateway-internal-client.ts +86 -0
  1017. package/src/runtime/guardian-action-conversation-turn.ts +34 -18
  1018. package/src/runtime/guardian-action-followup-executor.ts +115 -45
  1019. package/src/runtime/guardian-action-grant-minter.ts +40 -24
  1020. package/src/runtime/guardian-action-message-composer.ts +105 -84
  1021. package/src/runtime/guardian-action-service.ts +127 -0
  1022. package/src/runtime/guardian-decision-types.ts +28 -13
  1023. package/src/runtime/guardian-outbound-actions.ts +9 -0
  1024. package/src/runtime/guardian-reply-router.ts +274 -145
  1025. package/src/runtime/guardian-vellum-migration.ts +38 -24
  1026. package/src/runtime/guardian-verification-templates.ts +24 -12
  1027. package/src/runtime/http-router.ts +175 -0
  1028. package/src/runtime/http-server.ts +913 -680
  1029. package/src/runtime/http-types.ts +2 -2
  1030. package/src/runtime/invite-redemption-service.ts +211 -134
  1031. package/src/runtime/invite-redemption-templates.ts +18 -11
  1032. package/src/runtime/{ingress-service.ts → invite-service.ts} +92 -151
  1033. package/src/runtime/local-actor-identity.ts +73 -55
  1034. package/src/runtime/middleware/auth.ts +25 -14
  1035. package/src/runtime/middleware/error-handler.ts +15 -11
  1036. package/src/runtime/middleware/rate-limiter.ts +23 -17
  1037. package/src/runtime/middleware/request-logger.ts +4 -4
  1038. package/src/runtime/middleware/twilio-validation.ts +29 -20
  1039. package/src/runtime/migrations/migration-transport.ts +575 -0
  1040. package/src/runtime/migrations/migration-wizard.ts +715 -0
  1041. package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
  1042. package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
  1043. package/src/runtime/migrations/validation-results-screen.ts +467 -0
  1044. package/src/runtime/migrations/vbundle-builder.ts +295 -0
  1045. package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
  1046. package/src/runtime/migrations/vbundle-importer.ts +339 -0
  1047. package/src/runtime/migrations/vbundle-validator.ts +356 -0
  1048. package/src/runtime/nl-approval-parser.ts +138 -0
  1049. package/src/runtime/pending-interactions.ts +16 -7
  1050. package/src/runtime/routes/access-request-decision.ts +73 -52
  1051. package/src/runtime/routes/app-routes.ts +56 -38
  1052. package/src/runtime/routes/approval-routes.ts +144 -92
  1053. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
  1054. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
  1055. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
  1056. package/src/runtime/routes/attachment-routes.ts +59 -48
  1057. package/src/runtime/routes/brain-graph-routes.ts +85 -69
  1058. package/src/runtime/routes/call-routes.ts +79 -38
  1059. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
  1060. package/src/runtime/routes/channel-delivery-routes.ts +19 -14
  1061. package/src/runtime/routes/channel-guardian-routes.ts +3 -3
  1062. package/src/runtime/routes/channel-inbound-routes.ts +2 -2
  1063. package/src/runtime/routes/channel-readiness-routes.ts +12 -6
  1064. package/src/runtime/routes/channel-route-shared.ts +67 -25
  1065. package/src/runtime/routes/channel-routes.ts +4 -6
  1066. package/src/runtime/routes/contact-routes.ts +374 -17
  1067. package/src/runtime/routes/conversation-attention-routes.ts +57 -28
  1068. package/src/runtime/routes/conversation-routes.ts +321 -174
  1069. package/src/runtime/routes/debug-routes.ts +14 -10
  1070. package/src/runtime/routes/events-routes.ts +90 -57
  1071. package/src/runtime/routes/global-search-routes.ts +266 -0
  1072. package/src/runtime/routes/guardian-action-routes.ts +112 -113
  1073. package/src/runtime/routes/guardian-approval-interception.ts +325 -874
  1074. package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
  1075. package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
  1076. package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
  1077. package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
  1078. package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
  1079. package/src/runtime/routes/identity-routes.ts +71 -42
  1080. package/src/runtime/routes/inbound-conversation.ts +17 -11
  1081. package/src/runtime/routes/inbound-message-handler.ts +305 -1459
  1082. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +880 -0
  1083. package/src/runtime/routes/inbound-stages/background-dispatch.ts +600 -0
  1084. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
  1085. package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
  1086. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
  1087. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
  1088. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
  1089. package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
  1090. package/src/runtime/routes/integration-routes.ts +60 -21
  1091. package/src/runtime/routes/invite-routes.ts +140 -0
  1092. package/src/runtime/routes/migration-routes.ts +434 -0
  1093. package/src/runtime/routes/pairing-routes.ts +157 -79
  1094. package/src/runtime/routes/secret-routes.ts +6 -2
  1095. package/src/runtime/routes/twilio-routes.ts +443 -249
  1096. package/src/runtime/slack-block-formatting.ts +176 -0
  1097. package/src/runtime/tool-grant-request-helper.ts +36 -27
  1098. package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
  1099. package/src/schedule/integration-status.ts +44 -9
  1100. package/src/schedule/recurrence-engine.ts +47 -24
  1101. package/src/schedule/recurrence-types.ts +12 -7
  1102. package/src/schedule/schedule-store.ts +166 -83
  1103. package/src/schedule/scheduler.ts +37 -24
  1104. package/src/security/encrypted-store.ts +68 -38
  1105. package/src/security/keychain.ts +183 -120
  1106. package/src/security/oauth-callback-registry.ts +3 -3
  1107. package/src/security/oauth2.ts +226 -138
  1108. package/src/security/redaction.ts +24 -24
  1109. package/src/security/secret-allowlist.ts +46 -21
  1110. package/src/security/secret-ingress.ts +15 -7
  1111. package/src/security/secret-scanner.ts +193 -104
  1112. package/src/security/secure-keys.ts +9 -3
  1113. package/src/security/token-manager.ts +99 -40
  1114. package/src/security/tool-approval-digest.ts +3 -3
  1115. package/src/sequence/analytics.ts +52 -27
  1116. package/src/sequence/engine.ts +135 -72
  1117. package/src/sequence/guardrails.ts +32 -20
  1118. package/src/sequence/importer.ts +75 -37
  1119. package/src/sequence/reply-matcher.ts +36 -18
  1120. package/src/sequence/store.ts +137 -75
  1121. package/src/sequence/types.ts +30 -16
  1122. package/src/services/published-app-updater.ts +26 -16
  1123. package/src/services/vercel-deploy.ts +19 -15
  1124. package/src/skills/active-skill-tools.ts +3 -3
  1125. package/src/skills/clawhub.ts +178 -90
  1126. package/src/skills/include-graph.ts +24 -17
  1127. package/src/skills/managed-store.ts +89 -42
  1128. package/src/skills/path-classifier.ts +10 -10
  1129. package/src/skills/remote-skill-policy.ts +31 -22
  1130. package/src/skills/slash-commands.ts +36 -30
  1131. package/src/skills/tool-manifest.ts +60 -31
  1132. package/src/skills/version-hash.ts +25 -15
  1133. package/src/slack/slack-webhook.ts +19 -15
  1134. package/src/subagent/index.ts +4 -8
  1135. package/src/subagent/manager.ts +119 -69
  1136. package/src/subagent/types.ts +9 -12
  1137. package/src/swarm/backend-claude-code.ts +124 -45
  1138. package/src/swarm/checkpoint.ts +36 -16
  1139. package/src/swarm/graph-utils.ts +1 -3
  1140. package/src/swarm/index.ts +38 -19
  1141. package/src/swarm/limits.ts +13 -4
  1142. package/src/swarm/orchestrator.ts +108 -57
  1143. package/src/swarm/plan-validator.ts +23 -17
  1144. package/src/swarm/router-planner.ts +51 -22
  1145. package/src/swarm/router-prompts.ts +4 -1
  1146. package/src/swarm/synthesizer.ts +26 -18
  1147. package/src/swarm/types.ts +14 -4
  1148. package/src/swarm/worker-backend.ts +36 -26
  1149. package/src/swarm/worker-prompts.ts +13 -9
  1150. package/src/swarm/worker-runner.ts +40 -34
  1151. package/src/tasks/candidate-store.ts +14 -6
  1152. package/src/tasks/ephemeral-permissions.ts +9 -5
  1153. package/src/tasks/task-compiler.ts +41 -38
  1154. package/src/tasks/task-runner.ts +54 -26
  1155. package/src/tasks/task-scheduler.ts +1 -1
  1156. package/src/tasks/task-store.ts +20 -7
  1157. package/src/tasks/tool-sanitizer.ts +3 -3
  1158. package/src/tools/apps/definitions.ts +23 -15
  1159. package/src/tools/apps/executors.ts +122 -40
  1160. package/src/tools/apps/open-proxy.ts +5 -5
  1161. package/src/tools/apps/registry.ts +2 -2
  1162. package/src/tools/assets/materialize.ts +59 -41
  1163. package/src/tools/assets/search.ts +86 -48
  1164. package/src/tools/browser/api-map.ts +52 -36
  1165. package/src/tools/browser/auth-cache.ts +21 -18
  1166. package/src/tools/browser/auth-detector.ts +43 -28
  1167. package/src/tools/browser/auto-navigate.ts +149 -68
  1168. package/src/tools/browser/browser-execution.ts +9 -3
  1169. package/src/tools/browser/headless-browser.ts +287 -150
  1170. package/src/tools/browser/jit-auth.ts +37 -21
  1171. package/src/tools/browser/network-recorder.ts +138 -56
  1172. package/src/tools/browser/recording-store.ts +22 -15
  1173. package/src/tools/browser/runtime-check.ts +8 -5
  1174. package/src/tools/browser/x-auto-navigate.ts +88 -47
  1175. package/src/tools/calls/call-end.ts +10 -7
  1176. package/src/tools/calls/call-start.ts +30 -20
  1177. package/src/tools/calls/call-status.ts +8 -5
  1178. package/src/tools/claude-code/claude-code.ts +301 -165
  1179. package/src/tools/computer-use/definitions.ts +175 -130
  1180. package/src/tools/computer-use/registry.ts +2 -2
  1181. package/src/tools/computer-use/request-computer-control.ts +21 -13
  1182. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
  1183. package/src/tools/credentials/account-registry.ts +52 -35
  1184. package/src/tools/credentials/broker-types.ts +1 -1
  1185. package/src/tools/credentials/broker.ts +97 -55
  1186. package/src/tools/credentials/domain-policy.ts +5 -2
  1187. package/src/tools/credentials/host-pattern-match.ts +15 -8
  1188. package/src/tools/credentials/metadata-store.ts +93 -43
  1189. package/src/tools/credentials/policy-types.ts +5 -2
  1190. package/src/tools/credentials/policy-validate.ts +21 -14
  1191. package/src/tools/credentials/post-connect-hooks.ts +18 -7
  1192. package/src/tools/credentials/resolve.ts +11 -10
  1193. package/src/tools/credentials/selection.ts +30 -25
  1194. package/src/tools/credentials/tool-policy.ts +5 -2
  1195. package/src/tools/credentials/vault.ts +538 -185
  1196. package/src/tools/document/document-tool.ts +23 -17
  1197. package/src/tools/document/editor-template.ts +12 -7
  1198. package/src/tools/execution-target.ts +13 -10
  1199. package/src/tools/execution-timeout.ts +6 -5
  1200. package/src/tools/executor.ts +141 -74
  1201. package/src/tools/filesystem/edit.ts +82 -45
  1202. package/src/tools/filesystem/fuzzy-match.ts +70 -32
  1203. package/src/tools/filesystem/read.ts +46 -28
  1204. package/src/tools/filesystem/view-image.ts +86 -42
  1205. package/src/tools/filesystem/write.ts +53 -32
  1206. package/src/tools/followups/followup_create.ts +43 -17
  1207. package/src/tools/followups/followup_list.ts +28 -13
  1208. package/src/tools/followups/followup_resolve.ts +9 -6
  1209. package/src/tools/guardian-control-plane-policy.ts +15 -14
  1210. package/src/tools/host-filesystem/edit.ts +77 -42
  1211. package/src/tools/host-filesystem/read.ts +52 -33
  1212. package/src/tools/host-filesystem/write.ts +50 -29
  1213. package/src/tools/host-terminal/host-shell.ts +97 -61
  1214. package/src/tools/mcp/mcp-tool-factory.ts +21 -14
  1215. package/src/tools/memory/definitions.ts +60 -28
  1216. package/src/tools/memory/handlers.ts +149 -77
  1217. package/src/tools/memory/register.ts +39 -16
  1218. package/src/tools/network/__tests__/web-search.test.ts +236 -177
  1219. package/src/tools/network/domain-normalize.ts +13 -9
  1220. package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
  1221. package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
  1222. package/src/tools/network/script-proxy/index.ts +1 -17
  1223. package/src/tools/network/script-proxy/session-manager.ts +178 -86
  1224. package/src/tools/network/url-safety.ts +56 -34
  1225. package/src/tools/network/web-fetch.ts +273 -155
  1226. package/src/tools/network/web-search.ts +166 -81
  1227. package/src/tools/permission-checker.ts +24 -25
  1228. package/src/tools/policy-context.ts +8 -5
  1229. package/src/tools/registry.ts +73 -46
  1230. package/src/tools/reminder/reminder-store.ts +65 -44
  1231. package/src/tools/reminder/reminder.ts +76 -35
  1232. package/src/tools/schedule/create.ts +44 -21
  1233. package/src/tools/schedule/delete.ts +8 -5
  1234. package/src/tools/schedule/list.ts +39 -19
  1235. package/src/tools/schedule/update.ts +49 -26
  1236. package/src/tools/secret-detection-handler.ts +130 -49
  1237. package/src/tools/sensitive-output-placeholders.ts +15 -8
  1238. package/src/tools/shared/filesystem/edit-engine.ts +45 -14
  1239. package/src/tools/shared/filesystem/errors.ts +18 -18
  1240. package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
  1241. package/src/tools/shared/filesystem/format-diff.ts +21 -11
  1242. package/src/tools/shared/filesystem/path-policy.ts +17 -13
  1243. package/src/tools/shared/filesystem/size-guard.ts +8 -4
  1244. package/src/tools/shared/filesystem/types.ts +2 -2
  1245. package/src/tools/shared/shell-output.ts +4 -3
  1246. package/src/tools/side-effects.ts +36 -28
  1247. package/src/tools/skills/delete-managed.ts +30 -17
  1248. package/src/tools/skills/load.ts +88 -46
  1249. package/src/tools/skills/sandbox-runner.ts +62 -46
  1250. package/src/tools/skills/scaffold-managed.ts +98 -48
  1251. package/src/tools/skills/script-contract.ts +5 -2
  1252. package/src/tools/skills/skill-script-runner.ts +29 -13
  1253. package/src/tools/skills/skill-tool-factory.ts +20 -10
  1254. package/src/tools/subagent/abort.ts +10 -4
  1255. package/src/tools/subagent/message.ts +14 -8
  1256. package/src/tools/subagent/read.ts +20 -11
  1257. package/src/tools/subagent/spawn.ts +14 -6
  1258. package/src/tools/subagent/status.ts +7 -4
  1259. package/src/tools/swarm/delegate.ts +75 -49
  1260. package/src/tools/system/avatar-generator.ts +46 -33
  1261. package/src/tools/system/navigate-settings.ts +29 -19
  1262. package/src/tools/system/open-system-settings.ts +30 -20
  1263. package/src/tools/system/request-permission.ts +59 -44
  1264. package/src/tools/system/version.ts +27 -16
  1265. package/src/tools/system/voice-config.ts +116 -53
  1266. package/src/tools/tasks/index.ts +8 -8
  1267. package/src/tools/tasks/task-delete.ts +61 -22
  1268. package/src/tools/tasks/task-list.ts +23 -11
  1269. package/src/tools/tasks/task-run.ts +41 -16
  1270. package/src/tools/tasks/task-save.ts +27 -10
  1271. package/src/tools/tasks/work-item-enqueue.ts +114 -48
  1272. package/src/tools/tasks/work-item-list.ts +20 -10
  1273. package/src/tools/tasks/work-item-remove.ts +49 -15
  1274. package/src/tools/tasks/work-item-run.ts +34 -13
  1275. package/src/tools/tasks/work-item-update.ts +84 -31
  1276. package/src/tools/terminal/backends/native.ts +64 -35
  1277. package/src/tools/terminal/backends/types.ts +6 -2
  1278. package/src/tools/terminal/parser.ts +200 -125
  1279. package/src/tools/terminal/safe-env.ts +27 -21
  1280. package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
  1281. package/src/tools/terminal/sandbox.ts +10 -6
  1282. package/src/tools/terminal/shell.ts +134 -68
  1283. package/src/tools/tool-approval-handler.ts +239 -140
  1284. package/src/tools/types.ts +79 -22
  1285. package/src/tools/ui-surface/definitions.ts +124 -89
  1286. package/src/tools/ui-surface/registry.ts +2 -2
  1287. package/src/tools/watch/screen-watch.ts +50 -32
  1288. package/src/tools/watch/watch-state.ts +41 -15
  1289. package/src/tools/watcher/create.ts +37 -15
  1290. package/src/tools/watcher/delete.ts +9 -6
  1291. package/src/tools/watcher/digest.ts +10 -6
  1292. package/src/tools/watcher/list.ts +37 -14
  1293. package/src/tools/watcher/update.ts +33 -18
  1294. package/src/tools/weather/service.ts +331 -174
  1295. package/src/twitter/client.ts +261 -138
  1296. package/src/twitter/oauth-client.ts +17 -13
  1297. package/src/twitter/router.ts +51 -23
  1298. package/src/twitter/session.ts +27 -18
  1299. package/src/types/qrcode.d.ts +6 -3
  1300. package/src/usage/actors.ts +16 -16
  1301. package/src/usage/types.ts +3 -3
  1302. package/src/util/bundled-asset.ts +10 -6
  1303. package/src/util/canonicalize-identity.ts +11 -4
  1304. package/src/util/clipboard.ts +7 -7
  1305. package/src/util/content-id.ts +3 -3
  1306. package/src/util/debounce.ts +3 -2
  1307. package/src/util/diff.ts +55 -33
  1308. package/src/util/errors.ts +31 -27
  1309. package/src/util/fs.ts +8 -2
  1310. package/src/util/log-redact.ts +12 -12
  1311. package/src/util/logger.ts +112 -51
  1312. package/src/util/network-info.ts +13 -5
  1313. package/src/util/object.ts +4 -2
  1314. package/src/util/phone.ts +4 -4
  1315. package/src/util/platform.ts +80 -58
  1316. package/src/util/pricing.ts +49 -31
  1317. package/src/util/retry.ts +39 -7
  1318. package/src/util/row-mapper.ts +7 -4
  1319. package/src/util/silently.ts +7 -4
  1320. package/src/util/spawn.ts +48 -0
  1321. package/src/util/spinner.ts +9 -7
  1322. package/src/util/time.ts +16 -3
  1323. package/src/util/truncate.ts +1 -1
  1324. package/src/util/voice-code.ts +6 -4
  1325. package/src/util/xml.ts +5 -1
  1326. package/src/version.ts +12 -8
  1327. package/src/watcher/engine.ts +71 -44
  1328. package/src/watcher/provider-registry.ts +1 -1
  1329. package/src/watcher/providers/github.ts +40 -23
  1330. package/src/watcher/providers/gmail.ts +59 -38
  1331. package/src/watcher/providers/google-calendar.ts +62 -48
  1332. package/src/watcher/providers/linear.ts +219 -150
  1333. package/src/watcher/providers/slack.ts +125 -29
  1334. package/src/watcher/watcher-store.ts +75 -55
  1335. package/src/work-items/work-item-runner.ts +62 -29
  1336. package/src/work-items/work-item-store.ts +137 -47
  1337. package/src/workspace/commit-message-enrichment-service.ts +65 -25
  1338. package/src/workspace/commit-message-provider.ts +14 -12
  1339. package/src/workspace/git-service.ts +355 -239
  1340. package/src/workspace/heartbeat-service.ts +74 -37
  1341. package/src/workspace/provider-commit-message-generator.ts +95 -70
  1342. package/src/workspace/top-level-renderer.ts +10 -8
  1343. package/src/workspace/top-level-scanner.ts +9 -3
  1344. package/src/workspace/turn-commit.ts +63 -36
  1345. package/src/__tests__/ingress-member-store.test.ts +0 -294
  1346. package/src/__tests__/script-proxy-router.test.ts +0 -215
  1347. package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
  1348. package/src/memory/guardian-bindings.ts +0 -158
  1349. package/src/memory/ingress-member-store.ts +0 -352
  1350. package/src/runtime/routes/ingress-routes.ts +0 -229
  1351. package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
  1352. package/src/tools/network/script-proxy/certs.ts +0 -7
  1353. package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
  1354. package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
  1355. package/src/tools/network/script-proxy/logging.ts +0 -12
  1356. package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
  1357. package/src/tools/network/script-proxy/policy.ts +0 -4
  1358. package/src/tools/network/script-proxy/router.ts +0 -2
  1359. package/src/tools/network/script-proxy/server.ts +0 -5
  1360. package/src/tools/network/script-proxy/types.ts +0 -19
package/src/cli.ts CHANGED
@@ -1,25 +1,38 @@
1
- import { appendFileSync, mkdirSync,readFileSync } from 'node:fs';
2
- import * as net from 'node:net';
3
- import { dirname } from 'node:path';
4
- import * as readline from 'node:readline';
5
-
6
- import { type MainScreenLayout,renderMainScreen, updateDaemonText, updateStatusText } from './cli/main-screen.jsx';
7
- import { hasNoAuthOverride } from './daemon/connection-policy.js';
8
- import { shouldAutoStartDaemon } from './daemon/connection-policy.js';
1
+ import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
2
+ import * as net from "node:net";
3
+ import { dirname } from "node:path";
4
+ import * as readline from "node:readline";
5
+
6
+ import {
7
+ type MainScreenLayout,
8
+ renderMainScreen,
9
+ updateDaemonText,
10
+ updateStatusText,
11
+ } from "./cli/main-screen.jsx";
12
+ import { hasNoAuthOverride } from "./daemon/connection-policy.js";
13
+ import { shouldAutoStartDaemon } from "./daemon/connection-policy.js";
9
14
  import {
10
15
  type ClientMessage,
11
16
  type ConfirmationRequest,
12
17
  createMessageParser,
13
18
  serialize,
14
19
  type ServerMessage,
15
- } from './daemon/ipc-protocol.js';
16
- import { ensureDaemonRunning } from './daemon/lifecycle.js';
17
- import { copyToClipboard, extractLastCodeBlock, formatSessionForExport } from './util/clipboard.js';
18
- import { formatDiff, formatNewFileDiff } from './util/diff.js';
19
- import { getHistoryPath, getSocketPath, readSessionToken } from './util/platform.js';
20
- import { Spinner } from './util/spinner.js';
21
- import { timeAgo } from './util/time.js';
22
- import { truncate } from './util/truncate.js';
20
+ } from "./daemon/ipc-protocol.js";
21
+ import { ensureDaemonRunning } from "./daemon/lifecycle.js";
22
+ import {
23
+ copyToClipboard,
24
+ extractLastCodeBlock,
25
+ formatSessionForExport,
26
+ } from "./util/clipboard.js";
27
+ import { formatDiff, formatNewFileDiff } from "./util/diff.js";
28
+ import {
29
+ getHistoryPath,
30
+ getSocketPath,
31
+ readSessionToken,
32
+ } from "./util/platform.js";
33
+ import { Spinner } from "./util/spinner.js";
34
+ import { timeAgo } from "./util/time.js";
35
+ import { truncate } from "./util/truncate.js";
23
36
 
24
37
  const HEARTBEAT_INTERVAL_MS = 30_000;
25
38
  const HEARTBEAT_TIMEOUT_MS = 10_000;
@@ -27,26 +40,27 @@ const RECONNECT_BASE_DELAY_MS = 1_000;
27
40
  const RECONNECT_MAX_DELAY_MS = 30_000;
28
41
 
29
42
  export function sanitizeUrlForDisplay(rawUrl: unknown): string {
30
- const value = typeof rawUrl === 'string' ? rawUrl : String(rawUrl ?? '');
31
- if (!value) return '';
43
+ const value = typeof rawUrl === "string" ? rawUrl : String(rawUrl ?? "");
44
+ if (!value) return "";
32
45
 
33
46
  try {
34
47
  const parsed = new URL(value);
35
48
  if (!parsed.username && !parsed.password) {
36
49
  return value;
37
50
  }
38
- parsed.username = '';
39
- parsed.password = '';
51
+ parsed.username = "";
52
+ parsed.password = "";
40
53
  return parsed.href;
41
54
  } catch {
42
- return value.replace(/\/\/([^/?#\s@]+)@/g, '//[REDACTED]@');
55
+ return value.replace(/\/\/([^/?#\s@]+)@/g, "//[REDACTED]@");
43
56
  }
44
57
  }
45
58
 
46
59
  function stringifyConfirmationInputValue(value: unknown): string {
47
- if (typeof value === 'string') return value;
48
- if (typeof value === 'number' || typeof value === 'boolean') return String(value);
49
- if (value == null) return 'null';
60
+ if (typeof value === "string") return value;
61
+ if (typeof value === "number" || typeof value === "boolean")
62
+ return String(value);
63
+ if (value == null) return "null";
50
64
  try {
51
65
  return JSON.stringify(value);
52
66
  } catch {
@@ -54,15 +68,18 @@ function stringifyConfirmationInputValue(value: unknown): string {
54
68
  }
55
69
  }
56
70
 
57
- export function formatConfirmationInputLines(input: Record<string, unknown>): string[] {
71
+ export function formatConfirmationInputLines(
72
+ input: Record<string, unknown>,
73
+ ): string[] {
58
74
  const lines: string[] = [];
59
75
  for (const key of Object.keys(input).sort()) {
60
76
  const rawValue = input[key];
61
- const value = key.toLowerCase().includes('url') && typeof rawValue === 'string'
62
- ? sanitizeUrlForDisplay(rawValue)
63
- : rawValue;
77
+ const value =
78
+ key.toLowerCase().includes("url") && typeof rawValue === "string"
79
+ ? sanitizeUrlForDisplay(rawValue)
80
+ : rawValue;
64
81
  const rendered = stringifyConfirmationInputValue(value);
65
- const renderedLines = rendered.split('\n');
82
+ const renderedLines = rendered.split("\n");
66
83
  if (renderedLines.length === 0) {
67
84
  lines.push(`${key}:`);
68
85
  continue;
@@ -75,50 +92,60 @@ export function formatConfirmationInputLines(input: Record<string, unknown>): st
75
92
  return lines;
76
93
  }
77
94
 
78
- export function formatConfirmationCommandPreview(req: Pick<ConfirmationRequest, 'toolName' | 'input'>): string {
79
- if (req.toolName === 'bash' || req.toolName === 'host_bash') {
80
- return String(req.input.command ?? '');
95
+ export function formatConfirmationCommandPreview(
96
+ req: Pick<ConfirmationRequest, "toolName" | "input">,
97
+ ): string {
98
+ if (req.toolName === "bash" || req.toolName === "host_bash") {
99
+ return String(req.input.command ?? "");
81
100
  }
82
- if (req.toolName === 'file_read' || req.toolName === 'host_file_read') {
83
- return `read ${req.input.path ?? ''}`;
101
+ if (req.toolName === "file_read" || req.toolName === "host_file_read") {
102
+ return `read ${req.input.path ?? ""}`;
84
103
  }
85
- if (req.toolName === 'file_write' || req.toolName === 'host_file_write') {
86
- return `write ${req.input.path ?? ''}`;
104
+ if (req.toolName === "file_write" || req.toolName === "host_file_write") {
105
+ return `write ${req.input.path ?? ""}`;
87
106
  }
88
- if (req.toolName === 'file_edit' || req.toolName === 'host_file_edit') {
89
- return `edit ${req.input.path ?? ''}`;
107
+ if (req.toolName === "file_edit" || req.toolName === "host_file_edit") {
108
+ return `edit ${req.input.path ?? ""}`;
90
109
  }
91
- if (req.toolName === 'web_fetch') {
92
- return `fetch ${sanitizeUrlForDisplay(req.input.url ?? '')}`;
110
+ if (req.toolName === "web_fetch") {
111
+ return `fetch ${sanitizeUrlForDisplay(req.input.url ?? "")}`;
93
112
  }
94
- if (req.toolName === 'browser_navigate') {
95
- return `navigate ${sanitizeUrlForDisplay(req.input.url ?? '')}`;
113
+ if (req.toolName === "browser_navigate") {
114
+ return `navigate ${sanitizeUrlForDisplay(req.input.url ?? "")}`;
96
115
  }
97
- if (req.toolName === 'browser_close') {
98
- return req.input.close_all_pages ? 'close all browser pages' : 'close browser page';
116
+ if (req.toolName === "browser_close") {
117
+ return req.input.close_all_pages
118
+ ? "close all browser pages"
119
+ : "close browser page";
99
120
  }
100
- if (req.toolName === 'browser_click') {
101
- return `click ${req.input.element_id ?? req.input.selector ?? ''}`;
121
+ if (req.toolName === "browser_click") {
122
+ return `click ${req.input.element_id ?? req.input.selector ?? ""}`;
102
123
  }
103
- if (req.toolName === 'browser_type') {
104
- return `type into ${req.input.element_id ?? req.input.selector ?? ''}`;
124
+ if (req.toolName === "browser_type") {
125
+ return `type into ${req.input.element_id ?? req.input.selector ?? ""}`;
105
126
  }
106
- if (req.toolName === 'browser_press_key') {
107
- return `press "${req.input.key ?? ''}"`;
127
+ if (req.toolName === "browser_press_key") {
128
+ return `press "${req.input.key ?? ""}"`;
108
129
  }
109
130
  return req.toolName;
110
131
  }
111
132
 
112
-
113
133
  export async function startCli(): Promise<void> {
114
134
  const socketPath = getSocketPath();
115
135
  let socket: net.Socket;
116
136
  let parser = createMessageParser();
117
- let sessionId = '';
137
+ let sessionId = "";
118
138
  let pendingUserContent: string | null = null;
119
139
  let generating = false;
120
- let lastResponse = '';
121
- let lastUsage: { inputTokens: number; outputTokens: number; totalInputTokens: number; totalOutputTokens: number; estimatedCost: number; model: string } | null = null;
140
+ let lastResponse = "";
141
+ let lastUsage: {
142
+ inputTokens: number;
143
+ outputTokens: number;
144
+ totalInputTokens: number;
145
+ totalOutputTokens: number;
146
+ estimatedCost: number;
147
+ model: string;
148
+ } | null = null;
122
149
  let pendingSessionPick = false;
123
150
  let pendingConfirmation = false;
124
151
  let pendingCopySession = false;
@@ -129,43 +156,48 @@ export async function startCli(): Promise<void> {
129
156
  let heartbeatTimeout: ReturnType<typeof setTimeout> | null = null;
130
157
  const spinner = new Spinner();
131
158
 
132
- process.stdout.write('\x1b[2J\x1b[H');
159
+ process.stdout.write("\x1b[2J\x1b[H");
133
160
  let mainScreenLayout: MainScreenLayout = renderMainScreen();
134
161
  let canvasHeight = mainScreenLayout.height;
135
162
  const terminalRows = process.stdout.rows || 24;
136
163
  process.stdout.write(`\x1b[${canvasHeight + 1};${terminalRows}r`);
137
164
  process.stdout.write(`\x1b[${canvasHeight + 1};1H`);
138
165
 
139
- function formatToolProgress(toolName: string, input: Record<string, unknown>): string {
166
+ function formatToolProgress(
167
+ toolName: string,
168
+ input: Record<string, unknown>,
169
+ ): string {
140
170
  switch (toolName) {
141
- case 'bash':
142
- return `Running \`${String(input.command ?? '').slice(0, 60)}\`...`;
143
- case 'file_read':
144
- return `Reading ${input.path ?? ''}...`;
145
- case 'file_write':
146
- return `Writing ${input.path ?? ''}...`;
147
- case 'file_edit':
148
- return `Editing ${input.path ?? ''}...`;
149
- case 'web_fetch':
171
+ case "bash":
172
+ return `Running \`${String(input.command ?? "").slice(0, 60)}\`...`;
173
+ case "file_read":
174
+ return `Reading ${input.path ?? ""}...`;
175
+ case "file_write":
176
+ return `Writing ${input.path ?? ""}...`;
177
+ case "file_edit":
178
+ return `Editing ${input.path ?? ""}...`;
179
+ case "web_fetch":
150
180
  return `Fetching ${sanitizeUrlForDisplay(input.url).slice(0, 80)}...`;
151
- case 'browser_navigate':
181
+ case "browser_navigate":
152
182
  return `Navigating to ${sanitizeUrlForDisplay(input.url).slice(0, 80)}...`;
153
- case 'browser_snapshot':
154
- return 'Taking page snapshot...';
155
- case 'browser_close':
156
- return 'Closing browser...';
157
- case 'browser_click':
158
- return `Clicking ${String(input.element_id ?? input.selector ?? '').slice(0, 60)}...`;
159
- case 'browser_type':
160
- return `Typing into ${String(input.element_id ?? input.selector ?? '').slice(0, 60)}...`;
161
- case 'browser_press_key':
162
- return `Pressing "${String(input.key ?? '')}"...`;
163
- case 'browser_wait_for':
164
- if (input.selector) return `Waiting for ${String(input.selector).slice(0, 60)}...`;
165
- if (input.text) return `Waiting for text "${String(input.text).slice(0, 40)}"...`;
183
+ case "browser_snapshot":
184
+ return "Taking page snapshot...";
185
+ case "browser_close":
186
+ return "Closing browser...";
187
+ case "browser_click":
188
+ return `Clicking ${String(input.element_id ?? input.selector ?? "").slice(0, 60)}...`;
189
+ case "browser_type":
190
+ return `Typing into ${String(input.element_id ?? input.selector ?? "").slice(0, 60)}...`;
191
+ case "browser_press_key":
192
+ return `Pressing "${String(input.key ?? "")}"...`;
193
+ case "browser_wait_for":
194
+ if (input.selector)
195
+ return `Waiting for ${String(input.selector).slice(0, 60)}...`;
196
+ if (input.text)
197
+ return `Waiting for text "${String(input.text).slice(0, 40)}"...`;
166
198
  return `Waiting ${input.duration ?? 0}ms...`;
167
- case 'browser_extract':
168
- return 'Extracting page content...';
199
+ case "browser_extract":
200
+ return "Extracting page content...";
169
201
  default:
170
202
  return `Running ${toolName}...`;
171
203
  }
@@ -175,8 +207,8 @@ export async function startCli(): Promise<void> {
175
207
  const MAX_HISTORY = 1000;
176
208
  let savedHistory: string[] = [];
177
209
  try {
178
- savedHistory = readFileSync(historyPath, 'utf-8')
179
- .split('\n')
210
+ savedHistory = readFileSync(historyPath, "utf-8")
211
+ .split("\n")
180
212
  .filter(Boolean)
181
213
  .slice(-MAX_HISTORY)
182
214
  .reverse();
@@ -192,7 +224,7 @@ export async function startCli(): Promise<void> {
192
224
  });
193
225
 
194
226
  function prompt(): void {
195
- rl.setPrompt('you> ');
227
+ rl.setPrompt("you> ");
196
228
  rl.prompt();
197
229
  }
198
230
 
@@ -207,9 +239,11 @@ export async function startCli(): Promise<void> {
207
239
  function renderConfirmationPrompt(req: ConfirmationRequest): void {
208
240
  const preview = formatConfirmationCommandPreview(req);
209
241
  const inputLines = formatConfirmationInputLines(req.input);
210
- process.stdout.write('\n');
242
+ process.stdout.write("\n");
211
243
  process.stdout.write(`\u250C ${req.toolName}: ${preview}\n`);
212
- process.stdout.write(`\u2502 Risk: ${req.riskLevel}${req.sandboxed ? ' [sandboxed]' : ''}\n`);
244
+ process.stdout.write(
245
+ `\u2502 Risk: ${req.riskLevel}${req.sandboxed ? " [sandboxed]" : ""}\n`,
246
+ );
213
247
  if (req.executionTarget) {
214
248
  process.stdout.write(`\u2502 Target: ${req.executionTarget}\n`);
215
249
  }
@@ -222,20 +256,24 @@ export async function startCli(): Promise<void> {
222
256
  if (req.diff) {
223
257
  const diffOutput = req.diff.isNewFile
224
258
  ? formatNewFileDiff(req.diff.newContent, req.diff.filePath, null)
225
- : formatDiff(req.diff.oldContent, req.diff.newContent, req.diff.filePath);
259
+ : formatDiff(
260
+ req.diff.oldContent,
261
+ req.diff.newContent,
262
+ req.diff.filePath,
263
+ );
226
264
  if (diffOutput) {
227
265
  process.stdout.write(`\u2502\n`);
228
- for (const line of diffOutput.split('\n')) {
266
+ for (const line of diffOutput.split("\n")) {
229
267
  if (line) process.stdout.write(`\u2502 ${line}\n`);
230
268
  }
231
269
  }
232
270
  }
233
271
  process.stdout.write(`\u2502\n`);
234
272
  process.stdout.write(`\u2502 [a] Allow once\n`);
235
- if (req.temporaryOptionsAvailable?.includes('allow_10m')) {
273
+ if (req.temporaryOptionsAvailable?.includes("allow_10m")) {
236
274
  process.stdout.write(`\u2502 [t] Allow 10m\n`);
237
275
  }
238
- if (req.temporaryOptionsAvailable?.includes('allow_thread')) {
276
+ if (req.temporaryOptionsAvailable?.includes("allow_thread")) {
239
277
  process.stdout.write(`\u2502 [T] Allow Thread\n`);
240
278
  }
241
279
  process.stdout.write(`\u2502 [d] Deny once\n`);
@@ -247,91 +285,120 @@ export async function startCli(): Promise<void> {
247
285
  process.stdout.write(`\u2514 > `);
248
286
 
249
287
  pendingConfirmation = true;
250
- rl.once('line', (answer) => {
288
+ rl.once("line", (answer) => {
251
289
  const trimmed = answer.trim();
252
290
  const choice = trimmed.toLowerCase();
253
291
 
254
292
  // Uppercase 'A' → allowlist pattern selection (check before lowercase 'a')
255
293
  // Only process when scope options exist, matching the display guard above
256
- if ((trimmed === 'A' || choice === 'allowlist') && req.allowlistOptions.length > 0 && req.scopeOptions.length > 0) {
294
+ if (
295
+ (trimmed === "A" || choice === "allowlist") &&
296
+ req.allowlistOptions.length > 0 &&
297
+ req.scopeOptions.length > 0
298
+ ) {
257
299
  // pendingConfirmation stays true through sub-prompts
258
- renderPatternSelection(req, 'always_allow');
300
+ renderPatternSelection(req, "always_allow");
259
301
  return;
260
302
  }
261
303
 
262
304
  // Uppercase 'H' → high-risk allowlist pattern selection
263
- if (trimmed === 'H' && req.allowlistOptions.length > 0 && req.scopeOptions.length > 0) {
305
+ if (
306
+ trimmed === "H" &&
307
+ req.allowlistOptions.length > 0 &&
308
+ req.scopeOptions.length > 0
309
+ ) {
264
310
  // pendingConfirmation stays true through sub-prompts
265
- renderPatternSelection(req, 'always_allow_high_risk');
311
+ renderPatternSelection(req, "always_allow_high_risk");
266
312
  return;
267
313
  }
268
314
 
269
315
  // Uppercase 'D' → denylist pattern selection (check before lowercase 'd')
270
- if ((trimmed === 'D' || choice === 'denylist') && req.allowlistOptions.length > 0 && req.scopeOptions.length > 0) {
316
+ if (
317
+ (trimmed === "D" || choice === "denylist") &&
318
+ req.allowlistOptions.length > 0 &&
319
+ req.scopeOptions.length > 0
320
+ ) {
271
321
  // pendingConfirmation stays true through sub-prompts
272
- renderPatternSelection(req, 'always_deny');
322
+ renderPatternSelection(req, "always_deny");
273
323
  return;
274
324
  }
275
325
 
276
326
  pendingConfirmation = false;
277
- if (choice === 'a') {
327
+ if (choice === "a") {
278
328
  send({
279
- type: 'confirmation_response',
329
+ type: "confirmation_response",
280
330
  requestId: req.requestId,
281
- decision: 'allow',
331
+ decision: "allow",
282
332
  });
283
333
  return;
284
334
  }
285
335
 
286
- if (choice === 't' && trimmed === 't' && req.temporaryOptionsAvailable?.includes('allow_10m')) {
336
+ if (
337
+ choice === "t" &&
338
+ trimmed === "t" &&
339
+ req.temporaryOptionsAvailable?.includes("allow_10m")
340
+ ) {
287
341
  send({
288
- type: 'confirmation_response',
342
+ type: "confirmation_response",
289
343
  requestId: req.requestId,
290
- decision: 'allow_10m',
344
+ decision: "allow_10m",
291
345
  });
292
346
  return;
293
347
  }
294
348
 
295
- if (trimmed === 'T' && req.temporaryOptionsAvailable?.includes('allow_thread')) {
349
+ if (
350
+ trimmed === "T" &&
351
+ req.temporaryOptionsAvailable?.includes("allow_thread")
352
+ ) {
296
353
  send({
297
- type: 'confirmation_response',
354
+ type: "confirmation_response",
298
355
  requestId: req.requestId,
299
- decision: 'allow_thread',
356
+ decision: "allow_thread",
300
357
  });
301
358
  return;
302
359
  }
303
360
 
304
- if (choice === 'd') {
361
+ if (choice === "d") {
305
362
  send({
306
- type: 'confirmation_response',
363
+ type: "confirmation_response",
307
364
  requestId: req.requestId,
308
- decision: 'deny',
365
+ decision: "deny",
309
366
  });
310
367
  return;
311
368
  }
312
369
 
313
370
  // Default to deny for unrecognized input
314
371
  send({
315
- type: 'confirmation_response',
372
+ type: "confirmation_response",
316
373
  requestId: req.requestId,
317
- decision: 'deny',
374
+ decision: "deny",
318
375
  });
319
376
  });
320
377
  }
321
378
 
322
- function renderPatternSelection(req: ConfirmationRequest, decision: 'always_allow' | 'always_allow_high_risk' | 'always_deny'): void {
323
- const label = decision === 'always_deny' ? 'Denylist' : decision === 'always_allow_high_risk' ? 'Allowlist (high-risk)' : 'Allowlist';
324
- process.stdout.write('\n');
379
+ function renderPatternSelection(
380
+ req: ConfirmationRequest,
381
+ decision: "always_allow" | "always_allow_high_risk" | "always_deny",
382
+ ): void {
383
+ const label =
384
+ decision === "always_deny"
385
+ ? "Denylist"
386
+ : decision === "always_allow_high_risk"
387
+ ? "Allowlist (high-risk)"
388
+ : "Allowlist";
389
+ process.stdout.write("\n");
325
390
  process.stdout.write(`\u250C ${label}: choose command pattern\n`);
326
391
  for (let i = 0; i < req.allowlistOptions.length; i++) {
327
- process.stdout.write(`\u2502 [${i + 1}] ${req.allowlistOptions[i].label}\n`);
392
+ process.stdout.write(
393
+ `\u2502 [${i + 1}] ${req.allowlistOptions[i].label}\n`,
394
+ );
328
395
  }
329
396
  process.stdout.write(`\u2514 > `);
330
397
 
331
- rl.once('line', (answer) => {
398
+ rl.once("line", (answer) => {
332
399
  const parsed = parseInt(answer.trim(), 10);
333
400
  if (Number.isNaN(parsed)) {
334
- process.stdout.write(' Invalid input — enter a number.\n');
401
+ process.stdout.write(" Invalid input — enter a number.\n");
335
402
  renderPatternSelection(req, decision);
336
403
  return;
337
404
  }
@@ -344,27 +411,36 @@ export async function startCli(): Promise<void> {
344
411
  // Invalid selection → deny
345
412
  pendingConfirmation = false;
346
413
  send({
347
- type: 'confirmation_response',
414
+ type: "confirmation_response",
348
415
  requestId: req.requestId,
349
- decision: 'deny',
416
+ decision: "deny",
350
417
  });
351
418
  }
352
419
  });
353
420
  }
354
421
 
355
- function renderScopeSelection(req: ConfirmationRequest, selectedPattern: string, decision: 'always_allow' | 'always_allow_high_risk' | 'always_deny'): void {
356
- const label = decision === 'always_deny' ? 'Denylist' : decision === 'always_allow_high_risk' ? 'Allowlist (high-risk)' : 'Allowlist';
357
- process.stdout.write('\n');
422
+ function renderScopeSelection(
423
+ req: ConfirmationRequest,
424
+ selectedPattern: string,
425
+ decision: "always_allow" | "always_allow_high_risk" | "always_deny",
426
+ ): void {
427
+ const label =
428
+ decision === "always_deny"
429
+ ? "Denylist"
430
+ : decision === "always_allow_high_risk"
431
+ ? "Allowlist (high-risk)"
432
+ : "Allowlist";
433
+ process.stdout.write("\n");
358
434
  process.stdout.write(`\u250C ${label}: choose scope\n`);
359
435
  for (let i = 0; i < req.scopeOptions.length; i++) {
360
436
  process.stdout.write(`\u2502 [${i + 1}] ${req.scopeOptions[i].label}\n`);
361
437
  }
362
438
  process.stdout.write(`\u2514 > `);
363
439
 
364
- rl.once('line', (answer) => {
440
+ rl.once("line", (answer) => {
365
441
  const parsed = parseInt(answer.trim(), 10);
366
442
  if (Number.isNaN(parsed)) {
367
- process.stdout.write(' Invalid input — enter a number.\n');
443
+ process.stdout.write(" Invalid input — enter a number.\n");
368
444
  renderScopeSelection(req, selectedPattern, decision);
369
445
  return;
370
446
  }
@@ -372,7 +448,7 @@ export async function startCli(): Promise<void> {
372
448
  const idx = parsed - 1;
373
449
  if (idx >= 0 && idx < req.scopeOptions.length) {
374
450
  send({
375
- type: 'confirmation_response',
451
+ type: "confirmation_response",
376
452
  requestId: req.requestId,
377
453
  decision,
378
454
  selectedPattern,
@@ -381,30 +457,32 @@ export async function startCli(): Promise<void> {
381
457
  } else {
382
458
  // Invalid selection → deny
383
459
  send({
384
- type: 'confirmation_response',
460
+ type: "confirmation_response",
385
461
  requestId: req.requestId,
386
- decision: 'deny',
462
+ decision: "deny",
387
463
  });
388
464
  }
389
465
  });
390
466
  }
391
467
 
392
- function renderSessionPicker(sessions: Array<{ id: string; title: string; updatedAt: number }>): void {
393
- process.stdout.write('\n Recent sessions:\n');
468
+ function renderSessionPicker(
469
+ sessions: Array<{ id: string; title: string; updatedAt: number }>,
470
+ ): void {
471
+ process.stdout.write("\n Recent sessions:\n");
394
472
  for (let i = 0; i < sessions.length; i++) {
395
473
  const s = sessions[i];
396
474
  const ago = timeAgo(s.updatedAt);
397
475
  const title = truncate(s.title, 50);
398
- const padding = ' '.repeat(Math.max(1, 55 - title.length));
476
+ const padding = " ".repeat(Math.max(1, 55 - title.length));
399
477
  process.stdout.write(` [${i + 1}] ${title}${padding}${ago}\n`);
400
478
  }
401
- process.stdout.write(' [n] New session\n\n');
402
- process.stdout.write(' Pick a session> ');
479
+ process.stdout.write(" [n] New session\n\n");
480
+ process.stdout.write(" Pick a session> ");
403
481
 
404
- rl.once('line', (answer) => {
482
+ rl.once("line", (answer) => {
405
483
  const trimmed = answer.trim().toLowerCase();
406
- if (trimmed === 'n') {
407
- send({ type: 'session_create' });
484
+ if (trimmed === "n") {
485
+ send({ type: "session_create" });
408
486
  return;
409
487
  }
410
488
  const parsed = parseInt(trimmed, 10);
@@ -423,10 +501,10 @@ export async function startCli(): Promise<void> {
423
501
  );
424
502
  prompt();
425
503
  } else {
426
- send({ type: 'session_switch', sessionId: sessions[idx].id });
504
+ send({ type: "session_switch", sessionId: sessions[idx].id });
427
505
  }
428
506
  } else {
429
- process.stdout.write(' Invalid selection.\n');
507
+ process.stdout.write(" Invalid selection.\n");
430
508
  renderSessionPicker(sessions);
431
509
  }
432
510
  });
@@ -434,7 +512,7 @@ export async function startCli(): Promise<void> {
434
512
 
435
513
  function handleMessage(msg: ServerMessage): void {
436
514
  switch (msg.type) {
437
- case 'session_info':
515
+ case "session_info":
438
516
  pendingSessionPick = false;
439
517
  sessionId = msg.sessionId;
440
518
  process.stdout.write(
@@ -443,12 +521,20 @@ export async function startCli(): Promise<void> {
443
521
  if (pendingUserContent) {
444
522
  const content = pendingUserContent;
445
523
  pendingUserContent = null;
446
- lastResponse = '';
447
- if (send({ type: 'user_message', sessionId, content, channel: 'vellum', interface: 'cli' })) {
524
+ lastResponse = "";
525
+ if (
526
+ send({
527
+ type: "user_message",
528
+ sessionId,
529
+ content,
530
+ channel: "vellum",
531
+ interface: "cli",
532
+ })
533
+ ) {
448
534
  generating = true;
449
- spinner.start('Thinking...');
535
+ spinner.start("Thinking...");
450
536
  } else {
451
- process.stdout.write('[Not connected — message not sent]\n');
537
+ process.stdout.write("[Not connected — message not sent]\n");
452
538
  prompt();
453
539
  }
454
540
  } else {
@@ -456,80 +542,84 @@ export async function startCli(): Promise<void> {
456
542
  }
457
543
  break;
458
544
 
459
- case 'assistant_text_delta':
545
+ case "assistant_text_delta":
460
546
  spinner.stop();
461
547
  lastResponse += msg.text;
462
548
  process.stdout.write(msg.text);
463
549
  break;
464
550
 
465
- case 'assistant_thinking_delta':
551
+ case "assistant_thinking_delta":
466
552
  spinner.stop();
467
553
  process.stdout.write(`\x1B[2m${msg.thinking}\x1B[0m`);
468
554
  break;
469
555
 
470
- case 'usage_update':
556
+ case "usage_update":
471
557
  lastUsage = msg;
472
558
  break;
473
559
 
474
- case 'context_compacted': {
560
+ case "context_compacted": {
475
561
  spinner.stop();
476
- const summaryOverhead = msg.summaryCalls > 0
477
- ? ` | summary: ${msg.summaryCalls} call${msg.summaryCalls === 1 ? '' : 's'}`
478
- : '';
562
+ const summaryOverhead =
563
+ msg.summaryCalls > 0
564
+ ? ` | summary: ${msg.summaryCalls} call${msg.summaryCalls === 1 ? "" : "s"}`
565
+ : "";
479
566
  process.stdout.write(
480
567
  `\n\x1B[2m[Context compacted: ${msg.previousEstimatedInputTokens.toLocaleString()} -> ${msg.estimatedInputTokens.toLocaleString()} est input tokens, ${msg.compactedMessages} messages${summaryOverhead}]\x1B[0m\n`,
481
568
  );
482
- spinner.start('Thinking...');
569
+ spinner.start("Thinking...");
483
570
  break;
484
571
  }
485
572
 
486
- case 'memory_status':
573
+ case "memory_status":
487
574
  if (msg.degraded) {
488
575
  spinner.stop();
489
- process.stdout.write(`\n\x1B[2m[Memory degraded: ${msg.reason ?? 'unknown'}]\x1B[0m\n`);
490
- spinner.start('Thinking...');
576
+ process.stdout.write(
577
+ `\n\x1B[2m[Memory degraded: ${msg.reason ?? "unknown"}]\x1B[0m\n`,
578
+ );
579
+ spinner.start("Thinking...");
491
580
  }
492
581
  break;
493
582
 
494
- case 'memory_recalled':
583
+ case "memory_recalled":
495
584
  spinner.stop();
496
585
  process.stdout.write(
497
- `\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens | lexical ${msg.lexicalHits} | semantic ${msg.semanticHits} | recency ${msg.recencyHits} | entity ${msg.entityHits} | merged ${msg.mergedCount} → selected ${msg.selectedCount}${msg.rerankApplied ? ' (reranked)' : ''} | ${msg.provider}/${msg.model} | ${msg.latencyMs}ms]\x1B[0m\n`,
586
+ `\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens | lexical ${msg.lexicalHits} | semantic ${msg.semanticHits} | recency ${msg.recencyHits} | entity ${msg.entityHits} | merged ${msg.mergedCount} → selected ${msg.selectedCount}${msg.rerankApplied ? " (reranked)" : ""} | ${msg.provider}/${msg.model} | ${msg.latencyMs}ms]\x1B[0m\n`,
498
587
  );
499
- spinner.start('Thinking...');
588
+ spinner.start("Thinking...");
500
589
  break;
501
590
 
502
- case 'message_complete': {
591
+ case "message_complete": {
503
592
  spinner.stop();
504
593
  generating = false;
505
594
  if (lastUsage) {
506
- const cost = lastUsage.estimatedCost > 0
507
- ? ` ~$${lastUsage.estimatedCost.toFixed(4)}`
508
- : '';
595
+ const cost =
596
+ lastUsage.estimatedCost > 0
597
+ ? ` ~$${lastUsage.estimatedCost.toFixed(4)}`
598
+ : "";
509
599
  process.stdout.write(
510
600
  `\n\n\x1B[2m[${lastUsage.inputTokens.toLocaleString()} in / ${lastUsage.outputTokens.toLocaleString()} out${cost}]\x1B[0m\n\n`,
511
601
  );
512
602
  lastUsage = null;
513
603
  } else {
514
- process.stdout.write('\n\n');
604
+ process.stdout.write("\n\n");
515
605
  }
516
606
  prompt();
517
607
  break;
518
608
  }
519
609
 
520
- case 'message_request_complete': {
610
+ case "message_request_complete": {
521
611
  // Request-level terminal for inline approval consumption.
522
612
  // When no agent turn remains active, clear busy state and re-prompt.
523
613
  if (msg.runStillActive !== true) {
524
614
  spinner.stop();
525
615
  generating = false;
526
- process.stdout.write('\n\n');
616
+ process.stdout.write("\n\n");
527
617
  prompt();
528
618
  }
529
619
  break;
530
620
  }
531
621
 
532
- case 'generation_handoff': {
622
+ case "generation_handoff": {
533
623
  // The current request's generation is done; show usage and re-prompt.
534
624
  // Always clear `generating` — this CLI client's generation is finished
535
625
  // when it receives a handoff. If other work is queued, those completions
@@ -537,34 +627,35 @@ export async function startCli(): Promise<void> {
537
627
  spinner.stop();
538
628
  generating = false;
539
629
  if (lastUsage) {
540
- const cost = lastUsage.estimatedCost > 0
541
- ? ` ~$${lastUsage.estimatedCost.toFixed(4)}`
542
- : '';
630
+ const cost =
631
+ lastUsage.estimatedCost > 0
632
+ ? ` ~$${lastUsage.estimatedCost.toFixed(4)}`
633
+ : "";
543
634
  process.stdout.write(
544
635
  `\n\n\x1B[2m[${lastUsage.inputTokens.toLocaleString()} in / ${lastUsage.outputTokens.toLocaleString()} out${cost}]\x1B[0m\n\n`,
545
636
  );
546
637
  lastUsage = null;
547
638
  } else {
548
- process.stdout.write('\n\n');
639
+ process.stdout.write("\n\n");
549
640
  }
550
641
  prompt();
551
642
  break;
552
643
  }
553
644
 
554
- case 'generation_cancelled':
645
+ case "generation_cancelled":
555
646
  spinner.stop();
556
647
  generating = false;
557
648
  lastUsage = null;
558
- process.stdout.write('\n[Cancelled]\n\n');
649
+ process.stdout.write("\n[Cancelled]\n\n");
559
650
  prompt();
560
651
  break;
561
652
 
562
- case 'tool_use_start':
653
+ case "tool_use_start":
563
654
  toolStreaming = false;
564
655
  spinner.start(formatToolProgress(msg.toolName, msg.input));
565
656
  break;
566
657
 
567
- case 'tool_output_chunk':
658
+ case "tool_output_chunk":
568
659
  if (!toolStreaming) {
569
660
  spinner.stop();
570
661
  toolStreaming = true;
@@ -572,13 +663,13 @@ export async function startCli(): Promise<void> {
572
663
  process.stdout.write(msg.chunk);
573
664
  break;
574
665
 
575
- case 'tool_result':
666
+ case "tool_result":
576
667
  if (!toolStreaming) spinner.stop();
577
668
  if (toolStreaming) {
578
669
  if (msg.status) {
579
670
  process.stdout.write(`\n${msg.status}`);
580
671
  }
581
- process.stdout.write('\n');
672
+ process.stdout.write("\n");
582
673
  } else {
583
674
  process.stdout.write(`\n[Tool: ${truncate(msg.result, 200)}]\n`);
584
675
  }
@@ -586,48 +677,59 @@ export async function startCli(): Promise<void> {
586
677
  if (msg.diff) {
587
678
  const diffOutput = msg.diff.isNewFile
588
679
  ? formatNewFileDiff(msg.diff.newContent, msg.diff.filePath, null)
589
- : formatDiff(msg.diff.oldContent, msg.diff.newContent, msg.diff.filePath);
680
+ : formatDiff(
681
+ msg.diff.oldContent,
682
+ msg.diff.newContent,
683
+ msg.diff.filePath,
684
+ );
590
685
  if (diffOutput) {
591
686
  process.stdout.write(diffOutput);
592
687
  }
593
688
  }
594
- spinner.start('Thinking...');
689
+ spinner.start("Thinking...");
595
690
  break;
596
691
 
597
- case 'confirmation_request':
692
+ case "confirmation_request":
598
693
  spinner.stop();
599
694
  renderConfirmationPrompt(msg);
600
695
  break;
601
696
 
602
- case 'error':
697
+ case "error":
603
698
  spinner.stop();
604
699
  generating = false;
605
700
  if (pendingConfirmation || pendingSessionPick || pendingCopySession) {
606
701
  pendingConfirmation = false;
607
702
  pendingSessionPick = false;
608
703
  pendingCopySession = false;
609
- rl.removeAllListeners('line');
610
- rl.on('line', handleLine);
704
+ rl.removeAllListeners("line");
705
+ rl.on("line", handleLine);
611
706
  }
612
707
  process.stdout.write(`\n[Error: ${msg.message}]\n`);
613
708
  prompt();
614
709
  break;
615
710
 
616
- case 'secret_detected': {
711
+ case "secret_detected": {
617
712
  const wasSpinning = spinner.isSpinning;
618
713
  spinner.stop();
619
- const types = msg.matches.map((m) => m.type).join(', ');
620
- const actionLabel = msg.action === 'redact' ? 'redacted' : msg.action === 'block' ? 'blocked' : 'detected';
621
- process.stdout.write(`\n ⚠ Secret ${actionLabel} in ${msg.toolName} output: ${types}\n`);
714
+ const types = msg.matches.map((m) => m.type).join(", ");
715
+ const actionLabel =
716
+ msg.action === "redact"
717
+ ? "redacted"
718
+ : msg.action === "block"
719
+ ? "blocked"
720
+ : "detected";
721
+ process.stdout.write(
722
+ `\n ⚠ Secret ${actionLabel} in ${msg.toolName} output: ${types}\n`,
723
+ );
622
724
  for (const match of msg.matches) {
623
725
  process.stdout.write(` • ${match.type}: ${match.redactedValue}\n`);
624
726
  }
625
- process.stdout.write('\n');
626
- if (wasSpinning) spinner.start('Thinking...');
727
+ process.stdout.write("\n");
728
+ if (wasSpinning) spinner.start("Thinking...");
627
729
  break;
628
730
  }
629
731
 
630
- case 'session_list_response':
732
+ case "session_list_response":
631
733
  if (pendingSessionPick) {
632
734
  renderSessionPicker(msg.sessions);
633
735
  } else {
@@ -638,67 +740,80 @@ export async function startCli(): Promise<void> {
638
740
  }
639
741
  break;
640
742
 
641
- case 'model_info':
743
+ case "model_info":
642
744
  process.stdout.write(`\n Model: ${msg.model} (${msg.provider})\n\n`);
643
745
  prompt();
644
746
  break;
645
747
 
646
- case 'history_response':
748
+ case "history_response":
647
749
  if (pendingCopySession) {
648
750
  pendingCopySession = false;
649
751
  if (msg.messages.length === 0) {
650
- process.stdout.write('\n No messages to copy.\n\n');
752
+ process.stdout.write("\n No messages to copy.\n\n");
651
753
  } else {
652
754
  try {
653
755
  const formatted = formatSessionForExport(msg.messages);
654
756
  copyToClipboard(formatted);
655
- process.stdout.write(`\n Copied session (${msg.messages.length} messages) to clipboard.\n\n`);
757
+ process.stdout.write(
758
+ `\n Copied session (${msg.messages.length} messages) to clipboard.\n\n`,
759
+ );
656
760
  } catch (err) {
657
- process.stdout.write(`\n Clipboard error: ${(err as Error).message}\n\n`);
761
+ process.stdout.write(
762
+ `\n Clipboard error: ${(err as Error).message}\n\n`,
763
+ );
658
764
  }
659
765
  }
660
766
  prompt();
661
767
  break;
662
768
  }
663
- process.stdout.write('\n');
769
+ process.stdout.write("\n");
664
770
  if (msg.messages.length === 0) {
665
- process.stdout.write(' No messages in this session.\n');
771
+ process.stdout.write(" No messages in this session.\n");
666
772
  } else {
667
773
  for (const m of msg.messages) {
668
- const label = m.role === 'user' ? 'you' : 'assistant';
774
+ const label = m.role === "user" ? "you" : "assistant";
669
775
  const preview = truncate(m.text, 120);
670
- process.stdout.write(` ${label}> ${preview.replace(/\n/g, ' ')}\n`);
776
+ process.stdout.write(
777
+ ` ${label}> ${preview.replace(/\n/g, " ")}\n`,
778
+ );
671
779
  }
672
780
  }
673
- process.stdout.write('\n');
781
+ process.stdout.write("\n");
674
782
  prompt();
675
783
  break;
676
784
 
677
- case 'undo_complete':
785
+ case "undo_complete":
678
786
  if (msg.removedCount === 0) {
679
- process.stdout.write('\n Nothing to undo.\n\n');
787
+ process.stdout.write("\n Nothing to undo.\n\n");
680
788
  } else {
681
- lastResponse = '';
682
- process.stdout.write(`\n Removed last exchange (${msg.removedCount} messages).\n\n`);
789
+ lastResponse = "";
790
+ process.stdout.write(
791
+ `\n Removed last exchange (${msg.removedCount} messages).\n\n`,
792
+ );
683
793
  }
684
794
  prompt();
685
795
  break;
686
796
 
687
- case 'usage_response': {
688
- process.stdout.write('\n');
797
+ case "usage_response": {
798
+ process.stdout.write("\n");
689
799
  process.stdout.write(` Model: ${msg.model}\n`);
690
- process.stdout.write(` Input tokens: ${msg.totalInputTokens.toLocaleString()}\n`);
691
- process.stdout.write(` Output tokens: ${msg.totalOutputTokens.toLocaleString()}\n`);
692
- const costStr = msg.estimatedCost > 0
693
- ? `$${msg.estimatedCost.toFixed(4)}`
694
- : 'N/A (unknown model pricing)';
800
+ process.stdout.write(
801
+ ` Input tokens: ${msg.totalInputTokens.toLocaleString()}\n`,
802
+ );
803
+ process.stdout.write(
804
+ ` Output tokens: ${msg.totalOutputTokens.toLocaleString()}\n`,
805
+ );
806
+ const costStr =
807
+ msg.estimatedCost > 0
808
+ ? `$${msg.estimatedCost.toFixed(4)}`
809
+ : "N/A (unknown model pricing)";
695
810
  process.stdout.write(` Estimated cost: ${costStr}\n`);
696
- process.stdout.write('\n');
811
+ process.stdout.write("\n");
697
812
  prompt();
698
813
  break;
699
814
  }
700
815
 
701
- case 'pong':
816
+ case "pong":
702
817
  // Heartbeat response — clear the timeout
703
818
  if (heartbeatTimeout) {
704
819
  clearTimeout(heartbeatTimeout);
@@ -723,7 +838,7 @@ export async function startCli(): Promise<void> {
723
838
  stopHeartbeat();
724
839
  heartbeatTimer = setInterval(() => {
725
840
  if (socket.destroyed) return;
726
- send({ type: 'ping' });
841
+ send({ type: "ping" });
727
842
  if (heartbeatTimeout) {
728
843
  clearTimeout(heartbeatTimeout);
729
844
  }
@@ -750,8 +865,8 @@ export async function startCli(): Promise<void> {
750
865
 
751
866
  // Remove stale rl.once('line') handlers from confirmation/selection prompts
752
867
  // and re-register the main line handler
753
- rl.removeAllListeners('line');
754
- rl.on('line', handleLine);
868
+ rl.removeAllListeners("line");
869
+ rl.on("line", handleLine);
755
870
 
756
871
  // Retry with exponential backoff (1s → 2s → 4s → … → 30s cap) until connected
757
872
  while (true) {
@@ -781,7 +896,7 @@ export async function startCli(): Promise<void> {
781
896
  let connected = false;
782
897
  let authenticated = false;
783
898
 
784
- newSocket.on('connect', () => {
899
+ newSocket.on("connect", () => {
785
900
  connected = true;
786
901
  socket = newSocket;
787
902
 
@@ -799,25 +914,32 @@ export async function startCli(): Promise<void> {
799
914
  resolve();
800
915
  return;
801
916
  }
802
- reject(new Error('Session token not found — is the daemon running?'));
917
+ reject(
918
+ new Error("Session token not found — is the assistant running?"),
919
+ );
803
920
  newSocket.destroy();
804
921
  return;
805
922
  }
806
- newSocket.write(serialize({ type: 'auth', token }));
923
+ newSocket.write(serialize({ type: "auth", token }));
807
924
  });
808
925
 
809
- newSocket.on('data', (data) => {
926
+ newSocket.on("data", (data) => {
810
927
  const messages = parser.feed(data.toString()) as ServerMessage[];
811
928
  for (const msg of messages) {
812
929
  // Wait for auth_result before processing other messages
813
930
  if (!authenticated) {
814
- if (msg.type === 'auth_result') {
931
+ if (msg.type === "auth_result") {
815
932
  if ((msg as { success: boolean }).success) {
816
933
  authenticated = true;
817
934
  startHeartbeat();
818
935
  resolve();
819
936
  } else {
820
- reject(new Error((msg as { message?: string }).message ?? 'Authentication failed'));
937
+ reject(
938
+ new Error(
939
+ (msg as { message?: string }).message ??
940
+ "Authentication failed",
941
+ ),
942
+ );
821
943
  newSocket.destroy();
822
944
  }
823
945
  }
@@ -827,7 +949,7 @@ export async function startCli(): Promise<void> {
827
949
  }
828
950
  });
829
951
 
830
- newSocket.on('close', () => {
952
+ newSocket.on("close", () => {
831
953
  stopHeartbeat();
832
954
  if (!connected) return; // handled by 'error'
833
955
  // Only auto-reconnect if we're not intentionally exiting
@@ -836,7 +958,7 @@ export async function startCli(): Promise<void> {
836
958
  }
837
959
  });
838
960
 
839
- newSocket.on('error', (err) => {
961
+ newSocket.on("error", (err) => {
840
962
  stopHeartbeat();
841
963
  if (!connected) {
842
964
  reject(err);
@@ -857,16 +979,18 @@ export async function startCli(): Promise<void> {
857
979
  // Persist to history file (ensure parent directory exists)
858
980
  try {
859
981
  mkdirSync(dirname(historyPath), { recursive: true });
860
- appendFileSync(historyPath, content + '\n');
861
- } catch { /* ignore */ }
982
+ appendFileSync(historyPath, content + "\n");
983
+ } catch {
984
+ /* ignore */
985
+ }
862
986
 
863
- if (content === '/copy') {
987
+ if (content === "/copy") {
864
988
  if (!lastResponse) {
865
- process.stdout.write('No response to copy.\n');
989
+ process.stdout.write("No response to copy.\n");
866
990
  } else {
867
991
  try {
868
992
  copyToClipboard(lastResponse);
869
- process.stdout.write('Copied to clipboard.\n');
993
+ process.stdout.write("Copied to clipboard.\n");
870
994
  } catch (err) {
871
995
  process.stdout.write(`Clipboard error: ${(err as Error).message}\n`);
872
996
  }
@@ -875,20 +999,20 @@ export async function startCli(): Promise<void> {
875
999
  return;
876
1000
  }
877
1001
 
878
- if (content === '/sessions') {
1002
+ if (content === "/sessions") {
879
1003
  pendingSessionPick = true;
880
- send({ type: 'session_list' });
1004
+ send({ type: "session_list" });
881
1005
  return;
882
1006
  }
883
1007
 
884
- if (content === '/copy-code') {
1008
+ if (content === "/copy-code") {
885
1009
  const code = extractLastCodeBlock(lastResponse);
886
1010
  if (code == null) {
887
- process.stdout.write('No code block found.\n');
1011
+ process.stdout.write("No code block found.\n");
888
1012
  } else {
889
1013
  try {
890
1014
  copyToClipboard(code);
891
- process.stdout.write('Copied code block to clipboard.\n');
1015
+ process.stdout.write("Copied code block to clipboard.\n");
892
1016
  } catch (err) {
893
1017
  process.stdout.write(`Clipboard error: ${(err as Error).message}\n`);
894
1018
  }
@@ -897,9 +1021,9 @@ export async function startCli(): Promise<void> {
897
1021
  return;
898
1022
  }
899
1023
 
900
- if (content === '/copy-session') {
901
- if (!send({ type: 'history_request', sessionId })) {
902
- process.stdout.write('[Not connected — command not sent]\n');
1024
+ if (content === "/copy-session") {
1025
+ if (!send({ type: "history_request", sessionId })) {
1026
+ process.stdout.write("[Not connected — command not sent]\n");
903
1027
  prompt();
904
1028
  return;
905
1029
  }
@@ -907,15 +1031,15 @@ export async function startCli(): Promise<void> {
907
1031
  return;
908
1032
  }
909
1033
 
910
- if (content === '/new') {
911
- send({ type: 'session_create' });
1034
+ if (content === "/new") {
1035
+ send({ type: "session_create" });
912
1036
  return;
913
1037
  }
914
1038
 
915
- if (content === '/clear') {
916
- lastResponse = '';
917
- process.stdout.write('\x1b[r');
918
- process.stdout.write('\x1b[2J\x1b[H');
1039
+ if (content === "/clear") {
1040
+ lastResponse = "";
1041
+ process.stdout.write("\x1b[r");
1042
+ process.stdout.write("\x1b[2J\x1b[H");
919
1043
  mainScreenLayout = renderMainScreen();
920
1044
  canvasHeight = mainScreenLayout.height;
921
1045
  const rows = process.stdout.rows || 24;
@@ -925,92 +1049,107 @@ export async function startCli(): Promise<void> {
925
1049
  return;
926
1050
  }
927
1051
 
928
- if (content === '/model' || content.startsWith('/model ')) {
929
- const modelArg = content.slice('/model'.length).trim();
1052
+ if (content === "/model" || content.startsWith("/model ")) {
1053
+ const modelArg = content.slice("/model".length).trim();
930
1054
  if (modelArg) {
931
- send({ type: 'model_set', model: modelArg });
1055
+ send({ type: "model_set", model: modelArg });
932
1056
  } else {
933
- send({ type: 'model_get' });
1057
+ send({ type: "model_get" });
934
1058
  }
935
1059
  return;
936
1060
  }
937
1061
 
938
- if (content === '/history') {
939
- send({ type: 'history_request', sessionId });
1062
+ if (content === "/history") {
1063
+ send({ type: "history_request", sessionId });
940
1064
  return;
941
1065
  }
942
1066
 
943
- if (content === '/undo') {
944
- send({ type: 'undo', sessionId });
1067
+ if (content === "/undo") {
1068
+ send({ type: "undo", sessionId });
945
1069
  return;
946
1070
  }
947
1071
 
948
- if (content === '/usage') {
949
- send({ type: 'usage_request', sessionId });
1072
+ if (content === "/usage") {
1073
+ send({ type: "usage_request", sessionId });
950
1074
  return;
951
1075
  }
952
1076
 
953
- if (content === '/help') {
954
- process.stdout.write('\n Available commands:\n');
955
- process.stdout.write(' /new Start a new session\n');
956
- process.stdout.write(' /sessions Switch between sessions\n');
957
- process.stdout.write(' /clear Clear the screen\n');
958
- process.stdout.write(' /model [name] Show or change the model\n');
959
- process.stdout.write(' /history Show conversation history\n');
960
- process.stdout.write(' /undo Remove last message exchange\n');
961
- process.stdout.write(' /usage Show token usage and cost\n');
962
- process.stdout.write(' /copy Copy last response to clipboard\n');
963
- process.stdout.write(' /copy-code Copy last code block to clipboard\n');
964
- process.stdout.write(' /copy-session Copy entire session to clipboard\n');
965
- process.stdout.write(' /help Show this help\n');
966
- process.stdout.write('\n');
1077
+ if (content === "/help") {
1078
+ process.stdout.write("\n Available commands:\n");
1079
+ process.stdout.write(" /new Start a new session\n");
1080
+ process.stdout.write(" /sessions Switch between sessions\n");
1081
+ process.stdout.write(" /clear Clear the screen\n");
1082
+ process.stdout.write(" /model [name] Show or change the model\n");
1083
+ process.stdout.write(" /history Show conversation history\n");
1084
+ process.stdout.write(
1085
+ " /undo Remove last message exchange\n",
1086
+ );
1087
+ process.stdout.write(" /usage Show token usage and cost\n");
1088
+ process.stdout.write(
1089
+ " /copy Copy last response to clipboard\n",
1090
+ );
1091
+ process.stdout.write(
1092
+ " /copy-code Copy last code block to clipboard\n",
1093
+ );
1094
+ process.stdout.write(
1095
+ " /copy-session Copy entire session to clipboard\n",
1096
+ );
1097
+ process.stdout.write(" /help Show this help\n");
1098
+ process.stdout.write("\n");
967
1099
  prompt();
968
1100
  return;
969
1101
  }
970
1102
 
971
1103
  if (!sessionId) {
972
1104
  pendingUserContent = content;
973
- spinner.start('Waiting for session...');
1105
+ spinner.start("Waiting for session...");
974
1106
  return;
975
1107
  }
976
1108
 
977
- lastResponse = '';
978
- if (!send({ type: 'user_message', sessionId, content, channel: 'vellum', interface: 'cli' })) {
979
- process.stdout.write('[Not connected — message not sent]\n');
1109
+ lastResponse = "";
1110
+ if (
1111
+ !send({
1112
+ type: "user_message",
1113
+ sessionId,
1114
+ content,
1115
+ channel: "vellum",
1116
+ interface: "cli",
1117
+ })
1118
+ ) {
1119
+ process.stdout.write("[Not connected — message not sent]\n");
980
1120
  prompt();
981
1121
  return;
982
1122
  }
983
1123
  generating = true;
984
- spinner.start('Thinking...');
1124
+ spinner.start("Thinking...");
985
1125
  }
986
1126
 
987
- rl.on('line', handleLine);
1127
+ rl.on("line", handleLine);
988
1128
 
989
- rl.on('close', () => {
1129
+ rl.on("close", () => {
990
1130
  stopHeartbeat();
991
- process.stdout.write('\x1b[r\x1b[2J\x1b[H');
992
- process.stdout.write('\x1b[2mDetached.\x1b[0m\n');
1131
+ process.stdout.write("\x1b[r\x1b[2J\x1b[H");
1132
+ process.stdout.write("\x1b[2mDetached.\x1b[0m\n");
993
1133
  process.exit(0);
994
1134
  });
995
1135
 
996
1136
  // Ctrl+C: cancel generation if in progress, otherwise detach
997
- process.on('SIGINT', () => {
1137
+ process.on("SIGINT", () => {
998
1138
  spinner.stop();
999
1139
  if (generating) {
1000
- send({ type: 'cancel' });
1140
+ send({ type: "cancel" });
1001
1141
  } else {
1002
1142
  rl.close();
1003
1143
  }
1004
1144
  });
1005
1145
 
1006
- process.stdout.on('resize', () => {
1146
+ process.stdout.on("resize", () => {
1007
1147
  const rows = process.stdout.rows || 24;
1008
1148
  process.stdout.write(`\x1b[${canvasHeight + 1};${rows}r`);
1009
1149
  });
1010
1150
 
1011
1151
  // Initial connection
1012
1152
  await connect();
1013
- updateDaemonText(mainScreenLayout, 'connected');
1014
- updateStatusText(mainScreenLayout, 'ready');
1015
-
1153
+ updateDaemonText(mainScreenLayout, "connected");
1154
+ updateStatusText(mainScreenLayout, "ready");
1016
1155
  }