@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
@@ -23,13 +23,8 @@ export type AssistantEvent = BaseAssistantEvent<ServerMessage>;
23
23
 
24
24
  /** Daemon-side wrapper preserving the original `ServerMessage`-typed signature. */
25
25
  export function buildAssistantEvent(
26
- assistantId: string,
27
26
  message: ServerMessage,
28
27
  conversationId?: string,
29
28
  ): AssistantEvent {
30
- return baseBuildAssistantEvent<ServerMessage>(
31
- assistantId,
32
- message,
33
- conversationId,
34
- );
29
+ return baseBuildAssistantEvent<ServerMessage>(message, conversationId);
35
30
  }
@@ -61,12 +61,3 @@ export function buildAuthContext(claims: TokenClaims): BuildAuthContextResult {
61
61
 
62
62
  return { ok: true, context };
63
63
  }
64
-
65
- /**
66
- * True when the request was authenticated as the gateway service.
67
- * Used at endpoints that gate platform-only or trust-mediated behavior
68
- * on the caller being the gateway rather than an end-user actor.
69
- */
70
- export function isServiceGatewayPrincipal(authContext: AuthContext): boolean {
71
- return authContext.principalType === "svc_gateway";
72
- }
@@ -17,7 +17,7 @@
17
17
  * Replaces both the legacy bearer shared-secret check and the
18
18
  * actor-token HMAC middleware with a single JWT verification path.
19
19
  *
20
- * In dev mode (DISABLE_HTTP_AUTH + VELLUM_UNSAFE_AUTH_BYPASS), JWT
20
+ * When DISABLE_HTTP_AUTH is set (platform-managed deployments), JWT
21
21
  * verification is skipped and a synthetic AuthContext is constructed
22
22
  * so downstream code always has a typed context to consume.
23
23
  */
@@ -221,10 +221,6 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
221
221
  endpoint: "integrations/slack/channel/config:DELETE",
222
222
  scopes: ["settings.write"],
223
223
  },
224
- {
225
- endpoint: "integrations/slack/channel/oauth-install:POST",
226
- scopes: ["settings.write"],
227
- },
228
224
  { endpoint: "channel-verification-sessions", scopes: ["settings.write"] },
