@desplega.ai/agent-swarm 1.149.1 → 1.151.0

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 (538) hide show
  1. package/README.md +18 -3
  2. package/dist/{acp-adapter-vhkzfpjg.js → acp-adapter-ex8hzjfc.js} +5 -5
  3. package/dist/{actions-9d2694yk.js → actions-2bgpyhww.js} +39 -11
  4. package/dist/{app-fq2ggynt.js → app-1706zhr1.js} +7 -7
  5. package/dist/{artifact-gj9arwrr.js → artifact-td4q4dch.js} +1 -1
  6. package/dist/{assistant-edb6n9nn.js → assistant-bavke5p7.js} +44 -20
  7. package/dist/{azure-openai-responses-cqar64rc.js → azure-openai-responses-f38x2avq.js} +13 -13
  8. package/dist/{boot-reembed-msweabbp.js → boot-reembed-3cmrrmpa.js} +9 -9
  9. package/dist/{boot-reembed-q5wd3tha.js → boot-reembed-nafcmmmc.js} +14 -16
  10. package/dist/{boot-scrub-logs-3g1az933.js → boot-scrub-logs-cd6a2sq0.js} +5 -5
  11. package/dist/{claude-adapter-v3rnzsdc.js → claude-adapter-wfp2gzvz.js} +15 -16
  12. package/dist/{claude-managed-adapter-qvsmh6mv.js → claude-managed-adapter-dsmkcrjy.js} +3 -3
  13. package/dist/{claude-sdk-session-qxrpsna1.js → claude-sdk-session-bht9jjak.js} +15 -16
  14. package/dist/{cli-5m0qmvdp.js → cli-0qb1z6s2.js} +1 -1
  15. package/dist/{cli-9d8ntetj.js → cli-2658f6at.js} +1 -1
  16. package/dist/{cli-7evafqvy.js → cli-2tbvf1z1.js} +85 -69
  17. package/dist/{cli-k351hv5k.js → cli-3v9xhjcn.js} +24 -12
  18. package/dist/{cli-1ebpar1q.js → cli-4wppfkcm.js} +350 -20
  19. package/dist/{cli-4260r1tg.js → cli-5jd2z7av.js} +97 -84
  20. package/dist/{cli-cv7s5zdq.js → cli-5tpgq60f.js} +9865 -715
  21. package/dist/{cli-6skz3rk8.js → cli-7tgcstn2.js} +9 -4
  22. package/dist/{cli-01g3x1ca.js → cli-9004vfdf.js} +108 -56
  23. package/dist/{cli-1c94wvcw.js → cli-a1z3h107.js} +124 -99
  24. package/dist/{cli-9br8ypfv.js → cli-czjtgfys.js} +2 -2
  25. package/dist/{cli-5my3bjsd.js → cli-d3p82erb.js} +7 -7
  26. package/dist/{cli-e29gmdmw.js → cli-dv6cdjs2.js} +2 -1
  27. package/dist/{cli-wby1xnnb.js → cli-f1wky6zp.js} +1 -1
  28. package/dist/{cli-zvz62chv.js → cli-fm4ytsdk.js} +4 -4
  29. package/dist/{cli-tg8qj8ee.js → cli-frcta2w4.js} +6 -6
  30. package/dist/{cli-7xx10h0a.js → cli-g69fdc9g.js} +2 -2
  31. package/dist/{cli-cmp8g3sw.js → cli-gbfwcd3k.js} +44 -9
  32. package/dist/{handlers-nsg0bcye.js → cli-gjyvhmmh.js} +97 -45
  33. package/dist/{cli-08b07b4r.js → cli-ht5rs63n.js} +1 -1
  34. package/dist/{cli-jecc01cb.js → cli-j4nv2wqy.js} +2 -4
  35. package/dist/{cli-cd60fv6j.js → cli-j9xczhaq.js} +1 -1
  36. package/dist/cli-pf9q3696.js +172 -0
  37. package/dist/{cli-xm87hzbw.js → cli-pgj4a5fb.js} +1 -1
  38. package/dist/{cli-jezx9b9c.js → cli-ppm4975n.js} +9 -3
  39. package/dist/{cli-3z634pqe.js → cli-q88st9aj.js} +2 -2
  40. package/dist/{cli-3sysyjve.js → cli-r2q6pevn.js} +142 -49
  41. package/dist/{cli-07jd68a1.js → cli-re8z5p8p.js} +1 -1
  42. package/dist/{cli-qgd4sqz5.js → cli-s14agm5s.js} +121 -14
  43. package/dist/{cli-svbrpf5q.js → cli-sjaae6ff.js} +9872 -424
  44. package/dist/{cli-73gq0zxn.js → cli-vwm416m6.js} +13 -13
  45. package/dist/{cli-4wtq5jjv.js → cli-wbyk465z.js} +1 -1
  46. package/dist/{cli-3apbzgyk.js → cli-z61ykvam.js} +19 -14
  47. package/dist/{cli-e06a8a7y.js → cli-zkxymas5.js} +4 -3
  48. package/dist/cli.js +26 -25
  49. package/dist/{codex-adapter-jyw7a91z.js → codex-adapter-jjjk8w4m.js} +8 -9
  50. package/dist/{codex-hook-hfrt9shr.js → codex-hook-8jexc34x.js} +3 -3
  51. package/dist/{codex-session-runner-bmngj0s5.js → codex-session-runner-nd6ayxkx.js} +8 -9
  52. package/dist/{commands-n755g391.js → commands-9v4psyq1.js} +5 -5
  53. package/dist/{db-s1cgh5gv.js → db-wnt58tpe.js} +5 -5
  54. package/dist/dispatcher-05jh1aqk.js +74 -0
  55. package/dist/{e2b-p04vmtx0.js → e2b-413b8t4v.js} +1 -1
  56. package/dist/{google-generative-ai-tsskx7te.js → google-generative-ai-ndjmj5fa.js} +7 -7
  57. package/dist/{google-vertex-ppw8ydpa.js → google-vertex-fr665tqs.js} +10 -10
  58. package/dist/handlers-tw90pkh5.js +65 -0
  59. package/dist/{hook-jf0xe8zh.js → hook-123e2scb.js} +11 -12
  60. package/dist/{hook-h9cqrm8q.js → hook-sxe3r349.js} +11 -12
  61. package/dist/{http-nc6pydw5.js → http-ecsar8ez.js} +1442 -581
  62. package/dist/{index-ezxkds2n.js → index-16js521z.js} +335 -107
  63. package/dist/{index-769nc012.js → index-hw26vj40.js} +25 -19
  64. package/dist/{index-0wdy6gwc.js → index-nnrbpcjp.js} +25 -17
  65. package/dist/index-ymn7em0p.js +25 -0
  66. package/dist/{index-x1zcj09z.js → index-zj518gf9.js} +26 -20
  67. package/dist/{keepalive-nesm3xb6.js → keepalive-asqtcm4y.js} +7 -7
  68. package/dist/{lead-bwy6t2za.js → lead-xbfr7fvt.js} +40 -48
  69. package/dist/{maintenance-8w393zf0.js → maintenance-qma55qvw.js} +9 -9
  70. package/dist/{oauth-refresh-sweep-sh8xjy08.js → oauth-refresh-sweep-3s04c6qw.js} +6 -6
  71. package/dist/{onboard-25ps29h1.js → onboard-drskd386.js} +13 -4
  72. package/dist/{openai-codex-responses-g7w48y30.js → openai-codex-responses-wy6a43wd.js} +13 -13
  73. package/dist/{openai-responses-nmeyptke.js → openai-responses-6xwf7bzg.js} +19 -19
  74. package/dist/{opencode-adapter-dce4wskd.js → opencode-adapter-28axqa09.js} +4 -4
  75. package/dist/{otel-impl-b93gxnz5.js → otel-impl-943c96er.js} +1 -1
  76. package/dist/{pi-mono-adapter-zvshk5cj.js → pi-mono-adapter-jcqt71cg.js} +17 -19
  77. package/dist/{pricing-refresh-5v56x7gb.js → pricing-refresh-mx51az05.js} +7 -7
  78. package/dist/{rbac-roles-x55cnezn.js → rbac-roles-78baecqd.js} +13 -9
  79. package/dist/{rbac-roles-0p0s6pbj.js → rbac-roles-wcmrg6sv.js} +7 -7
  80. package/dist/{render-v2-hyd45w8b.js → render-v2-8zjntgf5.js} +7 -7
  81. package/dist/{seed-pricing-49gbgn96.js → seed-pricing-jqjs6cws.js} +6 -6
  82. package/dist/{setup-qvq64vzq.js → setup-4pks0vfk.js} +2 -2
  83. package/dist/work-objects-wangt792.js +165 -0
  84. package/dist/{worker-scj60cxg.js → worker-p2mr422x.js} +40 -48
  85. package/openapi.json +1365 -268
  86. package/package.json +4 -3
  87. package/src/agentmail/handlers.ts +95 -66
  88. package/src/be/budget-refusal-notify.ts +1 -0
  89. package/src/be/db/tasks/read.ts +3 -0
  90. package/src/be/db/tasks/write.ts +13 -1
  91. package/src/be/db-client.ts +5 -0
  92. package/src/be/db.ts +15 -5
  93. package/src/be/extensions/db.ts +461 -0
  94. package/src/be/extensions/validate.ts +107 -0
  95. package/src/be/memory/boot-reembed.ts +17 -12
  96. package/src/be/memory/index.ts +12 -0
  97. package/src/be/memory/providers/openai-embedding.ts +4 -0
  98. package/src/be/memory/types.ts +2 -0
  99. package/src/be/migrations/153_deferred_task_wait_members.sql +25 -0
  100. package/src/be/migrations/154_routing_source.sql +3 -0
  101. package/src/be/migrations/155_extensions.sql +66 -0
  102. package/src/be/migrations/156_inbox_item_state_read_at.sql +7 -0
  103. package/src/be/rbac-roles.ts +3 -2
  104. package/src/be/scripts/typecheck.ts +59 -41
  105. package/src/be/seed/schedules-seeder.ts +25 -2
  106. package/src/be/seed/workflows-seeder.ts +17 -0
  107. package/src/be/seed-scripts/catalog/delegate.ts +3 -1
  108. package/src/be/seed-skills/bundled-files.generated.json +1 -1
  109. package/src/be/seed-skills/index.ts +7 -0
  110. package/src/be/steering.ts +1 -0
  111. package/src/be/swarm-config-guard.ts +3 -1
  112. package/src/commands/credential-refresh.ts +70 -0
  113. package/src/commands/onboard/compose-generator.ts +14 -2
  114. package/src/commands/onboard/env-generator.ts +7 -0
  115. package/src/commands/provider-credentials.ts +2 -25
  116. package/src/commands/runner.ts +24 -57
  117. package/src/extensions/apply-task-create.ts +135 -0
  118. package/src/extensions/bundle-path.ts +10 -0
  119. package/src/extensions/contract-runtime.ts +7 -0
  120. package/src/extensions/contract-types.generated.ts +4 -0
  121. package/src/extensions/contract.ts +270 -0
  122. package/src/extensions/ctx.ts +186 -0
  123. package/src/extensions/dispatcher.ts +479 -0
  124. package/src/extensions/identity.ts +44 -0
  125. package/src/extensions/lifecycle.ts +281 -0
  126. package/src/extensions/loader.ts +207 -0
  127. package/src/extensions/post-bridge.ts +161 -0
  128. package/src/github/handlers.ts +185 -140
  129. package/src/gitlab/handlers.ts +97 -77
  130. package/src/heartbeat/heartbeat.ts +155 -83
  131. package/src/http/agents.ts +1 -1
  132. package/src/http/all-routes.ts +1 -0
  133. package/src/http/approval-requests.ts +1 -0
  134. package/src/http/apps.ts +14 -9
  135. package/src/http/config.ts +4 -1
  136. package/src/http/core.ts +38 -2
  137. package/src/http/extensions.ts +547 -0
  138. package/src/http/inbox-state.ts +2 -0
  139. package/src/http/index.ts +41 -3
  140. package/src/http/mcp-bridge.ts +96 -62
  141. package/src/http/mcp.ts +1 -1
  142. package/src/http/script-runs.ts +5 -0
  143. package/src/http/status.ts +6 -4
  144. package/src/http/tasks.ts +51 -30
  145. package/src/integrations/kapso/inbound.ts +15 -10
  146. package/src/jira/sync.ts +26 -16
  147. package/src/linear/sync.ts +26 -16
  148. package/src/prompts/session-templates.ts +18 -13
  149. package/src/providers/claude-adapter.ts +21 -8
  150. package/src/rbac/admission.ts +1 -1
  151. package/src/rbac/elevated-agents.ts +24 -0
  152. package/src/rbac/legacy-policy.ts +35 -6
  153. package/src/rbac/permissions.ts +8 -0
  154. package/src/scheduler/deferred-task-waits.ts +138 -27
  155. package/src/scheduler/schedule-task.ts +54 -24
  156. package/src/scheduler/scheduler.ts +108 -125
  157. package/src/scripts-runtime/executors/native.ts +5 -1
  158. package/src/scripts-runtime/executors/types.ts +5 -0
  159. package/src/scripts-runtime/import-allowlist.ts +79 -19
  160. package/src/scripts-runtime/sdk-allowlist.ts +4 -0
  161. package/src/scripts-runtime/swarm-config.ts +8 -0
  162. package/src/scripts-runtime/swarm-sdk.ts +3 -0
  163. package/src/scripts-runtime/types/stdlib.d.ts +16 -3
  164. package/src/scripts-runtime/types/swarm-extension.d.ts +562 -0
  165. package/src/scripts-runtime/types/swarm-sdk.d.ts +16 -3
  166. package/src/server.ts +6 -0
  167. package/src/slack/HEURISTICS.md +3 -1
  168. package/src/slack/actions.ts +21 -16
  169. package/src/slack/app.ts +2 -0
  170. package/src/slack/assistant.ts +4 -12
  171. package/src/slack/blocks.ts +1 -1
  172. package/src/slack/handlers.ts +107 -19
  173. package/src/slack/inbound-files.ts +9 -5
  174. package/src/slack/render-v2.ts +188 -38
  175. package/src/slack/router.ts +13 -3
  176. package/src/slack/steering.ts +3 -3
  177. package/src/slack/thread-buffer.ts +66 -23
  178. package/src/slack/work-objects.test.ts +252 -0
  179. package/src/slack/work-objects.ts +118 -0
  180. package/src/tasks/errors.ts +9 -0
  181. package/src/tasks/sibling-awareness.ts +35 -1
  182. package/src/tasks/worker-follow-up.ts +67 -11
  183. package/src/tests/acp-adapter.test.ts +10 -10
  184. package/src/tests/agent-fs-live-url.test.ts +40 -0
  185. package/src/tests/agent-fs-provision-seeder.test.ts +12 -12
  186. package/src/tests/api-key-tracking.test.ts +18 -18
  187. package/src/tests/api-key.test.ts +4 -2
  188. package/src/tests/apps-rbac.test.ts +1 -1
  189. package/src/tests/apps-spike5.test.ts +1 -1
  190. package/src/tests/apps-sync-engine.test.ts +8 -8
  191. package/src/tests/apps-user-config.test.ts +1 -1
  192. package/src/tests/artifact-sdk.test.ts +8 -8
  193. package/src/tests/asset-key-mcp.test.ts +2 -0
  194. package/src/tests/automation-preflight-alert.test.ts +1 -1
  195. package/src/tests/base-prompt.test.ts +7 -6
  196. package/src/tests/budget-user-scope.test.ts +1 -1
  197. package/src/tests/budgets-routes.test.ts +1 -1
  198. package/src/tests/claude-adapter-binary.test.ts +22 -40
  199. package/src/tests/claude-adapter-otel.test.ts +13 -7
  200. package/src/tests/claude-adapter.test.ts +8 -6
  201. package/src/tests/claude-hook-credentials.test.ts +3 -3
  202. package/src/tests/claude-managed-adapter.test.ts +4 -4
  203. package/src/tests/claude-managed-setup.test.ts +3 -3
  204. package/src/tests/claude-sdk-lifecycle.test.ts +1 -1
  205. package/src/tests/claude-sdk-transport.test.ts +6 -6
  206. package/src/tests/claude-stop-hook.test.ts +8 -8
  207. package/src/tests/claude-worker-parity.test.ts +3 -3
  208. package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +5 -5
  209. package/src/tests/codex-adapter.test.ts +7 -5
  210. package/src/tests/codex-app-server.test.ts +2 -2
  211. package/src/tests/codex-login.test.ts +15 -15
  212. package/src/tests/codex-oauth-credential-info.test.ts +4 -4
  213. package/src/tests/codex-oauth-keep-warm.test.ts +4 -4
  214. package/src/tests/codex-oauth-refresh-lock.test.ts +1 -1
  215. package/src/tests/codex-oauth-storage.test.ts +7 -7
  216. package/src/tests/codex-pool.test.ts +1 -1
  217. package/src/tests/codex-steering-hook.test.ts +1 -1
  218. package/src/tests/codex-swarm-events.test.ts +1 -1
  219. package/src/tests/config-api-only-keys.test.ts +1 -1
  220. package/src/tests/config-session-auth.test.ts +2 -2
  221. package/src/tests/connection-embedded-auth.test.ts +20 -18
  222. package/src/tests/core-auth.test.ts +1 -1
  223. package/src/tests/create-page-tool.test.ts +3 -3
  224. package/src/tests/credential-refresh.test.ts +115 -0
  225. package/src/tests/credential-wait.test.ts +2 -2
  226. package/src/tests/credentials.test.ts +6 -4
  227. package/src/tests/db-queries-oauth.test.ts +40 -40
  228. package/src/tests/defer-task.test.ts +73 -8
  229. package/src/tests/deferred-task-wait-migration.test.ts +64 -0
  230. package/src/tests/deferred-task-wake.test.ts +349 -8
  231. package/src/tests/devin-adapter.test.ts +1 -1
  232. package/src/tests/devin-api.test.ts +1 -1
  233. package/src/tests/docs-index-footprint.test.js +3 -3
  234. package/src/tests/e2b-dispatch.test.ts +21 -19
  235. package/src/tests/e2e-claude-transport.test.ts +3 -3
  236. package/src/tests/e2e-redact.test.ts +6 -6
  237. package/src/tests/ensure-token.test.ts +68 -68
  238. package/src/tests/entrypoint-api-readiness.test.ts +1 -1
  239. package/src/tests/entrypoint-codex-oauth-seed.test.ts +13 -13
  240. package/src/tests/env-flag.test.ts +1 -0
  241. package/src/tests/events-http.test.ts +1 -1
  242. package/src/tests/extensions-db.test.ts +216 -0
  243. package/src/tests/extensions-dispatcher.test.ts +275 -0
  244. package/src/tests/extensions-example-heartbeat-remediate.test.ts +69 -0
  245. package/src/tests/extensions-example-mcp-install.test.ts +63 -0
  246. package/src/tests/extensions-example-no-exclamation-marks.test.ts +72 -0
  247. package/src/tests/extensions-example-rewrite-and-suppress.test.ts +70 -0
  248. package/src/tests/extensions-example-route-slack-channel.test.ts +217 -0
  249. package/src/tests/extensions-heartbeat.test.ts +291 -0
  250. package/src/tests/extensions-http.test.ts +431 -0
  251. package/src/tests/extensions-lead-equivalence.test.ts +49 -0
  252. package/src/tests/extensions-lifecycle.test.ts +209 -0
  253. package/src/tests/extensions-loader.test.ts +95 -0
  254. package/src/tests/extensions-mcp-tools.test.ts +245 -0
  255. package/src/tests/extensions-pre-task.test.ts +487 -0
  256. package/src/tests/extensions-run-context.test.ts +41 -0
  257. package/src/tests/extensions-tool-call.test.ts +288 -0
  258. package/src/tests/extensions-validate.test.ts +196 -0
  259. package/src/tests/fixtures/extensions/bad-import/hooks.ts +8 -0
  260. package/src/tests/fixtures/extensions/bad-import/manifest.json +9 -0
  261. package/src/tests/fixtures/extensions/bad-return-shape/hooks.ts +10 -0
  262. package/src/tests/fixtures/extensions/bad-return-shape/manifest.json +9 -0
  263. package/src/tests/fixtures/extensions/block-tasks-from-source/hooks.ts +22 -0
  264. package/src/tests/fixtures/extensions/block-tasks-from-source/manifest.json +9 -0
  265. package/src/tests/fixtures/extensions/ignore-channel/hooks.ts +22 -0
  266. package/src/tests/fixtures/extensions/ignore-channel/manifest.json +9 -0
  267. package/src/tests/fixtures/extensions/load.ts +10 -0
  268. package/src/tests/fixtures/extensions/minimal/hooks.ts +7 -0
  269. package/src/tests/fixtures/extensions/minimal/manifest.json +9 -0
  270. package/src/tests/fixtures/extensions/never-fail-long-tasks/hooks.ts +11 -0
  271. package/src/tests/fixtures/extensions/never-fail-long-tasks/manifest.json +9 -0
  272. package/src/tests/fixtures/extensions/no-exclamation-marks/hooks.ts +23 -0
  273. package/src/tests/fixtures/extensions/no-exclamation-marks/manifest.json +9 -0
  274. package/src/tests/fixtures/extensions/post-logger/hooks.ts +9 -0
  275. package/src/tests/fixtures/extensions/post-logger/manifest.json +9 -0
  276. package/src/tests/fixtures/extensions/priority-a/hooks.ts +7 -0
  277. package/src/tests/fixtures/extensions/priority-a/manifest.json +9 -0
  278. package/src/tests/fixtures/extensions/priority-b/hooks.ts +7 -0
  279. package/src/tests/fixtures/extensions/priority-b/manifest.json +9 -0
  280. package/src/tests/fixtures/extensions/record-only-on-tag/hooks.ts +16 -0
  281. package/src/tests/fixtures/extensions/record-only-on-tag/manifest.json +9 -0
  282. package/src/tests/fixtures/extensions/reserved-assets/hooks.ts +5 -0
  283. package/src/tests/fixtures/extensions/reserved-assets/manifest.json +10 -0
  284. package/src/tests/fixtures/extensions/rewrite-progress-prefix/hooks.ts +22 -0
  285. package/src/tests/fixtures/extensions/rewrite-progress-prefix/manifest.json +9 -0
  286. package/src/tests/fixtures/extensions/rewrite-task-priority/hooks.ts +7 -0
  287. package/src/tests/fixtures/extensions/rewrite-task-priority/manifest.json +9 -0
  288. package/src/tests/fixtures/extensions/route-channel-to-agent/hooks.ts +26 -0
  289. package/src/tests/fixtures/extensions/route-channel-to-agent/manifest.json +9 -0
  290. package/src/tests/fixtures/extensions/slow/hooks.ts +10 -0
  291. package/src/tests/fixtures/extensions/slow/manifest.json +9 -0
  292. package/src/tests/fixtures/extensions/suppress-lead-follow-up/hooks.ts +12 -0
  293. package/src/tests/fixtures/extensions/suppress-lead-follow-up/manifest.json +9 -0
  294. package/src/tests/fixtures/extensions/throws/hooks.ts +12 -0
  295. package/src/tests/fixtures/extensions/throws/manifest.json +9 -0
  296. package/src/tests/fixtures/extensions/worker-runtime/hooks.ts +5 -0
  297. package/src/tests/fixtures/extensions/worker-runtime/manifest.json +9 -0
  298. package/src/tests/fs-routes.test.ts +1 -1
  299. package/src/tests/gitlab-auth.test.ts +10 -10
  300. package/src/tests/harness-provider-resolution.test.ts +8 -5
  301. package/src/tests/heartbeat-reroute-decision.test.ts +1 -0
  302. package/src/tests/helper-credentials.test.ts +137 -0
  303. package/src/tests/http/context-routes.test.ts +2 -2
  304. package/src/tests/http-api-integration.test.ts +5 -2
  305. package/src/tests/http-users.test.ts +1 -1
  306. package/src/tests/identity-refresh.test.ts +2 -2
  307. package/src/tests/internal-ai/complete-structured.test.ts +2 -2
  308. package/src/tests/internal-ai/credentials.test.ts +19 -17
  309. package/src/tests/jira-metadata.test.ts +1 -1
  310. package/src/tests/jira-oauth.test.ts +5 -5
  311. package/src/tests/jira-sync.test.ts +1 -1
  312. package/src/tests/jira-webhook-lifecycle.test.ts +3 -3
  313. package/src/tests/jira-webhook.test.ts +2 -2
  314. package/src/tests/kapso-inbound.test.ts +2 -2
  315. package/src/tests/kv-http.test.ts +1 -1
  316. package/src/tests/kv-namespace-resolution.test.ts +1 -1
  317. package/src/tests/kv-page-proxy.test.ts +2 -2
  318. package/src/tests/launch-password-rejection.test.ts +2 -2
  319. package/src/tests/linear-webhook.test.ts +1 -1
  320. package/src/tests/mcp-oauth-dcr-reuse.test.ts +6 -6
  321. package/src/tests/mcp-oauth-ensure-token.test.ts +28 -22
  322. package/src/tests/mcp-oauth-manual-client.test.ts +16 -12
  323. package/src/tests/mcp-oauth-queries.test.ts +35 -32
  324. package/src/tests/mcp-oauth-resolve-secrets.test.ts +8 -8
  325. package/src/tests/mcp-oauth-wrapper.test.ts +20 -20
  326. package/src/tests/mcp-user-route.test.ts +1 -1
  327. package/src/tests/memory-edges.test.ts +1 -1
  328. package/src/tests/memory-edit-authorization.test.ts +32 -0
  329. package/src/tests/memory-rate-endpoint.test.ts +1 -1
  330. package/src/tests/memory-rate-tool.test.ts +2 -2
  331. package/src/tests/memory-rater-e2e.test.ts +1 -1
  332. package/src/tests/memory-rater-llm-summarizer.test.ts +3 -3
  333. package/src/tests/memory-rater-llm.test.ts +1 -1
  334. package/src/tests/model-control.test.ts +3 -0
  335. package/src/tests/multi-runtime-enabled-stats.test.ts +2 -2
  336. package/src/tests/multi-runtime-registration.test.ts +111 -17
  337. package/src/tests/oauth-access-token-tool.test.ts +18 -18
  338. package/src/tests/oauth-callback-flow.test.ts +8 -8
  339. package/src/tests/oauth-credential-bindings.test.ts +29 -27
  340. package/src/tests/oauth-keepalive.test.ts +10 -10
  341. package/src/tests/oauth-presets.test.ts +13 -5
  342. package/src/tests/oauth-refresh-failure.test.ts +9 -9
  343. package/src/tests/oauth-refresh-sweep.test.ts +20 -13
  344. package/src/tests/oauth-wrapper.test.ts +1 -1
  345. package/src/tests/onboard-compose.test.ts +47 -3
  346. package/src/tests/onboard-env.test.ts +26 -26
  347. package/src/tests/onboard-non-interactive.test.ts +4 -4
  348. package/src/tests/opencode-adapter.test.ts +1 -1
  349. package/src/tests/opencode-plugin.test.ts +2 -2
  350. package/src/tests/otel-session-cost-metrics.test.ts +1 -1
  351. package/src/tests/page-proxy-authed.test.ts +2 -2
  352. package/src/tests/page-proxy.test.ts +2 -2
  353. package/src/tests/page-session.test.ts +7 -7
  354. package/src/tests/page-viewer-auth.test.ts +2 -2
  355. package/src/tests/pages-authed-mode.test.ts +1 -1
  356. package/src/tests/pages-http.test.ts +1 -1
  357. package/src/tests/pages-password-mode.test.ts +1 -1
  358. package/src/tests/pages-public-authed-401.test.ts +1 -1
  359. package/src/tests/pages-public-html.test.ts +2 -2
  360. package/src/tests/pages-view-count.test.ts +1 -1
  361. package/src/tests/pi-mono-adapter.test.ts +10 -10
  362. package/src/tests/pi-mono-extension.test.ts +2 -2
  363. package/src/tests/preload.ts +5 -0
  364. package/src/tests/pricing-routes.test.ts +1 -1
  365. package/src/tests/profile-sync-warning.test.ts +8 -8
  366. package/src/tests/profile-sync.test.ts +8 -8
  367. package/src/tests/prompt-template-session.test.ts +36 -5
  368. package/src/tests/provider-process-group.test.ts +95 -4
  369. package/src/tests/providers/pi-cost.test.ts +1 -1
  370. package/src/tests/queue-stall-alarm.test.ts +1 -1
  371. package/src/tests/rbac-admission.test.ts +19 -4
  372. package/src/tests/rbac-charact-http.test.ts +1 -1
  373. package/src/tests/rbac-e2e-helpers.ts +1 -1
  374. package/src/tests/rbac-engine.test.ts +39 -0
  375. package/src/tests/realtime-room-auth.test.ts +1 -1
  376. package/src/tests/realtime-room-surfaces.test.ts +1 -1
  377. package/src/tests/reload-config.test.ts +45 -1
  378. package/src/tests/routing-affinity-inventory.test.ts +1 -1
  379. package/src/tests/routing-reason-contract.test.ts +76 -3
  380. package/src/tests/routing-reason-inventory.test.ts +11 -6
  381. package/src/tests/routing-source.test.ts +53 -0
  382. package/src/tests/runner-agent-fs-provision-retry.test.ts +1 -1
  383. package/src/tests/runner-context-preamble.test.ts +1 -1
  384. package/src/tests/runner-deployment-resume.test.ts +1 -1
  385. package/src/tests/runner-fallback-output.test.ts +1 -1
  386. package/src/tests/runner-identity-refresh.test.ts +1 -1
  387. package/src/tests/runner-skills-refresh.test.ts +1 -1
  388. package/src/tests/schedule-target-type.test.ts +3 -3
  389. package/src/tests/scheduled-tasks.test.ts +14 -5
  390. package/src/tests/scheduler-occurrence.test.ts +347 -0
  391. package/src/tests/script-apis-mcp.test.ts +1 -1
  392. package/src/tests/script-connections-http.test.ts +61 -58
  393. package/src/tests/script-connections-mcp.test.ts +1 -1
  394. package/src/tests/script-connections.test.ts +3 -1
  395. package/src/tests/script-runs-http.test.ts +15 -7
  396. package/src/tests/script-workflows-runtime-e2e.test.ts +1 -1
  397. package/src/tests/scripts-boot-reembed.test.ts +4 -0
  398. package/src/tests/scripts-embeddings.test.ts +4 -0
  399. package/src/tests/scripts-external-api.test.ts +1 -1
  400. package/src/tests/scripts-http.test.ts +1 -1
  401. package/src/tests/scripts-import-allowlist.test.ts +44 -1
  402. package/src/tests/scripts-mcp-e2e.test.ts +81 -1
  403. package/src/tests/scripts-only-gating.test.ts +4 -2
  404. package/src/tests/scripts-retention.test.ts +1 -1
  405. package/src/tests/scripts-runtime-identity.test.ts +2 -2
  406. package/src/tests/scripts-runtime-secret-egress.test.ts +1 -1
  407. package/src/tests/scripts-runtime.test.ts +6 -4
  408. package/src/tests/scripts-typecheck.test.ts +21 -0
  409. package/src/tests/sdk-allowlist.test.ts +1 -1
  410. package/src/tests/secret-scrubber.test.ts +38 -31
  411. package/src/tests/seed-registry.test.ts +46 -8
  412. package/src/tests/seed-schedules.test.ts +44 -9
  413. package/src/tests/seed-workflows.test.ts +21 -9
  414. package/src/tests/send-task-output-schema.test.ts +9 -1
  415. package/src/tests/send-task-requested-by.test.ts +1 -0
  416. package/src/tests/send-task-slack-routing-guard.test.ts +2 -0
  417. package/src/tests/session-costs-codex-recompute.test.ts +1 -1
  418. package/src/tests/session-costs-golden.test.ts +2 -2
  419. package/src/tests/session-costs-model-key-normalize.test.ts +2 -2
  420. package/src/tests/session-costs-recompute-all-providers.test.ts +1 -1
  421. package/src/tests/session-tokens.test.ts +1 -1
  422. package/src/tests/shutdown-error-scrubbing.test.ts +1 -1
  423. package/src/tests/slack-blocks.test.ts +12 -1
  424. package/src/tests/slack-file-tools-attachments.test.ts +1 -1
  425. package/src/tests/slack-inbound-files.test.ts +222 -86
  426. package/src/tests/slack-reaction-config.test.ts +5 -4
  427. package/src/tests/slack-read-boundaries.test.ts +1 -1
  428. package/src/tests/slack-render-v2.test.ts +196 -4
  429. package/src/tests/slack-router.test.ts +17 -2
  430. package/src/tests/slack-steering.test.ts +19 -0
  431. package/src/tests/status.test.ts +19 -7
  432. package/src/tests/steering-core.test.ts +1 -1
  433. package/src/tests/steering-enabled.test.ts +6 -8
  434. package/src/tests/steering-transport.test.ts +4 -4
  435. package/src/tests/store-progress-output-guidance.test.ts +34 -0
  436. package/src/tests/swarm-tool-result-gate.test.ts +11 -11
  437. package/src/tests/swarm-x-tool.test.ts +7 -5
  438. package/src/tests/sync-ai-toolbox-skills.test.ts +19 -0
  439. package/src/tests/task-supersede-resume.test.ts +1 -1
  440. package/src/tests/task-tool-preload-mcp.test.ts +4 -1
  441. package/src/tests/task-tools-ctx.test.ts +2 -0
  442. package/src/tests/tasks-requested-by-filter.test.ts +2 -2
  443. package/src/tests/telemetry-init.test.ts +11 -3
  444. package/src/tests/tool-annotations.test.ts +1 -1
  445. package/src/tests/tool-output-agent-id.test.ts +1 -0
  446. package/src/tests/tool-registrar-no-input.test.ts +42 -1
  447. package/src/tests/tracker-fold.test.ts +7 -7
  448. package/src/tests/tracker-tools.test.ts +3 -3
  449. package/src/tests/ui-followup-lead-delegation.test.ts +1 -0
  450. package/src/tests/unified-oauth-migration.test.ts +5 -5
  451. package/src/tests/user-token-rest-auth.test.ts +1 -1
  452. package/src/tests/user-token-routes.test.ts +1 -1
  453. package/src/tests/whoami-route.test.ts +1 -1
  454. package/src/tests/workflow-agent-task.test.ts +15 -13
  455. package/src/tests/workflow-ctx.test.ts +1 -1
  456. package/src/tests/workflow-e2e.test.ts +1 -1
  457. package/src/tests/workflow-engine-v2.test.ts +3 -1
  458. package/src/tests/workflow-executors.test.ts +2 -2
  459. package/src/tests/workflow-http-v2.test.ts +8 -6
  460. package/src/tests/workflow-input-redaction.test.ts +7 -5
  461. package/src/tests/workflow-integration-io.test.ts +2 -2
  462. package/src/tests/workflow-llm.test.ts +5 -5
  463. package/src/tests/workflow-registry.test.ts +1 -1
  464. package/src/tests/workflow-swarm-script.test.ts +1 -1
  465. package/src/tests/workflow-triggers-v2.test.ts +23 -21
  466. package/src/tests/x-composio.test.ts +9 -7
  467. package/src/tests/x402-client.test.ts +1 -1
  468. package/src/tests/x402-config.test.ts +28 -41
  469. package/src/tools/defer-task.ts +156 -24
  470. package/src/tools/extension-common.ts +84 -0
  471. package/src/tools/extension-install.ts +65 -0
  472. package/src/tools/extension-list.ts +66 -0
  473. package/src/tools/script-common.ts +43 -18
  474. package/src/tools/send-task.ts +87 -105
  475. package/src/tools/skills/skill-publish.ts +1 -0
  476. package/src/tools/store-progress.ts +1 -1
  477. package/src/tools/task-action.ts +43 -22
  478. package/src/tools/task-tool-ctx.ts +2 -0
  479. package/src/tools/templates.ts +2 -1
  480. package/src/tools/tool-config.ts +3 -1
  481. package/src/tools/utils.ts +140 -16
  482. package/src/types.ts +144 -0
  483. package/src/utils/constants.ts +7 -1
  484. package/src/utils/credentials.test.ts +16 -16
  485. package/src/utils/multi-runtime.ts +2 -2
  486. package/src/utils/steering-enabled.ts +4 -4
  487. package/src/workflows/executors/agent-task.ts +18 -3
  488. package/templates/ai-toolbox.manifest.json +7 -1
  489. package/templates/extensions/README.md +17 -0
  490. package/templates/extensions/notify-on-complete/README.md +11 -0
  491. package/templates/extensions/notify-on-complete/hooks.ts +61 -0
  492. package/templates/extensions/notify-on-complete/manifest.json +7 -0
  493. package/templates/extensions/require-ticket-ref/README.md +11 -0
  494. package/templates/extensions/require-ticket-ref/hooks.ts +30 -0
  495. package/templates/extensions/require-ticket-ref/manifest.json +7 -0
  496. package/templates/extensions/require-verification-note/README.md +11 -0
  497. package/templates/extensions/require-verification-note/hooks.ts +32 -0
  498. package/templates/extensions/require-verification-note/manifest.json +7 -0
  499. package/templates/schedules/daily-hn-briefing/config.json +1 -1
  500. package/templates/schedules/gtm-weekly-review/config.json +1 -1
  501. package/templates/schedules/weekly-code-health-reports/config.json +1 -1
  502. package/templates/schedules/weekly-dependabot-triage/config.json +1 -1
  503. package/templates/schedules/weekly-dora-metrics/config.json +1 -1
  504. package/templates/schedules/weekly-harness-upgrade-check/config.json +1 -1
  505. package/templates/skills/delegate-work/files/scripts/codex-exec.sh +1 -1
  506. package/templates/skills/scheduling/content.md +2 -0
  507. package/templates/skills/serply-search/SKILL.md +95 -0
  508. package/templates/skills/serply-search/config.json +13 -0
  509. package/templates/skills/serply-search/content.md +90 -0
  510. package/templates/skills/swarm-extensions/config.json +14 -0
  511. package/templates/skills/swarm-extensions/content.md +120 -0
  512. package/templates/skills/swarm-scripts/SKILL.md +2 -2
  513. package/templates/skills/swarm-scripts/content.md +2 -2
  514. package/templates/workflows/claude-code-changelog-watch/config.json +1 -1
  515. package/templates/workflows/gsc-topic-miner/config.json +1 -1
  516. package/templates/workflows/linear-drain-loop/config.json +1 -1
  517. package/templates/workflows/llm-safe-release-context/config.json +1 -1
  518. package/templates/workflows/ralph-loop/config.json +1 -1
  519. package/dist/cli-7fehefdf.js +0 -562
  520. package/dist/cli-ayvy5kde.js +0 -164
  521. package/dist/cli-ddfw1mc4.js +0 -4322
  522. package/dist/cli-hzqmgcm2.js +0 -3066
  523. package/dist/cli-j4d4f6hv.js +0 -338
  524. package/dist/cli-qgm2pfpq.js +0 -6377
  525. package/dist/cli-sdzq01t9.js +0 -823
  526. package/dist/cli-xvkmedgn.js +0 -332
  527. package/dist/cli-y3pq4v9g.js +0 -664
  528. package/dist/{anthropic-messages-vs2rabzp.js → anthropic-messages-2y8nktar.js} +19 -19
  529. package/dist/{claude-managed-setup-f5pmsyrp.js → claude-managed-setup-48dwg9bv.js} +3 -3
  530. package/dist/{cli-81r683bv.js → cli-ch38q5z4.js} +0 -0
  531. package/dist/{cli-6664w7y4.js → cli-kj76p1ez.js} +8 -8
  532. package/dist/{cli-c71mg51n.js → cli-r2fpe7cx.js} +5 -5
  533. package/dist/{cli-4xz3pmrq.js → cli-y6x0gqtg.js} +16 -16
  534. package/dist/{index-aa3sa6s8.js → index-2wsdsnmm.js} +1 -1
  535. package/dist/{mistral-conversations-4ryk7h83.js → mistral-conversations-qhr84ph3.js} +9 -9
  536. package/dist/{openai-completions-0bqmsajw.js → openai-completions-32rdwmze.js} +19 -19
  537. package/dist/{openrouter-images-qx18fyp8.js → openrouter-images-9f9ek4rw.js} +3 -3
  538. package/dist/{pi-messages-79jvzz1d.js → pi-messages-b1mbr6gp.js} +4 -4
