@vellumai/assistant 0.6.5 → 0.6.6

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 (443) hide show
  1. package/AGENTS.md +9 -1
  2. package/ARCHITECTURE.md +15 -17
  3. package/Dockerfile +6 -4
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
  5. package/docs/architecture/integrations.md +32 -39
  6. package/docs/architecture/memory.md +25 -30
  7. package/docs/architecture/security.md +7 -6
  8. package/docs/browser-use-architecture-phase2.md +63 -20
  9. package/docs/plugins.md +761 -0
  10. package/examples/plugins/echo/README.md +132 -0
  11. package/examples/plugins/echo/package.json +17 -0
  12. package/examples/plugins/echo/register.ts +187 -0
  13. package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
  14. package/openapi.yaml +212 -68
  15. package/package.json +1 -1
  16. package/src/__tests__/app-compiler.test.ts +57 -0
  17. package/src/__tests__/approval-cascade.test.ts +7 -2
  18. package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
  19. package/src/__tests__/avatar-generator.test.ts +4 -2
  20. package/src/__tests__/bundled-asset.test.ts +6 -6
  21. package/src/__tests__/catalog-cache.test.ts +69 -0
  22. package/src/__tests__/checker.test.ts +459 -171
  23. package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
  24. package/src/__tests__/compaction-events.test.ts +501 -0
  25. package/src/__tests__/compaction-pipeline.test.ts +210 -0
  26. package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
  27. package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
  28. package/src/__tests__/config-model-image-provider.test.ts +110 -0
  29. package/src/__tests__/config-schema.test.ts +22 -9
  30. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
  31. package/src/__tests__/contacts-tools.test.ts +26 -0
  32. package/src/__tests__/context-overflow-policy.test.ts +7 -7
  33. package/src/__tests__/context-window-manager.test.ts +355 -4
  34. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
  35. package/src/__tests__/conversation-agent-loop-overflow.test.ts +26 -30
  36. package/src/__tests__/conversation-agent-loop.test.ts +30 -141
  37. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -1
  38. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  39. package/src/__tests__/conversation-init.benchmark.test.ts +2 -16
  40. package/src/__tests__/conversation-pairing.test.ts +174 -10
  41. package/src/__tests__/conversation-pre-run-repair.test.ts +4 -1
  42. package/src/__tests__/conversation-process-callsite.test.ts +3 -0
  43. package/src/__tests__/conversation-provider-retry-repair.test.ts +16 -7
  44. package/src/__tests__/conversation-queue.test.ts +29 -14
  45. package/src/__tests__/conversation-routes-disk-view.test.ts +7 -6
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +155 -110
  47. package/src/__tests__/conversation-runtime-workspace.test.ts +23 -38
  48. package/src/__tests__/conversation-seed-composer.test.ts +2 -2
  49. package/src/__tests__/conversation-slash-queue.test.ts +7 -2
  50. package/src/__tests__/conversation-slash-unknown.test.ts +25 -2
  51. package/src/__tests__/conversation-speed-override.test.ts +6 -1
  52. package/src/__tests__/conversation-title-service.test.ts +116 -0
  53. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
  54. package/src/__tests__/conversation-usage.test.ts +1 -1
  55. package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
  56. package/src/__tests__/conversation-workspace-injection.test.ts +3 -0
  57. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -1
  58. package/src/__tests__/credential-health-service.test.ts +78 -9
  59. package/src/__tests__/credential-security-invariants.test.ts +2 -2
  60. package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
  61. package/src/__tests__/empty-response-pipeline.test.ts +305 -0
  62. package/src/__tests__/extension-id-sync-guard.test.ts +3 -3
  63. package/src/__tests__/first-greeting.test.ts +247 -5
  64. package/src/__tests__/headless-browser-mode.test.ts +57 -0
  65. package/src/__tests__/history-repair-pipeline.test.ts +399 -0
  66. package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
  67. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
  68. package/src/__tests__/host-proxy-interface.test.ts +36 -2
  69. package/src/__tests__/image-credentials.test.ts +137 -0
  70. package/src/__tests__/image-service-dispatcher.test.ts +186 -0
  71. package/src/__tests__/injector-chain.test.ts +526 -0
  72. package/src/__tests__/intent-routing.test.ts +0 -26
  73. package/src/__tests__/llm-call-pipeline.test.ts +285 -0
  74. package/src/__tests__/llm-schema.test.ts +1 -1
  75. package/src/__tests__/media-generate-image.test.ts +119 -13
  76. package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
  77. package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
  78. package/src/__tests__/migration-import-from-url.test.ts +5 -68
  79. package/src/__tests__/model-intents.test.ts +4 -2
  80. package/src/__tests__/notification-broadcaster.test.ts +3 -3
  81. package/src/__tests__/notification-decision-strategy.test.ts +0 -11
  82. package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
  83. package/src/__tests__/oauth-apps-routes.test.ts +1 -1
  84. package/src/__tests__/oauth-cli.test.ts +14 -12
  85. package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
  86. package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
  87. package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
  88. package/src/__tests__/oauth-providers-routes.test.ts +3 -2
  89. package/src/__tests__/oauth-store.test.ts +41 -76
  90. package/src/__tests__/onboarding-template-contract.test.ts +16 -64
  91. package/src/__tests__/openai-image-service.test.ts +368 -0
  92. package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
  93. package/src/__tests__/permission-checker-host-gate.test.ts +0 -24
  94. package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
  95. package/src/__tests__/persistence-pipeline.test.ts +377 -0
  96. package/src/__tests__/pipeline-runner.test.ts +565 -0
  97. package/src/__tests__/platform.test.ts +5 -2
  98. package/src/__tests__/plugin-bootstrap.test.ts +483 -0
  99. package/src/__tests__/plugin-registry.test.ts +273 -0
  100. package/src/__tests__/plugin-route-contribution.test.ts +288 -0
  101. package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
  102. package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
  103. package/src/__tests__/plugin-types.test.ts +320 -0
  104. package/src/__tests__/pricing.test.ts +44 -12
  105. package/src/__tests__/proxy-approval-callback.test.ts +69 -8
  106. package/src/__tests__/reaction-persistence.test.ts +1 -0
  107. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
  108. package/src/__tests__/registry.test.ts +0 -2
  109. package/src/__tests__/schedule-routes.test.ts +131 -1
  110. package/src/__tests__/scheduler-recurrence.test.ts +14 -70
  111. package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
  112. package/src/__tests__/secret-detection-handler.test.ts +0 -10
  113. package/src/__tests__/shell-identity.test.ts +0 -134
  114. package/src/__tests__/suggestion-routes.test.ts +103 -4
  115. package/src/__tests__/task-memory-cleanup.test.ts +1 -0
  116. package/src/__tests__/task-scheduler.test.ts +3 -15
  117. package/src/__tests__/test-preload.ts +11 -0
  118. package/src/__tests__/title-generate-pipeline.test.ts +224 -0
  119. package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
  120. package/src/__tests__/tool-error-pipeline.test.ts +244 -0
  121. package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
  122. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -6
  123. package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
  124. package/src/__tests__/tool-executor.test.ts +141 -0
  125. package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
  126. package/src/__tests__/tool-result-truncation.test.ts +0 -110
  127. package/src/__tests__/user-plugin-loader.test.ts +191 -0
  128. package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
  129. package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
  130. package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
  131. package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
  132. package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
  133. package/src/__tests__/workspace-policy.test.ts +21 -3
  134. package/src/agent/loop.ts +340 -102
  135. package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
  136. package/src/approvals/guardian-request-resolvers.ts +80 -0
  137. package/src/backup/__tests__/backup-worker.test.ts +2 -13
  138. package/src/backup/backup-worker.ts +3 -15
  139. package/src/bundler/app-compiler.ts +84 -1
  140. package/src/calls/call-state.ts +2 -2
  141. package/src/channels/__tests__/types.test.ts +3 -3
  142. package/src/channels/types.ts +6 -4
  143. package/src/cli/__tests__/notifications.test.ts +87 -211
  144. package/src/cli/commands/__tests__/backup.test.ts +1 -1
  145. package/src/cli/commands/__tests__/image-generation.test.ts +255 -35
  146. package/src/cli/commands/__tests__/inference-send.test.ts +12 -0
  147. package/src/cli/commands/__tests__/tts-synthesize.test.ts +12 -0
  148. package/src/cli/commands/backup.ts +2 -2
  149. package/src/cli/commands/clients.ts +138 -0
  150. package/src/cli/commands/completions.ts +2 -9
  151. package/src/cli/commands/conversations.ts +55 -7
  152. package/src/cli/commands/image-generation.ts +33 -34
  153. package/src/cli/commands/notifications.ts +68 -103
  154. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
  155. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
  156. package/src/cli/commands/oauth/connect.ts +2 -2
  157. package/src/cli/commands/oauth/providers.ts +176 -8
  158. package/src/cli/commands/oauth/status.ts +46 -36
  159. package/src/cli/commands/skills.ts +3 -4
  160. package/src/cli/program.ts +25 -29
  161. package/src/config/__tests__/backup-schema.test.ts +7 -2
  162. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  163. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
  164. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
  165. package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
  166. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
  167. package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
  168. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
  169. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
  170. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  171. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
  172. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +12 -0
  173. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +58 -0
  174. package/src/config/bundled-skills/schedule/SKILL.md +8 -3
  175. package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
  176. package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
  177. package/src/config/bundled-tool-registry.ts +0 -15
  178. package/src/config/feature-flag-registry.json +17 -1
  179. package/src/config/schema.ts +19 -0
  180. package/src/config/schemas/backup.ts +1 -1
  181. package/src/config/schemas/conversations.ts +16 -0
  182. package/src/config/schemas/llm.ts +2 -3
  183. package/src/config/schemas/security.ts +6 -6
  184. package/src/config/schemas/tts.ts +11 -0
  185. package/src/config/skill-state.ts +6 -2
  186. package/src/config/skills.ts +94 -5
  187. package/src/context/__tests__/compact-prompt.test.ts +27 -9
  188. package/src/context/prompts/compact.md +26 -12
  189. package/src/context/tool-result-truncation.ts +3 -63
  190. package/src/context/window-manager.ts +190 -16
  191. package/src/credential-health/credential-health-service.ts +19 -6
  192. package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
  193. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
  194. package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
  195. package/src/daemon/config-watcher.ts +0 -2
  196. package/src/daemon/context-overflow-policy.ts +4 -13
  197. package/src/daemon/conversation-agent-loop-handlers.ts +83 -22
  198. package/src/daemon/conversation-agent-loop.ts +984 -683
  199. package/src/daemon/conversation-history.ts +10 -19
  200. package/src/daemon/conversation-lifecycle.ts +37 -19
  201. package/src/daemon/conversation-notifiers.ts +2 -110
  202. package/src/daemon/conversation-process.ts +14 -7
  203. package/src/daemon/conversation-runtime-assembly.ts +532 -411
  204. package/src/daemon/conversation-tool-setup.ts +41 -4
  205. package/src/daemon/conversation.ts +80 -35
  206. package/src/daemon/external-plugins-bootstrap.ts +478 -0
  207. package/src/daemon/first-greeting.ts +191 -14
  208. package/src/daemon/handlers/config-model.ts +11 -0
  209. package/src/daemon/handlers/skills.ts +5 -1
  210. package/src/daemon/lifecycle.ts +33 -68
  211. package/src/daemon/message-types/computer-use.ts +2 -34
  212. package/src/daemon/message-types/conversations.ts +49 -0
  213. package/src/daemon/message-types/messages.ts +12 -0
  214. package/src/daemon/server.ts +5 -3
  215. package/src/daemon/shutdown-handlers.ts +2 -12
  216. package/src/daemon/tool-side-effects.ts +14 -56
  217. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
  218. package/src/heartbeat/heartbeat-service.ts +24 -1
  219. package/src/home/__tests__/feed-population-integration.test.ts +312 -0
  220. package/src/home/emit-feed-event.ts +7 -0
  221. package/src/home/feed-types.ts +41 -2
  222. package/src/home/rewrite-command-preview.ts +66 -0
  223. package/src/ipc/__tests__/socket-path.test.ts +11 -50
  224. package/src/ipc/cli-client.ts +1 -1
  225. package/src/ipc/cli-server.ts +3 -3
  226. package/src/ipc/gateway-client.ts +4 -1
  227. package/src/ipc/routes/browser-context.ts +2 -0
  228. package/src/ipc/routes/browser.ts +1 -0
  229. package/src/ipc/routes/get-contact.ts +16 -0
  230. package/src/ipc/routes/index.ts +14 -0
  231. package/src/ipc/routes/list-clients.ts +31 -0
  232. package/src/ipc/routes/merge-contacts.ts +17 -0
  233. package/src/ipc/routes/notification.ts +133 -0
  234. package/src/ipc/routes/rename-conversation.ts +59 -0
  235. package/src/ipc/routes/search-contacts.ts +19 -0
  236. package/src/ipc/routes/upsert-contact.ts +25 -0
  237. package/src/ipc/socket-path.ts +14 -38
  238. package/src/media/app-icon-generator.ts +23 -46
  239. package/src/media/avatar-router.ts +26 -41
  240. package/src/media/gemini-image-service.ts +8 -41
  241. package/src/media/image-credentials.ts +73 -0
  242. package/src/media/image-service.ts +85 -0
  243. package/src/media/openai-image-service.ts +131 -0
  244. package/src/media/types.ts +46 -0
  245. package/src/memory/conversation-crud.ts +48 -18
  246. package/src/memory/conversation-queries.ts +57 -4
  247. package/src/memory/conversation-title-service.ts +25 -0
  248. package/src/memory/db-init.ts +8 -0
  249. package/src/memory/embedding-gemini.test.ts +41 -2
  250. package/src/memory/embedding-gemini.ts +6 -1
  251. package/src/memory/graph/bootstrap.test.ts +282 -0
  252. package/src/memory/graph/bootstrap.ts +8 -5
  253. package/src/memory/graph/extraction.ts +10 -2
  254. package/src/memory/graph/graph-search.test.ts +1 -0
  255. package/src/memory/graph/inspect.ts +2 -2
  256. package/src/memory/graph/retriever.ts +10 -3
  257. package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
  258. package/src/memory/migrations/149-oauth-tables.ts +1 -0
  259. package/src/memory/migrations/223-schedule-script-column.ts +11 -0
  260. package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
  261. package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
  262. package/src/memory/migrations/index.ts +4 -0
  263. package/src/memory/pkb/pkb-index.test.ts +1 -0
  264. package/src/memory/pkb/pkb-reconcile.test.ts +1 -0
  265. package/src/memory/pkb/pkb-search.test.ts +65 -4
  266. package/src/memory/pkb/pkb-search.ts +40 -18
  267. package/src/memory/qdrant-client.test.ts +60 -0
  268. package/src/memory/qdrant-client.ts +25 -0
  269. package/src/memory/schema/infrastructure.ts +1 -0
  270. package/src/memory/schema/oauth.ts +4 -1
  271. package/src/messaging/providers/slack/render-transcript.test.ts +77 -29
  272. package/src/messaging/providers/slack/render-transcript.ts +58 -0
  273. package/src/notifications/conversation-pairing.ts +78 -19
  274. package/src/notifications/copy-composer.ts +0 -5
  275. package/src/notifications/emit-signal.ts +1 -1
  276. package/src/notifications/signal.ts +1 -2
  277. package/src/oauth/AGENTS.md +1 -1
  278. package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
  279. package/src/oauth/connect-orchestrator.ts +8 -34
  280. package/src/oauth/connect-types.ts +6 -10
  281. package/src/oauth/manual-token-connection.ts +23 -0
  282. package/src/oauth/oauth-store.ts +30 -14
  283. package/src/oauth/provider-serializer.ts +6 -1
  284. package/src/oauth/seed-providers.ts +56 -108
  285. package/src/outbound-proxy/http-forwarder.ts +9 -0
  286. package/src/permissions/approval-policy.test.ts +293 -18
  287. package/src/permissions/approval-policy.ts +110 -58
  288. package/src/permissions/arg-parser.test.ts +161 -0
  289. package/src/permissions/arg-parser.ts +141 -0
  290. package/src/permissions/bash-risk-classifier.test.ts +414 -2
  291. package/src/permissions/bash-risk-classifier.ts +303 -60
  292. package/src/permissions/checker.ts +157 -29
  293. package/src/permissions/command-registry.test.ts +239 -0
  294. package/src/permissions/command-registry.ts +234 -54
  295. package/src/permissions/defaults.ts +5 -4
  296. package/src/permissions/gateway-threshold-reader.ts +196 -0
  297. package/src/permissions/prompter.ts +4 -0
  298. package/src/permissions/risk-types.ts +61 -4
  299. package/src/permissions/schedule-risk-classifier.test.ts +129 -0
  300. package/src/permissions/schedule-risk-classifier.ts +85 -0
  301. package/src/permissions/shell-identity.ts +2 -42
  302. package/src/permissions/types.ts +2 -0
  303. package/src/permissions/workspace-policy.ts +8 -3
  304. package/src/plugins/defaults/circuit-breaker.ts +146 -0
  305. package/src/plugins/defaults/compaction.ts +145 -0
  306. package/src/plugins/defaults/empty-response.ts +126 -0
  307. package/src/plugins/defaults/history-repair.ts +85 -0
  308. package/src/plugins/defaults/index.ts +116 -0
  309. package/src/plugins/defaults/injectors.ts +491 -0
  310. package/src/plugins/defaults/llm-call.ts +82 -0
  311. package/src/plugins/defaults/memory-retrieval.ts +226 -0
  312. package/src/plugins/defaults/overflow-reduce.ts +181 -0
  313. package/src/plugins/defaults/persistence.ts +129 -0
  314. package/src/plugins/defaults/title-generate.ts +95 -0
  315. package/src/plugins/defaults/token-estimate.ts +104 -0
  316. package/src/plugins/defaults/tool-error.ts +126 -0
  317. package/src/plugins/defaults/tool-execute.ts +89 -0
  318. package/src/plugins/defaults/tool-result-truncate.ts +88 -0
  319. package/src/plugins/pipeline.ts +316 -0
  320. package/src/plugins/plugin-skill-contributions.ts +292 -0
  321. package/src/plugins/registry.ts +241 -0
  322. package/src/plugins/types.ts +1134 -0
  323. package/src/plugins/user-loader.ts +177 -0
  324. package/src/prompts/templates/BOOTSTRAP.md +27 -77
  325. package/src/providers/model-catalog.ts +52 -29
  326. package/src/providers/model-intents.ts +1 -1
  327. package/src/providers/openrouter/client.ts +5 -1
  328. package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
  329. package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
  330. package/src/providers/speech-to-text/xai-realtime.test.ts +72 -4
  331. package/src/providers/speech-to-text/xai-realtime.ts +39 -14
  332. package/src/runtime/AGENTS.md +25 -16
  333. package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
  334. package/src/runtime/__tests__/client-registry.test.ts +293 -0
  335. package/src/runtime/client-registry.ts +261 -0
  336. package/src/runtime/http-server.ts +77 -8
  337. package/src/runtime/http-types.ts +0 -2
  338. package/src/runtime/migrations/vbundle-builder.ts +1 -22
  339. package/src/runtime/routes/approval-prompt-ts-tracker.ts +51 -31
  340. package/src/runtime/routes/approval-routes.ts +17 -0
  341. package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
  342. package/src/runtime/routes/conversation-routes.ts +223 -116
  343. package/src/runtime/routes/inbound-message-handler.ts +88 -13
  344. package/src/runtime/routes/memory-item-routes.test.ts +1 -0
  345. package/src/runtime/routes/migration-routes.ts +0 -3
  346. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
  347. package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
  348. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
  349. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
  350. package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
  351. package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
  352. package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
  353. package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
  354. package/src/runtime/routes/playground/deps.ts +56 -0
  355. package/src/runtime/routes/playground/force-compact.ts +73 -0
  356. package/src/runtime/routes/playground/guard.ts +37 -0
  357. package/src/runtime/routes/playground/index.ts +28 -0
  358. package/src/runtime/routes/playground/inject-failures.ts +159 -0
  359. package/src/runtime/routes/playground/reset-circuit.ts +115 -0
  360. package/src/runtime/routes/playground/seed-conversation.ts +139 -0
  361. package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
  362. package/src/runtime/routes/playground/state.ts +78 -0
  363. package/src/runtime/routes/schedule-routes.ts +89 -8
  364. package/src/runtime/skill-route-registry.ts +75 -15
  365. package/src/schedule/run-script.ts +68 -0
  366. package/src/schedule/schedule-store.ts +7 -1
  367. package/src/schedule/scheduler.ts +48 -8
  368. package/src/skills/catalog-cache.ts +12 -5
  369. package/src/tools/browser/__tests__/browser-status.test.ts +189 -0
  370. package/src/tools/browser/browser-execution.ts +88 -19
  371. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
  372. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
  373. package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
  374. package/src/tools/browser/cdp-client/factory.ts +15 -4
  375. package/src/tools/executor.ts +126 -74
  376. package/src/tools/network/script-proxy/session-manager.ts +37 -1
  377. package/src/tools/permission-checker.ts +98 -49
  378. package/src/tools/policy-context.ts +4 -0
  379. package/src/tools/registry.ts +140 -3
  380. package/src/tools/schedule/create.ts +23 -8
  381. package/src/tools/schedule/update.ts +3 -1
  382. package/src/tools/secret-detection-handler.ts +0 -51
  383. package/src/tools/system/avatar-generator.ts +6 -2
  384. package/src/tools/types.ts +28 -2
  385. package/src/util/platform.ts +7 -2
  386. package/src/util/pricing.ts +26 -3
  387. package/src/workspace/migrations/006-services-config.ts +2 -4
  388. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
  389. package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +3 -4
  390. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
  391. package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
  392. package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
  393. package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
  394. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
  395. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
  396. package/src/workspace/migrations/registry.ts +12 -0
  397. package/tsconfig.json +1 -1
  398. package/hook-templates/debug-prompt-logger/hook.json +0 -7
  399. package/hook-templates/debug-prompt-logger/run.sh +0 -66
  400. package/src/__tests__/compaction-circuit-breaker.test.ts +0 -336
  401. package/src/__tests__/context-overflow-approval.test.ts +0 -156
  402. package/src/__tests__/hooks-blocking.test.ts +0 -178
  403. package/src/__tests__/hooks-cli.test.ts +0 -182
  404. package/src/__tests__/hooks-config.test.ts +0 -108
  405. package/src/__tests__/hooks-discovery.test.ts +0 -211
  406. package/src/__tests__/hooks-integration.test.ts +0 -196
  407. package/src/__tests__/hooks-manager.test.ts +0 -226
  408. package/src/__tests__/hooks-runner.test.ts +0 -175
  409. package/src/__tests__/hooks-settings.test.ts +0 -160
  410. package/src/__tests__/hooks-templates.test.ts +0 -169
  411. package/src/__tests__/hooks-ts-runner.test.ts +0 -170
  412. package/src/__tests__/hooks-watch.test.ts +0 -112
  413. package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
  414. package/src/__tests__/oauth-scope-policy.test.ts +0 -180
  415. package/src/__tests__/send-notification-tool.test.ts +0 -83
  416. package/src/cli/commands/shotgun.ts +0 -266
  417. package/src/config/bundled-skills/conversations/SKILL.md +0 -20
  418. package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
  419. package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -88
  420. package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
  421. package/src/config/bundled-skills/notifications/SKILL.md +0 -40
  422. package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
  423. package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
  424. package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
  425. package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
  426. package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
  427. package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
  428. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
  429. package/src/daemon/context-overflow-approval.ts +0 -52
  430. package/src/daemon/watch-handler.ts +0 -399
  431. package/src/hooks/cli.ts +0 -253
  432. package/src/hooks/config.ts +0 -100
  433. package/src/hooks/discovery.ts +0 -135
  434. package/src/hooks/manager.ts +0 -179
  435. package/src/hooks/runner.ts +0 -117
  436. package/src/hooks/templates.ts +0 -77
  437. package/src/hooks/types.ts +0 -75
  438. package/src/oauth/scope-policy.ts +0 -89
  439. package/src/runtime/gateway-internal-client.ts +0 -94
  440. package/src/runtime/routes/watch-routes.ts +0 -156
  441. package/src/signals/shotgun.ts +0 -203
  442. package/src/tools/watch/screen-watch.ts +0 -144
  443. package/src/tools/watch/watch-state.ts +0 -142
