@desplega.ai/agent-swarm 1.164.1 → 1.166.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +1 -1
  2. package/dist/acp-adapter-yzfxn8vj.js +23 -0
  3. package/dist/{actions-hp2h32dx.js → actions-qz3m692w.js} +24 -28
  4. package/dist/{amp-adapter-zfd7djyx.js → amp-adapter-j1xbmsqz.js} +7 -7
  5. package/dist/{app-w2d26h4f.js → app-43vrdmv8.js} +9 -10
  6. package/dist/{assistant-45pc4en7.js → assistant-ertffmka.js} +25 -29
  7. package/dist/{boot-reembed-k1q2s4fc.js → boot-reembed-998jtpdg.js} +12 -15
  8. package/dist/{boot-reembed-6rhcpsjf.js → boot-reembed-s7k7c6v2.js} +13 -15
  9. package/dist/boot-scrub-sweep-nepsk4t1.js +211 -0
  10. package/dist/{boot-seeds-ex93edx7.js → boot-seeds-vvzs1zhk.js} +12 -12
  11. package/dist/{claude-adapter-hcxd0szm.js → claude-adapter-2zvmekrp.js} +15 -17
  12. package/dist/{claude-managed-adapter-fz7xps2r.js → claude-managed-adapter-s49wbk8t.js} +5 -5
  13. package/dist/{claude-managed-setup-xx6f15h9.js → claude-managed-setup-cvhqq8qn.js} +4 -4
  14. package/dist/{claude-sdk-session-6nb9raem.js → claude-sdk-session-kkbxtw5q.js} +2624 -2606
  15. package/dist/{cli-etbrt8x1.js → cli-0nhdwxd5.js} +4 -4
  16. package/dist/{cli-jeefgppq.js → cli-0qjcsxgz.js} +7 -7
  17. package/dist/{cli-6behs2bt.js → cli-32bca7nr.js} +1 -1
  18. package/dist/{cli-gt8v96qx.js → cli-3ddybbbx.js} +4 -4
  19. package/dist/{acp-adapter-rxvek4ym.js → cli-3qn4r334.js} +317 -35
  20. package/dist/{cli-1d3w4xm3.js → cli-4r1sjfc4.js} +14 -6
  21. package/dist/{cli-691f2rxm.js → cli-66zh26sp.js} +68 -16
  22. package/dist/{cli-et8wdyqh.js → cli-68r1j4sg.js} +9 -9
  23. package/dist/{cli-xb7kyanp.js → cli-8kgvmkak.js} +3 -3
  24. package/dist/{cli-fdpkw8vk.js → cli-8t229cmr.js} +8 -8
  25. package/dist/{cli-gc54qc0p.js → cli-aqcey741.js} +1 -1
  26. package/dist/{cli-4q4cmr4t.js → cli-cpfmqz3n.js} +8 -8
  27. package/dist/{cli-a9bw0xxt.js → cli-df56tqdw.js} +997 -408
  28. package/dist/{cli-n7h1kqpf.js → cli-dmtrxqhg.js} +6 -1
  29. package/dist/{cli-xfb7333f.js → cli-dw2q9f7g.js} +5 -5
  30. package/dist/{cli-4drstbb9.js → cli-ecknp7p1.js} +81 -23
  31. package/dist/{cli-v0pvvhfq.js → cli-efnd2kce.js} +36 -1
  32. package/dist/{cli-1wetf34q.js → cli-f2n17zhp.js} +1 -1
  33. package/dist/{cli-2c8eky5y.js → cli-feh3dkah.js} +1 -1
  34. package/dist/cli-fn697bnt.js +126 -0
  35. package/dist/{cli-v5pr2fgt.js → cli-gt8azyet.js} +3 -3
  36. package/dist/{cli-dbszf3rw.js → cli-h3x613ze.js} +4 -4
  37. package/dist/{cli-nwhb8y2e.js → cli-hf5s9pgf.js} +1 -1
  38. package/dist/cli-j2jbr8af.js +516 -0
  39. package/dist/{cli-agjzafns.js → cli-jhm6hzjn.js} +593 -10
  40. package/dist/{cli-j0tmc908.js → cli-jvj6a0cv.js} +484 -477
  41. package/dist/{cli-xxz89c2n.js → cli-mb75wpxf.js} +1 -1
  42. package/dist/{cli-07s39g1n.js → cli-mv2520nm.js} +1 -1
  43. package/dist/{cli-v90vfwyb.js → cli-mwegs4af.js} +5 -5
  44. package/dist/{cli-bz1gbac9.js → cli-p4ztb80h.js} +2 -2
  45. package/dist/{cli-1wd1n2ya.js → cli-rfphkzh5.js} +1 -1
  46. package/dist/{cli-976r1zqx.js → cli-rggdq8wq.js} +5 -5
  47. package/dist/{cli-3ajw5v5v.js → cli-rsy933yz.js} +6 -6
  48. package/dist/{cli-yj790e19.js → cli-tadfgd0t.js} +8 -1
  49. package/dist/{cli-cn53e7vc.js → cli-ttbsse3f.js} +6 -1
  50. package/dist/{cli-dyqsrqcf.js → cli-v2a8x45d.js} +4 -4
  51. package/dist/{cli-wbvnn6tk.js → cli-v6vv7dy8.js} +91 -9
  52. package/dist/{cli-z2ap2c0c.js → cli-vzc73wet.js} +90 -55
  53. package/dist/cli-wt7ccy4r.js +2654 -0
  54. package/dist/{cli-4cn19jvn.js → cli-x7kpr72a.js} +3 -3
  55. package/dist/{cli-003785v9.js → cli-xvc3q9br.js} +1 -1
  56. package/dist/{cli-v0e7jpr5.js → cli-xvdgasgy.js} +13 -4
  57. package/dist/{cli-asqeg4ve.js → cli-y59h2pk9.js} +2 -2
  58. package/dist/{cli-0wn3ypqv.js → cli-yshaazs1.js} +14121 -3478
  59. package/dist/{cli-wg8yjqtw.js → cli-ysnyhws9.js} +16 -3
  60. package/dist/cli-zp67qg5x.js +92 -0
  61. package/dist/{cli-g3qgrzck.js → cli-zsh093hk.js} +71 -3
  62. package/dist/{cli-ma3zvh39.js → cli-zy7vwsne.js} +6066 -5829
  63. package/dist/cli.js +79 -26
  64. package/dist/{codex-adapter-pcxdn10v.js → codex-adapter-dw1wxqt8.js} +10 -10
  65. package/dist/{codex-hook-b1fb7c2k.js → codex-hook-d2rkvf39.js} +1 -1
  66. package/dist/{codex-login-059nm145.js → codex-login-terbdsqq.js} +2 -2
  67. package/dist/{codex-session-runner-xzwwddp8.js → codex-session-runner-3cgb8y1g.js} +10 -10
  68. package/dist/{commands-98at8mkn.js → commands-mhxam6z2.js} +9 -9
  69. package/dist/{cursor-adapter-dkg6qnkp.js → cursor-adapter-2qda3st7.js} +6 -6
  70. package/dist/{db-01g8wtvw.js → db-sjks418k.js} +11 -9
  71. package/dist/{devin-adapter-qmttt2fz.js → devin-adapter-bffjj5n4.js} +2 -2
  72. package/dist/{dispatcher-nn2k1wxd.js → dispatcher-1es759rn.js} +22 -26
  73. package/dist/{dsh-adapter-w4d4vwdq.js → dsh-adapter-bek4cyw9.js} +6 -6
  74. package/dist/{e2b-9e4g2hvt.js → e2b-nd50eccg.js} +1 -1
  75. package/dist/{event-bus-z7v2t26e.js → event-bus-vnfthafg.js} +2 -2
  76. package/dist/grok-adapter-ar9cw9jg.js +29 -0
  77. package/dist/{handlers-b0kqsbg8.js → handlers-1gkbhktr.js} +25 -29
  78. package/dist/{hook-sap7v1aj.js → hook-ds2zxq9v.js} +16 -18
  79. package/dist/{hook-pz50gqep.js → hook-vxa3tcsy.js} +10 -12
  80. package/dist/{http-ncr8rmd0.js → http-3h21z9md.js} +679 -227
  81. package/dist/{index-c4aqcyz1.js → index-9b65j1m5.js} +11 -11
  82. package/dist/{index-r46s01nq.js → index-bn6cy8ps.js} +22 -26
  83. package/dist/{index-38kqdt3e.js → index-dkfxpkmm.js} +23 -27
  84. package/dist/{index-630kj5vd.js → index-f8xnqrye.js} +55 -43
  85. package/dist/{index-fdk1t4d6.js → index-n0rxa4ca.js} +11962 -9900
  86. package/dist/{index-9nrj7797.js → index-n99fycq7.js} +22 -26
  87. package/dist/{keepalive-31613r2h.js → keepalive-3xspa9jw.js} +14 -11
  88. package/dist/{lead-mx59tr5s.js → lead-6qphc124.js} +43 -43
  89. package/dist/{maintenance-55ff39ca.js → maintenance-0teem1bb.js} +10 -12
  90. package/dist/{node-f0ykebbv.js → node-9sg7ajby.js} +25 -7
  91. package/dist/{oauth-refresh-sweep-anma954w.js → oauth-refresh-sweep-sh9q25xp.js} +13 -10
  92. package/dist/{onboard-b2fy8ftb.js → onboard-54qmnqxe.js} +4 -3
  93. package/dist/{opencode-adapter-p1s92tmy.js → opencode-adapter-wjfa2wvd.js} +6 -6
  94. package/dist/{otel-impl-9brvt7xv.js → otel-impl-ycqzp2a1.js} +2 -2
  95. package/dist/{pi-mono-adapter-kz4rrwvd.js → pi-mono-adapter-e77e9zst.js} +6 -6
  96. package/dist/{pricing-refresh-7w8mbmva.js → pricing-refresh-atnkngqs.js} +10 -10
  97. package/dist/{rbac-roles-ejp7qwvb.js → rbac-roles-9pjphh9q.js} +10 -10
  98. package/dist/{rbac-roles-nhk4r7bc.js → rbac-roles-j78wdksm.js} +10 -10
  99. package/dist/{render-v2-2gzt8skq.js → render-v2-pxjs49fx.js} +9 -10
  100. package/dist/{setup-5et8t412.js → setup-ymej0xtx.js} +2 -2
  101. package/dist/{work-objects-tb0er7qa.js → work-objects-3nh4ymzb.js} +26 -30
  102. package/dist/{worker-62cv075d.js → worker-qa9fkz5s.js} +43 -43
  103. package/dist/{x-vbxb31jr.js → x-ma4gnfgy.js} +2 -2
  104. package/openapi.json +457 -31
  105. package/package.json +14 -6
  106. package/plugin/commands/create-pr.md +7 -1
  107. package/plugin/pi-skills/create-pr/SKILL.md +7 -1
  108. package/src/agentmail/app.ts +5 -4
  109. package/src/be/automation-preflight.ts +11 -9
  110. package/src/be/boot-scrub-sweep.ts +302 -0
  111. package/src/be/connector-codes.ts +81 -0
  112. package/src/be/crypto/key-bootstrap.ts +1 -1
  113. package/src/be/db/approvals.ts +15 -1
  114. package/src/be/db/codex-oauth-device-flows.ts +40 -0
  115. package/src/be/db/config-secrets.ts +31 -0
  116. package/src/be/db/runtime.ts +4 -0
  117. package/src/be/db/script-runs.ts +15 -0
  118. package/src/be/db/tasks/write.ts +1 -1
  119. package/src/be/db-queries/mcp-oauth.ts +5 -0
  120. package/src/be/db-queries/oauth.ts +77 -0
  121. package/src/be/db.ts +162 -59
  122. package/src/be/events.ts +17 -1
  123. package/src/be/memory/index-content.ts +2 -2
  124. package/src/be/memory/providers/sqlite-store.ts +63 -11
  125. package/src/be/memory/types.ts +14 -0
  126. package/src/be/migrations/197_connector_codes.sql +23 -0
  127. package/src/be/migrations/198_permission_audit_guest.sql +33 -0
  128. package/src/be/migrations/200_backfill_auto_memory_expiry.sql +20 -0
  129. package/src/be/migrations/201_workflow_replay_columns.sql +10 -0
  130. package/src/be/migrations/202_codex_oauth_device_flows.sql +24 -0
  131. package/src/be/model-tier-resolution.ts +2 -1
  132. package/src/be/model-validation.ts +1 -1
  133. package/src/be/pricing-normalize.ts +3 -0
  134. package/src/be/rbac-audit.ts +2 -1
  135. package/src/be/scripts/db.ts +28 -4
  136. package/src/be/scripts/source-secrets.ts +37 -0
  137. package/src/be/scripts/typecheck.ts +23 -2
  138. package/src/be/scrub-json.ts +32 -0
  139. package/src/be/sealed-json.ts +59 -0
  140. package/src/be/secret-registry.ts +131 -0
  141. package/src/be/seed-pricing.ts +14 -0
  142. package/src/be/users.ts +7 -1
  143. package/src/be/workflow-replay.ts +77 -0
  144. package/src/cli.tsx +7 -0
  145. package/src/commands/provider-credentials.ts +46 -8
  146. package/src/commands/runner.ts +2 -10
  147. package/src/extensions/contract-types.generated.ts +1 -1
  148. package/src/github/app.ts +4 -4
  149. package/src/heartbeat/heartbeat.ts +20 -8
  150. package/src/hooks/pr-body-guard.ts +1 -1
  151. package/src/http/agents.ts +1 -0
  152. package/src/http/approval-requests.ts +1 -0
  153. package/src/http/apps.ts +3 -0
  154. package/src/http/auth.ts +4 -1
  155. package/src/http/codex-oauth-device.ts +8 -10
  156. package/src/http/codex-oauth-keep-warm.ts +2 -2
  157. package/src/http/config-values.ts +59 -0
  158. package/src/http/config.ts +5 -0
  159. package/src/http/db-query-bounded.ts +3 -0
  160. package/src/http/db-query-shared.ts +107 -15
  161. package/src/http/db-query.ts +10 -2
  162. package/src/http/extensions.ts +1 -0
  163. package/src/http/index.ts +23 -6
  164. package/src/http/integrations.ts +1 -38
  165. package/src/http/ip-rate-limit.ts +82 -0
  166. package/src/http/kv.ts +38 -4
  167. package/src/http/mcp-servers.ts +1 -0
  168. package/src/http/memory.ts +9 -0
  169. package/src/http/models-catalog.ts +2 -0
  170. package/src/http/operator-actor.ts +4 -0
  171. package/src/http/page-proxy.ts +22 -0
  172. package/src/http/pages.ts +4 -2
  173. package/src/http/realtime.ts +1 -1
  174. package/src/http/request-principal.ts +14 -1
  175. package/src/http/script-connections.ts +8 -0
  176. package/src/http/script-runs.ts +12 -4
  177. package/src/http/scripts.ts +15 -0
  178. package/src/http/session-cost-recompute.ts +3 -2
  179. package/src/http/tasks.ts +9 -0
  180. package/src/http/users.ts +226 -0
  181. package/src/http/workflows.ts +3 -2
  182. package/src/http.ts +1 -0
  183. package/src/integrations/kapso/client.ts +3 -1
  184. package/src/jira/app.ts +2 -2
  185. package/src/kv-view.ts +324 -0
  186. package/src/linear/app.ts +2 -2
  187. package/src/oauth/mcp-wrapper.ts +1 -1
  188. package/src/prompts/memories.ts +42 -1
  189. package/src/providers/acp-adapter.ts +85 -24
  190. package/src/providers/acp-target-catalog.ts +54 -1
  191. package/src/providers/acp-targets.ts +358 -4
  192. package/src/providers/amp-adapter.ts +1 -1
  193. package/src/providers/cursor-adapter.ts +1 -1
  194. package/src/providers/grok-adapter.ts +186 -0
  195. package/src/providers/index.ts +5 -1
  196. package/src/providers/pricing-sources.md +6 -0
  197. package/src/providers/reasoning-effort.ts +17 -1
  198. package/src/providers/types.ts +2 -1
  199. package/src/rbac/can.ts +4 -3
  200. package/src/rbac/legacy-policy.ts +3 -3
  201. package/src/rbac/types.ts +6 -0
  202. package/src/script-workflows/supervisor.ts +11 -2
  203. package/src/scripts-runtime/eval-harness.ts +2 -12
  204. package/src/scripts-runtime/executors/quickjs-bundle.ts +152 -0
  205. package/src/scripts-runtime/executors/quickjs-prelude.ts +285 -0
  206. package/src/scripts-runtime/executors/quickjs-runner.ts +580 -0
  207. package/src/scripts-runtime/executors/quickjs-worker.ts +81 -0
  208. package/src/scripts-runtime/executors/quickjs.ts +196 -0
  209. package/src/scripts-runtime/executors/registry.ts +2 -0
  210. package/src/scripts-runtime/executors/sourcemap.ts +79 -0
  211. package/src/scripts-runtime/script-error-hints.ts +14 -0
  212. package/src/scripts-runtime/swarm-sdk.ts +9 -2
  213. package/src/scripts-runtime/types/stdlib.d.ts +27 -8
  214. package/src/scripts-runtime/types/swarm-extension.d.ts +3 -0
  215. package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -8
  216. package/src/server-user.ts +2 -20
  217. package/src/server.ts +3 -1
  218. package/src/slack/app.ts +4 -0
  219. package/src/slack/config.ts +3 -1
  220. package/src/slack/egress-scrub.ts +87 -0
  221. package/src/tests/acp-adapter.test.ts +191 -2
  222. package/src/tests/boot-scrub-sweep.test.ts +390 -0
  223. package/src/tests/budget-user-scope.test.ts +7 -21
  224. package/src/tests/check-pr-body.test.ts +149 -6
  225. package/src/tests/check-text-columns.test.ts +145 -0
  226. package/src/tests/claude-adapter-binary.test.ts +1 -1
  227. package/src/tests/claude-sdk-process.fixture.ts +13 -2
  228. package/src/tests/codex-oauth-device.test.ts +23 -37
  229. package/src/tests/codex-oauth-keep-warm.test.ts +29 -0
  230. package/src/tests/console-scrub.test.ts +141 -0
  231. package/src/tests/credential-check.test.ts +90 -0
  232. package/src/tests/db-query-denylist.test.ts +202 -0
  233. package/src/tests/db-task-read-contract.test.ts +1 -0
  234. package/src/tests/db-task-write-contract.test.ts +1 -0
  235. package/src/tests/docs-index-footprint.test.js +3 -3
  236. package/src/tests/entrypoint-acp-target-binary.test.ts +44 -1
  237. package/src/tests/events-scrub.test.ts +88 -0
  238. package/src/tests/explicit-model-validation.test.ts +81 -0
  239. package/src/tests/extensions-pre-task.test.ts +33 -1
  240. package/src/tests/fixtures/grok/acp-updates-recorded.jsonl +53 -0
  241. package/src/tests/fixtures/grok/prompt-response-meta.json +36 -0
  242. package/src/tests/fixtures/secret-corpus.ts +320 -0
  243. package/src/tests/grok-adapter.test.ts +647 -0
  244. package/src/tests/heartbeat-checklist.test.ts +44 -0
  245. package/src/tests/integration-disable-flags.test.ts +156 -0
  246. package/src/tests/kv-http.test.ts +34 -0
  247. package/src/tests/kv-tool.test.ts +274 -1
  248. package/src/tests/kv-view.test.ts +147 -0
  249. package/src/tests/mcp-user-route.test.ts +257 -15
  250. package/src/tests/memory-injection-outcome.test.ts +143 -0
  251. package/src/tests/model-tier-resolution.test.ts +76 -3
  252. package/src/tests/page-guest-session.test.ts +424 -0
  253. package/src/tests/page-proxy.test.ts +1 -1
  254. package/src/tests/page-viewer-auth.test.ts +22 -1
  255. package/src/tests/pr-body-leaks.test.ts +157 -2
  256. package/src/tests/preload.ts +10 -0
  257. package/src/tests/provider-registration.test.ts +3 -1
  258. package/src/tests/rbac-audit.test.ts +32 -0
  259. package/src/tests/rbac-mcp-admission-e2e.test.ts +4 -62
  260. package/src/tests/script-connections.test.ts +9 -0
  261. package/src/tests/script-executor-conformance.test.ts +3 -0
  262. package/src/tests/script-executor-quickjs.test.ts +442 -0
  263. package/src/tests/script-executor-registry.test.ts +6 -1
  264. package/src/tests/script-runs-http.test.ts +126 -1
  265. package/src/tests/script-runs-scrub.test.ts +275 -0
  266. package/src/tests/scripts-http.test.ts +82 -1
  267. package/src/tests/scripts-mcp-e2e.test.ts +42 -6
  268. package/src/tests/scripts-runtime.test.ts +37 -0
  269. package/src/tests/scrubbed-text-12e.test.ts +289 -0
  270. package/src/tests/sealed-key-guard.test.ts +166 -0
  271. package/src/tests/secret-canary-sweep.test.ts +958 -0
  272. package/src/tests/secret-registry.test.ts +355 -0
  273. package/src/tests/secret-rules.test.ts +230 -0
  274. package/src/tests/secret-scrubber.test.ts +317 -1
  275. package/src/tests/session-costs-golden.test.ts +17 -0
  276. package/src/tests/slack-egress-scrub.test.ts +216 -0
  277. package/src/tests/swarm-tool-result-gate.test.ts +143 -30
  278. package/src/tests/task-tools-ctx.test.ts +3 -0
  279. package/src/tests/user-token-routes.test.ts +342 -3
  280. package/src/tests/workflow-replay.test.ts +518 -0
  281. package/src/tests/workflow-scrub.test.ts +242 -0
  282. package/src/tests/workflow-system-one-decision-providers.test.ts +737 -0
  283. package/src/tools/db-query.ts +1 -1
  284. package/src/tools/inject-learning.ts +1 -1
  285. package/src/tools/kv/kv-get.ts +136 -6
  286. package/src/tools/send-task.ts +61 -17
  287. package/src/tools/utils.ts +186 -43
  288. package/src/tools/workflows/get-workflow-run.ts +3 -2
  289. package/src/types.ts +16 -1
  290. package/src/utils/console-scrub-install.ts +5 -0
  291. package/src/utils/console-scrub.ts +57 -0
  292. package/src/utils/credentials.ts +8 -0
  293. package/src/utils/page-session.ts +6 -2
  294. package/src/utils/pr-body-leaks.ts +149 -10
  295. package/src/utils/request-auth-context.ts +2 -0
  296. package/src/utils/secret-rules.generated.ts +2055 -0
  297. package/src/utils/secret-scrubber.ts +662 -36
  298. package/src/workflows/engine.ts +39 -4
  299. package/src/workflows/executors/notify.ts +6 -1
  300. package/src/workflows/executors/system-one-decision.ts +31 -12
  301. package/src/workflows/executors/system-one-openai-wire.ts +168 -0
  302. package/src/workflows/executors/system-one-providers.ts +112 -11
  303. package/src/workflows/executors/system-one-wire.ts +79 -0
  304. package/src/workflows/recovery.ts +10 -1
  305. package/src/workflows/resume.ts +62 -3
  306. package/src/workflows/retry-poller.ts +3 -0
  307. package/templates/ai-toolbox.manifest.json +2 -2
  308. package/templates/skills/agent-browser/SKILL.md +5 -5
  309. package/templates/skills/agent-browser/config.json +1 -1
  310. package/templates/skills/agent-browser/content.md +4 -4
  311. package/templates/skills/artifacts/content.md +17 -7
  312. package/templates/skills/jira-interaction/config.json +1 -1
  313. package/templates/skills/jira-interaction/content.md +56 -205
  314. package/templates/skills/linear-interaction/config.json +1 -1
  315. package/templates/skills/linear-interaction/content.md +31 -50
  316. package/templates/skills/pages/content.md +8 -4
  317. package/templates/skills/qa/content.md +2 -2
  318. package/templates/skills/workflow-iterate/content.md +4 -4
  319. package/tsconfig.json +3 -3
  320. package/dist/boot-scrub-logs-t8xg7wd7.js +0 -99
  321. package/dist/cli-0a7r5331.js +0 -168
  322. package/dist/cli-93rxw9yd.js +0 -951
  323. package/dist/cli-cvk6yzw5.js +0 -40
  324. package/dist/cli-dgnj0zcc.js +0 -40
  325. package/dist/cli-qt5wzq6v.js +0 -256
  326. package/dist/cli-v7fqehqd.js +0 -9281
  327. package/dist/cli-vbr859rz.js +0 -572
  328. package/src/be/boot-scrub-logs.ts +0 -132
