@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,133 @@
1
+ /**
2
+ * Unforgeable host-only capability symbol set on `RunScriptInput` strictly at
3
+ * the host boundary (`POST /api/x/script/{endpointId}`) after `validateJsonSchema`
4
+ * succeeds. Because `Symbol` keys cannot be produced by JSON deserialization,
5
+ * callers that forward request-shaped JSON fields into `RunScriptInput` can
6
+ * never opt out of `argsSchema` validation.
7
+ */
8
+ export const HOST_VALIDATED_ARGS = Symbol("swarm.hostValidatedArgs");
9
+
10
+ /**
11
+ * Checks whether a runtime `argsSchema` (Zod v4 / `zod/mini` schema) and its
12
+ * candidate `value` are semantically equivalent to the host-side JSON Schema
13
+ * validation performed by `validateJsonSchema` in `src/http/x.ts`.
14
+ *
15
+ * Returns `true` only when `schema.parse(value)` is guaranteed to succeed and
16
+ * return a value deeply identical to `value` without running any defaults,
17
+ * coercions, transforms, refinements, or unknown-key stripping.
18
+ */
19
+ export function isHostValidationEquivalent(schema: unknown, value: unknown): boolean {
20
+ if (!schema || typeof schema !== "object") return false;
21
+ const zodInternal = (schema as { _zod?: { def?: Record<string, unknown>; values?: unknown } })
22
+ ._zod;
23
+ const def = zodInternal?.def;
24
+ if (!def || typeof def !== "object") return false;
25
+
26
+ if (def.coerce) return false;
27
+ if (Array.isArray(def.checks) && def.checks.length > 0) return false;
28
+
29
+ switch (def.type) {
30
+ case "string":
31
+ return typeof value === "string" && !def.format;
32
+ case "number":
33
+ return typeof value === "number" && Number.isFinite(value) && !def.format;
34
+ case "boolean":
35
+ return typeof value === "boolean";
36
+ case "literal": {
37
+ const rawValues = def.values;
38
+ const values = Array.isArray(rawValues)
39
+ ? rawValues
40
+ : rawValues instanceof Set
41
+ ? Array.from(rawValues)
42
+ : [];
43
+ return (
44
+ values.length > 0 &&
45
+ values.some((v) => v === value && typeof v !== "bigint" && typeof v !== "symbol")
46
+ );
47
+ }
48
+ case "enum": {
49
+ if (zodInternal?.values instanceof Set) {
50
+ return zodInternal.values.has(value);
51
+ }
52
+ const entriesObj =
53
+ def.entries && typeof def.entries === "object"
54
+ ? (def.entries as Record<string, unknown>)
55
+ : null;
56
+ if (!entriesObj) return false;
57
+ const entries = Object.values(entriesObj).filter(
58
+ (v) => !(typeof v === "string" && typeof entriesObj[v] === "number"),
59
+ );
60
+ return entries.length > 0 && entries.includes(value);
61
+ }
62
+ case "optional":
63
+ return value === undefined
64
+ ? isStructuralSchemaNode(def.innerType)
65
+ : isHostValidationEquivalent(def.innerType, value);
66
+ case "nullable":
67
+ return value === null
68
+ ? isStructuralSchemaNode(def.innerType)
69
+ : isHostValidationEquivalent(def.innerType, value);
70
+ case "array":
71
+ return (
72
+ Array.isArray(value) &&
73
+ isStructuralSchemaNode(def.element) &&
74
+ value.every((item) => isHostValidationEquivalent(def.element, item))
75
+ );
76
+ case "object": {
77
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
78
+ const rawShape = typeof def.shape === "function" ? def.shape() : def.shape;
79
+ if (!rawShape || typeof rawShape !== "object") return false;
80
+ const shape = rawShape as Record<string, unknown>;
81
+ const obj = value as Record<string, unknown>;
82
+
83
+ // If `value` carries extra keys not declared in `shape`, let `.parse()`
84
+ // handle key stripping (`z.object`), passthrough (`z.looseObject`), or
85
+ // rejection (`z.strictObject`).
86
+ for (const key of Object.keys(obj)) {
87
+ if (!Object.hasOwn(shape, key)) return false;
88
+ }
89
+
90
+ for (const [key, propSchema] of Object.entries(shape)) {
91
+ // Retain Zod's property lookup semantics: if `key` is absent as an own
92
+ // property on `obj` but resolves via `Object.prototype` (e.g. `constructor`,
93
+ // `toString`), fall back to `.parse()` so Zod validates/rejects the
94
+ // inherited prototype value identically to `main`.
95
+ if (!Object.hasOwn(obj, key) && key in obj) return false;
96
+ const propValue = obj[key];
97
+ if (!isHostValidationEquivalent(propSchema, propValue)) return false;
98
+ }
99
+ return true;
100
+ }
101
+ default:
102
+ return false;
103
+ }
104
+ }
105
+
106
+ function isStructuralSchemaNode(schema: unknown): boolean {
107
+ if (!schema || typeof schema !== "object") return false;
108
+ const def = (schema as { _zod?: { def?: Record<string, unknown> } })._zod?.def;
109
+ if (!def || typeof def !== "object") return false;
110
+ if (def.coerce) return false;
111
+ if (Array.isArray(def.checks) && def.checks.length > 0) return false;
112
+ switch (def.type) {
113
+ case "string":
114
+ case "number":
115
+ return !def.format;
116
+ case "boolean":
117
+ case "literal":
118
+ case "enum":
119
+ return true;
120
+ case "optional":
121
+ case "nullable":
122
+ return isStructuralSchemaNode(def.innerType);
123
+ case "array":
124
+ return isStructuralSchemaNode(def.element);
125
+ case "object": {
126
+ const rawShape = typeof def.shape === "function" ? def.shape() : def.shape;
127
+ if (!rawShape || typeof rawShape !== "object") return false;
128
+ return Object.values(rawShape as Record<string, unknown>).every(isStructuralSchemaNode);
129
+ }
130
+ default:
131
+ return false;
132
+ }
133
+ }
@@ -6,16 +6,18 @@ import { createValueScrubber, scrubObject, scrubSecrets } from "../utils/secret-
6
6
  import type { ScriptApiConnectionDescriptor, ScriptMcpConnectionDescriptor } from "./api-types";
