@vellumai/assistant 0.7.0 → 0.7.1

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 (666) hide show
  1. package/ARCHITECTURE.md +6 -7
  2. package/Dockerfile +1 -0
  3. package/README.md +2 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
  5. package/bun.lock +3 -0
  6. package/docs/architecture/security.md +18 -16
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
  9. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
  10. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
  11. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
  12. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
  13. package/node_modules/@vellumai/slack-text/bun.lock +24 -0
  14. package/node_modules/@vellumai/slack-text/package.json +18 -0
  15. package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
  16. package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
  17. package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
  18. package/openapi.yaml +294 -107
  19. package/package.json +4 -2
  20. package/scripts/generate-openapi.ts +16 -111
  21. package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
  22. package/src/__tests__/anthropic-provider.test.ts +56 -13
  23. package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
  24. package/src/__tests__/app-conversation-ids.test.ts +151 -0
  25. package/src/__tests__/approval-cascade.test.ts +0 -15
  26. package/src/__tests__/approval-routes-http.test.ts +6 -17
  27. package/src/__tests__/assistant-event-hub.test.ts +126 -77
  28. package/src/__tests__/assistant-event.test.ts +0 -5
  29. package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
  31. package/src/__tests__/background-shell-host-bash.test.ts +34 -43
  32. package/src/__tests__/call-controller.test.ts +1 -1
  33. package/src/__tests__/call-site-routing-provider.test.ts +193 -0
  34. package/src/__tests__/channel-approval-routes.test.ts +10 -296
  35. package/src/__tests__/channel-approvals.test.ts +25 -17
  36. package/src/__tests__/channel-guardian.test.ts +100 -146
  37. package/src/__tests__/checker.test.ts +20 -34
  38. package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/config-schema.test.ts +6 -48
  41. package/src/__tests__/config-watcher.test.ts +12 -0
  42. package/src/__tests__/connection-policy.test.ts +1 -52
  43. package/src/__tests__/contacts-write.test.ts +2 -64
  44. package/src/__tests__/context-image-dimensions.test.ts +1 -1
  45. package/src/__tests__/context-search-memory-source.test.ts +120 -1
  46. package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
  47. package/src/__tests__/context-search-pkb-source.test.ts +49 -0
  48. package/src/__tests__/context-search-workspace-source.test.ts +9 -22
  49. package/src/__tests__/context-window-manager.test.ts +46 -0
  50. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  51. package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
  52. package/src/__tests__/conversation-agent-loop.test.ts +980 -13
  53. package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
  54. package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
  55. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
  56. package/src/__tests__/conversation-history-web-search.test.ts +4 -3
  57. package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
  58. package/src/__tests__/conversation-lifecycle.test.ts +4 -4
  59. package/src/__tests__/conversation-process-callsite.test.ts +79 -2
  60. package/src/__tests__/conversation-queue.test.ts +3 -8
  61. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
  62. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
  63. package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
  64. package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
  65. package/src/__tests__/conversation-slash-commands.test.ts +24 -4
  66. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  68. package/src/__tests__/conversation-starter-routes.test.ts +79 -2
  69. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
  70. package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
  71. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
  72. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
  73. package/src/__tests__/conversation-usage.test.ts +253 -3
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
  75. package/src/__tests__/credential-health-service.test.ts +68 -0
  76. package/src/__tests__/credential-security-e2e.test.ts +4 -3
  77. package/src/__tests__/credential-security-invariants.test.ts +1 -5
  78. package/src/__tests__/credential-token-resolver.test.ts +180 -0
  79. package/src/__tests__/cu-unified-flow.test.ts +33 -16
  80. package/src/__tests__/daemon-assistant-events.test.ts +34 -21
  81. package/src/__tests__/daemon-credential-client.test.ts +4 -1
  82. package/src/__tests__/db-connection-isolation.test.ts +125 -0
  83. package/src/__tests__/db-migration-rollback.test.ts +101 -0
  84. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
  85. package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
  86. package/src/__tests__/document-conversations.test.ts +332 -0
  87. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  88. package/src/__tests__/emit-event-signal.test.ts +4 -6
  89. package/src/__tests__/events-client-registration.test.ts +193 -49
  90. package/src/__tests__/filing-service.test.ts +58 -7
  91. package/src/__tests__/first-greeting.test.ts +156 -150
  92. package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
  93. package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
  94. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  95. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  96. package/src/__tests__/guardian-grant-minting.test.ts +7 -2
  97. package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
  98. package/src/__tests__/guardian-routing-state.test.ts +1 -1
  99. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
  100. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
  101. package/src/__tests__/headless-browser-mode.test.ts +4 -9
  102. package/src/__tests__/headless-browser-navigate.test.ts +21 -20
  103. package/src/__tests__/heartbeat-service.test.ts +289 -7
  104. package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
  105. package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
  106. package/src/__tests__/host-bash-proxy.test.ts +46 -122
  107. package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
  108. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
  109. package/src/__tests__/host-browser-proxy.test.ts +111 -185
  110. package/src/__tests__/host-browser-routes.test.ts +45 -75
  111. package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
  112. package/src/__tests__/host-cu-proxy.test.ts +56 -111
  113. package/src/__tests__/host-file-proxy.test.ts +44 -98
  114. package/src/__tests__/host-file-read-tool.test.ts +42 -21
  115. package/src/__tests__/host-shell-tool.test.ts +33 -68
  116. package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
  117. package/src/__tests__/host-transfer-proxy.test.ts +43 -53
  118. package/src/__tests__/http-user-message-parity.test.ts +0 -6
  119. package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
  120. package/src/__tests__/injector-chain.test.ts +10 -5
  121. package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
  122. package/src/__tests__/inline-command-runner.test.ts +0 -66
  123. package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
  124. package/src/__tests__/install-skill-routing.test.ts +1 -13
  125. package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
  126. package/src/__tests__/llm-catalog-parity.test.ts +90 -0
  127. package/src/__tests__/llm-context-resolution.test.ts +180 -0
  128. package/src/__tests__/llm-resolver.test.ts +80 -12
  129. package/src/__tests__/llm-usage-store.test.ts +269 -4
  130. package/src/__tests__/log-export-routes.test.ts +89 -0
  131. package/src/__tests__/managed-profile-guard.test.ts +225 -0
  132. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
  133. package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
  134. package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
  136. package/src/__tests__/migration-export-http.test.ts +33 -26
  137. package/src/__tests__/migration-export-streaming.test.ts +18 -10
  138. package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
  139. package/src/__tests__/migration-import-commit-http.test.ts +66 -21
  140. package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
  141. package/src/__tests__/migration-import-from-url.test.ts +20 -6
  142. package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
  143. package/src/__tests__/migration-parity-persistence.test.ts +62 -25
  144. package/src/__tests__/migration-transport.test.ts +115 -23
  145. package/src/__tests__/migration-validate-http.test.ts +105 -80
  146. package/src/__tests__/migration-wizard.test.ts +133 -27
  147. package/src/__tests__/non-member-access-request.test.ts +1 -1
  148. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  149. package/src/__tests__/oauth-store.test.ts +19 -0
  150. package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
  151. package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
  152. package/src/__tests__/pricing.test.ts +68 -4
  153. package/src/__tests__/process-message-background-slack.test.ts +331 -0
  154. package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
  155. package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
  156. package/src/__tests__/provider-usage-tracking.test.ts +208 -0
  157. package/src/__tests__/reaction-persistence.test.ts +9 -6
  158. package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
  159. package/src/__tests__/recording-handler.test.ts +64 -81
  160. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
  161. package/src/__tests__/relay-server.test.ts +18 -13
  162. package/src/__tests__/require-fresh-approval.test.ts +13 -22
  163. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  164. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  165. package/src/__tests__/runtime-events-sse.test.ts +3 -12
  166. package/src/__tests__/search-skills-unified.test.ts +9 -15
  167. package/src/__tests__/secret-ingress-cli.test.ts +2 -5
  168. package/src/__tests__/secret-ingress-http.test.ts +0 -4
  169. package/src/__tests__/secret-onetime-send.test.ts +4 -2
  170. package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
  171. package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
  172. package/src/__tests__/secret-response-routing.test.ts +29 -15
  173. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
  174. package/src/__tests__/secret-scanner.test.ts +2 -545
  175. package/src/__tests__/send-endpoint-busy.test.ts +9 -24
  176. package/src/__tests__/settings-routes.test.ts +1 -1
  177. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  178. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
  179. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
  180. package/src/__tests__/skill-tool-factory.test.ts +97 -0
  181. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
  182. package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
  183. package/src/__tests__/slack-inbound-verification.test.ts +1 -62
  184. package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
  185. package/src/__tests__/subagent-manager-notify.test.ts +70 -70
  186. package/src/__tests__/subagent-notify-parent.test.ts +80 -83
  187. package/src/__tests__/system-prompt.test.ts +115 -13
  188. package/src/__tests__/terminal-tools.test.ts +0 -89
  189. package/src/__tests__/thread-backfill.test.ts +945 -31
  190. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
  191. package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
  192. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
  193. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
  194. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
  195. package/src/__tests__/tool-executor.test.ts +12 -19
  196. package/src/__tests__/tool-metrics-listener.test.ts +0 -35
  197. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  198. package/src/__tests__/tool-trace-listener.test.ts +0 -17
  199. package/src/__tests__/transfer-progress-screen.test.ts +63 -26
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
  202. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  203. package/src/__tests__/tts-catalog-parity.test.ts +16 -5
  204. package/src/__tests__/usage-attribution.test.ts +247 -0
  205. package/src/__tests__/usage-cli.test.ts +143 -0
  206. package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
  207. package/src/__tests__/usage-routes.test.ts +150 -0
  208. package/src/__tests__/validation-results-screen.test.ts +39 -16
  209. package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
  210. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
  211. package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
  212. package/src/__tests__/voice-session-bridge.test.ts +5 -5
  213. package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
  214. package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
  215. package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
  216. package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
  217. package/src/acp/index.ts +0 -15
  218. package/src/acp/session-manager.ts +37 -34
  219. package/src/agent/loop.ts +16 -1
  220. package/src/approvals/AGENTS.md +4 -0
  221. package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
  222. package/src/approvals/guardian-request-resolvers.ts +10 -2
  223. package/src/backup/__tests__/backup-worker.test.ts +36 -8
  224. package/src/backup/__tests__/paths.test.ts +2 -2
  225. package/src/backup/__tests__/restore.test.ts +45 -28
  226. package/src/backup/backup-worker.ts +36 -2
  227. package/src/backup/paths.ts +9 -6
  228. package/src/browser-session/events.ts +0 -9
  229. package/src/calls/call-store.ts +1 -34
  230. package/src/calls/guardian-question-copy.ts +0 -108
  231. package/src/calls/relay-server.ts +0 -24
  232. package/src/calls/twilio-rest.ts +0 -38
  233. package/src/calls/twilio-routes.ts +1 -1
  234. package/src/calls/voice-session-bridge.ts +7 -38
  235. package/src/channels/types.ts +1 -36
  236. package/src/cli/commands/__tests__/cache.test.ts +152 -5
  237. package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
  238. package/src/cli/commands/__tests__/trust.test.ts +21 -387
  239. package/src/cli/commands/backup.ts +4 -4
  240. package/src/cli/commands/cache-fs.ts +8 -0
  241. package/src/cli/commands/cache.ts +153 -82
  242. package/src/cli/commands/clients.ts +63 -5
  243. package/src/cli/commands/completions.ts +3 -3
  244. package/src/cli/commands/contacts.ts +231 -76
  245. package/src/cli/commands/keys.ts +4 -1
  246. package/src/cli/commands/memory-v2.ts +24 -52
  247. package/src/cli/commands/oauth/shared.ts +2 -29
  248. package/src/cli/commands/pending.ts +102 -0
  249. package/src/cli/commands/skills.ts +77 -35
  250. package/src/cli/commands/trust.ts +70 -430
  251. package/src/cli/commands/usage.ts +25 -16
  252. package/src/cli/lib/daemon-credential-client.ts +14 -0
  253. package/src/cli/program.ts +2 -0
  254. package/src/cli.ts +0 -21
  255. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  256. package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
  257. package/src/config/env-registry.ts +12 -2
  258. package/src/config/env.ts +3 -14
  259. package/src/config/feature-flag-registry.json +30 -30
  260. package/src/config/llm-callsite-catalog.ts +12 -0
  261. package/src/config/llm-context-resolution.ts +80 -0
  262. package/src/config/llm-resolver.ts +58 -22
  263. package/src/config/loader.ts +3 -3
  264. package/src/config/schema.ts +2 -158
  265. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  266. package/src/config/schemas/call-site-catalog.ts +271 -0
  267. package/src/config/schemas/calls.ts +5 -5
  268. package/src/config/schemas/inference.ts +1 -1
  269. package/src/config/schemas/ingress.ts +1 -1
  270. package/src/config/schemas/llm.ts +31 -3
  271. package/src/config/schemas/memory-retrieval.ts +2 -2
  272. package/src/config/schemas/memory-v2.ts +9 -0
  273. package/src/config/schemas/security.ts +1 -42
  274. package/src/config/schemas/services.ts +6 -6
  275. package/src/config/schemas/skills.ts +5 -5
  276. package/src/config/schemas/tts.ts +1 -1
  277. package/src/config/seed-inference-profiles.ts +117 -0
  278. package/src/config/skills.ts +0 -90
  279. package/src/config/types.ts +3 -6
  280. package/src/contacts/contact-store.ts +0 -17
  281. package/src/contacts/contacts-write.ts +1 -105
  282. package/src/context/window-manager.ts +44 -5
  283. package/src/credential-execution/process-manager.ts +34 -10
  284. package/src/credential-health/credential-health-service.ts +21 -16
  285. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
  286. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
  287. package/src/daemon/connection-policy.ts +1 -26
  288. package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
  289. package/src/daemon/conversation-agent-loop.ts +277 -36
  290. package/src/daemon/conversation-history.ts +8 -8
  291. package/src/daemon/conversation-launch.ts +20 -135
  292. package/src/daemon/conversation-lifecycle.ts +1 -1
  293. package/src/daemon/conversation-messaging.ts +1 -0
  294. package/src/daemon/conversation-process.ts +83 -163
  295. package/src/daemon/conversation-runtime-assembly.ts +219 -76
  296. package/src/daemon/conversation-slash.ts +47 -5
  297. package/src/daemon/conversation-store.ts +7 -31
  298. package/src/daemon/conversation-surfaces.ts +22 -28
  299. package/src/daemon/conversation-tool-setup.ts +3 -33
  300. package/src/daemon/conversation-usage.ts +36 -0
  301. package/src/daemon/conversation.ts +117 -233
  302. package/src/daemon/daemon-control.ts +3 -71
  303. package/src/daemon/daemon-skill-host.ts +8 -11
  304. package/src/daemon/dictation-profile-store.ts +2 -26
  305. package/src/daemon/first-greeting.ts +44 -156
  306. package/src/daemon/handlers/config-channels.ts +12 -12
  307. package/src/daemon/handlers/config-ingress.ts +4 -165
  308. package/src/daemon/handlers/config-model.ts +1 -1
  309. package/src/daemon/handlers/config-voice.ts +0 -42
  310. package/src/daemon/handlers/conversations.ts +11 -190
  311. package/src/daemon/handlers/recording.ts +26 -158
  312. package/src/daemon/handlers/shared.ts +23 -71
  313. package/src/daemon/handlers/skills.ts +42 -93
  314. package/src/daemon/host-bash-proxy.ts +67 -45
  315. package/src/daemon/host-browser-proxy.ts +65 -27
  316. package/src/daemon/host-cu-proxy.ts +40 -39
  317. package/src/daemon/host-file-proxy.ts +58 -37
  318. package/src/daemon/host-transfer-proxy.ts +84 -46
  319. package/src/daemon/lifecycle.ts +49 -15
  320. package/src/daemon/message-types/conversations.ts +7 -0
  321. package/src/daemon/message-types/host-bash.ts +1 -0
  322. package/src/daemon/message-types/host-cu.ts +1 -0
  323. package/src/daemon/message-types/host-file.ts +1 -0
  324. package/src/daemon/message-types/host-transfer.ts +1 -0
  325. package/src/daemon/message-types/messages.ts +10 -9
  326. package/src/daemon/message-types/workspace.ts +1 -1
  327. package/src/daemon/process-message.ts +102 -239
  328. package/src/daemon/server.ts +13 -462
  329. package/src/daemon/shutdown-handlers.ts +2 -2
  330. package/src/daemon/tool-side-effects.ts +125 -107
  331. package/src/daemon/trust-context.ts +13 -0
  332. package/src/daemon/wake-target-adapter.ts +4 -9
  333. package/src/events/domain-events.ts +0 -8
  334. package/src/events/tool-audit-listener.ts +3 -1
  335. package/src/events/tool-domain-event-publisher.ts +0 -10
  336. package/src/events/tool-metrics-listener.ts +0 -17
  337. package/src/events/tool-trace-listener.ts +0 -14
  338. package/src/filing/filing-service.ts +13 -1
  339. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
  340. package/src/heartbeat/heartbeat-service.ts +23 -5
  341. package/src/home/__tests__/feed-writer.test.ts +0 -4
  342. package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
  343. package/src/home/feed-writer.ts +1 -2
  344. package/src/home/relationship-state-writer.ts +16 -3
  345. package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
  346. package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
  347. package/src/ipc/assistant-server.ts +3 -10
  348. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
  349. package/src/ipc/routes/route-adapter.ts +1 -1
  350. package/src/ipc/routes/trust-rules.test.ts +0 -95
  351. package/src/ipc/skill-ipc-types.ts +41 -0
  352. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
  353. package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
  354. package/src/ipc/skill-routes/events.ts +12 -23
  355. package/src/ipc/skill-routes/identity.ts +4 -17
  356. package/src/ipc/skill-routes/index.ts +1 -1
  357. package/src/ipc/skill-server.ts +6 -39
  358. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
  359. package/src/live-voice/protocol.ts +4 -13
  360. package/src/mcp/manager.ts +0 -5
  361. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
  362. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
  363. package/src/memory/app-git-service.ts +0 -32
  364. package/src/memory/app-store.ts +154 -0
  365. package/src/memory/attachments-store.ts +6 -0
  366. package/src/memory/context-search/sources/memory-v2.ts +578 -0
  367. package/src/memory/context-search/sources/memory.ts +5 -0
  368. package/src/memory/context-search/sources/pkb.ts +10 -1
  369. package/src/memory/context-search/sources/workspace.ts +3 -2
  370. package/src/memory/conversation-crud.ts +29 -4
  371. package/src/memory/conversation-disk-view.ts +1 -5
  372. package/src/memory/conversation-starter-checkpoints.ts +63 -0
  373. package/src/memory/db-connection.ts +62 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +3 -21
  376. package/src/memory/embedding-gemini.ts +0 -2
  377. package/src/memory/embedding-local.ts +6 -6
  378. package/src/memory/embedding-ollama.ts +6 -6
  379. package/src/memory/embedding-openai.ts +6 -6
  380. package/src/memory/embedding-types.ts +21 -0
  381. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
  382. package/src/memory/graph/conversation-graph-memory.ts +35 -13
  383. package/src/memory/graph/injection.test.ts +2 -2
  384. package/src/memory/graph/injection.ts +1 -1
  385. package/src/memory/guardian-action-store.ts +0 -83
  386. package/src/memory/guardian-approvals.ts +0 -48
  387. package/src/memory/indexer.ts +1 -15
  388. package/src/memory/job-handlers/conversation-starters.ts +36 -53
  389. package/src/memory/job-utils.ts +0 -6
  390. package/src/memory/jobs-store.ts +0 -1
  391. package/src/memory/jobs-worker.ts +2 -16
  392. package/src/memory/llm-request-log-store.ts +0 -41
  393. package/src/memory/llm-usage-store.ts +129 -43
  394. package/src/memory/memory-v2-activation-log-store.ts +115 -0
  395. package/src/memory/migrations/233-document-conversations.ts +54 -0
  396. package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
  397. package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
  398. package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
  399. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
  400. package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
  401. package/src/memory/migrations/index.ts +14 -0
  402. package/src/memory/migrations/registry.ts +24 -0
  403. package/src/memory/raw-query.ts +2 -68
  404. package/src/memory/schema/conversations.ts +7 -0
  405. package/src/memory/schema/infrastructure.ts +25 -0
  406. package/src/memory/search/semantic.ts +5 -16
  407. package/src/memory/tool-usage-store.ts +2 -0
  408. package/src/memory/usage-buckets.ts +40 -1
  409. package/src/memory/usage-grouped-buckets.ts +127 -0
  410. package/src/memory/v2/__tests__/activation.test.ts +289 -90
  411. package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
  412. package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
  413. package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
  414. package/src/memory/v2/__tests__/injection.test.ts +384 -15
  415. package/src/memory/v2/__tests__/migration.test.ts +64 -36
  416. package/src/memory/v2/__tests__/page-store.test.ts +191 -8
  417. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
  418. package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
  419. package/src/memory/v2/__tests__/static-context.test.ts +153 -0
  420. package/src/memory/v2/activation.ts +168 -97
  421. package/src/memory/v2/backfill-jobs.ts +15 -100
  422. package/src/memory/v2/consolidation-job.ts +14 -12
  423. package/src/memory/v2/edge-index.ts +191 -0
  424. package/src/memory/v2/injection.ts +182 -58
  425. package/src/memory/v2/migration.ts +57 -64
  426. package/src/memory/v2/now-text.ts +2 -3
  427. package/src/memory/v2/page-store.ts +168 -31
  428. package/src/memory/v2/prompts/consolidation.ts +118 -42
  429. package/src/memory/v2/prompts/sweep.ts +3 -3
  430. package/src/memory/v2/skill-store.ts +55 -7
  431. package/src/memory/v2/static-context.ts +62 -0
  432. package/src/memory/v2/types.ts +10 -20
  433. package/src/memory/validation.ts +0 -11
  434. package/src/messaging/draft-store.ts +0 -6
  435. package/src/messaging/provider-types.ts +8 -0
  436. package/src/messaging/provider.ts +7 -0
  437. package/src/messaging/providers/gmail/client.ts +1 -121
  438. package/src/messaging/providers/outlook/client.ts +0 -73
  439. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
  440. package/src/messaging/providers/slack/adapter.ts +122 -21
  441. package/src/messaging/providers/slack/backfill.test.ts +95 -6
  442. package/src/messaging/providers/slack/backfill.ts +89 -11
  443. package/src/messaging/providers/slack/client.ts +10 -124
  444. package/src/messaging/providers/slack/message-metadata.ts +12 -2
  445. package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
  446. package/src/messaging/providers/slack/render-transcript.ts +126 -25
  447. package/src/messaging/providers/slack/types.ts +1 -0
  448. package/src/oauth/connection-resolver.test.ts +8 -0
  449. package/src/oauth/connection-resolver.ts +8 -16
  450. package/src/oauth/credential-token-resolver.ts +97 -0
  451. package/src/oauth/manual-token-connection.ts +30 -34
  452. package/src/oauth/oauth-store.ts +6 -4
  453. package/src/outbound-proxy/certs.ts +0 -7
  454. package/src/outbound-proxy/config.ts +0 -74
  455. package/src/outbound-proxy/health.ts +0 -44
  456. package/src/outbound-proxy/index.ts +0 -22
  457. package/src/permissions/approval-provenance.test.ts +184 -0
  458. package/src/permissions/approval-provenance.ts +70 -0
  459. package/src/permissions/checker.ts +4 -1
  460. package/src/permissions/gateway-threshold-reader.ts +4 -1
  461. package/src/permissions/prompter.ts +9 -2
  462. package/src/permissions/secret-prompter.ts +21 -48
  463. package/src/permissions/types.ts +33 -0
  464. package/src/permissions/workspace-policy.ts +0 -5
  465. package/src/platform/sync-identity.ts +0 -8
  466. package/src/plugins/defaults/injectors.ts +69 -2
  467. package/src/plugins/defaults/overflow-reduce.ts +3 -2
  468. package/src/plugins/types.ts +8 -0
  469. package/src/prompts/system-prompt.ts +34 -70
  470. package/src/prompts/templates/BOOTSTRAP.md +52 -6
  471. package/src/prompts/update-bulletin-job.ts +2 -0
  472. package/src/providers/__tests__/retry-callsite.test.ts +138 -1
  473. package/src/providers/anthropic/client.ts +72 -33
  474. package/src/providers/call-site-routing.ts +42 -3
  475. package/src/providers/gemini/client.ts +18 -2
  476. package/src/providers/managed-proxy/context.ts +0 -5
  477. package/src/providers/model-catalog.ts +105 -19
  478. package/src/providers/openai/chat-completions-provider.ts +6 -0
  479. package/src/providers/openai/responses-provider.ts +7 -1
  480. package/src/providers/provider-send-message.ts +45 -2
  481. package/src/providers/ratelimit.ts +7 -2
  482. package/src/providers/registry.ts +14 -9
  483. package/src/providers/retry.ts +96 -8
  484. package/src/providers/types.ts +13 -0
  485. package/src/providers/usage-tracking.ts +96 -0
  486. package/src/runtime/AGENTS.md +10 -6
  487. package/src/runtime/__tests__/agent-wake.test.ts +89 -0
  488. package/src/runtime/agent-wake.ts +39 -2
  489. package/src/runtime/assistant-event-hub.ts +541 -45
  490. package/src/runtime/assistant-event.ts +1 -6
  491. package/src/runtime/auth/context.ts +0 -9
  492. package/src/runtime/auth/middleware.ts +1 -1
  493. package/src/runtime/auth/route-policy.ts +11 -9
  494. package/src/runtime/auth/token-service.ts +0 -11
  495. package/src/runtime/channel-approvals.ts +6 -2
  496. package/src/runtime/channel-verification-service.ts +3 -5
  497. package/src/runtime/http-errors.ts +0 -34
  498. package/src/runtime/http-router.ts +6 -3
  499. package/src/runtime/http-server.ts +22 -82
  500. package/src/runtime/http-types.ts +5 -0
  501. package/src/runtime/interactive-ui.ts +0 -1
  502. package/src/runtime/middleware/auth.ts +0 -20
  503. package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
  504. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
  505. package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
  506. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
  507. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
  508. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
  509. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
  510. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
  511. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
  512. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
  513. package/src/runtime/migrations/migration-transport.ts +46 -13
  514. package/src/runtime/migrations/migration-wizard.ts +2 -2
  515. package/src/runtime/migrations/origin-mode.ts +40 -0
  516. package/src/runtime/migrations/vbundle-builder.ts +133 -79
  517. package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
  518. package/src/runtime/migrations/vbundle-importer.ts +7 -7
  519. package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
  520. package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
  521. package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
  522. package/src/runtime/migrations/vbundle-validator.ts +214 -41
  523. package/src/runtime/pending-interactions.ts +13 -4
  524. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
  525. package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
  526. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
  527. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
  528. package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
  529. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
  530. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
  531. package/src/runtime/routes/acp-routes.test.ts +0 -3
  532. package/src/runtime/routes/acp-routes.ts +3 -7
  533. package/src/runtime/routes/app-management-routes.ts +18 -9
  534. package/src/runtime/routes/approval-routes.ts +55 -14
  535. package/src/runtime/routes/avatar-routes.ts +3 -5
  536. package/src/runtime/routes/browser-routes.ts +1 -15
  537. package/src/runtime/routes/channel-guardian-routes.ts +1 -5
  538. package/src/runtime/routes/channel-readiness-routes.ts +3 -7
  539. package/src/runtime/routes/channel-route-shared.ts +2 -28
  540. package/src/runtime/routes/client-routes.ts +45 -12
  541. package/src/runtime/routes/consolidation-routes.ts +115 -0
  542. package/src/runtime/routes/conversation-list-routes.ts +12 -29
  543. package/src/runtime/routes/conversation-management-routes.ts +14 -51
  544. package/src/runtime/routes/conversation-query-routes.ts +120 -8
  545. package/src/runtime/routes/conversation-routes.ts +44 -528
  546. package/src/runtime/routes/conversation-starter-routes.ts +19 -40
  547. package/src/runtime/routes/documents-routes.ts +53 -18
  548. package/src/runtime/routes/events-routes.ts +59 -91
  549. package/src/runtime/routes/filing-routes.ts +18 -1
  550. package/src/runtime/routes/guardian-action-routes.ts +4 -9
  551. package/src/runtime/routes/host-bash-routes.ts +3 -2
  552. package/src/runtime/routes/host-browser-routes.ts +9 -33
  553. package/src/runtime/routes/host-cu-routes.ts +6 -1
  554. package/src/runtime/routes/host-file-routes.ts +3 -2
  555. package/src/runtime/routes/host-transfer-routes.ts +11 -15
  556. package/src/runtime/routes/identity-routes.ts +78 -6
  557. package/src/runtime/routes/inbound-message-handler.ts +580 -137
  558. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
  559. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
  560. package/src/runtime/routes/index.ts +4 -0
  561. package/src/runtime/routes/integrations/slack/channel.ts +0 -24
  562. package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
  563. package/src/runtime/routes/memory-v2-routes.ts +10 -15
  564. package/src/runtime/routes/migration-routes.ts +188 -31
  565. package/src/runtime/routes/playground/guard.ts +1 -1
  566. package/src/runtime/routes/playground/index.ts +0 -2
  567. package/src/runtime/routes/recording-routes.ts +4 -24
  568. package/src/runtime/routes/rename-conversation-routes.ts +2 -6
  569. package/src/runtime/routes/schedule-routes.ts +3 -6
  570. package/src/runtime/routes/secret-routes.ts +87 -18
  571. package/src/runtime/routes/settings-routes.ts +29 -28
  572. package/src/runtime/routes/skills-routes.ts +12 -31
  573. package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
  574. package/src/runtime/routes/task-routes.ts +6 -6
  575. package/src/runtime/routes/trust-rules-routes.ts +3 -94
  576. package/src/runtime/routes/types.ts +4 -4
  577. package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
  578. package/src/runtime/routes/usage-routes.ts +87 -10
  579. package/src/runtime/routes/user-routes.ts +17 -31
  580. package/src/runtime/routes/work-items-routes.ts +1 -4
  581. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  582. package/src/runtime/services/analyze-conversation.ts +7 -17
  583. package/src/runtime/services/conversation-serializer.ts +2 -4
  584. package/src/runtime/verification-outbound-actions.ts +1 -1
  585. package/src/runtime/verification-rate-limiter.ts +1 -1
  586. package/src/schedule/schedule-store.ts +0 -16
  587. package/src/security/secret-scanner.ts +14 -547
  588. package/src/security/secure-keys.ts +31 -11
  589. package/src/security/token-manager.ts +7 -3
  590. package/src/signals/cancel.ts +16 -25
  591. package/src/signals/conversation-undo.ts +2 -27
  592. package/src/signals/emit-event.ts +1 -2
  593. package/src/signals/user-message.ts +108 -22
  594. package/src/skills/catalog-install.ts +1 -0
  595. package/src/skills/clawhub.ts +2 -2
  596. package/src/skills/inline-command-runner.ts +1 -7
  597. package/src/subagent/manager.ts +67 -84
  598. package/src/tasks/task-store.ts +1 -28
  599. package/src/telemetry/types.ts +6 -0
  600. package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
  601. package/src/telemetry/usage-telemetry-reporter.ts +3 -5
  602. package/src/tools/acp/spawn.test.ts +1 -2
  603. package/src/tools/acp/steer.test.ts +1 -2
  604. package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
  605. package/src/tools/browser/browser-execution.ts +31 -147
  606. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
  607. package/src/tools/browser/cdp-client/factory.ts +48 -76
  608. package/src/tools/browser/cdp-client/index.ts +1 -14
  609. package/src/tools/executor.ts +44 -31
  610. package/src/tools/host-filesystem/edit.ts +3 -2
  611. package/src/tools/host-filesystem/read.ts +3 -2
  612. package/src/tools/host-filesystem/transfer.test.ts +45 -42
  613. package/src/tools/host-filesystem/transfer.ts +4 -3
  614. package/src/tools/host-filesystem/write.ts +3 -2
  615. package/src/tools/host-terminal/host-shell.ts +4 -3
  616. package/src/tools/network/script-proxy/index.ts +1 -10
  617. package/src/tools/permission-checker.ts +66 -1
  618. package/src/tools/skills/sandbox-runner.ts +1 -6
  619. package/src/tools/skills/skill-tool-factory.ts +32 -0
  620. package/src/tools/terminal/safe-env.ts +1 -0
  621. package/src/tools/terminal/shell.ts +2 -78
  622. package/src/tools/types.ts +12 -39
  623. package/src/tts/__tests__/provider-catalog.test.ts +2 -2
  624. package/src/tts/provider-catalog.ts +1 -1
  625. package/src/usage/actors.ts +2 -1
  626. package/src/usage/attribution.ts +185 -0
  627. package/src/usage/pricing.ts +166 -0
  628. package/src/usage/types.ts +14 -0
  629. package/src/util/json.ts +13 -0
  630. package/src/util/logger.ts +3 -3
  631. package/src/util/pricing.ts +50 -3
  632. package/src/work-items/work-item-runner.ts +15 -42
  633. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
  634. package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
  635. package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
  636. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
  637. package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
  638. package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
  639. package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
  640. package/src/workspace/migrations/registry.ts +8 -0
  641. package/src/workspace/provider-commit-message-generator.ts +3 -3
  642. package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
  643. package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
  644. package/src/__tests__/secret-detection-handler.test.ts +0 -67
  645. package/src/__tests__/secret-scanner-executor.test.ts +0 -450
  646. package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
  647. package/src/__tests__/terminal-sandbox.test.ts +0 -374
  648. package/src/__tests__/tool-notification-listener.test.ts +0 -65
  649. package/src/context/__tests__/microcompact.test.ts +0 -805
  650. package/src/context/microcompact.ts +0 -443
  651. package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
  652. package/src/events/tool-notification-listener.ts +0 -17
  653. package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
  654. package/src/memory/v2/__tests__/edges.test.ts +0 -435
  655. package/src/memory/v2/edges.ts +0 -217
  656. package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
  657. package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
  658. package/src/runtime/__tests__/client-registry.test.ts +0 -271
  659. package/src/runtime/chrome-extension-registry.ts +0 -368
  660. package/src/runtime/client-registry.ts +0 -254
  661. package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
  662. package/src/tools/secret-detection-handler.ts +0 -269
  663. package/src/tools/terminal/backends/native.ts +0 -327
  664. package/src/tools/terminal/backends/types.ts +0 -37
  665. package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
  666. package/src/tools/terminal/sandbox.ts +0 -40
