@vellumai/assistant 0.4.42 → 0.4.44

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 (867) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +140 -403
  4. package/Dockerfile +0 -1
  5. package/README.md +81 -92
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +81 -104
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -3
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-asset.test.ts +1 -1
  33. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  34. package/src/__tests__/call-controller.test.ts +4 -8
  35. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  36. package/src/__tests__/call-domain.test.ts +250 -8
  37. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  38. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  39. package/src/__tests__/call-recovery.test.ts +47 -0
  40. package/src/__tests__/call-routes-http.test.ts +13 -0
  41. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  42. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  43. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  44. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  45. package/src/__tests__/channel-approval.test.ts +0 -201
  46. package/src/__tests__/channel-approvals.test.ts +2 -2
  47. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  48. package/src/__tests__/channel-guardian.test.ts +641 -740
  49. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  50. package/src/__tests__/channel-policy.test.ts +9 -12
  51. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  52. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  53. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  54. package/src/__tests__/checker.test.ts +41 -35
  55. package/src/__tests__/chrome-cdp.test.ts +57 -17
  56. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  57. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  58. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  59. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  60. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  61. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  62. package/src/__tests__/config-watcher.test.ts +1 -5
  63. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  64. package/src/__tests__/connection-policy.test.ts +3 -62
  65. package/src/__tests__/contacts-tools.test.ts +0 -2
  66. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  67. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  68. package/src/__tests__/context-window-manager.test.ts +220 -61
  69. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  70. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  71. package/src/__tests__/conversation-pairing.test.ts +14 -14
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +7 -7
  73. package/src/__tests__/conversation-store.test.ts +2 -2
  74. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  75. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +10 -16
  77. package/src/__tests__/credentials-cli.test.ts +49 -5
  78. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  79. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  80. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  81. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  82. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  84. package/src/__tests__/email-cli.test.ts +12 -12
  85. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  86. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  87. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  88. package/src/__tests__/event-bus.test.ts +0 -1
  89. package/src/__tests__/followup-tools.test.ts +0 -2
  90. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  91. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  92. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  95. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  97. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  98. package/src/__tests__/guardian-action-store.test.ts +2 -2
  99. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  101. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  102. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  103. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  104. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  105. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  106. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  109. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  110. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  111. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  112. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  113. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  114. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  115. package/src/__tests__/heartbeat-service.test.ts +1 -1
  116. package/src/__tests__/host-shell-tool.test.ts +3 -12
  117. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  118. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  119. package/src/__tests__/integration-status.test.ts +8 -8
  120. package/src/__tests__/intent-routing.test.ts +9 -13
  121. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  122. package/src/__tests__/invite-routes-http.test.ts +10 -10
  123. package/src/__tests__/llm-usage-store.test.ts +45 -9
  124. package/src/__tests__/local-gateway-health.test.ts +209 -0
  125. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  126. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  127. package/src/__tests__/managed-store.test.ts +29 -12
  128. package/src/__tests__/managed-twitter-guardrails.test.ts +357 -0
  129. package/src/__tests__/mcp-cli.test.ts +1 -1
  130. package/src/__tests__/mcp-health-check.test.ts +1 -1
  131. package/src/__tests__/media-generate-image.test.ts +1 -1
  132. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  133. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  134. package/src/__tests__/memory-regressions.test.ts +1 -166
  135. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  136. package/src/__tests__/migration-export-http.test.ts +2 -2
  137. package/src/__tests__/migration-transport.test.ts +44 -0
  138. package/src/__tests__/non-member-access-request.test.ts +49 -36
  139. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  140. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  141. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  142. package/src/__tests__/notification-deep-link.test.ts +3 -3
  143. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  144. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  145. package/src/__tests__/oauth-cli.test.ts +1 -1
  146. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  147. package/src/__tests__/onboarding-template-contract.test.ts +2 -12
  148. package/src/__tests__/platform.test.ts +168 -5
  149. package/src/__tests__/playbook-execution.test.ts +0 -2
  150. package/src/__tests__/playbook-tools.test.ts +0 -2
  151. package/src/__tests__/pricing.test.ts +125 -0
  152. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  153. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  154. package/src/__tests__/recording-handler.test.ts +46 -80
  155. package/src/__tests__/recording-state-machine.test.ts +112 -183
  156. package/src/__tests__/registry.test.ts +1 -1
  157. package/src/__tests__/relay-server.test.ts +69 -71
  158. package/src/__tests__/reminder-store.test.ts +3 -3
  159. package/src/__tests__/request-file-tool.test.ts +2 -2
  160. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  163. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  164. package/src/__tests__/schedule-store.test.ts +13 -4
  165. package/src/__tests__/schedule-tools.test.ts +0 -2
  166. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  167. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  168. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  169. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  170. package/src/__tests__/secret-response-routing.test.ts +1 -1
  171. package/src/__tests__/send-endpoint-busy.test.ts +1 -4
  172. package/src/__tests__/sequence-store.test.ts +0 -2
  173. package/src/__tests__/server-history-render.test.ts +2 -199
  174. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  175. package/src/__tests__/session-agent-loop.test.ts +107 -3
  176. package/src/__tests__/session-confirmation-signals.test.ts +17 -49
  177. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  178. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  179. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  180. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  181. package/src/__tests__/session-profile-injection.test.ts +9 -3
  182. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  183. package/src/__tests__/session-queue.test.ts +10 -4
  184. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  185. package/src/__tests__/session-skill-tools.test.ts +2 -3
  186. package/src/__tests__/session-slash-known.test.ts +11 -4
  187. package/src/__tests__/session-slash-queue.test.ts +11 -4
  188. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  189. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  190. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  191. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  192. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  193. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  194. package/src/__tests__/session-usage.test.ts +180 -0
  195. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  196. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  199. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  200. package/src/__tests__/skill-include-graph.test.ts +1 -0
  201. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  202. package/src/__tests__/skill-load-tool.test.ts +90 -12
  203. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  204. package/src/__tests__/skills-uninstall.test.ts +131 -0
  205. package/src/__tests__/skills.test.ts +32 -16
  206. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  207. package/src/__tests__/slack-channel-config.test.ts +71 -12
  208. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  209. package/src/__tests__/slack-share-routes.test.ts +1 -1
  210. package/src/__tests__/slack-skill.test.ts +2 -2
  211. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  212. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  213. package/src/__tests__/starter-task-flow.test.ts +10 -20
  214. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  215. package/src/__tests__/subagent-tools.test.ts +2 -2
  216. package/src/__tests__/system-prompt.test.ts +7 -12
  217. package/src/__tests__/task-compiler.test.ts +0 -2
  218. package/src/__tests__/task-management-tools.test.ts +0 -2
  219. package/src/__tests__/task-runner.test.ts +0 -2
  220. package/src/__tests__/task-scheduler.test.ts +2 -2
  221. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  222. package/src/__tests__/terminal-tools.test.ts +1 -11
  223. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  224. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  225. package/src/__tests__/tool-executor.test.ts +2 -2
  226. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  227. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  228. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  229. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  230. package/src/__tests__/trace-emitter.test.ts +1 -1
  231. package/src/__tests__/trust-context-guards.test.ts +1 -1
  232. package/src/__tests__/trust-store.test.ts +48 -399
  233. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  234. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  235. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  236. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  237. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  238. package/src/__tests__/twilio-config.test.ts +11 -2
  239. package/src/__tests__/twilio-provider.test.ts +6 -4
  240. package/src/__tests__/twilio-routes.test.ts +408 -86
  241. package/src/__tests__/twitter-platform-proxy-client.test.ts +475 -0
  242. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  243. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  244. package/src/__tests__/update-bulletin.test.ts +4 -8
  245. package/src/__tests__/update-template-contract.test.ts +1 -1
  246. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  247. package/src/__tests__/usage-routes.test.ts +23 -5
  248. package/src/__tests__/user-reference.test.ts +1 -1
  249. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  250. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  251. package/src/__tests__/view-image-tool.test.ts +0 -2
  252. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  253. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  254. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  255. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  256. package/src/__tests__/workspace-policy.test.ts +1 -1
  257. package/src/approvals/AGENTS.md +4 -4
  258. package/src/approvals/approval-primitive.ts +2 -2
  259. package/src/approvals/guardian-decision-primitive.ts +1 -1
  260. package/src/approvals/guardian-request-resolvers.ts +3 -4
  261. package/src/bundler/app-bundler.ts +29 -217
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +14 -54
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +108 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +15 -17
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +345 -0
  316. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +252 -0
  317. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -48
  318. package/src/cli/commands/twitter/index.ts +420 -0
  319. package/src/{twitter → cli/commands/twitter}/oauth-client.ts +1 -35
  320. package/src/cli/commands/twitter/router.ts +351 -0
  321. package/src/cli/commands/twitter/types.ts +30 -0
  322. package/src/cli/db.ts +1 -0
  323. package/src/cli/http-client.ts +87 -0
  324. package/src/cli/logger.ts +6 -0
  325. package/src/cli/main-screen.tsx +4 -3
  326. package/src/cli/output.ts +19 -0
  327. package/src/cli/program.ts +29 -27
  328. package/src/cli/reference.ts +27 -37
  329. package/src/cli.ts +452 -240
  330. package/src/config/assistant-feature-flags.ts +3 -15
  331. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  332. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  333. package/src/config/bundled-skills/amazon/SKILL.md +15 -6
  334. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  335. package/src/config/bundled-skills/app-builder/SKILL.md +4 -9
  336. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +23 -77
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -12
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -90
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +132 -109
  350. package/src/config/bundled-skills/doordash/lib/session.ts +22 -19
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +73 -144
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +8 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +196 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +151 -105
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +155 -55
  452. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  453. package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -25
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +30 -20
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +7 -1
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/surfaces.ts +2 -0
  462. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  463. package/src/daemon/providers-setup.ts +0 -5
  464. package/src/daemon/recording-executor.ts +0 -7
  465. package/src/daemon/ride-shotgun-handler.ts +42 -14
  466. package/src/daemon/seed-files.ts +3 -27
  467. package/src/daemon/server.ts +134 -524
  468. package/src/daemon/session-agent-loop-handlers.ts +46 -9
  469. package/src/daemon/session-agent-loop.ts +86 -24
  470. package/src/daemon/session-attachments.ts +1 -1
  471. package/src/daemon/session-error.ts +1 -1
  472. package/src/daemon/session-history.ts +20 -15
  473. package/src/daemon/session-lifecycle.ts +9 -7
  474. package/src/daemon/session-memory.ts +15 -1
  475. package/src/daemon/session-messaging.ts +10 -6
  476. package/src/daemon/session-notifiers.ts +10 -8
  477. package/src/daemon/session-process.ts +34 -25
  478. package/src/daemon/session-queue-manager.ts +1 -1
  479. package/src/daemon/session-runtime-assembly.ts +6 -32
  480. package/src/daemon/session-surfaces.ts +187 -35
  481. package/src/daemon/session-tool-setup.ts +1 -1
  482. package/src/daemon/session-usage.ts +119 -18
  483. package/src/daemon/session.ts +11 -33
  484. package/src/daemon/tool-side-effects.ts +6 -5
  485. package/src/daemon/trace-emitter.ts +1 -1
  486. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  487. package/src/daemon/watch-handler.ts +2 -5
  488. package/src/email/service.ts +8 -8
  489. package/src/events/domain-events.ts +0 -1
  490. package/src/events/tool-notification-listener.ts +1 -1
  491. package/src/followups/followup-store.ts +1 -2
  492. package/src/followups/types.ts +0 -6
  493. package/src/heartbeat/heartbeat-service.ts +1 -1
  494. package/src/inbound/platform-callback-registration.ts +1 -1
  495. package/src/inbound/public-ingress-urls.ts +0 -8
  496. package/src/index.ts +12 -0
  497. package/src/mcp/client.ts +1 -1
  498. package/src/mcp/manager.ts +1 -1
  499. package/src/memory/app-store.ts +1 -60
  500. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  501. package/src/memory/conversation-attention-store.ts +154 -0
  502. package/src/memory/conversation-bootstrap.ts +1 -1
  503. package/src/memory/conversation-crud.ts +53 -1
  504. package/src/memory/conversation-display-order-migration.ts +2 -3
  505. package/src/memory/conversation-queries.ts +1 -29
  506. package/src/memory/conversation-title-service.ts +26 -21
  507. package/src/memory/db-connection.ts +1 -8
  508. package/src/memory/db-init.ts +20 -0
  509. package/src/memory/delivery-crud.ts +4 -34
  510. package/src/memory/external-conversation-store.ts +1 -1
  511. package/src/memory/format-recall.ts +47 -0
  512. package/src/memory/guardian-action-store.ts +4 -5
  513. package/src/memory/guardian-rate-limits.ts +0 -3
  514. package/src/memory/invite-store.ts +1 -1
  515. package/src/memory/job-handlers/backfill.ts +9 -2
  516. package/src/memory/job-handlers/extraction.ts +2 -7
  517. package/src/memory/job-handlers/summarization.ts +1 -1
  518. package/src/memory/llm-usage-store.ts +11 -0
  519. package/src/memory/migrations/114-notifications.ts +12 -40
  520. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  521. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  522. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  523. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  524. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  525. package/src/memory/migrations/index.ts +5 -0
  526. package/src/memory/migrations/registry.ts +30 -0
  527. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  528. package/src/memory/retriever.test.ts +707 -0
  529. package/src/memory/retriever.ts +120 -116
  530. package/src/memory/schema/calls.ts +3 -7
  531. package/src/memory/schema/guardian.ts +2 -2
  532. package/src/memory/schema/infrastructure.ts +0 -8
  533. package/src/memory/search/lexical.ts +4 -1
  534. package/src/memory/search/query-expansion.test.ts +70 -0
  535. package/src/memory/search/query-expansion.ts +118 -0
  536. package/src/memory/search/types.ts +18 -17
  537. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  538. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  539. package/src/messaging/registry.ts +0 -1
  540. package/src/notifications/README.md +13 -22
  541. package/src/notifications/adapters/macos.ts +1 -1
  542. package/src/notifications/conversation-pairing.ts +2 -2
  543. package/src/notifications/copy-composer.ts +2 -2
  544. package/src/notifications/decision-engine.ts +1 -10
  545. package/src/notifications/destination-resolver.ts +2 -3
  546. package/src/notifications/emit-signal.ts +2 -8
  547. package/src/notifications/guardian-question-mode.ts +5 -8
  548. package/src/notifications/signal.ts +1 -2
  549. package/src/notifications/types.ts +1 -1
  550. package/src/oauth/token-persistence.ts +25 -1
  551. package/src/permissions/checker.ts +4 -29
  552. package/src/permissions/defaults.ts +9 -9
  553. package/src/permissions/prompter.ts +1 -1
  554. package/src/permissions/secret-prompter.ts +1 -1
  555. package/src/permissions/shell-identity.ts +1 -1
  556. package/src/permissions/trust-store.ts +13 -76
  557. package/src/permissions/workspace-policy.ts +1 -1
  558. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  559. package/src/{config → prompts}/system-prompt.ts +44 -26
  560. package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -3
  561. package/src/providers/registry.ts +2 -4
  562. package/src/runtime/AGENTS.md +6 -8
  563. package/src/runtime/access-request-helper.ts +36 -55
  564. package/src/runtime/actor-trust-resolver.ts +1 -24
  565. package/src/runtime/approval-message-composer.ts +6 -2
  566. package/src/runtime/assistant-event.ts +1 -1
  567. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  568. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  569. package/src/runtime/auth/__tests__/scopes.test.ts +2 -1
  570. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  571. package/src/runtime/auth/route-policy.ts +137 -25
  572. package/src/runtime/auth/scopes.ts +1 -0
  573. package/src/runtime/auth/subject.ts +9 -0
  574. package/src/runtime/auth/token-service.ts +12 -1
  575. package/src/runtime/auth/types.ts +1 -1
  576. package/src/runtime/channel-approval-types.ts +1 -1
  577. package/src/runtime/channel-approvals.ts +1 -1
  578. package/src/runtime/channel-invite-transport.ts +0 -2
  579. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  580. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  581. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  582. package/src/runtime/channel-readiness-service.ts +24 -159
  583. package/src/runtime/channel-readiness-types.ts +5 -1
  584. package/src/runtime/channel-reply-delivery.ts +43 -3
  585. package/src/runtime/channel-retry-sweep.ts +14 -22
  586. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  587. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  588. package/src/runtime/gateway-client.ts +12 -15
  589. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  590. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  591. package/src/runtime/guardian-action-message-composer.ts +4 -4
  592. package/src/runtime/guardian-reply-router.ts +3 -3
  593. package/src/runtime/http-server.ts +133 -24
  594. package/src/runtime/http-types.ts +44 -1
  595. package/src/runtime/invite-instruction-generator.ts +1 -3
  596. package/src/runtime/invite-redemption-service.ts +5 -5
  597. package/src/runtime/invite-service.ts +7 -7
  598. package/src/runtime/local-actor-identity.ts +28 -2
  599. package/src/runtime/local-gateway-health.ts +275 -0
  600. package/src/runtime/middleware/error-handler.ts +14 -1
  601. package/src/runtime/middleware/twilio-validation.ts +3 -3
  602. package/src/runtime/migrations/migration-transport.ts +18 -3
  603. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  604. package/src/runtime/nl-approval-parser.ts +2 -3
  605. package/src/runtime/routes/access-request-decision.ts +2 -2
  606. package/src/runtime/routes/app-management-routes.ts +918 -0
  607. package/src/runtime/routes/approval-routes.ts +76 -7
  608. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  609. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  610. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  611. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  612. package/src/runtime/routes/channel-route-shared.ts +1 -3
  613. package/src/runtime/routes/channel-routes.ts +1 -4
  614. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  615. package/src/runtime/routes/computer-use-routes.ts +595 -0
  616. package/src/runtime/routes/contact-routes.ts +1 -317
  617. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  618. package/src/runtime/routes/conversation-routes.ts +20 -24
  619. package/src/runtime/routes/debug-routes.ts +1 -1
  620. package/src/runtime/routes/diagnostics-routes.ts +890 -0
  621. package/src/runtime/routes/documents-routes.ts +227 -0
  622. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  623. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  624. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  625. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  626. package/src/runtime/routes/inbound-conversation.ts +3 -10
  627. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  628. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  629. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  630. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  631. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  632. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  633. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  634. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  635. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  636. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  637. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  638. package/src/runtime/routes/integrations/telegram.ts +111 -0
  639. package/src/runtime/routes/integrations/twilio.ts +451 -0
  640. package/src/runtime/routes/invite-routes.ts +2 -2
  641. package/src/runtime/routes/pairing-routes.ts +1 -1
  642. package/src/runtime/routes/recording-routes.ts +332 -0
  643. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  644. package/src/runtime/routes/session-management-routes.ts +167 -0
  645. package/src/runtime/routes/session-query-routes.ts +204 -0
  646. package/src/runtime/routes/settings-routes.ts +887 -0
  647. package/src/runtime/routes/skills-routes.ts +266 -0
  648. package/src/runtime/routes/subagents-routes.ts +246 -0
  649. package/src/runtime/routes/surface-action-routes.ts +100 -10
  650. package/src/runtime/routes/surface-content-routes.ts +1 -1
  651. package/src/runtime/routes/work-items-routes.ts +809 -0
  652. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  653. package/src/runtime/routes/workspace-routes.ts +410 -0
  654. package/src/runtime/routes/workspace-utils.ts +88 -0
  655. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  656. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  657. package/src/runtime/tool-grant-request-helper.ts +1 -2
  658. package/src/runtime/trust-context-resolver.ts +0 -1
  659. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  660. package/src/runtime/verification-rate-limiter.ts +2 -2
  661. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  662. package/src/schedule/integration-status.ts +2 -2
  663. package/src/schedule/schedule-store.ts +7 -9
  664. package/src/sequence/engine.ts +1 -1
  665. package/src/skills/active-skill-tools.ts +0 -8
  666. package/src/skills/clawhub.ts +1 -10
  667. package/src/skills/managed-store.ts +14 -4
  668. package/src/skills/slash-commands.ts +1 -1
  669. package/src/subagent/manager.ts +1 -1
  670. package/src/subagent/types.ts +1 -1
  671. package/src/tasks/SPEC.md +10 -10
  672. package/src/tasks/task-scheduler.ts +1 -1
  673. package/src/telegram/bot-username.ts +13 -0
  674. package/src/tools/AGENTS.md +38 -0
  675. package/src/tools/apps/executors.ts +0 -6
  676. package/src/tools/assets/materialize.ts +1 -1
  677. package/src/tools/assets/search.ts +1 -1
  678. package/src/tools/browser/browser-execution.ts +2 -2
  679. package/src/tools/browser/browser-manager.ts +88 -11
  680. package/src/tools/browser/browser-screencast.ts +1 -1
  681. package/src/tools/browser/headless-browser.ts +0 -17
  682. package/src/tools/browser/jit-auth.ts +1 -1
  683. package/src/tools/browser/recording-store.ts +19 -1
  684. package/src/tools/browser/runtime-check.ts +4 -2
  685. package/src/tools/calls/call-start.ts +3 -3
  686. package/src/tools/credentials/metadata-store.ts +0 -13
  687. package/src/tools/credentials/vault.ts +7 -31
  688. package/src/tools/document/editor-template.ts +10 -8
  689. package/src/tools/followups/followup_create.ts +0 -8
  690. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  691. package/src/tools/memory/definitions.ts +32 -10
  692. package/src/tools/memory/handlers.test.ts +573 -0
  693. package/src/tools/memory/handlers.ts +222 -65
  694. package/src/tools/memory/register.ts +53 -24
  695. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  696. package/src/tools/schedule/update.ts +0 -8
  697. package/src/tools/skills/load.ts +3 -3
  698. package/src/tools/subagent/read.ts +1 -1
  699. package/src/tools/system/voice-config.ts +2 -14
  700. package/src/tools/terminal/safe-env.ts +5 -18
  701. package/src/tools/tool-approval-handler.ts +4 -4
  702. package/src/tools/tool-manifest.ts +4 -2
  703. package/src/tools/types.ts +1 -1
  704. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  705. package/src/twitter/platform-proxy-client.ts +408 -0
  706. package/src/usage/types.ts +21 -0
  707. package/src/util/canonicalize-identity.ts +2 -6
  708. package/src/util/errors.ts +12 -0
  709. package/src/util/platform.ts +93 -86
  710. package/src/util/pricing.ts +180 -43
  711. package/src/work-items/work-item-runner.ts +1 -1
  712. package/scripts/ipc/check-contract-inventory.ts +0 -107
  713. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  714. package/scripts/ipc/generate-swift.ts +0 -528
  715. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  716. package/src/__tests__/app-migration.test.ts +0 -148
  717. package/src/__tests__/config-loader-migration.test.ts +0 -85
  718. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  719. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  720. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  721. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  722. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  723. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  724. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  725. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  726. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  727. package/src/__tests__/home-base-bootstrap.test.ts +0 -86
  728. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  729. package/src/__tests__/integrations-cli.test.ts +0 -232
  730. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  731. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  732. package/src/__tests__/ipc-contract.test.ts +0 -76
  733. package/src/__tests__/ipc-protocol.test.ts +0 -120
  734. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  735. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  736. package/src/__tests__/ipc-validate.test.ts +0 -471
  737. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  738. package/src/__tests__/migration-ordering.test.ts +0 -267
  739. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  740. package/src/__tests__/platform-move-helper.test.ts +0 -108
  741. package/src/__tests__/platform-socket-path.test.ts +0 -52
  742. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  743. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  744. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  745. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  746. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  747. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  748. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  749. package/src/__tests__/twitter-cli-error-shaping.test.ts +0 -224
  750. package/src/__tests__/twitter-cli-routing.test.ts +0 -286
  751. package/src/__tests__/work-item-output.test.ts +0 -150
  752. package/src/amazon/session.ts +0 -58
  753. package/src/cli/channels.ts +0 -51
  754. package/src/cli/influencer.ts +0 -319
  755. package/src/cli/integrations.ts +0 -372
  756. package/src/cli/ipc-client.ts +0 -88
  757. package/src/cli/twitter.ts +0 -1111
  758. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  759. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  760. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  761. package/src/config/core-schema.ts +0 -434
  762. package/src/config/memory-schema.ts +0 -617
  763. package/src/daemon/auth-manager.ts +0 -106
  764. package/src/daemon/handlers/apps.ts +0 -783
  765. package/src/daemon/handlers/avatar.ts +0 -73
  766. package/src/daemon/handlers/browser.ts +0 -3
  767. package/src/daemon/handlers/computer-use.ts +0 -231
  768. package/src/daemon/handlers/config-dispatch.ts +0 -29
  769. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  770. package/src/daemon/handlers/config-inbox.ts +0 -457
  771. package/src/daemon/handlers/config-integrations.ts +0 -409
  772. package/src/daemon/handlers/config-platform.ts +0 -77
  773. package/src/daemon/handlers/config-slack.ts +0 -41
  774. package/src/daemon/handlers/config-tools.ts +0 -226
  775. package/src/daemon/handlers/config-trust.ts +0 -135
  776. package/src/daemon/handlers/config.ts +0 -64
  777. package/src/daemon/handlers/contacts.ts +0 -193
  778. package/src/daemon/handlers/diagnostics.ts +0 -382
  779. package/src/daemon/handlers/documents.ts +0 -188
  780. package/src/daemon/handlers/guardian-actions.ts +0 -82
  781. package/src/daemon/handlers/home-base.ts +0 -82
  782. package/src/daemon/handlers/index.ts +0 -222
  783. package/src/daemon/handlers/misc.ts +0 -1139
  784. package/src/daemon/handlers/navigate-settings.ts +0 -29
  785. package/src/daemon/handlers/oauth-connect.ts +0 -202
  786. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  787. package/src/daemon/handlers/publish.ts +0 -176
  788. package/src/daemon/handlers/signing.ts +0 -56
  789. package/src/daemon/handlers/subagents.ts +0 -286
  790. package/src/daemon/handlers/twitter-auth.ts +0 -220
  791. package/src/daemon/handlers/work-items.ts +0 -796
  792. package/src/daemon/handlers/workspace-files.ts +0 -84
  793. package/src/daemon/handlers.ts +0 -16
  794. package/src/daemon/ipc-blob-store.ts +0 -246
  795. package/src/daemon/ipc-contract-inventory.json +0 -348
  796. package/src/daemon/ipc-contract-inventory.ts +0 -202
  797. package/src/daemon/ipc-handler.ts +0 -120
  798. package/src/daemon/ipc-protocol.ts +0 -85
  799. package/src/daemon/ipc-validate.ts +0 -254
  800. package/src/home-base/app-link-store.ts +0 -78
  801. package/src/home-base/bootstrap.ts +0 -74
  802. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  803. package/src/home-base/prebuilt/index.html +0 -702
  804. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  805. package/src/home-base/prebuilt/seed.ts +0 -122
  806. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  807. package/src/memory/app-migration.ts +0 -114
  808. package/src/memory/channel-delivery-store.ts +0 -40
  809. package/src/memory/channel-guardian-store.ts +0 -83
  810. package/src/memory/conversation-store.ts +0 -102
  811. package/src/memory/schema-migration.ts +0 -38
  812. package/src/messaging/providers/sms/adapter.ts +0 -232
  813. package/src/messaging/providers/sms/client.ts +0 -93
  814. package/src/messaging/providers/sms/types.ts +0 -7
  815. package/src/migrations/config-merge.ts +0 -62
  816. package/src/migrations/data-layout.ts +0 -89
  817. package/src/migrations/data-merge.ts +0 -44
  818. package/src/migrations/hooks-merge.ts +0 -118
  819. package/src/migrations/index.ts +0 -6
  820. package/src/migrations/log.ts +0 -28
  821. package/src/migrations/skills-merge.ts +0 -44
  822. package/src/migrations/workspace-layout.ts +0 -94
  823. package/src/notifications/adapters/sms.ts +0 -94
  824. package/src/runtime/channel-approval-parser.ts +0 -123
  825. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  826. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  827. package/src/runtime/routes/integration-routes.ts +0 -381
  828. package/src/runtime/routes/twilio-routes.ts +0 -1251
  829. package/src/twitter/client.ts +0 -979
  830. package/src/twitter/router.ts +0 -131
  831. package/src/twitter/session.ts +0 -54
  832. package/src/util/cookie-session.ts +0 -114
  833. package/src/watcher/providers/slack.ts +0 -282
  834. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  835. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  836. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  837. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  838. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  839. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  840. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  841. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  842. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  843. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  844. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  845. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  846. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  847. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  848. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  849. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  850. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  851. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  852. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  853. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  854. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  855. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  856. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  857. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  858. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  859. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  860. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  861. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  862. /package/src/{config → prompts}/templates/USER.md +0 -0
  863. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  864. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  865. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  866. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  867. /package/src/{config → prompts}/user-reference.ts +0 -0