@@ -349,7 +349,7 @@ describe("completeStructured", () => {
349
349
  test("claude-cli exhaustion logs one scrubbed line", async () => {
350
350
  const original = console.error;
351
351
  const errors: unknown[][] = [];
352
- const secret = "sk-proj-abcdefghijklmnopqrstuvwxyz012345";
352
+ const secret = "example-sk-proj-abcdefghijklmnopqrstuvwxyz012345";
353
353
  console.error = (...args: unknown[]) => {
354
354
  errors.push(args);
355
355
  };
@@ -374,7 +374,7 @@ describe("completeStructured", () => {
374
374
  expect(errors[0]).toHaveLength(1);
375
375
  expect(errors[0]?.[0]).toBeString();
376
376
  expect(errors[0]?.[0]).toContain("callerTag=session-summary:test kind=claude-cli");
377
- expect(errors[0]?.[0]).toContain("provider failed with [REDACTED:");
377
+ expect(errors[0]?.[0]).toContain("provider failed with example-[REDACTED:");
378
378
  expect(errors[0]?.[0]).not.toContain(secret);
379
379
  } finally {
380
380
  console.error = original;
@@ -35,10 +35,12 @@ describe("resolveCredential", () => {
35
35
  });
36
36
 
37
37
  test("ANTHROPIC_API_KEY when no openrouter", async () => {
38
- const cred = await resolveCredential(makeOpts({ env: { ANTHROPIC_API_KEY: "sk-ant-1" } }));
38
+ const cred = await resolveCredential(
39
+ makeOpts({ env: { ANTHROPIC_API_KEY: "example-sk-ant-1" } }),
40
+ );
39
41
  expect(cred?.kind).toBe("anthropic");
40
42
  if (cred?.kind === "anthropic") {
41
- expect(cred.apiKey).toBe("sk-ant-1");
43
+ expect(cred.apiKey).toBe("example-sk-ant-1");
42
44
  expect(cred.modelDefault).toBe("anthropic/claude-haiku-4-5");
43
45
  }
44
46
  });
@@ -57,7 +59,7 @@ describe("resolveCredential", () => {
57
59
  makeOpts({
58
60
  env: {},
59
61
  apiUrl: "http://localhost:3013",
60
- apiKey: "test-api-key",
62
+ apiKey: "example-test-api-key",
61
63
  _getValidCodexOAuth: async () => ({
62
64
  access: "at_codex",
63
65
  refresh: "rt_codex",
@@ -70,13 +72,13 @@ describe("resolveCredential", () => {
70
72
  refresh: "rt_codex_refreshed",
71
73
  expires: Date.now() + 3600_000,
72
74
  },
73
- apiKey: "codex-api-key-derived",
75
+ apiKey: "example-codex-api-key-derived",
74
76
  }),
75
77
  }),
76
78
  );
77
79
  expect(cred?.kind).toBe("openai-codex");
78
80
  if (cred?.kind === "openai-codex") {
79
- expect(cred.apiKey).toBe("codex-api-key-derived");
81
+ expect(cred.apiKey).toBe("example-codex-api-key-derived");
80
82
  expect(cred.modelDefault).toBe("openai-codex/gpt-5.4-mini");
81
83
  }
82
84
  });
@@ -85,10 +87,10 @@ describe("resolveCredential", () => {
85
87
  const cred = await resolveCredential({
86
88
  env: {},
87
89
  apiUrl: "http://localhost:3013",
88
- apiKey: "test-api-key",
90
+ apiKey: "example-test-api-key",
89
91
  _getEnvApiKey: () => undefined,
90
92
  _getValidCodexOAuth: async () => ({
91
- access: "at_provider_runtime",
93
+ access: "example-at_provider_runtime",
92
94
  refresh: "rt_provider_runtime",
93
95
  expires: Date.now() + 3600_000,
94
96
  accountId: "acc-runtime",
@@ -98,7 +100,7 @@ describe("resolveCredential", () => {
98
100
 
99
101
  expect(cred).toEqual({
100
102
  kind: "openai-codex",
101
- apiKey: "at_provider_runtime",
103
+ apiKey: "example-at_provider_runtime",
102
104
  modelDefault: "openai-codex/gpt-5.4-mini",
103
105
  });
104
106
  });
@@ -110,7 +112,7 @@ describe("resolveCredential", () => {
110
112
  makeOpts({
111
113
  env: {},
112
114
  apiUrl: "http://localhost:3013",
113
- apiKey: "test-api-key",
115
+ apiKey: "example-test-api-key",
114
116
  _getValidCodexOAuth: async () => ({
115
117
  access: "at_codex",
116
118
  refresh: "rt_codex",
@@ -123,7 +125,7 @@ describe("resolveCredential", () => {
123
125
  refresh: "rt_rotated",
124
126
  expires: 999_999,
125
127
  },
126
- apiKey: "codex-derived",
128
+ apiKey: "example-codex-derived",
127
129
  }),
128
130
  _persistCodexOAuth: async (_url, _key, creds) => {
129
131
  persisted = creds;
@@ -142,7 +144,7 @@ describe("resolveCredential", () => {
142
144
  makeOpts({
143
145
  env: {},
144
146
  apiUrl: "http://localhost:3013",
145
- apiKey: "test-api-key",
147
+ apiKey: "example-test-api-key",
146
148
  _getValidCodexOAuth: async () => ({
147
149
  access: "at_codex",
148
150
  refresh: "rt_codex",
@@ -151,7 +153,7 @@ describe("resolveCredential", () => {
151
153
  }),
152
154
  _getOAuthApiKey: async () => ({
153
155
  newCredentials: { access: "a", refresh: "r", expires: 1 },
154
- apiKey: "still-usable",
156
+ apiKey: "example-still-usable",
155
157
  }),
156
158
  _persistCodexOAuth: async () => {
157
159
  throw new Error("write failed");
@@ -171,7 +173,7 @@ describe("resolveCredential", () => {
171
173
 
172
174
  test("CLAUDE_CODE_OAUTH_TOKEN fallback", async () => {
173
175
  const cred = await resolveCredential(
174
- makeOpts({ env: { CLAUDE_CODE_OAUTH_TOKEN: "claude-oauth" } }),
176
+ makeOpts({ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-claude-oauth" } }),
175
177
  );
176
178
  expect(cred?.kind).toBe("claude-cli");
177
179
  if (cred?.kind === "claude-cli") {
@@ -184,7 +186,7 @@ describe("resolveCredential", () => {
184
186
  // claude-adapter.ts sets AGENT_SWARM_CLAUDE_OAUTH_TOKEN as a mirror so
185
187
  // the hook can still resolve the claude-cli fallback.
186
188
  const cred = await resolveCredential(
187
- makeOpts({ env: { AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "mirror-oauth" } }),
189
+ makeOpts({ env: { AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-mirror-oauth" } }),
188
190
  );
189
191
  expect(cred?.kind).toBe("claude-cli");
190
192
  if (cred?.kind === "claude-cli") {
@@ -248,7 +250,7 @@ describe("resolveCredential", () => {
248
250
  let probed = false;
249
251
  const cred = await resolveCredential(
250
252
  makeOpts({
251
- env: { CLAUDE_CODE_OAUTH_TOKEN: "claude-token" },
253
+ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-claude-token" },
252
254
  _getValidCodexOAuth: async () => {
253
255
  probed = true;
254
256
  return null;
@@ -262,7 +264,7 @@ describe("resolveCredential", () => {
262
264
  test("with apiUrl/apiKey but codex OAuth not configured → falls through to CLAUDE_CODE_OAUTH_TOKEN", async () => {
263
265
  const cred = await resolveCredential(
264
266
  makeOpts({
265
- env: { CLAUDE_CODE_OAUTH_TOKEN: "claude-token" },
267
+ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-claude-token" },
266
268
  apiUrl: "http://localhost:3013",
267
269
  apiKey: "k",
268
270
  _getValidCodexOAuth: async () => null,
@@ -274,7 +276,7 @@ describe("resolveCredential", () => {
274
276
  test("CLAUDE_CODE_OAUTH_TOKEN-only env → claude-cli kind (Phase 4 fallback)", async () => {
275
277
  const cred = await resolveCredential(
276
278
  makeOpts({
277
- env: { CLAUDE_CODE_OAUTH_TOKEN: "sk-test-oauth" },
279
+ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-sk-test-oauth" },
278
280
  callerTag: "claude-stop-hook",
279
281
  }),
280
282
  );
@@ -22,7 +22,7 @@ beforeEach(async () => {
22
22
  await getDbClient().run("DELETE FROM oauth_apps WHERE provider = 'jira'");
23
23
  await upsertOAuthApp("jira", {
24
24
  clientId: "client-id",
25
- clientSecret: "client-secret",
25
+ clientSecret: "example-client-secret",
26
26
  authorizeUrl: "https://auth.atlassian.com/authorize",
27
27
  tokenUrl: "https://auth.atlassian.com/oauth/token",
28
28
  redirectUri: "http://localhost:3013/api/trackers/jira/callback",
@@ -31,7 +31,7 @@ beforeAll(async () => {
31
31
  initDb(TEST_DB_PATH);
32
32
  await upsertOAuthApp("jira", {
33
33
  clientId: "client-id",
34
- clientSecret: "client-secret",
34
+ clientSecret: "example-client-secret",
35
35
  authorizeUrl: "https://auth.atlassian.com/authorize",
36
36
  tokenUrl: "https://auth.atlassian.com/oauth/token",
37
37
  redirectUri: "http://localhost:3013/api/trackers/jira/callback",
@@ -54,8 +54,8 @@ beforeEach(async () => {
54
54
  exchangeCodeSpy.mockClear();
55
55
  exchangeCodeSpy.mockImplementation(() =>
56
56
  Promise.resolve({
57
- accessToken: "access-1",
58
- refreshToken: "refresh-1",
57
+ accessToken: "example-access-1",
58
+ refreshToken: "example-refresh-1",
59
59
  expiresIn: 3600,
60
60
  scope: "read:jira-work",
61
61
  }),
@@ -94,13 +94,13 @@ describe("handleJiraCallback", () => {
94
94
 
95
95
  // exchangeCode invoked with our config + code/state
96
96
  expect(exchangeCodeSpy).toHaveBeenCalledTimes(1);
97
- expect(result.accessToken).toBe("access-1");
97
+ expect(result.accessToken).toBe("example-access-1");
98
98
  expect(result.cloudId).toBe("cloud-abc");
99
99
  expect(result.siteUrl).toBe("https://example.atlassian.net");
100
100
 
101
101
  // accessible-resources URL hit with the right Authorization
102
102
  expect(fetchedUrl).toBe("https://api.atlassian.com/oauth/token/accessible-resources");
103
- expect(fetchedHeaders?.Authorization).toBe("Bearer access-1");
103
+ expect(fetchedHeaders?.Authorization).toBe("Bearer example-access-1");
104
104
 
105
105
  // Metadata persisted via updateJiraMetadata
106
106
  const meta = await getJiraMetadata();
@@ -29,7 +29,7 @@ beforeAll(async () => {
29
29
  // Seed an oauth_apps row + cloudId/siteUrl so URL helpers don't blow up
30
30
  await upsertOAuthApp("jira", {
31
31
  clientId: "client-id",
32
- clientSecret: "client-secret",
32
+ clientSecret: "example-client-secret",
33
33
  authorizeUrl: "https://auth.atlassian.com/authorize",
34
34
  tokenUrl: "https://auth.atlassian.com/oauth/token",
35
35
  redirectUri: "http://localhost:3013/api/trackers/jira/callback",
@@ -31,13 +31,13 @@ mock.module("../jira/client", () => ({
31
31
 
32
32
  beforeAll(async () => {
33
33
  initDb(TEST_DB_PATH);
34
- process.env.JIRA_WEBHOOK_TOKEN = "test-token-32-chars-deadbeef-cafe-99";
34
+ process.env.JIRA_WEBHOOK_TOKEN = "example-test-token-32-chars-deadbeef-cafe-99";
35
35
  delete process.env.PUBLIC_MCP_BASE_URL;
36
36
  process.env.MCP_BASE_URL = "https://test.example.com";
37
37
 
38
38
  await upsertOAuthApp("jira", {
39
39
  clientId: "client-id",
40
- clientSecret: "client-secret",
40
+ clientSecret: "example-client-secret",
41
41
  authorizeUrl: "https://auth.atlassian.com/authorize",
42
42
  tokenUrl: "https://auth.atlassian.com/oauth/token",
43
43
  redirectUri: "http://localhost:3013/api/trackers/jira/callback",
@@ -118,7 +118,7 @@ describe("registerJiraWebhook", () => {
118
118
  webhooks: { events: string[]; jqlFilter: string; fieldIdsFilter: string[] }[];
119
119
  };
120
120
  expect(parsed.url).toBe(
121
- "https://test.example.com/api/trackers/jira/webhook/test-token-32-chars-deadbeef-cafe-99",
121
+ "https://test.example.com/api/trackers/jira/webhook/example-test-token-32-chars-deadbeef-cafe-99",
122
122
  );
123
123
  expect(parsed.webhooks[0]?.jqlFilter).toBe("project = KAN");
124
124
  expect(parsed.webhooks[0]?.events).toEqual([
@@ -20,7 +20,7 @@ import {
20
20
  import * as syncModule from "../jira/sync";
21
21
 
22
22
  const TEST_DB_PATH = "./test-jira-webhook.sqlite";
23
- const TEST_TOKEN = "test-jira-webhook-token-deadbeefcafe1234";
23
+ const TEST_TOKEN = "example-test-jira-webhook-token-deadbeefcafe1234";
24
24
 
25
25
  // Spy on the sync handlers — using mock.module here would leak globally
26
26
  // because bun's mock.module has no documented restore. spyOn is restored by
@@ -39,7 +39,7 @@ beforeAll(async () => {
39
39
  // Seed an oauth app so any nested calls don't blow up.
40
40
  await upsertOAuthApp("jira", {
41
41
  clientId: "client-id",
42
- clientSecret: "client-secret",
42
+ clientSecret: "example-client-secret",
43
43
  authorizeUrl: "https://auth.atlassian.com/authorize",
44
44
  tokenUrl: "https://auth.atlassian.com/oauth/token",
45
45
  redirectUri: "http://localhost:3013/api/trackers/jira/callback",
@@ -8,7 +8,7 @@ import { putKapsoNumberMapping } from "../integrations/kapso/config";
8
8
  import { routeKapsoInbound } from "../integrations/kapso/inbound";
9
9
 
10
10
  const TEST_DB_PATH = "./test-kapso-inbound.sqlite";
11
- const HMAC_SECRET = "kapso-test-hmac-secret";
11
+ const HMAC_SECRET = "example-kapso-test-hmac-secret";
12
12
 
13
13
  let agentId: string;
14
14
  const originalFetch = globalThis.fetch;
@@ -85,7 +85,7 @@ beforeAll(async () => {
85
85
  }
86
86
  initDb(TEST_DB_PATH);
87
87
  process.env.KAPSO_WEBHOOK_HMAC_SECRET = HMAC_SECRET;
88
- process.env.KAPSO_API_KEY = "kapso-test-api-key";
88
+ process.env.KAPSO_API_KEY = "example-kapso-test-api-key";
89
89
  process.env.KAPSO_API_BASE_URL = "https://kapso.test";
90
90
  const agent = await createAgent({ name: "KapsoWorker", isLead: false, status: "idle" });
91
91
  agentId = agent.id;
@@ -19,7 +19,7 @@ import { slackContextKey as buildSlackContextKey } from "../tasks/context-key";
19
19
  import { listenOnFreePort } from "./test-net";
20
20
 
21
21
  const TEST_DB_PATH = "./test-kv-http.sqlite";
22
- const API_KEY = "test-kv-key";
22
+ const API_KEY = "example-test-kv-key";
23
23
 
24
24
  async function removeDbFiles(path: string): Promise<void> {
25
25
  for (const suffix of ["", "-wal", "-shm"]) {
@@ -17,7 +17,7 @@ import { githubContextKey, linearContextKey, slackContextKey } from "../tasks/co
17
17
  import { listenOnFreePort } from "./test-net";
18
18
 
19
19
  const TEST_DB_PATH = "./test-kv-ns-resolution.sqlite";
20
- const API_KEY = "test-kv-ns-key";
20
+ const API_KEY = "example-test-kv-ns-key";
21
21
 
22
22
  async function removeDbFiles(path: string): Promise<void> {
23
23
  for (const suffix of ["", "-wal", "-shm"]) {
@@ -21,8 +21,8 @@ import { getFreePort, SERVER_BOOT_HOOK_TIMEOUT_MS, waitForServer } from "./test-
21
21
  let TEST_PORT = 0;
22
22
  const TEST_DB_PATH = `/tmp/test-kv-page-proxy-${Date.now()}.sqlite`;
23
23
  let BASE = "";
24
- const API_KEY = "test-kv-page-proxy-key";
25
- const PAGE_SECRET = "test-kv-page-proxy-secret";
24
+ const API_KEY = "example-test-kv-page-proxy-key";
25
+ const PAGE_SECRET = "example-test-kv-page-proxy-secret";
26
26
 
27
27
  let serverProc: Subprocess;
28
28
  const agentId = randomUUID();
@@ -43,7 +43,7 @@ describe("POST /api/pages/:id/launch — password mode rejection (step-4)", () =
43
43
  const headers = { "Content-Type": "application/json", "X-Agent-ID": agentId };
44
44
 
45
45
  beforeAll(async () => {
46
- process.env.PAGE_SESSION_SECRET = "test-launch-password-rejection-secret";
46
+ process.env.PAGE_SESSION_SECRET = "example-test-launch-password-rejection-secret";
47
47
  for (const suffix of ["", "-wal", "-shm"]) {
48
48
  try {
49
49
  await unlink(`${TEST_DB_PATH}${suffix}`);
@@ -74,7 +74,7 @@ describe("POST /api/pages/:id/launch — password mode rejection (step-4)", () =
74
74
  title: "Password",
75
75
  contentType: "text/html",
76
76
  authMode: "password",
77
- password: "swordfish",
77
+ password: "example-swordfish",
78
78
  body: "<h1>locked</h1>",
79
79
  }),
80
80
  });
@@ -26,7 +26,7 @@ import { getTemplateDefinition } from "../prompts/registry";
26
26
  import { linearContextKey } from "../tasks/context-key";
27
27
 
28
28
  const TEST_DB_PATH = "./test-linear-webhook.sqlite";
29
- const TEST_SECRET = "test-webhook-secret-123";
29
+ const TEST_SECRET = "example-test-webhook-secret-123";
30
30
 
31
31
  function signPayload(payload: string, secret: string): string {
32
32
  return createHmac("sha256", secret).update(payload).digest("hex");
@@ -12,7 +12,7 @@ import { getPathSegments, parseQueryParams } from "../http/utils";
12
12
  // DCR registration on every call" defect. Uses the same dispatch() harness
13
13
  // as mcp-oauth-manual-client.test.ts.
14
14
 
15
- const API_KEY = "test-secret-key";
15
+ const API_KEY = "example-test-secret-key";
16
16
  const TEST_DB_PATH = "./test-mcp-oauth-dcr-reuse.sqlite";
17
17
 
18
18
  async function removeDbFiles(): Promise<void> {
@@ -146,7 +146,7 @@ describe("MCP OAuth DCR client reuse", () => {
146
146
  return Response.json(
147
147
  {
148
148
  client_id: `client-${issuerHost}-${dcrCallCount}`,
149
- client_secret: `secret-${issuerHost}-${dcrCallCount}`,
149
+ client_secret: `example-secret-${issuerHost}-${dcrCallCount}`,
150
150
  },
151
151
  { status: 201 },
152
152
  );
@@ -161,10 +161,10 @@ describe("MCP OAuth DCR client reuse", () => {
161
161
  );
162
162
  }
163
163
  return Response.json({
164
- access_token: "mock-access-token",
164
+ access_token: "example-mock-access-token",
165
165
  token_type: "Bearer",
166
166
  expires_in: 3600,
167
- refresh_token: "mock-refresh-token",
167
+ refresh_token: "example-mock-refresh-token",
168
168
  scope: "read",
169
169
  });
170
170
  }
@@ -660,7 +660,7 @@ describe("MCP OAuth DCR client reuse", () => {
660
660
  // The provider echoes every credential the exchange transmitted. Both
661
661
  // callback sinks (console.error and error_description on the redirect)
662
662
  // receive the thrown message verbatim, so none of these may survive.
663
- const clientSecret = "secret-as-1.example.test-1";
663
+ const clientSecret = "example-secret-as-1.example.test-1";
664
664
  const encodedSecret = new URLSearchParams({ v: clientSecret }).toString().slice(2);
665
665
  const basicBlob = Buffer.from(
666
666
  `${new URLSearchParams({ v: "client-as-1.example.test-1" }).toString().slice(2)}:${encodedSecret}`,
@@ -730,7 +730,7 @@ describe("MCP OAuth DCR client reuse", () => {
730
730
  const body = new URLSearchParams(capturedTokenBody);
731
731
  expect(capturedTokenHeaders.Authorization).toBeUndefined();
732
732
  expect(body.get("client_id")).toBe("client-as-1.example.test-1");
733
- expect(body.get("client_secret")).toBe("secret-as-1.example.test-1");
733
+ expect(body.get("client_secret")).toBe("example-secret-as-1.example.test-1");
734
734
 
735
735
  // And the resolution is persisted, so later refreshes stay consistent.
736
736
  expect((await getMcpOAuthToken(server.id))?.tokenEndpointAuthMethod).toBe("client_secret_post");
@@ -40,8 +40,8 @@ async function makeToken(
40
40
  });
41
41
  return {
42
42
  mcpServerId: server.id,
43
- accessToken: "fresh-access",
44
- refreshToken: "refresh-ok",
43
+ accessToken: "example-fresh-access",
44
+ refreshToken: "example-refresh-ok",
45
45
  tokenType: "Bearer",
46
46
  expiresAt: new Date(Date.now() + 3600_000).toISOString(), // not expiring
47
47
  scope: "read",
@@ -50,7 +50,7 @@ async function makeToken(
50
50
  authorizeUrl: "https://as.example.com/authorize",
51
51
  tokenUrl: "https://as.example.com/token",
52
52
  dcrClientId: "client-abc",
53
- dcrClientSecret: "secret-xyz",
53
+ dcrClientSecret: "example-secret-xyz",
54
54
  clientSource: "dcr",
55
55
  status: "connected",
56
56
  ...overrides,
@@ -81,7 +81,7 @@ describe("ensureMcpToken", () => {
81
81
 
82
82
  const token = await ensureMcpToken(input.mcpServerId);
83
83
  expect(token).not.toBeNull();
84
- expect(token!.accessToken).toBe("fresh-access");
84
+ expect(token!.accessToken).toBe("example-fresh-access");
85
85
  expect(fetchCalled).toBe(false);
86
86
  });
87
87
 
@@ -128,12 +128,12 @@ describe("ensureMcpToken", () => {
128
128
  calls += 1;
129
129
  const params = new URLSearchParams((init?.body as string) ?? "");
130
130
  expect(params.get("grant_type")).toBe("refresh_token");
131
- expect(params.get("refresh_token")).toBe("refresh-ok");
131
+ expect(params.get("refresh_token")).toBe("example-refresh-ok");
132
132
  return new Response(
133
133
  JSON.stringify({
134
- access_token: "refreshed-access",
134
+ access_token: "example-refreshed-access",
135
135
  expires_in: 3600,
136
- refresh_token: "refresh-next",
136
+ refresh_token: "example-refresh-next",
137
137
  }),
138
138
  { status: 200, headers: { "Content-Type": "application/json" } },
139
139
  );
@@ -141,8 +141,8 @@ describe("ensureMcpToken", () => {
141
141
 
142
142
  const token = await ensureMcpToken(input.mcpServerId);
143
143
  expect(token).not.toBeNull();
144
- expect(token!.accessToken).toBe("refreshed-access");
145
- expect(token!.refreshToken).toBe("refresh-next");
144
+ expect(token!.accessToken).toBe("example-refreshed-access");
145
+ expect(token!.refreshToken).toBe("example-refresh-next");
146
146
  expect(token!.status).toBe("connected");
147
147
  expect(calls).toBe(1);
148
148
  });
@@ -159,15 +159,18 @@ describe("ensureMcpToken", () => {
159
159
  const params = new URLSearchParams((init?.body as string) ?? "");
160
160
  expect(headers.Authorization).toBeUndefined();
161
161
  expect(params.get("client_id")).toBe("client-abc");
162
- expect(params.get("client_secret")).toBe("secret-xyz");
163
- return new Response(JSON.stringify({ access_token: "refreshed-access", expires_in: 3600 }), {
164
- status: 200,
165
- headers: { "Content-Type": "application/json" },
166
- });
162
+ expect(params.get("client_secret")).toBe("example-secret-xyz");
163
+ return new Response(
164
+ JSON.stringify({ access_token: "example-refreshed-access", expires_in: 3600 }),
165
+ {
166
+ status: 200,
167
+ headers: { "Content-Type": "application/json" },
168
+ },
169
+ );
167
170
  };
168
171
 
169
172
  const token = await ensureMcpToken(input.mcpServerId);
170
- expect(token!.accessToken).toBe("refreshed-access");
173
+ expect(token!.accessToken).toBe("example-refreshed-access");
171
174
  });
172
175
 
173
176
  test("flips status to 'error' on refresh failure", async () => {
@@ -218,10 +221,13 @@ describe("ensureMcpToken", () => {
218
221
  calls += 1;
219
222
  // small delay so second caller piggy-backs on inflight
220
223
  await new Promise((r) => setTimeout(r, 25));
221
- return new Response(JSON.stringify({ access_token: "shared-refreshed", expires_in: 3600 }), {
222
- status: 200,
223
- headers: { "Content-Type": "application/json" },
224
- });
224
+ return new Response(
225
+ JSON.stringify({ access_token: "example-shared-refreshed", expires_in: 3600 }),
226
+ {
227
+ status: 200,
228
+ headers: { "Content-Type": "application/json" },
229
+ },
230
+ );
225
231
  };
226
232
 
227
233
  const [a, b, c] = await Promise.all([
@@ -230,8 +236,8 @@ describe("ensureMcpToken", () => {
230
236
  ensureMcpToken(input.mcpServerId),
231
237
  ]);
232
238
  expect(calls).toBe(1);
233
- expect(a!.accessToken).toBe("shared-refreshed");
234
- expect(b!.accessToken).toBe("shared-refreshed");
235
- expect(c!.accessToken).toBe("shared-refreshed");
239
+ expect(a!.accessToken).toBe("example-shared-refreshed");
240
+ expect(b!.accessToken).toBe("example-shared-refreshed");
241
+ expect(c!.accessToken).toBe("example-shared-refreshed");
236
242
  });
237
243
  });
@@ -8,7 +8,7 @@ import { handleCore } from "../http/core";
8
8
  import { handleMcpOAuth } from "../http/mcp-oauth";
9
9
  import { getPathSegments, parseQueryParams } from "../http/utils";
10
10
 
11
- const API_KEY = "test-secret-key";
11
+ const API_KEY = "example-test-secret-key";
12
12
  const TEST_DB_PATH = "./test-mcp-oauth-manual-client.sqlite";
13
13
 
14
14
  async function removeDbFiles(): Promise<void> {
@@ -137,10 +137,10 @@ describe("MCP OAuth manual client flow", () => {
137
137
  capturedTokenHeaders = (init?.headers as Record<string, string> | undefined) ?? null;
138
138
  return new Response(
139
139
  JSON.stringify({
140
- access_token: "sf-access-token",
140
+ access_token: "example-sf-access-token",
141
141
  token_type: "Bearer",
142
142
  expires_in: 3600,
143
- ...(includeRefreshToken ? { refresh_token: "sf-refresh-token" } : {}),
143
+ ...(includeRefreshToken ? { refresh_token: "example-sf-refresh-token" } : {}),
144
144
  scope: "mcp_api refresh_token",
145
145
  }),
146
146
  { status: 200, headers: { "Content-Type": "application/json" } },
@@ -173,7 +173,11 @@ describe("MCP OAuth manual client flow", () => {
173
173
  const res = await dispatch(`/api/mcp-oauth/${mcpServer.id}/manual-client`, {
174
174
  method: "POST",
175
175
  headers: { Authorization: `Bearer ${API_KEY}` },
176
- body: JSON.stringify({ clientId: "disc-client", clientSecret: "disc-secret", ...body }),
176
+ body: JSON.stringify({
177
+ clientId: "disc-client",
178
+ clientSecret: "example-disc-secret",
179
+ ...body,
180
+ }),
177
181
  });
178
182
  expect(res.status).toBe(200);
179
183
  return mcpServer;
@@ -234,7 +238,7 @@ describe("MCP OAuth manual client flow", () => {
234
238
  headers: { Authorization: `Bearer ${API_KEY}` },
235
239
  body: JSON.stringify({
236
240
  clientId: "manual-client-id",
237
- clientSecret: "manual-client-secret",
241
+ clientSecret: "example-manual-client-secret",
238
242
  authorizationServerIssuer: "https://as.example.com",
239
243
  authorizeUrl: "https://as.example.com/authorize",
240
244
  tokenUrl: "https://as.example.com/token",
@@ -260,7 +264,7 @@ describe("MCP OAuth manual client flow", () => {
260
264
  headers: { Authorization: `Bearer ${API_KEY}` },
261
265
  body: JSON.stringify({
262
266
  clientId: "manual-client-id",
263
- clientSecret: "manual-client-secret",
267
+ clientSecret: "example-manual-client-secret",
264
268
  authorizationServerIssuer: "https://as.example.com",
265
269
  authorizeUrl: "https://as.example.com/authorize",
266
270
  tokenUrl: "https://as.example.com/token",
@@ -289,7 +293,7 @@ describe("MCP OAuth manual client flow", () => {
289
293
  },
290
294
  body: JSON.stringify({
291
295
  clientId: "sf-client-id",
292
- clientSecret: "sf-client-secret",
296
+ clientSecret: "example-sf-client-secret",
293
297
  authorizationServerIssuer: "https://login.salesforce.com",
294
298
  authorizeUrl: "https://login.salesforce.com/services/oauth2/authorize",
295
299
  tokenUrl: "https://login.salesforce.com/services/oauth2/token",
@@ -341,7 +345,7 @@ describe("MCP OAuth manual client flow", () => {
341
345
  // the body-post behavior that worked before the auth-method field existed.
342
346
  const tokenRequest = new URLSearchParams(capturedTokenBody ?? "");
343
347
  expect(tokenRequest.get("client_id")).toBe("sf-client-id");
344
- expect(tokenRequest.get("client_secret")).toBe("sf-client-secret");
348
+ expect(tokenRequest.get("client_secret")).toBe("example-sf-client-secret");
345
349
  expect(tokenRequest.get("resource")).toBe(mcpServer.url);
346
350
  expect(tokenRequest.get("redirect_uri")).toBe(
347
351
  "https://swarm.example.test/api/mcp-oauth/callback",
@@ -351,10 +355,10 @@ describe("MCP OAuth manual client flow", () => {
351
355
  const connectedToken = await getMcpOAuthToken(mcpServer.id);
352
356
  expect(connectedToken?.clientSource).toBe("manual");
353
357
  expect(connectedToken?.status).toBe("connected");
354
- expect(connectedToken?.accessToken).toBe("sf-access-token");
355
- expect(connectedToken?.refreshToken).toBe("sf-refresh-token");
358
+ expect(connectedToken?.accessToken).toBe("example-sf-access-token");
359
+ expect(connectedToken?.refreshToken).toBe("example-sf-refresh-token");
356
360
  expect(connectedToken?.dcrClientId).toBe("sf-client-id");
357
- expect(connectedToken?.dcrClientSecret).toBe("sf-client-secret");
361
+ expect(connectedToken?.dcrClientSecret).toBe("example-sf-client-secret");
358
362
 
359
363
  includeRefreshToken = false;
360
364
  const reconnectAuthorizeRes = await dispatch(`/api/mcp-oauth/${mcpServer.id}/authorize-url`, {
@@ -371,6 +375,6 @@ describe("MCP OAuth manual client flow", () => {
371
375
  `/api/mcp-oauth/callback?state=${encodeURIComponent(reconnectState!)}&code=sf-reconnect-code`,
372
376
  );
373
377
  expect(reconnectCallbackRes.status).toBe(302);
374
- expect((await getMcpOAuthToken(mcpServer.id))?.refreshToken).toBe("sf-refresh-token");
378
+ expect((await getMcpOAuthToken(mcpServer.id))?.refreshToken).toBe("example-sf-refresh-token");
375
379
  });
376
380
  });