@@ -1,18 +1,16 @@
1
1
  import {
2
2
  getEmbeddingProvider,
3
3
  getMemoryStore,
4
+ init_memory,
4
5
  resetEmbeddingProvider
5
- } from "./cli-v7fqehqd.js";
6
- import"./cli-agjzafns.js";
7
- import"./cli-cvk6yzw5.js";
8
- import"./cli-0wn3ypqv.js";
9
- import"./cli-v0e7jpr5.js";
6
+ } from "./cli-yshaazs1.js";
7
+ import"./cli-xvdgasgy.js";
10
8
  import"./cli-3qhyh31j.js";
11
- import"./cli-vbr859rz.js";
12
- import"./cli-n7h1kqpf.js";
9
+ import"./cli-jhm6hzjn.js";
13
10
  import"./cli-7mm2r1kp.js";
14
11
  import"./cli-g5erf0zt.js";
15
- import"./cli-yj790e19.js";
12
+ import"./cli-dmtrxqhg.js";
13
+ import"./cli-tadfgd0t.js";
16
14
  import"./cli-ywybs5as.js";
17
15
  import"./cli-gd4favx9.js";
18
16
  import"./cli-agamgm0p.js";
@@ -20,13 +18,15 @@ import"./cli-5c2j5yvx.js";
20
18
  import"./cli-1a2j50m0.js";
