@desplega.ai/agent-swarm 2.7.5 → 2.7.7

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 (319) hide show
  1. package/dist/{acp-adapter-g3ads55s.js → acp-adapter-7b4vk3h5.js} +5 -4
  2. package/dist/{actions-zwfykqqk.js → actions-3tt153af.js} +18 -17
  3. package/dist/{amp-adapter-z3s0ssdt.js → amp-adapter-njpts0yr.js} +1 -1
  4. package/dist/{anthropic-messages-x4q6rfq5.js → anthropic-messages-xey2skwx.js} +7 -7
  5. package/dist/{app-vmp4fgep.js → app-nky4378f.js} +3 -3
  6. package/dist/{assistant-vwde653f.js → assistant-jnb669pa.js} +24 -22
  7. package/dist/{azure-openai-responses-s1w5n70z.js → azure-openai-responses-26t7j9ra.js} +5 -5
  8. package/dist/{boot-reembed-375t7tbk.js → boot-reembed-9mgvaztt.js} +1 -1
  9. package/dist/{boot-reembed-gq9rcpnj.js → boot-reembed-qs2djdej.js} +1 -1
  10. package/dist/{boot-scrub-sweep-nd938kyf.js → boot-scrub-sweep-yjpdj7s1.js} +3 -3
  11. package/dist/{boot-seeds-aykx51v3.js → boot-seeds-5cm6ambd.js} +4 -4
  12. package/dist/{boxd-k1j26g3h.js → boxd-nv507va8.js} +5 -5
  13. package/dist/{claude-adapter-8j4hm099.js → claude-adapter-fn287zmm.js} +5 -4
  14. package/dist/{claude-managed-setup-0wyynpn1.js → claude-managed-setup-wtdz2mj2.js} +1 -1
  15. package/dist/{claude-sdk-session-q6wj5hmy.js → claude-sdk-session-x91kqyhm.js} +9677 -9514
  16. package/dist/{cli-j3jvnpe8.js → cli-08bmz9z9.js} +1 -1
  17. package/dist/{cli-gjr2y2xk.js → cli-0agcv1v5.js} +4 -1
  18. package/dist/{cli-y24sc29k.js → cli-1c6tzt8g.js} +30 -8
  19. package/dist/{cli-mjzynrse.js → cli-35rsp8ye.js} +1 -1
  20. package/dist/{cli-rpm2sgv0.js → cli-3fg0bdcv.js} +19 -2
  21. package/dist/{cli-nn4d8dne.js → cli-5b456bpf.js} +2 -2
  22. package/dist/{cli-bhjt02p8.js → cli-5jnhv72d.js} +1 -1
  23. package/dist/{cli-fqzx7gwa.js → cli-5zx699j9.js} +2 -2
  24. package/dist/{cli-hf6zt5m6.js → cli-69szn7w7.js} +17 -1
  25. package/dist/{cli-vqypxzh4.js → cli-6g0hb4cp.js} +8 -8
  26. package/dist/{cli-tqgg40ek.js → cli-6pfd54vx.js} +9 -8
  27. package/dist/{cli-bsn8nhrq.js → cli-6vcp76qk.js} +3 -3
  28. package/dist/{cli-zppwg9p9.js → cli-72v799xn.js} +1 -1
  29. package/dist/cli-82j36f2m.js +45 -0
  30. package/dist/{cli-hn9hxmz9.js → cli-8305gbq0.js} +29 -16
  31. package/dist/{cli-z8eh3ex8.js → cli-8sckt74b.js} +8 -8
  32. package/dist/{cli-bnz7a7qf.js → cli-95jzxcp3.js} +1 -1
  33. package/dist/{cli-0bxqnvq9.js → cli-adeegh7d.js} +29 -7
  34. package/dist/{cli-g61qxmge.js → cli-afkqkrtw.js} +3 -3
  35. package/dist/{cli-7a42nfy0.js → cli-ayayvfg4.js} +24 -4
  36. package/dist/{cli-bqt1mptt.js → cli-az48n0nr.js} +4 -4
  37. package/dist/{cli-z6jkx23q.js → cli-bfv7vdg6.js} +9 -9
  38. package/dist/{cli-pywf3eh5.js → cli-caj33vcq.js} +5 -5
  39. package/dist/{cli-5pag6rmn.js → cli-cb2a8pna.js} +1 -1
  40. package/dist/{cli-wvaawacd.js → cli-cppkf404.js} +5236 -72
  41. package/dist/{cli-mry0qzym.js → cli-ddaanqkd.js} +123 -10
  42. package/dist/{cli-0gey5fzy.js → cli-e0kmphd6.js} +2 -2
  43. package/dist/{cli-zh3fp8v2.js → cli-e46hg0xw.js} +1 -1
  44. package/dist/{cli-jm2vfpfd.js → cli-e5bzrn01.js} +1 -1
  45. package/dist/{cli-qxnf8z2z.js → cli-excnnjg2.js} +165 -153
  46. package/dist/{cli-71ptav7x.js → cli-ferkkrg9.js} +1 -1
  47. package/dist/{cli-vpf89f34.js → cli-fmjd0t1y.js} +3 -3
  48. package/dist/{cli-rm6hqj3z.js → cli-fyt2g4wd.js} +33 -139
  49. package/dist/cli-g08zdaec.js +55 -0
  50. package/dist/{cli-ehq736cn.js → cli-g7s47cc5.js} +4 -4
  51. package/dist/{cli-82ae98pz.js → cli-gz6q4eve.js} +3 -3
  52. package/dist/{cli-82jg7fp9.js → cli-he5nxaa8.js} +1 -1
  53. package/dist/{cli-rqkxrmgw.js → cli-je518txm.js} +39 -14
  54. package/dist/{cli-8hs41zy2.js → cli-jtjtabxe.js} +1 -1
  55. package/dist/{cli-611a1294.js → cli-k0wwfqbg.js} +18 -1
  56. package/dist/{cli-nzxr556s.js → cli-k1nje3v3.js} +38 -43
  57. package/dist/{cli-3h4nhjn8.js → cli-k8196sh2.js} +9 -7
  58. package/dist/{cli-afrrppsw.js → cli-k899ehvh.js} +2 -2
  59. package/dist/{cli-0731hvbw.js → cli-m0da8j35.js} +23 -9
  60. package/dist/cli-m2z8jagn.js +12078 -0
  61. package/dist/{cli-8veytvbh.js → cli-mkk9rnzz.js} +5 -5
  62. package/dist/{cli-7wspm5gm.js → cli-n6bv12jn.js} +528 -6
  63. package/dist/{cli-spknvxbq.js → cli-nmzhp1b5.js} +14 -12
  64. package/dist/{cli-p599f1qm.js → cli-p82cnnjq.js} +1 -1
  65. package/dist/{cli-xtjhfmpc.js → cli-pc6n7fre.js} +1 -1
  66. package/dist/{cli-vbyfwh92.js → cli-pjctyea3.js} +2 -2
  67. package/dist/{cli-nmbmy64z.js → cli-pq73h5mz.js} +3 -3
  68. package/dist/{cli-aa6yxc7m.js → cli-pz4rk021.js} +1 -1
  69. package/dist/{cli-7wcyk2s5.js → cli-q3tkegby.js} +1 -1
  70. package/dist/cli-qghe0h66.js +67 -0
  71. package/dist/{cli-6s7vdcta.js → cli-qh4d4tvk.js} +4 -4
  72. package/dist/{cli-mmwm7zbf.js → cli-rtt8g4v9.js} +1 -1
  73. package/dist/{cli-kg8hchyg.js → cli-sa02jsqt.js} +1 -1
  74. package/dist/{cli-1h3wcpbw.js → cli-snpj5zbj.js} +2 -2
  75. package/dist/{cli-a7v854rf.js → cli-tgrv9cjx.js} +263 -12
  76. package/dist/{cli-a47xy8eq.js → cli-vz22fyqv.js} +186 -54
  77. package/dist/{cli-1ayk1eas.js → cli-wk5yrfwd.js} +285 -42
  78. package/dist/{cli-1338796d.js → cli-ws19768n.js} +1755 -119
  79. package/dist/{cli-70r77n04.js → cli-xae4g51r.js} +1 -1
  80. package/dist/{cli-gf5hbmdr.js → cli-yjdgea32.js} +3 -3
  81. package/dist/{cli-xbkdm710.js → cli-yndmfxb3.js} +3 -3
  82. package/dist/{cli-rhw40jgb.js → cli-yyj3j5m4.js} +2 -2
  83. package/dist/cli.js +26 -25
  84. package/dist/{cloudflare-workers-ai-system-one-bm60fjm0.js → cloudflare-workers-ai-system-one-ef2a980q.js} +2 -2
  85. package/dist/{codex-adapter-q6k3gnyg.js → codex-adapter-cf2yxe9m.js} +3 -2
  86. package/dist/{codex-hook-9efm2x1m.js → codex-hook-a0c6g6t6.js} +1 -1
  87. package/dist/{codex-session-runner-3mwmk3d9.js → codex-session-runner-6vfzdgbd.js} +3 -2
  88. package/dist/{commands-evrenjn9.js → commands-t3mfy7vn.js} +9 -3
  89. package/dist/{controller-xjp8vswh.js → controller-q7xrbaz0.js} +8 -3
  90. package/dist/{controllers-connect-pp5jnxvc.js → controllers-connect-c6nm70kg.js} +20 -19
  91. package/dist/{cursor-adapter-yf47w4t0.js → cursor-adapter-ftd81ga8.js} +1 -1
  92. package/dist/{db-zxpw6aht.js → db-dk572x25.js} +3 -3
  93. package/dist/{db-rgfsh91f.js → db-vemtpmcc.js} +14 -4
  94. package/dist/{devtools-82fzqra8.js → devtools-qxfgbsqz.js} +1 -1
  95. package/dist/{dispatcher-smasgws7.js → dispatcher-kh7ecxh9.js} +17 -16
  96. package/dist/{docker-rrjhaqt9.js → docker-c1a3gqmf.js} +89 -22
  97. package/dist/{dsh-adapter-ftyy8dnp.js → dsh-adapter-v8628r89.js} +1 -1
  98. package/dist/{e2b-w1p0bnpm.js → e2b-fr12yccx.js} +5 -5
  99. package/dist/{e2b-qcaj675y.js → e2b-x6ywzak3.js} +3 -3
  100. package/dist/{easter-egg-3d-yyts7p16.js → easter-egg-3d-nenw4x63.js} +1 -1
  101. package/dist/{embedding-space-1z0mbg95.js → embedding-space-0jepb239.js} +6 -6
  102. package/dist/{embeddings-ygeg7tm7.js → embeddings-xxt49yxg.js} +1 -1
  103. package/dist/{execute-14qhqp4d.js → execute-1mhw6e4x.js} +1 -1
  104. package/dist/{external-channel-ttgrs3sx.js → external-channel-55v12e60.js} +2 -2
  105. package/dist/{fx-adapter-gt6pncj2.js → fx-adapter-bs8wqrk5.js} +6 -5
  106. package/dist/{google-generative-ai-yvmdxyxa.js → google-generative-ai-v94hr7h0.js} +5 -5
  107. package/dist/{google-vertex-jrtdh9gs.js → google-vertex-g7vr6cf8.js} +5 -5
  108. package/dist/{grok-adapter-sm4m5k4g.js → grok-adapter-gpjqmkcq.js} +6 -5
  109. package/dist/handlers-zxmp1ta4.js +32 -0
  110. package/dist/{heartbeat-qahz4p62.js → heartbeat-k42svnr0.js} +20 -19
  111. package/dist/{hook-4fd5wq5w.js → hook-114m7hap.js} +4 -3
  112. package/dist/{hook-kj3d398m.js → hook-6nphweh0.js} +24 -9
  113. package/dist/{http-1ted0j1k.js → http-r8cc4wz7.js} +1196 -211
  114. package/dist/index-a8phxqnk.js +37 -0
  115. package/dist/{index-q4b917zs.js → index-e3s8wmxy.js} +1 -1
  116. package/dist/{index-6rq3r5zb.js → index-fpk4bcd9.js} +1 -1
  117. package/dist/{index-5rk6rfzr.js → index-fvzke5kx.js} +1 -1
  118. package/dist/index-k6h00t4c.js +30 -0
  119. package/dist/{index-7v51awbn.js → index-nh3wyqdt.js} +1027 -577
  120. package/dist/{index-yqhz88yy.js → index-pxn30mse.js} +8 -8
  121. package/dist/index-xrz7te8h.js +33 -0
  122. package/dist/{keepalive-6cf311t5.js → keepalive-x060nt9p.js} +3 -3
  123. package/dist/lead-956sd2yc.js +71 -0
  124. package/dist/{maintenance-a4bm1bmt.js → maintenance-2xxfexhf.js} +1 -1
  125. package/dist/{mistral-conversations-4pmwj1c0.js → mistral-conversations-3gjpdb4b.js} +4 -4
  126. package/dist/{oauth-refresh-sweep-3h0dfw1k.js → oauth-refresh-sweep-fckc4ar5.js} +2 -2
  127. package/dist/{onboard-myn5hraa.js → onboard-zc48j237.js} +5 -5
  128. package/dist/{openai-codex-responses-44j573nm.js → openai-codex-responses-8pbxq9h5.js} +5 -5
  129. package/dist/{openai-completions-a4gee2a8.js → openai-completions-rm00s912.js} +4 -4
  130. package/dist/{openai-decisions-w4qkrcar.js → openai-decisions-8v957r2r.js} +1 -1
  131. package/dist/{openai-responses-rbp6h5kr.js → openai-responses-agxpf96k.js} +5 -5
  132. package/dist/{opencode-adapter-p2nkb5am.js → opencode-adapter-r690h1cr.js} +4 -3
  133. package/dist/{otel-impl-a1a0ef6b.js → otel-impl-r5xbh81q.js} +4 -4
  134. package/dist/{pi-mono-adapter-rzmpb72a.js → pi-mono-adapter-c7v8sdec.js} +7 -6
  135. package/dist/{pricing-refresh-83drrnxj.js → pricing-refresh-3pmre11v.js} +3 -3
  136. package/dist/{rbac-roles-s8y6ecb5.js → rbac-roles-3vbshwsb.js} +1 -1
  137. package/dist/{rbac-roles-0fb6e7pj.js → rbac-roles-910mmkgz.js} +2 -2
  138. package/dist/{render-v2-twmbgrz4.js → render-v2-pxykkbab.js} +3 -3
  139. package/dist/{resume-zfqc36xj.js → resume-adda0bwy.js} +6 -6
  140. package/dist/{runtime-qwggdpqr.js → runtime-fnbm7stk.js} +1 -1
  141. package/dist/{session-access-sc9pn9da.js → session-access-2fvamrdc.js} +4 -4
  142. package/dist/{session-source-backfill-qh07xr8g.js → session-source-backfill-08xvv0sm.js} +2 -2
  143. package/dist/{setup-4fr0m7a1.js → setup-1aqmvmh1.js} +3 -3
  144. package/dist/{typesafe-system-one-5mavm259.js → typesafe-system-one-0bmqcxfg.js} +2 -2
  145. package/dist/{virtual-modules-fh4ha15b.js → virtual-modules-d2pjk9j1.js} +5 -5
  146. package/dist/{work-objects-0wr8zxct.js → work-objects-9s0yrm5j.js} +20 -19
  147. package/dist/{worker-follow-up-ktyyazyp.js → worker-follow-up-3q78fqmr.js} +17 -16
  148. package/dist/worker-y15hy08h.js +71 -0
  149. package/openapi.json +289 -4
  150. package/package.json +9 -8
  151. package/src/apps/definition.ts +6 -5
  152. package/src/be/db/page-theme-tokens.ts +12 -0
  153. package/src/be/db/script-runs.ts +23 -0
  154. package/src/be/db/tasks/read.ts +131 -4
  155. package/src/be/db/tasks/write.ts +19 -0
  156. package/src/be/db-client.ts +114 -11
  157. package/src/be/db.ts +49 -6
  158. package/src/be/memory/providers/sqlite-store.ts +49 -12
  159. package/src/be/migrations/260_runtime_pool_cache.sql +20 -0
  160. package/src/be/migrations/262_session_visibility_indexes.sql +18 -0
  161. package/src/be/migrations/263_task_list_filter_index.sql +11 -0
  162. package/src/be/migrations/264_slack_thread_cover_index.sql +9 -0
  163. package/src/be/migrations/266_script_runs_source_task.sql +11 -0
  164. package/src/be/migrations/269_pages_design_system.sql +23 -0
  165. package/src/be/runtime-pools/cache-cleanup.ts +109 -0
  166. package/src/be/runtime-pools/db.ts +65 -6
  167. package/src/be/runtime-pools/remote-controller.ts +5 -0
  168. package/src/be/runtime-pools/supervisor.ts +33 -2
  169. package/src/be/scripts/typecheck.ts +22 -0
  170. package/src/be/seed/schedules-seeder.ts +0 -10
  171. package/src/be/seed-scripts/catalog/catalog-report.inline.ts +2 -0
  172. package/src/be/seed-scripts/catalog/catalog-report.ts +2 -0
  173. package/src/be/seed-scripts/catalog/memory-eval.ts +2 -0
  174. package/src/be/seed-scripts/catalog/swarm-update-check.ts +150 -0
  175. package/src/be/seed-scripts/catalog/task-failure-audit.ts +5 -1
  176. package/src/be/seed-scripts/index.ts +9 -0
  177. package/src/be/seed-skills/bundled-files.generated.json +3 -3
  178. package/src/be/swarm-config-guard.ts +32 -0
  179. package/src/be/task-auto-title-listener.ts +127 -0
  180. package/src/commands/controller.ts +4 -0
  181. package/src/commands/entrypoint-api-readiness.ts +74 -0
  182. package/src/commands/onboard/agent-fs-version.ts +1 -1
  183. package/src/commands/profile-sync.ts +151 -16
  184. package/src/commands/runner.ts +15 -7
  185. package/src/hooks/hook.ts +20 -9
  186. package/src/http/index.ts +4 -1
  187. package/src/http/list-total-cache.ts +14 -7
  188. package/src/http/memory.ts +38 -9
  189. package/src/http/pages-public.ts +93 -129
  190. package/src/http/pages.ts +94 -21
  191. package/src/http/script-runs.ts +174 -5
  192. package/src/http/status.ts +10 -2
  193. package/src/http/tasks.ts +4 -2
  194. package/src/pages/browser-sdk.ts +48 -21
  195. package/src/pages/color-literals.ts +115 -0
  196. package/src/pages/page-head.ts +766 -0
  197. package/src/pages/version.ts +3 -0
  198. package/src/providers/amp-adapter.ts +1 -1
  199. package/src/providers/codex-adapter.ts +1 -0
  200. package/src/providers/codex-app-server.ts +27 -1
  201. package/src/providers/fx-adapter.ts +1 -1
  202. package/src/providers/pi-mono-extension.ts +30 -15
  203. package/src/runtime-providers/controller-protocol.ts +14 -1
  204. package/src/runtime-providers/controller.ts +5 -0
  205. package/src/runtime-providers/docker.ts +108 -23
  206. package/src/runtime-providers/types.ts +16 -0
  207. package/src/script-workflows/workflow-ctx.ts +8 -0
  208. package/src/scripts-runtime/types/stdlib.d.ts +22 -0
  209. package/src/scripts-runtime/types/swarm-sdk.d.ts +22 -0
  210. package/src/server-user.ts +1 -0
  211. package/src/slack/commands.ts +5 -1
  212. package/src/slack/handlers.ts +37 -2
  213. package/src/slack/left-threads.ts +27 -4
  214. package/src/tasks/follow-up-gate.ts +318 -0
  215. package/src/tasks/follow-up-redelegation-guard.ts +155 -0
  216. package/src/tasks/worker-follow-up.ts +21 -1
  217. package/src/tests/claude-artifacts-read-script.test.ts +209 -0
  218. package/src/tests/codex-app-server.test.ts +59 -0
  219. package/src/tests/codex-gateway-route.test.ts +50 -1
  220. package/src/tests/create-page-tool.test.ts +501 -0
  221. package/src/tests/db-client-busy-retry.test.ts +81 -0
  222. package/src/tests/db-client.test.ts +21 -0
  223. package/src/tests/db-task-read-contract.test.ts +9 -2
  224. package/src/tests/db-task-write-contract.test.ts +7 -1
  225. package/src/tests/db-tasks-read.test.ts +21 -0
  226. package/src/tests/entrypoint-api-readiness.test.ts +416 -210
  227. package/src/tests/explicit-model-validation.test.ts +14 -8
  228. package/src/tests/fixtures/pages/head-v1.html +56 -0
  229. package/src/tests/follow-up-gate-shadow.test.ts +513 -0
  230. package/src/tests/follow-up-redelivery-guard.test.ts +432 -202
  231. package/src/tests/identity-field-budget.test.ts +1 -1
  232. package/src/tests/internal-ai/credentials.test.ts +62 -0
  233. package/src/tests/internal-ai/task-title.test.ts +283 -0
  234. package/src/tests/list-total-cache.test.ts +27 -2
  235. package/src/tests/memory-fts-populate.test.ts +11 -9
  236. package/src/tests/memory-retrieval-purge.test.ts +80 -0
  237. package/src/tests/merge-gate-detect-changes.test.ts +145 -0
  238. package/src/tests/migration-260-runtime-pool-cache.test.ts +118 -0
  239. package/src/tests/page-proxy.test.ts +1 -1
  240. package/src/tests/page-session-dev-cookie.test.ts +188 -0
  241. package/src/tests/pages-frame-ancestors.test.ts +28 -1
  242. package/src/tests/pages-head-v2.test.ts +534 -0
  243. package/src/tests/pages-http.test.ts +330 -0
  244. package/src/tests/pages-public-html.test.ts +43 -0
  245. package/src/tests/pages-storage.test.ts +182 -0
  246. package/src/tests/pages-versioning.test.ts +72 -0
  247. package/src/tests/profile-sync-stale-writeback.test.ts +334 -0
  248. package/src/tests/profile-sync.test.ts +11 -15
  249. package/src/tests/query-audit-plans.test.ts +27 -0
  250. package/src/tests/runtime-cache-cleanup.test.ts +367 -0
  251. package/src/tests/runtime-e2b-pools.test.ts +41 -0
  252. package/src/tests/runtime-pools-db.test.ts +98 -0
  253. package/src/tests/runtime-pools-http.test.ts +29 -0
  254. package/src/tests/runtime-providers-docker.test.ts +253 -0
  255. package/src/tests/runtime-remote-controller.test.ts +66 -2
  256. package/src/tests/runtime-supervisor.test.ts +66 -2
  257. package/src/tests/scheduled-task-required-params-migration.test.ts +3 -1
  258. package/src/tests/script-connections.test.ts +13 -0
  259. package/src/tests/script-runs-http.test.ts +684 -2
  260. package/src/tests/seed-registry.test.ts +28 -6
  261. package/src/tests/seed-schedules.test.ts +61 -8
  262. package/src/tests/seed-scripts.test.ts +168 -2
  263. package/src/tests/slack-leave-thread.test.ts +145 -5
  264. package/src/tests/slack-render-v2-query-plans.test.ts +24 -2
  265. package/src/tests/status.test.ts +11 -0
  266. package/src/tests/swarm-diff.test.ts +121 -2
  267. package/src/tests/task-auto-title-config-guard.test.ts +37 -0
  268. package/src/tests/task-auto-title-listener.test.ts +165 -0
  269. package/src/tests/tasks-readable-row.test.ts +155 -0
  270. package/src/tests/theme-import.test.ts +758 -0
  271. package/src/tests/themes-page-theme.test.ts +155 -0
  272. package/src/tests/themes-presets.test.ts +172 -0
  273. package/src/tests/workflow-script-principal.test.ts +2 -1
  274. package/src/themes/classics.ts +949 -0
  275. package/src/themes/import.ts +420 -0
  276. package/src/themes/page-fields.ts +40 -0
  277. package/src/themes/page-theme.ts +102 -0
  278. package/src/themes/presets.ts +561 -0
  279. package/src/themes/tokens.ts +218 -0
  280. package/src/tools/app-upsert.ts +1 -1
  281. package/src/tools/create-page.ts +118 -12
  282. package/src/tools/send-task.ts +35 -47
  283. package/src/tools/slack-leave-thread.ts +1 -1
  284. package/src/tools/task-dedup.ts +45 -21
  285. package/src/tools/utils.ts +33 -0
  286. package/src/types.ts +83 -3
  287. package/src/utils/constants.ts +19 -0
  288. package/src/utils/follow-up-gate-schedule-ids.ts +13 -0
  289. package/src/utils/internal-ai/credentials.ts +146 -93
  290. package/src/utils/internal-ai/index.ts +10 -0
  291. package/src/utils/internal-ai/models.ts +18 -0
  292. package/src/utils/internal-ai/task-title.ts +282 -0
  293. package/src/utils/page-session.ts +37 -0
  294. package/templates/schedules/daily-status-report/content.md +88 -2
  295. package/templates/schedules/daily-swarm-update-check/content.md +16 -40
  296. package/templates/skills/apps/SKILL.md +1 -1
  297. package/templates/skills/apps/content.md +1 -1
  298. package/templates/skills/composio-google-docs/content.md +10 -0
  299. package/templates/skills/heartbeat-runbook/content.md +1 -1
  300. package/templates/skills/pages/config.json +1 -1
  301. package/templates/skills/pages/content.md +539 -86
  302. package/templates/skills/pages/files/examples/annotated-pr.html +21 -12
  303. package/templates/skills/pages/files/examples/multiplayer-board.html +41 -41
  304. package/templates/skills/pages/files/examples/report-page.html +125 -124
  305. package/templates/skills/script-workflows/content.md +19 -1
  306. package/templates/skills/swarm-docs/content.md +1 -0
  307. package/templates/skills/swarm-scripts/SKILL.md +2 -0
  308. package/templates/skills/swarm-scripts/content.md +2 -0
  309. package/dist/cli-2pnswgh8.js +0 -189
  310. package/dist/cli-dznrgaep.js +0 -30
  311. package/dist/cli-w3hcrxht.js +0 -6985
  312. package/dist/handlers-vwmba1m2.js +0 -31
  313. package/dist/index-5r71rf98.js +0 -32
  314. package/dist/index-anmwxs87.js +0 -29
  315. package/dist/index-spp0ra5c.js +0 -36
  316. package/dist/lead-fjy418cw.js +0 -69
  317. package/dist/worker-0c5tyzqe.js +0 -69
  318. package/templates/schedules/daily-workflow-health-audit/config.json +0 -19
  319. package/templates/schedules/daily-workflow-health-audit/content.md +0 -191
