@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
@@ -17,8 +17,8 @@
17
17
  * `projects[cwd].hasTrustDialogAccepted: true` to `$HOME/.claude.json`
18
18
  * before spawning. Idempotent. No-op for "claude".
19
19
  *
20
- * `Bun.spawn` and the synchronous binary-version probe are stubbed so the
21
- * tests don't actually exec anything; we read the argv off the call args.
20
+ * `Bun.spawn` is stubbed so the tests don't actually exec anything; we read
21
+ * the session argv off the call args and ignore the binary-version probe.
22
22
  * `Bun.which` is stubbed for the tmux gate so the tests don't depend on the
23
23
  * host having tmux installed. `$HOME` is redirected to a tmp dir so the
24
24
  * trust-preseed never touches the real `~/.claude.json`.
@@ -76,17 +76,6 @@ function makeFakeProc(): ReturnType<typeof Bun.spawn> {
76
76
  } as unknown as ReturnType<typeof Bun.spawn>;
77
77
  }
78
78
 
79
- /**
80
- * The adapter probes `<binary> --version` synchronously before it spawns the
81
- * session. Keep integration tests hermetic: a `bunx <package>` probe can do
82
- * package resolution and outlive Bun's per-test timeout under CI load.
83
- */
84
- function mockClaudeVersionProbe(): ReturnType<typeof spyOn> {
85
- return spyOn(Bun, "spawnSync").mockImplementation((() => ({
86
- success: false,
87
- })) as typeof Bun.spawnSync);
88
- }
89
-
90
79
  async function createCompletedSession(adapter: ClaudeAdapter, config: ProviderSessionConfig) {
91
80
  const session = await adapter.createSession(config);
92
81
  await session.waitForCompletion();
@@ -238,7 +227,7 @@ describe("SWARM_USE_CLAUDE_BRIDGE boolean parsing", () => {
238
227
  describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", () => {
239
228
  test("bridge requested + OAuth token present → routes to claude-bridge", () => {
240
229
  const r = resolveClaudeBinaryArgv(
241
- { SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-x" },
230
+ { SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-x" },
242
231
  {},
243
232
  );
244
233
  expect(r.useClaudeBridge).toBe(true);
@@ -248,7 +237,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
248
237
 
249
238
  test("bridge requested + no OAuth (only API key) → falls back to stock claude", () => {
250
239
  const r = resolveClaudeBinaryArgv(
251
- { SWARM_USE_CLAUDE_BRIDGE: "true", ANTHROPIC_API_KEY: "sk-ant-api" },
240
+ { SWARM_USE_CLAUDE_BRIDGE: "true", ANTHROPIC_API_KEY: "example-sk-ant-api" },
252
241
  {},
253
242
  );
254
243
  expect(r.useClaudeBridge).toBe(false);
@@ -265,7 +254,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
265
254
  test("OAuth token from fallbackEnv (container env) also enables the bridge", () => {
266
255
  const r = resolveClaudeBinaryArgv(
267
256
  { SWARM_USE_CLAUDE_BRIDGE: "true" },
268
- { CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-fallback" },
257
+ { CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-fallback" },
269
258
  );
270
259
  expect(r.useClaudeBridge).toBe(true);
271
260
  expect(r.bridgeRequestedWithoutOAuth).toBe(false);
@@ -281,7 +270,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
281
270
  });
282
271
 
283
272
  test("bridge not requested → never flagged, stock claude", () => {
284
- const r = resolveClaudeBinaryArgv({ CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-x" }, {});
273
+ const r = resolveClaudeBinaryArgv({ CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-x" }, {});
285
274
  expect(r.useClaudeBridge).toBe(false);
286
275
  expect(r.bridgeRequestedWithoutOAuth).toBe(false);
287
276
  expect(r.argv).toEqual(["claude"]);
@@ -384,7 +373,6 @@ describe("CLAUDE_BINARY env override", () => {
384
373
  let originalHome: string | undefined;
385
374
  let homeDir: string;
386
375
  let spawnSpy: ReturnType<typeof spyOn>;
387
- let spawnSyncSpy: ReturnType<typeof spyOn>;
388
376
  let whichSpy: ReturnType<typeof spyOn>;
389
377
  let spawnedArgs: Array<readonly string[]>;
390
378
  let spawnedEnvs: Array<Record<string, string> | undefined>;
@@ -400,16 +388,17 @@ describe("CLAUDE_BINARY env override", () => {
400
388
  delete process.env.SWARM_USE_CLAUDE_BRIDGE;
401
389
  delete process.env.CLAUDE_QUEUE_STEERING;
402
390
  // Credential check runs before binary resolution; satisfy it.
403
- process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
391
+ process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
404
392
 
405
393
  spawnedArgs = [];
406
394
  spawnedEnvs = [];
407
395
  spawnSpy = spyOn(Bun, "spawn").mockImplementation(((cmd: readonly string[], opts?: unknown) => {
408
- spawnedArgs.push(cmd);
409
- spawnedEnvs.push((opts as { env?: Record<string, string> } | undefined)?.env);
396
+ if (cmd.at(-1) !== "--version") {
397
+ spawnedArgs.push(cmd);
398
+ spawnedEnvs.push((opts as { env?: Record<string, string> } | undefined)?.env);
399
+ }
410
400
  return makeFakeProc();
411
401
  }) as typeof Bun.spawn);
412
- spawnSyncSpy = mockClaudeVersionProbe();
413
402
 
414
403
  // Default: pretend tmux IS on PATH so non-tmux-gate tests don't trip.
415
404
  whichSpy = spyOn(Bun, "which").mockImplementation((name: string) => {
@@ -420,7 +409,6 @@ describe("CLAUDE_BINARY env override", () => {
420
409
 
421
410
  afterEach(async () => {
422
411
  spawnSpy.mockRestore();
423
- spawnSyncSpy.mockRestore();
424
412
  whichSpy.mockRestore();
425
413
  await rm(homeDir, { recursive: true, force: true });
426
414
  if (originalHome === undefined) {
@@ -542,7 +530,7 @@ describe("CLAUDE_BINARY env override", () => {
542
530
  makeConfig({
543
531
  env: {
544
532
  CLAUDE_BINARY: LEGACY_BRIDGE_COMPAT_BINARY,
545
- CLAUDE_CODE_OAUTH_TOKEN: "test-token",
533
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
546
534
  } as Record<string, string>,
547
535
  }),
548
536
  );
@@ -559,7 +547,7 @@ describe("CLAUDE_BINARY env override", () => {
559
547
  makeConfig({
560
548
  env: {
561
549
  CLAUDE_BINARY: LEGACY_BRIDGE_COMPAT_COMMAND,
562
- CLAUDE_CODE_OAUTH_TOKEN: "test-token",
550
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
563
551
  } as Record<string, string>,
564
552
  }),
565
553
  );
@@ -576,7 +564,7 @@ describe("CLAUDE_BINARY env override", () => {
576
564
  adapter,
577
565
  makeConfig({
578
566
  // env has CLAUDE_CODE_OAUTH_TOKEN but no CLAUDE_BINARY → process.env wins.
579
- env: { CLAUDE_CODE_OAUTH_TOKEN: "test-token" } as Record<string, string>,
567
+ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } as Record<string, string>,
580
568
  }),
581
569
  );
582
570
 
@@ -602,7 +590,7 @@ describe("CLAUDE_BINARY env override", () => {
602
590
  await createCompletedSession(adapter, makeConfig());
603
591
 
604
592
  expect(spawnedArgs[0][0]).toBe("claude-bridge");
605
- expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-token");
593
+ expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-token");
606
594
  });
607
595
 
608
596
  test("SWARM_USE_CLAUDE_BRIDGE=true forwards Anthropic local auth through bridge flag", async () => {
@@ -612,14 +600,14 @@ describe("CLAUDE_BINARY env override", () => {
612
600
  makeConfig({
613
601
  env: {
614
602
  SWARM_USE_CLAUDE_BRIDGE: "true",
615
- ANTHROPIC_API_KEY: "sk-ant-test",
603
+ ANTHROPIC_API_KEY: "example-sk-ant-test",
616
604
  } as Record<string, string>,
617
605
  }),
618
606
  );
619
607
 
620
608
  expect(spawnedArgs[0][0]).toBe("claude-bridge");
621
609
  expect(spawnedArgs[0]).toContain("--desplega-local-auth");
622
- expect(spawnedEnvs[0]?.ANTHROPIC_API_KEY).toBe("sk-ant-test");
610
+ expect(spawnedEnvs[0]?.ANTHROPIC_API_KEY).toBe("example-sk-ant-test");
623
611
  expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBeUndefined();
624
612
  });
625
613
 
@@ -642,7 +630,7 @@ describe("CLAUDE_BINARY env override", () => {
642
630
  makeConfig({
643
631
  env: {
644
632
  SWARM_USE_CLAUDE_BRIDGE: "true",
645
- CLAUDE_CODE_OAUTH_TOKEN: "test-token",
633
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
646
634
  } as Record<string, string>,
647
635
  }),
648
636
  );
@@ -659,7 +647,7 @@ describe("CLAUDE_BINARY env override", () => {
659
647
  makeConfig({
660
648
  env: {
661
649
  SWARM_USE_CLAUDE_BRIDGE: "false",
662
- CLAUDE_CODE_OAUTH_TOKEN: "test-token",
650
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
663
651
  } as Record<string, string>,
664
652
  }),
665
653
  );
@@ -670,7 +658,7 @@ describe("CLAUDE_BINARY env override", () => {
670
658
  test("SWARM_USE_CLAUDE_BRIDGE=true without OAuth token falls back to stock claude", async () => {
671
659
  const origApiKey = process.env.ANTHROPIC_API_KEY;
672
660
  delete process.env.CLAUDE_CODE_OAUTH_TOKEN;
673
- process.env.ANTHROPIC_API_KEY = "sk-ant-test";
661
+ process.env.ANTHROPIC_API_KEY = "example-sk-ant-test";
674
662
  process.env.SWARM_USE_CLAUDE_BRIDGE = "true";
675
663
  try {
676
664
  const adapter = new ClaudeAdapter();
@@ -695,7 +683,6 @@ describe("Claude Bridge tmux fail-fast gate", () => {
695
683
  let originalHome: string | undefined;
696
684
  let homeDir: string;
697
685
  let spawnSpy: ReturnType<typeof spyOn>;
698
- let spawnSyncSpy: ReturnType<typeof spyOn>;
699
686
  let whichSpy: ReturnType<typeof spyOn>;
700
687
 
701
688
  beforeEach(async () => {
@@ -707,15 +694,13 @@ describe("Claude Bridge tmux fail-fast gate", () => {
707
694
  process.env.HOME = homeDir;
708
695
  delete process.env.CLAUDE_BINARY;
709
696
  delete process.env.SWARM_USE_CLAUDE_BRIDGE;
710
- process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
697
+ process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
711
698
  spawnSpy = spyOn(Bun, "spawn").mockImplementation((() => makeFakeProc()) as typeof Bun.spawn);
712
- spawnSyncSpy = mockClaudeVersionProbe();
713
699
  whichSpy = spyOn(Bun, "which");
714
700
  });
715
701
 
716
702
  afterEach(async () => {
717
703
  spawnSpy.mockRestore();
718
- spawnSyncSpy.mockRestore();
719
704
  whichSpy.mockRestore();
720
705
  await rm(homeDir, { recursive: true, force: true });
721
706
  if (originalHome === undefined) {
@@ -815,7 +800,6 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
815
800
  let originalHome: string | undefined;
816
801
  let homeDir: string;
817
802
  let spawnSpy: ReturnType<typeof spyOn>;
818
- let spawnSyncSpy: ReturnType<typeof spyOn>;
819
803
  let whichSpy: ReturnType<typeof spyOn>;
820
804
 
821
805
  beforeEach(async () => {
@@ -827,9 +811,8 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
827
811
  process.env.HOME = homeDir;
828
812
  delete process.env.CLAUDE_BINARY;
829
813
  delete process.env.SWARM_USE_CLAUDE_BRIDGE;
830
- process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
814
+ process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
831
815
  spawnSpy = spyOn(Bun, "spawn").mockImplementation((() => makeFakeProc()) as typeof Bun.spawn);
832
- spawnSyncSpy = mockClaudeVersionProbe();
833
816
  whichSpy = spyOn(Bun, "which").mockImplementation((name: string) => {
834
817
  if (name === "tmux") return "/usr/bin/tmux";
835
818
  return null;
@@ -838,7 +821,6 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
838
821
 
839
822
  afterEach(async () => {
840
823
  spawnSpy.mockRestore();
841
- spawnSyncSpy.mockRestore();
842
824
  whichSpy.mockRestore();
843
825
  await rm(homeDir, { recursive: true, force: true });
844
826
  if (originalHome === undefined) {
@@ -228,10 +228,12 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
228
228
  beforeEach(() => {
229
229
  spawnedEnvs = [];
230
230
  spawnSpy = spyOn(Bun, "spawn").mockImplementation(((
231
- _cmd: readonly string[],
231
+ cmd: readonly string[],
232
232
  opts?: { env?: Record<string, string> },
233
233
  ) => {
234
- spawnedEnvs.push(opts?.env);
234
+ if (cmd.at(-1) !== "--version") {
235
+ spawnedEnvs.push(opts?.env);
236
+ }
235
237
  return makeFakeProc();
236
238
  }) as typeof Bun.spawn);
237
239
  getActiveSpanSpy = spyOn(trace, "getActiveSpan").mockReturnValue(makeSpan());
@@ -246,7 +248,7 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
246
248
  const adapter = new ClaudeAdapter();
247
249
  await adapter.createSession(
248
250
  makeConfig({
249
- env: { SWARM_ENABLE_CLAUDE_CODE_OTEL: "1", CLAUDE_CODE_OAUTH_TOKEN: "test-token" },
251
+ env: { SWARM_ENABLE_CLAUDE_CODE_OTEL: "1", CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" },
250
252
  }),
251
253
  );
252
254
 
@@ -261,7 +263,9 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
261
263
 
262
264
  test("gate unset → spawn env carries NO TRACEPARENT (behavior unchanged)", async () => {
263
265
  const adapter = new ClaudeAdapter();
264
- await adapter.createSession(makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "test-token" } }));
266
+ await adapter.createSession(
267
+ makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } }),
268
+ );
265
269
 
266
270
  expect(spawnedEnvs).toHaveLength(1);
267
271
  const env = spawnedEnvs[0];
@@ -269,12 +273,14 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
269
273
  expect(env?.OTEL_LOG_USER_PROMPTS).toBeUndefined();
270
274
  // Existing env wiring is untouched.
271
275
  expect(env?.ENABLE_PROMPT_CACHING_1H).toBe("1");
272
- expect(env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-token");
276
+ expect(env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-token");
273
277
  });
274
278
 
275
279
  test("spawn env carries Claude Code runtime guardrails", async () => {
276
280
  const adapter = new ClaudeAdapter();
277
- await adapter.createSession(makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "test-token" } }));
281
+ await adapter.createSession(
282
+ makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } }),
283
+ );
278
284
 
279
285
  expect(spawnedEnvs).toHaveLength(1);
280
286
  const env = spawnedEnvs[0];
@@ -294,7 +300,7 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
294
300
  await adapter.createSession(
295
301
  makeConfig({
296
302
  env: {
297
- CLAUDE_CODE_OAUTH_TOKEN: "test-token",
303
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
298
304
  CLAUDE_CODE_ENABLE_TELEMETRY: "1",
299
305
  OTEL_EXPORTER_OTLP_ENDPOINT: "https://otel.example.test",
300
306
  },
@@ -16,7 +16,7 @@ function makeConfig(overrides: Partial<ProviderSessionConfig> = {}): ProviderSes
16
16
  agentId: "test-agent-id",
17
17
  taskId: "test-task-id",
18
18
  apiUrl: "http://localhost:3013",
19
- apiKey: "test-key",
19
+ apiKey: "example-test-key",
20
20
  cwd: "/tmp",
21
21
  logFile: "/tmp/test-claude-adapter.jsonl",
22
22
  ...overrides,
@@ -95,15 +95,17 @@ describe("ClaudeSession spawn env — reasoning_effort", () => {
95
95
  // MAX_THINKING_TOKENS) would leak through and pollute the `toBeUndefined()`
96
96
  // assertions. Passing an explicit, minimal `env` sidesteps both — deterministic
97
97
  // regardless of the ambient process env the test happens to run in.
98
- const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token" };
98
+ const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token" };
99
99
 
100
100
  beforeEach(() => {
101
101
  spawnedEnvs = [];
102
102
  spawnSpy = spyOn(Bun, "spawn").mockImplementation(((
103
- _cmd: readonly string[],
103
+ cmd: readonly string[],
104
104
  opts?: { env?: Record<string, string> },
105
105
  ) => {
106
- spawnedEnvs.push(opts?.env);
106
+ if (cmd.at(-1) !== "--version") {
107
+ spawnedEnvs.push(opts?.env);
108
+ }
107
109
  return makeFakeProc();
108
110
  }) as typeof Bun.spawn);
109
111
  });
@@ -195,7 +197,7 @@ describe("Claude stream-json event parsing", () => {
195
197
  // regression here is caught instead of silently shipping the wrong text.
196
198
  describe("ClaudeSession processStreams — ProviderResult.output capture", () => {
197
199
  let spawnSpy: ReturnType<typeof spyOn>;
198
- const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token" };
200
+ const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token" };
199
201
 
200
202
  /** Fake Bun.Subprocess whose stdout streams the given NDJSON lines, then closes. */
201
203
  function makeStreamingFakeProc(lines: string[]): ReturnType<typeof Bun.spawn> {
@@ -285,7 +287,7 @@ describe("ClaudeSession processStreams — ProviderResult.output capture", () =>
285
287
  expect(summaryOpts!.transcript).toContain('Tool[Read] started: {"file_path":"/tmp/source.ts"}');
286
288
  expect(summaryOpts!.transcript).toContain("Tool result: export const value = 1");
287
289
  expect(summaryOpts!.transcriptPath).toBeUndefined();
288
- expect(summaryOpts!.env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-oauth-token");
290
+ expect(summaryOpts!.env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-oauth-token");
289
291
  expect(summaryOpts!.env?.AGENT_SWARM_TASK_ID).toBe("test-task-id");
290
292
  });
291
293
 
@@ -60,9 +60,9 @@ for (const transport of ["cli", "sdk"] as const) {
60
60
  CLAUDECODE: "",
61
61
  CONTEXT_MODE_DISABLED: "true",
62
62
  // Synthetic values ensure this probe cannot authenticate or incur model charges.
63
- CLAUDE_CODE_OAUTH_TOKEN: "synthetic-not-an-oauth-token",
64
- ANTHROPIC_API_KEY: "synthetic-not-an-api-key",
65
- AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "synthetic-legacy-mirror",
63
+ CLAUDE_CODE_OAUTH_TOKEN: "example-synthetic-not-an-oauth-token",
64
+ ANTHROPIC_API_KEY: "example-synthetic-not-an-api-key",
65
+ AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-synthetic-legacy-mirror",
66
66
  },
67
67
  });
68
68
  abortTimer = setTimeout(() => void session?.abort("hook probe timeout"), 20_000);
@@ -733,7 +733,7 @@ describe("ClaudeManagedAdapter (Phase 4) — repo provisioning + cost data", ()
733
733
  });
734
734
 
735
735
  test("createSession includes resources[github_repository] when config.vcsRepo is set", async () => {
736
- process.env.MANAGED_GITHUB_TOKEN = "ghp_test_pat";
736
+ process.env.MANAGED_GITHUB_TOKEN = "example-ghp_test_pat";
737
737
  const events: Array<Record<string, unknown>> = [
738
738
  {
739
739
  type: "session.status_idle",
@@ -764,7 +764,7 @@ describe("ClaudeManagedAdapter (Phase 4) — repo provisioning + cost data", ()
764
764
  const repo = resources![0]!;
765
765
  expect(repo.type).toBe("github_repository");
766
766
  expect(repo.url).toBe("https://github.com/desplega-ai/agent-swarm");
767
- expect(repo.authorization_token).toBe("ghp_test_pat");
767
+ expect(repo.authorization_token).toBe("example-ghp_test_pat");
768
768
  const checkout = repo.checkout as Record<string, unknown> | undefined;
769
769
  expect(checkout?.type).toBe("branch");
770
770
  expect(checkout?.name).toBe("main");
@@ -1126,7 +1126,7 @@ describe("ClaudeManagedAdapter (Phase 5) — cancellation + tool-loop detection"
1126
1126
  logFile: join(tmpLogDir, "cancel-poll.log"),
1127
1127
  // Provide the API context so the swarm-event handler attaches.
1128
1128
  apiUrl: "http://test-api",
1129
- apiKey: "test-key",
1129
+ apiKey: "example-test-key",
1130
1130
  taskId,
1131
1131
  }),
1132
1132
  );
@@ -1224,7 +1224,7 @@ describe("ClaudeManagedAdapter (Phase 5) — cancellation + tool-loop detection"
1224
1224
  tConfig({
1225
1225
  logFile: join(tmpLogDir, "tool-loop.log"),
1226
1226
  apiUrl: "http://test-api",
1227
- apiKey: "test-key",
1227
+ apiKey: "example-test-key",
1228
1228
  taskId,
1229
1229
  }),
1230
1230
  );
@@ -295,7 +295,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
295
295
  test("rejects http:// MCP_BASE_URL fail-fast", async () => {
296
296
  await expect(
297
297
  resolveClaudeManagedSetupConfig([], {
298
- env: { ANTHROPIC_API_KEY: "sk-ant-x", MCP_BASE_URL: "http://insecure.local" },
298
+ env: { ANTHROPIC_API_KEY: "example-sk-ant-x", MCP_BASE_URL: "http://insecure.local" },
299
299
  isInteractive: false,
300
300
  }),
301
301
  ).rejects.toThrow(/must start with https/);
@@ -304,7 +304,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
304
304
  test("rejects missing MCP_BASE_URL", async () => {
305
305
  await expect(
306
306
  resolveClaudeManagedSetupConfig([], {
307
- env: { ANTHROPIC_API_KEY: "sk-ant-x" },
307
+ env: { ANTHROPIC_API_KEY: "example-sk-ant-x" },
308
308
  isInteractive: false,
309
309
  }),
310
310
  ).rejects.toThrow(/MCP_BASE_URL is not set/);
@@ -313,7 +313,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
313
313
  test("--force flag is parsed", async () => {
314
314
  const result = await resolveClaudeManagedSetupConfig(["--force"], {
315
315
  env: {
316
- ANTHROPIC_API_KEY: "sk-ant-x",
316
+ ANTHROPIC_API_KEY: "example-sk-ant-x",
317
317
  MCP_BASE_URL: "https://example.com",
318
318
  },
319
319
  isInteractive: false,
@@ -33,7 +33,7 @@ function config(
33
33
  logFile: join(directory, `${mode}.jsonl`),
34
34
  env: {
35
35
  PATH: process.env.PATH ?? "/usr/bin:/bin",
36
- CLAUDE_CODE_OAUTH_TOKEN: "fixture-oauth-token",
36
+ CLAUDE_CODE_OAUTH_TOKEN: "example-fixture-oauth-token",
37
37
  CLAUDE_TRANSPORT: "sdk",
38
38
  CLAUDE_QUEUE_STEERING: "1",
39
39
  CLAUDE_BINARY: `${process.execPath} ${fixturePath}`,
@@ -24,16 +24,16 @@ describe("Claude hook credential boundary", () => {
24
24
  for (const transport of ["cli", "sdk"]) {
25
25
  const sourceEnv = {
26
26
  CLAUDE_TRANSPORT: transport,
27
- CLAUDE_CODE_OAUTH_TOKEN: "fixture-selected-oauth",
28
- ANTHROPIC_API_KEY: "fixture-selected-api",
29
- AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "fixture-stale-mirror",
27
+ CLAUDE_CODE_OAUTH_TOKEN: "example-fixture-selected-oauth",
28
+ ANTHROPIC_API_KEY: "example-fixture-selected-api",
29
+ AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-fixture-stale-mirror",
30
30
  };
31
31
  const config = {
32
32
  taskId: crypto.randomUUID(),
33
33
  agentId: crypto.randomUUID(),
34
34
  env: sourceEnv,
35
35
  apiUrl: "http://fixture.invalid",
36
- apiKey: "fixture-swarm-key",
36
+ apiKey: "example-fixture-swarm-key",
37
37
  } as ProviderSessionConfig;
38
38
  const { env } = buildClaudeSessionEnvironment(
39
39
  config,
@@ -43,7 +43,7 @@ describe("Claude hook credential boundary", () => {
43
43
  expect(env.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBeUndefined();
44
44
  expect(env.CLAUDE_CODE_OAUTH_TOKEN).toBe(sourceEnv.CLAUDE_CODE_OAUTH_TOKEN);
45
45
  expect(env.ANTHROPIC_API_KEY).toBe(sourceEnv.ANTHROPIC_API_KEY);
46
- expect(sourceEnv.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe("fixture-stale-mirror");
46
+ expect(sourceEnv.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe("example-fixture-stale-mirror");
47
47
  let summaryEnv: NodeJS.ProcessEnv | undefined;
48
48
  await runClaudeSessionSummary(
49
49
  config,
@@ -91,7 +91,7 @@ describe("Claude transport resolution", () => {
91
91
  expect(
92
92
  isClaudeBridgeEffective(
93
93
  { SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "" },
94
- { CLAUDE_CODE_OAUTH_TOKEN: "fallback" },
94
+ { CLAUDE_CODE_OAUTH_TOKEN: "example-fallback" },
95
95
  ),
96
96
  ).toBeFalse();
97
97
  });
@@ -104,7 +104,7 @@ function makeEnv(extra: NodeJS.ProcessEnv = {}): NodeJS.ProcessEnv {
104
104
  // selectively via `extra`.
105
105
  return {
106
106
  MCP_BASE_URL: "http://localhost:3013",
107
- API_KEY: "test-key",
107
+ API_KEY: "example-test-key",
108
108
  AGENT_SWARM_TASK_ID: "task-stop-1",
109
109
  ...extra,
110
110
  };
@@ -129,8 +129,8 @@ describe("runStopHookSessionSummary", () => {
129
129
  } as unknown as ReturnType<typeof Bun.spawn>;
130
130
  }) as typeof Bun.spawn;
131
131
  const env = makeEnv({
132
- CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token",
133
- AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "test-oauth-token",
132
+ CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token",
133
+ AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-test-oauth-token",
134
134
  });
135
135
 
136
136
  await runStopHookSessionSummarySubprocess(
@@ -152,10 +152,10 @@ describe("runStopHookSessionSummary", () => {
152
152
  "session-summary-stdin",
153
153
  ]);
154
154
  expect((spawnOptions as { env?: NodeJS.ProcessEnv }).env?.CLAUDE_CODE_OAUTH_TOKEN).toBe(
155
- "test-oauth-token",
155
+ "example-test-oauth-token",
156
156
  );
157
157
  expect((spawnOptions as { env?: NodeJS.ProcessEnv }).env?.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe(
158
- "test-oauth-token",
158
+ "example-test-oauth-token",
159
159
  );
160
160
  expect(JSON.parse(stdinPayload)).toEqual({
161
161
  agentId: "agent-claude-memory",
@@ -232,7 +232,7 @@ describe("runStopHookSessionSummary", () => {
232
232
  expect(lastRunSummarizeArgs!.taskContext.sourceTaskId).toBe("task-stop-1");
233
233
  expect(lastRunSummarizeArgs!.taskContext.agentId).toBe("agent-claude-1");
234
234
  expect(lastRunSummarizeArgs!.apiUrl).toBe("http://localhost:3013");
235
- expect(lastRunSummarizeArgs!.apiKey).toBe("test-key");
235
+ expect(lastRunSummarizeArgs!.apiKey).toBe("example-test-key");
236
236
 
237
237
  const indexCalls = fetchCalls.filter((c) => c.url.endsWith("/api/memory/index"));
238
238
  expect(indexCalls.length).toBe(1);
@@ -248,7 +248,7 @@ describe("runStopHookSessionSummary", () => {
248
248
  // Headers match the old runMemoryRater POST: Bearer + X-Agent-ID.
249
249
  const headers = indexCalls[0]!.init?.headers as Record<string, string>;
250
250
  expect(headers["Content-Type"]).toBe("application/json");
251
- expect(headers.Authorization).toBe("Bearer test-key");
251
+ expect(headers.Authorization).toBe("Bearer example-test-key");
252
252
  expect(headers["X-Agent-ID"]).toBe("agent-claude-1");
253
253
 
254
254
  expect(consoleErrors.length).toBe(0);
@@ -320,7 +320,7 @@ describe("runStopHookSessionSummary", () => {
320
320
  transcriptPath,
321
321
  env: makeEnv({
322
322
  // Mirror the process env into the SUT-scoped env for SKIP / MCP_BASE_URL plumbing.
323
- CLAUDE_CODE_OAUTH_TOKEN: "sk-test-oauth-stop-hook",
323
+ CLAUDE_CODE_OAUTH_TOKEN: "example-sk-test-oauth-stop-hook",
324
324
  }),
325
325
  },
326
326
  deps,
@@ -19,7 +19,7 @@ const ROTATION_AGENT_ID = "1a444444-4444-4444-8444-444444444444";
19
19
  const FIXTURE_SUMMARY =
20
20
  "The worker fixture completed a transport parity task with durable evidence.";
21
21
  const FIXTURE_OAUTH = "synthetic-fixture-oauth-token";
22
- const FIXTURE_API_KEY = "synthetic-fixture-anthropic-api-key";
22
+ const FIXTURE_API_KEY = "example-synthetic-fixture-anthropic-api-key";
23
23
  const ROTATION_OAUTH_POOL = ["synthetic-rotation-oauth-oa001", "synthetic-rotation-oauth-oa002"];
24
24
  const ROTATION_API_POOL = ["synthetic-rotation-api-ap001", "synthetic-rotation-api-ap002"];
25
25
 
@@ -260,7 +260,7 @@ async function runTransport(transport: "cli" | "sdk", agentId: string): Promise<
260
260
  CLAUDE_BINARY: fixturePath,
261
261
  CLAUDE_CODE_OAUTH_TOKEN: FIXTURE_OAUTH,
262
262
  ANTHROPIC_API_KEY: FIXTURE_API_KEY,
263
- OPENROUTER_API_KEY: "synthetic-fixture-openrouter-key",
263
+ OPENROUTER_API_KEY: "example-synthetic-fixture-openrouter-key",
264
264
  OPENROUTER_BASE_URL: `http://127.0.0.1:${openRouterMock.port}`,
265
265
  CRED_CHECK_DISABLE: "1",
266
266
  CLAUDE_QUEUE_STEERING: "0",
@@ -401,7 +401,7 @@ async function runCredentialRotation(): Promise<void> {
401
401
  CLAUDE_FIXTURE_OBSERVATION_FILE: observationFile,
402
402
  CLAUDE_CODE_OAUTH_TOKEN: ROTATION_OAUTH_POOL.join(","),
403
403
  ANTHROPIC_API_KEY: ROTATION_API_POOL.join(","),
404
- OPENROUTER_API_KEY: "synthetic-fixture-openrouter-key",
404
+ OPENROUTER_API_KEY: "example-synthetic-fixture-openrouter-key",
405
405
  OPENROUTER_BASE_URL: `http://127.0.0.1:${openRouterMock.port}`,
406
406
  CRED_CHECK_DISABLE: "1",
407
407
  CLAUDE_QUEUE_STEERING: "0",
@@ -43,7 +43,7 @@ import type { ProviderEvent, ProviderSessionConfig } from "../providers/types.js
43
43
 
44
44
  const TEST_DB_PATH = "./test-codex-adapter-pool-auth-revalidate.sqlite";
45
45
  const MOCK_API_URL = "http://localhost:3013";
46
- const MOCK_API_KEY = "test-api-key";
46
+ const MOCK_API_KEY = "example-test-api-key";
47
47
  const FAKE_HOME = "/home/fake-pool-worker";
48
48
 
49
49
  process.env.SECRETS_ENCRYPTION_KEY = Buffer.alloc(32, 4).toString("base64");
@@ -385,9 +385,9 @@ describe("resolveCodexAuthMode — pool path revalidates through the lock", () =
385
385
  auth_mode: "chatgpt",
386
386
  OPENAI_API_KEY: null,
387
387
  tokens: {
388
- id_token: "at_local",
389
- access_token: "at_local",
390
- refresh_token: "rt_local",
388
+ id_token: "example-at_local",
389
+ access_token: "example-at_local",
390
+ refresh_token: "example-rt_local",
391
391
  account_id: "acc-local",
392
392
  },
393
393
  last_refresh: new Date().toISOString(),
@@ -487,7 +487,7 @@ describe("resolveCodexAuthMode — pool path revalidates through the lock", () =
487
487
 
488
488
  const existingAuthJson = JSON.stringify({
489
489
  auth_mode: "api-key",
490
- OPENAI_API_KEY: "sk-local",
490
+ OPENAI_API_KEY: "example-sk-local",
491
491
  });
492
492
  const { fs, homedir, readCurrent } = fakeAuthJsonFs(existingAuthJson);
493
493
  const events: ProviderEvent[] = [];
@@ -448,7 +448,7 @@ describe("Codex app-server session", () => {
448
448
  item: {
449
449
  type: "agentMessage",
450
450
  id: "secret-message",
451
- text: "Authorization: Bearer sk-proj-abcdefghijklmnopqrstuvwxyz012345",
451
+ text: "Authorization: Bearer example-sk-proj-abcdefghijklmnopqrstuvwxyz012345",
452
452
  },
453
453
  });
454
454
  });
@@ -478,7 +478,9 @@ describe("Codex app-server session", () => {
478
478
 
479
479
  expect(requests).toContain("turn/interrupt");
480
480
  expect(result).toMatchObject({ exitCode: 130, failureReason: "operator cancelled" });
481
- expect(JSON.stringify(emitted)).not.toContain("sk-proj-abcdefghijklmnopqrstuvwxyz012345");
481
+ expect(JSON.stringify(emitted)).not.toContain(
482
+ "example-sk-proj-abcdefghijklmnopqrstuvwxyz012345",
483
+ );
482
484
  });
483
485
 
484
486
  test("closes queue delivery before the final result event", async () => {
@@ -1434,7 +1436,7 @@ describe("buildCodexConfig", () => {
1434
1436
  agentId: "agent-mcp-test",
1435
1437
  taskId: "task-mcp-test",
1436
1438
  apiUrl: "http://test.invalid",
1437
- apiKey: "test-key",
1439
+ apiKey: "example-test-key",
1438
1440
  cwd: "",
1439
1441
  logFile: `/tmp/codex-mcp-test-${Date.now()}-${Math.random().toString(36).slice(2)}.log`,
1440
1442
  ...overrides,
@@ -1463,7 +1465,7 @@ describe("buildCodexConfig", () => {
1463
1465
  expect(Object.keys(mcp)).toEqual(["agent-swarm"]);
1464
1466
  expect(mcp["agent-swarm"]?.url).toBe("http://test.invalid/mcp");
1465
1467
  const headers = mcp["agent-swarm"]?.http_headers as Record<string, string>;
1466
- expect(headers.Authorization).toBe("Bearer test-key");
1468
+ expect(headers.Authorization).toBe("Bearer example-test-key");
1467
1469
  expect(headers["X-Agent-ID"]).toBe("agent-mcp-test");
1468
1470
  expect(headers["X-Source-Task-Id"]).toBe("task-mcp-test");
1469
1471
  expect(mcp["agent-swarm"]?.enabled).toBe(true);
@@ -1748,7 +1750,7 @@ describe("buildCodexConfig — context-mode + features", () => {
1748
1750
  agentId: "agent-mcp-test",
1749
1751
  taskId: "task-mcp-test",
1750
1752
  apiUrl: "http://test.invalid",
1751
- apiKey: "test-key",
1753
+ apiKey: "example-test-key",
1752
1754
  cwd: "",
1753
1755
  logFile: `/tmp/codex-ctx-test-${Date.now()}-${Math.random().toString(36).slice(2)}.log`,
1754
1756
  ...overrides,
@@ -152,7 +152,7 @@ describe("CodexAppServer", () => {
152
152
  test(
153
153
  "scrubs stderr before callbacks and process-exit errors",
154
154
  async () => {
155
- const secret = "sk-abcdefghijklmnopqrstuvwx";
155
+ const secret = "example-sk-abcdefghijklmnopqrstuvwx";
156
156
  const stderr: string[] = [];
157
157
  const server = new CodexAppServer({
158
158
  codexPath: FIXTURE,
@@ -163,7 +163,7 @@ describe("CodexAppServer", () => {
163
163
  const error = await server.request("exit").catch((caught) => caught as Error);
164
164
  expect(error.message).toContain("exited with code 7");
165
165
  expect(error.message).not.toContain(secret);
166
- expect(stderr).toEqual(["[REDACTED:sk_key]"]);
166
+ expect(stderr).toEqual(["example-[REDACTED:sk_key]"]);
167
167
  await server.close();
168
168
  },
169
169
  CHILD_PROCESS_TEST_BUDGET_MS,