@desplega.ai/agent-swarm 2.5.3 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +2 -2
  2. package/dist/{acp-adapter-gr2fcyyj.js → acp-adapter-dgfakfpw.js} +9 -9
  3. package/dist/{actions-wv766ghf.js → actions-fbqma8aa.js} +21 -21
  4. package/dist/{amp-adapter-speb906t.js → amp-adapter-en0jy6hs.js} +4 -4
  5. package/dist/{app-ag29n14f.js → app-k8a5cgpp.js} +3 -3
  6. package/dist/{assistant-3x8bz3eg.js → assistant-a16433gr.js} +30 -26
  7. package/dist/{boot-reembed-jsmfrpzf.js → boot-reembed-6c1sjfnr.js} +1 -1
  8. package/dist/{boot-reembed-5b3d2eea.js → boot-reembed-f4nn561n.js} +1 -1
  9. package/dist/{boot-scrub-sweep-s73gerxy.js → boot-scrub-sweep-d4w9gajf.js} +4 -4
  10. package/dist/{boot-seeds-5zmax2wr.js → boot-seeds-9bmkspyw.js} +4 -4
  11. package/dist/{claude-adapter-hswdnm3t.js → claude-adapter-nys1kjxa.js} +9 -9
  12. package/dist/{claude-managed-adapter-cvbzj1h6.js → claude-managed-adapter-55207973.js} +3 -3
  13. package/dist/{claude-managed-setup-3k8m3hhc.js → claude-managed-setup-3cm35gey.js} +11 -4
  14. package/dist/{claude-sdk-session-fkbyk66x.js → claude-sdk-session-nw5yd8cp.js} +9313 -9260
  15. package/dist/{cli-210xd1f4.js → cli-03gg9pd1.js} +4 -4
  16. package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
  17. package/dist/cli-1tem6ns9.js +894 -0
  18. package/dist/{cli-25j01dpj.js → cli-24j1jeeb.js} +3 -3
  19. package/dist/{cli-ta8bd7th.js → cli-2sjhpsns.js} +2 -2
  20. package/dist/{cli-p859hcc8.js → cli-39aet655.js} +2 -2
  21. package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
  22. package/dist/{cli-e2ar4bp1.js → cli-3aqd4jaa.js} +121 -47
  23. package/dist/{cli-jjznk3f7.js → cli-3fwqy71j.js} +69 -35
  24. package/dist/{cli-p9rafdrb.js → cli-3gfvmzht.js} +7 -7
  25. package/dist/{cli-03vpq45j.js → cli-3ndmpxxv.js} +2 -2
  26. package/dist/{cli-aecdcr77.js → cli-4hxrf0p4.js} +228 -74
  27. package/dist/{cli-mz9afxxf.js → cli-4rf0f5vg.js} +15 -3
  28. package/dist/{cli-qzme5949.js → cli-5rj83bam.js} +284 -202
  29. package/dist/{cli-fsdprwrg.js → cli-5sckpqcx.js} +2 -2
  30. package/dist/{cli-cz5nmdxt.js → cli-683y0b3a.js} +2 -2
  31. package/dist/{cli-3ngdk5te.js → cli-6y51ryva.js} +2 -2
  32. package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
  33. package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
  34. package/dist/{cli-gx4rm0qx.js → cli-7enjwya9.js} +1 -1
  35. package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
  36. package/dist/{cli-avdvgcay.js → cli-9abdgn5t.js} +28 -9
  37. package/dist/{cli-99xgw26r.js → cli-a2rr0fmg.js} +1 -1
  38. package/dist/{cli-e5bxnjps.js → cli-a34pr3w1.js} +7 -7
  39. package/dist/{cli-502eqv93.js → cli-abkm71vr.js} +1 -1
  40. package/dist/{cli-mmhj8vd7.js → cli-ag2yrnt5.js} +11 -2
  41. package/dist/{cli-n45mr7zh.js → cli-aj8djyqt.js} +5 -5
  42. package/dist/{cli-1fc85mvt.js → cli-art7c1zh.js} +5 -5
  43. package/dist/{cli-40jsnrjm.js → cli-az25fn5f.js} +10 -8
  44. package/dist/{cli-9s05422w.js → cli-bqztfyve.js} +1 -1
  45. package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
  46. package/dist/{cli-svrj71pg.js → cli-c2habvsf.js} +12 -12
  47. package/dist/{cli-s49hpn37.js → cli-ca6banwz.js} +85 -19
  48. package/dist/{cli-hhxjnjzs.js → cli-cz37jqss.js} +12 -10
  49. package/dist/{cli-6n8axjv1.js → cli-d2dpf95n.js} +2 -2
  50. package/dist/{cli-tx00c0h6.js → cli-dqygeeh5.js} +17 -1
  51. package/dist/{cli-z21whrrg.js → cli-emhjcj2y.js} +17 -17
  52. package/dist/{cli-e8jyq7d8.js → cli-esakngh8.js} +7 -3
  53. package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
  54. package/dist/{cli-35gtk1p6.js → cli-ffvsj2qw.js} +44 -13
  55. package/dist/{cli-ce0ak9ms.js → cli-g20jjwt4.js} +26 -26
  56. package/dist/{cli-kxawjrxg.js → cli-g8ka5j4j.js} +772 -194
  57. package/dist/{cli-vwn81jbs.js → cli-gf95q3bm.js} +5 -5
  58. package/dist/{cli-s53vp709.js → cli-gnsb1zxa.js} +2 -2
  59. package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
  60. package/dist/{cli-gpv60278.js → cli-hfeb68z4.js} +7 -7
  61. package/dist/{cli-0ebey9hg.js → cli-j6rktc91.js} +1 -1
  62. package/dist/{cli-ewm3pwbq.js → cli-k21gx5ht.js} +46 -23
  63. package/dist/{cli-egjggehm.js → cli-kf4jree9.js} +2 -2
  64. package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
  65. package/dist/{cli-p0rzjkya.js → cli-m5a9m0ak.js} +32 -13
  66. package/dist/{cli-fzcn3d87.js → cli-m70bajzr.js} +3 -3
  67. package/dist/{cli-w1zwctj2.js → cli-mtnj4fwa.js} +11 -5
  68. package/dist/{cli-gpsz7g88.js → cli-mvjz5an3.js} +16 -12
  69. package/dist/{cli-hcpj2xqz.js → cli-n7asmce6.js} +225 -3
  70. package/dist/{cli-y561h5a9.js → cli-nn6vx2mq.js} +5 -5
  71. package/dist/cli-nq677csy.js +140 -0
  72. package/dist/{cli-a5ebc95n.js → cli-pfk92eqz.js} +18 -15
  73. package/dist/{cli-p6zs9h4y.js → cli-rr7zx19j.js} +767 -249
  74. package/dist/{cli-qgf8emrn.js → cli-sqma6vw1.js} +10 -7
  75. package/dist/{cli-0xk505e8.js → cli-sxgtf5fw.js} +1 -1
  76. package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
  77. package/dist/{cli-qqzmjxkf.js → cli-v49fkghp.js} +11 -6
  78. package/dist/{cli-x77gen2p.js → cli-w2656ka1.js} +7 -7
  79. package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
  80. package/dist/{cli-8s5wx3nz.js → cli-zqne1qcj.js} +44 -17
  81. package/dist/cli.js +22 -22
  82. package/dist/{codex-adapter-n8ka66vf.js → codex-adapter-d95q4qsn.js} +7 -7
  83. package/dist/{codex-hook-e2he7aca.js → codex-hook-brpnycn5.js} +1 -1
  84. package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
  85. package/dist/{codex-session-runner-fsebts37.js → codex-session-runner-gdwd8h0c.js} +8 -8
  86. package/dist/{commands-t04rt2pc.js → commands-jqmgk54b.js} +2 -2
  87. package/dist/{controller-rgna04r2.js → controller-z3jq589f.js} +30 -4
  88. package/dist/{controllers-connect-bqm1rtft.js → controllers-connect-r2za39ef.js} +23 -23
  89. package/dist/{cursor-adapter-swr2k95y.js → cursor-adapter-4mr4jgkw.js} +2 -3
  90. package/dist/{db-a4m7haw0.js → db-ppv2tze7.js} +3 -3
  91. package/dist/{db-24ck09xy.js → db-w36wwb5g.js} +4 -2
  92. package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
  93. package/dist/{dispatcher-nwf9ss0q.js → dispatcher-pv5h77vf.js} +20 -20
  94. package/dist/{docker-nfy2gc8t.js → docker-fdzyewpz.js} +4 -4
  95. package/dist/{dsh-adapter-kpdnhjst.js → dsh-adapter-d4pdpb3r.js} +2 -3
  96. package/dist/{e2b-9gkdhm3c.js → e2b-222hsajc.js} +2 -2
  97. package/dist/{e2b-cjtf8k1z.js → e2b-fn3zacvt.js} +2 -2
  98. package/dist/{easter-egg-3d-e4qv8dxj.js → easter-egg-3d-4sp4dvmc.js} +1 -1
  99. package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
  100. package/dist/{execute-0xpz8950.js → execute-jev839y1.js} +1 -1
  101. package/dist/{external-channel-j1e2p34p.js → external-channel-y6nkzhnn.js} +2 -2
  102. package/dist/{grok-adapter-qtjz0whk.js → grok-adapter-t08b9ntm.js} +10 -10
  103. package/dist/handlers-eqsnmv95.js +41 -0
  104. package/dist/{heartbeat-vtesda5d.js → heartbeat-vn31xwdk.js} +23 -23
  105. package/dist/{hook-b2hhj6rd.js → hook-6d0zbvvt.js} +6 -5
  106. package/dist/{hook-8wqaszda.js → hook-cpjs8q51.js} +13 -7
  107. package/dist/{http-mxcqhhcs.js → http-9c6medda.js} +1085 -136
  108. package/dist/{index-spwxjgay.js → index-38t35h0n.js} +20 -20
  109. package/dist/{index-1r8wfpzs.js → index-g6k9tctj.js} +1 -1
  110. package/dist/{index-srg522m6.js → index-k0yt1tvq.js} +20 -20
  111. package/dist/{index-31ceyf42.js → index-pkma1yf8.js} +1 -1
  112. package/dist/{index-n1vbvta9.js → index-qhjf2htm.js} +29 -24
  113. package/dist/index-yqgbfgaj.js +43 -0
  114. package/dist/{keepalive-dsd8rtgx.js → keepalive-em0117bp.js} +4 -4
  115. package/dist/lead-23e7z59t.js +79 -0
  116. package/dist/{maintenance-jqmqwnet.js → maintenance-kbme3qy9.js} +1 -1
  117. package/dist/{oauth-refresh-sweep-q2c3bnvm.js → oauth-refresh-sweep-xysj4yse.js} +3 -3
  118. package/dist/{onboard-w4yd7s8t.js → onboard-p6q0vz97.js} +3 -3
  119. package/dist/{opencode-adapter-9tppvxar.js → opencode-adapter-esv3k9yn.js} +7 -7
  120. package/dist/{otel-impl-f36byzbd.js → otel-impl-54qhqh1z.js} +2 -2
  121. package/dist/{pi-mono-adapter-tqsge1ay.js → pi-mono-adapter-mymbwhj0.js} +41 -14
  122. package/dist/{pricing-refresh-xvak5p4v.js → pricing-refresh-yb75wv33.js} +3 -3
  123. package/dist/{rbac-roles-gfn30fb8.js → rbac-roles-1vp2mw4p.js} +2 -2
  124. package/dist/{rbac-roles-682k2mt5.js → rbac-roles-dexhc9x8.js} +1 -1
  125. package/dist/render-v2-tjay5hhf.js +16 -0
  126. package/dist/{resume-2dvq348g.js → resume-8ayf37g5.js} +11 -9
  127. package/dist/{runtime-bt5pkpm1.js → runtime-hqe5cqcd.js} +1 -1
  128. package/dist/{session-access-7f21ekq9.js → session-access-fdhp987s.js} +4 -4
  129. package/dist/session-source-backfill-qgtc86z1.js +110 -0
  130. package/dist/{setup-epffxtbk.js → setup-4rrmqcq3.js} +1 -1
  131. package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-52km00d6.js} +2 -2
  132. package/dist/{work-objects-xz1a5rqk.js → work-objects-p28fgd70.js} +23 -23
  133. package/dist/worker-e3w7vye1.js +79 -0
  134. package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
  135. package/openapi.json +1323 -16
  136. package/package.json +5 -5
  137. package/plugin/commands/create-pr.md +2 -2
  138. package/plugin/pi-skills/create-pr/SKILL.md +2 -2
  139. package/src/assets/source-key.ts +95 -0
  140. package/src/be/db/api-keys.ts +80 -0
  141. package/src/be/db/approvals.ts +48 -0
  142. package/src/be/db/session-labels.ts +28 -0
  143. package/src/be/db/session-moves.ts +5 -6
  144. package/src/be/db/session-tree.ts +153 -14
  145. package/src/be/db/tasks/read.ts +11 -0
  146. package/src/be/db/tasks/write.ts +21 -6
  147. package/src/be/db/workflow-idempotency.ts +183 -0
  148. package/src/be/db/workflow-runs.ts +500 -7
  149. package/src/be/db-retention.ts +61 -6
  150. package/src/be/db.ts +126 -131
  151. package/src/be/memory/providers/openai-embedding.ts +5 -1
  152. package/src/be/migrations/242_workflow_idempotency_keys.sql +40 -0
  153. package/src/be/migrations/244_api_key_validation.sql +4 -0
  154. package/src/be/onboarding.ts +4 -0
  155. package/src/be/scripts/typecheck.ts +1 -1
  156. package/src/be/sealed-json.ts +1 -0
  157. package/src/be/seed-scripts/catalog/compound-insights.inline.ts +2 -2
  158. package/src/be/seed-scripts/catalog/compound-insights.ts +2 -2
  159. package/src/be/seed-skills/bundled-files.generated.json +1 -1
  160. package/src/be/session-source-backfill.ts +163 -0
  161. package/src/be/sql-connections.ts +7 -1
  162. package/src/be/swarm-config-guard.ts +3 -0
  163. package/src/be/users.ts +9 -0
  164. package/src/comb/review-batch.ts +28 -1
  165. package/src/comb/templates.ts +7 -2
  166. package/src/commands/claude-managed-setup.ts +7 -1
  167. package/src/commands/controller.ts +33 -0
  168. package/src/commands/credential-refresh.ts +76 -1
  169. package/src/commands/credential-wait.ts +2 -2
  170. package/src/commands/provider-credentials.ts +210 -170
  171. package/src/commands/runner.ts +31 -6
  172. package/src/extensions/apply-task-create.ts +64 -11
  173. package/src/extensions/contract-types.generated.ts +1 -1
  174. package/src/extensions/contract.ts +30 -0
  175. package/src/extensions/dispatcher.ts +4 -0
  176. package/src/extensions/post-bridge.ts +8 -0
  177. package/src/hooks/context-bound-note.ts +196 -0
  178. package/src/hooks/hook.ts +12 -0
  179. package/src/http/all-routes.ts +2 -0
  180. package/src/http/api-keys.ts +53 -0
  181. package/src/http/assets.ts +15 -0
  182. package/src/http/codex-oauth-accounts.ts +191 -0
  183. package/src/http/comb.ts +15 -2
  184. package/src/http/config.ts +49 -17
  185. package/src/http/core.ts +6 -0
  186. package/src/http/fleet-benchmark.ts +5 -2
  187. package/src/http/idempotency-key.ts +117 -0
  188. package/src/http/index.ts +11 -0
  189. package/src/http/integrations.ts +5 -1
  190. package/src/http/kv.ts +8 -3
  191. package/src/http/onboarding.ts +6 -1
  192. package/src/http/pool-keys.ts +354 -0
  193. package/src/http/sessions.ts +37 -12
  194. package/src/http/stats.ts +1 -0
  195. package/src/http/status.ts +26 -12
  196. package/src/http/tasks.ts +3 -0
  197. package/src/http/used-by.ts +7 -2
  198. package/src/http/workflows.ts +207 -33
  199. package/src/integrations/chat-sdk/inbound.ts +27 -0
  200. package/src/kv-reserved-namespaces.ts +19 -0
  201. package/src/prompts/context-bound-note.ts +48 -0
  202. package/src/prompts/session-templates.ts +25 -1
  203. package/src/providers/acp-targets.ts +1 -1
  204. package/src/providers/amp-adapter.ts +30 -8
  205. package/src/providers/claude-adapter.ts +34 -5
  206. package/src/providers/claude-managed-adapter.ts +42 -9
  207. package/src/providers/claude-sdk-session.ts +10 -0
  208. package/src/providers/claude-session-events.ts +13 -0
  209. package/src/providers/codex-adapter.ts +83 -11
  210. package/src/providers/opencode-adapter.ts +18 -0
  211. package/src/providers/pi-mono-adapter.ts +35 -0
  212. package/src/runtime-providers/docker.ts +6 -2
  213. package/src/scheduler/scheduler.ts +3 -2
  214. package/src/scripts-runtime/swarm-sdk.ts +7 -1
  215. package/src/scripts-runtime/types/stdlib.d.ts +1 -1
  216. package/src/scripts-runtime/types/swarm-extension.d.ts +52 -8
  217. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -1
  218. package/src/slack/assistant.ts +7 -0
  219. package/src/slack/channel-labels.ts +74 -0
  220. package/src/slack/handlers.ts +8 -0
  221. package/src/slack/inbound-files.ts +5 -2
  222. package/src/slack/thread-buffer.ts +4 -0
  223. package/src/tasks/sibling-awareness.ts +12 -3
  224. package/src/telemetry-context.ts +5 -6
  225. package/src/telemetry-identity.ts +3 -3
  226. package/src/tests/amp-adapter.test.ts +97 -0
  227. package/src/tests/api-keys-validation.test.ts +170 -0
  228. package/src/tests/approval-requests.test.ts +10 -7
  229. package/src/tests/approval-sweeps.test.ts +12 -6
  230. package/src/tests/base-prompt.test.ts +1 -1
  231. package/src/tests/claude-hook-output.test.ts +79 -1
  232. package/src/tests/claude-managed-adapter.test.ts +321 -0
  233. package/src/tests/claude-routes-e2e.test.ts +7 -2
  234. package/src/tests/codex-adapter.test.ts +163 -0
  235. package/src/tests/codex-credential-pools.test.ts +120 -0
  236. package/src/tests/codex-gateway-route.test.ts +165 -0
  237. package/src/tests/codex-oauth-accounts.test.ts +357 -0
  238. package/src/tests/comb-review-batch.test.ts +63 -2
  239. package/src/tests/config-pool-keys.test.ts +533 -0
  240. package/src/tests/context-bound-note.test.ts +269 -0
  241. package/src/tests/credential-check.test.ts +290 -2
  242. package/src/tests/credential-refresh.test.ts +172 -1
  243. package/src/tests/db-retention.test.ts +9 -3
  244. package/src/tests/db-task-read-contract.test.ts +1 -0
  245. package/src/tests/db-task-write-contract.test.ts +1 -3
  246. package/src/tests/docs-index-footprint.test.js +3 -3
  247. package/src/tests/extensions-pre-task.test.ts +325 -0
  248. package/src/tests/fetch-resolved-env.test.ts +17 -0
  249. package/src/tests/fixtures/extensions/record-blocks/hooks.ts +10 -0
  250. package/src/tests/fixtures/extensions/record-blocks/manifest.json +7 -0
  251. package/src/tests/fixtures/extensions/record-task-create/hooks.ts +9 -0
  252. package/src/tests/fixtures/extensions/record-task-create/manifest.json +7 -0
  253. package/src/tests/fixtures/fake-amp.ts +22 -8
  254. package/src/tests/fixtures/held-template-render.ts +42 -0
  255. package/src/tests/fixtures/workflow-idempotency-trigger.child.ts +73 -0
  256. package/src/tests/fleet-benchmark.test.ts +8 -0
  257. package/src/tests/get-workflow-run-tool.test.ts +98 -0
  258. package/src/tests/integrations-http.test.ts +32 -2
  259. package/src/tests/internal-ai/complete-structured.test.ts +37 -1
  260. package/src/tests/internal-ai/credentials.test.ts +23 -0
  261. package/src/tests/kv-http.test.ts +32 -0
  262. package/src/tests/kv-tool.test.ts +25 -0
  263. package/src/tests/multi-runtime-registration.test.ts +12 -12
  264. package/src/tests/onboarding.test.ts +108 -1
  265. package/src/tests/openai-embedding-credentials.test.ts +35 -0
  266. package/src/tests/openapi-route-headers.test.ts +2 -0
  267. package/src/tests/opencode-adapter.test.ts +134 -0
  268. package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
  269. package/src/tests/org-website.test.ts +36 -0
  270. package/src/tests/pi-mono-adapter.test.ts +105 -0
  271. package/src/tests/prompt-template-session.test.ts +4 -3
  272. package/src/tests/provider-key-probes.test.ts +181 -0
  273. package/src/tests/rbac-e2e-helpers.test.ts +88 -1
  274. package/src/tests/rbac-e2e-helpers.ts +36 -11
  275. package/src/tests/runner-push-delivery.test.ts +25 -0
  276. package/src/tests/runtime-controller-liveness.test.ts +133 -0
  277. package/src/tests/runtime-providers-docker.test.ts +2 -0
  278. package/src/tests/script-connections.test.ts +5 -0
  279. package/src/tests/script-run-config-scope.test.ts +91 -3
  280. package/src/tests/script-runs-retention.test.ts +212 -0
  281. package/src/tests/sdk-allowlist.test.ts +39 -0
  282. package/src/tests/session-logs.test.ts +70 -0
  283. package/src/tests/session-source-backfill.test.ts +429 -0
  284. package/src/tests/session-source-keys.test.ts +236 -0
  285. package/src/tests/session-source-labels.test.ts +419 -0
  286. package/src/tests/sessions-detail-batch.test.ts +2 -0
  287. package/src/tests/sessions-move.test.ts +131 -0
  288. package/src/tests/sessions-tree.test.ts +336 -2
  289. package/src/tests/slack-inbound-files.test.ts +103 -23
  290. package/src/tests/status.test.ts +101 -18
  291. package/src/tests/tasks-workflow-run-filter.test.ts +146 -0
  292. package/src/tests/test-net.ts +31 -0
  293. package/src/tests/transcription.test.ts +8 -0
  294. package/src/tests/used-by-route.test.ts +11 -0
  295. package/src/tests/workflow-cascade-cancel.test.ts +1341 -0
  296. package/src/tests/workflow-foreach-supersede-retry.test.ts +488 -0
  297. package/src/tests/workflow-http-v2.test.ts +131 -0
  298. package/src/tests/workflow-idempotency.test.ts +915 -0
  299. package/src/tests/workflow-step-order.test.ts +92 -0
  300. package/src/tests/workflow-sub-workflow.test.ts +30 -0
  301. package/src/tools/get-tasks.ts +8 -0
  302. package/src/tools/kv/kv-read-auth.ts +4 -2
  303. package/src/tools/task-action.ts +1 -1
  304. package/src/tools/workflows/cancel-workflow-run.ts +1 -1
  305. package/src/tools/workflows/get-workflow-run.ts +14 -4
  306. package/src/types.ts +24 -0
  307. package/src/utils/company-profile.ts +51 -1
  308. package/src/utils/context-window.ts +8 -6
  309. package/src/utils/credentials.ts +5 -2
  310. package/src/utils/internal-ai/complete-structured.ts +5 -0
  311. package/src/utils/internal-ai/credentials.ts +4 -3
  312. package/src/utils/provider-key-probes.ts +328 -0
  313. package/src/utils/transcription.ts +4 -1
  314. package/src/workflows/approval-cancel.ts +15 -13
  315. package/src/workflows/approval-notifications.ts +5 -1
  316. package/src/workflows/checkpoint.ts +6 -3
  317. package/src/workflows/engine.ts +30 -8
  318. package/src/workflows/executors/foreach.ts +2 -2
  319. package/src/workflows/executors/sub-workflow.ts +8 -1
  320. package/src/workflows/foreach-driver.ts +10 -3
  321. package/src/workflows/foreach-join.ts +29 -6
  322. package/src/workflows/recovery.ts +6 -1
  323. package/src/workflows/resume.ts +168 -56
  324. package/src/workflows/retry-poller.ts +49 -3
  325. package/src/workflows/task-step-routing.ts +29 -7
  326. package/templates/ai-toolbox.manifest.json +8 -8
  327. package/templates/community/open-prompt-showreel/PLAYBOOK.md +5 -6
  328. package/templates/community/open-prompt-showreel/lead-prompt.md +1 -1
  329. package/templates/community/open-prompt-showreel/skills/open-prompt-showreel/SKILL.md +4 -4
  330. package/templates/skills/agent-browser/SKILL.md +4 -4
  331. package/templates/skills/agent-browser/content.md +4 -4
  332. package/templates/skills/code-quality/config.json +1 -1
  333. package/templates/skills/code-quality/content.md +2 -2
  334. package/templates/skills/delegate-work/content.md +29 -25
  335. package/templates/skills/delegate-work/files/scripts/codex-exec.sh +5 -5
  336. package/templates/skills/qa/content.md +2 -2
  337. package/templates/skills/researching/content.md +4 -0
  338. package/templates/skills/swarm-scripts/SKILL.md +1 -0
  339. package/templates/skills/swarm-scripts/content.md +1 -0
  340. package/templates/skills/work-on-task/SKILL.md +1 -1
  341. package/templates/skills/work-on-task/content.md +1 -1
  342. package/dist/cli-7421jzsw.js +0 -84
  343. package/dist/cli-e45e4m6b.js +0 -413
  344. package/dist/cli-zw88zjba.js +0 -307
  345. package/dist/handlers-19xr6dnz.js +0 -41
  346. package/dist/index-kw2mmat7.js +0 -43
  347. package/dist/lead-zyerk1x2.js +0 -79
  348. package/dist/render-v2-hgytz8nn.js +0 -12
  349. package/dist/worker-42t8emjt.js +0 -79
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Agent Swarm API",
5
- "version": "2.5.3",
5
+ "version": "2.6.0",
6
6
  "description": "Multi-agent orchestration API for Claude Code, Codex, and Gemini CLI. Enables task distribution, agent communication, and service discovery.\n\nMCP tools are documented separately in [MCP.md](./MCP.md)."
