@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
@@ -66,6 +66,14 @@
66
66
  "description": "Gate per-turn conversation trace (user/assistant/tool-call/tool-response) collection. The daemon attaches a trace to its turn telemetry only when this flag AND the owner's share_diagnostics consent are both on. Defaults off (fail-closed) — the live value is delivered from LaunchDarkly.",
67
67
  "defaultEnabled": false
68
68
  },
69
+ {
70
+ "id": "workspace-tools-watcher",
71
+ "scope": "assistant",
72
+ "key": "workspace-tools-watcher",
73
+ "label": "Workspace tools file watcher",
74
+ "description": "Hot-reload workspace tool overrides under `<workspaceDir>/tools/` by watching the directory and re-registering tools as files change. When disabled, workspace tools still load from disk once at daemon startup, but live edits require a restart to take effect.",
75
+ "defaultEnabled": false
76
+ },
69
77
  {
70
78
  "id": "settings-developer-nav",
71
79
  "scope": "assistant",
@@ -403,11 +411,11 @@
403
411
  "defaultEnabled": false
404
412
  },
405
413
  {
406
- "id": "mcp-add-server",
414
+ "id": "mcp-settings",
407
415
  "scope": "assistant",
408
- "key": "mcp-add-server",
409
- "label": "MCP Add Server",
410
- "description": "Show the Add Server action on the MCP settings page. The MCP page itself remains visible; this flag gates only creating new Model Context Protocol server connections.",
416
+ "key": "mcp-settings",
417
+ "label": "MCP Settings",
418
+ "description": "Show the MCP page in Settings for managing Model Context Protocol server connections: view status, enable/disable, configure, and inspect registered tools per server.",
411
419
  "defaultEnabled": false
412
420
  },
413
421
  {
@@ -415,7 +423,7 @@
415
423
  "scope": "assistant",
416
424
  "key": "os-beta",
417
425
  "label": "OS Beta",
418
- "description": "Enable the OS Beta model profile (MiniMax M3 / Together) in the assistant's model profile selection.",
426
+ "description": "Enable the OS Beta model profile (GLM 5.2 / Fireworks) in the assistant's model profile selection.",
419
427
  "defaultEnabled": false
420
428
  }
421
429
  ]
@@ -14,7 +14,6 @@ import {
14
14
  getConfigQuarantineNoticePath,
15
15
  getWorkspaceConfigPath,
16
16
  } from "../util/platform.js";
17
- import { pruneSeededCallsiteDefaultsFromConfig } from "./prune-seeded-callsite-defaults.js";
18
17
  import { AssistantConfigSchema } from "./schema.js";
19
18
  import type { AssistantConfig } from "./types.js";
20
19
 
@@ -301,20 +300,14 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
301
300
  }
302
301
 
303
302
  // Strip invalid fields by setting them to undefined so Zod defaults apply,
304
- // then re-parse. We walk the error paths and delete the offending keys,
305
- // pruning any ancestor object the deletion leaves empty. Pruning matters for
306
- // nested overrides like `llm.callSites.<id>.profile`: stripping just the
307
- // invalid `.profile` leaf would leave `llm.callSites.<id> = {}`, which the
308
- // resolver treats as a present (non-default) override and so skips the
309
- // shipped call-site default — silently downgrading the call site to the
310
- // active profile. Removing the emptied object lets that default apply.
303
+ // then re-parse. We walk the error paths and delete the offending keys.
311
304
  const cleaned = structuredClone(raw);
312
305
  for (const issue of result.error.issues) {
313
306
  if (issue.path.length === 0) {
314
307
  // Top-level error — return full defaults
315
308
  return cloneDefaultConfig();
316
309
  }
317
- deleteNestedKey(cleaned, issue.path as (string | number)[], true);
310
+ deleteNestedKey(cleaned, issue.path as (string | number)[]);
318
311
  }
319
312
 
320
313
  const retry = AssistantConfigSchema.safeParse(cleaned);
@@ -327,42 +320,17 @@ function validateWithSchema(raw: Record<string, unknown>): AssistantConfig {
327
320
  return cloneDefaultConfig();
328
321
  }
329
322
 
