@vellumai/assistant 0.8.4 → 0.8.6

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 (802) hide show
  1. package/AGENTS.md +33 -1
  2. package/ARCHITECTURE.md +3 -3
  3. package/bunfig.toml +6 -1
  4. package/docs/browser-use-architecture-phase2.md +1 -1
  5. package/docs/credential-execution-service.md +6 -6
  6. package/docs/plugins.md +4 -3
  7. package/knip.json +2 -1
  8. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
  9. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
  10. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
  11. package/openapi.yaml +2748 -216
  12. package/package.json +1 -1
  13. package/src/__tests__/actor-token-service.test.ts +3 -2
  14. package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
  15. package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
  16. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
  17. package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
  18. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  19. package/src/__tests__/annotate-risk-options.test.ts +1 -0
  20. package/src/__tests__/anthropic-provider.test.ts +34 -37
  21. package/src/__tests__/approval-cascade.test.ts +1 -0
  22. package/src/__tests__/approval-routes-http.test.ts +9 -13
  23. package/src/__tests__/assert-not-live-db.ts +79 -0
  24. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  25. package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
  26. package/src/__tests__/audit-log-rotation.test.ts +72 -18
  27. package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
  28. package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
  29. package/src/__tests__/browser-skill-endstate.test.ts +3 -3
  30. package/src/__tests__/btw-routes.test.ts +5 -5
  31. package/src/__tests__/call-controller.test.ts +3 -3
  32. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  33. package/src/__tests__/channel-approval-routes.test.ts +3 -2
  34. package/src/__tests__/channel-guardian.test.ts +6 -5
  35. package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
  36. package/src/__tests__/channel-reply-delivery.test.ts +35 -0
  37. package/src/__tests__/channel-retry-sweep.test.ts +320 -3
  38. package/src/__tests__/checker.test.ts +18 -27
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/compaction-trail-store.test.ts +264 -0
  41. package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
  42. package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
  43. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
  44. package/src/__tests__/computer-use-tools.test.ts +14 -18
  45. package/src/__tests__/config-loader-backfill.test.ts +13 -28
  46. package/src/__tests__/config-loader-corrupt.test.ts +5 -5
  47. package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
  48. package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
  49. package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
  50. package/src/__tests__/config-schema.test.ts +10 -10
  51. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  52. package/src/__tests__/connection-model-compat.test.ts +83 -0
  53. package/src/__tests__/contacts-tools.test.ts +3 -2
  54. package/src/__tests__/context-token-estimator.test.ts +22 -0
  55. package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
  56. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
  57. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
  58. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
  59. package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
  60. package/src/__tests__/conversation-agent-loop.test.ts +581 -54
  61. package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
  62. package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
  63. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
  64. package/src/__tests__/conversation-attention-store.test.ts +101 -0
  65. package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
  66. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  67. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
  68. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  69. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  70. package/src/__tests__/conversation-error.test.ts +61 -0
  71. package/src/__tests__/conversation-fork-crud.test.ts +239 -15
  72. package/src/__tests__/conversation-fork-route.test.ts +3 -2
  73. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  74. package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
  75. package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
  76. package/src/__tests__/conversation-lifecycle.test.ts +53 -11
  77. package/src/__tests__/conversation-list-source.test.ts +3 -2
  78. package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
  79. package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
  80. package/src/__tests__/conversation-pairing.test.ts +53 -0
  81. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
  82. package/src/__tests__/conversation-process-callsite.test.ts +1 -0
  83. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  84. package/src/__tests__/conversation-queue.test.ts +333 -291
  85. package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
  86. package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
  87. package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
  88. package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
  89. package/src/__tests__/conversation-skill-tools.test.ts +40 -147
  90. package/src/__tests__/conversation-slash-queue.test.ts +84 -32
  91. package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
  92. package/src/__tests__/conversation-speed-override.test.ts +1 -0
  93. package/src/__tests__/conversation-store.test.ts +1 -1
  94. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
  95. package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
  96. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
  97. package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
  98. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
  99. package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
  100. package/src/__tests__/conversation-sync-tags.test.ts +218 -35
  101. package/src/__tests__/conversation-title-service.test.ts +1 -0
  102. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
  103. package/src/__tests__/conversation-usage.test.ts +1 -0
  104. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
  105. package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
  106. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
  107. package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
  108. package/src/__tests__/credential-broker-server-use.test.ts +5 -5
  109. package/src/__tests__/credential-execution-client.test.ts +72 -1
  110. package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
  111. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  112. package/src/__tests__/credential-health-service.test.ts +252 -3
  113. package/src/__tests__/credential-security-invariants.test.ts +6 -5
  114. package/src/__tests__/credential-vault-unit.test.ts +21 -21
  115. package/src/__tests__/credential-vault.test.ts +5 -5
  116. package/src/__tests__/cross-provider-web-search.test.ts +56 -2
  117. package/src/__tests__/db-connection-isolation.test.ts +7 -6
  118. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
  119. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
  120. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
  121. package/src/__tests__/db-test-helpers.ts +58 -0
  122. package/src/__tests__/disk-pressure-guard.test.ts +58 -41
  123. package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
  124. package/src/__tests__/disk-pressure-routes.test.ts +0 -33
  125. package/src/__tests__/disk-pressure-tools.test.ts +0 -4
  126. package/src/__tests__/dm-persistence.test.ts +26 -40
  127. package/src/__tests__/document-create-dedupe.test.ts +189 -0
  128. package/src/__tests__/document-find-replace.test.ts +3 -2
  129. package/src/__tests__/document-tool-security.test.ts +81 -2
  130. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  131. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
  132. package/src/__tests__/email-html-renderer.test.ts +12 -0
  133. package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
  134. package/src/__tests__/encrypted-store.test.ts +11 -9
  135. package/src/__tests__/feature-flag-test-helpers.ts +53 -0
  136. package/src/__tests__/filing-service.test.ts +1 -0
  137. package/src/__tests__/first-greeting.test.ts +62 -12
  138. package/src/__tests__/gateway-flag-listener.test.ts +236 -0
  139. package/src/__tests__/gemini-provider.test.ts +104 -0
  140. package/src/__tests__/guardian-action-sweep.test.ts +3 -2
  141. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  142. package/src/__tests__/guardian-outbound-http.test.ts +10 -7
  143. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
  144. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
  145. package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
  146. package/src/__tests__/heartbeat-service.test.ts +5 -0
  147. package/src/__tests__/helpers/mock-logger.ts +26 -0
  148. package/src/__tests__/host-bash-routes.test.ts +1 -0
  149. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
  150. package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
  151. package/src/__tests__/host-shell-tool.test.ts +6 -5
  152. package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
  153. package/src/__tests__/http-conversation-lineage.test.ts +3 -2
  154. package/src/__tests__/http-user-message-parity.test.ts +29 -7
  155. package/src/__tests__/identity-intro-cache.test.ts +133 -22
  156. package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
  157. package/src/__tests__/inference-profile-reaper.test.ts +3 -2
  158. package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
  159. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  160. package/src/__tests__/injector-disk-pressure.test.ts +3 -17
  161. package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
  162. package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
  163. package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
  164. package/src/__tests__/llm-context-normalization.test.ts +42 -0
  165. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  166. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  167. package/src/__tests__/llm-resolver.test.ts +408 -9
  168. package/src/__tests__/llm-schema.test.ts +1 -1
  169. package/src/__tests__/llm-usage-store.test.ts +66 -0
  170. package/src/__tests__/logger.test.ts +89 -0
  171. package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
  172. package/src/__tests__/mcp-abort-signal.test.ts +16 -2
  173. package/src/__tests__/mcp-client-auth.test.ts +14 -0
  174. package/src/__tests__/media-generate-image.test.ts +31 -0
  175. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  176. package/src/__tests__/messaging-send-tool.test.ts +1 -0
  177. package/src/__tests__/migration-import-from-url.test.ts +3 -3
  178. package/src/__tests__/mock-gateway-ipc.ts +18 -2
  179. package/src/__tests__/model-intents.test.ts +4 -6
  180. package/src/__tests__/native-web-search.test.ts +30 -2
  181. package/src/__tests__/notification-deep-link.test.ts +62 -0
  182. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  183. package/src/__tests__/oauth-commands-routes.test.ts +37 -0
  184. package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
  185. package/src/__tests__/oauth-store.test.ts +3 -2
  186. package/src/__tests__/onboarding-template-contract.test.ts +4 -3
  187. package/src/__tests__/openai-provider.test.ts +54 -9
  188. package/src/__tests__/openai-responses-provider.test.ts +176 -14
  189. package/src/__tests__/openrouter-provider-only.test.ts +27 -5
  190. package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
  191. package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
  192. package/src/__tests__/persistence-pipeline.test.ts +139 -1
  193. package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
  194. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  195. package/src/__tests__/platform.test.ts +2 -2
  196. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  197. package/src/__tests__/plugin-bootstrap.test.ts +11 -13
  198. package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
  199. package/src/__tests__/plugin-types.test.ts +3 -2
  200. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  201. package/src/__tests__/pricing.test.ts +12 -0
  202. package/src/__tests__/process-message-background-slack.test.ts +21 -16
  203. package/src/__tests__/process-message-display-content.test.ts +19 -22
  204. package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
  205. package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
  206. package/src/__tests__/provider-registry-ollama.test.ts +45 -22
  207. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  208. package/src/__tests__/recording-handler.test.ts +1 -0
  209. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
  210. package/src/__tests__/registry.test.ts +84 -84
  211. package/src/__tests__/relay-server.test.ts +10 -10
  212. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  213. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
  214. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  215. package/src/__tests__/schedule-store.test.ts +16 -1
  216. package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
  217. package/src/__tests__/secret-ingress-http.test.ts +5 -1
  218. package/src/__tests__/secure-keys.test.ts +3 -3
  219. package/src/__tests__/send-endpoint-busy.test.ts +81 -42
  220. package/src/__tests__/server-history-render.test.ts +4 -1
  221. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  222. package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
  223. package/src/__tests__/skill-feature-flags.test.ts +16 -18
  224. package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
  225. package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
  226. package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
  227. package/src/__tests__/skill-tool-factory.test.ts +97 -96
  228. package/src/__tests__/slack-channel-config.test.ts +3 -3
  229. package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
  230. package/src/__tests__/subagent-disposal.test.ts +27 -8
  231. package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
  232. package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
  233. package/src/__tests__/subagent-manager-notify.test.ts +20 -8
  234. package/src/__tests__/subagent-notify-parent.test.ts +6 -5
  235. package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
  236. package/src/__tests__/subagent-tools.test.ts +2 -1
  237. package/src/__tests__/suggestion-routes.test.ts +2 -0
  238. package/src/__tests__/sync-message-contract.test.ts +59 -0
  239. package/src/__tests__/system-prompt.test.ts +183 -131
  240. package/src/__tests__/terminal-tools.test.ts +1 -1
  241. package/src/__tests__/test-preload-verifier.ts +68 -0
  242. package/src/__tests__/test-preload.ts +32 -39
  243. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  244. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  245. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  246. package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
  247. package/src/__tests__/tool-executor.test.ts +64 -72
  248. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  249. package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
  250. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  251. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  252. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  253. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  254. package/src/__tests__/twilio-routes.test.ts +3 -2
  255. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  256. package/src/__tests__/usage-routes.test.ts +3 -0
  257. package/src/__tests__/validate-input.test.ts +381 -0
  258. package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
  259. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
  260. package/src/__tests__/voice-session-bridge.test.ts +37 -28
  261. package/src/__tests__/workspace-git-service.test.ts +6 -5
  262. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  263. package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
  264. package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
  265. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  266. package/src/acp/prepare-agent-env.ts +78 -0
  267. package/src/acp/session-manager.ts +6 -7
  268. package/src/agent/loop.ts +88 -0
  269. package/src/api/README.md +127 -0
  270. package/src/api/constants/call-sites.ts +27 -0
  271. package/src/api/events/assistant-outbound-attachment.ts +51 -0
  272. package/src/api/events/assistant-text-delta.ts +32 -0
  273. package/src/api/events/assistant-turn-start.ts +33 -0
  274. package/src/api/events/document-comment-created.ts +48 -0
  275. package/src/api/events/document-comment-deleted.ts +24 -0
  276. package/src/api/events/document-comment-reopened.ts +25 -0
  277. package/src/api/events/document-comment-resolved.ts +27 -0
  278. package/src/api/events/generation-cancelled.ts +24 -0
  279. package/src/api/events/generation-handoff.ts +41 -0
  280. package/src/api/events/message-complete.ts +42 -0
  281. package/src/api/events/open-url.ts +30 -0
  282. package/src/api/events/relationship-state-updated.ts +25 -0
  283. package/src/api/events/tool-use-start.ts +32 -0
  284. package/src/api/index.ts +129 -0
  285. package/src/api/package.json +10 -0
  286. package/src/api/responses/llm-context-response.ts +39 -0
  287. package/src/api/responses/llm-request-log-entry.ts +93 -0
  288. package/src/api/responses/memory-recall-log.ts +65 -0
  289. package/src/api/responses/memory-v2-activation-log.ts +78 -0
  290. package/src/background-wake/background-wake-routes.test.ts +868 -0
  291. package/src/background-wake/platform-client.test.ts +308 -0
  292. package/src/background-wake/platform-client.ts +167 -0
  293. package/src/background-wake/publisher.ts +91 -0
  294. package/src/background-wake/runtime-registry.ts +24 -0
  295. package/src/background-wake/wake-intent-hooks.test.ts +282 -0
  296. package/src/calls/guardian-dispatch.ts +1 -0
  297. package/src/calls/voice-session-bridge.ts +4 -4
  298. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  299. package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
  300. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  301. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  302. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  303. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  304. package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
  305. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  306. package/src/cli/commands/__tests__/notifications.test.ts +184 -40
  307. package/src/cli/commands/browser.ts +247 -0
  308. package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
  309. package/src/cli/commands/channels/index.ts +229 -0
  310. package/src/cli/commands/domain.ts +91 -41
  311. package/src/cli/commands/inference.ts +93 -40
  312. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  313. package/src/cli/commands/memory-v2.ts +176 -1
  314. package/src/cli/commands/memory-v3-render.ts +491 -0
  315. package/src/cli/commands/memory-v3.ts +567 -0
  316. package/src/cli/commands/notifications.ts +365 -55
  317. package/src/cli/lib/open-browser.ts +7 -2
  318. package/src/cli/program.ts +4 -0
  319. package/src/config/assistant-feature-flags.ts +39 -46
  320. package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
  321. package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
  322. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  323. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  324. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  325. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  326. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  327. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  328. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  329. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  330. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  331. package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
  332. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
  333. package/src/config/bundled-tool-registry.ts +2 -0
  334. package/src/config/call-site-defaults.ts +8 -7
  335. package/src/config/feature-flag-cache.ts +86 -0
  336. package/src/config/feature-flag-registry.json +33 -17
  337. package/src/config/llm-context-resolution.ts +10 -1
  338. package/src/config/llm-resolver.ts +121 -15
  339. package/src/config/loader.ts +4 -5
  340. package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
  341. package/src/config/schemas/call-site-catalog.ts +21 -7
  342. package/src/config/schemas/heartbeat.ts +1 -1
  343. package/src/config/schemas/llm.ts +102 -2
  344. package/src/config/schemas/memory-v2.ts +272 -0
  345. package/src/config/schemas/memory.ts +2 -1
  346. package/src/config/schemas/services.ts +6 -2
  347. package/src/config/seed-inference-profiles.ts +36 -16
  348. package/src/context/compactor.ts +52 -0
  349. package/src/context/token-estimator.ts +10 -5
  350. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  351. package/src/conversations/message-consolidation.ts +404 -0
  352. package/src/credential-execution/executable-discovery.ts +40 -0
  353. package/src/credential-execution/process-manager.ts +6 -2
  354. package/src/credential-health/credential-health-service.ts +125 -40
  355. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
  356. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
  357. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
  358. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
  359. package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
  360. package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
  361. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
  362. package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
  363. package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
  364. package/src/daemon/conversation-agent-loop.ts +244 -90
  365. package/src/daemon/conversation-error.ts +64 -6
  366. package/src/daemon/conversation-lifecycle.ts +27 -22
  367. package/src/daemon/conversation-messaging.ts +84 -43
  368. package/src/daemon/conversation-process.ts +74 -37
  369. package/src/daemon/conversation-runtime-assembly.ts +38 -17
  370. package/src/daemon/conversation-skill-tools.ts +14 -30
  371. package/src/daemon/conversation-surfaces.ts +69 -34
  372. package/src/daemon/conversation-tool-setup.ts +77 -32
  373. package/src/daemon/conversation-usage.ts +2 -0
  374. package/src/daemon/conversation.ts +40 -75
  375. package/src/daemon/daemon-control.ts +1 -1
  376. package/src/daemon/daemon-skill-host.ts +9 -2
  377. package/src/daemon/disk-pressure-guard.ts +39 -29
  378. package/src/daemon/first-greeting.ts +31 -13
  379. package/src/daemon/handlers/config-model.test.ts +1 -0
  380. package/src/daemon/handlers/conversations.ts +11 -3
  381. package/src/daemon/handlers/shared.ts +6 -1
  382. package/src/daemon/host-browser-proxy.ts +5 -5
  383. package/src/daemon/host-cu-proxy.ts +4 -4
  384. package/src/daemon/host-file-proxy.ts +4 -4
  385. package/src/daemon/host-proxy-base.ts +4 -4
  386. package/src/daemon/host-transfer-proxy.ts +10 -10
  387. package/src/daemon/lifecycle.ts +29 -26
  388. package/src/daemon/mcp-reload-service.ts +1 -1
  389. package/src/daemon/meet-manifest-loader.ts +11 -24
  390. package/src/daemon/message-types/conversations.ts +22 -27
  391. package/src/daemon/message-types/document-comments.ts +8 -44
  392. package/src/daemon/message-types/home.ts +2 -14
  393. package/src/daemon/message-types/integrations.ts +2 -7
  394. package/src/daemon/message-types/messages.ts +25 -48
  395. package/src/daemon/message-types/subagents.ts +6 -0
  396. package/src/daemon/message-types/sync.ts +14 -0
  397. package/src/daemon/process-message.ts +9 -9
  398. package/src/daemon/providers-setup.ts +1 -1
  399. package/src/daemon/server.ts +16 -0
  400. package/src/daemon/shutdown-handlers.ts +24 -5
  401. package/src/daemon/switch-inference-profile-tool.ts +62 -0
  402. package/src/daemon/tool-setup-types.ts +7 -0
  403. package/src/daemon/wake-target-adapter.ts +10 -0
  404. package/src/documents/document-store.ts +38 -0
  405. package/src/export/__tests__/transcript-formatter.test.ts +1 -0
  406. package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
  407. package/src/heartbeat/heartbeat-service.ts +63 -0
  408. package/src/home/__tests__/feed-writer.test.ts +161 -0
  409. package/src/home/__tests__/post-connect-feed.test.ts +1 -0
  410. package/src/home/__tests__/suggested-prompts.test.ts +55 -59
  411. package/src/home/feed-writer.ts +146 -7
  412. package/src/home/home-greeting.ts +0 -9
  413. package/src/home/suggested-prompts.ts +27 -154
  414. package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
  415. package/src/ipc/gateway-client.test.ts +4 -1
  416. package/src/ipc/gateway-flag-listener.ts +123 -0
  417. package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
  418. package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
  419. package/src/ipc/skill-routes/memory.ts +4 -3
  420. package/src/ipc/skill-routes/registries.ts +35 -40
  421. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  422. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  423. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
  424. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  425. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
  426. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
  427. package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
  428. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
  429. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
  430. package/src/memory/auto-analysis-enqueue.ts +5 -1
  431. package/src/memory/conversation-attention-store.ts +17 -3
  432. package/src/memory/conversation-crud.ts +423 -182
  433. package/src/memory/conversation-starters-cadence.ts +3 -1
  434. package/src/memory/conversation-title-service.ts +19 -3
  435. package/src/memory/db-async-query.ts +214 -0
  436. package/src/memory/db-connection.ts +29 -19
  437. package/src/memory/db-init.ts +14 -0
  438. package/src/memory/db-maintenance.ts +30 -21
  439. package/src/memory/db-singleton.ts +77 -0
  440. package/src/memory/delivery-channels.ts +82 -0
  441. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
  442. package/src/memory/graph/bootstrap.ts +8 -1
  443. package/src/memory/graph/capability-seed.ts +7 -3
  444. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  445. package/src/memory/graph/extraction.ts +1 -5
  446. package/src/memory/graph/graph-search.ts +7 -1
  447. package/src/memory/graph/retriever.test.ts +3 -3
  448. package/src/memory/indexer.ts +28 -18
  449. package/src/memory/job-handlers/cleanup.ts +76 -18
  450. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  451. package/src/memory/job-handlers/embedding.test.ts +3 -2
  452. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
  453. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  454. package/src/memory/jobs-store.ts +14 -0
  455. package/src/memory/jobs-worker.ts +66 -22
  456. package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
  457. package/src/memory/llm-request-log-source-local.ts +31 -0
  458. package/src/memory/llm-request-log-source.ts +40 -2
  459. package/src/memory/llm-request-log-store.ts +228 -1
  460. package/src/memory/llm-usage-store.ts +24 -0
  461. package/src/memory/memory-retrospective-enqueue.ts +8 -1
  462. package/src/memory/memory-retrospective-job.ts +5 -0
  463. package/src/memory/memory-v2-activation-log-store.ts +110 -7
  464. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  465. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  466. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  467. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  468. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  469. package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
  470. package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
  471. package/src/memory/migrations/index.ts +19 -0
  472. package/src/memory/migrations/registry.ts +33 -0
  473. package/src/memory/schema/conversations.ts +10 -2
  474. package/src/memory/schema/inference.ts +0 -1
  475. package/src/memory/schema/infrastructure.ts +21 -0
  476. package/src/memory/tool-usage-store.ts +36 -8
  477. package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
  478. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  479. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  480. package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
  481. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  482. package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
  483. package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
  484. package/src/memory/v2/__tests__/injection.test.ts +127 -98
  485. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  486. package/src/memory/v2/__tests__/router.test.ts +171 -3
  487. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
  488. package/src/memory/v2/harness/compare.ts +57 -0
  489. package/src/memory/v2/harness/metrics.ts +128 -0
  490. package/src/memory/v2/harness/oracle.ts +145 -0
  491. package/src/memory/v2/harness/replay-input.ts +240 -0
  492. package/src/memory/v2/harness/retriever.ts +74 -0
  493. package/src/memory/v2/harness/router-retriever.ts +43 -0
  494. package/src/memory/v2/harness/runner.ts +112 -0
  495. package/src/memory/v2/harness/trace.ts +64 -0
  496. package/src/memory/v2/injection.ts +21 -15
  497. package/src/memory/v2/prompts/router.ts +26 -1
  498. package/src/memory/v2/qdrant.ts +14 -2
  499. package/src/memory/v2/router.ts +171 -18
  500. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  501. package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
  502. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
  503. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  504. package/src/memory/v3/__tests__/edges.test.ts +706 -0
  505. package/src/memory/v3/__tests__/filter.test.ts +560 -0
  506. package/src/memory/v3/__tests__/gate.test.ts +637 -0
  507. package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
  508. package/src/memory/v3/__tests__/loop.test.ts +775 -0
  509. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  510. package/src/memory/v3/__tests__/scouts.test.ts +489 -0
  511. package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
  512. package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
  513. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  514. package/src/memory/v3/__tests__/traversal.test.ts +508 -0
  515. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  516. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  517. package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
  518. package/src/memory/v3/__tests__/validate.test.ts +277 -0
  519. package/src/memory/v3/auto-edges.ts +223 -0
  520. package/src/memory/v3/coactivation-store.ts +124 -0
  521. package/src/memory/v3/consolidation-job.ts +323 -0
  522. package/src/memory/v3/coretrieval-seed.ts +240 -0
  523. package/src/memory/v3/edge-learning-job.ts +160 -0
  524. package/src/memory/v3/edges.ts +286 -0
  525. package/src/memory/v3/filter.ts +286 -0
  526. package/src/memory/v3/gate.ts +349 -0
  527. package/src/memory/v3/index-composition.ts +126 -0
  528. package/src/memory/v3/llm-capture.ts +46 -0
  529. package/src/memory/v3/loop.ts +430 -0
  530. package/src/memory/v3/maintenance.ts +144 -0
  531. package/src/memory/v3/prompt-context.ts +33 -0
  532. package/src/memory/v3/prompts/consolidation.ts +458 -0
  533. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  534. package/src/memory/v3/retriever.ts +33 -0
  535. package/src/memory/v3/scouts.ts +431 -0
  536. package/src/memory/v3/shadow-diff.ts +287 -0
  537. package/src/memory/v3/shadow-middleware.ts +347 -0
  538. package/src/memory/v3/traversal.ts +211 -0
  539. package/src/memory/v3/tree-index.ts +237 -0
  540. package/src/memory/v3/tree-store.ts +394 -0
  541. package/src/memory/v3/tree-walk.ts +356 -0
  542. package/src/memory/v3/types.ts +65 -0
  543. package/src/memory/v3/validate.ts +323 -0
  544. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
  545. package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
  546. package/src/notifications/adapters/macos.ts +18 -1
  547. package/src/notifications/adapters/platform.ts +1 -1
  548. package/src/notifications/adapters/slack.ts +45 -11
  549. package/src/notifications/broadcaster.ts +114 -63
  550. package/src/notifications/conversation-pairing.ts +23 -3
  551. package/src/notifications/decision-engine.ts +1 -4
  552. package/src/notifications/decisions-store.ts +32 -1
  553. package/src/notifications/deliveries-store.ts +45 -0
  554. package/src/notifications/edit-notification.ts +201 -0
  555. package/src/notifications/emit-signal.ts +40 -50
  556. package/src/notifications/signal.ts +10 -0
  557. package/src/notifications/types.ts +37 -0
  558. package/src/oauth/byo-connection.test.ts +67 -3
  559. package/src/oauth/byo-connection.ts +32 -5
  560. package/src/oauth/connect-orchestrator.ts +9 -0
  561. package/src/oauth/connection-resolver.test.ts +76 -0
  562. package/src/oauth/connection-resolver.ts +49 -10
  563. package/src/oauth/manual-token-connection.ts +51 -3
  564. package/src/oauth/seed-providers.ts +3 -0
  565. package/src/permissions/approval-policy.test.ts +19 -5
  566. package/src/permissions/approval-policy.ts +14 -3
  567. package/src/permissions/checker.ts +21 -8
  568. package/src/permissions/prompter.ts +3 -3
  569. package/src/permissions/question-prompter.ts +5 -2
  570. package/src/permissions/secret-prompter.ts +2 -2
  571. package/src/platform/client.test.ts +24 -1
  572. package/src/platform/client.ts +8 -0
  573. package/src/platform/feature-gate.ts +15 -0
  574. package/src/plugin-api/index.ts +4 -0
  575. package/src/plugin-api/types.ts +7 -33
  576. package/src/plugins/defaults/index.ts +6 -0
  577. package/src/plugins/defaults/injectors.ts +20 -19
  578. package/src/plugins/defaults/persistence.ts +25 -6
  579. package/src/plugins/external-plugin-loader.ts +5 -68
  580. package/src/plugins/types.ts +68 -29
  581. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  582. package/src/proactive-artifact/job.test.ts +1 -0
  583. package/src/prompts/__tests__/system-prompt.test.ts +4 -4
  584. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  585. package/src/prompts/persona-resolver.ts +36 -21
  586. package/src/prompts/sections.ts +39 -7
  587. package/src/prompts/system-prompt.ts +84 -221
  588. package/src/prompts/template-detection.ts +10 -4
  589. package/src/prompts/templates/BOOTSTRAP.md +9 -13
  590. package/src/prompts/templates/IDENTITY.md +0 -2
  591. package/src/prompts/templates/system-sections.ts +230 -8
  592. package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
  593. package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
  594. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  595. package/src/providers/anthropic/client.ts +32 -66
  596. package/src/providers/call-site-routing.ts +42 -6
  597. package/src/providers/connection-model-compat.ts +61 -0
  598. package/src/providers/connection-resolution.ts +47 -14
  599. package/src/providers/fireworks/client.ts +1 -0
  600. package/src/providers/gemini/client.ts +70 -6
  601. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
  602. package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
  603. package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
  604. package/src/providers/inference/adapter-factory.ts +3 -0
  605. package/src/providers/inference/auth.ts +0 -8
  606. package/src/providers/inference/connections.ts +3 -66
  607. package/src/providers/inference/resolve-auth.ts +2 -3
  608. package/src/providers/minimax/client.ts +106 -0
  609. package/src/providers/model-catalog.ts +78 -1
  610. package/src/providers/model-intents.ts +4 -4
  611. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  612. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
  613. package/src/providers/openai/chat-completions-provider.ts +116 -15
  614. package/src/providers/openai/codex-models.ts +20 -0
  615. package/src/providers/openai/responses-provider.ts +87 -30
  616. package/src/providers/openrouter/client.ts +13 -8
  617. package/src/providers/provider-send-message.ts +20 -5
  618. package/src/providers/registry.ts +48 -8
  619. package/src/providers/retry.ts +50 -7
  620. package/src/providers/search-provider-catalog.ts +17 -9
  621. package/src/providers/thinking-config.ts +26 -1
  622. package/src/providers/types.ts +9 -0
  623. package/src/providers/usage-tracking.ts +2 -0
  624. package/src/runtime/AGENTS.md +2 -2
  625. package/src/runtime/__tests__/agent-wake.test.ts +1 -0
  626. package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
  627. package/src/runtime/access-request-helper.ts +1 -0
  628. package/src/runtime/agent-wake.ts +1 -0
  629. package/src/runtime/assistant-event-hub.ts +76 -6
  630. package/src/runtime/auth/route-policy.ts +46 -0
  631. package/src/runtime/btw-sidechain.ts +0 -6
  632. package/src/runtime/channel-readiness-service.ts +68 -0
  633. package/src/runtime/channel-reply-delivery.ts +23 -0
  634. package/src/runtime/channel-retry-sweep.ts +47 -14
  635. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  636. package/src/runtime/http-types.ts +0 -2
  637. package/src/runtime/migrations/vbundle-builder.ts +12 -4
  638. package/src/runtime/pending-interactions.ts +0 -1
  639. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
  640. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
  641. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
  642. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
  643. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
  644. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
  645. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
  646. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
  647. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  648. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
  649. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
  650. package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
  651. package/src/runtime/routes/acp-routes-list.test.ts +3 -0
  652. package/src/runtime/routes/acp-routes.test.ts +255 -6
  653. package/src/runtime/routes/acp-routes.ts +8 -1
  654. package/src/runtime/routes/app-management-routes.ts +111 -4
  655. package/src/runtime/routes/avatar-routes.ts +10 -10
  656. package/src/runtime/routes/background-wake-routes.ts +356 -0
  657. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  658. package/src/runtime/routes/btw-routes.ts +4 -10
  659. package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
  660. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  661. package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
  662. package/src/runtime/routes/conversation-list-routes.ts +159 -4
  663. package/src/runtime/routes/conversation-management-routes.ts +108 -26
  664. package/src/runtime/routes/conversation-query-routes.ts +200 -44
  665. package/src/runtime/routes/conversation-routes.ts +409 -521
  666. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  667. package/src/runtime/routes/conversations-import-routes.ts +19 -6
  668. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  669. package/src/runtime/routes/documents-routes.ts +10 -1
  670. package/src/runtime/routes/domain-routes.ts +60 -10
  671. package/src/runtime/routes/email-routes.ts +5 -2
  672. package/src/runtime/routes/events-routes.ts +54 -10
  673. package/src/runtime/routes/group-routes.ts +35 -8
  674. package/src/runtime/routes/home-feed-routes.ts +129 -0
  675. package/src/runtime/routes/host-browser-routes.ts +10 -2
  676. package/src/runtime/routes/host-cu-routes.ts +2 -2
  677. package/src/runtime/routes/identity-intro-cache.ts +61 -16
  678. package/src/runtime/routes/identity-routes.ts +30 -9
  679. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  680. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
  681. package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
  682. package/src/runtime/routes/index.ts +10 -0
  683. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  684. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  685. package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
  686. package/src/runtime/routes/integrations/vercel.ts +15 -0
  687. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  688. package/src/runtime/routes/llm-context-normalization.ts +7 -2
  689. package/src/runtime/routes/memory-item-routes.ts +8 -3
  690. package/src/runtime/routes/memory-v2-routes.ts +215 -5
  691. package/src/runtime/routes/memory-v3-routes.ts +474 -0
  692. package/src/runtime/routes/migration-routes.ts +32 -28
  693. package/src/runtime/routes/notification-routes.ts +63 -1
  694. package/src/runtime/routes/oauth-commands-routes.ts +6 -1
  695. package/src/runtime/routes/plugins-routes.ts +337 -0
  696. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  697. package/src/runtime/routes/secret-routes.ts +25 -5
  698. package/src/runtime/routes/settings-routes.ts +12 -11
  699. package/src/runtime/routes/slack-channel-routes.ts +5 -4
  700. package/src/runtime/routes/surface-action-routes.ts +1 -38
  701. package/src/runtime/routes/surface-content-routes.ts +12 -5
  702. package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
  703. package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
  704. package/src/runtime/routes/workspace-routes.ts +25 -10
  705. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
  706. package/src/runtime/slack-dm-text-delivery.ts +177 -0
  707. package/src/runtime/sync/resource-sync-events.ts +106 -38
  708. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  709. package/src/runtime/sync/sync-publisher.ts +2 -1
  710. package/src/runtime/tool-grant-request-helper.ts +1 -0
  711. package/src/runtime/verification-outbound-actions.ts +73 -1
  712. package/src/schedule/schedule-store.ts +8 -1
  713. package/src/schedule/scheduler.ts +111 -15
  714. package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
  715. package/src/security/encrypted-store.ts +7 -16
  716. package/src/security/store-path-override.ts +61 -0
  717. package/src/signals/user-message.ts +5 -8
  718. package/src/skills/validate-input.ts +177 -0
  719. package/src/subagent/manager.ts +13 -13
  720. package/src/subagent/types.ts +6 -0
  721. package/src/tasks/tool-sanitizer.ts +2 -2
  722. package/src/telemetry/types.ts +12 -0
  723. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  724. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  725. package/src/tools/acp/spawn.test.ts +119 -0
  726. package/src/tools/acp/spawn.ts +15 -2
  727. package/src/tools/apps/definitions.ts +36 -28
  728. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  729. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  730. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
  731. package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
  732. package/src/tools/browser/browser-execution.ts +16 -3
  733. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  734. package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
  735. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
  736. package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
  737. package/src/tools/browser/cdp-client/factory.ts +100 -17
  738. package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
  739. package/src/tools/browser/cdp-client/types.ts +65 -0
  740. package/src/tools/browser/pinned-tabs.ts +96 -40
  741. package/src/tools/computer-use/definitions.ts +282 -336
  742. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  743. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  744. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  745. package/src/tools/credentials/vault.ts +3 -9
  746. package/src/tools/document/document-tool.ts +189 -7
  747. package/src/tools/execution-target.ts +18 -23
  748. package/src/tools/executor.ts +24 -56
  749. package/src/tools/filesystem/edit.ts +3 -9
  750. package/src/tools/filesystem/list.ts +3 -9
  751. package/src/tools/filesystem/read.ts +3 -9
  752. package/src/tools/filesystem/write.ts +3 -9
  753. package/src/tools/host-filesystem/edit.test.ts +1 -0
  754. package/src/tools/host-filesystem/edit.ts +3 -9
  755. package/src/tools/host-filesystem/read.test.ts +1 -0
  756. package/src/tools/host-filesystem/read.ts +3 -9
  757. package/src/tools/host-filesystem/transfer.test.ts +31 -6
  758. package/src/tools/host-filesystem/transfer.ts +3 -9
  759. package/src/tools/host-filesystem/write.test.ts +1 -0
  760. package/src/tools/host-filesystem/write.ts +3 -9
  761. package/src/tools/host-terminal/host-shell.ts +3 -9
  762. package/src/tools/mcp/mcp-tool-factory.ts +1 -10
  763. package/src/tools/memory/register.test.ts +1 -1
  764. package/src/tools/memory/register.ts +4 -9
  765. package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
  766. package/src/tools/network/__tests__/web-search.test.ts +211 -3
  767. package/src/tools/network/managed-search-proxy.ts +183 -0
  768. package/src/tools/network/web-fetch.ts +3 -9
  769. package/src/tools/network/web-search.ts +224 -76
  770. package/src/tools/policy-context.ts +3 -1
  771. package/src/tools/registry.ts +150 -123
  772. package/src/tools/schedule/create.ts +1 -1
  773. package/src/tools/schema-transforms.ts +1 -1
  774. package/src/tools/skills/execute.ts +3 -9
  775. package/src/tools/skills/load.ts +3 -9
  776. package/src/tools/skills/skill-tool-factory.ts +18 -44
  777. package/src/tools/subagent/notify-parent.ts +3 -9
  778. package/src/tools/subagent/spawn.ts +3 -0
  779. package/src/tools/system/request-permission.ts +3 -9
  780. package/src/tools/terminal/shell.ts +3 -9
  781. package/src/tools/tool-approval-handler.ts +10 -4
  782. package/src/tools/tool-defaults.ts +94 -0
  783. package/src/tools/tool-name-aliases.ts +72 -14
  784. package/src/tools/types.ts +32 -101
  785. package/src/tools/ui-surface/definitions.ts +104 -108
  786. package/src/types/onboarding-context.ts +6 -0
  787. package/src/usage/attribution.ts +32 -1
  788. package/src/usage/pricing.ts +23 -0
  789. package/src/usage/types.ts +12 -0
  790. package/src/util/browser.ts +7 -2
  791. package/src/util/logger.ts +16 -7
  792. package/src/util/platform.ts +7 -2
  793. package/src/util/sqlite3-runtime.ts +65 -0
  794. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  795. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  796. package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
  797. package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
  798. package/src/workspace/migrations/registry.ts +6 -0
  799. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  800. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  801. package/src/daemon/query-complexity-router.ts +0 -75
  802. package/src/prompts/cache-boundary.ts +0 -8
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { credentialKey } from "../security/credential-key.js";
12
12
  import { getSecureKeyResultAsync } from "../security/secure-keys.js";