7
7
  import type { FailedCredentialBinding } from "./credential-broker";
8
8
  import { buildEgressSecrets } from "./egress-secrets";
9
- import { getScriptExecutor } from "./executors/registry";
9
+ import { isExecutorAllowedByDeployment, resolveScriptExecutor } from "./executors/registry";
10
10
  import {
11
11
  DEFAULT_SCRIPT_RESOURCES,
12
12
  type EgressSecretEntry,
13
13
  type ExecutorOutput,
14
14
  type ScriptAgentFsDescriptor,
15
+ type ScriptExecutorName,
15
16
  type ScriptFsMode,
16
17
  type ScriptResourcePolicy,
17
18
  type SwarmConfigPayload,
18
19
  } from "./executors/types";
20
+ import { HOST_VALIDATED_ARGS } from "./host-validated-args";
19
21
  import { validateScriptImports } from "./import-allowlist";
20
22
 
21
23
  /**
@@ -38,7 +40,19 @@ const CAPACITY_EXCEEDED_RETRY_DELAYS_MS = [200, 750];
38
40
  export type RunScriptInput = {
39
41
  source: string;
40
42
  args?: unknown;
43
+ /**
44
+ * Unforgeable host-only capability symbol set only when the host has already
45
+ * validated `args` against the script's `argsJsonSchema` (e.g. `POST /api/x/script/{endpointId}`).
46
+ * Keyed by a `Symbol` so request-shaped JSON inputs forwarded into `RunScriptInput`
47
+ * can never opt out of `argsSchema` validation.
48
+ */
49
+ [HOST_VALIDATED_ARGS]?: boolean;
41
50
  fsMode?: ScriptFsMode;
51
+ /**
52
+ * Optional per-script executor override ("native" | "quickjs"). When null or
53
+ * undefined, `getScriptExecutor` falls back to `SCRIPT_EXECUTOR ?? "native"`.
54
+ */
55
+ executor?: ScriptExecutorName | null;
42
56
  agentId: string;
