@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,118 @@
1
+ import { Database } from "bun:sqlite";
2
+ import { expect, test } from "bun:test";
3
+ import { runMigrations } from "../be/migrations/runner";
4
+ import {
5
+ ControllerClientMessageSchema,
6
+ ControllerCommandSchema,
7
+ } from "../runtime-providers/controller-protocol";
8
+
9
+ test("migration 260 adds an optional JSON cache and the release table to a fresh database", () => {
10
+ const db = new Database(":memory:");
11
+ try {
12
+ runMigrations(db);
13
+ expect(db.query("PRAGMA table_info(runtime_pools)").all()).toContainEqual(
14
+ expect.objectContaining({ name: "cache", type: "TEXT", notnull: 0 }),
15
+ );
16
+ expect(db.query("PRAGMA foreign_key_check").all()).toEqual([]);
17
+ for (const name of ["runtime_ids", "state", "created_by", "updated_by"])
18
+ expect(db.query("PRAGMA table_info(runtime_cache_releases)").all()).toContainEqual(
19
+ expect.objectContaining({ name, type: "TEXT" }),
20
+ );
21
+ } finally {
22
+ db.close();
23
+ }
24
+ });
25
+
26
+ test("migration 260 preserves existing pools with caching disabled", async () => {
27
+ const db = new Database(":memory:");
28
+ try {
29
+ db.exec(
30
+ "CREATE TABLE _migrations (version INTEGER PRIMARY KEY, name TEXT NOT NULL, applied_at TEXT NOT NULL, checksum TEXT NOT NULL)",
31
+ );
32
+ for (const file of [...new Bun.Glob("*.sql").scanSync("src/be/migrations")]
33
+ .sort()
34
+ .filter((file) => Number(file.split("_")[0]) <= 259)) {
35
+ const sql = await Bun.file(`src/be/migrations/${file}`).text();
36
+ db.transaction(() => {
37
+ db.exec(sql);
38
+ db.run("INSERT INTO _migrations VALUES (?, ?, ?, ?)", [
39
+ Number(file.split("_")[0]),
40
+ file.replace(".sql", ""),
41
+ new Date().toISOString(),
42
+ new Bun.CryptoHasher("sha256").update(sql).digest("hex"),
43
+ ]);
44
+ }).immediate();
45
+ }
46
+ db.run(
47
+ "INSERT INTO runtime_pools (id, name, kind, placements, image, resources, env, lifecycle) VALUES (?, ?, ?, ?, ?, ?, ?, 'idle')",
48
+ [
49
+ "existing-pool",
50
+ "existing",
51
+ "docker",
52
+ '["controller"]',
53
+ "worker:test",
54
+ '{"cpu":2}',
55
+ '{"CUSTOM":"kept"}',
56
+ ],
57
+ );
58
+ runMigrations(db);
59
+ expect(db.query("SELECT name, image, resources, env, cache FROM runtime_pools").get()).toEqual({
60
+ name: "existing",
61
+ image: "worker:test",
62
+ resources: '{"cpu":2}',
63
+ env: '{"CUSTOM":"kept"}',
64
+ cache: null,
65
+ });
66
+ expect(() => db.run("UPDATE runtime_pools SET cache = 'invalid json'")).toThrow();
67
+ expect(db.query("SELECT COUNT(*) AS n FROM runtime_cache_releases").get()).toEqual({ n: 0 });
68
+ } finally {
69
+ db.close();
70
+ }
71
+ });
72
+
73
+ test("cache release runtime IDs accept arrays and reject other JSON values", () => {
74
+ const db = new Database(":memory:");
75
+ try {
76
+ runMigrations(db);
77
+ db.run(
78
+ "INSERT INTO runtime_controllers (id, name, kind, placement) VALUES ('controller', 'controller', 'docker', 'builtin')",
79
+ );
80
+ db.run(`INSERT INTO runtime_cache_releases (id, pool_id, controller_id, owner_id, cache_key, runtime_ids)
81
+ VALUES ('release', 'pool', 'controller', 'owner', 'cache', '[]')`);
82
+ for (const invalid of ["null", "{}", "42", "true", '"runtime"', "invalid json"])
83
+ expect(() =>
84
+ db.run("UPDATE runtime_cache_releases SET runtime_ids = ?", [invalid]),
85
+ ).toThrow();
86
+ db.run("UPDATE runtime_cache_releases SET runtime_ids = ?", ['["runtime-a","runtime-b"]']);
87
+ expect(db.query("SELECT runtime_ids FROM runtime_cache_releases").get()).toEqual({
88
+ runtime_ids: '["runtime-a","runtime-b"]',
89
+ });
90
+ } finally {
91
+ db.close();
92
+ }
93
+ });
94
+
95
+ test("controller protocol accepts legacy hello messages and retains optional cache metadata", () => {
96
+ const legacy = ControllerClientMessageSchema.parse({
97
+ type: "hello",
98
+ controllerId: "controller",
99
+ kind: "docker",
100
+ version: 1,
101
+ traits: { canProvision: true, ephemeralDisk: true, supportsPause: false },
102
+ });
103
+ if (legacy.type !== "hello") throw new Error("Expected hello");
104
+ expect(legacy.traits.persistentCache).toBeUndefined();
105
+ const payload = {
106
+ runtimeId: "runtime",
107
+ agentId: "agent",
108
+ poolId: "pool",
109
+ ownerId: "owner",
110
+ image: "worker:test",
111
+ env: {},
112
+ labels: {},
113
+ cache: { key: "swarm-cache-pool", mountPath: "/cache" },
114
+ };
115
+ expect(
116
+ ControllerCommandSchema.parse({ type: "cmd", id: "command", op: "provision", payload }),
117
+ ).toMatchObject({ payload: { cache: payload.cache } });
118
+ });
@@ -252,7 +252,7 @@ describe("/api/pages/:id/launch", () => {
252
252
  expect(cookie!).toContain("HttpOnly");
253
253
  expect(cookie!).toContain("Path=/");
254
254
  expect(cookie!).toContain("Max-Age=3600");
255
- // In dev (NODE_ENV != production) the cookie should be SameSite=Lax sans Secure.
255
+ // Under bun test (NODE_ENV=test) from http://localhost the cookie should be SameSite=Lax sans Secure.
256
256
  expect(cookie!).toContain("SameSite=Lax");
257
257
  expect(cookie!).not.toMatch(/\bSecure\b/);
258
258
  const cookieValue = /page_session_[A-Za-z0-9_-]+=([^;]+)/.exec(cookie!)?.[1];
@@ -0,0 +1,188 @@
1
+ /**
2
+ * The page-session cookie may only drop `Secure` (SameSite=Lax) for an explicit
3
+ * development or test NODE_ENV and a request from http://localhost or
4
+ * http://127.0.0.1. Deployed images leave NODE_ENV unset, so unset must issue
5
+ * `SameSite=None; Secure`, and the localhost check must parse the origin
6
+ * instead of matching a string prefix.
7
+ *
8
+ * Covers both issuers: the launch endpoint (`src/http/pages.ts`) and the
9
+ * password flow on `/p/:id` (`src/http/pages-public.ts`).
10
+ */
11
+ import { afterAll, afterEach, beforeAll, describe, expect, test } from "bun:test";
12
+ import crypto from "node:crypto";
13
+ import { unlink } from "node:fs/promises";
14
+ import {
15
+ createServer as createHttpServer,
16
+ type IncomingMessage,
17
+ type Server,
18
+ type ServerResponse,
19
+ } from "node:http";
20
+ import { closeDb, initDb } from "../be/db";
21
+ import { handlePages } from "../http/pages";
22
+ import { handlePagesPublic } from "../http/pages-public";
23
+ import { getPathSegments, parseQueryParams } from "../http/utils";
24
+ import { isLocalDevPageRequest } from "../utils/page-session";
25
+ import { listenOnFreePort } from "./test-net";
26
+
27
+ const TEST_DB_PATH = "./test-page-session-dev-cookie.sqlite";
28
+ const PASSWORD = "example-swordfish";
29
+ const ORIGINAL_NODE_ENV = process.env.NODE_ENV;
30
+
31
+ function setNodeEnv(value: string | undefined): void {
32
+ if (value === undefined) delete process.env.NODE_ENV;
33
+ else process.env.NODE_ENV = value;
34
+ }
35
+
36
+ function createTestServer(): Server {
37
+ return createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {
38
+ const pathSegments = getPathSegments(req.url || "");
39
+ const queryParams = parseQueryParams(req.url || "");
40
+ const myAgentId = req.headers["x-agent-id"] as string | undefined;
41
+ if (await handlePagesPublic(req, res, pathSegments, queryParams)) return;
42
+ if (await handlePages(req, res, pathSegments, queryParams, myAgentId)) return;
43
+ res.writeHead(404);
44
+ res.end("not found");
45
+ });
46
+ }
47
+
48
+ type Case = { name: string; nodeEnv: string | undefined; origin?: string; secure: boolean };
49
+
50
+ const CASES: Case[] = [
51
+ { name: "NODE_ENV unset, no Origin", nodeEnv: undefined, secure: true },
52
+ {
53
+ name: "NODE_ENV unset, spoofed localhost prefix",
54
+ nodeEnv: undefined,
55
+ origin: "http://localhost.evil.example",
56
+ secure: true,
57
+ },
58
+ {
59
+ name: "NODE_ENV unset, real localhost origin",
60
+ nodeEnv: undefined,
61
+ origin: "http://localhost:5274",
62
+ secure: true,
63
+ },
64
+ {
65
+ name: "NODE_ENV=development, spoofed localhost prefix",
66
+ nodeEnv: "development",
67
+ origin: "http://localhost.evil.example",
68
+ secure: true,
69
+ },
70
+ {
71
+ name: "NODE_ENV=development, portless https origin",
72
+ nodeEnv: "development",
73
+ origin: "https://ui.swarm.localhost",
74
+ secure: true,
75
+ },
76
+ {
77
+ name: "NODE_ENV=development, localhost UI origin",
78
+ nodeEnv: "development",
79
+ origin: "http://localhost:5274",
80
+ secure: false,
81
+ },
82
+ {
83
+ name: "NODE_ENV=development, 127.0.0.1 UI origin",
84
+ nodeEnv: "development",
85
+ origin: "http://127.0.0.1:5274",
86
+ secure: false,
87
+ },
88
+ ];
89
+
90
+ function expectCookieShape(cookie: string | null, secure: boolean): void {
91
+ expect(cookie).toContain("page_session_");
92
+ if (secure) {
93
+ expect(cookie!).toContain("SameSite=None");
94
+ expect(cookie!).toMatch(/\bSecure\b/);
95
+ } else {
96
+ expect(cookie!).toContain("SameSite=Lax");
97
+ expect(cookie!).not.toMatch(/\bSecure\b/);
98
+ }
99
+ }
100
+
101
+ describe("page-session cookie dev softening fails closed", () => {
102
+ let server: Server;
103
+ let base = "";
104
+ let authedId = "";
105
+ let passwordId = "";
106
+ const agentId = crypto.randomUUID();
107
+
108
+ async function createPage(body: Record<string, unknown>): Promise<string> {
109
+ const post = await fetch(`${base}/api/pages`, {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json", "X-Agent-ID": agentId },
112
+ body: JSON.stringify({ contentType: "text/html", body: "<h1>x</h1>", ...body }),
113
+ });
114
+ expect(post.status).toBe(201);
115
+ return ((await post.json()) as { id: string }).id;
116
+ }
117
+
118
+ beforeAll(async () => {
119
+ process.env.PAGE_SESSION_SECRET = "example-test-page-session-dev-cookie-secret";
120
+ for (const suffix of ["", "-wal", "-shm"]) {
121
+ try {
122
+ await unlink(`${TEST_DB_PATH}${suffix}`);
123
+ } catch {}
124
+ }
125
+ initDb(TEST_DB_PATH);
126
+ server = createTestServer();
127
+ const port = await listenOnFreePort(server);
128
+ base = `http://localhost:${port}`;
129
+ authedId = await createPage({ slug: "dev-cookie-authed", title: "A", authMode: "authed" });
130
+ passwordId = await createPage({
131
+ slug: "dev-cookie-password",
132
+ title: "P",
133
+ authMode: "password",
134
+ password: PASSWORD,
135
+ });
136
+ });
137
+
138
+ afterEach(() => setNodeEnv(ORIGINAL_NODE_ENV));
139
+
140
+ afterAll(async () => {
141
+ setNodeEnv(ORIGINAL_NODE_ENV);
142
+ await new Promise<void>((resolve) => server.close(() => resolve()));
143
+ closeDb();
144
+ for (const suffix of ["", "-wal", "-shm"]) {
145
+ try {
146
+ await unlink(`${TEST_DB_PATH}${suffix}`);
147
+ } catch {}
148
+ }
149
+ });
150
+
151
+ test.each(CASES)("launch endpoint: $name", async ({ nodeEnv, origin, secure }) => {
152
+ setNodeEnv(nodeEnv);
153
+ const res = await fetch(`${base}/api/pages/${authedId}/launch`, {
154
+ method: "POST",
155
+ headers: { "X-Agent-ID": agentId, ...(origin ? { Origin: origin } : {}) },
156
+ });
157
+ expect(res.status).toBe(204);
158
+ expectCookieShape(res.headers.get("set-cookie"), secure);
159
+ });
160
+
161
+ test.each(CASES)("/p/:id password flow: $name", async ({ nodeEnv, origin, secure }) => {
162
+ setNodeEnv(nodeEnv);
163
+ const res = await fetch(`${base}/p/${passwordId}?key=${PASSWORD}`, {
164
+ redirect: "manual",
165
+ headers: origin ? { Origin: origin } : {},
166
+ });
167
+ expect(res.status).toBeLessThan(400);
168
+ expectCookieShape(res.headers.get("set-cookie"), secure);
169
+ });
170
+ });
171
+
172
+ describe("isLocalDevPageRequest Host fallback", () => {
173
+ afterEach(() => setNodeEnv(ORIGINAL_NODE_ENV));
174
+
175
+ test.each([
176
+ [undefined, "localhost:3013", false],
177
+ ["production", "localhost:3013", false],
178
+ ["development", "localhost:3013", true],
179
+ ["development", "127.0.0.1:3013", true],
180
+ ["development", undefined, true],
181
+ ["development", "localhost.evil.example", false],
182
+ ["development", "localhost@evil.example", false],
183
+ ["development", "api.swarm.localhost", false],
184
+ ] as const)("NODE_ENV=%p Host=%p → %p", (nodeEnv, host, expected) => {
185
+ setNodeEnv(nodeEnv);
186
+ expect(isLocalDevPageRequest({ headers: host === undefined ? {} : { host } })).toBe(expected);
187
+ });
188
+ });
@@ -50,6 +50,7 @@ describe("PAGES_FRAME_ANCESTORS on /p/:id", () => {
50
50
  APP_URL: process.env.APP_URL,
51
51
  DASHBOARD_URL: process.env.DASHBOARD_URL,
52
52
  PAGE_SESSION_SECRET: process.env.PAGE_SESSION_SECRET,
53
+ NODE_ENV: process.env.NODE_ENV,
53
54
  };
54
55
 
55
56
  function restore(key: keyof typeof ORIG): void {
@@ -93,7 +94,10 @@ describe("PAGES_FRAME_ANCESTORS on /p/:id", () => {
93
94
  BASE = `http://localhost:${port}`;
94
95
  });
95
96
 
96
- afterEach(() => restore("PAGES_FRAME_ANCESTORS"));
97
+ afterEach(() => {
98
+ restore("PAGES_FRAME_ANCESTORS");
99
+ restore("NODE_ENV");
100
+ });
97
101
 
98
102
  afterAll(async () => {
99
103
  await new Promise<void>((resolve) => server.close(() => resolve()));
@@ -150,6 +154,29 @@ describe("PAGES_FRAME_ANCESTORS on /p/:id", () => {
150
154
  expect(blank).toBe(unset);
151
155
  });
152
156
 
157
+ // Deployed images leave NODE_ENV unset. Localhost dev origins must only be
158
+ // allowed to frame pages under an explicit development or test NODE_ENV.
159
+ for (const nodeEnv of [undefined, "production", "staging"]) {
160
+ test(`NODE_ENV=${nodeEnv ?? "<unset>"} emits no localhost ancestors`, async () => {
161
+ if (nodeEnv === undefined) delete process.env.NODE_ENV;
162
+ else process.env.NODE_ENV = nodeEnv;
163
+ const id = await createPage(`public-env-${nodeEnv ?? "unset"}`, "public");
164
+ const fa = frameAncestors(await fetch(`${BASE}/p/${id}`));
165
+ expect(fa.trim()).toBe("frame-ancestors 'self' https://app.example.test");
166
+ });
167
+ }
168
+
169
+ for (const nodeEnv of ["development", "test"]) {
170
+ test(`NODE_ENV=${nodeEnv} keeps the local dashboard origins`, async () => {
171
+ process.env.NODE_ENV = nodeEnv;
172
+ const id = await createPage(`public-env-${nodeEnv}`, "public");
173
+ const fa = frameAncestors(await fetch(`${BASE}/p/${id}`));
174
+ expect(fa).toContain("https://app.example.test");
175
+ expect(fa).toContain("http://localhost:5274");
176
+ expect(fa).toContain("https://*.localhost");
177
+ });
178
+ }
179
+
153
180
  test("parser accepts comma or space lists and drops invalid entries", () => {
154
181
  process.env.PAGES_FRAME_ANCESTORS =
155
182
  "https://www.agent-swarm.dev/, https://*.example.com:8443 blog.example.org,* 'none' https://evil.test;script-src javascript:alert(1) https://x.test/path";