330
- /**
331
- * Delete the key at `path` from `obj`. When `pruneEmptyAncestors` is set, also
332
- * remove any ancestor object the deletion leaves empty, walking up until the
333
- * first ancestor that still holds other keys. Only empty plain objects are
334
- * pruned (arrays are left alone), and a still-populated ancestor stops the walk
335
- * so a container holding other config is never removed.
336
- */
337
323
  function deleteNestedKey(
338
324
  obj: Record<string, unknown>,
339
325
  path: (string | number)[],
340
- pruneEmptyAncestors = false,
341
326
  ): void {
342
- // Record each (container, key) hop on the way down so we can prune upward
343
- // after deleting the leaf.
344
- const chain: Array<{ container: Record<string, unknown>; key: string }> = [];
345
327
  let current: unknown = obj;
346
328
  for (let i = 0; i < path.length - 1; i++) {
347
329
  if (current == null || typeof current !== "object") return;
348
- const key = String(path[i]);
349
- chain.push({ container: current as Record<string, unknown>, key });
350
- current = (current as Record<string, unknown>)[key];
330
+ current = (current as Record<string, unknown>)[String(path[i])];
351
331
  }
352
- if (current == null || typeof current !== "object") return;
353
- delete (current as Record<string, unknown>)[String(path[path.length - 1])];
354
-
355
- if (!pruneEmptyAncestors) return;
356
- // Remove ancestors emptied by the deletion, deepest first; stop at the first
357
- // that still has keys.
358
- for (let i = chain.length - 1; i >= 0; i--) {
359
- const { container, key } = chain[i];
360
- const child = container[key];
361
- if (isPlainObject(child) && Object.keys(child).length === 0) {
362
- delete container[key];
363
- } else {
364
- break;
365
- }
332
+ if (current != null && typeof current === "object") {
333
+ delete (current as Record<string, unknown>)[String(path[path.length - 1])];
366
334
  }
367
335
  }
368
336
 
@@ -630,7 +598,6 @@ export function mergeDefaultWorkspaceConfig(): DefaultWorkspaceConfigMergeResult
630
598
  }
631
599
 
632
600
  deepMergeOverwrite(existing, defaults as Record<string, unknown>);
633
- pruneSeededCallsiteDefaultsFromConfig(existing);
634
601
 
635
602
  const dir = dirname(configPath);
636
603
  if (!existsSync(dir)) {
@@ -22,7 +22,6 @@ describe("MemoryV3ConfigSchema", () => {
22
22
  needleK: 100,
23
23
  denseK: 100,
24
24
  replyQueryK: 12,
25
- selectorPromptPath: null,
26
25
  edge: { hubDegree: 30, seedCount: 18, perSeed: 6, cap: 45 },
27
26
  });
28
27
  });
@@ -78,17 +78,6 @@ export const MemoryJobsConfigSchema = MemoryJobsConfigInputSchema.transform(
78
78
  },
79
79
  ).describe("Memory background job processing configuration");
80
80
 
81
- export const MemoryWorkerConfigSchema = z
82
- .object({
83
- enabled: z
84
- .boolean({ error: "memory.worker.enabled must be a boolean" })
85
- .default(false)
86
- .describe(
87
- "Whether the memory jobs worker runs as a separate OS process spawned at assistant startup (the `assistant memory worker` implementation) instead of on the assistant's main event loop. Only affects startup; shutdown stops whichever worker is actually running.",
88
- ),
89
- })
90
- .describe("Memory jobs worker process configuration");
91
-
92
81
  export const MemoryRetentionConfigSchema = z