7
7
  },
8
8
  "servers": [
@@ -648,6 +648,15 @@
648
648
  },
649
649
  "testedAt": {
650
650
  "type": "number"
651
+ },
652
+ "warning": {
653
+ "type": "string"
654
+ },
655
+ "keys": {
656
+ "type": "array",
657
+ "items": {
658
+ "$ref": "#/components/schemas/AgentCredStatusKeyResult"
659
+ }
651
660
  }
652
661
  },
653
662
  "default": null,
@@ -657,6 +666,39 @@
657
666
  "testedAt"
658
667
  ]
659
668
  },
669
+ "AgentCredStatusKeyResult": {
670
+ "type": "object",
671
+ "properties": {
672
+ "keyType": {
673
+ "type": "string"
674
+ },
675
+ "index": {
676
+ "type": "number"
677
+ },
678
+ "suffix": {
679
+ "type": "string"
680
+ },
681
+ "ok": {
682
+ "type": "boolean"
683
+ },
684
+ "error": {
685
+ "type": "string"
686
+ },
687
+ "httpStatus": {
688
+ "type": "number"
689
+ },
690
+ "latency_ms": {
691
+ "type": "number"
692
+ }
693
+ },
694
+ "required": [
695
+ "keyType",
696
+ "index",
697
+ "suffix",
698
+ "ok",
699
+ "latency_ms"
700
+ ]
701
+ },
660
702
  "AgentLatestModel": {
661
703
  "type": [
662
704
  "object",
@@ -5521,6 +5563,77 @@
5521
5563
  "nodeId"
5522
5564
  ]
5523
5565
  },