13
+ import { getTelegramBotUsername } from "../telegram/bot-username.js";
13
14
  import { getLogger } from "../util/logger.js";
14
15
  import {
15
16
  createConnection,
@@ -24,6 +25,44 @@ const log = getLogger("manual-token-connection");
24
25
  /** Sentinel client_id used for non-OAuth providers that don't have a real app. */
25
26
  const MANUAL_TOKEN_CLIENT_ID = "manual-config";
26
27
 
28
+ type ResolvedAccountInfoSource = "provided" | "derived" | "none";
29
+
30
+ interface ResolvedAccountInfo {
31
+ value?: string;
32
+ source: ResolvedAccountInfoSource;
33
+ }
34
+
35
+ function resolveManualTokenAccountInfo(
36
+ provider: string,
37
+ accountInfo?: string,
38
+ ): ResolvedAccountInfo {
39
+ if (accountInfo !== undefined) {
40
+ return { value: accountInfo, source: "provided" };
41
+ }
42
+
43
+ if (provider === "telegram") {
44
+ const botUsername = getTelegramBotUsername();
45
+ if (!botUsername) return { source: "none" };
46
+ return {
47
+ value: botUsername.startsWith("@") ? botUsername : `@${botUsername}`,
48
+ source: "derived",
49
+ };
50
+ }
51
+
52
+ return { source: "none" };
53
+ }
54
+
55
+ function accountInfoForManualTokenSync(
56
+ provider: string,
57
+ resolved: ResolvedAccountInfo,
58
+ ): string | undefined {
59
+ if (resolved.source !== "derived") return resolved.value;
60
+
61
+ const existing = getConnectionByProvider(provider);
62
+ if (existing?.accountInfo) return undefined;
63
+ return resolved.value;
64
+ }
65
+
27
66
  /**
28
67
  * Ensure an active oauth_connection row exists for the given manual-token
29
68
  * provider. Creates the synthetic oauth_app row on first use.
@@ -79,6 +118,15 @@ export async function syncManualTokenConnection(
79
118
  provider: string,
80
119
  accountInfo?: string,
81
120
  ): Promise<void> {
121
+ const resolvedAccountInfo = resolveManualTokenAccountInfo(
122
+ provider,
123
+ accountInfo,
124
+ );
125
+ const accountInfoToStore = accountInfoForManualTokenSync(
126
+ provider,
127
+ resolvedAccountInfo,
128
+ );
129
+
82
130
  switch (provider) {
83
131
  case "telegram": {
84
132
  const botTokenResult = await getSecureKeyResultAsync(
@@ -94,7 +142,7 @@ export async function syncManualTokenConnection(
94
142
  return;
95
143
  }
96
144
  if (botTokenResult.value && webhookSecretResult.value) {
97
- await ensureManualTokenConnection(provider, accountInfo);
145
+ await ensureManualTokenConnection(provider, accountInfoToStore);
98
146
  } else {
99
147
  removeManualTokenConnection(provider);
100
148
  }
@@ -115,7 +163,7 @@ export async function syncManualTokenConnection(
115
163
  return;
116
164
  }
117
165
  if (botTokenResult.value && appTokenResult.value) {
118
- await ensureManualTokenConnection(provider, accountInfo);
166
+ await ensureManualTokenConnection(provider, accountInfoToStore);
119
167
  } else {
120
168
  removeManualTokenConnection(provider);
121
169
  }
@@ -133,7 +181,7 @@ export async function syncManualTokenConnection(
133
181
  return;
134
182
  }
135
183
  if (tokenResult.value) {
136
- await ensureManualTokenConnection(provider, accountInfo);
184
+ await ensureManualTokenConnection(provider, accountInfoToStore);
137
185
  } else {
138
186
  removeManualTokenConnection(provider);
139
187
  }
@@ -199,6 +199,9 @@ export const PROVIDER_SEED_DATA: Record<
199
199
  },
200
200
  ],
201
201
  appType: "Public integration",
202
+ setupNotes: [
203
+ "Enable Token Rotation on your Notion integration (developer dashboard → your integration → Configuration → Token rotation). Without it, Notion does not issue a refresh token and the connection cannot auto-recover if Notion revokes the access token server-side — you will silently lose access and need to reconnect manually.",
204
+ ],
202
205
  identityUrl: "https://api.notion.com/v1/users/me",
203
206
  identityHeaders: { "Notion-Version": "2022-06-28" },
204
207
  identityResponsePaths: ["name", "person.email"],
@@ -334,6 +334,19 @@ describe("no rule — third-party skill tool", () => {
334
334
  expect(result.reason).toContain("Skill tool");
335
335
  });
336
336
 
337
+ test("plugin origin → treated as extension-owned (prompt at strict threshold)", () => {
338
+ // Plugins join skills in the "extension-owned" bucket — both prompt by
339
+ // default. `isSkillBundled` is irrelevant for plugins (always false).
340
+ const result = evaluate({
341
+ riskLevel: RiskLevel.Low,
342
+ toolName: "custom_plugin_tool",
343
+ toolOrigin: "plugin",
344
+ autoApproveUpTo: "none",
345
+ });
346
+ expect(result.decision).toBe("prompt");
347
+ expect(result.reason).toContain("Skill tool");
348
+ });
349
+
337
350
  test("no tool origin but hasManifestOverride, strict threshold → prompt (unregistered skill tool)", () => {
338
351
  const result = evaluate({
339
352
  riskLevel: RiskLevel.Low,
@@ -699,16 +712,17 @@ describe("edge cases", () => {
699
712
  expect(result.reason).toContain("Skill tool");
700
713
  });
701
714
 
702
- test("hasManifestOverride with toolOrigin set to builtin — falls through (not a skill)", () => {
715
+ test("hasManifestOverride with toolOrigin=mcp — falls through (not extension-owned)", () => {
703
716
  const result = evaluate({
704
717
  riskLevel: RiskLevel.Low,
705
718
  toolName: "manifest_tool",
706
- toolOrigin: "builtin",
719
+ toolOrigin: "mcp",
707
720
  hasManifestOverride: true,
708
721
  });
709
- // toolOrigin is "builtin", so the third-party skill check doesn't trigger.
710
- // The hasManifestOverride check requires !toolOrigin, but toolOrigin is set.
711
- // Falls through to risk-based: Low allow (within default "low" threshold).
722
+ // toolOrigin is "mcp", which is not extension-class (skill/plugin), so
723
+ // the third-party skill check doesn't trigger. The hasManifestOverride
724
+ // sub-check requires !toolOrigin, but toolOrigin is set. Falls through
725
+ // to risk-based: Low → allow (within default "low" threshold).
712
726
  expect(result.decision).toBe("allow");
713
727
  expect(result.reason).toContain("low risk");
714
728
  });
@@ -1,3 +1,4 @@
1
+ import type { OwnerKind } from "../tools/types.js";
1
2
  import type { TrustRule } from "./types.js";
2
3
  import { RiskLevel } from "./types.js";
3
4
 
@@ -13,8 +14,13 @@ export interface ApprovalContext {
13
14
  matchedRule?: TrustRule;
14
15
  isContainerized: boolean;
15
16
  isWorkspaceScoped: boolean;
16
- /** Where the tool originates from — "skill" for skill-provided tools, "builtin" for core tools. */
17
- toolOrigin?: "skill" | "builtin";
17
+ /**
18
+ * Owner kind of the tool, as recorded by the tool registry — "skill" /
19
+ * "plugin" / "mcp" for extension-owned tools, `undefined` for core tools
20
+ * (and for tools that aren't registered, e.g. unregistered skill tools
21
+ * matched only via `hasManifestOverride`).
22
+ */
23
+ toolOrigin?: OwnerKind;
18
24
  /** Whether the tool's owning skill is a first-party bundled skill. */
19
25
  isSkillBundled?: boolean;
20
26
  /** Whether the tool has a manifest override (unregistered skill tool). */
@@ -173,8 +179,13 @@ export class DefaultApprovalPolicy implements ApprovalPolicy {
173
179
 
174
180
  // ── 6. No rule + third-party skill tool → prompt (unless threshold covers it)
175
181
  if (!matchedRule) {
182
+ // Plugin- and skill-owned tools are both treated as extension-class
183
+ // for approval purposes: external by default, prompt unless bundled.
184
+ // MCP-owned tools fall through to the core risk-based path.
185
+ const isExtensionOwned =
186
+ toolOrigin === "skill" || toolOrigin === "plugin";
176
187
  const isThirdPartySkill =
177
- (toolOrigin === "skill" && !isSkillBundled) ||
188
+ (isExtensionOwned && !isSkillBundled) ||
178
189
  (hasManifestOverride && !toolOrigin);
179
190
  if (isThirdPartySkill) {
180
191
  if (isRiskWithinThreshold(riskLevel, context.autoApproveUpTo)) {
@@ -15,7 +15,8 @@ import {
15
15
  looksLikeHostPortShorthand,
16
16
  looksLikePathOnlyInput,
17
17
  } from "../tools/network/url-safety.js";
18
- import { getTool } from "../tools/registry.js";
18
+ import { getTool, getToolOwner } from "../tools/registry.js";
19
+ import type { Tool } from "../tools/types.js";
19
20
  import {
20
21
  getDeprecatedDir,
21
22
  getProtectedDir,
@@ -150,6 +151,23 @@ function resolveSkillIdAndHash(
150
151
  }
151
152
  }
152
153
 
154
+ /**
155
+ * Resolve whether the skill that owns this tool is bundled (first-party).
156
+ * Returns false when the tool has no owning skill or the skill is not in
157
+ * the catalog. Derived from `loadSkillCatalog()` at check time so the
158
+ * answer reflects current catalog truth (managed overrides flip the bit
159
+ * without needing to re-register tools). Owner is looked up from the tool
160
+ * registry (`getToolOwner(name)`) rather than read from the `Tool` object,
161
+ * since ownership lives on the registry, not on the tool itself.
162
+ */
163
+ function isToolOwnerSkillBundled(tool: Tool | undefined): boolean {
164
+ if (!tool) return false;
165
+ const owner = getToolOwner(tool.name);
166
+ if (owner?.kind !== "skill") return false;
167
+ const skill = loadSkillCatalog().find((s) => s.id === owner.id);
168
+ return skill?.bundled ?? false;
169
+ }
170
+
153
171
  /**
154
172
  * Check whether a skill (by id) has parsed inline command expansions.
155
173
  * Returns false when the skill is not found in the catalog.
@@ -529,13 +547,8 @@ export async function check(
529
547
  risk === RiskLevel.Low
530
548
  ? isWorkspaceScopedInvocation(toolName, input, workingDir)
531
549
  : false,
532
- toolOrigin:
533
- tool?.origin === "skill" || tool?.origin === "plugin"
534
- ? "skill"
535
- : tool
536
- ? "builtin"
537
- : undefined,
538
- isSkillBundled: tool?.ownerSkillBundled ?? false,
550
+ toolOrigin: getToolOwner(toolName)?.kind,
551
+ isSkillBundled: isToolOwnerSkillBundled(tool),
539
552
  hasManifestOverride: !!manifestOverride,
540
553
  autoApproveUpTo: threshold,
541
554
  hasSandboxAutoApprove,
@@ -79,7 +79,7 @@ export class PermissionPrompter {
79
79
  const timeoutMs = getConfig().timeouts.permissionTimeoutSec * 1000;
80
80
 
81
81
  const timer = setTimeout(() => {
82
- const interaction = pendingInteractions.resolve(requestId);
82
+ const interaction = pendingInteractions.resolve(requestId, "cancelled");
83
83
  this.ownedIds.delete(requestId);
84
84
  log.warn(
85
85
  { requestId, toolName },
@@ -130,7 +130,7 @@ export class PermissionPrompter {
130
130
  if (signal) {
131
131
  const onAbort = () => {
132
132
  if (this.ownedIds.has(requestId)) {
133
- pendingInteractions.resolve(requestId);
133
+ pendingInteractions.resolve(requestId, "cancelled");
134
134
  this.ownedIds.delete(requestId);
135
135
  resolve({ decision: "deny", wasAbort: true });
136
136
  }
@@ -232,7 +232,7 @@ export class PermissionPrompter {
232
232
 
233
233
  dispose(): void {
234
234
  for (const requestId of [...this.ownedIds]) {
235
- const interaction = pendingInteractions.resolve(requestId);
235
+ const interaction = pendingInteractions.resolve(requestId, "cancelled");
236
236
  this.ownedIds.delete(requestId);
237
237
  interaction?.rpcReject?.(
238
238
  new AssistantError("Prompter disposed", ErrorCode.INTERNAL_ERROR),
@@ -223,8 +223,11 @@ export class QuestionPrompter {
223
223
  signal.removeEventListener("abort", onAbort);
224
224
  }
225
225
  // Idempotent: a no-op if the entry was already removed (e.g. by
226
- // `removeByConversation`) or by an earlier path.
227
- pendingInteractions.resolve(requestId);
226
+ // `removeByConversation`) or by an earlier path. The route's
227
+ // success path resolves with "answered" before invoking rpcResolve,
228
+ // so this fallback only fires for timeout / abort / removeByConversation —
229
+ // all cancellation-shaped outcomes.
230
+ pendingInteractions.resolve(requestId, "cancelled");
228
231
  fn();
229
232
  };
230
233
 
@@ -71,7 +71,7 @@ export class SecretPrompter {
71
71
  const timeoutMs = getConfig().timeouts.permissionTimeoutSec * 1000;
72
72
 
73
73
  const timer = setTimeout(() => {
74
- pendingInteractions.resolve(requestId);
74
+ pendingInteractions.resolve(requestId, "cancelled");
75
75
  this.ownedIds.delete(requestId);
76
76
  log.warn({ requestId, service, field }, "Secret prompt timed out");
77
77
  resolve({ value: null, delivery: "store" });
@@ -142,7 +142,7 @@ export class SecretPrompter {
142
142
 
143
143
  dispose(): void {
144
144
  for (const requestId of [...this.ownedIds]) {
145
- const interaction = pendingInteractions.resolve(requestId);
145
+ const interaction = pendingInteractions.resolve(requestId, "cancelled");
146
146
  this.ownedIds.delete(requestId);
147
147
  interaction?.rpcReject?.(
148
148
  new AssistantError("Prompter disposed", ErrorCode.INTERNAL_ERROR),
@@ -10,6 +10,7 @@ let mockManagedProxyCtx = {
10
10
  assistantApiKey: "",
11
11
  };
12
12
  let mockAssistantId = "";
13
+ let mockSecureKeys: Record<string, string | null | undefined> = {};
13
14
 
14
15
  // ---------------------------------------------------------------------------
15
16
  // Module mocks
@@ -26,7 +27,7 @@ mock.module("../config/env.js", () => ({
26
27
  // Stub the credential-store fallback so tests stay hermetic and do not
27
28
  // read real values from the host credential backend.
28
29
  mock.module("../security/secure-keys.js", () => ({
29
- getSecureKeyAsync: async () => null,
30
+ getSecureKeyAsync: async (key: string) => mockSecureKeys[key] ?? null,
30
31
  }));
31
32
 
32
33
  mock.module("../security/credential-key.js", () => ({
@@ -54,6 +55,7 @@ describe("VellumPlatformClient", () => {
54
55
  assistantApiKey: "sk-test-key",
55
56
  };
56
57
  mockAssistantId = "asst-123";
58
+ mockSecureKeys = {};
57
59
  });
58
60
 
59
61
  afterEach(() => {
@@ -94,6 +96,27 @@ describe("VellumPlatformClient", () => {
94
96
  const client = await VellumPlatformClient.create();
95
97
  expect(client!.baseUrl).toBe("https://platform.example.com");
96
98
  });
99
+
100
+ test("falls back to credential store values when managed context is not rehydrated", async () => {
101
+ mockManagedProxyCtx = {
102
+ enabled: false,
103
+ platformBaseUrl: "",
104
+ assistantApiKey: "",
105
+ };
106
+ mockAssistantId = "";
107
+ mockSecureKeys = {
108
+ "vellum:platform_base_url": "https://stored-platform.example.com/",
109
+ "vellum:assistant_api_key": "stored-api-key",
110
+ "vellum:platform_assistant_id": " stored-assistant-id ",
111
+ };
112
+
113
+ const client = await VellumPlatformClient.create();
114
+
115
+ expect(client).not.toBeNull();
116
+ expect(client!.baseUrl).toBe("https://stored-platform.example.com");
117
+ expect(client!.assistantApiKey).toBe("stored-api-key");
118
+ expect(client!.platformAssistantId).toBe("stored-assistant-id");
119
+ });
97
120
  });
98
121
 
99
122
  describe("fetch()", () => {
@@ -10,6 +10,7 @@ import { resolveManagedProxyContext } from "../providers/platform-proxy/context.
10
10
  import { credentialKey } from "../security/credential-key.js";
11
11
  import { getSecureKeyAsync } from "../security/secure-keys.js";
12
12
  import { getLogger } from "../util/logger.js";
13
+ import { arePlatformFeaturesEnabled } from "./feature-gate.js";
13
14
 
14
15
  const log = getLogger("platform-client");
15
16
 
@@ -43,6 +44,13 @@ export class VellumPlatformClient {
43
44
  * should check `platformAssistantId` themselves.
44
45
  */
45
46
  static async create(): Promise<VellumPlatformClient | null> {
47
+ if (!arePlatformFeaturesEnabled()) {
48
+ log.debug(
49
+ "platform-features-in-local-mode is disabled — returning null",
50
+ );
51
+ return null;
52
+ }
53
+
46
54
  const ctx = await resolveManagedProxyContext();
47
55
 
48
56
  let baseUrl = ctx.enabled ? ctx.platformBaseUrl : "";
@@ -0,0 +1,15 @@
1
+ import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
2
+ import { getIsPlatform } from "../config/env-registry.js";
3
+ import type { AssistantConfig } from "../config/schema.js";
4
+
5
+ const FLAG_KEY = "platform-features-in-local-mode" as const;
6
+
7
+ export function arePlatformFeaturesEnabled(
8
+ config?: AssistantConfig,
9
+ ): boolean {
10
+ if (getIsPlatform()) return true;
11
+ return isAssistantFeatureFlagEnabled(
12
+ FLAG_KEY,
13
+ (config ?? {}) as AssistantConfig,
14
+ );
15
+ }
@@ -25,6 +25,8 @@
25
25
  * - {@link UserPromptSubmitContext} — passed to `user-prompt-submit` hook,
26
26
  * fired immediately before the agent loop receives a user's prompt
27
27
  * - {@link PluginLogger} — pino-compatible logger shape on the contexts
28
+ * - {@link ToolDefinition} — author-facing tool spec (default-export shape
29
+ * for both plugin tool files and workspace tool files)
28
30
  * - {@link ToolContext} — passed to a plugin tool's `execute` method
29
31
  * - {@link ToolExecutionResult} — return shape of a plugin tool's `execute`
30
32
  *
@@ -41,6 +43,8 @@ export type {
41
43
  PluginLogger,
42
44
  PluginShutdownContext,
43
45
  ToolContext,
46
+ ToolDefinition,
44
47
  ToolExecutionResult,
45
48
  UserPromptSubmitContext,
46
49
  } from "./types.js";
50
+ export { RiskLevel } from "./types.js";
@@ -1,43 +1,17 @@
1
1
  /**
2
- * Public plugin-API types.
3
- *
4
- * This module is the entry point plugin authors land on when they import
5
- * from `@vellumai/plugin-api`. The shapes here are the canonical public
6
- * contract — anything exported is part of the surface that semver gates.
7
- *
8
- * ## Tool-execution types
9
- *
10
- * `ToolContext` and `ToolExecutionResult` are re-exports of the narrow,
11
- * stable bases defined alongside their daemon-internal counterparts in
12
- * `assistant/src/tools/types.ts`. The daemon-internal `ToolContext` /
13
- * `ToolExecutionResult` (with CES, trust classification, lifecycle
14
- * events, sensitive-output bindings, risk metadata, etc.) `extends`
15
- * the public bases, so the runtime can hand plugins the full value
16
- * without a manual cast and tsc enforces the structural relationship.
17
- * Plugin tools see the narrow surface only — they MUST NOT set fields
18
- * that belong to the daemon-internal extension.
19
- *
20
- * ## Hook contexts
21
- *
22
- * The init / shutdown hook contexts are owned by this module directly.
23
- * They have no daemon-internal extension today (the daemon constructs
24
- * and hands them straight through), so there's nothing to inherit from.
25
- *
26
- * ## Compatibility
27
- *
28
- * Adding fields to any public shape is non-breaking. Renaming or
29
- * removing fields is breaking and gated on a major bump of
30
- * `@vellumai/plugin-api`.
2
+ * Public plugin-API types — the canonical contract for
3
+ * `@vellumai/plugin-api`. Adding fields is non-breaking; renaming /
4
+ * removing is breaking and gated on a major bump.
31
5
  */
32
6
 
33
7
  import type { Message } from "../providers/types.js";
34
8
 
35
- // ─── Tool-execution types (re-exported from daemon source-of-truth) ──────────
36
-
37
9
  export type {
38
- PluginToolContext as ToolContext,
39
- PluginToolExecutionResult as ToolExecutionResult,
10
+ ToolContext,
11
+ ToolDefinition,
12
+ ToolExecutionResult,
40
13
  } from "../tools/types.js";
14
+ export { RiskLevel } from "../tools/types.js";
41
15
 
42
16
  // ─── Logger ──────────────────────────────────────────────────────────────────
43
17
 
@@ -24,6 +24,7 @@
24
24
  * chain) does not trip a TDZ.
25
25
  */
26
26
 
27
+ import { memoryV3ShadowPlugin } from "../../memory/v3/shadow-middleware.js";
27
28
  import { registerPlugin, resetPluginRegistryForTests } from "../registry.js";
28
29
  import { type Plugin, PluginExecutionError } from "../types.js";
29
30
  import { defaultCircuitBreakerPlugin } from "./circuit-breaker.js";
@@ -60,6 +61,11 @@ function getAllDefaultPlugins(): readonly Plugin[] {
60
61
  defaultEmptyResponsePlugin,
61
62
  defaultToolErrorPlugin,
62
63
  defaultMemoryRetrievalPlugin,
64
+ // Live-shadow v3 retrieval. Always registered; inert unless both
65
+ // `memory.v3.enabled` and `memory.v3.shadow` are on (gated inside the
66
+ // middleware). Ordered after the default so the default terminal still
67
+ // produces the injected (v2) `MemoryResult`.
68
+ memoryV3ShadowPlugin,
63
69
  defaultInjectorsPlugin,
64
70
  defaultTokenEstimatePlugin,
65
71
  defaultOverflowReducePlugin,
@@ -48,7 +48,6 @@
48
48
 
49
49
  import { resolve } from "node:path";
50
50
 
51
- import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
52
51
  import { getConfig } from "../../config/loader.js";
53
52
  import { getInContextPkbPaths } from "../../daemon/pkb-context-tracker.js";
54
53
  import { buildPkbReminder } from "../../daemon/pkb-reminder-builder.js";
@@ -107,24 +106,19 @@ function readInjectionInputs(ctx: TurnContext): TurnInjectionInputs {
107
106
  }
108
107
 
109
108
  export const DISK_PRESSURE_WARNING_PROMPT = `<disk_pressure_warning>
110
- Disk usage is critically low: this assistant is in storage cleanup mode because the workspace volume is at least 95% full.
109
+ Disk usage is critically low: this assistant is in storage cleanup mode because the workspace volume is critically full.
111
110
 
112
111
  In your first paragraph, warn the user that storage is critically low and that normal work is suspended until space is freed.
113
112
 
114
113
  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.
115
114
 
116
- Do not work on unrelated tasks until disk usage drops below the critical threshold or the user explicitly overrides the lock. Background processes and messages from trusted contacts are blocked while this cleanup mode is active.
115
+ 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.
117
116
  </disk_pressure_warning>`;
118
117
 
119
- function isSafeStorageLimitsEnabled(): boolean {
120
- return isAssistantFeatureFlagEnabled("safe-storage-limits", getConfig());
121
- }
122
-
123
118
  const diskPressureWarningInjector: Injector = {
124
119
  name: "disk-pressure-warning",
125
120
  order: DEFAULT_INJECTOR_ORDER.diskPressureWarning,
126
121
  async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
127
- if (!isSafeStorageLimitsEnabled()) return null;
128
122
  const inputs = readInjectionInputs(ctx);
129
123
  if (!inputs.diskPressureContext?.cleanupModeActive) return null;
130
124
  return {
@@ -387,17 +381,20 @@ async function buildPkbReminderWithHints(
387
381
  * `memory-v2-static` injector — order 38, after-memory-prefix.
388
382
  *
389
383
  * Injects the v2 static memory block (essentials/threads/recent/buffer
390
- * concatenated under markdown headings) wrapped in `<memory>...</memory>`
384
+ * concatenated under markdown headings) wrapped in `<info>...</info>`
391
385
  * onto the user message. The agent loop only forwards `memoryV2Static` on
392
386
  * full-mode turns (first turn / post-compaction), mirroring the PKB
393
387
  * auto-inject cadence — subsequent turns get `null` and the prior block
394
388
  * stays cached on its original user message.
395
389
  *
396
- * Sits between `pkb-reminder` (35) and `now-md` (40) so the rendered order
397
- * after the memory prefix is `[pkb-reminder, pkb-context, memory-v2-static,
398
- * now-md, ...user text]` when every PKB injector also fires (transitional
399
- * state). Once PKB is fully retired under v2 this is the only block
400
- * adjacent to the memory prefix.
390
+ * Sits between `pkb-reminder` (35) and `now-md` (40). Because every
391
+ * after-memory-prefix splice lands at the memory-prefix boundary in
392
+ * ascending `order`, higher-order blocks end up closer to the memory
393
+ * prefix. The rendered layout is therefore `[<memory>dynamic</memory>,
394
+ * <info>memory-v2-static</info>, <NOW.md>, <system_reminder>,
395
+ * <knowledge_base>, ...user text]` when every PKB injector also fires.
396
+ * `countMemoryPrefixBlocks` treats the `<info>` static block as part of
397
+ * the memory prefix so `now-md` (40) splices after it.
401
398
  *
402
399
  * Gating:
403
400
  * - `mode === "full"`.
@@ -420,14 +417,18 @@ const memoryV2StaticInjector: Injector = {
420
417
  },
421
418
  };
422
419
 
420
+ const INFO_CLOSE_TAG_RE = /<\/info\s*>/gi;
421
+
423
422
  /**
424
- * Wrap the static memory content in `<memory>...</memory>`. Escapes any
425
- * closing `</memory>` inside the content so authored memory files cannot
426
- * accidentally break out of the wrapper.
423
+ * Wrap the static memory content in `<info>...</info>`. Escapes any
424
+ * closing `</info>` inside the content so authored memory files cannot
425
+ * accidentally break out of the wrapper. Distinct from the dynamic
426
+ * activation block (which uses `<memory>...</memory>`) so downstream
427
+ * logic can address the two differently.
427
428
  */
428
429
  function buildMemoryV2StaticBlock(content: string): string {
429
- const escaped = content.replace(/<\/memory\s*>/gi, "&lt;/memory&gt;");
430
- return `<memory>\n${escaped}\n</memory>`;
430
+ const escaped = content.replace(INFO_CLOSE_TAG_RE, "&lt;/info&gt;");
431
+ return `<info>\n${escaped}\n</info>`;
431
432
  }
432
433
 
433
434
  /**
@@ -15,12 +15,17 @@
15
15
  *
16
16
  * The terminal dispatches on the discriminated {@link PersistArgs.op} field:
17
17
  *
18
- * - `add` → {@link addMessage}, optionally followed by
19
- * {@link syncMessageToDisk} when `args.syncToDisk` is true.
20
- * - `update` → {@link updateMessageMetadata} (returns `void`, wrapped as
21
- * `{ op: "update" }`).
22
- * - `delete` → {@link deleteMessageById} (returns the segment/summary IDs
23
- * the caller must clean up out-of-band).
18
+ * - `add` → {@link addMessage}, optionally followed by
19
+ * {@link syncMessageToDisk} when `args.syncToDisk` is true.
20
+ * - `reserve` → {@link reserveMessage} pre-allocates an empty row
21
+ * for assistant anchor stamping.
22
+ * - `updateContent` → {@link updateMessageContent} overwrites an existing
23
+ * row's content (returns `void`, wrapped as
24
+ * `{ op: "updateContent" }`).
25
+ * - `update` → {@link updateMessageMetadata} (returns `void`, wrapped
26
+ * as `{ op: "update" }`).
27
+ * - `delete` → {@link deleteMessageById} (returns the segment/summary
28
+ * IDs the caller must clean up out-of-band).
24
29
  *
25
30
  * Manifest declares `provides.persistence: "v1"` so other plugins can
26
31
  * negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
@@ -36,6 +41,8 @@
36
41
  import {
37
42
  addMessage,
38
43
  deleteMessageById,
44
+ reserveMessage,
45
+ updateMessageContent,
39
46
  updateMessageMetadata,
40
47
  } from "../../memory/conversation-crud.js";
41
48
  import { syncMessageToDisk } from "../../memory/conversation-disk-view.js";
@@ -74,6 +81,18 @@ export async function defaultPersistenceTerminal(
74
81
  }
75
82
  return { op: "add", message };
76
83
  }
84
+ case "reserve": {
85
+ const message = await reserveMessage(
86
+ args.conversationId,
87
+ args.role,
88
+ args.metadata,
89
+ );
90
+ return { op: "reserve", message };
91
+ }
92
+ case "updateContent": {
93
+ updateMessageContent(args.messageId, args.content);
94
+ return { op: "updateContent" };
95
+ }
77
96
  case "update": {
78
97
  updateMessageMetadata(args.messageId, args.updates);
79
98
  return { op: "update" };