93
82
  .object({
94
83
  keepRawForever: z
@@ -196,7 +185,6 @@ export const MemoryMaintenanceConfigSchema = z
196
185
  );
197
186
 
198
187
  export type MemoryJobsConfig = z.infer<typeof MemoryJobsConfigSchema>;
199
- export type MemoryWorkerConfig = z.infer<typeof MemoryWorkerConfigSchema>;
200
188
  export type MemoryRetentionConfig = z.infer<typeof MemoryRetentionConfigSchema>;
201
189
  export type MemoryCleanupConfig = z.infer<typeof MemoryCleanupConfigSchema>;
202
190
  export type MemoryMaintenanceConfig = z.infer<
@@ -259,13 +259,6 @@ export const MemoryV3ConfigSchema = z
259
259
  .describe(
260
260
  "Per-lane article budget for the reply-query finder pass: needle and dense each re-run over the assistant's previous message as separate queries (never concatenated with the user's message). 0 disables the pass. Deliberately small next to needleK/denseK — the pass adds the assistant-side retrieval signal, not a second full sweep.",
261
261
  ),
262
- selectorPromptPath: z
263
- .string({ error: "memory.v3.selectorPromptPath must be a string" })
264
- .nullable()
265
- .default(null)
266
- .describe(
267
- "Optional path to a file whose contents replace the bundled per-turn selector system prompt (the instructions that tell the selector which candidate pages to keep). Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The selector prompt takes no placeholders — the candidate pool is supplied separately as the user message — so the file is used verbatim. If the file is missing, unreadable, empty, or over 1 MiB, the bundled prompt is used and a warning is logged.",
268
- ),
269
262
  edge: MemoryV3EdgeSchema.default(MemoryV3EdgeSchema.parse({})),
270
263
  })
271
264
  .describe("Memory v3 — section-grain lane retrieval");
@@ -5,7 +5,6 @@ import {
5
5
  MemoryJobsConfigSchema,
6
6
  MemoryMaintenanceConfigSchema,
7
7
  MemoryRetentionConfigSchema,
8
- MemoryWorkerConfigSchema,
9
8
  } from "./memory-lifecycle.js";
10
9
  import {
11
10
  MemoryExtractionConfigSchema,
@@ -40,9 +39,6 @@ export const MemoryConfigSchema = z
40
39
  MemorySegmentationConfigSchema.parse({}),
41
40
  ),
42
41
  jobs: MemoryJobsConfigSchema.default(MemoryJobsConfigSchema.parse({})),
43
- worker: MemoryWorkerConfigSchema.default(
44
- MemoryWorkerConfigSchema.parse({}),
45
- ),
46
42
  retention: MemoryRetentionConfigSchema.default(
47
43
  MemoryRetentionConfigSchema.parse({}),
48
44
  ),
@@ -28,14 +28,6 @@ export const TimeoutConfigSchema = z
28
28
  .describe(
29
29
  "How long to wait for user permission approval before timing out (seconds)",
30
30
  ),
31
- questionResponseTimeoutSec: z
32
- .number({ error: "timeouts.questionResponseTimeoutSec must be a number" })
33
- .finite("timeouts.questionResponseTimeoutSec must be finite")
34
- .positive("timeouts.questionResponseTimeoutSec must be a positive number")
35
- .default(1800)
36
- .describe(
37
- "Backstop timeout for an unanswered ask_question prompt (seconds). The primary way an interactive user dismisses a prompt is by moving on — enqueuing another message supersedes it — so this only bounds a prompt left open with no response and no follow-up message.",
38
- ),
39
31
  toolExecutionTimeoutSec: z
40
32
  .number({ error: "timeouts.toolExecutionTimeoutSec must be a number" })
41
33
  .finite("timeouts.toolExecutionTimeoutSec must be finite")
@@ -88,24 +88,15 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
88
88
  // profile there's nothing stronger to consult, so the advisor defaults off.
89
89
  advisorEnabled: false,
90
90
  },
91
- // Served by DeepSeek V4 Flash on Fireworks via managed platform inference: a
92
- // fast, low-cost open model. `model` is pinned explicitly rather than
93
- // resolved via the `latency-optimized` intent (which still maps to Kimi K2.5
94
- // on Fireworks and Anthropic Haiku elsewhere).
95
- //
96
- // `effort: "none"` (not "low") because Fireworks is not thinking-aware: the
97
- // disabled `thinking` config is stripped before the request, so a non-"none"
98
- // effort would be sent as `reasoning_effort` and make this profile pay for
99
- // reasoning despite thinking being off. "none" keeps Speed non-reasoning.
100
91
  "cost-optimized": {
101
- model: "accounts/fireworks/models/deepseek-v4-flash",
102
- provider: "fireworks",
103
- connectionName: "fireworks-managed",
92
+ intent: "latency-optimized",
93
+ provider: "anthropic",
94
+ connectionName: "anthropic-managed",
104
95
  source: "managed",
105
96
  label: "Speed",
106
- description: "Fastest responses at lower cost (DeepSeek V4 Flash)",
97
+ description: "Fastest responses at lower cost",
107
98
  maxTokens: 8192,
108
- effort: "none",
99
+ effort: "low",
109
100
  thinking: { enabled: false, streamThinking: false },
110
101
  contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
111
102
  },
