@vellumai/assistant 0.6.2 → 0.6.3

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 (396) hide show
  1. package/bun.lock +40 -40
  2. package/bunfig.toml +3 -0
  3. package/docs/architecture/memory.md +1 -1
  4. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
  5. package/openapi.yaml +184 -69
  6. package/package.json +41 -41
  7. package/scripts/generate-openapi.ts +1 -2
  8. package/src/__tests__/acp-session.test.ts +43 -0
  9. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
  10. package/src/__tests__/app-executors.test.ts +1 -0
  11. package/src/__tests__/app-source-watcher.test.ts +37 -11
  12. package/src/__tests__/approval-routes-http.test.ts +178 -1
  13. package/src/__tests__/browser-fill-credential.test.ts +229 -94
  14. package/src/__tests__/browser-manager.test.ts +40 -27
  15. package/src/__tests__/catalog-files.test.ts +862 -0
  16. package/src/__tests__/channel-approvals.test.ts +53 -0
  17. package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
  18. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  19. package/src/__tests__/config-schema.test.ts +125 -48
  20. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
  21. package/src/__tests__/context-overflow-approval.test.ts +16 -1
  22. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -1
  23. package/src/__tests__/conversation-agent-loop.test.ts +1 -1
  24. package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
  25. package/src/__tests__/conversation-attachments.test.ts +80 -4
  26. package/src/__tests__/conversation-confirmation-signals.test.ts +155 -0
  27. package/src/__tests__/conversation-fork-crud.test.ts +17 -0
  28. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  29. package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
  30. package/src/__tests__/conversation-inject-context.test.ts +103 -0
  31. package/src/__tests__/conversation-queue.test.ts +45 -2
  32. package/src/__tests__/conversation-routes-disk-view.test.ts +5 -0
  33. package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
  34. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  35. package/src/__tests__/conversation-runtime-assembly.test.ts +269 -46
  36. package/src/__tests__/conversation-starter-routes.test.ts +126 -0
  37. package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
  38. package/src/__tests__/conversation-store.test.ts +195 -0
  39. package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
  40. package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
  41. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  42. package/src/__tests__/credential-vault-unit.test.ts +4 -4
  43. package/src/__tests__/credential-vault.test.ts +152 -13
  44. package/src/__tests__/credentials-cli.test.ts +2 -2
  45. package/src/__tests__/date-context.test.ts +4 -4
  46. package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
  47. package/src/__tests__/extension-id-sync-guard.test.ts +155 -0
  48. package/src/__tests__/fixtures/mock-chrome-extension.ts +375 -0
  49. package/src/__tests__/gateway-only-guard.test.ts +3 -0
  50. package/src/__tests__/gemini-provider.test.ts +2 -2
  51. package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
  52. package/src/__tests__/headless-browser-interactions.test.ts +707 -371
  53. package/src/__tests__/headless-browser-navigate.test.ts +389 -47
  54. package/src/__tests__/headless-browser-read-tools.test.ts +266 -103
  55. package/src/__tests__/headless-browser-snapshot.test.ts +240 -77
  56. package/src/__tests__/host-bash-proxy.test.ts +150 -1
  57. package/src/__tests__/host-browser-e2e-cloud.test.ts +462 -0
  58. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
  59. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
  60. package/src/__tests__/host-browser-event-routes.test.ts +350 -0
  61. package/src/__tests__/host-browser-proxy.test.ts +444 -0
  62. package/src/__tests__/host-browser-routes.test.ts +198 -0
  63. package/src/__tests__/host-browser-ws-events-e2e.test.ts +320 -0
  64. package/src/__tests__/host-cu-proxy.test.ts +171 -1
  65. package/src/__tests__/host-file-proxy.test.ts +185 -1
  66. package/src/__tests__/host-file-read-tool.test.ts +52 -0
  67. package/src/__tests__/host-proxy-interface.test.ts +165 -0
  68. package/src/__tests__/host-shell-tool.test.ts +1 -11
  69. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  70. package/src/__tests__/integration-status.test.ts +6 -7
  71. package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
  72. package/src/__tests__/mcp-client-auth.test.ts +40 -4
  73. package/src/__tests__/mcp-health-check.test.ts +10 -3
  74. package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
  75. package/src/__tests__/migration-export-http.test.ts +61 -2
  76. package/src/__tests__/migration-export-streaming.test.ts +66 -0
  77. package/src/__tests__/migration-import-commit-http.test.ts +101 -1
  78. package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
  79. package/src/__tests__/oauth-apps-routes.test.ts +17 -12
  80. package/src/__tests__/oauth-cli.test.ts +707 -60
  81. package/src/__tests__/oauth-connect-orchestrator.test.ts +116 -24
  82. package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
  83. package/src/__tests__/oauth-provider-serializer.test.ts +146 -10
  84. package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
  85. package/src/__tests__/oauth-providers-routes.test.ts +50 -14
  86. package/src/__tests__/oauth-store.test.ts +1386 -182
  87. package/src/__tests__/oauth2-gateway-transport.test.ts +211 -20
  88. package/src/__tests__/onboarding-template-contract.test.ts +75 -57
  89. package/src/__tests__/openai-provider.test.ts +2 -2
  90. package/src/__tests__/outlook-categories.test.ts +1 -1
  91. package/src/__tests__/outlook-client-automation.test.ts +1 -1
  92. package/src/__tests__/outlook-compose-tools.test.ts +1 -1
  93. package/src/__tests__/outlook-email-watcher.test.ts +1 -1
  94. package/src/__tests__/outlook-follow-up.test.ts +1 -1
  95. package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
  96. package/src/__tests__/outlook-trash.test.ts +1 -1
  97. package/src/__tests__/outlook-unsubscribe.test.ts +1 -1
  98. package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
  99. package/src/__tests__/permission-mode.test.ts +28 -56
  100. package/src/__tests__/platform-callback-registration.test.ts +19 -0
  101. package/src/__tests__/post-turn-tool-result-truncation.test.ts +296 -0
  102. package/src/__tests__/proxy-approval-callback.test.ts +18 -0
  103. package/src/__tests__/require-fresh-approval.test.ts +40 -1
  104. package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
  105. package/src/__tests__/schedule-routes.test.ts +162 -0
  106. package/src/__tests__/secret-detection-handler.test.ts +84 -0
  107. package/src/__tests__/secret-ingress-http.test.ts +1 -0
  108. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  109. package/src/__tests__/set-permission-mode.test.ts +13 -250
  110. package/src/__tests__/skills-file-content-endpoint.test.ts +670 -0
  111. package/src/__tests__/skills-files-catalog-fallback.test.ts +450 -0
  112. package/src/__tests__/slack-channel-config.test.ts +12 -15
  113. package/src/__tests__/subagent-detail.test.ts +44 -2
  114. package/src/__tests__/subagent-disposal.test.ts +1 -0
  115. package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
  116. package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
  117. package/src/__tests__/subagent-manager-notify.test.ts +1 -0
  118. package/src/__tests__/subagent-notify-parent.test.ts +1 -0
  119. package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
  120. package/src/__tests__/subagent-tools.test.ts +1 -0
  121. package/src/__tests__/subagent-types.test.ts +1 -0
  122. package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
  123. package/src/__tests__/system-prompt.test.ts +72 -1
  124. package/src/__tests__/task-scheduler.test.ts +32 -6
  125. package/src/__tests__/telegram-config.test.ts +10 -13
  126. package/src/__tests__/terminal-tools.test.ts +9 -0
  127. package/src/__tests__/tool-approval-handler.test.ts +73 -0
  128. package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
  129. package/src/__tests__/top-level-renderer.test.ts +73 -1
  130. package/src/__tests__/transport-hints-queue.test.ts +14 -29
  131. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
  132. package/src/__tests__/v2-consent-policy.test.ts +103 -0
  133. package/src/acp/client-handler.ts +30 -4
  134. package/src/agent/loop.ts +12 -6
  135. package/src/approvals/guardian-request-resolvers.ts +21 -15
  136. package/src/browser-session/__tests__/manager.test.ts +297 -0
  137. package/src/browser-session/backends/cdp-inspect.ts +30 -0
  138. package/src/browser-session/backends/extension.ts +26 -0
  139. package/src/browser-session/backends/local.ts +24 -0
  140. package/src/browser-session/events.ts +164 -0
  141. package/src/browser-session/index.ts +27 -0
  142. package/src/browser-session/manager.ts +159 -0
  143. package/src/browser-session/types.ts +28 -0
  144. package/src/channels/__tests__/types.test.ts +134 -0
  145. package/src/channels/types.ts +53 -3
  146. package/src/cli/commands/browser-relay.ts +339 -409
  147. package/src/cli/commands/credentials.ts +3 -3
  148. package/src/cli/commands/email.ts +18 -13
  149. package/src/cli/commands/mcp.ts +16 -4
  150. package/src/cli/commands/oauth/__tests__/connect.test.ts +44 -44
  151. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
  152. package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
  153. package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
  154. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +31 -33
  155. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +329 -0
  156. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +116 -12
  157. package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
  158. package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
  159. package/src/cli/commands/oauth/apps.ts +7 -4
  160. package/src/cli/commands/oauth/connect.ts +6 -3
  161. package/src/cli/commands/oauth/disconnect.ts +1 -1
  162. package/src/cli/commands/oauth/providers.ts +200 -36
  163. package/src/cli/commands/oauth/shared.ts +5 -5
  164. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +259 -0
  165. package/src/cli/commands/platform/index.ts +107 -10
  166. package/src/cli/commands/usage.ts +10 -9
  167. package/src/cli/lib/daemon-credential-client.ts +4 -0
  168. package/src/cli/program.ts +1 -1
  169. package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
  170. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +105 -0
  171. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
  172. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
  173. package/src/config/bundled-skills/contacts/SKILL.md +3 -0
  174. package/src/config/bundled-skills/document/SKILL.md +4 -0
  175. package/src/config/bundled-skills/gmail/SKILL.md +1 -1
  176. package/src/config/bundled-skills/outlook/SKILL.md +7 -0
  177. package/src/config/bundled-skills/subagent/SKILL.md +21 -0
  178. package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
  179. package/src/config/bundled-skills/tasks/SKILL.md +5 -0
  180. package/src/config/env-registry.ts +14 -0
  181. package/src/config/env.ts +21 -0
  182. package/src/config/feature-flag-registry.json +44 -5
  183. package/src/config/loader.ts +56 -1
  184. package/src/config/sanitize-for-transfer.ts +47 -0
  185. package/src/config/schema.ts +46 -5
  186. package/src/config/schemas/host-browser.ts +66 -0
  187. package/src/config/schemas/memory-lifecycle.ts +1 -1
  188. package/src/config/schemas/memory-retrieval.ts +103 -0
  189. package/src/config/schemas/security.ts +0 -6
  190. package/src/config/schemas/services.ts +8 -0
  191. package/src/config/types.ts +0 -1
  192. package/src/context/post-turn-tool-result-truncation.ts +176 -0
  193. package/src/context/window-manager.ts +19 -1
  194. package/src/credential-execution/approval-bridge.ts +49 -15
  195. package/src/daemon/__tests__/conversation-tool-setup.test.ts +186 -0
  196. package/src/daemon/app-source-watcher.ts +35 -0
  197. package/src/daemon/context-overflow-approval.ts +5 -0
  198. package/src/daemon/conversation-agent-loop-handlers.ts +17 -2
  199. package/src/daemon/conversation-agent-loop.ts +58 -24
  200. package/src/daemon/conversation-attachments.ts +40 -0
  201. package/src/daemon/conversation-process.ts +48 -1
  202. package/src/daemon/conversation-runtime-assembly.ts +118 -36
  203. package/src/daemon/conversation-surfaces.ts +37 -36
  204. package/src/daemon/conversation-tool-setup.ts +74 -8
  205. package/src/daemon/conversation-workspace.ts +12 -0
  206. package/src/daemon/conversation.ts +226 -8
  207. package/src/daemon/date-context.ts +10 -10
  208. package/src/daemon/first-greeting.ts +3 -2
  209. package/src/daemon/handlers/conversations.ts +9 -140
  210. package/src/daemon/handlers/shared.ts +58 -0
  211. package/src/daemon/handlers/skills.ts +232 -37
  212. package/src/daemon/host-bash-proxy.ts +48 -13
  213. package/src/daemon/host-browser-proxy.ts +191 -0
  214. package/src/daemon/host-cu-proxy.ts +36 -11
  215. package/src/daemon/host-file-proxy.ts +57 -9
  216. package/src/daemon/lifecycle.ts +65 -11
  217. package/src/daemon/message-protocol.ts +7 -0
  218. package/src/daemon/message-types/conversations.ts +55 -13
  219. package/src/daemon/message-types/host-browser.ts +100 -0
  220. package/src/daemon/message-types/messages.ts +5 -5
  221. package/src/daemon/message-types/skills.ts +10 -0
  222. package/src/daemon/message-types/subagents.ts +2 -0
  223. package/src/daemon/server.ts +92 -12
  224. package/src/daemon/tool-side-effects.ts +6 -0
  225. package/src/daemon/transport-hints.ts +5 -24
  226. package/src/inbound/platform-callback-registration.ts +18 -17
  227. package/src/mcp/client.ts +59 -24
  228. package/src/memory/app-store.ts +31 -1
  229. package/src/memory/conversation-crud.ts +23 -0
  230. package/src/memory/conversation-starters-cadence.ts +76 -0
  231. package/src/memory/conversation-title-service.ts +5 -2
  232. package/src/memory/db-init.ts +12 -0
  233. package/src/memory/embedding-backend.test.ts +75 -0
  234. package/src/memory/embedding-backend.ts +131 -5
  235. package/src/memory/embedding-gemini.test.ts +54 -0
  236. package/src/memory/embedding-gemini.ts +20 -9
  237. package/src/memory/embedding-local.ts +176 -17
  238. package/src/memory/graph/consolidation.ts +10 -23
  239. package/src/memory/graph/extraction-job.ts +15 -0
  240. package/src/memory/graph/retriever.ts +40 -22
  241. package/src/memory/graph/store.test.ts +7 -3
  242. package/src/memory/graph/store.ts +47 -12
  243. package/src/memory/llm-usage-store.ts +45 -4
  244. package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
  245. package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
  246. package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
  247. package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
  248. package/src/memory/migrations/217-conversation-host-access.ts +40 -0
  249. package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
  250. package/src/memory/migrations/index.ts +6 -0
  251. package/src/memory/migrations/registry.ts +8 -0
  252. package/src/memory/schema/conversations.ts +1 -0
  253. package/src/memory/schema/oauth.ts +18 -13
  254. package/src/oauth/AGENTS.md +76 -0
  255. package/src/oauth/__tests__/identity-verifier.test.ts +24 -19
  256. package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
  257. package/src/oauth/byo-connection.test.ts +8 -8
  258. package/src/oauth/byo-connection.ts +7 -7
  259. package/src/oauth/connect-orchestrator.ts +23 -21
  260. package/src/oauth/connect-types.ts +3 -3
  261. package/src/oauth/connection-resolver.test.ts +17 -4
  262. package/src/oauth/connection-resolver.ts +16 -16
  263. package/src/oauth/connection.ts +1 -1
  264. package/src/oauth/manual-token-connection.ts +13 -13
  265. package/src/oauth/oauth-store.ts +214 -100
  266. package/src/oauth/platform-connection.test.ts +3 -3
  267. package/src/oauth/platform-connection.ts +4 -4
  268. package/src/oauth/provider-serializer.ts +31 -5
  269. package/src/oauth/revoke.ts +76 -0
  270. package/src/oauth/seed-providers.ts +126 -87
  271. package/src/oauth/token-persistence.ts +1 -1
  272. package/src/permissions/permission-mode.ts +4 -11
  273. package/src/permissions/prompter.ts +13 -1
  274. package/src/permissions/v2-consent-policy.ts +87 -0
  275. package/src/prompts/system-prompt.ts +18 -21
  276. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
  277. package/src/prompts/templates/BOOTSTRAP.md +59 -105
  278. package/src/providers/anthropic/client.ts +1 -0
  279. package/src/providers/types.ts +1 -1
  280. package/src/runtime/AGENTS.md +23 -0
  281. package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
  282. package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
  283. package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
  284. package/src/runtime/assistant-event-hub.ts +2 -2
  285. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  286. package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
  287. package/src/runtime/auth/__tests__/route-policy.test.ts +8 -0
  288. package/src/runtime/auth/middleware.ts +98 -0
  289. package/src/runtime/auth/route-policy.ts +6 -7
  290. package/src/runtime/capability-tokens.ts +414 -0
  291. package/src/runtime/channel-approvals.ts +18 -5
  292. package/src/runtime/chrome-extension-registry.ts +332 -0
  293. package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
  294. package/src/runtime/guardian-decision-types.ts +7 -0
  295. package/src/runtime/http-server.ts +425 -70
  296. package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
  297. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
  298. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +162 -0
  299. package/src/runtime/migrations/migration-transport.ts +6 -0
  300. package/src/runtime/migrations/migration-wizard.ts +22 -2
  301. package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
  302. package/src/runtime/migrations/vbundle-builder.ts +145 -38
  303. package/src/runtime/migrations/vbundle-import-analyzer.ts +19 -0
  304. package/src/runtime/migrations/vbundle-importer.ts +55 -5
  305. package/src/runtime/pending-interactions.ts +29 -13
  306. package/src/runtime/routes/approval-routes.ts +90 -16
  307. package/src/runtime/routes/browser-cdp-routes.ts +229 -0
  308. package/src/runtime/routes/browser-extension-pair-routes.ts +497 -0
  309. package/src/runtime/routes/conversation-analysis-routes.ts +2 -1
  310. package/src/runtime/routes/conversation-management-routes.ts +108 -0
  311. package/src/runtime/routes/conversation-routes.ts +301 -27
  312. package/src/runtime/routes/conversation-starter-routes.ts +78 -16
  313. package/src/runtime/routes/guardian-action-routes.ts +24 -13
  314. package/src/runtime/routes/host-browser-routes.ts +279 -0
  315. package/src/runtime/routes/host-file-routes.ts +9 -1
  316. package/src/runtime/routes/identity-routes.ts +259 -16
  317. package/src/runtime/routes/log-export-routes.ts +42 -22
  318. package/src/runtime/routes/memory-item-routes.ts +1 -7
  319. package/src/runtime/routes/migration-routes.ts +87 -2
  320. package/src/runtime/routes/oauth-apps.ts +15 -17
  321. package/src/runtime/routes/oauth-providers.ts +4 -0
  322. package/src/runtime/routes/schedule-routes.ts +24 -11
  323. package/src/runtime/routes/settings-routes.ts +9 -97
  324. package/src/runtime/routes/skills-routes.ts +52 -2
  325. package/src/runtime/routes/subagents-routes.ts +14 -10
  326. package/src/runtime/routes/usage-routes.ts +8 -7
  327. package/src/runtime/routes/workspace-routes.test.ts +22 -0
  328. package/src/runtime/routes/workspace-routes.ts +8 -1
  329. package/src/runtime/routes/workspace-utils.ts +2 -0
  330. package/src/schedule/scheduler.ts +7 -5
  331. package/src/security/ces-credential-client.ts +20 -0
  332. package/src/security/ces-rpc-credential-backend.ts +17 -0
  333. package/src/security/credential-backend.ts +5 -0
  334. package/src/security/oauth2.ts +42 -25
  335. package/src/security/secure-keys.ts +118 -25
  336. package/src/security/token-manager.ts +23 -10
  337. package/src/skills/catalog-files.ts +492 -0
  338. package/src/subagent/manager.ts +131 -26
  339. package/src/subagent/types.ts +19 -0
  340. package/src/tools/apps/executors.ts +11 -2
  341. package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
  342. package/src/tools/browser/auth-detector.ts +43 -12
  343. package/src/tools/browser/browser-execution.ts +645 -340
  344. package/src/tools/browser/browser-manager.ts +36 -12
  345. package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
  346. package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
  347. package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +870 -0
  348. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +330 -0
  349. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +377 -0
  350. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
  351. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
  352. package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
  353. package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
  354. package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
  355. package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
  356. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +743 -0
  357. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
  358. package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +578 -0
  359. package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
  360. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +635 -0
  361. package/src/tools/browser/cdp-client/errors.ts +34 -0
  362. package/src/tools/browser/cdp-client/extension-cdp-client.ts +125 -0
  363. package/src/tools/browser/cdp-client/factory.ts +204 -0
  364. package/src/tools/browser/cdp-client/index.ts +14 -0
  365. package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
  366. package/src/tools/browser/cdp-client/types.ts +52 -0
  367. package/src/tools/filesystem/edit.ts +1 -1
  368. package/src/tools/filesystem/list.ts +1 -1
  369. package/src/tools/filesystem/read.ts +1 -1
  370. package/src/tools/filesystem/write.ts +2 -1
  371. package/src/tools/host-filesystem/edit.ts +1 -1
  372. package/src/tools/host-filesystem/read.ts +12 -15
  373. package/src/tools/host-filesystem/write.ts +1 -1
  374. package/src/tools/host-terminal/host-shell.ts +21 -16
  375. package/src/tools/permission-checker.ts +77 -82
  376. package/src/tools/registry.ts +0 -2
  377. package/src/tools/secret-detection-handler.ts +34 -0
  378. package/src/tools/shared/filesystem/image-read.ts +61 -40
  379. package/src/tools/subagent/spawn.ts +47 -3
  380. package/src/tools/subagent/status.ts +2 -0
  381. package/src/tools/system/register.ts +2 -16
  382. package/src/tools/terminal/safe-env.ts +7 -0
  383. package/src/tools/terminal/shell.ts +21 -16
  384. package/src/tools/tool-approval-handler.ts +48 -2
  385. package/src/tools/types.ts +2 -0
  386. package/src/util/platform.ts +14 -19
  387. package/src/workspace/top-level-renderer.ts +19 -1
  388. package/src/__tests__/chrome-cdp.test.ts +0 -419
  389. package/src/__tests__/permission-mode-sse.test.ts +0 -418
  390. package/src/__tests__/permission-mode-store.test.ts +0 -277
  391. package/src/browser-extension-relay/protocol.ts +0 -63
  392. package/src/browser-extension-relay/server.ts +0 -203
  393. package/src/config/schemas/sandbox.ts +0 -14
  394. package/src/permissions/permission-mode-store.ts +0 -180
  395. package/src/tools/browser/chrome-cdp.ts +0 -239
  396. package/src/tools/system/set-permission-mode.ts +0 -103
