@desplega.ai/agent-swarm 1.158.0 → 1.160.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.
- package/README.md +1 -1
- package/dist/{acp-adapter-xaq4n6pc.js → acp-adapter-2mjwcsfh.js} +124 -27
- package/dist/{actions-p9hz5yat.js → actions-e43rxskr.js} +35 -30
- package/dist/{anthropic-messages-51pz26qe.js → anthropic-messages-5qx80j9k.js} +106 -16
- package/dist/{app-g26wdcz6.js → app-mc7xfagn.js} +12 -10
- package/dist/{assistant-wydfqkb3.js → assistant-sedkzv3b.js} +42 -31
- package/dist/{azure-openai-responses-8gksqtmz.js → azure-openai-responses-nfb21z9a.js} +13 -14
- package/dist/{boot-reembed-se8zmdcp.js → boot-reembed-cqz9swn5.js} +13 -12
- package/dist/{boot-reembed-g5ckg9yb.js → boot-reembed-m3656j2n.js} +14 -13
- package/dist/{boot-scrub-logs-wfxqan61.js → boot-scrub-logs-xbxf5d7w.js} +11 -9
- package/dist/boot-seeds-gsetbs5y.js +28 -0
- package/dist/{claude-adapter-tv2x4f36.js → claude-adapter-dc6289mc.js} +28 -23
- package/dist/{claude-managed-adapter-41b2s7fd.js → claude-managed-adapter-naaw51me.js} +4 -3
- package/dist/{claude-managed-setup-60g8aazx.js → claude-managed-setup-eacvchx0.js} +12 -3
- package/dist/claude-sdk-session-bqp2xvym.js +29722 -0
- package/dist/{cli-987hg0aa.js → cli-0jwe9034.js} +2 -2
- package/dist/{cli-vj6h9kc2.js → cli-0m7wct0d.js} +59 -1
- package/dist/{cli-c07r9a2m.js → cli-0q3avq3s.js} +12 -11
- package/dist/{cli-19jenss3.js → cli-0wgxmwf6.js} +31 -10
- package/dist/cli-0x01kwrd.js +491 -0
- package/dist/cli-0xqde53b.js +176 -0
- package/dist/cli-10nhj6xq.js +8355 -0
- package/dist/{cli-tt9k8r35.js → cli-12tszpk9.js} +479 -910
- package/dist/{cli-5b6b62tz.js → cli-13hw4z91.js} +1 -1
- package/dist/{cli-cqt19wg6.js → cli-1a2j50m0.js} +11 -2
- package/dist/{cli-xberxa1r.js → cli-25fcq4b4.js} +2 -2
- package/dist/{cli-npssxgaz.js → cli-2pdaysab.js} +52 -2
- package/dist/cli-3qhyh31j.js +166 -0
- package/dist/cli-447dt1h3.js +3828 -0
- package/dist/cli-4derpgyk.js +115 -0
- package/dist/{cli-00w2c66p.js → cli-523679eh.js} +13 -2
- package/dist/{cli-y95wp3tg.js → cli-58e8yr0d.js} +1 -1
- package/dist/{cli-24k806sc.js → cli-5nbmpy8w.js} +3 -3
- package/dist/{cli-53sz8gkz.js → cli-6cs6wzxt.js} +1 -1
- package/dist/cli-741yb0xx.js +1027 -0
- package/dist/cli-74h9hscv.js +69 -0
- package/dist/cli-7cxw8b60.js +14910 -0
- package/dist/{cli-xhaeg2nc.js → cli-7e398j1h.js} +1 -1
- package/dist/cli-7kyk9jr3.js +22 -0
- package/dist/cli-89s4ngw3.js +183 -0
- package/dist/{cli-9b13ggd1.js → cli-89v6kyq7.js} +1 -0
- package/dist/{cli-ftfvggzx.js → cli-9hsgwz4w.js} +1045 -581
- package/dist/{cli-rqz8qbw7.js → cli-a8dvhzrt.js} +59 -20
- package/dist/{cli-j57qkrpq.js → cli-azhgzetg.js} +395 -56
- package/dist/cli-br0qdrnp.js +2150 -0
- package/dist/{cli-rj19hc34.js → cli-btfv8y88.js} +1 -1
- package/dist/{cli-8qmme6vd.js → cli-c8a36vcc.js} +2 -2
- package/dist/cli-cpvsaqsw.js +333 -0
- package/dist/cli-d5czme6m.js +17805 -0
- package/dist/{cli-h38x0qhg.js → cli-et8m9xsv.js} +4 -3
- package/dist/{cli-x24pshtq.js → cli-evvtk35y.js} +6 -6
- package/dist/{cli-7s3syk22.js → cli-f8gy6r2r.js} +5 -5
- package/dist/{cli-zt1227k1.js → cli-fkqhbg8g.js} +5 -3
- package/dist/{cli-9httdpyq.js → cli-g2whhdrf.js} +1 -1
- package/dist/cli-gt4hxb8p.js +99 -0
- package/dist/{cli-s8eet254.js → cli-jajnsm8q.js} +37184 -53838
- package/dist/{cli-7gtvvpbh.js → cli-jayjpjmb.js} +21 -12
- package/dist/{cli-68w09sjw.js → cli-jyk0ynw2.js} +27 -89
- package/dist/{cli-aehm1rbq.js → cli-jz4w45qt.js} +1152 -61
- package/dist/cli-kmcpfwn2.js +333856 -0
- package/dist/{cli-4198qc9v.js → cli-ktmyrtpn.js} +19 -3
- package/dist/{cli-j55n64b6.js → cli-mfe5btp9.js} +505 -189
- package/dist/{cli-q67y4wzm.js → cli-phsaj4xq.js} +24 -2
- package/dist/{cli-1hkrch3k.js → cli-pm1rst0h.js} +46 -7
- package/dist/{cli-pw9rj5t9.js → cli-pqetb83f.js} +1 -176
- package/dist/{cli-ggm92wcn.js → cli-ptr8h7kp.js} +20 -1
- package/dist/{cli-s8s499xy.js → cli-qbksc292.js} +3 -2
- package/dist/{cli-47m6dkd3.js → cli-qydf22qq.js} +597 -346
- package/dist/{cli-3gmcwfyx.js → cli-r1mxd1xh.js} +13 -6
- package/dist/cli-rb9m6rpe.js +4980 -0
- package/dist/cli-rykfmgwg.js +102 -0
- package/dist/{cli-5d10vd2m.js → cli-shkxm1vn.js} +6 -5
- package/dist/{cli-eetrvv91.js → cli-t3p77qk1.js} +1 -1
- package/dist/cli-tfky2838.js +756 -0
- package/dist/{cli-g8djp6qe.js → cli-tmqt7dpj.js} +40 -0
- package/dist/{cli-fgqxwrpv.js → cli-tpq83z89.js} +1631 -127
- package/dist/cli-trc24wk2.js +143 -0
- package/dist/{cli-aky8tctm.js → cli-tzx2ke1v.js} +3 -3
- package/dist/cli-v7fn5gms.js +1425 -0
- package/dist/{cli-wscdvcqz.js → cli-vctdqs5h.js} +1 -1
- package/dist/{cli-cw9zck8j.js → cli-xjcywfsf.js} +8 -4
- package/dist/{cli-k0g1sjzm.js → cli-ybgv4kw2.js} +18 -11
- package/dist/{cli-rjehvrts.js → cli-ydmcgve1.js} +8 -8
- package/dist/{cli-vhjwh6cz.js → cli-ygwm91nt.js} +1 -1
- package/dist/{cli-mcnhgnn1.js → cli-ykk5jaax.js} +184 -26
- package/dist/{cli-de1396j2.js → cli-ywybs5as.js} +7 -1
- package/dist/cli-zpep9q5e.js +491 -0
- package/dist/cli.js +41 -32
- package/dist/cloudflare-workers-ai-system-one-k6fbxw9d.js +46 -0
- package/dist/{codex-adapter-cnm8wk11.js → codex-adapter-nmxcatww.js} +26 -17
- package/dist/{codex-hook-9hptmdhj.js → codex-hook-20me6byw.js} +2 -2
- package/dist/{codex-login-x3jk4etn.js → codex-login-w6fz4xbz.js} +50 -5
- package/dist/{codex-session-runner-gfg547zj.js → codex-session-runner-90aa80ev.js} +24 -17
- package/dist/{commands-e3bn0p75.js → commands-8wcq1kn7.js} +11 -9
- package/dist/{db-03v9kzr2.js → db-j40kc4se.js} +25 -11
- package/dist/{devin-adapter-8vgkwh29.js → devin-adapter-dpsv6hd9.js} +1 -1
- package/dist/{dispatcher-nrmg8yht.js → dispatcher-4zqy768d.js} +34 -29
- package/dist/{dsh-adapter-k03nfqa6.js → dsh-adapter-mpnzgztj.js} +3 -3
- package/dist/{e2b-93x1k0j5.js → e2b-ez07znam.js} +4 -3
- package/dist/execute-6e7qeyk4.js +1017 -0
- package/dist/{google-generative-ai-bxmv50nc.js → google-generative-ai-k6n5nbpp.js} +6 -5
- package/dist/{google-vertex-809af514.js → google-vertex-44xxtcvp.js} +6 -5
- package/dist/{handlers-aqcedbyb.js → handlers-kjdce1w5.js} +37 -32
- package/dist/{hook-ybvmrmhq.js → hook-czx13n12.js} +19 -15
- package/dist/{hook-7vkskkre.js → hook-r2t4bqfg.js} +18 -14
- package/dist/{http-2eqa8t24.js → http-3bbb19be.js} +900 -145
- package/dist/{index-f6cryxwe.js → index-4a5njnm1.js} +2 -59
- package/dist/{index-x71bvq0p.js → index-668me3f0.js} +35 -30
- package/dist/{index-c6zsv1bd.js → index-7aj368tw.js} +13 -12
- package/dist/{index-1yks3qcr.js → index-fg0dsp6c.js} +34 -29
- package/dist/{index-chgdkq36.js → index-kkv84jq9.js} +34 -29
- package/dist/{index-a3vn96n8.js → index-zg7vp46x.js} +198 -54
- package/dist/{keepalive-vtkf5n99.js → keepalive-yra8dy57.js} +13 -11
- package/dist/{lead-h3sp357x.js → lead-va0pad2c.js} +54 -49
- package/dist/llama-cpp-classify-tgj35k8d.js +335 -0
- package/dist/{maintenance-jzeqtk3q.js → maintenance-hqewtmyg.js} +14 -13
- package/dist/{mistral-conversations-zx0kn554.js → mistral-conversations-pc3ntnxt.js} +14 -17
- package/dist/{oauth-refresh-sweep-qp3dzmdp.js → oauth-refresh-sweep-7rdt1m9n.js} +12 -10
- package/dist/{onboard-tmsp0qbz.js → onboard-j6ms6d0x.js} +6 -5
- package/dist/{openai-codex-responses-4vjqzvjp.js → openai-codex-responses-bbancrr0.js} +21 -8
- package/dist/{openai-completions-9hjrqbw8.js → openai-completions-jpaj5g2b.js} +9 -12
- package/dist/{openai-responses-7b1pn0xt.js → openai-responses-200k1wx4.js} +23 -18
- package/dist/{opencode-adapter-x6x2da1z.js → opencode-adapter-89rabkw2.js} +8 -7
- package/dist/{openrouter-images-9f9ek4rw.js → openrouter-images-8yx3487g.js} +5 -7
- package/dist/{otel-impl-9mz73q65.js → otel-impl-a792rjz0.js} +1 -1
- package/dist/{pi-messages-txpjj39q.js → pi-messages-vxdt8v7j.js} +2 -1
- package/dist/{pi-mono-adapter-m6dvv0dz.js → pi-mono-adapter-g7qzvr3v.js} +295 -70
- package/dist/pricing-refresh-wx0tp7cb.js +39 -0
- package/dist/quickjs-r1pq2107.wasm +0 -0
- package/dist/{rbac-roles-c9wqz83x.js → rbac-roles-8tzawacv.js} +12 -10
- package/dist/{render-v2-gryrh9h8.js → render-v2-mm7zswb8.js} +12 -10
- package/dist/runtime-zyssgse0.js +24 -0
- package/dist/{setup-q9720bt6.js → setup-8y70ys6t.js} +6 -5
- package/dist/typesafe-system-one-2ef30pec.js +27 -0
- package/dist/{virtual-modules-3htpgn8x.js → virtual-modules-6nmk7h3n.js} +22 -13
- package/dist/{work-objects-b76x7deb.js → work-objects-fg6xkb0n.js} +37 -32
- package/dist/{worker-6vrxbv41.js → worker-wmwhxsph.js} +54 -49
- package/openapi.json +1314 -91
- package/package.json +12 -11
- package/src/be/db/agents.ts +20 -0
- package/src/be/db/api-keys.ts +70 -0
- package/src/be/db/tasks/human-free.ts +442 -0
- package/src/be/db/tasks/read.ts +56 -1
- package/src/be/db/tasks/write.ts +107 -11
- package/src/be/db.ts +274 -188
- package/src/be/harness-model-support.ts +182 -0
- package/src/be/human-free-drain.ts +67 -0
- package/src/be/memory/providers/sqlite-store.ts +51 -15
- package/src/be/migrations/182_task_human_free_flag.sql +63 -0
- package/src/be/migrations/183_human_free_reclassify_queue.sql +25 -0
- package/src/be/migrations/184_model_catalog.sql +120 -0
- package/src/be/migrations/185_api_key_auth_failures.sql +6 -0
- package/src/be/migrations/186_api_key_seat_mismatch.sql +8 -0
- package/src/be/model-catalog-store.ts +644 -0
- package/src/be/model-tier-keys.ts +46 -0
- package/src/be/model-tier-resolution.ts +534 -0
- package/src/be/model-validation.ts +188 -0
- package/src/be/models-catalog.ts +61 -7
- package/src/be/modelsdev-cache.json +82 -0
- package/src/be/modelsdev-cache.ts +2 -0
- package/src/be/pricing-refresh.ts +154 -12
- package/src/be/scripts/typecheck.ts +15 -0
- package/src/be/seed/runner.ts +18 -12
- package/src/be/seed/types.ts +1 -0
- package/src/be/seed-scripts/catalog/task-failure-audit.ts +61 -9
- package/src/be/swarm-config-guard.ts +8 -0
- package/src/cli.tsx +10 -0
- package/src/commands/claude-managed-setup.ts +3 -1
- package/src/commands/codex-login.ts +67 -0
- package/src/commands/credential-outcome-report.ts +191 -0
- package/src/commands/rate-limit-outcome.ts +34 -4
- package/src/commands/runner.ts +357 -186
- package/src/commands/seat-mismatch-report.ts +46 -0
- package/src/extensions/apply-task-create.ts +27 -1
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/heartbeat/heartbeat.ts +79 -17
- package/src/heartbeat/templates.ts +2 -2
- package/src/http/agents.ts +62 -1
- package/src/http/api-keys.ts +140 -2
- package/src/http/codex-oauth-keep-warm.ts +3 -5
- package/src/http/index.ts +8 -0
- package/src/http/memory.ts +12 -5
- package/src/http/models-catalog.ts +357 -8
- package/src/http/poll.ts +54 -3
- package/src/http/schedules.ts +51 -6
- package/src/http/script-runs.ts +12 -0
- package/src/http/session-data.ts +2 -5
- package/src/http/stats.ts +6 -8
- package/src/http/status.ts +15 -1
- package/src/http/tasks.ts +90 -7
- package/src/http/usage-cache.ts +56 -15
- package/src/http/workflows.ts +46 -8
- package/src/mcp-client/http-client.ts +5 -0
- package/src/memory/recall-query.ts +74 -0
- package/src/prompts/base-prompt.ts +15 -4
- package/src/prompts/session-templates.ts +23 -1
- package/src/providers/acp-adapter.ts +1 -0
- package/src/providers/claude-adapter.ts +14 -5
- package/src/providers/claude-managed-adapter.ts +1 -0
- package/src/providers/claude-managed-models.ts +47 -161
- package/src/providers/claude-sdk-session.ts +3 -1
- package/src/providers/codex-adapter.ts +14 -14
- package/src/providers/codex-models.ts +65 -198
- package/src/providers/devin-adapter.ts +1 -0
- package/src/providers/dsh-adapter.ts +2 -1
- package/src/providers/harness-version.ts +83 -7
- package/src/providers/opencode-adapter.ts +53 -1
- package/src/providers/pi-binary-root/src/extensions/codemode/worker.ts +11 -0
- package/src/providers/pi-codemode-runtime.ts +17 -0
- package/src/providers/pi-mono-adapter.ts +361 -83
- package/src/providers/pi-mono-extension.ts +16 -1
- package/src/providers/reasoning-effort.ts +44 -140
- package/src/providers/types.ts +8 -0
- package/src/rbac/legacy-policy.ts +43 -0
- package/src/rbac/permissions.ts +15 -0
- package/src/scripts-runtime/sdk-allowlist.ts +4 -0
- package/src/scripts-runtime/types/stdlib.d.ts +15 -0
- package/src/scripts-runtime/types/swarm-extension.d.ts +3 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +15 -0
- package/src/server.ts +6 -0
- package/src/slack/assistant.ts +13 -0
- package/src/slack/message-text.ts +56 -2
- package/src/slack/render-v2.ts +87 -37
- package/src/slack/session-status.ts +541 -0
- package/src/slack/thread-buffer.ts +10 -2
- package/src/tasks/sibling-awareness.ts +3 -2
- package/src/telemetry.ts +5 -4
- package/src/templates.d.ts +6 -0
- package/src/tests/agents-list-model-display.test.ts +4 -6
- package/src/tests/api-key-auth-failure-route.test.ts +142 -0
- package/src/tests/api-key-tracking.test.ts +368 -1
- package/src/tests/base-prompt.test.ts +43 -2
- package/src/tests/claude-adapter.test.ts +68 -0
- package/src/tests/claude-managed-adapter.test.ts +12 -18
- package/src/tests/codex-adapter.test.ts +2 -1
- package/src/tests/codex-auth-failure.test.ts +52 -0
- package/src/tests/codex-gpt6-release.test.ts +66 -5
- package/src/tests/codex-login.test.ts +116 -0
- package/src/tests/context-window.test.ts +7 -5
- package/src/tests/credential-exhaustion-policy.test.ts +118 -3
- package/src/tests/credential-outcome-report.test.ts +171 -0
- package/src/tests/credential-status-api.test.ts +103 -2
- package/src/tests/db-extraction-contract.test.ts +1 -0
- package/src/tests/db-task-read-contract.test.ts +10 -1
- package/src/tests/db-task-write-contract.test.ts +535 -2
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/dokploy-deploy.test.ts +315 -0
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/explicit-model-validation.test.ts +583 -0
- package/src/tests/extensions-pre-task.test.ts +73 -0
- package/src/tests/fetch-resolved-env.test.ts +46 -0
- package/src/tests/hang-watchdog-worker.ts +47 -0
- package/src/tests/hang-watchdog.test.ts +45 -0
- package/src/tests/hang-watchdog.ts +30 -0
- package/src/tests/harness-model-guard.test.ts +123 -0
- package/src/tests/harness-model-support.test.ts +374 -0
- package/src/tests/harness-version.test.ts +70 -3
- package/src/tests/heartbeat-checklist-config.test.ts +71 -0
- package/src/tests/heartbeat-checklist.test.ts +4 -2
- package/src/tests/heartbeat-orphan-resume.test.ts +48 -0
- package/src/tests/http-task-write-ownership.test.ts +172 -0
- package/src/tests/human-free-flag.test.ts +279 -0
- package/src/tests/human-free-oracle.ts +57 -0
- package/src/tests/human-free-reclassify.test.ts +669 -0
- package/src/tests/memory-fts-populate.test.ts +139 -0
- package/src/tests/memory-http-recall-gating.test.ts +125 -1
- package/src/tests/migration-046-budgets.test.ts +3 -3
- package/src/tests/model-catalog-migration.test.ts +134 -0
- package/src/tests/model-catalog-table.test.ts +249 -0
- package/src/tests/model-catalog-write-access.test.ts +387 -0
- package/src/tests/model-rate-limit-windows.test.ts +19 -0
- package/src/tests/model-tier-resolution.test.ts +611 -0
- package/src/tests/models-catalog.test.ts +1 -1
- package/src/tests/multi-runtime-enabled-stats.test.ts +65 -1
- package/src/tests/opencode-adapter.test.ts +157 -2
- package/src/tests/package-publish.test.ts +137 -36
- package/src/tests/pi-codemode.test.ts +246 -0
- package/src/tests/pi-mono-adapter.test.ts +3 -0
- package/src/tests/pi-native-mcp.test.ts +193 -0
- package/src/tests/pi-tool-exposure.test.ts +374 -0
- package/src/tests/preload.ts +3 -0
- package/src/tests/pricing-routes.test.ts +2 -2
- package/src/tests/prompt-template-session.test.ts +5 -3
- package/src/tests/rate-limit-event.test.ts +65 -0
- package/src/tests/rate-limit-outcome.test.ts +90 -0
- package/src/tests/rbac-engine.test.ts +77 -3
- package/src/tests/reasoning-effort.test.ts +109 -0
- package/src/tests/refresh-modelsdev-carryforward.test.ts +5 -5
- package/src/tests/runner-key-completion-outcome.test.ts +112 -0
- package/src/tests/runner-key-outcome-late-reset.test.ts +224 -0
- package/src/tests/runner-registration-retry.test.ts +149 -0
- package/src/tests/runtime-model-catalog.test.ts +86 -0
- package/src/tests/script-connections.test.ts +9 -0
- package/src/tests/seat-mismatch-report.test.ts +85 -0
- package/src/tests/seed-scripts.test.ts +138 -0
- package/src/tests/seed.test.ts +25 -0
- package/src/tests/session-costs.test.ts +14 -11
- package/src/tests/slack-message-text.test.ts +101 -0
- package/src/tests/slack-render-v2.test.ts +96 -0
- package/src/tests/slack-session-status.test.ts +626 -0
- package/src/tests/slack-thread-buffer-context.test.ts +93 -0
- package/src/tests/status.test.ts +29 -0
- package/src/tests/steering-promotion.test.ts +51 -0
- package/src/tests/store-progress-ownership.test.ts +136 -0
- package/src/tests/subscription-plans.test.ts +28 -0
- package/src/tests/task-cascade-fail.test.ts +148 -2
- package/src/tests/task-citations.test.ts +3 -2
- package/src/tests/tool-annotations.test.ts +1 -1
- package/src/tests/usage-cache.test.ts +166 -0
- package/src/tests/workflow-agent-task.test.ts +30 -0
- package/src/tests/workflow-executors.test.ts +5 -2
- package/src/tests/workflow-system-one-decision-review.test.ts +1021 -0
- package/src/tests/workflow-system-one-decision-save-warnings.test.ts +365 -0
- package/src/tests/workflow-system-one-decision.test.ts +2063 -0
- package/src/tests/workflow-triggers-v2.test.ts +320 -0
- package/src/tools/model-catalog/index.ts +137 -0
- package/src/tools/schedules/create-schedule.ts +17 -2
- package/src/tools/schedules/patch-schedule.ts +31 -1
- package/src/tools/schedules/update-schedule.ts +31 -1
- package/src/tools/send-task.ts +18 -1
- package/src/tools/store-progress.ts +49 -4
- package/src/tools/task-action.ts +14 -1
- package/src/tools/tool-config.ts +3 -1
- package/src/tools/workflows/create-workflow.ts +17 -4
- package/src/tools/workflows/patch-workflow-node.ts +17 -7
- package/src/tools/workflows/patch-workflow.ts +9 -2
- package/src/tools/workflows/update-workflow.ts +17 -4
- package/src/types.ts +41 -1
- package/src/utils/codex-auth-failure.ts +34 -0
- package/src/utils/context-window.ts +47 -53
- package/src/utils/credentials.ts +72 -30
- package/src/utils/error-tracker.ts +80 -0
- package/src/utils/harness-cli-version.ts +115 -0
- package/src/utils/harness-model-error.ts +33 -0
- package/src/utils/model-rate-limit-windows.ts +12 -0
- package/src/utils/runtime-model-catalog.ts +152 -0
- package/src/utils/spawn-model-guard.ts +43 -0
- package/src/utils/subscription-plans.ts +22 -0
- package/src/workflows/approval-resolution.ts +39 -0
- package/src/workflows/definition.ts +7 -0
- package/src/workflows/engine.ts +69 -1
- package/src/workflows/executors/agent-task.ts +16 -6
- package/src/workflows/executors/base.ts +53 -0
- package/src/workflows/executors/human-in-the-loop.ts +8 -8
- package/src/workflows/executors/index.ts +1 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/executors/system-one-decision.ts +1232 -0
- package/src/workflows/executors/system-one-providers.ts +301 -0
- package/src/workflows/executors/workflow-llm.ts +13 -1
- package/src/workflows/model-validation.ts +45 -0
- package/src/workflows/patch-definition.ts +5 -0
- package/src/workflows/readiness.ts +86 -0
- package/src/workflows/recovery.ts +12 -12
- package/src/workflows/resume.ts +23 -9
- package/src/workflows/triggers.ts +85 -0
- package/templates/schedules/daily-blocker-digest/content.md +4 -5
- package/templates/skills/agent-browser/SKILL.md +6 -5
- package/templates/skills/agent-browser/content.md +6 -5
- package/templates/skills/heartbeat-runbook/config.json +1 -1
- package/templates/skills/heartbeat-runbook/content.md +2 -2
- package/templates/skills/swarm-scripts/SKILL.md +1 -1
- package/templates/skills/swarm-scripts/content.md +1 -1
- package/templates/skills/workflow-iterate/content.md +82 -1
- package/templates/workflows/claude-code-changelog-watch/content.md +2 -0
- package/templates/workflows/pr-review-status-sweep/content.md +2 -0
- package/dist/boot-seeds-s3q01xj3.js +0 -26
- package/dist/claude-sdk-session-t442qz6f.js +0 -39108
- package/dist/cli-0xjkj1j7.js +0 -61
- package/dist/cli-20cj37vt.js +0 -335561
- package/dist/cli-2djtr51b.js +0 -48
- package/dist/cli-65hjmev5.js +0 -1141
- package/dist/cli-aw1jwp1r.js +0 -14075
- package/dist/cli-h967nb6r.js +0 -6603
- package/dist/cli-vapyk8sw.js +0 -20
- package/dist/cli-ws6rqycm.js +0 -247
- package/dist/pricing-refresh-v1cbr9te.js +0 -27
- package/src/providers/modelsdev-reasoning.json +0 -6453
- package/dist/{index-f24115ge.js → index-2wsdsnmm.js} +3 -3
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./cli-ep19k3mb.js";
|
|
4
4
|
import {
|
|
5
5
|
agentFsProvisionSeeder
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-7e398j1h.js";
|
|
7
7
|
import {
|
|
8
8
|
extractArgsJsonSchema,
|
|
9
9
|
extractScriptSignature,
|
|
@@ -13,16 +13,27 @@ import {
|
|
|
13
13
|
upsertScriptByName,
|
|
14
14
|
validateDefinition,
|
|
15
15
|
validateScriptImports
|
|
16
|
-
} from "./cli-
|
|
16
|
+
} from "./cli-tpq83z89.js";
|
|
17
17
|
import"./cli-epan13p1.js";
|
|
18
18
|
import"./cli-y89t4nca.js";
|
|
19
19
|
import"./cli-f14fvzag.js";
|
|
20
|
-
import"./cli-
|
|
21
|
-
import"./cli-
|
|
22
|
-
import"./cli-
|
|
23
|
-
import"./cli-
|
|
24
|
-
import"./cli-
|
|
20
|
+
import"./cli-12tszpk9.js";
|
|
21
|
+
import"./cli-ygwm91nt.js";
|
|
22
|
+
import"./cli-3dpj7atn.js";
|
|
23
|
+
import"./cli-10nhj6xq.js";
|
|
24
|
+
import"./cli-rb9m6rpe.js";
|
|
25
|
+
import"./cli-rykfmgwg.js";
|
|
26
|
+
import"./cli-0jwe9034.js";
|
|
27
|
+
import"./cli-6cs6wzxt.js";
|
|
28
|
+
import"./cli-jz4w45qt.js";
|
|
29
|
+
import"./cli-25fcq4b4.js";
|
|
30
|
+
import"./cli-bsakbbkm.js";
|
|
31
|
+
import"./cli-trc24wk2.js";
|
|
32
|
+
import"./cli-azhgzetg.js";
|
|
33
|
+
import"./cli-q51yprfq.js";
|
|
34
|
+
import"./cli-3er6gcsn.js";
|
|
25
35
|
import"./cli-2658f6at.js";
|
|
36
|
+
import"./cli-yatxqynm.js";
|
|
26
37
|
import {
|
|
27
38
|
computeContentHash,
|
|
28
39
|
createScheduledTask,
|
|
@@ -39,20 +50,29 @@ import {
|
|
|
39
50
|
updateSkill,
|
|
40
51
|
updateWorkflow,
|
|
41
52
|
upsertSkillFiles
|
|
42
|
-
} from "./cli-
|
|
43
|
-
import"./cli-
|
|
44
|
-
import"./cli-
|
|
45
|
-
import"./cli-
|
|
46
|
-
import"./cli-19jenss3.js";
|
|
47
|
-
import"./cli-dv6cdjs2.js";
|
|
53
|
+
} from "./cli-qydf22qq.js";
|
|
54
|
+
import"./cli-3qhyh31j.js";
|
|
55
|
+
import"./cli-ktmyrtpn.js";
|
|
56
|
+
import"./cli-r1mxd1xh.js";
|
|
48
57
|
import"./cli-n7h1kqpf.js";
|
|
49
|
-
import"./cli-
|
|
50
|
-
import"./cli-
|
|
58
|
+
import"./cli-ptr8h7kp.js";
|
|
59
|
+
import"./cli-dv6cdjs2.js";
|
|
60
|
+
import"./cli-1a2j50m0.js";
|
|
61
|
+
import"./cli-0wgxmwf6.js";
|
|
62
|
+
import"./cli-ywybs5as.js";
|
|
51
63
|
import"./cli-ej6gbxfb.js";
|
|
64
|
+
import"./cli-kmcpfwn2.js";
|
|
52
65
|
import"./cli-sd0mxa3c.js";
|
|
53
66
|
import"./cli-w5e1d1vv.js";
|
|
54
|
-
import"./cli-
|
|
67
|
+
import"./cli-0q3avq3s.js";
|
|
55
68
|
import"./cli-r2ap2czm.js";
|
|
69
|
+
import"./cli-13hw4z91.js";
|
|
70
|
+
import"./cli-btbzvq95.js";
|
|
71
|
+
import"./cli-1m2e086m.js";
|
|
72
|
+
import"./cli-ykk5jaax.js";
|
|
73
|
+
import"./cli-bzr0ftht.js";
|
|
74
|
+
import"./cli-bd957dgb.js";
|
|
75
|
+
import"./cli-pzxba7gw.js";
|
|
56
76
|
import"./cli-zf8jjwex.js";
|
|
57
77
|
import {
|
|
58
78
|
__toESM
|
|
@@ -5085,6 +5105,8 @@ export default async function taskContextGathering(args: any, ctx: any) {
|
|
|
5085
5105
|
var task_failure_audit_default = `import { z } from "zod";
|
|
5086
5106
|
import { publishCatalogReportPage } from "./catalog-report";
|
|
5087
5107
|
|
|
5108
|
+
const MAX_TASK_SCAN_LIMIT = 500;
|
|
5109
|
+
|
|
5088
5110
|
export const argsSchema = z.object({
|
|
5089
5111
|
days: z
|
|
5090
5112
|
.number()
|
|
@@ -5100,8 +5122,9 @@ export const argsSchema = z.object({
|
|
|
5100
5122
|
.number()
|
|
5101
5123
|
.int()
|
|
5102
5124
|
.positive()
|
|
5125
|
+
.max(MAX_TASK_SCAN_LIMIT)
|
|
5103
5126
|
.optional()
|
|
5104
|
-
.describe("Max failed tasks to scan (default 500)"),
|
|
5127
|
+
.describe("Max failed tasks to scan (default 500, max 500)"),
|
|
5105
5128
|
publishPage: z.boolean().optional().describe("Publish an authed HTML page (default true)"),
|
|
5106
5129
|
});
|
|
5107
5130
|
|
|
@@ -5109,20 +5132,37 @@ const REASON_PATTERNS: any[] = [
|
|
|
5109
5132
|
{ key: "sigterm/killed", re: /sigterm|sigkill|killed|143|137/i },
|
|
5110
5133
|
{ key: "timeout", re: /time?d?\\s*out|timeout|deadline/i },
|
|
5111
5134
|
{ key: "context-window", re: /context (window|limit|saturat)|peakcontext|compact/i },
|
|
5135
|
+
{ key: "reboot-sweep", re: /reboot sweep/i },
|
|
5112
5136
|
{ key: "not-found", re: /not found|404|missing|no such/i },
|
|
5113
5137
|
{ key: "auth/credentials", re: /unauthorized|401|403|credential|token|forbidden/i },
|
|
5114
|
-
{ key: "ci/checks-failed", re:
|
|
5138
|
+
{ key: "ci/checks-failed", re: /\\bci\\b|check.?s? fail|lint|tsc|test.?s? fail/i },
|
|
5115
5139
|
{ key: "network", re: /network|econn|fetch failed|socket|dns|502|503|504/i },
|
|
5116
5140
|
{ key: "cancelled", re: /cancel|aborted/i },
|
|
5117
5141
|
];
|
|
5118
5142
|
|
|
5143
|
+
function sanitizeUntrustedReasonSample(reason: unknown): string {
|
|
5144
|
+
return String(reason)
|
|
5145
|
+
.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, " ")
|
|
5146
|
+
.replace(/\\s+/g, " ")
|
|
5147
|
+
.trim()
|
|
5148
|
+
.slice(0, 200);
|
|
5149
|
+
}
|
|
5150
|
+
|
|
5151
|
+
function rowsToObjects(result: any): any[] {
|
|
5152
|
+
const payload = result?.data ?? result;
|
|
5153
|
+
const columns: string[] = payload?.columns ?? [];
|
|
5154
|
+
return (payload?.rows ?? []).map((row: any) =>
|
|
5155
|
+
Array.isArray(row) ? Object.fromEntries(columns.map((column, i) => [column, row[i]])) : row,
|
|
5156
|
+
);
|
|
5157
|
+
}
|
|
5158
|
+
|
|
5119
5159
|
function reasonCluster(reason: string): string {
|
|
5120
5160
|
const r = (reason || "").trim();
|
|
5121
5161
|
if (!r) return "(no reason given)";
|
|
5122
5162
|
for (const p of REASON_PATTERNS) {
|
|
5123
5163
|
if (p.re.test(r)) return p.key;
|
|
5124
5164
|
}
|
|
5125
|
-
return
|
|
5165
|
+
return "other";
|
|
5126
5166
|
}
|
|
5127
5167
|
|
|
5128
5168
|
/** Cluster recently failed swarm tasks by reason, agent, or schedule. */
|
|
@@ -5131,7 +5171,7 @@ export default async function taskFailureAudit(args: any, ctx: any) {
|
|
|
5131
5171
|
if (!parsed.success) return { error: "invalid args: " + parsed.error.message };
|
|
5132
5172
|
const days = parsed.data.days || 7;
|
|
5133
5173
|
const groupBy = parsed.data.groupBy || "reason";
|
|
5134
|
-
const limit = parsed.data.limit
|
|
5174
|
+
const limit = Math.min(parsed.data.limit ?? MAX_TASK_SCAN_LIMIT, MAX_TASK_SCAN_LIMIT);
|
|
5135
5175
|
const publishPage = parsed.data.publishPage !== false;
|
|
5136
5176
|
|
|
5137
5177
|
const since = new Date(Date.now() - days * 86400000).toISOString();
|
|
@@ -5146,17 +5186,49 @@ export default async function taskFailureAudit(args: any, ctx: any) {
|
|
|
5146
5186
|
const payload: any = res && res.data ? res.data : res;
|
|
5147
5187
|
const tasks: any = payload && Array.isArray(payload.tasks) ? payload.tasks : [];
|
|
5148
5188
|
|
|
5189
|
+
const failureReasons = new Map<string, string>();
|
|
5190
|
+
// Projected for every groupBy mode: task_list omits failureReason, and
|
|
5191
|
+
// schedule/agent groups still need a populated sample.
|
|
5192
|
+
const tasksNeedingReason = tasks.filter((task: any) => !task.failureReason && task.id);
|
|
5193
|
+
const taskIds = tasksNeedingReason.map((task: any) => task.id as string);
|
|
5194
|
+
if (taskIds.length > 0) {
|
|
5195
|
+
const placeholders = taskIds.map(() => "?").join(", ");
|
|
5196
|
+
const reasonResult: any = await ctx.swarm.db_query({
|
|
5197
|
+
sql: \`SELECT id, failureReason FROM agent_tasks WHERE id IN (\${placeholders})\`,
|
|
5198
|
+
params: taskIds,
|
|
5199
|
+
});
|
|
5200
|
+
const reasonPayload: any = reasonResult?.data ?? reasonResult;
|
|
5201
|
+
if (
|
|
5202
|
+
reasonResult?.success === false ||
|
|
5203
|
+
reasonPayload?.success === false ||
|
|
5204
|
+
reasonPayload?.error
|
|
5205
|
+
) {
|
|
5206
|
+
return { error: "failure reason projection failed with status " + reasonResult?.status };
|
|
5207
|
+
}
|
|
5208
|
+
if (reasonPayload?.truncated) {
|
|
5209
|
+
return {
|
|
5210
|
+
error: \`failure reason projection truncated (\${reasonPayload.rows?.length ?? 0} of \${reasonPayload.total ?? "unknown"} rows)\`,
|
|
5211
|
+
};
|
|
5212
|
+
}
|
|
5213
|
+
for (const row of rowsToObjects(reasonResult)) {
|
|
5214
|
+
if (typeof row?.id === "string" && typeof row.failureReason === "string") {
|
|
5215
|
+
failureReasons.set(row.id, row.failureReason);
|
|
5216
|
+
}
|
|
5217
|
+
}
|
|
5218
|
+
}
|
|
5219
|
+
|
|
5149
5220
|
const groups: any = {};
|
|
5150
5221
|
for (const t of tasks) {
|
|
5151
5222
|
let key: string;
|
|
5152
5223
|
if (groupBy === "agent") key = t.agentId || "(unassigned)";
|
|
5153
5224
|
else if (groupBy === "schedule") key = t.scheduleId || "(not scheduled)";
|
|
5154
|
-
else key = reasonCluster(t.failureReason || "");
|
|
5155
|
-
if (!groups[key]) groups[key] = { key, count: 0, taskIds: [],
|
|
5225
|
+
else key = reasonCluster(failureReasons.get(t.id) || t.failureReason || "");
|
|
5226
|
+
if (!groups[key]) groups[key] = { key, count: 0, taskIds: [], untrustedWorkerTextSample: "" };
|
|
5156
5227
|
groups[key].count++;
|
|
5157
5228
|
if (groups[key].taskIds.length < 5) groups[key].taskIds.push(t.id);
|
|
5158
|
-
|
|
5159
|
-
|
|
5229
|
+
const failureReason = failureReasons.get(t.id) || t.failureReason;
|
|
5230
|
+
if (!groups[key].untrustedWorkerTextSample && failureReason) {
|
|
5231
|
+
groups[key].untrustedWorkerTextSample = sanitizeUntrustedReasonSample(failureReason);
|
|
5160
5232
|
}
|
|
5161
5233
|
}
|
|
5162
5234
|
|
|
@@ -5202,7 +5274,7 @@ export default async function taskFailureAudit(args: any, ctx: any) {
|
|
|
5202
5274
|
key: group.key,
|
|
5203
5275
|
count: group.count,
|
|
5204
5276
|
taskIds: group.taskIds,
|
|
5205
|
-
|
|
5277
|
+
untrustedWorkerTextSample: group.untrustedWorkerTextSample,
|
|
5206
5278
|
},
|
|
5207
5279
|
],
|
|
5208
5280
|
})),
|
|
@@ -5659,7 +5731,7 @@ var config_default = `{
|
|
|
5659
5731
|
`;
|
|
5660
5732
|
|
|
5661
5733
|
// templates/skills/agent-browser/content.md
|
|
5662
|
-
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
|
|
5734
|
+
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 `` 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';
|
|
5663
5735
|
|
|
5664
5736
|
// templates/skills/apps/config.json
|
|
5665
5737
|
var config_default2 = `{
|
|
@@ -7145,7 +7217,7 @@ var config_default20 = `{
|
|
|
7145
7217
|
"displayName": "Heartbeat Runbook",
|
|
7146
7218
|
"slug": "heartbeat-runbook",
|
|
7147
7219
|
"title": "Heartbeat Runbook",
|
|
7148
|
-
"description": "Heartbeat, HEARTBEAT.md, standing orders, heartbeat-checklist task, boot-triage task: how the lead keeps its heartbeat runbook short and handles a checklist or boot-triage task. Covers the tracked-item cap, lift triggers, the \`
|
|
7220
|
+
"description": "Heartbeat, HEARTBEAT.md, standing orders, heartbeat-checklist task, boot-triage task: how the lead keeps its heartbeat runbook short and handles a checklist or boot-triage task. Covers the tracked-item cap, lift triggers, the \`schedule-health\`, \`task-failure-audit\` and \`boot-triage\` scripts, and reboot-interrupted work. Lead only.",
|
|
7149
7221
|
"version": "1.0.0",
|
|
7150
7222
|
"category": "skills",
|
|
7151
7223
|
"placeholders": [],
|
|
@@ -7187,8 +7259,8 @@ Two kinds of sections:
|
|
|
7187
7259
|
|
|
7188
7260
|
1. Read the latest runbook. The snapshot in the task may be stale.
|
|
7189
7261
|
2. Prune first. Check every tracked item against its lift trigger. Remove resolved, stale, and past-date items.
|
|
7190
|
-
3. Run the seeded
|
|
7191
|
-
4. Read the system status and the
|
|
7262
|
+
3. Run the seeded scripts: \`script-run\` with name \`schedule-health\`, then \`task-failure-audit\`, both with \`args: { days: 1, publishPage: false }\`. They report failing schedules and failure clusters. Check any other standing order in the runbook yourself.
|
|
7263
|
+
4. Read the system status and the script results for stalled tasks, idle workers next to open work, and anomalies.
|
|
7192
7264
|
5. Reboot-interrupted failures: a failure reason "worker session not found" or "worker session heartbeat is stale" means a server restart cut the task off. For each one: \`get-task-details\` on the task, confirm a retry task tagged \`reboot-retry\` exists and moves, recreate the task when no retry exists and the work is still needed. These are never "expected cleanup".
|
|
7193
7265
|
6. Act with your tools: create tasks, cancel stuck ones, post to Slack under the \`slack-interaction\` skill rules.
|
|
7194
7266
|
7. Update the runbook after pruning.
|
|
@@ -10766,7 +10838,7 @@ The swarm ships named scripts at global scope. Each one replaces a multi-step to
|
|
|
10766
10838
|
| \`complete-task\` | \`{ taskId, output }\` | finish a task from inside a script |
|
|
10767
10839
|
| \`report-progress\` | \`{ taskId, note }\` | a progress note from inside a script |
|
|
10768
10840
|
| \`swarm-overview\` | \`{}\` | agents and task counts |
|
|
10769
|
-
| \`
|
|
10841
|
+
| \`schedule-health\`, \`task-failure-audit\`, \`boot-triage\` | see \`heartbeat-runbook\` | the lead's heartbeat data gathering |
|
|
10770
10842
|
|
|
10771
10843
|
## Authoring contract
|
|
10772
10844
|
|
|
@@ -11781,10 +11853,22 @@ Use this skill when you need to change an existing workflow without breaking liv
|
|
|
11781
11853
|
- Make routing explicit. Branching nodes should have named pass/fail routes, and silent skip paths should still produce an observable outcome when operators need to know what happened.
|
|
11782
11854
|
- Wire inputs deliberately. Node executors receive the raw workflow context plus resolved \`inputs\` aliases, so a condition can use either a local alias or a node-id-prefixed path. Confirm the chosen path against the recorded step input.
|
|
11783
11855
|
- Keep schemas tight. If an agent-task has an \`outputSchema\`, include the expected JSON shape in the task prompt and route it to a worker/provider that is known to return structured output correctly.
|
|
11784
|
-
- Prefer reusable script nodes for deterministic shared logic. Agent tasks are best for
|
|
11856
|
+
- Prefer reusable script nodes for deterministic shared logic. Agent tasks are best for investigation or work that genuinely needs an LLM. For a bounded judgment, use \`system-one-decision\` (see Choosing a decider).
|
|
11785
11857
|
- Scope parallel branches so they do not overwrite one another. Fan-out tasks should have separate context keys or branch-specific output fields.
|
|
11786
11858
|
- Make retry paths idempotent. A rerun should detect existing artifacts, comments, PRs, or notifications and update or skip them rather than duplicating work.
|
|
11787
11859
|
|
|
11860
|
+
### Choosing a decider
|
|
11861
|
+
|
|
11862
|
+
When a node has to decide, pick the cheapest node that can decide. Use \`system-one-decision\` without being asked when the decision is a bounded judgment.
|
|
11863
|
+
|
|
11864
|
+
| The decision is | Use |
|
|
11865
|
+
|---|---|
|
|
11866
|
+
| A fact: a count, PR state, flag, date, lookup, regex, or schema check | \`script\`, \`property-match\`, or \`code-match\` |
|
|
11867
|
+
| A bounded judgment: pass/fail, pick one of N, a score on a rubric, or the probability that a claim is true | \`system-one-decision\` |
|
|
11868
|
+
| Free-form generation, or findings a later node reads | \`raw-llm\` or \`agent-task\` |
|
|
11869
|
+
|
|
11870
|
+
Jev is weak at counting. For a hybrid, count in a \`script\` and pass the number to \`system-one-decision\` as part of \`state\`.
|
|
11871
|
+
|
|
11788
11872
|
### \`swarm-script\` Timeout Limit
|
|
11789
11873
|
|
|
11790
11874
|
- Keep \`config.timeoutMs\` at or below \`300000\` (5 minutes); the default remains \`30000\` (30 seconds).
|
|
@@ -11854,6 +11938,75 @@ Use these shapes as a starting point, then confirm them against the current exec
|
|
|
11854
11938
|
|
|
11855
11939
|
\`validate\` checks the named upstream node output. Supply either \`schema\` for a deterministic structural check or \`prompt\` for a judgment-based check. Its output is \`{ pass, reasoning, confidence }\`, routed through \`pass\` or \`fail\`.
|
|
11856
11940
|
|
|
11941
|
+
### \`system-one-decision\` (SystemOne Decision)
|
|
11942
|
+
|
|
11943
|
+
**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:
|
|
11944
|
+
|
|
11945
|
+
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.
|
|
11946
|
+
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.
|
|
11947
|
+
3. Confirm it works with one cheap call. Create a throwaway one-node workflow, trigger it, read the run, then \`delete-workflow\` it:
|
|
11948
|
+
|
|
11949
|
+
\`\`\`json
|
|
11950
|
+
{
|
|
11951
|
+
"nodes": [
|
|
11952
|
+
{
|
|
11953
|
+
"id": "ping",
|
|
11954
|
+
"type": "system-one-decision",
|
|
11955
|
+
"config": {
|
|
11956
|
+
"provider": "typesafe",
|
|
11957
|
+
"state": "ping",
|
|
11958
|
+
"questions": { "ping": { "type": "noul", "instructions": "Is the state the word ping?" } },
|
|
11959
|
+
"returns": { "ping": { "type": "noul" } },
|
|
11960
|
+
"timeoutMs": 15000,
|
|
11961
|
+
"maxRetries": 0
|
|
11962
|
+
}
|
|
11963
|
+
}
|
|
11964
|
+
]
|
|
11965
|
+
}
|
|
11966
|
+
\`\`\`
|
|
11967
|
+
|
|
11968
|
+
A \`completed\` run means the key works. A \`failed\` run carries the reason: \`<KEY> is not configured\` (missing; for \`laya\` it can name \`LAYA_URL\` or \`LAYA_API_KEY\`, or both), or \`<KEY> was rejected by <host> (HTTP 401)\` (present but refused). To probe \`laya\`, set \`"provider": "laya"\` in the ping node. If \`create-workflow\` says \`system-one-decision\` is an unregistered executor type, the node is not deployed on this swarm yet: stop and say so.
|
|
11969
|
+
4. If the key is missing or was rejected, **do not build the node.** Ask a human for the key with \`request-human-input\` or in the thread. Name the exact key and where it goes: the Secrets page (Settings > Secrets), or for \`LAYA_URL\` a global config value (\`set-config\`, scope \`global\`). Never ask them to paste it into chat, a task, or a definition, and never write a key into a definition.
|
|
11970
|
+
|
|
11971
|
+
Afterwards, a \`warnings\` entry on \`create-workflow\` or a patch tool means the key went missing since you checked. Treat it as step 4.
|
|
11972
|
+
|
|
11973
|
+
\`\`\`json
|
|
11974
|
+
{
|
|
11975
|
+
"type": "system-one-decision",
|
|
11976
|
+
"inputs": { "pr": "trigger.pullRequest" },
|
|
11977
|
+
"config": {
|
|
11978
|
+
"provider": "typesafe",
|
|
11979
|
+
"model": "jev-1.13.0",
|
|
11980
|
+
"state": "{{pr}}",
|
|
11981
|
+
"questions": {
|
|
11982
|
+
"ready": {
|
|
11983
|
+
"type": "noul",
|
|
11984
|
+
"instructions": "Is this pull request ready to merge?",
|
|
11985
|
+
"criteria": { "true": "Tests pass and the change matches its description", "false": "Missing tests or scope creep" }
|
|
11986
|
+
},
|
|
11987
|
+
"risk": {
|
|
11988
|
+
"type": "choice",
|
|
11989
|
+
"instructions": "How risky is this change?",
|
|
11990
|
+
"criteria": { "low": "Docs or tests only", "medium": "Contained behavior change", "high": "Touches auth, data, or billing" }
|
|
11991
|
+
}
|
|
11992
|
+
},
|
|
11993
|
+
"returns": { "ready": { "type": "noul" }, "risk": { "type": "choice" } }
|
|
11994
|
+
},
|
|
11995
|
+
"next": "gate"
|
|
11996
|
+
}
|
|
11997
|
+
\`\`\`
|
|
11998
|
+
|
|
11999
|
+
- \`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.
|
|
12000
|
+
- \`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.
|
|
12001
|
+
- 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, ...]\`).
|
|
12002
|
+
- \`returns\` repeats every question id and its type. A mismatch is rejected when the workflow is saved.
|
|
12003
|
+
- The output is \`{ model, answers, usage }\`, plus \`routing: { model }\` on \`laya\` (the checkpoint that answered). Read a field as \`<node-id>.answers.<question>.<field>\`, for example \`qualification.answers.risk.confidence\`. A \`noul\` answer is only \`{ type, noul }\` and has no confidence. A \`choice\` answer has \`choice\`, \`probabilities\`, and \`confidence\`. A \`score\` answer has \`score\`, \`legend\`, \`probabilities\`, and \`confidence\`.
|
|
12004
|
+
- A valid low-confidence answer is a success. To have a person review the uncertain ones, set \`humanReview\` on the node (below). To route on a threshold yourself, keep it in the next node: \`property-match\` (\`gt\`, \`lt\`) or \`code-match\`, with the uncertain band routed to \`human-in-the-loop\`. Do not invent a global threshold.
|
|
12005
|
+
- \`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.
|
|
12006
|
+
- 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".
|
|
12007
|
+
- 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.
|
|
12008
|
+
- 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.
|
|
12009
|
+
|
|
11857
12010
|
### \`swarm-script\`
|
|
11858
12011
|
|
|
11859
12012
|
\`\`\`json
|
|
@@ -14928,17 +15081,18 @@ async function runSeeder(seeder, opts) {
|
|
|
14928
15081
|
continue;
|
|
14929
15082
|
}
|
|
14930
15083
|
const state = await getSeedState(seeder.kind, item.key);
|
|
14931
|
-
const pristine = state ? upstream === state.seededHash : upstream === item.contentHash;
|
|
14932
|
-
if (!pristine) {
|
|
14933
|
-
result.skippedUserModified += 1;
|
|
14934
|
-
continue;
|
|
14935
|
-
}
|
|
14936
15084
|
if (upstream === item.contentHash) {
|
|
14937
|
-
if (
|
|
15085
|
+
if (state?.seededHash !== item.contentHash) {
|
|
14938
15086
|
await recordSeedState(seeder.kind, item.key, item.contentHash);
|
|
15087
|
+
}
|
|
14939
15088
|
result.skippedUnchanged += 1;
|
|
14940
15089
|
continue;
|
|
14941
15090
|
}
|
|
15091
|
+
const pristine = state ? upstream === state.seededHash : false;
|
|
15092
|
+
if (!pristine) {
|
|
15093
|
+
result.skippedUserModified += 1;
|
|
15094
|
+
continue;
|
|
15095
|
+
}
|
|
14942
15096
|
await seeder.apply(item, "update", opts);
|
|
14943
15097
|
await recordSeedState(seeder.kind, item.key, item.contentHash);
|
|
14944
15098
|
result.updated += 1;
|
|
@@ -15022,12 +15176,11 @@ You are Lead. Produce one concise daily digest of blockers, stale claims, open P
|
|
|
15022
15176
|
|
|
15023
15177
|
Run these read-only global scripts first. Use their outputs as evidence, then apply judgment:
|
|
15024
15178
|
|
|
15025
|
-
1. \`script-run\` global script \`
|
|
15026
|
-
2. \`script-run\` global script \`
|
|
15027
|
-
3. \`
|
|
15028
|
-
4. Read \`GET /status\`. If the \`embeddings\` milestone is \`unverified\`, append this line to the digest: "Memory search is off: set OPENAI_API_KEY on the API server to enable it."
|
|
15179
|
+
1. \`script-run\` global script \`schedule-health\` with args \`{ "days": 7, "publishPage": true }\`
|
|
15180
|
+
2. \`script-run\` global script \`task-failure-audit\` with args \`{ "days": 7, "groupBy": "reason", "publishPage": true }\`
|
|
15181
|
+
3. Read \`GET /status\`. If the \`embeddings\` milestone is \`unverified\`, append this line to the digest: "Memory search is off: set OPENAI_API_KEY on the API server to enable it."
|
|
15029
15182
|
|
|
15030
|
-
Do not script-ify judgment or notification copy. Use the script outputs to identify
|
|
15183
|
+
Do not script-ify judgment or notification copy. Use the script outputs to identify schedule risks and provider failure clusters.
|
|
15031
15184
|
|
|
15032
15185
|
## Phase 1: Gather Blockers
|
|
15033
15186
|
|
|
@@ -16392,18 +16545,7 @@ var config_default66 = `{
|
|
|
16392
16545
|
`;
|
|
16393
16546
|
|
|
16394
16547
|
// templates/workflows/claude-code-changelog-watch/content.md
|
|
16395
|
-
var content_default66 =
|
|
16396
|
-
|
|
16397
|
-
This topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow's nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.
|
|
16398
|
-
|
|
16399
|
-
\`\`\`json
|
|
16400
|
-
{"name":"claude-code-changelog-watch","description":"Changelog watcher with deduplication: fetch, gate on a new version, publish an in-app receipt plus any configured delivery providers, then commit the version marker.","nodes":[{"id":"check","type":"swarm-script","label":"Fetch changelog + compare vs KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"check"}},"next":"gate"},{"id":"gate","type":"property-match","label":"Gate: only continue on a new version","config":{"mode":"all","conditions":[{"field":"check.result.isNew","op":"eq","value":true}]},"next":{"true":"post"}},{"id":"post","type":"agent-task","label":"Post new version to Slack","config":{"model":"sonnet","tags":["changelog","claude-code","workflow"],"priority":50,"template":"**Claude Code new version announcement**\\n\\nA new Claude Code version was detected by the claude-code-changelog-watch workflow.\\n\\nNew version: {{check.result.latestVersion}} (released {{check.result.releaseDate}}, previous known: {{check.result.lastKnown}})\\n\\nRaw release notes:\\n{{check.result.section}}\\n\\nSteps:\\n1. ONE \`slack-post\` to the configured Slack notification target, **max 400 chars**:\\n\\n\`\`\`\\n:rocket: *Claude Code {{check.result.latestVersion}}* — <the one change that matters to us, one line>\\n<https://code.claude.com/docs/en/changelog|changelog>\\n\`\`\`\\n\\nRules:\\n- **One line.** Pick the single item that affects how we run the swarm (a fix we were hitting, a flag we use, a breaking change). Not 3-5 bullets.\\n- If a second item genuinely matters, one more bullet. Never more than two.\\n- **Routine release with nothing relevant to us ⇒ still post, but the one line is just the headline feature.** Never paste the release notes.\\n- No preamble, no \\"is out!\\", no per-surface breakdown (VSCode/CLI/SDK), no closing line.\\n\\n2. Complete with output \\"Posted Claude Code {{check.result.latestVersion}} to in-app activity and configured delivery providers.\\" plus the charCount.\\n\\nDo NOT update any version state — the workflow's commit node handles that after you complete. Do NOT post more than once."},"next":"commit","inputs":{"check":"check"}},{"id":"commit","type":"swarm-script","label":"Commit new version to KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"commit","version":"{{check.result.latestVersion}}"}},"inputs":{"check":"check"}}],"onNodeFailure":"fail"}
|
|
16401
|
-
\`\`\`
|
|
16402
|
-
|
|
16403
|
-
|
|
16404
|
-
|
|
16405
|
-
|
|
16406
|
-
`;
|
|
16548
|
+
var content_default66 = '# Claude Code Changelog Watch\n\nThis topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow\'s nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.\n\nPrerequisite: the `check` and `commit` nodes run the global script `claude-code-changelog-check`, which is not seeded. Author it before enabling the workflow, or every run fails at the first node.\n\n```json\n{"name":"claude-code-changelog-watch","description":"Changelog watcher with deduplication: fetch, gate on a new version, publish an in-app receipt plus any configured delivery providers, then commit the version marker.","nodes":[{"id":"check","type":"swarm-script","label":"Fetch changelog + compare vs KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"check"}},"next":"gate"},{"id":"gate","type":"property-match","label":"Gate: only continue on a new version","config":{"mode":"all","conditions":[{"field":"check.result.isNew","op":"eq","value":true}]},"next":{"true":"post"}},{"id":"post","type":"agent-task","label":"Post new version to Slack","config":{"model":"sonnet","tags":["changelog","claude-code","workflow"],"priority":50,"template":"**Claude Code new version announcement**\\n\\nA new Claude Code version was detected by the claude-code-changelog-watch workflow.\\n\\nNew version: {{check.result.latestVersion}} (released {{check.result.releaseDate}}, previous known: {{check.result.lastKnown}})\\n\\nRaw release notes:\\n{{check.result.section}}\\n\\nSteps:\\n1. ONE `slack-post` to the configured Slack notification target, **max 400 chars**:\\n\\n```\\n:rocket: *Claude Code {{check.result.latestVersion}}* — <the one change that matters to us, one line>\\n<https://code.claude.com/docs/en/changelog|changelog>\\n```\\n\\nRules:\\n- **One line.** Pick the single item that affects how we run the swarm (a fix we were hitting, a flag we use, a breaking change). Not 3-5 bullets.\\n- If a second item genuinely matters, one more bullet. Never more than two.\\n- **Routine release with nothing relevant to us ⇒ still post, but the one line is just the headline feature.** Never paste the release notes.\\n- No preamble, no \\"is out!\\", no per-surface breakdown (VSCode/CLI/SDK), no closing line.\\n\\n2. Complete with output \\"Posted Claude Code {{check.result.latestVersion}} to in-app activity and configured delivery providers.\\" plus the charCount.\\n\\nDo NOT update any version state — the workflow\'s commit node handles that after you complete. Do NOT post more than once."},"next":"commit","inputs":{"check":"check"}},{"id":"commit","type":"swarm-script","label":"Commit new version to KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"commit","version":"{{check.result.latestVersion}}"}},"inputs":{"check":"check"}}],"onNodeFailure":"fail"}\n```\n\n\n\n\n';
|
|
16407
16549
|
|
|
16408
16550
|
// templates/workflows/competitor-radar/config.json
|
|
16409
16551
|
var config_default67 = `{
|
|
@@ -16671,6 +16813,8 @@ var content_default72 = `# PR Review Status Sweep
|
|
|
16671
16813
|
|
|
16672
16814
|
This topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow's nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.
|
|
16673
16815
|
|
|
16816
|
+
Prerequisite: the \`sweep\` node runs the agent-scoped script \`pr-review-status-sweep\`, which is not seeded. Author it before enabling the workflow, or every run fails at that node.
|
|
16817
|
+
|
|
16674
16818
|
\`\`\`json
|
|
16675
16819
|
{"name":"pr-review-status-sweep","description":"Cron-triggered deterministic sweep for {{REPO_URL}} open PRs. The steady-state path is swarm-script only: enumerate non-draft PRs, run global pr-review-status, enforce KV run/per-PR leases and idempotency markers, and stay silent on clean sweeps. The single Phase A agent-task node is gated on actionableCount > 0. Phase B is disabled: no auto-push, no merge, no thread resolution.","nodes":[{"id":"sweep","type":"swarm-script","label":"Deterministic PR review action-item sweep","config":{"scriptName":"pr-review-status-sweep","scope":"agent","args":{"repo":"{{REPO_URL}}","limit":50,"phaseBEnabled":false,"slackChannelId":null,"slackThreadTs":null}},"next":"has-action-items"},{"id":"has-action-items","type":"property-match","label":"Gate: only continue when actionItems > 0","config":{"mode":"all","conditions":[{"field":"sweep.result.actionableCount","op":"gt","value":0}]},"next":{"true":"handle-action-items"}},{"id":"handle-action-items","type":"agent-task","label":"Phase A handler for unprocessed review action items","config":{"template":"{{sweep.result.handlerPrompt}}","tags":["pr-review-status","phase-a","review-action-items"],"priority":60,"dir":"/workspace/repository","vcsRepo":"{{REPO_URL}}","model":"gpt-5.5"},"inputs":{"sweep":"sweep"}}],"onNodeFailure":"fail"}
|
|
16676
16820
|
\`\`\`
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureAuthorizationTokenOrThrow,
|
|
3
3
|
listKeepAliveAuthorizations
|
|
4
|
-
} from "./cli-
|
|
5
|
-
import"./cli-
|
|
6
|
-
import"./cli-
|
|
7
|
-
import"./cli-
|
|
8
|
-
import"./cli-
|
|
9
|
-
import"./cli-19jenss3.js";
|
|
10
|
-
import"./cli-dv6cdjs2.js";
|
|
4
|
+
} from "./cli-6cs6wzxt.js";
|
|
5
|
+
import"./cli-qydf22qq.js";
|
|
6
|
+
import"./cli-3qhyh31j.js";
|
|
7
|
+
import"./cli-ktmyrtpn.js";
|
|
8
|
+
import"./cli-r1mxd1xh.js";
|
|
11
9
|
import"./cli-n7h1kqpf.js";
|
|
12
|
-
import"./cli-
|
|
13
|
-
import"./cli-
|
|
10
|
+
import"./cli-ptr8h7kp.js";
|
|
11
|
+
import"./cli-dv6cdjs2.js";
|
|
12
|
+
import"./cli-1a2j50m0.js";
|
|
13
|
+
import"./cli-0wgxmwf6.js";
|
|
14
|
+
import"./cli-ywybs5as.js";
|
|
14
15
|
import"./cli-ej6gbxfb.js";
|
|
16
|
+
import"./cli-kmcpfwn2.js";
|
|
15
17
|
import"./cli-sd0mxa3c.js";
|
|
16
18
|
import"./cli-w5e1d1vv.js";
|
|
17
|
-
import"./cli-
|
|
19
|
+
import"./cli-0q3avq3s.js";
|
|
18
20
|
import {
|
|
19
21
|
init_secret_scrubber,
|
|
20
22
|
scrubSecrets
|
|
@@ -70,7 +72,7 @@ async function notifySlack(text) {
|
|
|
70
72
|
return;
|
|
71
73
|
}
|
|
72
74
|
try {
|
|
73
|
-
const { getSlackApp } = await import("./app-
|
|
75
|
+
const { getSlackApp } = await import("./app-mc7xfagn.js");
|
|
74
76
|
const app = getSlackApp();
|
|
75
77
|
if (!app) {
|
|
76
78
|
console.warn("[OAuth Keepalive] Slack not available, cannot send notification");
|
|
@@ -1,79 +1,84 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runAgent
|
|
3
|
-
} from "./cli-
|
|
4
|
-
import"./cli-
|
|
5
|
-
import"./cli-
|
|
6
|
-
import"./cli-
|
|
7
|
-
import"./cli-
|
|
8
|
-
import"./cli-5bfdm1ah.js";
|
|
9
|
-
import"./cli-20cj37vt.js";
|
|
10
|
-
import"./cli-r94z9p1z.js";
|
|
11
|
-
import"./cli-68w09sjw.js";
|
|
3
|
+
} from "./cli-mfe5btp9.js";
|
|
4
|
+
import"./cli-shkxm1vn.js";
|
|
5
|
+
import"./cli-58e8yr0d.js";
|
|
6
|
+
import"./cli-br0qdrnp.js";
|
|
7
|
+
import"./cli-jyk0ynw2.js";
|
|
12
8
|
import"./cli-hsxj0yar.js";
|
|
13
|
-
import"./cli-
|
|
14
|
-
import"./cli-
|
|
9
|
+
import"./cli-89v6kyq7.js";
|
|
10
|
+
import"./cli-pm1rst0h.js";
|
|
11
|
+
import"./cli-r94z9p1z.js";
|
|
12
|
+
import"./cli-gt4hxb8p.js";
|
|
13
|
+
import"./cli-5bfdm1ah.js";
|
|
14
|
+
import"./cli-phsaj4xq.js";
|
|
15
15
|
import"./cli-j490egb5.js";
|
|
16
|
-
import"./cli-
|
|
17
|
-
import"./cli-
|
|
18
|
-
import"./cli-
|
|
19
|
-
import"./cli-tng3131n.js";
|
|
16
|
+
import"./cli-jayjpjmb.js";
|
|
17
|
+
import"./cli-f8gy6r2r.js";
|
|
18
|
+
import"./cli-btfv8y88.js";
|
|
20
19
|
import"./cli-q2j38vre.js";
|
|
21
|
-
import"./cli-
|
|
22
|
-
import"./cli-cw9zck8j.js";
|
|
23
|
-
import"./cli-0xjkj1j7.js";
|
|
20
|
+
import"./cli-xjcywfsf.js";
|
|
24
21
|
import"./cli-hp1n6zq3.js";
|
|
22
|
+
import"./cli-tng3131n.js";
|
|
23
|
+
import"./cli-zm7njwzd.js";
|
|
24
|
+
import"./cli-74h9hscv.js";
|
|
25
25
|
import"./cli-eree7rnv.js";
|
|
26
|
-
import"./cli-
|
|
27
|
-
import"./cli-
|
|
26
|
+
import"./cli-2pdaysab.js";
|
|
27
|
+
import"./cli-4derpgyk.js";
|
|
28
28
|
import {
|
|
29
29
|
getEnabledCapabilities
|
|
30
|
-
} from "./cli-
|
|
30
|
+
} from "./cli-9hsgwz4w.js";
|
|
31
31
|
import"./cli-0z2v4nhw.js";
|
|
32
|
-
import"./cli-
|
|
33
|
-
import"./cli-vhjwh6cz.js";
|
|
32
|
+
import"./cli-cpvsaqsw.js";
|
|
34
33
|
import"./cli-re8z5p8p.js";
|
|
35
|
-
import"./cli-
|
|
36
|
-
import"./cli-
|
|
37
|
-
import"./cli-
|
|
38
|
-
import"./cli-
|
|
39
|
-
import"./cli-
|
|
40
|
-
import"./cli-
|
|
41
|
-
import"./cli-fgqxwrpv.js";
|
|
34
|
+
import"./cli-jsp14b6c.js";
|
|
35
|
+
import"./cli-tzx2ke1v.js";
|
|
36
|
+
import"./cli-tmqt7dpj.js";
|
|
37
|
+
import"./cli-tfky2838.js";
|
|
38
|
+
import"./cli-vctdqs5h.js";
|
|
39
|
+
import"./cli-tpq83z89.js";
|
|
42
40
|
import"./cli-epan13p1.js";
|
|
43
41
|
import"./cli-y89t4nca.js";
|
|
44
42
|
import"./cli-f14fvzag.js";
|
|
45
|
-
import"./cli-
|
|
46
|
-
import"./cli-
|
|
47
|
-
import"./cli-
|
|
48
|
-
import"./cli-
|
|
49
|
-
import"./cli-
|
|
50
|
-
import"./cli-
|
|
43
|
+
import"./cli-12tszpk9.js";
|
|
44
|
+
import"./cli-ygwm91nt.js";
|
|
45
|
+
import"./cli-3dpj7atn.js";
|
|
46
|
+
import"./cli-10nhj6xq.js";
|
|
47
|
+
import"./cli-rb9m6rpe.js";
|
|
48
|
+
import"./cli-rykfmgwg.js";
|
|
49
|
+
import"./cli-0jwe9034.js";
|
|
50
|
+
import"./cli-6cs6wzxt.js";
|
|
51
51
|
import"./cli-fad8m16k.js";
|
|
52
|
+
import"./cli-jz4w45qt.js";
|
|
53
|
+
import"./cli-25fcq4b4.js";
|
|
54
|
+
import"./cli-bsakbbkm.js";
|
|
55
|
+
import"./cli-trc24wk2.js";
|
|
52
56
|
import"./cli-51tf7ac3.js";
|
|
53
|
-
import"./cli-
|
|
54
|
-
import"./cli-j57qkrpq.js";
|
|
57
|
+
import"./cli-azhgzetg.js";
|
|
55
58
|
import"./cli-q51yprfq.js";
|
|
56
59
|
import"./cli-3er6gcsn.js";
|
|
57
60
|
import"./cli-2658f6at.js";
|
|
58
61
|
import"./cli-yatxqynm.js";
|
|
59
|
-
import"./cli-
|
|
60
|
-
import"./cli-
|
|
61
|
-
import"./cli-
|
|
62
|
-
import"./cli-
|
|
63
|
-
import"./cli-19jenss3.js";
|
|
64
|
-
import"./cli-dv6cdjs2.js";
|
|
62
|
+
import"./cli-qydf22qq.js";
|
|
63
|
+
import"./cli-3qhyh31j.js";
|
|
64
|
+
import"./cli-ktmyrtpn.js";
|
|
65
|
+
import"./cli-r1mxd1xh.js";
|
|
65
66
|
import"./cli-n7h1kqpf.js";
|
|
66
|
-
import"./cli-
|
|
67
|
-
import"./cli-
|
|
67
|
+
import"./cli-ptr8h7kp.js";
|
|
68
|
+
import"./cli-dv6cdjs2.js";
|
|
69
|
+
import"./cli-1a2j50m0.js";
|
|
70
|
+
import"./cli-0wgxmwf6.js";
|
|
71
|
+
import"./cli-ywybs5as.js";
|
|
68
72
|
import"./cli-ej6gbxfb.js";
|
|
73
|
+
import"./cli-kmcpfwn2.js";
|
|
69
74
|
import"./cli-sd0mxa3c.js";
|
|
70
75
|
import"./cli-w5e1d1vv.js";
|
|
71
|
-
import"./cli-
|
|
76
|
+
import"./cli-0q3avq3s.js";
|
|
72
77
|
import"./cli-r2ap2czm.js";
|
|
73
|
-
import"./cli-
|
|
78
|
+
import"./cli-13hw4z91.js";
|
|
74
79
|
import"./cli-btbzvq95.js";
|
|
75
80
|
import"./cli-1m2e086m.js";
|
|
76
|
-
import"./cli-
|
|
81
|
+
import"./cli-ykk5jaax.js";
|
|
77
82
|
import"./cli-bzr0ftht.js";
|
|
78
83
|
import"./cli-bd957dgb.js";
|
|
79
84
|
import"./cli-pzxba7gw.js";
|