5566
+ "WorkflowRunStepSlim": {
5567
+ "type": "object",
5568
+ "properties": {
5569
+ "id": {
5570
+ "type": "string",
5571
+ "format": "uuid"
5572
+ },
5573
+ "runId": {
5574
+ "type": "string",
5575
+ "format": "uuid"
5576
+ },
5577
+ "nodeId": {
5578
+ "type": "string"
5579
+ },
5580
+ "nodeType": {
5581
+ "type": "string"
5582
+ },
5583
+ "status": {
5584
+ "type": "string",
5585
+ "enum": [
5586
+ "pending",
5587
+ "running",
5588
+ "waiting",
5589
+ "completed",
5590
+ "failed",
5591
+ "skipped",
5592
+ "cancelled"
5593
+ ]
5594
+ },
5595
+ "output": {},
5596
+ "error": {
5597
+ "type": "string"
5598
+ },
5599
+ "startedAt": {
5600
+ "type": "string"
5601
+ },
5602
+ "finishedAt": {
5603
+ "type": "string"
5604
+ },
5605
+ "retryCount": {
5606
+ "type": "integer",
5607
+ "minimum": 0,
5608
+ "default": 0
5609
+ },
5610
+ "maxRetries": {
5611
+ "type": "integer",
5612
+ "minimum": 0,
5613
+ "default": 3
5614
+ },
5615
+ "nextRetryAt": {
5616
+ "type": "string"
5617
+ },
5618
+ "idempotencyKey": {
5619
+ "type": "string"
5620
+ },
5621
+ "diagnostics": {
5622
+ "type": "string"
5623
+ },
5624
+ "nextPort": {
5625
+ "type": "string"
5626
+ }
5627
+ },
5628
+ "required": [
5629
+ "id",
5630
+ "runId",
5631
+ "nodeId",
5632
+ "nodeType",
5633
+ "status",
5634
+ "startedAt"
5635
+ ]
5636
+ },
5524
5637
  "WorkflowVersion": {
5525
5638
  "type": "object",
5526
5639
  "properties": {
@@ -12366,6 +12479,9 @@
12366
12479
  "eng_lead",
12367
12480
  "founder",
12368
12481
  "product",
12482
+ "marketing",
12483
+ "sales",
12484
+ "research",
12369
12485
  "ops",
12370
12486
  "other"
12371
12487
  ]
@@ -17266,6 +17382,217 @@
17266
17382
  }
