@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2

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 (430) hide show
  1. package/bun.lock +0 -20
  2. package/docs/workspace-tools.md +33 -42
  3. package/eslint-rules/cli-no-daemon-internals.js +0 -6
  4. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
  5. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
  6. package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
  7. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
  8. package/node_modules/@vellumai/service-contracts/package.json +0 -1
  9. package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
  10. package/openapi.yaml +0 -155
  11. package/package.json +1 -4
  12. package/scripts/test.sh +15 -36
  13. package/src/__tests__/actor-token-service.test.ts +14 -36
  14. package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
  15. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
  16. package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
  17. package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
  18. package/src/__tests__/annotate-risk-options.test.ts +0 -2
  19. package/src/__tests__/approval-cascade.test.ts +0 -2
  20. package/src/__tests__/assistant-attachments.test.ts +0 -42
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
  22. package/src/__tests__/btw-routes.test.ts +0 -2
  23. package/src/__tests__/build-persisted-content.test.ts +0 -2
  24. package/src/__tests__/call-controller.test.ts +0 -19
  25. package/src/__tests__/channel-guardian.test.ts +58 -94
  26. package/src/__tests__/channel-reply-delivery.test.ts +0 -2
  27. package/src/__tests__/compaction-events.test.ts +0 -2
  28. package/src/__tests__/compaction.benchmark.test.ts +0 -2
  29. package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
  30. package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
  31. package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
  32. package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
  33. package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
  34. package/src/__tests__/config-loader-backfill.test.ts +10 -123
  35. package/src/__tests__/config-schema.test.ts +0 -1
  36. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
  37. package/src/__tests__/contacts-relay-reads.test.ts +15 -13
  38. package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
  39. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
  40. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
  41. package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
  42. package/src/__tests__/conversation-agent-loop.test.ts +0 -134
  43. package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
  44. package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
  45. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
  46. package/src/__tests__/conversation-history-web-search.test.ts +0 -2
  47. package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
  48. package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
  49. package/src/__tests__/conversation-pairing.test.ts +0 -2
  50. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +0 -2
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
  53. package/src/__tests__/conversation-queue.test.ts +0 -91
  54. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
  56. package/src/__tests__/conversation-slash-queue.test.ts +0 -2
  57. package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
  58. package/src/__tests__/conversation-speed-override.test.ts +0 -2
  59. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
  60. package/src/__tests__/conversation-title-service.test.ts +0 -2
  61. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
  62. package/src/__tests__/conversation-usage.test.ts +0 -2
  63. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
  64. package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
  65. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
  66. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  67. package/src/__tests__/db-migration-rollback.test.ts +171 -205
  68. package/src/__tests__/db-test-helpers.ts +4 -5
  69. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
  70. package/src/__tests__/disk-pressure-guard.test.ts +0 -41
  71. package/src/__tests__/dm-persistence.test.ts +0 -2
  72. package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
  73. package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
  74. package/src/__tests__/exploration-drift-hook.test.ts +2 -3
  75. package/src/__tests__/filing-service.test.ts +0 -2
  76. package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
  77. package/src/__tests__/guardian-dispatch.test.ts +1 -95
  78. package/src/__tests__/guardian-outbound-http.test.ts +0 -13
  79. package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
  80. package/src/__tests__/heartbeat-service.test.ts +0 -2
  81. package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
  82. package/src/__tests__/host-app-control-routes.test.ts +30 -24
  83. package/src/__tests__/host-bash-routes.test.ts +41 -31
  84. package/src/__tests__/host-browser-routes.test.ts +32 -26
  85. package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
  86. package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
  87. package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
  88. package/src/__tests__/http-user-message-parity.test.ts +8 -290
  89. package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
  90. package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
  91. package/src/__tests__/invite-redemption-service.test.ts +0 -198
  92. package/src/__tests__/llm-context-normalization.test.ts +0 -105
  93. package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
  94. package/src/__tests__/llm-usage-store.test.ts +0 -25
  95. package/src/__tests__/mcp-health-check.test.ts +1 -2
  96. package/src/__tests__/media-stream-server-integration.test.ts +0 -127
  97. package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
  98. package/src/__tests__/messaging-send-tool.test.ts +0 -2
  99. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  100. package/src/__tests__/mtime-cache.test.ts +5 -146
  101. package/src/__tests__/native-web-search.test.ts +0 -2
  102. package/src/__tests__/non-member-access-request.test.ts +17 -189
  103. package/src/__tests__/notification-broadcaster.test.ts +0 -4
  104. package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
  105. package/src/__tests__/notification-deep-link.test.ts +0 -6
  106. package/src/__tests__/notification-guardian-path.test.ts +0 -19
  107. package/src/__tests__/openai-provider.test.ts +12 -22
  108. package/src/__tests__/openai-responses-provider.test.ts +2 -12
  109. package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
  110. package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
  111. package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
  112. package/src/__tests__/plugin-bootstrap.test.ts +73 -3
  113. package/src/__tests__/plugin-route-contribution.test.ts +17 -4
  114. package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
  115. package/src/__tests__/plugin-types.test.ts +2 -0
  116. package/src/__tests__/process-message-background-slack.test.ts +0 -2
  117. package/src/__tests__/process-message-display-content.test.ts +0 -2
  118. package/src/__tests__/provider-error-scenarios.test.ts +4 -5
  119. package/src/__tests__/provider-usage-tracking.test.ts +0 -39
  120. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
  121. package/src/__tests__/registry.test.ts +1 -4
  122. package/src/__tests__/relay-server.test.ts +25 -694
  123. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
  124. package/src/__tests__/secret-ingress-http.test.ts +0 -14
  125. package/src/__tests__/send-endpoint-busy.test.ts +8 -30
  126. package/src/__tests__/skills.test.ts +0 -44
  127. package/src/__tests__/slack-inbound-verification.test.ts +2 -47
  128. package/src/__tests__/stt-hints.test.ts +13 -44
  129. package/src/__tests__/subagent-detail.test.ts +0 -27
  130. package/src/__tests__/subagent-disposal.test.ts +0 -65
  131. package/src/__tests__/subagent-notify-parent.test.ts +0 -2
  132. package/src/__tests__/subagent-role-registry.test.ts +2 -7
  133. package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
  134. package/src/__tests__/subagent-tools.test.ts +0 -2
  135. package/src/__tests__/suggestion-routes.test.ts +0 -2
  136. package/src/__tests__/title-generate-hook.test.ts +0 -2
  137. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
  138. package/src/__tests__/tool-executor.test.ts +11 -16
  139. package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
  140. package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
  141. package/src/__tests__/tool-start-timestamp.test.ts +0 -2
  142. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
  143. package/src/__tests__/twilio-routes.test.ts +0 -96
  144. package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
  145. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  146. package/src/__tests__/voice-invite-redemption.test.ts +0 -33
  147. package/src/__tests__/web-search-backend-failure.test.ts +0 -2
  148. package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
  149. package/src/__tests__/workspace-tool-loader.test.ts +2 -195
  150. package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
  151. package/src/agent/loop.ts +0 -56
  152. package/src/api/index.ts +1 -19
  153. package/src/api/responses/llm-request-log-entry.ts +0 -29
  154. package/src/api/responses/subagent-detail.ts +0 -17
  155. package/src/api/surfaces.ts +3 -39
  156. package/src/approvals/guardian-request-resolvers.ts +11 -1
  157. package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
  158. package/src/calls/call-domain.ts +3 -3
  159. package/src/calls/guardian-dispatch.ts +8 -10
  160. package/src/calls/inbound-trust-reader.ts +1 -17
  161. package/src/calls/media-stream-server.ts +0 -21
  162. package/src/calls/relay-server.ts +50 -167
  163. package/src/calls/relay-setup-router.ts +7 -37
  164. package/src/calls/relay-verification.ts +4 -4
  165. package/src/calls/stt-hints.ts +12 -9
  166. package/src/calls/twilio-routes.ts +4 -14
  167. package/src/channels/types.ts +20 -10
  168. package/src/cli/commands/__tests__/cache.test.ts +1 -8
  169. package/src/cli/commands/cache.ts +181 -194
  170. package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
  171. package/src/cli/commands/db/status.ts +1 -37
  172. package/src/cli/commands/mcp.ts +218 -252
  173. package/src/cli/commands/memory/index.ts +0 -2
  174. package/src/cli/commands/plugins.ts +3 -75
  175. package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
  176. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
  177. package/src/cli/lib/list-installed-plugins.ts +1 -179
  178. package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
  179. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
  180. package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
  181. package/src/config/bundled-skills/subagent/SKILL.md +1 -1
  182. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  183. package/src/config/feature-flag-registry.json +13 -5
  184. package/src/config/loader.ts +5 -38
  185. package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
  186. package/src/config/schemas/memory-lifecycle.ts +0 -12
  187. package/src/config/schemas/memory-v3.ts +0 -7
  188. package/src/config/schemas/memory.ts +0 -4
  189. package/src/config/schemas/timeouts.ts +0 -8
  190. package/src/config/seed-inference-profiles.ts +11 -21
  191. package/src/config/skills.ts +5 -27
  192. package/src/config/sync-gated-profiles.ts +13 -12
  193. package/src/contacts/contacts-write.ts +0 -3
  194. package/src/daemon/assistant-attachments.ts +4 -27
  195. package/src/daemon/conversation-agent-loop.ts +0 -28
  196. package/src/daemon/conversation-process.ts +16 -35
  197. package/src/daemon/conversation-surfaces.ts +38 -111
  198. package/src/daemon/conversation-tool-setup.ts +16 -50
  199. package/src/daemon/conversation.ts +1 -13
  200. package/src/daemon/disk-pressure-guard.ts +2 -12
  201. package/src/daemon/event-loop-watchdog.ts +1 -28
  202. package/src/daemon/external-plugins-bootstrap.ts +34 -4
  203. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
  204. package/src/daemon/handlers/config-a2a.ts +14 -6
  205. package/src/daemon/handlers/config-channels.ts +22 -78
  206. package/src/daemon/handlers/conversations.ts +0 -77
  207. package/src/daemon/lifecycle.ts +0 -4
  208. package/src/daemon/mcp-reload-service.ts +0 -10
  209. package/src/daemon/memory-v2-startup.test.ts +0 -72
  210. package/src/daemon/memory-v2-startup.ts +19 -87
  211. package/src/daemon/message-types/conversations.ts +0 -2
  212. package/src/daemon/message-types/surfaces.ts +12 -12
  213. package/src/daemon/server.ts +4 -0
  214. package/src/daemon/shutdown-handlers.ts +0 -20
  215. package/src/daemon/tool-setup-types.ts +0 -9
  216. package/src/daemon/workspace-tools-watcher.ts +328 -0
  217. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  218. package/src/ipc/assistant-server.ts +2 -2
  219. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  220. package/src/mcp/client.ts +1 -15
  221. package/src/mcp/mcp-auth-orchestrator.ts +1 -6
  222. package/src/mcp/mcp-oauth-provider.ts +8 -19
  223. package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
  224. package/src/memory/conversation-crud.ts +0 -38
  225. package/src/memory/db-connection.ts +3 -22
  226. package/src/memory/db-init.ts +502 -36
  227. package/src/memory/db-singleton.ts +4 -6
  228. package/src/memory/jobs-worker.ts +0 -58
  229. package/src/memory/llm-request-log-store.ts +1 -26
  230. package/src/memory/llm-usage-store.ts +20 -48
  231. package/src/memory/memory-retrospective-job.ts +8 -9
  232. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
  233. package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
  234. package/src/memory/migrations/registry.ts +573 -0
  235. package/src/memory/migrations/run-migrations.ts +6 -90
  236. package/src/memory/migrations/validate-migration-state.ts +66 -101
  237. package/src/memory/schema/conversations.ts +0 -9
  238. package/src/memory/schema/infrastructure.ts +0 -20
  239. package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
  240. package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
  241. package/src/memory/v2/cli-command-store.ts +38 -75
  242. package/src/memory/v2/prompts/consolidation.ts +82 -13
  243. package/src/memory/v2/prompts/router.ts +93 -21
  244. package/src/memory/v2/skill-store.ts +31 -68
  245. package/src/notifications/__tests__/broadcaster.test.ts +8 -16
  246. package/src/notifications/__tests__/decision-engine.test.ts +9 -78
  247. package/src/notifications/broadcaster.ts +1 -8
  248. package/src/notifications/decision-engine.ts +7 -15
  249. package/src/notifications/destination-resolver.ts +24 -68
  250. package/src/notifications/emit-signal.ts +14 -39
  251. package/src/permissions/question-prompter.test.ts +1 -1
  252. package/src/permissions/question-prompter.ts +4 -7
  253. package/src/plugin-api/index.ts +6 -6
  254. package/src/plugin-api/types.ts +5 -3
  255. package/src/plugin-api/vision-support.test.ts +4 -28
  256. package/src/plugin-api/vision-support.ts +31 -66
  257. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
  258. package/src/plugins/defaults/advisor/consult.ts +6 -110
  259. package/src/plugins/defaults/advisor/steering.ts +2 -14
  260. package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
  261. package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
  262. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
  263. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
  264. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
  265. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
  266. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
  267. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
  268. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
  269. package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
  270. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
  271. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
  272. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
  273. package/src/plugins/mtime-cache.ts +291 -76
  274. package/src/plugins/pipeline.ts +13 -111
  275. package/src/plugins/types.ts +2 -0
  276. package/src/providers/anthropic/client.ts +0 -5
  277. package/src/providers/call-site-routing.ts +0 -4
  278. package/src/providers/model-catalog.ts +0 -16
  279. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  280. package/src/providers/openai/chat-completions-provider.ts +83 -37
  281. package/src/providers/openai/responses-provider.ts +46 -50
  282. package/src/providers/openrouter/client.ts +0 -5
  283. package/src/providers/provider-send-message.ts +0 -4
  284. package/src/providers/ratelimit.ts +0 -4
  285. package/src/providers/retry.ts +0 -4
  286. package/src/providers/types.ts +0 -9
  287. package/src/providers/usage-tracking.ts +0 -4
  288. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
  289. package/src/runtime/access-request-helper.ts +39 -19
  290. package/src/runtime/actor-trust-resolver.ts +2 -2
  291. package/src/runtime/assistant-event-hub.ts +1 -1
  292. package/src/runtime/assistant-stream-state.ts +2 -9
  293. package/src/runtime/auth/require-bound-guardian.ts +11 -21
  294. package/src/runtime/channel-verification-service.ts +31 -56
  295. package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
  296. package/src/runtime/guardian-vellum-migration.ts +7 -66
  297. package/src/runtime/invite-redemption-service.ts +187 -198
  298. package/src/runtime/local-actor-identity.ts +11 -76
  299. package/src/runtime/pending-interactions.ts +1 -11
  300. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
  301. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
  302. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
  303. package/src/runtime/routes/browser-routes.ts +1 -1
  304. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
  305. package/src/runtime/routes/channel-verification-routes.ts +3 -3
  306. package/src/runtime/routes/contact-routes.ts +32 -8
  307. package/src/runtime/routes/conversation-cli-routes.ts +5 -4
  308. package/src/runtime/routes/conversation-list-routes.ts +7 -4
  309. package/src/runtime/routes/conversation-query-routes.ts +0 -72
  310. package/src/runtime/routes/conversation-routes.ts +85 -84
  311. package/src/runtime/routes/events-routes.ts +2 -2
  312. package/src/runtime/routes/global-search-routes.ts +1 -3
  313. package/src/runtime/routes/guardian-action-routes.ts +5 -4
  314. package/src/runtime/routes/host-app-control-routes.ts +4 -5
  315. package/src/runtime/routes/host-bash-routes.ts +4 -5
  316. package/src/runtime/routes/host-browser-routes.ts +11 -9
  317. package/src/runtime/routes/host-cu-routes.ts +4 -5
  318. package/src/runtime/routes/host-file-routes.ts +4 -5
  319. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  320. package/src/runtime/routes/http-adapter.ts +1 -1
  321. package/src/runtime/routes/identity-routes.ts +2 -3
  322. package/src/runtime/routes/inbound-message-handler.ts +5 -5
  323. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
  324. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
  325. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
  326. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
  327. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
  328. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
  329. package/src/runtime/routes/index.ts +0 -2
  330. package/src/runtime/routes/llm-context-normalization.ts +0 -83
  331. package/src/runtime/routes/mcp-auth-routes.ts +19 -171
  332. package/src/runtime/routes/migration-rollback-routes.ts +3 -4
  333. package/src/runtime/routes/migration-routes.ts +1 -4
  334. package/src/runtime/routes/subagents-routes.ts +0 -5
  335. package/src/runtime/routes/surface-action-routes.ts +56 -42
  336. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
  337. package/src/runtime/services/conversation-serializer.ts +9 -7
  338. package/src/runtime/tool-grant-request-helper.ts +3 -3
  339. package/src/runtime/trust-verdict-consumer.ts +9 -85
  340. package/src/runtime/verification-outbound-actions.ts +18 -18
  341. package/src/signals/user-message.ts +0 -16
  342. package/src/subagent/manager.ts +0 -9
  343. package/src/subagent/types.ts +3 -3
  344. package/src/telemetry/types.ts +1 -34
  345. package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
  346. package/src/telemetry/usage-telemetry-reporter.ts +3 -87
  347. package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
  348. package/src/tools/ask-question/ask-question-tool.ts +0 -13
  349. package/src/tools/executor.ts +4 -4
  350. package/src/tools/registry.ts +0 -18
  351. package/src/tools/shared/filesystem/path-policy.ts +5 -12
  352. package/src/tools/tool-approval-handler.ts +1 -1
  353. package/src/tools/tool-defaults.ts +2 -9
  354. package/src/tools/tool-manifest.ts +0 -3
  355. package/src/tools/types.ts +2 -17
  356. package/src/tools/workspace-tools/loader.ts +244 -348
  357. package/src/util/errors.ts +1 -26
  358. package/src/util/platform.ts +0 -5
  359. package/src/workflows/library.test.ts +0 -140
  360. package/src/workflows/library.ts +28 -82
  361. package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
  362. package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
  363. package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
  364. package/src/workspace/migrations/registry.ts +0 -2
  365. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
  366. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
  367. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
  368. package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
  369. package/src/__tests__/code-search-tool.test.ts +0 -585
  370. package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
  371. package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
  372. package/src/__tests__/plugin-pipeline.test.ts +0 -96
  373. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
  374. package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
  375. package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
  376. package/src/agent/loop-exclusive-tool.test.ts +0 -150
  377. package/src/api/constants/sse-replay.ts +0 -41
  378. package/src/api/events/conversation-notice.ts +0 -26
  379. package/src/approvals/guardian-channel-delivery.ts +0 -30
  380. package/src/approvals/guardian-expiry-notifier.ts +0 -148
  381. package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
  382. package/src/cli/commands/memory/worker.ts +0 -175
  383. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
  384. package/src/config/prune-seeded-callsite-defaults.ts +0 -110
  385. package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
  386. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
  387. package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
  388. package/src/contacts/guardian-delivery-reader.ts +0 -223
  389. package/src/contacts/member-write-relay.ts +0 -189
  390. package/src/daemon/conversation-notices.ts +0 -60
  391. package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
  392. package/src/hooks/hook-loader.ts +0 -341
  393. package/src/mcp/mcp-header-store.ts +0 -134
  394. package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
  395. package/src/memory/__tests__/prompt-override.test.ts +0 -192
  396. package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
  397. package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
  398. package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
  399. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
  400. package/src/memory/prompt-override.ts +0 -129
  401. package/src/memory/steps.ts +0 -573
  402. package/src/memory/watchdog-events-store.ts +0 -87
  403. package/src/memory/worker-control.ts +0 -118
  404. package/src/memory/worker-process.ts +0 -72
  405. package/src/notifications/__tests__/connected-channels.test.ts +0 -114
  406. package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
  407. package/src/onboarding/checkin-event.test.ts +0 -222
  408. package/src/onboarding/checkin-event.ts +0 -321
  409. package/src/onboarding/schedule-checkin.ts +0 -190
  410. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
  411. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
  412. package/src/plugins/defaults/advisor/context-pack.ts +0 -288
  413. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
  414. package/src/plugins/surface-import.ts +0 -121
  415. package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
  416. package/src/providers/openai/api-error-normalization.ts +0 -270
  417. package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
  418. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
  419. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
  420. package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
  421. package/src/runtime/anchored-guardian.test.ts +0 -156
  422. package/src/runtime/anchored-guardian.ts +0 -135
  423. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
  424. package/src/runtime/local-principal-trust.ts +0 -52
  425. package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
  426. package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
  427. package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
  428. package/src/tools/filesystem/search.ts +0 -543
  429. package/src/util/telemetry-db-path.ts +0 -24
  430. package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
