@desplega.ai/agent-swarm 2.7.4 → 2.7.6

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 (326) hide show
  1. package/README.md +1 -1
  2. package/dist/acp-adapter-bp91d37f.js +15 -0
  3. package/dist/{actions-gfrr9vb7.js → actions-yj0eeaqh.js} +19 -18
  4. package/dist/{amp-adapter-0s58gm46.js → amp-adapter-4pg9h34q.js} +3 -3
  5. package/dist/{app-stvq692g.js → app-909e97cr.js} +3 -3
  6. package/dist/{assistant-5s37fr9n.js → assistant-qdyb5fyy.js} +32 -23
  7. package/dist/{boot-reembed-yzy1841n.js → boot-reembed-fk0s9z18.js} +1 -1
  8. package/dist/{boot-reembed-cv82gz7y.js → boot-reembed-gs1rzrnh.js} +1 -1
  9. package/dist/{boot-scrub-sweep-8k4q95ap.js → boot-scrub-sweep-4qfd4kfx.js} +4 -4
  10. package/dist/{boot-seeds-ftt9htah.js → boot-seeds-yr00k13d.js} +4 -4
  11. package/dist/{boxd-515v1t8z.js → boxd-vdmfssd9.js} +5 -5
  12. package/dist/{claude-adapter-t00wrzeh.js → claude-adapter-qta1f1xn.js} +7 -7
  13. package/dist/{claude-managed-adapter-g6vmjccb.js → claude-managed-adapter-dvs2xw5n.js} +2 -2
  14. package/dist/{claude-managed-setup-afpa82f7.js → claude-managed-setup-sc6j4dm0.js} +3 -3
  15. package/dist/{claude-sdk-session-vj0c2azx.js → claude-sdk-session-zgrz6yvc.js} +9175 -9076
  16. package/dist/{cli-gjr2y2xk.js → cli-0agcv1v5.js} +4 -1
  17. package/dist/{cli-edmm9d9y.js → cli-0at8w34w.js} +7 -7
  18. package/dist/{cli-a81qevyg.js → cli-0qatpy8q.js} +20 -36
  19. package/dist/{cli-bcz074zx.js → cli-0yv5z2pg.js} +1 -1
  20. package/dist/{cli-a4btqqft.js → cli-1b7btd38.js} +1 -1
  21. package/dist/{cli-a2jw6ee5.js → cli-1p89xny0.js} +1 -1
  22. package/dist/{cli-v726afdm.js → cli-2pnswgh8.js} +1 -1
  23. package/dist/{cli-jkt52mgt.js → cli-386tyxxg.js} +2 -2
  24. package/dist/{cli-az0bpf8p.js → cli-3ypk9vk1.js} +3 -3
  25. package/dist/{cli-wk9md5px.js → cli-436532ck.js} +4 -4
  26. package/dist/{cli-7n5sbw0z.js → cli-4necwtsv.js} +5 -5
  27. package/dist/cli-54t00gt8.js +151 -0
  28. package/dist/{cli-655xm9ms.js → cli-583frbyr.js} +1 -1
  29. package/dist/{cli-4r12t6w6.js → cli-5c4hjzne.js} +101 -4
  30. package/dist/{cli-hf6zt5m6.js → cli-69szn7w7.js} +17 -1
  31. package/dist/{cli-rtk9g7av.js → cli-73jzwksr.js} +6 -2
  32. package/dist/{cli-jg0nfda6.js → cli-75gkpjvw.js} +52 -21
  33. package/dist/{cli-wcmnan2g.js → cli-89knwags.js} +5 -5
  34. package/dist/{cli-pwyevs29.js → cli-8bc1w0tw.js} +22 -21
  35. package/dist/{cli-t282jgab.js → cli-8snvgs5r.js} +41 -16
  36. package/dist/{cli-vqgnyh76.js → cli-98rw5dt5.js} +15 -3
  37. package/dist/{cli-9cctx1tn.js → cli-a22h291q.js} +1 -1
  38. package/dist/{cli-ycm6180s.js → cli-a7v854rf.js} +5 -3
  39. package/dist/{cli-98pke4vk.js → cli-ae7mrdf9.js} +2 -2
  40. package/dist/{cli-je8yeyc5.js → cli-bjb3z51z.js} +5 -5
  41. package/dist/{cli-mc97xy2s.js → cli-c60vetmm.js} +16 -4
  42. package/dist/{cli-j4kw3rsx.js → cli-cm5yqn35.js} +18 -0
  43. package/dist/{cli-wndv9p7g.js → cli-decfb6v8.js} +6 -6
  44. package/dist/{cli-h55y2bjc.js → cli-dhar9qay.js} +2 -2
  45. package/dist/{cli-8yy525ad.js → cli-drr5v6av.js} +2 -2
  46. package/dist/{cli-5gr1g711.js → cli-dxae2yg7.js} +2 -2
  47. package/dist/{cli-pe09p6dv.js → cli-e3r2neck.js} +8 -7
  48. package/dist/{cli-13jvmew3.js → cli-ekwks2vs.js} +7 -7
  49. package/dist/{cli-jg4p5t36.js → cli-es6va8jk.js} +121 -51
  50. package/dist/{cli-j4kt1mpb.js → cli-faxe6thg.js} +3 -3
  51. package/dist/{cli-tzrpv5sc.js → cli-ftyxyspd.js} +1 -1
  52. package/dist/cli-fw2w0kva.js +47 -0
  53. package/dist/{cli-2dfbv8qr.js → cli-fy6x31ps.js} +1 -0
  54. package/dist/{cli-aq58fk5m.js → cli-g83s9ewh.js} +7 -1
  55. package/dist/cli-gdhpcbhf.js +55 -0
  56. package/dist/{cli-82jg7fp9.js → cli-he5nxaa8.js} +1 -1
  57. package/dist/{cli-8veytvbh.js → cli-he9wchme.js} +1 -1
  58. package/dist/{cli-k76tgq03.js → cli-hgaazk69.js} +2 -2
  59. package/dist/{cli-d2pzqej1.js → cli-hr2e2fft.js} +741 -7
  60. package/dist/{cli-dae4sbgy.js → cli-jm2vfpfd.js} +2 -2
  61. package/dist/{cli-1s1dqn1j.js → cli-k2gzwsj2.js} +297 -140
  62. package/dist/{cli-b1afgtj3.js → cli-kqdg1bsb.js} +3 -3
  63. package/dist/cli-m2z8jagn.js +12078 -0
  64. package/dist/{cli-mvckssyq.js → cli-m48g6p95.js} +5 -5
  65. package/dist/{cli-bwty35gx.js → cli-mthwvjre.js} +1 -1
  66. package/dist/{cli-41z8xwj0.js → cli-nhrvpaj7.js} +34 -8
  67. package/dist/{cli-ahd90bwt.js → cli-nwj0ee2w.js} +6 -6
  68. package/dist/{cli-kvtc7aez.js → cli-p5gp8pcx.js} +44 -14
  69. package/dist/{cli-avgcz4ra.js → cli-pd7vagab.js} +436 -171
  70. package/dist/{cli-zn15c46z.js → cli-q0k1w5zd.js} +1 -1
  71. package/dist/{cli-bq2pcphn.js → cli-rmmmrjkd.js} +1 -1
  72. package/dist/{cli-2qpvmmkw.js → cli-s0qnd4wv.js} +1 -1
  73. package/dist/{cli-kg8hchyg.js → cli-sa02jsqt.js} +1 -1
  74. package/dist/{cli-1yekbyqm.js → cli-shpbx5ee.js} +283 -82
  75. package/dist/{cli-9y354g3j.js → cli-srye3vdt.js} +1 -1
  76. package/dist/{cli-byqfbnjw.js → cli-svj5090z.js} +9 -9
  77. package/dist/{cli-gcbdjt47.js → cli-vfym7wmz.js} +6 -6
  78. package/dist/{cli-v1yw3wha.js → cli-vvpx3gsx.js} +4 -4
  79. package/dist/{cli-a1fhj4n9.js → cli-w6dt9ged.js} +2 -2
  80. package/dist/{cli-1gm8jcyr.js → cli-waqbxg08.js} +5232 -68
  81. package/dist/{cli-5hjced2v.js → cli-wp9sp1qb.js} +6 -6
  82. package/dist/{cli-eny54typ.js → cli-wx3rhnm0.js} +1 -1
  83. package/dist/{cli-s0exq74r.js → cli-xbbndvjy.js} +3 -3
  84. package/dist/{cli-f255yaqn.js → cli-xds5f77d.js} +3 -3
  85. package/dist/{cli-0sbkss7h.js → cli-xnqgpshy.js} +2 -2
  86. package/dist/{cli-0fgr1w9b.js → cli-xnrwazav.js} +20 -3
  87. package/dist/{cli-gf5hbmdr.js → cli-yjdgea32.js} +3 -3
  88. package/dist/{cli-cq1pf336.js → cli-yn4kxs06.js} +124 -11
  89. package/dist/{cli-224epwwf.js → cli-yx4kfngt.js} +3 -3
  90. package/dist/{cli-eqx6k993.js → cli-yy3rhsdw.js} +47 -13
  91. package/dist/{cli-36g23z21.js → cli-zbbwez0r.js} +4 -4
  92. package/dist/{cli-ktmvb20s.js → cli-zm72anhg.js} +12 -12
  93. package/dist/cli.js +26 -25
  94. package/dist/{codex-adapter-g0gctw29.js → codex-adapter-ayd1fb6h.js} +5 -5
  95. package/dist/{codex-hook-vrzz2xhr.js → codex-hook-9efm2x1m.js} +1 -1
  96. package/dist/{codex-login-0gg46ygn.js → codex-login-y0pmff1c.js} +1 -1
  97. package/dist/{codex-session-runner-dr2cxe1c.js → codex-session-runner-jesa32xc.js} +6 -6
  98. package/dist/{commands-1p07cvff.js → commands-hanewgf2.js} +9 -3
  99. package/dist/{controller-z0s7sv6r.js → controller-dt1n3c1q.js} +9 -4
  100. package/dist/{controllers-connect-x9kvvhyk.js → controllers-connect-xx8x64n5.js} +22 -21
  101. package/dist/{cursor-adapter-m5b98pvk.js → cursor-adapter-9s4dwwdw.js} +2 -2
  102. package/dist/{db-capk2raj.js → db-3vttcbv4.js} +3 -3
  103. package/dist/{db-rsh04kh3.js → db-9dv0g1ab.js} +12 -4
  104. package/dist/{devin-adapter-yxm87fe9.js → devin-adapter-r9phbnc9.js} +1 -1
  105. package/dist/{devtools-82fzqra8.js → devtools-qxfgbsqz.js} +1 -1
  106. package/dist/{dispatcher-304q6fwa.js → dispatcher-tx9hd1sv.js} +18 -17
  107. package/dist/{docker-7rxt0rry.js → docker-c1a3gqmf.js} +91 -24
  108. package/dist/{dsh-adapter-btewem0y.js → dsh-adapter-007y4ejs.js} +2 -2
  109. package/dist/{e2b-renc0k8q.js → e2b-a19d28rz.js} +4 -4
  110. package/dist/{e2b-7fc9b9bd.js → e2b-we6hs6q5.js} +6 -6
  111. package/dist/{easter-egg-3d-fm1p3n4d.js → easter-egg-3d-rgbrqb8s.js} +1 -1
  112. package/dist/{embedding-space-s68v49ct.js → embedding-space-ny1e2940.js} +6 -6
  113. package/dist/{embeddings-4ms3604w.js → embeddings-2t386t13.js} +1 -1
  114. package/dist/{event-bus-dfjx2qdh.js → event-bus-g0ka3pbw.js} +1 -1
  115. package/dist/{execute-mcdgccjs.js → execute-pksh0ceh.js} +1 -1
  116. package/dist/{external-channel-9dxwfztn.js → external-channel-phgmhmd7.js} +2 -2
  117. package/dist/fx-adapter-fy8rr921.js +18 -0
  118. package/dist/{google-generative-ai-yvmdxyxa.js → google-generative-ai-8y3m3k4b.js} +1 -1
  119. package/dist/{google-vertex-jrtdh9gs.js → google-vertex-w3v98n7b.js} +1 -1
  120. package/dist/{grok-adapter-05ecv4h0.js → grok-adapter-q0abvpaj.js} +8 -8
  121. package/dist/handlers-by3sfxyx.js +32 -0
  122. package/dist/{heartbeat-3n94heh3.js → heartbeat-kadyek8p.js} +21 -20
  123. package/dist/{hook-aadrn69x.js → hook-5zs3msf6.js} +6 -6
  124. package/dist/{hook-zxwje86c.js → hook-9k551xnj.js} +4 -4
  125. package/dist/{http-xzxk9mst.js → http-mhz9vw1f.js} +272 -103
  126. package/dist/index-4f2pvxae.js +37 -0
  127. package/dist/index-98gz7tmp.js +30 -0
  128. package/dist/{index-5rk6rfzr.js → index-fvzke5kx.js} +1 -1
  129. package/dist/index-k08z2cak.js +33 -0
  130. package/dist/{index-yqhz88yy.js → index-pxn30mse.js} +8 -8
  131. package/dist/{index-d34f6r87.js → index-q361cg2f.js} +1 -1
  132. package/dist/{index-9j4zwcht.js → index-rvr00sg7.js} +168 -675
  133. package/dist/{index-qeb82z37.js → index-vdygbq10.js} +1 -1
  134. package/dist/{keepalive-w4aakbyk.js → keepalive-w56f32cg.js} +4 -4
  135. package/dist/lead-enq35nqp.js +70 -0
  136. package/dist/{maintenance-hbptpk6p.js → maintenance-7mdgxcea.js} +1 -1
  137. package/dist/{oauth-refresh-sweep-217semrv.js → oauth-refresh-sweep-29txy9vk.js} +3 -3
  138. package/dist/{onboard-vz2s5df3.js → onboard-kpsrkarj.js} +5 -5
  139. package/dist/{opencode-adapter-gtfd7d7v.js → opencode-adapter-j25vm3rr.js} +5 -5
  140. package/dist/{otel-impl-aefave37.js → otel-impl-6kkct7a8.js} +2 -2
  141. package/dist/{pi-mono-adapter-f8h5yseh.js → pi-mono-adapter-exhkzhn2.js} +117 -23
  142. package/dist/{pricing-refresh-m1yhh9ya.js → pricing-refresh-n2x7jh6k.js} +3 -3
  143. package/dist/{rbac-roles-rrw8twdz.js → rbac-roles-81ypx6es.js} +1 -1
  144. package/dist/{rbac-roles-svj72cdf.js → rbac-roles-b5htkjby.js} +2 -2
  145. package/dist/{render-v2-amwbnfxh.js → render-v2-qn6jmpk4.js} +3 -3
  146. package/dist/{resume-9cd6wf6z.js → resume-wd30wx23.js} +7 -7
  147. package/dist/{runtime-fp4vrx7m.js → runtime-4hsg7h60.js} +1 -1
  148. package/dist/{session-access-21t6yjyg.js → session-access-5qvfevhk.js} +4 -4
  149. package/dist/{session-source-backfill-pxbzcsc6.js → session-source-backfill-n1czavbr.js} +3 -3
  150. package/dist/{setup-4592tqz4.js → setup-dnb56qy5.js} +3 -3
  151. package/dist/{virtual-modules-gzfnpmnz.js → virtual-modules-76xxv9fs.js} +2 -2
  152. package/dist/{work-objects-t9tcf174.js → work-objects-4n21tfkm.js} +21 -20
  153. package/dist/{worker-follow-up-q32jh4yk.js → worker-follow-up-77hvzxww.js} +18 -17
  154. package/dist/worker-gg1576j3.js +70 -0
  155. package/dist/{x-b6wxntdt.js → x-vmmye1kb.js} +2 -2
  156. package/openapi.json +189 -32
  157. package/package.json +8 -7
  158. package/src/be/db/script-runs.ts +23 -0
  159. package/src/be/db/session-summaries.ts +8 -2
  160. package/src/be/db/session-tree.ts +174 -61
  161. package/src/be/db/session-visibility.ts +5 -4
  162. package/src/be/db/tasks/read.ts +122 -3
  163. package/src/be/db-client.ts +8 -5
  164. package/src/be/db.ts +23 -8
  165. package/src/be/memory/providers/sqlite-store.ts +49 -12
  166. package/src/be/migrations/259_session_summaries_open_tasks.sql +111 -0
  167. package/src/be/migrations/260_runtime_pool_cache.sql +20 -0
  168. package/src/be/migrations/262_session_visibility_indexes.sql +18 -0
  169. package/src/be/migrations/263_task_list_filter_index.sql +11 -0
  170. package/src/be/migrations/264_slack_thread_cover_index.sql +9 -0
  171. package/src/be/migrations/266_script_runs_source_task.sql +11 -0
  172. package/src/be/model-validation.ts +5 -1
  173. package/src/be/pricing-normalize.ts +7 -2
  174. package/src/be/runtime-pools/cache-cleanup.ts +109 -0
  175. package/src/be/runtime-pools/db.ts +65 -6
  176. package/src/be/runtime-pools/remote-controller.ts +5 -0
  177. package/src/be/runtime-pools/supervisor.ts +33 -2
  178. package/src/be/scripts/typecheck.ts +23 -0
  179. package/src/be/seed/schedules-seeder.ts +135 -9
  180. package/src/be/seed/workflows-seeder.ts +65 -1
  181. package/src/be/seed-pricing.ts +23 -0
  182. package/src/be/seed-scripts/catalog/task-failure-audit.ts +5 -1
  183. package/src/be/steering.ts +50 -3
  184. package/src/be/swarm-config-guard.ts +1 -0
  185. package/src/commands/controller.ts +4 -0
  186. package/src/commands/entrypoint-api-readiness.ts +74 -0
  187. package/src/commands/provider-credentials.ts +29 -2
  188. package/src/commands/runner.ts +86 -5
  189. package/src/extensions/contract-types.generated.ts +1 -1
  190. package/src/extensions/contract.ts +27 -1
  191. package/src/extensions/dispatcher.ts +4 -0
  192. package/src/http/agents.ts +1 -0
  193. package/src/http/index.ts +1 -1
  194. package/src/http/list-total-cache.ts +14 -7
  195. package/src/http/mcp-bridge.ts +4 -0
  196. package/src/http/memory.ts +38 -9
  197. package/src/http/script-runs.ts +174 -5
  198. package/src/http/status.ts +10 -2
  199. package/src/http/tasks.ts +4 -2
  200. package/src/integrations/chat-sdk/inbound.ts +15 -5
  201. package/src/integrations/chat-sdk/steering.ts +3 -1
  202. package/src/kv-reserved-namespaces.ts +2 -0
  203. package/src/prompts/base-prompt.ts +4 -1
  204. package/src/prompts/session-templates.ts +26 -0
  205. package/src/providers/acp-adapter.ts +190 -26
  206. package/src/providers/acp-targets.ts +306 -6
  207. package/src/providers/amp-adapter.ts +1 -1
  208. package/src/providers/codex-adapter.ts +9 -44
  209. package/src/providers/codex-oauth/flow.ts +24 -3
  210. package/src/providers/codex-oauth/storage.ts +56 -17
  211. package/src/providers/codex-oauth/subscription.ts +67 -0
  212. package/src/providers/fx-adapter.ts +211 -0
  213. package/src/providers/index.ts +5 -1
  214. package/src/providers/mcp-loopback-proxy.ts +94 -0
  215. package/src/providers/pi-mono-adapter.ts +98 -13
  216. package/src/providers/pricing-sources.md +8 -0
  217. package/src/providers/reasoning-effort.ts +17 -1
  218. package/src/providers/types.ts +2 -1
  219. package/src/runtime-providers/controller-protocol.ts +14 -1
  220. package/src/runtime-providers/controller.ts +5 -0
  221. package/src/runtime-providers/docker.ts +108 -23
  222. package/src/runtime-providers/types.ts +16 -0
  223. package/src/scheduler/scheduler.ts +36 -3
  224. package/src/script-workflows/workflow-ctx.ts +8 -0
  225. package/src/scripts-runtime/sdk-allowlist.ts +1 -0
  226. package/src/scripts-runtime/types/stdlib.d.ts +27 -0
  227. package/src/scripts-runtime/types/swarm-extension.d.ts +33 -0
  228. package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -0
  229. package/src/server-user.ts +1 -0
  230. package/src/server.ts +7 -0
  231. package/src/slack/assistant.ts +17 -1
  232. package/src/slack/commands.ts +5 -1
  233. package/src/slack/handlers.ts +53 -5
  234. package/src/slack/left-threads.ts +88 -0
  235. package/src/slack/steering.ts +3 -0
  236. package/src/slack/thread-buffer.ts +40 -16
  237. package/src/tasks/follow-up-redelegation-guard.ts +155 -0
  238. package/src/tests/acp-adapter.test.ts +79 -0
  239. package/src/tests/base-prompt.test.ts +12 -0
  240. package/src/tests/chat-sdk-inbound.test.ts +30 -0
  241. package/src/tests/chatgpt-subscription-model-groups.test.ts +62 -0
  242. package/src/tests/chatgpt-subscription-pi.test.ts +170 -0
  243. package/src/tests/chatgpt-subscription-session-bench.test.ts +198 -0
  244. package/src/tests/claude-artifacts-read-script.test.ts +209 -0
  245. package/src/tests/codex-oauth-credential-info.test.ts +40 -0
  246. package/src/tests/codex-oauth-refresh-egress.test.ts +194 -0
  247. package/src/tests/context-window.test.ts +7 -0
  248. package/src/tests/db-client.test.ts +21 -0
  249. package/src/tests/db-task-read-contract.test.ts +8 -2
  250. package/src/tests/db-task-write-contract.test.ts +5 -1
  251. package/src/tests/entrypoint-api-readiness.test.ts +416 -210
  252. package/src/tests/explicit-model-validation.test.ts +113 -8
  253. package/src/tests/extensions-run-context.test.ts +11 -0
  254. package/src/tests/extensions-steering.test.ts +353 -0
  255. package/src/tests/extensions-validate.test.ts +5 -0
  256. package/src/tests/fixtures/extensions/steering-policy/hooks.ts +39 -0
  257. package/src/tests/fixtures/extensions/steering-policy/manifest.json +7 -0
  258. package/src/tests/fixtures/fake-fx.ts +167 -0
  259. package/src/tests/fixtures/fx/acp-responses-recorded.json +157 -0
  260. package/src/tests/fixtures/fx/acp-updates-recorded.jsonl +15 -0
  261. package/src/tests/follow-up-redelivery-guard.test.ts +432 -202
  262. package/src/tests/fx-adapter.test.ts +771 -0
  263. package/src/tests/grok-adapter.test.ts +36 -0
  264. package/src/tests/list-total-cache.test.ts +27 -2
  265. package/src/tests/mcp-loopback-proxy.test.ts +193 -0
  266. package/src/tests/memory-fts-populate.test.ts +11 -9
  267. package/src/tests/memory-retrieval-purge.test.ts +80 -0
  268. package/src/tests/migration-260-runtime-pool-cache.test.ts +118 -0
  269. package/src/tests/model-tier-resolution.test.ts +3 -3
  270. package/src/tests/pricing-refresh.test.ts +5 -5
  271. package/src/tests/prompt-template-session.test.ts +5 -3
  272. package/src/tests/provider-registration.test.ts +2 -1
  273. package/src/tests/query-audit-plans.test.ts +30 -2
  274. package/src/tests/runtime-cache-cleanup.test.ts +367 -0
  275. package/src/tests/runtime-e2b-pools.test.ts +41 -0
  276. package/src/tests/runtime-pools-db.test.ts +98 -0
  277. package/src/tests/runtime-pools-http.test.ts +29 -0
  278. package/src/tests/runtime-providers-docker.test.ts +253 -0
  279. package/src/tests/runtime-remote-controller.test.ts +66 -2
  280. package/src/tests/runtime-supervisor.test.ts +66 -2
  281. package/src/tests/script-connections.test.ts +13 -0
  282. package/src/tests/script-runs-http.test.ts +684 -2
  283. package/src/tests/seed-model-profiles.test.ts +2 -2
  284. package/src/tests/seed-schedules.test.ts +138 -0
  285. package/src/tests/seed-scripts.test.ts +26 -0
  286. package/src/tests/session-cost-recompute-unit.test.ts +39 -0
  287. package/src/tests/session-costs-golden.test.ts +26 -0
  288. package/src/tests/session-summaries-plans.test.ts +120 -0
  289. package/src/tests/session-summaries.test.ts +72 -12
  290. package/src/tests/sessions-tree.test.ts +11 -3
  291. package/src/tests/slack-leave-thread.test.ts +571 -0
  292. package/src/tests/slack-render-v2-query-plans.test.ts +24 -2
  293. package/src/tests/status.test.ts +11 -0
  294. package/src/tests/tasks-readable-row.test.ts +155 -0
  295. package/src/tests/tool-annotations.test.ts +2 -1
  296. package/src/tests/workflow-engine-v2.test.ts +42 -0
  297. package/src/tests/workflow-script-principal.test.ts +207 -7
  298. package/src/tools/send-task.ts +35 -47
  299. package/src/tools/slack-leave-thread.ts +104 -0
  300. package/src/tools/steer-task.ts +3 -2
  301. package/src/tools/task-dedup.ts +45 -21
  302. package/src/tools/tool-config.ts +2 -1
  303. package/src/types.ts +57 -0
  304. package/src/utils/codex-auth-failure.ts +30 -0
  305. package/src/utils/context-window.ts +4 -1
  306. package/src/utils/credentials.ts +7 -0
  307. package/src/utils/fx-models.ts +43 -0
  308. package/src/workflows/cooldown.ts +3 -2
  309. package/src/workflows/engine.ts +24 -9
  310. package/templates/schedules/dreaming-daily/config.json +1 -1
  311. package/templates/schedules/dreaming-daily/content.md +6 -14
  312. package/templates/skills/composio-google-docs/content.md +10 -0
  313. package/templates/skills/script-workflows/content.md +19 -1
  314. package/templates/skills/swarm-docs/content.md +2 -0
  315. package/templates/skills/swarm-scripts/SKILL.md +2 -0
  316. package/templates/skills/swarm-scripts/content.md +2 -0
  317. package/templates/workflows/dreaming/content.md +5 -1
  318. package/dist/acp-adapter-96dc64m2.js +0 -15
  319. package/dist/cli-dznrgaep.js +0 -30
  320. package/dist/cli-w3hcrxht.js +0 -6985
  321. package/dist/handlers-jg7v74ty.js +0 -31
  322. package/dist/index-8c1zbz59.js +0 -29
  323. package/dist/index-8k8tmfxd.js +0 -32
  324. package/dist/index-hq617xdj.js +0 -36
  325. package/dist/lead-567kw7x3.js +0 -68
  326. package/dist/worker-fjdqra6q.js +0 -68