@@ -312,7 +312,7 @@ Examples:
312
312
  });
313
313
  }
314
314
 
315
- // Build a lookup of oauth connections keyed by providerKey for enrichment.
315
+ // Build a lookup of oauth connections keyed by provider for enrichment.
316
316
  // listConnections() returns rows in no guaranteed order, so we compare
317
317
  // createdAt to keep the most recent active connection per provider —
318
318
  // matching the behaviour of getConnectionByProvider() used by inspect.
@@ -320,9 +320,9 @@ Examples:
320
320
  const connectionsByProvider = new Map<string, OAuthConnectionRow>();
321
321
  for (const conn of allConnections) {
322
322
  if (conn.status !== "active") continue;
323
- const existing = connectionsByProvider.get(conn.providerKey);
323
+ const existing = connectionsByProvider.get(conn.provider);
324
324
  if (!existing || conn.createdAt > existing.createdAt) {
325
- connectionsByProvider.set(conn.providerKey, conn);
325
+ connectionsByProvider.set(conn.provider, conn);
326
326
  }
327
327
  }
328
328
 
@@ -2,6 +2,7 @@ import { readFileSync, writeFileSync } from "node:fs";
2
2
 
3
3
  import type { Command } from "commander";
4
4
 
5
+ import { getAssistantDomain } from "../../config/env.js";
5
6
  import { VellumPlatformClient } from "../../platform/client.js";