17267
17383
  }
17268
17384
  },
17385
+ "/api/codex-oauth/accounts": {
17386
+ "get": {
17387
+ "summary": "List stored Codex ChatGPT accounts",
17388
+ "tags": [
17389
+ "Codex OAuth"
17390
+ ],
17391
+ "security": [
17392
+ {
17393
+ "bearerAuth": []
17394
+ }
17395
+ ],
17396
+ "responses": {
17397
+ "200": {
17398
+ "description": "Stored account metadata",
17399
+ "content": {
17400
+ "application/json": {
17401
+ "schema": {
17402
+ "type": "object",
17403
+ "properties": {
17404
+ "accounts": {
17405
+ "type": "array",
17406
+ "items": {
17407
+ "type": "object",
17408
+ "properties": {
17409
+ "slot": {
17410
+ "type": "integer",
17411
+ "minimum": 0
17412
+ },
17413
+ "configKey": {
17414
+ "type": "string"
17415
+ },
17416
+ "legacy": {
17417
+ "type": "boolean"
17418
+ },
17419
+ "suffix": {
17420
+ "type": [
17421
+ "string",
17422
+ "null"
17423
+ ]
17424
+ },
17425
+ "plan": {
17426
+ "type": [
17427
+ "string",
17428
+ "null"
17429
+ ]
17430
+ },
17431
+ "email": {
17432
+ "type": [
17433
+ "string",
17434
+ "null"
17435
+ ]
17436
+ },
17437
+ "status": {
17438
+ "type": "string",
17439
+ "enum": [
17440
+ "ok",
17441
+ "needs_login",
17442
+ "unchecked"
17443
+ ]
17444
+ }
17445
+ },
17446
+ "required": [
17447
+ "slot",
17448
+ "configKey",
17449
+ "legacy",
17450
+ "suffix",
17451
+ "plan",
17452
+ "email",
17453
+ "status"
17454
+ ]
17455
+ }
17456
+ }
17457
+ },
17458
+ "required": [
17459
+ "accounts"
17460
+ ]
17461
+ }
17462
+ }
17463
+ }
17464
+ },
17465
+ "403": {
17466
+ "description": "Caller cannot read all secrets",
17467
+ "content": {
17468
+ "application/json": {
17469
+ "schema": {
17470
+ "$ref": "#/components/schemas/ErrorResponse"
17471
+ }
17472
+ }
17473
+ }
17474
+ }
17475
+ }
17476
+ }
17477
+ },
17478
+ "/api/codex-oauth/accounts/{slot}": {
17479
+ "delete": {
17480
+ "summary": "Remove a stored Codex ChatGPT account",
17481
+ "tags": [
17482
+ "Codex OAuth"
17483
+ ],
17484
+ "security": [
17485
+ {
17486
+ "bearerAuth": []
17487
+ }
17488
+ ],
17489
+ "parameters": [
17490
+ {
17491
+ "schema": {
17492
+ "type": [
17493
+ "integer",
17494
+ "null"
17495
+ ],
17496
+ "minimum": 0,
17497
+ "maximum": 100
17498
+ },
17499
+ "required": false,
17500
+ "name": "slot",
17501
+ "in": "path"
17502
+ }
17503
+ ],
17504
+ "responses": {
17505
+ "200": {
17506
+ "description": "Remaining accounts",
17507
+ "content": {
17508
+ "application/json": {
17509
+ "schema": {
17510
+ "type": "object",
17511
+ "properties": {
17512
+ "accounts": {
17513
+ "type": "array",
17514
+ "items": {
17515
+ "type": "object",
17516
+ "properties": {
17517
+ "slot": {
17518
+ "type": "integer",
17519
+ "minimum": 0
17520
+ },
17521
+ "configKey": {
17522
+ "type": "string"
17523
+ },
17524
+ "legacy": {
17525
+ "type": "boolean"
17526
+ },
17527
+ "suffix": {
17528
+ "type": [
17529
+ "string",
17530
+ "null"
17531
+ ]
17532
+ },
17533
+ "plan": {
17534
+ "type": [
17535
+ "string",
17536
+ "null"
17537
+ ]
17538
+ },
17539
+ "email": {
17540
+ "type": [
17541
+ "string",
17542
+ "null"
17543
+ ]
17544
+ },
17545
+ "status": {
17546
+ "type": "string",
17547
+ "enum": [
17548
+ "ok",
17549
+ "needs_login",
17550
+ "unchecked"
17551
+ ]
17552
+ }
17553
+ },
17554
+ "required": [
17555
+ "slot",
17556
+ "configKey",
17557
+ "legacy",
17558
+ "suffix",
17559
+ "plan",
17560
+ "email",
17561
+ "status"
17562
+ ]
17563
+ }
17564
+ }
17565
+ },
17566
+ "required": [
17567
+ "accounts"
17568
+ ]
17569
+ }
17570
+ }
17571
+ }
17572
+ },
17573
+ "403": {
17574
+ "description": "Config administration and permission to read all secrets required",
17575
+ "content": {
17576
+ "application/json": {
17577
+ "schema": {
17578
+ "$ref": "#/components/schemas/ErrorResponse"
17579
+ }
17580
+ }
17581
+ }
17582
+ },
17583
+ "404": {
17584
+ "description": "Account slot does not exist",
17585
+ "content": {
17586
+ "application/json": {
17587
+ "schema": {
17588
+ "$ref": "#/components/schemas/ErrorResponse"
17589
+ }
17590
+ }
17591
+ }
17592
+ }
17593
+ }
17594
+ }
17595
+ },
17269
17596
  "/api/oauth/keep-warm/codex": {
17270
17597
  "post": {
17271
17598
  "summary": "Locked keep-warm refresh sweep across all Codex OAuth pool slots",
@@ -17417,7 +17744,7 @@
17417
17744
  "/api/comb/review-batches": {
17418
17745
  "post": {
17419
17746
  "summary": "Send agent-fs comments to the swarm as one lead task",
17420
- "description": "Comb's 'Send to swarm'. The server reads each comment again from agent-fs with its bootstrap key, skips replies, resolved comments, and comments already sent, and creates ONE task for the lead. Each sent comment gets a `[comb:sent task=<id>]` reply from the swarm service account. A comment is sent at most once. When an earlier send lost its reply, the batch posts that reply again (`repaired`). Answers 404 while COMB_ENABLED is off.",
17747
+ "description": "Comb's 'Send to swarm'. The server reads each comment again from agent-fs with its bootstrap key, skips replies, resolved comments, and comments already sent, and creates ONE task for the lead. Each sent comment gets a `[comb:sent task=<id>]` reply from the swarm service account. A comment is sent at most once. An optional `note` from the sender goes into the task text. When an earlier send lost its reply, the batch posts that reply again (`repaired`). Answers 404 while COMB_ENABLED is off.",
17421
17748
  "tags": [
17422
17749
  "Comb"
17423
17750
  ],
@@ -17453,6 +17780,10 @@
17453
17780
  "type": "string",
17454
17781
  "minLength": 1,
17455
17782
  "maxLength": 1024
17783
+ },
17784
+ "note": {
17785
+ "type": "string",
17786
+ "maxLength": 4000
17456
17787
  }
17457
17788
  },
17458
17789
  "required": [
@@ -17529,6 +17860,14 @@
17529
17860
  "taskId"
17530
17861
  ]
17531
17862
  }
17863
+ },
17864
+ "lead": {
17865
+ "type": "string",
17866
+ "enum": [
17867
+ "online",
17868
+ "offline",
17869
+ "none"
17870
+ ]
17532
17871
  }
