@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
@@ -83,42 +83,6 @@ mock.module("../ipc/gateway-client.js", () => ({
83
83
  }),
84
84
  }));
85
85
 
86
- // Guardian-delivery reader mock — the inbound challenge guard reads guardian
87
- // existence from the gateway. Derive the list from the local binding state so
88
- // the gateway-backed presence guard mirrors the DB the rest of the test sets up.
89
- const resolveGuardianList = async (input?: { channelTypes?: string[] }) => {
90
- const { findGuardianForChannel } = await import(
91
- "../contacts/contact-store.js"
92
- );
93
- const channels = input?.channelTypes ?? [];
94
- return channels
95
- .map((channelType) => {
96
- const found = findGuardianForChannel(channelType);
97
- if (!found) return null;
98
- return {
99
- channelType,
100
- contactId: found.contact.id,
101
- principalId: found.contact.principalId ?? null,
102
- displayName: found.contact.displayName ?? null,
103
- address: found.channel.address,
104
- externalChatId: found.channel.externalChatId ?? null,
105
- status: "active",
106
- verifiedAt: found.channel.verifiedAt ?? null,
107
- };
108
- })
109
- .filter((g) => g !== null);
110
- };
111
-
112
- mock.module("../contacts/guardian-delivery-reader.js", () => ({
113
- getGuardianDelivery: resolveGuardianList,
114
- getGuardianDeliveryFresh: resolveGuardianList,
115
- guardianForChannel: (
116
- list: Array<{ channelType: string; status: string }>,
117
- channelType: string,
118
- ) =>
119
- list.find((g) => g.channelType === channelType && g.status === "active"),
120
- }));
121
-
122
86
  import { handleChannelVerificationSession } from "../daemon/handlers/config-channels.js";
123
87
  import type {
124
88
  ChannelVerificationSessionRequest,
@@ -355,12 +319,12 @@ describe("guardian service challenge validation", () => {
355
319
  }
356
320
  });
357
321
 
