@vellumai/assistant 0.9.0 → 0.10.0-dev.202606192226.8ed8a6a

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 (624) hide show
  1. package/ARCHITECTURE.md +19 -35
  2. package/bun.lock +7 -8
  3. package/docs/activation-funnel-telemetry.md +28 -22
  4. package/docs/architecture/security.md +29 -28
  5. package/docs/stt-provider-onboarding.md +3 -5
  6. package/docs/workflows-testing.md +13 -44
  7. package/docs/workflows.md +3 -5
  8. package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
  9. package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
  10. package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
  11. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +97 -0
  12. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
  13. package/node_modules/@vellumai/gateway-client/src/index.ts +32 -6
  14. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
  15. package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
  16. package/openapi.yaml +1128 -119
  17. package/package.json +2 -1
  18. package/scripts/sync-llm-catalog.ts +6 -15
  19. package/scripts/sync-web-search-catalog.ts +3 -11
  20. package/src/__tests__/access-request-card-view.test.ts +98 -0
  21. package/src/__tests__/access-request-seed-content-blocks.test.ts +2 -4
  22. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +72 -32
  23. package/src/__tests__/agent-loop-compaction-strip.test.ts +241 -0
  24. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +16 -13
  25. package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
  26. package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
  27. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  28. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
  29. package/src/__tests__/app-compiler.test.ts +15 -1
  30. package/src/__tests__/app-dir-path-guard.test.ts +0 -1
  31. package/src/__tests__/approval-cascade.test.ts +6 -0
  32. package/src/__tests__/approval-routes-http.test.ts +128 -0
  33. package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
  34. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  35. package/src/__tests__/auth-fallback-events-store.test.ts +6 -14
  36. package/src/__tests__/avatar-identity-sync.test.ts +2 -27
  37. package/src/__tests__/btw-routes.test.ts +6 -8
  38. package/src/__tests__/call-pointer-messages.test.ts +28 -0
  39. package/src/__tests__/cancel-clears-processing.test.ts +89 -0
  40. package/src/__tests__/channel-approval-routes.test.ts +0 -4
  41. package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -15
  42. package/src/__tests__/checker.test.ts +0 -3
  43. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -4
  44. package/src/__tests__/compaction-events.test.ts +6 -0
  45. package/src/__tests__/compactor-image-manifest-trust.test.ts +21 -1
  46. package/src/__tests__/compactor-summary-call-truncation.test.ts +223 -0
  47. package/src/__tests__/config-loader-backfill.test.ts +268 -27
  48. package/src/__tests__/config-schema.test.ts +35 -0
  49. package/src/__tests__/config-watcher.test.ts +0 -18
  50. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -2
  51. package/src/__tests__/contact-store-user-file.test.ts +0 -6
  52. package/src/__tests__/contacts-tools.test.ts +29 -0
  53. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  54. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
  55. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
  56. package/src/__tests__/conversation-agent-loop.test.ts +58 -0
  57. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  58. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  59. package/src/__tests__/conversation-lifecycle.test.ts +7 -9
  60. package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
  61. package/src/__tests__/conversation-process-callsite.test.ts +6 -0
  62. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  63. package/src/__tests__/conversation-queue.test.ts +6 -0
  64. package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
  65. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  66. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  68. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
  69. package/src/__tests__/conversation-title-service.test.ts +62 -0
  70. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  71. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  72. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  73. package/src/__tests__/credential-broker.test.ts +449 -1
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +18 -11
  75. package/src/__tests__/credential-execution-tools.test.ts +0 -1
  76. package/src/__tests__/credential-prompt-route.test.ts +4 -4
  77. package/src/__tests__/credential-routes.test.ts +360 -0
  78. package/src/__tests__/credential-security-invariants.test.ts +4 -13
  79. package/src/__tests__/disk-pressure-policy.test.ts +12 -0
  80. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  81. package/src/__tests__/disk-usage.test.ts +65 -0
  82. package/src/__tests__/document-tool-security.test.ts +9 -6
  83. package/src/__tests__/document-update-default-surface.test.ts +202 -0
  84. package/src/__tests__/dynamic-page-surface.test.ts +152 -1
  85. package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
  86. package/src/__tests__/gateway-flag-listener.test.ts +110 -1
  87. package/src/__tests__/gateway-only-guard.test.ts +3 -7
  88. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  89. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  90. package/src/__tests__/guardian-card-withdrawal.test.ts +403 -0
  91. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
  92. package/src/__tests__/guardian-grant-minting.test.ts +3 -35
  93. package/src/__tests__/guardian-routing-invariants.test.ts +64 -26
  94. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  95. package/src/__tests__/headless-browser-mode.test.ts +10 -0
  96. package/src/__tests__/headless-browser-navigate.test.ts +8 -3
  97. package/src/__tests__/helpers/create-guardian-binding.ts +0 -1
  98. package/src/__tests__/host-browser-proxy.test.ts +87 -0
  99. package/src/__tests__/identity-routes.test.ts +0 -189
  100. package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
  101. package/src/__tests__/injector-disk-pressure.test.ts +10 -5
  102. package/src/__tests__/injector-v3-suppression.test.ts +27 -20
  103. package/src/__tests__/internal-telemetry-routes.test.ts +6 -14
  104. package/src/__tests__/invite-redemption-service.test.ts +4 -7
  105. package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
  106. package/src/__tests__/llm-catalog-parity.test.ts +30 -23
  107. package/src/__tests__/llm-resolver.test.ts +70 -24
  108. package/src/__tests__/llm-schema.test.ts +1 -0
  109. package/src/__tests__/managed-profile-guard.test.ts +163 -4
  110. package/src/__tests__/mcp-health-check.test.ts +6 -7
  111. package/src/__tests__/media-stream-server-integration.test.ts +317 -13
  112. package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
  113. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  114. package/src/__tests__/path-policy.test.ts +34 -0
  115. package/src/__tests__/persona-resolver.test.ts +49 -14
  116. package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
  117. package/src/__tests__/plugin-api-provider.test.ts +24 -0
  118. package/src/__tests__/plugin-tool-contribution.test.ts +6 -3
  119. package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +214 -0
  120. package/src/__tests__/provider-send-message-override-profile.test.ts +76 -0
  121. package/src/__tests__/reaction-persistence.test.ts +150 -29
  122. package/src/__tests__/registry.test.ts +2 -7
  123. package/src/__tests__/relay-server.test.ts +285 -0
  124. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  125. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
  126. package/src/__tests__/schedule-routes.test.ts +0 -30
  127. package/src/__tests__/schedule-tools.test.ts +2 -18
  128. package/src/__tests__/scheduler-reuse-conversation.test.ts +8 -5
  129. package/src/__tests__/secret-response-routing.test.ts +35 -0
  130. package/src/__tests__/secret-routes-platform-proxy.test.ts +16 -2
  131. package/src/__tests__/skill-execute-input.test.ts +177 -1
  132. package/src/__tests__/skill-load-tool.test.ts +72 -0
  133. package/src/__tests__/skill-runtime-path.test.ts +2 -3
  134. package/src/__tests__/skills.test.ts +51 -0
  135. package/src/__tests__/slack-notification-approval-card.test.ts +176 -0
  136. package/src/__tests__/slack-reaction-canonical-approval.test.ts +285 -0
  137. package/src/__tests__/subagent-tools.test.ts +266 -0
  138. package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
  139. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  140. package/src/__tests__/task-progress-nudge-hook.test.ts +1 -1
  141. package/src/__tests__/title-generate-hook.test.ts +100 -3
  142. package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
  143. package/src/__tests__/token-manager.test.ts +519 -0
  144. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +1 -1
  145. package/src/__tests__/tool-audit-listener.test.ts +7 -7
  146. package/src/__tests__/tool-executor-lifecycle-events.test.ts +6 -3
  147. package/src/__tests__/tool-executor.test.ts +0 -79
  148. package/src/__tests__/trusted-contact-approval-notifier.test.ts +4 -2
  149. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +220 -3
  150. package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
  151. package/src/__tests__/trusted-contact-verification.test.ts +8 -10
  152. package/src/__tests__/twilio-routes.test.ts +81 -1
  153. package/src/__tests__/voice-invite-redemption.test.ts +2 -3
  154. package/src/__tests__/weak-open-model.test.ts +30 -0
  155. package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
  156. package/src/__tests__/workspace-greetings.test.ts +152 -0
  157. package/src/__tests__/workspace-migration-105-enable-memory-v3-live-for-new-workspaces.test.ts +149 -0
  158. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +285 -0
  159. package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +1 -1
  160. package/src/__tests__/workspace-migration-drop-collect-usage-data.test.ts +118 -0
  161. package/src/__tests__/workspace-migration-drop-send-diagnostics.test.ts +118 -0
  162. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +0 -4
  163. package/src/agent/loop.ts +75 -29
  164. package/src/api/README.md +6 -6
  165. package/src/api/events/tool-result.ts +6 -0
  166. package/src/api/events/workflow-completed.ts +53 -0
  167. package/src/api/events/workflow-leaf-finished.ts +38 -0
  168. package/src/api/events/workflow-leaf-started.ts +35 -0
  169. package/src/api/events/workflow-progress.ts +32 -0
  170. package/src/api/events/workflow-started.ts +31 -0
  171. package/src/api/index.ts +40 -0
  172. package/src/api/responses/conversation-message.ts +28 -4
  173. package/src/api/responses/home.ts +26 -4
  174. package/src/api/responses/workflow-journal.ts +53 -0
  175. package/src/approvals/guardian-card-withdrawal.ts +145 -0
  176. package/src/approvals/guardian-decision-primitive.ts +26 -3
  177. package/src/approvals/guardian-request-resolvers.ts +183 -80
  178. package/src/calls/__tests__/channel-admission-reader.test.ts +132 -0
  179. package/src/calls/__tests__/relay-setup-router.test.ts +350 -0
  180. package/src/calls/call-pointer-messages.ts +10 -4
  181. package/src/calls/channel-admission-reader.ts +104 -0
  182. package/src/calls/guardian-dispatch.ts +17 -45
  183. package/src/calls/media-stream-server.ts +84 -2
  184. package/src/calls/relay-access-wait.ts +1 -1
  185. package/src/calls/relay-server.ts +66 -0
  186. package/src/calls/relay-setup-router.ts +82 -1
  187. package/src/calls/twilio-routes.ts +17 -8
  188. package/src/calls/voice-session-bridge.ts +2 -2
  189. package/src/cli/commands/clients.ts +3 -0
  190. package/src/cli/commands/db/status.ts +37 -3
  191. package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2-compare-render.test.ts +1 -1
  192. package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2.test.ts +8 -7
  193. package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v3.test.ts +5 -4
  194. package/src/cli/commands/memory/index.ts +30 -0
  195. package/src/cli/commands/{memory-v2-compare-render.ts → memory/memory-v2-compare-render.ts} +1 -1
  196. package/src/cli/commands/{memory-v2.ts → memory/memory-v2.ts} +6 -15
  197. package/src/cli/commands/{memory-v3.ts → memory/memory-v3.ts} +97 -11
  198. package/src/cli/commands/oauth/status.test.ts +36 -0
  199. package/src/cli/commands/oauth/status.ts +23 -3
  200. package/src/cli/commands/plugins.ts +400 -14
  201. package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
  202. package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
  203. package/src/cli/lib/__tests__/install-from-github.test.ts +31 -0
  204. package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +443 -0
  205. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  206. package/src/cli/lib/__tests__/plugin-surfaces.test.ts +111 -0
  207. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +295 -2
  208. package/src/cli/lib/diff-plugin.ts +346 -0
  209. package/src/cli/lib/inspect-plugin.ts +12 -1
  210. package/src/cli/lib/install-from-github.ts +128 -19
  211. package/src/cli/lib/merge-plugin-tree.ts +328 -0
  212. package/src/cli/lib/plugin-fingerprint.ts +14 -0
  213. package/src/cli/lib/plugin-marketplace.ts +11 -0
  214. package/src/cli/lib/plugin-pin-history.ts +257 -0
  215. package/src/cli/lib/plugin-surfaces.ts +104 -0
  216. package/src/cli/lib/upgrade-plugin.ts +298 -10
  217. package/src/cli/program.ts +2 -6
  218. package/src/config/__tests__/sync-gated-profiles.test.ts +368 -0
  219. package/src/config/assistant-feature-flags.ts +22 -7
  220. package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -1
  221. package/src/config/bundled-skills/document-editor/SKILL.md +3 -3
  222. package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
  223. package/src/config/bundled-skills/messaging/SKILL.md +6 -4
  224. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -8
  225. package/src/config/bundled-skills/subagent/SKILL.md +4 -0
  226. package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
  227. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  228. package/src/config/bundled-skills/workflows/SKILL.md +14 -8
  229. package/src/config/bundled-tool-registry.ts +2 -7
  230. package/src/config/call-site-defaults.ts +15 -2
  231. package/src/config/feature-flag-registry.json +46 -31
  232. package/src/config/inference-profile-validation.ts +26 -0
  233. package/src/config/llm-resolver.ts +3 -0
  234. package/src/config/loader.ts +4 -0
  235. package/src/config/memory-v3-gate.ts +11 -0
  236. package/src/config/profile-order.ts +28 -0
  237. package/src/config/schema.ts +8 -6
  238. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  239. package/src/config/schemas/call-site-catalog.ts +7 -0
  240. package/src/config/schemas/channels.ts +11 -0
  241. package/src/config/schemas/elevenlabs.ts +0 -1
  242. package/src/config/schemas/llm.ts +31 -0
  243. package/src/config/schemas/memory-lifecycle.ts +3 -7
  244. package/src/config/schemas/memory-v3.ts +6 -0
  245. package/src/config/schemas/platform.ts +0 -8
  246. package/src/config/schemas/services.ts +18 -0
  247. package/src/config/seed-inference-profiles.ts +109 -44
  248. package/src/config/skills.ts +21 -0
  249. package/src/config/sync-gated-profiles.ts +220 -0
  250. package/src/contacts/contact-store.ts +89 -106
  251. package/src/contacts/contacts-write.ts +5 -22
  252. package/src/contacts/types.ts +0 -1
  253. package/src/context/compactor.ts +88 -54
  254. package/src/context/strip-injections.ts +58 -10
  255. package/src/context/token-estimator.ts +1 -1
  256. package/src/credential-execution/process-manager.ts +55 -14
  257. package/src/credential-execution/prompted-credential.ts +2 -3
  258. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -2
  259. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  260. package/src/daemon/config-watcher.ts +0 -4
  261. package/src/daemon/conversation-agent-loop-handlers.ts +2 -0
  262. package/src/daemon/conversation-agent-loop.ts +114 -22
  263. package/src/daemon/conversation-history.ts +1 -1
  264. package/src/daemon/conversation-lifecycle.ts +3 -5
  265. package/src/daemon/conversation-process.ts +13 -5
  266. package/src/daemon/conversation-runtime-assembly.ts +13 -15
  267. package/src/daemon/conversation-slash.ts +2 -23
  268. package/src/daemon/conversation-surfaces.ts +26 -0
  269. package/src/daemon/conversation-tool-setup.ts +53 -19
  270. package/src/daemon/conversation.ts +131 -20
  271. package/src/daemon/disk-pressure-policy.ts +5 -3
  272. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -1
  273. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -1
  274. package/src/daemon/handlers/config-a2a.ts +0 -2
  275. package/src/daemon/handlers/config-channels.ts +15 -16
  276. package/src/daemon/handlers/config-slack-channel.ts +22 -3
  277. package/src/daemon/handlers/conversations.ts +107 -0
  278. package/src/daemon/host-browser-proxy.ts +41 -0
  279. package/src/daemon/lifecycle.ts +55 -27
  280. package/src/daemon/memory-v2-startup.test.ts +131 -0
  281. package/src/daemon/memory-v2-startup.ts +100 -1
  282. package/src/daemon/message-provenance.ts +2 -0
  283. package/src/daemon/message-types/contacts.ts +0 -1
  284. package/src/daemon/message-types/conversations.ts +3 -3
  285. package/src/daemon/message-types/sync.ts +0 -1
  286. package/src/daemon/message-types/web-activity.ts +7 -1
  287. package/src/daemon/message-types/workflows.ts +83 -1
  288. package/src/daemon/orphan-reaper.test.ts +0 -19
  289. package/src/daemon/orphan-reaper.ts +2 -24
  290. package/src/daemon/server.ts +0 -10
  291. package/src/daemon/tool-setup-types.ts +4 -0
  292. package/src/daemon/trust-context.ts +1 -1
  293. package/src/daemon/wake-conversation-ops.ts +1 -0
  294. package/src/events/tool-audit-listener.ts +2 -2
  295. package/src/home/feed-source-enrichment.test.ts +151 -0
  296. package/src/home/feed-source-enrichment.ts +176 -0
  297. package/src/home/relationship-state.ts +2 -4
  298. package/src/instrument.ts +18 -6
  299. package/src/ipc/__tests__/binary-result-ipc.test.ts +81 -0
  300. package/src/ipc/__tests__/clients-list-ipc.test.ts +20 -0
  301. package/src/ipc/assistant-server.ts +37 -4
  302. package/src/ipc/gateway-flag-listener.ts +18 -2
  303. package/src/memory/__tests__/auto-analysis-enqueue.test.ts +5 -16
  304. package/src/memory/__tests__/db-logs-attach.test.ts +122 -0
  305. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -11
  306. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +37 -7
  307. package/src/memory/__tests__/memory-retrospective-job.test.ts +229 -401
  308. package/src/memory/__tests__/onboarding-events-store.test.ts +7 -7
  309. package/src/memory/auth-fallback-events-store.ts +2 -2
  310. package/src/memory/auto-analysis-enqueue.ts +3 -5
  311. package/src/memory/bookmark-crud.ts +1 -2
  312. package/src/memory/canonical-guardian-store.ts +39 -1
  313. package/src/memory/conversation-crud.ts +9 -4
  314. package/src/memory/conversation-key-store.ts +17 -2
  315. package/src/memory/conversation-title-service.ts +64 -7
  316. package/src/memory/db-async-query.ts +20 -2
  317. package/src/memory/db-connection.ts +49 -5
  318. package/src/memory/db-init.ts +17 -17
  319. package/src/memory/embedding-backend.ts +38 -1
  320. package/src/memory/embedding-billing-breaker.ts +96 -0
  321. package/src/memory/jobs-store.ts +25 -13
  322. package/src/memory/jobs-worker.ts +54 -1
  323. package/src/memory/lifecycle-events-store.ts +2 -2
  324. package/src/memory/memory-retrospective-constants.ts +4 -4
  325. package/src/memory/memory-retrospective-enqueue.ts +31 -6
  326. package/src/memory/memory-retrospective-job.ts +28 -227
  327. package/src/memory/migrations/129-contact-channels-access-fields.ts +18 -9
  328. package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +14 -2
  329. package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +10 -0
  330. package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +72 -0
  331. package/src/memory/migrations/292-schedule-default-no-reuse-conversation.test.ts +67 -0
  332. package/src/memory/migrations/292-schedule-default-no-reuse-conversation.ts +25 -0
  333. package/src/memory/migrations/293-workflow-journal-leaf-tokens.ts +32 -0
  334. package/src/memory/migrations/294-drop-external-user-id.ts +31 -0
  335. package/src/memory/migrations/295-drop-approval-prompt-ts-tracker.ts +20 -0
  336. package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +110 -0
  337. package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.ts +68 -0
  338. package/src/memory/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +154 -0
  339. package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +31 -0
  340. package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +341 -0
  341. package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
  342. package/src/memory/migrations/index.ts +6 -0
  343. package/src/memory/migrations/run-migrations.ts +41 -0
  344. package/src/memory/migrations/validate-migration-state.ts +1 -1
  345. package/src/memory/onboarding-events-store.ts +3 -3
  346. package/src/memory/schema/contacts.ts +0 -5
  347. package/src/memory/skill-loaded-events-store.test.ts +7 -15
  348. package/src/memory/skill-loaded-events-store.ts +2 -2
  349. package/src/memory/tool-executed-events-store.test.ts +7 -7
  350. package/src/memory/turn-trace-store.test.ts +736 -0
  351. package/src/memory/turn-trace-store.ts +364 -0
  352. package/src/memory/v2/__tests__/consolidation-job.test.ts +8 -0
  353. package/src/memory/v2/__tests__/skill-content.test.ts +30 -0
  354. package/src/memory/v2/consolidation-job.ts +2 -2
  355. package/src/memory/v2/skill-content.ts +25 -7
  356. package/src/memory/v2/skill-store.ts +7 -1
  357. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +248 -0
  358. package/src/memory/v3-eval/eval-packets.ts +546 -0
  359. package/src/messaging/providers/slack/adapter.ts +1 -1
  360. package/src/messaging/providers/slack/api.ts +31 -0
  361. package/src/messaging/providers/slack/send.test.ts +114 -2
  362. package/src/messaging/providers/slack/send.ts +30 -7
  363. package/src/messaging/providers/slack/withdraw.test.ts +200 -0
  364. package/src/messaging/providers/slack/withdraw.ts +161 -0
  365. package/src/notifications/AGENTS.md +2 -0
  366. package/src/notifications/access-request-copy.ts +72 -59
  367. package/src/notifications/adapters/shared.ts +29 -0
  368. package/src/notifications/adapters/slack.ts +58 -103
  369. package/src/notifications/adapters/telegram.ts +2 -20
  370. package/src/notifications/approval-card-data.ts +333 -0
  371. package/src/notifications/broadcaster.ts +16 -3
  372. package/src/notifications/canonical-delivery-recorder.ts +139 -0
  373. package/src/notifications/copy-composer.ts +3 -3
  374. package/src/notifications/decision-engine.ts +4 -2
  375. package/src/notifications/destination-resolver.ts +4 -6
  376. package/src/notifications/guardian-question-mode.ts +10 -0
  377. package/src/notifications/home-feed-side-effect.ts +7 -16
  378. package/src/notifications/notification-utils.ts +19 -20
  379. package/src/notifications/signal.ts +79 -43
  380. package/src/notifications/types.ts +98 -121
  381. package/src/oauth/AGENTS.md +5 -24
  382. package/src/permissions/checker.test.ts +51 -0
  383. package/src/permissions/checker.ts +185 -26
  384. package/src/permissions/ipc-risk-types.ts +24 -0
  385. package/src/permissions/question-prompter.test.ts +27 -0
  386. package/src/permissions/question-prompter.ts +4 -0
  387. package/src/permissions/secret-prompter.ts +15 -1
  388. package/src/platform/client.test.ts +119 -0
  389. package/src/platform/client.ts +66 -0
  390. package/src/platform/consent-cache.test.ts +267 -0
  391. package/src/platform/consent-cache.ts +174 -0
  392. package/src/plugin-api/constants.ts +1 -1
  393. package/src/plugin-api/index.ts +33 -1
  394. package/src/plugin-api/model-profiles.ts +33 -0
  395. package/src/plugin-api/types.ts +50 -2
  396. package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +56 -0
  397. package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +43 -0
  398. package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +137 -0
  399. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +153 -0
  400. package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +138 -0
  401. package/src/plugins/defaults/advisor/__tests__/transcript.test.ts +147 -0
  402. package/src/plugins/defaults/advisor/advisor-gate.ts +29 -0
  403. package/src/plugins/defaults/advisor/advisor-state-store.ts +94 -0
  404. package/src/plugins/defaults/advisor/config.ts +21 -0
  405. package/src/plugins/defaults/advisor/consult.ts +93 -0
  406. package/src/plugins/defaults/advisor/hooks/post-model-call.ts +34 -0
  407. package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +30 -0
  408. package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +19 -0
  409. package/src/plugins/defaults/advisor/package.json +14 -0
  410. package/src/plugins/defaults/advisor/steering.ts +67 -0
  411. package/src/plugins/defaults/advisor/tools/advisor.ts +65 -0
  412. package/src/plugins/defaults/advisor/transcript.ts +76 -0
  413. package/src/plugins/defaults/compaction/window-manager.ts +18 -0
  414. package/src/plugins/defaults/index.ts +60 -0
  415. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +22 -9
  416. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
  417. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  418. package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +64 -0
  419. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +29 -21
  420. package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1 -0
  421. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +1 -0
  422. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +129 -9
  423. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +31 -4
  424. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +77 -2
  425. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +1 -0
  426. package/src/plugins/defaults/memory-v3-shadow/injector.ts +7 -10
  427. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +144 -11
  428. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +32 -20
  429. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +56 -3
  430. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +23 -2
  431. package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
  432. package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
  433. package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
  434. package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
  435. package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +3 -13
  436. package/src/plugins/defaults/title-generate/hooks/stop.ts +56 -21
  437. package/src/prompts/persona-resolver.ts +14 -4
  438. package/src/prompts/templates/system-sections.ts +7 -2
  439. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  440. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  441. package/src/providers/__tests__/provider-secret-catalog.test.ts +1 -0
  442. package/src/providers/__tests__/retry-callsite.test.ts +176 -0
  443. package/src/providers/anthropic/client.ts +230 -175
  444. package/src/providers/atlascloud/client.ts +85 -0
  445. package/src/providers/call-site-routing.ts +10 -0
  446. package/src/providers/fetch-provider-catalog.ts +85 -0
  447. package/src/providers/gemini/client.ts +43 -0
  448. package/src/providers/inference/adapter-factory.ts +3 -0
  449. package/src/providers/model-catalog.ts +58 -0
  450. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +33 -0
  451. package/src/providers/openai/chat-completions-provider.ts +7 -0
  452. package/src/providers/openai/responses-provider.ts +10 -0
  453. package/src/providers/provider-send-message.ts +11 -3
  454. package/src/providers/ratelimit.ts +9 -0
  455. package/src/providers/retry.ts +62 -12
  456. package/src/providers/search-provider-catalog.ts +10 -0
  457. package/src/providers/types.ts +16 -0
  458. package/src/providers/usage-tracking.ts +7 -0
  459. package/src/providers/weak-open-model.ts +22 -0
  460. package/src/runtime/AGENTS.md +0 -1
  461. package/src/runtime/__tests__/agent-wake.test.ts +227 -0
  462. package/src/runtime/__tests__/client-health.test.ts +44 -0
  463. package/src/runtime/access-request-helper.ts +21 -53
  464. package/src/runtime/actor-trust-resolver.ts +59 -63
  465. package/src/runtime/agent-wake.ts +71 -0
  466. package/src/runtime/assistant-event-hub.ts +18 -4
  467. package/src/runtime/auth/__tests__/route-policy.test.ts +12 -0
  468. package/src/runtime/auth/require-bound-guardian.ts +1 -4
  469. package/src/runtime/btw-sidechain.ts +3 -6
  470. package/src/runtime/capabilities.test.ts +120 -0
  471. package/src/runtime/capabilities.ts +197 -0
  472. package/src/runtime/channel-approval-types.ts +22 -45
  473. package/src/runtime/channel-invite-transports/telegram.ts +4 -4
  474. package/src/runtime/channel-retry-sweep.ts +1 -0
  475. package/src/runtime/channel-verification-service.ts +3 -3
  476. package/src/runtime/client-health.ts +26 -0
  477. package/src/runtime/confirmation-request-guardian-bridge.ts +38 -29
  478. package/src/runtime/effective-capabilities.test.ts +128 -0
  479. package/src/runtime/effective-capabilities.ts +84 -0
  480. package/src/runtime/guardian-reply-router.ts +106 -21
  481. package/src/runtime/invite-redemption-service.ts +9 -25
  482. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +126 -0
  483. package/src/runtime/migrations/vbundle-builder.ts +49 -20
  484. package/src/runtime/pending-interactions.ts +35 -0
  485. package/src/runtime/routes/__tests__/client-routes.test.ts +13 -0
  486. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +67 -0
  487. package/src/runtime/routes/__tests__/plugins-routes.test.ts +383 -1
  488. package/src/runtime/routes/app-routes.ts +1 -1
  489. package/src/runtime/routes/approval-routes.ts +40 -9
  490. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
  491. package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
  492. package/src/runtime/routes/browser-tabs-routes.ts +9 -0
  493. package/src/runtime/routes/btw-routes.ts +1 -27
  494. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +17 -8
  495. package/src/runtime/routes/client-routes.ts +10 -0
  496. package/src/runtime/routes/contact-routes.ts +31 -8
  497. package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
  498. package/src/runtime/routes/conversation-management-routes.ts +80 -1
  499. package/src/runtime/routes/conversation-query-routes.ts +68 -22
  500. package/src/runtime/routes/conversation-routes.ts +39 -14
  501. package/src/runtime/routes/credential-routes.ts +40 -16
  502. package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
  503. package/src/runtime/routes/events-routes.ts +1 -3
  504. package/src/runtime/routes/guardian-approval-interception.ts +14 -73
  505. package/src/runtime/routes/guardian-approval-prompt.ts +22 -4
  506. package/src/runtime/routes/home-feed-routes.ts +8 -3
  507. package/src/runtime/routes/identity-routes.ts +1 -296
  508. package/src/runtime/routes/inbound-message-handler.ts +214 -228
  509. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +89 -7
  510. package/src/runtime/routes/inbound-stages/admission-policy.test.ts +154 -0
  511. package/src/runtime/routes/inbound-stages/admission-policy.ts +140 -0
  512. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +3 -3
  513. package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -6
  514. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -2
  515. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +1 -2
  516. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +7 -7
  517. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +47 -28
  518. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +358 -0
  519. package/src/runtime/routes/index.ts +2 -0
  520. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +8 -0
  521. package/src/runtime/routes/integrations/slack/channel.ts +36 -0
  522. package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
  523. package/src/runtime/routes/mcp-auth-routes.ts +233 -41
  524. package/src/runtime/routes/memory-eval-routes.ts +87 -0
  525. package/src/runtime/routes/notification-routes.ts +122 -133
  526. package/src/runtime/routes/platform-routes.ts +2 -2
  527. package/src/runtime/routes/plugins-routes.ts +366 -11
  528. package/src/runtime/routes/schedule-routes.ts +0 -22
  529. package/src/runtime/routes/secret-routes.ts +15 -0
  530. package/src/runtime/routes/surface-action-routes.ts +2 -1
  531. package/src/runtime/routes/tool-call-question-enrichment.test.ts +146 -0
  532. package/src/runtime/routes/tool-call-question-enrichment.ts +66 -0
  533. package/src/runtime/routes/workflow-routes.test.ts +229 -44
  534. package/src/runtime/routes/workflow-routes.ts +131 -29
  535. package/src/runtime/routes/workspace-greetings.ts +55 -0
  536. package/src/runtime/sync/resource-sync-events.ts +1 -11
  537. package/src/runtime/tool-grant-request-helper.ts +18 -16
  538. package/src/runtime/trust-context-resolver.ts +8 -5
  539. package/src/schedule/inference-profile.ts +2 -14
  540. package/src/schedule/schedule-store.ts +1 -1
  541. package/src/schedule/scheduler-types.ts +5 -1
  542. package/src/security/__tests__/provider-key-env-fallback.test.ts +6 -0
  543. package/src/security/secret-patterns.ts +3 -0
  544. package/src/subagent/manager.ts +17 -4
  545. package/src/subagent/types.ts +6 -0
  546. package/src/telemetry/trace-collection-policy.test.ts +28 -0
  547. package/src/telemetry/trace-collection-policy.ts +30 -0
  548. package/src/telemetry/types.ts +89 -0
  549. package/src/telemetry/usage-telemetry-reporter.test.ts +586 -36
  550. package/src/telemetry/usage-telemetry-reporter.ts +148 -41
  551. package/src/tools/AGENTS.md +3 -3
  552. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +31 -0
  553. package/src/tools/browser/browser-execution.ts +30 -19
  554. package/src/tools/document/document-tool.ts +30 -6
  555. package/src/tools/executor.ts +5 -3
  556. package/src/tools/host-terminal/host-shell.ts +5 -4
  557. package/src/tools/memory/register.ts +2 -2
  558. package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +360 -0
  559. package/src/tools/network/__tests__/web-search.test.ts +143 -0
  560. package/src/tools/network/web-fetch.ts +372 -1
  561. package/src/tools/network/web-search-error.ts +1 -1
  562. package/src/tools/network/web-search.ts +213 -10
  563. package/src/tools/permission-checker.ts +4 -3
  564. package/src/tools/registry.ts +20 -0
  565. package/src/tools/schedule/create.ts +7 -12
  566. package/src/tools/schedule/update.ts +4 -11
  567. package/src/tools/shared/filesystem/path-policy.ts +39 -13
  568. package/src/tools/side-effects.ts +2 -17
  569. package/src/tools/skills/execute.ts +99 -2
  570. package/src/tools/skills/load.ts +43 -2
  571. package/src/tools/subagent/spawn.ts +64 -15
  572. package/src/tools/terminal/shell.ts +10 -4
  573. package/src/tools/tool-approval-handler.ts +18 -13
  574. package/src/tools/tool-manifest.ts +0 -2
  575. package/src/tools/types.ts +10 -0
  576. package/src/tools/ui-surface/definitions.ts +64 -3
  577. package/src/tools/verification-control-plane-policy.ts +3 -1
  578. package/src/tools/workflows/run-workflow.test.ts +8 -18
  579. package/src/tools/workflows/run-workflow.ts +1 -0
  580. package/src/util/disk-usage.ts +78 -23
  581. package/src/util/logs-db-path.ts +22 -0
  582. package/src/util/platform.ts +10 -3
  583. package/src/watcher/telemetry.ts +2 -2
  584. package/src/workflows/capabilities.ts +2 -3
  585. package/src/workflows/engine.test.ts +175 -1
  586. package/src/workflows/engine.ts +82 -0
  587. package/src/workflows/journal-store.test.ts +70 -0
  588. package/src/workflows/journal-store.ts +18 -3
  589. package/src/workflows/run-manager.test.ts +171 -28
  590. package/src/workflows/run-manager.ts +66 -24
  591. package/src/workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.ts +63 -0
  592. package/src/workspace/migrations/106-drop-collect-usage-data.ts +47 -0
  593. package/src/workspace/migrations/107-drop-send-diagnostics.ts +47 -0
  594. package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +129 -0
  595. package/src/workspace/migrations/registry.ts +8 -0
  596. package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
  597. package/src/__tests__/credential-security-e2e.test.ts +0 -362
  598. package/src/__tests__/credential-vault-unit.test.ts +0 -1528
  599. package/src/__tests__/credential-vault.test.ts +0 -1706
  600. package/src/__tests__/identity-intro-cache.test.ts +0 -315
  601. package/src/__tests__/secret-onetime-send.test.ts +0 -182
  602. package/src/cli/commands/__tests__/task.test.ts +0 -914
  603. package/src/cli/commands/task.ts +0 -771
  604. package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
  605. package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
  606. package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
  607. package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
  608. package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
  609. package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
  610. package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
  611. package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
  612. package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
  613. package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
  614. package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
  615. package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
  616. package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
  617. package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
  618. package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
  619. package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
  620. package/src/memory/preloaded-apps.ts +0 -116
  621. package/src/notifications/tool-approval-copy.ts +0 -142
  622. package/src/runtime/routes/approval-prompt-ts-tracker.ts +0 -78
  623. package/src/runtime/routes/identity-intro-cache.ts +0 -172
  624. package/src/tools/credentials/vault.ts +0 -712