17533
17872
  },
17534
17873
  "required": [
@@ -17604,6 +17943,14 @@
17604
17943
  "taskId"
17605
17944
  ]
17606
17945
  }
17946
+ },
17947
+ "lead": {
17948
+ "type": "string",
17949
+ "enum": [
17950
+ "online",
17951
+ "offline",
17952
+ "none"
17953
+ ]
17607
17954
  }
17608
17955
  },
17609
17956
  "required": [
@@ -17761,6 +18108,537 @@
17761
18108
  }
17762
18109
  }
17763
18110
  },
18111
+ "/api/config/pool-keys": {
18112
+ "get": {
18113
+ "summary": "List credential pool suffixes and status",
18114
+ "tags": [
18115
+ "Config"
18116
+ ],
18117
+ "security": [
18118
+ {
18119
+ "bearerAuth": []
18120
+ }
18121
+ ],
18122
+ "parameters": [
18123
+ {
18124
+ "schema": {
18125
+ "type": "string"
18126
+ },
18127
+ "required": true,
18128
+ "name": "key",
18129
+ "in": "query"
18130
+ }
18131
+ ],
18132
+ "responses": {
18133
+ "200": {
18134
+ "description": "Credential pool",
18135
+ "content": {
18136
+ "application/json": {
18137
+ "schema": {
18138
+ "type": "object",
18139
+ "properties": {
18140
+ "key": {
18141
+ "type": "string"
18142
+ },
18143
+ "source": {
18144
+ "type": "string",
18145
+ "enum": [
18146
+ "stored",
18147
+ "env",
18148
+ "none"
18149
+ ]
18150
+ },
18151
+ "readOnly": {
18152
+ "type": "boolean"
18153
+ },
18154
+ "keys": {
18155
+ "type": "array",
18156
+ "items": {
18157
+ "type": "object",
18158
+ "properties": {
18159
+ "index": {
18160
+ "type": "integer",
18161
+ "minimum": 0
18162
+ },
18163
+ "suffix": {
18164
+ "type": "string"
18165
+ },
18166
+ "status": {
18167
+ "type": "string",
18168
+ "enum": [
18169
+ "ok",
18170
+ "rejected",
18171
+ "rate_limited",
18172
+ "unchecked"
18173
+ ]
18174
+ },
18175
+ "error": {
18176
+ "type": [
18177
+ "string",
18178
+ "null"
18179
+ ]
18180
+ },
18181
+ "checkedAt": {
18182
+ "type": [
18183
+ "string",
18184
+ "null"
18185
+ ]
18186
+ },
18187
+ "rateLimitedUntil": {
18188
+ "type": [
18189
+ "string",
18190
+ "null"
18191
+ ]
18192
+ }
18193
+ },
18194
+ "required": [
18195
+ "index",
18196
+ "suffix",
18197
+ "status",
18198
+ "error",
18199
+ "checkedAt",
18200
+ "rateLimitedUntil"
18201
+ ]
18202
+ }
18203
+ }
18204
+ },
18205
+ "required": [
18206
+ "key",
18207
+ "source",
18208
+ "readOnly",
18209
+ "keys"
18210
+ ]
18211
+ }
18212
+ }
18213
+ }
18214
+ },
18215
+ "400": {
18216
+ "description": "Invalid pool variable",
18217
+ "content": {
18218
+ "application/json": {
18219
+ "schema": {
18220
+ "$ref": "#/components/schemas/ErrorResponse"
18221
+ }
18222
+ }
18223
+ }
18224
+ },
18225
+ "403": {
18226
+ "description": "Secret read permission required",
18227
+ "content": {
18228
+ "application/json": {
18229
+ "schema": {
18230
+ "$ref": "#/components/schemas/ErrorResponse"
18231
+ }
18232
+ }
18233
+ }
18234
+ }
18235
+ }
18236
+ },
18237
+ "post": {
18238
+ "summary": "Test and append keys to a credential pool",
18239
+ "tags": [
18240
+ "Config"
18241
+ ],
18242
+ "security": [
18243
+ {
18244
+ "bearerAuth": []
18245
+ }
18246
+ ],
18247
+ "requestBody": {
18248
+ "content": {
18249
+ "application/json": {
18250
+ "schema": {
18251
+ "type": "object",
18252
+ "properties": {
18253
+ "key": {
18254
+ "type": "string"
18255
+ },
18256
+ "value": {
18257
+ "type": "string"
18258
+ },
18259
+ "baseUrl": {
18260
+ "type": [
18261
+ "string",
18262
+ "null"
18263
+ ],
18264
+ "description": "Base URL for the check only. Null tests the provider default. Omit to use the stored URL."
18265
+ }
18266
+ },
18267
+ "required": [
18268
+ "key",
18269
+ "value"
18270
+ ]
18271
+ }
18272
+ }
18273
+ }
18274
+ },
18275
+ "responses": {
18276
+ "200": {
18277
+ "description": "Updated credential pool and checks",
18278
+ "content": {
18279
+ "application/json": {
18280
+ "schema": {
18281
+ "type": "object",
18282
+ "properties": {
18283
+ "key": {
18284
+ "type": "string"
18285
+ },
18286
+ "source": {
18287
+ "type": "string",
18288
+ "enum": [
18289
+ "stored",
18290
+ "env",
18291
+ "none"
18292
+ ]
18293
+ },
18294
+ "readOnly": {
18295
+ "type": "boolean"
18296
+ },
18297
+ "keys": {
18298
+ "type": "array",
18299
+ "items": {
18300
+ "type": "object",
18301
+ "properties": {
18302
+ "index": {
18303
+ "type": "integer",
18304
+ "minimum": 0
18305
+ },
18306
+ "suffix": {
18307
+ "type": "string"
18308
+ },
18309
+ "status": {
18310
+ "type": "string",
18311
+ "enum": [
18312
+ "ok",
18313
+ "rejected",
18314
+ "rate_limited",
18315
+ "unchecked"
18316
+ ]
18317
+ },
18318
+ "error": {
18319
+ "type": [
18320
+ "string",
18321
+ "null"
18322
+ ]
18323
+ },
18324
+ "checkedAt": {
18325
+ "type": [
18326
+ "string",
18327
+ "null"
18328
+ ]
18329
+ },
18330
+ "rateLimitedUntil": {
18331
+ "type": [
18332
+ "string",
18333
+ "null"
18334
+ ]
18335
+ }
18336
+ },
18337
+ "required": [
18338
+ "index",
18339
+ "suffix",
18340
+ "status",
18341
+ "error",
18342
+ "checkedAt",
18343
+ "rateLimitedUntil"
18344
+ ]
18345
+ }
18346
+ },
18347
+ "checks": {
18348
+ "type": "array",
18349
+ "items": {
18350
+ "type": "object",
18351
+ "properties": {
18352
+ "suffix": {
18353
+ "type": "string"
18354
+ },
18355
+ "result": {
18356
+ "type": "string",
18357
+ "enum": [
18358
+ "verified",
18359
+ "rejected",
18360
+ "not_tested"
18361
+ ]
18362
+ },
18363
+ "httpStatus": {
18364
+ "type": [
18365
+ "number",
18366
+ "null"
18367
+ ]
18368
+ },
18369
+ "error": {
18370
+ "type": [
18371
+ "string",
18372
+ "null"
18373
+ ]
18374
+ }
18375
+ },
18376
+ "required": [
18377
+ "suffix",
18378
+ "result",
18379
+ "httpStatus",
18380
+ "error"
18381
+ ]
18382
+ }
18383
+ }
18384
+ },
18385
+ "required": [
18386
+ "key",
18387
+ "source",
18388
+ "readOnly",
18389
+ "keys",
18390
+ "checks"
18391
+ ]
18392
+ }
18393
+ }
18394
+ }
18395
+ },
18396
+ "400": {
18397
+ "description": "Invalid key",
18398
+ "content": {
18399
+ "application/json": {
18400
+ "schema": {
18401
+ "$ref": "#/components/schemas/ErrorResponse"
18402
+ }
18403
+ }
18404
+ }
18405
+ },
18406
+ "403": {
18407
+ "description": "Config administration and permission to read all secrets required",
18408
+ "content": {
18409
+ "application/json": {
18410
+ "schema": {
18411
+ "$ref": "#/components/schemas/ErrorResponse"
18412
+ }
18413
+ }
18414
+ }
18415
+ },
18416
+ "409": {
18417
+ "description": "Duplicate key or deployment env pool",
18418
+ "content": {
18419
+ "application/json": {
18420
+ "schema": {
18421
+ "$ref": "#/components/schemas/ErrorResponse"
18422
+ }
18423
+ }
18424
+ }
18425
+ },
18426
+ "422": {
18427
+ "description": "Provider rejected a key. Nothing was saved.",
18428
+ "content": {
18429
+ "application/json": {
18430
+ "schema": {
18431
+ "type": "object",
18432
+ "properties": {
18433
+ "error": {
18434
+ "type": "string"
18435
+ },
18436
+ "checks": {
18437
+ "type": "array",
18438
+ "items": {
18439
+ "type": "object",
18440
+ "properties": {
18441
+ "suffix": {
18442
+ "type": "string"
18443
+ },
18444
+ "result": {
18445
+ "type": "string",
18446
+ "enum": [
18447
+ "verified",
18448
+ "rejected",
18449
+ "not_tested"
18450
+ ]
18451
+ },
18452
+ "httpStatus": {
18453
+ "type": [
18454
+ "number",
18455
+ "null"
18456
+ ]
18457
+ },
18458
+ "error": {
18459
+ "type": [
18460
+ "string",
18461
+ "null"
18462
+ ]
18463
+ }
18464
+ },
18465
+ "required": [
18466
+ "suffix",
18467
+ "result",
18468
+ "httpStatus",
18469
+ "error"
18470
+ ]
18471
+ }
18472
+ }
18473
+ },
18474
+ "required": [
18475
+ "error",
18476
+ "checks"
18477
+ ]
18478
+ }
18479
+ }
18480
+ }
18481
+ }
18482
+ }
18483
+ },
18484
+ "delete": {
18485
+ "summary": "Remove one credential pool member",
18486
+ "tags": [
18487
+ "Config"
18488
+ ],
18489
+ "security": [
18490
+ {
18491
+ "bearerAuth": []
18492
+ }
18493
+ ],
18494
+ "parameters": [
18495
+ {
18496
+ "schema": {
18497
+ "type": "string"
18498
+ },
18499
+ "required": true,
18500
+ "name": "key",
18501
+ "in": "query"
18502
+ },
18503
+ {
18504
+ "schema": {
18505
+ "type": [
18506
+ "integer",
18507
+ "null"
18508
+ ],
18509
+ "minimum": 0
18510
+ },
18511
+ "required": false,
18512
+ "name": "index",
18513
+ "in": "query"
18514
+ },
18515
+ {
18516
+ "schema": {
18517
+ "type": "string",
18518
+ "minLength": 1,
18519
+ "maxLength": 5
18520
+ },
18521
+ "required": true,
18522
+ "name": "suffix",
18523
+ "in": "query"
18524
+ }
18525
+ ],
18526
+ "responses": {
18527
+ "200": {
18528
+ "description": "Updated credential pool",
18529
+ "content": {
18530
+ "application/json": {
18531
+ "schema": {
18532
+ "type": "object",
18533
+ "properties": {
18534
+ "key": {
18535
+ "type": "string"
18536
+ },
18537
+ "source": {
18538
+ "type": "string",
18539
+ "enum": [
18540
+ "stored",
18541
+ "env",
18542
+ "none"
18543
+ ]
18544
+ },
18545
+ "readOnly": {
18546
+ "type": "boolean"
18547
+ },
18548
+ "keys": {
18549
+ "type": "array",
18550
+ "items": {
18551
+ "type": "object",
18552
+ "properties": {
18553
+ "index": {
18554
+ "type": "integer",
18555
+ "minimum": 0
18556
+ },
18557
+ "suffix": {
18558
+ "type": "string"
18559
+ },
18560
+ "status": {
18561
+ "type": "string",
18562
+ "enum": [
18563
+ "ok",
18564
+ "rejected",
18565
+ "rate_limited",
18566
+ "unchecked"
18567
+ ]
18568
+ },
18569
+ "error": {
18570
+ "type": [
18571
+ "string",
18572
+ "null"
18573
+ ]
18574
+ },
18575
+ "checkedAt": {
18576
+ "type": [
18577
+ "string",
18578
+ "null"
18579
+ ]
18580
+ },
18581
+ "rateLimitedUntil": {
18582
+ "type": [
18583
+ "string",
18584
+ "null"
18585
+ ]
18586
+ }
18587
+ },
18588
+ "required": [
18589
+ "index",
18590
+ "suffix",
18591
+ "status",
18592
+ "error",
18593
+ "checkedAt",
18594
+ "rateLimitedUntil"
18595
+ ]
18596
+ }
18597
+ }
18598
+ },
18599
+ "required": [
18600
+ "key",
18601
+ "source",
18602
+ "readOnly",
18603
+ "keys"
18604
+ ]
18605
+ }
18606
+ }
18607
+ }
18608
+ },
18609
+ "400": {
18610
+ "description": "Invalid pool member",
18611
+ "content": {
18612
+ "application/json": {
18613
+ "schema": {
18614
+ "$ref": "#/components/schemas/ErrorResponse"
18615
+ }
18616
+ }
18617
+ }
18618
+ },
18619
+ "403": {
18620
+ "description": "Config administration and permission to read all secrets required",
18621
+ "content": {
18622
+ "application/json": {
18623
+ "schema": {
18624
+ "$ref": "#/components/schemas/ErrorResponse"
18625
+ }
18626
+ }
18627
+ }
18628
+ },
18629
+ "409": {
18630
+ "description": "The pool changed or comes from the deployment env",
18631
+ "content": {
18632
+ "application/json": {
18633
+ "schema": {
18634
+ "$ref": "#/components/schemas/ErrorResponse"
18635
+ }
18636
+ }
18637
+ }
18638
+ }
18639
+ }
18640
+ }
18641
+ },
17764
18642
  "/api/tasks/{id}/context": {
17765
18643
  "post": {
17766
18644
  "summary": "Record a context usage snapshot for a task",
@@ -18212,6 +19090,120 @@
18212
19090
  }
18213
19091
  }