@@ -61,7 +61,6 @@ function seedTestProvider(provider = "github"): void {
61
61
  authorizeUrl: `https://${provider}.example.com/authorize`,
62
62
  tokenExchangeUrl: `https://${provider}.example.com/token`,
63
63
  defaultScopes: ["read"],
64
- scopePolicy: {},
65
64
  },
66
65
  ]);
67
66
  }
@@ -99,14 +98,13 @@ describe("provider operations", () => {
99
98
  authorizeUrl: "https://github.com/login/oauth/authorize",
100
99
  tokenExchangeUrl: "https://github.com/login/oauth/access_token",
101
100
  defaultScopes: ["repo", "user"],
102
- scopePolicy: { required: ["repo"] },
103
101
  },
104
102
  {
105
103
  provider: "google",
106
104
  authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
107
105
  tokenExchangeUrl: "https://oauth2.googleapis.com/token",
108
106
  defaultScopes: ["openid", "email"],
109
- scopePolicy: {},
107
+
110
108
  authorizeParams: { access_type: "offline" },
111
109
  },
112
110
  ]);
@@ -119,7 +117,6 @@ describe("provider operations", () => {
119
117
  "https://github.com/login/oauth/access_token",
120
118
  );
121
119
  expect(JSON.parse(gh!.defaultScopes)).toEqual(["repo", "user"]);
122
- expect(JSON.parse(gh!.scopePolicy)).toEqual({ required: ["repo"] });
123
120
 
124
121
  const goog = getProvider("google");
125
122
  expect(goog).toBeDefined();
@@ -136,7 +133,7 @@ describe("provider operations", () => {
136
133
  authorizeUrl: "https://github.com/login/oauth/authorize",
137
134
  tokenExchangeUrl: "https://github.com/login/oauth/access_token",
138
135
  defaultScopes: ["repo"],
139
- scopePolicy: {},
136
+
140
137
  baseUrl: "https://api.github.com",
141
138
  },
142
139
  ]);
