@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
@@ -0,0 +1,171 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, test } from "bun:test";
2
+ import { reportCredentialOutcomeThenFinish } from "../commands/credential-outcome-report";
3
+ import { type ApiConfig, ensureTaskFinished } from "../commands/runner";
4
+ import type { ProviderResult } from "../providers/types";
5
+
6
+ /**
7
+ * Completion-path regression for a `credits_required` seat mismatch. The
8
+ * runner finishes every task through `reportCredentialOutcomeThenFinish`,
9
+ * so this drives the same function with the runner's real
10
+ * `ensureTaskFinished` as the finish step. It asserts that a delayed seat
11
+ * report lands before `POST /api/tasks/:id/finish`, and that no key-wide
12
+ * `/api/keys/report-rate-limit` is sent.
13
+ */
14
+
15
+ interface RecordedRequest {
16
+ method: string;
17
+ path: string;
18
+ body: Record<string, unknown> | null;
19
+ at: number;
20
+ }
21
+
22
+ const SEAT_REPORT_DELAY_MS = 150;
23
+ let requests: RecordedRequest[] = [];
24
+ let seatReportRespondedAt: number | undefined;
25
+ let originalFetch: typeof fetch;
26
+
27
+ beforeAll(() => {
28
+ originalFetch = globalThis.fetch;
29
+ // Records each request when the fetch starts, so a fire-and-forget report
30
+ // is visible to the assertions even if nobody awaits it.
31
+ globalThis.fetch = (async (input, init) => {
32
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
33
+ const path = new URL(url).pathname;
34
+ const method = init?.method ?? "GET";
35
+ const rawBody = typeof init?.body === "string" ? init.body : "";
36
+ requests.push({ method, path, body: rawBody ? JSON.parse(rawBody) : null, at: Date.now() });
37
+
38
+ if (path === "/api/keys/report-seat-mismatch") {
39
+ await Bun.sleep(SEAT_REPORT_DELAY_MS);
40
+ seatReportRespondedAt = Date.now();
41
+ return Response.json({ success: true, message: "recorded" });
42
+ }
43
+ if (method === "POST" && /^\/api\/tasks\/[^/]+\/finish$/.test(path)) {
44
+ return Response.json({ success: true, task: { status: "failed" } });
45
+ }
46
+ return Response.json({ success: true });
47
+ }) as typeof fetch;
48
+ });
49
+
50
+ afterAll(() => {
51
+ globalThis.fetch = originalFetch;
52
+ });
53
+
54
+ beforeEach(() => {
55
+ requests = [];
56
+ seatReportRespondedAt = undefined;
57
+ });
58
+
59
+ const apiConfig: ApiConfig = {
60
+ apiUrl: "http://credential-outcome-report.test",
61
+ apiKey: "example-test-key",
62
+ agentId: "00000000-0000-4000-8000-000000000001",
63
+ };
64
+
65
+ const credentialInfo = { keyType: "CLAUDE_CODE_OAUTH_TOKEN", keySuffix: "TJAAA", keyIndex: 3 };
66
+
67
+ async function completeTask(taskId: string, result: ProviderResult, model: string) {
68
+ const modelWindowBlocks = new Map<string, number>();
69
+ await reportCredentialOutcomeThenFinish(
70
+ {
71
+ apiUrl: apiConfig.apiUrl,
72
+ apiKey: apiConfig.apiKey,
73
+ credentialInfo,
74
+ result,
75
+ failureReason: result.failureReason,
76
+ model,
77
+ codexCreditsExhaustedCooldownMs: 2 * 60 * 60 * 1000,
78
+ modelWindowBlocks,
79
+ },
80
+ () =>
81
+ ensureTaskFinished(
82
+ apiConfig,
83
+ "worker",
84
+ taskId,
85
+ result.exitCode,
86
+ result.failureReason,
87
+ undefined,
88
+ "claude",
89
+ ),
90
+ );
91
+ return { modelWindowBlocks };
92
+ }
93
+
94
+ describe("reportCredentialOutcomeThenFinish — credits_required seat mismatch", () => {
95
+ const cases: Array<{ name: string; result: Omit<ProviderResult, "exitCode" | "isError"> }> = [
96
+ {
97
+ name: "failure text",
98
+ result: {
99
+ sessionId: "session-1",
100
+ failureReason: "Fable 5.1 requires usage credits. Switch to another model to continue.",
101
+ },
102
+ },
103
+ {
104
+ name: "structured credits_required event",
105
+ result: {
106
+ sessionId: "session-2",
107
+ failureReason: "Claude process exited with code 1",
108
+ creditsRequired: {
109
+ observedAt: new Date().toISOString(),
110
+ overageDisabledReason: "member_zero_credit_limit",
111
+ },
112
+ },
113
+ },
114
+ ];
115
+
116
+ for (const { name, result } of cases) {
117
+ test(`${name}: seat report lands before /finish and no key-wide report is sent`, async () => {
118
+ const taskId = "11111111-1111-4111-8111-111111111111";
119
+ const { modelWindowBlocks } = await completeTask(
120
+ taskId,
121
+ { exitCode: 1, isError: true, ...result },
122
+ "claude-fable-5-1",
123
+ );
124
+
125
+ const seatReports = requests.filter((r) => r.path === "/api/keys/report-seat-mismatch");
126
+ expect(seatReports).toHaveLength(1);
127
+ expect(seatReports[0]?.method).toBe("POST");
128
+ expect(seatReports[0]?.body).toEqual({
129
+ keyType: "CLAUDE_CODE_OAUTH_TOKEN",
130
+ keySuffix: "TJAAA",
131
+ keyIndex: 3,
132
+ model: "fable",
133
+ });
134
+
135
+ const finish = requests.find((r) => r.path === `/api/tasks/${taskId}/finish`);
136
+ expect(finish).toBeDefined();
137
+ expect(seatReportRespondedAt).toBeDefined();
138
+ expect(finish!.at).toBeGreaterThanOrEqual(seatReportRespondedAt!);
139
+
140
+ expect(requests.some((r) => r.path === "/api/keys/report-rate-limit")).toBe(false);
141
+ expect(modelWindowBlocks.size).toBe(0);
142
+ });
143
+ }
144
+ });
145
+
146
+ describe("reportCredentialOutcomeThenFinish — seat mismatch after a key-wide rejection", () => {
147
+ test("the earlier key-wide rejection is still reported next to the seat report", async () => {
148
+ const taskId = "22222222-2222-4222-8222-222222222222";
149
+ const rateLimitResetAt = new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString();
150
+ await completeTask(
151
+ taskId,
152
+ {
153
+ exitCode: 1,
154
+ isError: true,
155
+ sessionId: "session-3",
156
+ failureReason: "Claude process exited with code 1",
157
+ rateLimitResetAt,
158
+ creditsRequired: {
159
+ observedAt: new Date().toISOString(),
160
+ overageDisabledReason: "member_zero_credit_limit",
161
+ },
162
+ },
163
+ "claude-fable-5-1",
164
+ );
165
+
166
+ expect(requests.filter((r) => r.path === "/api/keys/report-seat-mismatch")).toHaveLength(1);
167
+ const keyReports = requests.filter((r) => r.path === "/api/keys/report-rate-limit");
168
+ expect(keyReports).toHaveLength(1);
169
+ expect(keyReports[0]?.body).toMatchObject({ keyIndex: 3, rateLimitedUntil: rateLimitResetAt });
170
+ });
171
+ });
@@ -1,8 +1,17 @@
1
1
  import { afterAll, beforeAll, describe, expect, test } from "bun:test";