18214
19092
  },
19093
+ "/api/keys/report-validation": {
19094
+ "post": {
19095
+ "summary": "Record live validation results for a credential pool",
19096
+ "tags": [
19097
+ "API Keys"
19098
+ ],
19099
+ "security": [
19100
+ {
19101
+ "bearerAuth": []
19102
+ }
19103
+ ],
19104
+ "requestBody": {
19105
+ "content": {
19106
+ "application/json": {
19107
+ "schema": {
19108
+ "type": "object",
19109
+ "properties": {
19110
+ "keyType": {
19111
+ "type": "string"
19112
+ },
19113
+ "keys": {
19114
+ "type": "array",
19115
+ "items": {
19116
+ "type": "object",
19117
+ "properties": {
19118
+ "keyIndex": {
19119
+ "type": "integer",
19120
+ "minimum": 0
19121
+ },
19122
+ "keySuffix": {
19123
+ "type": "string",
19124
+ "minLength": 1,
19125
+ "maxLength": 10
19126
+ },
19127
+ "ok": {
19128
+ "type": "boolean"
19129
+ },
19130
+ "httpStatus": {
19131
+ "type": "integer"
19132
+ }
19133
+ },
19134
+ "required": [
19135
+ "keyIndex",
19136
+ "keySuffix",
19137
+ "ok"
19138
+ ]
19139
+ },
19140
+ "minItems": 1,
19141
+ "maxItems": 100
19142
+ },
19143
+ "scope": {
19144
+ "type": "string"
19145
+ },
19146
+ "scopeId": {
19147
+ "type": "string"
19148
+ }
19149
+ },
19150
+ "required": [
19151
+ "keyType",
19152
+ "keys"
19153
+ ]
19154
+ }
19155
+ }
19156
+ }
19157
+ },
19158
+ "responses": {
19159
+ "200": {
19160
+ "description": "Validation recorded",
19161
+ "content": {
19162
+ "application/json": {
19163
+ "schema": {
19164
+ "type": "object",
19165
+ "properties": {
19166
+ "success": {
19167
+ "type": "boolean",
19168
+ "enum": [
19169
+ true
19170
+ ]
19171
+ },
19172
+ "message": {
19173
+ "type": "string"
19174
+ }
19175
+ },
19176
+ "required": [
19177
+ "success",
19178
+ "message"
19179
+ ]
19180
+ }
19181
+ }
19182
+ }
19183
+ },
19184
+ "400": {
19185
+ "description": "Validation error",
19186
+ "content": {
19187
+ "application/json": {
19188
+ "schema": {
19189
+ "$ref": "#/components/schemas/ErrorResponse"
19190
+ }
19191
+ }
19192
+ }
19193
+ },
19194
+ "401": {
19195
+ "description": "Unauthorized",
19196
+ "content": {
19197
+ "application/json": {
19198
+ "schema": {
19199
+ "$ref": "#/components/schemas/ErrorResponse"
19200
+ }
19201
+ }
19202
+ }
19203
+ }
19204
+ }
19205
+ }
19206
+ },
18215
19207
  "/api/keys/report-auth-failure": {
18216
19208
  "post": {
18217
19209
  "summary": "Record an auth failure for a pooled key; bench it after 2 in a row",
@@ -18631,6 +19623,12 @@
18631
19623
  "type": "integer"
18632
19624
  }
18633
19625
  },
19626
+ "rejectedIndices": {
19627
+ "type": "array",
19628
+ "items": {
19629
+ "type": "integer"
19630
+ }
19631
+ },
18634
19632
  "totalKeys": {
18635
19633
  "type": "integer"
18636
19634
  },
@@ -18872,6 +19870,18 @@
18872
19870
  "null"
18873
19871
  ]
18874
19872
  },