@@ -164,20 +155,19 @@ export const OS_BETA_FEATURE_FLAG_KEY = "os-beta";
164
155
  * Flag-gated managed profile. NOT in MANAGED_PROFILE_TEMPLATES, so the
165
156
  * unconditional boot seed never creates it. Reconciled in/out by
166
157
  * the flag-gated profile reconcile based on the `os-beta` feature flag.
167
- * Balanced defaults, with lower reasoning effort while the profile is in beta.
158
+ * Balanced-parity defaults; GLM 5.2 pinned explicitly via `model`.
168
159
  */
169
160
  export const OS_BETA_PROFILE_TEMPLATE: ManagedProfileTemplate = {
170
- intent: "balanced",
171
- provider: "together",
172
- connectionName: "together-managed",
161
+ model: "accounts/fireworks/models/glm-5p2",
162
+ provider: "fireworks",
163
+ connectionName: "fireworks-managed",
173
164
  source: "managed",
174
165
  label: "OS Beta",
175
- description: "Good balance of quality, cost, and speed, in beta",
166
+ description: "Open-source frontier model (GLM 5.2), in beta",
176
167
  maxTokens: 32000,
177
- effort: "low",
168
+ effort: "high",
178
169
  thinking: { enabled: true, streamThinking: true },
179
170
  contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
180
- topP: 0.95,
181
171
  };
182
172
 
183
173
  // Membership here marks a name as managed. The route layer applies managed