package/src/cli.ts CHANGED
@@ -1,44 +1,37 @@
1
1
  import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
2
- import * as net from "node:net";
3
2
  import { dirname } from "node:path";
4
3
  import * as readline from "node:readline";
5
4
 
5
+ import { httpHealthCheck, httpSend, readHttpToken } from "./cli/http-client.js";
6
6
  import {
7
7
  type MainScreenLayout,
8
8
  renderMainScreen,
9
9
  updateDaemonText,
10
10
  updateStatusText,
11
11
  } from "./cli/main-screen.jsx";
12
- import { hasNoAuthOverride } from "./daemon/connection-policy.js";
13
12
  import { shouldAutoStartDaemon } from "./daemon/connection-policy.js";
14
- import {
15
- type ClientMessage,
16
- type ConfirmationRequest,
17
- createMessageParser,
18
- serialize,
19
- type ServerMessage,
20
- } from "./daemon/ipc-protocol.js";
21
13
  import { ensureDaemonRunning } from "./daemon/lifecycle.js";
14
+ import type {
15
+ ConfirmationRequest,
16
+ ServerMessage,
17
+ } from "./daemon/message-protocol.js";
22
18
  import {
23
19
  copyToClipboard,
24
20
  extractLastCodeBlock,
25
21
  formatSessionForExport,
26
22
  } from "./util/clipboard.js";