21
19
  import"./cli-f9w1semm.js";
22
20
  import"./cli-ej6gbxfb.js";
23
- import"./cli-g3qgrzck.js";
21
+ import"./cli-zsh093hk.js";
24
22
  import"./cli-sd0mxa3c.js";
25
23
  import"./cli-w5e1d1vv.js";
26
- import"./cli-1d3w4xm3.js";
24
+ import"./cli-4r1sjfc4.js";
27
25
  import"./cli-zf8jjwex.js";
28
- import"./cli-qt5wzq6v.js";
26
+ import"./cli-wt7ccy4r.js";
29
27
  import"./cli-bc05qbss.js";
28
+ init_memory();
29
+
30
30
  export {
31
31
  getEmbeddingProvider,
32
32
  getMemoryStore,
@@ -4,38 +4,34 @@ import {
4
4
  runScheduleNow,
5
5
  startScheduler,
6
6
  stopScheduler
7
- } from "./cli-a9bw0xxt.js";
8
- import"./cli-003785v9.js";
9
- import"./cli-07s39g1n.js";
7
+ } from "./cli-df56tqdw.js";
8
+ import"./cli-xvc3q9br.js";
9
+ import"./cli-mv2520nm.js";
10
10
  import"./cli-w0bwte75.js";
11
11
  import"./cli-re8z5p8p.js";
12
- import"./cli-etbrt8x1.js";
13
- import"./cli-976r1zqx.js";
14
- import"./cli-wg8yjqtw.js";
15
- import"./cli-j0tmc908.js";
12
+ import"./cli-0nhdwxd5.js";
13
+ import"./cli-rggdq8wq.js";
14
+ import"./cli-ysnyhws9.js";
15
+ import"./cli-jvj6a0cv.js";
16
16
  import"./cli-epan13p1.js";
17
17
  import"./cli-f14fvzag.js";
18
18
  import"./cli-zt3w1cn1.js";
19
- import"./cli-1wetf34q.js";
20
- import"./cli-2c8eky5y.js";
19
+ import"./cli-f2n17zhp.js";
20
+ import"./cli-feh3dkah.js";
21
21
  import"./cli-3dpj7atn.js";
22
22
  import"./cli-2x0e561b.js";
23
23
  import"./cli-pkke6geq.js";
24
24
  import"./cli-rb9m6rpe.js";
25
25
  import"./cli-mzfth0bp.js";
26
- import"./cli-0a7r5331.js";
27
- import"./cli-v7fqehqd.js";
28
- import"./cli-agjzafns.js";
29
- import"./cli-93rxw9yd.js";
26
+ import"./cli-j2jbr8af.js";
30
27
  import"./cli-fad8m16k.js";
31
28
  import"./cli-bsakbbkm.js";
32
29
  import"./cli-zxg80zs9.js";
33
30
  import"./cli-51tf7ac3.js";
34
31
  import"./cli-ydt3zkwv.js";
35
- import"./cli-4drstbb9.js";
32
+ import"./cli-ecknp7p1.js";
36
33
  import"./cli-q51yprfq.js";
37
34
  import"./cli-3er6gcsn.js";
38
- import"./cli-cvk6yzw5.js";
39
35
  import"./cli-yatxqynm.js";
40
36
  import"./cli-b0f70z24.js";
41
37
  import"./cli-nexwh8zg.js";
@@ -44,16 +40,16 @@ import"./cli-1m2e086m.js";
44
40
  import"./cli-bzr0ftht.js";
