@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
@@ -2,7 +2,7 @@ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
- import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
5
+ import { afterEach, describe, expect, mock, test } from "bun:test";
6
6
 
7
7
  import JSZip from "jszip";
8
8
 
@@ -22,7 +22,6 @@ const mockApps = new Map<string, Record<string, unknown>>();
22
22
  mock.module("../memory/app-store.js", () => ({
23
23
  getApp: (id: string) => mockApps.get(id) ?? null,
24
24
  getAppsDir: () => testAppsDir,
25
- isMultifileApp: (app: Record<string, unknown>) => app.formatVersion === 2,
26
25
  }));
27
26
 
28
27
  // Mock content-id to avoid pulling in crypto internals
@@ -35,326 +34,11 @@ mock.module("./bundle-signer.js", () => ({
35
34
  signBundle: async () => ({}),
36
35
  }));
37
36
 
38
- import {
39
- extractRemoteUrls,
40
- materializeAssets,
41
- packageApp,
42
- } from "../bundler/app-bundler.js";
37
+ import { packageApp } from "../bundler/app-bundler.js";
43
38
  import type { AppManifest } from "../bundler/manifest.js";
44
39
 
45
40
  // ---------------------------------------------------------------------------
46
- // extractRemoteUrls
47
- // ---------------------------------------------------------------------------
48
-
49
- describe("extractRemoteUrls", () => {
50
- test("extracts src attributes with double quotes", () => {
51
- const html = '<img src="https://cdn.example.com/logo.png">';
52
- expect(extractRemoteUrls(html)).toEqual([
53
- "https://cdn.example.com/logo.png",
54
- ]);
55
- });
56
-
57
- test("extracts src attributes with single quotes", () => {
58
- const html = "<img src='https://cdn.example.com/logo.png'>";
59
- expect(extractRemoteUrls(html)).toEqual([
60
- "https://cdn.example.com/logo.png",
61
- ]);
62
- });
63
-
64
- test("extracts unquoted src attributes", () => {
65
- const html = "<img src=https://cdn.example.com/logo.png>";
66
- expect(extractRemoteUrls(html)).toEqual([
67
- "https://cdn.example.com/logo.png",
68
- ]);
69
- });
70
-
71
- test("extracts href attributes", () => {
72
- const html =
73
- '<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">';
74
- expect(extractRemoteUrls(html)).toEqual([
75
- "https://fonts.googleapis.com/css?family=Roboto",
76
- ]);
77
- });
78
-
79
- test("extracts CSS url() references with double quotes", () => {
80
- const html =
81
- '<div style="background: url(&quot;https://cdn.example.com/bg.jpg&quot;)"></div>';
82
- // The regex matches url("...") literally, not HTML entities
83
- expect(extractRemoteUrls(html)).toEqual([]);
84
-
85
- // With actual quotes in a <style> block
86
- const html2 =
87
- '<style>body { background: url("https://cdn.example.com/bg.jpg"); }</style>';
88
- expect(extractRemoteUrls(html2)).toEqual([
89
- "https://cdn.example.com/bg.jpg",
90
- ]);
91
- });
92
-
93
- test("extracts CSS url() references with single quotes", () => {
94
- const html =
95
- "<style>body { background: url('https://cdn.example.com/bg.jpg'); }</style>";
96
- expect(extractRemoteUrls(html)).toEqual(["https://cdn.example.com/bg.jpg"]);
97
- });
98
-
99
- test("extracts CSS url() references without quotes", () => {
100
- const html =
101
- "<style>body { background: url(https://cdn.example.com/bg.jpg); }</style>";
102
- expect(extractRemoteUrls(html)).toEqual(["https://cdn.example.com/bg.jpg"]);
103
- });
104
-
105
- test("ignores relative URLs", () => {
106
- const html = '<img src="images/logo.png"><link href="./style.css">';
107
- expect(extractRemoteUrls(html)).toEqual([]);
108
- });
109
-
110
- test("ignores data URIs", () => {
111
- const html = '<img src="data:image/png;base64,iVBORw0KGgo=">';
112
- expect(extractRemoteUrls(html)).toEqual([]);
113
- });
114
-
115
- test("deduplicates identical URLs", () => {
116
- const html = `
117
- <img src="https://cdn.example.com/logo.png">
118
- <img src="https://cdn.example.com/logo.png">
119
- `;
120
- expect(extractRemoteUrls(html)).toEqual([
121
- "https://cdn.example.com/logo.png",
122
- ]);
123
- });
124
-
125
- test("extracts multiple different URLs", () => {
126
- const html = `
127
- <img src="https://cdn.example.com/logo.png">
128
- <link href="https://fonts.example.com/style.css">
129
- <script src="https://cdn.example.com/app.js"></script>
130
- `;
131
- const urls = extractRemoteUrls(html);
132
- expect(urls).toHaveLength(3);
133
- expect(urls).toContain("https://cdn.example.com/logo.png");
134
- expect(urls).toContain("https://fonts.example.com/style.css");
135
- expect(urls).toContain("https://cdn.example.com/app.js");
136
- });
137
-
138
- test("returns empty array for HTML with no remote URLs", () => {
139
- const html = "<html><body><p>Hello World</p></body></html>";
140
- expect(extractRemoteUrls(html)).toEqual([]);
141
- });
142
-
143
- test("handles mixed src, href, and url() in a single document", () => {
144
- const html = `
145
- <link href="https://example.com/a.css">
146
- <img src="https://example.com/b.png">
147
- <style>div { background: url(https://example.com/c.jpg); }</style>
148
- `;
149
- const urls = extractRemoteUrls(html);
150
- expect(urls).toHaveLength(3);
151
- });
152
-
153
- test("handles HTTP (not just HTTPS)", () => {
154
- const html = '<img src="http://cdn.example.com/legacy.png">';
155
- expect(extractRemoteUrls(html)).toEqual([
156
- "http://cdn.example.com/legacy.png",
157
- ]);
158
- });
159
- });
160
-
161
- // ---------------------------------------------------------------------------
162
- // materializeAssets
163
- // ---------------------------------------------------------------------------
164
-
165
- describe("materializeAssets", () => {
166
- let originalFetch: typeof globalThis.fetch;
167
-
168
- beforeEach(() => {
169
- originalFetch = globalThis.fetch;
170
- });
171
-
172
- afterEach(() => {
173
- globalThis.fetch = originalFetch;
174
- });
175
-
176
- test("returns unchanged HTML when there are no remote URLs", async () => {
177
- const html = "<html><body>No remote assets</body></html>";
178
- const result = await materializeAssets(html);
179
- expect(result.rewrittenHtml).toBe(html);
180
- expect(result.assets).toEqual([]);
181
- });
182
-
183
- test("fetches remote assets and rewrites URLs", async () => {
184
- const imageUrl = "https://cdn.example.com/image.png";
185
- const imageData = Buffer.from("fake-image-data");
186
-
187
- globalThis.fetch = mock((url: string) => {
188
- if (url === imageUrl) {
189
- return Promise.resolve(new Response(imageData, { status: 200 }));
190
- }
191
- return Promise.resolve(new Response(null, { status: 404 }));
192
- }) as unknown as typeof fetch;
193
-
194
- const html = `<img src="${imageUrl}">`;
195
- const result = await materializeAssets(html);
196
-
197
- expect(result.rewrittenHtml).toBe('<img src="assets/e724846245db.png">');
198
- expect(result.assets).toHaveLength(1);
199
- expect(result.assets[0].archivePath).toBe("assets/e724846245db.png");
200
- expect(result.assets[0].data).toEqual(imageData);
201
- });
202
-
203
- test("handles multiple distinct assets", async () => {
204
- const urls = [
205
- "https://cdn.example.com/a.png",
206
- "https://cdn.example.com/b.css",
207
- "https://cdn.example.com/c.js",
208
- ];
209
-
210
- globalThis.fetch = mock((url: string) => {
211
- return Promise.resolve(
212
- new Response(Buffer.from(`data-for-${url}`), { status: 200 }),
213
- );
214
- }) as unknown as typeof fetch;
215
-
216
- const html = `
217
- <img src="${urls[0]}">
218
- <link href="${urls[1]}">
219
- <script src="${urls[2]}"></script>
220
- `;
221
- const result = await materializeAssets(html);
222
-
223
- expect(result.assets).toHaveLength(3);
224
-
225
- const expectedFilenames: Record<string, string> = {
226
- "https://cdn.example.com/a.png": "6155f67efa62.png",
227
- "https://cdn.example.com/b.css": "5e6d8d571910.css",
228
- "https://cdn.example.com/c.js": "20fb1ea9b4c9.js",
229
- };
230
- for (const url of urls) {
231
- expect(result.rewrittenHtml).toContain(
232
- `assets/${expectedFilenames[url]}`,
233
- );
234
- expect(result.rewrittenHtml).not.toContain(url);
235
- }
236
- });
237
-
238
- test("keeps original URL when fetch returns non-OK status", async () => {
239
- const imageUrl = "https://cdn.example.com/missing.png";
240
-
241
- globalThis.fetch = mock(() => {
242
- return Promise.resolve(new Response(null, { status: 404 }));
243
- }) as unknown as typeof fetch;
244
-
245
- const html = `<img src="${imageUrl}">`;
246
- const result = await materializeAssets(html);
247
-
248
- expect(result.rewrittenHtml).toBe(html);
249
- expect(result.assets).toEqual([]);
250
- });
251
-
252
- test("keeps original URL when fetch throws (network error)", async () => {
253
- const imageUrl = "https://cdn.example.com/unreachable.png";
254
-
255
- globalThis.fetch = mock(() => {
256
- return Promise.reject(new Error("Network error"));
257
- }) as unknown as typeof fetch;
258
-
259
- const html = `<img src="${imageUrl}">`;
260
- const result = await materializeAssets(html);
261
-
262
- expect(result.rewrittenHtml).toBe(html);
263
- expect(result.assets).toEqual([]);
264
- });
265
-
266
- test("partially succeeds: fetched assets are rewritten, failed ones remain", async () => {
267
- const goodUrl = "https://cdn.example.com/good.png";
268
- const badUrl = "https://cdn.example.com/bad.png";
269
-
270
- globalThis.fetch = mock((url: string) => {
271
- if (url === goodUrl) {
272
- return Promise.resolve(
273
- new Response(Buffer.from("good-data"), { status: 200 }),
274
- );
275
- }
276
- return Promise.resolve(new Response(null, { status: 500 }));
277
- }) as unknown as typeof fetch;
278
-
279
- const html = `<img src="${goodUrl}"><img src="${badUrl}">`;
280
- const result = await materializeAssets(html);
281
-
282
- expect(result.rewrittenHtml).toContain("assets/691e2a787421.png");
283
- expect(result.rewrittenHtml).toContain(badUrl);
284
- expect(result.assets).toHaveLength(1);
285
- });
286
-
287
- test("deduplicates same URL appearing multiple times in HTML", async () => {
288
- const imageUrl = "https://cdn.example.com/icon.png";
289
- let fetchCount = 0;
290
-
291
- globalThis.fetch = mock(() => {
292
- fetchCount++;
293
- return Promise.resolve(
294
- new Response(Buffer.from("icon-data"), { status: 200 }),
295
- );
296
- }) as unknown as typeof fetch;
297
-
298
- const html = `<img src="${imageUrl}"><div style="background: url(${imageUrl})"></div>`;
299
- const result = await materializeAssets(html);
300
-
301
- // Should only fetch once since extractRemoteUrls deduplicates
302
- expect(fetchCount).toBe(1);
303
- expect(result.assets).toHaveLength(1);
304
-
305
- // Both occurrences should be rewritten
306
- expect(result.rewrittenHtml).not.toContain(imageUrl);
307
- const matches = result.rewrittenHtml.match(/assets\/2f7fc0f99275\.png/g);
308
- expect(matches).toHaveLength(2);
309
- });
310
-
311
- test("preserves file extensions in asset filenames", async () => {
312
- const pngUrl = "https://cdn.example.com/image.png";
313
- const cssUrl = "https://cdn.example.com/style.css";
314
- const noExtUrl = "https://cdn.example.com/api/data";
315
-
316
- globalThis.fetch = mock(() => {
317
- return Promise.resolve(
318
- new Response(Buffer.from("data"), { status: 200 }),
319
- );
320
- }) as unknown as typeof fetch;
321
-
322
- const html = `<img src="${pngUrl}"><link href="${cssUrl}"><img src="${noExtUrl}">`;
323
- const result = await materializeAssets(html);
324
-
325
- expect(result.assets).toHaveLength(3);
326
-
327
- const pngAsset = result.assets.find((a) => a.archivePath.endsWith(".png"));
328
- const cssAsset = result.assets.find((a) => a.archivePath.endsWith(".css"));
329
- const noExtAsset = result.assets.find(
330
- (a) => !a.archivePath.endsWith(".png") && !a.archivePath.endsWith(".css"),
331
- );
332
-
333
- expect(pngAsset).toBeDefined();
334
- expect(cssAsset).toBeDefined();
335
- expect(noExtAsset).toBeDefined();
336
- });
337
-
338
- test("rewrites CSS url() references alongside src/href", async () => {
339
- const cssUrl = "https://cdn.example.com/bg.jpg";
340
-
341
- globalThis.fetch = mock(() => {
342
- return Promise.resolve(
343
- new Response(Buffer.from("jpg-data"), { status: 200 }),
344
- );
345
- }) as unknown as typeof fetch;
346
-
347
- const html =
348
- '<style>body { background: url("https://cdn.example.com/bg.jpg"); }</style>';
349
- const result = await materializeAssets(html);
350
-
351
- expect(result.rewrittenHtml).toContain("assets/8550eecd4975.jpg");
352
- expect(result.rewrittenHtml).not.toContain(cssUrl);
353
- });
354
- });
355
-
356
- // ---------------------------------------------------------------------------
357
- // packageApp — multifile apps
41
+ // packageApp
358
42
  // ---------------------------------------------------------------------------