27
23
  import { formatDiff, formatNewFileDiff } from "./util/diff.js";
28
- import {
29
- getHistoryPath,
30
- getSocketPath,
31
- readSessionToken,
32
- } from "./util/platform.js";
24
+ import { getHistoryPath } from "./util/platform.js";
33
25
  import { Spinner } from "./util/spinner.js";
34
26
  import { timeAgo } from "./util/time.js";
35
27
  import { truncate } from "./util/truncate.js";
36
28
 
37
- const HEARTBEAT_INTERVAL_MS = 30_000;
38
- const HEARTBEAT_TIMEOUT_MS = 10_000;
39
29
  const RECONNECT_BASE_DELAY_MS = 1_000;
40
30
  const RECONNECT_MAX_DELAY_MS = 30_000;
41
31
 
32
+ /** Stable conversation key used by the built-in CLI. */
33
+ const CLI_CONVERSATION_KEY = "builtin-cli:default";
34
+
42
35
  export function sanitizeUrlForDisplay(rawUrl: unknown): string {
43
36
  const value = typeof rawUrl === "string" ? rawUrl : String(rawUrl ?? "");
44
37
  if (!value) return "";
@@ -131,9 +124,7 @@ export function formatConfirmationCommandPreview(
131
124
  }
132
125
 
133
126
  export async function startCli(): Promise<void> {
134
- const socketPath = getSocketPath();
135
- let socket: net.Socket;
136
- let parser = createMessageParser();
127
+ let conversationKey = CLI_CONVERSATION_KEY;
137
128
  let sessionId = "";
138
129
  let pendingUserContent: string | null = null;
139
130
  let generating = false;
@@ -152,8 +143,7 @@ export async function startCli(): Promise<void> {
152
143
  let toolStreaming = false;
153
144
  let reconnecting = false;
154
145
  let reconnectDelay = RECONNECT_BASE_DELAY_MS;
155
- let heartbeatTimer: ReturnType<typeof setInterval> | null = null;
156
- let heartbeatTimeout: ReturnType<typeof setTimeout> | null = null;
146
+ let sseAbortController: AbortController | null = null;
157
147
  const spinner = new Spinner();
158
148
 
159
149
  process.stdout.write("\x1b[2J\x1b[H");
@@ -228,12 +218,66 @@ export async function startCli(): Promise<void> {
228
218
  rl.prompt();
229
219
  }
230
220
 
231
- function send(msg: ClientMessage): boolean {
232
- if (socket && !socket.destroyed) {
233
- socket.write(serialize(msg));
234
- return true;
221
+ /** Send a confirmation decision via HTTP. */
222
+ async function sendConfirmation(
223
+ requestId: string,
224
+ decision: string,
225
+ ): Promise<void> {
226
+ try {
227
+ await httpSend("/v1/confirm", {
228
+ method: "POST",
229
+ body: JSON.stringify({ requestId, decision }),
230
+ });
231
+ } catch {
232
+ process.stdout.write("[Failed to send confirmation]\n");
233
+ }
234
+ }
235
+
236
+ /** Add a trust rule and then confirm via HTTP. */
237
+ async function sendTrustRuleAndConfirm(
238
+ requestId: string,
239
+ pattern: string,
240
+ scope: string,
241
+ decision: "allow" | "deny",
242
+ confirmDecision: string,
243
+ options?: { allowHighRisk?: boolean },
244
+ ): Promise<void> {
245
+ try {
246
+ await httpSend("/v1/trust-rules", {
247
+ method: "POST",
248
+ body: JSON.stringify({
249
+ requestId,
250
+ pattern,
251
+ scope,
252
+ decision,
253
+ ...(options?.allowHighRisk ? { allowHighRisk: true } : {}),
254
+ }),
255
+ });
256
+ await httpSend("/v1/confirm", {
257
+ method: "POST",
258
+ body: JSON.stringify({ requestId, decision: confirmDecision }),
259
+ });
260
+ } catch {
261
+ process.stdout.write("[Failed to send trust rule]\n");
262
+ }
263
+ }
264
+
265
+ /** Send a user message via HTTP POST. */
266
+ async function sendUserMessage(content: string): Promise<boolean> {
267
+ try {
268
+ const response = await httpSend("/v1/messages", {
269
+ method: "POST",
270
+ body: JSON.stringify({
271
+ conversationKey,
272
+ content,
273
+ sourceChannel: "vellum",
274
+ interface: "cli",
275
+ }),
276
+ });
277
+ return response.ok || response.status === 202;
278
+ } catch {
279
+ return false;
235
280
  }
236
- return false;
237
281
  }
238
282
 
239
283
  function renderConfirmationPrompt(req: ConfirmationRequest): void {
@@ -325,11 +369,7 @@ export async function startCli(): Promise<void> {
325
369
 
326
370
  pendingConfirmation = false;
327
371
  if (choice === "a") {
328
- send({
329
- type: "confirmation_response",
330
- requestId: req.requestId,
331
- decision: "allow",
332
- });
372
+ sendConfirmation(req.requestId, "allow");
333
373
  return;
334
374
  }
335
375
 
@@ -338,11 +378,7 @@ export async function startCli(): Promise<void> {
338
378
  trimmed === "t" &&
339
379
  req.temporaryOptionsAvailable?.includes("allow_10m")
340
380
  ) {
341
- send({
342
- type: "confirmation_response",
343
- requestId: req.requestId,
344
- decision: "allow_10m",
345
- });
381
+ sendConfirmation(req.requestId, "allow_10m");
346
382
  return;
347
383
  }
348
384
 
@@ -350,29 +386,17 @@ export async function startCli(): Promise<void> {
350
386
  trimmed === "T" &&
351
387
  req.temporaryOptionsAvailable?.includes("allow_thread")
352
388
  ) {
353
- send({
354
- type: "confirmation_response",
355
- requestId: req.requestId,
356
- decision: "allow_thread",
357
- });
389
+ sendConfirmation(req.requestId, "allow_thread");
358
390
  return;
359
391
  }
360
392
 
361
393
  if (choice === "d") {
362
- send({
363
- type: "confirmation_response",
364
- requestId: req.requestId,
365
- decision: "deny",
366
- });
394
+ sendConfirmation(req.requestId, "deny");
367
395
  return;
368
396
  }
369
397
 
370
398
  // Default to deny for unrecognized input
371
- send({
372
- type: "confirmation_response",
373
- requestId: req.requestId,
374
- decision: "deny",
375
- });
399
+ sendConfirmation(req.requestId, "deny");
376
400
  });
377
401
  }
378
402
 
@@ -410,11 +434,7 @@ export async function startCli(): Promise<void> {
410
434
  } else {
411
435
  // Invalid selection → deny
412
436
  pendingConfirmation = false;
413
- send({
414
- type: "confirmation_response",
415
- requestId: req.requestId,
416
- decision: "deny",
417
- });
437
+ sendConfirmation(req.requestId, "deny");
418
438
  }
419
439
  });
420
440
  }
@@ -447,20 +467,20 @@ export async function startCli(): Promise<void> {
447
467
  pendingConfirmation = false;
448
468
  const idx = parsed - 1;
449
469
  if (idx >= 0 && idx < req.scopeOptions.length) {
450
- send({
451
- type: "confirmation_response",
452
- requestId: req.requestId,
453
- decision,
470
+ const trustDecision = decision === "always_deny" ? "deny" : "allow";
471
+ sendTrustRuleAndConfirm(
472
+ req.requestId,
454
473
  selectedPattern,
455
- selectedScope: req.scopeOptions[idx].scope,
456
- });
474
+ req.scopeOptions[idx].scope,
475
+ trustDecision,
476
+ trustDecision,
477
+ decision === "always_allow_high_risk"
478
+ ? { allowHighRisk: true }
479
+ : undefined,
480
+ );
457
481
  } else {
458
482
  // Invalid selection → deny
459
- send({
460
- type: "confirmation_response",
461
- requestId: req.requestId,
462
- decision: "deny",
463
- });
483
+ sendConfirmation(req.requestId, "deny");
464
484
  }
465
485
  });