@@ -15,12 +15,15 @@
15
15
  */
16
16
 
17
17
  import { createReadStream } from "node:fs";
18
+ import { hostname } from "node:os";
18
19
  import { PassThrough, Readable } from "node:stream";
19
20
  import { Database } from "bun:sqlite";
20
21
 
21
22
  import { z } from "zod";
22
23
 
24
+ import { getPlatformAssistantId } from "../../config/env.js";
23
25
  import { invalidateConfigCache } from "../../config/loader.js";
26
+ import { getAssistantName } from "../../daemon/identity-helpers.js";
24
27
  import { getDb, resetDb } from "../../memory/db-connection.js";
25
28
  import { validateMigrationState } from "../../memory/migrations/validate-migration-state.js";
26
29
  import { credentialKey } from "../../security/credential-key.js";
@@ -40,6 +43,8 @@ import {
40
43
  getWorkspaceDir,
41
44
  getWorkspaceHooksDir,
42
45
  } from "../../util/platform.js";
46
+ import { APP_VERSION } from "../../version.js";
47
+ import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
43
48
  import {
44
49
  validateGcsSignedUrl,
45
50
  type ValidateGcsSignedUrlOptions,
@@ -48,6 +53,13 @@ import {
48
53
  JobAlreadyInProgressError,
49
54
  migrationJobs,
50
55
  } from "../migrations/job-registry.js";
56
+ import { getOriginMode } from "../migrations/origin-mode.js";
57
+ import type {
58
+ VBundleAssistantInfo,
59
+ VBundleCompatibility,
60
+ VBundleExportOptions,
61
+ VBundleOriginInfo,
62
+ } from "../migrations/vbundle-builder.js";
51
63
  import { streamExportVBundle } from "../migrations/vbundle-builder.js";
52
64
  import {
53
65
  analyzeImport,
@@ -136,6 +148,110 @@ export async function reconcileVellumMetadataFromCes(warningSink: {
136
148
 
137
149
  const log = getLogger("migration-routes");
138
150
 
151
+ /**
152
+ * Fields the export pipeline must populate on the v1 manifest.
153
+ *
154
+ * Centralized so both the synchronous-bytes and async-to-gcs handlers
155
+ * compute the same values (and a future caller doesn't accidentally drift).
156
+ */
157
+ interface ExportManifestInputs {
158
+ assistant: VBundleAssistantInfo;
159
+ origin: VBundleOriginInfo;
160
+ compatibility: VBundleCompatibility;
161
+ exportOptions: VBundleExportOptions;
162
+ }
163
+
164
+ /**
165
+ * Resolve the `assistant.id` for an export.
166
+ *
167
+ * Mirrors `platform/client.ts`'s precedence: in-memory override (set at
168
+ * daemon startup or by secret-routes) → credential store → daemon-internal
169
+ * fallback. The schema requires `id` to be non-empty, so we fall back to
170
+ * `DAEMON_INTERNAL_ASSISTANT_ID` rather than the empty string.
171
+ */
172
+ async function resolveAssistantId(): Promise<string> {
173
+ const inMemory = getPlatformAssistantId();
174
+ if (inMemory) return inMemory;
175
+ try {
176
+ const stored = await getSecureKeyAsync(
177
+ credentialKey("vellum", "platform_assistant_id"),
178
+ );
179
+ if (stored) return stored;
180
+ } catch (err) {
181
+ log.warn(
182
+ { err },
183
+ "Failed to read platform_assistant_id from credential store; falling back to daemon-internal id",
184
+ );
185
+ }
186
+ return DAEMON_INTERNAL_ASSISTANT_ID;
187
+ }
188
+
189
+ /**
190
+ * Decide the truthful `secrets_redacted` flag for an export.
191
+ *
192
+ * The export entry points pass every collected credential through to the
193
+ * builder unfiltered, so the bundle is NOT redacted whenever any
194
+ * credentials made it in. Only flip to true when the credential list is
195
+ * empty AND every credential read succeeded — i.e. there genuinely are
196
+ * no secrets in the bundle.
197
+ *
198
+ * Two failure modes both force `false`:
199
+ * - `storeUnreachable`: the top-level `listSecureKeysAsync()` call
200
+ * failed, so we never even discovered which accounts exist.
201
+ * - `perAccountUnreachable`: the LIST call succeeded but one or more
202
+ * individual `getSecureKeyResultAsync(account)` reads returned
203
+ * `unreachable: true`. Those accounts were silently skipped from the
204
+ * `credentials` array, so a `credentialCount === 0` outcome could
205
+ * reflect "we couldn't read them" rather than "no secrets exist".
206
+ * Claiming a clean redaction in that case would be a lie.
207
+ *
208
+ * NOTE: a managed-mode bundle with `secrets_redacted: false` will fail
209
+ * the validator's cross-field refine. That surfaces an existing
210
+ * platform-side enforcement gap — the runtime emits the truthful value
211
+ * and lets the schema flag it.
212
+ */
213
+ export function computeSecretsRedacted(
214
+ credentialCount: number,
215
+ storeUnreachable: boolean,
216
+ perAccountUnreachable: boolean,
217
+ ): boolean {
218
+ return credentialCount === 0 && !storeUnreachable && !perAccountUnreachable;
219
+ }
220
+
221
+ /**
222
+ * Compute the v1 manifest inputs that aren't tied to per-call options.
223
+ *
224
+ * `walkDirectoryForMetadata` skips `embedding-models`, `data/qdrant`,
225
+ * `signals`, and `deprecated` — `logs` is NOT in the skip list, so log
226
+ * files end up in `manifest.contents`. Browser state and memory vectors
227
+ * (qdrant) are skipped, so those flags are false.
228
+ */
229
+ async function buildExportManifestInputs(): Promise<ExportManifestInputs> {
230
+ const assistantId = await resolveAssistantId();
231
+ const assistantName = getAssistantName() ?? "Assistant";
232
+ const originMode = await getOriginMode();
233
+ return {
234
+ assistant: {
235
+ id: assistantId,
236
+ name: assistantName,
237
+ runtime_version: APP_VERSION,
238
+ },
239
+ origin: {
240
+ mode: originMode,
241
+ hostname: hostname(),
242
+ },
243
+ compatibility: {
244
+ min_runtime_version: APP_VERSION,
245
+ max_runtime_version: null,
246
+ },
247
+ exportOptions: {
248
+ include_logs: true,
249
+ include_browser_state: false,
250
+ include_memory_vectors: false,
251
+ },
252
+ };
253
+ }
254
+
139
255
  /**
140
256
  * POST /v1/migrations/validate
141
257
  *
@@ -188,18 +304,21 @@ export async function handleMigrationValidate({
188
304
  *
189
305
  * Auth: Requires settings.write scope. Allowed for actor, svc_gateway, svc_daemon, local.
190
306
  */
191
- export async function handleMigrationExport({
192
- body,
193
- }: RouteHandlerArgs): Promise<RouteResponse> {
194
- const description =
195
- typeof body?.description === "string" ? body.description : undefined;
196
-
307
+ export async function handleMigrationExport(
308
+ _args: RouteHandlerArgs,
309
+ ): Promise<RouteResponse> {
310
+ // The legacy `description` field is no longer carried on the v1
311
+ // manifest. Older clients still POST it; we silently ignore it.
197
312
  let cleanup: (() => Promise<void>) | undefined;
198
313
 
199
314
  try {
200
315
  // Read all stored credentials to include in the export bundle
201
316
  const credentialList = await listSecureKeysAsync();
202
317
  const credentials: Array<{ account: string; value: string }> = [];
318
+ // Track per-account read failures separately from the top-level LIST
319
+ // failure. A single skipped account means we cannot truthfully claim
320
+ // the bundle is fully redacted — we don't know what we missed.
321
+ let perAccountUnreachable = false;
203
322
  if (credentialList.unreachable) {
204
323
  log.warn(
205
324
  "Credential store is unreachable — export will not include credentials",
@@ -208,6 +327,7 @@ export async function handleMigrationExport({
208
327
  for (const account of credentialList.accounts) {
209
328
  const result = await getSecureKeyResultAsync(account);
210
329
  if (result.unreachable) {
330
+ perAccountUnreachable = true;
211
331
  log.warn(
212
332
  { account },
213
333
  "Credential store unreachable when reading credential — skipping",
@@ -218,10 +338,17 @@ export async function handleMigrationExport({
218
338
  }
219
339
  }
220
340
 
341
+ const manifestInputs = await buildExportManifestInputs();
342
+ const secretsRedacted = computeSecretsRedacted(
343
+ credentials.length,
344
+ credentialList.unreachable,
345
+ perAccountUnreachable,
346
+ );
347
+
221
348
  const result = await streamExportVBundle({
222
349
  workspaceDir: getWorkspaceDir(),
223
- source: "runtime-export",
224
- description,
350
+ ...manifestInputs,
351
+ secretsRedacted,
225
352
  credentials,
226
353
  checkpoint: () => {
227
354
  const dbPath = getDbPath();
@@ -262,8 +389,12 @@ export async function handleMigrationExport({
262
389
  "Content-Type": "application/octet-stream",
263
390
  "Content-Disposition": `attachment; filename="${filename}"`,
264
391
  "Content-Length": String(size),
265
- "X-Vbundle-Schema-Version": manifest.schema_version,
266
- "X-Vbundle-Manifest-Sha256": manifest.manifest_sha256,
392
+ // `schema_version` is now an integer; clients that parse this header
393
+ // continue to work, but the value flips from "1.0" to "1".
394
+ "X-Vbundle-Schema-Version": String(manifest.schema_version),
395
+ // Header name preserved for cross-version client compat; populated
396
+ // from the renamed manifest `checksum` field.
397
+ "X-Vbundle-Manifest-Sha256": manifest.checksum,
267
398
  "X-Vbundle-Credentials-Included": String(credentials.length),
268
399
  });
269
400
  } catch (err) {
@@ -288,15 +419,23 @@ const MigrationExportToGcsBody = z.object({
288
419
  });
289
420
 
290
421
  /**
291
- * Collected credentials plus a warning marker if the credential store was
422
+ * Collected credentials plus warning markers if the credential store was
292
423
  * unreachable. The caller surfaces the warning in logs; production callers
293
424
  * fail closed on errors (a thrown exception → 500) to avoid shipping a
294
425
  * bundle with partial credentials. An unreachable store is NOT an error —
295
426
  * `handleMigrationExport` treats that case as "export without credentials".
427
+ *
428
+ * - `unreachable`: the top-level `listSecureKeysAsync()` call failed.
429
+ * - `perAccountUnreachable`: the LIST succeeded but one or more individual
430
+ * `getSecureKeyResultAsync(account)` calls returned `unreachable: true`.
431
+ * Those accounts were silently skipped from `credentials`, so the count
432
+ * here understates reality. The flag is what tells `computeSecretsRedacted`
433
+ * it cannot claim a clean redaction.
296
434
  */
297
435
  interface CollectedCredentials {
298
436
  credentials: Array<{ account: string; value: string }>;
299
437
  unreachable: boolean;
438
+ perAccountUnreachable: boolean;
300
439
  }
301
440
 
302
441
  /**
@@ -311,12 +450,18 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
311
450
  log.warn(
312
451
  "Credential store is unreachable — export will not include credentials",
313
452
  );
314
- return { credentials: [], unreachable: true };
453
+ return {
454
+ credentials: [],
455
+ unreachable: true,
456
+ perAccountUnreachable: false,
457
+ };
315
458
  }
316
459
  const credentials: Array<{ account: string; value: string }> = [];
460
+ let perAccountUnreachable = false;
317
461
  for (const account of credentialList.accounts) {
318
462
  const result = await getSecureKeyResultAsync(account);
319
463
  if (result.unreachable) {
464
+ perAccountUnreachable = true;
320
465
  log.warn(
321
466
  { account },
322
467
  "Credential store unreachable when reading credential — skipping",
@@ -325,7 +470,7 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
325
470
  credentials.push({ account, value: result.value });
326
471
  }
327
472
  }
328
- return { credentials, unreachable: false };
473
+ return { credentials, unreachable: false, perAccountUnreachable };
329
474
  }
330
475
 
331
476
  /**
@@ -355,9 +500,7 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
355
500
  *
356
501
  * Auth: settings.write scope (matches `migrations/export`).
357
502
  */
358
- export async function handleMigrationExportToGcs({
359
- body,
360
- }: RouteHandlerArgs) {
503
+ export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
361
504
  // ── 1. Parse JSON body ────────────────────────────────────────────────
362
505
  const parsed = MigrationExportToGcsBody.safeParse(body);
363
506
  if (!parsed.success) {
@@ -399,9 +542,29 @@ export async function handleMigrationExportToGcs({
399
542
  );
400
543
  }
401
544
 
402
- const description = parsed.data.description;
403
545
  const uploadUrl = parsed.data.upload_url;
404
546
 
547
+ // Compute the v1 manifest inputs once outside the async job runner so we
548
+ // surface failures (e.g. credential-store probe) as a synchronous 500
549
+ // before the caller starts polling.
550
+ let manifestInputs: ExportManifestInputs;
551
+ try {
552
+ manifestInputs = await buildExportManifestInputs();
553
+ } catch (err) {
554
+ log.error({ err }, "Failed to assemble export manifest inputs");
555
+ throw new InternalError(
556
+ err instanceof Error
557
+ ? err.message
558
+ : "Failed to assemble export manifest inputs",
559
+ );
560
+ }
561
+
562
+ const secretsRedacted = computeSecretsRedacted(
563
+ collected.credentials.length,
564
+ collected.unreachable,
565
+ collected.perAccountUnreachable,
566
+ );
567
+
405
568
  // ── 4. Enqueue the job. The runner captures the collected credentials.
406
569
  let job;
407
570
  try {
@@ -410,8 +573,8 @@ export async function handleMigrationExportToGcs({
410
573
  try {
411
574
  const result = await streamExportVBundle({
412
575
  workspaceDir: getWorkspaceDir(),
413
- source: "runtime-export",
414
- description,
576
+ ...manifestInputs,
577
+ secretsRedacted,
415
578
  credentials: collected.credentials,
416
579
  checkpoint: () => {
417
580
  const dbPath = getDbPath();
@@ -493,7 +656,7 @@ export async function handleMigrationExportToGcs({
493
656
 
494
657
  return {
495
658
  size,
496
- sha256: manifest.manifest_sha256,
659
+ sha256: manifest.checksum,
497
660
  schemaVersion: manifest.schema_version,
498
661
  credentialsIncluded: collected.credentials.length,
499
662
  };
@@ -557,9 +720,7 @@ async function extractFileData(
557
720
  const formData = await syntheticReq.formData();
558
721
  const file = formData.get("file");
559
722
  if (!file || !(file instanceof Blob)) {
560
- throw new BadRequestError(
561
- 'Multipart upload requires a "file" field',
562
- );
723
+ throw new BadRequestError('Multipart upload requires a "file" field');
563
724
  }
564
725
  return new Uint8Array(await file.arrayBuffer());
565
726
  } catch (err) {
@@ -910,7 +1071,7 @@ class GcsImportError extends Error {
910
1071
  * The signed URL is never echoed into errors or logs — only the extracted
911
1072
  * `host`/`path` are.
912
1073
  */
913
- export async function runGcsImport(
1074
+ async function runGcsImport(
914
1075
  url: string,
915
1076
  _correlationId?: string,
916
1077
  ): Promise<ImportSummary> {
@@ -1303,9 +1464,7 @@ function throwGcsImportError(err: unknown): never {
1303
1464
  *
1304
1465
  * Auth: Requires settings.write scope. Allowed for actor, svc_gateway, svc_daemon, local.
1305
1466
  */
1306
- export async function handleMigrationImportFromGcs({
1307
- body,
1308
- }: RouteHandlerArgs) {
1467
+ export async function handleMigrationImportFromGcs({ body }: RouteHandlerArgs) {
1309
1468
  const parsed = MigrationImportFromGcsBody.safeParse(body);
1310
1469
  if (!parsed.success) {
1311
1470
  throw new BadRequestError(
@@ -1652,8 +1811,7 @@ export const ROUTES: RouteDefinition[] = [
1652
1811
  }),
1653
1812
  additionalResponses: {
1654
1813
  "502": {
1655
- description:
1656
- "Upstream fetch failed (URL body only).",
1814
+ description: "Upstream fetch failed (URL body only).",
1657
1815
  },
1658
1816
  },
1659
1817
  responseBody: z.object({
@@ -1710,8 +1868,7 @@ export const ROUTES: RouteDefinition[] = [
1710
1868
  }),
1711
1869
  additionalResponses: {
1712
1870
  "409": {
1713
- description:
1714
- "Another import job is already pending or running.",
1871
+ description: "Another import job is already pending or running.",
1715
1872
  },
1716
1873
  },
1717
1874
  handler: handleMigrationImportFromGcs,
@@ -15,7 +15,7 @@ import { RouteError } from "../errors.js";
15
15
  */
16
16
  const PLAYGROUND_DISABLED_CODE = "playground_disabled";
17
17
 
18
- export function isPlaygroundEnabled(): boolean {
18
+ function isPlaygroundEnabled(): boolean {
19
19
  return isAssistantFeatureFlagEnabled("compaction-playground", getConfig());
20
20
  }
21
21
 
@@ -6,8 +6,6 @@ import { ROUTES as SEED_CONVERSATION_ROUTES } from "./seed-conversation.js";
6
6
  import { ROUTES as SEEDED_CONVERSATIONS_ROUTES } from "./seeded-conversations.js";
7
7
  import { ROUTES as STATE_ROUTES } from "./state.js";
8
8
 
9
- export { assertPlaygroundEnabled } from "./guard.js";
10
-
11
9
  export const ROUTES: RouteDefinition[] = [
12
10
  ...FORCE_COMPACT_ROUTES,
13
11
  ...INJECT_FAILURES_ROUTES,
@@ -14,7 +14,6 @@
14
14
 
15
15
  import { z } from "zod";
16
16
 
17
- import { broadcastToAllClients } from "../../acp/index.js";
18
17
  import {
19
18
  getActiveRestartToken,
20
19
  handleRecordingPause,
@@ -24,7 +23,6 @@ import {
24
23
  handleRecordingStop,
25
24
  isRecordingIdle,
26
25
  } from "../../daemon/handlers/recording.js";
27
- import type { HandlerContext } from "../../daemon/handlers/shared.js";
28
26
  import type {
29
27
  RecordingOptions,
30
28
  RecordingStatus,
@@ -40,17 +38,6 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
40
38
 
41
39
  const log = getLogger("recording-routes");
42
40
 
43
- // ---------------------------------------------------------------------------
44
- // Broadcast shim — recording handlers only use ctx.broadcast()
45
- // ---------------------------------------------------------------------------
46
-
47
- function getBroadcastCtx(): HandlerContext {
48
- if (!broadcastToAllClients) {
49
- throw new InternalError("Broadcast not initialized");
50
- }
51
- return { broadcast: broadcastToAllClients } as HandlerContext;
52
- }
53
-
54
41
  // ---------------------------------------------------------------------------
55
42
  // Handlers
56
43
  // ---------------------------------------------------------------------------
@@ -60,11 +47,9 @@ async function handleStartRecording({ body }: RouteHandlerArgs) {
60
47
  throw new BadRequestError("conversationId is required");
61
48
  }
62
49
 
63
- const ctx = getBroadcastCtx();
64
50
  const recordingId = handleRecordingStart(
65
51
  body.conversationId,
66
52
  body.options as RecordingOptions | undefined,
67
- ctx,
68
53
  );
69
54
 
70
55
  if (!recordingId) {
@@ -90,8 +75,7 @@ async function handleStopRecording({ body }: RouteHandlerArgs) {
90
75
  throw new BadRequestError("conversationId is required");
91
76
  }
92
77
 
93
- const ctx = getBroadcastCtx();
94
- const recordingId = handleRecordingStop(body.conversationId, ctx);
78
+ const recordingId = handleRecordingStop(body.conversationId);
95
79
 
96
80
  if (!recordingId) {
97
81
  log.debug(
@@ -114,8 +98,7 @@ async function handlePauseRecording({ body }: RouteHandlerArgs) {
114
98
  throw new BadRequestError("conversationId is required");
115
99
  }
116
100
 
117
- const ctx = getBroadcastCtx();
118
- const recordingId = handleRecordingPause(body.conversationId, ctx);
101
+ const recordingId = handleRecordingPause(body.conversationId);
119
102
 
120
103
  if (!recordingId) {
121
104
  log.debug(
@@ -138,8 +121,7 @@ async function handleResumeRecording({ body }: RouteHandlerArgs) {
138
121
  throw new BadRequestError("conversationId is required");
139
122
  }
140
123
 
141
- const ctx = getBroadcastCtx();
142
- const recordingId = handleRecordingResume(body.conversationId, ctx);
124
+ const recordingId = handleRecordingResume(body.conversationId);
143
125
 
144
126
  if (!recordingId) {
145
127
  log.debug(
@@ -198,10 +180,8 @@ async function handlePostRecordingStatus({ body }: RouteHandlerArgs) {
198
180
  type: "recording_status",
199
181
  };
200
182
 
201
- const ctx = getBroadcastCtx();
202
-
203
183
  try {
204
- await handleRecordingStatusCore(msg, ctx);
184
+ await handleRecordingStatusCore(msg);
205
185
  } catch (err) {
206
186
  log.error(
207
187
  { err, conversationId: body.conversationId, status: body.status },
@@ -16,7 +16,6 @@ import {
16
16
  import { getLogger } from "../../util/logger.js";
17
17
  import { buildAssistantEvent } from "../assistant-event.js";
18
18
  import { assistantEventHub } from "../assistant-event-hub.js";
19
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
20
19
  import { BadRequestError, NotFoundError } from "./errors.js";
21
20
  import type { RouteDefinition } from "./types.js";
22
21
 
@@ -46,9 +45,7 @@ export const ROUTES: RouteDefinition[] = [
46
45
 
47
46
  const conversation = getConversation(conversationId);
48
47
  if (!conversation) {
49
- throw new NotFoundError(
50
- `Conversation ${conversationId} not found`,
51
- );
48
+ throw new NotFoundError(`Conversation ${conversationId} not found`);
52
49
  }
53
50
 
54
51
  updateConversationTitle(conversationId, title, 0);
@@ -56,7 +53,6 @@ export const ROUTES: RouteDefinition[] = [
56
53
  assistantEventHub
57
54
  .publish(
58
55
  buildAssistantEvent(
59
- DAEMON_INTERNAL_ASSISTANT_ID,
60
56
  {
61
57
  type: "conversation_title_updated",
62
58
  conversationId,
@@ -71,7 +67,7 @@ export const ROUTES: RouteDefinition[] = [
71
67
 
72
68
  assistantEventHub
73
69
  .publish(
74
- buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, {
70
+ buildAssistantEvent({
75
71
  type: "conversation_list_invalidated",
76
72
  reason: "renamed",
77
73
  }),
@@ -8,6 +8,7 @@
8
8
  import { z } from "zod";
9
9
 
10
10
  import { getOrCreateConversation } from "../../daemon/conversation-store.js";
11
+ import { INTERNAL_GUARDIAN_TRUST_CONTEXT } from "../../daemon/trust-context.js";
11
12
  import { bootstrapConversation } from "../../memory/conversation-bootstrap.js";
12
13
  import { getConversation } from "../../memory/conversation-crud.js";
13
14
  import { runScript } from "../../schedule/run-script.js";
@@ -28,10 +29,6 @@ import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
28
29
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
29
30
 
30
31
  const log = getLogger("schedule-routes");
31
- const SCHEDULE_GUARDIAN_TRUST_CONTEXT = {
32
- sourceChannel: "vellum",
33
- trustClass: "guardian",
34
- } as const;
35
32
 
36
33
  // ---------------------------------------------------------------------------
37
34
  // Handlers (transport-agnostic)
@@ -382,7 +379,7 @@ async function handleRunScheduleNow(id: string) {
382
379
  { taskId, workingDir: process.cwd(), source: "schedule" },
383
380
  async (conversationId, message, taskRunId) => {
384
381
  const conversation = await getOrCreateConversation(conversationId, {
385
- trustContext: SCHEDULE_GUARDIAN_TRUST_CONTEXT,
382
+ trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
386
383
  });
387
384
  conversation.taskRunId = taskRunId;
388
385
  try {
@@ -479,7 +476,7 @@ async function handleRunScheduleNow(id: string) {
479
476
  "Executing schedule manually (run now)",
480
477
  );
481
478
  const activeConversation = await getOrCreateConversation(conversationId, {
482
- trustContext: SCHEDULE_GUARDIAN_TRUST_CONTEXT,
479
+ trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
483
480
  });
484
481
  activeConversation.taskRunId = undefined;
485
482
  await activeConversation.processMessage(