19873
+ "lastValidationError": {
19874
+ "type": [
19875
+ "string",
19876
+ "null"
19877
+ ]
19878
+ },
19879
+ "lastValidationFailedAt": {
19880
+ "type": [
19881
+ "string",
19882
+ "null"
19883
+ ]
19884
+ },
18875
19885
  "modelLimits": {
18876
19886
  "type": "array",
18877
19887
  "items": {
@@ -18931,6 +19941,8 @@
18931
19941
  "lastSeatMismatchModel",
18932
19942
  "consecutiveAuthFailures",
18933
19943
  "lastAuthFailureAt",
19944
+ "lastValidationError",
19945
+ "lastValidationFailedAt",
18934
19946
  "modelLimits",
18935
19947
  "createdAt",
18936
19948
  "updatedAt"
@@ -29471,7 +30483,7 @@
29471
30483
  "/status": {
29472
30484
  "get": {
29473
30485
  "summary": "Identity + setup readiness + live activity for the swarm dashboard",
29474
- "description": "Single source of truth consumed by the UI home page. Identity comes from SWARM_* envs; setup milestones each emit `unverified | configured | verified`; automations report `running | needs_setup` from the same runtime preflight used at dispatch; activity counts agents alive in the last 5 min and tasks created in the last 24h; agent_fs reports whether AGENT_FS_API_URL is set, plus the Comb settings (COMB_ENABLED, the browser-facing agent-fs URL, the shared org and drive ids, and the agent-fs user id of the swarm service account); telemetry reports the effective ANONYMIZED_TELEMETRY opt-out state.",
30486
+ "description": "Single source of truth consumed by the UI home page. Identity comes from SWARM_* envs; setup milestones each emit `unverified | configured | verified`; automations report `running | needs_setup` from the same runtime preflight used at dispatch; activity counts agents alive in the last 5 min, leads that can take work (status idle or busy), and tasks created in the last 24h; agent_fs reports whether AGENT_FS_API_URL is set, plus the Comb settings (COMB_ENABLED, the browser-facing agent-fs URL, the shared org and drive ids, and the agent-fs user id of the swarm service account); telemetry reports the effective ANONYMIZED_TELEMETRY opt-out state.",
29475
30487
  "tags": [
29476
30488
  "Status"
29477
30489
  ],
@@ -29664,6 +30676,10 @@
29664
30676
  "type": "integer",
29665
30677
  "minimum": 0
29666
30678
  },
30679
+ "leads_ready": {
30680
+ "type": "integer",
30681
+ "minimum": 0
30682
+ },
29667
30683
  "recent_tasks_count": {
29668
30684
  "type": "integer",
29669
30685
  "minimum": 0
@@ -29672,6 +30688,7 @@
29672
30688
  "required": [
29673
30689
  "agents_online",
29674
30690
  "leads_online",
30691
+ "leads_ready",
29675
30692
  "recent_tasks_count"
29676
30693
  ]
29677
30694
  },
@@ -30590,13 +31607,27 @@
30590
31607
  "verifiedWorkers": {
30591
31608
  "type": "integer",
30592
31609
  "minimum": 0
31610
+ },
31611
+ "error": {
31612
+ "type": [
31613
+ "string",
31614
+ "null"
31615
+ ]
31616
+ },
31617
+ "warning": {
31618
+ "type": [
31619
+ "string",
31620
+ "null"
31621
+ ]
30593
31622
  }
30594
31623
  },
30595
31624
  "required": [
30596
31625
  "provider",
30597
31626
  "state",
30598
31627
  "workers",
30599
- "verifiedWorkers"
31628
+ "verifiedWorkers",
31629
+ "error",
31630
+ "warning"
30600
31631
  ]
30601
31632
  }
30602
31633
  },
@@ -31590,13 +32621,27 @@
31590
32621
  "verifiedWorkers": {
31591
32622
  "type": "integer",
31592
32623
  "minimum": 0
32624
+ },
32625
+ "error": {
32626
+ "type": [
32627
+ "string",
32628
+ "null"
32629
+ ]
32630
+ },
32631
+ "warning": {
32632
+ "type": [
32633
+ "string",
32634
+ "null"
32635
+ ]
31593
32636
  }
31594
32637
  },
31595
32638
  "required": [
31596
32639
  "provider",
31597
32640
  "state",
31598
32641
  "workers",
31599
- "verifiedWorkers"
32642
+ "verifiedWorkers",
32643
+ "error",
32644
+ "warning"
31600
32645
  ]
31601
32646
  }
31602
32647
  },
@@ -31991,6 +33036,15 @@
31991
33036
  "name": "scheduleId",
31992
33037
  "in": "query"
31993
33038
  },
33039
+ {
33040
+ "schema": {
33041
+ "type": "string",
33042
+ "format": "uuid"
33043
+ },
33044
+ "required": false,
33045
+ "name": "workflowRunId",
33046
+ "in": "query"
33047
+ },
31994
33048
  {
31995
33049
  "schema": {
31996
33050
  "type": "string",
@@ -49605,6 +50659,12 @@
49605
50659
  "schema": {
49606
50660
  "type": "object",
49607
50661
  "properties": {
50662
+ "labels": {
50663
+ "type": "object",
50664
+ "additionalProperties": {
50665
+ "type": "string"
50666
+ }
50667
+ },
49608
50668
  "groups": {
49609
50669
  "type": "array",
49610
50670
  "items": {
@@ -50362,6 +51422,9 @@
50362
51422
  "owner": {
50363
51423
  "$ref": "#/components/schemas/SessionOwner"
50364
51424
  },
51425
+ "groupKey": {
51426
+ "type": "string"
51427
+ },
50365
51428
  "approvals": {
50366
51429
  "type": "array",
50367
51430
  "items": {
@@ -50408,7 +51471,8 @@
50408
51471
  "root",
50409
51472
  "chain",
50410
51473
  "access",
50411
- "owner"
51474
+ "owner",
51475
+ "groupKey"
50412
51476
  ]
50413
51477
  }
50414
51478
  }
@@ -55599,6 +56663,71 @@
55599
56663
  "batchSize",
55600
56664
  "slowestStatementMs"
55601
56665
  ]
56666
+ },
56667
+ "scriptRuns": {
56668
+ "type": "object",
56669
+ "properties": {
56670
+ "at": {
56671
+ "type": "string"
56672
+ },
56673
+ "rowsDeleted": {
56674
+ "type": "number"
56675
+ },
56676
+ "batches": {
56677
+ "type": "number"
56678
+ },
56679
+ "durationMs": {
56680
+ "type": "number"
56681
+ },
56682
+ "dryRun": {
56683
+ "type": "boolean"
56684
+ },
56685
+ "cumulativeRowsDeleted": {
56686
+ "type": "number"
56687
+ },
56688
+ "outcome": {
56689
+ "type": "string",
56690
+ "enum": [
56691
+ "converged",
56692
+ "budget_exhausted",
56693
+ "error"
56694
+ ]
56695
+ },
56696
+ "drained": {
56697
+ "type": "boolean"
56698
+ },
56699
+ "backlogRemaining": {
56700
+ "type": "number"
56701
+ },
56702
+ "batchSize": {
56703
+ "type": "number"
56704
+ },
56705
+ "slowestStatementMs": {
56706
+ "type": "number"
56707
+ },
56708
+ "lastError": {
56709
+ "type": "string"
56710
+ },
56711
+ "lastErrorAt": {
56712
+ "type": "string"
56713
+ },
56714
+ "lastSuccessAt": {
56715
+ "type": "string"
56716
+ }
56717
+ },
56718
+ "required": [
56719
+ "at",
56720
+ "rowsDeleted",
56721
+ "batches",
56722
+ "durationMs",
56723
+ "dryRun",
56724
+ "cumulativeRowsDeleted",
56725
+ "outcome",
56726
+ "drained",
56727
+ "backlogRemaining",
56728
+ "batchSize",
56729
+ "slowestStatementMs"
56730
+ ]
55602
56731
  }
55603
56732
  }
55604
56733
  }
@@ -61334,6 +62463,19 @@
61334
62463
  "bearerAuth": []
61335
62464
  }
61336
62465
  ],
