@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
@@ -17,6 +17,7 @@ import {
17
17
  getWorkflowRunStatus,
18
18
  getChildWorkflowRunId,
19
19
  isParentStepAttemptCurrent,
20
+ emitRunFinished,
20
21
  createForeachChildSteps,
21
22
  init_workflow_runs,
22
23
  isApiOnlyConfigKey,
@@ -55,30 +56,30 @@ import {
55
56
  releaseApprovalCancellationNotificationClaim2,
56
57
  updateApprovalRequestNotifications2,
57
58
  init_db3
58
- } from "./cli-g8ka5j4j.js";
59
+ } from "./cli-qvaa1gjp.js";
59
60
  import {
60
61
  isMultiRuntimeEnabled
61
62
  } from "./cli-e8xyjvfc.js";
62
63
  import {
63
64
  getSlackApp2
64
- } from "./cli-g20jjwt4.js";
65
+ } from "./cli-thsaq4pd.js";
65
66
  import {
66
67
  externalChannelToolError2,
67
68
  isBlockExternalEnabled2,
68
69
  getChannelBlockReason2
69
- } from "./cli-gnsb1zxa.js";
70
+ } from "./cli-vhpckzvp.js";
70
71
  import {
71
72
  DEFAULT_MODEL,
72
73
  resolveCredential
73
- } from "./cli-v49fkghp.js";
74
+ } from "./cli-ekptgk2m.js";
74
75
  import {
75
76
  revokeRuntimeTokensForRuntime,
76
77
  init_users
77
- } from "./cli-esakngh8.js";
78
+ } from "./cli-nf6k60sn.js";
78
79
  import {
79
80
  TERMINAL_TASK_STATUSES,
80
81
  init_types
81
- } from "./cli-4rf0f5vg.js";
82
+ } from "./cli-s504c3w7.js";
82
83
  import {
83
84
  getSlackConfiguration,
84
85
  isSlackConfigured,
@@ -87,7 +88,7 @@ import {
87
88
  import {
88
89
  selectCredential,
89
90
  init_credentials
90
- } from "./cli-1tem6ns9.js";
91
+ } from "./cli-gt4h8cxw.js";
91
92
  import {
92
93
  DEFAULT_OPENROUTER_BASE_URL,
93
94
  getOpenRouterBaseUrl,
@@ -99,7 +100,7 @@ import {
99
100
  init_template,
100
101
  resolveTemplate,
101
102
  init_resolver
102
- } from "./cli-dqygeeh5.js";
103
+ } from "./cli-b41p764a.js";
103
104
  import {
104
105
  init_zod
105
106
  } from "./cli-4chz1hye.js";
@@ -122,7 +123,7 @@ import {
122
123
  import {
123
124
  getAppUrl,
124
125
  init_constants2
125
- } from "./cli-gf2850q7.js";
126
+ } from "./cli-3cywb44q.js";
126
127
  import {
127
128
  isEnvFlagEnabled,
128
129
  init_env_flag
@@ -149,7 +150,7 @@ async function notifyAutomationPreflightFailure(preflight) {
149
150
  return;
150
151
  }
151
152
  try {
152
- const { getSlackApp } = await import("./app-k8a5cgpp.js");
153
+ const { getSlackApp } = await import("./app-d53yhykk.js");
153
154
  const app = getSlackApp();
154
155
  if (!app) {
155
156
  console.warn("[Automation Preflight] Slack not available, cannot send notification");
@@ -176,6 +177,7 @@ init_config();
176
177
  init_env_flag();
177
178
  init_secret_scrubber();
178
179
  init_db3();
180
+ init_workflow_runs();
179
181
  init_oauth();
180
182
  init_scrub_json();
181
183
  var NEEDS_SETUP_PREFIX = "needs_setup:";
@@ -438,6 +440,7 @@ async function recordWorkflowPreflightFailure(input) {
438
440
  timestamp,
439
441
  timestamp
440
442
  ]);
443
+ emitRunFinished(runId, input.workflowId, "failed");
441
444
  return {
442
445
  runId,
443
446
  recorded: await isFirstWorkflowPreflightFailureToday(input.workflowId, runId, now)
@@ -3812,6 +3815,18 @@ function resolveNodeTimeoutMs(node) {
3812
3815
  return config.timeout;
3813
3816
  return DEFAULT_NODE_TIMEOUT_MS;
3814
3817
  }
3818
+ function startStepDeadline(timeoutMs) {
3819
+ const controller = new AbortController;
3820
+ let timer;
3821
+ const expired = new Promise((_, reject) => {
3822
+ timer = setTimeout(() => {
3823
+ const error = new Error(`Step timed out after ${timeoutMs}ms`);
3824
+ reject(error);
3825
+ controller.abort(error);
3826
+ }, timeoutMs);
3827
+ });
3828
+ return { signal: controller.signal, expired, clear: () => clearTimeout(timer) };
3829
+ }
3815
3830
 
3816
3831
  // src/workflows/readiness.ts
3817
3832
  async function findWorkflowReadinessProblems(definition, registry) {
@@ -4011,8 +4026,9 @@ async function startWorkflowExecution2(workflow, triggerData, registry, options
4011
4026
  if (initial.status)
4012
4027
  return runId;
4013
4028
  const walk = walkGraph(workflow.definition, runId, initial.context, findEntryNodes(workflow.definition), registry, workflow.id, getSecretInputKeys(workflow.input), options);
4014
- if (options.parentStepId) {
4015
- walk.catch((err) => console.error(`[workflows] Child workflow run ${runId} failed:`, err));
4029
+ if (options.parentStepId || options.detach) {
4030
+ const kind = options.parentStepId ? "Child" : "Detached";
4031
+ walk.catch((err) => console.error(`[workflows] ${kind} workflow run ${runId} failed:`, err));
4016
4032
  return runId;
4017
4033
  }
4018
4034
  await walk;
@@ -4487,17 +4503,17 @@ async function runClaimedStep(def, runId, ctx, node, registry, existingStep, ste
4487
4503
  requestedByUserId: options.requestedByUserId,
4488
4504
  inputCtx: interpolationCtx
4489
4505
  };
4490
- const timeoutMs = resolveNodeTimeoutMs(node);
4506
+ const deadline = startStepDeadline(resolveNodeTimeoutMs(node));
4491
4507
  let result;
4492
4508
  try {
4493
4509
  result = await Promise.race([
4494
4510
  executor.run({
4495
4511
  config: interpolatedConfig,
4496
4512
  context: executionCtx,
4497
- meta
4513
+ meta: { ...meta, signal: deadline.signal }
4498
4514
  }),
4499
- timeoutPromise(timeoutMs)
4500
- ]);
4515
+ deadline.expired
4516
+ ]).finally(deadline.clear);
4501
4517
  } catch (err) {
4502
4518
  const errorMsg = err instanceof Error ? err.message : String(err);
4503
4519
  const retryPolicy = node.retry || executor.retryPolicy;
@@ -4536,7 +4552,7 @@ async function runClaimedStep(def, runId, ctx, node, registry, existingStep, ste
4536
4552
  }
4537
4553
  const waiting = await checkpointStepWaiting(runId, stepId, ctx);
4538
4554
  if (waiting && result.waitFor === "workflow.child.finished") {
4539
- const { resumeFromChildRun } = await import("./resume-8ayf37g5.js");
4555
+ const { resumeFromChildRun } = await import("./resume-725g9b0b.js");
4540
4556
  await resumeFromChildRun(stepId, registry);
4541
4557
  }
4542
4558
  return { outcome: waiting ? "waiting" : "completed", successors: [] };
@@ -4741,11 +4757,6 @@ function scriptBodyInterpolationError(nodeId, tokens) {
4741
4757
  const renderedTokens = [...new Set(tokens)].map((token) => `{{${token}}}`).join(", ");
4742
4758
  return `Script body interpolation failed for node "${nodeId}": unresolved or disallowed token(s): ${renderedTokens}. Executable source may interpolate only input, workflow, swarm, or run values. Pass dynamic trigger or upstream values through config.args and read them from argv.`;
4743
4759
  }
4744
- function timeoutPromise(ms) {
4745
- return new Promise((_, reject) => {
4746
- setTimeout(() => reject(new Error(`Step timed out after ${ms}ms`)), ms);
4747
- });
4748
- }
4749
4760
 
4750
4761
  // src/workflows/executors/foreach.ts
4751
4762
  init_zod();
@@ -4998,7 +5009,7 @@ async function runForeachDrive(runId, parentNodeId, registry) {
4998
5009
  if (drive.successors.length > 0) {
4999
5010
  await walkGraph(workflow.definition, runId, ctx, drive.successors, registry, workflow.id, getSecretInputKeys(workflow.input));
5000
5011
  } else {
5001
- const { finalizeOrWait } = await import("./resume-8ayf37g5.js");
5012
+ const { finalizeOrWait } = await import("./resume-725g9b0b.js");
5002
5013
  await finalizeOrWait(runId);
5003
5014
  }
5004
5015
  return drive;
@@ -5114,25 +5125,21 @@ async function startChild(input) {
5114
5125
  }
5115
5126
  }
5116
5127
  const executor = registry.get(bodyType);
5117
- const timeoutMs = resolveNodeTimeoutMs({ type: bodyType, config });
5118
- let timer;
5128
+ const deadline = startStepDeadline(resolveNodeTimeoutMs({ type: bodyType, config }));
5119
5129
  let result;
5120
5130
  try {
5121
5131
  result = await Promise.race([
5122
5132
  executor.run({
5123
5133
  config,
5124
5134
  context: { ...ctx, ...bodyCtx },
5125
- meta: { ...meta, stepId: child.id, nodeId: child.nodeId }
5135
+ meta: { ...meta, stepId: child.id, nodeId: child.nodeId, signal: deadline.signal }
5126
5136
  }),
5127
- new Promise((_, reject) => {
5128
- timer = setTimeout(() => reject(new Error(`Step timed out after ${timeoutMs}ms`)), timeoutMs);
5129
- })
5137
+ deadline.expired
5130
5138
  ]);
5131
5139
  } catch (err) {
5132
5140
  return { status: "failed", error: err instanceof Error ? err.message : String(err) };
5133
5141
  } finally {
5134
- if (timer)
5135
- clearTimeout(timer);
5142
+ deadline.clear();
5136
5143
  }
5137
5144
  if (result.status === "failed") {
5138
5145
  return {
@@ -5145,7 +5152,7 @@ async function startChild(input) {
5145
5152
  const parked = await getDbClient2().get("UPDATE workflow_run_steps SET status = 'waiting' WHERE id = ? AND status = 'running' RETURNING id", [child.id]);
5146
5153
  if (parked && result.waitFor === "workflow.child.finished") {
5147
5154
  ownedChildren.delete(child.id);
5148
- const { resumeFromChildRun } = await import("./resume-8ayf37g5.js");
5155
+ const { resumeFromChildRun } = await import("./resume-725g9b0b.js");
5149
5156
  await resumeFromChildRun(child.id, registry);
5150
5157
  }
5151
5158
  return null;
@@ -98,7 +98,7 @@ import {
98
98
  init_src,
99
99
  selectCredential,
100
100
  init_credentials
101
- } from "./cli-1tem6ns9.js";
101
+ } from "./cli-gt4h8cxw.js";
102
102
  import {
103
103
  __export
104
104
  } from "./cli-242037k3.js";
@@ -13228,9 +13228,9 @@ function registerBunOAuthFlows() {
13228
13228
  }
13229
13229
 
13230
13230
  // node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.lazy.js
13231
- var anthropicMessagesApi = () => lazyApi(() => import("./anthropic-messages-txs190dd.js"));
13231
+ var anthropicMessagesApi = () => lazyApi(() => import("./anthropic-messages-n4cby1rz.js"));
13232
13232
  // node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.lazy.js
13233
- var azureOpenAIResponsesApi = () => lazyApi(() => import("./azure-openai-responses-9kfwhmn7.js"));
13233
+ var azureOpenAIResponsesApi = () => lazyApi(() => import("./azure-openai-responses-43asa23s.js"));
13234
13234
  // node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.js
13235
13235
  var googleGenerativeAIApi = () => lazyApi(() => import("./google-generative-ai-mk9vcpe1.js"));
13236
13236
  // node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.js
@@ -13238,11 +13238,11 @@ var googleVertexApi = () => lazyApi(() => import("./google-vertex-q580kz8k.js"))
13238
13238
  // node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.lazy.js
13239
13239
  var mistralConversationsApi = () => lazyApi(() => import("./mistral-conversations-sd0xf1tn.js"));
13240
13240
  // node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.js
13241
- var openAICodexResponsesApi = () => lazyApi(() => import("./openai-codex-responses-79s8xnbh.js"));
13241
+ var openAICodexResponsesApi = () => lazyApi(() => import("./openai-codex-responses-jhr3sjtm.js"));
13242
13242
  // node_modules/@earendil-works/pi-ai/dist/api/openai-completions.lazy.js
13243
- var openAICompletionsApi = () => lazyApi(() => import("./openai-completions-tdbyts0x.js"));
13243
+ var openAICompletionsApi = () => lazyApi(() => import("./openai-completions-gs6yn37k.js"));
13244
13244
  // node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.js
13245
- var openAIResponsesApi = () => lazyApi(() => import("./openai-responses-dm3t5vqp.js"));
13245
+ var openAIResponsesApi = () => lazyApi(() => import("./openai-responses-jqm9vwwk.js"));
13246
13246
  // node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js
13247
13247
  var piMessagesApi = () => lazyApi(() => import("./pi-messages-3nf8bq1a.js"));
13248
13248
  // node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json
@@ -4,7 +4,7 @@ import {
4
4
  CONTROLLER_COMMAND_TIMEOUT_MS,
5
5
  RuntimeHandleSchema,
6
6
  ControllerStatusResultSchema
7
- } from "./cli-d2dpf95n.js";
7
+ } from "./cli-rg4b2g6j.js";
8
8
  import {
9
9
  getDbClient2,
10
10
  isRuntimePoolsEnabled,
@@ -21,11 +21,11 @@ import {
21
21
  upsertSwarmConfig2,
22
22
  getResolvedConfig2,
23
23
  init_db3
24
- } from "./cli-g8ka5j4j.js";
24
+ } from "./cli-qvaa1gjp.js";
25
25
  import {
26
26
  createWorkerTaskFollowUp,
27
27
  canClaim
28
- } from "./cli-4hxrf0p4.js";
28
+ } from "./cli-pzafyqtk.js";
29
29
  import {
30
30
  getRuntimeController2,
31
31
  getRuntimeControllerTarget2,
@@ -36,7 +36,7 @@ import {
36
36
  getPoolForAgent2,
37
37
  resolvePoolDelivery2,
38
38
  init_db
39
- } from "./cli-gf95q3bm.js";
39
+ } from "./cli-6vwjsetx.js";
40
40
  import {
41
41
  runtimeStaleThresholdMinutes,
42
42
  getRuntimeInstanceById,
@@ -44,7 +44,7 @@ import {
44
44
  markRuntimeTerminated,
45
45
  listRuntimeInstancesForAgent,
46
46
  listRuntimeInstancesForPool
47
- } from "./cli-3fwqy71j.js";
47
+ } from "./cli-dv11pgpv.js";
48
48
  import {
49
49
  isMultiRuntimeEnabled
50
50
  } from "./cli-e8xyjvfc.js";
@@ -55,20 +55,28 @@ import {
55
55
  import {
56
56
  import_websocket
57
57
  } from "./cli-b2mz5mjc.js";
58
+ import {
59
+ resolveWorkerApiUrl,
60
+ init_worker_api_url
61
+ } from "./cli-wtjg6je3.js";
62
+ import {
63
+ buildImageTemplate,
64
+ init_dispatch
65
+ } from "./cli-tf1n0r0b.js";
58
66
  import {
59
67
  canProvisionKind,
60
68
  createRuntimeProvider,
61
69
  init_runtime_providers
62
- } from "./cli-39aet655.js";
70
+ } from "./cli-m52t4cta.js";
63
71
  import {
64
72
  mintRuntimeToken,
65
73
  init_users
66
- } from "./cli-esakngh8.js";
74
+ } from "./cli-nf6k60sn.js";
67
75
  import {
68
76
  TERMINAL_TASK_STATUSES,
69
77
  isTerminalTaskStatus,
70
78
  init_types
71
- } from "./cli-4rf0f5vg.js";
79
+ } from "./cli-s504c3w7.js";
72
80
  import {
73
81
  init_zod
74
82
  } from "./cli-4chz1hye.js";
@@ -81,14 +89,6 @@ import {
81
89
  realtimeBus,
82
90
  init_bus
83
91
  } from "./cli-syfdvhkc.js";
84
- import {
85
- resolveWorkerApiUrl,
86
- init_worker_api_url
87
- } from "./cli-7a6p4e65.js";
88
- import {
89
- buildImageTemplate,
90
- init_dispatch
91
- } from "./cli-tf1n0r0b.js";
92
92
  import {
93
93
  RUNTIME_LABELS,
94
94
  init_types2
@@ -524,7 +524,7 @@ async function recoverSessions(runtimeId, reason) {
524
524
  }
525
525
  if (!sessions.length)
526
526
  return;
527
- const { remediateTaskForDeadRuntime } = await import("./heartbeat-vn31xwdk.js");
527
+ const { remediateTaskForDeadRuntime } = await import("./heartbeat-f928aqyp.js");
528
528
  for (const session of sessions) {
529
529
  try {
530
530
  const task = await getTaskById2(session.taskId);
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  applyOpenRouterBaseUrlOverride2,
16
16
  buildOpenAICompatibleProviderBlock2
17
- } from "./cli-9abdgn5t.js";
17
+ } from "./cli-dgtfysne.js";
18
18
  import {
19
19
  fetchInstalledMcpServers
20
20
  } from "./cli-bst1vp7e.js";
@@ -44,7 +44,7 @@ import {
44
44
  import {
45
45
  init_package,
46
46
  package_default
47
- } from "./cli-nn6vx2mq.js";
47
+ } from "./cli-swkx9jm2.js";
48
48
  import {
49
49
  scrubSecrets,
50
50
  init_secret_scrubber
@@ -750,9 +750,10 @@ async function fetchAvailableIndices(env, apiUrl, apiKey, poolVars = CREDENTIAL_
750
750
  for (const envVar of poolVars) {
751
751
  const val = env[envVar];
752
752
  if (val) {
753
- const totalKeys = val.includes(",") ? val.split(",").filter((s) => s.trim()).length : 1;
753
+ const keySuffixes = splitCredentialPool(val).map((key) => key.slice(-5));
754
+ const totalKeys = keySuffixes.length;
754
755
  try {
755
- const resp = await fetch(`${apiUrl}/api/keys/available?keyType=${encodeURIComponent(envVar)}&totalKeys=${totalKeys}${modelParam}`, { headers: { Authorization: `Bearer ${apiKey}` } });
756
+ const resp = await fetch(`${apiUrl}/api/keys/available?keyType=${encodeURIComponent(envVar)}&totalKeys=${totalKeys}${modelParam}&keySuffixes=${encodeURIComponent(keySuffixes.join(","))}`, { headers: { Authorization: `Bearer ${apiKey}` } });
756
757
  if (resp.ok) {
757
758
  const data = await resp.json();
758
759
  availableIndicesMap[envVar] = {
@@ -1,12 +1,12 @@
1
1
  import {
2
- require_src
3
- } from "./cli-dv97kdzv.js";
2
+ require_src2
3
+ } from "./cli-wdxgsdz5.js";
4
4
  import {
5
5
  __toESM
6
6
  } from "./cli-242037k3.js";
7
7
 
8
8
  // src/providers/otel-env.ts
9
- var import_api = __toESM(require_src(), 1);
9
+ var import_api = __toESM(require_src2(), 1);
10
10
  function isTruthy(value) {
11
11
  const v = (value ?? "").toLowerCase();
12
12
  return v === "1" || v === "true" || v === "yes" || v === "on";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Anthropic
3
- } from "./cli-rr7zx19j.js";
3
+ } from "./cli-prcyzecg.js";
4
4
  import {
5
5
  contextBoundNoteThreshold,
6
6
  createContextBoundNote
7
- } from "./cli-nq677csy.js";
7
+ } from "./cli-dscnhn18.js";
8
8
  import {
9
9
  checkToolLoop
10
10
  } from "./cli-0726awxw.js";
@@ -24,7 +24,7 @@ import {
24
24
  import {
25
25
  selectCredential,
26
26
  init_credentials
27
- } from "./cli-1tem6ns9.js";
27
+ } from "./cli-gt4h8cxw.js";
28
28
  import {
29
29
  runtimeCatalogModel,
30
30
  init_runtime_model_catalog
@@ -4,11 +4,11 @@ import {
4
4
  invalidateTelemetryUserRole,
5
5
  init_telemetry_identity,
6
6
  init_db3
7
- } from "./cli-g8ka5j4j.js";
7
+ } from "./cli-qvaa1gjp.js";
8
8
  import {
9
9
  PermissionVerbSchema,
10
10
  init_rbac
11
- } from "./cli-4rvr7zfx.js";
11
+ } from "./cli-k4awgvzm.js";
12
12
  import {
13
13
  init_env_flag
14
14
  } from "./cli-cebvbc9t.js";
@@ -276,7 +276,10 @@ var init_rbac_roles = __esm(() => {
276
276
  "task.fs.mutate",
277
277
  "favorite.write.own",
278
278
  "session.share",
279
- "session.presence"
279
+ "session.presence",
280
+ "task.steer.own",
281
+ "comb.presence",
282
+ "fs.join.own"
280
283
  ]
281
284
  },
282
285
  {
@@ -285,7 +288,7 @@ var init_rbac_roles = __esm(() => {
285
288
  description: "Read-only: no task, approval or script writes.",
286
289
  isBuiltin: true,
287
290
  grantsAll: false,
288
- verbs: ["favorite.write.own", "session.presence"]
291
+ verbs: ["favorite.write.own", "session.presence", "comb.presence", "fs.join.own"]
289
292
  }
290
293
  ];
291
294
  PRIMARY_ROLE_NAMES2 = ["admin", "requester", "viewer"];
@@ -9,21 +9,21 @@ import {
9
9
  init_active_sessions,
10
10
  getSteeringMessageById2,
11
11
  init_db3
12
- } from "./cli-g8ka5j4j.js";
12
+ } from "./cli-qvaa1gjp.js";
13
13
  import {
14
14
  getUserGrant2,
15
15
  init_rbac_roles
16
- } from "./cli-a2rr0fmg.js";
16
+ } from "./cli-hpkvgdad.js";
17
17
  import {
18
18
  findUserById,
19
19
  findUserByExternalId,
20
20
  init_users
21
- } from "./cli-esakngh8.js";
21
+ } from "./cli-nf6k60sn.js";
22
22
  import {
23
23
  isRbacEnabled,
24
24
  can,
25
25
  init_rbac
26
- } from "./cli-4rvr7zfx.js";
26
+ } from "./cli-k4awgvzm.js";
27
27
  import {
28
28
  init_zod
29
29
  } from "./cli-4chz1hye.js";
@@ -203,19 +203,33 @@ function wireHttpSpanLifecycle(res, span, getStatusCode, startTime) {
203
203
  span.end();
204
204
  });
205
205
  }
206
+ function redactShareTokenInPath(pathname) {
207
+ const segments = pathname.split("/");
208
+ if (segments[1] === "invite" && segments[2]) {
209
+ segments[2] = "[REDACTED]";
210
+ return segments.join("/");
211
+ }
212
+ const at = segments[1] === "agentfs" ? 2 : 1;
213
+ if ((segments[at] === "share" || segments[at] === "site") && segments[at + 1]) {
214
+ segments[at + 1] = "[REDACTED]";
215
+ return segments.join("/");
216
+ }
217
+ return pathname;
218
+ }
206
219
  function safeRequestUrlForLog(rawUrl) {
207
220
  if (!rawUrl)
208
221
  return "";
209
222
  try {
210
223
  const url = new URL(rawUrl, "http://localhost");
224
+ const pathname = redactShareTokenInPath(url.pathname);
211
225
  const params = Array.from(url.searchParams.keys());
212
226
  if (params.length === 0)
213
- return url.pathname;
227
+ return pathname;
214
228
  const redactedQuery = params.map((key) => `${key}=[REDACTED]`).join("&");
215
- return `${url.pathname}?${redactedQuery}`;
229
+ return `${pathname}?${redactedQuery}`;
216
230
  } catch {
217
231
  const pathOnly = rawUrl.split("?")[0] || rawUrl;
218
- return scrubSecrets(pathOnly);
232
+ return scrubSecrets(redactShareTokenInPath(pathOnly));
219
233
  }
220
234
  }
221
235
  async function agentWithCapacity(agent) {
@@ -503,7 +517,7 @@ function route(def) {
503
517
  try {
504
518
  const rawBody = def.body ? await parseBody(req, def.maxBodyBytes) : undefined;
505
519
  if (def.session && "bodyTaskIds" in def.session) {
506
- const { bodySessionDenial } = await import("./session-access-fdhp987s.js");
520
+ const { bodySessionDenial } = await import("./session-access-0j2ezjje.js");
507
521
  const denial = await bodySessionDenial(req, def.session.bodyTaskIds(rawBody));
508
522
  if (denial) {
509
523
  jsonError(res, denial, 403);
@@ -775,6 +789,20 @@ async function hasSessionWrite2(req, myAgentId, taskId) {
775
789
  const access = await sessionAccessFor2(await resolveSessionActor2(req, myAgentId), taskId);
776
790
  return hasSessionAccess(access, "write");
777
791
  }
792
+ var NOT_YOUR_TASK_DENIED2 = "You can only change tasks you requested, or sessions shared with you to edit.";
793
+ async function deniesNonOwnerTaskWrite2(req, task) {
794
+ const auth = getRequestAuth(req);
795
+ if (auth?.kind !== "user" || !isRbacEnabled())
796
+ return false;
797
+ if (task.requestedByUserId === auth.userId)
798
+ return false;
799
+ if ((await getUserGrant2(auth.userId)).grantsAll)
800
+ return false;
801
+ const root = await getSessionRoot(task.id);
802
+ if (!root?.requestedByUserId)
803
+ return true;
804
+ return !hasSessionAccess(await sessionAccessForRoot(auth.userId, root), "write");
805
+ }
778
806
  async function denyParentAttach2(req, res, myAgentId, parentTask, principal) {
779
807
  const attach = can({
780
808
  principal,
@@ -873,4 +901,4 @@ async function userAgentIdentityDenial2(req, def, pathSegments) {
873
901
  return USER_AGENT_HEADER_DENIED;
874
902
  }
875
903
 
876
- export { duplicateGuardedQueryKey, warnIfCorsAllowsAnyOrigin, isOriginAllowedForCredentials, allowedCredentialRedirect, setCorsHeaders, parseQueryParams, getPathSegments, wireHttpSpanLifecycle, safeRequestUrlForLog, agentWithCapacity, RequestBodyTooLargeError, parseBody, BODY_TOO_LARGE, enforceContentLengthCap, json, jsonError, writeUnhandledError, triggerSchemaErrorResponse, deriveApiBaseUrl, httpServerSemconvAttributes, hasSessionAccess, getSessionRoot, sessionAccessForRoot, listActiveSessionShares, toSessionSharesState, setSessionShares, resolveTaskAuditUserId, resolveHttpAuditUserId, dashboardUserIdHeader, resolveHttpFavoriteOwner, resolveSessionActor2, sessionAccessFor2, SESSION_READ_DENIED2, canReadSession2, readableByFor2, SESSION_WRITE_DENIED2, hasSessionWrite2, denyParentAttach2, pathSessionDenial2, bodySessionDenial2, userAgentIdentityDenial2, runtimeInstanceHeader, bodyTask, bodyListTask, routeRegistry, isPublicRoute, findRoute, describeRequestRoute, route };
904
+ export { duplicateGuardedQueryKey, warnIfCorsAllowsAnyOrigin, isOriginAllowedForCredentials, allowedCredentialRedirect, setCorsHeaders, parseQueryParams, getPathSegments, wireHttpSpanLifecycle, redactShareTokenInPath, safeRequestUrlForLog, agentWithCapacity, RequestBodyTooLargeError, parseBody, BODY_TOO_LARGE, enforceContentLengthCap, json, jsonError, writeUnhandledError, triggerSchemaErrorResponse, deriveApiBaseUrl, httpServerSemconvAttributes, hasSessionAccess, getSessionRoot, sessionAccessForRoot, listActiveSessionShares, toSessionSharesState, setSessionShares, resolveTaskAuditUserId, resolveHttpAuditUserId, dashboardUserIdHeader, resolveHttpFavoriteOwner, resolveSessionActor2, sessionAccessFor2, SESSION_READ_DENIED2, canReadSession2, readableByFor2, SESSION_WRITE_DENIED2, hasSessionWrite2, NOT_YOUR_TASK_DENIED2, deniesNonOwnerTaskWrite2, denyParentAttach2, pathSessionDenial2, bodySessionDenial2, userAgentIdentityDenial2, runtimeInstanceHeader, bodyTask, bodyListTask, routeRegistry, isPublicRoute, findRoute, describeRequestRoute, route };
@@ -10,7 +10,7 @@ import {
10
10
  init_steering,
11
11
  createLogEntry2,
12
12
  init_db3
13
- } from "./cli-g8ka5j4j.js";
13
+ } from "./cli-qvaa1gjp.js";
14
14
  import {
15
15
  ackSlackMessage,
16
16
  buildBufferFlushBlocks,
@@ -20,7 +20,7 @@ import {
20
20
  ensureSlackThreadTree2,
21
21
  registerTreeMessage,
22
22
  getSlackApp2
23
- } from "./cli-g20jjwt4.js";
23
+ } from "./cli-thsaq4pd.js";
24
24
  import {
25
25
  createAdditiveBuffer,
26
26
  TaskCreationBlockedError,
@@ -30,15 +30,15 @@ import {
30
30
  createSlackTaskWithFiles,
31
31
  notifySlackFileFailures,
32
32
  extractSlackMessageText
33
- } from "./cli-4hxrf0p4.js";
33
+ } from "./cli-pzafyqtk.js";
34
34
  import {
35
35
  resolveSlackUserId,
36
36
  rewriteSlackMentions
37
- } from "./cli-24j1jeeb.js";
37
+ } from "./cli-y4tdxsqb.js";
38
38
  import {
39
39
  findUserByExternalId,
40
40
  init_users
41
- } from "./cli-esakngh8.js";
41
+ } from "./cli-nf6k60sn.js";
42
42
  import {
43
43
  isSteeringEnabled2,
44
44
  init_steering_enabled
@@ -306,6 +306,7 @@ var init_legacy_policy = __esm(() => {
306
306
  "mcp-oauth.authorize.any": anyAuthenticated,
307
307
  "kv.write.any": leadOrOwnNamespace,
308
308
  "comb.presence": operatorOrUser,
309
+ "fs.join.own": anyAuthenticated,
309
310
  "page.delete.any": leadOrResourceOwner,
310
311
  "app.manage": anyAuthenticated,
311
312
  "app.use": anyAuthenticated,
@@ -640,6 +641,10 @@ var init_permissions = __esm(() => {
640
641
  description: "Use dashboard presence rooms for Comb drives.",
641
642
  namespace: "comb"
642
643
  },
644
+ "fs.join.own": {
645
+ description: "Join the swarm's shared agent-fs drive with your own account email.",
646
+ namespace: "fs"
647
+ },
643
648
  "page.delete.any": {
644
649
  description: "Delete a page the caller does not own.",
645
650
  namespace: "page"
@@ -9,7 +9,7 @@ import {
9
9
  loadMcpConfig,
10
10
  addMcpServerConfig,
11
11
  removeMcpServerConfig
12
- } from "./cli-w2656ka1.js";
12
+ } from "./cli-0w4e4v58.js";
13
13
  import {
14
14
  McpOAuthCredentialStore2,
15
15
  McpSignInCancelledError2,
@@ -17,7 +17,7 @@ import {
17
17
  McpServerLog2,
18
18
  createDefaultTransport2,
19
19
  McpServerConnection2
20
- } from "./cli-683y0b3a.js";
20
+ } from "./cli-0dqtv2jg.js";
21
21
 
22
22
  // node_modules/@earendil-works/pi-coding-agent/dist/extensions/mcp/cli.js
23
23
  import { existsSync } from "node:fs";