466
486
  }
@@ -479,10 +499,19 @@ export async function startCli(): Promise<void> {
479
499
  process.stdout.write(" [n] New session\n\n");
480
500
  process.stdout.write(" Pick a session> ");
481
501
 
482
- rl.once("line", (answer) => {
502
+ rl.once("line", async (answer) => {
483
503
  const trimmed = answer.trim().toLowerCase();
484
504
  if (trimmed === "n") {
485
- send({ type: "session_create" });
505
+ // Create a new conversation by using a unique key
506
+ conversationKey = `builtin-cli:${Date.now()}`;
507
+ sessionId = "";
508
+ pendingSessionPick = false;
509
+ // Reconnect SSE with new conversation key
510
+ await reconnectSse();
511
+ process.stdout.write(
512
+ `\n New session started.\n Type your message. Ctrl+D to detach.\n\n`,
513
+ );
514
+ prompt();
486
515
  return;
487
516
  }
488
517
  const parsed = parseInt(trimmed, 10);
@@ -493,15 +522,42 @@ export async function startCli(): Promise<void> {
493
522
  }
494
523
  const idx = parsed - 1;
495
524
  if (idx >= 0 && idx < sessions.length) {
496
- if (sessions[idx].id === sessionId) {
525
+ const selected = sessions[idx];
526
+ if (selected.id === sessionId) {
497
527
  // Already on this session
498
528
  pendingSessionPick = false;
499
529
  process.stdout.write(
500
- `\n Session: ${sessions[idx].title}\n Type your message. Ctrl+D to detach.\n\n`,
530
+ `\n Session: ${selected.title}\n Type your message. Ctrl+D to detach.\n\n`,
501
531
  );
502
532
  prompt();
503
533
  } else {
504
- send({ type: "session_switch", sessionId: sessions[idx].id });
534
+ try {
535
+ const newKey = `builtin-cli:${selected.id}`;
536
+ const resp = await httpSend("/v1/conversations/switch", {
537
+ method: "POST",
538
+ body: JSON.stringify({
539
+ conversationId: selected.id,
540
+ conversationKey: newKey,
541
+ }),
542
+ });
543
+ if (resp.ok) {
544
+ const data = (await resp.json()) as { sessionId: string; title: string };
545
+ sessionId = data.sessionId;
546
+ conversationKey = newKey;
547
+ pendingSessionPick = false;
548
+ await reconnectSse();
549
+ process.stdout.write(
550
+ `\n Session: ${data.title}\n Type your message. Ctrl+D to detach.\n\n`,
551
+ );
552
+ prompt();
553
+ } else {
554
+ process.stdout.write(" Failed to switch session.\n");
555
+ renderSessionPicker(sessions);
556
+ }
557
+ } catch {
558
+ process.stdout.write(" Failed to switch session.\n");
559
+ renderSessionPicker(sessions);
560
+ }
505
561
  }
506
562
  } else {
507
563
  process.stdout.write(" Invalid selection.\n");
@@ -522,21 +578,15 @@ export async function startCli(): Promise<void> {
522
578
  const content = pendingUserContent;
523
579
  pendingUserContent = null;
524
580
  lastResponse = "";
525
- if (
526
- send({
527
- type: "user_message",
528
- sessionId,
529
- content,
530
- channel: "vellum",
531
- interface: "cli",
532
- })
533
- ) {
534
- generating = true;
535
- spinner.start("Thinking...");
536
- } else {
537
- process.stdout.write("[Not connected — message not sent]\n");
538
- prompt();
539
- }
581
+ sendUserMessage(content).then((ok) => {
582
+ if (ok) {
583
+ generating = true;
584
+ spinner.start("Thinking...");
585
+ } else {
586
+ process.stdout.write("[Not connected — message not sent]\n");
587
+ prompt();
588
+ }
589
+ });
540
590
  } else {
541
591
  prompt();
542
592
  }
@@ -620,10 +670,6 @@ export async function startCli(): Promise<void> {
620
670
  }
621
671
 
622
672
  case "generation_handoff": {
623
- // The current request's generation is done; show usage and re-prompt.
624
- // Always clear `generating` — this CLI client's generation is finished
625
- // when it receives a handoff. If other work is queued, those completions
626
- // go to other request callbacks, not this CLI socket.
627
673
  spinner.stop();
628
674
  generating = false;
629
675
  if (lastUsage) {
@@ -812,47 +858,121 @@ export async function startCli(): Promise<void> {
812
858
  prompt();
813
859
  break;
814
860
  }
815
-
816
- case "pong":
817
- // Heartbeat response — clear the timeout
818
- if (heartbeatTimeout) {
819
- clearTimeout(heartbeatTimeout);
820
- heartbeatTimeout = null;
821
- }
822
- break;
823
861
  }
824
862
  }
825
863
 
826
- function stopHeartbeat(): void {
827
- if (heartbeatTimer) {
828
- clearInterval(heartbeatTimer);
829
- heartbeatTimer = null;
830
- }
831
- if (heartbeatTimeout) {
832
- clearTimeout(heartbeatTimeout);
833
- heartbeatTimeout = null;
864
+ /** Disconnect the current SSE stream. */
865
+ function disconnectSse(): void {
866
+ if (sseAbortController) {
867
+ sseAbortController.abort();
868
+ sseAbortController = null;
834
869
  }
835
870
  }
836
871
 
837
- function startHeartbeat(): void {
838
- stopHeartbeat();
839
- heartbeatTimer = setInterval(() => {
840
- if (socket.destroyed) return;
841
- send({ type: "ping" });
842
- if (heartbeatTimeout) {
843
- clearTimeout(heartbeatTimeout);
872
+ /** Reconnect the SSE stream (e.g., after switching conversations). */
873
+ async function reconnectSse(): Promise<void> {
874
+ disconnectSse();
875
+ await connectSse();
876
+ }
877
+
878
+ /** Connect the SSE event stream for the current conversation. */
879
+ async function connectSse(): Promise<void> {
880
+ const token = readHttpToken();
881
+ const controller = new AbortController();
882
+ sseAbortController = controller;
883
+
884
+ const url = `/v1/events?conversationKey=${encodeURIComponent(conversationKey)}`;
885
+ const headers: Record<string, string> = {
886
+ Accept: "text/event-stream",
887
+ };
888
+ if (token) {
889
+ headers["Authorization"] = `Bearer ${token}`;
890
+ }
891
+
892
+ try {
893
+ const response = await httpSend(url, {
894
+ method: "GET",
895
+ headers: { Accept: "text/event-stream" },
896
+ signal: controller.signal,
897
+ });
898
+
899
+ if (!response.ok || !response.body) {
900
+ throw new Error(`SSE connection failed: ${response.status}`);
844
901
  }
845
- heartbeatTimeout = setTimeout(() => {
846
- // No pong received — daemon is unresponsive, trigger reconnect
847
- socket.destroy();
848
- }, HEARTBEAT_TIMEOUT_MS);
849
- }, HEARTBEAT_INTERVAL_MS);
902
+
903
+ // Read the SSE stream
904
+ const reader = response.body.getReader();
905
+ const decoder = new TextDecoder();
906
+ let buffer = "";
907
+
908
+ const readLoop = async () => {
909
+ try {
910
+ while (true) {
911
+ const { done, value } = await reader.read();
912
+ if (done) break;
913
+
914
+ buffer += decoder.decode(value, { stream: true });
915
+
916
+ // Parse SSE frames from the buffer
917
+ const frames = buffer.split("\n\n");
918
+ // Keep the last (potentially incomplete) frame in the buffer
919
+ buffer = frames.pop() ?? "";
920
+
921
+ for (const frame of frames) {
922
+ if (!frame.trim()) continue;
923
+ // Skip heartbeat comments
924
+ if (frame.startsWith(":")) continue;
925
+
926
+ // Parse event type and data
927
+ let data = "";
928
+ for (const line of frame.split("\n")) {
929
+ if (line.startsWith("data: ")) {
930
+ data += line.slice(6);
931
+ }
932
+ }
933
+
934
+ if (!data) continue;
935
+
936
+ try {
937
+ const event = JSON.parse(data) as {
938
+ message: ServerMessage;
939
+ sessionId?: string;
940
+ };
941
+ // Extract the sessionId from the event envelope if we don't have one
942
+ if (!sessionId && event.sessionId) {
943
+ sessionId = event.sessionId;
944
+ }
945
+ handleMessage(event.message);
946
+ } catch {
947
+ // Skip malformed events
948
+ }
949
+ }
950
+ }
951
+ } catch {
952
+ if (controller.signal.aborted) return; // intentional disconnect
953
+ // Connection lost — trigger reconnect
954
+ } finally {
955
+ reader.releaseLock();
956
+ }
957
+
958
+ // If not intentionally disconnected, reconnect
959
+ if (!controller.signal.aborted && !reconnecting) {
960
+ reconnect();
961
+ }
962
+ };
963
+
964
+ // Start reading in the background (don't await — it runs for the lifetime of the connection)
965
+ readLoop();
966
+ } catch (err) {
967
+ if (controller.signal.aborted) return;
968
+ throw err;
969
+ }
850
970
  }
851
971
 
852
972
  async function reconnect(): Promise<void> {
853
973
  if (reconnecting) return;
854
974
  reconnecting = true;
855
- stopHeartbeat();
975
+ disconnectSse();
856
976
  spinner.stop();
857
977
 
858
978
  // Reset generation state — any in-flight request is lost
@@ -871,7 +991,7 @@ export async function startCli(): Promise<void> {
871
991
  // Retry with exponential backoff (1s → 2s → 4s → … → 30s cap) until connected
872
992
  while (true) {
873
993
  const delaySec = (reconnectDelay / 1000).toFixed(0);
874
- process.stdout.write(`\n Reconnecting to daemon in ${delaySec}s...\n`);
994
+ process.stdout.write(`\n Reconnecting to assistant in ${delaySec}s...\n`);
875
995
  await new Promise((r) => setTimeout(r, reconnectDelay));
876
996
 
877
997
  // Increase backoff for next attempt before trying
@@ -879,9 +999,14 @@ export async function startCli(): Promise<void> {
879
999
 
880
1000
  try {
881
1001
  if (shouldAutoStartDaemon()) await ensureDaemonRunning();
882
- await connect();
1002
+ // Verify the daemon is healthy before attempting SSE
1003
+ const healthy = await httpHealthCheck(2000);
1004
+ if (!healthy) throw new Error("Health check failed");
1005
+ await connectSse();
883
1006
  reconnectDelay = RECONNECT_BASE_DELAY_MS;
884
1007
  reconnecting = false;
1008
+ updateDaemonText(mainScreenLayout, "connected");
1009
+ updateStatusText(mainScreenLayout, "ready");
885
1010
  return;
886
1011
  } catch {
887
1012
  // Will retry with increased backoff
@@ -889,86 +1014,6 @@ export async function startCli(): Promise<void> {
889
1014
  }
890
1015
  }
891
1016
 
892
- function connect(): Promise<void> {
893
- return new Promise<void>((resolve, reject) => {
894
- parser = createMessageParser();
895
- const newSocket = net.createConnection(socketPath);
896
- let connected = false;
897
- let authenticated = false;
898
-
899
- newSocket.on("connect", () => {
900
- connected = true;
901
- socket = newSocket;
902
-
903
- // Authenticate with session token before the server will
904
- // accept any other messages.
905
- const token = readSessionToken();
906
- if (!token) {
907
- if (hasNoAuthOverride()) {
908
- // VELLUM_DAEMON_NOAUTH=1: the operator has explicitly opted
909
- // into unauthenticated connections (e.g. SSH-forwarded socket
910
- // where the token file lives on the remote host). Connect
911
- // without auth and let the server decide.
912
- authenticated = true;
913
- startHeartbeat();
914
- resolve();
915
- return;
916
- }
917
- reject(
918
- new Error("Session token not found — is the assistant running?"),
919
- );
920
- newSocket.destroy();
921
- return;
922
- }
923
- newSocket.write(serialize({ type: "auth", token }));
924
- });
925
-
926
- newSocket.on("data", (data) => {
927
- const messages = parser.feed(data.toString()) as ServerMessage[];
928
- for (const msg of messages) {
929
- // Wait for auth_result before processing other messages
930
- if (!authenticated) {
931
- if (msg.type === "auth_result") {
932
- if ((msg as { success: boolean }).success) {
933
- authenticated = true;
934
- startHeartbeat();
935
- resolve();
936
- } else {
937
- reject(
938
- new Error(
939
- (msg as { message?: string }).message ??
940
- "Authentication failed",
941
- ),
942
- );
943
- newSocket.destroy();
944
- }
945
- }
946
- continue;
947
- }
948
- handleMessage(msg);
949
- }
950
- });
951
-
952
- newSocket.on("close", () => {
953
- stopHeartbeat();
954
- if (!connected) return; // handled by 'error'
955
- // Only auto-reconnect if we're not intentionally exiting
956
- if (!reconnecting) {
957
- reconnect();
958
- }
959
- });
960
-
961
- newSocket.on("error", (err) => {
962
- stopHeartbeat();
963
- if (!connected) {
964
- reject(err);
965
- return;
966
- }
967
- // Connected socket error — will trigger 'close' → reconnect
968
- });
969
- });
970
- }
971
-
972
1017
  function handleLine(line: string): void {
973
1018
  const content = line.trim();
974
1019
  if (!content) return;
@@ -1001,7 +1046,34 @@ export async function startCli(): Promise<void> {
1001
1046
 
1002
1047
  if (content === "/sessions") {
1003
1048
  pendingSessionPick = true;
1004
- send({ type: "session_list" });
1049
+ // Fetch session list via HTTP
1050
+ httpSend("/v1/conversations/search?q=*&limit=20", { method: "GET" })
1051
+ .then(async (resp) => {
1052
+ if (resp.ok) {
1053
+ const data = (await resp.json()) as {
1054
+ results: Array<{
1055
+ conversationId: string;
1056
+ title: string;
1057
+ updatedAt: string;
1058
+ }>;
1059
+ };
1060
+ const sessions = data.results.map((r) => ({
1061
+ id: r.conversationId,
1062
+ title: r.title || "Untitled",
1063
+ updatedAt: new Date(r.updatedAt).getTime(),
1064
+ }));
1065
+ renderSessionPicker(sessions);
1066
+ } else {
1067
+ pendingSessionPick = false;
1068
+ process.stdout.write("[Failed to fetch sessions]\n");
1069
+ prompt();
1070
+ }
1071
+ })
1072
+ .catch(() => {
1073
+ pendingSessionPick = false;
1074
+ process.stdout.write("[Failed to fetch sessions]\n");
1075
+ prompt();
1076
+ });
1005
1077
  return;
1006
1078
  }
1007
1079
 
@@ -1022,17 +1094,58 @@ export async function startCli(): Promise<void> {
1022
1094
  }
1023
1095
 
1024
1096
  if (content === "/copy-session") {
1025
- if (!send({ type: "history_request", sessionId })) {
1026
- process.stdout.write("[Not connected — command not sent]\n");
1027
- prompt();
1028
- return;
1029
- }
1030
- pendingCopySession = true;
1097
+ // Fetch history via HTTP
1098
+ httpSend(
1099
+ `/v1/messages?conversationKey=${encodeURIComponent(conversationKey)}`,
1100
+ { method: "GET" },
1101
+ )
1102
+ .then(async (resp) => {
1103
+ if (resp.ok) {
1104
+ const data = (await resp.json()) as {
1105
+ messages: Array<{ role: string; content: string }>;
1106
+ };
1107
+ if (data.messages.length === 0) {
1108
+ process.stdout.write("\n No messages to copy.\n\n");
1109
+ } else {
1110
+ try {
1111
+ const formatted = formatSessionForExport(
1112
+ data.messages.map((m) => ({
1113
+ role: m.role as "user" | "assistant",
1114
+ text: m.content,
1115
+ })),
1116
+ );
1117
+ copyToClipboard(formatted);
1118
+ process.stdout.write(
1119
+ `\n Copied session (${data.messages.length} messages) to clipboard.\n\n`,
1120
+ );
1121
+ } catch (err) {
1122
+ process.stdout.write(
1123
+ `\n Clipboard error: ${(err as Error).message}\n\n`,
1124
+ );
1125
+ }
1126
+ }
1127
+ } else {
1128
+ process.stdout.write("[Failed to fetch history]\n");
1129
+ }
1130
+ prompt();
1131
+ })
1132
+ .catch(() => {
1133
+ process.stdout.write("[Failed to fetch history]\n");
1134
+ prompt();
1135
+ });
1031
1136
  return;
1032
1137
  }
1033
1138
 
1034
1139
  if (content === "/new") {
1035
- send({ type: "session_create" });
1140
+ // Create a new conversation by using a unique key
1141
+ conversationKey = `builtin-cli:${Date.now()}`;
1142
+ sessionId = "";
1143
+ reconnectSse().then(() => {
1144
+ process.stdout.write(
1145
+ `\n New session started.\n Type your message. Ctrl+D to detach.\n\n`,
1146
+ );
1147
+ prompt();
1148
+ });
1036
1149
  return;
1037
1150
  }
1038
1151
 
@@ -1052,25 +1165,124 @@ export async function startCli(): Promise<void> {
1052
1165
  if (content === "/model" || content.startsWith("/model ")) {
1053
1166
  const modelArg = content.slice("/model".length).trim();
1054
1167
  if (modelArg) {
1055
- send({ type: "model_set", model: modelArg });
1168
+ httpSend("/v1/model", {
1169
+ method: "PUT",
1170
+ body: JSON.stringify({ modelId: modelArg }),
1171
+ })
1172
+ .then(async (resp) => {
1173
+ if (resp.ok) {
1174
+ const data = (await resp.json()) as {
1175
+ model: string;
1176
+ provider: string;
1177
+ };
1178
+ process.stdout.write(
1179
+ `\n Model: ${data.model} (${data.provider})\n\n`,
1180
+ );
1181
+ } else {
1182
+ process.stdout.write("[Failed to set model]\n");
1183
+ }
1184
+ prompt();
1185
+ })
1186
+ .catch(() => {
1187
+ process.stdout.write("[Failed to set model]\n");
1188
+ prompt();
1189
+ });
1056
1190
  } else {
1057
- send({ type: "model_get" });
1191
+ httpSend("/v1/model", { method: "GET" })
1192
+ .then(async (resp) => {
1193
+ if (resp.ok) {
1194
+ const data = (await resp.json()) as {
1195
+ model: string;
1196
+ provider: string;
1197
+ };
1198
+ process.stdout.write(
1199
+ `\n Model: ${data.model} (${data.provider})\n\n`,
1200
+ );
1201
+ } else {
1202
+ process.stdout.write("[Failed to get model info]\n");
1203
+ }
1204
+ prompt();
1205
+ })
1206
+ .catch(() => {
1207
+ process.stdout.write("[Failed to get model info]\n");
1208
+ prompt();
1209
+ });
1058
1210
  }
1059
1211
  return;
1060
1212
  }
1061
1213
 
1062
1214
  if (content === "/history") {
1063
- send({ type: "history_request", sessionId });
1215
+ httpSend(
1216
+ `/v1/messages?conversationKey=${encodeURIComponent(conversationKey)}`,
1217
+ { method: "GET" },
1218
+ )
1219
+ .then(async (resp) => {
1220
+ if (resp.ok) {
1221
+ const data = (await resp.json()) as {
1222
+ messages: Array<{ role: string; content: string }>;
1223
+ };
1224
+ process.stdout.write("\n");
1225
+ if (data.messages.length === 0) {
1226
+ process.stdout.write(" No messages in this session.\n");
1227
+ } else {
1228
+ for (const m of data.messages) {
1229
+ const label = m.role === "user" ? "you" : "assistant";
1230
+ const preview = truncate(m.content, 120);
1231
+ process.stdout.write(
1232
+ ` ${label}> ${preview.replace(/\n/g, " ")}\n`,
1233
+ );
1234
+ }
1235
+ }
1236
+ process.stdout.write("\n");
1237
+ } else {
1238
+ process.stdout.write("[Failed to fetch history]\n");
1239
+ }
1240
+ prompt();
1241
+ })
1242
+ .catch(() => {
1243
+ process.stdout.write("[Failed to fetch history]\n");
1244
+ prompt();
1245
+ });
1064
1246
  return;
1065
1247
  }
1066
1248
 
1067
1249
  if (content === "/undo") {
1068
- send({ type: "undo", sessionId });
1250
+ if (!sessionId) {
1251
+ process.stdout.write("\n No active session.\n\n");
1252
+ prompt();
1253
+ return;
1254
+ }
1255
+ httpSend(`/v1/conversations/${encodeURIComponent(sessionId)}/undo`, {
1256
+ method: "POST",
1257
+ })
1258
+ .then(async (resp) => {
1259
+ if (resp.ok) {
1260
+ const data = (await resp.json()) as { removedCount: number };
1261
+ if (data.removedCount === 0) {
1262
+ process.stdout.write("\n Nothing to undo.\n\n");
1263
+ } else {
1264
+ lastResponse = "";
1265
+ process.stdout.write(
1266
+ `\n Removed last exchange (${data.removedCount} messages).\n\n`,
1267
+ );
1268
+ }
1269
+ } else {
1270
+ process.stdout.write("[Failed to undo]\n");
1271
+ }
1272
+ prompt();
1273
+ })
1274
+ .catch(() => {
1275
+ process.stdout.write("[Failed to undo]\n");
1276
+ prompt();
1277
+ });
1069
1278
  return;
1070
1279
  }
1071
1280
 
1072
1281
  if (content === "/usage") {
1073
- send({ type: "usage_request", sessionId });
1282
+ process.stdout.write(
1283
+ "\n [Usage tracking is not available via HTTP yet]\n\n",
1284
+ );
1285
+ prompt();
1074
1286
  return;
1075
1287
  }
1076
1288
 
@@ -1100,34 +1312,23 @@ export async function startCli(): Promise<void> {
1100
1312
  return;
1101
1313
  }
1102
1314
 
1103
- if (!sessionId) {
1104
- pendingUserContent = content;
1105
- spinner.start("Waiting for session...");
1106
- return;
1107
- }
1108
-
1315
+ // Regular user message
1109
1316
  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");
1120
- prompt();
1121
- return;
1122
- }
1123
- generating = true;
1124
- spinner.start("Thinking...");
1317
+ sendUserMessage(content).then((ok) => {
1318
+ if (!ok) {
1319
+ process.stdout.write("[Not connected — message not sent]\n");
1320
+ prompt();
1321
+ return;
1322
+ }
1323
+ generating = true;
1324
+ spinner.start("Thinking...");
1325
+ });
1125
1326
  }
1126
1327
 
1127
1328
  rl.on("line", handleLine);
1128
1329
 
1129
1330
  rl.on("close", () => {
1130
- stopHeartbeat();
1331
+ disconnectSse();
1131
1332
  process.stdout.write("\x1b[r\x1b[2J\x1b[H");
1132
1333
  process.stdout.write("\x1b[2mDetached.\x1b[0m\n");
1133
1334
  process.exit(0);
@@ -1136,8 +1337,13 @@ export async function startCli(): Promise<void> {
1136
1337
  // Ctrl+C: cancel generation if in progress, otherwise detach
1137
1338
  process.on("SIGINT", () => {
1138
1339
  spinner.stop();
1139
- if (generating) {
1140
- send({ type: "cancel" });
1340
+ if (generating && sessionId) {
1341
+ httpSend(
1342
+ `/v1/conversations/${encodeURIComponent(sessionId)}/cancel`,
1343
+ { method: "POST" },
1344
+ ).catch(() => {
1345
+ // Best-effort cancel
1346
+ });
1141
1347
  } else {
1142
1348
  rl.close();
1143
1349
  }
@@ -1149,7 +1355,13 @@ export async function startCli(): Promise<void> {
1149
1355
  });
1150
1356
 
1151
1357
  // Initial connection
1152
- await connect();
1358
+ await connectSse();
1153
1359
  updateDaemonText(mainScreenLayout, "connected");
1154
1360
  updateStatusText(mainScreenLayout, "ready");
1361
+
1362
+ // Show initial prompt since HTTP doesn't have the session_info flow
1363
+ process.stdout.write(
1364
+ `\n Type your message. Ctrl+D to detach.\n\n`,
1365
+ );
1366
+ prompt();
1155
1367
  }