@@ -153,7 +150,6 @@ describe("provider operations", () => {
153
150
  authorizeUrl: "https://github.com/login/oauth/authorize-v2",
154
151
  tokenExchangeUrl: "https://github.com/login/oauth/access_token-v2",
155
152
  defaultScopes: ["repo", "user"],
156
- scopePolicy: { required: ["repo"] },
157
153
  baseUrl: "https://api.github.com/v2",
158
154
  },
159
155
  ]);
@@ -167,10 +163,9 @@ describe("provider operations", () => {
167
163
  expect(row!.tokenExchangeUrl).toBe(
168
164
  "https://github.com/login/oauth/access_token-v2",
169
165
  );
170
- // User-customizable fields (baseUrl, scopePolicy) are preserved from
166
+ // User-customizable fields (baseUrl) are preserved from
171
167
  // the original insert — not overwritten on re-seed.
172
168
  expect(row!.baseUrl).toBe("https://api.github.com");
173
- expect(JSON.parse(row!.scopePolicy)).toEqual({});
174
169
  // defaultScopes ARE overwritten on re-seed so upstream scope additions
175
170
  // propagate to existing installations.
176
171
  expect(JSON.parse(row!.defaultScopes)).toEqual(["repo", "user"]);
@@ -185,7 +180,7 @@ describe("provider operations", () => {
185
180
  authorizeUrl: "https://github.com/authorize",
186
181
  tokenExchangeUrl: "https://github.com/token",
187
182
  defaultScopes: ["repo"],
188
- scopePolicy: {},
183
+
189
184
  pingUrl: "https://api.github.com/user",
190
185
  },
191
186
  ]);
@@ -200,7 +195,6 @@ describe("provider operations", () => {
200
195
  authorizeUrl: "https://github.com/authorize",
201
196
  tokenExchangeUrl: "https://github.com/token",
202
197
  defaultScopes: ["repo"],
203
- scopePolicy: {},
204
198
  },
205
199
  ]);
