@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
@@ -23,6 +23,7 @@ import { parseToolManifestFile } from "../skills/tool-manifest.js";
23
23
  import { computeSkillVersionHash } from "../skills/version-hash.js";
24
24
  import {
25
25
  getTool,
26
+ getToolOwner,
26
27
  registerSkillTools,
27
28
  unregisterSkillTools,
28
29
  } from "../tools/registry.js";
@@ -313,7 +314,6 @@ export function projectSkillTools(
313
314
  // Create runtime Tool objects
314
315
  const tools = createSkillToolsFromManifest(
315
316
  manifest.tools,
316
- skillId,
317
317
  skill.directoryPath,
318
318
  currentHash,
319
319
  skill.bundled,
@@ -324,7 +324,7 @@ export function projectSkillTools(
324
324
  const prevHash = prevActive.get(skillId);
325
325
  if (prevHash === undefined) {
326
326
  // Newly active skill — register for the first time
327
- accepted = registerSkillTools(tools);
327
+ accepted = registerSkillTools(skillId, tools);
328
328
  } else if (prevHash !== currentHash) {
329
329
  // Hash changed — unregister stale tools, then re-register with new definitions
330
330
  log.info(
@@ -334,7 +334,7 @@ export function projectSkillTools(
334
334
  unregisterSkillTools(skillId);
335
335
  alreadyUnregistered.add(skillId);
336
336
  try {
337
- accepted = registerSkillTools(tools);
337
+ accepted = registerSkillTools(skillId, tools);
338
338
  } catch (err) {
339
339
  log.error(
340
340
  { err, skillId },
@@ -344,33 +344,17 @@ export function projectSkillTools(
344
344
  continue;
345
345
  }
346
346
  } else {
347
- // Hash unchanged — check if the bundled status drifted (e.g. a
348
- // managed skill override was added/removed with identical content).
349
- // Re-register so the ownerSkillBundled flag stays accurate.
350
- const existing = getTool(tools[0].name);
351
- if (
352
- existing &&
353
- existing.ownerSkillBundled !== (skill.bundled ?? undefined)
354
- ) {
355
- log.info(
356
- { skillId, bundled: skill.bundled },
357
- "Skill bundled status changed, re-registering tools",
358
- );
359
- unregisterSkillTools(skillId);
360
- accepted = registerSkillTools(tools);
361
- } else {
362
- // Filter to only tools that are actually registered for this skill.
363
- // Some tools may have been skipped during initial registration due
364
- // to core-name collisions — don't let them leak back in.
365
- accepted = tools.filter((t) => {
366
- const reg = getTool(t.name);
367
- return (
368
- reg !== undefined &&
369
- reg.origin === "skill" &&
370
- reg.ownerSkillId === skillId
371
- );
372
- });
373
- }
347
+ // Hash unchanged — filter to only tools that are actually registered
348
+ // for this skill. Some tools may have been skipped during initial
349
+ // registration due to core-name collisions don't let them leak
350
+ // back in. Bundled-status drift no longer requires re-registration
351
+ // because the permission checker derives bundled state from the
352
+ // live catalog instead of a stamped tool field.
353
+ accepted = tools.filter((t) => {
354
+ if (getTool(t.name) === undefined) return false;
355
+ const owner = getToolOwner(t.name);
356
+ return owner?.kind === "skill" && owner.id === skillId;
357
+ });
374
358
  }
375
359
 
376
360
  successfulEntries.set(skillId, currentHash);
@@ -28,6 +28,7 @@ import { getLogger } from "../util/logger.js";
28
28
  import { isPlainObject } from "../util/object.js";
29
29
  import { buildConversationErrorMessage } from "./conversation-error.js";
30
30
  import { launchConversation } from "./conversation-launch.js";
31
+ import type { EnqueueMessageOptions } from "./conversation-messaging.js";
31
32
  import type { HostAppControlProxy } from "./host-app-control-proxy.js";
32
33
  import type { HostCuProxy } from "./host-cu-proxy.js";
33
34
  import type {
@@ -45,7 +46,6 @@ import type {
45
46
  UiSurfaceShow,
46
47
  } from "./message-protocol.js";
47
48
  import { INTERACTIVE_SURFACE_TYPES } from "./message-protocol.js";
48
- import type { ConversationTransportMetadata } from "./message-types/conversations.js";
49
49
  import type { HostAppControlInput } from "./message-types/host-app-control.js";
50
50
  import type { UserMessageAttachment } from "./message-types/shared.js";
51
51
  import type { TrustContext } from "./trust-context.js";
@@ -518,18 +518,11 @@ export interface SurfaceConversationContext {
518
518
  /** True when no interactive client is connected (headless / channel-only). */
519
519
  readonly hasNoClient?: boolean;
520
520
  isProcessing(): boolean;
521
- enqueueMessage(
522
- content: string,
523
- attachments: UserMessageAttachment[],
524
- onEvent?: (msg: ServerMessage) => void,
525
- requestId?: string,
526
- activeSurfaceId?: string,
527
- currentPage?: string,
528
- metadata?: Record<string, unknown>,
529
- options?: { isInteractive?: boolean },
530
- displayContent?: string,
531
- transport?: ConversationTransportMetadata,
532
- ): { queued: boolean; requestId: string; rejected?: boolean };
521
+ enqueueMessage(options: EnqueueMessageOptions): {
522
+ queued: boolean;
523
+ requestId: string;
524
+ rejected?: boolean;
525
+ };
533
526
  getQueueDepth(): number;
534
527
  processMessage(
535
528
  content: string,
@@ -1142,6 +1135,34 @@ export type SurfaceActionResult =
1142
1135
  | { accepted: false; error: string }
1143
1136
  | void;
1144
1137
 
1138
+ const SURFACE_COMPLETE_FLAG = "_completeSurface";
1139
+ const SURFACE_COMPLETION_SUMMARY_FIELD = "_completionSummary";
1140
+
1141
+ function getRequestedSurfaceCompletionSummary(
1142
+ data?: Record<string, unknown>,
1143
+ ): string | null {
1144
+ if (data?.[SURFACE_COMPLETE_FLAG] !== true) return null;
1145
+ const summary =
1146
+ typeof data[SURFACE_COMPLETION_SUMMARY_FIELD] === "string"
1147
+ ? data[SURFACE_COMPLETION_SUMMARY_FIELD].trim()
1148
+ : "";
1149
+ return summary || "Completed";
1150
+ }
1151
+
1152
+ function completeSurfaceFromAction(
1153
+ ctx: SurfaceConversationContext,
1154
+ surfaceId: string,
1155
+ summary: string,
1156
+ ): void {
1157
+ broadcastMessage({
1158
+ type: "ui_surface_complete",
1159
+ conversationId: ctx.conversationId,
1160
+ surfaceId,
1161
+ summary,
1162
+ });
1163
+ markSurfaceCompleted(ctx, surfaceId, summary);
1164
+ }
1165
+
1145
1166
  export async function handleSurfaceAction(
1146
1167
  ctx: SurfaceConversationContext,
1147
1168
  surfaceId: string,
@@ -1318,9 +1339,16 @@ export async function handleSurfaceAction(
1318
1339
  }
1319
1340
 
1320
1341
  // Determine message content from the action.
1342
+ const stored = ctx.surfaceState.get(surfaceId);
1343
+ const actionDef = stored?.actions?.find((a) => a.id === actionId);
1344
+ const mergedData: Record<string, unknown> | undefined =
1345
+ actionDef?.data || data ? { ...actionDef?.data, ...data } : undefined;
1346
+
1321
1347
  const isRelay = actionId === "relay_prompt" || actionId === "agent_prompt";
1322
1348
  const prompt =
1323
- isRelay && typeof data?.prompt === "string" ? data.prompt.trim() : "";
1349
+ isRelay && typeof mergedData?.prompt === "string"
1350
+ ? mergedData.prompt.trim()
1351
+ : "";
1324
1352
 
1325
1353
  // Read accumulated state once — used by both relay and custom action paths.
1326
1354
  const accState = ctx.accumulatedSurfaceState.get(surfaceId);
@@ -1329,9 +1357,9 @@ export async function handleSurfaceAction(
1329
1357
  // Extract file attachments from action data so they are sent as proper
1330
1358
  // image/file content blocks instead of dumping base64 into the text.
1331
1359
  let attachments: UserMessageAttachment[] = [];
1332
- let actionDataForText = data;
1333
- if (data && Array.isArray(data.files)) {
1334
- const files = data.files as Array<Record<string, unknown>>;
1360
+ let actionDataForText = mergedData;
1361
+ if (mergedData && Array.isArray(mergedData.files)) {
1362
+ const files = mergedData.files as Array<Record<string, unknown>>;
1335
1363
  attachments = files
1336
1364
  .filter(
1337
1365
  (f) =>
@@ -1351,7 +1379,7 @@ export async function handleSurfaceAction(
1351
1379
  // attachments — otherwise preserve the original data so the model still
1352
1380
  // sees the files field (e.g. IDs/paths from dynamic app actions).
1353
1381
  if (attachments.length > 0) {
1354
- const { files: _files, ...rest } = data;
1382
+ const { files: _files, ...rest } = mergedData;
1355
1383
  actionDataForText = Object.keys(rest).length > 0 ? rest : undefined;
1356
1384
  }
1357
1385
  }
@@ -1414,23 +1442,26 @@ export async function handleSurfaceAction(
1414
1442
  attributes: { source: "surface_action", surfaceId, actionId },
1415
1443
  });
1416
1444
 
1417
- const result = ctx.enqueueMessage(
1445
+ const result = ctx.enqueueMessage({
1418
1446
  content,
1419
1447
  attachments,
1420
1448
  onEvent,
1421
1449
  requestId,
1422
- surfaceId,
1423
- undefined,
1424
- undefined,
1425
- undefined,
1450
+ activeSurfaceId: surfaceId,
1426
1451
  displayContent,
1427
- );
1452
+ });
1428
1453
 
1429
1454
  if (result.rejected) {
1430
1455
  ctx.surfaceActionRequestIds.delete(requestId);
1431
1456
  return;
1432
1457
  }
1433
1458
 
1459
+ const requestedCompletionSummary =
1460
+ getRequestedSurfaceCompletionSummary(mergedData);
1461
+ if (requestedCompletionSummary) {
1462
+ completeSurfaceFromAction(ctx, surfaceId, requestedCompletionSummary);
1463
+ }
1464
+
1434
1465
  // One-shot: clear accumulated state now that the message has been accepted.
1435
1466
  // Deferred until after rejection check so state is preserved for retry on rejection.
1436
1467
  if (hasAccState) {
@@ -1653,22 +1684,22 @@ export async function handleSurfaceAction(
1653
1684
  "Surface action follow-up: preparing to send message to model",
1654
1685
  );
1655
1686
 
1656
- const result = ctx.enqueueMessage(
1687
+ const result = ctx.enqueueMessage({
1657
1688
  content,
1658
- pendingAttachments,
1689
+ attachments: pendingAttachments,
1659
1690
  onEvent,
1660
1691
  requestId,
1661
- surfaceId,
1662
- undefined,
1663
- undefined,
1664
- undefined,
1692
+ activeSurfaceId: surfaceId,
1665
1693
  displayContent,
1666
- );
1694
+ });
1667
1695
  if (result.rejected) {
1668
1696
  ctx.surfaceActionRequestIds.delete(requestId);
1669
1697
  return;
1670
1698
  }
1671
1699
 
1700
+ const requestedCompletionSummary =
1701
+ getRequestedSurfaceCompletionSummary(mergedData);
1702
+
1672
1703
  // One-shot interactive surfaces — auto-complete now that the message has
1673
1704
  // been accepted. Deferred until after rejection check so the surface stays
1674
1705
  // active and retryable if the queue was full.
@@ -1678,15 +1709,19 @@ export async function handleSurfaceAction(
1678
1709
  "file_upload",
1679
1710
  "task_preferences",
1680
1711
  ];
1681
- if (ONE_SHOT_SURFACE_TYPES.includes(pending.surfaceType)) {
1712
+ if (
1713
+ requestedCompletionSummary ||
1714
+ ONE_SHOT_SURFACE_TYPES.includes(pending.surfaceType)
1715
+ ) {
1716
+ const completionSummary = requestedCompletionSummary ?? summary;
1682
1717
  broadcastMessage({
1683
1718
  type: "ui_surface_complete",
1684
1719
  conversationId: ctx.conversationId,
1685
1720
  surfaceId,
1686
- summary,
1721
+ summary: completionSummary,
1687
1722
  submittedData: mergedDataForText,
1688
1723
  });
1689
- markSurfaceCompleted(ctx, surfaceId, summary);
1724
+ markSurfaceCompleted(ctx, surfaceId, completionSummary);
1690
1725
  }
1691
1726
 
1692
1727
  // One-shot: clear accumulated state now that the message has been accepted.
@@ -20,18 +20,14 @@ import type { SecretPrompter } from "../permissions/secret-prompter.js";
20
20
  import type { Message, ToolDefinition } from "../providers/types.js";
21
21
  import type { TrustClass } from "../runtime/actor-trust-resolver.js";
22
22
  import { assistantEventHub } from "../runtime/assistant-event-hub.js";
23
- import { coreAppProxyTools } from "../tools/apps/definitions.js";
24
23
  import { registerConversationSender } from "../tools/browser/browser-screencast.js";
25
24
  import type { ToolExecutor } from "../tools/executor.js";
26
- import {
27
- getAllToolDefinitions,
28
- getMcpToolDefinitions,
29
- } from "../tools/registry.js";
25
+ import { getMcpToolDefinitions } from "../tools/registry.js";
30
26
  import {
31
27
  ACTIVITY_SKIP_SET,
32
28
  injectActivityField,
33
29
  } from "../tools/schema-transforms.js";
34
- import { resolveToolNameAlias } from "../tools/tool-name-aliases.js";
30
+ import { resolveToolInvocationAlias } from "../tools/tool-name-aliases.js";
35
31
  import {
36
32
  isDiskPressureCleanupToolName,
37
33
  type ProxyApprovalCallback,
@@ -40,7 +36,6 @@ import {
40
36
  type ToolExecutionResult,
41
37
  type ToolLifecycleEventHandler,
42
38
  } from "../tools/types.js";
43
- import { allUiSurfaceTools } from "../tools/ui-surface/definitions.js";
44
39
  import { getLogger } from "../util/logger.js";
45
40
  import {
46
41
  projectSkillTools,
@@ -74,23 +69,15 @@ export function resolveTrustClass(
74
69
  return trustContext?.trustClass ?? "unknown";
75
70
  }
76
71
 
72
+ import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
73
+ import { AUTO_PROFILE_KEY } from "../config/seed-inference-profiles.js";
74
+ import {
75
+ buildSwitchInferenceProfileToolDef,
76
+ SWITCH_INFERENCE_PROFILE_TOOL_NAME,
77
+ } from "./switch-inference-profile-tool.js";
77
78
  import type { ToolSetupContext } from "./tool-setup-types.js";
78
79
  export type { ToolSetupContext } from "./tool-setup-types.js";
79
80
 
80
- // ── buildToolDefinitions ─────────────────────────────────────────────
81
-
82
- /**
83
- * Collect all tool definitions for the agent loop: built-in tools,
84
- * UI surface proxy tools, and app proxy tools.
85
- */
86
- export function buildToolDefinitions(): ToolDefinition[] {
87
- return [
88
- ...getAllToolDefinitions(),
89
- ...allUiSurfaceTools.map((t) => t.getDefinition()),
90
- ...coreAppProxyTools.map((t) => t.getDefinition()),
91
- ];
92
- }
93
-
94
81
  // ── createToolExecutor ───────────────────────────────────────────────
95
82
 
96
83
  /**
@@ -124,10 +111,11 @@ export function createToolExecutor(
124
111
  toolUseId?: string,
125
112
  turnContext?: import("../plugins/types.js").TurnContext,
126
113
  ) => {
127
- const executionName = resolveToolNameAlias(name, ctx.allowedToolNames);
114
+ const { name: executionName, input: executionInput } =
115
+ resolveToolInvocationAlias(name, input, ctx.allowedToolNames);
128
116
 
129
- if (isDoordashCommand(executionName, input)) {
130
- markDoordashStepInProgress(ctx, input);
117
+ if (isDoordashCommand(executionName, executionInput)) {
118
+ markDoordashStepInProgress(ctx, executionInput);
131
119
  }
132
120
 
133
121
  // Build the context object shared by both the skill_execute interception
@@ -209,20 +197,54 @@ export function createToolExecutor(
209
197
  },
210
198
  };
211
199
 
200
+ // Intercept switch_inference_profile: daemon-internal tool that lets the
201
+ // model self-select a different inference profile mid-turn. No permission
202
+ // checks — this is a control-flow signal, not a user-visible tool.
203
+ if (executionName === SWITCH_INFERENCE_PROFILE_TOOL_NAME) {
204
+ const profile =
205
+ typeof executionInput.profile === "string"
206
+ ? executionInput.profile
207
+ : "";
208
+ const config = getConfig();
209
+ const profileEntry = config.llm.profiles?.[profile];
210
+ if (!profileEntry) {
211
+ return {
212
+ content: `Profile "${profile}" not found. Available profiles: ${Object.keys(config.llm.profiles ?? {}).join(", ")}`,
213
+ isError: true,
214
+ };
215
+ }
216
+ if (profileEntry.status === "disabled") {
217
+ return {
218
+ content: `Profile "${profile}" is disabled.`,
219
+ isError: true,
220
+ };
221
+ }
222
+ ctx.toolRoutedProfile = profile;
223
+ const label = profileEntry.label ?? profile;
224
+ return {
225
+ content: `Switched to ${label} profile. Continue with your response.`,
226
+ isError: false,
227
+ };
228
+ }
229
+
212
230
  // Intercept skill_execute: extract the real tool name and input, then
213
231
  // route through the full executor pipeline so the underlying tool's
214
232
  // risk level, permission checks, hooks, and lifecycle events all fire
215
233
  // with the real tool name.
216
234
  if (executionName === "skill_execute") {
217
- const rawToolName = typeof input.tool === "string" ? input.tool : "";
218
- const toolName = resolveToolNameAlias(rawToolName, ctx.allowedToolNames);
235
+ const rawToolName =
236
+ typeof executionInput.tool === "string" ? executionInput.tool : "";
219
237
  const rawToolInput =
220
- input.input != null && typeof input.input === "object"
221
- ? (input.input as Record<string, unknown>)
238
+ executionInput.input != null && typeof executionInput.input === "object"
239
+ ? (executionInput.input as Record<string, unknown>)
222
240
  : {};
223
241
 
224
242
  // Clone to avoid mutating shared input objects
225
- const toolInput = { ...rawToolInput };
243
+ const { name: toolName, input: toolInput } = resolveToolInvocationAlias(
244
+ rawToolName,
245
+ { ...rawToolInput },
246
+ ctx.allowedToolNames,
247
+ );
226
248
 
227
249
  if (!toolName) {
228
250
  return {
@@ -249,7 +271,7 @@ export function createToolExecutor(
249
271
 
250
272
  const result = await executor.execute(
251
273
  executionName,
252
- input,
274
+ executionInput,
253
275
  toolContext,
254
276
  turnContext,
255
277
  );
@@ -257,7 +279,7 @@ export function createToolExecutor(
257
279
  ctx.approvedViaPromptThisTurn = true;
258
280
  }
259
281
 
260
- runPostExecutionSideEffects(executionName, input, result, { ctx });
282
+ runPostExecutionSideEffects(executionName, executionInput, result, { ctx });
261
283
 
262
284
  return result;
263
285
  };
@@ -326,6 +348,8 @@ export interface SkillProjectionContext {
326
348
  * host tools into the LLM tool definitions.
327
349
  */
328
350
  readonly transportInterface?: InterfaceId;
351
+ /** Per-turn override profile, read by the switch_inference_profile tool injection. */
352
+ currentTurnOverrideProfile?: string;
329
353
  }
330
354
 
331
355
  // ── Conditional tool sets ────────────────────────────────────────────
@@ -613,6 +637,27 @@ export function createResolveToolsCallback(
613
637
  }
614
638
 
615
639
  ctx.allowedToolNames = turnAllowed;
616
- return injectActivityField(allBaseDefs, ACTIVITY_SKIP_SET);
640
+ const baseDefs = injectActivityField(allBaseDefs, ACTIVITY_SKIP_SET);
641
+
642
+ const config = getConfig();
643
+ if (
644
+ isAssistantFeatureFlagEnabled("query-complexity-routing", config) &&
645
+ config.llm
646
+ ) {
647
+ const effectiveProfile =
648
+ ctx.currentTurnOverrideProfile ?? config.llm.activeProfile;
649
+ if (effectiveProfile === AUTO_PROFILE_KEY) {
650
+ const toolDef = buildSwitchInferenceProfileToolDef(
651
+ config.llm.profiles ?? {},
652
+ effectiveProfile,
653
+ );
654
+ if (toolDef) {
655
+ turnAllowed.add(SWITCH_INFERENCE_PROFILE_TOOL_NAME);
656
+ return [...baseDefs, toolDef];
657
+ }
658
+ }
659
+ }
660
+
661
+ return baseDefs;
617
662
  };
618
663
  }
@@ -3,6 +3,7 @@ import { updateConversationUsage } from "../memory/conversation-crud.js";
3
3
  import { recordUsageEvent } from "../memory/llm-usage-store.js";
4
4
  import type { UsageActor } from "../usage/actors.js";
5
5
  import { resolveUsageAttribution } from "../usage/attribution.js";
6
+ import { extractRawUsage } from "../usage/pricing.js";
6
7
  import type {
7
8
  AnthropicCacheCreationTokenDetails,
8
9
  PricingResult,
@@ -235,6 +236,7 @@ export function recordUsage(
235
236
  outputTokens,
236
237
  cacheCreationInputTokens: normalizedCacheCreationInputTokens,
237
238
  cacheReadInputTokens: normalizedCacheReadInputTokens,
239
+ rawUsage: extractRawUsage(rawResponse),
238
240
  conversationId: ctx.conversationId,
239
241
  runId: null,
240
242
  requestId,
@@ -53,14 +53,13 @@ import {
53
53
  getConversation,
54
54
  getConversationOriginChannel,
55
55
  getConversationOverrideProfileFromRow,
56
- setConversationCleanedAt,
56
+ setConversationHistoryStrippedAt,
57
57
  } from "../memory/conversation-crud.js";
58
58
  import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
59
59
  import { shouldExposePersonalMemory } from "../memory/v2/static-context.js";
60
60
  import { PermissionPrompter } from "../permissions/prompter.js";
61
61
  import { SecretPrompter } from "../permissions/secret-prompter.js";
62
62
  import type { UserDecision } from "../permissions/types.js";
63
- import { resolvePersonaContext } from "../prompts/persona-resolver.js";
64
63
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
65
64
  import type { Message } from "../providers/types.js";
66
65
  import type { Provider } from "../providers/types.js";
@@ -69,6 +68,7 @@ import { broadcastMessage } from "../runtime/assistant-event-hub.js";
69
68
  import type { AuthContext } from "../runtime/auth/types.js";
70
69
  import type { InteractiveUiResult } from "../runtime/interactive-ui.js";
71
70
  import { ToolExecutor } from "../tools/executor.js";
71
+ import { getAllToolDefinitions } from "../tools/registry.js";
72
72
  import type { ToolLifecycleEvent } from "../tools/types.js";
73
73
  import type { OnboardingContext } from "../types/onboarding-context.js";
74
74
  import type { AbortReason } from "../util/abort-reasons.js";
@@ -86,7 +86,11 @@ import {
86
86
  disposeConversation,
87
87
  loadFromDb as loadFromDbImpl,
88
88
  } from "./conversation-lifecycle.js";
89
- import type { RedirectToSecurePromptOptions } from "./conversation-messaging.js";
89
+ import type {
90
+ EnqueueMessageOptions,
91
+ PersistMessageOptions,
92
+ RedirectToSecurePromptOptions,
93
+ } from "./conversation-messaging.js";
90
94
  import {
91
95
  enqueueMessage as enqueueMessageImpl,
92
96
  persistUserMessage as persistUserMessageImpl,
@@ -117,7 +121,6 @@ import {
117
121
  } from "./conversation-surfaces.js";
118
122
  import type { ToolSetupContext } from "./conversation-tool-setup.js";
119
123
  import {
120
- buildToolDefinitions,
121
124
  createResolveToolsCallback,
122
125
  createToolExecutor,
123
126
  resolveTrustClass,
@@ -327,7 +330,12 @@ export class Conversation {
327
330
  surfaceType: SurfaceType;
328
331
  title?: string;
329
332
  data: SurfaceData;
330
- actions?: Array<{ id: string; label: string; style?: string }>;
333
+ actions?: Array<{
334
+ id: string;
335
+ label: string;
336
+ style?: string;
337
+ data?: Record<string, unknown>;
338
+ }>;
331
339
  display?: string;
332
340
  persistent?: boolean;
333
341
  }> = [];
@@ -452,7 +460,7 @@ export class Conversation {
452
460
  return publishToolDomainEvent(event);
453
461
  };
454
462
 
455
- const toolDefs = buildToolDefinitions();
463
+ const toolDefs = getAllToolDefinitions();
456
464
  this.coreToolNames = new Set(toolDefs.map((d) => d.name));
457
465
  const toolExecutor = createToolExecutor(
458
466
  this.executor,
@@ -492,19 +500,12 @@ export class Conversation {
492
500
  const resolved: ResolvedSystemPrompt = {
493
501
  systemPrompt: this.hasSystemPromptOverride
494
502
  ? systemPrompt
495
- : (() => {
496
- const persona = resolvePersonaContext(
497
- this.currentTurnTrustContext,
498
- this.currentTurnChannelCapabilities,
499
- );
500
- return buildSystemPrompt({
501
- hasNoClient: this.hasNoClient,
502
- userPersona: persona.userPersona,
503
- channelPersona: persona.channelPersona,
504
- userSlug: persona.userSlug,
505
- onboardingContext: this.getOnboardingContext(),
506
- });
507
- })(),
503
+ : buildSystemPrompt({
504
+ hasNoClient: this.hasNoClient,
505
+ trustContext: this.currentTurnTrustContext,
506
+ channelCapabilities: this.currentTurnChannelCapabilities,
507
+ onboardingContext: this.getOnboardingContext(),
508
+ }),
508
509
  };
509
510
  if (configuredMaxTokens !== undefined) {
510
511
  resolved.maxTokens = configuredMaxTokens;
@@ -583,20 +584,13 @@ export class Conversation {
583
584
 
584
585
  const systemPrompt = this.hasSystemPromptOverride
585
586
  ? this.systemPrompt
586
- : (() => {
587
- const persona = resolvePersonaContext(
588
- this.currentTurnTrustContext,
589
- this.currentTurnChannelCapabilities,
590
- );
591
- return buildSystemPrompt({
592
- hasNoClient: this.hasNoClient,
593
- userPersona: persona.userPersona,
594
- channelPersona: persona.channelPersona,
595
- userSlug: persona.userSlug,
596
- onboardingContext: this.getOnboardingContext(),
597
- });
598
- })();
599
- const tools = buildToolDefinitions();
587
+ : buildSystemPrompt({
588
+ hasNoClient: this.hasNoClient,
589
+ trustContext: this.currentTurnTrustContext,
590
+ channelCapabilities: this.currentTurnChannelCapabilities,
591
+ onboardingContext: this.getOnboardingContext(),
592
+ });
593
+ const tools = getAllToolDefinitions();
600
594
  const provider = this.provider;
601
595
 
602
596
  const warmMessage: Message = {
@@ -838,33 +832,15 @@ export class Conversation {
838
832
  );
839
833
  }
840
834
 
841
- enqueueMessage(
842
- content: string,
843
- attachments: UserMessageAttachment[],
844
- onEvent?: (msg: ServerMessage) => void,
845
- requestId?: string,
846
- activeSurfaceId?: string,
847
- currentPage?: string,
848
- metadata?: Record<string, unknown>,
849
- options?: { isInteractive?: boolean },
850
- displayContent?: string,
851
- transport?: ConversationTransportMetadata,
852
- clientMessageId?: string,
853
- ): { queued: boolean; requestId: string; rejected?: boolean } {
854
- return enqueueMessageImpl(
855
- this,
856
- content,
857
- attachments,
858
- onEvent ?? this.sendToClient,
859
- requestId ?? crypto.randomUUID(),
860
- activeSurfaceId,
861
- currentPage,
862
- metadata,
863
- options,
864
- displayContent,
865
- transport,
866
- clientMessageId,
867
- );
835
+ enqueueMessage(options: EnqueueMessageOptions): {
836
+ queued: boolean;
837
+ requestId: string;
838
+ rejected?: boolean;
839
+ } {
840
+ return enqueueMessageImpl(this, {
841
+ ...options,
842
+ onEvent: options.onEvent ?? this.sendToClient,
843
+ });
868
844
  }
869
845
 
870
846
  getQueueDepth(): number {
@@ -1155,7 +1131,7 @@ export class Conversation {
1155
1131
  this.messages = stripped;
1156
1132
  await this.graphMemory.onCompacted(0);
1157
1133
  this.pendingPostCompactReinject = true;
1158
- setConversationCleanedAt(this.conversationId, Date.now());
1134
+ setConversationHistoryStrippedAt(this.conversationId, Date.now());
1159
1135
  const estimatedInputTokens = this.contextWindowManager.estimateInputTokens(
1160
1136
  this.messages,
1161
1137
  );
@@ -1293,23 +1269,12 @@ export class Conversation {
1293
1269
  }
1294
1270
 
1295
1271
  async persistUserMessage(
1296
- content: string,
1297
- attachments: UserMessageAttachment[],
1298
- requestId?: string,
1299
- metadata?: Record<string, unknown>,
1300
- displayContent?: string,
1301
- ): Promise<string> {
1272
+ options: PersistMessageOptions,
1273
+ ): Promise<{ id: string; deduplicated: boolean }> {
1302
1274
  if (!this.processing) {
1303
1275
  await this.ensureActorScopedHistory();
1304
1276
  }
1305
- return persistUserMessageImpl(
1306
- this,
1307
- content,
1308
- attachments,
1309
- requestId,
1310
- metadata,
1311
- displayContent,
1312
- );
1277
+ return persistUserMessageImpl(this, options);
1313
1278
  }
1314
1279
 
1315
1280
  // ── Agent Loop ───────────────────────────────────────────────────