@vellumai/assistant 0.4.41 → 0.4.43

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 (843) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +131 -393
  4. package/Dockerfile +0 -1
  5. package/README.md +73 -83
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +16 -21
  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 -1
  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-skill-retrieval-guard.test.ts +2 -9
  33. package/src/__tests__/call-controller.test.ts +4 -8
  34. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  35. package/src/__tests__/call-domain.test.ts +250 -8
  36. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  37. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  38. package/src/__tests__/call-recovery.test.ts +47 -0
  39. package/src/__tests__/call-routes-http.test.ts +13 -0
  40. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  41. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  42. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  43. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  44. package/src/__tests__/channel-approval.test.ts +0 -201
  45. package/src/__tests__/channel-approvals.test.ts +2 -2
  46. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  47. package/src/__tests__/channel-guardian.test.ts +641 -740
  48. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  49. package/src/__tests__/channel-policy.test.ts +9 -12
  50. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  51. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  52. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  53. package/src/__tests__/checker.test.ts +10 -7
  54. package/src/__tests__/chrome-cdp.test.ts +57 -17
  55. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  56. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  57. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  58. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  59. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  60. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  61. package/src/__tests__/config-watcher.test.ts +1 -5
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  63. package/src/__tests__/connection-policy.test.ts +3 -62
  64. package/src/__tests__/contacts-tools.test.ts +0 -2
  65. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  66. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  67. package/src/__tests__/context-window-manager.test.ts +220 -61
  68. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  69. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  70. package/src/__tests__/conversation-pairing.test.ts +14 -14
  71. package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
  72. package/src/__tests__/conversation-store.test.ts +2 -2
  73. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  74. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  75. package/src/__tests__/credential-security-invariants.test.ts +9 -16
  76. package/src/__tests__/credentials-cli.test.ts +49 -5
  77. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  78. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  79. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  80. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  81. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  82. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  83. package/src/__tests__/email-cli.test.ts +12 -12
  84. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  86. package/src/__tests__/event-bus.test.ts +0 -1
  87. package/src/__tests__/followup-tools.test.ts +0 -2
  88. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  89. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  90. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  91. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  92. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  93. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  94. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  95. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  96. package/src/__tests__/guardian-action-store.test.ts +2 -2
  97. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  98. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  99. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  100. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  101. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  102. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  103. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  104. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  105. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  106. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  107. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  108. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  109. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  110. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  111. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  112. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  113. package/src/__tests__/heartbeat-service.test.ts +1 -1
  114. package/src/__tests__/home-base-bootstrap.test.ts +0 -2
  115. package/src/__tests__/host-shell-tool.test.ts +3 -12
  116. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  117. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  118. package/src/__tests__/integration-status.test.ts +8 -8
  119. package/src/__tests__/intent-routing.test.ts +9 -13
  120. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  121. package/src/__tests__/invite-routes-http.test.ts +10 -10
  122. package/src/__tests__/llm-usage-store.test.ts +45 -9
  123. package/src/__tests__/local-gateway-health.test.ts +209 -0
  124. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  125. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  126. package/src/__tests__/managed-store.test.ts +29 -12
  127. package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
  128. package/src/__tests__/mcp-cli.test.ts +1 -1
  129. package/src/__tests__/mcp-health-check.test.ts +1 -1
  130. package/src/__tests__/media-generate-image.test.ts +1 -1
  131. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  132. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  133. package/src/__tests__/memory-regressions.test.ts +1 -166
  134. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  135. package/src/__tests__/migration-export-http.test.ts +2 -2
  136. package/src/__tests__/migration-transport.test.ts +44 -0
  137. package/src/__tests__/non-member-access-request.test.ts +49 -36
  138. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  139. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  140. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  141. package/src/__tests__/notification-deep-link.test.ts +3 -3
  142. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  143. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  144. package/src/__tests__/oauth-cli.test.ts +1 -1
  145. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  146. package/src/__tests__/onboarding-template-contract.test.ts +2 -2
  147. package/src/__tests__/platform.test.ts +168 -5
  148. package/src/__tests__/playbook-execution.test.ts +0 -2
  149. package/src/__tests__/playbook-tools.test.ts +0 -2
  150. package/src/__tests__/pricing.test.ts +125 -0
  151. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  152. package/src/__tests__/recording-handler.test.ts +46 -80
  153. package/src/__tests__/recording-state-machine.test.ts +112 -183
  154. package/src/__tests__/registry.test.ts +1 -1
  155. package/src/__tests__/relay-server.test.ts +69 -71
  156. package/src/__tests__/reminder-store.test.ts +3 -3
  157. package/src/__tests__/request-file-tool.test.ts +2 -2
  158. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  159. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  160. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  162. package/src/__tests__/schedule-store.test.ts +13 -4
  163. package/src/__tests__/schedule-tools.test.ts +0 -2
  164. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  165. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  168. package/src/__tests__/secret-response-routing.test.ts +1 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  170. package/src/__tests__/sequence-store.test.ts +0 -2
  171. package/src/__tests__/server-history-render.test.ts +2 -199
  172. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  173. package/src/__tests__/session-agent-loop.test.ts +107 -3
  174. package/src/__tests__/session-confirmation-signals.test.ts +10 -4
  175. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  176. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  177. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  178. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  179. package/src/__tests__/session-profile-injection.test.ts +9 -3
  180. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  181. package/src/__tests__/session-queue.test.ts +10 -4
  182. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  183. package/src/__tests__/session-skill-tools.test.ts +2 -3
  184. package/src/__tests__/session-slash-known.test.ts +11 -4
  185. package/src/__tests__/session-slash-queue.test.ts +11 -4
  186. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  187. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  188. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  189. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  190. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  191. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  192. package/src/__tests__/session-usage.test.ts +180 -0
  193. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  194. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  195. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  196. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  197. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  198. package/src/__tests__/skill-include-graph.test.ts +1 -0
  199. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  200. package/src/__tests__/skill-load-tool.test.ts +90 -12
  201. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  202. package/src/__tests__/skills-uninstall.test.ts +131 -0
  203. package/src/__tests__/skills.test.ts +32 -16
  204. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  205. package/src/__tests__/slack-channel-config.test.ts +71 -12
  206. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  207. package/src/__tests__/slack-share-routes.test.ts +1 -1
  208. package/src/__tests__/slack-skill.test.ts +2 -2
  209. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  210. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  211. package/src/__tests__/starter-task-flow.test.ts +1 -1
  212. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  213. package/src/__tests__/subagent-tools.test.ts +2 -2
  214. package/src/__tests__/system-prompt.test.ts +4 -8
  215. package/src/__tests__/task-compiler.test.ts +0 -2
  216. package/src/__tests__/task-management-tools.test.ts +0 -2
  217. package/src/__tests__/task-runner.test.ts +0 -2
  218. package/src/__tests__/task-scheduler.test.ts +2 -2
  219. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  220. package/src/__tests__/terminal-tools.test.ts +1 -11
  221. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  222. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  223. package/src/__tests__/tool-executor.test.ts +2 -2
  224. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  225. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  226. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  227. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  228. package/src/__tests__/trace-emitter.test.ts +1 -1
  229. package/src/__tests__/trust-context-guards.test.ts +1 -1
  230. package/src/__tests__/trust-store.test.ts +44 -395
  231. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  232. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  233. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  234. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  235. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  236. package/src/__tests__/twilio-config.test.ts +11 -2
  237. package/src/__tests__/twilio-provider.test.ts +6 -4
  238. package/src/__tests__/twilio-routes.test.ts +408 -86
  239. package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
  240. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  241. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  242. package/src/__tests__/update-bulletin.test.ts +4 -8
  243. package/src/__tests__/update-template-contract.test.ts +1 -1
  244. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  245. package/src/__tests__/usage-routes.test.ts +23 -5
  246. package/src/__tests__/user-reference.test.ts +1 -1
  247. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  248. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  249. package/src/__tests__/view-image-tool.test.ts +0 -2
  250. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  251. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  252. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  253. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  254. package/src/__tests__/workspace-policy.test.ts +1 -1
  255. package/src/approvals/AGENTS.md +4 -4
  256. package/src/approvals/approval-primitive.ts +2 -2
  257. package/src/approvals/guardian-decision-primitive.ts +1 -1
  258. package/src/approvals/guardian-request-resolvers.ts +3 -4
  259. package/src/bundler/app-bundler.ts +29 -217
  260. package/src/bundler/app-compiler.ts +131 -103
  261. package/src/bundler/compiler-tools.ts +248 -0
  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} +12 -17
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +116 -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} +263 -16
  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/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  316. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  317. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  318. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  319. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  320. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  321. package/src/cli/commands/twitter/router.ts +396 -0
  322. package/src/cli/commands/twitter/session.ts +121 -0
  323. package/src/cli/db.ts +1 -0
  324. package/src/cli/http-client.ts +87 -0
  325. package/src/cli/logger.ts +6 -0
  326. package/src/cli/main-screen.tsx +4 -3
  327. package/src/cli/output.ts +19 -0
  328. package/src/cli/program.ts +29 -27
  329. package/src/cli/reference.ts +27 -37
  330. package/src/cli.ts +452 -240
  331. package/src/config/assistant-feature-flags.ts +3 -15
  332. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  333. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  334. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  335. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  336. package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
  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 +87 -229
  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 -11
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  350. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  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 +56 -14
  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 +0 -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 +233 -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 +110 -96
  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 +168 -55
  452. package/src/daemon/main.ts +1 -0
  453. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  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 +29 -13
  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 +1 -0
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  462. package/src/daemon/providers-setup.ts +0 -5
  463. package/src/daemon/recording-executor.ts +0 -7
  464. package/src/daemon/ride-shotgun-handler.ts +9 -13
  465. package/src/daemon/server.ts +136 -510
  466. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  467. package/src/daemon/session-agent-loop.ts +86 -24
  468. package/src/daemon/session-attachments.ts +1 -1
  469. package/src/daemon/session-error.ts +1 -1
  470. package/src/daemon/session-history.ts +20 -15
  471. package/src/daemon/session-lifecycle.ts +9 -7
  472. package/src/daemon/session-memory.ts +15 -1
  473. package/src/daemon/session-messaging.ts +10 -6
  474. package/src/daemon/session-notifiers.ts +10 -8
  475. package/src/daemon/session-process.ts +34 -25
  476. package/src/daemon/session-queue-manager.ts +1 -1
  477. package/src/daemon/session-runtime-assembly.ts +6 -25
  478. package/src/daemon/session-surfaces.ts +2 -2
  479. package/src/daemon/session-tool-setup.ts +1 -1
  480. package/src/daemon/session-usage.ts +119 -18
  481. package/src/daemon/session.ts +13 -9
  482. package/src/daemon/tool-side-effects.ts +6 -5
  483. package/src/daemon/trace-emitter.ts +1 -1
  484. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  485. package/src/daemon/watch-handler.ts +2 -5
  486. package/src/email/service.ts +8 -8
  487. package/src/events/domain-events.ts +0 -1
  488. package/src/events/tool-notification-listener.ts +1 -1
  489. package/src/followups/followup-store.ts +1 -2
  490. package/src/followups/types.ts +0 -6
  491. package/src/heartbeat/heartbeat-service.ts +1 -1
  492. package/src/inbound/platform-callback-registration.ts +1 -1
  493. package/src/inbound/public-ingress-urls.ts +0 -8
  494. package/src/index.ts +12 -0
  495. package/src/mcp/client.ts +1 -1
  496. package/src/mcp/manager.ts +1 -1
  497. package/src/memory/app-store.ts +1 -42
  498. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  499. package/src/memory/conversation-attention-store.ts +154 -0
  500. package/src/memory/conversation-bootstrap.ts +1 -1
  501. package/src/memory/conversation-crud.ts +53 -1
  502. package/src/memory/conversation-display-order-migration.ts +2 -3
  503. package/src/memory/conversation-queries.ts +1 -29
  504. package/src/memory/conversation-title-service.ts +26 -21
  505. package/src/memory/db-connection.ts +1 -8
  506. package/src/memory/db-init.ts +20 -0
  507. package/src/memory/delivery-crud.ts +4 -34
  508. package/src/memory/external-conversation-store.ts +1 -1
  509. package/src/memory/format-recall.ts +47 -0
  510. package/src/memory/guardian-action-store.ts +4 -5
  511. package/src/memory/guardian-rate-limits.ts +0 -3
  512. package/src/memory/invite-store.ts +1 -1
  513. package/src/memory/job-handlers/backfill.ts +9 -2
  514. package/src/memory/job-handlers/extraction.ts +2 -7
  515. package/src/memory/job-handlers/summarization.ts +1 -1
  516. package/src/memory/llm-usage-store.ts +11 -0
  517. package/src/memory/migrations/114-notifications.ts +12 -40
  518. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  519. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  520. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  521. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  522. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  523. package/src/memory/migrations/index.ts +5 -0
  524. package/src/memory/migrations/registry.ts +30 -0
  525. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  526. package/src/memory/retriever.test.ts +707 -0
  527. package/src/memory/retriever.ts +120 -116
  528. package/src/memory/schema/calls.ts +3 -7
  529. package/src/memory/schema/guardian.ts +2 -2
  530. package/src/memory/search/lexical.ts +4 -1
  531. package/src/memory/search/query-expansion.test.ts +70 -0
  532. package/src/memory/search/query-expansion.ts +118 -0
  533. package/src/memory/search/types.ts +18 -17
  534. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  535. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  536. package/src/messaging/registry.ts +0 -1
  537. package/src/notifications/README.md +13 -22
  538. package/src/notifications/adapters/macos.ts +1 -1
  539. package/src/notifications/conversation-pairing.ts +2 -2
  540. package/src/notifications/copy-composer.ts +2 -2
  541. package/src/notifications/decision-engine.ts +1 -10
  542. package/src/notifications/destination-resolver.ts +2 -3
  543. package/src/notifications/emit-signal.ts +2 -8
  544. package/src/notifications/guardian-question-mode.ts +5 -8
  545. package/src/notifications/signal.ts +1 -2
  546. package/src/notifications/types.ts +1 -1
  547. package/src/oauth/token-persistence.ts +25 -1
  548. package/src/permissions/checker.ts +4 -29
  549. package/src/permissions/defaults.ts +6 -6
  550. package/src/permissions/prompter.ts +1 -1
  551. package/src/permissions/secret-prompter.ts +1 -1
  552. package/src/permissions/shell-identity.ts +1 -1
  553. package/src/permissions/trust-store.ts +13 -76
  554. package/src/permissions/workspace-policy.ts +1 -1
  555. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  556. package/src/{config → prompts}/system-prompt.ts +40 -21
  557. package/src/runtime/AGENTS.md +6 -8
  558. package/src/runtime/access-request-helper.ts +36 -55
  559. package/src/runtime/actor-trust-resolver.ts +1 -24
  560. package/src/runtime/approval-message-composer.ts +6 -2
  561. package/src/runtime/assistant-event.ts +1 -1
  562. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  563. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  564. package/src/runtime/auth/route-policy.ts +140 -24
  565. package/src/runtime/auth/subject.ts +9 -0
  566. package/src/runtime/auth/token-service.ts +11 -0
  567. package/src/runtime/auth/types.ts +1 -1
  568. package/src/runtime/channel-approval-types.ts +1 -1
  569. package/src/runtime/channel-approvals.ts +1 -1
  570. package/src/runtime/channel-invite-transport.ts +0 -2
  571. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  572. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  573. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  574. package/src/runtime/channel-readiness-service.ts +24 -159
  575. package/src/runtime/channel-readiness-types.ts +5 -1
  576. package/src/runtime/channel-reply-delivery.ts +43 -3
  577. package/src/runtime/channel-retry-sweep.ts +14 -22
  578. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  579. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  580. package/src/runtime/gateway-client.ts +12 -15
  581. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  582. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  583. package/src/runtime/guardian-action-message-composer.ts +4 -4
  584. package/src/runtime/guardian-reply-router.ts +3 -3
  585. package/src/runtime/http-server.ts +133 -24
  586. package/src/runtime/http-types.ts +34 -1
  587. package/src/runtime/invite-instruction-generator.ts +1 -3
  588. package/src/runtime/invite-redemption-service.ts +5 -5
  589. package/src/runtime/invite-service.ts +7 -7
  590. package/src/runtime/local-actor-identity.ts +28 -2
  591. package/src/runtime/local-gateway-health.ts +275 -0
  592. package/src/runtime/middleware/twilio-validation.ts +3 -3
  593. package/src/runtime/migrations/migration-transport.ts +18 -3
  594. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  595. package/src/runtime/nl-approval-parser.ts +2 -3
  596. package/src/runtime/routes/access-request-decision.ts +2 -2
  597. package/src/runtime/routes/app-management-routes.ts +921 -0
  598. package/src/runtime/routes/approval-routes.ts +76 -7
  599. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  600. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  601. package/src/runtime/routes/channel-route-shared.ts +1 -3
  602. package/src/runtime/routes/channel-routes.ts +1 -4
  603. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  604. package/src/runtime/routes/computer-use-routes.ts +595 -0
  605. package/src/runtime/routes/contact-routes.ts +1 -317
  606. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  607. package/src/runtime/routes/conversation-routes.ts +11 -18
  608. package/src/runtime/routes/debug-routes.ts +1 -1
  609. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  610. package/src/runtime/routes/documents-routes.ts +227 -0
  611. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  612. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  613. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  614. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  615. package/src/runtime/routes/inbound-conversation.ts +3 -10
  616. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  617. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  618. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  619. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  620. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  622. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  623. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  624. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  625. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  626. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  627. package/src/runtime/routes/integrations/telegram.ts +111 -0
  628. package/src/runtime/routes/integrations/twilio.ts +451 -0
  629. package/src/runtime/routes/invite-routes.ts +2 -2
  630. package/src/runtime/routes/pairing-routes.ts +1 -1
  631. package/src/runtime/routes/recording-routes.ts +332 -0
  632. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  633. package/src/runtime/routes/session-management-routes.ts +167 -0
  634. package/src/runtime/routes/session-query-routes.ts +204 -0
  635. package/src/runtime/routes/settings-routes.ts +977 -0
  636. package/src/runtime/routes/skills-routes.ts +266 -0
  637. package/src/runtime/routes/subagents-routes.ts +246 -0
  638. package/src/runtime/routes/surface-action-routes.ts +100 -10
  639. package/src/runtime/routes/surface-content-routes.ts +1 -1
  640. package/src/runtime/routes/work-items-routes.ts +809 -0
  641. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  642. package/src/runtime/routes/workspace-routes.ts +410 -0
  643. package/src/runtime/routes/workspace-utils.ts +88 -0
  644. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  645. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  646. package/src/runtime/tool-grant-request-helper.ts +1 -2
  647. package/src/runtime/trust-context-resolver.ts +0 -1
  648. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  649. package/src/runtime/verification-rate-limiter.ts +2 -2
  650. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  651. package/src/schedule/integration-status.ts +2 -2
  652. package/src/schedule/schedule-store.ts +7 -9
  653. package/src/sequence/engine.ts +1 -1
  654. package/src/skills/active-skill-tools.ts +0 -8
  655. package/src/skills/clawhub.ts +1 -10
  656. package/src/skills/managed-store.ts +14 -4
  657. package/src/skills/slash-commands.ts +1 -1
  658. package/src/subagent/manager.ts +1 -1
  659. package/src/subagent/types.ts +1 -1
  660. package/src/tasks/SPEC.md +10 -10
  661. package/src/tasks/task-scheduler.ts +1 -1
  662. package/src/telegram/bot-username.ts +13 -0
  663. package/src/tools/assets/materialize.ts +1 -1
  664. package/src/tools/assets/search.ts +1 -1
  665. package/src/tools/browser/browser-execution.ts +2 -2
  666. package/src/tools/browser/browser-manager.ts +88 -11
  667. package/src/tools/browser/browser-screencast.ts +1 -1
  668. package/src/tools/browser/headless-browser.ts +0 -17
  669. package/src/tools/browser/jit-auth.ts +1 -1
  670. package/src/tools/browser/recording-store.ts +19 -1
  671. package/src/tools/browser/runtime-check.ts +4 -2
  672. package/src/tools/calls/call-start.ts +3 -3
  673. package/src/tools/credentials/metadata-store.ts +0 -13
  674. package/src/tools/credentials/vault.ts +7 -31
  675. package/src/tools/followups/followup_create.ts +0 -8
  676. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  677. package/src/tools/memory/definitions.ts +32 -10
  678. package/src/tools/memory/handlers.test.ts +573 -0
  679. package/src/tools/memory/handlers.ts +222 -65
  680. package/src/tools/memory/register.ts +53 -24
  681. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  682. package/src/tools/schedule/update.ts +0 -8
  683. package/src/tools/skills/load.ts +3 -3
  684. package/src/tools/subagent/read.ts +1 -1
  685. package/src/tools/system/voice-config.ts +2 -14
  686. package/src/tools/terminal/safe-env.ts +5 -18
  687. package/src/tools/tool-approval-handler.ts +4 -4
  688. package/src/tools/tool-manifest.ts +4 -2
  689. package/src/tools/types.ts +1 -1
  690. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  691. package/src/twitter/platform-proxy-client.ts +405 -0
  692. package/src/usage/types.ts +21 -0
  693. package/src/util/canonicalize-identity.ts +2 -6
  694. package/src/util/cookie-session.ts +35 -51
  695. package/src/util/platform.ts +93 -86
  696. package/src/util/pricing.ts +180 -43
  697. package/src/work-items/work-item-runner.ts +1 -1
  698. package/scripts/ipc/check-contract-inventory.ts +0 -107
  699. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  700. package/scripts/ipc/generate-swift.ts +0 -528
  701. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  702. package/src/__tests__/app-migration.test.ts +0 -148
  703. package/src/__tests__/config-loader-migration.test.ts +0 -85
  704. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  705. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  706. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  707. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  708. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  709. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  710. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  711. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  712. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  713. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  714. package/src/__tests__/integrations-cli.test.ts +0 -232
  715. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  716. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  717. package/src/__tests__/ipc-contract.test.ts +0 -76
  718. package/src/__tests__/ipc-protocol.test.ts +0 -120
  719. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  720. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  721. package/src/__tests__/ipc-validate.test.ts +0 -471
  722. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  723. package/src/__tests__/migration-ordering.test.ts +0 -267
  724. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  725. package/src/__tests__/platform-move-helper.test.ts +0 -108
  726. package/src/__tests__/platform-socket-path.test.ts +0 -52
  727. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  728. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  729. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  730. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  731. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  732. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  733. package/src/__tests__/work-item-output.test.ts +0 -150
  734. package/src/amazon/session.ts +0 -58
  735. package/src/cli/channels.ts +0 -51
  736. package/src/cli/influencer.ts +0 -319
  737. package/src/cli/integrations.ts +0 -372
  738. package/src/cli/ipc-client.ts +0 -88
  739. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  740. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  741. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  742. package/src/config/core-schema.ts +0 -434
  743. package/src/config/memory-schema.ts +0 -617
  744. package/src/daemon/auth-manager.ts +0 -106
  745. package/src/daemon/handlers/apps.ts +0 -758
  746. package/src/daemon/handlers/avatar.ts +0 -73
  747. package/src/daemon/handlers/browser.ts +0 -3
  748. package/src/daemon/handlers/computer-use.ts +0 -231
  749. package/src/daemon/handlers/config-dispatch.ts +0 -29
  750. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  751. package/src/daemon/handlers/config-inbox.ts +0 -457
  752. package/src/daemon/handlers/config-integrations.ts +0 -409
  753. package/src/daemon/handlers/config-platform.ts +0 -77
  754. package/src/daemon/handlers/config-slack.ts +0 -41
  755. package/src/daemon/handlers/config-tools.ts +0 -226
  756. package/src/daemon/handlers/config-trust.ts +0 -135
  757. package/src/daemon/handlers/config.ts +0 -64
  758. package/src/daemon/handlers/contacts.ts +0 -193
  759. package/src/daemon/handlers/diagnostics.ts +0 -382
  760. package/src/daemon/handlers/documents.ts +0 -188
  761. package/src/daemon/handlers/guardian-actions.ts +0 -82
  762. package/src/daemon/handlers/home-base.ts +0 -82
  763. package/src/daemon/handlers/index.ts +0 -222
  764. package/src/daemon/handlers/misc.ts +0 -1139
  765. package/src/daemon/handlers/navigate-settings.ts +0 -29
  766. package/src/daemon/handlers/oauth-connect.ts +0 -202
  767. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  768. package/src/daemon/handlers/publish.ts +0 -176
  769. package/src/daemon/handlers/signing.ts +0 -56
  770. package/src/daemon/handlers/subagents.ts +0 -286
  771. package/src/daemon/handlers/twitter-auth.ts +0 -220
  772. package/src/daemon/handlers/work-items.ts +0 -796
  773. package/src/daemon/handlers/workspace-files.ts +0 -84
  774. package/src/daemon/handlers.ts +0 -16
  775. package/src/daemon/ipc-blob-store.ts +0 -246
  776. package/src/daemon/ipc-contract-inventory.json +0 -348
  777. package/src/daemon/ipc-contract-inventory.ts +0 -202
  778. package/src/daemon/ipc-handler.ts +0 -120
  779. package/src/daemon/ipc-protocol.ts +0 -85
  780. package/src/daemon/ipc-validate.ts +0 -254
  781. package/src/memory/app-migration.ts +0 -114
  782. package/src/memory/channel-delivery-store.ts +0 -40
  783. package/src/memory/channel-guardian-store.ts +0 -83
  784. package/src/memory/conversation-store.ts +0 -102
  785. package/src/memory/schema-migration.ts +0 -38
  786. package/src/messaging/providers/sms/adapter.ts +0 -232
  787. package/src/messaging/providers/sms/client.ts +0 -93
  788. package/src/messaging/providers/sms/types.ts +0 -7
  789. package/src/migrations/config-merge.ts +0 -62
  790. package/src/migrations/data-layout.ts +0 -89
  791. package/src/migrations/data-merge.ts +0 -44
  792. package/src/migrations/hooks-merge.ts +0 -118
  793. package/src/migrations/index.ts +0 -6
  794. package/src/migrations/log.ts +0 -28
  795. package/src/migrations/skills-merge.ts +0 -44
  796. package/src/migrations/workspace-layout.ts +0 -94
  797. package/src/notifications/adapters/sms.ts +0 -94
  798. package/src/runtime/channel-approval-parser.ts +0 -123
  799. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  800. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  801. package/src/runtime/routes/integration-routes.ts +0 -381
  802. package/src/runtime/routes/twilio-routes.ts +0 -1251
  803. package/src/twitter/router.ts +0 -131
  804. package/src/twitter/session.ts +0 -54
  805. package/src/watcher/providers/slack.ts +0 -282
  806. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  807. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  808. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  809. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  810. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  811. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  812. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  813. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  814. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  815. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  816. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  829. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  830. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  831. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  832. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  833. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  834. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  835. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  836. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  837. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  838. /package/src/{config → prompts}/templates/USER.md +0 -0
  839. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  840. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  841. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  842. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  843. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -31,7 +31,7 @@ describe("integration-status", () => {
31
31
  { name: "Gmail", category: "email", connected: false },
32
32
  { name: "Twitter", category: "social", connected: false },
33
33
  { name: "Slack", category: "messaging", connected: false },
34
- { name: "SMS", category: "messaging", connected: false },
34
+ { name: "Twilio", category: "telephony", connected: false },
35
35
  { name: "Telegram", category: "messaging", connected: false },
36
36
  ]);
