@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
@@ -135,11 +135,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
135
135
  mockOnConversationCreatedCallbacks.length = 0;
136
136
  });
137
137
 
138
- test("emits guardian.question for trusted-contact sessions", async () => {
138
+ test("emits guardian.question for trusted-contact sessions", () => {
139
139
  const canonicalRequest = makeCanonicalRequest();
140
140
  const trustContext = makeTrustedContactContext();
141
141
 
142
- const result = await bridgeConfirmationRequestToGuardian({
142
+ const result = bridgeConfirmationRequestToGuardian({
143
143
  canonicalRequest,
144
144
  trustContext,
145
145
  conversationId: "conv-1",
@@ -160,7 +160,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
160
160
  expect(payload.requesterIdentifier).toBe("@requester");
161
161
  });
162
162
 
163
- test("skips guardian actor sessions (self-approve)", async () => {
163
+ test("skips guardian actor sessions (self-approve)", () => {
164
164
  const canonicalRequest = makeCanonicalRequest();
165
165
  const trustContext: TrustContext = {
166
166
  sourceChannel: "telegram",
@@ -168,7 +168,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
168
168
  guardianExternalUserId: "guardian-1",
169
169
  };
170
170
 
171
- const result = await bridgeConfirmationRequestToGuardian({
171
+ const result = bridgeConfirmationRequestToGuardian({
172
172
  canonicalRequest,
173
173
  trustContext,
174
174
  conversationId: "conv-1",
@@ -182,14 +182,14 @@ describe("bridgeConfirmationRequestToGuardian", () => {
182
182
  expect(emittedSignals).toHaveLength(0);
183
183
  });
184
184
 
185
- test("skips unknown actor sessions", async () => {
185
+ test("skips unknown actor sessions", () => {
186
186
  const canonicalRequest = makeCanonicalRequest();
187
187
  const trustContext: TrustContext = {
188
188
  sourceChannel: "telegram",
189
189
  trustClass: "unknown",
190
190
  };
191
191
 
192
- const result = await bridgeConfirmationRequestToGuardian({
192
+ const result = bridgeConfirmationRequestToGuardian({
193
193
  canonicalRequest,
194
194
  trustContext,
195
195
  conversationId: "conv-1",
@@ -203,13 +203,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
203
203
  expect(emittedSignals).toHaveLength(0);
204
204
  });
205
205
 
206
- test("skips when guardian identity is missing", async () => {
206
+ test("skips when guardian identity is missing", () => {
207
207
  const canonicalRequest = makeCanonicalRequest();
208
208
  const trustContext = makeTrustedContactContext({
209
209
  guardianExternalUserId: undefined,
210
210
  });
211
211
 
212
- const result = await bridgeConfirmationRequestToGuardian({
212
+ const result = bridgeConfirmationRequestToGuardian({
213
213
  canonicalRequest,
214
214
  trustContext,
215
215
  conversationId: "conv-1",
@@ -223,13 +223,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
223
223
  expect(emittedSignals).toHaveLength(0);
224
224
  });
225
225
 
226
- test("skips when no guardian binding exists for channel", async () => {
226
+ test("skips when no guardian binding exists for channel", () => {
227
227
  const canonicalRequest = makeCanonicalRequest({ sourceChannel: "phone" });
228
228
  const trustContext = makeTrustedContactContext({
229
229
  sourceChannel: "phone",
230
230
  });
231
231
 
232
- const result = await bridgeConfirmationRequestToGuardian({
232
+ const result = bridgeConfirmationRequestToGuardian({
233
233
  canonicalRequest,
234
234
  trustContext,
235
235
  conversationId: "conv-1",
@@ -243,11 +243,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
243
243
  expect(emittedSignals).toHaveLength(0);
244
244
  });
245
245
 
246
- test("sets correct attention hints for urgency", async () => {
246
+ test("sets correct attention hints for urgency", () => {
247
247
  const canonicalRequest = makeCanonicalRequest();
248
248
  const trustContext = makeTrustedContactContext();
249
249
 
250
- await bridgeConfirmationRequestToGuardian({
250
+ bridgeConfirmationRequestToGuardian({
251
251
  canonicalRequest,
252
252
  trustContext,
253
253
  conversationId: "conv-1",
@@ -261,11 +261,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
261
261
  expect(hints.visibleInSourceNow).toBe(false);
262
262
  });
263
263
 
264
- test("uses dedupe key scoped to canonical request ID", async () => {
264
+ test("uses dedupe key scoped to canonical request ID", () => {
265
265
  const canonicalRequest = makeCanonicalRequest();
266
266
  const trustContext = makeTrustedContactContext();
267
267
 
268
- await bridgeConfirmationRequestToGuardian({
268
+ bridgeConfirmationRequestToGuardian({
269
269
  canonicalRequest,
270
270
  trustContext,
271
271
  conversationId: "conv-1",
@@ -277,11 +277,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
277
277
  );
278
278
  });
279
279
 
280
- test("creates vellum delivery row via onConversationCreated callback", async () => {
280
+ test("creates vellum delivery row via onConversationCreated callback", () => {
281
281
  const canonicalRequest = makeCanonicalRequest();
282
282
  const trustContext = makeTrustedContactContext();
283
283
 
284
- await bridgeConfirmationRequestToGuardian({
284
+ bridgeConfirmationRequestToGuardian({
285
285
  canonicalRequest,
286
286
  trustContext,
287
287
  conversationId: "conv-1",
@@ -298,20 +298,18 @@ describe("bridgeConfirmationRequestToGuardian", () => {
298
298
  });
299
299
 
300
300
  const deliveries = listCanonicalGuardianDeliveries(canonicalRequest.id);
301
- const vellumDelivery = deliveries.find(
302
- (d) => d.destinationChannel === "vellum",
303
- );
304
- expect(vellumDelivery).toBeDefined();
305
- expect(vellumDelivery?.destinationConversationId).toBe(
301
+ expect(deliveries).toHaveLength(1);
302
+ expect(deliveries[0].destinationChannel).toBe("vellum");
303
+ expect(deliveries[0].destinationConversationId).toBe(
306
304
  "guardian-conversation-1",
307
305
  );
308
306
  });
309
307
 
310
- test("uses custom assistantId when provided", async () => {
308
+ test("uses custom assistantId when provided", () => {
311
309
  const canonicalRequest = makeCanonicalRequest();
312
310
  const trustContext = makeTrustedContactContext();
313
311
 
314
- await bridgeConfirmationRequestToGuardian({
312
+ bridgeConfirmationRequestToGuardian({
315
313
  canonicalRequest,
316
314
  trustContext,
317
315
  conversationId: "conv-1",
@@ -326,13 +324,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
326
324
  expect(emittedSignals).toHaveLength(0);
327
325
  });
328
326
 
329
- test("does not pass assistantId to notification signal", async () => {
327
+ test("does not pass assistantId to notification signal", () => {
330
328
  const canonicalRequest = makeCanonicalRequest();
331
329
  const trustContext = makeTrustedContactContext();
332
330
 
333
331
  // assistantId is used internally for guardian binding lookup but is no
334
332
  // longer forwarded to the notification signal after the assistantId removal refactor.
335
- await bridgeConfirmationRequestToGuardian({
333
+ bridgeConfirmationRequestToGuardian({
336
334
  canonicalRequest,
337
335
  trustContext,
338
336
  conversationId: "conv-1",
@@ -342,13 +340,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
342
340
  expect(emittedSignals[0].assistantId).toBeUndefined();
343
341
  });
344
342
 
345
- test("includes requesterChatId as null when not provided", async () => {
343
+ test("includes requesterChatId as null when not provided", () => {
346
344
  const canonicalRequest = makeCanonicalRequest();
347
345
  const trustContext = makeTrustedContactContext({
348
346
  requesterChatId: undefined,
349
347
  });
350
348
 
351
- await bridgeConfirmationRequestToGuardian({
349
+ bridgeConfirmationRequestToGuardian({
352
350
  canonicalRequest,
353
351
  trustContext,
354
352
  conversationId: "conv-1",
@@ -359,7 +357,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
359
357
  expect(payload.requesterChatId).toBeNull();
360
358
  });
361
359
 
362
- test("skips when binding guardian identity does not match canonical request guardian", async () => {
360
+ test("skips when binding guardian identity does not match canonical request guardian", () => {
363
361
  // Create a canonical request where guardianExternalUserId differs from the
364
362
  // binding's guardianExternalUserId ('guardian-1' in the mock).
365
363
  const canonicalRequest = makeCanonicalRequest({
@@ -367,7 +365,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
367
365
  });
368
366
  const trustContext = makeTrustedContactContext();
369
367
 
370
- const result = await bridgeConfirmationRequestToGuardian({
368
+ const result = bridgeConfirmationRequestToGuardian({
371
369
  canonicalRequest,
372
370
  trustContext,
373
371
  conversationId: "conv-1",
@@ -381,7 +379,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
381
379
  expect(emittedSignals).toHaveLength(0);
382
380
  });
383
381
 
384
- test("does not skip when canonical request guardian identity is null", async () => {
382
+ test("does not skip when canonical request guardian identity is null", () => {
385
383
  // When guardianExternalUserId is null on the canonical request (e.g. desktop
386
384
  // flow), the identity check should be skipped and the bridge should proceed.
387
385
  const canonicalRequest = makeCanonicalRequest({
@@ -389,7 +387,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
389
387
  });
390
388
  const trustContext = makeTrustedContactContext();
391
389
 
392
- const result = await bridgeConfirmationRequestToGuardian({
390
+ const result = bridgeConfirmationRequestToGuardian({
393
391
  canonicalRequest,
394
392
  trustContext,
395
393
  conversationId: "conv-1",
@@ -3,9 +3,8 @@
3
3
  *
4
4
  * handleListContacts (non-search) and handleGetContact relay to the gateway
5
5
  * via `ipcCallPersistent`. On the happy path they serve gateway-sourced data
6
- * and do NOT read the assistant DB. On IPC failure they FAIL CLOSED the relay
7
- * error propagates rather than falling back to the assistant DB. getContact
8
- * surfaces a clean gateway not-found as a 404.
6
+ * and do NOT read the assistant DB. On IPC failure they fall back to the
7
+ * assistant-DB read and log a warning. getContact still 404s for unknown ids.
9
8
  */
10
9
 
11
10
  import { beforeEach, describe, expect, mock, test } from "bun:test";
@@ -214,15 +213,16 @@ describe("handleListContacts relay", () => {
214
213
  expect(result.contacts[0].displayName).toBe("Your Guardian");
215
214
  });
216
215
 
217
- test("fails closed on IPC failure (no assistant-DB fallback)", async () => {
216
+ test("falls back to the assistant DB on IPC failure", async () => {
218
217
  ipcStub = () => {
219
218
  throw new Error("gateway down");
220
219
  };
221
220
 
222
- await expect(handleListContacts({})).rejects.toThrow("gateway down");
221
+ const result = await handleListContacts({});
223
222
 
224
223
  expect(ipcCalls.map((c) => c.method)).toEqual(["contacts_list_rich"]);
225
- expect(localCalls).toEqual([]);
224
+ expect(localCalls).toContain("listContacts");
225
+ expect(result.contacts[0].id).toBe("local-1");
226
226
  });
227
227
 
228
228
  test("search params stay daemon-native and log the boundary note", async () => {
@@ -384,24 +384,26 @@ describe("handleGetContact relay", () => {
384
384
  expect(localCalls).toEqual([]);
385
385
  });
386
386
 
387
- test("fails closed on IPC transport failure (no assistant-DB fallback)", async () => {
387
+ test("falls back to the assistant DB on IPC transport failure", async () => {
388
388
  ipcStub = () => {
389
389
  throw new Error("gateway down");
390
390
  };
391
391
 
392
- await expect(handleGetContact("gw-1")).rejects.toThrow("gateway down");
392
+ const result = await handleGetContact("gw-1");
393
393
 
394
394
  expect(ipcCalls.map((c) => c.method)).toEqual(["contacts_get_rich"]);
395
- expect(localCalls).toEqual([]);
395
+ expect(localCalls).toContain("getContact");
396
+ expect(result.contact.id).toBe("gw-1");
396
397
  });
397
398
 
398
- test("clean gateway not-found surfaces as a 404 for unknown ids", async () => {
399
- ipcStub = () => null;
399
+ test("fallback path still 404s for unknown ids", async () => {
400
+ ipcStub = () => {
401
+ throw new Error("gateway down");
402
+ };
400
403
 
401
404
  await expect(handleGetContact("missing")).rejects.toThrow(
402
405
  'Contact "missing" not found',
403
406
  );
404
- expect(ipcCalls.map((c) => c.method)).toEqual(["contacts_get_rich"]);
405
- expect(localCalls).toEqual([]);
407
+ expect(localCalls).toContain("getContact");
406
408
  });
407
409
  });
@@ -112,8 +112,6 @@ let reservedRowContent: Map<string, string> = new Map();
112
112
  let reserveCounter = 0;
113
113
 
114
114
  mock.module("../memory/conversation-crud.js", () => ({
115
- setConversationProcessingStartedAt: () => {},
116
- isConversationProcessing: () => false,
117
115
  setConversationOriginChannelIfUnset: () => {},
118
116
  updateConversationContextWindow: () => {},
119
117
  deleteMessageById: () => {},
@@ -87,8 +87,6 @@ mock.module("../daemon/disk-pressure-guard.js", () => ({
87
87
  }));
88
88
 
89
89
  mock.module("../memory/conversation-crud.js", () => ({
90
- setConversationProcessingStartedAt: () => {},
91
- isConversationProcessing: () => false,
92
90
  getConversation: () => ({
93
91
  id: "conv-123",
94
92
  conversationType: "background",
@@ -147,8 +147,6 @@ let mockConversationRow: {
147
147
  };
148
148
 
149
149
  mock.module("../memory/conversation-crud.js", () => ({
150
- setConversationProcessingStartedAt: () => {},
151
- isConversationProcessing: () => false,
152
150
  setConversationOriginChannelIfUnset: () => {},
153
151
  setConversationHistoryStrippedAt: () => {},
154
152
  updateConversationUsage: () => {},
@@ -257,8 +257,6 @@ mock.module("../plugins/defaults/compaction/overflow-policy.js", () => ({
257
257
  }));
258
258
 
259
259
  mock.module("../memory/conversation-crud.js", () => ({
260
- setConversationProcessingStartedAt: () => {},
261
- isConversationProcessing: () => false,
262
260
  setConversationOriginChannelIfUnset: () => {},
263
261
  setConversationHistoryStrippedAt: () => {},
264
262
  updateConversationUsage: () => {},
@@ -10,14 +10,8 @@ import {
10
10
  } from "bun:test";
11
11
 
12
12
  import type { LoopToolExecutor } from "../agent/loop.js";
13
- import {
14
- queueConversationNotice,
15
- resetConversationNoticesForTests,
16
- } from "../daemon/conversation-notices.js";
17
13
  import type { ServerMessage } from "../daemon/message-protocol.js";
18
- import type { UserPromptSubmitContext } from "../plugin-api/types.js";
19
14
  import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
20
- import { registerPlugin } from "../plugins/registry.js";
21
15
  import type { Message, Provider, ToolDefinition } from "../providers/types.js";
22
16
  import { ContextOverflowError } from "../providers/types.js";
23
17
 
@@ -279,8 +273,6 @@ const deleteMessageByIdMock = mock(() => ({
279
273
  const reserveMessageMock = mock(async () => ({ id: "msg-reserve" }));
280
274
  const updateMessageContentMock = mock(() => {});
281
275
  mock.module("../memory/conversation-crud.js", () => ({
282
- setConversationProcessingStartedAt: () => {},
283
- isConversationProcessing: () => false,
284
276
  setConversationOriginChannelIfUnset: () => {},
285
277
  updateConversationUsage: () => {},
286
278
  updateMessageMetadata: updateMessageMetadataMock,
@@ -708,7 +700,6 @@ function makeCtx(
708
700
  mockConversationRow?.slackContextCompactionWatermarkTs ?? null,
709
701
  lastNotifiedInferenceProfile:
710
702
  mockConversationRow?.lastNotifiedInferenceProfile ?? null,
711
- processingStartedAt: mockConversationRow?.processingStartedAt ?? null,
712
703
 
713
704
  memoryPolicy: { scopeId: "default", includeDefaultFallback: true },
714
705
 
@@ -873,14 +864,7 @@ beforeEach(() => {
873
864
  indexMessageNowMock.mockClear();
874
865
  projectAssistantMessageMock.mockClear();
875
866
  publishSyncInvalidationMock.mockClear();
876
- resolveAssistantAttachmentsMock.mockClear();
877
- resolveAssistantAttachmentsMock.mockImplementation(async () => ({
878
- assistantAttachments: [],
879
- emittedAttachments: [],
880
- directiveWarnings: [],
881
- }));
882
867
  mockMessageById = null;
883
- resetConversationNoticesForTests();
884
868
  // The compaction pipeline runs through the plugin registry; reset and
885
869
  // re-register every default so it dispatches to middleware backed by the
886
870
  // mocked collaborators these tests install (`syncMessageToDisk`, etc.)
@@ -889,120 +873,6 @@ beforeEach(() => {
889
873
  });
890
874
 
891
875
  describe("session-agent-loop", () => {
892
- describe("user-prompt-submit hook failures", () => {
893
- test("logs and continues with prior hook mutations", async () => {
894
- registerPlugin({
895
- manifest: {
896
- name: "test-user-prompt-rewrite",
897
- version: "1.0.0",
898
- },
899
- hooks: {
900
- "user-prompt-submit": async (_ctx: UserPromptSubmitContext) => ({
901
- latestMessages: [
902
- {
903
- role: "user" as const,
904
- content: [{ type: "text" as const, text: "rewritten prompt" }],
905
- },
906
- ],
907
- }),
908
- },
909
- });
910
- registerPlugin({
911
- manifest: {
912
- name: "test-user-prompt-throw",
913
- version: "1.0.0",
914
- },
915
- hooks: {
916
- "user-prompt-submit": async () => {
917
- throw new Error("simulated hook failure");
918
- },
919
- },
920
- });
921
-
922
- const events: ServerMessage[] = [];
923
- const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
924
- const runSpy = spyOn(ctx.agentLoop, "run");
925
-
926
- await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
927
-
928
- expect(runSpy).toHaveBeenCalledTimes(1);
929
- const call = runSpy.mock.calls[0]?.[0] as
930
- | { messages: Message[] }
931
- | undefined;
932
- expect(call?.messages[0]?.content).toEqual([
933
- { type: "text", text: "rewritten prompt" },
934
- ]);
935
- expect(
936
- events.find((event) => event.type === "conversation_error"),
937
- ).toBeUndefined();
938
- expect(
939
- events.find((event) => event.type === "message_complete"),
940
- ).toBeDefined();
941
- });
942
- });
943
-
944
- describe("conversation notices", () => {
945
- test("emits queued billing notices after a successful turn", async () => {
946
- const events: ServerMessage[] = [];
947
- const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
948
- queueConversationNotice(ctx.conversationId, "memory-v3-test", {
949
- source: "memory_v3",
950
- code: "PROVIDER_BILLING",
951
- userMessage: "You've run out of credits.",
952
- errorCategory: "credits_exhausted",
953
- });
954
-
955
- await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
956
-
957
- expect(
958
- events.find((event) => event.type === "conversation_error"),
959
- ).toBeUndefined();
960
- const messageCompleteIndex = events.findIndex(
961
- (event) => event.type === "message_complete",
962
- );
963
- const conversationNoticeIndex = events.findIndex(
964
- (event) => event.type === "conversation_notice",
965
- );
966
-
967
- expect(messageCompleteIndex).toBeGreaterThanOrEqual(0);
968
- expect(conversationNoticeIndex).toBeGreaterThan(messageCompleteIndex);
969
- expect(events[conversationNoticeIndex]).toEqual({
970
- type: "conversation_notice",
971
- conversationId: "test-conv",
972
- source: "memory_v3",
973
- code: "PROVIDER_BILLING",
974
- userMessage: "You've run out of credits.",
975
- errorCategory: "credits_exhausted",
976
- });
977
- });
978
-
979
- test("clears queued notices when post-loop success work fails", async () => {
980
- resolveAssistantAttachmentsMock.mockImplementation(async () => {
981
- throw new Error("attachment resolution failed");
982
- });
983
- const events: ServerMessage[] = [];
984
- const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
985
- queueConversationNotice(ctx.conversationId, "memory-v3-test", {
986
- source: "memory_v3",
987
- code: "PROVIDER_BILLING",
988
- userMessage: "You've run out of credits.",
989
- errorCategory: "credits_exhausted",
990
- });
991
-
992
- await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
993
-
994
- expect(
995
- events.find((event) => event.type === "conversation_notice"),
996
- ).toBeUndefined();
997
- expect(
998
- events.find((event) => event.type === "message_complete"),
999
- ).toBeUndefined();
1000
- expect(
1001
- events.find((event) => event.type === "conversation_error"),
1002
- ).toBeDefined();
1003
- });
1004
- });
1005
-
1006
876
  describe("timezone turn context", () => {
1007
877
  test("passes ctx.clientTimezone and ui.detectedTimezone into timezone resolution", async () => {
1008
878
  mockUiConfig = {
@@ -1835,10 +1705,6 @@ describe("session-agent-loop", () => {
1835
1705
  expect(ctx.abortController).toBeNull();
1836
1706
  expect(ctx.currentRequestId).toBeUndefined();
1837
1707
  expect(ctx.commandIntent).toBeUndefined();
1838
- // Turn-scoped interactivity is stamped during the run and must be cleared
1839
- // so paths that bypass this loop (e.g. opportunity wakes) don't inherit a
1840
- // stale value instead of falling back to live client state.
1841
- expect(ctx.currentTurnIsNonInteractive).toBeUndefined();
1842
1708
  });
1843
1709
 
1844
1710
  test("clears state and surfaces a processing error when the provider call fails", async () => {
@@ -22,8 +22,6 @@ mock.module("../memory/conversation-key-store.js", () => ({
22
22
  }));
23
23
 
24
24
  mock.module("../memory/conversation-crud.js", () => ({
25
- setConversationProcessingStartedAt: () => {},
26
- isConversationProcessing: () => false,
27
25
  getConversation: mockGetConversation,
28
26
  getMessages: mockGetMessages,
29
27
  createConversation: mockCreateConversation,
@@ -76,8 +76,6 @@ mock.module("../security/secret-allowlist.js", () => ({
76
76
  }));
77
77
 
78
78
  mock.module("../memory/conversation-crud.js", () => ({
79
- setConversationProcessingStartedAt: () => {},
80
- isConversationProcessing: () => false,
81
79
  updateConversationContextWindow: () => {},
82
80
  deleteMessageById: () => {},
83
81
  updateConversationTitle: () => {},
@@ -112,8 +112,6 @@ mock.module("../security/secret-allowlist.js", () => ({
112
112
  }));
113
113
 
114
114
  mock.module("../memory/conversation-crud.js", () => ({
115
- setConversationProcessingStartedAt: () => {},
116
- isConversationProcessing: () => false,
117
115
  setConversationOriginChannelIfUnset: () => {},
118
116
  updateConversationContextWindow: () => {},
119
117
  deleteMessageById: () => {},
@@ -36,8 +36,6 @@ let deletedMessageIds: string[] = [];
36
36
  let updatedMessages: Array<{ id: string; content: string }> = [];
37
37
 
38
38
  mock.module("../memory/conversation-crud.js", () => ({
39
- setConversationProcessingStartedAt: () => {},
40
- isConversationProcessing: () => false,
41
39
  getMessages: (conversationId: string) =>
42
40
  dbMessages.filter((m) => m.conversationId === conversationId),
43
41
  deleteMessageById: (messageId: string) => {
@@ -74,8 +74,6 @@ let mockConversation: Record<string, unknown> | null = null;
74
74
  let nextMockMessageId = 1;
75
75
 
76
76
  mock.module("../memory/conversation-crud.js", () => ({
77
- setConversationProcessingStartedAt: () => {},
78
- isConversationProcessing: () => false,
79
77
  updateConversationContextWindow: () => {},
80
78
  deleteMessageById: () => {},
81
79
  updateConversationTitle: () => {},
@@ -70,8 +70,6 @@ let mockDbMessages: Array<{
70
70
  let mockConversation: Record<string, unknown> | null = null;
71
71
 
72
72
  mock.module("../memory/conversation-crud.js", () => ({
73
- setConversationProcessingStartedAt: () => {},
74
- isConversationProcessing: () => false,
75
73
  updateConversationContextWindow: () => {},
76
74
  deleteMessageById: () => {},
77
75
  updateConversationTitle: () => {},
@@ -51,8 +51,6 @@ const getConversationMock = mock((id: string) => {
51
51
  });
52
52
 
53
53
  mock.module("../memory/conversation-crud.js", () => ({
54
- setConversationProcessingStartedAt: () => {},
55
- isConversationProcessing: () => false,
56
54
  setConversationOriginChannelIfUnset: () => {},
57
55
  updateConversationContextWindow: () => {},
58
56
  deleteMessageById: () => {},
@@ -46,8 +46,6 @@ mock.module("../runtime/assistant-event-hub.js", () => ({
46
46
  }));
47
47
 
48
48
  mock.module("../memory/conversation-crud.js", () => ({
49
- setConversationProcessingStartedAt: () => {},
50
- isConversationProcessing: () => false,
51
49
  setConversationOriginChannelIfUnset: () => {},
52
50
  setConversationOriginInterfaceIfUnset: () => {},
53
51
  provenanceFromTrustContext: () => ({
@@ -157,8 +157,6 @@ let mockDbMessages: Array<{ id: string; role: string; content: string }> = [];
157
157
  let mockConversation: Record<string, unknown> | null = null;
158
158
 
159
159
  mock.module("../memory/conversation-crud.js", () => ({
160
- setConversationProcessingStartedAt: () => {},
161
- isConversationProcessing: () => false,
162
160
  setConversationOriginChannelIfUnset: () => {},
163
161
  setConversationOriginInterfaceIfUnset: () => {},
164
162
  updateConversationContextWindow: () => {},
@@ -98,8 +98,6 @@ mock.module("../security/secret-allowlist.js", () => ({
98
98
  }));
99
99
 
100
100
  mock.module("../memory/conversation-crud.js", () => ({
101
- setConversationProcessingStartedAt: () => {},
102
- isConversationProcessing: () => false,
103
101
  setConversationOriginChannelIfUnset: () => {},
104
102
  deleteMessageById: () => {},
105
103
  getMessages: () => [],