@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
@@ -4,30 +4,36 @@ import { seedProviders } from "./oauth-store.js";
4
4
  * Protocol-level seed data for each well-known OAuth provider.
5
5
  *
6
6
  * These values are upserted into the `oauth_providers` SQLite table on
7
- * every startup. Only Vellum implementation fields (authUrl, tokenUrl,
8
- * tokenEndpointAuthMethod, userinfoUrl, extraParams,
9
- * pingUrl, pingMethod, pingHeaders, pingBody, managedServiceConfigKey,
7
+ * every startup. Only Vellum implementation fields (authorizeUrl, tokenExchangeUrl,
8
+ * refreshUrl, tokenEndpointAuthMethod, userinfoUrl, authorizeParams,
9
+ * pingUrl, pingMethod, pingHeaders, pingBody, revokeUrl, revokeBodyTemplate,
10
+ * managedServiceConfigKey,
10
11
  * loopbackPort, injectionTemplates, appType, setupNotes,
11
12
  * identityUrl, identityMethod, identityHeaders, identityBody,
12
- * identityResponsePaths, identityFormat, identityOkField, featureFlag)
13
- * and display metadata (displayName,
14
- * description, dashboardUrl, clientIdPlaceholder, requiresClientSecret)
13
+ * identityResponsePaths, identityFormat, identityOkField, featureFlag,
14
+ * scopeSeparator)
15
+ * and display metadata (displayLabel,
16
+ * description, dashboardUrl, clientIdPlaceholder, requiresClientSecret,
17
+ * logoUrl)
15
18
  * are overwritten on subsequent startups — user-customizable
16
19
  * fields (defaultScopes, scopePolicy) are only
17
20
  * written on initial insert and preserved across restarts.
18
21
  */
19
- const PROVIDER_SEED_DATA: Record<
22
+ export const PROVIDER_SEED_DATA: Record<
20
23
  string,
21
24
  {
22
- providerKey: string;
23
- authUrl: string;
24
- tokenUrl: string;
25
+ provider: string;
26
+ authorizeUrl: string;
27
+ tokenExchangeUrl: string;
28
+ refreshUrl?: string;
25
29
  tokenEndpointAuthMethod?: string;
26
30
  userinfoUrl?: string;
27
31
  pingUrl?: string;
28
32
  pingMethod?: string;
29
33
  pingHeaders?: Record<string, string>;
30
34
  pingBody?: unknown;
35
+ revokeUrl?: string;
36
+ revokeBodyTemplate?: Record<string, string>;
31
37
  baseUrl?: string;
32
38
  defaultScopes: string[];
33
39
  scopePolicy: {
@@ -35,9 +41,10 @@ const PROVIDER_SEED_DATA: Record<
35
41
  allowedOptionalScopes: string[];
36
42
  forbiddenScopes: string[];
37
43
  };
38
- extraParams?: Record<string, string>;
44
+ scopeSeparator?: string;
45
+ authorizeParams?: Record<string, string>;
39
46
  managedServiceConfigKey?: string;
40
- displayName: string;
47
+ displayLabel: string;
41
48
  description: string;
42
49
  dashboardUrl: string | null;
43
50
  clientIdPlaceholder: string | null;
@@ -59,19 +66,21 @@ const PROVIDER_SEED_DATA: Record<
59
66
  identityFormat?: string;
60
67
  identityOkField?: string;
61
68
  featureFlag?: string;
69
+ logoUrl?: string;
62
70
  }
63
71
  > = {
64
72
  google: {
65
- providerKey: "google",
66
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
67
- tokenUrl: "https://oauth2.googleapis.com/token",
73
+ provider: "google",
74
+ authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
75
+ tokenExchangeUrl: "https://oauth2.googleapis.com/token",
68
76
  userinfoUrl: "https://www.googleapis.com/oauth2/v2/userinfo",
69
77
  pingUrl: "https://www.googleapis.com/oauth2/v2/userinfo",
70
78
  baseUrl: "https://gmail.googleapis.com/gmail/v1/users/me",
71
- displayName: "Google",
79
+ displayLabel: "Google",
72
80
  description: "Gmail, Calendar, and Contacts",
73
81
  dashboardUrl: "https://console.cloud.google.com/apis/credentials",
74
82
  clientIdPlaceholder: "123456789.apps.googleusercontent.com",
83
+ logoUrl: "https://cdn.simpleicons.org/google",
75
84
  defaultScopes: [
76
85
  "https://www.googleapis.com/auth/gmail.readonly",
77
86
  "https://www.googleapis.com/auth/gmail.modify",
@@ -89,7 +98,7 @@ const PROVIDER_SEED_DATA: Record<
89
98
  ],
90
99
  forbiddenScopes: [],
91
100
  },
92
- extraParams: { access_type: "offline", prompt: "consent" },
101
+ authorizeParams: { access_type: "offline", prompt: "consent" },
93
102
  loopbackPort: 17321,
94
103
  managedServiceConfigKey: "google-oauth",
95
104
  injectionTemplates: [
@@ -112,21 +121,24 @@ const PROVIDER_SEED_DATA: Record<
112
121
  valuePrefix: "Bearer ",
113
122
  },
114
123
  ],