37
37
  });
@@ -66,7 +66,7 @@ describe("integration-status", () => {
66
66
  );
67
67
 
68
68
  expect(connected.map((s: { name: string }) => s.name)).toEqual([
69
- "SMS",
69
+ "Twilio",
70
70
  "Telegram",
71
71
  ]);
72
72
  expect(disconnected.map((s: { name: string }) => s.name)).toEqual([
@@ -76,12 +76,12 @@ describe("integration-status", () => {
76
76
  ]);
77
77
  });
78
78
 
79
- test("SMS disconnected when only account_sid is set (missing auth_token)", () => {
79
+ test("Twilio disconnected when only account_sid is set (missing auth_token)", () => {
80
80
  mockTwilioAccountSid = "sid";
81
81
 
82
82
  const summary = getIntegrationSummary();
83
- const sms = summary.find((s: { name: string }) => s.name === "SMS");
84
- expect(sms?.connected).toBe(false);
83
+ const twilio = summary.find((s: { name: string }) => s.name === "Twilio");
84
+ expect(twilio?.connected).toBe(false);
85
85
  });
86
86
 
87
87
  test("Telegram disconnected when only bot_token is set (missing webhook_secret)", () => {
@@ -104,14 +104,14 @@ describe("integration-status", () => {
104
104
 
105
105
  const result = formatIntegrationSummary();
106
106
  expect(result).toBe(
107
- "Gmail \u2717 | Twitter \u2717 | Slack \u2717 | SMS \u2713 | Telegram \u2713",
107
+ "Gmail \u2717 | Twitter \u2717 | Slack \u2717 | Twilio \u2713 | Telegram \u2713",
108
108
  );
109
109
  });
110
110
 
111
111
  test("all disconnected", () => {
112
112
  const result = formatIntegrationSummary();
113
113
  expect(result).toBe(
114
- "Gmail \u2717 | Twitter \u2717 | Slack \u2717 | SMS \u2717 | Telegram \u2717",
114
+ "Gmail \u2717 | Twitter \u2717 | Slack \u2717 | Twilio \u2717 | Telegram \u2717",
115
115
  );
116
116
  });
117
117
 
@@ -126,7 +126,7 @@ describe("integration-status", () => {
126
126
 
127
127
  const result = formatIntegrationSummary();
128
128
  expect(result).toBe(
129
- "Gmail \u2713 | Twitter \u2713 | Slack \u2713 | SMS \u2713 | Telegram \u2713",
129
+ "Gmail \u2713 | Twitter \u2713 | Slack \u2713 | Twilio \u2713 | Telegram \u2713",
130
130
  );
131
131
  });
132
132
  });
@@ -24,7 +24,7 @@ mock.module("../util/platform.js", () => ({
24
24
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
25
25
  getHistoryPath: () => join(TEST_DIR, "history"),
26
26
  getHooksDir: () => join(TEST_DIR, "hooks"),
27
- getIpcBlobDir: () => join(TEST_DIR, "ipc-blobs"),
27
+
28
28
  getSandboxRootDir: () => join(TEST_DIR, "sandbox"),
29
29
  getSandboxWorkingDir: () => TEST_DIR,
30
30
  getInterfacesDir: () => join(TEST_DIR, "interfaces"),
@@ -34,10 +34,6 @@ mock.module("../util/platform.js", () => ({
34
34
  getPlatformName: () => process.platform,
35
35
  getClipboardCommand: () => null,
36
36
  readSessionToken: () => null,
37
- removeSocketFile: () => {},
38
- migratePath: () => {},
39
- migrateToWorkspaceLayout: () => {},
40
- migrateToDataLayout: () => {},
41
37
  }));
42
38
 
43
39
  const noopLogger = new Proxy({} as Record<string, unknown>, {
@@ -76,7 +72,7 @@ mock.module("../config/loader.js", () => ({
76
72
  }));
77
73
 
78
74
  // ── Import after mocks ───────────────────────────────────────────────
79
- const { buildSystemPrompt } = await import("../config/system-prompt.js");
75
+ const { buildSystemPrompt } = await import("../prompts/system-prompt.js");
80
76
 
81
77
  // Load task_list_add description from the bundled skill TOOLS.json
82
78
  const tasksToolsJson = JSON.parse(
@@ -301,9 +297,10 @@ describe("Guardian verification routing section in system prompt", () => {
301
297
  expect(prompt).toContain("verify guardian");
302
298
  });
303
299
 
304
- test("routing section does not include SMS trigger phrase", () => {
300
+ test("routing section does not include legacy channel trigger phrases", () => {
305
301
  const prompt = buildSystemPrompt();
306
- expect(prompt).not.toContain("set guardian for SMS");
302
+ // Verify no legacy channel trigger phrases remain in the routing section
303
+ expect(prompt).not.toContain("set guardian for");
307
304
  });
308
305
 
309
306
  test('routing section includes trigger phrase "verify my Telegram account"', () => {
@@ -311,9 +308,9 @@ describe("Guardian verification routing section in system prompt", () => {
311
308
  expect(prompt).toContain("verify my Telegram account");
312
309
  });
313
310
 
314
- test('routing section includes trigger phrase "verify voice channel"', () => {
311
+ test('routing section includes trigger phrase "verify phone channel"', () => {
315
312
  const prompt = buildSystemPrompt();
316
- expect(prompt).toContain("verify voice channel");
313
+ expect(prompt).toContain("verify phone channel");
317
314
  });
318
315
 
319
316
  test('routing section includes trigger phrase "verify my phone number"', () => {
@@ -331,13 +328,12 @@ describe("Guardian verification routing section in system prompt", () => {
331
328
  expect(prompt).toContain("guardian-verify-setup");
332
329
  });
333
330
 
334
- test("routing section mentions voice and telegram channels but not sms", () => {
331
+ test("routing section mentions phone and telegram channels but not legacy channels", () => {
335
332
  const prompt = buildSystemPrompt();
336
333
  const routingStart = prompt.indexOf("## Routing: Guardian Verification");
337
334
  const routingSection = prompt.substring(routingStart, routingStart + 1000);
338
- expect(routingSection).toContain("voice");
335
+ expect(routingSection).toContain("phone");
339
336
  expect(routingSection).toContain("telegram");
340
- expect(routingSection).not.toContain("sms");
341
337
  });
342
338
 
343
339
  test("routing section contains exclusivity wording", () => {
@@ -206,7 +206,7 @@ describe("invite-redemption-service", () => {
206
206
 
207
207
  const outcome = redeemInvite({
208
208
  rawToken,
209
- sourceChannel: "sms",
209
+ sourceChannel: "phone",
210
210
  externalUserId: "user-1",
211
211
  });
212
212
 
@@ -324,7 +324,7 @@ describe("invite-redemption-service", () => {
324
324
  });
325
325
 
326
326
  test("channel enforcement blocks cross-channel redemption (voice invite via slack)", () => {
327
- const { rawToken } = createInvite({ sourceChannel: "voice", maxUses: 1 });
327
+ const { rawToken } = createInvite({ sourceChannel: "phone", maxUses: 1 });
328
328
 
329
329
  const outcome = redeemInvite({
330
330
  rawToken,
@@ -379,9 +379,9 @@ describe("invite-redemption-service", () => {
379
379
  });
380
380
 
381
381
  test("returns channel_mismatch for an active member with a valid token for a different channel", () => {
382
- // Create an invite for SMS
382
+ // Create an invite for voice
383
383
  const { rawToken } = createInvite({
384
- sourceChannel: "sms",
384
+ sourceChannel: "phone",
385
385
  maxUses: 5,
386
386
  });
387
387
 
@@ -299,7 +299,7 @@ describe("voice invite HTTP routes", () => {
299
299
  method: "POST",
300
300
  headers: { "Content-Type": "application/json" },
301
301
  body: JSON.stringify({
302
- sourceChannel: "voice",
302
+ sourceChannel: "phone",
303
303
  expectedExternalUserId: "+15551234567",
304
304
  friendName: "Alice",
305
305
  guardianName: "Bob",
@@ -313,7 +313,7 @@ describe("voice invite HTTP routes", () => {
313
313
  expect(res.status).toBe(201);
314
314
  expect(body.ok).toBe(true);
315
315
  const invite = body.invite as Record<string, unknown>;
316
- expect(invite.sourceChannel).toBe("voice");
316
+ expect(invite.sourceChannel).toBe("phone");
317
317
  // Voice code should be returned (6 digits by default)
318
318
  expect(typeof invite.voiceCode).toBe("string");
319
319
  expect((invite.voiceCode as string).length).toBe(6);
@@ -335,7 +335,7 @@ describe("voice invite HTTP routes", () => {
335
335
  method: "POST",
336
336
  headers: { "Content-Type": "application/json" },
337
337
  body: JSON.stringify({
338
- sourceChannel: "voice",
338
+ sourceChannel: "phone",
339
339
  friendName: "Alice",
340
340
  guardianName: "Bob",
341
341
  }),
@@ -354,7 +354,7 @@ describe("voice invite HTTP routes", () => {
354
354
  method: "POST",
355
355
  headers: { "Content-Type": "application/json" },
356
356
  body: JSON.stringify({
357
- sourceChannel: "voice",
357
+ sourceChannel: "phone",
358
358
  expectedExternalUserId: "not-a-phone-number",
359
359
  friendName: "Alice",
360
360
  guardianName: "Bob",
@@ -374,7 +374,7 @@ describe("voice invite HTTP routes", () => {
374
374
  method: "POST",
375
375
  headers: { "Content-Type": "application/json" },
376
376
  body: JSON.stringify({
377
- sourceChannel: "voice",
377
+ sourceChannel: "phone",
378
378
  expectedExternalUserId: "+15551234567",
379
379
  guardianName: "Bob",
380
380
  }),
@@ -393,7 +393,7 @@ describe("voice invite HTTP routes", () => {
393
393
  method: "POST",
394
394
  headers: { "Content-Type": "application/json" },
395
395
  body: JSON.stringify({
396
- sourceChannel: "voice",
396
+ sourceChannel: "phone",
397
397
  expectedExternalUserId: "+15551234567",
398
398
  friendName: "Alice",
399
399
  }),
@@ -412,7 +412,7 @@ describe("voice invite HTTP routes", () => {
412
412
  method: "POST",
413
413
  headers: { "Content-Type": "application/json" },
414
414
  body: JSON.stringify({
415
- sourceChannel: "voice",
415
+ sourceChannel: "phone",
416
416
  expectedExternalUserId: "+15551234567",
417
417
  friendName: "Alice",
418
418
  guardianName: "Bob",
@@ -435,7 +435,7 @@ describe("voice invite HTTP routes", () => {
435
435
  method: "POST",
436
436
  headers: { "Content-Type": "application/json" },
437
437
  body: JSON.stringify({
438
- sourceChannel: "voice",
438
+ sourceChannel: "phone",
439
439
  expectedExternalUserId: "+15551234567",
440
440
  friendName: "Alice",
441
441
  guardianName: "Bob",
@@ -459,7 +459,7 @@ describe("voice invite HTTP routes", () => {
459
459
  method: "POST",
460
460
  headers: { "Content-Type": "application/json" },
461
461
  body: JSON.stringify({
462
- sourceChannel: "voice",
462
+ sourceChannel: "phone",
463
463
  expectedExternalUserId: "+15551234567",
464
464
  friendName: "Alice",
465
465
  guardianName: "Bob",
@@ -516,7 +516,7 @@ describe("voice invite HTTP routes", () => {
516
516
  method: "POST",
517
517
  headers: { "Content-Type": "application/json" },
518
518
  body: JSON.stringify({
519
- sourceChannel: "voice",
519
+ sourceChannel: "phone",
520
520
  expectedExternalUserId: "+15551234567",
521
521
  friendName: "Alice",
522
522
  guardianName: "Bob",
@@ -284,10 +284,15 @@ describe("getUsageTotals", () => {
284
284
  expect(totals.unpricedEventCount).toBe(0);
285
285
  });
286
286
 
287
- test("sums tokens and cost across priced events", () => {
287
+ test("sums direct input, cache tokens, and cost across priced events", () => {
288
288
  insertEventAt(
289
289
  1000,
290
- { inputTokens: 100, outputTokens: 50 },
290
+ {
291
+ inputTokens: 100,
292
+ outputTokens: 50,
293
+ cacheCreationInputTokens: 25,
294
+ cacheReadInputTokens: 50,
295
+ },
291
296
  {
292
297
  estimatedCostUsd: 0.01,
293
298
  pricingStatus: "priced",
@@ -295,7 +300,12 @@ describe("getUsageTotals", () => {
295
300
  );
296
301
  insertEventAt(
297
302
  2000,
298
- { inputTokens: 200, outputTokens: 100 },
303
+ {
304
+ inputTokens: 200,
305
+ outputTokens: 100,
306
+ cacheCreationInputTokens: 75,
307
+ cacheReadInputTokens: 125,
308
+ },
299
309
  {
300
310
  estimatedCostUsd: 0.02,
301
311
  pricingStatus: "priced",
@@ -305,6 +315,8 @@ describe("getUsageTotals", () => {
305
315
  const totals = getUsageTotals({ from: 0, to: 5000 });
306
316
  expect(totals.totalInputTokens).toBe(300);
307
317
  expect(totals.totalOutputTokens).toBe(150);
318
+ expect(totals.totalCacheCreationTokens).toBe(100);
319
+ expect(totals.totalCacheReadTokens).toBe(175);
308
320
  expect(totals.totalEstimatedCostUsd).toBeCloseTo(0.03);
309
321
  expect(totals.eventCount).toBe(2);
310
322
  expect(totals.pricedEventCount).toBe(2);
@@ -375,14 +387,24 @@ describe("getUsageDayBuckets", () => {
375
387
  expect(buckets).toHaveLength(0);
376
388
  });
377
389
 
378
- test("groups events into correct day buckets", () => {
390
+ test("groups direct input into correct day buckets without double-counting cache tokens", () => {
379
391
  const day1Start = utcMs(2025, 3, 1, 0);
380
392
  const day1Mid = utcMs(2025, 3, 1, 12);
381
393
  const day2Start = utcMs(2025, 3, 2, 6);
382
394
 
383
395
  insertEventAt(day1Start, { inputTokens: 100, outputTokens: 10 });
384
- insertEventAt(day1Mid, { inputTokens: 200, outputTokens: 20 });
385
- insertEventAt(day2Start, { inputTokens: 300, outputTokens: 30 });
396
+ insertEventAt(day1Mid, {
397
+ inputTokens: 200,
398
+ outputTokens: 20,
399
+ cacheCreationInputTokens: 50,
400
+ cacheReadInputTokens: 100,
401
+ });
402
+ insertEventAt(day2Start, {
403
+ inputTokens: 300,
404
+ outputTokens: 30,
405
+ cacheCreationInputTokens: 20,
406
+ cacheReadInputTokens: 30,
407
+ });
386
408
 
387
409
  const buckets = getUsageDayBuckets({
388
410
  from: utcMs(2025, 3, 1),
@@ -463,10 +485,15 @@ describe("getUsageGroupBreakdown", () => {
463
485
  expect(groups).toHaveLength(0);
464
486
  });
465
487
 
466
- test("groups by actor", () => {
488
+ test("groups by actor with direct input and cache totals kept separate", () => {
467
489
  insertEventAt(
468
490
  1000,
469
- { actor: "main_agent", inputTokens: 100 },
491
+ {
492
+ actor: "main_agent",
493
+ inputTokens: 100,
494
+ cacheCreationInputTokens: 30,
495
+ cacheReadInputTokens: 50,
496
+ },
470
497
  {
471
498
  estimatedCostUsd: 0.01,
472
499
  pricingStatus: "priced",
@@ -474,7 +501,12 @@ describe("getUsageGroupBreakdown", () => {
474
501
  );
475
502
  insertEventAt(
476
503
  2000,
477
- { actor: "main_agent", inputTokens: 200 },
504
+ {
505
+ actor: "main_agent",
506
+ inputTokens: 200,
507
+ cacheCreationInputTokens: 20,
508
+ cacheReadInputTokens: 25,
509
+ },
478
510
  {
479
511
  estimatedCostUsd: 0.02,
480
512
  pricingStatus: "priced",
@@ -495,11 +527,15 @@ describe("getUsageGroupBreakdown", () => {
495
527
  // Ordered by cost descending
496
528
  expect(groups[0].group).toBe("main_agent");
497
529
  expect(groups[0].totalInputTokens).toBe(300);
530
+ expect(groups[0].totalCacheCreationTokens).toBe(50);
531
+ expect(groups[0].totalCacheReadTokens).toBe(75);
498
532
  expect(groups[0].totalEstimatedCostUsd).toBeCloseTo(0.03);
499
533
  expect(groups[0].eventCount).toBe(2);
500
534
 
501
535
  expect(groups[1].group).toBe("title_generator");
502
536
  expect(groups[1].totalInputTokens).toBe(50);
537
+ expect(groups[1].totalCacheCreationTokens).toBe(0);
538
+ expect(groups[1].totalCacheReadTokens).toBe(0);
503
539
  expect(groups[1].eventCount).toBe(1);
504
540
  });
505
541
 
@@ -0,0 +1,209 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+
3
+ let mockGatewayInternalBaseUrl = "http://127.0.0.1:7830";
4
+ let mockIsContainerized = false;
5
+ let mockLockfile: Record<string, unknown> | null = null;
6
+ let mockBaseDataDir: string | undefined;
7
+
8
+ mock.module("../config/env.js", () => ({
9
+ getGatewayInternalBaseUrl: () => mockGatewayInternalBaseUrl,
10
+ }));
11
+
12
+ mock.module("../config/env-registry.js", () => ({
13
+ getIsContainerized: () => mockIsContainerized,
14
+ getBaseDataDir: () => mockBaseDataDir,
15
+ }));
16
+
17
+ mock.module("../util/platform.js", () => ({
18
+ readLockfile: () => mockLockfile,
19
+ }));
20
+
21
+ import {
22
+ ensureLocalGatewayReady,
23
+ probeLocalGatewayHealth,
24
+ } from "../runtime/local-gateway-health.js";
25
+
26
+ describe("local gateway health", () => {
27
+ beforeEach(() => {
28
+ mockGatewayInternalBaseUrl = "http://127.0.0.1:7830";
29
+ mockIsContainerized = false;
30
+ mockBaseDataDir = undefined;
31
+ mockLockfile = {
32
+ assistants: [
33
+ {
34
+ assistantId: "local-dev",
35
+ cloud: "local",
36
+ hatchedAt: "2026-03-07T00:00:00.000Z",
37
+ },
38
+ ],
39
+ };
40
+ });
41
+
42
+ test("probeLocalGatewayHealth returns healthy result when /healthz succeeds", async () => {
43
+ const requests: string[] = [];
44
+ const fetchImpl: typeof fetch = (async (
45
+ input: string | URL | Request,
46
+ ): Promise<Response> => {
47
+ requests.push(
48
+ typeof input === "string"
49
+ ? input
50
+ : input instanceof URL
51
+ ? input.toString()
52
+ : input.url,
53
+ );
54
+ return new Response("ok", { status: 200 });
55
+ }) as unknown as typeof fetch;
56
+
57
+ const result = await probeLocalGatewayHealth({
58
+ fetchImpl,
59
+ timeoutMs: 50,
60
+ });
61
+
62
+ expect(requests).toEqual(["http://127.0.0.1:7830/healthz"]);
63
+ expect(result).toEqual({
64
+ target: "http://127.0.0.1:7830",
65
+ healthy: true,
66
+ localDeployment: true,
67
+ });
68
+ });
69
+
70
+ test("probeLocalGatewayHealth returns an unhealthy result when /healthz fails", async () => {
71
+ const fetchImpl: typeof fetch = (async (): Promise<Response> => {
72
+ return new Response("unavailable", { status: 503 });
73
+ }) as unknown as typeof fetch;
74
+
75
+ const result = await probeLocalGatewayHealth({
76
+ fetchImpl,
77
+ timeoutMs: 50,
78
+ });
79
+
80
+ expect(result).toEqual({
81
+ target: "http://127.0.0.1:7830",
82
+ healthy: false,
83
+ localDeployment: true,
84
+ error: "Gateway health check returned HTTP 503",
85
+ });
86
+ });
87
+
88
+ test("ensureLocalGatewayReady runs recovery for local assistants until the gateway becomes healthy", async () => {
89
+ const healthStatuses = [503, 503, 200];
90
+ const fetchImpl: typeof fetch = (async (): Promise<Response> => {
91
+ const status = healthStatuses.shift() ?? 200;
92
+ return new Response(status === 200 ? "ok" : "unavailable", { status });
93
+ }) as unknown as typeof fetch;
94
+
95
+ const wakeCalls: number[] = [];
96
+ const result = await ensureLocalGatewayReady({
97
+ fetchImpl,
98
+ timeoutMs: 50,
99
+ pollTimeoutMs: 100,
100
+ pollIntervalMs: 0,
101
+ sleepImpl: async () => {},
102
+ runWakeCommand: async () => {
103
+ wakeCalls.push(Date.now());
104
+ return { exitCode: 0, stdout: "Wake complete.", stderr: "" };
105
+ },
106
+ });
107
+
108
+ expect(wakeCalls).toHaveLength(1);
109
+ expect(result).toEqual({
110
+ target: "http://127.0.0.1:7830",
111
+ healthy: true,
112
+ localDeployment: true,
113
+ recovered: true,
114
+ recoveryAttempted: true,
115
+ recoverySkipped: false,
116
+ });
117
+ });
118
+
119
+ test("ensureLocalGatewayReady skips recovery for non-local assistants", async () => {
120
+ mockLockfile = {
121
+ assistants: [
122
+ {
123
+ assistantId: "remote-prod",
124
+ cloud: "gcp",
125
+ hatchedAt: "2026-03-07T00:00:00.000Z",
126
+ },
127
+ ],
128
+ };
129
+
130
+ const fetchImpl: typeof fetch = (async (): Promise<Response> => {
131
+ return new Response("unavailable", { status: 503 });
132
+ }) as unknown as typeof fetch;
133
+
134
+ let wakeCallCount = 0;
135
+ const result = await ensureLocalGatewayReady({
136
+ fetchImpl,
137
+ timeoutMs: 50,
138
+ runWakeCommand: async () => {
139
+ wakeCallCount++;
140
+ return { exitCode: 0, stdout: "", stderr: "" };
141
+ },
142
+ });
143
+
144
+ expect(wakeCallCount).toBe(0);
145
+ expect(result).toEqual({
146
+ target: "http://127.0.0.1:7830",
147
+ healthy: false,
148
+ localDeployment: false,
149
+ error: "Gateway health check returned HTTP 503",
150
+ recovered: false,
151
+ recoveryAttempted: false,
152
+ recoverySkipped: true,
153
+ });
154
+ });
155
+
156
+ test("ensureLocalGatewayReady derives assistant name from BASE_DATA_DIR when lockfile lacks assistants", async () => {
157
+ mockBaseDataDir = "/home/user/.local/share/vellum/assistants/alice";
158
+ mockLockfile = null;
159
+
160
+ const healthStatuses = [503, 200];
161
+ const fetchImpl: typeof fetch = (async (): Promise<Response> => {
162
+ const status = healthStatuses.shift() ?? 200;
163
+ return new Response(status === 200 ? "ok" : "unavailable", { status });
164
+ }) as unknown as typeof fetch;
165
+
166
+ let wakeCalled = false;
167
+ const result = await ensureLocalGatewayReady({
168
+ fetchImpl,
169
+ timeoutMs: 50,
170
+ pollTimeoutMs: 100,
171
+ pollIntervalMs: 0,
172
+ sleepImpl: async () => {},
173
+ runWakeCommand: async () => {
174
+ wakeCalled = true;
175
+ return { exitCode: 0, stdout: "Wake complete.", stderr: "" };
176
+ },
177
+ });
178
+
179
+ expect(wakeCalled).toBe(true);
180
+ expect(result.recovered).toBe(true);
181
+ });
182
+
183
+ test("ensureLocalGatewayReady handles BASE_DATA_DIR with trailing slash", async () => {
184
+ mockBaseDataDir = "/home/user/.local/share/vellum/assistants/alice/";
185
+ mockLockfile = null;
186
+
187
+ const healthStatuses = [503, 200];
188
+ const fetchImpl: typeof fetch = (async (): Promise<Response> => {
189
+ const status = healthStatuses.shift() ?? 200;
190
+ return new Response(status === 200 ? "ok" : "unavailable", { status });
191
+ }) as unknown as typeof fetch;
192
+
193
+ let wakeCalled = false;
194
+ const result = await ensureLocalGatewayReady({
195
+ fetchImpl,
196
+ timeoutMs: 50,
197
+ pollTimeoutMs: 100,
198
+ pollIntervalMs: 0,
199
+ sleepImpl: async () => {},
200
+ runWakeCommand: async () => {
201
+ wakeCalled = true;
202
+ return { exitCode: 0, stdout: "Wake complete.", stderr: "" };
203
+ },
204
+ });
205
+
206
+ expect(wakeCalled).toBe(true);
207
+ expect(result.recovered).toBe(true);
208
+ });
209
+ });
@@ -36,13 +36,16 @@ mock.module("../util/logger.js", () => ({
36
36
 
37
37
  // Mock global fetch
38
38
  let lastFetchArgs: [string, RequestInit] | null = null;
39
- let fetchResponse: { ok: boolean; status: number; json: () => Promise<unknown> } = {
39
+ let fetchResponse: {
40
+ ok: boolean;
41
+ status: number;
42
+ json: () => Promise<unknown>;
43
+ } = {
40
44
  ok: true,
41
45
  status: 200,
42
46
  json: async () => ({}),
43
47
  };
44
48
 
45
- const originalFetch = globalThis.fetch;
46
49
  globalThis.fetch = (async (url: string, init: RequestInit) => {
47
50
  lastFetchArgs = [url, init];
48
51
  return fetchResponse;
@@ -50,15 +53,14 @@ globalThis.fetch = (async (url: string, init: RequestInit) => {
50
53
 
51
54
  // Import after mocking
52
55
  import {
53
- isManagedAvailable,
54
- generateManagedAvatar,
55
- getAssistantApiKey,
56
- } from "../media/managed-avatar-client.js";
57
- import {
58
- ManagedAvatarError,
59
- AVATAR_PROMPT_MAX_LENGTH,
60
56
  AVATAR_MAX_DECODED_BYTES,
57
+ AVATAR_PROMPT_MAX_LENGTH,
58
+ ManagedAvatarError,
61
59
  } from "../media/avatar-types.js";
60
+ import {
61
+ generateManagedAvatar,
62
+ isManagedAvailable,
63
+ } from "../media/managed-avatar-client.js";
62
64
 
63
65
  // ---------------------------------------------------------------------------
64
66
  // Helpers
@@ -195,7 +197,10 @@ describe("generateManagedAvatar", () => {
195
197
  status: 200,
196
198
  json: async () => ({
197
199
  ...successResponse(),
198
- image: { ...successResponse().image, bytes: AVATAR_MAX_DECODED_BYTES + 1 },
200
+ image: {
201
+ ...successResponse().image,
202
+ bytes: AVATAR_MAX_DECODED_BYTES + 1,
203
+ },
199
204
  }),
200
205
  };
201
206
 
@@ -213,13 +218,19 @@ describe("generateManagedAvatar", () => {
213
218
  test("response with oversized base64 estimated decoded size throws validation error", async () => {
214
219
  // Create a base64 string whose estimated decoded size exceeds the limit,
215
220
  // even though the server-reported bytes field is under the limit
216
- const oversizedBase64 = "A".repeat(Math.ceil((AVATAR_MAX_DECODED_BYTES + 100) * 4 / 3));
221
+ const oversizedBase64 = "A".repeat(
222
+ Math.ceil(((AVATAR_MAX_DECODED_BYTES + 100) * 4) / 3),
223
+ );
217
224
  fetchResponse = {
218
225
  ok: true,
219
226
  status: 200,
220
227
  json: async () => ({
221
228
  ...successResponse(),
222
- image: { ...successResponse().image, data_base64: oversizedBase64, bytes: 1024 },
229
+ image: {
230
+ ...successResponse().image,
231
+ data_base64: oversizedBase64,
232
+ bytes: 1024,
233
+ },
223
234
  }),
224
235
  };
225
236
 
@@ -42,7 +42,6 @@ mock.module("../util/platform.js", () => ({
42
42
  isWindows: () => process.platform === "win32",
43
43
  getPlatformName: () => process.platform,
44
44
  getClipboardCommand: () => null,
45
- removeSocketFile: () => {},
46
45
  }));
47
46
 
48
47
  mock.module("../util/logger.js", () => ({
@@ -72,7 +71,7 @@ mock.module("../tools/terminal/sandbox.js", () => ({
72
71
  }));
73
72
 
74
73
  import { loadSkillCatalog } from "../config/skills.js";
75
- import { buildSystemPrompt } from "../config/system-prompt.js";
74
+ import { buildSystemPrompt } from "../prompts/system-prompt.js";
76
75
  import { DeleteManagedSkillTool } from "../tools/skills/delete-managed.js";
77
76
  import { SkillLoadTool } from "../tools/skills/load.js";
78
77
  import { ScaffoldManagedSkillTool } from "../tools/skills/scaffold-managed.js";