@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
@@ -31,6 +31,7 @@ import { buildVBundle } from "../vbundle-builder.js";
31
31
  import { DefaultPathResolver } from "../vbundle-import-analyzer.js";
32
32
  import { commitImport } from "../vbundle-importer.js";
33
33
  import { streamCommitImport } from "../vbundle-streaming-importer.js";
34
+ import { defaultV1Options } from "./v1-test-helpers.js";
34
35
 
35
36
  // ---------------------------------------------------------------------------
36
37
  // Metadata helpers
@@ -138,6 +139,10 @@ describe("commitImport — credential metadata merge", () => {
138
139
  ]);
139
140
  const { archive } = buildVBundle({
140
141
  files: [
142
+ {
143
+ path: "data/db/assistant.db",
144
+ data: new Uint8Array(),
145
+ },
141
146
  {
142
147
  path: "workspace/data/credentials/metadata.json",
143
148
  data: encode(bundleMetadata),
@@ -145,6 +150,7 @@ describe("commitImport — credential metadata merge", () => {
145
150
  // Include at least one other workspace entry so Step 1b fires.
146
151
  { path: "workspace/noop.txt", data: encode("noop") },
147
152
  ],
153
+ ...defaultV1Options(),
148
154
  });
149
155
 
150
156
  const result = commitImport({
@@ -179,12 +185,17 @@ describe("commitImport — credential metadata merge", () => {
179
185
  ]);
180
186
  const { archive } = buildVBundle({
181
187
  files: [
188
+ {
189
+ path: "data/db/assistant.db",
190
+ data: new Uint8Array(),
191
+ },
182
192
  {
183
193
  path: "workspace/data/credentials/metadata.json",
184
194
  data: encode(bundleMetadata),
185
195
  },
186
196
  { path: "workspace/noop.txt", data: encode("noop") },
187
197
  ],
198
+ ...defaultV1Options(),
188
199
  });
189
200
 
190
201
  const result = commitImport({
@@ -207,7 +218,11 @@ describe("commitImport — credential metadata merge", () => {
207
218
  const metadataPath = seedTargetMetadata(workspaceDir, vellumRecords());
208
219
 
209
220
  const { archive } = buildVBundle({
210
- files: [{ path: "workspace/noop.txt", data: encode("noop") }],
221
+ files: [
222
+ { path: "data/db/assistant.db", data: new Uint8Array() },
223
+ { path: "workspace/noop.txt", data: encode("noop") },
224
+ ],
225
+ ...defaultV1Options(),
211
226
  });
212
227
 
213
228
  const result = commitImport({
@@ -228,6 +243,10 @@ describe("commitImport — credential metadata merge", () => {
228
243
  test("target without existing metadata.json → bundle's file lands verbatim", () => {
229
244
  const { archive } = buildVBundle({
230
245
  files: [
246
+ {
247
+ path: "data/db/assistant.db",
248
+ data: new Uint8Array(),
249
+ },
231
250
  {
232
251
  path: "workspace/data/credentials/metadata.json",
233
252
  data: encode(
@@ -236,6 +255,7 @@ describe("commitImport — credential metadata merge", () => {
236
255
  },
237
256
  { path: "workspace/noop.txt", data: encode("noop") },
238
257
  ],
258
+ ...defaultV1Options(),
239
259
  });
240
260
 
241
261
  const result = commitImport({
@@ -279,12 +299,17 @@ describe("streamCommitImport — credential metadata merge", () => {
279
299
  ]);
280
300
  const { archive } = buildVBundle({
281
301
  files: [
302
+ {
303
+ path: "data/db/assistant.db",
304
+ data: new Uint8Array(),
305
+ },
282
306
  {
283
307
  path: "workspace/data/credentials/metadata.json",
284
308
  data: encode(bundleMetadata),
285
309
  },
286
310
  { path: "workspace/noop.txt", data: encode("noop") },
287
311
  ],
312
+ ...defaultV1Options(),
288
313
  });
289
314
 
290
315
  const result = await streamCommitImport({
@@ -316,12 +341,17 @@ describe("streamCommitImport — credential metadata merge", () => {
316
341
  ]);
317
342
  const { archive } = buildVBundle({
318
343
  files: [
344
+ {
345
+ path: "data/db/assistant.db",
346
+ data: new Uint8Array(),
347
+ },
319
348
  {
320
349
  path: "workspace/data/credentials/metadata.json",
321
350
  data: encode(bundleMetadata),
322
351
  },
323
352
  { path: "workspace/noop.txt", data: encode("noop") },
324
353
  ],
354
+ ...defaultV1Options(),
325
355
  });
326
356
 
327
357
  const result = await streamCommitImport({
@@ -344,7 +374,11 @@ describe("streamCommitImport — credential metadata merge", () => {
344
374
  const metadataPath = seedTargetMetadata(workspaceDir, vellumRecords());
345
375
 
346
376
  const { archive } = buildVBundle({
347
- files: [{ path: "workspace/noop.txt", data: encode("noop") }],
377
+ files: [
378
+ { path: "data/db/assistant.db", data: new Uint8Array() },
379
+ { path: "workspace/noop.txt", data: encode("noop") },
380
+ ],
381
+ ...defaultV1Options(),
348
382
  });
349
383
 
350
384
  const result = await streamCommitImport({
@@ -365,6 +399,10 @@ describe("streamCommitImport — credential metadata merge", () => {
365
399
  test("target with no metadata.json → bundle's file lands on disk verbatim", async () => {
366
400
  const { archive } = buildVBundle({
367
401
  files: [
402
+ {
403
+ path: "data/db/assistant.db",
404
+ data: new Uint8Array(),
405
+ },
368
406
  {
369
407
  path: "workspace/data/credentials/metadata.json",
370
408
  data: encode(
@@ -373,6 +411,7 @@ describe("streamCommitImport — credential metadata merge", () => {
373
411
  },
374
412
  { path: "workspace/noop.txt", data: encode("noop") },
375
413
  ],
414
+ ...defaultV1Options(),
376
415
  });
377
416
 
378
417
  const result = await streamCommitImport({
@@ -41,6 +41,7 @@ import { DefaultPathResolver } from "../vbundle-import-analyzer.js";
41
41
  import { commitImport } from "../vbundle-importer.js";
42
42
  import { streamCommitImport } from "../vbundle-streaming-importer.js";
43
43
  import { canonicalizeJson } from "../vbundle-validator.js";
44
+ import { defaultV1Options } from "./v1-test-helpers.js";
44
45
 
45
46
  /**
46
47
  * Fixed "customized" guardian persona content used by the USER.md-skip
@@ -131,7 +132,7 @@ function removeEntry(archive: Uint8Array, entryName: string): Uint8Array {
131
132
 
132
133
  /**
133
134
  * Update manifest.json in place to drop the entry with the given archive
134
- * path AND recompute manifest_sha256 so the manifest itself stays valid.
135
+ * path AND recompute the v1 `checksum` so the manifest itself stays valid.
135
136
  * Used to craft the "extra entry" (manifest_mismatch) fixture — the tar
136
137
  * has the file, but the manifest does not.
137
138
  */
@@ -149,15 +150,18 @@ function dropFromManifestAndRepack(
149
150
  raw.subarray(512, 512 + origSize),
150
151
  );
151
152
  const manifest = JSON.parse(manifestJson) as {
152
- files: Array<{ path: string; sha256: string; size: number }>;
153
- manifest_sha256: string;
153
+ contents: Array<{ path: string; sha256: string; size_bytes: number }>;
154
+ checksum: string;
154
155
  [k: string]: unknown;
155
156
  };
156
- manifest.files = manifest.files.filter((f) => f.path !== pathToDrop);
157
- // Recompute manifest_sha256.
158
- const withoutChecksum: Record<string, unknown> = { ...manifest };
159
- delete withoutChecksum.manifest_sha256;
160
- manifest.manifest_sha256 = sha256Hex(canonicalizeJson(withoutChecksum));
157
+ manifest.contents = manifest.contents.filter((f) => f.path !== pathToDrop);
158
+ // Recompute checksum: place an empty-string placeholder in the canonical
159
+ // form, exactly mirroring the v1 emit-time canonicalization.
160
+ const withEmptyChecksum: Record<string, unknown> = {
161
+ ...manifest,
162
+ checksum: "",
163
+ };
164
+ manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
161
165
 
162
166
  const newJson = JSON.stringify(manifest);
163
167
  const newBytes = new TextEncoder().encode(newJson);
@@ -218,11 +222,15 @@ describe("streamCommitImport — happy path", () => {
218
222
 
219
223
  const { archive } = buildVBundle({
220
224
  files: [
225
+ {
226
+ path: "data/db/assistant.db",
227
+ data: new Uint8Array(),
228
+ },
221
229
  { path: "workspace/a.txt", data: fileA },
222
230
  { path: "workspace/sub/b.txt", data: fileB },
223
231
  { path: "workspace/sub/c.txt", data: fileC },
224
232
  ],
225
- source: "test-happy-path",
233
+ ...defaultV1Options(),
226
234
  });
227
235
 
228
236
  const result = await streamCommitImport({
@@ -246,9 +254,10 @@ describe("streamCommitImport — happy path", () => {
246
254
  );
247
255
 
248
256
  expect(result.report.success).toBe(true);
249
- expect(result.report.summary.total_files).toBe(3);
250
- expect(result.report.summary.files_created).toBe(3);
251
- expect(result.report.manifest.files).toHaveLength(3);
257
+ // Includes the synthetic data/db/assistant.db entry plus a/b/c.txt.
258
+ expect(result.report.summary.total_files).toBe(4);
259
+ expect(result.report.summary.files_created).toBe(4);
260
+ expect(result.report.manifest.contents).toHaveLength(4);
252
261
  for (const f of result.report.files) {
253
262
  expect(f.action).toBe("created");
254
263
  expect(f.backup_path).toBeNull();
@@ -260,6 +269,10 @@ describe("streamCommitImport — happy path", () => {
260
269
  test("invokes onProgress after each file entry finishes", async () => {
261
270
  const { archive } = buildVBundle({
262
271
  files: [
272
+ {
273
+ path: "data/db/assistant.db",
274
+ data: new Uint8Array(),
275
+ },
263
276
  {
264
277
  path: "workspace/a.txt",
265
278
  data: new TextEncoder().encode("one"),
@@ -269,6 +282,7 @@ describe("streamCommitImport — happy path", () => {
269
282
  data: new TextEncoder().encode("two!"),
270
283
  },
271
284
  ],
285
+ ...defaultV1Options(),
272
286
  });
273
287
 
274
288
  const events: Array<{
@@ -285,17 +299,22 @@ describe("streamCommitImport — happy path", () => {
285
299
 
286
300
  expect(result.ok).toBe(true);
287
301
  expect(events.map((e) => e.archivePath)).toEqual([
302
+ "data/db/assistant.db",
288
303
  "workspace/a.txt",
289
304
  "workspace/b.txt",
290
305
  ]);
291
- expect(events[0]?.bytesWritten).toBe(3);
292
- expect(events[1]?.bytesWritten).toBe(4);
306
+ expect(events[1]?.bytesWritten).toBe(3);
307
+ expect(events[2]?.bytesWritten).toBe(4);
293
308
  expect(events[0]?.entryIndex).toBeLessThan(events[1]?.entryIndex ?? -1);
294
309
  });
295
310
 
296
311
  test("forwards credentials to importCredentials callback but never writes them to disk", async () => {
297
312
  const { archive } = buildVBundle({
298
313
  files: [
314
+ {
315
+ path: "data/db/assistant.db",
316
+ data: new Uint8Array(),
317
+ },
299
318
  {
300
319
  path: "workspace/config.json",
301
320
  data: new TextEncoder().encode("{}"),
@@ -309,6 +328,7 @@ describe("streamCommitImport — happy path", () => {
309
328
  data: new TextEncoder().encode("sk-ant-2"),
310
329
  },
311
330
  ],
331
+ ...defaultV1Options(),
312
332
  });
313
333
 
314
334
  const received: Array<{ account: string; value: string }> = [];
@@ -380,11 +400,16 @@ describe("streamCommitImport — failure modes", () => {
380
400
  // workspace/ file as entry #1.
381
401
  const { archive } = buildVBundle({
382
402
  files: [
403
+ {
404
+ path: "data/db/assistant.db",
405
+ data: new Uint8Array(),
406
+ },
383
407
  {
384
408
  path: "workspace/a.txt",
385
409
  data: new TextEncoder().encode("hello"),
386
410
  },
387
411
  ],
412
+ ...defaultV1Options(),
388
413
  });
389
414
  const noManifest = removeEntry(archive, "manifest.json");
390
415
 
@@ -412,20 +437,20 @@ describe("streamCommitImport — failure modes", () => {
412
437
  // Build a valid bundle with one file whose data is 32 bytes long.
413
438
  const body = new TextEncoder().encode("x".repeat(32));
414
439
  const { archive } = buildVBundle({
415
- files: [{ path: "workspace/victim.txt", data: body }],
440
+ files: [
441
+ { path: "data/db/assistant.db", data: new Uint8Array() },
442
+ { path: "workspace/victim.txt", data: body },
443
+ ],
444
+ ...defaultV1Options(),
416
445
  });
417
446
 
418
- // Tamper the manifest sha256 for workspace/victim.txt by substituting
419
- // one hex character. Keeps the manifest valid (the substitution is
420
- // same-length) — but because manifest_sha256 is recomputed over the
421
- // declared data, we ALSO need to tamper manifest_sha256 to keep the
422
- // manifest itself valid. Otherwise the manifest will fail its
423
- // self-checksum and the test exercises the wrong path.
424
- //
425
- // Easier approach: build a NEW valid manifest that declares the wrong
426
- // hash for victim.txt. We hand-rebuild the archive via
427
- // `dropFromManifestAndRepack`-style logic: replace the existing entry
428
- // in manifest.files with a different sha256, recompute manifest_sha256.
447
+ // Tamper the per-file sha256 for workspace/victim.txt by substituting
448
+ // one hex character. Keeps the manifest schema-valid (substitution is
449
+ // same-length) — but because the v1 `checksum` is recomputed over the
450
+ // declared data, we ALSO need to recompute `checksum` (with the empty
451
+ // placeholder) to keep the manifest itself valid. Otherwise the
452
+ // manifest fails its self-checksum and the test exercises the wrong
453
+ // path.
429
454
  const raw = gunzipSync(archive);
430
455
  const sizeStr = new TextDecoder()
431
456
  .decode(raw.subarray(124, 136))
@@ -436,11 +461,11 @@ describe("streamCommitImport — failure modes", () => {
436
461
  raw.subarray(512, 512 + origSize),
437
462
  );
438
463
  const manifest = JSON.parse(manifestJson) as {
439
- files: Array<{ path: string; sha256: string; size: number }>;
440
- manifest_sha256: string;
464
+ contents: Array<{ path: string; sha256: string; size_bytes: number }>;
465
+ checksum: string;
441
466
  [k: string]: unknown;
442
467
  };
443
- manifest.files = manifest.files.map((f) =>
468
+ manifest.contents = manifest.contents.map((f) =>
444
469
  f.path === "workspace/victim.txt"
445
470
  ? {
446
471
  ...f,
@@ -449,9 +474,11 @@ describe("streamCommitImport — failure modes", () => {
449
474
  }
450
475
  : f,
451
476
  );
452
- const withoutChecksum: Record<string, unknown> = { ...manifest };
453
- delete withoutChecksum.manifest_sha256;
454
- manifest.manifest_sha256 = sha256Hex(canonicalizeJson(withoutChecksum));
477
+ const withEmptyChecksum: Record<string, unknown> = {
478
+ ...manifest,
479
+ checksum: "",
480
+ };
481
+ manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
455
482
 
456
483
  const newJson = JSON.stringify(manifest);
457
484
  const newBytes = new TextEncoder().encode(newJson);
@@ -488,6 +515,10 @@ describe("streamCommitImport — failure modes", () => {
488
515
 
489
516
  const { archive } = buildVBundle({
490
517
  files: [
518
+ {
519
+ path: "data/db/assistant.db",
520
+ data: new Uint8Array(),
521
+ },
491
522
  {
492
523
  path: "workspace/present.txt",
493
524
  data: new TextEncoder().encode("here"),
@@ -497,6 +528,7 @@ describe("streamCommitImport — failure modes", () => {
497
528
  data: new TextEncoder().encode("gone"),
498
529
  },
499
530
  ],
531
+ ...defaultV1Options(),
500
532
  });
501
533
  const stripped = removeEntry(archive, "workspace/missing.txt");
502
534
 
@@ -525,6 +557,10 @@ describe("streamCommitImport — failure modes", () => {
525
557
 
526
558
  const { archive } = buildVBundle({
527
559
  files: [
560
+ {
561
+ path: "data/db/assistant.db",
562
+ data: new Uint8Array(),
563
+ },
528
564
  {
529
565
  path: "workspace/declared.txt",
530
566
  data: new TextEncoder().encode("fine"),
@@ -534,6 +570,7 @@ describe("streamCommitImport — failure modes", () => {
534
570
  data: new TextEncoder().encode("surprise"),
535
571
  },
536
572
  ],
573
+ ...defaultV1Options(),
537
574
  });
538
575
  const extraPresent = dropFromManifestAndRepack(
539
576
  archive,
@@ -569,11 +606,14 @@ describe("streamCommitImport — failure modes", () => {
569
606
  */
570
607
  function writeLargeFixtureToDisk(archivePath: string): void {
571
608
  const CHUNK = 25 * 1024 * 1024;
572
- const files = [0, 1, 2, 3].map((i) => ({
573
- path: `workspace/big-${i}.bin`,
574
- data: new Uint8Array(CHUNK).fill(0x41 + i),
575
- }));
576
- const { archive } = buildVBundle({ files });
609
+ const files = [
610
+ { path: "data/db/assistant.db", data: new Uint8Array() },
611
+ ...[0, 1, 2, 3].map((i) => ({
612
+ path: `workspace/big-${i}.bin`,
613
+ data: new Uint8Array(CHUNK).fill(0x41 + i),
614
+ })),
615
+ ];
616
+ const { archive } = buildVBundle({ files, ...defaultV1Options() });
577
617
  writeFileSync(archivePath, archive);
578
618
  }
579
619
 
@@ -640,6 +680,10 @@ describe("streamCommitImport — report parity with commitImport", () => {
640
680
  const streamWorkspace = freshWorkspace();
641
681
 
642
682
  const files = [
683
+ {
684
+ path: "data/db/assistant.db",
685
+ data: new Uint8Array(),
686
+ },
643
687
  {
644
688
  path: "workspace/a.txt",
645
689
  data: new TextEncoder().encode("alpha"),
@@ -649,7 +693,7 @@ describe("streamCommitImport — report parity with commitImport", () => {
649
693
  data: new TextEncoder().encode("beta beta"),
650
694
  },
651
695
  ];
652
- const { archive } = buildVBundle({ files });
696
+ const { archive } = buildVBundle({ files, ...defaultV1Options() });
653
697
 
654
698
  // Buffer-based path.
655
699
  mkdirSync(bufferWorkspace, { recursive: true });
@@ -689,8 +733,8 @@ describe("streamCommitImport — report parity with commitImport", () => {
689
733
 
690
734
  // Manifest payload itself should match — the streaming path parses it
691
735
  // directly from the same bytes.
692
- expect(streamResult.report.manifest.manifest_sha256).toBe(
693
- bufferResult.report.manifest.manifest_sha256,
736
+ expect(streamResult.report.manifest.checksum).toBe(
737
+ bufferResult.report.manifest.checksum,
694
738
  );
695
739
  } finally {
696
740
  for (const ws of [bufferWorkspace, streamWorkspace]) {
@@ -745,11 +789,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
745
789
  // entirely of credentials therefore has zero workspace-targeted writes.
746
790
  const { archive } = buildVBundle({
747
791
  files: [
792
+ {
793
+ path: "data/db/assistant.db",
794
+ data: new Uint8Array(),
795
+ },
748
796
  {
749
797
  path: "credentials/openai-key",
750
798
  data: new TextEncoder().encode("sk-test-creds-only"),
751
799
  },
752
800
  ],
801
+ ...defaultV1Options(),
753
802
  });
754
803
 
755
804
  const received: Array<{ account: string; value: string }> = [];
@@ -779,9 +828,14 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
779
828
  { account: "openai-key", value: "sk-test-creds-only" },
780
829
  ]);
781
830
 
782
- // Report should reflect "nothing imported into the workspace".
783
- expect(result.report.summary.files_created).toBe(0);
831
+ // Report should reflect "only the synthetic data/db/assistant.db
832
+ // landed; no `workspace/*` entries were written".
833
+ expect(result.report.summary.files_created).toBe(1);
784
834
  expect(result.report.summary.files_overwritten).toBe(0);
835
+ expect(
836
+ result.report.files.find((f) => f.path === "data/db/assistant.db")
837
+ ?.action,
838
+ ).toBe("created");
785
839
 
786
840
  // Cleanup removed the temp dir — no sibling left behind.
787
841
  const parent = join(workspaceDir, "..");
@@ -817,11 +871,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
817
871
 
818
872
  const { archive } = buildVBundle({
819
873
  files: [
874
+ {
875
+ path: "data/db/assistant.db",
876
+ data: new Uint8Array(),
877
+ },
820
878
  {
821
879
  path: "workspace/something.txt",
822
880
  data: new TextEncoder().encode("ignored"),
823
881
  },
824
882
  ],
883
+ ...defaultV1Options(),
825
884
  });
826
885
 
827
886
  try {
@@ -880,11 +939,16 @@ describe("streamCommitImport — config sanitization parity", () => {
880
939
 
881
940
  const { archive } = buildVBundle({
882
941
  files: [
942
+ {
943
+ path: "data/db/assistant.db",
944
+ data: new Uint8Array(),
945
+ },
883
946
  {
884
947
  path: "workspace/config.json",
885
948
  data: new TextEncoder().encode(tainted),
886
949
  },
887
950
  ],
951
+ ...defaultV1Options(),
888
952
  });
889
953
 
890
954
  const result = await streamCommitImport({
@@ -969,6 +1033,10 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
969
1033
 
970
1034
  const { archive } = buildVBundle({
971
1035
  files: [
1036
+ {
1037
+ path: "data/db/assistant.db",
1038
+ data: new Uint8Array(),
1039
+ },
972
1040
  {
973
1041
  path: "prompts/USER.md",
974
1042
  data: legacyContent,
@@ -981,6 +1049,7 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
981
1049
  data: new TextEncoder().encode("other content"),
982
1050
  },
983
1051
  ],
1052
+ ...defaultV1Options(),
984
1053
  });
985
1054
 
986
1055
  const result = await streamCommitImport({
@@ -1049,43 +1118,11 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
1049
1118
  }
1050
1119
  });
1051
1120
 
1052
- test("keeps the live data/db/assistant.db when the bundle omits data/db/*", async () => {
1053
- // Seed the live workspace with a fake SQLite DB whose contents we
1054
- // can identify post-import.
1055
- mkdirSync(join(workspaceDir, "data", "db"), { recursive: true });
1056
- const dbContent = Buffer.from("SQLite-format-3\0live-db-payload");
1057
- writeFileSync(join(workspaceDir, "data", "db", "assistant.db"), dbContent);
1058
-
1059
- // A bundle that writes a config file but carries nothing under
1060
- // workspace/data/db/.
1061
- const { archive } = buildVBundle({
1062
- files: [
1063
- {
1064
- path: "workspace/skills/example.md",
1065
- data: new TextEncoder().encode("# skill\n"),
1066
- },
1067
- ],
1068
- });
1069
-
1070
- const result = await streamCommitImport({
1071
- source: readableFrom(archive),
1072
- pathResolver: new DefaultPathResolver(workspaceDir),
1073
- workspaceDir,
1074
- });
1075
-
1076
- expect(result.ok).toBe(true);
1077
- if (!result.ok) throw new Error("unreachable");
1078
-
1079
- // Live DB survived the atomic swap with its exact original bytes.
1080
- const postDbPath = join(workspaceDir, "data", "db", "assistant.db");
1081
- expect(existsSync(postDbPath)).toBe(true);
1082
- expect(readFileSync(postDbPath)).toEqual(dbContent);
1083
-
1084
- // The bundle-provided file also landed.
1085
- expect(
1086
- readFileSync(join(workspaceDir, "skills", "example.md"), "utf8"),
1087
- ).toBe("# skill\n");
1088
- });
1121
+ // Note: the prior "bundle omits data/db/*" preserve test was retired
1122
+ // when the v1 manifest schema started requiring `data/db/assistant.db`
1123
+ // (or its `workspace/`-prefixed counterpart) to be present. Under v1
1124
+ // every bundle declares the DB, so the bundle-omits-DB scenario is no
1125
+ // longer reachable through the public emit path.
1089
1126
 
1090
1127
  test("keeps the live data/qdrant/ directory when the bundle omits qdrant entries", async () => {
1091
1128
  // Populate a fake qdrant store with a nested file.
@@ -1100,11 +1137,16 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
1100
1137
 
1101
1138
  const { archive } = buildVBundle({
1102
1139
  files: [
1140
+ {
1141
+ path: "data/db/assistant.db",
1142
+ data: new Uint8Array(),
1143
+ },
1103
1144
  {
1104
1145
  path: "workspace/config.json",
1105
1146
  data: new TextEncoder().encode("{}"),
1106
1147
  },
1107
1148
  ],
1149
+ ...defaultV1Options(),
1108
1150
  });
1109
1151
 
1110
1152
  const result = await streamCommitImport({
@@ -1145,6 +1187,7 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
1145
1187
  data: newDbBytes,
1146
1188
  },
1147
1189
  ],
1190
+ ...defaultV1Options(),
1148
1191
  });
1149
1192
 
1150
1193
  const result = await streamCommitImport({
@@ -1217,6 +1260,7 @@ describe("streamCommitImport — legacy-only bundle writes in place", () => {
1217
1260
  data: newDbBytes,
1218
1261
  },
1219
1262
  ],
1263
+ ...defaultV1Options(),
1220
1264
  });
1221
1265
 
1222
1266
  const result = await streamCommitImport({
@@ -1313,6 +1357,10 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
1313
1357
  const newMeta = new TextEncoder().encode('{"fresh":true}');
1314
1358
  const { archive } = buildVBundle({
1315
1359
  files: [
1360
+ {
1361
+ path: "data/db/assistant.db",
1362
+ data: new Uint8Array(),
1363
+ },
1316
1364
  {
1317
1365
  path: "workspace/data/qdrant/meta.json",
1318
1366
  data: newMeta,
@@ -1322,6 +1370,7 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
1322
1370
  data: new TextEncoder().encode("marker\n"),
1323
1371
  },
1324
1372
  ],
1373
+ ...defaultV1Options(),
1325
1374
  });
1326
1375
 
1327
1376
  const result = await streamCommitImport({
@@ -1408,10 +1457,15 @@ describe("streamCommitImport — bundle resource ceilings", () => {
1408
1457
  // declared-count check trips before any tar entry is processed.
1409
1458
  const { archive } = buildVBundle({
1410
1459
  files: [
1460
+ {
1461
+ path: "data/db/assistant.db",
1462
+ data: new Uint8Array(),
1463
+ },
1411
1464
  { path: "workspace/a.txt", data: new TextEncoder().encode("a") },
1412
1465
  { path: "workspace/b.txt", data: new TextEncoder().encode("b") },
1413
1466
  { path: "workspace/c.txt", data: new TextEncoder().encode("c") },
1414
1467
  ],
1468
+ ...defaultV1Options(),
1415
1469
  });
1416
1470
 
1417
1471
  const result = await streamCommitImport({
@@ -1443,9 +1497,14 @@ describe("streamCommitImport — bundle resource ceilings", () => {
1443
1497
  const big = new Uint8Array(100).fill(0x41);
1444
1498
  const { archive } = buildVBundle({
1445
1499
  files: [
1500
+ {
1501
+ path: "data/db/assistant.db",
1502
+ data: new Uint8Array(),
1503
+ },
1446
1504
  { path: "workspace/big1.bin", data: big },
1447
1505
  { path: "workspace/big2.bin", data: big },
1448
1506
  ],
1507
+ ...defaultV1Options(),
1449
1508
  });
1450
1509
 
1451
1510
  const result = await streamCommitImport({
@@ -1505,11 +1564,16 @@ describe("streamCommitImport — report.sha256 reflects post-sanitization bytes"
1505
1564
 
1506
1565
  const { archive } = buildVBundle({
1507
1566
  files: [
1567
+ {
1568
+ path: "data/db/assistant.db",
1569
+ data: new Uint8Array(),
1570
+ },
1508
1571
  {
1509
1572
  path: "workspace/config.json",
1510
1573
  data: rawArchiveBytes,
1511
1574
  },
1512
1575
  ],
1576
+ ...defaultV1Options(),
1513
1577
  });
1514
1578
 
1515
1579
  const result = await streamCommitImport({