@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
@@ -64,16 +64,43 @@ export interface ValidationError {
64
64
  export interface ManifestFileEntry {
65
65
  path: string;
66
66
  sha256: string;
67
- size: number;
67
+ size_bytes: number;
68
+ }
69
+
70
+ export interface ManifestAssistantInfo {
71
+ id: string;
72
+ name: string;
73
+ runtime_version: string;
74
+ }
75
+
76
+ export interface ManifestOrigin {
77
+ mode: "managed" | "self-hosted-remote" | "self-hosted-local";
78
+ platform_version?: string;
79
+ hostname?: string;
80
+ }
81
+
82
+ export interface ManifestCompatibility {
83
+ min_runtime_version: string;
84
+ max_runtime_version: string | null;
85
+ }
86
+
87
+ export interface ManifestExportOptions {
88
+ include_logs: boolean;
89
+ include_browser_state: boolean;
90
+ include_memory_vectors: boolean;
68
91
  }
69
92
 
70
93
  export interface Manifest {
71
- schema_version: string;
94
+ schema_version: number;
95
+ bundle_id: string;
72
96
  created_at: string;
73
- source?: string;
74
- description?: string;
75
- files: ManifestFileEntry[];
76
- manifest_sha256: string;
97
+ assistant: ManifestAssistantInfo;
98
+ origin: ManifestOrigin;
99
+ compatibility: ManifestCompatibility;
100
+ contents: ManifestFileEntry[];
101
+ checksum: string;
102
+ secrets_redacted: boolean;
103
+ export_options: ManifestExportOptions;
77
104
  }
78
105
 
79
106
  // ---------------------------------------------------------------------------
@@ -104,8 +131,8 @@ export interface ExportRuntimeResult {
104
131
  ok: true;
105
132
  archive: ArrayBuffer;
106
133
  filename: string;
107
- schemaVersion: string;
108
- manifestSha256: string;
134
+ schemaVersion: number;
135
+ checksum: string;
109
136
  }
110
137
 
111
138
  /** Managed export initiates an async job and returns a job ID. */
@@ -398,8 +425,14 @@ export async function exportBundle(
398
425
  } as ExportManagedResult;
399
426
  }
400
427
 
401
- // Runtime returns the binary archive
428
+ // Runtime returns the binary archive. The legacy
429
+ // `X-Vbundle-Manifest-Sha256` response header name is preserved for
430
+ // cross-version client compat — its value is now sourced from the
431
+ // renamed manifest `checksum` field.
402
432
  const archive = await response.arrayBuffer();
433
+ const schemaVersionHeader =
434
+ response.headers.get("X-Vbundle-Schema-Version") ?? "";
435
+ const parsedSchemaVersion = Number.parseInt(schemaVersionHeader, 10);
403
436
  return {
404
437
  ok: true,
405
438
  archive,
@@ -407,10 +440,10 @@ export async function exportBundle(
407
440
  response.headers
408
441
  .get("Content-Disposition")
409
442
  ?.match(/filename="?(.+?)"?$/)?.[1] ?? "export.vbundle",
410
- schemaVersion:
411
- response.headers.get("X-Vbundle-Schema-Version") ?? "unknown",
412
- manifestSha256:
413
- response.headers.get("X-Vbundle-Manifest-Sha256") ?? "unknown",
443
+ schemaVersion: Number.isFinite(parsedSchemaVersion)
444
+ ? parsedSchemaVersion
445
+ : 0,
446
+ checksum: response.headers.get("X-Vbundle-Manifest-Sha256") ?? "",
414
447
  } as ExportRuntimeResult;
415
448
  }
416
449
 