6
7
  import { getCliLogger } from "../logger.js";
7
8
  import { shouldOutputJson, writeOutput } from "../output.js";
@@ -9,15 +10,19 @@ import { shouldOutputJson, writeOutput } from "../output.js";
9
10
  const log = getCliLogger("email");
10
11
 
11
12
  export function registerEmailCommand(program: Command): void {
13
+ const domain = getAssistantDomain();
12
14
  const email = program
13
15
  .command("email")
14
- .description("Email channel operations")
16
+ .description(
17
+ `Get your own email address (@${domain}) — register, send, receive, and manage email natively`,
18
+ )
15
19
  .option("--json", "Machine-readable compact JSON output");
16
20
 
17
21
  email.addHelpText(
18
22
  "after",
19
23
  `
20
- Manage the assistant's email channel on the Vellum platform.
24
+ Set up and manage this assistant's native email address on the Vellum
25
+ platform. No third-party email provider or browser sign-up needed.
21
26
 
22
27
  Examples:
23
28
  $ assistant email register mybot
@@ -30,12 +35,12 @@ Examples:
30
35
 
31
36
  email
32
37
  .command("register <username>")
33
- .description("Register an @vellum.me email address for this assistant")
38
+ .description(`Register an @${domain} email address for this assistant`)
34
39
  .addHelpText(
35
40
  "after",
36
41
  `
37
42
  Arguments:
38
- username The local part of the email address (e.g. "mybot" → mybot@vellum.me)
43
+ username The local part of the email address (e.g. "mybot" → mybot@${domain})
39
44
 
40
45
  Registers a new email address on the Vellum platform for the current
41
46
  assistant. Each assistant can have one email address. The address is
@@ -43,10 +48,10 @@ immediately active for receiving inbound email.
43
48
 
44
49
  Examples:
45
50
  $ assistant email register mybot
46
- ✓ Registered mybot@vellum.me
51
+ ✓ Registered mybot@${domain}
47
52
 
48
53
  $ assistant email register support --json
49
- {"address":"support@vellum.me","id":"...","created_at":"..."}`,
54
+ {"address":"support@${domain}","id":"...","created_at":"..."}`,
50
55
  )
51
56
  .action(async (username: string, _opts: unknown, cmd: Command) => {
52
57
  try {
@@ -122,14 +127,14 @@ immediately available for reuse.
122
127
 
123
128
  Examples:
124
129
  $ assistant email unregister
125
- Remove mybot@vellum.me? (y/N) y
126
- ✓ Unregistered mybot@vellum.me
130
+ Remove mybot@${domain}? (y/N) y
131
+ ✓ Unregistered mybot@${domain}
127
132
 
128
133
  $ assistant email unregister --confirm
129
- ✓ Unregistered mybot@vellum.me
134
+ ✓ Unregistered mybot@${domain}
130
135
 
131
136
  $ assistant email unregister --json
132
- {"unregistered":"mybot@vellum.me"}`,
137
+ {"unregistered":"mybot@${domain}"}`,
133
138
  )
134
139
  .action(async (_opts: { confirm?: boolean }, cmd: Command) => {
135
140
  try {
@@ -222,12 +227,12 @@ current usage and quota information from the platform.
222
227
 
223
228
  Examples:
224
229
  $ assistant email status
225
- Address: mybot@vellum.me
230
+ Address: mybot@${domain}
226
231
  Status: active
227
232
  Sent: 12 / 100 (daily)
228
233
 
229
234
  $ assistant email status --json
230
- {"address":"mybot@vellum.me","status":"active","usage":{"sent_today":12,"daily_limit":100}}`,
235
+ {"address":"mybot@${domain}","status":"active","usage":{"sent_today":12,"daily_limit":100}}`,
231
236
  )
232
237
  .action(async (_opts: unknown, cmd: Command) => {
233
238
  try {
@@ -446,7 +451,7 @@ or --format json for the full message object.
446
451
  Examples:
447
452
  $ assistant email download msg_abc123
448
453
  From: user@example.com
449
- To: mybot@vellum.me
454
+ To: mybot@${domain}
450
455
  Subject: Hello
451
456
  Date: 2026-04-05 12:00:00
452
457
 
@@ -34,13 +34,25 @@ export async function checkServerHealth(
34
34
  }),
35
35
  ]);
36
36
 
37
- if (!client.isConnected) {
38
- return "! Needs authentication";
37
+ if (client.isConnected) {
38
+ await client.disconnect();
39
+ return "\u2713 Connected";
40
+ }
41
+
42
+ // connect() swallows errors — check lastError to distinguish auth from
43
+ // transport failures (DNS, TLS, 500, stdio crash, etc.).
44
+ const err = client.lastError;
45
+ if (err) {
46
+ const message = err.message;
47
+ if (message.includes("timeout")) {
48
+ return "\u2717 Timed out";
49
+ }
50
+ return `\u2717 Error: ${message}`;
39
51
  }
40
52
 
41
- await client.disconnect();
42
- return "\u2713 Connected";
53
+ return "! Needs authentication";
43
54
  } catch (err) {
55
+ // Only the external timeout Promise can throw here (connect() never does).
44
56
  try {
45
57
  await client.disconnect();
46
58
  } catch {
@@ -264,9 +264,9 @@ describe("assistant oauth connect", () => {
264
264
 
265
265
  test("managed mode with --no-browser: prints connect URL", async () => {
266
266
  mockGetProvider = () => ({
267
- providerKey: "google",
268
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
269
- tokenUrl: "https://oauth2.googleapis.com/token",
267
+ provider: "google",
268
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
269
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
270
270
  managedServiceConfigKey: "google-oauth",
271
271
  });
272
272
  mockIsManagedMode = () => true;
@@ -301,9 +301,9 @@ describe("assistant oauth connect", () => {
301
301
 
302
302
  test("managed mode default: opens browser and polls for new connection", async () => {
303
303
  mockGetProvider = () => ({
304
- providerKey: "google",
305
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
306
- tokenUrl: "https://oauth2.googleapis.com/token",
304
+ provider: "google",
305
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
306
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
307
307
  managedServiceConfigKey: "google-oauth",
308
308
  });
309
309
  mockIsManagedMode = () => true;
@@ -357,9 +357,9 @@ describe("assistant oauth connect", () => {
357
357
 
358
358
  test("BYO mode with --no-browser: prints auth URL", async () => {
359
359
  mockGetProvider = () => ({
360
- providerKey: "google",
361
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
362
- tokenUrl: "https://oauth2.googleapis.com/token",
360
+ provider: "google",
361
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
362
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
363
363
  managedServiceConfigKey: null,
364
364
  });
365
365
  mockIsManagedMode = () => false;
@@ -368,7 +368,7 @@ describe("assistant oauth connect", () => {
368
368
  id: "app-1",
369
369
  clientId: "byo-client-id",
370
370
  clientSecretCredentialPath: "oauth_app/app-1/client_secret",
371
- providerKey: "google",
371
+ provider: "google",
372
372
  createdAt: 0,
373
373
  updatedAt: 0,
374
374
  });
@@ -376,7 +376,7 @@ describe("assistant oauth connect", () => {
376
376
  mockOrchestrateOAuthConnect = async () => ({
377
377
  success: true,
378
378
  deferred: true,
379
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth?state=abc",
379
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth?state=abc",
380
380
  state: "abc",
381
381
  service: "google",
382
382
  });
@@ -403,9 +403,9 @@ describe("assistant oauth connect", () => {
403
403
 
404
404
  test("BYO mode default calls orchestrator with isInteractive: true", async () => {
405
405
  mockGetProvider = () => ({
406
- providerKey: "google",
407
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
408
- tokenUrl: "https://oauth2.googleapis.com/token",
406
+ provider: "google",
407
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
408
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
409
409
  managedServiceConfigKey: null,
410
410
  });
411
411
  mockIsManagedMode = () => false;
@@ -414,7 +414,7 @@ describe("assistant oauth connect", () => {
414
414
  id: "app-1",
415
415
  clientId: "test-id",
416
416
  clientSecretCredentialPath: "oauth_app/app-1/client_secret",
417
- providerKey: "google",
417
+ provider: "google",
418
418
  createdAt: 0,
419
419
  updatedAt: 0,
420
420
  });
@@ -455,9 +455,9 @@ describe("assistant oauth connect", () => {
455
455
 
456
456
  test("BYO mode: missing app with --client-id returns error with hint", async () => {
457
457
  mockGetProvider = () => ({
458
- providerKey: "google",
459
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
460
- tokenUrl: "https://oauth2.googleapis.com/token",
458
+ provider: "google",
459
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
460
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
461
461
  managedServiceConfigKey: null,
462
462
  });
463
463
  mockIsManagedMode = () => false;
@@ -483,9 +483,9 @@ describe("assistant oauth connect", () => {
483
483
 
484
484
  test("BYO mode: no client_id found returns error with hint", async () => {
485
485
  mockGetProvider = () => ({
486
- providerKey: "google",
487
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
488
- tokenUrl: "https://oauth2.googleapis.com/token",
486
+ provider: "google",
487
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
488
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
489
489
  managedServiceConfigKey: null,
490
490
  });
491
491
  mockIsManagedMode = () => false;
@@ -509,9 +509,9 @@ describe("assistant oauth connect", () => {
509
509
 
510
510
  test("--client-id is silently ignored in managed mode", async () => {
511
511
  mockGetProvider = () => ({
512
- providerKey: "google",
513
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
514
- tokenUrl: "https://oauth2.googleapis.com/token",
512
+ provider: "google",
513
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
514
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
515
515
  managedServiceConfigKey: "google-oauth",
516
516
  });
517
517
  mockIsManagedMode = () => true;
@@ -547,9 +547,9 @@ describe("assistant oauth connect", () => {
547
547
 
548
548
  test("JSON output for deferred case includes ok, deferred, authUrl, service", async () => {
549
549
  mockGetProvider = () => ({
550
- providerKey: "slack",
551
- authUrl: "https://slack.com/oauth/v2/authorize",
552
- tokenUrl: "https://slack.com/api/oauth.v2.access",
550
+ provider: "slack",
551
+ authorizeUrl: "https://slack.com/oauth/v2/authorize",
552
+ tokenExchangeUrl: "https://slack.com/api/oauth.v2.access",
553
553
  managedServiceConfigKey: null,
554
554
  });
555
555
  mockIsManagedMode = () => false;
@@ -558,7 +558,7 @@ describe("assistant oauth connect", () => {
558
558
  id: "app-slack",
559
559
  clientId: "slack-client-id",
560
560
  clientSecretCredentialPath: "oauth_app/app-slack/client_secret",
561
- providerKey: "slack",
561
+ provider: "slack",
562
562
  createdAt: 0,
563
563
  updatedAt: 0,
564
564
  });
@@ -566,7 +566,7 @@ describe("assistant oauth connect", () => {
566
566
  mockOrchestrateOAuthConnect = async () => ({
567
567
  success: true,
568
568
  deferred: true,
569
- authUrl: "https://slack.com/oauth/v2/authorize?state=xyz",
569
+ authorizeUrl: "https://slack.com/oauth/v2/authorize?state=xyz",
570
570
  state: "xyz",
571
571
  service: "slack",
572
572
  });
@@ -591,9 +591,9 @@ describe("assistant oauth connect", () => {
591
591
 
592
592
  test("JSON output for completed case includes ok, grantedScopes, accountInfo", async () => {
593
593
  mockGetProvider = () => ({
594
- providerKey: "google",
595
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
596
- tokenUrl: "https://oauth2.googleapis.com/token",
594
+ provider: "google",
595
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
596
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
597
597
  managedServiceConfigKey: null,
598
598
  });
599
599
  mockIsManagedMode = () => false;
@@ -602,7 +602,7 @@ describe("assistant oauth connect", () => {
602
602
  id: "app-1",
603
603
  clientId: "completed-client-id",
604
604
  clientSecretCredentialPath: "oauth_app/app-1/client_secret",
605
- providerKey: "google",
605
+ provider: "google",
606
606
  createdAt: 0,
607
607
  updatedAt: 0,
608
608
  });
@@ -635,9 +635,9 @@ describe("assistant oauth connect", () => {
635
635
 
636
636
  test("BYO mode: client_secret required but missing returns error with hint", async () => {
637
637
  mockGetProvider = () => ({
638
- providerKey: "google",
639
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
640
- tokenUrl: "https://oauth2.googleapis.com/token",
638
+ provider: "google",
639
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
640
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
641
641
  tokenEndpointAuthMethod: "client_secret_post",
642
642
  managedServiceConfigKey: null,
643
643
  requiresClientSecret: 1,
@@ -648,7 +648,7 @@ describe("assistant oauth connect", () => {
648
648
  id: "app-1",
649
649
  clientId: "test-id",
650
650
  clientSecretCredentialPath: "oauth_app/app-1/client_secret",
651
- providerKey: "google",
651
+ provider: "google",
652
652
  createdAt: 0,
653
653
  updatedAt: 0,
654
654
  });
@@ -674,9 +674,9 @@ describe("assistant oauth connect", () => {
674
674
 
675
675
  test("manual-token provider returns error directing to credentials command", async () => {
676
676
  mockGetProvider = () => ({
677
- providerKey: "slack_channel",
678
- authUrl: "urn:manual-token",
679
- tokenUrl: "urn:manual-token",
677
+ provider: "slack_channel",
678
+ authorizeUrl: "urn:manual-token",
679
+ tokenExchangeUrl: "urn:manual-token",
680
680
  managedServiceConfigKey: null,
681
681
  });
682
682
  mockIsManagedMode = () => false;
@@ -701,9 +701,9 @@ describe("assistant oauth connect", () => {
701
701
 
702
702
  test("BYO mode: orchestrator error propagates correctly", async () => {
703
703
  mockGetProvider = () => ({
704
- providerKey: "google",
705
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
706
- tokenUrl: "https://oauth2.googleapis.com/token",
704
+ provider: "google",
705
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
706
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
707
707
  managedServiceConfigKey: null,
708
708
  });
709
709
  mockIsManagedMode = () => false;
@@ -712,7 +712,7 @@ describe("assistant oauth connect", () => {
712
712
  id: "app-1",
713
713
  clientId: "client-id",
714
714
  clientSecretCredentialPath: "oauth_app/app-1/client_secret",
715
- providerKey: "google",
715
+ provider: "google",
716
716
  createdAt: 0,
717
717
  updatedAt: 0,
718
718
  });
@@ -15,19 +15,19 @@ let mockGetConnection: (
15
15
  ) => Record<string, unknown> | undefined = () => undefined;
16
16
 
17
17
  let mockGetActiveConnection: (
18
- providerKey: string,
18
+ provider: string,
19
19
  opts?: { account?: string },
20
20
  ) => Record<string, unknown> | undefined = () => undefined;
21
21
 
22
22
  let mockListActiveConnectionsByProvider: (
23
- providerKey: string,
23
+ provider: string,
24
24
  ) => Array<Record<string, unknown>> = () => [];
25
25
 
26
26
  let mockDisconnectOAuthProviderResult: "disconnected" | "not-found" | "error" =
27
27
  "disconnected";
28
28
 
29
29
  let mockDisconnectOAuthProviderCalls: Array<{
30
- providerKey: string;
30
+ provider: string;
31
31
  account: string | undefined;
32
32
  connectionId: string | undefined;
33
33
  }> = [];
@@ -64,17 +64,17 @@ mock.module("../../../../config/loader.js", () => ({
64
64
  mock.module("../../../../oauth/oauth-store.js", () => ({
65
65
  getProvider: (key: string) => mockGetProvider(key),
66
66
  getConnection: (id: string) => mockGetConnection(id),
67
- getActiveConnection: (providerKey: string, opts?: { account?: string }) =>
68
- mockGetActiveConnection(providerKey, opts),
69
- listActiveConnectionsByProvider: (providerKey: string) =>
70
- mockListActiveConnectionsByProvider(providerKey),
67
+ getActiveConnection: (provider: string, opts?: { account?: string }) =>
68
+ mockGetActiveConnection(provider, opts),
69
+ listActiveConnectionsByProvider: (provider: string) =>
70
+ mockListActiveConnectionsByProvider(provider),
71
71
  disconnectOAuthProvider: async (
72
- providerKey: string,
72
+ provider: string,
73
73
  account?: string,
74
74
  connectionId?: string,
75
75
  ) => {
76
76
  mockDisconnectOAuthProviderCalls.push({
77
- providerKey,
77
+ provider,
78
78
  account,
79
79
  connectionId,
80
80
  });
@@ -295,7 +295,7 @@ describe("assistant oauth disconnect", () => {
295
295
 
296
296
  test("both --account and --connection-id returns error", async () => {
297
297
  mockGetProvider = () => ({
298
- providerKey: "google",
298
+ provider: "google",
299
299
  managedServiceConfigKey: null,
300
300
  });
301
301
 
@@ -323,7 +323,7 @@ describe("assistant oauth disconnect", () => {
323
323
  describe("managed mode", () => {
324
324
  beforeEach(() => {
325
325
  mockGetProvider = () => ({
326
- providerKey: "google",
326
+ provider: "google",
327
327
  managedServiceConfigKey: "google-oauth",
328
328
  });
329
329
  mockIsManagedMode = () => true;
@@ -484,7 +484,7 @@ describe("assistant oauth disconnect", () => {
484
484
  describe("BYO mode", () => {
485
485
  beforeEach(() => {
486
486
  mockGetProvider = () => ({
487
- providerKey: "google",
487
+ provider: "google",
488
488
  managedServiceConfigKey: null,
489
489
  });
490
490
  mockIsManagedMode = () => false;
@@ -494,7 +494,7 @@ describe("assistant oauth disconnect", () => {
494
494
  mockListActiveConnectionsByProvider = () => [
495
495
  {
496
496
  id: "conn-1",
497
- providerKey: "google",
497
+ provider: "google",
498
498
  accountInfo: "user@gmail.com",
499
499
  status: "active",
500
500
  },
@@ -514,16 +514,16 @@ describe("assistant oauth disconnect", () => {
514
514
 
515
515
  // Verify disconnectOAuthProvider was called
516
516
  expect(mockDisconnectOAuthProviderCalls).toHaveLength(1);
517
- expect(mockDisconnectOAuthProviderCalls[0].providerKey).toBe("google");
517
+ expect(mockDisconnectOAuthProviderCalls[0].provider).toBe("google");
518
518
  expect(mockDisconnectOAuthProviderCalls[0].connectionId).toBe("conn-1");
519
519
  });
520
520
 
521
521
  test("--account matches accountInfo", async () => {
522
- mockGetActiveConnection = (providerKey, opts) => {
522
+ mockGetActiveConnection = (_provider, opts) => {
523
523
  if (opts?.account === "user@gmail.com") {
524
524
  return {
525
525
  id: "conn-1",
526
- providerKey: "google",
526
+ provider: "google",
527
527
  accountInfo: "user@gmail.com",
528
528
  status: "active",
529
529
  };
@@ -567,7 +567,7 @@ describe("assistant oauth disconnect", () => {
567
567
  if (id === "conn-123") {
568
568
  return {
569
569
  id: "conn-123",
570
- providerKey: "google",
570
+ provider: "google",
571
571
  accountInfo: "user@gmail.com",
572
572
  status: "active",
573
573
  };
@@ -593,7 +593,7 @@ describe("assistant oauth disconnect", () => {
593
593
  if (id === "conn-slack") {
594
594
  return {
595
595
  id: "conn-slack",
596
- providerKey: "slack",
596
+ provider: "slack",
597
597
  accountInfo: null,
598
598
  status: "active",
599
599
  };
@@ -619,13 +619,13 @@ describe("assistant oauth disconnect", () => {
619
619
  mockListActiveConnectionsByProvider = () => [
620
620
  {
621
621
  id: "conn-1",
622
- providerKey: "google",
622
+ provider: "google",
623
623
  accountInfo: "user1@gmail.com",
624
624
  status: "active",
625
625
  },
626
626
  {
627
627
  id: "conn-2",
628
- providerKey: "google",
628
+ provider: "google",
629
629
  accountInfo: "user2@gmail.com",
630
630
  status: "active",
631
631
  },
@@ -666,7 +666,7 @@ describe("assistant oauth disconnect", () => {
666
666
  mockListActiveConnectionsByProvider = () => [
667
667
  {
668
668
  id: "conn-1",
669
- providerKey: "google",
669
+ provider: "google",
670
670
  accountInfo: null,
671
671
  status: "active",
672
672
  },
@@ -11,7 +11,7 @@ let mockGetProvider: (
11
11
  ) => Record<string, unknown> | undefined = () => undefined;
12
12
 
13
13
  let mockListActiveConnectionsByProvider: (
14
- providerKey: string,
14
+ provider: string,
15
15
  ) => Array<Record<string, unknown>> = () => [];
16
16
 
17
17
  let mockGetManagedServiceConfigKey: (key: string) => string | null = () => null;
@@ -71,8 +71,8 @@ mock.module("../../../../config/loader.js", () => ({
71
71
 
72
72
  mock.module("../../../../oauth/oauth-store.js", () => ({
73
73
  getProvider: (key: string) => mockGetProvider(key),
74
- listActiveConnectionsByProvider: (providerKey: string) =>
75
- mockListActiveConnectionsByProvider(providerKey),
74
+ listActiveConnectionsByProvider: (provider: string) =>
75
+ mockListActiveConnectionsByProvider(provider),
76
76
  listConnections: () => [],
77
77
  getConnection: () => undefined,
78
78
  getConnectionByProvider: () => undefined,
@@ -276,7 +276,7 @@ describe("assistant oauth mode", () => {
276
276
 
277
277
  test("provider without managedServiceConfigKey returns your-own with managedModeSupported: false", async () => {
278
278
  mockGetProvider = () => ({
279
- providerKey: "slack",
279
+ provider: "slack",
280
280
  managedServiceConfigKey: null,
281
281
  });
282
282
  mockGetManagedServiceConfigKey = () => null;
@@ -296,7 +296,7 @@ describe("assistant oauth mode", () => {
296
296
 
297
297
  test("provider in managed mode returns mode: managed with managedModeSupported: true", async () => {
298
298
  mockGetProvider = () => ({
299
- providerKey: "google",
299
+ provider: "google",
300
300
  managedServiceConfigKey: "google-oauth",
301
301
  });
302
302
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -319,7 +319,7 @@ describe("assistant oauth mode", () => {
319
319
 
320
320
  test("provider in your-own mode returns mode: your-own with managedModeSupported: true", async () => {
321
321
  mockGetProvider = () => ({
322
- providerKey: "google",
322
+ provider: "google",
323
323
  managedServiceConfigKey: "google-oauth",
324
324
  });
325
325
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -348,7 +348,7 @@ describe("assistant oauth mode", () => {
348
348
  describe("set mode", () => {
349
349
  test("invalid mode value returns error listing valid values", async () => {
350
350
  mockGetProvider = () => ({
351
- providerKey: "google",
351
+ provider: "google",
352
352
  managedServiceConfigKey: "google-oauth",
353
353
  });
354
354
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -370,7 +370,7 @@ describe("assistant oauth mode", () => {
370
370
 
371
371
  test("provider without managedServiceConfigKey returns error about managed mode not available when --set managed", async () => {
372
372
  mockGetProvider = () => ({
373
- providerKey: "slack",
373
+ provider: "slack",
374
374
  managedServiceConfigKey: null,
375
375
  });
376
376
  mockGetManagedServiceConfigKey = () => null;
@@ -391,7 +391,7 @@ describe("assistant oauth mode", () => {
391
391
 
392
392
  test("provider without managedServiceConfigKey treats --set your-own as successful no-op", async () => {
393
393
  mockGetProvider = () => ({
394
- providerKey: "slack",
394
+ provider: "slack",
395
395
  managedServiceConfigKey: null,
396
396
  });
397
397
  mockGetManagedServiceConfigKey = () => null;
@@ -414,7 +414,7 @@ describe("assistant oauth mode", () => {
414
414
 
415
415
  test("set to same mode returns changed: false", async () => {
416
416
  mockGetProvider = () => ({
417
- providerKey: "google",
417
+ provider: "google",
418
418
  managedServiceConfigKey: "google-oauth",
419
419
  });
420
420
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -440,7 +440,7 @@ describe("assistant oauth mode", () => {
440
440
 
441
441
  test("switch managed -> your-own with active managed connections and no BYO connections includes hint", async () => {
442
442
  mockGetProvider = () => ({
443
- providerKey: "google",
443
+ provider: "google",
444
444
  managedServiceConfigKey: "google-oauth",
445
445
  });
446
446
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -483,7 +483,7 @@ describe("assistant oauth mode", () => {
483
483
 
484
484
  test("switch your-own -> managed with active BYO connections and no managed connections includes hint", async () => {
485
485
  mockGetProvider = () => ({
486
- providerKey: "google",
486
+ provider: "google",
487
487
  managedServiceConfigKey: "google-oauth",
488
488
  });
489
489
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -496,7 +496,7 @@ describe("assistant oauth mode", () => {
496
496
  mockListActiveConnectionsByProvider = () => [
497
497
  {
498
498
  id: "conn-local-1",
499
- providerKey: "google",
499
+ provider: "google",
500
500
  status: "active",
501
501
  },
502
502
  ];
@@ -526,7 +526,7 @@ describe("assistant oauth mode", () => {
526
526
 
527
527
  test("switch mode with connections on both sides has no hint", async () => {
528
528
  mockGetProvider = () => ({
529
- providerKey: "google",
529
+ provider: "google",
530
530
  managedServiceConfigKey: "google-oauth",
531
531
  });
532
532
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -549,7 +549,7 @@ describe("assistant oauth mode", () => {
549
549
  mockListActiveConnectionsByProvider = () => [
550
550
  {
551
551
  id: "conn-local-1",
552
- providerKey: "google",
552
+ provider: "google",
553
553
  status: "active",
554
554
  },
555
555
  ];
@@ -571,7 +571,7 @@ describe("assistant oauth mode", () => {
571
571
 
572
572
  test("switch mode with no connections on either side has no hint", async () => {
573
573
  mockGetProvider = () => ({
574
- providerKey: "google",
574
+ provider: "google",
575
575
  managedServiceConfigKey: "google-oauth",
576
576
  });
577
577
  mockGetManagedServiceConfigKey = () => "google-oauth";
@@ -604,7 +604,7 @@ describe("assistant oauth mode", () => {
604
604
 
605
605
  test("saveRawConfig is called with the correct nested path", async () => {
606
606
  mockGetProvider = () => ({
607
- providerKey: "google",
607
+ provider: "google",
608
608
  managedServiceConfigKey: "google-oauth",
609
609
  });
610
610
  mockGetManagedServiceConfigKey = () => "google-oauth";