358
- test("validateAndConsumeVerification does not create a guardian binding (caller responsibility)", async () => {
322
+ test("validateAndConsumeVerification does not create a guardian binding (caller responsibility)", () => {
359
323
  const { secret } = createInboundVerificationSession("telegram");
360
324
 
361
325
  validateAndConsumeVerification("telegram", secret, "user-42", "chat-42");
362
326
 
363
- const binding = await getGuardianBinding("asst-1", "telegram");
327
+ const binding = getGuardianBinding("asst-1", "telegram");
364
328
  expect(binding).toBeNull();
365
329
  });
366
330
 
@@ -432,7 +396,7 @@ describe("guardian service challenge validation", () => {
432
396
  expect(result2.success).toBe(false);
433
397
  });
434
398
 
435
- test("validateAndConsumeVerification succeeds with voice channel", async () => {
399
+ test("validateAndConsumeVerification succeeds with voice channel", () => {
436
400
  const { secret } = createInboundVerificationSession("phone");
437
401
 
438
402
  const result = validateAndConsumeVerification(
@@ -449,7 +413,7 @@ describe("guardian service challenge validation", () => {
449
413
 
450
414
  // validateAndConsumeVerification no longer creates bindings — that is
451
415
  // now handled by the gateway's verification intercepts.
452
- const binding = await getGuardianBinding("asst-1", "phone");
416
+ const binding = getGuardianBinding("asst-1", "phone");
453
417
  expect(binding).toBeNull();
454
418
  });
455
419
 
@@ -485,7 +449,7 @@ describe("guardian service challenge validation", () => {
485
449
  expect(telegramResult.success).toBe(true);
486
450
  });
487
451
 
488
- test("validateAndConsumeVerification succeeds even with existing binding (conflict check is caller responsibility)", async () => {
452
+ test("validateAndConsumeVerification succeeds even with existing binding (conflict check is caller responsibility)", () => {
489
453
  // Create initial guardian binding
490
454
  createGuardianBinding({
491
455
  channel: "telegram",
@@ -494,7 +458,7 @@ describe("guardian service challenge validation", () => {
494
458
  guardianDeliveryChatId: "old-chat",
495
459
  });
496
460
 
497
- const oldBinding = await getGuardianBinding("asst-1", "telegram");
461
+ const oldBinding = getGuardianBinding("asst-1", "telegram");
498
462
  expect(oldBinding).not.toBeNull();
499
463
  expect(oldBinding!.guardianExternalUserId).toBe("old-user");
500
464
 
@@ -509,7 +473,7 @@ describe("guardian service challenge validation", () => {
509
473
  // Challenge validation succeeds — the caller decides how to handle binding conflicts
510
474
  expect(result.success).toBe(true);
511
475
 
512
- const binding = await getGuardianBinding("asst-1", "telegram");
476
+ const binding = getGuardianBinding("asst-1", "telegram");
513
477
  expect(binding).not.toBeNull();
514
478
  expect(binding!.guardianExternalUserId).toBe("old-user");
515
479
  });
@@ -524,7 +488,7 @@ describe("guardian identity check", () => {
524
488
  resetTables();
525
489
  });
526
490
 
527
- test("isGuardian returns true for matching user", async () => {
491
+ test("isGuardian returns true for matching user", () => {
528
492
  createGuardianBinding({
529
493
  channel: "telegram",
530
494
  guardianExternalUserId: "user-42",
@@ -532,10 +496,10 @@ describe("guardian identity check", () => {
532
496
  guardianDeliveryChatId: "chat-42",
533
497
  });
534
498
 
535
- expect(await isGuardian("asst-1", "telegram", "user-42")).toBe(true);
499
+ expect(isGuardian("asst-1", "telegram", "user-42")).toBe(true);
536
500
  });
537
501
 
538
- test("isGuardian returns false for non-matching user", async () => {
502
+ test("isGuardian returns false for non-matching user", () => {
539
503
  createGuardianBinding({
540
504
  channel: "telegram",
541
505
  guardianExternalUserId: "user-42",
@@ -543,14 +507,14 @@ describe("guardian identity check", () => {
543
507
  guardianDeliveryChatId: "chat-42",
544
508
  });
545
509
 
546
- expect(await isGuardian("asst-1", "telegram", "user-99")).toBe(false);
510
+ expect(isGuardian("asst-1", "telegram", "user-99")).toBe(false);
547
511
  });
548
512
 
549
- test("isGuardian returns false when no binding exists", async () => {
550
- expect(await isGuardian("asst-1", "telegram", "user-42")).toBe(false);
513
+ test("isGuardian returns false when no binding exists", () => {
514
+ expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
551
515
  });
552
516
 
553
- test("isGuardian returns false after binding is revoked", async () => {
517
+ test("isGuardian returns false after binding is revoked", () => {
554
518
  createGuardianBinding({
555
519
  channel: "telegram",
556
520
  guardianExternalUserId: "user-42",
@@ -560,10 +524,10 @@ describe("guardian identity check", () => {
560
524
 
561
525
  serviceRevokeBinding("asst-1", "telegram");
562
526
 
563
- expect(await isGuardian("asst-1", "telegram", "user-42")).toBe(false);
527
+ expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
564
528
  });
565
529
 
566
- test("getGuardianBinding returns the active binding", async () => {
530
+ test("getGuardianBinding returns the active binding", () => {
567
531
  createGuardianBinding({
568
532
  channel: "telegram",
569
533
  guardianExternalUserId: "user-42",
@@ -571,17 +535,17 @@ describe("guardian identity check", () => {
571
535
  guardianDeliveryChatId: "chat-42",
572
536
  });
573
537
 
574
- const binding = await getGuardianBinding("asst-1", "telegram");
538
+ const binding = getGuardianBinding("asst-1", "telegram");
575
539
  expect(binding).not.toBeNull();
576
540
  expect(binding!.guardianExternalUserId).toBe("user-42");
577
541
  });
578
542
 
579
- test("getGuardianBinding returns null when no binding exists", async () => {
580
- const binding = await getGuardianBinding("asst-1", "telegram");
543
+ test("getGuardianBinding returns null when no binding exists", () => {
544
+ const binding = getGuardianBinding("asst-1", "telegram");
581
545
  expect(binding).toBeNull();
582
546
  });
583
547
 
584
- test("isGuardian works for voice channel", async () => {
548
+ test("isGuardian works for voice channel", () => {
585
549
  createGuardianBinding({
586
550
  channel: "phone",
587
551
  guardianExternalUserId: "phone-user-1",
@@ -589,13 +553,13 @@ describe("guardian identity check", () => {
589
553
  guardianDeliveryChatId: "voice-chat-1",
590
554
  });
591
555
 
592
- expect(await isGuardian("asst-1", "phone", "phone-user-1")).toBe(true);
593
- expect(await isGuardian("asst-1", "phone", "phone-user-2")).toBe(false);
556
+ expect(isGuardian("asst-1", "phone", "phone-user-1")).toBe(true);
557
+ expect(isGuardian("asst-1", "phone", "phone-user-2")).toBe(false);
594
558
  // Telegram guardian should not match voice channel
595
- expect(await isGuardian("asst-1", "telegram", "phone-user-1")).toBe(false);
559
+ expect(isGuardian("asst-1", "telegram", "phone-user-1")).toBe(false);
596
560
  });
597
561
 
598
- test("serviceRevokeBinding revokes the active binding", async () => {
562
+ test("serviceRevokeBinding revokes the active binding", () => {
599
563
  createGuardianBinding({
600
564
  channel: "telegram",
601
565
  guardianExternalUserId: "user-42",
@@ -605,7 +569,7 @@ describe("guardian identity check", () => {
605
569
 
606
570
  const result = serviceRevokeBinding("asst-1", "telegram");
607
571
  expect(result).toBe(true);
608
- expect(await getGuardianBinding("asst-1", "telegram")).toBeNull();
572
+ expect(getGuardianBinding("asst-1", "telegram")).toBeNull();
609
573
  });
610
574
  });
611
575
 
@@ -896,7 +860,7 @@ describe("channel-scoped guardian resolution", () => {
896
860
  resetTables();
897
861
  });
898
862
 
899
- test("isGuardian resolves independently per channel", async () => {
863
+ test("isGuardian resolves independently per channel", () => {
900
864
  // Create guardian binding on telegram
901
865
  createGuardianBinding({
902
866
  channel: "telegram",
@@ -913,15 +877,15 @@ describe("channel-scoped guardian resolution", () => {
913
877
  });
914
878
 
915
879
  // user-alpha is guardian for telegram but not voice
916
- expect(await isGuardian("self", "telegram", "user-alpha")).toBe(true);
917
- expect(await isGuardian("self", "phone", "user-alpha")).toBe(false);
880
+ expect(isGuardian("self", "telegram", "user-alpha")).toBe(true);
881
+ expect(isGuardian("self", "phone", "user-alpha")).toBe(false);
918
882
 
919
883
  // user-beta is guardian for voice but not telegram
920
- expect(await isGuardian("self", "phone", "user-beta")).toBe(true);
921
- expect(await isGuardian("self", "telegram", "user-beta")).toBe(false);
884
+ expect(isGuardian("self", "phone", "user-beta")).toBe(true);
885
+ expect(isGuardian("self", "telegram", "user-beta")).toBe(false);
922
886
  });
923
887
 
924
- test("getGuardianBinding returns different bindings for different channels", async () => {
888
+ test("getGuardianBinding returns different bindings for different channels", () => {
925
889
  createGuardianBinding({
926
890
  channel: "telegram",
927
891
  guardianExternalUserId: "user-alpha",
@@ -935,8 +899,8 @@ describe("channel-scoped guardian resolution", () => {
935
899
  guardianDeliveryChatId: "chat-beta",
936
900
  });
937
901
 
938
- const bindingTelegram = await getGuardianBinding("self", "telegram");
939
- const bindingVoice = await getGuardianBinding("self", "phone");
902
+ const bindingTelegram = getGuardianBinding("self", "telegram");
903
+ const bindingVoice = getGuardianBinding("self", "phone");
940
904
 
941
905
  expect(bindingTelegram).not.toBeNull();
942
906
  expect(bindingVoice).not.toBeNull();
@@ -944,7 +908,7 @@ describe("channel-scoped guardian resolution", () => {
944
908
  expect(bindingVoice!.guardianExternalUserId).toBe("user-beta");
945
909
  });
946
910
 
947
- test("revoking binding for one channel does not affect another", async () => {
911
+ test("revoking binding for one channel does not affect another", () => {
948
912
  createGuardianBinding({
949
913
  channel: "telegram",
950
914
  guardianExternalUserId: "user-alpha",
@@ -960,11 +924,11 @@ describe("channel-scoped guardian resolution", () => {
960
924
 
961
925
  serviceRevokeBinding("self", "telegram");
962
926
 
963
- expect(await getGuardianBinding("self", "telegram")).toBeNull();
964
- expect(await getGuardianBinding("self", "phone")).not.toBeNull();
927
+ expect(getGuardianBinding("self", "telegram")).toBeNull();
928
+ expect(getGuardianBinding("self", "phone")).not.toBeNull();
965
929
  });
966
930
 
967
- test("validateAndConsumeVerification scoped to channel", async () => {
931
+ test("validateAndConsumeVerification scoped to channel", () => {
968
932
  // Create challenge on telegram
969
933
  const { secret: secretTelegram } =
970
934
  createInboundVerificationSession("telegram");
@@ -997,8 +961,8 @@ describe("channel-scoped guardian resolution", () => {
997
961
  );
998
962
  expect(resultVoice.success).toBe(true);
999
963
 
1000
- const bindingTelegram = await getGuardianBinding("self", "telegram");
1001
- const bindingVoice = await getGuardianBinding("self", "phone");
964
+ const bindingTelegram = getGuardianBinding("self", "telegram");
965
+ const bindingVoice = getGuardianBinding("self", "phone");
1002
966
  expect(bindingTelegram).toBeNull();
1003
967
  expect(bindingVoice).toBeNull();
1004
968
  });
@@ -1313,7 +1277,7 @@ describe("voice guardian challenge validation", () => {
1313
1277
  }
1314
1278
  });
1315
1279
 
1316
- test("validateAndConsumeVerification does not create a guardian binding for voice (caller responsibility)", async () => {
1280
+ test("validateAndConsumeVerification does not create a guardian binding for voice (caller responsibility)", () => {
1317
1281
  const { secret } = createInboundVerificationSession("phone");
1318
1282
 
1319
1283
  validateAndConsumeVerification(
@@ -1323,7 +1287,7 @@ describe("voice guardian challenge validation", () => {
1323
1287
  "voice-chat-1",
1324
1288
  );
1325
1289
 
1326
- const binding = await getGuardianBinding("asst-1", "phone");
1290
+ const binding = getGuardianBinding("asst-1", "phone");
1327
1291
  expect(binding).toBeNull();
1328
1292
  });
1329
1293
 
@@ -1397,7 +1361,7 @@ describe("voice guardian challenge validation", () => {
1397
1361
  expect(result2.success).toBe(false);
1398
1362
  });
1399
1363
 
1400
- test("validateAndConsumeVerification succeeds even with existing voice binding (conflict check is caller responsibility)", async () => {
1364
+ test("validateAndConsumeVerification succeeds even with existing voice binding (conflict check is caller responsibility)", () => {
1401
1365
  createGuardianBinding({
1402
1366
  channel: "phone",
1403
1367
  guardianExternalUserId: "old-voice-user",
@@ -1405,7 +1369,7 @@ describe("voice guardian challenge validation", () => {
1405
1369
  guardianDeliveryChatId: "old-voice-chat",
1406
1370
  });
1407
1371
 
1408
- const oldBinding = await getGuardianBinding("asst-1", "phone");
1372
+ const oldBinding = getGuardianBinding("asst-1", "phone");
1409
1373
  expect(oldBinding).not.toBeNull();
1410
1374
  expect(oldBinding!.guardianExternalUserId).toBe("old-voice-user");
1411
1375
 
@@ -1421,7 +1385,7 @@ describe("voice guardian challenge validation", () => {
1421
1385
  expect(result.success).toBe(true);
1422
1386
 
1423
1387
  // The original binding is untouched (no side effects)
1424
- const binding = await getGuardianBinding("asst-1", "phone");
1388
+ const binding = getGuardianBinding("asst-1", "phone");
1425
1389
  expect(binding).not.toBeNull();
1426
1390
  expect(binding!.guardianExternalUserId).toBe("old-voice-user");
1427
1391
  });
@@ -1436,7 +1400,7 @@ describe("voice guardian identity and revocation", () => {
1436
1400
  resetTables();
1437
1401
  });
1438
1402
 
1439
- test("isGuardian works for voice channel", async () => {
1403
+ test("isGuardian works for voice channel", () => {
1440
1404
  createGuardianBinding({
1441
1405
  channel: "phone",
1442
1406
  guardianExternalUserId: "voice-user-1",
@@ -1444,13 +1408,13 @@ describe("voice guardian identity and revocation", () => {
1444
1408
  guardianDeliveryChatId: "voice-chat-1",
1445
1409
  });
1446
1410
 
1447
- expect(await isGuardian("asst-1", "phone", "voice-user-1")).toBe(true);
1448
- expect(await isGuardian("asst-1", "phone", "voice-user-2")).toBe(false);
1411
+ expect(isGuardian("asst-1", "phone", "voice-user-1")).toBe(true);
1412
+ expect(isGuardian("asst-1", "phone", "voice-user-2")).toBe(false);
1449
1413
  // Voice guardian should not match telegram channel
1450
- expect(await isGuardian("asst-1", "telegram", "voice-user-1")).toBe(false);
1414
+ expect(isGuardian("asst-1", "telegram", "voice-user-1")).toBe(false);
1451
1415
  });
1452
1416
 
1453
- test("getGuardianBinding returns voice binding", async () => {
1417
+ test("getGuardianBinding returns voice binding", () => {
1454
1418
  createGuardianBinding({
1455
1419
  channel: "phone",
1456
1420
  guardianExternalUserId: "voice-user-1",
@@ -1458,13 +1422,13 @@ describe("voice guardian identity and revocation", () => {
1458
1422
  guardianDeliveryChatId: "voice-chat-1",
1459
1423
  });
1460
1424
 
1461
- const binding = await getGuardianBinding("asst-1", "phone");
1425
+ const binding = getGuardianBinding("asst-1", "phone");
1462
1426
  expect(binding).not.toBeNull();
1463
1427
  expect(binding!.channel).toBe("phone");
1464
1428
  expect(binding!.guardianExternalUserId).toBe("voice-user-1");
1465
1429
  });
1466
1430
 
1467
- test("revokeBinding clears active voice guardian binding", async () => {
1431
+ test("revokeBinding clears active voice guardian binding", () => {
1468
1432
  createGuardianBinding({
1469
1433
  channel: "phone",
1470
1434
  guardianExternalUserId: "voice-user-1",
@@ -1474,10 +1438,10 @@ describe("voice guardian identity and revocation", () => {
1474
1438
 
1475
1439
  const result = serviceRevokeBinding("asst-1", "phone");
1476
1440
  expect(result).toBe(true);
1477
- expect(await getGuardianBinding("asst-1", "phone")).toBeNull();
1441
+ expect(getGuardianBinding("asst-1", "phone")).toBeNull();
1478
1442
  });
1479
1443
 
1480
- test("revokeBinding for voice does not affect telegram binding", async () => {
1444
+ test("revokeBinding for voice does not affect telegram binding", () => {
1481
1445
  createGuardianBinding({
1482
1446
  channel: "phone",
1483
1447
  guardianExternalUserId: "voice-user-1",
@@ -1493,8 +1457,8 @@ describe("voice guardian identity and revocation", () => {
1493
1457
 
1494
1458
  serviceRevokeBinding("asst-1", "phone");
1495
1459
 
1496
- expect(await getGuardianBinding("asst-1", "phone")).toBeNull();
1497
- expect(await getGuardianBinding("asst-1", "telegram")).not.toBeNull();
1460
+ expect(getGuardianBinding("asst-1", "phone")).toBeNull();
1461
+ expect(getGuardianBinding("asst-1", "telegram")).not.toBeNull();
1498
1462
  });
1499
1463
  });
1500
1464
 
@@ -1752,7 +1716,7 @@ describe("HTTP handler voice guardian verification", () => {
1752
1716
  expect(resp!.bound).toBe(false);
1753
1717
 
1754
1718
  // Verify binding is actually revoked
1755
- expect(await getGuardianBinding("self", "phone")).toBeNull();
1719
+ expect(getGuardianBinding("self", "phone")).toBeNull();
1756
1720
  });
1757
1721
 
1758
1722
  test("revoke for voice does not affect telegram binding", async () => {
@@ -1778,8 +1742,8 @@ describe("HTTP handler voice guardian verification", () => {
1778
1742
 
1779
1743
  await handleChannelVerificationSession(msg);
1780
1744
 
1781
- expect(await getGuardianBinding("self", "phone")).toBeNull();
1782
- expect(await getGuardianBinding("self", "telegram")).not.toBeNull();
1745
+ expect(getGuardianBinding("self", "phone")).toBeNull();
1746
+ expect(getGuardianBinding("self", "telegram")).not.toBeNull();
1783
1747
  });
1784
1748
  });
1785
1749
 
@@ -81,8 +81,6 @@ mock.module("../runtime/gateway-client.js", () => ({
81
81
  }));
82
82
 
83
83
  mock.module("../memory/conversation-crud.js", () => ({
84
- setConversationProcessingStartedAt: () => {},
85
- isConversationProcessing: () => false,
86
84
  setConversationOriginChannelIfUnset: () => {},
87
85
  updateConversationContextWindow: () => {},
88
86
  deleteMessageById: () => {},
@@ -125,8 +125,6 @@ mock.module("../security/secret-allowlist.js", () => ({
125
125
  }));
126
126
 
127
127
  mock.module("../memory/conversation-crud.js", () => ({
128
- setConversationProcessingStartedAt: () => {},
129
- isConversationProcessing: () => false,
130
128
  setConversationOriginChannelIfUnset: () => {},
131
129
  updateConversationContextWindow: () => {},
132
130
  setConversationHistoryStrippedAt: () => {},
@@ -17,8 +17,6 @@ mock.module("../util/logger.js", () => ({
17
17
  // The compactor reads the conversation's image attachments from the DB to
18
18
  // build its manifest; with no images these return empty.
19
19
  mock.module("../memory/conversation-crud.js", () => ({
20
- setConversationProcessingStartedAt: () => {},
21
- isConversationProcessing: () => false,
22
20
  getMessages: () => [],
23
21
  }));
24
22
  mock.module("../memory/attachments-store.js", () => ({
@@ -30,8 +30,6 @@ mock.module("../util/logger.js", () => ({
30
30
  }));
31
31
 
32
32
  mock.module("../memory/conversation-crud.js", () => ({
33
- setConversationProcessingStartedAt: () => {},
34
- isConversationProcessing: () => false,
35
33
  getMessages: () => [],
36
34
  reserveMessage: mock(async () => ({ id: "msg-reserve" })),
37
35
  }));
@@ -32,8 +32,6 @@ mock.module("../util/logger.js", () => ({
32
32
  }));
33
33
 
34
34
  mock.module("../memory/conversation-crud.js", () => ({
35
- setConversationProcessingStartedAt: () => {},
36
- isConversationProcessing: () => false,
37
35
  getMessages: () => [],
38
36
  }));
39
37
 
@@ -22,8 +22,6 @@ mock.module("../util/logger.js", () => ({
22
22
  }));
23
23
 
24
24
  mock.module("../memory/conversation-crud.js", () => ({
25
- setConversationProcessingStartedAt: () => {},
26
- isConversationProcessing: () => false,
27
25
  getMessages: () => [],
28
26
  reserveMessage: mock(async () => ({ id: "msg-reserve" })),
29
27
  }));
@@ -32,8 +32,6 @@ mock.module("../util/logger.js", () => ({
32
32
  }));
33
33
 
34
34
  mock.module("../memory/conversation-crud.js", () => ({
35
- setConversationProcessingStartedAt: () => {},
36
- isConversationProcessing: () => false,
37
35
  getMessages: () => [],
38
36
  }));
39
37
 
@@ -22,8 +22,6 @@ mock.module("../util/logger.js", () => ({
22
22
  }));
23
23
 
24
24
  mock.module("../memory/conversation-crud.js", () => ({
25
- setConversationProcessingStartedAt: () => {},
26
- isConversationProcessing: () => false,
27
25
  getMessages: () => [],
28
26
  reserveMessage: mock(async () => ({ id: "msg-reserve" })),
29
27
  }));
@@ -98,64 +98,6 @@ function writeConfig(obj: unknown): void {
98
98
  writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
99
99
  }
100
100
 
101
- function latencySeed(): Record<string, unknown> {
102
- return {
103
- model: "claude-haiku-4-5-20251001",
104
- effort: "low",
105
- thinking: { enabled: false },
106
- };
107
- }
108
-
109
- function fullSeededCallSites(): Record<string, Record<string, unknown>> {
110
- return {
111
- guardianQuestionCopy: latencySeed(),
112
- interactionClassifier: latencySeed(),
113
- skillCategoryInference: latencySeed(),
114
- inviteInstructionGenerator: latencySeed(),
115
- notificationDecision: latencySeed(),
116
- preferenceExtraction: latencySeed(),
117
- commitMessage: {
118
- model: "claude-haiku-4-5-20251001",
119
- maxTokens: 120,
120
- temperature: 0.2,
121
- effort: "low",
122
- thinking: { enabled: false },
123
- },
124
- conversationStarters: latencySeed(),
125
- conversationSummarization: {
126
- model: "claude-opus-4-7",
127
- effort: "low",
128
- thinking: { enabled: false },
129
- },
130
- recall: {
131
- profile: "cost-optimized",
132
- maxTokens: 4096,
133
- effort: "low",
134
- thinking: { enabled: false, streamThinking: false },
135
- temperature: 0,
136
- disableCache: true,
137
- },
138
- heartbeatAgent: {
139
- profile: "cost-optimized",
140
- maxTokens: 2048,
141
- effort: "low",
142
- temperature: 0,
143
- thinking: { enabled: false, streamThinking: false },
144
- contextWindow: { maxInputTokens: 16000 },
145
- },
146
- replySuggestion: {
147
- model: "claude-haiku-4-5-20251001",
148
- effort: "low",
149
- thinking: { enabled: false },
150
- disableCache: true,
151
- },
152
- memoryRouter: {
153
- profile: "cost-optimized",
154
- contextWindow: { maxInputTokens: 1_000_000 },
155
- },
156
- };
157
- }
158
-
159
101
  function mergeDefaultConfigAndSeedInferenceProfiles(db?: DrizzleDb): void {
160
102
  const defaultConfigMerge = mergeDefaultWorkspaceConfig();
161
103
  seedInferenceProfiles({
@@ -430,56 +372,6 @@ describe("loadConfig startup behavior", () => {
430
372
  expect(config.memory.v2.bm25_b).toBe(0.4);
431
373
  });
432
374
 
433
- test("default workspace config merge prunes exact seeded call-site defaults", () => {
434
- const seededCallSites = fullSeededCallSites();
435
- const overlayPath = join(WORKSPACE_DIR, "hatch-overlay.json");
436
- writeFileSync(
437
- overlayPath,
438
- JSON.stringify(
439
- {
440
- gateway: {
441
- unmappedPolicy: "default",
442
- defaultAssistantId: "self",
443
- },
444
- llm: {
445
- activeProfile: "balanced",
446
- advisorProfile: "frontier",
447
- callSites: {
448
- ...seededCallSites,
449
- recall: {
450
- ...seededCallSites.recall,
451
- disableCache: false,
452
- },
453
- customSite: { profile: "frontier" },
454
- },
455
- },
456
- },
457
- null,
458
- 2,
459
- ) + "\n",
460
- );
461
- process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH = overlayPath;
462
-
463
- const result = mergeDefaultWorkspaceConfig();
464
- const raw = JSON.parse(readFileSync(CONFIG_PATH, "utf-8")) as Record<
465
- string,
466
- Record<string, unknown>
467
- >;
468
- const llm = raw.llm as Record<string, unknown>;
469
- const callSites = llm.callSites as Record<string, Record<string, unknown>>;
470
-
471
- expect(result.hadOverlay).toBe(true);
472
- expect(raw.gateway).toEqual({
473
- unmappedPolicy: "default",
474
- defaultAssistantId: "self",
475
- });
476
- expect(llm.activeProfile).toBe("balanced");
477
- expect(llm.advisorProfile).toBe("frontier");
478
- expect(Object.keys(callSites).sort()).toEqual(["customSite", "recall"]);
479
- expect(callSites.recall?.disableCache).toBe(false);
480
- expect(callSites.customSite).toEqual({ profile: "frontier" });
481
- });
482
-
483
375
  test("reloads cached config when config.json is updated externally", () => {
484
376
  // Models a CLI subprocess writing twilio.accountSid while the assistant
485
377
  // process already has an effective config cached in memory.
@@ -853,11 +745,7 @@ describe("loadConfig startup behavior", () => {
853
745
  );
854
746
  expect(raw.llm.profiles.frontier.provider).toBe("anthropic");
855
747
  expect(raw.llm.profiles.frontier.model).toBe("claude-opus-4-8");
856
- // Speed is served by DeepSeek V4 Flash on Fireworks.
857
- expect(raw.llm.profiles["cost-optimized"].provider).toBe("fireworks");
858
- expect(raw.llm.profiles["cost-optimized"].model).toBe(
859
- "accounts/fireworks/models/deepseek-v4-flash",
860
- );
748
+ expect(raw.llm.profiles["cost-optimized"].provider).toBe("anthropic");
861
749
  });
862
750
 
863
751
  test("off-platform managed profiles are overwritten on every boot", () => {
@@ -1703,8 +1591,8 @@ describe("seedInferenceProfiles BYOK-mode managed profile labels", () => {
1703
1591
  // ---------------------------------------------------------------------------
1704
1592
  // Tests: OS Beta flag-gated managed profile. The template is defined but
1705
1593
  // intentionally NOT part of MANAGED_PROFILE_TEMPLATES, so seedInferenceProfiles
1706
- // must never create it. The flag-gated reconcile creates or removes it based on
1707
- // the `os-beta` feature flag.
1594
+ // must never create it. A later PR reconciles it in/out based on the `os-beta`
1595
+ // feature flag.
1708
1596
  // ---------------------------------------------------------------------------
1709
1597
 
1710
1598
  describe("OS Beta managed profile template", () => {
@@ -1751,21 +1639,20 @@ describe("OS Beta managed profile template", () => {
1751
1639
  expect(MANAGED_PROFILE_NAMES.has("os-beta")).toBe(true);
1752
1640
  });
1753
1641
 
1754
- test("materializeProfile resolves OS Beta to the Balanced model with low effort", () => {
1642
+ test("materializeProfile honors the explicit OS Beta model", () => {
1755
1643
  const entry = materializeProfile(
1756
1644
  OS_BETA_PROFILE_TEMPLATE,
1757
- "together",
1758
- "together-managed",
1645
+ "fireworks",
1646
+ "fireworks-managed",
1759
1647
  );
1760
1648
 
1761
- expect(entry.model).toBe("MiniMaxAI/MiniMax-M3");
1762
- expect(entry.provider_connection).toBe("together-managed");
1763
- expect(entry.provider).toBe("together");
1649
+ expect(entry.model).toBe("accounts/fireworks/models/glm-5p2");
1650
+ expect(entry.provider_connection).toBe("fireworks-managed");
1651
+ expect(entry.provider).toBe("fireworks");
1764
1652
  expect(entry.label).toBe("OS Beta");
1765
1653
  expect(entry.source).toBe("managed");
1766
1654
  expect(entry.maxTokens).toBe(32000);
1767
- expect(entry.effort).toBe("low");
1655
+ expect(entry.effort).toBe("high");
1768
1656
  expect(entry.thinking?.enabled).toBe(true);
1769
- expect(entry.topP).toBe(0.95);
1770
1657
  });
1771
1658
  });
@@ -120,7 +120,6 @@ describe("AssistantConfigSchema", () => {
120
120
  shellDefaultTimeoutSec: 120,
121
121
  shellMaxTimeoutSec: 600,
122
122
  permissionTimeoutSec: 300,
123
- questionResponseTimeoutSec: 1800,
124
123
  toolExecutionTimeoutSec: 120,
125
124
  providerStreamTimeoutSec: 1800,
126
125
  backgroundTurnTimeoutSec: 1800,