@@ -85,8 +85,8 @@ export interface MigrationWizardState {
85
85
  | {
86
86
  ok: true;
87
87
  filename: string;
88
- schemaVersion: string;
89
- manifestSha256: string;
88
+ schemaVersion: number;
89
+ checksum: string;
90
90
  };
91
91
 
92
92
  /** Import commit result. */
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Origin-mode derivation for vbundle exports.
3
+ *
4
+ * The vbundle manifest v1 schema's `origin.mode` enum captures the deployment
5
+ * shape that produced the bundle. The runtime's two underlying signals are:
6
+ *
7
+ * - `hasManagedProxyPrereqs()` — true when the daemon has the credentials
8
+ * it needs to act as a managed-proxy client, i.e. this is a managed
9
+ * deployment.
10
+ * - `getDaemonRuntimeMode()` — `"docker"` vs `"bare-metal"`, identifying
11
+ * where the daemon process is running.
12
+ *
13
+ * Folding both into a single helper keeps callers from repeating the
14
+ * combination logic.
15
+ */
16
+
17
+ import { hasManagedProxyPrereqs } from "../../providers/managed-proxy/context.js";
18
+ import { getDaemonRuntimeMode } from "../runtime-mode.js";
19
+
20
+ export type VBundleOriginMode =
21
+ | "managed"
22
+ | "self-hosted-remote"
23
+ | "self-hosted-local";
24
+
25
+ /**
26
+ * Returns the origin mode for the current daemon.
27
+ *
28
+ * Managed-proxy prereqs win first (a managed deployment is always
29
+ * "managed" regardless of where the daemon process runs); otherwise docker
30
+ * → "self-hosted-remote", bare-metal → "self-hosted-local".
31
+ */
32
+ export async function getOriginMode(): Promise<VBundleOriginMode> {
33
+ if (await hasManagedProxyPrereqs()) {
34
+ return "managed";
35
+ }
36
+ if (getDaemonRuntimeMode() === "docker") {
37
+ return "self-hosted-remote";
38
+ }
39
+ return "self-hosted-local";
40
+ }
@@ -6,7 +6,6 @@
6
6
  * - workspace/: the entire ~/.vellum/workspace/ directory tree (DB, config,
7
7
  * skills, prompts, attachments, etc.) — excluding large/regenerable
8
8
  * dirs (embedding-models/, data/qdrant/)
9
- * - trust/trust.json: trust rules (optional)
10
9
  */
11
10
 
12
11
  import { createHash, randomUUID } from "node:crypto";
@@ -29,6 +28,7 @@ import { pipeline } from "node:stream/promises";
29
28
  import { createGzip, gzipSync } from "node:zlib";
30
29
 
31
30
  import { sanitizeConfigForTransfer } from "../../config/sanitize-for-transfer.js";
31
+ import type { VBundleOriginMode } from "./origin-mode.js";
32
32
  import type {
33
33
  ManifestFileEntryType,
34
34
  ManifestType,
@@ -43,15 +43,50 @@ export interface VBundleFileEntry {
43
43
  data: Uint8Array;
44
44
  }
45
45
 
46
+ /** v1 manifest `assistant` block. */
47
+ export interface VBundleAssistantInfo {
48
+ id: string;
49
+ name: string;
50
+ runtime_version: string;
51
+ }
52
+
53
+ /** v1 manifest `origin` block. */
54
+ export interface VBundleOriginInfo {
55
+ mode: VBundleOriginMode;
56
+ platform_version?: string;
57
+ hostname?: string;
58
+ }
59
+
60
+ /** v1 manifest `compatibility` block. */
61
+ export interface VBundleCompatibility {
62
+ min_runtime_version: string;
63
+ max_runtime_version: string | null;
64
+ }
65
+
66
+ /** v1 manifest `export_options` block. */
67
+ export interface VBundleExportOptions {
68
+ include_logs: boolean;
69
+ include_browser_state: boolean;
70
+ include_memory_vectors: boolean;
71
+ }
72
+
46
73
  export interface BuildVBundleOptions {
47
74
  /** Files to include in the archive. Must include data/db/assistant.db. */
48
75
  files: VBundleFileEntry[];
49
- /** Schema version for the manifest. Defaults to "1.0". */
50
- schemaVersion?: string;
51
- /** Source identifier (e.g. "runtime-export"). */
52
- source?: string;
53
- /** Human-readable description. */
54
- description?: string;
76
+ /** Identity of the assistant that produced this bundle. */
77
+ assistant: VBundleAssistantInfo;
78
+ /** Where this bundle was produced. */
79
+ origin: VBundleOriginInfo;
80
+ /** Runtime-version compatibility window for importers. */
81
+ compatibility: VBundleCompatibility;
82
+ /** Which optional bundle contents this export carries. */
83
+ exportOptions: VBundleExportOptions;
84
+ /**
85
+ * Whether secrets were stripped from the bundle before archiving.
86
+ * Required at the type level — defaulting silently is exactly how the
87
+ * prior schema mismatch went unnoticed.
88
+ */
89
+ secretsRedacted: boolean;
55
90
  }
56
91
 
57
92
  export interface BuildVBundleResult {
@@ -284,45 +319,77 @@ function createTarArchive(
284
319
  // Core builder
285
320
  // ---------------------------------------------------------------------------
286
321
 
322
+ /**
323
+ * Build the v1 manifest object and its serialized JSON bytes for a vbundle.
324
+ *
325
+ * Shared by the buffered (`buildVBundle`) and streaming
326
+ * (`streamExportVBundle`) emit sites so the manifest shape and self-checksum
327
+ * computation live in exactly one place.
328
+ *
329
+ * The checksum is computed over the canonicalized manifest with the
330
+ * `checksum` field set to the empty string (per the schema spec) — both
331
+ * producers and the validator agree on this exact wire shape.
332
+ */
333
+ function buildManifestObject(input: {
334
+ contents: ManifestFileEntryType[];
335
+ assistant: VBundleAssistantInfo;
336
+ origin: VBundleOriginInfo;
337
+ compatibility: VBundleCompatibility;
338
+ exportOptions: VBundleExportOptions;
339
+ secretsRedacted: boolean;
340
+ now: Date;
341
+ }): { manifest: ManifestType; manifestData: Uint8Array } {
342
+ const manifestWithEmptyChecksum = {
343
+ schema_version: 1 as const,
344
+ bundle_id: randomUUID(),
345
+ created_at: input.now.toISOString(),
346
+ assistant: input.assistant,
347
+ origin: input.origin,
348
+ compatibility: input.compatibility,
349
+ contents: input.contents,
350
+ checksum: "",
351
+ secrets_redacted: input.secretsRedacted,
352
+ export_options: input.exportOptions,
353
+ };
354
+ const checksum = sha256Hex(canonicalizeJson(manifestWithEmptyChecksum));
355
+ const manifest: ManifestType = { ...manifestWithEmptyChecksum, checksum };
356
+ const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
357
+ return { manifest, manifestData };
358
+ }
359
+
287
360
  /**
288
361
  * Build a .vbundle archive from the given files and metadata.
289
362
  *
290
363
  * Generates a valid manifest with SHA-256 checksums for all files and
291
- * a self-referencing manifest_sha256 checksum. The archive is returned
364
+ * a self-referencing `checksum`. The archive is returned
292
365
  * as gzip-compressed tar bytes.
293
366
  */
294
367
  export function buildVBundle(options: BuildVBundleOptions): BuildVBundleResult {
295
368
  const {
296
369
  files,
297
- schemaVersion = "1.0",
298
- source = "runtime-export",
299
- description = "Runtime export bundle",
370
+ assistant,
371
+ origin,
372
+ compatibility,
373
+ exportOptions,
374
+ secretsRedacted,
300
375
  } = options;
301
376
 
302
377
  // Build file entries for the manifest
303
378
  const fileEntries: ManifestFileEntryType[] = files.map((f) => ({
304
379
  path: f.path,
305
380
  sha256: sha256Hex(f.data),
306
- size: f.data.length,
381
+ size_bytes: f.data.length,
307
382
  }));
308
383
 
309
- // Build manifest without the self-checksum
310
- const manifestWithoutChecksum = {
311
- schema_version: schemaVersion,
312
- created_at: new Date().toISOString(),
313
- source,
314
- description,
315
- files: fileEntries,
316
- };
317
-
318
- // Compute the manifest self-checksum
319
- const manifestSha256 = sha256Hex(canonicalizeJson(manifestWithoutChecksum));
320
- const manifest: ManifestType = {
321
- ...manifestWithoutChecksum,
322
- manifest_sha256: manifestSha256,
323
- };
324
-
325
- const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
384
+ const { manifest, manifestData } = buildManifestObject({
385
+ contents: fileEntries,
386
+ assistant,
387
+ origin,
388
+ compatibility,
389
+ exportOptions,
390
+ secretsRedacted,
391
+ now: new Date(),
392
+ });
326
393
 
327
394
  // Build tar entries: manifest first, then all files
328
395
  const tarEntries = [
@@ -423,12 +490,16 @@ function walkDirectory(
423
490
  // ---------------------------------------------------------------------------
424
491
 
425
492
  export interface BuildExportVBundleOptions {
426
- /** Source identifier. Defaults to "runtime-export". */
427
- source?: string;
428
- /** Human-readable description. */
429
- description?: string;
430
- /** Absolute path to trust.json. If provided and the file exists, it is included in the archive. */
431
- trustPath?: string;
493
+ /** Identity of the assistant that produced this bundle. */
494
+ assistant: VBundleAssistantInfo;
495
+ /** Where this bundle was produced. */
496
+ origin: VBundleOriginInfo;
497
+ /** Runtime-version compatibility window for importers. */
498
+ compatibility: VBundleCompatibility;
499
+ /** Which optional bundle contents this export carries. */
500
+ exportOptions: VBundleExportOptions;
501
+ /** Whether secrets were stripped from the bundle before archiving. */
502
+ secretsRedacted: boolean;
432
503
  /**
433
504
  * Absolute path to the workspace directory (~/.vellum/workspace/).
434
505
  * When provided and exists, the entire directory tree is walked and
@@ -455,7 +526,7 @@ export interface BuildExportVBundleOptions {
455
526
  * Walks the entire workspace directory (~/.vellum/workspace/) and includes
456
527
  * all files in the archive, skipping only large/regenerable directories
457
528
  * (embedding-models/, data/qdrant/). Binary files (SQLite DB, attachments)
458
- * are included. Trust rules are handled separately.
529
+ * are included.
459
530
  *
460
531
  * The WAL is checkpointed before the walk so the exported DB file contains
461
532
  * all committed rows.
@@ -464,10 +535,12 @@ export function buildExportVBundle(
464
535
  options: BuildExportVBundleOptions,
465
536
  ): BuildVBundleResult {
466
537
  const {
467
- source,
468
- description,
538
+ assistant,
539
+ origin,
540
+ compatibility,
541
+ exportOptions,
542
+ secretsRedacted,
469
543
  checkpoint,
470
- trustPath,
471
544
  workspaceDir,
472
545
  credentials,
473
546
  } = options;
@@ -504,12 +577,6 @@ export function buildExportVBundle(
504
577
  configEntry.data = new TextEncoder().encode(sanitized);
505
578
  }
506
579
 
507
- // Include trust rules if the file exists.
508
- if (trustPath && existsSync(trustPath)) {
509
- const trustData = new Uint8Array(readFileSync(trustPath));
510
- files.push({ path: "trust/trust.json", data: trustData });
511
- }
512
-
513
580
  // Include credential entries if provided
514
581
  if (credentials?.length) {
515
582
  for (const { account, value } of credentials) {
@@ -520,8 +587,11 @@ export function buildExportVBundle(
520
587
 
521
588
  return buildVBundle({
522
589
  files,
523
- source: source ?? "runtime-export",
524
- description: description ?? "Runtime export bundle",
590
+ assistant,
591
+ origin,
592
+ compatibility,
593
+ exportOptions,
594
+ secretsRedacted,
525
595
  });
526
596
  }
527
597
 
@@ -799,10 +869,12 @@ export async function streamExportVBundle(
799
869
  options: BuildExportVBundleOptions,
800
870
  ): Promise<StreamExportVBundleResult> {
801
871
  const {
802
- source,
803
- description,
872
+ assistant,
873
+ origin,
874
+ compatibility,
875
+ exportOptions,
876
+ secretsRedacted,
804
877
  checkpoint,
805
- trustPath,
806
878
  workspaceDir,
807
879
  credentials,
808
880
  } = options;
@@ -828,18 +900,6 @@ export async function streamExportVBundle(
828
900
  );
829
901
  }
830
902
 
831
- // Include trust rules if the file exists
832
- if (trustPath && existsSync(trustPath)) {
833
- const trustStat = lstatSync(trustPath);
834
- if (trustStat.isFile()) {
835
- allFileMetadata.push({
836
- archivePath: "trust/trust.json",
837
- diskPath: trustPath,
838
- size: trustStat.size,
839
- });
840
- }
841
- }
842
-
843
903
  // Sanitize workspace/config.json: read from disk, sanitize, and replace the
844
904
  // disk-backed metadata entry with an in-memory entry so the streaming tar
845
905
  // writes sanitized content instead of the raw file.
@@ -886,7 +946,7 @@ export async function streamExportVBundle(
886
946
  fileEntries.push({
887
947
  path: file.archivePath,
888
948
  sha256,
889
- size: file.size,
949
+ size_bytes: file.size,
890
950
  });
891
951
  }
892
952
 
@@ -896,25 +956,19 @@ export async function streamExportVBundle(
896
956
  fileEntries.push({
897
957
  path: entry.archivePath,
898
958
  sha256,
899
- size: entry.size,
959
+ size_bytes: entry.size,
900
960
  });
901
961
  }
902
962
 
903
- const manifestWithoutChecksum = {
904
- schema_version: "1.0",
905
- created_at: new Date().toISOString(),
906
- source: source ?? "runtime-export",
907
- description: description ?? "Runtime export bundle",
908
- files: fileEntries,
909
- };
910
-
911
- const manifestSha256 = sha256Hex(canonicalizeJson(manifestWithoutChecksum));
912
- const manifest: ManifestType = {
913
- ...manifestWithoutChecksum,
914
- manifest_sha256: manifestSha256,
915
- };
916
-
917
- const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
963
+ const { manifest, manifestData } = buildManifestObject({
964
+ contents: fileEntries,
965
+ assistant,
966
+ origin,
967
+ compatibility,
968
+ exportOptions,
969
+ secretsRedacted,
970
+ now: new Date(),
971
+ });
918
972
 
919
973
  // ------------------------------------------------------------------
920
974
  // Pass 2: Stream tar through gzip into a temp file
@@ -112,7 +112,9 @@ export class DefaultPathResolver implements PathResolver {
112
112
  constructor(
113
113
  private workspaceDir?: string,
114
114
  private hooksDir?: string,
115
- private guardianPersonaPathResolver: () => string | null = resolveGuardianPersonaPath,
115
+ private guardianPersonaPathResolver: () =>
116
+ | string
117
+ | null = resolveGuardianPersonaPath,
116
118
  ) {}
117
119
 
118
120
  resolve(archivePath: string): string | null {
@@ -247,7 +249,7 @@ export function analyzeImport(
247
249
  const files: ImportFileReport[] = [];
248
250
  const conflicts: ImportConflict[] = [];
249
251
 
250
- for (const fileEntry of manifest.files) {
252
+ for (const fileEntry of manifest.contents) {
251
253
  const diskPath = pathResolver.resolve(fileEntry.path);
252
254
 
253
255
  // Credential entries are handled separately by the credential import
@@ -256,7 +258,7 @@ export function analyzeImport(
256
258
  files.push({
257
259
  path: fileEntry.path,
258
260
  action: "skip",
259
- bundle_size: fileEntry.size,
261
+ bundle_size: fileEntry.size_bytes,
260
262
  bundle_sha256: fileEntry.sha256,
261
263
  current_size: null,
262
264
  current_sha256: null,
@@ -278,7 +280,7 @@ export function analyzeImport(
278
280
  files.push({
279
281
  path: fileEntry.path,
280
282
  action: "skip",
281
- bundle_size: fileEntry.size,
283
+ bundle_size: fileEntry.size_bytes,
282
284
  bundle_sha256: fileEntry.sha256,
283
285
  current_size: null,
284
286
  current_sha256: null,
@@ -295,7 +297,7 @@ export function analyzeImport(
295
297
  files.push({
296
298
  path: fileEntry.path,
297
299
  action: "skip",
298
- bundle_size: fileEntry.size,
300
+ bundle_size: fileEntry.size_bytes,
299
301
  bundle_sha256: fileEntry.sha256,
300
302
  current_size: null,
301
303
  current_sha256: null,
@@ -324,7 +326,7 @@ export function analyzeImport(
324
326
  files.push({
325
327
  path: fileEntry.path,
326
328
  action,
327
- bundle_size: fileEntry.size,
329
+ bundle_size: fileEntry.size_bytes,
328
330
  bundle_sha256: fileEntry.sha256,
329
331
  current_size: currentSize,
330
332
  current_sha256: currentSha256,
@@ -344,7 +346,7 @@ export function analyzeImport(
344
346
  files.push({
345
347
  path: fileEntry.path,
346
348
  action,
347
- bundle_size: fileEntry.size,
349
+ bundle_size: fileEntry.size_bytes,
348
350
  bundle_sha256: fileEntry.sha256,
349
351
  current_size: currentSize,
350
352
  current_sha256: currentSha256,
@@ -246,7 +246,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
246
246
  // valid disk path. This prevents path-traversal entries (e.g.
247
247
  // "workspace/../../etc/passwd") from triggering a workspace purge while
248
248
  // resolving to nothing.
249
- const hasWorkspaceEntries = manifest.files.some(
249
+ const hasWorkspaceEntries = manifest.contents.some(
250
250
  (f) => f.path.startsWith("workspace/") && !!pathResolver.resolve(f.path),
251
251
  );
252
252
 
@@ -314,7 +314,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
314
314
  const warnings: string[] = [];
315
315
  let backupsCreated = 0;
316
316
 
317
- for (const fileEntry of manifest.files) {
317
+ for (const fileEntry of manifest.contents) {
318
318
  // Credential entries are handled separately by extractCredentialsFromBundle()
319
319
  // in migration-routes.ts — skip them silently without warnings or skip counts.
320
320
  if (fileEntry.path.startsWith("credentials/")) {
@@ -329,7 +329,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
329
329
  path: fileEntry.path,
330
330
  disk_path: "",
331
331
  action: "skipped",
332
- size: fileEntry.size,
332
+ size: fileEntry.size_bytes,
333
333
  sha256: fileEntry.sha256,
334
334
  backup_path: null,
335
335
  });
@@ -347,7 +347,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
347
347
  path: fileEntry.path,
348
348
  disk_path: diskPath,
349
349
  action: "skipped",
350
- size: fileEntry.size,
350
+ size: fileEntry.size_bytes,
351
351
  sha256: fileEntry.sha256,
352
352
  backup_path: null,
353
353
  });
@@ -377,7 +377,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
377
377
  path: fileEntry.path,
378
378
  disk_path: diskPath,
379
379
  action: "skipped",
380
- size: fileEntry.size,
380
+ size: fileEntry.size_bytes,
381
381
  sha256: fileEntry.sha256,
382
382
  backup_path: null,
383
383
  });
@@ -536,7 +536,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
536
536
  // run (e.g. workspaceDir unset) the live metadata.json is still on
537
537
  // disk untouched — we must not rewrite it here or we would drop the
538
538
  // non-vellum entries the caller chose to keep.
539
- const bundleHadMetadata = manifest.files.some(
539
+ const bundleHadMetadata = manifest.contents.some(
540
540
  (f) => f.path === CREDENTIAL_METADATA_ARCHIVE_PATH,
541
541
  );
542
542
  if (
@@ -595,7 +595,7 @@ export function extractCredentialsFromBundle(
595
595
  entries: Map<string, VBundleTarEntry>,
596
596
  manifest: ManifestType,
597
597
  ): Array<{ account: string; value: string }> {
598
- const manifestPaths = new Set(manifest.files.map((f) => f.path));
598
+ const manifestPaths = new Set(manifest.contents.map((f) => f.path));
599
599
  const credentials: Array<{ account: string; value: string }> = [];
600
600
  for (const [path, entry] of entries) {
601
601
  if (path.startsWith("credentials/") && manifestPaths.has(path)) {
@@ -117,7 +117,7 @@ export function mergeMetadataPreservingVellum(
117
117
  }
118
118
 
119
119
  /** @internal For direct use by tests. */
120
- export const _internal = {
120
+ const _internal = {
121
121
  VELLUM_SERVICE,
122
122
  parseMetadata,
123
123
  extractVellumRecords,
@@ -314,10 +314,10 @@ export async function streamCommitImport(
314
314
  // Entry-count ceiling check. The manifest declares every file the
315
315
  // bundle claims to contain, so one check here bounds the work the
316
316
  // importer is willing to do for this bundle.
317
- if (manifest.files.length > bundleEntryCap) {
317
+ if (manifest.contents.length > bundleEntryCap) {
318
318
  throw new StreamingValidationError(
319
319
  "bundle_too_many_entries",
320
- `bundle contains more than ${bundleEntryCap} entries (declared: ${manifest.files.length})`,
320
+ `bundle contains more than ${bundleEntryCap} entries (declared: ${manifest.contents.length})`,
321
321
  );
322
322
  }
323
323
  entryIndex += 1;
@@ -350,7 +350,7 @@ export async function streamCommitImport(
350
350
  // Non-file entries are either directory markers (empty body) or
351
351
  // pax-header / other metadata payloads we don't consume. Apply the
352
352
  // bundle byte cap to their tar-header size too — an attacker could
353
- // otherwise keep `manifest.files` small while stuffing huge pax/other
353
+ // otherwise keep `manifest.contents` small while stuffing huge pax/other
354
354
  // entry bodies, draining the importer for free. Directory bodies are
355
355
  // reliably zero-sized; pax headers are measured in bytes, so this
356
356
  // check is effectively free in the happy path.