43
57
  /**
44
58
  * Bearer for the run's `ctx.swarm` SDK calls. Api-side callers pass a
@@ -118,6 +132,18 @@ export async function runScript(input: RunScriptInput): Promise<RunScriptOutput>
118
132
  };
119
133
  }
120
134
 
135
+ if (!isExecutorAllowedByDeployment(input.executor)) {
136
+ return {
137
+ result: undefined,
138
+ stdout: "",
139
+ stderr: 'Executor "native" is not permitted when deployment SCRIPT_EXECUTOR="quickjs"',
140
+ truncated: { stdout: false, stderr: false },
141
+ durationMs: 0,
142
+ exitCode: 1,
143
+ error: "executor_error",
144
+ };
145
+ }
146
+
121
147
  // The global scrubber skips values under its length floor, so this run's own
122
148
  // secret config is redacted here at any length before the global pass. Built
123
149
  // before the import check: its diagnostic quotes source, which can hold a value.
@@ -150,6 +176,7 @@ export async function runScript(input: RunScriptInput): Promise<RunScriptOutput>
150
176
  const executorInput = {
151
177
  source: input.source,
152
178
  args: input.args ?? null,
179
+ ...(input[HOST_VALIDATED_ARGS] === true ? { hostValidatedArgs: true } : {}),
153
180
  configPayload,
154
181
  resources,
155
182
  fsMode: input.fsMode ?? "none",
@@ -157,11 +184,11 @@ export async function runScript(input: RunScriptInput): Promise<RunScriptOutput>
157
184
  signal: input.signal,
158
185
  };
159
186
 
160
- let output = await getScriptExecutor().run(executorInput);
187
+ let output = await resolveScriptExecutor(input.executor).run(executorInput);
161
188
  for (const delayMs of CAPACITY_EXCEEDED_RETRY_DELAYS_MS) {
162
189
  if (output.error !== "capacity_exceeded" || input.signal?.aborted) break;
163
190
  await Bun.sleep(delayMs);
164
- output = await getScriptExecutor().run(executorInput);
191
+ output = await resolveScriptExecutor(input.executor).run(executorInput);
165
192
  }
166
193
 
167
194
  return {
@@ -8,6 +8,7 @@ type BridgeRequest = {
8
8
  method: string;
9
9
  path: string;
10
10
  body?: unknown;
11
+ headers?: Record<string, string>;
11
12
  };
12
13
 
13
14
  function headers(config: SwarmConfig): Record<string, string> {
@@ -362,10 +363,16 @@ function bridgeRequestFor(name: string, args: unknown): BridgeRequest | null {
362
363
  case "workflow_trigger": {
363
364
  const id = typeof body.id === "string" ? body.id : undefined;
364
365
  if (!id) throw new Error("workflow_trigger requires string `id`");
366
+ const path = `/api/workflows/${encodeURIComponent(id)}/trigger`;
365
367
  return {
366
368
  method: "POST",
367
- path: `/api/workflows/${encodeURIComponent(id)}/trigger`,
369
+ path: body.wait === false ? `${path}?wait=false` : path,
368
370
  body: body.triggerData ?? {},
371
+ // The route's own Idempotency-Key: recorded in the run's transaction,
372
+ // so a retry after a kill replays the run instead of starting another.
373
+ ...(typeof body.idempotencyKey === "string"
374
+ ? { headers: { "Idempotency-Key": body.idempotencyKey } }
375
+ : {}),
369
376
  };
370
377
  }
371
378
  case "workflow_retryRun": {
@@ -491,7 +498,7 @@ async function callBridgeApi(
491
498
 
492
499
  const res = await fetch(`${baseUrl}${request.path}`, {
493
500
  method: request.method,
494
- headers: headers(config),
501
+ headers: { ...headers(config), ...request.headers },
495
502
  body: request.body === undefined ? undefined : JSON.stringify(request.body),
496
503
  });
497
504
  const data = await readScriptSdkJsonResponse(res, `ctx.swarm.${name}`);
@@ -26,6 +26,7 @@ declare module "swarm-sdk" {
26
26
  | { [key: string]: JsonValue };
27
27
  export type ScriptScope = "agent" | "global";
28
28
  export type ScriptFsMode = "none" | "workspace-rw";
29
+ export type ScriptExecutorName = "native" | "quickjs";
29
30
  export type ScriptApiRawOptions = { raw: true };
30
31
  export type ScriptApiDefaultOptions = { raw?: false };
31
32
  export type RoutingReason =
@@ -304,6 +305,7 @@ declare module "swarm-sdk" {
304
305
  intent?: string;
305
306
  scope?: ScriptScope;
306
307
  fsMode?: ScriptFsMode;
308
+ executor?: ScriptExecutorName | null;
307
309
  idempotencyKey?: string;
308
310
  }): Promise<unknown>;
309
311
  // --- swarm / agent ---
@@ -535,7 +537,12 @@ declare module "swarm-sdk" {
535
537
  workflow_patch(args: Record<string, unknown>): Promise<unknown>;
536
538
  workflow_patchNode(args: Record<string, unknown>): Promise<unknown>;
537
539
  workflow_delete(args: { id: string }): Promise<unknown>;
538
- workflow_trigger(args: { id: string; triggerData?: Record<string, unknown> }): Promise<unknown>;
540
+ workflow_trigger(args: {
541
+ id: string;
542
+ triggerData?: Record<string, unknown>;
543
+ wait?: boolean;
544
+ idempotencyKey?: string;
545
+ }): Promise<unknown>;
539
546
  workflow_retryRun(args: { id: string }): Promise<unknown>;
540
547
  workflow_cancelRun(args: { id: string }): Promise<unknown>;
541
548
 
@@ -552,6 +559,7 @@ declare module "swarm-sdk" {
552
559
  intent?: string;
553
560
  scope?: ScriptScope;
554
561
  fsMode?: ScriptFsMode;
562
+ executor?: ScriptExecutorName | null;
555
563
  }): Promise<unknown>;
556
564
  script_delete(args: { name: string; scope?: ScriptScope }): Promise<unknown>;
557
565
  script_queryTypes(args: { name: string; scope?: ScriptScope }): Promise<unknown>;
@@ -8,6 +8,7 @@ declare module "swarm-sdk" {
8
8
  | { [key: string]: JsonValue };
9
9
  export type ScriptScope = "agent" | "global";
10
10
  export type ScriptFsMode = "none" | "workspace-rw";
11
+ export type ScriptExecutorName = "native" | "quickjs";
11
12
  export type ScriptApiRawOptions = { raw: true };
12
13
  export type ScriptApiDefaultOptions = { raw?: false };
13
14
  export type RoutingReason =
@@ -286,6 +287,7 @@ declare module "swarm-sdk" {
286
287
  intent?: string;
287
288
  scope?: ScriptScope;
288
289
  fsMode?: ScriptFsMode;
290
+ executor?: ScriptExecutorName | null;
289
291
  idempotencyKey?: string;
290
292
  }): Promise<unknown>;
291
293
  // --- swarm / agent ---
@@ -517,7 +519,12 @@ declare module "swarm-sdk" {
517
519
  workflow_patch(args: Record<string, unknown>): Promise<unknown>;
518
520
  workflow_patchNode(args: Record<string, unknown>): Promise<unknown>;
519
521
  workflow_delete(args: { id: string }): Promise<unknown>;
520
- workflow_trigger(args: { id: string; triggerData?: Record<string, unknown> }): Promise<unknown>;
522
+ workflow_trigger(args: {
523
+ id: string;
524
+ triggerData?: Record<string, unknown>;
525
+ wait?: boolean;
526
+ idempotencyKey?: string;
527
+ }): Promise<unknown>;
521
528
  workflow_retryRun(args: { id: string }): Promise<unknown>;
522
529
  workflow_cancelRun(args: { id: string }): Promise<unknown>;
523
530
 
@@ -534,6 +541,7 @@ declare module "swarm-sdk" {
534
541
  intent?: string;
535
542
  scope?: ScriptScope;
536
543
  fsMode?: ScriptFsMode;
544
+ executor?: ScriptExecutorName | null;
537
545
  }): Promise<unknown>;
538
546
  script_delete(args: { name: string; scope?: ScriptScope }): Promise<unknown>;
539
547
  script_queryTypes(args: { name: string; scope?: ScriptScope }): Promise<unknown>;