62466
+ "parameters": [
62467
+ {
62468
+ "schema": {
62469
+ "type": "string",
62470
+ "pattern": "^[\\x21-\\x7E]{1,255}$",
62471
+ "description": "Optional client-generated key, 1-255 visible ASCII characters (a UUID works). The first request the server accepts under a key creates one workflow; a retry with the same key and an equivalent body gets that request's status and body back (with `Idempotent-Replayed: true`) and changes nothing. The key is scoped to the caller's identity and this operation; it is not a credential. The same key with a different body is a 409. A request rejected before it is accepted (validation, auth, not found, disabled) does not use up the key. Accepted keys do not expire."
62472
+ },
62473
+ "required": false,
62474
+ "description": "Optional client-generated key, 1-255 visible ASCII characters (a UUID works). The first request the server accepts under a key creates one workflow; a retry with the same key and an equivalent body gets that request's status and body back (with `Idempotent-Replayed: true`) and changes nothing. The key is scoped to the caller's identity and this operation; it is not a credential. The same key with a different body is a 409. A request rejected before it is accepted (validation, auth, not found, disabled) does not use up the key. Accepted keys do not expire.",
62475
+ "name": "Idempotency-Key",
62476
+ "in": "header"
62477
+ }
62478
+ ],
61337
62479
  "requestBody": {
61338
62480
  "content": {
61339
62481
  "application/json": {
@@ -61635,7 +62777,27 @@
61635
62777
  }
61636
62778
  },
61637
62779
  "400": {
61638
- "description": "Invalid definition",
62780
+ "description": "Invalid definition, or a malformed Idempotency-Key",
62781
+ "content": {
62782
+ "application/json": {
62783
+ "schema": {
62784
+ "$ref": "#/components/schemas/ErrorResponse"
62785
+ }
62786
+ }
62787
+ }
62788
+ },
62789
+ "409": {
62790
+ "description": "Idempotency-Key was already used for a different request",
62791
+ "content": {
62792
+ "application/json": {
62793
+ "schema": {
62794
+ "$ref": "#/components/schemas/ErrorResponse"
62795
+ }
62796
+ }
62797
+ }
62798
+ },
62799
+ "410": {
62800
+ "description": "The workflow created under this Idempotency-Key was deleted",
61639
62801
  "content": {
61640
62802
  "application/json": {
61641
62803
  "schema": {
@@ -62341,6 +63503,7 @@
62341
63503
  "/api/workflows/{id}/trigger": {
62342
63504
  "post": {
62343
63505
  "summary": "Trigger a workflow execution",
63506
+ "description": "With an `Idempotency-Key`, a retry returns the accepted run's `runId` and `skipped` without starting, resuming or waiting for anything, even after the workflow was disabled or edited and whatever state the run is in now.",
62344
63507
  "tags": [
62345
63508
  "Workflows"
62346
63509
  ],
@@ -62357,6 +63520,17 @@
62357
63520
  "required": true,
62358
63521
  "name": "id",
62359
63522
  "in": "path"
63523
+ },
63524
+ {
63525
+ "schema": {
63526
+ "type": "string",
63527
+ "pattern": "^[\\x21-\\x7E]{1,255}$",
63528
+ "description": "Optional client-generated key, 1-255 visible ASCII characters (a UUID works). The first request the server accepts under a key starts one run; a retry with the same key and an equivalent body gets that request's status and body back (with `Idempotent-Replayed: true`) and changes nothing. The key is scoped to the caller's identity and this operation; it is not a credential. The same key with a different body is a 409. A request rejected before it is accepted (validation, auth, not found, disabled) does not use up the key. Accepted keys do not expire."
63529
+ },
63530
+ "required": false,
63531
+ "description": "Optional client-generated key, 1-255 visible ASCII characters (a UUID works). The first request the server accepts under a key starts one run; a retry with the same key and an equivalent body gets that request's status and body back (with `Idempotent-Replayed: true`) and changes nothing. The key is scoped to the caller's identity and this operation; it is not a credential. The same key with a different body is a 409. A request rejected before it is accepted (validation, auth, not found, disabled) does not use up the key. Accepted keys do not expire.",
63532
+ "name": "Idempotency-Key",
63533
+ "in": "header"
62360
63534
  }
62361
63535
  ],
62362
63536
  "responses": {
@@ -62383,7 +63557,7 @@
62383
63557
  }
62384
63558
  },
62385
63559
  "400": {
62386
- "description": "Workflow is disabled",
63560
+ "description": "Workflow is disabled, or a malformed Idempotency-Key",
62387
63561
  "content": {
62388
63562
  "application/json": {
62389
63563
  "schema": {
@@ -62411,6 +63585,26 @@
62411
63585
  }
62412
63586
  }
62413
63587
  }
63588
+ },
63589
+ "409": {
63590
+ "description": "Idempotency-Key was already used for a different request",
63591
+ "content": {
63592
+ "application/json": {
63593
+ "schema": {
63594
+ "$ref": "#/components/schemas/ErrorResponse"
63595
+ }
63596
+ }
63597
+ }
63598
+ },
63599
+ "410": {
63600
+ "description": "The workflow triggered under this Idempotency-Key was deleted",
63601
+ "content": {
63602
+ "application/json": {
63603
+ "schema": {
63604
+ "$ref": "#/components/schemas/ErrorResponse"
63605
+ }
63606
+ }
63607
+ }
62414
63608
  }
62415
63609
  }
62416
63610
  }
@@ -62599,6 +63793,7 @@
62599
63793
  "/api/workflow-runs/{id}": {
62600
63794
  "get": {
62601
63795
  "summary": "Get a workflow run with steps (includes retry columns)",
63796
+ "description": "Returns the run with its `context` and every step with its `input` by default. A step's `input` is a snapshot of the context when the step started, so in runs with loops (polling, `wait`, iterations) the response grows with steps × context size. Pass `fields=slim` to drop `run.context` and `steps[].input`; outputs, errors, diagnostics, retry fields and `parent` stay.",
62602
63797
  "tags": [
62603
63798
  "Workflows"
62604
63799
  ],
@@ -62615,32 +63810,134 @@
62615
63810
  "required": true,
62616
63811
  "name": "id",
62617
63812
  "in": "path"
63813
+ },
63814
+ {
63815
+ "schema": {
63816
+ "type": "string",
63817
+ "enum": [
63818
+ "full",
63819
+ "slim"
63820
+ ]
63821
+ },
63822
+ "required": false,
63823
+ "name": "fields",
63824
+ "in": "query"
62618
63825
  }
62619
63826
  ],
62620
63827
  "responses": {
62621
63828
  "200": {
62622
63829
  "description": "Workflow run details with steps including retry info",
63830
+ "content": {
63831
+ "application/json": {
63832
+ "schema": {
63833
+ "anyOf": [
63834
+ {
63835
+ "type": "object",
63836
+ "properties": {
63837
+ "run": {
63838
+ "$ref": "#/components/schemas/WorkflowRun"
63839
+ },
63840
+ "steps": {
63841
+ "type": "array",
63842
+ "items": {
63843
+ "$ref": "#/components/schemas/WorkflowRunStep"
63844
+ }
63845
+ },
63846
+ "parent": {
63847
+ "$ref": "#/components/schemas/WorkflowRunParent"
63848
+ }
63849
+ },
63850
+ "required": [
63851
+ "run",
63852
+ "steps"
63853
+ ]
63854
+ },
63855
+ {
63856
+ "type": "object",
63857
+ "properties": {
63858
+ "run": {
63859
+ "$ref": "#/components/schemas/WorkflowRunSummary"
63860
+ },
63861
+ "steps": {
63862
+ "type": "array",
63863
+ "items": {
63864
+ "$ref": "#/components/schemas/WorkflowRunStepSlim"
63865
+ }
63866
+ },
63867
+ "parent": {
63868
+ "$ref": "#/components/schemas/WorkflowRunParent"
63869
+ }
63870
+ },
63871
+ "required": [
63872
+ "run",
63873
+ "steps"
63874
+ ]
63875
+ }
63876
+ ]
63877
+ }
63878
+ }
63879
+ }
63880
+ },
63881
+ "404": {
63882
+ "description": "Run not found",
63883
+ "content": {
63884
+ "application/json": {
63885
+ "schema": {
63886
+ "$ref": "#/components/schemas/ErrorResponse"
63887
+ }
63888
+ }
63889
+ }
63890
+ }
63891
+ }
63892
+ }
63893
+ },
63894
+ "/api/workflow-runs/{id}/tree": {
63895
+ "get": {
63896
+ "summary": "Get a workflow run and every sub-workflow run below it",
63897
+ "description": "Follows stored parent links (`parentStepId` → step → run) through every attempt of every step, terminal runs included. `runs` holds list rows without `context`, root first. `hasOpenWork` is true while any run in the tree is live, has a pending, running or waiting step, a queued retry, an open task or a pending approval; after a cancel it turns false once the tree has settled. Both come from one read snapshot. The tree is not paginated. Links that form a cycle or nest deeper than 32 levels return 409.",
63898
+ "tags": [
63899
+ "Workflows"
63900
+ ],
63901
+ "security": [
63902
+ {
63903
+ "bearerAuth": []
63904
+ }
63905
+ ],
63906
+ "parameters": [
63907
+ {
63908
+ "schema": {
63909
+ "type": "string"
63910
+ },
63911
+ "required": true,
63912
+ "name": "id",
63913
+ "in": "path"
63914
+ }
63915
+ ],
63916
+ "responses": {
63917
+ "200": {
63918
+ "description": "The run tree",
62623
63919
  "content": {
62624
63920
  "application/json": {
62625
63921
  "schema": {
62626
63922
  "type": "object",
62627
63923
  "properties": {
62628
- "run": {
62629
- "$ref": "#/components/schemas/WorkflowRun"
63924
+ "rootRunId": {
63925
+ "type": "string"
62630
63926
  },
62631
- "steps": {
63927
+ "runs": {
62632
63928
  "type": "array",
62633
63929
  "items": {
62634
- "$ref": "#/components/schemas/WorkflowRunStep"
63930
+ "$ref": "#/components/schemas/WorkflowRunSummary"
62635
63931
  }
62636
63932
  },
62637
- "parent": {
62638
- "$ref": "#/components/schemas/WorkflowRunParent"
63933
+ "hasOpenWork": {
63934
+ "type": "boolean"
62639
63935
  }
62640
63936
  },
62641
63937
  "required": [
62642
- "run",
62643
- "steps"
63938
+ "rootRunId",
63939
+ "runs",
63940
+ "hasOpenWork"
62644
63941
  ]
62645
63942
  }
62646
63943
  }
@@ -62655,6 +63952,16 @@
62655
63952
  }
62656
63953
  }
62657
63954
  }
63955
+ },
63956
+ "409": {
63957
+ "description": "Stored parent links form a cycle or nest past the depth bound",
63958
+ "content": {
63959
+ "application/json": {
63960
+ "schema": {
63961
+ "$ref": "#/components/schemas/ErrorResponse"
63962
+ }
63963
+ }
63964
+ }
62658
63965
  }
62659
63966
  }
62660
63967
  }