@@ -0,0 +1,194 @@
1
+ /**
2
+ * A pool refresh or persist failure must never print a token. The OpenAI
3
+ * token endpoint and the config store may echo the request body in an error
4
+ * response; that text reaches console logs, the thrown error and, through
5
+ * `buildPoolRevalidationFailureReason`, the task's failure reason.
6
+ */
7
+
8
+ import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
9
+ import { resetFetchForTesting, setFetchForTesting } from "../providers/codex-oauth/flow.js";
10
+ import { persistCodexOAuth, storeCodexOAuth } from "../providers/codex-oauth/storage.js";
11
+ import { loadChatgptSubscriptionCredential } from "../providers/codex-oauth/subscription.js";
12
+ import type { CodexOAuthCredentials } from "../providers/codex-oauth/types.js";
13
+ import { isCodexAuthFailureReason } from "../utils/codex-auth-failure";
14
+
15
+ const API_URL = "http://localhost:3013";
16
+ const OLD_REFRESH = "rt_synthetic_pool_refresh_0123456789abcdef";
17
+ const NEW_ACCESS = "at_synthetic_rotated_access_0123456789abcdef";
18
+ const NEW_REFRESH = "rt_synthetic_rotated_refresh_0123456789abcdef";
19
+ const SECRETS = [OLD_REFRESH, NEW_ACCESS, NEW_REFRESH];
20
+ const CONFIG = { apiUrl: API_URL, apiKey: "test-key", codexSlot: 0, model: "openai-codex/gpt-5.5" };
21
+
22
+ const originalFetch = globalThis.fetch;
23
+ let logged: string[] = [];
24
+ const spies: Array<{ mockRestore: () => void }> = [];
25
+
26
+ /** A transport error whose message echoes the request carrying the tokens. */
27
+ function rejectedPersist(): never {
28
+ throw new TypeError(
29
+ `fetch failed: socket closed while sending {"value":"{\\"access\\":\\"${NEW_ACCESS}\\",\\"refresh\\":\\"${NEW_REFRESH}\\"}"} (${encodeURIComponent(NEW_REFRESH)})`,
30
+ );
31
+ }
32
+
33
+ /** Config store holding one expired slot; `putResponse` answers the persist. */
34
+ function installConfigStore(putResponse: () => Response): void {
35
+ const creds: CodexOAuthCredentials = {
36
+ access: "at_expired",
37
+ refresh: OLD_REFRESH,
38
+ expires: Date.now() - 1000,
39
+ accountId: "acct-egress",
40
+ };
41
+ globalThis.fetch = (async (url: string | URL | Request, init?: RequestInit) => {
42
+ const href = url.toString();
43
+ const method = (init?.method ?? "GET").toUpperCase();
44
+ if (href.includes("/api/oauth/refresh-locks/")) {
45
+ return Response.json(method === "POST" ? { owner: "owner-1" } : { released: true });
46
+ }
47
+ if (method === "GET" && href.includes("/api/config/resolved")) {
48
+ return Response.json({ configs: [{ key: "codex_oauth_0", value: JSON.stringify(creds) }] });
49
+ }
50
+ if (method === "PUT" && href.includes("/api/config")) return putResponse();
51
+ if (method === "DELETE" && href.includes("/api/config")) return Response.json({});
52
+ throw new Error(`Unexpected fetch: ${method} ${href}`);
53
+ }) as typeof fetch;
54
+ }
55
+
56
+ async function failureOf(promise: Promise<unknown>): Promise<string> {
57
+ try {
58
+ await promise;
59
+ } catch (err) {
60
+ return err instanceof Error ? err.message : String(err);
61
+ }
62
+ throw new Error("expected a rejection");
63
+ }
64
+
65
+ function expectNoSecret(text: string): void {
66
+ for (const secret of SECRETS) {
67
+ expect(text).not.toContain(secret);
68
+ expect(text).not.toContain(encodeURIComponent(secret));
69
+ }
70
+ }
71
+
72
+ beforeEach(() => {
73
+ logged = [];
74
+ for (const method of ["log", "error", "warn"] as const) {
75
+ spies.push(
76
+ spyOn(console, method).mockImplementation((...args: unknown[]) => {
77
+ logged.push(args.map((a) => (typeof a === "string" ? a : Bun.inspect(a))).join(" "));
78
+ }),
79
+ );
80
+ }
81
+ });
82
+
83
+ afterEach(() => {
84
+ for (const spy of spies.splice(0)) spy.mockRestore();
85
+ globalThis.fetch = originalFetch;
86
+ resetFetchForTesting();
87
+ });
88
+
89
+ describe("pool refresh failure egress", () => {
90
+ test("a 401 echoing the submitted refresh token is redacted and still counts", async () => {
91
+ installConfigStore(() => Response.json({}));
92
+ setFetchForTesting((async (_url: string | URL | Request, init?: RequestInit) => {
93
+ const form = String(init?.body ?? "");
94
+ return new Response(
95
+ JSON.stringify({ error: "invalid_grant", echo: OLD_REFRESH, request: form }),
96
+ { status: 401 },
97
+ );
98
+ }) as typeof fetch);
99
+
100
+ const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
101
+
102
+ expect(reason).toContain("refresh rejected (401");
103
+ expect(reason).toContain("invalid_grant");
104
+ expect(isCodexAuthFailureReason(reason)).toBe(true);
105
+ expectNoSecret(reason);
106
+ expect(logged.length).toBeGreaterThan(0);
107
+ expectNoSecret(logged.join("\n"));
108
+ });
109
+
110
+ test("a refresh response missing fields never logs the tokens it did carry", async () => {
111
+ installConfigStore(() => Response.json({}));
112
+ setFetchForTesting((async () =>
113
+ Response.json({ access_token: NEW_ACCESS, refresh_token: NEW_REFRESH })) as typeof fetch);
114
+
115
+ const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
116
+
117
+ expectNoSecret(reason);
118
+ expectNoSecret(logged.join("\n"));
119
+ });
120
+
121
+ test("a persist failure echoing the rotated tokens is redacted and stays transient", async () => {
122
+ installConfigStore(
123
+ () => new Response(`rejected value ${NEW_ACCESS} ${NEW_REFRESH}`, { status: 500 }),
124
+ );
125
+ setFetchForTesting((async () =>
126
+ Response.json({
127
+ access_token: NEW_ACCESS,
128
+ refresh_token: NEW_REFRESH,
129
+ expires_in: 864000,
130
+ })) as typeof fetch);
131
+
132
+ const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
133
+
134
+ expect(reason).toContain("HTTP 500");
135
+ expect(isCodexAuthFailureReason(reason)).toBe(false);
136
+ expectNoSecret(reason);
137
+ expectNoSecret(logged.join("\n"));
138
+ });
139
+
140
+ test("a persist fetch rejection echoing the rotated tokens never reaches the reason or logs", async () => {
141
+ installConfigStore(rejectedPersist);
142
+ setFetchForTesting((async () =>
143
+ Response.json({
144
+ access_token: NEW_ACCESS,
145
+ refresh_token: NEW_REFRESH,
146
+ expires_in: 864000,
147
+ })) as typeof fetch);
148
+
149
+ const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
150
+
151
+ expect(reason).toContain("Failed to store codex_oauth_0 config: fetch failed");
152
+ expect(isCodexAuthFailureReason(reason)).toBe(false);
153
+ expectNoSecret(reason);
154
+ expectNoSecret(logged.join("\n"));
155
+ });
156
+ });
157
+
158
+ describe("persist egress", () => {
159
+ const rotated: CodexOAuthCredentials = {
160
+ access: NEW_ACCESS,
161
+ refresh: NEW_REFRESH,
162
+ expires: Date.now() + 864000_000,
163
+ accountId: "acct-egress",
164
+ };
165
+
166
+ test("storeCodexOAuth rethrows a fetch rejection with no token and no raw cause", async () => {
167
+ globalThis.fetch = (async () => rejectedPersist()) as unknown as typeof fetch;
168
+
169
+ let thrown: unknown;
170
+ try {
171
+ await storeCodexOAuth(API_URL, "test-key", rotated, 0);
172
+ } catch (err) {
173
+ thrown = err;
174
+ }
175
+
176
+ expect(thrown).toBeInstanceOf(Error);
177
+ const err = thrown as Error;
178
+ expect(err.message).toContain("fetch failed");
179
+ expect(err.cause).toBeUndefined();
180
+ expectNoSecret(Bun.inspect(err));
181
+ });
182
+
183
+ test("persistCodexOAuth logs a fetch rejection or an echoing response without tokens", async () => {
184
+ globalThis.fetch = (async () => rejectedPersist()) as unknown as typeof fetch;
185
+ await persistCodexOAuth(API_URL, "test-key", rotated, 0);
186
+ globalThis.fetch = (async () =>
187
+ new Response(`rejected value ${NEW_ACCESS} ${NEW_REFRESH}`, { status: 500 })) as typeof fetch;
188
+ await persistCodexOAuth(API_URL, "test-key", rotated, 0);
189
+
190
+ expect(logged.join("\n")).toContain("fetch failed");
191
+ expect(logged.join("\n")).toContain("HTTP 500");
192
+ expectNoSecret(logged.join("\n"));
193
+ });
194
+ });
@@ -41,6 +41,13 @@ describe("getContextWindowSize", () => {
41
41
  expect(getContextWindowSize("gpt-5")).toBe(400_000);
42
42
  });
