@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
@@ -11,18 +11,14 @@
11
11
  * no token refresh or recovery is attempted.
12
12
  */
13
13
 
14
- import {
15
- isTokenExpired,
16
- oauthConnectionAccessTokenPath,
17
- } from "@vellumai/credential-storage";
14
+ import { isTokenExpired } from "@vellumai/credential-storage";
18
15
 
19
- import { manualTokenAccessCredentialKey } from "../oauth/manual-token-connection.js";
16
+ import { getConnectionAccessTokenResult } from "../oauth/credential-token-resolver.js";
20
17
  import {
21
18
  getProvider,
22
19
  listActiveConnectionsByProvider,
23
20
  listProviders,
24
21
  } from "../oauth/oauth-store.js";
25
- import { getSecureKeyAsync } from "../security/secure-keys.js";
26
22
  import { getLogger } from "../util/logger.js";
27
23
 
28
24
  const log = getLogger("credential-health");
@@ -40,6 +36,7 @@ export type CredentialHealthStatus =
40
36
  | "expiring"
41
37
  | "expired"
42
38
  | "missing_token"
39
+ | "unreachable"
43
40
  | "missing_scopes"
44
41
  | "revoked"
45
42
  | "ping_failed";
@@ -165,16 +162,23 @@ async function checkConnection(
165
162
  missingScopes: [] as string[],
166
163
  };
167
164
 
