@desplega.ai/agent-swarm 1.158.0 → 1.160.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 (378) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-xaq4n6pc.js → acp-adapter-2mjwcsfh.js} +124 -27
  3. package/dist/{actions-p9hz5yat.js → actions-e43rxskr.js} +35 -30
  4. package/dist/{anthropic-messages-51pz26qe.js → anthropic-messages-5qx80j9k.js} +106 -16
  5. package/dist/{app-g26wdcz6.js → app-mc7xfagn.js} +12 -10
  6. package/dist/{assistant-wydfqkb3.js → assistant-sedkzv3b.js} +42 -31
  7. package/dist/{azure-openai-responses-8gksqtmz.js → azure-openai-responses-nfb21z9a.js} +13 -14
  8. package/dist/{boot-reembed-se8zmdcp.js → boot-reembed-cqz9swn5.js} +13 -12
  9. package/dist/{boot-reembed-g5ckg9yb.js → boot-reembed-m3656j2n.js} +14 -13
  10. package/dist/{boot-scrub-logs-wfxqan61.js → boot-scrub-logs-xbxf5d7w.js} +11 -9
  11. package/dist/boot-seeds-gsetbs5y.js +28 -0
  12. package/dist/{claude-adapter-tv2x4f36.js → claude-adapter-dc6289mc.js} +28 -23
  13. package/dist/{claude-managed-adapter-41b2s7fd.js → claude-managed-adapter-naaw51me.js} +4 -3
  14. package/dist/{claude-managed-setup-60g8aazx.js → claude-managed-setup-eacvchx0.js} +12 -3
  15. package/dist/claude-sdk-session-bqp2xvym.js +29722 -0
  16. package/dist/{cli-987hg0aa.js → cli-0jwe9034.js} +2 -2
  17. package/dist/{cli-vj6h9kc2.js → cli-0m7wct0d.js} +59 -1
  18. package/dist/{cli-c07r9a2m.js → cli-0q3avq3s.js} +12 -11
  19. package/dist/{cli-19jenss3.js → cli-0wgxmwf6.js} +31 -10
  20. package/dist/cli-0x01kwrd.js +491 -0
  21. package/dist/cli-0xqde53b.js +176 -0
  22. package/dist/cli-10nhj6xq.js +8355 -0
  23. package/dist/{cli-tt9k8r35.js → cli-12tszpk9.js} +479 -910
  24. package/dist/{cli-5b6b62tz.js → cli-13hw4z91.js} +1 -1
  25. package/dist/{cli-cqt19wg6.js → cli-1a2j50m0.js} +11 -2
  26. package/dist/{cli-xberxa1r.js → cli-25fcq4b4.js} +2 -2
  27. package/dist/{cli-npssxgaz.js → cli-2pdaysab.js} +52 -2
  28. package/dist/cli-3qhyh31j.js +166 -0
  29. package/dist/cli-447dt1h3.js +3828 -0
  30. package/dist/cli-4derpgyk.js +115 -0
  31. package/dist/{cli-00w2c66p.js → cli-523679eh.js} +13 -2
  32. package/dist/{cli-y95wp3tg.js → cli-58e8yr0d.js} +1 -1
  33. package/dist/{cli-24k806sc.js → cli-5nbmpy8w.js} +3 -3
  34. package/dist/{cli-53sz8gkz.js → cli-6cs6wzxt.js} +1 -1
  35. package/dist/cli-741yb0xx.js +1027 -0
  36. package/dist/cli-74h9hscv.js +69 -0
  37. package/dist/cli-7cxw8b60.js +14910 -0
  38. package/dist/{cli-xhaeg2nc.js → cli-7e398j1h.js} +1 -1
  39. package/dist/cli-7kyk9jr3.js +22 -0
  40. package/dist/cli-89s4ngw3.js +183 -0
  41. package/dist/{cli-9b13ggd1.js → cli-89v6kyq7.js} +1 -0
  42. package/dist/{cli-ftfvggzx.js → cli-9hsgwz4w.js} +1045 -581
  43. package/dist/{cli-rqz8qbw7.js → cli-a8dvhzrt.js} +59 -20
  44. package/dist/{cli-j57qkrpq.js → cli-azhgzetg.js} +395 -56
  45. package/dist/cli-br0qdrnp.js +2150 -0
  46. package/dist/{cli-rj19hc34.js → cli-btfv8y88.js} +1 -1
  47. package/dist/{cli-8qmme6vd.js → cli-c8a36vcc.js} +2 -2
  48. package/dist/cli-cpvsaqsw.js +333 -0
  49. package/dist/cli-d5czme6m.js +17805 -0
  50. package/dist/{cli-h38x0qhg.js → cli-et8m9xsv.js} +4 -3
  51. package/dist/{cli-x24pshtq.js → cli-evvtk35y.js} +6 -6
  52. package/dist/{cli-7s3syk22.js → cli-f8gy6r2r.js} +5 -5
  53. package/dist/{cli-zt1227k1.js → cli-fkqhbg8g.js} +5 -3
  54. package/dist/{cli-9httdpyq.js → cli-g2whhdrf.js} +1 -1
  55. package/dist/cli-gt4hxb8p.js +99 -0
  56. package/dist/{cli-s8eet254.js → cli-jajnsm8q.js} +37184 -53838
  57. package/dist/{cli-7gtvvpbh.js → cli-jayjpjmb.js} +21 -12
  58. package/dist/{cli-68w09sjw.js → cli-jyk0ynw2.js} +27 -89
  59. package/dist/{cli-aehm1rbq.js → cli-jz4w45qt.js} +1152 -61
  60. package/dist/cli-kmcpfwn2.js +333856 -0
  61. package/dist/{cli-4198qc9v.js → cli-ktmyrtpn.js} +19 -3
  62. package/dist/{cli-j55n64b6.js → cli-mfe5btp9.js} +505 -189
  63. package/dist/{cli-q67y4wzm.js → cli-phsaj4xq.js} +24 -2
  64. package/dist/{cli-1hkrch3k.js → cli-pm1rst0h.js} +46 -7
  65. package/dist/{cli-pw9rj5t9.js → cli-pqetb83f.js} +1 -176
  66. package/dist/{cli-ggm92wcn.js → cli-ptr8h7kp.js} +20 -1
  67. package/dist/{cli-s8s499xy.js → cli-qbksc292.js} +3 -2
  68. package/dist/{cli-47m6dkd3.js → cli-qydf22qq.js} +597 -346
  69. package/dist/{cli-3gmcwfyx.js → cli-r1mxd1xh.js} +13 -6
  70. package/dist/cli-rb9m6rpe.js +4980 -0
  71. package/dist/cli-rykfmgwg.js +102 -0
  72. package/dist/{cli-5d10vd2m.js → cli-shkxm1vn.js} +6 -5
  73. package/dist/{cli-eetrvv91.js → cli-t3p77qk1.js} +1 -1
  74. package/dist/cli-tfky2838.js +756 -0
  75. package/dist/{cli-g8djp6qe.js → cli-tmqt7dpj.js} +40 -0
  76. package/dist/{cli-fgqxwrpv.js → cli-tpq83z89.js} +1631 -127
  77. package/dist/cli-trc24wk2.js +143 -0
  78. package/dist/{cli-aky8tctm.js → cli-tzx2ke1v.js} +3 -3
  79. package/dist/cli-v7fn5gms.js +1425 -0
  80. package/dist/{cli-wscdvcqz.js → cli-vctdqs5h.js} +1 -1
  81. package/dist/{cli-cw9zck8j.js → cli-xjcywfsf.js} +8 -4
  82. package/dist/{cli-k0g1sjzm.js → cli-ybgv4kw2.js} +18 -11
  83. package/dist/{cli-rjehvrts.js → cli-ydmcgve1.js} +8 -8
  84. package/dist/{cli-vhjwh6cz.js → cli-ygwm91nt.js} +1 -1
  85. package/dist/{cli-mcnhgnn1.js → cli-ykk5jaax.js} +184 -26
  86. package/dist/{cli-de1396j2.js → cli-ywybs5as.js} +7 -1
  87. package/dist/cli-zpep9q5e.js +491 -0
  88. package/dist/cli.js +41 -32
  89. package/dist/cloudflare-workers-ai-system-one-k6fbxw9d.js +46 -0
  90. package/dist/{codex-adapter-cnm8wk11.js → codex-adapter-nmxcatww.js} +26 -17
  91. package/dist/{codex-hook-9hptmdhj.js → codex-hook-20me6byw.js} +2 -2
  92. package/dist/{codex-login-x3jk4etn.js → codex-login-w6fz4xbz.js} +50 -5
  93. package/dist/{codex-session-runner-gfg547zj.js → codex-session-runner-90aa80ev.js} +24 -17
  94. package/dist/{commands-e3bn0p75.js → commands-8wcq1kn7.js} +11 -9
  95. package/dist/{db-03v9kzr2.js → db-j40kc4se.js} +25 -11
  96. package/dist/{devin-adapter-8vgkwh29.js → devin-adapter-dpsv6hd9.js} +1 -1
  97. package/dist/{dispatcher-nrmg8yht.js → dispatcher-4zqy768d.js} +34 -29
  98. package/dist/{dsh-adapter-k03nfqa6.js → dsh-adapter-mpnzgztj.js} +3 -3
  99. package/dist/{e2b-93x1k0j5.js → e2b-ez07znam.js} +4 -3
  100. package/dist/execute-6e7qeyk4.js +1017 -0
  101. package/dist/{google-generative-ai-bxmv50nc.js → google-generative-ai-k6n5nbpp.js} +6 -5
  102. package/dist/{google-vertex-809af514.js → google-vertex-44xxtcvp.js} +6 -5
  103. package/dist/{handlers-aqcedbyb.js → handlers-kjdce1w5.js} +37 -32
  104. package/dist/{hook-ybvmrmhq.js → hook-czx13n12.js} +19 -15
  105. package/dist/{hook-7vkskkre.js → hook-r2t4bqfg.js} +18 -14
  106. package/dist/{http-2eqa8t24.js → http-3bbb19be.js} +900 -145
  107. package/dist/{index-f6cryxwe.js → index-4a5njnm1.js} +2 -59
  108. package/dist/{index-x71bvq0p.js → index-668me3f0.js} +35 -30
  109. package/dist/{index-c6zsv1bd.js → index-7aj368tw.js} +13 -12
  110. package/dist/{index-1yks3qcr.js → index-fg0dsp6c.js} +34 -29
  111. package/dist/{index-chgdkq36.js → index-kkv84jq9.js} +34 -29
  112. package/dist/{index-a3vn96n8.js → index-zg7vp46x.js} +198 -54
  113. package/dist/{keepalive-vtkf5n99.js → keepalive-yra8dy57.js} +13 -11
  114. package/dist/{lead-h3sp357x.js → lead-va0pad2c.js} +54 -49
  115. package/dist/llama-cpp-classify-tgj35k8d.js +335 -0
  116. package/dist/{maintenance-jzeqtk3q.js → maintenance-hqewtmyg.js} +14 -13
  117. package/dist/{mistral-conversations-zx0kn554.js → mistral-conversations-pc3ntnxt.js} +14 -17
  118. package/dist/{oauth-refresh-sweep-qp3dzmdp.js → oauth-refresh-sweep-7rdt1m9n.js} +12 -10
  119. package/dist/{onboard-tmsp0qbz.js → onboard-j6ms6d0x.js} +6 -5
  120. package/dist/{openai-codex-responses-4vjqzvjp.js → openai-codex-responses-bbancrr0.js} +21 -8
  121. package/dist/{openai-completions-9hjrqbw8.js → openai-completions-jpaj5g2b.js} +9 -12
  122. package/dist/{openai-responses-7b1pn0xt.js → openai-responses-200k1wx4.js} +23 -18
  123. package/dist/{opencode-adapter-x6x2da1z.js → opencode-adapter-89rabkw2.js} +8 -7
  124. package/dist/{openrouter-images-9f9ek4rw.js → openrouter-images-8yx3487g.js} +5 -7
  125. package/dist/{otel-impl-9mz73q65.js → otel-impl-a792rjz0.js} +1 -1
  126. package/dist/{pi-messages-txpjj39q.js → pi-messages-vxdt8v7j.js} +2 -1
  127. package/dist/{pi-mono-adapter-m6dvv0dz.js → pi-mono-adapter-g7qzvr3v.js} +295 -70
  128. package/dist/pricing-refresh-wx0tp7cb.js +39 -0
  129. package/dist/quickjs-r1pq2107.wasm +0 -0
  130. package/dist/{rbac-roles-c9wqz83x.js → rbac-roles-8tzawacv.js} +12 -10
  131. package/dist/{render-v2-gryrh9h8.js → render-v2-mm7zswb8.js} +12 -10
  132. package/dist/runtime-zyssgse0.js +24 -0
  133. package/dist/{setup-q9720bt6.js → setup-8y70ys6t.js} +6 -5
  134. package/dist/typesafe-system-one-2ef30pec.js +27 -0
  135. package/dist/{virtual-modules-3htpgn8x.js → virtual-modules-6nmk7h3n.js} +22 -13
  136. package/dist/{work-objects-b76x7deb.js → work-objects-fg6xkb0n.js} +37 -32
  137. package/dist/{worker-6vrxbv41.js → worker-wmwhxsph.js} +54 -49
  138. package/openapi.json +1314 -91
  139. package/package.json +12 -11
  140. package/src/be/db/agents.ts +20 -0
  141. package/src/be/db/api-keys.ts +70 -0
  142. package/src/be/db/tasks/human-free.ts +442 -0
  143. package/src/be/db/tasks/read.ts +56 -1
  144. package/src/be/db/tasks/write.ts +107 -11
  145. package/src/be/db.ts +274 -188
  146. package/src/be/harness-model-support.ts +182 -0
  147. package/src/be/human-free-drain.ts +67 -0
  148. package/src/be/memory/providers/sqlite-store.ts +51 -15
  149. package/src/be/migrations/182_task_human_free_flag.sql +63 -0
  150. package/src/be/migrations/183_human_free_reclassify_queue.sql +25 -0
  151. package/src/be/migrations/184_model_catalog.sql +120 -0
  152. package/src/be/migrations/185_api_key_auth_failures.sql +6 -0
  153. package/src/be/migrations/186_api_key_seat_mismatch.sql +8 -0
  154. package/src/be/model-catalog-store.ts +644 -0
  155. package/src/be/model-tier-keys.ts +46 -0
  156. package/src/be/model-tier-resolution.ts +534 -0
  157. package/src/be/model-validation.ts +188 -0
  158. package/src/be/models-catalog.ts +61 -7
  159. package/src/be/modelsdev-cache.json +82 -0
  160. package/src/be/modelsdev-cache.ts +2 -0
  161. package/src/be/pricing-refresh.ts +154 -12
  162. package/src/be/scripts/typecheck.ts +15 -0
  163. package/src/be/seed/runner.ts +18 -12
  164. package/src/be/seed/types.ts +1 -0
  165. package/src/be/seed-scripts/catalog/task-failure-audit.ts +61 -9
  166. package/src/be/swarm-config-guard.ts +8 -0
  167. package/src/cli.tsx +10 -0
  168. package/src/commands/claude-managed-setup.ts +3 -1
  169. package/src/commands/codex-login.ts +67 -0
  170. package/src/commands/credential-outcome-report.ts +191 -0
  171. package/src/commands/rate-limit-outcome.ts +34 -4
  172. package/src/commands/runner.ts +357 -186
  173. package/src/commands/seat-mismatch-report.ts +46 -0
  174. package/src/extensions/apply-task-create.ts +27 -1
  175. package/src/extensions/contract-types.generated.ts +1 -1
  176. package/src/heartbeat/heartbeat.ts +79 -17
  177. package/src/heartbeat/templates.ts +2 -2
  178. package/src/http/agents.ts +62 -1
  179. package/src/http/api-keys.ts +140 -2
  180. package/src/http/codex-oauth-keep-warm.ts +3 -5
  181. package/src/http/index.ts +8 -0
  182. package/src/http/memory.ts +12 -5
  183. package/src/http/models-catalog.ts +357 -8
  184. package/src/http/poll.ts +54 -3
  185. package/src/http/schedules.ts +51 -6
  186. package/src/http/script-runs.ts +12 -0
  187. package/src/http/session-data.ts +2 -5
  188. package/src/http/stats.ts +6 -8
  189. package/src/http/status.ts +15 -1
  190. package/src/http/tasks.ts +90 -7
  191. package/src/http/usage-cache.ts +56 -15
  192. package/src/http/workflows.ts +46 -8
  193. package/src/mcp-client/http-client.ts +5 -0
  194. package/src/memory/recall-query.ts +74 -0
  195. package/src/prompts/base-prompt.ts +15 -4
  196. package/src/prompts/session-templates.ts +23 -1
  197. package/src/providers/acp-adapter.ts +1 -0
  198. package/src/providers/claude-adapter.ts +14 -5
  199. package/src/providers/claude-managed-adapter.ts +1 -0
  200. package/src/providers/claude-managed-models.ts +47 -161
  201. package/src/providers/claude-sdk-session.ts +3 -1
  202. package/src/providers/codex-adapter.ts +14 -14
  203. package/src/providers/codex-models.ts +65 -198
  204. package/src/providers/devin-adapter.ts +1 -0
  205. package/src/providers/dsh-adapter.ts +2 -1
  206. package/src/providers/harness-version.ts +83 -7
  207. package/src/providers/opencode-adapter.ts +53 -1
  208. package/src/providers/pi-binary-root/src/extensions/codemode/worker.ts +11 -0
  209. package/src/providers/pi-codemode-runtime.ts +17 -0
  210. package/src/providers/pi-mono-adapter.ts +361 -83
  211. package/src/providers/pi-mono-extension.ts +16 -1
  212. package/src/providers/reasoning-effort.ts +44 -140
  213. package/src/providers/types.ts +8 -0
  214. package/src/rbac/legacy-policy.ts +43 -0
  215. package/src/rbac/permissions.ts +15 -0
  216. package/src/scripts-runtime/sdk-allowlist.ts +4 -0
  217. package/src/scripts-runtime/types/stdlib.d.ts +15 -0
  218. package/src/scripts-runtime/types/swarm-extension.d.ts +3 -0
  219. package/src/scripts-runtime/types/swarm-sdk.d.ts +15 -0
  220. package/src/server.ts +6 -0
  221. package/src/slack/assistant.ts +13 -0
  222. package/src/slack/message-text.ts +56 -2
  223. package/src/slack/render-v2.ts +87 -37
  224. package/src/slack/session-status.ts +541 -0
  225. package/src/slack/thread-buffer.ts +10 -2
  226. package/src/tasks/sibling-awareness.ts +3 -2
  227. package/src/telemetry.ts +5 -4
  228. package/src/templates.d.ts +6 -0
  229. package/src/tests/agents-list-model-display.test.ts +4 -6
  230. package/src/tests/api-key-auth-failure-route.test.ts +142 -0
  231. package/src/tests/api-key-tracking.test.ts +368 -1
  232. package/src/tests/base-prompt.test.ts +43 -2
  233. package/src/tests/claude-adapter.test.ts +68 -0
  234. package/src/tests/claude-managed-adapter.test.ts +12 -18
  235. package/src/tests/codex-adapter.test.ts +2 -1
  236. package/src/tests/codex-auth-failure.test.ts +52 -0
  237. package/src/tests/codex-gpt6-release.test.ts +66 -5
  238. package/src/tests/codex-login.test.ts +116 -0
  239. package/src/tests/context-window.test.ts +7 -5
  240. package/src/tests/credential-exhaustion-policy.test.ts +118 -3
  241. package/src/tests/credential-outcome-report.test.ts +171 -0
  242. package/src/tests/credential-status-api.test.ts +103 -2
  243. package/src/tests/db-extraction-contract.test.ts +1 -0
  244. package/src/tests/db-task-read-contract.test.ts +10 -1
  245. package/src/tests/db-task-write-contract.test.ts +535 -2
  246. package/src/tests/docs-index-footprint.test.js +3 -3
  247. package/src/tests/dokploy-deploy.test.ts +315 -0
  248. package/src/tests/dsh-adapter.test.ts +1 -1
  249. package/src/tests/explicit-model-validation.test.ts +583 -0
  250. package/src/tests/extensions-pre-task.test.ts +73 -0
  251. package/src/tests/fetch-resolved-env.test.ts +46 -0
  252. package/src/tests/hang-watchdog-worker.ts +47 -0
  253. package/src/tests/hang-watchdog.test.ts +45 -0
  254. package/src/tests/hang-watchdog.ts +30 -0
  255. package/src/tests/harness-model-guard.test.ts +123 -0
  256. package/src/tests/harness-model-support.test.ts +374 -0
  257. package/src/tests/harness-version.test.ts +70 -3
  258. package/src/tests/heartbeat-checklist-config.test.ts +71 -0
  259. package/src/tests/heartbeat-checklist.test.ts +4 -2
  260. package/src/tests/heartbeat-orphan-resume.test.ts +48 -0
  261. package/src/tests/http-task-write-ownership.test.ts +172 -0
  262. package/src/tests/human-free-flag.test.ts +279 -0
  263. package/src/tests/human-free-oracle.ts +57 -0
  264. package/src/tests/human-free-reclassify.test.ts +669 -0
  265. package/src/tests/memory-fts-populate.test.ts +139 -0
  266. package/src/tests/memory-http-recall-gating.test.ts +125 -1
  267. package/src/tests/migration-046-budgets.test.ts +3 -3
  268. package/src/tests/model-catalog-migration.test.ts +134 -0
  269. package/src/tests/model-catalog-table.test.ts +249 -0
  270. package/src/tests/model-catalog-write-access.test.ts +387 -0
  271. package/src/tests/model-rate-limit-windows.test.ts +19 -0
  272. package/src/tests/model-tier-resolution.test.ts +611 -0
  273. package/src/tests/models-catalog.test.ts +1 -1
  274. package/src/tests/multi-runtime-enabled-stats.test.ts +65 -1
  275. package/src/tests/opencode-adapter.test.ts +157 -2
  276. package/src/tests/package-publish.test.ts +137 -36
  277. package/src/tests/pi-codemode.test.ts +246 -0
  278. package/src/tests/pi-mono-adapter.test.ts +3 -0
  279. package/src/tests/pi-native-mcp.test.ts +193 -0
  280. package/src/tests/pi-tool-exposure.test.ts +374 -0
  281. package/src/tests/preload.ts +3 -0
  282. package/src/tests/pricing-routes.test.ts +2 -2
  283. package/src/tests/prompt-template-session.test.ts +5 -3
  284. package/src/tests/rate-limit-event.test.ts +65 -0
  285. package/src/tests/rate-limit-outcome.test.ts +90 -0
  286. package/src/tests/rbac-engine.test.ts +77 -3
  287. package/src/tests/reasoning-effort.test.ts +109 -0
  288. package/src/tests/refresh-modelsdev-carryforward.test.ts +5 -5
  289. package/src/tests/runner-key-completion-outcome.test.ts +112 -0
  290. package/src/tests/runner-key-outcome-late-reset.test.ts +224 -0
  291. package/src/tests/runner-registration-retry.test.ts +149 -0
  292. package/src/tests/runtime-model-catalog.test.ts +86 -0
  293. package/src/tests/script-connections.test.ts +9 -0
  294. package/src/tests/seat-mismatch-report.test.ts +85 -0
  295. package/src/tests/seed-scripts.test.ts +138 -0
  296. package/src/tests/seed.test.ts +25 -0
  297. package/src/tests/session-costs.test.ts +14 -11
  298. package/src/tests/slack-message-text.test.ts +101 -0
  299. package/src/tests/slack-render-v2.test.ts +96 -0
  300. package/src/tests/slack-session-status.test.ts +626 -0
  301. package/src/tests/slack-thread-buffer-context.test.ts +93 -0
  302. package/src/tests/status.test.ts +29 -0
  303. package/src/tests/steering-promotion.test.ts +51 -0
  304. package/src/tests/store-progress-ownership.test.ts +136 -0
  305. package/src/tests/subscription-plans.test.ts +28 -0
  306. package/src/tests/task-cascade-fail.test.ts +148 -2
  307. package/src/tests/task-citations.test.ts +3 -2
  308. package/src/tests/tool-annotations.test.ts +1 -1
  309. package/src/tests/usage-cache.test.ts +166 -0
  310. package/src/tests/workflow-agent-task.test.ts +30 -0
  311. package/src/tests/workflow-executors.test.ts +5 -2
  312. package/src/tests/workflow-system-one-decision-review.test.ts +1021 -0
  313. package/src/tests/workflow-system-one-decision-save-warnings.test.ts +365 -0
  314. package/src/tests/workflow-system-one-decision.test.ts +2063 -0
  315. package/src/tests/workflow-triggers-v2.test.ts +320 -0
  316. package/src/tools/model-catalog/index.ts +137 -0
  317. package/src/tools/schedules/create-schedule.ts +17 -2
  318. package/src/tools/schedules/patch-schedule.ts +31 -1
  319. package/src/tools/schedules/update-schedule.ts +31 -1
  320. package/src/tools/send-task.ts +18 -1
  321. package/src/tools/store-progress.ts +49 -4
  322. package/src/tools/task-action.ts +14 -1
  323. package/src/tools/tool-config.ts +3 -1
  324. package/src/tools/workflows/create-workflow.ts +17 -4
  325. package/src/tools/workflows/patch-workflow-node.ts +17 -7
  326. package/src/tools/workflows/patch-workflow.ts +9 -2
  327. package/src/tools/workflows/update-workflow.ts +17 -4
  328. package/src/types.ts +41 -1
  329. package/src/utils/codex-auth-failure.ts +34 -0
  330. package/src/utils/context-window.ts +47 -53
  331. package/src/utils/credentials.ts +72 -30
  332. package/src/utils/error-tracker.ts +80 -0
  333. package/src/utils/harness-cli-version.ts +115 -0
  334. package/src/utils/harness-model-error.ts +33 -0
  335. package/src/utils/model-rate-limit-windows.ts +12 -0
  336. package/src/utils/runtime-model-catalog.ts +152 -0
  337. package/src/utils/spawn-model-guard.ts +43 -0
  338. package/src/utils/subscription-plans.ts +22 -0
  339. package/src/workflows/approval-resolution.ts +39 -0
  340. package/src/workflows/definition.ts +7 -0
  341. package/src/workflows/engine.ts +69 -1
  342. package/src/workflows/executors/agent-task.ts +16 -6
  343. package/src/workflows/executors/base.ts +53 -0
  344. package/src/workflows/executors/human-in-the-loop.ts +8 -8
  345. package/src/workflows/executors/index.ts +1 -0
  346. package/src/workflows/executors/registry.ts +2 -0
  347. package/src/workflows/executors/system-one-decision.ts +1232 -0
  348. package/src/workflows/executors/system-one-providers.ts +301 -0
  349. package/src/workflows/executors/workflow-llm.ts +13 -1
  350. package/src/workflows/model-validation.ts +45 -0
  351. package/src/workflows/patch-definition.ts +5 -0
  352. package/src/workflows/readiness.ts +86 -0
  353. package/src/workflows/recovery.ts +12 -12
  354. package/src/workflows/resume.ts +23 -9
  355. package/src/workflows/triggers.ts +85 -0
  356. package/templates/schedules/daily-blocker-digest/content.md +4 -5
  357. package/templates/skills/agent-browser/SKILL.md +6 -5
  358. package/templates/skills/agent-browser/content.md +6 -5
  359. package/templates/skills/heartbeat-runbook/config.json +1 -1
  360. package/templates/skills/heartbeat-runbook/content.md +2 -2
  361. package/templates/skills/swarm-scripts/SKILL.md +1 -1
  362. package/templates/skills/swarm-scripts/content.md +1 -1
  363. package/templates/skills/workflow-iterate/content.md +82 -1
  364. package/templates/workflows/claude-code-changelog-watch/content.md +2 -0
  365. package/templates/workflows/pr-review-status-sweep/content.md +2 -0
  366. package/dist/boot-seeds-s3q01xj3.js +0 -26
  367. package/dist/claude-sdk-session-t442qz6f.js +0 -39108
  368. package/dist/cli-0xjkj1j7.js +0 -61
  369. package/dist/cli-20cj37vt.js +0 -335561
  370. package/dist/cli-2djtr51b.js +0 -48
  371. package/dist/cli-65hjmev5.js +0 -1141
  372. package/dist/cli-aw1jwp1r.js +0 -14075
  373. package/dist/cli-h967nb6r.js +0 -6603
  374. package/dist/cli-vapyk8sw.js +0 -20
  375. package/dist/cli-ws6rqycm.js +0 -247
  376. package/dist/pricing-refresh-v1cbr9te.js +0 -27
  377. package/src/providers/modelsdev-reasoning.json +0 -6453
  378. package/dist/{index-f24115ge.js → index-2wsdsnmm.js} +3 -3
