@desplega.ai/agent-swarm 2.6.0 → 2.7.1

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 (324) hide show
  1. package/README.md +2 -0
  2. package/dist/{acp-adapter-dgfakfpw.js → acp-adapter-8dn5tq56.js} +6 -6
  3. package/dist/{actions-fbqma8aa.js → actions-3r6gw7dy.js} +18 -18
  4. package/dist/{amp-adapter-en0jy6hs.js → amp-adapter-wjtq413p.js} +3 -3
  5. package/dist/{anthropic-messages-txs190dd.js → anthropic-messages-n4cby1rz.js} +4 -4
  6. package/dist/{app-k8a5cgpp.js → app-d53yhykk.js} +3 -3
  7. package/dist/{assistant-a16433gr.js → assistant-ksrawj3k.js} +20 -20
  8. package/dist/{boot-reembed-6c1sjfnr.js → boot-reembed-fxfw17m2.js} +11 -3
  9. package/dist/{boot-reembed-f4nn561n.js → boot-reembed-k5y5xbj0.js} +15 -8
  10. package/dist/{boot-scrub-sweep-d4w9gajf.js → boot-scrub-sweep-se41j9fd.js} +3 -3
  11. package/dist/{boot-seeds-9bmkspyw.js → boot-seeds-r3kwwv8b.js} +4 -4
  12. package/dist/{claude-adapter-nys1kjxa.js → claude-adapter-ahmyf231.js} +8 -8
  13. package/dist/{claude-managed-adapter-55207973.js → claude-managed-adapter-5knamegc.js} +3 -3
  14. package/dist/{claude-managed-setup-3cm35gey.js → claude-managed-setup-mdc7dy6b.js} +3 -3
  15. package/dist/{claude-sdk-session-nw5yd8cp.js → claude-sdk-session-n5wen9zk.js} +8729 -8600
  16. package/dist/{cli-683y0b3a.js → cli-0dqtv2jg.js} +2 -2
  17. package/dist/{cli-a34pr3w1.js → cli-0tww7dnz.js} +2 -2
  18. package/dist/{cli-w2656ka1.js → cli-0w4e4v58.js} +7 -7
  19. package/dist/{cli-5sckpqcx.js → cli-2sjm3t4r.js} +1 -1
  20. package/dist/{cli-gf2850q7.js → cli-3cywb44q.js} +18 -1
  21. package/dist/{cli-8wkb09q5.js → cli-3k9jej0c.js} +2 -2
  22. package/dist/{cli-3aqd4jaa.js → cli-3v2cyqb8.js} +3 -3
  23. package/dist/{cli-emhjcj2y.js → cli-5qt9vzmq.js} +89 -20
  24. package/dist/{cli-abkm71vr.js → cli-5rp1w4cr.js} +1 -1
  25. package/dist/{cli-gf95q3bm.js → cli-6vwjsetx.js} +4 -4
  26. package/dist/{cli-k21gx5ht.js → cli-6w2yrrc0.js} +10 -10
  27. package/dist/{cli-m70bajzr.js → cli-75tdydgv.js} +1 -1
  28. package/dist/{cli-5rj83bam.js → cli-8feswf2v.js} +47 -36
  29. package/dist/{cli-sxgtf5fw.js → cli-8wd3mbyj.js} +1 -1
  30. package/dist/{cli-ca6banwz.js → cli-9csfthbw.js} +10 -8
  31. package/dist/{cli-dqygeeh5.js → cli-b41p764a.js} +31 -3
  32. package/dist/{cli-m5a9m0ak.js → cli-c1t533hh.js} +3 -3
  33. package/dist/{cli-2sjhpsns.js → cli-c28jxpcv.js} +1 -1
  34. package/dist/{cli-bqztfyve.js → cli-cb50g9cd.js} +1 -1
  35. package/dist/{cli-ag2yrnt5.js → cli-d8gaphtr.js} +2 -2
  36. package/dist/{cli-9abdgn5t.js → cli-dgtfysne.js} +3 -3
  37. package/dist/{cli-nq677csy.js → cli-dscnhn18.js} +1 -1
  38. package/dist/{cli-3fwqy71j.js → cli-dv11pgpv.js} +39 -32
  39. package/dist/{cli-v49fkghp.js → cli-ekptgk2m.js} +6 -6
  40. package/dist/{cli-c2habvsf.js → cli-f3mzy662.js} +17 -17
  41. package/dist/{cli-zqne1qcj.js → cli-fk7k8s9x.js} +2 -2
  42. package/dist/{cli-1tem6ns9.js → cli-gt4h8cxw.js} +3 -2
  43. package/dist/{cli-vbhgkw9h.js → cli-h3e7bhvn.js} +3 -3
  44. package/dist/{cli-ffvsj2qw.js → cli-hkxqdmnb.js} +3 -3
  45. package/dist/{cli-a2rr0fmg.js → cli-hpkvgdad.js} +7 -4
  46. package/dist/{cli-art7c1zh.js → cli-hq2v4rr5.js} +37 -9
  47. package/dist/{cli-sqma6vw1.js → cli-k1zb7raw.js} +5 -5
  48. package/dist/{cli-4rvr7zfx.js → cli-k4awgvzm.js} +5 -0
  49. package/dist/{cli-3ndmpxxv.js → cli-k7d3hvya.js} +2 -2
  50. package/dist/{cli-3gfvmzht.js → cli-kbtdftbw.js} +74 -26
  51. package/dist/{cli-hfeb68z4.js → cli-kj69b9tw.js} +34 -6
  52. package/dist/{cli-az25fn5f.js → cli-kk9jy4nm.js} +2 -2
  53. package/dist/{cli-39aet655.js → cli-m52t4cta.js} +1 -1
  54. package/dist/{cli-cz37jqss.js → cli-mdadewqp.js} +5 -5
  55. package/dist/{cli-esakngh8.js → cli-nf6k60sn.js} +1 -1
  56. package/dist/{cli-j6rktc91.js → cli-nzdf09js.js} +1 -1
  57. package/dist/{cli-rr7zx19j.js → cli-prcyzecg.js} +12 -12
  58. package/dist/{cli-4hxrf0p4.js → cli-pzafyqtk.js} +393 -62
  59. package/dist/{cli-g8ka5j4j.js → cli-qvaa1gjp.js} +173 -52
  60. package/dist/{cli-d2dpf95n.js → cli-rg4b2g6j.js} +1 -1
  61. package/dist/{cli-kf4jree9.js → cli-rm66vqdz.js} +1 -1
  62. package/dist/{cli-4rf0f5vg.js → cli-s504c3w7.js} +5 -3
  63. package/dist/{cli-nn6vx2mq.js → cli-swkx9jm2.js} +7 -5
  64. package/dist/{cli-g20jjwt4.js → cli-thsaq4pd.js} +16 -16
  65. package/dist/{cli-aj8djyqt.js → cli-twjnyvs8.js} +2 -2
  66. package/dist/{cli-03gg9pd1.js → cli-typdpe8g.js} +4 -4
  67. package/dist/{cli-mtnj4fwa.js → cli-vg8pwmsd.js} +6 -6
  68. package/dist/{cli-gnsb1zxa.js → cli-vhpckzvp.js} +1 -1
  69. package/dist/{cli-7enjwya9.js → cli-vz78s5wm.js} +1 -1
  70. package/dist/{cli-dv97kdzv.js → cli-wdxgsdz5.js} +2 -2
  71. package/dist/{cli-7a6p4e65.js → cli-wtjg6je3.js} +1 -1
  72. package/dist/{cli-6y51ryva.js → cli-x3cngb1h.js} +44 -12
  73. package/dist/{cli-n7asmce6.js → cli-xbz6mcg4.js} +3 -3
  74. package/dist/{cli-24j1jeeb.js → cli-y4tdxsqb.js} +3 -3
  75. package/dist/{cli-mvjz5an3.js → cli-yqrsp3ny.js} +7 -7
  76. package/dist/cli.js +31 -21
  77. package/dist/{codex-adapter-d95q4qsn.js → codex-adapter-7wepzq15.js} +6 -6
  78. package/dist/{codex-hook-brpnycn5.js → codex-hook-pbdh4xhx.js} +2 -2
  79. package/dist/{codex-session-runner-gdwd8h0c.js → codex-session-runner-02sb49e4.js} +6 -6
  80. package/dist/{commands-jqmgk54b.js → commands-3rcspxct.js} +2 -2
  81. package/dist/{controller-z3jq589f.js → controller-8ar4avd6.js} +3 -3
  82. package/dist/{controllers-connect-r2za39ef.js → controllers-connect-ajvh9h0v.js} +19 -19
  83. package/dist/{cursor-adapter-4mr4jgkw.js → cursor-adapter-gd0sa7bh.js} +1 -1
  84. package/dist/{db-w36wwb5g.js → db-dv9j7ts5.js} +2 -2
  85. package/dist/{db-ppv2tze7.js → db-z26vgdvj.js} +3 -3
  86. package/dist/{dispatcher-pv5h77vf.js → dispatcher-8m0htjq8.js} +17 -17
  87. package/dist/{dsh-adapter-d4pdpb3r.js → dsh-adapter-y8gyk130.js} +1 -1
  88. package/dist/{e2b-fn3zacvt.js → e2b-74vg9b7e.js} +1 -1
  89. package/dist/{e2b-222hsajc.js → e2b-jyay8wzn.js} +1 -1
  90. package/dist/{easter-egg-3d-4sp4dvmc.js → easter-egg-3d-28f880xx.js} +1 -1
  91. package/dist/{execute-jev839y1.js → execute-9seb79vh.js} +1 -1
  92. package/dist/{external-channel-y6nkzhnn.js → external-channel-smz7jyth.js} +2 -2
  93. package/dist/{getMachineId-bsd-brn0xym3.js → getMachineId-bsd-whfre6gr.js} +3 -3
  94. package/dist/{getMachineId-darwin-t339sfxm.js → getMachineId-darwin-5zjynb19.js} +3 -3
  95. package/dist/{getMachineId-linux-5eq95d8b.js → getMachineId-linux-8mksrrsq.js} +3 -3
  96. package/dist/{getMachineId-unsupported-qavrtc7j.js → getMachineId-unsupported-fxtqsdt2.js} +3 -3
  97. package/dist/{getMachineId-win-q7fe1wx7.js → getMachineId-win-nzfmz857.js} +3 -3
  98. package/dist/{grok-adapter-t08b9ntm.js → grok-adapter-z0nnvtbn.js} +7 -7
  99. package/dist/handlers-pspryh6g.js +41 -0
  100. package/dist/{heartbeat-vn31xwdk.js → heartbeat-f928aqyp.js} +20 -20
  101. package/dist/{hook-cpjs8q51.js → hook-d7c605r4.js} +7 -7
  102. package/dist/{hook-6d0zbvvt.js → hook-q9hv5xf9.js} +5 -5
  103. package/dist/{http-9c6medda.js → http-q6j4k989.js} +1000 -251
  104. package/dist/{index-k0yt1tvq.js → index-5nb266jr.js} +17 -17
  105. package/dist/{index-ysd45kgc.js → index-8fxt5eah.js} +10 -10
  106. package/dist/{index-zgvqzjsw.js → index-cekzwhez.js} +5 -5
  107. package/dist/{index-38t35h0n.js → index-ch0c1xff.js} +17 -17
  108. package/dist/{index-pkma1yf8.js → index-ebnjhxh1.js} +1 -1
  109. package/dist/{index-yqgbfgaj.js → index-ed8dy8rn.js} +20 -20
  110. package/dist/{index-qhjf2htm.js → index-ejqdkkqx.js} +262 -96
  111. package/dist/{index-dr94zbnh.js → index-farm1zsn.js} +32661 -29443
  112. package/dist/{index-g6k9tctj.js → index-yn1yxg85.js} +1 -1
  113. package/dist/{keepalive-em0117bp.js → keepalive-zzc3hks1.js} +3 -3
  114. package/dist/lead-c0pjcaw4.js +79 -0
  115. package/dist/{maintenance-kbme3qy9.js → maintenance-kqsxzpzx.js} +1 -1
  116. package/dist/{oauth-refresh-sweep-xysj4yse.js → oauth-refresh-sweep-7qt0g55z.js} +8 -3
  117. package/dist/{onboard-p6q0vz97.js → onboard-k7x13fqg.js} +121 -8
  118. package/dist/{opencode-adapter-esv3k9yn.js → opencode-adapter-tqvrtter.js} +5 -5
  119. package/dist/{otel-impl-54qhqh1z.js → otel-impl-sqkf6k3b.js} +97 -97
  120. package/dist/{pi-mono-adapter-mymbwhj0.js → pi-mono-adapter-m2qnafxm.js} +89 -14
  121. package/dist/{pricing-refresh-yb75wv33.js → pricing-refresh-wkpwhgvs.js} +3 -3
  122. package/dist/{rbac-roles-dexhc9x8.js → rbac-roles-dpn0c0wj.js} +7 -4
  123. package/dist/{rbac-roles-1vp2mw4p.js → rbac-roles-wk7xd6a6.js} +2 -2
  124. package/dist/{render-v2-tjay5hhf.js → render-v2-ex2m4g2k.js} +3 -3
  125. package/dist/{resume-8ayf37g5.js → resume-725g9b0b.js} +7 -7
  126. package/dist/{runtime-hqe5cqcd.js → runtime-kajas15g.js} +1 -1
  127. package/dist/{session-access-fdhp987s.js → session-access-0j2ezjje.js} +8 -4
  128. package/dist/{session-source-backfill-qgtc86z1.js → session-source-backfill-62202awe.js} +2 -2
  129. package/dist/{setup-4rrmqcq3.js → setup-9sj11ax6.js} +1 -1
  130. package/dist/{virtual-modules-52km00d6.js → virtual-modules-c6fcq6zr.js} +2 -2
  131. package/dist/{work-objects-p28fgd70.js → work-objects-0y07495y.js} +20 -20
  132. package/dist/worker-d4q9sqbc.js +79 -0
  133. package/openapi.json +1536 -407
  134. package/package.json +7 -5
  135. package/src/be/automation-preflight.ts +2 -0
  136. package/src/be/connector-codes.ts +65 -22
  137. package/src/be/db/api-keys.ts +9 -0
  138. package/src/be/db/workflow-runs.ts +36 -5
  139. package/src/be/db.ts +80 -22
  140. package/src/be/memory/boot-reembed.ts +4 -1
  141. package/src/be/memory/constants.ts +6 -0
  142. package/src/be/memory/embedding-recovery.ts +48 -0
  143. package/src/be/memory/index-content.ts +5 -2
  144. package/src/be/memory/providers/openai-embedding.ts +65 -14
  145. package/src/be/memory/task-learning.ts +257 -0
  146. package/src/be/memory/types.ts +13 -2
  147. package/src/be/migrations/245_script_executor.sql +3 -0
  148. package/src/be/migrations/246_connector_code_kind.sql +11 -0
  149. package/src/be/oauth-refresh-sweep.ts +2 -1
  150. package/src/be/onboarding.ts +125 -15
  151. package/src/be/rbac-roles.ts +4 -1
  152. package/src/be/scripts/boot-reembed.ts +2 -0
  153. package/src/be/scripts/db.ts +14 -4
  154. package/src/be/scripts/embeddings.ts +4 -2
  155. package/src/be/scripts/run-saved.ts +1 -0
  156. package/src/be/scripts/typecheck.ts +9 -3
  157. package/src/be/seed/agent-fs-provision.ts +75 -14
  158. package/src/be/seed-skills/index.ts +7 -0
  159. package/src/be/swarm-config-guard.ts +3 -0
  160. package/src/cli.tsx +9 -0
  161. package/src/comb/config.ts +6 -1
  162. package/src/commands/onboard/agent-fs-version.ts +5 -0
  163. package/src/commands/onboard/compose-generator.ts +117 -4
  164. package/src/commands/onboard/env-generator.ts +9 -0
  165. package/src/commands/onboard/tei-image.ts +12 -0
  166. package/src/commands/onboard/types.ts +7 -0
  167. package/src/commands/onboard.tsx +11 -1
  168. package/src/commands/provider-credentials.ts +2 -1
  169. package/src/commands/runner.ts +14 -1
  170. package/src/heartbeat/heartbeat.ts +14 -1
  171. package/src/heartbeat/script-runner-probe.ts +47 -0
  172. package/src/http/agentfs-proxy.ts +369 -0
  173. package/src/http/all-routes.ts +1 -0
  174. package/src/http/api-keys.ts +24 -9
  175. package/src/http/codex-oauth-device.ts +8 -1
  176. package/src/http/fs.ts +64 -10
  177. package/src/http/idempotency-key.ts +1 -1
  178. package/src/http/inbox-state.ts +27 -1
  179. package/src/http/index.ts +7 -4
  180. package/src/http/memory.ts +7 -4
  181. package/src/http/onboarding.ts +139 -11
  182. package/src/http/pages-public.ts +38 -5
  183. package/src/http/scripts.ts +27 -0
  184. package/src/http/session-access.ts +24 -0
  185. package/src/http/sessions.ts +10 -6
  186. package/src/http/tasks.ts +85 -11
  187. package/src/http/telemetry-ui.ts +1 -1
  188. package/src/http/user-roles.ts +4 -1
  189. package/src/http/users.ts +272 -3
  190. package/src/http/utils.ts +22 -3
  191. package/src/http/workflows.ts +10 -0
  192. package/src/http/x.ts +5 -0
  193. package/src/prompts/base-prompt.ts +45 -10
  194. package/src/prompts/session-templates.ts +43 -5
  195. package/src/providers/amp-adapter.ts +1 -1
  196. package/src/providers/codex-adapter.ts +6 -1
  197. package/src/providers/cursor-adapter.ts +1 -1
  198. package/src/providers/dsh-adapter.ts +1 -1
  199. package/src/providers/pi-mono-adapter.ts +99 -14
  200. package/src/rbac/legacy-policy.ts +1 -0
  201. package/src/rbac/permissions.ts +4 -0
  202. package/src/scheduler/scheduler.ts +2 -1
  203. package/src/scripts-runtime/eval-harness.ts +8 -1
  204. package/src/scripts-runtime/executors/native.ts +22 -16
  205. package/src/scripts-runtime/executors/quickjs-prelude.ts +103 -1
  206. package/src/scripts-runtime/executors/quickjs-runner.ts +2 -1
  207. package/src/scripts-runtime/executors/quickjs.ts +7 -0
  208. package/src/scripts-runtime/executors/registry.ts +32 -0
  209. package/src/scripts-runtime/executors/types.ts +7 -0
  210. package/src/scripts-runtime/host-validated-args.ts +133 -0
  211. package/src/scripts-runtime/loader.ts +30 -3
  212. package/src/scripts-runtime/swarm-sdk.ts +9 -2
  213. package/src/scripts-runtime/types/stdlib.d.ts +9 -1
  214. package/src/scripts-runtime/types/swarm-sdk.d.ts +9 -1
  215. package/src/tests/agent-fs-provision-seeder.test.ts +261 -92
  216. package/src/tests/agentfs-proxy.test.ts +1106 -0
  217. package/src/tests/api-key-status-by-suffix.test.ts +242 -0
  218. package/src/tests/base-prompt.test.ts +139 -4
  219. package/src/tests/codex-adapter.test.ts +46 -8
  220. package/src/tests/codex-oauth-device.test.ts +12 -1
  221. package/src/tests/comb-config-guard.test.ts +20 -0
  222. package/src/tests/comb-links.test.ts +79 -1
  223. package/src/tests/comb-status.test.ts +44 -0
  224. package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
  225. package/src/tests/credential-check.test.ts +4 -2
  226. package/src/tests/docs-index-footprint.test.js +3 -3
  227. package/src/tests/docs-index.test.ts +135 -0
  228. package/src/tests/dsh-adapter.test.ts +1 -1
  229. package/src/tests/fetch-resolved-env.test.ts +16 -2
  230. package/src/tests/fixtures/onboard/baseline-states.ts +68 -0
  231. package/src/tests/fixtures/onboard/content.compose.yml.txt +190 -0
  232. package/src/tests/fixtures/onboard/content.env.txt +29 -0
  233. package/src/tests/fixtures/onboard/dev.compose.yml.txt +155 -0
  234. package/src/tests/fixtures/onboard/dev.env.txt +28 -0
  235. package/src/tests/fixtures/onboard/full-all.compose.yml.txt +582 -0
  236. package/src/tests/fixtures/onboard/full-all.env.txt +59 -0
  237. package/src/tests/fixtures/onboard/full.compose.yml.txt +435 -0
  238. package/src/tests/fixtures/onboard/full.env.txt +36 -0
  239. package/src/tests/fixtures/onboard/research.compose.yml.txt +155 -0
  240. package/src/tests/fixtures/onboard/research.env.txt +28 -0
  241. package/src/tests/fixtures/onboard/solo.compose.yml.txt +85 -0
  242. package/src/tests/fixtures/onboard/solo.env.txt +26 -0
  243. package/src/tests/heartbeat-checklist.test.ts +89 -0
  244. package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
  245. package/src/tests/http-log-scrubbing.test.ts +34 -1
  246. package/src/tests/http-task-write-ownership.test.ts +5 -1
  247. package/src/tests/invites-http.test.ts +464 -0
  248. package/src/tests/memory-embedding-input-cap.test.ts +122 -1
  249. package/src/tests/memory-embedding-recovery.test.ts +137 -0
  250. package/src/tests/oauth-refresh-sweep.test.ts +34 -1
  251. package/src/tests/onboard-compose.test.ts +162 -0
  252. package/src/tests/onboard-env.test.ts +24 -0
  253. package/src/tests/onboard-non-interactive.test.ts +29 -0
  254. package/src/tests/onboard-tei-image.test.ts +36 -0
  255. package/src/tests/onboarding.test.ts +451 -4
  256. package/src/tests/openai-embedding-provider.test.ts +105 -2
  257. package/src/tests/opencode-adapter.test.ts +2 -1
  258. package/src/tests/pages-frame-ancestors.test.ts +162 -0
  259. package/src/tests/pi-codemode.test.ts +2 -1
  260. package/src/tests/pi-mono-adapter.test.ts +54 -0
  261. package/src/tests/pi-mono-session-cost-on-abort.test.ts +270 -0
  262. package/src/tests/pi-native-mcp.test.ts +13 -1
  263. package/src/tests/pi-tool-exposure.test.ts +8 -8
  264. package/src/tests/preload-env.test.ts +4 -0
  265. package/src/tests/preload.ts +4 -0
  266. package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
  267. package/src/tests/prompt-template-session.test.ts +20 -3
  268. package/src/tests/rbac-admission-e2e.test.ts +22 -6
  269. package/src/tests/rbac-admission.test.ts +342 -4
  270. package/src/tests/rbac-engine.test.ts +1 -0
  271. package/src/tests/rbac-roles.test.ts +9 -1
  272. package/src/tests/request-composition-derive.test.ts +329 -0
  273. package/src/tests/script-connections.test.ts +2 -0
  274. package/src/tests/script-executor-conformance.test.ts +36 -1
  275. package/src/tests/script-executor-quickjs-pool.test.ts +50 -0
  276. package/src/tests/script-executor-quickjs.test.ts +140 -0
  277. package/src/tests/script-host-validated-args-native.test.ts +196 -0
  278. package/src/tests/script-per-script-executor.test.ts +415 -0
  279. package/src/tests/scripts-external-api.test.ts +45 -0
  280. package/src/tests/sdk-allowlist.test.ts +3 -2
  281. package/src/tests/self-improvement.test.ts +4 -4
  282. package/src/tests/send-task-requester-gate.test.ts +64 -3
  283. package/src/tests/sessions-move.test.ts +39 -1
  284. package/src/tests/store-progress-learning.test.ts +381 -0
  285. package/src/tests/ui-logs-parser.test.ts +180 -0
  286. package/src/tests/whoami-route.test.ts +41 -0
  287. package/src/tests/workflow-engine-v2.test.ts +116 -1
  288. package/src/tests/workflow-mcp-trigger-schema.test.ts +209 -0
  289. package/src/tests/workflow-run-finished-event.test.ts +263 -0
  290. package/src/tests/workflow-swarm-script.test.ts +34 -0
  291. package/src/tools/inject-learning.ts +1 -1
  292. package/src/tools/memory-edit.ts +1 -1
  293. package/src/tools/memory-search.ts +1 -1
  294. package/src/tools/script-common.ts +1 -0
  295. package/src/tools/script-run.ts +7 -0
  296. package/src/tools/script-upsert.ts +7 -0
  297. package/src/tools/store-progress.ts +71 -1
  298. package/src/tools/utils.ts +12 -1
  299. package/src/tools/workflows/trigger-workflow.ts +104 -10
  300. package/src/types.ts +12 -1
  301. package/src/utils/constants.ts +39 -0
  302. package/src/utils/credentials.ts +5 -2
  303. package/src/utils/task-attachment-links.ts +15 -3
  304. package/src/workflows/engine.ts +18 -16
  305. package/src/workflows/executors/swarm-script.ts +5 -0
  306. package/src/workflows/foreach-driver.ts +5 -11
  307. package/src/workflows/node-timeout.ts +30 -0
  308. package/templates/community/linear-delivery-loop/PLAYBOOK.md +323 -0
  309. package/templates/community/linear-delivery-loop/README.md +38 -0
  310. package/templates/community/linear-delivery-loop/config.example.json +31 -0
  311. package/templates/community/linear-delivery-loop/lead-prompt.md +34 -0
  312. package/templates/community/linear-delivery-loop/schedule.json +10 -0
  313. package/templates/community/linear-delivery-loop/scripts/linear-delivery-setup.ts +148 -0
  314. package/templates/community/linear-delivery-loop/scripts/linear-delivery-tick.ts +1781 -0
  315. package/templates/skills/swarm-docs/config.json +14 -0
  316. package/templates/skills/swarm-docs/content.md +144 -0
  317. package/dist/handlers-eqsnmv95.js +0 -41
  318. package/dist/lead-23e7z59t.js +0 -79
  319. package/dist/worker-e3w7vye1.js +0 -79
  320. package/dist/{azure-openai-responses-9kfwhmn7.js → azure-openai-responses-43asa23s.js} +0 -0
  321. package/dist/{node-vxx896fa.js → node-t28cc56b.js} +0 -0
  322. package/dist/{openai-codex-responses-79s8xnbh.js → openai-codex-responses-jhr3sjtm.js} +3 -3
  323. package/dist/{openai-completions-tdbyts0x.js → openai-completions-gs6yn37k.js} +3 -3
  324. /package/dist/{openai-responses-dm3t5vqp.js → openai-responses-jqm9vwwk.js} +0 -0