45
41
  import"./cli-bd957dgb.js";
46
42
  import"./cli-pzxba7gw.js";
47
- import"./cli-xb7kyanp.js";
48
- import"./cli-1wd1n2ya.js";
49
- import"./cli-0wn3ypqv.js";
50
- import"./cli-v0e7jpr5.js";
43
+ import"./cli-8kgvmkak.js";
44
+ import"./cli-rfphkzh5.js";
45
+ import"./cli-yshaazs1.js";
46
+ import"./cli-xvdgasgy.js";
51
47
  import"./cli-3qhyh31j.js";
52
- import"./cli-vbr859rz.js";
53
- import"./cli-n7h1kqpf.js";
48
+ import"./cli-jhm6hzjn.js";
54
49
  import"./cli-7mm2r1kp.js";
55
50
  import"./cli-g5erf0zt.js";
56
- import"./cli-yj790e19.js";
51
+ import"./cli-dmtrxqhg.js";
52
+ import"./cli-tadfgd0t.js";
57
53
  import"./cli-ywybs5as.js";
58
54
  import"./cli-gd4favx9.js";
59
55
  import"./cli-agamgm0p.js";
@@ -61,13 +57,13 @@ import"./cli-5c2j5yvx.js";
61
57
  import"./cli-1a2j50m0.js";
62
58
  import"./cli-f9w1semm.js";
63
59
  import"./cli-ej6gbxfb.js";
64
- import"./cli-g3qgrzck.js";
60
+ import"./cli-zsh093hk.js";
65
61
  import"./cli-sd0mxa3c.js";
66
62
  import"./cli-w5e1d1vv.js";
67
- import"./cli-1d3w4xm3.js";
68
- import"./cli-xxz89c2n.js";
63
+ import"./cli-4r1sjfc4.js";
64
+ import"./cli-mb75wpxf.js";
69
65
  import"./cli-zf8jjwex.js";
70
- import"./cli-qt5wzq6v.js";
66
+ import"./cli-wt7ccy4r.js";
71
67
  import"./cli-bc05qbss.js";
72
68
  export {
73
69
  calculateNextRun,
@@ -4,39 +4,35 @@ import {
4
4
  runRebootSweep,
5
5
  startHeartbeat,
6
6
  stopHeartbeat
7
- } from "./cli-691f2rxm.js";
8
- import"./cli-a9bw0xxt.js";
9
- import"./cli-003785v9.js";
10
- import"./cli-07s39g1n.js";
7
+ } from "./cli-66zh26sp.js";
8
+ import"./cli-df56tqdw.js";
9
+ import"./cli-xvc3q9br.js";
10
+ import"./cli-mv2520nm.js";
11
11
  import"./cli-w0bwte75.js";
12
12
  import"./cli-re8z5p8p.js";
13
- import"./cli-etbrt8x1.js";
14
- import"./cli-976r1zqx.js";
15
- import"./cli-wg8yjqtw.js";
16
- import"./cli-j0tmc908.js";
13
+ import"./cli-0nhdwxd5.js";
14
+ import"./cli-rggdq8wq.js";
15
+ import"./cli-ysnyhws9.js";
16
+ import"./cli-jvj6a0cv.js";
17
17
  import"./cli-epan13p1.js";
18
18
  import"./cli-f14fvzag.js";
19
19
  import"./cli-zt3w1cn1.js";
20
- import"./cli-1wetf34q.js";
21
- import"./cli-2c8eky5y.js";
20
+ import"./cli-f2n17zhp.js";
21
+ import"./cli-feh3dkah.js";
22
22
  import"./cli-3dpj7atn.js";
23
23
  import"./cli-2x0e561b.js";
24
24
  import"./cli-pkke6geq.js";
25
25
  import"./cli-rb9m6rpe.js";
26
26
  import"./cli-mzfth0bp.js";
27
- import"./cli-0a7r5331.js";
28
- import"./cli-v7fqehqd.js";
29
- import"./cli-agjzafns.js";
30
- import"./cli-93rxw9yd.js";
27
+ import"./cli-j2jbr8af.js";
31
28
  import"./cli-fad8m16k.js";
32
29
  import"./cli-bsakbbkm.js";
33
30
  import"./cli-zxg80zs9.js";
34
31
  import"./cli-51tf7ac3.js";
35
32
  import"./cli-ydt3zkwv.js";
36
- import"./cli-4drstbb9.js";
33
+ import"./cli-ecknp7p1.js";
37
34
  import"./cli-q51yprfq.js";
38
35
  import"./cli-3er6gcsn.js";
39
- import"./cli-cvk6yzw5.js";
40
36
  import"./cli-yatxqynm.js";
41
37
  import"./cli-b0f70z24.js";
42
38
  import"./cli-nexwh8zg.js";
@@ -45,16 +41,16 @@ import"./cli-1m2e086m.js";
45
41
  import"./cli-bzr0ftht.js";
46
42
  import"./cli-bd957dgb.js";
47
43
  import"./cli-pzxba7gw.js";
48
- import"./cli-xb7kyanp.js";
49
- import"./cli-1wd1n2ya.js";
50
- import"./cli-0wn3ypqv.js";
51
- import"./cli-v0e7jpr5.js";
44
+ import"./cli-8kgvmkak.js";
45
+ import"./cli-rfphkzh5.js";
46
+ import"./cli-yshaazs1.js";
47
+ import"./cli-xvdgasgy.js";
52
48
  import"./cli-3qhyh31j.js";
53
- import"./cli-vbr859rz.js";
54
- import"./cli-n7h1kqpf.js";
49
+ import"./cli-jhm6hzjn.js";
55
50
  import"./cli-7mm2r1kp.js";
56
51
  import"./cli-g5erf0zt.js";
57
- import"./cli-yj790e19.js";
52
+ import"./cli-dmtrxqhg.js";
53
+ import"./cli-tadfgd0t.js";
58
54
  import"./cli-ywybs5as.js";
59
55
  import"./cli-gd4favx9.js";
60
56
  import"./cli-agamgm0p.js";
@@ -62,13 +58,13 @@ import"./cli-5c2j5yvx.js";
62
58
  import"./cli-1a2j50m0.js";
63
59
  import"./cli-f9w1semm.js";
64
60
  import"./cli-ej6gbxfb.js";
65
- import"./cli-g3qgrzck.js";
61
+ import"./cli-zsh093hk.js";
66
62
  import"./cli-sd0mxa3c.js";
67
63
  import"./cli-w5e1d1vv.js";
68
- import"./cli-1d3w4xm3.js";
69
- import"./cli-xxz89c2n.js";
64
+ import"./cli-4r1sjfc4.js";
65
+ import"./cli-mb75wpxf.js";
70
66
  import"./cli-zf8jjwex.js";
71
- import"./cli-qt5wzq6v.js";
67
+ import"./cli-wt7ccy4r.js";
72
68
  import"./cli-bc05qbss.js";
73
69
  export {
74
70
  getBootEpochMs,
@@ -3,37 +3,31 @@ import {
3
3
  } from "./cli-ep19k3mb.js";
4
4
  import {
5
5
  agentFsProvisionSeeder
6
- } from "./cli-v5pr2fgt.js";
6
+ } from "./cli-gt8azyet.js";
7
7
  import {
8
8
  extractArgsJsonSchema,
9
9
  extractScriptSignature,
10
- getScript,
11
10
  require_dist,
12
11
  typecheckScript,
13
- upsertScriptByName,
14
12
  validateDefinition,
15
13
  validateScriptImports
16
- } from "./cli-j0tmc908.js";
14
+ } from "./cli-jvj6a0cv.js";
17
15
  import"./cli-epan13p1.js";
18
16
  import"./cli-f14fvzag.js";
19
17
  import"./cli-zt3w1cn1.js";
20
- import"./cli-1wetf34q.js";
21
- import"./cli-2c8eky5y.js";
18
+ import"./cli-f2n17zhp.js";
19
+ import"./cli-feh3dkah.js";
22
20
  import"./cli-3dpj7atn.js";
23
21
  import"./cli-2x0e561b.js";
24
22
  import"./cli-pkke6geq.js";
25
23
  import"./cli-rb9m6rpe.js";
26
- import"./cli-0a7r5331.js";
27
- import"./cli-v7fqehqd.js";
28
- import"./cli-agjzafns.js";
29
- import"./cli-93rxw9yd.js";
24
+ import"./cli-j2jbr8af.js";
30
25
  import"./cli-bsakbbkm.js";
31
26
  import"./cli-zxg80zs9.js";
32
27
  import"./cli-ydt3zkwv.js";
33
- import"./cli-4drstbb9.js";
28
+ import"./cli-ecknp7p1.js";
34
29
  import"./cli-q51yprfq.js";
35
30
  import"./cli-3er6gcsn.js";
36
- import"./cli-cvk6yzw5.js";
37
31
  import"./cli-yatxqynm.js";
38
32
  import"./cli-b0f70z24.js";
39
33
  import"./cli-nexwh8zg.js";
@@ -50,22 +44,25 @@ import {
50
44
  deleteSkillFile,
51
45
  getDbClient,
52
46
  getScheduledTaskByName,
47
+ getScript,
53
48
  getSkillByName,
54
49
  getSkillFiles,
55
50
  init_db,
51
+ init_db1 as init_db2,
56
52
  listWorkflows,
57
53
  updateScheduledTask,
58
54
  updateSkill,
59
55
  updateWorkflow,
56
+ upsertScriptByName,
60
57
  upsertSkillFiles
61
- } from "./cli-0wn3ypqv.js";
62
- import"./cli-v0e7jpr5.js";
58
+ } from "./cli-yshaazs1.js";
59
+ import"./cli-xvdgasgy.js";
63
60
  import"./cli-3qhyh31j.js";
64
- import"./cli-vbr859rz.js";
65
- import"./cli-n7h1kqpf.js";
61
+ import"./cli-jhm6hzjn.js";
66
62
  import"./cli-7mm2r1kp.js";