@@ -0,0 +1,209 @@
1
+ /**
2
+ * examples/claude-artifacts-read/claude-artifacts-read.sh must never write
3
+ * outside <outdir> and never replace a file with content that failed its
4
+ * sha256 check. A mock `claude` (CLAUDE_BIN) replays canned stream-json, so
5
+ * no network or auth is involved.
6
+ */
7
+ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
8
+ import { createHash } from "node:crypto";
9
+ import {
10
+ lstat,
11
+ mkdir,
12
+ mkdtemp,
13
+ readdir,
14
+ readFile,
15
+ readlink,
16
+ rm,
17
+ symlink,
18
+ writeFile,
19
+ } from "node:fs/promises";
20
+ import { tmpdir } from "node:os";
21
+ import { join, resolve } from "node:path";
22
+ import { CHILD_PROCESS_TEST_BUDGET_MS, runChild } from "./test-proc";
23
+
24
+ const SCRIPT = resolve(
25
+ import.meta.dir,
26
+ "../../examples/claude-artifacts-read/claude-artifacts-read.sh",
27
+ );
28
+
29
+ const MOCK_CLAUDE = `#!/usr/bin/env bash
30
+ case "$2" in
31
+ *list_files*) cat "$MOCK_DIR/list.jsonl" ;;
32
+ *) cat "$MOCK_DIR/read.jsonl" ;;
33
+ esac
34
+ `;
35
+
36
+ const sha256 = (s: string) => createHash("sha256").update(s).digest("hex");
37
+
38
+ function toolResult(blocks: string[]): string {
39
+ return JSON.stringify({
40
+ type: "user",
41
+ message: {
42
+ content: [{ type: "tool_result", content: blocks.map((text) => ({ type: "text", text })) }],
43
+ },
44
+ });
45
+ }
46
+
47
+ let root: string;
48
+ let out: string;
49
+ let outside: string;
50
+ let mockDir: string;
51
+
52
+ /**
53
+ * Stage a listing whose sha256 for each path is `listed` and a read that
54
+ * returns `served`, then run the script into `out`.
55
+ */
56
+ async function run(files: { path: string; listed: string; served: string }[]) {
57
+ const init = JSON.stringify({
58
+ type: "system",
59
+ subtype: "init",
60
+ claude_code_version: "2.1.314",
61
+ tools: ["mcp__claude-artifacts__list_files", "mcp__claude-artifacts__read_file"],
62
+ });
63
+ const manifest = {
64
+ slug: "art_mock",
65
+ files: files.map((f) => ({
66
+ path: f.path,
67
+ content_type: "text/html",
68
+ size: f.listed.length,
69
+ sha256: sha256(f.listed),
70
+ })),
71
+ };
72
+ await writeFile(
73
+ join(mockDir, "list.jsonl"),
74
+ `${init}\n${toolResult([JSON.stringify(manifest)])}\n`,
75
+ );
76
+ const reads = files.map((f) =>
77
+ toolResult([
78
+ JSON.stringify({ path: f.path }),
79
+ `<untrusted-document-abc123>${f.served}</untrusted-document-abc123>`,
80
+ ]),
81
+ );
82
+ await writeFile(join(mockDir, "read.jsonl"), `${init}\n${reads.join("\n")}\n`);
83
+ return runChild(["bash", SCRIPT, "https://claude.ai/artifact/mock", out], {
84
+ env: {
85
+ PATH: process.env.PATH,
86
+ HOME: root,
87
+ CLAUDE_BIN: join(mockDir, "claude"),
88
+ MOCK_DIR: mockDir,
89
+ },
90
+ });
91
+ }
92
+
93
+ beforeEach(async () => {
94
+ root = await mkdtemp(join(tmpdir(), "claude-artifacts-read-"));
95
+ out = join(root, "out");
96
+ outside = join(root, "outside");
97
+ mockDir = join(root, "mock");
98
+ await mkdir(out);
99
+ await mkdir(outside);
100
+ await mkdir(mockDir);
101
+ await writeFile(join(mockDir, "claude"), MOCK_CLAUDE, { mode: 0o755 });
102
+ });
103
+
104
+ afterEach(async () => {
105
+ await rm(root, { recursive: true, force: true });
106
+ });
107
+
108
+ describe("claude-artifacts-read.sh", () => {
109
+ test(
110
+ "a sha256 mismatch leaves an existing file untouched",
111
+ async () => {
112
+ await mkdir(join(out, "project"));
113
+ await writeFile(join(out, "project/a.html"), "previous good copy");
114
+
115
+ const r = await run([
116
+ { path: "project/a.html", listed: "real content", served: "truncated" },
117
+ ]);
118
+
119
+ expect(r.exitCode).toBe(1);
120
+ expect(r.stderr).toContain("sha256 mismatch: project/a.html");
121
+ expect(await readFile(join(out, "project/a.html"), "utf8")).toBe("previous good copy");
122
+ expect(await readdir(join(out, "project"))).toEqual(["a.html"]);
123
+ },
124
+ CHILD_PROCESS_TEST_BUDGET_MS,
125
+ );
126
+
127
+ test(
128
+ "a sha256 mismatch never writes through a destination symlink",
129
+ async () => {
130
+ await writeFile(join(outside, "target.txt"), "external");
131
+ await symlink(join(outside, "target.txt"), join(out, "a.html"));
132
+
133
+ const r = await run([{ path: "a.html", listed: "real content", served: "truncated" }]);
134
+
135
+ expect(r.exitCode).toBe(1);
136
+ expect(await readFile(join(outside, "target.txt"), "utf8")).toBe("external");
137
+ },
138
+ CHILD_PROCESS_TEST_BUDGET_MS,
139
+ );
140
+
141
+ test(
142
+ "a verified file is not written through a destination symlink",
143
+ async () => {
144
+ await writeFile(join(outside, "target.txt"), "external");
145
+ await symlink(join(outside, "target.txt"), join(out, "a.html"));
146
+
147
+ const r = await run([{ path: "a.html", listed: "real content", served: "real content" }]);
148
+
149
+ expect(r.exitCode).toBe(1);
150
+ expect(r.stderr).toContain("refused");
151
+ expect(await readFile(join(outside, "target.txt"), "utf8")).toBe("external");
152
+ expect(await readlink(join(out, "a.html"))).toBe(join(outside, "target.txt"));
153
+ },
154
+ CHILD_PROCESS_TEST_BUDGET_MS,
155
+ );
156
+
157
+ test(
158
+ "a verified file is not written through a parent directory symlink",
159
+ async () => {
160
+ await symlink(outside, join(out, "project"));
161
+
162
+ const r = await run([
163
+ { path: "project/a.html", listed: "real content", served: "real content" },
164
+ ]);
165
+
166
+ expect(r.exitCode).toBe(1);
167
+ expect(r.stderr).toContain("refused");
168
+ expect(await readdir(outside)).toEqual([]);
169
+ },
170
+ CHILD_PROCESS_TEST_BUDGET_MS,
171
+ );
172
+
173
+ test(
174
+ "manifest.json is not written through a symlink",
175
+ async () => {
176
+ await writeFile(join(outside, "target.json"), "external");
177
+ await symlink(join(outside, "target.json"), join(out, "manifest.json"));
178
+
179
+ const r = await run([{ path: "a.html", listed: "real content", served: "real content" }]);
180
+
181
+ expect(r.exitCode).toBe(1);
182
+ expect(await readFile(join(outside, "target.json"), "utf8")).toBe("external");
183
+ // The run stops before any artifact file is written.
184
+ await expect(lstat(join(out, "a.html"))).rejects.toThrow();
185
+ },
186
+ CHILD_PROCESS_TEST_BUDGET_MS,
187
+ );
188
+
189
+ test(
190
+ "verified files and the manifest replace existing regular files",
191
+ async () => {
192
+ await mkdir(join(out, "project"));
193
+ await writeFile(join(out, "project/a.html"), "old");
194
+ await writeFile(join(out, "manifest.json"), "old");
195
+
196
+ const r = await run([
197
+ { path: "project/a.html", listed: "real content", served: "real content" },
198
+ ]);
199
+
200
+ expect(r.exitCode).toBe(0);
201
+ expect(r.stdout).toContain("ok: project/a.html");
202
+ expect(await readFile(join(out, "project/a.html"), "utf8")).toBe("real content");
203
+ expect(JSON.parse(await readFile(join(out, "manifest.json"), "utf8")).slug).toBe("art_mock");
204
+ expect(await readdir(join(out, "project"))).toEqual(["a.html"]);
205
+ expect((await lstat(join(out, "project/a.html"))).isFile()).toBe(true);
206
+ },
207
+ CHILD_PROCESS_TEST_BUDGET_MS,
208
+ );
209
+ });
@@ -1,4 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
2
4
  import { join } from "node:path";