@@ -53,6 +53,12 @@ import {
53
53
  import { buildAskClosure, type ClosureState, closureState } from "./closure";
54
54
  import { reactionName, type SlackReactionEvent } from "./reaction-shortcode";
55
55
  import { getAgentDisplayName, getAgentEmoji } from "./responses";
56
+ import {
57
+ _resetSlackSessionStatusForTests,
58
+ beginSlackStatusTick,
59
+ reconcileSlackSessionStatus,
60
+ type StatusBudget,
61
+ } from "./session-status";
56
62
  import { getSlackOutputAttachments } from "./task-attachments";
57
63
  import { isAwaitingWake, isDeferredTask, slackTaskOutput } from "./task-output";
58
64
 
@@ -167,6 +173,7 @@ function outcomeDeliveryGate(taskId: string, card: SlackMessageRecord | null): b
167
173
  async function reconcileStuckOutcomeDelivery(
168
174
  task: AgentTask,
169
175
  card: SlackMessageRecord | null,
176
+ statusBudget: StatusBudget | undefined,
170
177
  ): Promise<void> {
171
178
  if (!card || card.deliveryAbandonedAt) return;
172
179
  if (card.deliveryAttempts < OUTCOME_DELIVERY_MAX_ATTEMPTS) return;
@@ -178,15 +185,16 @@ async function reconcileStuckOutcomeDelivery(
178
185
  `[Slack] Recovered a stuck outcome delivery for task ${task.id} left at ` +
179
186
  `${card.deliveryAttempts} attempt(s) without a give-up; surfacing failure and clearing the working indicator`,
180
187
  );
181
- await surfaceOutcomeDeliveryGiveUp(task, lastError, card.deliveryAttempts);
188
+ await surfaceOutcomeDeliveryGiveUp(task, lastError, card.deliveryAttempts, statusBudget);
182
189
  }
183
190
 
184
191
  /** Reconciles a stuck card (see reconcileStuckOutcomeDelivery), then applies the gate. */
185
192
  async function checkOutcomeDeliveryGate(
186
193
  task: AgentTask,
187
194
  card: SlackMessageRecord | null,
195
+ statusBudget: StatusBudget | undefined,
188
196
  ): Promise<boolean> {
189
- await reconcileStuckOutcomeDelivery(task, card);
197
+ await reconcileStuckOutcomeDelivery(task, card, statusBudget);
190
198
  return outcomeDeliveryGate(task.id, card);
191
199
  }
192
200
 
@@ -198,6 +206,7 @@ async function noteOutcomeDeliveryFailure(
198
206
  task: AgentTask,
199
207
  tree: SlackMessageRecord,
200
208
  error: unknown,
209
+ statusBudget: StatusBudget | undefined,
201
210
  ): Promise<void> {
202
211
  const detail = describeSlackError(error);
203
212
  // Scrubbed once here so every downstream sink — the two DB writes below and
@@ -249,7 +258,7 @@ async function noteOutcomeDeliveryFailure(
249
258
  `[Slack] Giving up on outcome delivery for task ${task.id} after ${attempts} attempt(s)` +
250
259
  `${terminal ? " (Slack refused the delivery)" : ""}; surfacing failure and clearing the working indicator`,
251
260
  );
252
- await surfaceOutcomeDeliveryGiveUp(task, summary, attempts);
261
+ await surfaceOutcomeDeliveryGiveUp(task, summary, attempts, statusBudget);
253
262
  }
254
263
 
255
264
  /** Best-effort: post a visible failure notice and clear the "is working" status.
@@ -258,6 +267,7 @@ async function surfaceOutcomeDeliveryGiveUp(
258
267
  task: AgentTask,
259
268
  summary: string,
260
269
  attempts: number,
270
+ statusBudget: StatusBudget | undefined,
261
271
  ): Promise<void> {
262
272
  const app = getSlackApp();
263
273
  if (!app || !task.slackChannelId || !task.slackThreadTs) return;
@@ -273,27 +283,27 @@ async function surfaceOutcomeDeliveryGiveUp(
273
283
  scrubSecrets(postError instanceof Error ? postError.message : String(postError)),
274
284
  );
275
285
  }
276
- await clearAssistantStatus(app.client, task.slackChannelId, task.slackThreadTs);
286
+ await clearAssistantStatus(app.client, task.slackChannelId, task.slackThreadTs, statusBudget);
277
287
  }
278
288
 
279
- /** Clears the assistant "is working" indicator in DM channels. Best-effort: the
280
- * call throws when the thread isn't an assistant thread, which is expected
281
- * for non-DM channels and safe to ignore. */
289
+ /** Re-syncs Slack's native "working" status once an outcome card has landed:
290
+ * cleared when nothing else in the thread is still running, kept while it is.
291
+ * Best-effort and never throws. When the native call is unavailable a DM
292
+ * falls back to clearing the legacy assistant indicator, as it always did.
293
+ * A render tick passes its budget; past it the clear waits for the next tick. */
282
294
  async function clearAssistantStatus(
283
295
  client: WebClient,
284
296
  channelId: string,
285
297
  threadTs: string,
298
+ statusBudget: StatusBudget | undefined,
286
299
  ): Promise<void> {
287
- if (!channelId.startsWith("D")) return;
288
- try {
289
- await client.apiCall("assistant.threads.setStatus", {
290
- channel_id: channelId,
291
- thread_ts: threadTs,
292
- status: "",
293
- });
294
- } catch (error) {
295
- console.warn(`[Slack] Failed to clear assistant status for ${channelId}/${threadTs}:`, error);
296
- }
300
+ await reconcileSlackSessionStatus({
301
+ client,
302
+ channelId,
303
+ threadTs,
304
+ budget: statusBudget,
305
+ outcomeDelivered: true,
306
+ });
297
307
  }
298
308
 
299
309
  function slackTreeStallMinutes(): number {
@@ -698,11 +708,25 @@ async function createThreadTree(task: AgentTask): Promise<SlackMessageRecord | n
698
708
  return record;
699
709
  }
700
710
 
701
- export async function ensureSlackThreadTree(taskIds: string[]): Promise<SlackMessageRecord | null> {
711
+ /**
712
+ * `statusBudget` is the render tick's shared cap on native status writes; calls
713
+ * from outside a tick (a newly accepted ask) pass none.
714
+ */
715
+ export async function ensureSlackThreadTree(
716
+ taskIds: string[],
717
+ statusBudget?: StatusBudget,
718
+ ): Promise<SlackMessageRecord | null> {
702
719
  const task = (await Promise.all(taskIds.map(getTaskById))).find(
703
720
  (candidate): candidate is AgentTask => !!candidate,
704
721
  );
705
722
  if (!task?.slackChannelId || !task.slackThreadTs) return null;
723
+ // Every accepted ask passes through here: start Slack's own "working" state
724
+ // with the tree. A no-op when the thread is already showing it.
725
+ await reconcileSlackSessionStatus({
726
+ channelId: task.slackChannelId,
727
+ threadTs: task.slackThreadTs,
728
+ budget: statusBudget,
729
+ });
706
730
  const contextKey =
707
731
  task.contextKey ??
708
732
  slackContextKey({
@@ -719,7 +743,7 @@ export async function ensureSlackThreadTree(taskIds: string[]): Promise<SlackMes
719
743
  } catch (error) {
720
744
  if (!isSlackMessageNotFound(error)) throw error;
721
745
  await discardTreeRecord(existing);
722
- return ensureSlackThreadTree(taskIds);
746
+ return ensureSlackThreadTree(taskIds, statusBudget);
723
747
  }
724
748
  }
725
749
  const creationKey = physicalThreadKey(task.slackChannelId, task.slackThreadTs);
@@ -770,17 +794,21 @@ async function withTreeUpdateLock<T>(
770
794
  }
771
795
  }
772
796
 
773
- async function replaceMissingTree(tree: SlackMessageRecord): Promise<SlackMessageRecord | null> {
797
+ async function replaceMissingTree(
798
+ tree: SlackMessageRecord,
799
+ statusBudget: StatusBudget | undefined,
800
+ ): Promise<SlackMessageRecord | null> {
774
801
  await discardTreeRecord(tree);
775
802
  const taskIds = (await getSlackTasksInThread(tree.channelId, tree.threadTs)).map(
776
803
  (task) => task.id,
777
804
  );
778
- return taskIds.length > 0 ? ensureSlackThreadTree(taskIds) : null;
805
+ return taskIds.length > 0 ? ensureSlackThreadTree(taskIds, statusBudget) : null;
779
806
  }
780
807
 
781
808
  async function updateThreadTree(
782
809
  tree: SlackMessageRecord,
783
810
  bypassThrottle = false,
811
+ statusBudget?: StatusBudget,
784
812
  ): Promise<boolean> {
785
813
  const result = await withTreeUpdateLock(tree.channelId, tree.threadTs, async () => {
786
814
  const app = getSlackApp();
@@ -824,7 +852,7 @@ async function updateThreadTree(
824
852
  });
825
853
 
826
854
  if (result === "missing") {
827
- await replaceMissingTree(tree);
855
+ await replaceMissingTree(tree, statusBudget);
828
856
  return false;
829
857
  }
830
858
  return result === "updated";
@@ -1237,6 +1265,8 @@ export async function streamOutcomeCard(
1237
1265
  options?: {
1238
1266
  buildContent?: (task: AgentTask, slackReplySent: boolean) => Promise<string>;
1239
1267
  conclusionKind?: SlackConclusionKind;
1268
+ /** The render tick's shared cap on native status writes. */
1269
+ statusBudget?: StatusBudget;
1240
1270
  },
1241
1271
  ): Promise<SlackMessageRecord | null> {
1242
1272
  const app = getSlackApp();
@@ -1387,7 +1417,12 @@ export async function streamOutcomeCard(
1387
1417
  // what normally clears Slack's own "is working…" assistant indicator.
1388
1418
  // Clear it explicitly too, so a delivery that only ever fails still
1389
1419
  // doesn't leave the thread stuck spinning.
1390
- await clearAssistantStatus(app.client, task.slackChannelId, task.slackThreadTs);
1420
+ await clearAssistantStatus(
1421
+ app.client,
1422
+ task.slackChannelId,
1423
+ task.slackThreadTs,
1424
+ options?.statusBudget,
1425
+ );
1391
1426
  const permalink = await resolvePermalink(app.client, task.slackChannelId, outcome.ts);
1392
1427
  return await updateSlackMessageRecord(outcome.id, {
1393
1428
  permalink,
@@ -1559,12 +1594,13 @@ export async function processSlackRenderV2(): Promise<void> {
1559
1594
  const activatedAt = await ensureSlackRenderV2Activation();
1560
1595
  const delegationEnabled = isSlackDelegationEnabled();
1561
1596
  const delegationActivatedAt = delegationEnabled ? await ensureSlackDelegationActivation() : null;
1597
+ const statusTick = beginSlackStatusTick();
1562
1598
 
1563
1599
  for (const task of await getSlackTasksMissingTree()) {
1564
1600
  if (!isSlackRenderV2Enabled()) return;
1565
1601
  if (!task.slackChannelId || !task.slackThreadTs) continue;
1566
1602
  try {
1567
- await ensureSlackThreadTree([task.id]);
1603
+ await ensureSlackThreadTree([task.id], statusTick.budget);
1568
1604
  } catch (error) {
1569
1605
  console.error(`[Slack] Failed to create v2 tree for task ${task.id}:`, error);
1570
1606
  }
@@ -1576,7 +1612,10 @@ export async function processSlackRenderV2(): Promise<void> {
1576
1612
  const initialTasks = await getSlackTasksInThread(tree.channelId, tree.threadTs);
1577
1613
  if (isPendingSlackMessage(tree)) {
1578
1614
  try {
1579
- const recovered = await ensureSlackThreadTree(initialTasks.map((task) => task.id));
1615
+ const recovered = await ensureSlackThreadTree(
1616
+ initialTasks.map((task) => task.id),
1617
+ statusTick.budget,
1618
+ );
1580
1619
  if (!recovered) continue;
1581
1620
  tree = recovered;
1582
1621
  } catch (error) {
@@ -1591,7 +1630,7 @@ export async function processSlackRenderV2(): Promise<void> {
1591
1630
  } catch (error) {
1592
1631
  if (isSlackMessageNotFound(error)) {
1593
1632
  try {
1594
- await replaceMissingTree(tree);
1633
+ await replaceMissingTree(tree, statusTick.budget);
1595
1634
  } catch (replacementError) {
1596
1635
  console.error(
1597
1636
  `[Slack] Failed to replace missing v2 tree ${tree.id}:`,
@@ -1635,7 +1674,7 @@ export async function processSlackRenderV2(): Promise<void> {
1635
1674
  continue;
1636
1675
  }
1637
1676
  try {
1638
- const replacement = await replaceMissingTree(tree);
1677
+ const replacement = await replaceMissingTree(tree, statusTick.budget);
1639
1678
  if (!replacement) continue;
1640
1679
  tree = replacement;
1641
1680
  tasks = await getSlackTasksInThread(tree.channelId, tree.threadTs);
@@ -1692,9 +1731,12 @@ export async function processSlackRenderV2(): Promise<void> {
1692
1731
  if (!ownerAsk || ownerAsk.createdAt < delegationActivatedAt) continue;
1693
1732
  if (childCardsThisTick >= CHILD_CARDS_PER_TICK) continue;
1694
1733
  if (askId && (await childCardCountFor(askId)) >= CHILD_CARDS_PER_ASK) continue;
1695
- if (!(await checkOutcomeDeliveryGate(task, card))) continue;
1734
+ if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
1696
1735
  try {
1697
- const outcome = await streamOutcomeCard(task, tree, { buildContent: childOutcomeContent });
1736
+ const outcome = await streamOutcomeCard(task, tree, {
1737
+ buildContent: childOutcomeContent,
1738
+ statusBudget: statusTick.budget,
1739
+ });
1698
1740
  if (outcome) {
1699
1741
  noteOutcomeDeliverySuccess(task.id);
1700
1742
  childCardsThisTick++;
@@ -1703,7 +1745,7 @@ export async function processSlackRenderV2(): Promise<void> {
1703
1745
  }
1704
1746
  outcomeCreated ||= !!outcome;
1705
1747
  } catch (error) {
1706
- await noteOutcomeDeliveryFailure(task, tree, error);
1748
+ await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
1707
1749
  }
1708
1750
  }
1709
1751
 
@@ -1720,16 +1762,16 @@ export async function processSlackRenderV2(): Promise<void> {
1720
1762
  task.createdAt >= delegationActivatedAt;
1721
1763
 
1722
1764
  if (!deferByClosure) {
1723
- if (!(await checkOutcomeDeliveryGate(task, card))) continue;
1765
+ if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
1724
1766
  try {
1725
- const outcome = await streamOutcomeCard(task, tree);
1767
+ const outcome = await streamOutcomeCard(task, tree, { statusBudget: statusTick.budget });
1726
1768
  if (outcome) {
1727
1769
  noteOutcomeDeliverySuccess(task.id);
1728
1770
  await finalizeTerminalSlackReactions([task]);
1729
1771
  }
1730
1772
  outcomeCreated ||= !!outcome;
1731
1773
  } catch (error) {
1732
- await noteOutcomeDeliveryFailure(task, tree, error);
1774
+ await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
1733
1775
  }
1734
1776
  continue;
1735
1777
  }
@@ -1755,12 +1797,13 @@ export async function processSlackRenderV2(): Promise<void> {
1755
1797
  if (childCardPending) continue;
1756
1798
  const state = closureState(task, closure, new Date(), settleSec, timeoutMin);
1757
1799
  if (state === "open") continue;
1758
- if (!(await checkOutcomeDeliveryGate(task, card))) continue;
1800
+ if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
1759
1801
  try {
1760
1802
  const outcome = await streamOutcomeCard(task, tree, {
1761
1803
  buildContent: (_t, slackReplySent) =>
1762
1804
  askConclusionContent(task, closure, state, slackReplySent),
1763
1805
  conclusionKind: state === "timedOut" ? "timeout" : "complete",
1806
+ statusBudget: statusTick.budget,
1764
1807
  });
1765
1808
  if (outcome) {
1766
1809
  noteOutcomeDeliverySuccess(task.id);
@@ -1784,17 +1827,19 @@ export async function processSlackRenderV2(): Promise<void> {
1784
1827
  }
1785
1828
  outcomeCreated ||= !!outcome;
1786
1829
  } catch (error) {
1787
- await noteOutcomeDeliveryFailure(task, tree, error);
1830
+ await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
1788
1831
  }
1789
1832
  }
1790
1833
  try {
1791
- await updateThreadTree(tree, outcomeCreated);
1834
+ await updateThreadTree(tree, outcomeCreated, statusTick.budget);
1792
1835
  } catch (error) {
1793
1836
  console.error(`[Slack] Failed to update v2 tree ${tree.id}:`, error);
1794
1837
  }
1838
+ await statusTick.reconcile(tree.channelId, tree.threadTs);
1795
1839
  }
1796
1840
 
1797
1841
  await refreshResolvedDeferralCards();
1842
+ await statusTick.finish();
1798
1843
  }
1799
1844
 
1800
1845
  export function _resetSlackRenderV2ForTests(): void {
@@ -1807,6 +1852,7 @@ export function _resetSlackRenderV2ForTests(): void {
1807
1852
  cachedTeamId = undefined;
1808
1853
  outcomeDeliveryNextAttemptAt.clear();
1809
1854
  outcomeReservedWithoutAttempt.clear();
1855
+ _resetSlackSessionStatusForTests();
1810
1856
  }
1811
1857
 
1812
1858
  /**
@@ -1814,4 +1860,8 @@ export function _resetSlackRenderV2ForTests(): void {
1814
1860
  * its pre-reservation branch (a DB read throwing before streamOutcomeCard's
1815
1861
  * own reservation) aren't practical to reproduce end-to-end in tests.
1816
1862
  */
1817
- export const _noteOutcomeDeliveryFailureForTests = noteOutcomeDeliveryFailure;
1863
+ export const _noteOutcomeDeliveryFailureForTests = (
1864
+ task: AgentTask,
1865
+ tree: SlackMessageRecord,
1866
+ error: unknown,
1867
+ ): Promise<void> => noteOutcomeDeliveryFailure(task, tree, error, undefined);