67
63
  import"./cli-g5erf0zt.js";
68
- import"./cli-yj790e19.js";
64
+ import"./cli-dmtrxqhg.js";
65
+ import"./cli-tadfgd0t.js";
69
66
  import"./cli-ywybs5as.js";
70
67
  import"./cli-gd4favx9.js";
71
68
  import"./cli-agamgm0p.js";
@@ -73,17 +70,18 @@ import"./cli-5c2j5yvx.js";
73
70
  import"./cli-1a2j50m0.js";
74
71
  import"./cli-f9w1semm.js";
75
72
  import"./cli-ej6gbxfb.js";
76
- import"./cli-g3qgrzck.js";
73
+ import"./cli-zsh093hk.js";
77
74
  import"./cli-sd0mxa3c.js";
78
75
  import"./cli-w5e1d1vv.js";
79
- import"./cli-1d3w4xm3.js";
76
+ import"./cli-4r1sjfc4.js";
80
77
  import"./cli-zf8jjwex.js";
81
- import"./cli-qt5wzq6v.js";
78
+ import"./cli-wt7ccy4r.js";
82
79
  import {
83
80
  __toESM
84
81
  } from "./cli-bc05qbss.js";
85
82
 
86
83
  // src/be/seed-scripts/index.ts
84
+ init_db2();
87
85
  init_db();
88
86
 
89
87
  // src/be/seed-scripts/catalog/app-sync-run.ts
@@ -5721,7 +5719,7 @@ import { join } from "node:path";
5721
5719
  // templates/skills/agent-browser/config.json