@@ -688,9 +688,6 @@ function discoverSkillDirectories(skillsDir: string): string[] {
688
688
  * parseable `package.json` whose `name` equals the directory name. This
689
689
  * mirrors the external plugin loader's recognition gate, which skips any
690
690
  * directory whose `manifest.name` does not match its directory name.
691
- *
692
- * The caller is responsible for the missing-`package.json` case (it emits a
693
- * diagnostic warning); this function only judges a manifest that is present.
694
691
  */
695
692
  function isRecognizedPluginDir(pluginDir: string, dirName: string): boolean {
696
693
  const manifestPath = join(pluginDir, "package.json");
@@ -738,31 +735,12 @@ function discoverPluginResidentSkills(): SkillSummary[] {
738
735
  for (const entry of entries) {
739
736
  if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
740
737
  const pluginDir = join(pluginsDir, entry.name);
741
-
742
- // A directory under `plugins/` with no `package.json` is not a plugin the
743
- // runtime can load, so its skills are never surfaced. This is an easy
744
- // footgun — a plugin dropped in without its manifest looks installed but
745
- // silently contributes nothing — so warn loudly with the path rather than
746
- // skipping in silence, to make the misconfiguration diagnosable.
747
- if (!existsSync(join(pluginDir, "package.json"))) {
748
- log.warn(
749
- { pluginDir },
750
- "Plugin directory is missing package.json — skipping; its skills will not be available. Add a package.json whose `name` matches the directory.",
751
- );
752
- continue;
753
- }
754
-
755
- // Honor the `.disabled` sentinel the runtime plugin scan checks
756
- // (`plugins/mtime-cache.ts`): a disabled plugin contributes no hooks or
757
- // tools, so its resident skills must not be loadable either.
758
- if (existsSync(join(pluginDir, ".disabled"))) continue;
759
-
760
738
  // Mirror the plugin loader's recognition gate: a directory is a real
761
- // installed plugin only if its `package.json` `name` matches the directory.
762
- // This rejects staging dirs and malformed/mismatched clones (e.g. an
763
- // un-adapted `caveman-installer`) that the loader itself would skip, so the
764
- // catalog never surfaces skills from a directory the runtime would refuse
765
- // to load.
739
+ // installed plugin only if it carries a parseable `package.json` whose
740
+ // `name` matches the directory. This rejects staging dirs, stray files,
741
+ // and malformed/mismatched clones (e.g. an un-adapted `caveman-installer`)
742
+ // that the loader itself would skip, so the catalog never surfaces skills
743
+ // from a directory the runtime would refuse to load.
766
744
  if (!isRecognizedPluginDir(pluginDir, entry.name)) continue;
767
745
 
768
746
  const skillsDir = join(pluginDir, "skills");
@@ -23,12 +23,12 @@ const log = getLogger("sync-gated-profiles");
23
23
  * Reconcile flag-gated managed profiles against the current feature-flag state.
24
24
  *
25
25
  * `seedInferenceProfiles()` runs synchronously at boot before feature flags are
26
- * available, so the OS Beta profile (MiniMax M3 / together-managed) is
27
- * materialized here once flags have loaded. When the `os-beta` flag is on, the
28
- * managed profile is created (ordered right after `balanced`); when it is off, a
29
- * previously managed entry is removed with `profileOrder` / `activeProfile` /
30
- * `advisorProfile` fallbacks. The reconcile is idempotent and never touches a
31
- * user-owned profile of the same name.
26
+ * available, so the OS Beta profile (GLM 5.2 / fireworks-managed) is materialized
27
+ * here once flags have loaded. When the `os-beta` flag is on, the managed profile
28
+ * is created (ordered right after `balanced`); when it is off, a previously
29
+ * managed entry is removed with `profileOrder` / `activeProfile` / `advisorProfile`
30
+ * fallbacks. The reconcile is idempotent and never touches a user-owned profile of
31
+ * the same name.
32
32
  *
33
33
  * Returns whether the on-disk config changed.
34
34
  */
@@ -105,22 +105,23 @@ function enableProfile(
105
105
  OS_BETA_PROFILE_TEMPLATE.connectionName,
106
106
  ) as Record<string, unknown>;
107
107
 
108
- // BYOK installs seed managed profiles disabled: the managed inference
109
- // connection backing this profile isn't usable until the user enables it, so a
110
- // fresh OS Beta entry starts disabled to avoid offering an unusable route. A
111
- // user's own status override (preserved below) wins on later reconciles.
108
+ // BYOK installs seed managed profiles disabled: the platform-auth
109
+ // `fireworks-managed` connection backing this profile isn't usable until the
110
+ // user enables it, so a fresh OS Beta entry starts disabled to avoid offering
111
+ // an unusable route. A user's own status override (preserved below) wins on
112
+ // later reconciles.
112
113
  if (isByokMode && !previous) {
113
114
  next.status = "disabled";
114
115
  }
115
116
 
116
117
  if (previous) {
117
- // Preserve user-owned overrides across reconciles.
118
+ // The only fields a user may override on a managed profile. Carry `label`
119
+ // by key-presence so an explicit null (user cleared it) survives too.
118
120
  if ("label" in previous) next.label = previous.label;
119
121
  if ("status" in previous) next.status = previous.status;
120
122
  if ("advisorEnabled" in previous) {
121
123
  next.advisorEnabled = previous.advisorEnabled;
122
124
  }
123
- if ("topP" in previous) next.topP = previous.topP;
124
125
  }
125
126
 
126
127
  let changed = false;
@@ -30,9 +30,6 @@ import type {
30
30
  * Returns true when a guardian channel was found and revoked, false otherwise.
31
31
  */
32
32
  export function revokeGuardianBinding(channel: string): boolean {
33
- // Local-store read, not the gateway: this read selects the row that the
34
- // updateChannelStatus write below mutates, so it must stay transactionally
35
- // consistent with that write. Leave for Combo 11 / gateway-bootstrap-binding.
36
33
  const guardian = findGuardianForChannel(channel);
37
34
  if (!guardian) return false;
38
35
 
@@ -284,19 +284,6 @@ interface VellumLinkExtractResult {
284
284
  * markdown links from assistant text and return corresponding directive
285
285
  * requests. The text is NOT modified — the links remain as rendered markdown.
286
286
  */
287
- /**
288
- * Decode a vellum:// path segment, returning null on malformed percent-encoding
289
- * (e.g. a literal `%` not followed by two hex digits). This prevents a single
290
- * bad link from throwing URIError and aborting the entire assistant message.
291
- */
292
- function safeDecodePath(rawPath: string): string | null {
293
- try {
294
- return decodeURIComponent(rawPath);
295
- } catch {
296
- return null;
297
- }
298
- }
299
-
300
287
  export function extractVellumLinks(text: string): VellumLinkExtractResult {
301
288
  const directiveRequests: DirectiveRequest[] = [];
302
289
  const parseWarnings: string[] = [];
@@ -307,19 +294,9 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
307
294
  const authority = m[2]!;
308
295
  const rawPath = m[3]!;
309
296
 
310
- const decodedPath = safeDecodePath(rawPath);
311
- if (decodedPath === null) {
312
- parseWarnings.push(
313
- `Ignored vellum://${authority} link "${linkText}": malformed percent-encoding in path.`,
314
- );
315
- continue;
316
- }
317
-
318
297
  if (authority === "workspace") {
319
298
  // Strip the leading "/" to get a workspace-relative path
320
- const path = decodedPath.startsWith("/")
321
- ? decodedPath.slice(1)
322
- : decodedPath;
299
+ const path = rawPath.startsWith("/") ? rawPath.slice(1) : rawPath;
323
300
  if (!path) {
324
301
  parseWarnings.push(
325
302
  `Ignored vellum://workspace link "${linkText}": empty path.`,
@@ -333,8 +310,8 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
333
310
  mimeType: undefined,
334
311
  });
335
312
  } else {
336
- // host: decodedPath is already absolute (starts with /)
337
- if (!decodedPath || decodedPath === "/") {
313
+ // host: rawPath is already absolute (starts with /)
314
+ if (!rawPath || rawPath === "/") {
338
315
  parseWarnings.push(
339
316
  `Ignored vellum://host link "${linkText}": empty path.`,
340
317
  );
@@ -342,7 +319,7 @@ export function extractVellumLinks(text: string): VellumLinkExtractResult {
342
319
  }
343
320
  directiveRequests.push({
344
321
  source: "host",
345
- path: decodedPath,
322
+ path: rawPath,
346
323
  filename: linkText || undefined,
347
324
  mimeType: undefined,
348
325
  });
@@ -100,10 +100,6 @@ import {
100
100
  isUserCancellation,
101
101
  } from "./conversation-error.js";
102
102
  import { raceWithTimeout } from "./conversation-media-retry.js";
103
- import {
104
- clearConversationNotices,
105
- drainConversationNotices,
106
- } from "./conversation-notices.js";
107
103
  import {
108
104
  getSlackCompactionWatermarkForPrefix,
109
105
  loadSlackChronologicalContext,
@@ -484,11 +480,6 @@ export async function runAgentLoopImpl(
484
480
  // resolved once here and threaded into every re-injection — including the
485
481
  // post-compaction hook — rather than re-read per assembly call.
486
482
  const isNonInteractive = !isInteractiveResolved;
487
- // Expose the resolved turn-level interactivity to tool execution so tools
488
- // (e.g. ask_question) see whether a human is present to answer, rather than
489
- // re-deriving it from live client state that misclassifies a scheduled turn
490
- // running on a client-attached conversation.
491
- ctx.currentTurnIsNonInteractive = isNonInteractive;
492
483
  const diskPressureDecision = classifyDiskPressureTurnPolicy(
493
484
  getDiskPressureStatus(),
494
485
  {
@@ -1021,15 +1012,6 @@ export async function runAgentLoopImpl(
1021
1012
  );
1022
1013
  }
1023
1014
 
1024
- const shouldEmitQueuedConversationNotices =
1025
- !overflowTerminalReason &&
1026
- !yieldedForHandoff &&
1027
- !state.providerErrorUserMessage &&
1028
- !abortController.signal.aborted;
1029
- if (!shouldEmitQueuedConversationNotices) {
1030
- clearConversationNotices(ctx.conversationId);
1031
- }
1032
-
1033
1015
  // Flush remaining tool results. On a normal turn these drain at the next
1034
1016
  // `message_complete`; an aborted or yielded loop exits with them still
1035
1017
  // buffered, so finalize the (possibly already on-arrival-reserved) grouped
@@ -1422,16 +1404,10 @@ export async function runAgentLoopImpl(
1422
1404
  ? { messageId: state.lastAssistantMessageId }
1423
1405
  : {}),
1424
1406
  });
1425
- if (shouldEmitQueuedConversationNotices) {
1426
- for (const notice of drainConversationNotices(ctx.conversationId)) {
1427
- onEvent(notice);
1428
- }
1429
- }
1430
1407
  publishLoopMessagesChanged();
1431
1408
  }
1432
1409
  }
1433
1410
  } catch (err) {
1434
- clearConversationNotices(ctx.conversationId);
1435
1411
  const errorCtx = {
1436
1412
  phase: "agent_loop" as const,
1437
1413
  aborted: abortController.signal.aborted,
@@ -1539,10 +1515,6 @@ export async function runAgentLoopImpl(
1539
1515
  ctx.diskPressureCleanupModeActive = false;
1540
1516
  ctx.preactivatedSkillIds = undefined;
1541
1517
  ctx.currentTurnOverrideProfile = undefined;
1542
- // Turn-scoped interactivity. Clear it so paths that bypass this loop (e.g.
1543
- // opportunity wakes calling `agentLoop.run` directly) don't inherit a stale
1544
- // value and instead fall back to live client state in the tool context.
1545
- ctx.currentTurnIsNonInteractive = undefined;
1546
1518
  // Channel command intents (e.g. Telegram /start) are single-turn metadata.
1547
1519
  // Clear at turn end so they never leak into subsequent unrelated messages.
1548
1520
  ctx.commandIntent = undefined;
@@ -60,21 +60,6 @@ import { resolveVerificationSessionIntent } from "./verification-session-intent.
60
60
 
61
61
  const log = getLogger("conversation-process");
62
62
 
63
- /**
64
- * Daemon-injected subagent lifecycle notifications carry `subagentNotification`
65
- * metadata. They are persisted into the parent conversation so the orchestrator
66
- * wakes and reads the subagent's result, but they are internal scaffolding — the
67
- * user sees subagent activity through the inline progress card, not a chat turn.
68
- * Skip the `user_message_echo` broadcast for these so they never render as a live
69
- * user bubble; the persisted row is filtered from the rendered transcript on the
70
- * client.
71
- */
72
- function isSubagentNotificationMessage(
73
- metadata: Record<string, unknown> | undefined,
74
- ): boolean {
75
- return metadata?.subagentNotification != null;
76
- }
77
-
78
63
  /** Format the result of a forced compaction into a user-facing message. */
79
64
  export function formatCompactResult(result: ContextWindowResult): string {
80
65
  const fmt = (n: number | undefined) => (n ?? 0).toLocaleString("en-US");
@@ -868,16 +853,14 @@ async function drainSingleMessage(
868
853
 
869
854
  // Broadcast the user message to all hub subscribers so passive devices
870
855
  // see the user turn before the assistant reply starts streaming.
871
- if (!isSubagentNotificationMessage(next.metadata)) {
872
- next.onEvent({
873
- type: "user_message_echo",
874
- text: resolvedContent,
875
- conversationId: conversation.conversationId,
876
- messageId: userMessageId,
877
- requestId: next.requestId,
878
- clientMessageId: next.clientMessageId,
879
- });
880
- }
856
+ next.onEvent({
857
+ type: "user_message_echo",
858
+ text: resolvedContent,
859
+ conversationId: conversation.conversationId,
860
+ messageId: userMessageId,
861
+ requestId: next.requestId,
862
+ clientMessageId: next.clientMessageId,
863
+ });
881
864
  publishConversationMessagesChanged(conversation.conversationId);
882
865
 
883
866
  // Set the active surface for the dequeued message so runAgentLoop can inject context
@@ -1221,16 +1204,14 @@ async function drainBatch(
1221
1204
 
1222
1205
  // Broadcast the user message to all hub subscribers so passive devices
1223
1206
  // see each batched user turn before the assistant reply starts streaming.
1224
- if (!isSubagentNotificationMessage(qm.metadata)) {
1225
- qm.onEvent({
1226
- type: "user_message_echo",
1227
- text: qmContent,
1228
- conversationId: conversation.conversationId,
1229
- messageId: lastUserMessageId,
1230
- requestId: qm.requestId,
1231
- clientMessageId: qm.clientMessageId,
1232
- });
1233
- }
1207
+ qm.onEvent({
1208
+ type: "user_message_echo",
1209
+ text: qmContent,
1210
+ conversationId: conversation.conversationId,
1211
+ messageId: lastUserMessageId,
1212
+ requestId: qm.requestId,
1213
+ clientMessageId: qm.clientMessageId,
1214
+ });
1234
1215
  publishConversationMessagesChanged(conversation.conversationId);
1235
1216
 
1236
1217
  // Persist succeeded. Update last-successful markers so a later tail