@vellumai/assistant 0.6.1 → 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 (463) hide show
  1. package/bun.lock +40 -40
  2. package/bunfig.toml +3 -0
  3. package/docker-entrypoint.sh +12 -2
  4. package/docs/architecture/memory.md +1 -1
  5. package/node_modules/@vellumai/ces-contracts/src/handles.ts +7 -9
  6. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
  7. package/openapi.yaml +184 -69
  8. package/package.json +41 -41
  9. package/scripts/generate-openapi.ts +1 -2
  10. package/src/__tests__/acp-session.test.ts +43 -0
  11. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
  12. package/src/__tests__/app-executors.test.ts +1 -0
  13. package/src/__tests__/app-source-watcher.test.ts +37 -11
  14. package/src/__tests__/approval-routes-http.test.ts +178 -1
  15. package/src/__tests__/assistant-event-hub.test.ts +30 -0
  16. package/src/__tests__/browser-fill-credential.test.ts +229 -94
  17. package/src/__tests__/browser-manager.test.ts +40 -27
  18. package/src/__tests__/catalog-files.test.ts +862 -0
  19. package/src/__tests__/channel-approvals.test.ts +53 -0
  20. package/src/__tests__/checker.test.ts +104 -170
  21. package/src/__tests__/cli-command-risk-guard.test.ts +1 -1
  22. package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
  23. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  24. package/src/__tests__/config-schema.test.ts +125 -48
  25. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
  26. package/src/__tests__/context-overflow-approval.test.ts +21 -6
  27. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -1
  28. package/src/__tests__/conversation-agent-loop.test.ts +1 -1
  29. package/src/__tests__/conversation-analysis-routes.test.ts +169 -0
  30. package/src/__tests__/conversation-attachments.test.ts +80 -4
  31. package/src/__tests__/conversation-confirmation-signals.test.ts +155 -0
  32. package/src/__tests__/conversation-directories-parse.test.ts +105 -0
  33. package/src/__tests__/conversation-fork-crud.test.ts +17 -0
  34. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  35. package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
  36. package/src/__tests__/conversation-inject-context.test.ts +103 -0
  37. package/src/__tests__/conversation-queue.test.ts +45 -2
  38. package/src/__tests__/conversation-routes-disk-view.test.ts +5 -0
  39. package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
  40. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  41. package/src/__tests__/conversation-runtime-assembly.test.ts +269 -46
  42. package/src/__tests__/conversation-starter-routes.test.ts +126 -0
  43. package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
  44. package/src/__tests__/conversation-store.test.ts +195 -0
  45. package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
  46. package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -3
  47. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  48. package/src/__tests__/credential-vault-unit.test.ts +4 -4
  49. package/src/__tests__/credential-vault.test.ts +152 -13
  50. package/src/__tests__/credentials-cli.test.ts +2 -2
  51. package/src/__tests__/date-context.test.ts +4 -4
  52. package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
  53. package/src/__tests__/extension-id-sync-guard.test.ts +155 -0
  54. package/src/__tests__/fixtures/mock-chrome-extension.ts +375 -0
  55. package/src/__tests__/gateway-only-guard.test.ts +3 -0
  56. package/src/__tests__/gemini-provider.test.ts +2 -2
  57. package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
  58. package/src/__tests__/headless-browser-interactions.test.ts +707 -371
  59. package/src/__tests__/headless-browser-navigate.test.ts +389 -47
  60. package/src/__tests__/headless-browser-read-tools.test.ts +266 -103
  61. package/src/__tests__/headless-browser-snapshot.test.ts +240 -77
  62. package/src/__tests__/host-bash-proxy.test.ts +150 -1
  63. package/src/__tests__/host-browser-e2e-cloud.test.ts +462 -0
  64. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
  65. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
  66. package/src/__tests__/host-browser-event-routes.test.ts +350 -0
  67. package/src/__tests__/host-browser-proxy.test.ts +444 -0
  68. package/src/__tests__/host-browser-routes.test.ts +198 -0
  69. package/src/__tests__/host-browser-ws-events-e2e.test.ts +320 -0
  70. package/src/__tests__/host-cu-proxy.test.ts +171 -1
  71. package/src/__tests__/host-file-proxy.test.ts +185 -1
  72. package/src/__tests__/host-file-read-tool.test.ts +52 -0
  73. package/src/__tests__/host-proxy-interface.test.ts +165 -0
  74. package/src/__tests__/host-shell-tool.test.ts +1 -11
  75. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  76. package/src/__tests__/init-feature-flag-overrides.test.ts +167 -0
  77. package/src/__tests__/inline-command-runner.test.ts +7 -5
  78. package/src/__tests__/integration-status.test.ts +6 -7
  79. package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
  80. package/src/__tests__/log-export-workspace.test.ts +190 -0
  81. package/src/__tests__/managed-credential-catalog-cli.test.ts +12 -14
  82. package/src/__tests__/mcp-client-auth.test.ts +40 -4
  83. package/src/__tests__/mcp-health-check.test.ts +10 -3
  84. package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
  85. package/src/__tests__/migration-export-http.test.ts +61 -2
  86. package/src/__tests__/migration-export-streaming.test.ts +66 -0
  87. package/src/__tests__/migration-import-commit-http.test.ts +101 -1
  88. package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
  89. package/src/__tests__/navigate-settings-tab.test.ts +14 -1
  90. package/src/__tests__/notification-broadcaster.test.ts +65 -0
  91. package/src/__tests__/oauth-apps-routes.test.ts +17 -12
  92. package/src/__tests__/oauth-cli.test.ts +707 -60
  93. package/src/__tests__/oauth-connect-orchestrator.test.ts +116 -24
  94. package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
  95. package/src/__tests__/oauth-provider-serializer.test.ts +146 -10
  96. package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
  97. package/src/__tests__/oauth-providers-routes.test.ts +50 -14
  98. package/src/__tests__/oauth-store.test.ts +1386 -182
  99. package/src/__tests__/oauth2-gateway-transport.test.ts +211 -20
  100. package/src/__tests__/onboarding-template-contract.test.ts +74 -55
  101. package/src/__tests__/openai-provider.test.ts +2 -2
  102. package/src/__tests__/outlook-categories.test.ts +1 -1
  103. package/src/__tests__/outlook-client-automation.test.ts +1 -1
  104. package/src/__tests__/outlook-compose-tools.test.ts +1 -1
  105. package/src/__tests__/outlook-email-watcher.test.ts +1 -1
  106. package/src/__tests__/outlook-follow-up.test.ts +1 -1
  107. package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
  108. package/src/__tests__/outlook-trash.test.ts +1 -1
  109. package/src/__tests__/outlook-unsubscribe.test.ts +1 -1
  110. package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
  111. package/src/__tests__/permission-mode.test.ts +28 -56
  112. package/src/__tests__/pkb-autoinject.test.ts +96 -0
  113. package/src/__tests__/platform-callback-registration.test.ts +19 -0
  114. package/src/__tests__/post-turn-tool-result-truncation.test.ts +296 -0
  115. package/src/__tests__/proxy-approval-callback.test.ts +18 -0
  116. package/src/__tests__/require-fresh-approval.test.ts +40 -3
  117. package/src/__tests__/sandbox-diagnostics.test.ts +1 -32
  118. package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
  119. package/src/__tests__/schedule-routes.test.ts +162 -0
  120. package/src/__tests__/secret-detection-handler.test.ts +84 -0
  121. package/src/__tests__/secret-ingress-http.test.ts +1 -0
  122. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  123. package/src/__tests__/set-permission-mode.test.ts +13 -250
  124. package/src/__tests__/skills-file-content-endpoint.test.ts +670 -0
  125. package/src/__tests__/skills-files-catalog-fallback.test.ts +450 -0
  126. package/src/__tests__/slack-channel-config.test.ts +12 -15
  127. package/src/__tests__/subagent-detail.test.ts +44 -2
  128. package/src/__tests__/subagent-disposal.test.ts +1 -0
  129. package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
  130. package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
  131. package/src/__tests__/subagent-manager-notify.test.ts +1 -0
  132. package/src/__tests__/subagent-notify-parent.test.ts +1 -0
  133. package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
  134. package/src/__tests__/subagent-tools.test.ts +1 -0
  135. package/src/__tests__/subagent-types.test.ts +1 -0
  136. package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
  137. package/src/__tests__/system-prompt.test.ts +72 -1
  138. package/src/__tests__/task-scheduler.test.ts +32 -6
  139. package/src/__tests__/telegram-config.test.ts +10 -13
  140. package/src/__tests__/terminal-sandbox.test.ts +1 -1
  141. package/src/__tests__/terminal-tools.test.ts +11 -5
  142. package/src/__tests__/test-preload.ts +14 -0
  143. package/src/__tests__/tool-approval-handler.test.ts +73 -0
  144. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -1
  145. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -8
  146. package/src/__tests__/tool-executor.test.ts +0 -1
  147. package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
  148. package/src/__tests__/top-level-renderer.test.ts +73 -1
  149. package/src/__tests__/transport-hints-queue.test.ts +62 -0
  150. package/src/__tests__/trust-store.test.ts +4 -4
  151. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
  152. package/src/__tests__/v2-consent-policy.test.ts +103 -0
  153. package/src/__tests__/workspace-migration-030-seed-pkb-autoinject.test.ts +168 -0
  154. package/src/__tests__/workspace-policy.test.ts +2 -7
  155. package/src/acp/client-handler.ts +30 -4
  156. package/src/agent/loop.ts +12 -35
  157. package/src/approvals/guardian-request-resolvers.ts +21 -15
  158. package/src/browser-session/__tests__/manager.test.ts +297 -0
  159. package/src/browser-session/backends/cdp-inspect.ts +30 -0
  160. package/src/browser-session/backends/extension.ts +26 -0
  161. package/src/browser-session/backends/local.ts +24 -0
  162. package/src/browser-session/events.ts +164 -0
  163. package/src/browser-session/index.ts +27 -0
  164. package/src/browser-session/manager.ts +159 -0
  165. package/src/browser-session/types.ts +28 -0
  166. package/src/channels/__tests__/types.test.ts +134 -0
  167. package/src/channels/types.ts +55 -0
  168. package/src/cli/__tests__/run-assistant-command.ts +34 -7
  169. package/src/cli/__tests__/unknown-command.test.ts +33 -0
  170. package/src/cli/commands/browser-relay.ts +339 -409
  171. package/src/cli/commands/credentials.ts +3 -3
  172. package/src/cli/commands/default-action.ts +68 -1
  173. package/src/cli/commands/email.ts +18 -13
  174. package/src/cli/commands/mcp.ts +16 -4
  175. package/src/cli/commands/oauth/__tests__/connect.test.ts +68 -41
  176. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
  177. package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
  178. package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
  179. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +31 -33
  180. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +329 -0
  181. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +116 -12
  182. package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
  183. package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
  184. package/src/cli/commands/oauth/apps.ts +7 -4
  185. package/src/cli/commands/oauth/connect.ts +16 -2
  186. package/src/cli/commands/oauth/disconnect.ts +1 -1
  187. package/src/cli/commands/oauth/providers.ts +200 -36
  188. package/src/cli/commands/oauth/shared.ts +5 -5
  189. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +259 -0
  190. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  191. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  192. package/src/cli/commands/platform/__tests__/status.test.ts +1 -1
  193. package/src/cli/commands/platform/index.ts +107 -10
  194. package/src/cli/commands/usage.ts +10 -9
  195. package/src/cli/lib/daemon-credential-client.ts +4 -0
  196. package/src/cli/program.ts +10 -3
  197. package/src/config/assistant-feature-flags.ts +59 -55
  198. package/src/config/bundled-skills/app-builder/SKILL.md +33 -173
  199. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +105 -0
  200. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
  201. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
  202. package/src/config/bundled-skills/contacts/SKILL.md +3 -0
  203. package/src/config/bundled-skills/document/SKILL.md +4 -0
  204. package/src/config/bundled-skills/gmail/SKILL.md +12 -7
  205. package/src/config/bundled-skills/gmail/TOOLS.json +1 -1
  206. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +2 -1
  207. package/src/config/bundled-skills/outlook/SKILL.md +7 -0
  208. package/src/config/bundled-skills/settings/TOOLS.json +1 -1
  209. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +8 -3
  210. package/src/config/bundled-skills/subagent/SKILL.md +21 -0
  211. package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
  212. package/src/config/bundled-skills/tasks/SKILL.md +5 -0
  213. package/src/config/env-registry.ts +14 -0
  214. package/src/config/env.ts +21 -0
  215. package/src/config/feature-flag-registry.json +46 -7
  216. package/src/config/loader.ts +56 -1
  217. package/src/config/sanitize-for-transfer.ts +47 -0
  218. package/src/config/schema.ts +46 -5
  219. package/src/config/schemas/host-browser.ts +66 -0
  220. package/src/config/schemas/memory-lifecycle.ts +1 -1
  221. package/src/config/schemas/memory-retrieval.ts +103 -0
  222. package/src/config/schemas/security.ts +0 -6
  223. package/src/config/schemas/services.ts +16 -0
  224. package/src/config/types.ts +0 -1
  225. package/src/context/post-turn-tool-result-truncation.ts +176 -0
  226. package/src/context/window-manager.ts +19 -1
  227. package/src/credential-execution/approval-bridge.ts +49 -16
  228. package/src/credential-execution/managed-catalog.ts +3 -7
  229. package/src/daemon/__tests__/conversation-tool-setup.test.ts +186 -0
  230. package/src/daemon/app-source-watcher.ts +35 -0
  231. package/src/daemon/config-watcher.ts +6 -2
  232. package/src/daemon/context-overflow-approval.ts +5 -1
  233. package/src/daemon/conversation-agent-loop-handlers.ts +17 -2
  234. package/src/daemon/conversation-agent-loop.ts +74 -19
  235. package/src/daemon/conversation-attachments.ts +40 -1
  236. package/src/daemon/conversation-messaging.ts +3 -0
  237. package/src/daemon/conversation-process.ts +66 -3
  238. package/src/daemon/conversation-queue-manager.ts +8 -0
  239. package/src/daemon/conversation-runtime-assembly.ts +159 -20
  240. package/src/daemon/conversation-surfaces.ts +78 -12
  241. package/src/daemon/conversation-tool-setup.ts +74 -11
  242. package/src/daemon/conversation-workspace.ts +12 -0
  243. package/src/daemon/conversation.ts +227 -11
  244. package/src/daemon/date-context.ts +10 -10
  245. package/src/daemon/first-greeting.ts +3 -2
  246. package/src/daemon/handlers/conversations.ts +9 -139
  247. package/src/daemon/handlers/shared.ts +65 -0
  248. package/src/daemon/handlers/skills.ts +232 -37
  249. package/src/daemon/host-bash-proxy.ts +48 -13
  250. package/src/daemon/host-browser-proxy.ts +191 -0
  251. package/src/daemon/host-cu-proxy.ts +36 -11
  252. package/src/daemon/host-file-proxy.ts +57 -9
  253. package/src/daemon/lifecycle.ts +86 -12
  254. package/src/daemon/message-protocol.ts +7 -0
  255. package/src/daemon/message-types/conversations.ts +59 -13
  256. package/src/daemon/message-types/host-browser.ts +100 -0
  257. package/src/daemon/message-types/messages.ts +5 -6
  258. package/src/daemon/message-types/notifications.ts +12 -0
  259. package/src/daemon/message-types/settings.ts +12 -0
  260. package/src/daemon/message-types/skills.ts +10 -0
  261. package/src/daemon/message-types/subagents.ts +2 -0
  262. package/src/daemon/server.ts +112 -35
  263. package/src/daemon/tool-side-effects.ts +6 -0
  264. package/src/daemon/transport-hints.ts +14 -0
  265. package/src/inbound/platform-callback-registration.ts +18 -17
  266. package/src/index.ts +1 -1
  267. package/src/mcp/client.ts +59 -24
  268. package/src/memory/app-store.ts +31 -1
  269. package/src/memory/conversation-crud.ts +38 -10
  270. package/src/memory/conversation-directories.ts +39 -0
  271. package/src/memory/conversation-group-migration.ts +65 -5
  272. package/src/memory/conversation-starters-cadence.ts +76 -0
  273. package/src/memory/conversation-title-service.ts +5 -2
  274. package/src/memory/db-init.ts +12 -0
  275. package/src/memory/embedding-backend.test.ts +75 -0
  276. package/src/memory/embedding-backend.ts +131 -5
  277. package/src/memory/embedding-gemini.test.ts +54 -0
  278. package/src/memory/embedding-gemini.ts +20 -9
  279. package/src/memory/embedding-local.ts +177 -18
  280. package/src/memory/graph/capability-seed.ts +3 -5
  281. package/src/memory/graph/consolidation.ts +10 -23
  282. package/src/memory/graph/extraction-job.ts +15 -0
  283. package/src/memory/graph/retriever.ts +40 -22
  284. package/src/memory/graph/store.test.ts +7 -3
  285. package/src/memory/graph/store.ts +47 -12
  286. package/src/memory/group-crud.ts +25 -9
  287. package/src/memory/llm-usage-store.ts +45 -4
  288. package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
  289. package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
  290. package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
  291. package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
  292. package/src/memory/migrations/217-conversation-host-access.ts +40 -0
  293. package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
  294. package/src/memory/migrations/index.ts +6 -0
  295. package/src/memory/migrations/registry.ts +8 -0
  296. package/src/memory/schema/conversations.ts +1 -0
  297. package/src/memory/schema/oauth.ts +18 -13
  298. package/src/messaging/provider.ts +1 -1
  299. package/src/notifications/broadcaster.ts +6 -0
  300. package/src/notifications/conversation-pairing.ts +12 -4
  301. package/src/notifications/emit-signal.ts +14 -0
  302. package/src/notifications/signal.ts +11 -0
  303. package/src/oauth/AGENTS.md +76 -0
  304. package/src/oauth/__tests__/identity-verifier.test.ts +24 -19
  305. package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
  306. package/src/oauth/byo-connection.test.ts +8 -8
  307. package/src/oauth/byo-connection.ts +7 -7
  308. package/src/oauth/connect-orchestrator.ts +23 -21
  309. package/src/oauth/connect-types.ts +3 -3
  310. package/src/oauth/connection-resolver.test.ts +17 -4
  311. package/src/oauth/connection-resolver.ts +16 -16
  312. package/src/oauth/connection.ts +1 -1
  313. package/src/oauth/manual-token-connection.ts +13 -13
  314. package/src/oauth/oauth-store.ts +214 -100
  315. package/src/oauth/platform-connection.test.ts +5 -5
  316. package/src/oauth/platform-connection.ts +4 -4
  317. package/src/oauth/provider-serializer.ts +31 -5
  318. package/src/oauth/revoke.ts +76 -0
  319. package/src/oauth/seed-providers.ts +127 -87
  320. package/src/oauth/token-persistence.ts +1 -1
  321. package/src/permissions/checker.ts +3 -3
  322. package/src/permissions/defaults.ts +7 -8
  323. package/src/permissions/permission-mode.ts +4 -11
  324. package/src/permissions/prompter.ts +13 -3
  325. package/src/permissions/v2-consent-policy.ts +87 -0
  326. package/src/platform/client.ts +1 -1
  327. package/src/prompts/system-prompt.ts +18 -21
  328. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
  329. package/src/prompts/templates/BOOTSTRAP.md +59 -96
  330. package/src/prompts/templates/SOUL.md +11 -11
  331. package/src/providers/anthropic/client.ts +1 -0
  332. package/src/providers/types.ts +1 -1
  333. package/src/runtime/AGENTS.md +23 -0
  334. package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
  335. package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
  336. package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
  337. package/src/runtime/assistant-event-hub.ts +24 -2
  338. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  339. package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
  340. package/src/runtime/auth/__tests__/route-policy.test.ts +8 -0
  341. package/src/runtime/auth/middleware.ts +98 -0
  342. package/src/runtime/auth/route-policy.ts +6 -7
  343. package/src/runtime/auth/token-service.ts +8 -0
  344. package/src/runtime/capability-tokens.ts +414 -0
  345. package/src/runtime/channel-approvals.ts +18 -5
  346. package/src/runtime/chrome-extension-registry.ts +332 -0
  347. package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
  348. package/src/runtime/guardian-decision-types.ts +7 -0
  349. package/src/runtime/http-server.ts +425 -70
  350. package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
  351. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
  352. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +162 -0
  353. package/src/runtime/migrations/migration-transport.ts +6 -0
  354. package/src/runtime/migrations/migration-wizard.ts +22 -2
  355. package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
  356. package/src/runtime/migrations/vbundle-builder.ts +145 -38
  357. package/src/runtime/migrations/vbundle-import-analyzer.ts +19 -0
  358. package/src/runtime/migrations/vbundle-importer.ts +55 -5
  359. package/src/runtime/pending-interactions.ts +29 -13
  360. package/src/runtime/routes/approval-routes.ts +90 -16
  361. package/src/runtime/routes/browser-cdp-routes.ts +229 -0
  362. package/src/runtime/routes/browser-extension-pair-routes.ts +497 -0
  363. package/src/runtime/routes/conversation-analysis-routes.ts +18 -5
  364. package/src/runtime/routes/conversation-management-routes.ts +108 -0
  365. package/src/runtime/routes/conversation-routes.ts +308 -28
  366. package/src/runtime/routes/conversation-starter-routes.ts +78 -16
  367. package/src/runtime/routes/group-routes.ts +22 -8
  368. package/src/runtime/routes/guardian-action-routes.ts +24 -13
  369. package/src/runtime/routes/host-browser-routes.ts +279 -0
  370. package/src/runtime/routes/host-file-routes.ts +9 -1
  371. package/src/runtime/routes/identity-routes.ts +259 -16
  372. package/src/runtime/routes/log-export/AGENTS.md +104 -0
  373. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +103 -0
  374. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +716 -0
  375. package/src/runtime/routes/log-export/workspace-allowlist.ts +458 -0
  376. package/src/runtime/routes/log-export-routes.ts +60 -25
  377. package/src/runtime/routes/memory-item-routes.ts +1 -7
  378. package/src/runtime/routes/migration-routes.ts +87 -2
  379. package/src/runtime/routes/oauth-apps.ts +15 -17
  380. package/src/runtime/routes/oauth-providers.ts +4 -0
  381. package/src/runtime/routes/schedule-routes.ts +24 -11
  382. package/src/runtime/routes/settings-routes.ts +9 -97
  383. package/src/runtime/routes/skills-routes.ts +52 -2
  384. package/src/runtime/routes/subagents-routes.ts +14 -10
  385. package/src/runtime/routes/usage-routes.ts +8 -7
  386. package/src/runtime/routes/workspace-routes.test.ts +22 -0
  387. package/src/runtime/routes/workspace-routes.ts +8 -1
  388. package/src/runtime/routes/workspace-utils.ts +2 -0
  389. package/src/schedule/scheduler.ts +7 -5
  390. package/src/security/ces-credential-client.ts +20 -0
  391. package/src/security/ces-rpc-credential-backend.ts +17 -0
  392. package/src/security/credential-backend.ts +5 -0
  393. package/src/security/oauth2.ts +42 -25
  394. package/src/security/secure-keys.ts +118 -25
  395. package/src/security/token-manager.ts +23 -10
  396. package/src/skills/catalog-files.ts +492 -0
  397. package/src/skills/inline-command-runner.ts +12 -14
  398. package/src/subagent/manager.ts +131 -26
  399. package/src/subagent/types.ts +19 -0
  400. package/src/tools/apps/executors.ts +11 -2
  401. package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
  402. package/src/tools/browser/auth-detector.ts +43 -12
  403. package/src/tools/browser/browser-execution.ts +645 -340
  404. package/src/tools/browser/browser-manager.ts +36 -12
  405. package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
  406. package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
  407. package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +870 -0
  408. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +330 -0
  409. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +377 -0
  410. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
  411. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
  412. package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
  413. package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
  414. package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
  415. package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
  416. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +743 -0
  417. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
  418. package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +578 -0
  419. package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
  420. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +635 -0
  421. package/src/tools/browser/cdp-client/errors.ts +34 -0
  422. package/src/tools/browser/cdp-client/extension-cdp-client.ts +125 -0
  423. package/src/tools/browser/cdp-client/factory.ts +204 -0
  424. package/src/tools/browser/cdp-client/index.ts +14 -0
  425. package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
  426. package/src/tools/browser/cdp-client/types.ts +52 -0
  427. package/src/tools/filesystem/edit.ts +1 -1
  428. package/src/tools/filesystem/list.ts +1 -1
  429. package/src/tools/filesystem/read.ts +1 -1
  430. package/src/tools/filesystem/write.ts +2 -1
  431. package/src/tools/host-filesystem/edit.ts +1 -1
  432. package/src/tools/host-filesystem/read.ts +12 -15
  433. package/src/tools/host-filesystem/write.ts +1 -1
  434. package/src/tools/host-terminal/host-shell.ts +21 -16
  435. package/src/tools/permission-checker.ts +77 -100
  436. package/src/tools/registry.ts +0 -2
  437. package/src/tools/secret-detection-handler.ts +34 -1
  438. package/src/tools/shared/filesystem/image-read.ts +61 -40
  439. package/src/tools/skills/sandbox-runner.ts +3 -6
  440. package/src/tools/subagent/spawn.ts +47 -3
  441. package/src/tools/subagent/status.ts +2 -0
  442. package/src/tools/system/register.ts +2 -16
  443. package/src/tools/terminal/safe-env.ts +7 -0
  444. package/src/tools/terminal/sandbox-diagnostics.ts +4 -4
  445. package/src/tools/terminal/sandbox.ts +4 -1
  446. package/src/tools/terminal/shell.ts +24 -21
  447. package/src/tools/tool-approval-handler.ts +48 -2
  448. package/src/tools/types.ts +2 -3
  449. package/src/util/platform.ts +14 -19
  450. package/src/watcher/provider-types.ts +1 -1
  451. package/src/workspace/migrations/029-seed-pkb.ts +1 -0
  452. package/src/workspace/migrations/030-seed-pkb-autoinject.ts +73 -0
  453. package/src/workspace/migrations/registry.ts +2 -0
  454. package/src/workspace/top-level-renderer.ts +19 -1
  455. package/src/__tests__/chrome-cdp.test.ts +0 -419
  456. package/src/__tests__/permission-mode-sse.test.ts +0 -418
  457. package/src/__tests__/permission-mode-store.test.ts +0 -277
  458. package/src/browser-extension-relay/protocol.ts +0 -63
  459. package/src/browser-extension-relay/server.ts +0 -203
  460. package/src/config/schemas/sandbox.ts +0 -14
  461. package/src/permissions/permission-mode-store.ts +0 -180
  462. package/src/tools/browser/chrome-cdp.ts +0 -239
  463. 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,26 +297,29 @@ 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,