5722
5720
  var config_default = `{
5723
5721
  "category": "skills",
5724
- "description": "Drive a real browser with the agent-browser CLI (headless Chromium over CDP). Use for any browser task: verifying a UI change, taking a screenshot, walking a web page, filling a form, extracting page text, reproducing a frontend bug, or attaching UI evidence to a PR, issue, Linear comment, or Slack thread. Starts with a \`command -v agent-browser\` check and falls back to manual QA on the slim worker image. Screenshots are shared through agent-fs signed URLs. This is the only browser automation tool; do not use qa-use.",
5722
+ "description": "Drive a real browser with the agent-browser CLI (headless Chromium over CDP). Use for any browser task: verifying a UI change, taking a screenshot, walking a web page, filling a form, extracting page text, reproducing a frontend bug, or attaching UI evidence to a PR, issue, Linear comment, or Slack thread. Starts with a \`command -v agent-browser\` check and falls back to manual QA on the slim worker image. Screenshots are kept on agent-fs and embedded in GitHub as user attachments. This is the only browser automation tool; do not use qa-use.",
5725
5723
  "displayName": "Agent Browser",
5726
5724
  "kind": "skill",
5727
5725
  "name": "agent-browser",
@@ -5736,7 +5734,7 @@ var config_default = `{
5736
5734
  `;
5737
5735
 
5738
5736
  // templates/skills/agent-browser/content.md
5739
- var content_default = '# agent-browser\n\n`agent-browser` (vercel-labs) is the swarm\'s browser-automation CLI. It drives a headless Chromium over CDP and returns accessibility-tree snapshots with compact `@eN` refs. Use it for any browser task: verify a UI change, take a screenshot, walk a page, fill a form, extract page text, reproduce a frontend bug, or attach UI evidence to a PR, issue, Linear comment, or Slack thread.\n\nDo not use `qa-use`. It is not installed in the worker image any more.\n\n## Step 0: check that the CLI is present\n\nThe full worker image (`agent-swarm-worker:latest`) ships `agent-browser` and a headless Chromium. The slim image (`:slim`) has neither. The first command of any browser work is:\n\n```bash\ncommand -v agent-browser\n```\n\nIf it prints nothing, you are on the slim image. Say so in your progress report ("agent-browser is not available on this worker image") and fall back to manual QA: write the exact steps a human should run and mark the browser test cases as **Blocked**, not failed. Do not install a browser or the CLI yourself.\n\n## Step 1: load the version-matched guide\n\nThe CLI bundles its own usage guide. Load it once per task before the first browser command. Do not guess flags from memory.\n\n```bash\nagent-browser skills get core # overview + common patterns\nagent-browser skills get core --full # adds the full command reference\nagent-browser skills list # specialized guides (dogfood, electron, slack, ...)\n```\n\n## Step 2: the core loop\n\n```bash\nagent-browser open <url>\nagent-browser snapshot -i # accessibility tree, interactive elements only, @eN refs\nagent-browser click @e12 # act on refs from the snapshot\nagent-browser fill @e7 "text"\nagent-browser screenshot /tmp/<name>.png\nagent-browser close\n```\n\n- Re-run `snapshot` after every navigation or state change. Refs are only valid for the snapshot that produced them.\n- Run one browser session at a time. Call `store-progress` between page batches so the heartbeat watchdog sees you.\n- The browser is headless. Local servers inside the worker container are reachable at `http://localhost:<port>`.\n- The image launches Chromium with `--no-sandbox,--disable-dev-shm-usage` through `AGENT_BROWSER_ARGS`. If you pass your own `--args`, include `--no-sandbox` again or Chrome will not start.\n\n## Recording\n\nDefault: record with `--cursor`, drive every supported pointer action (`click`, `mouse move`, `drag`) with `--human`, and ship the **1.5x video**. Keep the 1x original only if a reviewer asks for it. Human pointer movement follows an eased curve; use `--seed <n>` on `mouse move` to make the take reproducible instead of using a bare move.\n\nOpen the page first, then record the interaction:\n\n```bash\nagent-browser record start ./in.mp4 --cursor\nagent-browser snapshot -i\nagent-browser mouse move 600 400 --human --seed 42 --duration 1400\nagent-browser click @e3 --human # use a ref from the current snapshot\n# Perform the remaining QA steps; use --human for drag actions too.\nagent-browser record stop\nffmpeg -y -i in.mp4 -filter:v "setpts=PTS/1.5,fps=30" -an \\\n -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p out-1.5x.mp4\n```\n\nSpeed-up is a post-process step: `record start` has no speed or human flag. Keep `fps=30` to preserve a steady 30 fps output rather than uneven frame drops at an inferred rate. `-an` disables audio because agent-browser recordings carry no audio track. The worker ships only `ffmpeg`, not `ffprobe`; inspect duration with `ffmpeg -i out-1.5x.mp4 2>&1 | grep Duration`.\n\nAdd `--contact-sheet` to the start command for a timestamped PNG summary of visual changes. Recording needs `ffmpeg` on PATH; check `agent-browser doctor` before starting. Stop the recording before closing the browser so the video is saved. Upload the 1.5x file through the same agent-fs QA path as screenshots below, and link it in the PR body.\n\n## Step 3: share the screenshot through agent-fs\n\nScreenshots on the worker disk disappear with the task. Upload them to agent-fs under the qa path convention. Use `share-create` when a person needs to open the file, and `signed-url` for raw embeds such as an image in GitHub PR markdown. `--file` is binary-safe. `--content` is text-only and mangles PNGs.\n\n```bash\nagent-fs write thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png \\\n --file /tmp/<name>.png -m "<what it shows>"\nagent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # confirm size > 0\nagent-fs share-create thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json\nagent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # raw URL for embeds; 24h default, --expires-in up to 7d\n```\n\n- Embed the signed URL as `![caption](<url>)` in the PR body, review comment, Linear comment, or Slack message.\n- In `store-progress`, list the upload in the `attachments` field with `kind: "agent-fs"` and the path, and paste the `share-create` link for people who need to open the file.\n- If `agent-fs auth whoami` fails, report the local path, say the upload was skipped, and continue.\n\nThe `artifacts` skill holds the full agent-fs recipe and the naming conventions.\n\n## Gotchas\n\n- `wait <selector>` waits for a VISIBLE match. When the first match is hidden it times out (about 25 s) even though the element exists. Wait on rendered text instead: `wait --text "<rendered text>"`.\n- Never run `pkill -f <pattern>` inside a Bash call: the pattern also matches the calling shell\'s command line and kills it. Record the PID when you start a background server (`echo $!`) and `kill <pid>`.\n';
5737
+ var content_default = '# agent-browser\n\n`agent-browser` (vercel-labs) is the swarm\'s browser-automation CLI. It drives a headless Chromium over CDP and returns accessibility-tree snapshots with compact `@eN` refs. Use it for any browser task: verify a UI change, take a screenshot, walk a page, fill a form, extract page text, reproduce a frontend bug, or attach UI evidence to a PR, issue, Linear comment, or Slack thread.\n\nDo not use `qa-use`. It is not installed in the worker image any more.\n\n## Step 0: check that the CLI is present\n\nThe full worker image (`agent-swarm-worker:latest`) ships `agent-browser` and a headless Chromium. The slim image (`:slim`) has neither. The first command of any browser work is:\n\n```bash\ncommand -v agent-browser\n```\n\nIf it prints nothing, you are on the slim image. Say so in your progress report ("agent-browser is not available on this worker image") and fall back to manual QA: write the exact steps a human should run and mark the browser test cases as **Blocked**, not failed. Do not install a browser or the CLI yourself.\n\n## Step 1: load the version-matched guide\n\nThe CLI bundles its own usage guide. Load it once per task before the first browser command. Do not guess flags from memory.\n\n```bash\nagent-browser skills get core # overview + common patterns\nagent-browser skills get core --full # adds the full command reference\nagent-browser skills list # specialized guides (dogfood, electron, slack, ...)\n```\n\n## Step 2: the core loop\n\n```bash\nagent-browser open <url>\nagent-browser snapshot -i # accessibility tree, interactive elements only, @eN refs\nagent-browser click @e12 # act on refs from the snapshot\nagent-browser fill @e7 "text"\nagent-browser screenshot /tmp/<name>.png\nagent-browser close\n```\n\n- Re-run `snapshot` after every navigation or state change. Refs are only valid for the snapshot that produced them.\n- Run one browser session at a time. Call `store-progress` between page batches so the heartbeat watchdog sees you.\n- The browser is headless. Local servers inside the worker container are reachable at `http://localhost:<port>`.\n- The image launches Chromium with `--no-sandbox,--disable-dev-shm-usage` through `AGENT_BROWSER_ARGS`. If you pass your own `--args`, include `--no-sandbox` again or Chrome will not start.\n\n## Recording\n\nDefault: record with `--cursor`, drive every supported pointer action (`click`, `mouse move`, `drag`) with `--human`, and ship the **1.5x video**. Keep the 1x original only if a reviewer asks for it. Human pointer movement follows an eased curve; use `--seed <n>` on `mouse move` to make the take reproducible instead of using a bare move.\n\nOpen the page first, then record the interaction:\n\n```bash\nagent-browser record start ./in.mp4 --cursor\nagent-browser snapshot -i\nagent-browser mouse move 600 400 --human --seed 42 --duration 1400\nagent-browser click @e3 --human # use a ref from the current snapshot\n# Perform the remaining QA steps; use --human for drag actions too.\nagent-browser record stop\nffmpeg -y -i in.mp4 -filter:v "setpts=PTS/1.5,fps=30" -an \\\n -c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p out-1.5x.mp4\n```\n\nSpeed-up is a post-process step: `record start` has no speed or human flag. Keep `fps=30` to preserve a steady 30 fps output rather than uneven frame drops at an inferred rate. `-an` disables audio because agent-browser recordings carry no audio track. The worker ships only `ffmpeg`, not `ffprobe`; inspect duration with `ffmpeg -i out-1.5x.mp4 2>&1 | grep Duration`.\n\nAdd `--contact-sheet` to the start command for a timestamped PNG summary of visual changes. Recording needs `ffmpeg` on PATH; check `agent-browser doctor` before starting. Stop the recording before closing the browser so the video is saved. Keep the 1.5x file on the same agent-fs QA path as screenshots below. In a PR, upload it as a GitHub user attachment and put the URL on its own line, so GitHub plays it inline.\n\n## Step 3: share the screenshot through agent-fs\n\nScreenshots on the worker disk disappear with the task. Upload them to agent-fs under the qa path convention: that copy is the durable original. Use `share-create` when a person needs to open the file. `--file` is binary-safe. `--content` is text-only and mangles PNGs.\n\n```bash\nagent-fs write thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png \\\n --file /tmp/<name>.png -m "<what it shows>"\nagent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json # confirm size > 0\nagent-fs share-create thoughts/<agent-id>/qa/<topic>-screenshots/<name>.png --json\n```\n\n- **GitHub PR body or comment**: upload the PNG, GIF or mp4 as a GitHub user attachment with the `github-attach` skill and embed `![caption](https://github.com/user-attachments/assets/<uuid>)`. Attachments never expire and mp4s play inline. A UI PR puts a before (main) and after pair in the `## Before / after` table. Fallback for images only, when the GitHub token is an App token (`ghu_`/`ghs_`): `agent-fs signed-url <path> --inline --json` (expires in 7 days). Never a presigned URL for an mp4 or a doc: it downloads.\n- **Linear comment or Slack message**: paste the `share-create` link.\n- In `store-progress`, list the upload in the `attachments` field with `kind: "agent-fs"` and the path, and paste the `share-create` link for people who need to open the file.\n- If `agent-fs auth whoami` fails, report the local path, say the upload was skipped, and continue.\n\nThe `artifacts` skill holds the full agent-fs recipe and the naming conventions.\n\n## Gotchas\n\n- `wait <selector>` waits for a VISIBLE match. When the first match is hidden it times out (about 25 s) even though the element exists. Wait on rendered text instead: `wait --text "<rendered text>"`.\n- Never run `pkill -f <pattern>` inside a Bash call: the pattern also matches the calling shell\'s command line and kills it. Record the PID when you start a background server (`echo $!`) and `kill <pid>`.\n';
5740
5738
 
5741
5739
  // templates/skills/apps/config.json
5742
5740
  var config_default2 = `{
@@ -5877,12 +5875,19 @@ agent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/login.png --json | jq '
5877
5875
  \`\`\`
5878
5876
 
5879
5877
  Capture with \`agent-browser screenshot <path>\` when it is installed, otherwise
5880
- Playwright, ffmpeg, or a system screenshot tool. For an image that must render
5881
- inside a PR body or a Slack message without a login, use a presigned URL
5882
- instead of the viewer link:
5878
+ Playwright, ffmpeg, or a system screenshot tool. The agent-fs copy is the
5879
+ durable original. Where each kind of content goes:
5880
+
5881
+ | Content | Use | Why |
5882
+ |---|---|---|
5883
+ | Image or GIF in GitHub | GitHub user attachment (\`github-attach\` skill) | Permanent, renders inline, short URL |
5884
+ | Video (mp4) in GitHub | GitHub user attachment, else an \`agent-fs share-create\` link | GitHub plays it inline. A presigned link downloads it |
5885
+ | Doc (plan, research, report) | \`agent-fs share-create <path> --expires-in 604800\` | Preview page, no download |
5886
+ | Durable pointer | \`live.agent-fs.dev\` path, in a PR only under \`## Swarm provenance\` | Share links die after 7 days, this one does not (needs login) |
5887
+ | Presigned \`signed-url\` | Image fallback only, with \`--inline\` | Downloads and expires after 7 days. Never for docs or mp4s |
5883
5888
 
5884
5889
  \`\`\`bash
5885
- agent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/login.png --json # 24h default, --expires-in up to 7d
5890
+ agent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/login.png --inline --json # fallback only; 24h default, --expires-in up to 7d
5886
5891
  \`\`\`
5887
5892
 
5888
5893
  ## Naming conventions
@@ -5898,9 +5903,12 @@ misc/<agent-id>/<task-id>-<description>.ext
5898
5903
 
5899
5904
  ## Attaching artifacts
5900
5905
 
5901
- - **PR body** — embed \`![caption](<resolved-share-url>)\` after resolving and
5902
- printing the concrete URL as shown above.
5903
- - **Slack** — link the agent-fs URL (team members only, the live viewer needs a login). Use a signed URL (\`agent-fs signed-url\`, up to 7 days) for anyone else.
5906
+ - **PR body** — embed images and mp4s as GitHub user attachments
5907
+ (\`![caption](https://github.com/user-attachments/assets/<uuid>)\`), and link docs
5908
+ with \`share-create\`. Never embed a \`share-create\` link as an image: it is an
5909
+ HTML preview page. Swarm task links and durable agent-fs paths go only under
5910
+ \`## Swarm provenance\`.
5911
+ - **Slack** — link the agent-fs URL (team members only, the live viewer needs a login). Use a \`share-create\` link (up to 7 days) for anyone else.
5904
5912
  - **\`store-progress\`** — use the \`attachments\` field with \`kind: "agent-fs"\` and the path.
5905
5913
  - **Linear comments** — paste the live URL in the comment body.
5906
5914
 
@@ -9129,7 +9137,9 @@ with a custom \`swarm.call\` action handler. Action shape:
9129
9137
  \`swarm.call\` dispatches through the SPA's bearer (for \`app_url\` loads) or
9130
9138
  the page-session cookie (for direct \`api_url\` loads). The endpoint must be
9131
9139
  a valid swarm API path. User-token sessions retain user authorization.
9132
- Operator and password sessions retain deployment-level API access.
9140
+ Operator-launched sessions retain deployment-level API access. Password
9141
+ sessions are guests: they reach only their own page record and KV, so
9142
+ \`swarm.call\` to any other endpoint returns 403.
9133
9143
 
9134
9144
  See the \`@json-render/core\` docs for the supported node types (\`text\`,
9135
9145
  \`button\`, \`input\`, \`card\`, etc.).
@@ -9137,8 +9147,9 @@ See the \`@json-render/core\` docs for the supported node types (\`text\`,
9137
9147
  ## Security & Blast Radius
9138
9148
 
9139
9149
  - User-token launches retain the signed viewer identity and its API permissions.
9140
- - Operator and password sessions are guests with deployment-level API access.
9141
- They do not inherit the page author's agent identity. Review actions before sharing these pages.
9150
+ - Operator launches keep deployment-level API access. They do not inherit the page author's agent identity.
9151
+ - Password sessions are guests. Through the proxy they reach only \`GET pages/<own id>\` (without
9152
+ \`passwordHash\`) and the page's own KV. Every other route returns 403, and every RBAC verb denies a guest.
9142
9153
  - Browser SDK memory operations use the page owner's agent scope through verified page execution context.
9143
9154
  Viewer authentication, permissions, and audit identity remain separate from this resource scope.
9144
9155
  - Treat agent-generated HTML / JSON like trusted code — the agent already
@@ -9148,7 +9159,8 @@ See the \`@json-render/core\` docs for the supported node types (\`text\`,
9148
9159
  - HTML pages render inside a sandboxed iframe with
9149
9160
  \`sandbox="allow-scripts allow-forms allow-same-origin"\`. This limits
9150
9161
  some attack surface (no top-level navigation, no pointer-lock) but the
9151
- page still has full access to the SwarmSDK if cookies are present.
9162
+ page still has the SwarmSDK access of its session: full for user and
9163
+ operator sessions, page record and KV only for password guests.
9152
9164
  - All page bodies pass through \`scrubSecrets\` at the egress boundary
9153
9165
  (\`/p/:id\`, \`/p/:id.json\`, listing endpoint) — accidental secrets in
9154
9166
  the body get masked at serve time, not at write time. Don't rely on
@@ -9702,7 +9714,7 @@ Write all test cases into the QA document's \`## Test Cases\` section.
9702
9714
  2. \`agent-browser snapshot -i\` to read the page state and its \`@eN\` refs
9703
9715
  3. Act on refs (\`click @eN\`, \`fill @eN "text"\`, \`type\`, \`press\`) and re-snapshot after every navigation or state change; refs are only valid for the snapshot that produced them
9704
9716
  4. \`agent-browser screenshot /tmp/<name>.png\` for evidence, then \`agent-browser close\`
9705
- 5. To share a screenshot outside the machine, upload it to agent-fs with \`agent-fs write <path> --file /tmp/<name>.png -m "<what it shows>"\` (binary-safe; \`--content\` mangles PNGs), then \`agent-fs signed-url <path> --json\` and embed the URL as \`![caption](<url>)\`. If agent-fs is not configured, report the local path and say the upload was skipped
9717
+ 5. To share a screenshot outside the machine, upload it to agent-fs with \`agent-fs write <path> --file /tmp/<name>.png -m "<what it shows>"\` (binary-safe; \`--content\` mangles PNGs), keep it there as the original, and embed it in a PR or GitHub comment as a GitHub user attachment (\`github-attach\` skill): \`![caption](https://github.com/user-attachments/assets/<uuid>)\`. Use \`agent-fs share-create <path>\` for Slack or Linear. If agent-fs is not configured, report the local path and say the upload was skipped
9706
9718
 
9707
9719
  **For manual testing**:
9708
9720
  1. Present each test case's steps to the user
@@ -9725,7 +9737,7 @@ For each test case, record the actual result and pass/fail status.
9725
9737
  ### Step 4: Capture Evidence
9726
9738
 
9727
9739
  Gather evidence for the QA report:
9728
- - **Screenshots**: Via \`agent-browser screenshot\` (uploaded to agent-fs with a signed URL when they must be shared) or user-provided
9740
+ - **Screenshots**: Via \`agent-browser screenshot\` (kept on agent-fs; GitHub user attachments in a PR, \`share-create\` links elsewhere) or user-provided
9729
9741
  - **Videos**: Session recording URLs (Loom, etc.)
9730
9742
  - **Logs**: Console output, error messages, relevant log lines
9731
9743
  - **External links**: Sentry issues, CI/CD runs, Grafana dashboards, PR URLs
@@ -11975,8 +11987,8 @@ Use these shapes as a starting point, then confirm them against the current exec
11975
11987
 
11976
11988
  **Before you add the first \`system-one-decision\` node to a workflow, confirm its key works.** A node with no working key fails its whole run, and a save only warns. Do these in order and stop at the first failure:
11977
11989
 
11978
- 1. Pick the provider. \`typesafe\` (the default) needs the global secret \`TYPESAFE_API_KEY\`. \`openrouter\` needs \`OPENROUTER_API_KEY\`. \`laya\` needs the global secret \`LAYA_API_KEY\` and the global config \`LAYA_URL\`, the base URL of its server. Use the provider the requester named. If they named none, use \`typesafe\`. If its key is missing but another provider's key exists, ask which to use rather than switching, because the accounts bill separately.
11979
- 2. Check the key is set: \`get-config\` with \`key\` set to that name and no \`includeSecrets\`. A masked value (\`********\`) means a value exists. No entry means it is missing. Never pass \`includeSecrets\`, and never read the value. For \`laya\`, check \`LAYA_URL\` the same way; it is not secret, so its value shows.
11990
+ 1. Pick the provider. \`typesafe\` (the default) needs the global secret \`TYPESAFE_API_KEY\`. \`openrouter\` needs \`OPENROUTER_API_KEY\`. \`laya\` needs the global secret \`LAYA_API_KEY\` and the global config \`LAYA_URL\`, the base URL of its server. \`openai\` needs \`OPENAI_DECISIONS_API_KEY\` (never \`OPENAI_API_KEY\`). \`cloudflare\` needs the global secret \`CLOUDFLARE_API_TOKEN\` and the global config \`CLOUDFLARE_ACCOUNT_ID\`. Use the provider the requester named. If they named none, use \`typesafe\`. If its key is missing but another provider's key exists, ask which to use rather than switching, because the accounts bill separately.
11991
+ 2. Check the key is set: \`get-config\` with \`key\` set to that name and no \`includeSecrets\`. A masked value (\`********\`) means a value exists. No entry means it is missing. Never pass \`includeSecrets\`, and never read the value. For \`laya\`, check \`LAYA_URL\` the same way, and for \`cloudflare\`, \`CLOUDFLARE_ACCOUNT_ID\`; neither is secret, so the value shows.
11980
11992
  3. Confirm it works with one cheap call. Create a throwaway one-node workflow, trigger it, read the run, then \`delete-workflow\` it:
11981
11993
 
11982
11994
  \`\`\`json
@@ -12029,7 +12041,7 @@ Afterwards, a \`warnings\` entry on \`create-workflow\` or a patch tool means th
12029
12041
  }
12030
12042
  \`\`\`
12031
12043
 
12032
- - \`provider\` is \`typesafe\` (default), \`openrouter\`, or \`laya\`, and must be a literal, not a \`{{token}}\`. \`model\` is that provider's own id (\`jev-1.13.0\` on \`typesafe\`, \`typesafe/jev-1.13\` on \`openrouter\`, a checkpoint name such as \`multilingual\` on \`laya\`); leave it unset for the provider's default. \`laya\` has no default and sends no \`model\`, because it silently ignores one it does not know: leave it unset unless you mean a specific checkpoint. All three take the same request and return the same answers. There is no fallback between them. Never use OpenRouter's \`typesafe/jev-router\`, which is a chat router that hands the request to another model.
12044
+ - \`provider\` is \`typesafe\` (default), \`openrouter\`, \`laya\`, \`openai\`, or \`cloudflare\`, and must be a literal, not a \`{{token}}\`. \`model\` is that provider's own id (\`jev-1.13.0\` on \`typesafe\`, \`typesafe/jev-1.13\` on \`openrouter\`, a checkpoint name such as \`multilingual\` on \`laya\`); \`gpt-6-luna\` on \`openai\`, \`clef\` (default) or \`clef-flash\` on \`cloudflare\`, which accepts no other id; leave it unset for the provider's default. \`laya\` has no default and sends no \`model\`, because it silently ignores one it does not know: leave it unset unless you mean a specific checkpoint. Every provider returns the same output; \`openai\` gets a translated request, and an OpenAI refusal of any question fails the step. \`cloudflare\` takes at most 64 questions. There is no fallback between them. Never use OpenRouter's \`typesafe/jev-router\`, which is a chat router that hands the request to another model.
12033
12045
  - \`state\` is required: text, a string array, or a JSON object. An exact \`{{token}}\` keeps the upstream JSON type. Every question in one call shares the state and cannot see the other answers, so a dependent judgment needs its own node.
12034
12046
  - Each question is \`noul\` (probability that a claim is true; optional \`criteria: { true, false }\`), \`choice\` (2 to 255 options; \`criteria: { option: description }\`), or \`score\` (2 to 10 ordered levels; \`criteria: [level, ...]\`).
12035
12047
  - \`returns\` repeats every question id and its type. A mismatch is rejected when the workflow is saved.
@@ -12038,7 +12050,7 @@ Afterwards, a \`warnings\` entry on \`create-workflow\` or a patch tool means th
12038
12050
  - \`humanReview: { band: { min, max }, approvers, title?, timeout?, notifications? }\` sends an answer to a person when \`min <= confidence <= max\` (0 to 1, both ends inside). It raises a \`human-in-the-loop\` approval (same approvers, timeout, notifications, \`waiting\` run state), so use the same \`approvers\` shape. \`choice\` and \`score\` are tested on their \`confidence\` (on \`laya\` that is its \`answer_confidence\`, the top probability); a \`noul\` on \`max(noul, 1 - noul)\`. Any answer in the band makes the run wait. \`next\` must then be a port map: \`approved\` (required, every accepted answer), and optionally \`rejected\` and \`timeout\`; a string or list \`next\` is refused. The output stays \`{ model, answers, usage }\` on every path, plus \`review\` (\`status\`, and per question \`confidence\`, \`inBand\`, \`decidedBy\`). A person's answer replaces the model's in \`answers\`; \`probabilities\` and \`confidence\` stay the model's.
12039
12051
  - On \`laya\`, ask \`choice\` questions, not \`noul\`, until a \`noul\` question is checked against known inputs. On laya-server 0.1.0 a \`noul\` sentiment question returned close to 0 even for clearly positive text, while the same judgment as a \`choice\` answered correctly. This is how the model answered, not a node rule. After a run, read \`<node-id>.routing.model\` to see which laya checkpoint answered. A complete laya workflow (manual trigger with \`{"text": "..."}\`, one \`choice\` question, a review band, and a \`property-match\` branch on \`<node-id>.answers.<question>.choice\`) is in \`docs-site/content/docs/(documentation)/concepts/workflows.mdx\`, section "Example: a laya decision end to end".
12040
12052
  - Do not set \`retry\` or \`validation.retry\` on a \`system-one-decision\` node. It retries connection errors, 408, 429, and 5xx itself (\`config.maxRetries\`, 0 to 3, default 2) inside \`config.timeoutMs\` (default 30000). A 401, a 422, or an answer that fails validation ends after one attempt.
12041
- - The node reads its provider's key (\`TYPESAFE_API_KEY\`, \`OPENROUTER_API_KEY\`, or \`LAYA_API_KEY\`, and for \`laya\` the server URL \`LAYA_URL\`) server-side. The key never appears in the definition, the step output, or an error. A run whose key or \`LAYA_URL\` is missing fails before any node executes, and a 401 or 403 fails the step as \`<KEY> was rejected\`. An unresolved \`{{token}}\` fails the step before any request.
12053
+ - The node reads its provider's key (\`TYPESAFE_API_KEY\`, \`OPENROUTER_API_KEY\`, \`LAYA_API_KEY\`, \`OPENAI_DECISIONS_API_KEY\`, or \`CLOUDFLARE_API_TOKEN\`, plus \`LAYA_URL\` for \`laya\` and \`CLOUDFLARE_ACCOUNT_ID\` for \`cloudflare\`) server-side. The key never appears in the definition, the step output, or an error. A run whose key or \`LAYA_URL\` is missing fails before any node executes, and a 401 or 403 fails the step as \`<KEY> was rejected\`. An unresolved \`{{token}}\` fails the step before any request.
12042
12054
 
12043
12055
  ### \`swarm-script\`
12044
12056
 
@@ -12278,7 +12290,7 @@ For complete command documentation with all flags and options, see [COMMANDS.md]
12278
12290
  `;
12279
12291
 
12280
12292
  // src/be/seed-skills/index.ts
12281
- init_db();
12293
+ init_db2();
12282
12294
  // src/be/seed-skills/bundled-files.generated.json
12283
12295
  var bundled_files_generated_default = {
12284
12296
  artifacts: [
@@ -15081,7 +15093,7 @@ var skillsSeeder = {
15081
15093
  };
15082
15094
 
15083
15095
  // src/be/seed/state-db.ts
15084
- init_db();
15096
+ init_db2();
15085
15097
  async function getSeedState(kind, key) {
15086
15098
  return getDbClient().get("SELECT kind, key, seededHash, seededAt FROM seed_state WHERE kind = ? AND key = ?", [kind, key]);
15087
15099
  }
@@ -16476,7 +16488,7 @@ var config_default63 = `{
16476
16488
  var content_default63 = '# Weekly Harness Upgrade Check\n\nThis is a topology-preserving, anonymized port of the live Sunday schedule. It keeps its bundle, deduplication, baseline, partial-fallback, and CI acceptance behavior.\n\n```json\n{"cron":"0 16 * * 0","timezone":"UTC","agentRole":"lead","enabled":true}\n```\n\n**Weekly Harness Upgrade — self-hosted repository Dockerfile.worker**\n\nRepo: `{{REPO_URL}}` (working dir: `/workspace/repo`)\nFile: `Dockerfile.worker`\n\nThe worker image pins these harnesses via `ARG`. Each week, check upstream for new versions and open ONE PR bundling ALL outdated harness bumps together ({{PR_REVIEWER}}\'s preference — bump ALL in one PR per run, do NOT stagger one-per-run).\n\n| ARG | Source | Sync requirement |\n|---|---|---|\n| `CLAUDE_CODE_VERSION` | npm `@anthropic-ai/claude-code` | none |\n| `PI_CODING_AGENT_VERSION` | npm `@earendil-works/pi-coding-agent` | MUST match `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` in `package.json` (family-pin, all same version) — bump all together |\n| `CODEX_VERSION` | npm `@openai/codex` | MUST match direct `@openai/codex` in `package.json` (enforced by `scripts/check-codex-default-model.sh`) |\n| `OPENCODE_VERSION` | https://opencode.ai (latest release) | MUST match `OPENCODE_SDK_VERSION` |\n| `OPENCODE_SDK_VERSION` | npm `@opencode-ai/sdk` | MUST match `OPENCODE_VERSION` — bump both together |\n\n## Steps\n\n1. `cd /workspace/repo && git fetch origin && git checkout main && git pull --ff-only`\n2. Read current pinned versions from `Dockerfile.worker` (the `ARG` lines) and from `package.json` (for the pi family + `@openai/codex` + `@opencode-ai/sdk`).\n3. For each harness, fetch the latest version:\n - npm claude-code: `npm view @anthropic-ai/claude-code version`\n - npm pi: `npm view @earendil-works/pi-coding-agent version` (use the SAME version for `@earendil-works/pi-agent-core` and `@earendil-works/pi-ai` — they\'re a family pin)\n - npm codex: `npm view @openai/codex version`\n - npm opencode-sdk: `npm view @opencode-ai/sdk version`\n - opencode: `curl -fsSL https://api.github.com/repos/sst/opencode/releases/latest | jq -r .tag_name`\n4. Check for an existing open bundled PR — `gh pr list --search "harness upgrade in:title" --state open --repo {{REPO_URL}}`. Look at the branch prefix `harness-upgrade/`. If one is already open AND was created within the last 48h (sibling schedule may have just opened it), skip and complete with `"Skipped: sibling harness upgrade PR already open"` + the existing PR URL.\n5. Collect ALL outdated harnesses. If none are outdated, complete with output `"All harnesses up to date as of YYYY-MM-DD"` (no PR).\n6. Branch: `harness-upgrade/weekly-YYYY-MM-DD` (e.g. `harness-upgrade/weekly-2026-06-03`).\n7. Edit `Dockerfile.worker` — bump every outdated ARG. Also update `package.json`:\n - Codex: bump direct `@openai/codex` to match `CODEX_VERSION`.\n - Pi family: bump `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` to the same new version as `PI_CODING_AGENT_VERSION`.\n - Opencode: bump `OPENCODE_SDK_VERSION` and `@opencode-ai/sdk` to match `OPENCODE_VERSION`.\n Then re-run `bun install` so `bun.lock` updates.\n8. Local verification (all must pass before pushing):\n ```bash\n bun install --frozen-lockfile\n bun run lint\n bun run tsc:check\n bun test\n bash scripts/check-db-boundary.sh\n ```\n For Codex bumps: also run `bash scripts/check-codex-default-model.sh`.\n Note: do NOT run `docker build -f Dockerfile.worker .` locally — the runner lacks docker. CI\'s `docker-worker-build` job is the acceptance gate.\n9. If any local check fails, apply the **partial-bundle fallback** before giving up — one harness must never block the others:\n **BASELINE FIRST — do this before ANY isolation work.** A red gate does NOT mean the bumps broke anything. Re-run the EXACT failing command on a pristine `origin/main` worktree with zero bumps applied (`git worktree add /tmp/hb-baseline origin/main && cd /tmp/hb-baseline && bun install --frozen-lockfile`) and compare. If the SAME checks fail with the SAME assertions and the same pass/skip/fail totals, the failure is **PRE-EXISTING and unrelated to the bumps** ⇒ it does NOT block this PR, and you must NOT attempt isolation for it. Proceed to step 10, open the PR, and add a `## Pre-existing failures (also fail on origin/main)` section quoting the verbatim error plus both totals (baseline vs branch) so the reviewer can see they match. Only a failure that is RED on your branch and GREEN on baseline was caused by a bump — apply a–d below to that failure ONLY. A gate that is red on origin/main is never a reason to skip the weekly bump.\n a. Isolate which harness\'s bump caused it. The error usually names the package; if not, revert bumps one at a time until the step-8 gate passes.\n b. Revert ONLY that harness — its `Dockerfile.worker` ARG **and** its `package.json` pins (respect the family/sync requirements in the table above) — then re-run `bun install` and the FULL step-8 gate.\n c. Gate green ⇒ open the PR with the remaining harnesses and add a `## Held back` section naming the excluded harness, current → attempted version, and the VERBATIM error. Name it in your `store-progress` output too.\n d. Gate still red with that harness reverted, OR the failure cannot be isolated to one harness ⇒ do NOT open a PR; report via `store-progress` with `failureReason`.\n Migrating an upstream API break (a removed option, a renamed export, a moved type) is still OUT OF SCOPE for this routine — hold that harness back per (c) rather than changing code here.\n10. Push the branch and open a PR:\n - Title: `chore(docker): bump harnesses (weekly YYYY-MM-DD)` — or list the bumps, e.g. `chore(docker): bump claude-code, pi, opencode (weekly YYYY-MM-DD)`.\n - Body: include a table of current → new versions for every harness bumped, link to each upstream changelog (e.g. https://github.com/anthropics/claude-code/releases/tag/v<X.Y.Z>), and the local verification output (or "all green").\n - Add `{{PR_REVIEWER}}` as a reviewer.\n - DO NOT merge — {{PR_REVIEWER}} reviews and merges.\n11. Verify CI on the PR — wait for the merge-gate workflow to start, confirm at least the `docker-worker-build` job is queued/passing. If CI fails, comment on the PR with the failure log and leave the branch for human review.\n\n## Constraints\n\n- **ONE bundled PR per run.** Bump every outdated harness in the same PR — do not stagger one-per-run. The ONLY permitted exclusion is a harness held back by the step-9 partial-bundle fallback, which must be declared in the PR body.\n- **No `--no-verify`, no force pushes.**\n- If a harness has a major-version bump (e.g. 2.x → 3.x), still bundle it but flag clearly in the PR description that this is a major bump and may need extra review.\n- Pi family-pin: all three pi packages MUST be the same version. If they drift in the lockfile, fix the drift in the same PR.\n\n## Sibling-schedule coordination\nThis schedule has a sibling — `weekly-harness-upgrade-check-wed` (Wednesday 05:00 BCN). If a sibling-opened PR is OPEN and `< 48h` old, step 4 skips. This is the dedup gate. Don\'t change branch-naming heuristics in a way that breaks the dedup.\n\n## Output\n\n`store-progress` with `status: "completed"` and `output` containing:\n- The PR URL (if one was opened) + the table of harnesses bumped, OR\n- "No-op: all harnesses up to date as of YYYY-MM-DD" with the version table, OR\n- "Skipped: sibling harness upgrade PR already open" with the existing PR URL.\n';
16477
16489
 
16478
16490
  // src/be/seed/schedules-seeder.ts
16479
- init_db();
16491
+ init_db2();
16480
16492
 
16481
16493
  // src/be/seed/automation-toggle.ts
16482
16494
  var SEED_AUTOMATIONS_ENABLED_ENV = "SEED_AUTOMATIONS_ENABLED";
@@ -16922,7 +16934,7 @@ The \`maxIterations\` parameter is declarative: the reviewer signals PASS when d
16922
16934
  `;
16923
16935
 
16924
16936
  // src/be/seed/workflows-seeder.ts
16925
- init_db();
16937
+ init_db2();
16926
16938
  var asText2 = (value) => value;
16927
16939
  var BUILT_IN_WORKFLOW_SOURCES = [
16928
16940
  { config: asText2(config_default64), content: asText2(content_default64) },