@@ -0,0 +1,85 @@
1
+ # Docker Compose for Agent Swarm
2
+ # Generated by `agent-swarm onboard`
3
+ #
4
+ # Usage:
5
+ # docker compose --env-file .env up -d
6
+ #
7
+ # Image version: set AGENT_SWARM_VERSION in .env to a published release.
8
+ # Blank falls back to `latest`, which moves on every commit to main and is
9
+ # not a release. Releases: https://github.com/desplega-ai/agent-swarm/releases
10
+ # Upgrade/rollback (migrations are forward-only, so back up first):
11
+ # https://github.com/desplega-ai/agent-swarm/blob/main/skills/agent-swarm/references/upgrade.md
12
+
13
+ services:
14
+ swarm-api:
15
+ image: "ghcr.io/desplega-ai/agent-swarm:${AGENT_SWARM_VERSION:-latest}"
16
+ container_name: swarm-api
17
+ pull_policy: always
18
+ stop_grace_period: 60s
19
+
20
+ environment:
21
+ - API_KEY=${API_KEY}
22
+ - INSTALL_METHOD=${INSTALL_METHOD}
23
+ - INSTALL_PRESET=${INSTALL_PRESET:-}
24
+ - MEMORY_HYBRID_SEARCH=${MEMORY_HYBRID_SEARCH-1}
25
+ - MEMORY_GRAPH_EXPANSION=${MEMORY_GRAPH_EXPANSION-1}
26
+ - MEMORY_RATERS=${MEMORY_RATERS-implicit-citation,explicit-self}
27
+ - MEMORY_DEMOTION_FLOOR=${MEMORY_DEMOTION_FLOOR-1.0}
28
+ - CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN}
29
+ - MCP_BASE_URL=http://localhost:3013
30
+ - APP_URL=https://app.agent-swarm.dev
31
+
32
+ ports:
33
+ - "3013:3013"
34
+
35
+ volumes:
36
+ - swarm_data:/app/data
37
+
38
+ healthcheck:
39
+ test: ["CMD-SHELL", "curl -f http://localhost:3013/health || exit 1"]
40
+ interval: 10s
41
+ timeout: 5s
42
+ retries: 3
43
+ start_period: 15s
44
+
45
+ restart: unless-stopped
46
+
47
+ worker-coder:
48
+ image: "ghcr.io/desplega-ai/agent-swarm-worker:${AGENT_SWARM_VERSION:-latest}"
49
+ container_name: swarm-worker-coder
50
+ pull_policy: always
51
+ stop_grace_period: 60s
52
+
53
+ depends_on:
54
+ swarm-api:
55
+ condition: service_healthy
56
+
57
+ environment:
58
+ - HARNESS_PROVIDER=${HARNESS_PROVIDER}
59
+ - CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN}
60
+ - API_KEY=${API_KEY}
61
+ - MEMORY_RATERS=${MEMORY_RATERS-implicit-citation,explicit-self}
62
+ - AGENT_ID=00000000-0000-4000-8000-000000000001
63
+ - AGENT_NAME=Coder
64
+ - AGENT_ROLE=worker
65
+ - TEMPLATE_ID=official/coder
66
+ - MCP_BASE_URL=http://swarm-api:3013
67
+ - YOLO=true
68
+ - SWARM_URL=http://swarm-api:3013
69
+ - MAX_CONCURRENT_TASKS=1
70
+
71
+ ports:
72
+ - "3201:3000"
73
+
74
+ volumes:
75
+ - swarm_logs:/logs
76
+ - swarm_shared:/workspace/shared
77
+ - swarm_worker_coder:/workspace/personal
78
+
79
+ restart: unless-stopped
80
+
81
+ volumes:
82
+ swarm_data:
83
+ swarm_logs:
84
+ swarm_shared:
85
+ swarm_worker_coder:
@@ -0,0 +1,26 @@
1
+ # === Core ===
2
+ API_KEY=example-test-api-key
3
+ MCP_BASE_URL=http://localhost:3013
4
+ APP_URL=https://app.agent-swarm.dev
5
+ # Pin a release, e.g. AGENT_SWARM_VERSION=1.150.0. Blank tracks `latest`.
6
+ AGENT_SWARM_VERSION=
7
+ INSTALL_METHOD=onboard_noninteractive
8
+ INSTALL_PRESET=solo
9
+
10
+ # New-deployment memory preset: retrieval, citation ratings, self-rating hints.
11
+ # Set MEMORY_RATERS= to disable all raters; leave SKIP_SESSION_SUMMARY unset.
12
+ MEMORY_HYBRID_SEARCH=1
13
+ MEMORY_GRAPH_EXPANSION=1
14
+ MEMORY_RATERS=implicit-citation,explicit-self
15
+ MEMORY_DEMOTION_FLOOR=1.0
16
+
17
+ # === Authentication ===
18
+ HARNESS_PROVIDER=claude
19
+ CLAUDE_CODE_OAUTH_TOKEN=example-test-oauth
20
+
21
+ # === Integrations ===
22
+ GITHUB_DISABLE=true
23
+ SLACK_DISABLE=true
24
+
25
+ # === Agent IDs (for reference) ===
26
+ # worker-coder = 00000000-0000-4000-8000-000000000001
@@ -24,6 +24,7 @@ import {
24
24
  upsertSwarmConfig,
25
25
  } from "../be/db";