206
200
  const row = getProvider("github");
@@ -216,7 +210,8 @@ describe("provider operations", () => {
216
210
  tokenExchangeUrl: "https://github.com/token",
217
211
  tokenEndpointAuthMethod: "client_secret_post",
218
212
  defaultScopes: ["repo"],
219
- scopePolicy: { required: ["repo"] },
213
+ availableScopes:
214
+ "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps",
220
215
  userinfoUrl: "https://api.github.com/user",
221
216
  baseUrl: "https://api.github.com",
222
217
  authorizeParams: { prompt: "consent" },
@@ -230,10 +225,6 @@ describe("provider operations", () => {
230
225
  db.update(oauthProviders)
231
226
  .set({
232
227
  defaultScopes: JSON.stringify(["repo", "user", "gist"]),
233
- scopePolicy: JSON.stringify({
234
- required: ["repo"],
235
- allowAdditionalScopes: true,
236
- }),
237
228
  baseUrl: "https://custom.github.com/api",
238
229
  })
239
230
  .where(eq(oauthProviders.provider, "github"))
@@ -256,7 +247,9 @@ describe("provider operations", () => {
256
247
  tokenExchangeUrl: "https://github.com/token-v2",
257
248
  tokenEndpointAuthMethod: "client_secret_basic",
258
249
  defaultScopes: ["repo-only"],
259
- scopePolicy: {},
250
+ availableScopes:
251
+ "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps-v2",
252
+
260
253
  userinfoUrl: "https://api.github.com/user-v2",
261
254
  baseUrl: "https://api.github.com/v2",
262
255
  authorizeParams: { prompt: "login" },
@@ -268,13 +261,12 @@ describe("provider operations", () => {
268
261
  const row = getProvider("github");
269
262
  expect(row).toBeDefined();
270
263
 
271
- // defaultScopes are overwritten by the seed data (not user-customizable)
264
+ // defaultScopes are overwritten by the seed data
272
265
  expect(JSON.parse(row!.defaultScopes)).toEqual(["repo-only"]);
273
- // scopePolicy is user-customizable and should retain manual values
274
- expect(JSON.parse(row!.scopePolicy)).toEqual({
275
- required: ["repo"],
276
- allowAdditionalScopes: true,
277
- });
266
+ // availableScopes is overwritten on re-seed
267
+ expect(JSON.parse(row!.availableScopes!)).toBe(
268
+ "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps-v2",
269
+ );
278
270
  expect(row!.baseUrl).toBe("https://custom.github.com/api");
279
271
 
280
272
  // Implementation fields should be overwritten from the seed data
@@ -293,7 +285,7 @@ describe("provider operations", () => {
293
285
  authorizeUrl: "https://example.com/authorize",
294
286
  tokenExchangeUrl: "https://example.com/token",
295
287
  defaultScopes: ["read", "write"],
296
- scopePolicy: {},
288
+
297
289
  scopeSeparator: ",",
298
290
  },
299
291
  ]);
@@ -310,7 +302,6 @@ describe("provider operations", () => {
310
302
  authorizeUrl: "https://github.com/authorize",
311
303
  tokenExchangeUrl: "https://github.com/token",
312
304
  defaultScopes: ["repo"],
313
- scopePolicy: {},
314
305
  },
315
306
  ]);
316
307
 
@@ -326,7 +317,7 @@ describe("provider operations", () => {
326
317
  authorizeUrl: "https://linear.app/oauth/authorize",
327
318
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
328
319
  defaultScopes: ["read"],
329
- scopePolicy: {},
320
+
330
321
  scopeSeparator: " ",
331
322
  },
332
323
  ]);
@@ -342,7 +333,7 @@ describe("provider operations", () => {
342
333
  authorizeUrl: "https://linear.app/oauth/authorize",
343
334
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
344
335
  defaultScopes: ["read"],
345
- scopePolicy: {},
336
+
346
337
  scopeSeparator: ",",
347
338
  },
348
339
  ]);
@@ -359,7 +350,6 @@ describe("provider operations", () => {
359
350
  tokenExchangeUrl: "https://example.com/token",
360
351
  refreshUrl: "https://refresh.example.com/token",
361
352
  defaultScopes: ["read"],
362
- scopePolicy: {},
363
353
  },
364
354
  ]);
365
355
 
@@ -375,7 +365,6 @@ describe("provider operations", () => {
375
365
  authorizeUrl: "https://example.com/authorize",
376
366
  tokenExchangeUrl: "https://example.com/token",
377
367
  defaultScopes: ["read"],
378
- scopePolicy: {},
379
368
  },
380
369
  ]);
381
370
 
@@ -392,7 +381,6 @@ describe("provider operations", () => {
392
381
  tokenExchangeUrl: "https://example.com/token",
393
382
  refreshUrl: "https://refresh.example.com/token",
394
383
  defaultScopes: ["read"],
395
- scopePolicy: {},
396
384
  },
397
385
  ]);
398
386
 
@@ -401,7 +389,7 @@ describe("provider operations", () => {
401
389
 
402
390
  // Re-seed with a different refreshUrl — it should be overwritten,
403
391
  // proving refreshUrl is in the onConflictDoUpdate set clause (not
404
- // preserved like scopePolicy).
392
+ // preserved like baseUrl).
405
393
  seedProviders([
406
394
  {
407
395
  provider: "test-provider",
@@ -409,7 +397,6 @@ describe("provider operations", () => {
409
397
  tokenExchangeUrl: "https://example.com/token",
410
398
  refreshUrl: "https://refresh-v2.example.com/token",
411
399
  defaultScopes: ["read"],
412
- scopePolicy: {},
413
400
  },
414
401
  ]);
415
402
 
@@ -426,7 +413,6 @@ describe("provider operations", () => {
426
413
  revokeUrl: "https://revoke.example.com",
427
414
  revokeBodyTemplate: { token: "{access_token}" },
428
415
  defaultScopes: ["read"],
429
- scopePolicy: {},
430
416
  },
431
417
  ]);
432
418
 
@@ -445,7 +431,6 @@ describe("provider operations", () => {
445
431
  authorizeUrl: "https://example.com/authorize",
446
432
  tokenExchangeUrl: "https://example.com/token",
447
433
  defaultScopes: ["read"],
448
- scopePolicy: {},
449
434
  },
450
435
  ]);
451
436
 
@@ -462,7 +447,7 @@ describe("provider operations", () => {
462
447
  authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
463
448
  tokenExchangeUrl: "https://oauth2.googleapis.com/token",
464
449
  defaultScopes: ["openid"],
465
- scopePolicy: {},
450
+
466
451
  logoUrl: "https://cdn.simpleicons.org/google",
467
452
  },
468
453
  ]);
@@ -479,7 +464,7 @@ describe("provider operations", () => {
479
464
  authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
480
465
  tokenExchangeUrl: "https://oauth2.googleapis.com/token",
481
466
  defaultScopes: ["openid"],
482
- scopePolicy: {},
467
+
483
468
  logoUrl: "https://cdn.simpleicons.org/google",
484
469
  },
485
470
  ]);
@@ -497,7 +482,7 @@ describe("provider operations", () => {
497
482
  authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
498
483
  tokenExchangeUrl: "https://oauth2.googleapis.com/token",
499
484
  defaultScopes: ["openid"],
500
- scopePolicy: {},
485
+
501
486
  logoUrl: "https://cdn.simpleicons.org/google-v2",
502
487
  },
503
488
  ]);
