@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
@@ -99,13 +99,13 @@ function createFetchStub(
99
99
  body.email !== "admin@example.test"
100
100
  ) {
101
101
  return Response.json({
102
- apiKey: "afs-agent-key",
102
+ apiKey: "example-afs-agent-key",
103
103
  userId: "agent-user",
104
104
  orgId: "agent-personal-org",
105
105
  });
106
106
  }
107
107
  return Response.json({
108
- apiKey: "afs-admin-key",
108
+ apiKey: "example-afs-admin-key",
109
109
  userId: "admin-user",
110
110
  orgId: "personal-org",
111
111
  });
@@ -208,7 +208,7 @@ describe("agent-fs provisioning seeder", () => {
208
208
 
209
209
  expect(result.failed).toEqual([]);
210
210
  expect(result.created).toBe(1);
211
- expect(await configValue("API_AGENT_FS_API_KEY")).toBe("afs-admin-key");
211
+ expect(await configValue("API_AGENT_FS_API_KEY")).toBe("example-afs-admin-key");
212
212
  expect(
213
213
  (await getSwarmConfigs({ scope: "global", key: "API_AGENT_FS_API_KEY" }))[0]?.encrypted,
214
214
  ).toBe(true);
@@ -216,7 +216,7 @@ describe("agent-fs provisioning seeder", () => {
216
216
  expect(await configValue("AGENT_FS_DEFAULT_ORG_ID")).toBe("shared-org");
217
217
  expect(await configValue("AGENT_FS_SHARED_ORG_ID")).toBe("shared-org");
218
218
  expect(await configValue("AGENT_FS_DEFAULT_DRIVE_ID")).toBe("shared-drive");
219
- expect(process.env.API_AGENT_FS_API_KEY).toBe("afs-admin-key");
219
+ expect(process.env.API_AGENT_FS_API_KEY).toBe("example-afs-admin-key");
220
220
 
221
221
  const register = records.find((r) => r.path === "/auth/register");
222
222
  expect(register?.body).toEqual({ email: "admin@example.test" });
@@ -255,7 +255,7 @@ describe("agent-fs provisioning seeder", () => {
255
255
  await upsertSwarmConfig({
256
256
  scope: "global",
257
257
  key: "API_AGENT_FS_API_KEY",
258
- value: "afs-admin-key",
258
+ value: "example-afs-admin-key",
259
259
  isSecret: true,
260
260
  });
261
261
  await upsertSwarmConfig({
@@ -324,7 +324,7 @@ describe("agent-fs provisioning seeder", () => {
324
324
  await upsertSwarmConfig({
325
325
  scope: "global",
326
326
  key: "API_AGENT_FS_API_KEY",
327
- value: "afs-admin-key",
327
+ value: "example-afs-admin-key",
328
328
  isSecret: true,
329
329
  });
330
330
  await upsertSwarmConfig({
@@ -388,7 +388,7 @@ describe("agent-fs provisioning seeder", () => {
388
388
  await upsertSwarmConfig({
389
389
  scope: "global",
390
390
  key: "API_AGENT_FS_API_KEY",
391
- value: "afs-admin-key",
391
+ value: "example-afs-admin-key",
392
392
  isSecret: true,
393
393
  });
394
394
  await upsertSwarmConfig({
@@ -438,7 +438,7 @@ describe("agent-fs provisioning seeder", () => {
438
438
  await upsertSwarmConfig({
439
439
  scope: "global",
440
440
  key: "API_AGENT_FS_API_KEY",
441
- value: "afs-admin-key",
441
+ value: "example-afs-admin-key",
442
442
  isSecret: true,
443
443
  });
444
444
  await upsertSwarmConfig({
@@ -492,7 +492,7 @@ describe("agent-fs provisioning seeder", () => {
492
492
  key: "AGENT_FS_API_KEY",
493
493
  })
494
494
  )[0];
495
- expect(agentKey?.value).toBe("afs-agent-key");
495
+ expect(agentKey?.value).toBe("example-afs-agent-key");
496
496
  expect(agentKey?.encrypted).toBe(true);
497
497
  expect(records.find((r) => r.path === "/auth/register")?.body).toEqual({
498
498
  email: `custom-worker-${suffix}@example.test`,
@@ -516,7 +516,7 @@ describe("agent-fs provisioning seeder", () => {
516
516
  await upsertSwarmConfig({
517
517
  scope: "global",
518
518
  key: "API_AGENT_FS_API_KEY",
519
- value: "afs-admin-key",
519
+ value: "example-afs-admin-key",
520
520
  isSecret: true,
521
521
  });
522
522
  await upsertSwarmConfig({
@@ -570,7 +570,7 @@ describe("agent-fs provisioning seeder", () => {
570
570
  key: "AGENT_FS_API_KEY",
571
571
  })
572
572
  )[0]?.value,
573
- ).toBe("afs-agent-key");
573
+ ).toBe("example-afs-agent-key");
574
574
 
575
575
  const registrations = records
576
576
  .filter((record) => record.path === "/auth/register")
@@ -595,7 +595,7 @@ describe("agent-fs provisioning seeder", () => {
595
595
  const invite = records.find((r) => r.path === "/orgs/shared-org/members/invite");
596
596
  expect(invite?.method).toBe("POST");
597
597
  expect(invite?.body).toEqual({ email: "Customer@Example.test", role: "admin" });
598
- expect(invite?.authorization).toBe("Bearer afs-admin-key");
598
+ expect(invite?.authorization).toBe("Bearer example-afs-admin-key");
599
599
  });
600
600
 
601
601
  test("does not re-invite an external email whose current role already covers the request", async () => {
@@ -29,7 +29,7 @@ describe("selectCredential", () => {
29
29
  });
30
30
 
31
31
  test("comma-separated picks one randomly", () => {
32
- const value = "key-aaa11,key-bbb22,key-ccc33";
32
+ const value = "example-key-aaa11,example-key-bbb22,example-key-ccc33";
33
33
  const results = new Set<string>();
34
34
  for (let i = 0; i < 100; i++) {
35
35
  const result = selectCredential(value);
@@ -44,47 +44,47 @@ describe("selectCredential", () => {
44
44
  });
45
45
 
46
46
  test("respects availableIndices for rate-limit-aware selection", () => {
47
- const value = "key-aaa11,key-bbb22,key-ccc33";
47
+ const value = "example-key-aaa11,example-key-bbb22,example-key-ccc33";
48
48
  for (let i = 0; i < 50; i++) {
49
49
  const result = selectCredential(value, [1]); // Only index 1 is available
50
- expect(result.selected).toBe("key-bbb22");
50
+ expect(result.selected).toBe("example-key-bbb22");
51
51
  expect(result.index).toBe(1);
52
52
  }
53
53
  });
54
54
 
55
55
  test("falls back to random when all keys are rate-limited (empty availableIndices)", () => {
56
- const value = "key-aaa11,key-bbb22";
56
+ const value = "example-key-aaa11,example-key-bbb22";
57
57
  const result = selectCredential(value, []);
58
- expect(["key-aaa11", "key-bbb22"]).toContain(result.selected);
58
+ expect(["example-key-aaa11", "example-key-bbb22"]).toContain(result.selected);
59
59
  expect(result.isRateLimitFallback).toBe(true);
60
60
  });
61
61
 
62
62
  test("filters out-of-range availableIndices", () => {
63
- const value = "key-aaa11,key-bbb22";
63
+ const value = "example-key-aaa11,example-key-bbb22";
64
64
  const result = selectCredential(value, [99]); // Out of range
65
65
  // Falls back to random
66
- expect(["key-aaa11", "key-bbb22"]).toContain(result.selected);
66
+ expect(["example-key-aaa11", "example-key-bbb22"]).toContain(result.selected);
67
67
  expect(result.isRateLimitFallback).toBe(true);
68
68
  });
69
69
 
70
70
  test("isRateLimitFallback is false when indices are available", () => {
71
- const result = selectCredential("key-aaa11,key-bbb22", [0, 1]);
71
+ const result = selectCredential("example-key-aaa11,example-key-bbb22", [0, 1]);
72
72
  expect(result.isRateLimitFallback).toBe(false);
73
73
  });
74
74
 
75
75
  test("isRateLimitFallback is false when no availability info", () => {
76
- const result = selectCredential("key-aaa11,key-bbb22");
76
+ const result = selectCredential("example-key-aaa11,example-key-bbb22");
77
77
  expect(result.isRateLimitFallback).toBe(false);
78
78
  });
79
79
 
80
80
  test("single key with empty availableIndices sets isRateLimitFallback", () => {
81
- const result = selectCredential("single-key", []);
81
+ const result = selectCredential("example-single-key", []);
82
82
  expect(result.isRateLimitFallback).toBe(true);
83
- expect(result.selected).toBe("single-key");
83
+ expect(result.selected).toBe("example-single-key");
84
84
  });
85
85
 
86
86
  test("keySuffix is last 5 chars of selected key", () => {
87
- const result = selectCredential("sk-ant-api03-abcde12345");
87
+ const result = selectCredential("example-sk-ant-api03-abcde12345");
88
88
  expect(result.keySuffix).toBe("12345");
89
89
  });
90
90
 
@@ -102,31 +102,31 @@ describe("selectCredential", () => {
102
102
  describe("resolveCredentialPools", () => {
103
103
  test("returns selections for pool vars", async () => {
104
104
  const env: Record<string, string | undefined> = {
105
- ANTHROPIC_API_KEY: "key-aaa11,key-bbb22",
105
+ ANTHROPIC_API_KEY: "example-key-aaa11,example-key-bbb22",
106
106
  };
107
107
  const selections = await resolveCredentialPools(env);
108
108
  expect(selections.length).toBe(1);
109
109
  expect(selections[0]!.total).toBe(2);
110
110
  expect(selections[0]!.keyType).toBe("ANTHROPIC_API_KEY");
111
111
  // Env should be mutated to the selected key
112
- expect(["key-aaa11", "key-bbb22"]).toContain(env.ANTHROPIC_API_KEY);
112
+ expect(["example-key-aaa11", "example-key-bbb22"]).toContain(env.ANTHROPIC_API_KEY);
113
113
  });
114
114
 
115
115
  test("passes availableIndicesMap through", async () => {
116
116
  const env: Record<string, string | undefined> = {
117
- ANTHROPIC_API_KEY: "key-aaa11,key-bbb22,key-ccc33",
117
+ ANTHROPIC_API_KEY: "example-key-aaa11,example-key-bbb22,example-key-ccc33",
118
118
  };
119
119
  const selections = await resolveCredentialPools(env, {
120
120
  availableIndicesMap: { ANTHROPIC_API_KEY: [2] },
121
121
  });
122
122
  expect(selections.length).toBe(1);
123
123
  expect(selections[0]!.index).toBe(2);
124
- expect(env.ANTHROPIC_API_KEY).toBe("key-ccc33");
124
+ expect(env.ANTHROPIC_API_KEY).toBe("example-key-ccc33");
125
125
  });
126
126
 
127
127
  test("single keys are tracked with index 0", async () => {
128
128
  const env: Record<string, string | undefined> = {
129
- ANTHROPIC_API_KEY: "single-key",
129
+ ANTHROPIC_API_KEY: "example-single-key",
130
130
  };
131
131
  const selections = await resolveCredentialPools(env);
132
132
  expect(selections.length).toBe(1);
@@ -134,7 +134,7 @@ describe("resolveCredentialPools", () => {
134
134
  expect(selections[0]!.total).toBe(1);
135
135
  expect(selections[0]!.keySuffix).toBe("e-key");
136
136
  expect(selections[0]!.keyType).toBe("ANTHROPIC_API_KEY");
137
- expect(env.ANTHROPIC_API_KEY).toBe("single-key");
137
+ expect(env.ANTHROPIC_API_KEY).toBe("example-single-key");
138
138
  });
139
139
  });
140
140
 
@@ -11,11 +11,13 @@ describe("getApiKey", () => {
11
11
  });
12
12
 
13
13
  test("returns AGENT_SWARM_API_KEY when only preferred var is set", () => {
14
- expect(getApiKey({ AGENT_SWARM_API_KEY: "preferred" })).toBe("preferred");
14
+ expect(getApiKey({ AGENT_SWARM_API_KEY: "example-preferred" })).toBe("example-preferred");
15
15
  });
16
16
 
17
17
  test("prefers AGENT_SWARM_API_KEY over API_KEY when both set", () => {
18
- expect(getApiKey({ AGENT_SWARM_API_KEY: "preferred", API_KEY: "legacy" })).toBe("preferred");
18
+ expect(getApiKey({ AGENT_SWARM_API_KEY: "example-preferred", API_KEY: "legacy" })).toBe(
19
+ "example-preferred",
20
+ );
19
21
  });
20
22
 
21
23
  test("falls back to API_KEY if AGENT_SWARM_API_KEY is undefined", () => {
@@ -22,7 +22,7 @@ import { registerAppPatchTool } from "../tools/app-patch";
22
22
  import { setRequestAuth } from "../utils/request-auth-context";
23
23
 
24
24
  const TEST_DB_PATH = `/private/tmp/test-apps-rbac-${process.pid}.sqlite`;
25
- const API_KEY = "apps-rbac-test-key";
25
+ const API_KEY = "example-apps-rbac-test-key";
26
26
  const AGENT_ID = crypto.randomUUID();
27
27
  const LEAD_ID = crypto.randomUUID();
28
28
  const OPERATOR_ACTOR: IdentityActor = { kind: "operator", id: "apps-rbac-test" };
@@ -1806,7 +1806,7 @@ describe("apps spike 5 lifecycle", () => {
1806
1806
  const appId = await createApp(migrationDefinition);
1807
1807
  const row = await createRow(appId, { title: "MCP failure", status: "open" });
1808
1808
  const namespace = appsNamespace(appId);
1809
- const secret = "phase2-migration-secret-value";
1809
+ const secret = "example-phase2-migration-secret-value";
1810
1810
  process.env.SPIKE5_MIGRATION_SECRET = secret;
1811
1811
  refreshSecretScrubberCache();
1812
1812
  await getDbClient().run(`
@@ -61,7 +61,7 @@ const spawnDescribe = describe.skipIf(SKIP_SANDBOX_SPAWN_TESTS);
61
61
  const skip = test.skipIf(SKIP_SANDBOX_SPAWN_TESTS);
62
62
 
63
63
  const TEST_DB_PATH = `/private/tmp/test-apps-sync-engine-${process.pid}.sqlite`;
64
- const API_KEY = "apps-sync-engine-test-key-0123456789";
64
+ const API_KEY = "example-apps-sync-engine-test-key-0123456789";
65
65
  const OWNER_AGENT_ID = crypto.randomUUID();
66
66
  const LEAD_AGENT_ID = crypto.randomUUID();
67
67
  const savedEnv = { ...process.env };
@@ -933,7 +933,7 @@ describe("swarm-tasks source", () => {
933
933
  });
934
934
 
935
935
  test("engine-generated warnings carrying a known secret come back redacted", async () => {
936
- const secret = "fixture-secret-value-0123456789";
936
+ const secret = "example-fixture-secret-value-0123456789";
937
937
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
938
938
  refreshSecretScrubberCache();
939
939
  try {
@@ -968,7 +968,7 @@ describe("swarm-tasks source", () => {
968
968
  });
969
969
 
970
970
  test("an engine-generated pass error carrying a known secret is redacted in the status KV", async () => {
971
- const secret = "fixture-secret-value-0123456789";
971
+ const secret = "example-fixture-secret-value-0123456789";
972
972
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
973
973
  refreshSecretScrubberCache();
974
974
  try {
@@ -1429,7 +1429,7 @@ spawnDescribe("pass snapshot consistency", () => {
1429
1429
 
1430
1430
  spawnDescribe("secret hygiene and sync status", () => {
1431
1431
  test("a pass error carrying a known secret comes back redacted", async () => {
1432
- const secret = "fixture-secret-value-0123456789";
1432
+ const secret = "example-fixture-secret-value-0123456789";
1433
1433
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
1434
1434
  refreshSecretScrubberCache();
1435
1435
  try {
@@ -1588,7 +1588,7 @@ spawnDescribe("secret hygiene and sync status", () => {
1588
1588
  });
1589
1589
 
1590
1590
  test("a pulled field carrying a known secret is redacted before it lands in a row", async () => {
1591
- const secret = "fixture-secret-value-0123456789";
1591
+ const secret = "example-fixture-secret-value-0123456789";
1592
1592
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
1593
1593
  refreshSecretScrubberCache();
1594
1594
  try {
@@ -1610,7 +1610,7 @@ spawnDescribe("secret hygiene and sync status", () => {
1610
1610
  });
1611
1611
 
1612
1612
  test("a secret straddling the prompt cap is scrubbed before truncation", async () => {
1613
- const secret = "fixture-secret-value-0123456789";
1613
+ const secret = "example-fixture-secret-value-0123456789";
1614
1614
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
1615
1615
  refreshSecretScrubberCache();
1616
1616
  try {
@@ -1643,7 +1643,7 @@ spawnDescribe("secret hygiene and sync status", () => {
1643
1643
  });
1644
1644
 
1645
1645
  test("a secret straddling the stderr cap is scrubbed before truncation", async () => {
1646
- const secret = "fixture-secret-value-0123456789";
1646
+ const secret = "example-fixture-secret-value-0123456789";
1647
1647
  process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
1648
1648
  refreshSecretScrubberCache();
1649
1649
  try {
@@ -2376,7 +2376,7 @@ spawnDescribe("a sync source against a dummy GitHub through the real sandbox", (
2376
2376
  // that is the point of these tests: GITHUB_TOKEN's binding is allowlisted to
2377
2377
  // api.github.com, so an active binding exists while the fixture host does not
2378
2378
  // match it — the placeholder must therefore leave the sandbox unsubstituted.
2379
- const FIXTURE_TOKEN = "ghp_fixture_secret_value_9876543210";
2379
+ const FIXTURE_TOKEN = "example-ghp_fixture_secret_value_9876543210";
2380
2380
 
2381
2381
  let fixture: ReturnType<typeof Bun.serve>;
2382
2382
  let origin = "";
@@ -25,7 +25,7 @@ import type { RbacCheck } from "../rbac/types";
25
25
  import { setRequestAuth } from "../utils/request-auth-context";
26
26
 
27
27
  const TEST_DB_PATH = `/private/tmp/test-apps-user-config-${process.pid}.sqlite`;
28
- const API_KEY = "apps-user-config-test-key";
28
+ const API_KEY = "example-apps-user-config-test-key";
29
29
  const AGENT_ID = crypto.randomUUID();
30
30
  const OPERATOR_ACTOR: IdentityActor = { kind: "operator", id: "apps-user-config-test" };
31
31
  const mutableLegacyPolicy = LEGACY_POLICY as unknown as Record<"app.use", LegacyRule>;
@@ -142,7 +142,7 @@ describe("createArtifactServer", () => {
142
142
 
143
143
  beforeAll(() => {
144
144
  process.env.AGENT_ID = "test-agent-id";
145
- process.env.API_KEY = "test-api-key";
145
+ process.env.API_KEY = "example-test-api-key";
146
146
  process.env.MCP_BASE_URL = "http://localhost:19999"; // Intentionally unreachable
147
147
  });
148
148
 
@@ -342,7 +342,7 @@ describe("createArtifactServer", () => {
342
342
  const path = c.req.path.replace("/@swarm/api", "/api");
343
343
  const targetUrl = `http://localhost:${mockMcpPort}${path}`;
344
344
  const headers: Record<string, string> = {
345
- Authorization: "Bearer test-api-key",
345
+ Authorization: "Bearer example-test-api-key",
346
346
  "X-Agent-ID": "test-agent-id",
347
347
  };
348
348
  if (c.req.method !== "GET") {
@@ -368,7 +368,7 @@ describe("createArtifactServer", () => {
368
368
  try {
369
369
  // Test GET request headers
370
370
  await fetch(`http://localhost:${proxyPort}/@swarm/api/agents`);
371
- expect(capturedHeaders.authorization).toBe("Bearer test-api-key");
371
+ expect(capturedHeaders.authorization).toBe("Bearer example-test-api-key");
372
372
  expect(capturedHeaders["x-agent-id"]).toBe("test-agent-id");
373
373
 
374
374
  // GET should NOT have Content-Type
@@ -379,7 +379,7 @@ describe("createArtifactServer", () => {
379
379
  method: "POST",
380
380
  body: JSON.stringify({ task: "test" }),
381
381
  });
382
- expect(capturedHeaders.authorization).toBe("Bearer test-api-key");
382
+ expect(capturedHeaders.authorization).toBe("Bearer example-test-api-key");
383
383
  expect(capturedHeaders["x-agent-id"]).toBe("test-agent-id");
384
384
  expect(capturedHeaders["content-type"]).toBe("application/json");
385
385
  } finally {
@@ -594,7 +594,7 @@ describe("artifact CLI command", () => {
594
594
 
595
595
  const origEnv = { ...process.env };
596
596
  process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
597
- process.env.API_KEY = "test-key";
597
+ process.env.API_KEY = "example-test-key";
598
598
  process.env.AGENT_ID = "test-agent";
599
599
 
600
600
  const consoleSpy = mock(() => {});
@@ -627,7 +627,7 @@ describe("artifact CLI command", () => {
627
627
 
628
628
  const origEnv = { ...process.env };
629
629
  process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
630
- process.env.API_KEY = "test-key";
630
+ process.env.API_KEY = "example-test-key";
631
631
  process.env.AGENT_ID = "test-agent";
632
632
 
633
633
  const consoleSpy = mock(() => {});
@@ -678,7 +678,7 @@ describe("artifact CLI command", () => {
678
678
 
679
679
  const origEnv = { ...process.env };
680
680
  process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
681
- process.env.API_KEY = "test-key";
681
+ process.env.API_KEY = "example-test-key";
682
682
  process.env.AGENT_ID = "test-agent";
683
683
 
684
684
  const consoleSpy = mock(() => {});
@@ -734,7 +734,7 @@ describe("artifact CLI command", () => {
734
734
 
735
735
  const origEnv = { ...process.env };
736
736
  process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
737
- process.env.API_KEY = "test-key";
737
+ process.env.API_KEY = "example-test-key";
738
738
  process.env.AGENT_ID = "test-agent";
739
739
 
740
740
  const consoleSpy = mock(() => {});
@@ -77,6 +77,7 @@ describe("asset namespace MCP exposure", () => {
77
77
  {
78
78
  agentId: targetAgentId,
79
79
  routingReason: "human_pinned",
80
+ routingNote: "This test explicitly selects the target worker",
80
81
  task: `inherited namespace ${Date.now()}`,
81
82
  allowDuplicate: true,
82
83
  },
@@ -92,6 +93,7 @@ describe("asset namespace MCP exposure", () => {
92
93
  {
93
94
  agentId: targetAgentId,
94
95
  routingReason: "human_pinned",
96
+ routingNote: "This test explicitly selects the target worker",
95
97
  task: `wrong namespace ${Date.now()}`,
96
98
  key: `personal/${otherUserId}/drafts/`,
97
99
  allowDuplicate: true,
@@ -73,7 +73,7 @@ describe("Automation preflight alerts", () => {
73
73
  });
74
74
 
75
75
  test("scrubs alert text and logs Slack failures without throwing", async () => {
76
- const secret = "preflight-alert-sensitive-fixture";
76
+ const secret = "example-preflight-alert-sensitive-fixture";
77
77
  registerVolatileSecret(secret, "PREFLIGHT_TEST_SECRET");
78
78
  postMessage.mockRejectedValueOnce(new Error(`Slack failed: ${secret}`));
79
79
  const error = spyOn(console, "error").mockImplementation(() => {});
@@ -636,6 +636,7 @@ describe("getBasePrompt: steering section", () => {
636
636
  });
637
637
 
638
638
  test("excluded when steering is not enabled", async () => {
639
+ process.env.STEERING_ENABLED = "false";
639
640
  const result = await getBasePrompt({ ...minimalArgs, traits: steerableTraits });
640
641
  expect(result).not.toContain(STEERING_HEADER);
641
642
  });
@@ -960,21 +961,21 @@ describe("truncateRepoClaudeMd", () => {
960
961
  // ---------------------------------------------------------------------------
961
962
 
962
963
  describe("getBasePrompt: size budget", () => {
963
- // The v2 rewrite cut the static prompt from ~25k characters to ~4.2k. These
964
- // ceilings are generous, so they only fire on a regression back to v1 size.
965
- test("a fresh claude worker stays under 5,000 characters", async () => {
964
+ // Include the explicit task-output budget and exceptions in the static prompt.
965
+ // Keep tight role-specific ceilings to catch unrelated prompt growth.
966
+ test("a fresh claude worker stays under 5,400 characters", async () => {
966
967
  const result = await getBasePrompt({ ...minimalArgs, name: "Ada", traits: localTraits });
967
- expect(result.length).toBeLessThan(5_000);
968
+ expect(result.length).toBeLessThan(5_400);
968
969
  });
969
970
 
970
- test("a fresh claude lead stays under 5,200 characters", async () => {
971
+ test("a fresh claude lead stays under 5,500 characters", async () => {
971
972
  const result = await getBasePrompt({
972
973
  ...minimalArgs,
973
974
  role: "lead",
974
975
  name: "Cora",
975
976
  traits: localTraits,
976
977
  });
977
- expect(result.length).toBeLessThan(5_200);
978
+ expect(result.length).toBeLessThan(5_500);
978
979
  });
979
980
 
980
981
  test("Picateclas spawn-OOM hardening: the kitchen sink stays below MAX_ARG_STRLEN", async () => {
@@ -29,7 +29,7 @@ import { listenOnFreePort } from "./test-net";
29
29
  const TEST_DB_PATH = "./test-budget-user-scope.sqlite";
30
30
  const NOW = new Date("2026-04-28T15:30:00.000Z");
31
31
  const TODAY = "2026-04-28";
32
- const API_KEY = "test-budget-user-scope-key";
32
+ const API_KEY = "example-test-budget-user-scope-key";
33
33
  const ACTOR: IdentityActor = { kind: "operator", id: "phase6-test" };
34
34
 
35
35
  async function removeDbFiles(path: string): Promise<void> {
@@ -25,7 +25,7 @@ import { getPathSegments, parseQueryParams } from "../http/utils";
25
25
  import { listenOnFreePort } from "./test-net";
26
26
 
27
27
  const TEST_DB_PATH = "./test-budgets-routes.sqlite";
28
- const API_KEY = "test-budget-secret-key";
28
+ const API_KEY = "example-test-budget-secret-key";
29
29
 
30
30
  async function removeDbFiles(path: string): Promise<void> {
31
31
  for (const suffix of ["", "-wal", "-shm"]) {