26
26
  import { getScript, upsertScriptByName } from "../be/scripts/db";
27
+ import * as savedScriptRunner from "../be/scripts/run-saved";
27
28
  import { runSavedScriptAsAgent } from "../be/scripts/run-saved";
28
29
  import {
29
30
  checkHeartbeatChecklist,
@@ -624,6 +625,66 @@ describe("Heartbeat Checklist", () => {
624
625
  });
625
626
  });
626
627
 
628
+ for (const quiet of [true, false]) {
629
+ test(`healthy probe preserves the saved gate quiet=${quiet} verdict`, async () => {
630
+ process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
631
+ await saveGlobalGateScript("quiet-gate", "export default () => ({ quiet: true });");
632
+ const saved = spyOn(savedScriptRunner, "runSavedScriptAsAgent").mockResolvedValue({
633
+ exitCode: 0,
634
+ result: { quiet, reason: "existing verdict" },
635
+ stdout: "",
636
+ stderr: "",
637
+ durationMs: 1,
638
+ truncated: { stdout: false, stderr: false },
639
+ });
640
+ try {
641
+ setChecklistGateRunnerForTests((name, agentId, signal) =>
642
+ defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
643
+ );
644
+ await seedLead();
645
+ await checkHeartbeatChecklist();
646
+ expect(saved).toHaveBeenCalledTimes(1);
647
+ const tasks = await checklistTasks();
648
+ expect(tasks).toHaveLength(quiet ? 0 : 1);
649
+ if (!quiet) expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
650
+ } finally {
651
+ saved.mockRestore();
652
+ }
653
+ });
654
+ }
655
+
656
+ for (const mode of ["shadow", "enforce"] as const) {
657
+ test(`${mode}: an unhealthy probe produces a wake checklist`, async () => {
658
+ process.env.HEARTBEAT_CHECKLIST_GATE_MODE = mode;
659
+ setChecklistGateRunnerForTests((name, agentId, signal) =>
660
+ defaultChecklistGateRunner(name, agentId, signal, {
661
+ probe: async () => ({ quiet: false, reason: "script-runner-unhealthy: timeout" }),
662
+ }),
663
+ );
664
+ await seedLead();
665
+ await checkHeartbeatChecklist();
666
+ const tasks = await checklistTasks();
667
+ expect(tasks).toHaveLength(1);
668
+ expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
669
+ });
670
+ }
671
+
672
+ test("a bug in the probe produces wake rather than error", async () => {
673
+ process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
674
+ setChecklistGateRunnerForTests((name, agentId, signal) =>
675
+ defaultChecklistGateRunner(name, agentId, signal, {
676
+ probe: async () => {
677
+ throw new Error("probe bug");
678
+ },
679
+ }),
680
+ );
681
+ await seedLead();
682
+ await checkHeartbeatChecklist();
683
+ const tasks = await checklistTasks();
684
+ expect(tasks).toHaveLength(1);
685
+ expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
686
+ });
687
+
627
688
  test("shadow mode (default): a quiet verdict still creates the task, tagged quiet", async () => {
628
689
  useGate({ quiet: true, reason: "no change", summary: "nothing moved" });
629
690
  const lead = await seedLead();
@@ -703,6 +764,9 @@ describe("Heartbeat Checklist", () => {
703
764
  test("enforce mode: a missing global script fails open through the real runner", async () => {
704
765
  process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
705
766
  process.env.HEARTBEAT_CHECKLIST_GATE_SCRIPT = "no-such-gate-script";
767
+ setChecklistGateRunnerForTests((name, agentId, signal) =>
768
+ defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
769
+ );
706
770
  await seedLead();
707
771
 
708
772
  await checkHeartbeatChecklist();
@@ -739,6 +803,7 @@ describe("Heartbeat Checklist", () => {
739
803
  let run: Promise<unknown> | undefined;
740
804
  setChecklistGateRunnerForTests((scriptName, leadAgentId, signal) => {
741
805
  run = defaultChecklistGateRunner(scriptName, leadAgentId, signal, {
806
+ probe: async () => null,
742
807
  buildCredentials: () => {
743
808
  setupStarted.resolve();
744
809
  return new Promise((resolve) => {
@@ -798,6 +863,9 @@ describe("Heartbeat Checklist", () => {
798
863
  "export default async function run() { await new Promise((r) => setTimeout(r, 30_000)); return { quiet: true }; }",
799
864
  );
800
865
  setChecklistGateTimeoutMsForTests(1_500);
866
+ setChecklistGateRunnerForTests((name, agentId, signal) =>
867
+ defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
868
+ );
801
869
  await seedLead();
802
870
 
803
871
  const started = Date.now();
@@ -808,6 +876,27 @@ describe("Heartbeat Checklist", () => {
808
876
  expect(tasks).toHaveLength(1);
809
877
  expect(tasks[0]!.tags).toContain("heartbeat-gate:error");
810
878
  });
879
+
880
+ test("enforce mode: the real probe passes with no swarm API key, using the Lead's run token", async () => {
881
+ process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
882
+ await saveGlobalGateScript("quiet-gate", "export default () => ({ quiet: true });");
883
+ const savedKeys = { swarm: process.env.AGENT_SWARM_API_KEY, legacy: process.env.API_KEY };
884
+ process.env.AGENT_SWARM_API_KEY = "";
885
+ process.env.API_KEY = "";
886
+ try {
887
+ await seedLead();
888
+ await checkHeartbeatChecklist();
889
+ expect(await checklistTasks()).toHaveLength(0);
890
+ } finally {
891
+ for (const [name, value] of [
892
+ ["AGENT_SWARM_API_KEY", savedKeys.swarm],
893
+ ["API_KEY", savedKeys.legacy],
894
+ ] as const) {
895
+ if (value === undefined) delete process.env[name];
896
+ else process.env[name] = value;
897
+ }
898
+ }
899
+ });
811
900
  });
812
901
 
813
902
  // ==========================================================================
@@ -0,0 +1,83 @@
1
+ import { afterEach, describe, expect, mock, spyOn, test } from "bun:test";
2
+ import { probeScriptRunner } from "../heartbeat/script-runner-probe";
3
+ import type { RunScriptOutput } from "../scripts-runtime/loader";
4
+
5
+ const ok: RunScriptOutput = {
6
+ result: true,
7
+ stdout: "",
8
+ stderr: "",
9
+ truncated: { stdout: false, stderr: false },
10
+ durationMs: 1,
11
+ exitCode: 0,
12
+ };
13
+
14
+ afterEach(() => mock.restore());
15
+
16
+ describe("heartbeat script runner probe", () => {
17
+ test("success leaves the gate verdict unchanged and clears its deadline", async () => {
18
+ const clear = spyOn(globalThis, "clearTimeout");
19
+ const runner = mock(async () => ok);
20
+ expect(await probeScriptRunner("lead", runner)).toBeNull();
21
+ expect(runner).toHaveBeenCalledWith({
22
+ source: "export default async function () { return true; }",
23
+ agentId: "lead",
24
+ fsMode: "none",
25
+ timeoutMs: 10_000,
26
+ signal: expect.any(AbortSignal),
27
+ });
28
+ expect(clear).toHaveBeenCalledTimes(1);
29
+ });
30
+
31
+ test("timeout wakes without waiting for a stalled runner and aborts it", async () => {
32
+ let expire: (() => void) | undefined;
33
+ spyOn(globalThis, "setTimeout").mockImplementation(((callback: () => void, ms: number) => {
34
+ expect(ms).toBe(10_000);
35
+ expire = callback;
36
+ return 1;
37
+ }) as typeof setTimeout);
38
+ const clear = spyOn(globalThis, "clearTimeout").mockImplementation(() => {});
39
+ let signal: AbortSignal | undefined;
40
+ let rejectRun: ((error: Error) => void) | undefined;
41
+ const result = probeScriptRunner("lead", async (input) => {
42
+ signal = input.signal;
43
+ return new Promise<RunScriptOutput>((_, reject) => {
44
+ rejectRun = reject;
45
+ });
46
+ });
47
+ expire!();
48
+ expect(await result).toEqual({
49
+ quiet: false,
50
+ reason: "script-runner-unhealthy: timeout after 10000ms",
51
+ });
52
+ expect(signal?.aborted).toBe(true);
53
+ expect(clear).toHaveBeenCalledTimes(1);
54
+ // A runner that rejects after the deadline remains handled by Promise.race.
55
+ rejectRun!(new Error("late rejection"));
56
+ await Promise.resolve();
57
+ });
58
+
59
+ test("a thrown runner error wakes", async () => {
60
+ expect(
61
+ await probeScriptRunner("lead", async () => {
62
+ throw new Error("ECONNRESET");
63
+ }),
64
+ ).toEqual({
65
+ quiet: false,
66
+ reason: "script-runner-unhealthy: ECONNRESET",
67
+ });
68
+ });
69
+
70
+ for (const [label, failure, reason] of [
71
+ ["nonzero exit", { exitCode: 1 }, "script exited with code 1"],
72
+ ["runner error", { error: "killed" }, "killed"],
73
+ ["runtime error", { runtimeError: { message: "runtime failed" } }, "runtime failed"],
74
+ ] as const) {
75
+ test(`${label} wakes`, async () => {
76
+ const result = await probeScriptRunner(
77
+ "lead",
78
+ async () => ({ ...ok, ...failure }) as RunScriptOutput,
79
+ );
80
+ expect(result).toEqual({ quiet: false, reason: `script-runner-unhealthy: ${reason}` });
81
+ });
82
+ }
83
+ });
@@ -1,7 +1,19 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import { safeRequestUrlForLog } from "../http/utils";
2
+ import { redactShareTokenInPath, safeRequestUrlForLog } from "../http/utils";
3
3
 
4
4
  describe("safeRequestUrlForLog", () => {
5
+ test("redacts invite codes in request logs and the OTel path attribute", () => {
6
+ for (const suffix of ["", "/", "/extra"]) {
7
+ expect(safeRequestUrlForLog(`/invite/example_invite_code${suffix}?code=secret`)).toBe(
8
+ `/invite/[REDACTED]${suffix}?code=[REDACTED]`,
9
+ );
10
+ expect(redactShareTokenInPath(`/invite/example_invite_code${suffix}`)).toBe(
11
+ `/invite/[REDACTED]${suffix}`,
12
+ );
13
+ }
14
+ expect(safeRequestUrlForLog("/invite")).toBe("/invite");
15
+ expect(safeRequestUrlForLog("/api/invites")).toBe("/api/invites");
16
+ });
5
17
  test("redacts OAuth callback query values", () => {
6
18
  expect(
7
19
  safeRequestUrlForLog(
@@ -21,4 +33,25 @@ describe("safeRequestUrlForLog", () => {
21
33
  "/mcp?session=[REDACTED]&session=[REDACTED]&token=[REDACTED]",
22
34
  );
23
35
  });
36
+
37
+ test("redacts the agent-fs share token after /share/ and /site/", () => {
38
+ expect(safeRequestUrlForLog("/share/tok_secret123/raw")).toBe("/share/[REDACTED]/raw");
39
+ expect(safeRequestUrlForLog("/site/tok_secret123/")).toBe("/site/[REDACTED]/");
40
+ expect(safeRequestUrlForLog("/site/tok_secret123/a/index.html?v=1")).toBe(
41
+ "/site/[REDACTED]/a/index.html?v=[REDACTED]",
42
+ );
43
+ });
44
+
45
+ test("redacts the share token behind the /agentfs proxy prefix", () => {
46
+ expect(safeRequestUrlForLog("/agentfs/share/tok_secret123")).toBe("/agentfs/share/[REDACTED]");
47
+ expect(safeRequestUrlForLog("/agentfs/site/tok_secret123/x.css")).toBe(
48
+ "/agentfs/site/[REDACTED]/x.css",
49
+ );
50
+ });
51
+
52
+ test("leaves other share-like paths alone", () => {
53
+ expect(safeRequestUrlForLog("/share")).toBe("/share");
54
+ expect(safeRequestUrlForLog("/api/share/abc")).toBe("/api/share/abc");
55
+ expect(safeRequestUrlForLog("/agentfs/orgs/o/share")).toBe("/agentfs/orgs/o/share");
56
+ });
24
57
  });
@@ -10,6 +10,7 @@ import {
10
10
  completeTask,
11
11
  createAgent,
12
12
  createTaskExtended,
13
+ createUser,
13
14
  getTaskById,
14
15
  initDb,
15
16
  startTask,
@@ -27,7 +28,9 @@ const ownerId = "aaaa0000-0000-4000-8000-000000000b01";
27
28
  const otherId = "bbbb0000-0000-4000-8000-000000000b02";
28
29
  const creatorId = "cccc0000-0000-4000-8000-000000000b03";
29
30
  const leadId = "dddd0000-0000-4000-8000-000000000b04";
30
- const userId = "eeee0000-0000-4000-8000-000000000b05";
31
+ // A real user row: a new user gets the built-in admin role, so with RBAC on
32
+ // it may cancel any task, ownerless ones included.
33
+ let userId: string;
31
34
 
32
35
  type Caller =
33
36
  | { as: "operator"; agentId?: string }
@@ -85,6 +88,7 @@ beforeAll(async () => {
85
88
  await createAgent({ id: otherId, name: "Other", isLead: false, status: "idle" });
86
89
  await createAgent({ id: creatorId, name: "Creator", isLead: false, status: "idle" });
87
90
  await createAgent({ id: leadId, name: "Lead", isLead: true, status: "idle" });
91
+ userId = (await createUser({ name: "Dashboard User" })).id;
88
92
 
89
93
  server = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {
90
94
  const caller = JSON.parse(String(req.headers["x-test-caller"])) as Caller;