@@ -514,7 +499,6 @@ describe("provider operations", () => {
514
499
  tokenExchangeUrl: "https://example.com/token",
515
500
  revokeUrl: "https://revoke.example.com",
516
501
  defaultScopes: ["read"],
517
- scopePolicy: {},
518
502
  },
519
503
  ]);
520
504
 
@@ -523,7 +507,7 @@ describe("provider operations", () => {
523
507
 
524
508
  // Re-seed with a different revokeUrl — it should be overwritten,
525
509
  // proving revokeUrl is in the onConflictDoUpdate set clause (not
526
- // preserved like scopePolicy).
510
+ // preserved like baseUrl).
527
511
  seedProviders([
528
512
  {
529
513
  provider: "test-provider",
@@ -531,7 +515,6 @@ describe("provider operations", () => {
531
515
  tokenExchangeUrl: "https://example.com/token",
532
516
  revokeUrl: "https://revoke-v2.example.com",
533
517
  defaultScopes: ["read"],
534
- scopePolicy: {},
535
518
  },
536
519
  ]);
537
520
 
@@ -586,7 +569,7 @@ describe("provider operations", () => {
586
569
  authorizeUrl: "https://example.com/authorize",
587
570
  tokenExchangeUrl: "https://example.com/token",
588
571
  defaultScopes: [],
589
- scopePolicy: {},
572
+
590
573
  // Note: tokenEndpointAuthMethod intentionally omitted
591
574
  },
592
575
  ]);
@@ -602,7 +585,7 @@ describe("provider operations", () => {
602
585
  authorizeUrl: "https://example.com/authorize",
603
586
  tokenExchangeUrl: "https://example.com/token",
604
587
  defaultScopes: [],
605
- scopePolicy: {},
588
+
606
589
  // Note: tokenExchangeBodyFormat intentionally omitted
607
590
  },
608
591
  ]);
@@ -618,7 +601,7 @@ describe("provider operations", () => {
618
601
  authorizeUrl: "https://example.com/authorize",
619
602
  tokenExchangeUrl: "https://example.com/token",
620
603
  defaultScopes: [],
621
- scopePolicy: {},
604
+
622
605
  tokenExchangeBodyFormat: "json",
623
606
  },
624
607
  ]);
@@ -635,8 +618,8 @@ describe("provider operations", () => {
635
618
  raw.exec(`
636
619
  INSERT INTO oauth_providers (
637
620
  provider_key, auth_url, token_url, token_endpoint_auth_method,
638
- default_scopes, scope_policy, scope_separator, requires_client_secret,
639
- created_at, updated_at
621
+ default_scopes, scope_policy, available_scopes, scope_separator,
622
+ requires_client_secret, created_at, updated_at
640
623
  ) VALUES (
641
624
  'legacy-null-provider',
642
625
  'https://example.com/authorize',
@@ -644,6 +627,7 @@ describe("provider operations", () => {
644
627
  NULL,
645
628
  '[]',
646
629
  '{}',
630
+ NULL,
647
631
  ' ',
648
632
  1,
649
633
  ${Date.now()},
@@ -671,7 +655,6 @@ describe("provider operations", () => {
671
655
  tokenExchangeUrl: "https://example.com/token",
672
656
  tokenEndpointAuthMethod: "client_secret_basic",
673
657
  defaultScopes: [],
674
- scopePolicy: {},
675
658
  },
676
659
  ]);
677
660
 
@@ -692,7 +675,6 @@ describe("provider operations", () => {
692
675
  authorizeUrl: "https://github.com/authorize",
693
676
  tokenExchangeUrl: "https://github.com/token",
694
677
  defaultScopes: ["repo"],
695
- scopePolicy: {},
696
678
  },
697
679
  ]);
698
680
 
@@ -713,7 +695,6 @@ describe("provider operations", () => {
713
695
  authorizeUrl: "https://linear.app/oauth/authorize",
714
696
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
715
697
  defaultScopes: ["read"],
716
- scopePolicy: {},
717
698
  });
718
699
 
719
700
  expect(row.provider).toBe("linear");
@@ -730,7 +711,6 @@ describe("provider operations", () => {
730
711
  authorizeUrl: "https://linear.app/oauth/authorize",
731
712
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
732
713
  defaultScopes: ["read"],
733
- scopePolicy: {},
734
714
  });
735
715
 
736
716
  expect(() =>
@@ -739,7 +719,6 @@ describe("provider operations", () => {
739
719
  authorizeUrl: "https://linear.app/oauth/authorize",
740
720
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
741
721
  defaultScopes: ["read"],
742
- scopePolicy: {},
743
722
  }),
744
723
  ).toThrow(/already exists.*linear/);
745
724
  });
@@ -750,7 +729,7 @@ describe("provider operations", () => {
750
729
  authorizeUrl: "https://linear.app/oauth/authorize",
751
730
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
752
731
  defaultScopes: ["read"],
753
- scopePolicy: {},
732
+
754
733
  scopeSeparator: ";",
755
734
  });
756
735
 
@@ -765,7 +744,6 @@ describe("provider operations", () => {
765
744
  authorizeUrl: "https://linear.app/oauth/authorize",
766
745
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
767
746
  defaultScopes: ["read"],
768
- scopePolicy: {},
769
747
  });
770
748
 
771
749
  const fetched = getProvider("linear");
@@ -780,7 +758,6 @@ describe("provider operations", () => {
780
758
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
781
759
  refreshUrl: "https://api.linear.app/oauth/refresh",
782
760
  defaultScopes: ["read"],
783
- scopePolicy: {},
784
761
  });
785
762
 
786
763
  const fetched = getProvider("linear");
@@ -794,7 +771,6 @@ describe("provider operations", () => {
794
771
  authorizeUrl: "https://linear.app/oauth/authorize",
795
772
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
796
773
  defaultScopes: ["read"],
797
- scopePolicy: {},
798
774
  });
799
775
 
800
776
  const fetched = getProvider("linear");
@@ -810,7 +786,6 @@ describe("provider operations", () => {
810
786
  revokeUrl: "https://api.linear.app/oauth/revoke",
811
787
  revokeBodyTemplate: { token: "{access_token}" },
812
788
  defaultScopes: ["read"],
813
- scopePolicy: {},
814
789
  });
815
790
 
816
791
  const fetched = getProvider("linear");
@@ -827,7 +802,7 @@ describe("provider operations", () => {
827
802
  authorizeUrl: "https://example.com/authorize",
828
803
  tokenExchangeUrl: "https://example.com/token",
829
804
  defaultScopes: [],
830
- scopePolicy: {},
805
+
831
806
  // Note: tokenEndpointAuthMethod intentionally omitted
832
807
  });
833
808
  expect(row.tokenEndpointAuthMethod).toBe("client_secret_post");
@@ -842,7 +817,7 @@ describe("provider operations", () => {
842
817
  authorizeUrl: "https://example.com/authorize",
843
818
  tokenExchangeUrl: "https://example.com/token",
844
819
  defaultScopes: [],
845
- scopePolicy: {},
820
+
846
821
  tokenEndpointAuthMethod: "client_secret_basic",
847
822
  });
848
823
  expect(row.tokenEndpointAuthMethod).toBe("client_secret_basic");
@@ -854,7 +829,7 @@ describe("provider operations", () => {
854
829
  authorizeUrl: "https://example.com/authorize",
855
830
  tokenExchangeUrl: "https://example.com/token",
856
831
  defaultScopes: [],
857
- scopePolicy: {},
832
+
858
833
  // Note: tokenExchangeBodyFormat intentionally omitted
859
834
  });
860
835
  expect(row.tokenExchangeBodyFormat).toBe("form");
@@ -869,7 +844,7 @@ describe("provider operations", () => {
869
844
  authorizeUrl: "https://example.com/authorize",
870
845
  tokenExchangeUrl: "https://example.com/token",
871
846
  defaultScopes: [],
872
- scopePolicy: {},
847
+
873
848
  tokenExchangeBodyFormat: "json",
874
849
  });
875
850
  expect(row.tokenExchangeBodyFormat).toBe("json");
@@ -881,7 +856,7 @@ describe("provider operations", () => {
881
856
  authorizeUrl: "https://api.notion.com/v1/oauth/authorize",
882
857
  tokenExchangeUrl: "https://api.notion.com/v1/oauth/token",
883
858
  defaultScopes: ["read"],
884
- scopePolicy: {},
859
+
885
860
  logoUrl: "https://cdn.simpleicons.org/notion",
886
861
  });
887
862
 
@@ -896,7 +871,6 @@ describe("provider operations", () => {
896
871
  authorizeUrl: "https://linear.app/oauth/authorize",
897
872
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
898
873
  defaultScopes: ["read"],
899
- scopePolicy: {},
900
874
  });
901
875
 
902
876
  const fetched = getProvider("linear");
@@ -913,7 +887,6 @@ describe("provider operations", () => {
913
887
  authorizeUrl: "https://github.com/authorize",
914
888
  tokenExchangeUrl: "https://github.com/token",
915
889
  defaultScopes: ["repo"],
916
- scopePolicy: {},
917
890
  },
918
891
  ]);
919
892
 
@@ -938,7 +911,7 @@ describe("provider operations", () => {
938
911
  authorizeUrl: "https://github.com/authorize",
939
912
  tokenExchangeUrl: "https://github.com/token",
940
913
  defaultScopes: ["repo"],
941
- scopePolicy: {},
914
+
942
915
  scopeSeparator: ",",
943
916
  },
944
917
  ]);
@@ -958,7 +931,6 @@ describe("provider operations", () => {
958
931
  authorizeUrl: "https://github.com/authorize",
959
932
  tokenExchangeUrl: "https://github.com/token",
960
933
  defaultScopes: ["repo"],
961
- scopePolicy: {},
962
934
  },
963
935
  ]);
964
936
 
@@ -987,7 +959,6 @@ describe("provider operations", () => {
987
959
  tokenExchangeUrl: "https://github.com/token",
988
960
  refreshUrl: "https://github.com/login/oauth/refresh",
989
961
  defaultScopes: ["repo"],
990
- scopePolicy: {},
991
962
  },
992
963
  ]);
993
964
 
@@ -1013,7 +984,6 @@ describe("provider operations", () => {
1013
984
  authorizeUrl: "https://github.com/authorize",
1014
985
  tokenExchangeUrl: "https://github.com/token",
1015
986
  defaultScopes: ["repo"],
1016
- scopePolicy: {},
1017
987
  },
1018
988
  ]);
1019
989
 
@@ -1037,7 +1007,6 @@ describe("provider operations", () => {
1037
1007
  authorizeUrl: "https://github.com/authorize",
1038
1008
  tokenExchangeUrl: "https://github.com/token",
1039
1009
  defaultScopes: ["repo"],
1040
- scopePolicy: {},
1041
1010
  },
1042
1011
  ]);
1043
1012
 
@@ -1072,7 +1041,6 @@ describe("provider operations", () => {
1072
1041
  revokeUrl: "https://github.com/login/oauth/revoke",
1073
1042
  revokeBodyTemplate: { token: "{access_token}" },
1074
1043
  defaultScopes: ["repo"],
1075
- scopePolicy: {},
1076
1044
  },
1077
1045
  ]);
1078
1046
 
@@ -1103,7 +1071,6 @@ describe("provider operations", () => {
1103
1071
  tokenExchangeUrl: "https://example.com/token",
1104
1072
  tokenEndpointAuthMethod: "client_secret_basic",
1105
1073
  defaultScopes: [],
1106
- scopePolicy: {},
1107
1074
  },
1108
1075
  ]);
1109
1076
 
@@ -1129,7 +1096,6 @@ describe("provider operations", () => {
1129
1096
  tokenExchangeUrl: "https://example.com/token",
1130
1097
  tokenExchangeBodyFormat: "json",
1131
1098
  defaultScopes: [],
1132
- scopePolicy: {},
1133
1099
  },
1134
1100
  ]);
1135
1101
 
@@ -1153,7 +1119,6 @@ describe("provider operations", () => {
1153
1119
  authorizeUrl: "https://linear.app/oauth/authorize",
1154
1120
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
1155
1121
  defaultScopes: ["read"],
1156
- scopePolicy: {},
1157
1122
  });
1158
1123
 
1159
1124
  expect(getProvider("linear")!.logoUrl).toBeNull();
@@ -1174,7 +1139,7 @@ describe("provider operations", () => {
1174
1139
  authorizeUrl: "https://api.notion.com/v1/oauth/authorize",
1175
1140
  tokenExchangeUrl: "https://api.notion.com/v1/oauth/token",
1176
1141
  defaultScopes: ["read"],
1177
- scopePolicy: {},
1142
+
1178
1143
  logoUrl: "https://cdn.simpleicons.org/notion",
1179
1144
  });
1180
1145
 
@@ -1195,7 +1160,7 @@ describe("provider operations", () => {
1195
1160
  authorizeUrl: "https://api.notion.com/v1/oauth/authorize",
1196
1161
  tokenExchangeUrl: "https://api.notion.com/v1/oauth/token",
1197
1162
  defaultScopes: ["read"],
1198
- scopePolicy: {},
1163
+
1199
1164
  logoUrl: "https://cdn.simpleicons.org/notion",
1200
1165
  });
1201
1166
 
@@ -1221,7 +1186,7 @@ describe("provider operations", () => {
1221
1186
  authorizeUrl: "https://linear.app/oauth/authorize",
1222
1187
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
1223
1188
  defaultScopes: ["read"],
1224
- scopePolicy: {},
1189
+
1225
1190
  scopeSeparator: "",
1226
1191
  },
1227
1192
  ]);
@@ -1236,7 +1201,7 @@ describe("provider operations", () => {
1236
1201
  authorizeUrl: "https://linear.app/oauth/authorize",
1237
1202
  tokenExchangeUrl: "https://api.linear.app/oauth/token",
1238
1203
  defaultScopes: ["read"],
1239
- scopePolicy: {},
1204
+
1240
1205
  scopeSeparator: "",
1241
1206
  });
1242
1207
 
@@ -2048,7 +2013,7 @@ describe("disconnectOAuthProvider", () => {
2048
2013
  authorizeUrl: `https://${provider}.example.com/authorize`,
2049
2014
  tokenExchangeUrl: `https://${provider}.example.com/token`,
2050
2015
  defaultScopes: ["read"],
2051
- scopePolicy: {},
2016
+
2052
2017
  ...(revokeUrl ? { revokeUrl } : {}),
2053
2018
  ...(revokeBodyTemplate ? { revokeBodyTemplate } : {}),
2054
2019
  },
@@ -2342,7 +2307,7 @@ describe("disconnectOAuthProvider", () => {
2342
2307
  authorizeUrl: "https://google.example.com/authorize",
2343
2308
  tokenExchangeUrl: "https://google.example.com/token",
2344
2309
  defaultScopes: ["email"],
2345
- scopePolicy: {},
2310
+
2346
2311
  revokeUrl: "https://oauth2.googleapis.com/revoke",
2347
2312
  revokeBodyTemplate: {
2348
2313
  token: "{access_token}",