168
- // 1. Check token presence. Manual-token providers (e.g. slack_channel,
169
- // telegram) store their primary token under credential/<provider>/<field>
170
- // rather than oauth_connection/<id>/access_token, so resolve the correct
171
- // path before looking up the token otherwise the lookup always returns
172
- // null and marks these providers as "missing_token".
173
- const tokenPath =
174
- manualTokenAccessCredentialKey(provider) ??
175
- oauthConnectionAccessTokenPath(connectionId);
176
- const token = await getSecureKeyAsync(tokenPath);
177
- if (!token) {
165
+ // 1. Check token presence via the centralized resolver. Manual-token
166
+ // providers (e.g. slack_channel, telegram) store their primary token at
167
+ // credential/<provider>/<field> rather than oauth_connection/<id>/access_token;
168
+ // the resolver handles the mapping automatically.
169
+ const tokenResult = await getConnectionAccessTokenResult({
170
+ provider,
171
+ connectionId,
172
+ });
173
+ if (!tokenResult.value) {
174
+ if (tokenResult.unreachable) {
175
+ return {
176
+ ...base,
177
+ status: "unreachable",
178
+ details: `Credential backend is temporarily unreachable for ${provider}. Token status unknown.`,
179
+ canAutoRecover: true,
180
+ };
181
+ }
178
182
  return {
179
183
  ...base,
180
184
  status: "missing_token",
@@ -182,6 +186,7 @@ async function checkConnection(
182
186
  canAutoRecover: false,
183
187
  };
184
188
  }
189
+ const token = tokenResult.value;
185
190
 
186
191
  // 2. Check token expiry
187
192
  if (isTokenExpired(expiresAt)) {
@@ -45,10 +45,9 @@ mock.module("../../runtime/assistant-event.js", () => ({
45
45
  // Pass-through so `focus` / `conversationId` can be asserted directly
46
46
  // on the captured event's `message` payload.
47
47
  buildAssistantEvent: (
48
- assistantId: string,
49
48
  message: unknown,
50
49
  conversationId?: string,
51
- ) => ({ assistantId, message, conversationId }),
50
+ ) => ({ message, conversationId }),
52
51
  }));
53
52
 
54
53
  // Stub DB helpers so the real `launchConversation` can run without a DB.
@@ -76,12 +75,55 @@ mock.module("../../memory/conversation-crud.js", () => ({
76
75
  },
77
76
  }));
78
77
 
78
+ // Stub conversation-store so the real `launchConversation` can hydrate
79
+ // a fake Conversation without touching the real map.
80
+ let trustContextOnConversation: unknown | null = null;
81
+ const fakeConversation = {
82
+ setTrustContext: (c: unknown) => {
83
+ trustContextOnConversation = c;
84
+ },
85
+ };
86
+ const getOrCreateConversationCalls: string[] = [];
87
+ const realConvStore = await import("../conversation-store.js");
88
+ mock.module("../conversation-store.js", () => ({
89
+ ...realConvStore,
90
+ getOrCreateConversation: async (id: string) => {
91
+ getOrCreateConversationCalls.push(id);
92
+ return fakeConversation as never;
93
+ },
94
+ }));
95
+
96
+ // Stub processMessageInBackground so the seed turn is controllable.
97
+ const processMessageCalls: Array<{
98
+ conversationId: string;
99
+ content: string;
100
+ }> = [];
101
+ let resolveProcess = () => {};
102
+ let rejectProcess: (err: Error) => void = () => {};
103
+ let markProcessStarted = () => {};
104
+ let processStartedPromise = new Promise<void>((resolve) => {
105
+ markProcessStarted = resolve;
106
+ });
107
+ const realProcessMessage = await import("../process-message.js");
108
+ mock.module("../process-message.js", () => ({
109
+ ...realProcessMessage,
110
+ processMessageInBackground: (
111
+ conversationId: string,
112
+ content: string,
113
+ ) => {
114
+ processMessageCalls.push({ conversationId, content });
115
+ markProcessStarted();
116
+ return new Promise((resolve, reject) => {
117
+ resolveProcess = () => resolve({ messageId: "msg-1" });
118
+ rejectProcess = (err) => reject(err);
119
+ });
120
+ },
121
+ }));
122
+
79
123
  // Dynamic imports after mock.module calls so the stubs take effect
80
124
  // before the modules under test are loaded.
81
125
  const { createSurfaceMutex, handleSurfaceAction } =
82
126
  await import("../conversation-surfaces.js");
83
- const { registerLaunchConversationDeps, resetLaunchConversationDeps } =
84
- await import("../conversation-launch.js");
85
127
  type SurfaceConversationContext =
86
128
  import("../conversation-surfaces.js").SurfaceConversationContext;
87
129
  type TrustContext = import("../trust-context.js").TrustContext;
@@ -89,60 +131,17 @@ type ServerMessage = import("../message-protocol.js").ServerMessage;
89
131
  type SurfaceData = import("../message-protocol.js").SurfaceData;
90
132
  type SurfaceType = import("../message-protocol.js").SurfaceType;
91
133
 
92
- // ── launchConversation deps harness ────────────────────────────────
134
+ // ── Harness reset helper ───────────────────────────────────────────
93
135
 
94
- interface DepsHarness {
95
- getOrCreateCalls: Array<string>;
96
- processCalls: Array<{ conversationId: string; content: string }>;
97
- lastTrustContext(): unknown | null;
98
- resolveProcess: () => void;
99
- rejectProcess: (err: Error) => void;
100
- /** Resolves once `persistAndProcessMessage` has actually been invoked. */
101
- processStarted: Promise<void>;
102
- }
103
-
104
- function setupLaunchDeps(): DepsHarness {
105
- const getOrCreateCalls: Array<string> = [];
106
- const processCalls: Array<{ conversationId: string; content: string }> = [];
107
- let trustContextOnConversation: unknown | null = null;
108
- let resolveProcess = () => {};
109
- let rejectProcess: (err: Error) => void = () => {};
110
- let markProcessStarted = () => {};
111
- const processStarted = new Promise<void>((resolve) => {
136
+ function resetProcessHarness(): void {
137
+ processMessageCalls.length = 0;
138
+ getOrCreateConversationCalls.length = 0;
139
+ trustContextOnConversation = null;
140
+ resolveProcess = () => {};
141
+ rejectProcess = () => {};
142
+ processStartedPromise = new Promise<void>((resolve) => {
112
143
  markProcessStarted = resolve;
113
144
  });
114
-
115
- const fakeConversation = {
116
- setTrustContext: (c: unknown) => {
117
- trustContextOnConversation = c;
118
- },
119
- };
120
-
121
- registerLaunchConversationDeps({
122
- getOrCreateConversation: async (id: string) => {
123
- getOrCreateCalls.push(id);
124
- return fakeConversation as never;
125
- },
126
- persistAndProcessMessage: (conversationId: string, content: string) => {
127
- processCalls.push({ conversationId, content });
128
- markProcessStarted();
129
- return new Promise((resolve, reject) => {
130
- resolveProcess = () => resolve({ messageId: "msg-1" });
131
- rejectProcess = (err) => reject(err);
132
- });
133
- },
134
- publishAssistantEvent: () => {},
135
- getAssistantId: () => "assistant-test-id",
136
- });
137
-
138
- return {
139
- getOrCreateCalls,
140
- processCalls,
141
- lastTrustContext: () => trustContextOnConversation,
142
- resolveProcess: () => resolveProcess(),
143
- rejectProcess: (err: Error) => rejectProcess(err),
144
- processStarted,
145
- };
146
145
  }
147
146
 
148
147
  // ── Surface-context harness ────────────────────────────────────────
@@ -216,7 +215,6 @@ function registerCardSurface(
216
215
  // Helper: filter captured publish calls down to `open_conversation`
217
216
  // events. Typed so assertions can reach the inner `message` payload.
218
217
  function openConversationEvents(): Array<{
219
- assistantId: string;
220
218
  conversationId?: string;
221
219
  message: {
222
220
  type: "open_conversation";
@@ -234,7 +232,6 @@ function openConversationEvents(): Array<{
234
232
  .map(
235
233
  (e) =>
236
234
  e as unknown as {
237
- assistantId: string;
238
235
  conversationId?: string;
239
236
  message: {
240
237
  type: "open_conversation";
@@ -254,16 +251,12 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
254
251
  publishCalls.length = 0;
255
252
  updateTitleCalls.length = 0;
256
253
  nextKeyStoreResult = { conversationId: "conv-new" };
257
- // Reset module-level `_deps` so a test that forgets to call
258
- // `setupLaunchDeps()` cannot accidentally piggy-back on deps left
259
- // registered by a previous test. Each test that exercises the launch
260
- // helper must call `setupLaunchDeps()` explicitly.
261
- resetLaunchConversationDeps();
254
+ resetProcessHarness();
262
255
  });
263
256
 
264
257
  test("launches new conversation with inherited trust context and no chat message", async () => {
265
258
  nextKeyStoreResult = { conversationId: "conv-launched-1" };
266
- const harness = setupLaunchDeps();
259
+
267
260
  const originTrustContext: TrustContext = {
268
261
  sourceChannel: "vellum",
269
262
  trustClass: "guardian",
@@ -295,14 +288,14 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
295
288
  expect(openEvents[0].message.title).toBe("New Thread");
296
289
 
297
290
  // 3. The spawned conversation inherited the origin's trust context.
298
- expect(harness.lastTrustContext()).toEqual(originTrustContext);
291
+ expect(trustContextOnConversation).toEqual(originTrustContext);
299
292
 
300
293
  // 4. Seed turn was kicked off fire-and-forget — resolve it to clean
301
294
  // up the pending promise the harness stubbed.
302
- await harness.processStarted;
303
- expect(harness.processCalls).toHaveLength(1);
304
- expect(harness.processCalls[0].content).toBe("S");
305
- harness.resolveProcess();
295
+ await processStartedPromise;
296
+ expect(processMessageCalls).toHaveLength(1);
297
+ expect(processMessageCalls[0].content).toBe("S");
298
+ resolveProcess();
306
299
 
307
300
  // 5. No chat message side effect on the origin conversation — neither
308
301
  // the LLM pipeline nor the `[User action on app: ...]` text echo.
@@ -358,7 +351,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
358
351
 
359
352
  test("omits originTrustContext when origin conversation has none", async () => {
360
353
  nextKeyStoreResult = { conversationId: "conv-launched-3" };
361
- const harness = setupLaunchDeps();
354
+
362
355
  // No `trustContext` on the origin context — simulating the
363
356
  // no-inherited-guardian path.
364
357
  const ctx = makeContext();
@@ -376,20 +369,20 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
376
369
  });
377
370
 
378
371
  // Trust context was never applied to the spawned conversation.
379
- expect(harness.lastTrustContext()).toBeNull();
372
+ expect(trustContextOnConversation).toBeNull();
380
373
 
381
374
  // Still exactly one open_conversation event with focus: false.
382
375
  const openEvents = openConversationEvents();
383
376
  expect(openEvents).toHaveLength(1);
384
377
  expect(openEvents[0].message.focus).toBe(false);
385
378
 
386
- await harness.processStarted;
387
- harness.resolveProcess();
379
+ await processStartedPromise;
380
+ resolveProcess();
388
381
  });
389
382
 
390
383
  test("handler returns before the seed turn resolves (fire-and-forget)", async () => {
391
384
  nextKeyStoreResult = { conversationId: "conv-nonblocking" };
392
- const harness = setupLaunchDeps();
385
+
393
386
  const ctx = makeContext();
394
387
  registerCardSurface(ctx, "surface-4");
395
388
 
@@ -413,14 +406,14 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
413
406
  // Seed turn is in-flight but not yet resolved. Prove the helper
414
407
  // actually invoked it (so we know fire-and-forget is wired), then
415
408
  // resolve it to clean up.
416
- await harness.processStarted;
417
- expect(harness.processCalls).toHaveLength(1);
418
- harness.resolveProcess();
409
+ await processStartedPromise;
410
+ expect(processMessageCalls).toHaveLength(1);
411
+ resolveProcess();
419
412
  });
420
413
 
421
414
  test("seed turn rejection is swallowed by the helper's .catch()", async () => {
422
415
  nextKeyStoreResult = { conversationId: "conv-seed-fails" };
423
- const harness = setupLaunchDeps();
416
+
424
417
  const ctx = makeContext();
425
418
  registerCardSurface(ctx, "surface-5");
426
419
 
@@ -438,8 +431,8 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
438
431
  // Reject the pending seed turn — the helper's `.catch()` handler
439
432
  // must swallow it. If it didn't, Bun would surface the unhandled
440
433
  // rejection at test-end and this test would fail.
441
- await harness.processStarted;
442
- harness.rejectProcess(new Error("seed-turn-failed"));
434
+ await processStartedPromise;
435
+ rejectProcess(new Error("seed-turn-failed"));
443
436
  // Give the microtask queue a tick so the `.catch()` runs before
444
437
  // the test completes.
445
438
  await Promise.resolve();
@@ -456,7 +449,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
456
449
  // message and triggering a full LLM round-trip on every click. The plan
457
450
  // claimed to eliminate that round-trip; this test enforces it.
458
451
  nextKeyStoreResult = { conversationId: "conv-pending-set" };
459
- const harness = setupLaunchDeps();
452
+
460
453
  const ctx = makeContext();
461
454
  registerCardSurface(ctx, "surface-pending");
462
455
  // Simulate `ui_show` having stamped a pending entry for this surface
@@ -491,7 +484,7 @@ describe("handleSurfaceAction — launch_conversation dispatch", () => {
491
484
  // persistent card aren't blocked behind a stale "owes-an-answer" flag.
492
485
  expect(ctx.pendingSurfaceActions.has("surface-pending")).toBe(false);
493
486
 
494
- await harness.processStarted;
495
- harness.resolveProcess();
487
+ await processStartedPromise;
488
+ resolveProcess();
496
489
  });
497
490
  });
@@ -110,13 +110,8 @@ mock.module("../../runtime/assistant-event-hub.js", () => ({
110
110
  }));
111
111
 
112
112
  mock.module("../../runtime/assistant-event.js", () => ({
113
- buildAssistantEvent: (
114
- assistantId: string,
115
- message: unknown,
116
- conversationId?: string,
117
- ) => ({
113
+ buildAssistantEvent: (message: unknown, conversationId?: string) => ({
118
114
  id: "evt-1",
119
- assistantId,
120
115
  conversationId,
121
116
  emittedAt: "2024-01-01T00:00:00.000Z",
122
117
  message,
@@ -195,7 +190,6 @@ describe("createDaemonSkillHost", () => {
195
190
 
196
191
  test("identity normalizes a null assistant name to undefined", () => {
197
192
  expect(host.identity.getAssistantName()).toBeUndefined();
198
- expect(host.identity.internalAssistantId).toBe("self");
199
193
  });
200
194
 
201
195
  test("platform methods return the stubbed values", () => {
@@ -243,11 +237,10 @@ describe("createDaemonSkillHost", () => {
243
237
 
244
238
  test("events.publish, subscribe, and buildEvent plumb through the hub", async () => {
245
239
  const evt = host.events.buildEvent({ type: "ping" }, "c1");
246
- expect(evt.assistantId).toBe("self");
247
240
  expect(evt.conversationId).toBe("c1");
248
241
  await host.events.publish(evt);
249
242
  expect(publishSpy).toHaveBeenCalled();
250
- const sub = host.events.subscribe({ assistantId: "self" }, () => undefined);
243
+ const sub = host.events.subscribe({}, () => undefined);
251
244
  expect(sub.active).toBe(true);
252
245
  expect(subscribeSpy).toHaveBeenCalled();
253
246
  });
@@ -1,32 +1,7 @@
1
1
  /**
2
- * Connection policy helpers for daemon autostart and authentication behavior.
3
- *
4
- * Token authentication is always required.
5
- * To explicitly disable auth (e.g. development/testing scenarios),
6
- * set VELLUM_DAEMON_NOAUTH=1 on both the daemon and the client.
7
- * This is an intentional opt-in to an unsafe mode — never enable it
8
- * on connections accessible to untrusted users.
2
+ * Connection policy helpers for daemon autostart behavior.
9
3
  */
10
4
 
11
- /**
12
- * True when the user has explicitly opted into unauthenticated connections
13
- * via VELLUM_DAEMON_NOAUTH=1.
14
- *
15
- * Requires VELLUM_UNSAFE_AUTH_BYPASS=1 as a safety gate to prevent
16
- * accidental production use.
17
- */
18
- export function hasNoAuthOverride(
19
- env: Record<string, string | undefined> = process.env,
20
- ): boolean {
21
- const value = env.VELLUM_DAEMON_NOAUTH?.trim();
22
- if (value !== "1" && value !== "true") return false;
23
-
24
- const safetyGate = env.VELLUM_UNSAFE_AUTH_BYPASS?.trim();
25
- if (safetyGate !== "1") return false;
26
-
27
- return true;
28
- }
29
-
30
5
  export function shouldAutoStartDaemon(
31
6
  env: Record<string, string | undefined> = process.env,
32
7
  ): boolean {
@@ -26,6 +26,7 @@ import {
26
26
  recordRequestLog,
27
27
  } from "../memory/llm-request-log-store.js";
28
28
  import { backfillMemoryRecallLogMessageId } from "../memory/memory-recall-log-store.js";
29
+ import { backfillMemoryV2ActivationMessageId } from "../memory/memory-v2-activation-log-store.js";
29
30
  import { getThreadTs } from "../memory/slack-thread-store.js";
30
31
  import {
31
32
  type SlackMessageMetadata,
@@ -158,7 +159,15 @@ export interface EventHandlerState {
158
159
  /** Stores risk metadata keyed by tool_use_id (populated in handleToolResult). */
159
160
  readonly toolRiskOutcomes: Map<
160
161
  string,
161
- { riskLevel: string; riskReason?: string; autoApproved: boolean }
162
+ {
163
+ riskLevel: string;
164
+ riskReason?: string;
165
+ autoApproved: boolean;
166
+ matchedTrustRuleId?: string;
167
+ approvalMode?: string;
168
+ approvalReason?: string;
169
+ riskThreshold?: string;
170
+ }
162
171
  >;
163
172
  /** tool_use_ids emitted in the current turn (populated in handleToolUse, cleared after annotation). */
164
173
  currentTurnToolUseIds: string[];
@@ -224,20 +233,31 @@ export function createEventHandlerState(): EventHandlerState {
224
233
 
225
234
  // ── Shared Helper ────────────────────────────────────────────────────
226
235
 
236
+ // providerNameOverride should be supplied when the caller already knows the
237
+ // resolved provider name (e.g. handleUsage, which has event.actualProvider).
238
+ // When called during streaming (text_delta / thinking_delta) the override is
239
+ // omitted and provider.name is used — the CallSiteRoutingProvider getter
240
+ // returns the active transport name during sendMessage, so they agree.
241
+ // Passing the override from handleUsage guarantees started/finished never
242
+ // disagree even for tool-call-only responses where text_delta never fires
243
+ // (and therefore the started event would otherwise fall back here *after*
244
+ // the AsyncLocalStorage context in CallSiteRoutingProvider has already exited).
227
245
  function emitLlmCallStartedIfNeeded(
228
246
  state: EventHandlerState,
229
247
  deps: EventHandlerDeps,
248
+ providerNameOverride?: string,
230
249
  ): void {
231
250
  if (state.llmCallStartedEmitted) return;
232
251
  state.llmCallStartedEmitted = true;
252
+ const providerName = providerNameOverride ?? deps.ctx.provider.name;
233
253
  deps.ctx.traceEmitter.emit(
234
254
  "llm_call_started",
235
- `LLM call to ${deps.ctx.provider.name}`,
255
+ `LLM call to ${providerName}`,
236
256
  {
237
257
  requestId: deps.reqId,
238
258
  status: "info",
239
259
  attributes: {
240
- provider: deps.ctx.provider.name,
260
+ provider: providerName,
241
261
  model: state.model || "unknown",
242
262
  },
243
263
  },
@@ -290,6 +310,7 @@ function handleTextDelta(
290
310
  "first_text_delta",
291
311
  "assistant_turn",
292
312
  deps.reqId,
313
+ "Thinking",
293
314
  );
294
315
  }
295
316
  deps.onEvent({
@@ -522,6 +543,10 @@ export function handleToolResult(
522
543
  riskLevel: event.riskLevel,
523
544
  riskReason: event.riskReason,
524
545
  autoApproved: !state.toolConfirmationOutcomes.has(event.toolUseId),
546
+ matchedTrustRuleId: event.matchedTrustRuleId,
547
+ approvalMode: event.approvalMode,
548
+ approvalReason: event.approvalReason,
549
+ riskThreshold: event.riskThreshold,
525
550
  });
526
551
  }
527
552
 
@@ -598,9 +623,13 @@ export function handleToolResult(
598
623
  toolUseId: event.toolUseId,
599
624
  riskLevel: event.riskLevel,
600
625
  riskReason: event.riskReason,
626
+ matchedTrustRuleId: event.matchedTrustRuleId,
601
627
  isContainerized: event.isContainerized,
602
628
  riskScopeOptions: event.riskScopeOptions,
603
629
  riskDirectoryScopeOptions: event.riskDirectoryScopeOptions,
630
+ approvalMode: event.approvalMode,
631
+ approvalReason: event.approvalReason,
632
+ riskThreshold: event.riskThreshold,
604
633
  });
605
634
  }
606
635
 
@@ -653,6 +682,11 @@ function annotatePersistedAssistantMessage(
653
682
  rec._riskLevel = risk.riskLevel;
654
683
  if (risk.riskReason) rec._riskReason = risk.riskReason;
655
684
  rec._autoApproved = risk.autoApproved;
685
+ if (risk.matchedTrustRuleId)
686
+ rec._matchedTrustRuleId = risk.matchedTrustRuleId;
687
+ if (risk.approvalMode) rec._approvalMode = risk.approvalMode;
688
+ if (risk.approvalReason) rec._approvalReason = risk.approvalReason;
689
+ if (risk.riskThreshold) rec._riskThreshold = risk.riskThreshold;
656
690
  modified = true;
657
691
  }
658
692
  }
@@ -937,6 +971,18 @@ export async function handleMessageComplete(
937
971
  );
938
972
  }
939
973
 
974
+ try {
975
+ backfillMemoryV2ActivationMessageId(
976
+ deps.ctx.conversationId,
977
+ assistantMsg.id,
978
+ );
979
+ } catch (err) {
980
+ deps.rlog.warn(
981
+ { err },
982
+ "Failed to backfill memory v2 activation log messageId (non-fatal)",
983
+ );
984
+ }
985
+
940
986
  deps.ctx.currentTurnSurfaces = [];
941
987
 
942
988
  // Emit trace event
@@ -1018,7 +1064,9 @@ function handleUsage(
1018
1064
  }
1019
1065
  }
1020
1066
 
1021
- emitLlmCallStartedIfNeeded(state, deps);
1067
+ // Pass providerName so that if text_delta never fired (tool-call-only
1068
+ // responses), the started event uses the same resolved name as finished.
1069
+ emitLlmCallStartedIfNeeded(state, deps, providerName);
1022
1070
 
1023
1071
  deps.ctx.traceEmitter.emit(
1024
1072
  "llm_call_finished",
@@ -1096,6 +1144,7 @@ export async function dispatchAgentEvent(
1096
1144
  "tool_result_received",
1097
1145
  "assistant_turn",
1098
1146
  deps.reqId,
1147
+ "Thinking",
1099
1148
  );
1100
1149
 
1101
1150
  // Format web search results into a human-readable string for the client.