@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,167 @@
1
+ /**
2
+ * A fake `fx acp` for adapter tests. Plain newline-delimited JSON-RPC, not the
3
+ * ACP SDK's agent app: fx 0.0.15 takes `systemPrompt` as a bare content-block
4
+ * array, which the SDK's request validation rejects.
5
+ *
6
+ * It answers with the recorded fx 0.0.15 responses and replays the recorded
7
+ * session updates (`fixtures/fx/`). Everything it receives (argv, the fx
8
+ * env, `~/.fx/settings.json`, every request) goes to `capture.json` in its cwd.
9
+ *
10
+ * FAKE_FX_MODE:
11
+ * - `ok` (default): one turn; a steer received during it is echoed where the
12
+ * recording echoed one, and its request answers `steering: "absorbed"`.
13
+ * - `steer-ignored`: the steer request answers without `_meta.fx.steering`.
14
+ * - `wait-for-cancel`: starts a `sleep` child, then holds the turn until
15
+ * `session/cancel` and answers `cancelled` with usage.
16
+ * FAKE_FX_MCP_CALL=1: POSTs `tools/list` to the swarm MCP URL it was given.
17
+ */
18
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
19
+ import { join } from "node:path";
20
+
21
+ const fixtureDir = process.env.FAKE_FX_FIXTURE_DIR ?? "";
22
+ const mode = process.env.FAKE_FX_MODE ?? "ok";
23
+ const responses = JSON.parse(readFileSync(join(fixtureDir, "acp-responses-recorded.json"), "utf8"));
24
+ const updates: Array<Record<string, unknown>> = readFileSync(
25
+ join(fixtureDir, "acp-updates-recorded.jsonl"),
26
+ "utf8",
27
+ )
28
+ .trim()
29
+ .split("\n")
30
+ .map((line) => JSON.parse(line));
31
+
32
+ const settingsPath = join(process.env.HOME ?? "", ".fx", "settings.json");
33
+ const capture: Record<string, unknown> = {
34
+ argv: process.argv.slice(2),
35
+ env: Object.fromEntries(
36
+ Object.entries(process.env).filter(([key]) =>
37
+ /^(FX_|OPENROUTER_|OPENAI_|AI_GATEWAY_|ANTHROPIC_|XAI_|CLAUDE_)/.test(key),
38
+ ),
39
+ ),
40
+ settings: existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, "utf8")) : null,
41
+ requests: [] as Array<{ method: string; params: unknown }>,
42
+ };
43
+ const save = () => writeFileSync("capture.json", JSON.stringify(capture));
44
+ save();
45
+
46
+ const send = (message: unknown) => process.stdout.write(`${JSON.stringify(message)}\n`);
47
+ const notify = (sessionId: string, update: unknown) =>
48
+ send({ jsonrpc: "2.0", method: "session/update", params: { sessionId, update } });
49
+
50
+ let steerText: string | null = null;
51
+ let steerWaiter: (() => void) | null = null;
52
+ const steerReplies: Array<() => void> = [];
53
+ let cancelTurn: (() => void) | null = null;
54
+
55
+ async function runTurn(id: number, sessionId: string): Promise<void> {
56
+ if (process.env.FAKE_FX_MCP_CALL === "1") {
57
+ const newSession = (capture.requests as Array<{ method: string; params: any }>).find(
58
+ (request) => request.method === "session/new" || request.method === "session/resume",
59
+ );
60
+ const swarm = newSession?.params.mcpServers.find((server: any) => server.name === "swarm");
61
+ const headers = Object.fromEntries(
62
+ swarm.headers.map((header: { name: string; value: string }) => [header.name, header.value]),
63
+ );
64
+ const response = await fetch(swarm.url, {
65
+ method: "POST",
66
+ headers: { ...headers, "Content-Type": "application/json" },
67
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" }),
68
+ });
69
+ capture.mcpCall = { url: swarm.url, status: response.status, body: await response.json() };
70
+ save();
71
+ }
72
+ for (const update of updates) {
73
+ const meta = update._meta as { fx?: { steering?: unknown } } | undefined;
74
+ if (update.sessionUpdate === "user_message_chunk" && meta?.fx?.steering) {
75
+ // The recording echoed a steer here. Wait briefly for one to arrive.
76
+ if (steerText === null && mode !== "wait-for-cancel") {
77
+ await new Promise<void>((resolve) => {
78
+ steerWaiter = resolve;
79
+ setTimeout(resolve, 3_000);
80
+ });
81
+ }
82
+ if (steerText === null || mode === "steer-ignored") continue;
83
+ notify(sessionId, { ...update, content: { type: "text", text: steerText } });
84
+ continue;
85
+ }
86
+ notify(sessionId, update);
87
+ }
88
+ if (mode === "wait-for-cancel") {
89
+ const child = Bun.spawn(["sleep", "300"], { stdout: "ignore", stderr: "ignore" });
90
+ capture.childPid = child.pid;
91
+ save();
92
+ await new Promise<void>((resolve) => {
93
+ cancelTurn = resolve;
94
+ });
95
+ send({
96
+ jsonrpc: "2.0",
97
+ id,
98
+ result: { stopReason: "cancelled", usage: { inputTokens: 1200, outputTokens: 30 } },
99
+ });
100
+ return;
101
+ }
102
+ send({ jsonrpc: "2.0", id, result: responses.prompt });
103
+ for (const reply of steerReplies.splice(0)) reply();
104
+ }
105
+
106
+ async function handle(message: any): Promise<void> {
107
+ if (message.method === undefined) return;
108
+ (capture.requests as Array<{ method: string; params: unknown }>).push({
109
+ method: message.method,
110
+ params: message.params,
111
+ });
112
+ save();
113
+ const { id, method, params } = message;
114
+ switch (method) {
115
+ case "initialize":
116
+ send({ jsonrpc: "2.0", id, result: responses.initialize });
117
+ return;
118
+ case "session/new":
119
+ send({ jsonrpc: "2.0", id, result: responses.newSession });
120
+ return;
121
+ case "session/resume": {
122
+ const { sessionId: _, ...rest } = responses.newSession;
123
+ send({ jsonrpc: "2.0", id, result: rest });
124
+ return;
125
+ }
126
+ case "session/set_config_option":
127
+ case "session/set_mode":
128
+ send({ jsonrpc: "2.0", id, result: { configOptions: responses.newSession.configOptions } });
129
+ return;
130
+ case "session/prompt": {
131
+ if (params._meta?.fx?.steer) {
132
+ steerText = params.prompt[0].text;
133
+ steerWaiter?.();
134
+ steerReplies.push(() =>
135
+ send({
136
+ jsonrpc: "2.0",
137
+ id,
138
+ result: mode === "steer-ignored" ? { stopReason: "end_turn" } : responses.steer,
139
+ }),
140
+ );
141
+ return;
142
+ }
143
+ await runTurn(id, params.sessionId);
144
+ return;
145
+ }
146
+ case "session/cancel":
147
+ cancelTurn?.();
148
+ return;
149
+ default:
150
+ if (id !== undefined) {
151
+ send({ jsonrpc: "2.0", id, error: { code: -32601, message: `${method} not supported` } });
152
+ }
153
+ }
154
+ }
155
+
156
+ const decoder = new TextDecoder();
157
+ let buffer = "";
158
+ for await (const chunk of Bun.stdin.stream()) {
159
+ buffer += decoder.decode(chunk, { stream: true });
160
+ let newline = buffer.indexOf("\n");
161
+ while (newline >= 0) {
162
+ const line = buffer.slice(0, newline).trim();
163
+ buffer = buffer.slice(newline + 1);
164
+ if (line) void handle(JSON.parse(line));
165
+ newline = buffer.indexOf("\n");
166
+ }
167
+ }
@@ -0,0 +1,157 @@
1
+ {
2
+ "initialize": {
3
+ "protocolVersion": 1,
4
+ "agentCapabilities": {
5
+ "loadSession": true,
6
+ "promptCapabilities": {
7
+ "image": true,
8
+ "audio": false,
9
+ "embeddedContext": true
10
+ },
11
+ "mcpCapabilities": {
12
+ "http": true,
13
+ "sse": false,
14
+ "acp": false
15
+ },
16
+ "sessionCapabilities": {
17
+ "list": {},
18
+ "resume": {},
19
+ "close": {},
20
+ "systemPrompt": {}
21
+ },
22
+ "_meta": {
23
+ "fx": {
24
+ "steering": true
25
+ }
26
+ }
27
+ },
28
+ "agentInfo": {
29
+ "name": "fx",
30
+ "title": "fx",
31
+ "version": "0.0.15"
32
+ },
33
+ "authMethods": []
34
+ },
35
+ "newSession": {
36
+ "sessionId": "fxSession001",
37
+ "configOptions": [
38
+ {
39
+ "id": "provider",
40
+ "name": "Provider",
41
+ "category": "model",
42
+ "type": "select",
43
+ "currentValue": "openrouter",
44
+ "options": [
45
+ {
46
+ "value": "gateway",
47
+ "name": "Vercel AI Gateway"
48
+ },
49
+ {
50
+ "value": "codex",
51
+ "name": "Codex subscription"
52
+ },
53
+ {
54
+ "value": "grok",
55
+ "name": "Grok subscription"
56
+ },
57
+ {
58
+ "value": "openrouter",
59
+ "name": "openrouter"
60
+ },
61
+ {
62
+ "value": "openai",
63
+ "name": "openai"
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "id": "model",
69
+ "name": "Model",
70
+ "category": "model",
71
+ "type": "select",
72
+ "currentValue": "openai/gpt-5-mini",
73
+ "options": [
74
+ {
75
+ "value": "openai/gpt-5-mini",
76
+ "name": "openai/gpt-5-mini"
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ "id": "mode",
82
+ "name": "Session Mode",
83
+ "description": "Controls how the agent requests permission",
84
+ "category": "mode",
85
+ "type": "select",
86
+ "currentValue": "full-access",
87
+ "options": [
88
+ {
89
+ "value": "auto",
90
+ "name": "Auto",
91
+ "description": "Check actions with an automatic safety review instead of asking",
92
+ "_meta": {
93
+ "fx": {
94
+ "permissionMode": "auto"
95
+ }
96
+ }
97
+ },
98
+ {
99
+ "value": "ask",
100
+ "name": "Ask",
101
+ "description": "Request permission before making any changes",
102
+ "_meta": {
103
+ "fx": {
104
+ "permissionMode": "ask"
105
+ }
106
+ }
107
+ },
108
+ {
109
+ "value": "full-access",
110
+ "name": "Full access",
111
+ "description": "Run every action without asking, outside the sandbox",
112
+ "_meta": {
113
+ "fx": {
114
+ "permissionMode": "yolo"
115
+ }
116
+ }
117
+ }
118
+ ]
119
+ }
120
+ ],
121
+ "modes": {
122
+ "currentModeId": "full-access",
123
+ "availableModes": [
124
+ {
125
+ "id": "auto",
126
+ "name": "Auto",
127
+ "description": "Check actions with an automatic safety review instead of asking"
128
+ },
129
+ {
130
+ "id": "ask",
131
+ "name": "Ask",
132
+ "description": "Request permission before making any changes"
133
+ },
134
+ {
135
+ "id": "full-access",
136
+ "name": "Full access",
137
+ "description": "Run every action without asking, outside the sandbox"
138
+ }
139
+ ]
140
+ }
141
+ },
142
+ "prompt": {
143
+ "stopReason": "end_turn",
144
+ "usage": {
145
+ "inputTokens": 58620,
146
+ "outputTokens": 1183
147
+ }
148
+ },
149
+ "steer": {
150
+ "stopReason": "end_turn",
151
+ "_meta": {
152
+ "fx": {
153
+ "steering": "absorbed"
154
+ }
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,15 @@
1
+ {"sessionUpdate":"agent_message_chunk","messageId":"b86bad695b6f80234f85a6ae84770a00","content":{"type":"text","text":"[context] 114 always-loaded MCP tools exceeded the mcp_selected_schema_bytes budget and stay available through capability_search"}}
2
+ {"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"**Following developer instructions**\n\nI need to ensure I follow the developer's instructions perfectly. First, I’ll send a brief update to the user about the goal and the next step. Then, I’ll call th…"}}
3
+ {"sessionUpdate":"agent_message_chunk","messageId":"e6788e35f07ecb7d4b22767ec6028538","content":{"type":"text","text":"Goal: fetch the swarm agent list with mcp_swarm_get-swarm as the next step, then run the sleep command. I'll call mcp_swarm_get-swarm now."}}
4
+ {"sessionUpdate":"tool_call","toolCallId":"call_kK1rqCaYaXn16uKH9e6fmb7v","name":"mcp_swarm_get-swarm","title":"Get the agent swarm","kind":"other","status":"pending","rawInput":{},"_meta":{"fx":{"toolCall":{"internal":false,"mcp":{"server":"swarm","tool":"get-swarm"}}}}}
5
+ {"sessionUpdate":"tool_call_update","toolCallId":"call_kK1rqCaYaXn16uKH9e6fmb7v","status":"in_progress"}
6
+ {"sessionUpdate":"tool_call_update","toolCallId":"call_kK1rqCaYaXn16uKH9e6fmb7v","status":"completed","content":[{"type":"content","content":{"type":"text","text":"{\"server\":\"swarm\",\"tool\":\"mcp_swarm_get-swarm\",\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Found 1 agent(s) in the swarm. Requested by session: 00000000-0000-4000-8000-0000000000b2\\n\\n- fx-probe (idle"}}]}
7
+ {"sessionUpdate":"user_message_chunk","messageId":"41657d84ac6ea6200d169f93414327bb","content":{"type":"text","text":"Steering: also include the word STEERED in your final reply."},"_meta":{"fx":{"steering":{"requestId":4}}}}
8
+ {"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"**Preparing shell command update**\n\nI’m thinking about how to provide updates during longer tasks. Specifically, I’ll send a brief message before starting a major phase of the work. So, I'll prepare a…"}}
9
+ {"sessionUpdate":"agent_message_chunk","messageId":"bbef5430c871c3e3e256a2d366116413","content":{"type":"text","text":"Now I'll run the shell command `sleep 6 && echo slept > slept.txt` and report its result. I'll run it now."}}
10
+ {"sessionUpdate":"tool_call","toolCallId":"call_61i3wzVhpMAqWhlx7P3ptjxN","name":"shell","title":"Running","kind":"execute","status":"pending","rawInput":{"action":"run","command":"sleep 6 && echo slept > slept.txt","timeout_ms":120000},"_meta":{"fx":{"toolCall":{"internal":false}}}}
11
+ {"sessionUpdate":"tool_call_update","toolCallId":"call_61i3wzVhpMAqWhlx7P3ptjxN","status":"in_progress"}
12
+ {"sessionUpdate":"tool_call_update","toolCallId":"call_61i3wzVhpMAqWhlx7P3ptjxN","status":"completed","content":[{"type":"content","content":{"type":"text","text":""}}],"command_result":{"kind":"command","command":"sleep 6 && echo slept > slept.txt","cwd":"/workspace/task","exit_code":0,"signal":null,"timed_out":false,"duration_ms":6012,"stdout_bytes":0,"stderr_bytes":0,"truncated":false,"output_file":null,"stdout_file":null,"stderr_file":null}}
13
+ {"sessionUpdate":"agent_message_chunk","messageId":"08b3f1a8b8c18d0153eb85eeecf38aab","content":{"type":"text","text":"Results:\n- mcp_swarm_get-swarm returned 1 agent.\n- Shell command `sleep 6 && echo slept > slept.txt` ran and exited with code 0 after ~6012 ms.\n- The command produced no stdout/stderr output; it created (or overwrote) the file `slept.txt` containing the text `slept`.\n\nSTEERED BANANA"}}
14
+ {"sessionUpdate":"session_info_update","title":"Step 1: call the swarm MCP tool `get-swarm`","updatedAt":"2026-10-29T16:12:50Z"}
15
+ {"sessionUpdate":"usage_update","used":20196,"size":400000}