3
5
  import {
4
6
  CodexAppServer,
@@ -205,4 +207,61 @@ describe("CodexAppServer", () => {
205
207
  },
206
208
  CHILD_PROCESS_TEST_BUDGET_MS,
207
209
  );
210
+
211
+ for (const { name, launchOnGateway } of [
212
+ {
213
+ name: "pinned Codex rejects a gateway turn on an app-server launched without it",
214
+ launchOnGateway: false,
215
+ },
216
+ {
217
+ name: "pinned Codex accepts a gateway turn on an app-server launched on the gateway",
218
+ launchOnGateway: true,
219
+ },
220
+ ]) {
221
+ test(
222
+ name,
223
+ async () => {
224
+ const gateway = {
225
+ model_provider: "swarm-gateway",
226
+ model_providers: {
227
+ "swarm-gateway": {
228
+ name: "Swarm gateway",
229
+ base_url: "http://127.0.0.1:9/v1",
230
+ env_key: "CODEX_GATEWAY_API_KEY",
231
+ wire_api: "responses",
232
+ requires_openai_auth: false,
233
+ },
234
+ },
235
+ };
236
+ const home = await mkdtemp(join(tmpdir(), "codex-app-server-provider-"));
237
+ const server = new CodexAppServer({
238
+ codexPath: join(import.meta.dir, "..", "..", "node_modules", ".bin", "codex"),
239
+ env: fixtureEnv({ HOME: home, CODEX_HOME: home, CODEX_GATEWAY_API_KEY: "example" }),
240
+ ...(launchOnGateway ? { configOverrides: gateway } : {}),
241
+ });
242
+ try {
243
+ const started = await server.request<{ thread: { id: string } }>("thread/start", {
244
+ cwd: home,
245
+ approvalPolicy: "never",
246
+ sandbox: "danger-full-access",
247
+ config: gateway,
248
+ ephemeral: true,
249
+ });
250
+ const turn = server.request("turn/start", {
251
+ threadId: started.thread.id,
252
+ input: [{ type: "text", text: "hi" }],
253
+ });
254
+ if (launchOnGateway) await turn;
255
+ else
256
+ await expect(turn).rejects.toThrow(
257
+ "This chat uses swarm-gateway, but your current provider is openai",
258
+ );
259
+ } finally {
260
+ await server.close();
261
+ await rm(home, { recursive: true, force: true });
262
+ }
263
+ },
264
+ CHILD_PROCESS_TEST_BUDGET_MS,
265
+ );
266
+ }
208
267
  });