359
43
 
360
44
  describe("packageApp", () => {
@@ -368,10 +52,10 @@ describe("packageApp", () => {
368
52
  });
369
53
 
370
54
  /**
371
- * Helper: set up a fake multifile app on disk with src/ and dist/ dirs
372
- * so that compileApp (which we mock below) can pretend to succeed.
55
+ * Helper: set up a fake app on disk with src/ and dist/ dirs
56
+ * so that compileApp can succeed.
373
57
  */
374
- function setupMultifileApp(appId: string, opts?: { withCss?: boolean }) {
58
+ function setupApp(appId: string, opts?: { withCss?: boolean }) {
375
59
  const appDir = join(testAppsDir, appId);
376
60
  const srcDir = join(appDir, "src");
377
61
  mkdirSync(srcDir, { recursive: true });
@@ -394,7 +78,7 @@ describe("packageApp", () => {
394
78
  // Write the app JSON (getApp reads from {appsDir}/{id}.json)
395
79
  const appDef = {
396
80
  id: appId,
397
- name: "Test Multifile App",
81
+ name: "Test App",
398
82
  description: "A test app",
399
83
  schemaJson: "{}",
400
84
  htmlDefinition: "<unused>",
@@ -408,26 +92,9 @@ describe("packageApp", () => {
408
92
  return appDef;
409
93
  }
410
94
 
411
- function setupLegacyApp(appId: string) {
412
- const appDir = join(testAppsDir, appId);
413
- mkdirSync(appDir, { recursive: true });
414
-
415
- const appDef = {
416
- id: appId,
417
- name: "Test Legacy App",
418
- schemaJson: "{}",
419
- htmlDefinition: "<html><body>Hello legacy</body></html>",
420
- createdAt: Date.now(),
421
- updatedAt: Date.now(),
422
- };
423
- writeFileSync(join(testAppsDir, `${appId}.json`), JSON.stringify(appDef));
424
- mockApps.set(appId, appDef);
425
- return appDef;
426
- }
427
-
428
- test("packages a multifile app with compiled dist/ files in the zip", async () => {
95
+ test("packages an app with compiled dist/ files in the zip", async () => {
429
96
  const appId = "multi-test-1";
430
- setupMultifileApp(appId, { withCss: true });
97
+ setupApp(appId, { withCss: true });
431
98
 
432
99
  const result = await packageApp(appId);
433
100
  const zipData = await readFile(result.bundlePath);
@@ -452,9 +119,9 @@ describe("packageApp", () => {
452
119
  expect(cssContent).toContain("margin");
453
120
  });
454
121
 
455
- test("sets format_version to 2 in manifest for multifile apps", async () => {
122
+ test("sets format_version to 2 in manifest", async () => {
456
123
  const appId = "multi-test-2";
457
- setupMultifileApp(appId);
124
+ setupApp(appId);
458
125
 
459
126
  const result = await packageApp(appId);
460
127
  const zipData = await readFile(result.bundlePath);
@@ -465,7 +132,7 @@ describe("packageApp", () => {
465
132
 
466
133
  expect(manifest.format_version).toBe(2);
467
134
  expect(manifest.entry).toBe("index.html");
468
- expect(manifest.name).toBe("Test Multifile App");
135
+ expect(manifest.name).toBe("Test App");
469
136
  });
470
137
 
471
138
  test("compile failure produces a clear error", async () => {
@@ -498,30 +165,9 @@ describe("packageApp", () => {
498
165
  );
499
166
  });
500
167
 
501
- test("legacy app packaging remains unchanged (format_version 1)", async () => {
502
- const appId = "legacy-test-1";
503
- setupLegacyApp(appId);
504
-
505
- const result = await packageApp(appId);
506
- const zipData = await readFile(result.bundlePath);
507
- const zip = await JSZip.loadAsync(zipData);
508
-
509
- const manifestJson = await zip.file("manifest.json")!.async("string");
510
- const manifest: AppManifest = JSON.parse(manifestJson);
511
-
512
- expect(manifest.format_version).toBe(1);
513
-
514
- // Legacy app should have index.html with the original content
515
- const indexContent = await zip.file("index.html")!.async("string");
516
- expect(indexContent).toContain("Hello legacy");
517
-
518
- // Should NOT have main.js (not a compiled app)
519
- expect(zip.file("main.js")).toBeNull();
520
- });
521
-
522
- test("multifile app without CSS omits main.css from zip", async () => {
168
+ test("app without CSS omits main.css from zip", async () => {
523
169
  const appId = "multi-no-css";
524
- setupMultifileApp(appId, { withCss: false });
170
+ setupApp(appId, { withCss: false });
525
171
 
526
172
  const result = await packageApp(appId);
527
173
  const zipData = await readFile(result.bundlePath);
@@ -196,7 +196,6 @@ console.log("styled");`,
196
196
 
197
197
  expect(result.ok).toBe(false);
198
198
  expect(result.errors.length).toBeGreaterThan(0);
199
- expect(result.errors[0].text).toContain("not in the allowed list");
200
199
  expect(result.errors[0].text).toContain("left-pad");
201
200
  });
202
201
 
@@ -1,4 +1,13 @@
1
- import { describe, expect, test } from "bun:test";
1
+ import { describe, expect, mock, test } from "bun:test";
2
+
3
+ mock.module("../bundler/app-compiler.js", () => ({
4
+ compileApp: async () => ({
5
+ ok: true,
6
+ errors: [],
7
+ warnings: [],
8
+ durationMs: 0,
9
+ }),
10
+ }));
2
11
 
3
12
  import type { AppDefinition } from "../memory/app-store.js";
4
13
  import type { AppStore } from "../tools/apps/executors.js";
@@ -14,7 +14,7 @@ import { join } from "path";
14
14
  const SCANNED_FILES = [
15
15
  "runtime/channel-approvals.ts",
16
16
  "runtime/routes/channel-routes.ts",
17
- "runtime/channel-guardian-service.ts",
17
+ "runtime/channel-verification-service.ts",
18
18
  ];
19
19
 
20
20
  const BANNED_PATTERNS: { pattern: RegExp; description: string }[] = [
@@ -15,8 +15,6 @@ mock.module("../util/platform.js", () => ({
15
15
  getDbPath: () => join(testDir, "test.db"),
16
16
  getLogPath: () => join(testDir, "test.log"),
17
17
  ensureDataDir: () => {},
18
- migrateToDataLayout: () => {},
19
- migrateToWorkspaceLayout: () => {},
20
18
  }));
21
19
 
22
20
  mock.module("../util/logger.js", () => ({
@@ -146,7 +144,7 @@ describe("approval-primitive / mintGrantFromDecision", () => {
146
144
  callSessionId: "call-1",
147
145
  requesterExternalUserId: "user-1",
148
146
  guardianExternalUserId: "guardian-1",
149
- executionChannel: "voice",
147
+ executionChannel: "phone",
150
148
  }),
151
149
  );
152
150
  expect(result.ok).toBe(true);
@@ -155,7 +153,7 @@ describe("approval-primitive / mintGrantFromDecision", () => {
155
153
  expect(result.grant.callSessionId).toBe("call-1");
156
154
  expect(result.grant.requesterExternalUserId).toBe("user-1");
157
155
  expect(result.grant.guardianExternalUserId).toBe("guardian-1");
158
- expect(result.grant.executionChannel).toBe("voice");
156
+ expect(result.grant.executionChannel).toBe("phone");
159
157
  });
160
158
  });
161
159
 
@@ -9,7 +9,7 @@ import { tmpdir } from "node:os";
9
9
  import { join } from "node:path";
10
10
  import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
11
11
 
12
- import type { ServerMessage } from "../daemon/ipc-protocol.js";
12
+ import type { ServerMessage } from "../daemon/message-protocol.js";
13
13
  import type { Session } from "../daemon/session.js";
14
14
 
15
15
  const testDir = realpathSync(
@@ -44,10 +44,7 @@ import {
44
44
  linkAttachmentToMessage,
45
45
  uploadAttachment,
46
46
  } from "../memory/attachments-store.js";
47
- import {
48
- addMessage,
49
- createConversation,
50
- } from "../memory/conversation-store.js";
47
+ import { addMessage, createConversation } from "../memory/conversation-crud.js";
51
48
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
52
49
  import { assetMaterializeTool } from "../tools/assets/materialize.js";
53
50
  import type { ToolContext } from "../tools/types.js";
@@ -43,10 +43,7 @@ import {
43
43
  linkAttachmentToMessage,
44
44
  uploadAttachment,
45
45
  } from "../memory/attachments-store.js";
46
- import {
47
- addMessage,
48
- createConversation,
49
- } from "../memory/conversation-store.js";
46
+ import { addMessage, createConversation } from "../memory/conversation-crud.js";
50
47
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
51
48
  import { searchAttachments } from "../tools/assets/search.js";
52
49
  import { assetSearchTool } from "../tools/assets/search.js";
@@ -278,6 +278,29 @@ describe("drainDirectiveDisplayBuffer", () => {
278
278
  expect(result.bufferedRemainder).toBe("");
279
279
  });
280
280
 
281
+ test("inserts space when inline directive is stripped with no surrounding whitespace", () => {
282
+ const input = 'sentence.<vellum-attachment path="out.png" />Next sentence.';
283
+ const result = drainDirectiveDisplayBuffer(input);
284
+ expect(result.emitText).toBe("sentence. Next sentence.");
285
+ expect(result.bufferedRemainder).toBe("");
286
+ });
287
+
288
+ test("does not insert space when stripped directive already has trailing whitespace", () => {
289
+ const input =
290
+ 'sentence. <vellum-attachment path="out.png" />Next sentence.';
291
+ const result = drainDirectiveDisplayBuffer(input);
292
+ expect(result.emitText).toBe("sentence. Next sentence.");
293
+ expect(result.bufferedRemainder).toBe("");
294
+ });
295
+
296
+ test("does not insert space when stripped directive already has leading whitespace on next char", () => {
297
+ const input =
298
+ 'sentence.<vellum-attachment path="out.png" /> Next sentence.';
299
+ const result = drainDirectiveDisplayBuffer(input);
300
+ expect(result.emitText).toBe("sentence. Next sentence.");
301
+ expect(result.bufferedRemainder).toBe("");
302
+ });
303
+
281
304
  test("preserves invalid directives as plain text", () => {
282
305
  const input = 'Bad <vellum-attachment source="bad" path="x.txt" /> tag';
283
306
  const result = drainDirectiveDisplayBuffer(input);
@@ -53,7 +53,7 @@ mock.module("../util/platform.js", () => ({
53
53
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
54
54
  getHistoryPath: () => join(TEST_DIR, "history"),
55
55
  getHooksDir: () => join(TEST_DIR, "hooks"),
56
- getIpcBlobDir: () => join(TEST_DIR, "ipc-blobs"),
56
+
57
57
  getSandboxRootDir: () => join(TEST_DIR, "sandbox"),
58
58
  getSandboxWorkingDir: () => TEST_DIR,
59
59
  getInterfacesDir: () => join(TEST_DIR, "interfaces"),
@@ -63,10 +63,6 @@ mock.module("../util/platform.js", () => ({
63
63
  getPlatformName: () => "linux",
64
64
  getClipboardCommand: () => null,
65
65
  readSessionToken: () => null,
66
- removeSocketFile: () => {},
67
- migratePath: () => {},
68
- migrateToWorkspaceLayout: () => {},
69
- migrateToDataLayout: () => {},
70
66
  }));
71
67
 
72
68
  const noopLogger = new Proxy({} as Record<string, unknown>, {
@@ -98,8 +94,8 @@ mock.module("../config/loader.js", () => ({
98
94
  }));
99
95
 
100
96
  // eslint-disable-next-line @typescript-eslint/no-require-imports
101
- const realUserReference = require("../config/user-reference.js");
102
- mock.module("../config/user-reference.js", () => ({
97
+ const realUserReference = require("../prompts/user-reference.js");
98
+ mock.module("../prompts/user-reference.js", () => ({
103
99
  ...realUserReference,
104
100
  resolveUserReference: () => "TestUser",
105
101
  resolveUserPronouns: () => null,
@@ -112,7 +108,7 @@ mock.module("../tools/credentials/metadata-store.js", () => ({
112
108
  listCredentialMetadata: () => [],
113
109
  }));
114
110
 
115
- const { buildSystemPrompt } = await import("../config/system-prompt.js");
111
+ const { buildSystemPrompt } = await import("../prompts/system-prompt.js");
116
112
  const { isAssistantFeatureFlagEnabled } =
117
113
  await import("../config/assistant-feature-flags.js");
118
114
  const { skillFlagKey } = await import("../config/skill-state.js");
@@ -88,7 +88,7 @@ describe("assistant ID boundary", () => {
88
88
  // should now use DAEMON_INTERNAL_ASSISTANT_ID instead.
89
89
  const daemonScopingFiles = [
90
90
  "runtime/actor-trust-resolver.ts",
91
- "runtime/guardian-outbound-actions.ts",
91
+ "runtime/verification-outbound-actions.ts",
92
92
  "daemon/handlers/config-channels.ts",
93
93
  "runtime/routes/channel-route-shared.ts",
94
94
  "calls/relay-server.ts",
@@ -318,14 +318,14 @@ describe("assistant ID boundary", () => {
318
318
  import.meta.dir,
319
319
  "..",
320
320
  "daemon",
321
- "ipc-contract",
321
+ "message-types",
322
322
  "integrations.ts",
323
323
  );
324
324
  const content = readFileSync(ipcContractPath, "utf-8");
325
325
 
326
326
  // Extract the interface blocks for the request types and verify
327
327
  // none of them declare an assistantId property.
328
- const requestTypeNames = ["GuardianVerificationRequest"];
328
+ const requestTypeNames = ["ChannelVerificationSessionRequest"];
329
329
 
330
330
  for (const typeName of requestTypeNames) {
331
331
  // Find the interface/type block — match from the type name to the next
@@ -376,7 +376,7 @@ describe("assistant ID boundary", () => {
376
376
  import.meta.dir,
377
377
  "..",
378
378
  "runtime",
379
- "guardian-outbound-actions.ts",
379
+ "verification-outbound-actions.ts",
380
380
  );
381
381
  const content = readFileSync(actionsPath, "utf-8");
382
382
 
@@ -390,7 +390,7 @@ describe("assistant ID boundary", () => {
390
390
  const idx = content.indexOf(name);
391
391
  expect(
392
392
  idx,
393
- `Expected to find ${name} in guardian-outbound-actions.ts`,
393
+ `Expected to find ${name} in verification-outbound-actions.ts`,
394
394
  ).toBeGreaterThan(-1);
395
395
 
396
396
  const blockStart = content.indexOf("{", idx);
@@ -50,10 +50,7 @@ import {
50
50
  uploadAttachment,
51
51
  validateAttachmentUpload,
52
52
  } from "../memory/attachments-store.js";
53
- import {
54
- addMessage,
55
- createConversation,
56
- } from "../memory/conversation-store.js";
53
+ import { addMessage, createConversation } from "../memory/conversation-crud.js";
57
54
  import { getDb, initializeDb, resetDb } from "../memory/db.js";
58
55
 
59
56
  initializeDb();