2
2
  import { unlink } from "node:fs/promises";
3
3
  import { createServer as createHttpServer, type Server } from "node:http";
4
- import { closeDb, createAgent, initDb } from "../be/db";
4
+ import {
5
+ closeDb,
6
+ createAgent,
7
+ getAvailableKeyIndices,
8
+ getDbClient,
9
+ initDb,
10
+ recordKeyUsage,
11
+ setApiKeyPlan,
12
+ } from "../be/db";
5
13
  import { handleAgentsRest } from "../http/agents";
14
+ import { handleApiKeys } from "../http/api-keys";
6
15
  import { getPathSegments, parseQueryParams } from "../http/utils";
7
16
  import { listenOnFreePort } from "./test-net";
8
17
 
@@ -28,7 +37,9 @@ function createTestServer(): Server {
28
37
  const pathSegments = getPathSegments(url);
29
38
  const queryParams = parseQueryParams(url);
30
39
 
31
- const handled = await handleAgentsRest(req, res, pathSegments, queryParams, undefined);
40
+ const handled =
41
+ (await handleAgentsRest(req, res, pathSegments, queryParams, undefined)) ||
42
+ (await handleApiKeys(req, res, pathSegments, queryParams));
32
43
  if (!handled) {
33
44
  res.writeHead(404, { "Content-Type": "application/json" });
34
45
  res.end(JSON.stringify({ error: "Not found" }));
@@ -315,4 +326,94 @@ describe("Phase 4 — credential-status HTTP endpoints", () => {
315
326
  expect(afterSnapshot.credStatus.acp).toMatchObject({ target: "opencode" });
316
327
  expect(afterSnapshot.credStatus.acp?.configOptions).toHaveLength(1);
317
328
  });
329
+
330
+ describe("POST /api/keys/report-seat-mismatch", () => {
331
+ const keyType = "CLAUDE_CODE_OAUTH_TOKEN";
332
+
333
+ async function reportSeatMismatch(keySuffix: string, keyIndex: number, model = "fable") {
334
+ const resp = await fetch(`${baseUrl}/api/keys/report-seat-mismatch`, {
335
+ method: "POST",
336
+ headers: { "Content-Type": "application/json" },
337
+ body: JSON.stringify({ keyType, keySuffix, keyIndex, model }),
338
+ });
339
+ expect(resp.status).toBe(200);
340
+ }
341
+
342
+ async function keyStatus(keySuffix: string) {
343
+ const resp = await fetch(`${baseUrl}/api/keys/status?keyType=${keyType}`);
344
+ expect(resp.status).toBe(200);
345
+ const body = (await resp.json()) as {
346
+ keys: Array<{
347
+ keySuffix: string;
348
+ status: string;
349
+ plan: string | null;
350
+ planSource: string | null;
351
+ lastSeatMismatchAt: string | null;
352
+ lastSeatMismatchModel: string | null;
353
+ }>;
354
+ };
355
+ return body.keys.find((k) => k.keySuffix === keySuffix);
356
+ }
357
+
358
+ test("an estimated plan becomes claude_team_standard / detected", async () => {
359
+ await recordKeyUsage(keyType, "EST01", 0, null);
360
+ await getDbClient().run(
361
+ "UPDATE api_key_status SET plan = 'claude_max_5x', planSource = 'estimated' WHERE keySuffix = ?",
362
+ ["EST01"],
363
+ );
364
+ await reportSeatMismatch("EST01", 0);
365
+ const key = await keyStatus("EST01");
366
+ expect(key?.plan).toBe("claude_team_standard");
367
+ expect(key?.planSource).toBe("detected");
368
+ expect(key?.lastSeatMismatchAt).not.toBeNull();
369
+ expect(key?.lastSeatMismatchModel).toBe("fable");
370
+ expect(key?.status).toBe("available");
371
+ });
372
+
373
+ test("a manual plan is never changed", async () => {
374
+ await recordKeyUsage(keyType, "MAN01", 1, null);
375
+ await setApiKeyPlan(keyType, "MAN01", "claude_team_premium");
376
+ await reportSeatMismatch("MAN01", 1);
377
+ const key = await keyStatus("MAN01");
378
+ expect(key?.plan).toBe("claude_team_premium");
379
+ expect(key?.planSource).toBe("manual");
380
+ expect(key?.lastSeatMismatchAt).not.toBeNull();
381
+ expect(key?.lastSeatMismatchModel).toBe("fable");
382
+ expect(key?.status).toBe("available");
383
+ });
384
+
385
+ test("a key with no row gets a row with the detected plan", async () => {
386
+ await reportSeatMismatch("NEW01", 2);
387
+ const key = await keyStatus("NEW01");
388
+ expect(key?.plan).toBe("claude_team_standard");
389
+ expect(key?.planSource).toBe("detected");
390
+ expect(key?.lastSeatMismatchModel).toBe("fable");
391
+ expect(key?.status).toBe("available");
392
+ });
393
+
394
+ test("an Opus rejection records the columns but infers no plan", async () => {
395
+ await recordKeyUsage(keyType, "OPU01", 4, null);
396
+ await getDbClient().run(
397
+ "UPDATE api_key_status SET plan = 'claude_max_5x', planSource = 'estimated' WHERE keySuffix = ?",
398
+ ["OPU01"],
399
+ );
400
+ await reportSeatMismatch("OPU01", 4, "opus");
401
+ const key = await keyStatus("OPU01");
402
+ expect(key?.plan).toBe("claude_max_5x");
403
+ expect(key?.planSource).toBe("estimated");
404
+ expect(key?.lastSeatMismatchModel).toBe("opus");
405
+ expect(key?.status).toBe("available");
406
+ // Fable admission for the key does not change.
407
+ const fable = await getAvailableKeyIndices(keyType, 5, "global", null, "fable");
408
+ expect(fable.seatBlockedIndices).not.toContain(4);
409
+ expect(fable.availableIndices).toContain(4);
410
+ });
411
+
412
+ test("GET /api/keys/status returns the seat mismatch columns", async () => {
413
+ await recordKeyUsage(keyType, "NONE1", 3, null);
414
+ const key = await keyStatus("NONE1");
415
+ expect(key).toHaveProperty("lastSeatMismatchAt", null);
416
+ expect(key).toHaveProperty("lastSeatMismatchModel", null);
417
+ });
418
+ });
318
419
  });