@@ -1,212 +0,0 @@
1
- /**
2
- * Unit tests for the contacts read API.
3
- *
4
- * `handleListContacts`, `handleGetContact`, and the `search_contacts`
5
- * no-filter case relay to the gateway rich read (`contacts_list_rich` /
6
- * `contacts_get_rich`), which is the source of truth for the ACL fields
7
- * (`role`/`status`/`policy`/`verifiedAt`/`interactionCount`/`lastInteraction`).
8
- * These tests assert the serialized response shape is gateway-sourced and
9
- * unchanged for the web client, that no read path falls back to the assistant
10
- * DB, and that a relay failure fails closed (surfaces an error) instead of
11
- * reading local ACL.
12
- */
13
-
14
- import { beforeEach, describe, expect, mock, test } from "bun:test";
15
-
16
- import { IpcCallError } from "@vellumai/gateway-client/ipc-client";
17
-
18
- let ipcCalls: { method: string; params?: Record<string, unknown> }[] = [];
19
- let ipcResult: unknown = {};
20
- let ipcError: Error | undefined;
21
-
22
- const ipcCallPersistentMock = mock(
23
- async (method: string, params?: Record<string, unknown>) => {
24
- ipcCalls.push({ method, params });
25
- if (ipcError) throw ipcError;
26
- return ipcResult;
27
- },
28
- );
29
-
30
- const actualGatewayClient = await import("../../../ipc/gateway-client.js");
31
-
32
- mock.module("../../../ipc/gateway-client.js", () => ({
33
- ...actualGatewayClient,
34
- ipcCallPersistent: ipcCallPersistentMock,
35
- }));
36
-
37
- // Guard: fail loudly if any read path falls back to the assistant DB for ACL
38
- // fields. The relay read paths must source role/status/stats from the gateway.
39
- const actualContactStore = await import("../../../contacts/contact-store.js");
40
-
41
- const contactStoreReadGuard = mock(() => {
42
- throw new Error(
43
- "assistant contact-store read must not happen on the gateway relay path",
44
- );
45
- });
46
-
47
- mock.module("../../../contacts/contact-store.js", () => ({
48
- ...actualContactStore,
49
- getContact: contactStoreReadGuard,
50
- listContacts: contactStoreReadGuard,
51
- getAssistantContactMetadata: contactStoreReadGuard,
52
- }));
53
-
54
- const { handleListContacts, handleGetContact, ROUTES } = await import(
55
- "../contact-routes.js"
56
- );
57
-
58
- const gatewayChannel = {
59
- id: "ch_1",
60
- contactId: "ct_1",
61
- type: "sms",
62
- address: "+15550100",
63
- isPrimary: true,
64
- externalUserId: null,
65
- status: "active",
66
- policy: "allow",
67
- verifiedAt: 1700,
68
- verifiedVia: "invite",
69
- lastSeenAt: 1800,
70
- interactionCount: 7,
71
- lastInteraction: 1900,
72
- revokedReason: null,
73
- blockedReason: null,
74
- };
75
-
76
- const gatewayContact = {
77
- id: "ct_1",
78
- displayName: "Alice",
79
- role: "member",
80
- notes: "a note",
81
- contactType: "human",
82
- lastInteraction: 1900,
83
- interactionCount: 7,
84
- createdAt: 1000,
85
- updatedAt: 1500,
86
- channels: [gatewayChannel],
87
- };
88
-
89
- describe("contacts read API relays from the gateway", () => {
90
- beforeEach(() => {
91
- ipcCalls = [];
92
- ipcResult = {};
93
- ipcError = undefined;
94
- ipcCallPersistentMock.mockClear();
95
- contactStoreReadGuard.mockClear();
96
- });
97
-
98
- test("list relays to contacts_list_rich and serializes the gateway ACL fields", async () => {
99
- ipcResult = { ok: true, contacts: [gatewayContact] };
100
-
101
- const result = await handleListContacts({ limit: "50" });
102
-
103
- expect(ipcCalls).toEqual([
104
- { method: "contacts_list_rich", params: { limit: 50 } },
105
- ]);
106
- expect(result.ok).toBe(true);
107
- expect(result.contacts).toHaveLength(1);
108
-
109
- const [contact] = result.contacts;
110
- // ACL fields are gateway-sourced and reach the web client unchanged.
111
- expect(contact.role).toBe("member");
112
- expect(contact.interactionCount).toBe(7);
113
- expect(contact.lastInteraction).toBe(1900);
114
- const channel = contact.channels[0] as Record<string, unknown>;
115
- expect(channel.status).toBe("active");
116
- expect(channel.policy).toBe("allow");
117
- expect(channel.verifiedAt).toBe(1700);
118
- expect(channel.interactionCount).toBe(7);
119
- expect(channel.lastInteraction).toBe(1900);
120
- // Channel compat echoes address into externalUserId for older clients.
121
- expect(channel.externalUserId).toBe("+15550100");
122
-
123
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
124
- });
125
-
126
- test("list forwards the role filter to the gateway", async () => {
127
- ipcResult = { ok: true, contacts: [] };
128
-
129
- await handleListContacts({ limit: "10", role: "guardian" });
130
-
131
- expect(ipcCalls).toEqual([
132
- {
133
- method: "contacts_list_rich",
134
- params: { limit: 10, role: "guardian" },
135
- },
136
- ]);
137
- });
138
-
139
- test("list fails closed when the gateway relay is unavailable", async () => {
140
- ipcError = new IpcCallError("gateway down", {
141
- statusCode: 503,
142
- errorCode: "UNAVAILABLE",
143
- });
144
-
145
- await expect(handleListContacts({ limit: "50" })).rejects.toMatchObject({
146
- message: "gateway down",
147
- statusCode: 503,
148
- });
149
- // No assistant-DB fallback read.
150
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
151
- });
152
-
153
- test("get relays to contacts_get_rich and serializes the gateway ACL fields", async () => {
154
- ipcResult = { ok: true, contact: gatewayContact };
155
-
156
- const result = await handleGetContact("ct_1");
157
-
158
- expect(ipcCalls).toEqual([
159
- { method: "contacts_get_rich", params: { contactId: "ct_1" } },
160
- ]);
161
- expect(result.ok).toBe(true);
162
- expect(result.contact.role).toBe("member");
163
- expect(result.contact.interactionCount).toBe(7);
164
- const channel = result.contact.channels[0] as Record<string, unknown>;
165
- expect(channel.status).toBe("active");
166
- expect(channel.externalUserId).toBe("+15550100");
167
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
168
- });
169
-
170
- test("get surfaces a clean gateway not-found as a 404", async () => {
171
- ipcResult = { ok: true };
172
-
173
- await expect(handleGetContact("missing")).rejects.toMatchObject({
174
- statusCode: 404,
175
- });
176
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
177
- });
178
-
179
- test("get fails closed on a relay failure (no assistant-DB fallback)", async () => {
180
- ipcError = new IpcCallError("gateway down", {
181
- statusCode: 503,
182
- errorCode: "UNAVAILABLE",
183
- });
184
-
185
- await expect(handleGetContact("ct_1")).rejects.toMatchObject({
186
- message: "gateway down",
187
- statusCode: 503,
188
- });
189
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
190
- });
191
-
192
- test("search no-filter relays to the gateway list read", async () => {
193
- ipcResult = { ok: true, contacts: [gatewayContact] };
194
-
195
- const route = ROUTES.find((r) => r.operationId === "search_contacts");
196
- expect(route).toBeDefined();
197
-
198
- const contacts = (await route!.handler({ body: {} })) as Array<{
199
- role: string;
200
- interactionCount: number;
201
- channels: { status: string }[];
202
- }>;
203
-
204
- expect(ipcCalls).toEqual([
205
- { method: "contacts_list_rich", params: { limit: 50 } },
206
- ]);
207
- expect(contacts[0].role).toBe("member");
208
- expect(contacts[0].interactionCount).toBe(7);
209
- expect(contacts[0].channels[0].status).toBe("active");
210
- expect(contactStoreReadGuard).not.toHaveBeenCalled();
211
- });
212
- });
@@ -1,93 +0,0 @@
1
- /**
2
- * Unit tests for the global-search contacts ordering source.
3
- *
4
- * Recency ordering for contacts surfaces `contacts.updatedAt`, never the
5
- * channel-derived `lastInteraction` column. Daemon-native contact search
6
- * carries no gateway-relayed ContactRead, so `updatedAt` is the deterministic
7
- * ordering key.
8
- */
9
-
10
- import { afterEach, describe, expect, mock, test } from "bun:test";
11
-
12
- import type { ContactWithChannels } from "../../../contacts/types.js";
13
-
14
- let searchContactsResult: ContactWithChannels[] = [];
15
-
16
- const searchContactsMock = mock(() => searchContactsResult);
17
-
18
- const actualContactStore = await import("../../../contacts/contact-store.js");
19
-
20
- mock.module("../../../contacts/contact-store.js", () => ({
21
- ...actualContactStore,
22
- searchContacts: searchContactsMock,
23
- }));
24
-
25
- const { ROUTES } = await import("../global-search-routes.js");
26
-
27
- const handler = ROUTES.find((r) => r.operationId === "search_global")!.handler;
28
-
29
- function makeContact(
30
- overrides: Partial<ContactWithChannels>,
31
- ): ContactWithChannels {
32
- return {
33
- id: "ct_1",
34
- displayName: "Alice",
35
- notes: null,
36
- lastInteraction: null,
37
- interactionCount: 0,
38
- createdAt: 1,
39
- updatedAt: 1,
40
- role: "contact",
41
- contactType: "human",
42
- principalId: null,
43
- userFile: null,
44
- channels: [],
45
- ...overrides,
46
- };
47
- }
48
-
49
- afterEach(() => {
50
- searchContactsResult = [];
51
- searchContactsMock.mockClear();
52
- });
53
-
54
- describe("global-search contacts recency source", () => {
55
- test("surfaces contacts.updatedAt as lastInteraction, not the channel column", async () => {
56
- searchContactsResult = [
57
- makeContact({
58
- id: "ct_1",
59
- displayName: "Alice",
60
- updatedAt: 5000,
61
- lastInteraction: 9999,
62
- }),
63
- ];
64
-
65
- const result = (await handler({
66
- queryParams: { q: "ali", categories: "contacts" },
67
- })) as { results: { contacts: { id: string; lastInteraction: number }[] } };
68
-
69
- expect(result.results.contacts).toHaveLength(1);
70
- expect(result.results.contacts[0].lastInteraction).toBe(5000);
71
- });
72
-
73
- test("preserves searchContacts ordering deterministically", async () => {
74
- searchContactsResult = [
75
- makeContact({ id: "ct_a", displayName: "A", updatedAt: 300 }),
76
- makeContact({ id: "ct_b", displayName: "B", updatedAt: 200 }),
77
- makeContact({ id: "ct_c", displayName: "C", updatedAt: 100 }),
78
- ];
79
-
80
- const result = (await handler({
81
- queryParams: { q: "x", categories: "contacts" },
82
- })) as { results: { contacts: { id: string; lastInteraction: number }[] } };
83
-
84
- expect(result.results.contacts.map((c) => c.id)).toEqual([
85
- "ct_a",
86
- "ct_b",
87
- "ct_c",
88
- ]);
89
- expect(result.results.contacts.map((c) => c.lastInteraction)).toEqual([
90
- 300, 200, 100,
91
- ]);
92
- });
93
- });
@@ -1,86 +0,0 @@
1
- /**
2
- * Route for programmatically scheduling the onboarding "Day 2 Check-in".
3
- *
4
- * POST /v1/onboarding/checkin — resolve the user's Google Calendar, find the
5
- * first open 15-minute slot tomorrow afternoon, and book the check-in event.
6
- *
7
- * Called by the web `/onboarding/research` flow the moment Google Calendar
8
- * OAuth lands. Best-effort by contract: a missing/insufficient calendar
9
- * connection returns `{ scheduled: false }` rather than an error.
10
- */
11
-
12
- import { z } from "zod";
13
-
14
- import { scheduleOnboardingCheckin } from "../../onboarding/schedule-checkin.js";
15
- import { getLogger } from "../../util/logger.js";
16
- import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
17
- import { BadRequestError } from "./errors.js";
18
- import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
19
-
20
- const log = getLogger("onboarding-checkin-routes");
21
-
22
- function asOptionalString(value: unknown, field: string): string | undefined {
23
- if (value === undefined || value === null) return undefined;
24
- if (typeof value !== "string") {
25
- throw new BadRequestError(`${field} must be a string`);
26
- }
27
- const trimmed = value.trim();
28
- return trimmed.length > 0 ? trimmed : undefined;
29
- }
30
-
31
- async function handleScheduleOnboardingCheckin({
32
- body = {},
33
- }: RouteHandlerArgs) {
34
- // The shared route adapter does not runtime-validate the body against the
35
- // Zod requestBody (codegen-only), so guard types before use.
36
- const userName = asOptionalString(body.userName, "userName");
37
- const assistantName = asOptionalString(body.assistantName, "assistantName");
38
- const timeZone = asOptionalString(body.timezone, "timezone");
39
-
40
- const result = await scheduleOnboardingCheckin({
41
- userName,
42
- assistantName,
43
- timeZone,
44
- });
45
-
46
- if (!result.scheduled) {
47
- log.info({ reason: result.reason }, "Onboarding check-in not scheduled");
48
- }
49
- return result;
50
- }
51
-
52
- const RESPONSE_SCHEMA = z.object({
53
- scheduled: z.boolean(),
54
- reason: z.string().optional(),
55
- eventId: z.string().optional(),
56
- htmlLink: z.string().nullable().optional(),
57
- start: z.string().optional(),
58
- end: z.string().optional(),
59
- timeZone: z.string().optional(),
60
- });
61
-
62
- export const ROUTES: RouteDefinition[] = [
63
- {
64
- operationId: "scheduleOnboardingCheckin",
65
- endpoint: "onboarding/checkin",
66
- method: "POST",
67
- policy: {
68
- requiredScopes: ["chat.write"],
69
- allowedPrincipalTypes: ACTOR_PRINCIPALS,
70
- },
71
- summary: "Schedule the onboarding Day 2 check-in",
72
- description:
73
- "Find the first open 15-minute slot between 12pm and 5pm tomorrow " +
74
- "(widening to 8am–8pm if booked) on the user's Google Calendar and " +
75
- "create the Day 2 Check-in event. Best-effort: returns scheduled=false " +
76
- "when no calendar is connected or the calendar scope wasn't granted.",
77
- tags: ["onboarding"],
78
- requestBody: z.object({
79
- userName: z.string().optional(),
80
- assistantName: z.string().optional(),
81
- timezone: z.string().optional(),
82
- }),
83
- responseBody: RESPONSE_SCHEMA,
84
- handler: handleScheduleOnboardingCheckin,
85
- },
86
- ];