43
43
 
44
+ test("reads a ChatGPT subscription id's window from its OpenAI id, as codex does", () => {
45
+ expect(getContextWindowSize("openai-codex/gpt-5.6-luna")).toBe(
46
+ getContextWindowSize("gpt-5.6-luna"),
47
+ );
48
+ expect(getContextWindowSize("openai-codex/gpt-5.6-luna")).not.toBe(200_000);
49
+ });
50
+
44
51
  test("returns 200K default for unknown models", () => {
45
52
  expect(getContextWindowSize("unknown-model")).toBe(200_000);
46
53
  expect(getContextWindowSize("")).toBe(200_000);
@@ -475,6 +475,27 @@ describe("db-client slow statement warning", () => {
475
475
  }
476
476
  });
477
477
 
478
+ test("does not count a slow database open against the first statement", async () => {
479
+ // The first call opens the database (and applies migrations) through the
480
+ // client's getter. That cost is boot work, not the statement's.
481
+ let opened = false;
482
+ const lazy = createBunSqliteClient(() => {
483
+ if (!opened) {
484
+ opened = true;
485
+ Bun.sleepSync(150);
486
+ }
487
+ return raw;
488
+ });
489
+ const warn = spyOn(console, "warn").mockImplementation(() => {});
490
+ try {
491
+ await lazy.query("SELECT name FROM items");
492
+ expect(opened).toBe(true);
493
+ expect(slowWarnings(warn)).toHaveLength(0);
494
+ } finally {
495
+ warn.mockRestore();
496
+ }
497
+ });
498
+
478
499
  test("does not log fast statements", async () => {
479
500
  const warn = spyOn(console, "warn").mockImplementation(() => {});
480
501
  try {
@@ -144,6 +144,7 @@ value:completeApprovalCancellationNotificationClaim
144
144
  value:completeTask
145
145
  value:computeContentHash
146
146
  value:countActiveScriptRuns
147
+ value:countAgentDispatchesInThread
147
148
  value:countAllMetrics
148
149
  value:countAllPages
149
150
  value:countKv
@@ -218,9 +219,10 @@ value:extensionAgentAssignmentError
218
219
  value:failPendingResumeIfUnclaimed
219
220
  value:failTask
220
221
  value:findActiveTasksByVcs
221
- value:findCompletedTaskInThread
222
+ value:findCompletedTasksInThread
222
223
  value:findExistingLinearTrackerContextWork
223
224
  value:findRecentCancelledTaskInThread
225
+ value:findRecentFailedTaskInThread
224
226
  value:findRecentSimilarTasks
225
227
  value:findTaskByAgentMailThread
226
228
  value:findTaskByGitHub
@@ -369,6 +371,7 @@ value:getScheduledTasks
369
371
  value:getScriptRun
370
372
  value:getScriptRunByIdempotencyKey
371
373
  value:getScriptRunExecutionArgs
374
+ value:getScriptRunFollowUpGuard
372
375
  value:getScriptRunJournalStep
373
376
  value:getServiceByAgentAndName
374
377
  value:getServiceById
@@ -561,6 +564,7 @@ value:setApiKeyName
561
564
  value:setApiKeyPlan
562
565
  value:setBudgetRefusalFollowUpTaskId
563
566
  value:setFavorite
567
+ value:setScriptRunFollowUpGuard
564
568
  value:setSlackMessageTracking
565
569
  value:setUserFavorite
566
570
  value:settleSupersededTaskDependents
@@ -622,10 +626,12 @@ type:PendingChatRelay
622
626
  type:TaskFilters
623
627
  value:SUPERSEDED_RESUME_REPAIR_WINDOW_MS
624
628
  value:TASK_LINEAGE_LIMITS
629
+ value:countAgentDispatchesInThread
625
630
  value:findActiveTasksByVcs
626
- value:findCompletedTaskInThread
631
+ value:findCompletedTasksInThread
627
632
  value:findExistingLinearTrackerContextWork
628
633
  value:findRecentCancelledTaskInThread
634
+ value:findRecentFailedTaskInThread
629
635
  value:findTaskByGitHub
630
636
  value:findTaskByVcs
631
637
  value:getAgentCurrentTask
@@ -167,6 +167,7 @@ value:completeApprovalCancellationNotificationClaim
167
167
  value:completeTask
168
168
  value:computeContentHash
169
169
  value:countActiveScriptRuns
170
+ value:countAgentDispatchesInThread
170
171
  value:countAllMetrics
171
172
  value:countAllPages
172
173
  value:countKv
@@ -241,9 +242,10 @@ value:extensionAgentAssignmentError
241
242
  value:failPendingResumeIfUnclaimed
242
243
  value:failTask
243
244
  value:findActiveTasksByVcs
244
- value:findCompletedTaskInThread
245
+ value:findCompletedTasksInThread
245
246
  value:findExistingLinearTrackerContextWork
246
247
  value:findRecentCancelledTaskInThread
248
+ value:findRecentFailedTaskInThread
247
249
  value:findRecentSimilarTasks
248
250
  value:findTaskByAgentMailThread
249
251
  value:findTaskByGitHub
@@ -392,6 +394,7 @@ value:getScheduledTasks
392
394
  value:getScriptRun
393
395
  value:getScriptRunByIdempotencyKey
394
396
  value:getScriptRunExecutionArgs
397
+ value:getScriptRunFollowUpGuard
395
398
  value:getScriptRunJournalStep
396
399
  value:getServiceByAgentAndName
397
400
  value:getServiceById
@@ -584,6 +587,7 @@ value:setApiKeyName
584
587
  value:setApiKeyPlan
585
588
  value:setBudgetRefusalFollowUpTaskId
586
589
  value:setFavorite
590
+ value:setScriptRunFollowUpGuard
587
591
  value:setSlackMessageTracking
588
592
  value:setUserFavorite
589
593
  value:settleSupersededTaskDependents