@@ -4,7 +4,10 @@
4
4
  * selection in the adapter, the presence gate, and the live check.
5
5
  */
6
6
 
7
- import { afterEach, describe, expect, spyOn, test } from "bun:test";
7
+ import { afterAll, afterEach, beforeAll, describe, expect, spyOn, test } from "bun:test";
8
+ import { mkdtempSync, rmSync } from "node:fs";
9
+ import { tmpdir } from "node:os";
10
+ import { join } from "node:path";
8
11
  import { validateProviderCredentials } from "../commands/provider-credentials";
9
12
  import { CodexAdapter, checkCodexCredentials } from "../providers/codex-adapter";
10
13
  import type { ProviderSessionConfig } from "../providers/types";
@@ -75,6 +78,22 @@ afterEach(() => {
75
78
  globalThis.fetch = realFetch;
76
79
  });
77
80
 
81
+ // The adapter reads `process.env.HOME` live (see `codexUserHome`) to decide
82
+ // whether `~/.codex/auth.json` exists. A developer's real codex login would
83
+ // make OAuth win over OPENAI_API_KEY and fail the API-key assertions, so run
84
+ // the file against an empty home. The real auth.json is never touched.
85
+ const realHome = process.env.HOME;
86
+ let isolatedHome: string | undefined;
87
+ beforeAll(() => {
88
+ isolatedHome = mkdtempSync(join(tmpdir(), "codex-gateway-route-home-"));
89
+ process.env.HOME = isolatedHome;
90
+ });
91
+ afterAll(() => {
92
+ if (realHome === undefined) delete process.env.HOME;
93
+ else process.env.HOME = realHome;
94
+ if (isolatedHome) rmSync(isolatedHome, { recursive: true, force: true });
95
+ });
96
+
78
97
  describe("codex gateway route: adapter", () => {
79
98
  test("adds a Responses provider block and keeps OAuth and OPENAI_API_KEY out of the CLI env", async () => {
80
99
  const log = spyOn(console, "log");
@@ -103,6 +122,36 @@ describe("codex gateway route: adapter", () => {
103
122
  expect(logged.some((line) => line.endsWith("Using credential: gateway"))).toBe(true);
104
123
  });
105
124
 
125
+ test("launches the app-server on the gateway provider, and on the default without a gateway", async () => {
126
+ const launched = async (env: Record<string, string>) => {
127
+ let overrides: unknown = "not launched";
128
+ const adapter = new CodexAdapter({
129
+ bypassSubprocess: true,
130
+ appServerFactory: ({ configOverrides }) => {
131
+ overrides = configOverrides;
132
+ throw new Error("test stops before app-server spawn");
133
+ },
134
+ });
135
+ await expect(adapter.createSession(testConfig({ env }))).rejects.toThrow(
136
+ "test stops before app-server spawn",
137
+ );
138
+ return overrides;
139
+ };
140
+ expect(await launched({ ...GATEWAY_ENV, OPENAI_API_KEY: "sk-openai" })).toEqual({
141
+ model_provider: "swarm-gateway",
142
+ model_providers: {
143
+ "swarm-gateway": {
144
+ name: "Swarm gateway",
145
+ base_url: "https://sub2api.example.com/v1",
146
+ env_key: "CODEX_GATEWAY_API_KEY",
147
+ wire_api: "responses",
148
+ requires_openai_auth: false,
149
+ },
150
+ },
151
+ });
152
+ expect(await launched({ OPENAI_API_KEY: "sk-openai" })).toBeUndefined();
153
+ });
154
+
106
155
  test("a gateway URL on api.openai.com is not a gateway: no provider block", async () => {
107
156
  const { codexConfig, env } = await captureSpawn({
108
157
  CODEX_GATEWAY_BASE_URL: "https://api.openai.com/v1",