@@ -204,7 +204,7 @@ describe("disk-pressure-warning injector", () => {
204
204
  .run();
205
205
  });
206
206
 
207
- test("emits the exact cleanup prompt during disk pressure cleanup mode", async () => {
207
+ test("emits the concise cleanup skill prompt during disk pressure cleanup mode", async () => {
208
208
  seedDiskPressure(true);
209
209
  const block = await diskPressureInjector.produce(makeContext());
210
210
 
@@ -217,14 +217,19 @@ describe("disk-pressure-warning injector", () => {
217
217
  DEFAULT_INJECTOR_ORDER.diskPressureWarning,
218
218
  );
219
219
  expect(DISK_PRESSURE_WARNING_PROMPT).toBe(`<disk_pressure_warning>
220
- Disk usage is critically low: this assistant is in storage cleanup mode because the workspace volume is critically full.
220
+ Storage is critically low and normal work is suspended until space is freed.
221
221
 
222
- In your first paragraph, warn the user that storage is critically low and that normal work is suspended until space is freed.
222
+ Your first user-visible paragraph must warn the user that storage is critically low and normal work is suspended.
223
223
 
224
- Then help the user clean up storage. Prefer safe inspection steps first, such as checking available space and finding large directories. Ask before deleting files or caches unless the user has already clearly approved the specific cleanup action.
224
+ Before taking cleanup actions, call \`skill_load\` with \`skill: "system-storage-cleanup"\` and follow the cleanup skill.
225
225
 
226
- Do not work on unrelated tasks until enough space is freed to clear the lock or the user explicitly overrides it. Background processes and messages from trusted contacts are blocked while this cleanup mode is active.
226
+ Unrelated work remains blocked until disk usage drops below the critical threshold or the guardian explicitly overrides the lock. Background processes and trusted-contact messages remain blocked while this cleanup mode is active.
227
227
  </disk_pressure_warning>`);
228
+ expect(DISK_PRESSURE_WARNING_PROMPT).toContain("skill_load");
229
+ expect(DISK_PRESSURE_WARNING_PROMPT).toContain("system-storage-cleanup");
230
+ expect(DISK_PRESSURE_WARNING_PROMPT).not.toContain(
231
+ "Prefer safe inspection steps first",
232
+ );
228
233
  });
229
234
 
230
235
  test("omits the prompt when no cleanup context is registered or it is inactive", async () => {
@@ -2,7 +2,7 @@
2
2
  * Tests for the memory-v3 step-0 branch in `applyRuntimeInjections`:
3
3
  * spotlight strip + v2 tail suppression.
4
4
  *
5
- * When the `memory-v3-live` flag is on AND the v3 injector (id `memory-v3`,
5
+ * When `memory.v3.live` is on AND the v3 injector (id `memory-v3`,
6
6
  * placement `after-memory-prefix`) produces a block — possibly EMPTY-TEXT on
7
7
  * an all-repeat turn — runtime assembly strips the v2 `<memory>` prefix from
8
8
  * the TAIL user message only before splicing the v3 block. Historical user
@@ -16,10 +16,11 @@
16
16
  * block lands at the tail.
17
17
  *
18
18
  * v2 suppression stays keyed off whether v3 produced a block, NOT off the
19
- * flag alone: a v3 failure (`produce()` → null) leaves v2's block intact
20
- * (fallback-to-v2). The flag-off path must be byte-for-byte identical to
19
+ * gate alone: a v3 failure (`produce()` → null) leaves v2's block intact
20
+ * (fallback-to-v2). The v3-off path must be byte-for-byte identical to
21
21
  * today — that is the load-bearing regression guard. `applyRuntimeInjections`
22
- * reads the flag itself, so these tests drive it through the override cache.
22
+ * reads the v3-live gate itself, so these tests drive it through the
23
+ * `isMemoryV3Live` mock slot.
23
24
  *
24
25
  * The strip discriminates v2's dynamic block by IDENTITY, not by prefix: v2's
25
26
  * `INJECTION_HEADER` and v3's `V3_CARDS_INJECTION_HEADER` are deliberately
@@ -42,7 +43,6 @@ import type {
42
43
  TurnContext,
43
44
  } from "../plugins/types.js";
44
45
  import type { Message } from "../providers/types.js";
45
- import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
46
46
 
47
47
  // Drive the suppression branch by controlling the static injector chain that
48
48
  // `applyRuntimeInjections` walks. The slot is mutated per-test to stand in for
@@ -52,6 +52,13 @@ mock.module("../plugins/defaults/memory-retrieval/injector-chain.js", () => ({
52
52
  getInjectorChain: () => injectorChainSlot,
53
53
  }));
54
54
 
55
+ // `applyRuntimeInjections` reads the v3-live gate (`config.memory.v3.live`)
56
+ // via `isMemoryV3Live`; drive it directly through this slot per-test.
57
+ let memoryV3LiveSlot = false;
58
+ mock.module("../config/memory-v3-gate.js", () => ({
59
+ isMemoryV3Live: () => memoryV3LiveSlot,
60
+ }));
61
+
55
62
  const { applyRuntimeInjections } =
56
63
  await import("../daemon/conversation-runtime-assembly.js");
57
64
 
@@ -141,9 +148,9 @@ function tailTexts(messages: Message[]): string[] {
141
148
  describe("memory-v3-live v2 suppression", () => {
142
149
  beforeEach(() => {
143
150
  injectorChainSlot.length = 0;
144
- // Clean baseline: no overrides → `memory-v3-live` resolves to its registry
145
- // default (off). Each test seeds the flag it needs.
146
- setOverridesForTesting({});
151
+ // Clean baseline: v3-live off (registry/config default). Each test seeds
152
+ // the gate value it needs.
153
+ memoryV3LiveSlot = false;
147
154
  });
148
155
 
149
156
  afterEach(() => {
@@ -152,7 +159,7 @@ describe("memory-v3-live v2 suppression", () => {
152
159
  });
153
160
 
154
161
  test("flag ON + v3 produced a block → TAIL v2 stripped, historical memory blocks frozen in place", async () => {
155
- setOverridesForTesting({ "memory-v3-live": true });
162
+ memoryV3LiveSlot = true;
156
163
  injectorChainSlot.push(v3Injector("net-new cards"));
157
164
  seedV2Identity("fresh recalled fact");
158
165
 
@@ -194,7 +201,7 @@ describe("memory-v3-live v2 suppression", () => {
194
201
  });
195
202
 
196
203
  test("flag ON + EMPTY-TEXT v3 block (all-repeat turn) → tail v2 stripped, nothing attached", async () => {
197
- setOverridesForTesting({ "memory-v3-live": true });
204
+ memoryV3LiveSlot = true;
198
205
  injectorChainSlot.push(v3Injector(""));
199
206
  seedV2Identity("fresh recalled fact");
200
207
 
@@ -217,7 +224,7 @@ describe("memory-v3-live v2 suppression", () => {
217
224
  });
218
225
 
219
226
  test("stale spotlight blocks are stripped from EVERY user message; the new spotlight lands at the tail", async () => {
220
- setOverridesForTesting({ "memory-v3-live": true });
227
+ memoryV3LiveSlot = true;
221
228
  injectorChainSlot.push(v3Injector(""), spotlightInjector("fresh sections"));
222
229
 
223
230
  const staleSpotlight = {
@@ -253,7 +260,7 @@ describe("memory-v3-live v2 suppression", () => {
253
260
  });
254
261
 
255
262
  test("convergence re-entry: a tail leading with this turn's frozen v3 cards (and <info>) is NOT stripped", async () => {
256
- setOverridesForTesting({ "memory-v3-live": true });
263
+ memoryV3LiveSlot = true;
257
264
  // Re-entry shape: the memo returns the same selections, every slug is now
258
265
  // in the everInjected store, so the injector produces an EMPTY block —
259
266
  // while the tail still carries the v3 card block frozen on first entry
@@ -292,7 +299,7 @@ describe("memory-v3-live v2 suppression", () => {
292
299
  });
293
300
 
294
301
  test("first entry with a v2 prefix AND a frozen v3 block strips ONLY the v2 block", async () => {
295
- setOverridesForTesting({ "memory-v3-live": true });
302
+ memoryV3LiveSlot = true;
296
303
  injectorChainSlot.push(v3Injector(""));
297
304
  seedV2Identity("fresh recalled fact");
298
305
 
@@ -319,7 +326,7 @@ describe("memory-v3-live v2 suppression", () => {
319
326
  });
320
327
 
321
328
  test("REGRESSION: a v2 block leading with the REAL summary header (byte-identical to v3's) is stripped; v3 cards and <info> survive (first entry)", async () => {
322
- setOverridesForTesting({ "memory-v3-live": true });
329
+ memoryV3LiveSlot = true;
323
330
  injectorChainSlot.push(v3Injector(""));
324
331
 
325
332
  // The collision this guards: v2's router block leads with
@@ -358,7 +365,7 @@ describe("memory-v3-live v2 suppression", () => {
358
365
  });
359
366
 
360
367
  test("REGRESSION: re-entry with a header-bearing v2 identity keeps the first entry's frozen v3 cards", async () => {
361
- setOverridesForTesting({ "memory-v3-live": true });
368
+ memoryV3LiveSlot = true;
362
369
  // Re-entry: produce() returns the EMPTY block (cards already claimed by
363
370
  // the store) while the tail carries the FIRST entry's v3 block — and the
364
371
  // graph handle still holds the summary-bearing v2 identity from this
@@ -391,7 +398,7 @@ describe("memory-v3-live v2 suppression", () => {
391
398
  });
392
399
 
393
400
  test("v2 memory-image groups and legacy <memory __injected> blocks are stripped even without an identity", async () => {
394
- setOverridesForTesting({ "memory-v3-live": true });
401
+ memoryV3LiveSlot = true;
395
402
  injectorChainSlot.push(v3Injector("net-new cards"));
396
403
  // No live graph handle: identity unknown (null). Image groups and legacy
397
404
  // blocks are unambiguously v2's and are stripped regardless; the shared
@@ -430,7 +437,7 @@ describe("memory-v3-live v2 suppression", () => {
430
437
  });
431
438
 
432
439
  test("the v3 block's attachment-commit callback fires on a user tail", async () => {
433
- setOverridesForTesting({ "memory-v3-live": true });
440
+ memoryV3LiveSlot = true;
434
441
  const commit = mock(() => {});
435
442
  injectorChainSlot.push(v3Injector("net-new cards", commit));
436
443
 
@@ -443,7 +450,7 @@ describe("memory-v3-live v2 suppression", () => {
443
450
  });
444
451
 
445
452
  test("the commit callback is SKIPPED when the tail is not a user message (block never attaches)", async () => {
446
- setOverridesForTesting({ "memory-v3-live": true });
453
+ memoryV3LiveSlot = true;
447
454
  const commit = mock(() => {});
448
455
  injectorChainSlot.push(v3Injector("net-new cards", commit));
449
456
 
@@ -465,7 +472,7 @@ describe("memory-v3-live v2 suppression", () => {
465
472
  });
466
473
 
467
474
  test("flag ON but v3 produced NOTHING → v2 block left intact (fallback-to-v2)", async () => {
468
- setOverridesForTesting({ "memory-v3-live": true });
475
+ memoryV3LiveSlot = true;
469
476
  injectorChainSlot.push(v3Injector(null));
470
477
 
471
478
  const runMessages: Message[] = [
@@ -524,7 +531,7 @@ describe("memory-v3-live v2 suppression", () => {
524
531
  test("no v3 injector registered + flag ON → no stripping, messages untouched", async () => {
525
532
  // No injector named memory-v3 at all (e.g. plugin not loaded): the
526
533
  // suppression branch keys off the produced block, so nothing is stripped.
527
- setOverridesForTesting({ "memory-v3-live": true });
534
+ memoryV3LiveSlot = true;
528
535
  expect(injectorChainSlot).toHaveLength(0);
529
536
 
530
537
  const runMessages: Message[] = [
@@ -7,23 +7,15 @@ mock.module("../util/logger.js", () => ({
7
7
  }),
8
8
  }));
9
9
 
10
- // Toggle for the collectUsageData opt-out the real store consults. The store
10
+ // Toggle for the share_analytics opt-out the real store consults. The store
11
11
  // module is intentionally NOT mocked here — it has its own DB-backed tests, and
12
12
  // Bun's `mock.module` is process-global, so mocking it would leak into those
13
13
  // tests when files share an invocation. Exercising the real store keeps every
14
14
  // auth-fallback test order-independent.
15
- let collectUsageData = true;
15
+ let shareAnalytics = true;
16
16
 
17
- mock.module("../config/loader.js", () => ({
18
- getConfig: () => ({
19
- ui: {},
20
- model: "test",
21
- provider: "test",
22
- memory: { enabled: false },
23
- rateLimit: { maxRequestsPerMinute: 0 },
24
- secretDetection: { enabled: false },
25
- collectUsageData,
26
- }),
17
+ mock.module("../platform/consent-cache.js", () => ({
18
+ getCachedShareAnalytics: () => shareAnalytics,
27
19
  }));
28
20
 
29
21
  import { queryUnreportedAuthFallbackEvents } from "../memory/auth-fallback-events-store.js";
@@ -61,7 +53,7 @@ const VALID_BODY = {
61
53
 
62
54
  describe("internal-telemetry-routes: auth-fallback", () => {
63
55
  beforeEach(() => {
64
- collectUsageData = true;
56
+ shareAnalytics = true;
65
57
  getDb().delete(authFallbackEvents).run();
66
58
  });
67
59
 
@@ -90,7 +82,7 @@ describe("internal-telemetry-routes: auth-fallback", () => {
90
82
  });
91
83
 
92
84
  test("returns skipped and persists nothing under the opt-out", () => {
93
- collectUsageData = false;
85
+ shareAnalytics = false;
94
86
  expect(call(VALID_BODY)).toEqual({ skipped: true });
95
87
  expect(queryUnreportedAuthFallbackEvents(0, undefined, 100).length).toBe(0);
96
88
  });
@@ -83,7 +83,7 @@ describe("invite-redemption-service", () => {
83
83
 
84
84
  const result = findContactChannel({
85
85
  channelType: "telegram",
86
- externalUserId: "user-1",
86
+ address: "user-1",
87
87
  });
88
88
 
89
89
  expect(result).not.toBeNull();
@@ -112,7 +112,7 @@ describe("invite-redemption-service", () => {
112
112
 
113
113
  const result = findContactChannel({
114
114
  channelType: "telegram",
115
- externalUserId: "code-user-1",
115
+ address: "code-user-1",
116
116
  });
117
117
 
118
118
  expect(result).not.toBeNull();
@@ -292,7 +292,6 @@ describe("invite-redemption-service", () => {
292
292
  {
293
293
  type: "telegram",
294
294
  address: "guardian-tg-id",
295
- externalUserId: "guardian-tg-id",
296
295
  status: "revoked",
297
296
  },
298
297
  ],
@@ -325,7 +324,7 @@ describe("invite-redemption-service", () => {
325
324
  // Verify the redeemer's Telegram ID is now bound to Mom's contact
326
325
  const result = findContactChannel({
327
326
  channelType: "telegram",
328
- externalUserId: "guardian-tg-id",
327
+ address: "guardian-tg-id",
329
328
  });
330
329
  expect(result).not.toBeNull();
331
330
  expect(result!.contact.id).toBe(momContact.id);
@@ -346,7 +345,6 @@ describe("invite-redemption-service", () => {
346
345
  {
347
346
  type: "telegram",
348
347
  address: "guardian-own-id",
349
- externalUserId: "guardian-own-id",
350
348
  status: "revoked",
351
349
  },
352
350
  ],
@@ -381,7 +379,6 @@ describe("invite-redemption-service", () => {
381
379
  {
382
380
  type: "telegram",
383
381
  address: "guardian-code-id",
384
- externalUserId: "guardian-code-id",
385
382
  status: "revoked",
386
383
  },
387
384
  ],
@@ -417,7 +414,7 @@ describe("invite-redemption-service", () => {
417
414
  // Verify the redeemer's Telegram ID is now bound to Mom's contact
418
415
  const result = findContactChannel({
419
416
  channelType: "telegram",
420
- externalUserId: "guardian-code-id",
417
+ address: "guardian-code-id",
421
418
  });
422
419
  expect(result).not.toBeNull();
423
420
  expect(result!.contact.id).toBe(momContact.id);
@@ -54,9 +54,7 @@ describe("LLM call-site catalog", () => {
54
54
 
55
55
  test("CALL_SITE_DEFAULTS covers every LLMCallSite enum value", () => {
56
56
  const defaultIds = new Set(Object.keys(CALL_SITE_DEFAULTS));
57
- const missing = LLMCallSiteEnum.options.filter(
58
- (id) => !defaultIds.has(id),
59
- );
57
+ const missing = LLMCallSiteEnum.options.filter((id) => !defaultIds.has(id));
60
58
  expect(missing).toEqual([]);
61
59
  });
62
60
 
@@ -68,11 +66,12 @@ describe("LLM call-site catalog", () => {
68
66
  expect(extra).toEqual([]);
69
67
  });
70
68
 
71
- test("every CALL_SITE_DEFAULTS entry has a profile field", () => {
69
+ test("every CALL_SITE_DEFAULTS profile, when present, is a non-empty string", () => {
72
70
  for (const [, config] of Object.entries(CALL_SITE_DEFAULTS)) {
73
- expect(config.profile).toBeDefined();
71
+ // A call site may omit `profile` to inherit the workspace default config.
72
+ if (config.profile === undefined) continue;
74
73
  expect(typeof config.profile).toBe("string");
75
- expect(config.profile!.length).toBeGreaterThan(0);
74
+ expect(config.profile.length).toBeGreaterThan(0);
76
75
  }
77
76
  });
78
77
  });
@@ -2,7 +2,10 @@ import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { describe, expect, test } from "bun:test";
4
4
 
5
- import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
5
+ import {
6
+ isModelInCatalog,
7
+ PROVIDER_CATALOG,
8
+ } from "../providers/model-catalog.js";
6
9
  import { PLATFORM_PROVIDER_META } from "../providers/platform-proxy/constants.js";
7
10
  import { resolvePricing, resolvePricingForUsage } from "../util/pricing.js";
8
11
 
@@ -30,13 +33,6 @@ function getRepoRoot(): string {
30
33
  }
31
34
 
32
35
  const META_JSON_PATH = join(getRepoRoot(), "meta", "llm-provider-catalog.json");
33
- const SWIFTPM_MIRROR_PATH = join(
34
- getRepoRoot(),
35
- "clients",
36
- "shared",
37
- "Resources",
38
- "llm-provider-catalog.json",
39
- );
40
36
 
41
37
  interface ClientCatalogCredentialsGuide {
42
38
  description: string;
@@ -309,6 +305,32 @@ describe("LLM catalog parity: daemon vs client", () => {
309
305
  });
310
306
  });
311
307
 
308
+ test("Fireworks catalog includes GLM 5.2", () => {
309
+ expect(
310
+ isModelInCatalog("fireworks", "accounts/fireworks/models/glm-5p2"),
311
+ ).toBe(true);
312
+
313
+ const fireworks = PROVIDER_CATALOG.find(
314
+ (entry) => entry.id === "fireworks",
315
+ );
316
+ expect(
317
+ fireworks?.models.find(
318
+ (model) => model.id === "accounts/fireworks/models/glm-5p2",
319
+ ),
320
+ ).toMatchObject({
321
+ displayName: "GLM 5.2",
322
+ contextWindowTokens: 1040000,
323
+ maxOutputTokens: 131072,
324
+ supportsToolUse: true,
325
+ supportsVision: false,
326
+ pricing: {
327
+ inputPer1mTokens: 1.4,
328
+ outputPer1mTokens: 4.4,
329
+ cacheReadPer1mTokens: 0.26,
330
+ },
331
+ });
332
+ });
333
+
312
334
  test("MiniMax catalog includes MiniMax M3", () => {
313
335
  const minimax = PROVIDER_CATALOG.find((entry) => entry.id === "minimax");
314
336
  expect(
@@ -457,19 +479,4 @@ describe("LLM catalog parity: daemon vs client", () => {
457
479
  longContextMode: "native-model",
458
480
  });
459
481
  });
460
-
461
- // -----------------------------------------------------------------------
462
- // Mirror byte-equality
463
- // -----------------------------------------------------------------------
464
-
465
- test("SwiftPM mirror is byte-identical to meta/ copy", () => {
466
- // `sync-llm-catalog.ts` writes both files from the same serializer; this
467
- // guard catches any case where one copy is regenerated without the other.
468
- // Byte equality is required because SwiftPM bundles the resource verbatim
469
- // into `VellumAssistantShared` while the meta/ JSON is consumed as a
470
- // cross-package artifact (web codegen, etc.).
471
- const metaBytes = readFileSync(META_JSON_PATH);
472
- const swiftPmBytes = readFileSync(SWIFTPM_MIRROR_PATH);
473
- expect(swiftPmBytes.equals(metaBytes)).toBe(true);
474
- });
475
482
  });
@@ -16,6 +16,7 @@ const fullDefault = {
16
16
  speed: "standard" as const,
17
17
  verbosity: "medium" as const,
18
18
  temperature: null,
19
+ topP: null,
19
20
  thinking: { enabled: true, streamThinking: true },
20
21
  contextWindow: {
21
22
  enabled: true,
@@ -203,6 +204,26 @@ describe("resolveCallSiteConfig", () => {
203
204
  expect(resolved.effort).toBe("max");
204
205
  });
205
206
 
207
+ test("topP defaults to null when no profile or override sets it", () => {
208
+ const llm = LLMSchema.parse({ default: fullDefault });
209
+ const resolved = resolveCallSiteConfig("mainAgent", llm);
210
+ expect(resolved.topP).toBeNull();
211
+ });
212
+
213
+ test("profile-level topP resolves onto the merged config", () => {
214
+ const llm = LLMSchema.parse({
215
+ default: fullDefault,
216
+ profiles: {
217
+ nucleus: { topP: 0.9 },
218
+ },
219
+ callSites: {
220
+ memoryExtraction: { profile: "nucleus" },
221
+ },
222
+ });
223
+ const resolved = resolveCallSiteConfig("memoryExtraction", llm);
224
+ expect(resolved.topP).toBe(0.9);
225
+ });
226
+
206
227
  test("returns isolated nested objects (not aliased to llm.default)", () => {
207
228
  // Resolve a call site that has no override touching `thinking` or
208
229
  // `contextWindow` — the bug being guarded against would have those
@@ -670,30 +691,6 @@ describe("resolveCallSiteConfig", () => {
670
691
  expect(resolved.effort).toBe("medium");
671
692
  });
672
693
 
673
- test("workflowLeaf defaults to the cost-optimized profile", () => {
674
- const llm = LLMSchema.parse({
675
- default: fullDefault,
676
- profiles: {
677
- balanced: {
678
- model: "claude-sonnet-4-7",
679
- effort: "medium",
680
- },
681
- "cost-optimized": {
682
- model: "claude-haiku-4-5-20251001",
683
- effort: "low",
684
- },
685
- },
686
- });
687
-
688
- expect(resolveDefaultProfileKey("workflowLeaf", llm)).toBe(
689
- "cost-optimized",
690
- );
691
- const resolved = resolveCallSiteConfig("workflowLeaf", llm);
692
- expect(resolved.model).toBe("claude-haiku-4-5-20251001");
693
- expect(resolved.effort).toBe("low");
694
- expect(resolved.thinking.enabled).toBe(false);
695
- });
696
-
697
694
  test("explicit callSites config overrides CALL_SITE_DEFAULTS", () => {
698
695
  const llm = LLMSchema.parse({
699
696
  default: fullDefault,
@@ -1437,3 +1434,52 @@ describe("resolveCallSiteConfig logitBias provenance", () => {
1437
1434
  expect(resolveCallSiteConfig("mainAgent", llm).logitBias).toBeUndefined();
1438
1435
  });
1439
1436
  });
1437
+
1438
+ describe("resolveCallSiteConfig — workflowLeaf default", () => {
1439
+ test("inherits the workspace default config rather than pinning cost-optimized", () => {
1440
+ const llm = LLMSchema.parse({
1441
+ default: fullDefault,
1442
+ profiles: {
1443
+ "cost-optimized": {
1444
+ provider: "anthropic",
1445
+ model: "claude-haiku-4-5-20251001",
1446
+ },
1447
+ },
1448
+ });
1449
+ const resolved = resolveCallSiteConfig("workflowLeaf", llm);
1450
+ // No pinned profile → the model comes from llm.default, NOT the
1451
+ // `cost-optimized` profile (which is uncredentialed on a BYOK install).
1452
+ expect(resolved.model).toBe("claude-opus-4-7");
1453
+ // Call-site tuning still applies.
1454
+ expect(resolved.effort).toBe("low");
1455
+ expect(resolved.thinking?.enabled).toBe(false);
1456
+ // The call site has no implicit default profile key.
1457
+ expect(resolveDefaultProfileKey("workflowLeaf", llm)).toBeUndefined();
1458
+ });
1459
+
1460
+ test("honors an explicit workflowLeaf call-site override", () => {
1461
+ const llm = LLMSchema.parse({
1462
+ default: fullDefault,
1463
+ profiles: {
1464
+ cheap: { provider: "anthropic", model: "claude-haiku-4-5-20251001" },
1465
+ },
1466
+ callSites: { workflowLeaf: { profile: "cheap" } },
1467
+ });
1468
+ expect(resolveCallSiteConfig("workflowLeaf", llm).model).toBe(
1469
+ "claude-haiku-4-5-20251001",
1470
+ );
1471
+ });
1472
+
1473
+ test("honors a per-call override profile (an explicit per-leaf profile)", () => {
1474
+ const llm = LLMSchema.parse({
1475
+ default: fullDefault,
1476
+ profiles: {
1477
+ fancy: { provider: "anthropic", model: "claude-sonnet-4-7" },
1478
+ },
1479
+ });
1480
+ expect(
1481
+ resolveCallSiteConfig("workflowLeaf", llm, { overrideProfile: "fancy" })
1482
+ .model,
1483
+ ).toBe("claude-sonnet-4-7");
1484
+ });
1485
+ });
@@ -78,6 +78,7 @@ describe("LLMSchema", () => {
78
78
  speed: "standard",
79
79
  verbosity: "medium",
80
80
  temperature: null,
81
+ topP: null,
81
82
  thinking: { enabled: true, streamThinking: true },
82
83
  contextWindow: {
83
84
  enabled: true,