322
+ managedServiceConfigKey: "linear-oauth",
298
323
  injectionTemplates: [
299
324
  {
300
325
  hostPattern: "api.linear.app",
@@ -303,6 +328,8 @@ const PROVIDER_SEED_DATA: Record<
303
328
  valuePrefix: "Bearer ",
304
329
  },
305
330
  ],
331
+ revokeUrl: "https://api.linear.app/oauth/revoke",
332
+ revokeBodyTemplate: { token: "{access_token}" },
306
333
  appType: "OAuth application",
307
334
  identityUrl: "https://api.linear.app/graphql",
308
335
  identityMethod: "POST",
@@ -312,15 +339,16 @@ const PROVIDER_SEED_DATA: Record<
312
339
  },
313
340
 
314
341
  spotify: {
315
- providerKey: "spotify",
316
- authUrl: "https://accounts.spotify.com/authorize",
317
- 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",
318
345
  pingUrl: "https://api.spotify.com/v1/me",
319
346
  baseUrl: "https://api.spotify.com/v1",
320
- displayName: "Spotify",
347
+ displayLabel: "Spotify",
321
348
  description: "Music and playlists",
322
349
  dashboardUrl: "https://developer.spotify.com/dashboard",
323
350
  clientIdPlaceholder: null,
351
+ logoUrl: "https://cdn.simpleicons.org/spotify",
324
352
  defaultScopes: [
325
353
  "user-read-playback-state",
326
354
  "user-modify-playback-state",
@@ -353,15 +381,16 @@ const PROVIDER_SEED_DATA: Record<
353
381
  },
354
382
 
355
383
  todoist: {
356
- providerKey: "todoist",
357
- authUrl: "https://todoist.com/oauth/authorize",
358
- 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",
359
387
  pingUrl: "https://api.todoist.com/rest/v2/projects",
360
388
  baseUrl: "https://api.todoist.com/rest/v2",
361
- displayName: "Todoist",
389
+ displayLabel: "Todoist",
362
390
  description: "Tasks and projects",
363
391
  dashboardUrl: "https://developer.todoist.com/appconsole.html",
364
392
  clientIdPlaceholder: null,
393
+ logoUrl: "https://cdn.simpleicons.org/todoist",
365
394
  defaultScopes: ["data:read_write"],
366
395
  scopePolicy: {
367
396
  allowAdditionalScopes: false,
@@ -386,15 +415,16 @@ const PROVIDER_SEED_DATA: Record<
386
415
  },
387
416
 
388
417
  discord: {
389
- providerKey: "discord",
390
- authUrl: "https://discord.com/oauth2/authorize",
391
- 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",
392
421
  pingUrl: "https://discord.com/api/v10/users/@me",
393
422
  baseUrl: "https://discord.com/api/v10",
394
- displayName: "Discord",
423
+ displayLabel: "Discord",
395
424
  description: "Servers and messages",
396
425
  dashboardUrl: "https://discord.com/developers/applications",
397
426
  clientIdPlaceholder: null,
427
+ logoUrl: "https://cdn.simpleicons.org/discord",
398
428
  defaultScopes: [
399
429
  "identify",
400
430
  "guilds",
@@ -421,16 +451,17 @@ const PROVIDER_SEED_DATA: Record<
421
451
  },
422
452
 
423
453
  dropbox: {
424
- providerKey: "dropbox",
425
- authUrl: "https://www.dropbox.com/oauth2/authorize",
426
- 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",
427
457
  pingUrl: "https://api.dropboxapi.com/2/users/get_current_account",
428
458
  pingMethod: "POST",
429
459
  baseUrl: "https://api.dropboxapi.com/2",
430
- displayName: "Dropbox",
460
+ displayLabel: "Dropbox",
431
461
  description: "Files and folders",
432
462
  dashboardUrl: "https://www.dropbox.com/developers/apps",
433
463
  clientIdPlaceholder: null,
464
+ logoUrl: "https://cdn.simpleicons.org/dropbox",
434
465
  defaultScopes: [
435
466
  "files.metadata.read",
436
467
  "files.content.read",
@@ -442,7 +473,7 @@ const PROVIDER_SEED_DATA: Record<
442
473
  allowedOptionalScopes: [],
443
474
  forbiddenScopes: [],
444
475
  },
445
- extraParams: { token_access_type: "offline" },
476
+ authorizeParams: { token_access_type: "offline" },
446
477
  loopbackPort: 17327,
447
478
  injectionTemplates: [
448
479
  {
@@ -465,15 +496,16 @@ const PROVIDER_SEED_DATA: Record<
465
496
  },
466
497
 
467
498
  asana: {
468
- providerKey: "asana",
469
- authUrl: "https://app.asana.com/-/oauth_authorize",
470
- 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",
471
502
  pingUrl: "https://app.asana.com/api/1.0/users/me",
472
503
  baseUrl: "https://app.asana.com/api/1.0",
473
- displayName: "Asana",
504
+ displayLabel: "Asana",
474
505
  description: "Tasks and projects",
475
506
  dashboardUrl: "https://app.asana.com/0/my-apps",
476
507
  clientIdPlaceholder: null,
508
+ logoUrl: "https://cdn.simpleicons.org/asana",
477
509
  defaultScopes: ["default"],
478
510
  scopePolicy: {
479
511
  allowAdditionalScopes: false,
@@ -495,15 +527,16 @@ const PROVIDER_SEED_DATA: Record<
495
527
  },
496
528
 
497
529
  airtable: {
498
- providerKey: "airtable",
499
- authUrl: "https://airtable.com/oauth2/v1/authorize",
500
- 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",
501
533
  pingUrl: "https://api.airtable.com/v0/meta/whoami",
502
534
  baseUrl: "https://api.airtable.com/v0",
503
- displayName: "Airtable",
535
+ displayLabel: "Airtable",
504
536
  description: "Bases and records",
505
537
  dashboardUrl: "https://airtable.com/create/tokens",
506
538
  clientIdPlaceholder: null,
539
+ logoUrl: "https://cdn.simpleicons.org/airtable",
507
540
  defaultScopes: [
508
541
  "data.records:read",
509
542
  "data.records:write",
@@ -530,15 +563,16 @@ const PROVIDER_SEED_DATA: Record<
530
563
  },
531
564
 
532
565
  hubspot: {
533
- providerKey: "hubspot",
534
- authUrl: "https://app.hubspot.com/oauth/authorize",
535
- 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",
536
569
  pingUrl: "https://api.hubapi.com/crm/v3/objects/contacts?limit=1",
537
570
  baseUrl: "https://api.hubapi.com",
538
- displayName: "HubSpot",
571
+ displayLabel: "HubSpot",
539
572
  description: "CRM contacts and deals",
540
573
  dashboardUrl: "https://developers.hubspot.com/",
541
574
  clientIdPlaceholder: null,
575
+ logoUrl: "https://cdn.simpleicons.org/hubspot",
542
576
  defaultScopes: [
543
577
  "crm.objects.contacts.read",
544
578
  "crm.objects.contacts.write",
@@ -569,15 +603,16 @@ const PROVIDER_SEED_DATA: Record<
569
603
  },
570
604
 
571
605
  figma: {
572
- providerKey: "figma",
573
- authUrl: "https://www.figma.com/oauth",
574
- 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",
575
609
  pingUrl: "https://api.figma.com/v1/me",
576
610
  baseUrl: "https://api.figma.com/v1",
577
- displayName: "Figma",
611
+ displayLabel: "Figma",
578
612
  description: "Design files and comments",
579
613
  dashboardUrl: "https://www.figma.com/developers/apps",
580
614
  clientIdPlaceholder: null,
615
+ logoUrl: "https://cdn.simpleicons.org/figma",
581
616
  defaultScopes: ["files:read", "file_comments:write"],
582
617
  scopePolicy: {
583
618
  allowAdditionalScopes: false,
@@ -600,16 +635,19 @@ const PROVIDER_SEED_DATA: Record<
600
635
  },
601
636
 
602
637
  outlook: {
603
- providerKey: "outlook",
604
- authUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
605
- 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",
606
643
  pingUrl: "https://graph.microsoft.com/v1.0/me",
607
644
  baseUrl: "https://graph.microsoft.com",
608
- displayName: "Outlook / Microsoft",
645
+ displayLabel: "Outlook / Microsoft",
609
646
  description: "Email and calendar",
610
647
  dashboardUrl:
611
648
  "https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade",
612
649
  clientIdPlaceholder: "Application (client) ID from Azure portal",
650
+ logoUrl: "https://cdn.simpleicons.org/microsoftoutlook",
613
651
  defaultScopes: [
614
652
  "openid",
615
653
  "profile",
@@ -627,7 +665,7 @@ const PROVIDER_SEED_DATA: Record<
627
665
  allowedOptionalScopes: ["Contacts.Read", "Files.Read", "Tasks.ReadWrite"],
628
666
  forbiddenScopes: [],
629
667
  },
630
- extraParams: { prompt: "consent" },
668
+ authorizeParams: { prompt: "consent" },
631
669
  tokenEndpointAuthMethod: "client_secret_post",
632
670
  loopbackPort: 17334,
633
671
  managedServiceConfigKey: "outlook-oauth",
@@ -646,18 +684,19 @@ const PROVIDER_SEED_DATA: Record<
646
684
 
647
685
  // Manual-token providers: these don't use OAuth2 flows but need provider
648
686
  // rows so that oauth_app and oauth_connection FK chains can reference them.
649
- // The authUrl/tokenUrl values are placeholders — never used at runtime.
687
+ // The authorizeUrl/tokenExchangeUrl values are placeholders — never used at runtime.
650
688
  slack_channel: {
651
- providerKey: "slack_channel",
652
- authUrl: "urn:manual-token",
653
- tokenUrl: "urn:manual-token",
689
+ provider: "slack_channel",
690
+ authorizeUrl: "urn:manual-token",
691
+ tokenExchangeUrl: "urn:manual-token",
654
692
  pingUrl: "https://slack.com/api/auth.test",
655
693
  baseUrl: "https://slack.com/api",
656
- displayName: "Slack Channel",
694
+ displayLabel: "Slack Channel",
657
695
  description: "Channel bot token",
658
696
  dashboardUrl: null,
659
697
  clientIdPlaceholder: null,
660
698
  requiresClientSecret: false,
699
+ logoUrl: "https://cdn.simpleicons.org/slack",
661
700
  defaultScopes: [],
662
701
  scopePolicy: {
663
702
  allowAdditionalScopes: false,
@@ -667,15 +706,16 @@ const PROVIDER_SEED_DATA: Record<
667
706
  },
668
707
 
669
708
  telegram: {
670
- providerKey: "telegram",
671
- authUrl: "urn:manual-token",
672
- tokenUrl: "urn:manual-token",
709
+ provider: "telegram",
710
+ authorizeUrl: "urn:manual-token",
711
+ tokenExchangeUrl: "urn:manual-token",
673
712
  baseUrl: "https://api.telegram.org",
674
- displayName: "Telegram",
713
+ displayLabel: "Telegram",
675
714
  description: "Bot messaging",
676
715
  dashboardUrl: null,
677
716
  clientIdPlaceholder: null,
678
717
  requiresClientSecret: false,
718
+ logoUrl: "https://cdn.simpleicons.org/telegram",
679
719
  defaultScopes: [],
680
720
  scopePolicy: {
681
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,
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
3
3
  import { dirname, join, resolve } from "node:path";
4
4
 
5
5
  import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
6
+ import { getIsContainerized } from "../config/env-registry.js";
6
7
  import { getConfig } from "../config/loader.js";
7
8
  import { loadSkillCatalog, resolveSkillSelector } from "../config/skills.js";
8
9
  import { indexCatalogById } from "../skills/include-graph.js";
@@ -1097,9 +1098,8 @@ export async function check(
1097
1098
  !matchedRule &&
1098
1099
  risk === RiskLevel.Low
1099
1100
  ) {
1100
- // When sandbox is disabled, bash runs on the host — don't auto-allow
1101
- const sandboxEnabled = getConfig().sandbox.enabled;
1102
- if (toolName === "bash" && !sandboxEnabled) {
1101
+ // Outside a container, bash runs on the host — don't auto-allow
1102
+ if (toolName === "bash" && !getIsContainerized()) {
1103
1103
  // Fall through to risk-based policy below
1104
1104
  } else if (isWorkspaceScopedInvocation(toolName, input, workingDir)) {
1105
1105
  return {
@@ -1,5 +1,6 @@
1
1
  import { join } from "node:path";
2
2
 
3
+ import { getIsContainerized } from "../config/env-registry.js";
3
4
  import { getConfig } from "../config/loader.js";
4
5
  import { getBundledSkillsDir } from "../config/skills.js";
5
6
  import { getWorkspaceDir } from "../util/platform.js";
@@ -42,7 +43,6 @@ export function getDefaultRuleTemplates(): DefaultRuleTemplate[] {
42
43
  // Some test suites mock getConfig() with partial objects; treat missing
43
44
  // branches as defaults so rule generation remains deterministic.
44
45
  const config = getConfig() as {
45
- sandbox?: { enabled?: boolean };
46
46
  skills?: { load?: { extraDirs?: unknown } };
47
47
  };
48
48
 
@@ -67,12 +67,11 @@ export function getDefaultRuleTemplates(): DefaultRuleTemplate[] {
67
67
  priority: 50,
68
68
  };
69
69
 
70
- // Sandboxed bash commands run in an isolated container auto-allow all of
71
- // them (including high-risk) so the user is never prompted for sandbox work.
72
- // Only emit this rule when the sandbox is actually enabled; otherwise bash
73
- // commands execute on the host and must go through normal permission checks.
74
- const sandboxEnabled = config.sandbox?.enabled !== false;
75
- const sandboxShellRule: DefaultRuleTemplate | null = sandboxEnabled
70
+ // When running inside a container (IS_CONTAINERIZED=true), bash commands
71
+ // execute in an isolated environment auto-allow all of them (including
72
+ // high-risk) so the user is never prompted. Outside a container, bash
73
+ // commands run on the host and go through normal permission checks.
74
+ const bashShellRule: DefaultRuleTemplate | null = getIsContainerized()
76
75
  ? {
77
76
  id: "default:allow-bash-global",
78
77
  tool: "bash",
@@ -300,7 +299,7 @@ export function getDefaultRuleTemplates(): DefaultRuleTemplate[] {
300
299
  return [
301
300
  ...hostFileRules,
302
301
  hostShellRule,
303
- ...(sandboxShellRule ? [sandboxShellRule] : []),
302
+ ...(bashShellRule ? [bashShellRule] : []),
304
303
  ...computerUseRules,
305
304
  ...managedSkillRules,
306
305
  ...workspacePromptRules,
@@ -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)