@@ -14,6 +14,7 @@ test("facade exposes repository bindings without internal exports", () => {
14
14
  "rowToAgentTask",
15
15
  "rowToAgentTaskSummary",
16
16
  "configureTaskReadDependencies",
17
+ "NEVER_STARTED_TASK_STATUSES",
17
18
  ].includes(name)
18
19
  ) {
19
20
  expect(name in db).toBe(false);
@@ -64,6 +64,7 @@ type:ExistingTrackerContextWorkReason
64
64
  type:InboxSummary
65
65
  type:InsertPricingRowInput
66
66
  type:InsertTaskAttachmentInput
67
+ type:KeyAuthFailureResult
67
68
  type:KeyCostSummary
68
69
  type:KvJsonFieldEquals
69
70
  type:McpServerFilters
@@ -232,6 +233,7 @@ value:getAgentMailInboxMapping
232
233
  value:getAgentMailInboxMappingsByAgent
233
234
  value:getAgentMcpServers
234
235
  value:getAgentSkills
236
+ value:getAgentStatusCounts
235
237
  value:getAgentWithTasks
236
238
  value:getAgentWorkingOnThread
237
239
  value:getAllAgentMailInboxMappings
@@ -386,6 +388,7 @@ value:getStepCountForNode
386
388
  value:getStuckApprovalRuns
387
389
  value:getStuckWaitRuns
388
390
  value:getStuckWorkflowRuns
391
+ value:getSupersededTasksWithUnsettledDependents
389
392
  value:getSupersededTasksWithoutResume
390
393
  value:getSwarmConfigById
391
394
  value:getSwarmConfigLookupById
@@ -409,7 +412,6 @@ value:getUnassignedTaskIdsForAgent
409
412
  value:getUnassignedTasksCount
410
413
  value:getUnreadInboxMessages
411
414
  value:getUnreadMessages
412
- value:getUsageDataVersion
413
415
  value:getUserById
414
416
  value:getWaitStateById
415
417
  value:getWaitStateByStepId
@@ -442,6 +444,7 @@ value:isExtensionAgent
442
444
  value:isPendingSlackMessage
443
445
  value:isPoolAffinityEnforcementEnabled
444
446
  value:isSettledSlackMessage
447
+ value:isSlackThreadAwaitingHuman
445
448
  value:isSqliteVecAvailable
446
449
  value:kvPrefixUpperBound
447
450
  value:listAgentsWithCredStatusByProvider
@@ -463,6 +466,7 @@ value:listScriptRunJournalSteps
463
466
  value:listScriptRuns
464
467
  value:listSkillFileManifest
465
468
  value:listSkills
469
+ value:listSlackThreadsAwaitingHuman
466
470
  value:listTaskTemplates
467
471
  value:listUserFavorites
468
472
  value:listWorkflowRuns
@@ -496,7 +500,9 @@ value:promoteDraftTask
496
500
  value:reassociateSessionLogs
497
501
  value:recordBudgetRefusalNotification
498
502
  value:recordInlineScriptRun
503
+ value:recordKeyAuthFailure
499
504
  value:recordKeyRateLimitWindows
505
+ value:recordKeySeatMismatch
500
506
  value:recordKeyUsage
501
507
  value:recordSlackMessage
502
508
  value:recordTaskPullRequestAttachments
@@ -529,6 +535,7 @@ value:setBudgetRefusalFollowUpTaskId
529
535
  value:setFavorite
530
536
  value:setSlackMessageTracking
531
537
  value:setUserFavorite
538
+ value:settleSupersededTaskDependents
532
539
  value:shouldBlockPolling
533
540
  value:startTask
534
541
  value:supersedeTask
@@ -604,6 +611,7 @@ value:getMostRecentTaskInThread
604
611
  value:getPendingSlackRelayTasks
605
612
  value:getRecentlyFinishedWorkerTasks
606
613
  value:getSlackTasksMissingTree
614
+ value:getSupersededTasksWithUnsettledDependents
607
615
  value:getSupersededTasksWithoutResume
608
616
  value:getTaskById
609
617
  value:getTaskStats
@@ -620,6 +628,7 @@ value:resetTasksNotified`.split("\n");
620
628
  const internal = [
621
629
  "type:AgentTaskRow",
622
630
  "value:configureTaskReadDependencies",
631
+ "value:NEVER_STARTED_TASK_STATUSES",
623
632
  "value:rowToAgentTask",
624
633
  "value:rowToAgentTaskSummary",
625
634
  ].sort();