124
+ revokeUrl: "https://oauth2.googleapis.com/revoke",
125
+ revokeBodyTemplate: { token: "{access_token}" },
115
126
  appType: "Desktop app",
116
127
  identityUrl: "https://www.googleapis.com/oauth2/v2/userinfo",
117
128
  identityResponsePaths: ["email"],
118
129
  },
119
130
 
120
131
  slack: {
121
- providerKey: "slack",
122
- authUrl: "https://slack.com/oauth/v2/authorize",
123
- tokenUrl: "https://slack.com/api/oauth.v2.access",
132
+ provider: "slack",
133
+ authorizeUrl: "https://slack.com/oauth/v2/authorize",
134
+ tokenExchangeUrl: "https://slack.com/api/oauth.v2.access",
124
135
  pingUrl: "https://slack.com/api/auth.test",
125
136
  baseUrl: "https://slack.com/api",
126
- displayName: "Slack",
137
+ displayLabel: "Slack",
127
138
  description: "Workspace messaging",
128
139
  dashboardUrl: "https://api.slack.com/apps",
129
140
  clientIdPlaceholder: null,
141
+ logoUrl: "https://cdn.simpleicons.org/slack",
130
142
  defaultScopes: [
131
143
  "channels:read",
132
144
  "channels:history",
@@ -147,7 +159,7 @@ const PROVIDER_SEED_DATA: Record<
147
159
  allowedOptionalScopes: [],
148
160
  forbiddenScopes: [],
149
161
  },
150
- extraParams: {
162
+ authorizeParams: {
151
163
  user_scope:
152
164
  "channels:read,channels:history,groups:read,groups:history,im:read,im:history,im:write,mpim:read,mpim:history,users:read,chat:write,search:read,reactions:write",
153
165
  },
@@ -168,23 +180,24 @@ const PROVIDER_SEED_DATA: Record<
168
180
  },
169
181
 
170
182
  notion: {
171
- providerKey: "notion",
172
- authUrl: "https://api.notion.com/v1/oauth/authorize",
173
- tokenUrl: "https://api.notion.com/v1/oauth/token",
183
+ provider: "notion",
184
+ authorizeUrl: "https://api.notion.com/v1/oauth/authorize",
185
+ tokenExchangeUrl: "https://api.notion.com/v1/oauth/token",
174
186
  pingUrl: "https://api.notion.com/v1/users/me",
175
187
  pingHeaders: { "Notion-Version": "2022-06-28" },
176
188
  baseUrl: "https://api.notion.com",
177
- displayName: "Notion",
189
+ displayLabel: "Notion",
178
190
  description: "Pages and databases",
179
191
  dashboardUrl: "https://www.notion.so/my-integrations",
180
192
  clientIdPlaceholder: null,
193
+ logoUrl: "https://cdn.simpleicons.org/notion",
181
194
  defaultScopes: [],
182
195
  scopePolicy: {
183
196
  allowAdditionalScopes: false,
184
197
  allowedOptionalScopes: [],
185
198
  forbiddenScopes: [],
186
199
  },
187
- extraParams: { owner: "user" },
200
+ authorizeParams: { owner: "user" },
188
201
  tokenEndpointAuthMethod: "client_secret_basic",
189
202
  loopbackPort: 17323,
190
203
  injectionTemplates: [
@@ -202,15 +215,16 @@ const PROVIDER_SEED_DATA: Record<
202
215
  },
203
216
 
204
217
  twitter: {
205
- providerKey: "twitter",
206
- authUrl: "https://twitter.com/i/oauth2/authorize",
207
- tokenUrl: "https://api.x.com/2/oauth2/token",
218
+ provider: "twitter",
219
+ authorizeUrl: "https://twitter.com/i/oauth2/authorize",
220
+ tokenExchangeUrl: "https://api.x.com/2/oauth2/token",
208
221
  pingUrl: "https://api.x.com/2/users/me",
209
222
  baseUrl: "https://api.x.com",
210
- displayName: "Twitter",
223
+ displayLabel: "Twitter",
211
224
  description: "Posts and direct messages",
212
225
  dashboardUrl: "https://developer.twitter.com/en/portal/dashboard",
213
226
  clientIdPlaceholder: null,
227
+ logoUrl: "https://cdn.simpleicons.org/x",
214
228
  defaultScopes: [
215
229
  "tweet.read",
216
230
  "tweet.write",
@@ -232,6 +246,12 @@ const PROVIDER_SEED_DATA: Record<
232
246
  valuePrefix: "Bearer ",
233
247
  },
234
248
  ],
249
+ revokeUrl: "https://api.x.com/2/oauth2/revoke",
250
+ revokeBodyTemplate: {
251
+ token: "{access_token}",
252
+ token_type_hint: "access_token",
253
+ client_id: "{client_id}",
254
+ },
235
255
  appType: "App",
236
256
  identityUrl: "https://api.x.com/2/users/me",
237
257
  identityResponsePaths: ["data.username"],
@@ -239,15 +259,16 @@ const PROVIDER_SEED_DATA: Record<
239
259
  },
240
260
 
241
261
  github: {
242
- providerKey: "github",
243
- authUrl: "https://github.com/login/oauth/authorize",
244
- tokenUrl: "https://github.com/login/oauth/access_token",
262
+ provider: "github",
263
+ authorizeUrl: "https://github.com/login/oauth/authorize",
264
+ tokenExchangeUrl: "https://github.com/login/oauth/access_token",
245
265
  pingUrl: "https://api.github.com/user",
246
266
  baseUrl: "https://api.github.com",
247
- displayName: "GitHub",
267
+ displayLabel: "GitHub",
248
268
  description: "Repositories and issues",
249
269
  dashboardUrl: "https://github.com/settings/developers",
250
270
  clientIdPlaceholder: null,
271
+ logoUrl: "https://cdn.simpleicons.org/github",
251
272
  defaultScopes: ["repo", "read:user", "notifications"],
252
273
  scopePolicy: {
253
274
  allowAdditionalScopes: true,
@@ -259,6 +280,7 @@ const PROVIDER_SEED_DATA: Record<
259
280
  ],
260
281
  forbiddenScopes: ["delete_repo", "admin:org"],
261
282
  },
283
+ managedServiceConfigKey: "github-oauth",
262
284
  loopbackPort: 17332,
263
285
  injectionTemplates: [
264
286
  {
@@ -275,25 +297,27 @@ const PROVIDER_SEED_DATA: Record<
275
297
  },
276
298
 
277
299
  linear: {
278
- providerKey: "linear",
279
- authUrl: "https://linear.app/oauth/authorize",
280
- tokenUrl: "https://api.linear.app/oauth/token",
300
+ provider: "linear",
301
+ authorizeUrl: "https://linear.app/oauth/authorize",
302
+ tokenExchangeUrl: "https://api.linear.app/oauth/token",
281
303
  pingUrl: "https://api.linear.app/graphql",
282
304
  pingMethod: "POST",
283
305
  pingHeaders: { "Content-Type": "application/json" },
284
306
  pingBody: { query: "{ viewer { id name email } }" },
285
307
  baseUrl: "https://api.linear.app",
286
- displayName: "Linear",
308
+ displayLabel: "Linear",
287
309
  description: "Issues and projects",
288
310
  dashboardUrl: "https://linear.app/settings/api",
289
311
  clientIdPlaceholder: null,
312
+ logoUrl: "https://cdn.simpleicons.org/linear",
290
313
  defaultScopes: ["read", "write", "issues:create"],
291
314
  scopePolicy: {
292
315
  allowAdditionalScopes: false,
293
316
  allowedOptionalScopes: [],
294
317
  forbiddenScopes: [],
295
318
  },
296
- extraParams: { prompt: "consent" },
319
+ scopeSeparator: ",",
320
+ authorizeParams: { prompt: "consent" },
297
321
  loopbackPort: 17324,
298
322
  managedServiceConfigKey: "linear-oauth",
299
323
  injectionTemplates: [
@@ -304,6 +328,8 @@ const PROVIDER_SEED_DATA: Record<
304
328
  valuePrefix: "Bearer ",
305
329
  },
306
330
  ],
331
+ revokeUrl: "https://api.linear.app/oauth/revoke",
332
+ revokeBodyTemplate: { token: "{access_token}" },
307
333
  appType: "OAuth application",
308
334
  identityUrl: "https://api.linear.app/graphql",
309
335
  identityMethod: "POST",
@@ -313,15 +339,16 @@ const PROVIDER_SEED_DATA: Record<
313
339
  },
314
340
 
315
341
  spotify: {
316
- providerKey: "spotify",
317
- authUrl: "https://accounts.spotify.com/authorize",
318
- tokenUrl: "https://accounts.spotify.com/api/token",
342
+ provider: "spotify",
343
+ authorizeUrl: "https://accounts.spotify.com/authorize",
344
+ tokenExchangeUrl: "https://accounts.spotify.com/api/token",
319
345
  pingUrl: "https://api.spotify.com/v1/me",
320
346
  baseUrl: "https://api.spotify.com/v1",
321
- displayName: "Spotify",
347
+ displayLabel: "Spotify",
322
348
  description: "Music and playlists",
323
349
  dashboardUrl: "https://developer.spotify.com/dashboard",
324
350
  clientIdPlaceholder: null,
351
+ logoUrl: "https://cdn.simpleicons.org/spotify",
325
352
  defaultScopes: [
326
353
  "user-read-playback-state",
327
354
  "user-modify-playback-state",
@@ -354,15 +381,16 @@ const PROVIDER_SEED_DATA: Record<
354
381
  },
355
382
 
356
383
  todoist: {
357
- providerKey: "todoist",
358
- authUrl: "https://todoist.com/oauth/authorize",
359
- tokenUrl: "https://todoist.com/oauth/access_token",
384
+ provider: "todoist",
385
+ authorizeUrl: "https://todoist.com/oauth/authorize",
386
+ tokenExchangeUrl: "https://todoist.com/oauth/access_token",
360
387
  pingUrl: "https://api.todoist.com/rest/v2/projects",
361
388
  baseUrl: "https://api.todoist.com/rest/v2",
362
- displayName: "Todoist",
389
+ displayLabel: "Todoist",
363
390
  description: "Tasks and projects",
364
391
  dashboardUrl: "https://developer.todoist.com/appconsole.html",
365
392
  clientIdPlaceholder: null,
393
+ logoUrl: "https://cdn.simpleicons.org/todoist",
366
394
  defaultScopes: ["data:read_write"],
367
395
  scopePolicy: {
368
396
  allowAdditionalScopes: false,
@@ -387,15 +415,16 @@ const PROVIDER_SEED_DATA: Record<
387
415
  },
388
416
 
389
417
  discord: {
390
- providerKey: "discord",
391
- authUrl: "https://discord.com/oauth2/authorize",
392
- tokenUrl: "https://discord.com/api/v10/oauth2/token",
418
+ provider: "discord",
419
+ authorizeUrl: "https://discord.com/oauth2/authorize",
420
+ tokenExchangeUrl: "https://discord.com/api/v10/oauth2/token",
393
421
  pingUrl: "https://discord.com/api/v10/users/@me",
394
422
  baseUrl: "https://discord.com/api/v10",
395
- displayName: "Discord",
423
+ displayLabel: "Discord",
396
424
  description: "Servers and messages",
397
425
  dashboardUrl: "https://discord.com/developers/applications",
398
426
  clientIdPlaceholder: null,
427
+ logoUrl: "https://cdn.simpleicons.org/discord",
399
428
  defaultScopes: [
400
429
  "identify",
401
430
  "guilds",
@@ -422,16 +451,17 @@ const PROVIDER_SEED_DATA: Record<
422
451
  },
423
452
 
424
453
  dropbox: {
425
- providerKey: "dropbox",
426
- authUrl: "https://www.dropbox.com/oauth2/authorize",
427
- tokenUrl: "https://api.dropboxapi.com/oauth2/token",
454
+ provider: "dropbox",
455
+ authorizeUrl: "https://www.dropbox.com/oauth2/authorize",
456
+ tokenExchangeUrl: "https://api.dropboxapi.com/oauth2/token",
428
457
  pingUrl: "https://api.dropboxapi.com/2/users/get_current_account",
429
458
  pingMethod: "POST",
430
459
  baseUrl: "https://api.dropboxapi.com/2",
431
- displayName: "Dropbox",
460
+ displayLabel: "Dropbox",
432
461
  description: "Files and folders",
433
462
  dashboardUrl: "https://www.dropbox.com/developers/apps",
434
463
  clientIdPlaceholder: null,
464
+ logoUrl: "https://cdn.simpleicons.org/dropbox",
435
465
  defaultScopes: [
436
466
  "files.metadata.read",
437
467
  "files.content.read",
@@ -443,7 +473,7 @@ const PROVIDER_SEED_DATA: Record<
443
473
  allowedOptionalScopes: [],
444
474
  forbiddenScopes: [],
445
475
  },
446
- extraParams: { token_access_type: "offline" },
476
+ authorizeParams: { token_access_type: "offline" },
447
477
  loopbackPort: 17327,
448
478
  injectionTemplates: [
449
479
  {
@@ -466,15 +496,16 @@ const PROVIDER_SEED_DATA: Record<
466
496
  },
467
497
 
468
498
  asana: {
469
- providerKey: "asana",
470
- authUrl: "https://app.asana.com/-/oauth_authorize",
471
- tokenUrl: "https://app.asana.com/-/oauth_token",
499
+ provider: "asana",
500
+ authorizeUrl: "https://app.asana.com/-/oauth_authorize",
501
+ tokenExchangeUrl: "https://app.asana.com/-/oauth_token",
472
502
  pingUrl: "https://app.asana.com/api/1.0/users/me",
473
503
  baseUrl: "https://app.asana.com/api/1.0",
474
- displayName: "Asana",
504
+ displayLabel: "Asana",
475
505
  description: "Tasks and projects",
476
506
  dashboardUrl: "https://app.asana.com/0/my-apps",
477
507
  clientIdPlaceholder: null,
508
+ logoUrl: "https://cdn.simpleicons.org/asana",
478
509
  defaultScopes: ["default"],
479
510
  scopePolicy: {
480
511
  allowAdditionalScopes: false,
@@ -496,15 +527,16 @@ const PROVIDER_SEED_DATA: Record<
496
527
  },
497
528
 
498
529
  airtable: {
499
- providerKey: "airtable",
500
- authUrl: "https://airtable.com/oauth2/v1/authorize",
501
- tokenUrl: "https://airtable.com/oauth2/v1/token",
530
+ provider: "airtable",
531
+ authorizeUrl: "https://airtable.com/oauth2/v1/authorize",
532
+ tokenExchangeUrl: "https://airtable.com/oauth2/v1/token",
502
533
  pingUrl: "https://api.airtable.com/v0/meta/whoami",
503
534
  baseUrl: "https://api.airtable.com/v0",
504
- displayName: "Airtable",
535
+ displayLabel: "Airtable",
505
536
  description: "Bases and records",
506
537
  dashboardUrl: "https://airtable.com/create/tokens",
507
538
  clientIdPlaceholder: null,
539
+ logoUrl: "https://cdn.simpleicons.org/airtable",
508
540
  defaultScopes: [
509
541
  "data.records:read",
510
542
  "data.records:write",
@@ -531,15 +563,16 @@ const PROVIDER_SEED_DATA: Record<
531
563
  },
532
564
 
533
565
  hubspot: {
534
- providerKey: "hubspot",
535
- authUrl: "https://app.hubspot.com/oauth/authorize",
536
- tokenUrl: "https://api.hubapi.com/oauth/v1/token",
566
+ provider: "hubspot",
567
+ authorizeUrl: "https://app.hubspot.com/oauth/authorize",
568
+ tokenExchangeUrl: "https://api.hubapi.com/oauth/v1/token",
537
569
  pingUrl: "https://api.hubapi.com/crm/v3/objects/contacts?limit=1",
538
570
  baseUrl: "https://api.hubapi.com",
539
- displayName: "HubSpot",
571
+ displayLabel: "HubSpot",
540
572
  description: "CRM contacts and deals",
541
573
  dashboardUrl: "https://developers.hubspot.com/",
542
574
  clientIdPlaceholder: null,
575
+ logoUrl: "https://cdn.simpleicons.org/hubspot",
543
576
  defaultScopes: [
544
577
  "crm.objects.contacts.read",
545
578
  "crm.objects.contacts.write",
@@ -570,15 +603,16 @@ const PROVIDER_SEED_DATA: Record<
570
603
  },
571
604
 
572
605
  figma: {
573
- providerKey: "figma",
574
- authUrl: "https://www.figma.com/oauth",
575
- tokenUrl: "https://api.figma.com/v1/oauth/token",
606
+ provider: "figma",
607
+ authorizeUrl: "https://www.figma.com/oauth",
608
+ tokenExchangeUrl: "https://api.figma.com/v1/oauth/token",
576
609
  pingUrl: "https://api.figma.com/v1/me",
577
610
  baseUrl: "https://api.figma.com/v1",
578
- displayName: "Figma",
611
+ displayLabel: "Figma",
579
612
  description: "Design files and comments",
580
613
  dashboardUrl: "https://www.figma.com/developers/apps",
581
614
  clientIdPlaceholder: null,
615
+ logoUrl: "https://cdn.simpleicons.org/figma",
582
616
  defaultScopes: ["files:read", "file_comments:write"],
583
617
  scopePolicy: {
584
618
  allowAdditionalScopes: false,
@@ -601,16 +635,19 @@ const PROVIDER_SEED_DATA: Record<
601
635
  },
602
636
 
603
637
  outlook: {
604
- providerKey: "outlook",
605
- authUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
606
- tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token",
638
+ provider: "outlook",
639
+ authorizeUrl:
640
+ "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
641
+ tokenExchangeUrl:
642
+ "https://login.microsoftonline.com/common/oauth2/v2.0/token",
607
643
  pingUrl: "https://graph.microsoft.com/v1.0/me",
608
644
  baseUrl: "https://graph.microsoft.com",
609
- displayName: "Outlook / Microsoft",
645
+ displayLabel: "Outlook / Microsoft",
610
646
  description: "Email and calendar",
611
647
  dashboardUrl:
612
648
  "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
613
649
  clientIdPlaceholder: "Application (client) ID from Azure portal",
650
+ logoUrl: "https://cdn.simpleicons.org/microsoftoutlook",
614
651
  defaultScopes: [
615
652
  "openid",
616
653
  "profile",
@@ -628,7 +665,7 @@ const PROVIDER_SEED_DATA: Record<
628
665
  allowedOptionalScopes: ["Contacts.Read", "Files.Read", "Tasks.ReadWrite"],
629
666
  forbiddenScopes: [],
630
667
  },
631
- extraParams: { prompt: "consent" },
668
+ authorizeParams: { prompt: "consent" },
632
669
  tokenEndpointAuthMethod: "client_secret_post",
633
670
  loopbackPort: 17334,
634
671
  managedServiceConfigKey: "outlook-oauth",
@@ -647,18 +684,19 @@ const PROVIDER_SEED_DATA: Record<
647
684
 
648
685
  // Manual-token providers: these don't use OAuth2 flows but need provider
649
686
  // rows so that oauth_app and oauth_connection FK chains can reference them.
650
- // The authUrl/tokenUrl values are placeholders — never used at runtime.
687
+ // The authorizeUrl/tokenExchangeUrl values are placeholders — never used at runtime.
651
688
  slack_channel: {
652
- providerKey: "slack_channel",
653
- authUrl: "urn:manual-token",
654
- tokenUrl: "urn:manual-token",
689
+ provider: "slack_channel",
690
+ authorizeUrl: "urn:manual-token",
691
+ tokenExchangeUrl: "urn:manual-token",
655
692
  pingUrl: "https://slack.com/api/auth.test",
656
693
  baseUrl: "https://slack.com/api",
657
- displayName: "Slack Channel",
694
+ displayLabel: "Slack Channel",
658
695
  description: "Channel bot token",
659
696
  dashboardUrl: null,
660
697
  clientIdPlaceholder: null,
661
698
  requiresClientSecret: false,
699
+ logoUrl: "https://cdn.simpleicons.org/slack",
662
700
  defaultScopes: [],
663
701
  scopePolicy: {
664
702
  allowAdditionalScopes: false,
@@ -668,15 +706,16 @@ const PROVIDER_SEED_DATA: Record<
668
706
  },
669
707
 
670
708
  telegram: {
671
- providerKey: "telegram",
672
- authUrl: "urn:manual-token",
673
- tokenUrl: "urn:manual-token",
709
+ provider: "telegram",
710
+ authorizeUrl: "urn:manual-token",
711
+ tokenExchangeUrl: "urn:manual-token",
674
712
  baseUrl: "https://api.telegram.org",
675
- displayName: "Telegram",
713
+ displayLabel: "Telegram",
676
714
  description: "Bot messaging",
677
715
  dashboardUrl: null,
678
716
  clientIdPlaceholder: null,
679
717
  requiresClientSecret: false,
718
+ logoUrl: "https://cdn.simpleicons.org/telegram",
680
719
  defaultScopes: [],
681
720
  scopePolicy: {
682
721
  allowAdditionalScopes: false,
@@ -188,7 +188,7 @@ export async function storeOAuth2Tokens(
188
188
  } else {
189
189
  const conn = createConnection({
190
190
  oauthAppId: app.id,
191
- providerKey: service,
191
+ provider: service,
192
192
  accountInfo: resolvedAccountInfo,
193
193
  grantedScopes,
194
194
  expiresAt: expiresAt ?? undefined,
@@ -1,27 +1,20 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  /**
4
- * Two-axis permission model:
5
- * - `askBeforeActing` — LLM behavior toggle: when true the assistant checks in
6
- * with the user before taking actions.
7
- * - `hostAccess` System-enforced gate: when true the assistant can execute
8
- * commands on the host machine without prompting.
4
+ * Host-access permission state.
5
+ *
6
+ * The only remaining permission-mode axis is whether the assistant can
7
+ * execute commands on the host machine without prompting.
9
8
  */
10
9
  export type PermissionMode = {
11
- askBeforeActing: boolean;
12
10
  hostAccess: boolean;
13
11
  };
14
12
 
15
13
  export const DEFAULT_PERMISSION_MODE: PermissionMode = {
16
- askBeforeActing: true,
17
14
  hostAccess: false,
18
15
  };
19
16
 
20
17
  export const PermissionModeSchema = z.object({
21
- askBeforeActing: z
22
- .boolean({ error: "permissionMode.askBeforeActing must be a boolean" })
23
- .default(true)
24
- .describe("Whether the assistant should check in before taking actions"),
25
18
  hostAccess: z
26
19
  .boolean({ error: "permissionMode.hostAccess must be a boolean" })
27
20
  .default(false)
@@ -20,6 +20,7 @@ interface PendingPrompt {
20
20
  reject: (reason: Error) => void;
21
21
  timer: ReturnType<typeof setTimeout>;
22
22
  toolUseId?: string;
23
+ hostAccessEnablePrompt?: boolean;
23
24
  }
24
25
 
25
26
  export type ConfirmationStateCallback = (
@@ -64,6 +65,7 @@ export class PermissionPrompter {
64
65
  signal?: AbortSignal,
65
66
  temporaryOptionsAvailable?: Array<"allow_10m" | "allow_conversation">,
66
67
  toolUseId?: string,
68
+ hostAccessEnablePrompt?: boolean,
67
69
  ): Promise<{
68
70
  decision: UserDecision;
69
71
  selectedPattern?: string;
@@ -89,7 +91,13 @@ export class PermissionPrompter {
89
91
  });
90
92
  }, timeoutMs);
91
93
 
92
- this.pending.set(requestId, { resolve, reject, timer, toolUseId });
94
+ this.pending.set(requestId, {
95
+ resolve,
96
+ reject,
97
+ timer,
98
+ toolUseId,
99
+ hostAccessEnablePrompt,
100
+ });
93
101
 
94
102
  if (signal) {
95
103
  const onAbort = () => {
@@ -143,6 +151,10 @@ export class PermissionPrompter {
143
151
  return this.pending.get(requestId)?.toolUseId;
144
152
  }
145
153
 
154
+ isHostAccessEnablePrompt(requestId: string): boolean {
155
+ return this.pending.get(requestId)?.hostAccessEnablePrompt === true;
156
+ }
157
+
146
158
  resolveConfirmation(
147
159
  requestId: string,
148
160
  decision: UserDecision,