229
225
  {
230
226
  endpoint: "channel-verification-sessions:DELETE",
@@ -317,12 +313,14 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
317
313
  { endpoint: "usage/totals", scopes: ["settings.read"] },
318
314
  { endpoint: "usage/daily", scopes: ["settings.read"] },
319
315
  { endpoint: "usage/breakdown", scopes: ["settings.read"] },
316
+ { endpoint: "usage/series", scopes: ["settings.read"] },
320
317
 
321
318
  // Lifecycle telemetry
322
319
  { endpoint: "telemetry/lifecycle", scopes: ["settings.write"] },
323
320
 
324
321
  // Debug / introspection
325
322
  { endpoint: "clients", scopes: ["settings.read"] },
323
+ { endpoint: "clients/disconnect", scopes: ["settings.write"] },
326
324
  { endpoint: "debug", scopes: ["settings.read"] },
327
325
 
328
326
  // Workspace file browsing
@@ -376,6 +374,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
376
374
  { endpoint: "config:GET", scopes: ["settings.read"] },
377
375
  { endpoint: "config:PATCH", scopes: ["settings.write"] },
378
376
 
377
+ // LLM call site catalog
378
+ { endpoint: "config/llm/call-sites:GET", scopes: ["settings.read"] },
379
+
379
380
  // Conversation management
380
381
  { endpoint: "conversations:DELETE", scopes: ["chat.write"] },
381
382
  { endpoint: "conversations/wipe", scopes: ["chat.write"] },
@@ -423,11 +424,8 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
423
424
  { endpoint: "memory/v2/validate:POST", scopes: ["settings.read"] },
424
425
  { endpoint: "memory/v2/reembed-skills:POST", scopes: ["settings.write"] },
425
426
 
426
- // Trust rule CRUD management
427
+ // Trust rule listing
427
428
  { endpoint: "trust-rules/manage:GET", scopes: ["settings.read"] },
428
- { endpoint: "trust-rules/manage:POST", scopes: ["settings.write"] },
429
- { endpoint: "trust-rules/manage:DELETE", scopes: ["settings.write"] },
430
- { endpoint: "trust-rules/manage:PATCH", scopes: ["settings.write"] },
431
429
 
432
430
  // Computer use
433
431
  { endpoint: "computer-use/sessions", scopes: ["chat.write"] },
@@ -488,6 +486,10 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
488
486
  { endpoint: "filing", scopes: ["settings.read"] },
489
487
  { endpoint: "filing:POST", scopes: ["settings.write"] },
490
488
 
489
+ // Consolidation (memory v2 counterpart to Filing)
490
+ { endpoint: "consolidation", scopes: ["settings.read"] },
491
+ { endpoint: "consolidation:POST", scopes: ["settings.write"] },
492
+
491
493
  // Heartbeat (config, runs, checklist — all share the "heartbeat" policyKey)
492
494
  { endpoint: "heartbeat:GET", scopes: ["settings.read"] },
493
495
  { endpoint: "heartbeat", scopes: ["settings.write"] },
@@ -699,7 +701,7 @@ registerPolicy("conversations/wipe", {
699
701
 
700
702
  registerPolicy("trust-rules/suggest", {
701
703
  requiredScopes: ["settings.write"],
702
- allowedPrincipalTypes: ["local"],
704
+ allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
703
705
  });
704
706
 
705
707
  // Notification pipeline: local-only (CLI / IPC callers)
@@ -215,17 +215,6 @@ export function initAuthSigningKey(key: Buffer): void {
215
215
  _authSigningKey = key;
216
216
  }
217
217
 
218
- /**
219
- * Check whether the auth signing key has been initialized.
220
- *
221
- * Useful for out-of-process contexts (CLI) that may run without
222
- * daemon startup, where callers need to decide whether they can
223
- * mint JWTs or must fall back to the legacy shared-secret token.
224
- */
225
- export function isSigningKeyInitialized(): boolean {
226
- return _authSigningKey !== undefined;
227
- }
228
-
229
218
  /**
230
219
  * Reset the signing key to undefined. **Test-only** — used to simulate a
231
220
  * fresh CLI subprocess where initAuthSigningKey() was never called.
@@ -9,6 +9,7 @@
9
9
  * 3. Consume user decisions and apply them to the underlying session
10
10
  */
11
11
 
12
+ import { findConversation } from "../daemon/conversation-store.js";
12
13
  import type { UserDecision } from "../permissions/types.js";
13
14
  import { composeApprovalMessage } from "./approval-message-composer.js";
14
15
  import type {
@@ -165,13 +166,16 @@ export function handleChannelDecision(
165
166
 
166
167
  // Map channel-level action to the permission system's UserDecision type.
167
168
  const userDecision = mapApprovalActionToUserDecision(decision.action);
169
+ const conversation = findConversation(resolved.conversationId);
170
+ if (!conversation) return { applied: false };
171
+
168
172
  if (decisionContext === undefined) {
169
- resolved.conversation!.handleConfirmationResponse(
173
+ conversation.handleConfirmationResponse(
170
174
  info.requestId,
171
175
  userDecision,
172
176
  );
173
177
  } else {
174
- resolved.conversation!.handleConfirmationResponse(
178
+ conversation.handleConfirmationResponse(
175
179
  info.requestId,
176
180
  userDecision,
177
181
  undefined,
@@ -153,9 +153,8 @@ export function createInboundVerificationSession(
153
153
  * validates the secret against pending challenges, verifies identity
154
154
  * binding, and consumes the challenge. It returns the verification type
155
155
  * (guardian or trusted_contact) but does NOT create bindings or apply
156
- * role-specific side effects — those are handled by callers:
157
- * verification-intercept.ts (channel verification) and
158
- * relay-server.ts (voice verification).
156
+ * role-specific side effects — those are handled by the gateway's
157
+ * text-verification.ts and voice verification intercepts.
159
158
  *
160
159
  * On failure the invalid-attempt counter is incremented; after
161
160
  * exceeding the threshold the actor is locked out for a cooldown
@@ -308,8 +307,7 @@ export function validateAndConsumeVerification(
308
307
  resetRateLimit(channel, actorExternalUserId, actorChatId);
309
308
 
310
309
  // Return the verification type — role-specific side effects are
311
- // handled by callers: verification-intercept (channel) and
312
- // relay-server (voice).
310
+ // handled by the gateway's verification intercepts.
313
311
  return {
314
312
  success: true,
315
313
  verificationType:
@@ -73,37 +73,3 @@ export function httpError(
73
73
  };
74
74
  return Response.json(body, { status });
75
75
  }
76
-
77
- /**
78
- * Derive the appropriate `HttpErrorCode` from an HTTP status code.
79
- * Useful when domain functions return a numeric status and a generic error
80
- * message — this maps the status to a semantically correct error code.
81
- */
82
- export function httpErrorCodeFromStatus(status: number): HttpErrorCode {
83
- switch (status) {
84
- case 400:
85
- return "BAD_REQUEST";
86
- case 401:
87
- return "UNAUTHORIZED";
88
- case 403:
89
- return "FORBIDDEN";
90
- case 404:
91
- return "NOT_FOUND";
92
- case 409:
93
- return "CONFLICT";
94
- case 410:
95
- return "GONE";
96
- case 422:
97
- return "UNPROCESSABLE_ENTITY";
98
- case 424:
99
- return "FAILED_DEPENDENCY";
100
- case 429:
101
- return "RATE_LIMITED";
102
- case 501:
103
- return "NOT_IMPLEMENTED";
104
- case 503:
105
- return "SERVICE_UNAVAILABLE";
106
- default:
107
- return "INTERNAL_ERROR";
108
- }
109
- }
@@ -16,6 +16,8 @@ import { enforcePolicy, getPolicy } from "./auth/route-policy.js";
16
16
  import type { AuthContext } from "./auth/types.js";
17
17
  import { httpError } from "./http-errors.js";
18
18
  import { withErrorHandling } from "./middleware/error-handler.js";
19
+ import { routeDefinitionsToHTTPRoutes } from "./routes/http-adapter.js";
20
+ import { ROUTES } from "./routes/index.js";
19
21
  import type { RoutePathParam } from "./routes/types.js";
20
22
 
21
23
  // ---------------------------------------------------------------------------
@@ -147,8 +149,8 @@ interface CompiledRoute {
147
149
  export class HttpRouter {
148
150
  private compiledRoutes: CompiledRoute[] = [];
149
151
 
150
- constructor(routes: HTTPRouteDefinition[]) {
151
- for (const def of routes) {
152
+ constructor() {
153
+ for (const def of routeDefinitionsToHTTPRoutes(ROUTES)) {
152
154
  this.compiledRoutes.push(compileRoute(def));
153
155
  }
154
156
  }
@@ -219,7 +221,8 @@ export class HttpRouter {
219
221
  // Path-param type → regex fragment
220
222
  // ---------------------------------------------------------------------------
221
223
 
222
- const UUID_PATTERN = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
224
+ const UUID_PATTERN =
225
+ "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
223
226
 
224
227
  /** Map of param type → regex capture group (without the surrounding parens). */
225
228
  const PARAM_TYPE_PATTERNS: Record<string, string> = {
@@ -5,7 +5,6 @@
5
5
  * configured port (default: 7821).
6
6
  */
7
7
 
8
-
9
8
  import type { ServerWebSocket } from "bun";
10
9
 
11
10
  import {
@@ -26,10 +25,8 @@ import {
26
25
  handleStatusCallback,
27
26
  handleVoiceWebhook,
28
27
  } from "../calls/twilio-routes.js";
29
- import {
30
- hasUngatedHttpAuthDisabled,
31
- isHttpAuthDisabled,
32
- } from "../config/env.js";
28
+ import { isHttpAuthDisabled } from "../config/env.js";
29
+ import { getIsPlatform } from "../config/env-registry.js";
33
30
  import { getConfig } from "../config/loader.js";
34
31
  import { processMessage } from "../daemon/process-message.js";
35
32
  import { createLiveVoiceSession } from "../live-voice/live-voice-session.js";
@@ -57,9 +54,7 @@ import { parseSub } from "./auth/subject.js";
57
54
  import { verifyToken } from "./auth/token-service.js";
58
55
  import { verifyHostBrowserCapability } from "./capability-tokens.js";
59
56
  import { sweepFailedEvents } from "./channel-retry-sweep.js";
60
- import { getChromeExtensionRegistry } from "./chrome-extension-registry.js";
61
57
  import { httpError, type HttpErrorCode } from "./http-errors.js";
62
- import type { HTTPRouteDefinition } from "./http-router.js";
63
58
  import { HttpRouter } from "./http-router.js";
64
59
  // Middleware
65
60
  import {
@@ -101,9 +96,7 @@ import {
101
96
  resolveHostBrowserResultByRequestId,
102
97
  resolveHostBrowserSessionInvalidated,
103
98
  } from "./routes/host-browser-routes.js";
104
- import { routeDefinitionsToHTTPRoutes } from "./routes/http-adapter.js";
105
99
  import { handleHealth, handleReadyz } from "./routes/identity-routes.js";
106
- import { ROUTES } from "./routes/index.js";
107
100
  import { matchSkillRoute } from "./skill-route-registry.js";
108
101
 
109
102
  // Re-export for consumers
@@ -140,9 +133,8 @@ const MAX_REQUEST_BODY_BYTES = 512 * 1024 * 1024;
140
133
  /**
141
134
  * WebSocket data attached to `/v1/browser-relay` connections. The route
142
135
  * is used exclusively by the chrome-extension CDP proxy — outbound
143
- * `host_browser_request` frames are pushed through the
144
- * {@link ChromeExtensionRegistry}, and inbound `host_browser_result`
145
- * frames are dispatched through
136
+ * `host_browser_request` frames are pushed through the assistant event
137
+ * hub, and inbound `host_browser_result` frames are dispatched through
146
138
  * `resolveHostBrowserResultByRequestId`. The extension may also submit
147
139
  * results via `POST /v1/host-browser-result` (both transports resolve
148
140
  * through the same core function).
@@ -152,21 +144,16 @@ interface BrowserRelayWebSocketData {
152
144
  connectionId: string;
153
145
  /**
154
146
  * Guardian identity derived from the JWT claims at WebSocket upgrade
155
- * time. Used by the ChromeExtensionRegistry to route
156
- * host_browser_request frames to the correct extension. Undefined when
157
- * HTTP auth is disabled (dev bypass) or when the token's sub cannot be
158
- * parsed into an actor principal.
147
+ * time. Undefined when HTTP auth is disabled (dev bypass) or when the
148
+ * token's sub cannot be parsed into an actor principal.
159
149
  */
160
150
  guardianId?: string;
161
151
  /**
162
152
  * Stable per-extension-install identifier supplied by the client on
163
153
  * the WebSocket handshake (via the `clientInstanceId` query param or
164
- * the `x-client-instance-id` header). Plumbed into the
165
- * ChromeExtensionRegistry so multiple parallel installs for the same
166
- * guardian (e.g. two Chrome profiles, two desktops) don't evict each
167
- * other on register/unregister. Undefined on older extension builds
168
- * — the registry synthesizes a connection-scoped fallback key in
169
- * that case for backwards-compatible single-instance semantics.
154
+ * the `x-client-instance-id` header). Allows multiple parallel installs
155
+ * for the same guardian (e.g. two Chrome profiles, two desktops) to
156
+ * coexist. Undefined on older extension builds.
170
157
  */
171
158
  clientInstanceId?: string;
172
159
  }
@@ -243,7 +230,7 @@ export class RuntimeHttpServer {
243
230
  this.liveVoiceSessionManager = new LiveVoiceSessionManager({
244
231
  createSession: (context) => createLiveVoiceSession(context),
245
232
  });
246
- this.router = new HttpRouter(this.buildRouteTable());
233
+ this.router = new HttpRouter();
247
234
  }
248
235
 
249
236
  /** The port the server is actually listening on (resolved after start). */
@@ -267,23 +254,6 @@ export class RuntimeHttpServer {
267
254
  websocket: {
268
255
  open: (ws) => {
269
256
  const data = ws.data as AllWebSocketData;
270
- if ("wsType" in data && data.wsType === "browser-relay") {
271
- // When the JWT sub resolved to a guardian principal at upgrade
272
- // time, register this connection with the chrome-extension
273
- // registry so host_browser_request frames can be routed to it.
274
- if (data.guardianId) {
275
- const now = Date.now();
276
- getChromeExtensionRegistry().register({
277
- id: data.connectionId,
278
- guardianId: data.guardianId,
279
- clientInstanceId: data.clientInstanceId,
280
- ws,
281
- connectedAt: now,
282
- lastActiveAt: now,
283
- });
284
- }
285
- return;
286
- }
287
257
  if ("wsType" in data && data.wsType === "media-stream") {
288
258
  const msData = data as MediaStreamWebSocketData;
289
259
  log.info(
@@ -499,11 +469,7 @@ export class RuntimeHttpServer {
499
469
  return;
500
470
  }
501
471
  case "keepalive": {
502
- // Extension keepalive frames refresh the connection's
503
- // activity timestamp without producing log noise or
504
- // altering routing semantics. Unknown extra keys on
505
- // the frame are silently ignored (lenient validation).
506
- getChromeExtensionRegistry().touch(data.connectionId);
472
+ // Extension keepalive acknowledged, no action needed.
507
473
  return;
508
474
  }
509
475
  default: {
@@ -564,15 +530,6 @@ export class RuntimeHttpServer {
564
530
  },
565
531
  close: (ws, code, reason) => {
566
532
  const data = ws.data as AllWebSocketData;
567
- if ("wsType" in data && data.wsType === "browser-relay") {
568
- // Always attempt to unregister — the registry uses connectionId
569
- // as the key and no-ops if the entry is absent (e.g. when the
570
- // connection was never registered because guardianId was
571
- // undefined, or when it was superseded by a newer registration
572
- // for the same guardian).
573
- getChromeExtensionRegistry().unregister(data.connectionId);
574
- return;
575
- }
576
533
  if ("wsType" in data && data.wsType === "media-stream") {
577
534
  const msData = data as MediaStreamWebSocketData;
578
535
  log.info(
@@ -661,14 +618,16 @@ export class RuntimeHttpServer {
661
618
  );
662
619
  }
663
620
 
664
- if (hasUngatedHttpAuthDisabled()) {
665
- log.warn(
666
- "DISABLE_HTTP_AUTH is set but VELLUM_UNSAFE_AUTH_BYPASS=1 is not — auth bypass is IGNORED and HTTP authentication remains enabled. Set VELLUM_UNSAFE_AUTH_BYPASS=1 to confirm the bypass.",
667
- );
668
- } else if (isHttpAuthDisabled()) {
669
- log.warn(
670
- "DISABLE_HTTP_AUTH is set — HTTP API authentication is DISABLED. All API endpoints are accessible without a bearer token. Do not use in production.",
671
- );
621
+ if (isHttpAuthDisabled()) {
622
+ if (getIsPlatform()) {
623
+ log.info(
624
+ "DISABLE_HTTP_AUTH is set — HTTP auth disabled (expected: platform handles auth)",
625
+ );
626
+ } else {
627
+ log.warn(
628
+ "DISABLE_HTTP_AUTH is set — HTTP API authentication is DISABLED. All API endpoints are accessible without a bearer token.",
629
+ );
630
+ }
672
631
  }
673
632
 
674
633
  log.info(
@@ -1058,9 +1017,7 @@ export class RuntimeHttpServer {
1058
1017
  guardianId = fallbackGuardianId;
1059
1018
  } else {
1060
1019
  // Fail closed: a service-token relay upgrade without a
1061
- // guardian context cannot be routed safely. Allowing the
1062
- // upgrade to proceed creates an unscoped socket that never
1063
- // registers in the ChromeExtensionRegistry.
1020
+ // guardian context cannot be routed safely.
1064
1021
  log.warn(
1065
1022
  {
1066
1023
  principalType: subResult.ok
@@ -1446,21 +1403,4 @@ export class RuntimeHttpServer {
1446
1403
 
1447
1404
  return null;
1448
1405
  }
1449
-
1450
- // ---------------------------------------------------------------------------
1451
- // Declarative route table
1452
- // ---------------------------------------------------------------------------
1453
-
1454
- /**
1455
- * Build the full set of route definitions. Routes are matched in order,
1456
- * so more specific patterns (e.g. `calls/:id/cancel`) must precede
1457
- * more general ones (e.g. `calls/:id`).
1458
- *
1459
- * Each domain's routes are defined in their own module under
1460
- * `./routes/` and composed here via spread. The composition order
1461
- * preserves the original top-to-bottom matching semantics.
1462
- */
1463
- private buildRouteTable(): HTTPRouteDefinition[] {
1464
- return [...routeDefinitionsToHTTPRoutes(ROUTES)];
1465
- }
1466
1406
  }
@@ -118,6 +118,8 @@ export interface RuntimeMessageConversationOptions {
118
118
  isInteractive?: boolean;
119
119
  /** Channel command intent metadata (e.g. Telegram /start). */
120
120
  commandIntent?: { type: string; payload?: string; languageCode?: string };
121
+ /** Slack-only non-persisted notice injected into the active model turn. */
122
+ slackRuntimeContextNotice?: string;
121
123
  /** Optional callback to receive real-time agent loop events (text deltas, tool starts, etc.). */
122
124
  onEvent?: (msg: ServerMessage) => void;
123
125
  /**
@@ -206,6 +208,9 @@ export interface RuntimeMessagePayload {
206
208
  riskLevel?: string;
207
209
  riskReason?: string;
208
210
  autoApproved?: boolean;
211
+ approvalMode?: string;
212
+ approvalReason?: string;
213
+ riskThreshold?: string;
209
214
  }>;
210
215
  interfaces?: string[];
211
216
  surfaces?: Array<{
@@ -46,7 +46,6 @@ export type {
46
46
  InteractiveUiRequest,
47
47
  InteractiveUiResult,
48
48
  } from "./interactive-ui-types.js";
49
- export { RESERVED_ACTION_IDS } from "./interactive-ui-types.js";
50
49
 
51
50
  const log = getLogger("interactive-ui");
52
51
 
@@ -12,26 +12,6 @@ export function isLoopbackHost(hostname: string): boolean {
12
12
  );
13
13
  }
14
14
 
15
- /**
16
- * Stricter loopback-only check: accepts only 127.0.0.0/8, ::1, and their
17
- * IPv4-mapped IPv6 forms (::ffff:127.x.x.x). Use this instead of
18
- * isPrivateAddress for endpoints that must be restricted to the local
19
- * machine in non-containerized deployments.
20
- */
21
- export function isLoopbackAddress(addr: string): boolean {
22
- const v4Mapped = addr.match(/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i);
23
- const normalized = v4Mapped ? v4Mapped[1] : addr;
24
-
25
- if (normalized.includes(".")) {
26
- const parts = normalized.split(".").map(Number);
27
- if (parts.length !== 4 || parts.some((p) => isNaN(p) || p < 0 || p > 255))
28
- return false;
29
- return parts[0] === 127;
30
- }
31
-
32
- return normalized.toLowerCase() === "::1";
33
- }
34
-
35
15
  /**
36
16
  * @internal Exported for testing.
37
17
  *
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Shared test helpers for vbundle v1 manifest fixture builders.
3
+ *
4
+ * Most tests don't care about the specific values of the assistant identity,
5
+ * origin, compatibility, or export-options blocks — they just need the
6
+ * builder/validator to accept their fixtures. Centralizing the defaults
7
+ * keeps every test from re-spelling the same six required option fields.
8
+ */
9
+
10
+ import { randomUUID } from "node:crypto";
11
+
12
+ import type {
13
+ BuildVBundleOptions,
14
+ VBundleAssistantInfo,
15
+ VBundleCompatibility,
16
+ VBundleExportOptions,
17
+ VBundleOriginInfo,
18
+ } from "../vbundle-builder.js";
19
+ import {
20
+ computeManifestChecksum,
21
+ type ManifestFileEntryType,
22
+ type ManifestType,
23
+ } from "../vbundle-validator.js";
24
+
25
+ export interface DefaultV1Options {
26
+ assistant: VBundleAssistantInfo;
27
+ origin: VBundleOriginInfo;
28
+ compatibility: VBundleCompatibility;
29
+ exportOptions: VBundleExportOptions;
30
+ secretsRedacted: boolean;
31
+ }
32
+
33
+ /**
34
+ * Sensible defaults for the six caller-required v1 manifest options.
35
+ *
36
+ * `secretsRedacted` defaults to false to match the runtime's typical
37
+ * "credentials included by design" path; tests that exercise the managed
38
+ * cross-field refine override `origin.mode` and `secretsRedacted` directly.
39
+ */
40
+ export function defaultV1Options(): DefaultV1Options {
41
+ return {
42
+ assistant: {
43
+ id: "self",
44
+ name: "Test",
45
+ runtime_version: "0.0.0-test",
46
+ },
47
+ origin: {
48
+ mode: "self-hosted-local",
49
+ },
50
+ compatibility: {
51
+ min_runtime_version: "0.0.0-test",
52
+ max_runtime_version: null,
53
+ },
54
+ exportOptions: {
55
+ include_logs: false,
56
+ include_browser_state: false,
57
+ include_memory_vectors: false,
58
+ },
59
+ secretsRedacted: false,
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Convenience: spread `defaultV1Options()` into a `BuildVBundleOptions`
65
+ * with the supplied `files`. Saves repeating the spread at every call site.
66
+ */
67
+ export function buildVBundleTestOptions(
68
+ files: BuildVBundleOptions["files"],
69
+ overrides: Partial<DefaultV1Options> = {},
70
+ ): BuildVBundleOptions {
71
+ return {
72
+ files,
73
+ ...defaultV1Options(),
74
+ ...overrides,
75
+ };
76
+ }
77
+
78
+ /**
79
+ * Build a v1 ManifestType for tests, mirroring buildManifestObject() in
80
+ * vbundle-builder.ts. Use this in test fixtures that need a synthetic
81
+ * manifest rather than calling buildVBundle (e.g. cross-version compat
82
+ * tests that need to mutate fields between emit and validate).
83
+ *
84
+ * Pass `overrides` to override any field after the defaults are applied —
85
+ * useful for negative-path tests that exercise specific schema rejections.
86
+ * `schema_version` is widened to `number` so negative tests can write 0/2/etc.
87
+ * The checksum is computed on the merged shape so overrides take effect.
88
+ */
89
+ export type BuildTestManifestOverrides = Partial<
90
+ Omit<ManifestType, "schema_version">
91
+ > & { schema_version?: number };
92
+
93
+ export function buildTestManifest(input: {
94
+ contents: ManifestFileEntryType[];
95
+ overrides?: BuildTestManifestOverrides;
96
+ }): ManifestType {
97
+ const base = defaultV1Options();
98
+ const merged = {
99
+ schema_version: 1,
100
+ bundle_id: randomUUID(),
101
+ created_at: new Date().toISOString(),
102
+ assistant: base.assistant,
103
+ origin: base.origin,
104
+ compatibility: base.compatibility,
105
+ contents: input.contents,
106
+ checksum: "",
107
+ secrets_redacted: base.secretsRedacted,
108
+ export_options: base.exportOptions,
109
+ ...(input.overrides ?? {}),
110
+ } as ManifestType;
111
+ return { ...merged, checksum: computeManifestChecksum(merged) };
112
+ }