@desplega.ai/agent-swarm 1.165.0 → 1.167.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/dist/acp-adapter-zpvy6321.js +34 -0
- package/dist/{actions-jna0b3wm.js → actions-fq2zrwtf.js} +30 -34
- package/dist/{amp-adapter-0eve81pz.js → amp-adapter-5gbk7501.js} +7 -7
- package/dist/{anthropic-messages-hst62ws9.js → anthropic-messages-13yn502s.js} +4 -4
- package/dist/{app-75hm5cfa.js → app-nctetn1e.js} +11 -11
- package/dist/{assistant-yzd51j33.js → assistant-0aq8gjvj.js} +31 -35
- package/dist/{azure-openai-responses-mh8tvf78.js → azure-openai-responses-9st34pfz.js} +5 -5
- package/dist/{boot-reembed-z158xq32.js → boot-reembed-1ze5853n.js} +14 -16
- package/dist/{boot-reembed-2ex2mcsh.js → boot-reembed-fmp5ww69.js} +15 -16
- package/dist/boot-scrub-sweep-cbp8xd4e.js +212 -0
- package/dist/{boot-seeds-2bmnh18p.js → boot-seeds-22tx8a53.js} +13 -12
- package/dist/{claude-adapter-jbj1mycz.js → claude-adapter-0jhgeh1d.js} +25 -25
- package/dist/{claude-managed-adapter-17ggz09t.js → claude-managed-adapter-tzwxy803.js} +5 -5
- package/dist/{claude-managed-setup-ptm1nzm2.js → claude-managed-setup-nrhfx5b0.js} +5 -5
- package/dist/{claude-sdk-session-9re1g7r2.js → claude-sdk-session-wh77rh83.js} +2632 -2614
- package/dist/{cli-zsh093hk.js → cli-014vns2y.js} +63 -1
- package/dist/{cli-qvfk83fy.js → cli-13xwcqvj.js} +2 -2
- package/dist/{cli-8gpbwy09.js → cli-1yrcfa5s.js} +5 -5
- package/dist/{cli-xtgtyafv.js → cli-577bxkf6.js} +212 -451
- package/dist/{cli-ma3zvh39.js → cli-5qkcdv8c.js} +6118 -5874
- package/dist/{cli-cwxhbf43.js → cli-5t5my0h8.js} +85 -2
- package/dist/{cli-zvckv750.js → cli-69egj654.js} +2 -2
- package/dist/{cli-9xb89xca.js → cli-6bpvv8h4.js} +9 -9
- package/dist/{cli-90v942q1.js → cli-6qxmjpem.js} +8 -8
- package/dist/{cli-9866bd07.js → cli-6vfz44sr.js} +1 -1
- package/dist/{cli-32bca7nr.js → cli-7avy4v8w.js} +1 -1
- package/dist/{cli-xb3c6aat.js → cli-7mhy3ths.js} +21 -18
- package/dist/{cli-q38n4bq0.js → cli-95zs84qw.js} +3 -3
- package/dist/cli-a35hzdve.js +33 -0
- package/dist/{cli-x3x0qwky.js → cli-bxqez1p0.js} +51 -23
- package/dist/{cli-prt9emct.js → cli-c2tpw9ck.js} +3 -3
- package/dist/{cli-0n4fasz0.js → cli-c8r99akr.js} +16 -16
- package/dist/{cli-5anb0ev3.js → cli-cexctgn5.js} +89 -26
- package/dist/{cli-bns5c8k9.js → cli-cf2vgn9d.js} +105 -91
- package/dist/{cli-ng97fjq7.js → cli-cmxkbzzs.js} +33 -7
- package/dist/{cli-nexwh8zg.js → cli-g7k7zbcz.js} +12 -5
- package/dist/{cli-mmzwwptd.js → cli-hf5s9pgf.js} +1 -1
- package/dist/{cli-nvvfd8bq.js → cli-jbzbr36n.js} +4091 -3793
- package/dist/{cli-zn2v3t8v.js → cli-jvmtxqtc.js} +27 -15
- package/dist/{cli-pkke6geq.js → cli-km4x66j0.js} +83 -65
- package/dist/cli-kw0jcfje.js +516 -0
- package/dist/{cli-28smfvbn.js → cli-m7vmeepg.js} +32 -19
- package/dist/{cli-hpryr6em.js → cli-mb75wpxf.js} +1 -1
- package/dist/{cli-qdv8kgz7.js → cli-mkdsy1nq.js} +14018 -3333
- package/dist/{cli-b0f70z24.js → cli-mn8qkd8v.js} +1 -1
- package/dist/{cli-420bdgw0.js → cli-mv2520nm.js} +1 -1
- package/dist/{cli-n9ehc28t.js → cli-mxry91sa.js} +31 -10
- package/dist/{cli-wfajtmf7.js → cli-mxvnnv5q.js} +596 -13
- package/dist/cli-nkqjj42q.js +104 -0
- package/dist/{cli-e7t4snpa.js → cli-p8rt8spp.js} +5 -5
- package/dist/{cli-gh5yqzpe.js → cli-pkj1w46r.js} +12 -7
- package/dist/cli-q1vnz8wv.js +96 -0
- package/dist/{cli-fj86xr3c.js → cli-qd97v6z2.js} +2 -2
- package/dist/{cli-ba66wyhy.js → cli-qzmzwegq.js} +60 -20
- package/dist/{cli-5b2fjjzh.js → cli-r7eeddkq.js} +14 -9
- package/dist/{cli-8ssjez7e.js → cli-rhy7z1rp.js} +22 -11
- package/dist/{cli-4mevd1hf.js → cli-s9y81s7j.js} +5 -5
- package/dist/{cli-59jn5twa.js → cli-tc5zec7v.js} +7 -7
- package/dist/{cli-ttbsse3f.js → cli-tmhsxhb8.js} +1 -1
- package/dist/{cli-k6xx3pve.js → cli-tx2zvn23.js} +4 -4
- package/dist/{cli-pjxnr1jn.js → cli-ty4bzkqr.js} +5 -5
- package/dist/{cli-nfygw434.js → cli-v1pwxreq.js} +55 -52
- package/dist/{cli-ftry7975.js → cli-v1w7pbd8.js} +3 -2
- package/dist/{cli-10zmp1p7.js → cli-vr5avem2.js} +27 -32
- package/dist/{cli-bzr0ftht.js → cli-wnb9b2g3.js} +19 -0
- package/dist/cli-wt7ccy4r.js +2654 -0
- package/dist/{cli-50eg13rj.js → cli-wydz3feg.js} +549 -321
- package/dist/{cli-krqm5f11.js → cli-xezn9nkh.js} +16 -13
- package/dist/{cli-8kt0bmgx.js → cli-xf713zz0.js} +2 -2
- package/dist/{cli-x7afk5wm.js → cli-xvc3q9br.js} +1 -1
- package/dist/{cli-9s3h836g.js → cli-xvdgasgy.js} +1 -1
- package/dist/{cli-j0pdrmwg.js → cli-y0kjpfm9.js} +3 -3
- package/dist/{cli-6zcfw0x7.js → cli-y195hv1a.js} +1 -1
- package/dist/{cli-amwhs8h2.js → cli-ykt8f7va.js} +22 -9
- package/dist/{cli-1kzfvd1z.js → cli-ymmc1zxg.js} +15 -11
- package/dist/{cli-xnzrzets.js → cli-ypgba1a8.js} +2 -2
- package/dist/{cli-bdv39kgj.js → cli-z1dqhc9y.js} +31 -20
- package/dist/{cli-fw6vdcq5.js → cli-zp67qg5x.js} +34 -1
- package/dist/{cli-qbksc292.js → cli-zy39d433.js} +2 -0
- package/dist/cli.js +36 -32
- package/dist/{cloudflare-workers-ai-system-one-tt484t61.js → cloudflare-workers-ai-system-one-sta45jf9.js} +7 -5
- package/dist/{codex-adapter-3qnxshje.js → codex-adapter-cgesnjkr.js} +20 -20
- package/dist/{codex-login-brkxhhdg.js → codex-login-g1cyt5zm.js} +2 -2
- package/dist/{codex-session-runner-612wnapp.js → codex-session-runner-8kd7ddhr.js} +20 -20
- package/dist/{commands-2ybfcxkj.js → commands-h6zaaxym.js} +11 -10
- package/dist/{cursor-adapter-p3jgdehv.js → cursor-adapter-v8mm6bp5.js} +7 -7
- package/dist/{db-f4ans0jj.js → db-qg3myn53.js} +13 -10
- package/dist/{devin-adapter-dhzt01ff.js → devin-adapter-bffjj5n4.js} +2 -2
- package/dist/{dispatcher-pk182apd.js → dispatcher-7vnwj9qw.js} +28 -32
- package/dist/{dsh-adapter-7twaeps1.js → dsh-adapter-tz6hfp5r.js} +7 -7
- package/dist/{e2b-y8t3jzyz.js → e2b-nd50eccg.js} +1 -1
- package/dist/{easter-egg-3d-mtpnw06s.js → easter-egg-3d-66zxervv.js} +2 -2
- package/dist/{event-bus-w7ac4n3c.js → event-bus-vnfthafg.js} +2 -2
- package/dist/{execute-s4ccjq3n.js → execute-h4jgevyw.js} +61 -11
- package/dist/{google-generative-ai-d6nphg3q.js → google-generative-ai-b8zxrpax.js} +5 -5
- package/dist/{google-vertex-cpshkref.js → google-vertex-nrdd697t.js} +5 -5
- package/dist/grok-adapter-jdt2dz2s.js +39 -0
- package/dist/{handlers-g2wnr4t9.js → handlers-2qtkpncr.js} +31 -35
- package/dist/{hook-f7jt9vnm.js → hook-51yfcgsv.js} +48 -39
- package/dist/{hook-bbdpnkb4.js → hook-qnbdgwvd.js} +15 -17
- package/dist/{http-w40q4w94.js → http-jsmtag08.js} +536 -231
- package/dist/{index-056j5kzn.js → index-2t9kesn1.js} +13 -12
- package/dist/{index-cj1r9q83.js → index-bt8wkv1w.js} +29 -33
- package/dist/{index-7n70jwbb.js → index-cx1sb9bq.js} +42 -35
- package/dist/{index-9bfssf54.js → index-ekywyv2v.js} +28 -32
- package/dist/{index-fdk1t4d6.js → index-n0rxa4ca.js} +11962 -9900
- package/dist/{index-k8xc083e.js → index-t4g06w93.js} +28 -32
- package/dist/{keepalive-1tj10tf4.js → keepalive-4aezx4bj.js} +16 -12
- package/dist/{lead-st0bg7v4.js → lead-r44bkpm5.js} +52 -56
- package/dist/{llama-cpp-classify-tgj35k8d.js → llama-cpp-classify-6erb7wwv.js} +3 -1
- package/dist/{maintenance-nz71zats.js → maintenance-grz5jrzh.js} +12 -13
- package/dist/{mistral-conversations-8445ddjn.js → mistral-conversations-059y51zt.js} +4 -4
- package/dist/{node-f0ykebbv.js → node-qm9eb6z0.js} +25 -7
- package/dist/{oauth-refresh-sweep-aefzwvvq.js → oauth-refresh-sweep-wm4ctjfj.js} +15 -11
- package/dist/{onboard-kgpr9mbn.js → onboard-v60zgqf0.js} +2 -2
- package/dist/{openai-codex-responses-9ynm88zy.js → openai-codex-responses-jzxkta9b.js} +8 -7
- package/dist/{openai-completions-nhqwjmaw.js → openai-completions-663yncfq.js} +4 -4
- package/dist/openai-decisions-vj9nkpf8.js +162 -0
- package/dist/{openai-responses-xx1c4kgm.js → openai-responses-m3g43rrt.js} +5 -5
- package/dist/{opencode-adapter-0c8e70dk.js → opencode-adapter-yjyqynzf.js} +8 -8
- package/dist/{openrouter-images-8yx3487g.js → openrouter-images-kr60n6b9.js} +1 -1
- package/dist/{otel-impl-x8zp4y5a.js → otel-impl-ghh4dyf8.js} +2 -2
- package/dist/{pi-messages-vxdt8v7j.js → pi-messages-xszk613n.js} +1 -1
- package/dist/{pi-mono-adapter-t280ah5c.js → pi-mono-adapter-0eg8kw2c.js} +69 -52
- package/dist/{pricing-refresh-9e0q7cwk.js → pricing-refresh-mjrqvnvw.js} +12 -11
- package/dist/{rbac-roles-790j3ga8.js → rbac-roles-axv4d74x.js} +11 -10
- package/dist/{rbac-roles-kcp6zge2.js → rbac-roles-fd5tskj9.js} +11 -10
- package/dist/{render-v2-tch4nefj.js → render-v2-k50j33qd.js} +11 -11
- package/dist/{runtime-v2t1r79e.js → runtime-h9ha1mq6.js} +4 -4
- package/dist/{setup-rcm303ns.js → setup-4syh0pd2.js} +2 -2
- package/dist/{typesafe-system-one-datfr82p.js → typesafe-system-one-e988vty7.js} +7 -5
- package/dist/{virtual-modules-wm8mxdxx.js → virtual-modules-ftr9kwe8.js} +11 -11
- package/dist/{work-objects-ctg7t70w.js → work-objects-jcdbg8rr.js} +32 -36
- package/dist/{worker-5dp0xm55.js → worker-x8j8c9sx.js} +52 -56
- package/dist/{x-v3yw66zs.js → x-ma4gnfgy.js} +2 -2
- package/openapi.json +5 -2
- package/package.json +15 -11
- package/src/be/automation-preflight.ts +9 -4
- package/src/be/boot-scrub-sweep.ts +302 -0
- package/src/be/crypto/key-bootstrap.ts +1 -1
- package/src/be/db/approvals.ts +15 -1
- package/src/be/db/codex-oauth-device-flows.ts +40 -0
- package/src/be/db/config-secrets.ts +31 -0
- package/src/be/db/runtime.ts +4 -0
- package/src/be/db/script-runs.ts +15 -0
- package/src/be/db/tasks/write.ts +1 -1
- package/src/be/db-queries/mcp-oauth.ts +5 -0
- package/src/be/db-queries/oauth.ts +77 -0
- package/src/be/db.ts +162 -59
- package/src/be/events.ts +17 -1
- package/src/be/memory/index-content.ts +2 -2
- package/src/be/memory/providers/openai-embedding.ts +7 -2
- package/src/be/memory/providers/sqlite-store.ts +63 -11
- package/src/be/memory/raters/llm-summarizer.ts +7 -2
- package/src/be/memory/types.ts +14 -0
- package/src/be/migrations/201_workflow_replay_columns.sql +10 -0
- package/src/be/migrations/202_codex_oauth_device_flows.sql +24 -0
- package/src/be/modelsdev-cache.json +61 -0
- package/src/be/scripts/db.ts +28 -4
- package/src/be/scripts/source-secrets.ts +37 -0
- package/src/be/scrub-json.ts +32 -0
- package/src/be/sealed-json.ts +59 -0
- package/src/be/secret-registry.ts +131 -0
- package/src/be/seed-pricing.ts +84 -53
- package/src/be/swarm-config-guard.ts +13 -0
- package/src/be/workflow-replay.ts +77 -0
- package/src/commands/provider-credentials.ts +28 -5
- package/src/commands/runner.ts +7 -12
- package/src/heartbeat/heartbeat.ts +91 -19
- package/src/hooks/hook.ts +72 -27
- package/src/http/codex-oauth-device.ts +8 -10
- package/src/http/db-query-bounded.ts +3 -0
- package/src/http/db-query-shared.ts +107 -15
- package/src/http/db-query.ts +10 -2
- package/src/http/index.ts +23 -6
- package/src/http/mcp.ts +5 -0
- package/src/http/onboarding.ts +2 -0
- package/src/http/script-runs.ts +9 -1
- package/src/http/scripts.ts +15 -0
- package/src/http/workflows.ts +3 -2
- package/src/oauth/mcp-wrapper.ts +1 -1
- package/src/providers/acp-adapter.ts +25 -11
- package/src/providers/acp-target-catalog.ts +35 -1
- package/src/providers/acp-targets.ts +78 -7
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +26 -0
- package/src/providers/codex-adapter.ts +30 -3
- package/src/providers/codex-oauth/auth-json.ts +21 -4
- package/src/providers/codex-oauth/types.ts +2 -0
- package/src/providers/cursor-adapter.ts +1 -1
- package/src/providers/dsh-adapter.ts +10 -1
- package/src/providers/grok-adapter.ts +18 -2
- package/src/providers/opencode-adapter.ts +21 -5
- package/src/providers/pi-mono-extension.ts +56 -25
- package/src/providers/pricing-sources.md +2 -0
- package/src/script-workflows/supervisor.ts +11 -2
- package/src/scripts-runtime/eval-harness.ts +2 -12
- package/src/scripts-runtime/executors/quickjs-bundle.ts +152 -0
- package/src/scripts-runtime/executors/quickjs-prelude.ts +285 -0
- package/src/scripts-runtime/executors/quickjs-runner.ts +580 -0
- package/src/scripts-runtime/executors/quickjs-worker.ts +81 -0
- package/src/scripts-runtime/executors/quickjs.ts +196 -0
- package/src/scripts-runtime/executors/registry.ts +2 -0
- package/src/scripts-runtime/executors/sourcemap.ts +79 -0
- package/src/scripts-runtime/script-error-hints.ts +14 -0
- package/src/server.ts +66 -4
- package/src/tests/acp-adapter.test.ts +277 -12
- package/src/tests/boot-scrub-sweep.test.ts +390 -0
- package/src/tests/check-text-columns.test.ts +145 -0
- package/src/tests/ci-unit-test-report.test.ts +73 -0
- package/src/tests/claude-default-route.test.ts +75 -0
- package/src/tests/claude-hook-output.test.ts +233 -0
- package/src/tests/claude-sdk-process.fixture.ts +13 -2
- package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +4 -2
- package/src/tests/codex-adapter.test.ts +166 -26
- package/src/tests/codex-oauth-auth-timestamps.test.ts +76 -0
- package/src/tests/codex-oauth-device.test.ts +23 -37
- package/src/tests/codex-oauth.test.ts +4 -1
- package/src/tests/context-window.test.ts +2 -2
- package/src/tests/credential-check.test.ts +51 -1
- package/src/tests/db-query-denylist.test.ts +202 -0
- package/src/tests/db-task-read-contract.test.ts +1 -0
- package/src/tests/db-task-write-contract.test.ts +1 -0
- package/src/tests/dsh-adapter.test.ts +23 -1
- package/src/tests/enabled-tools.test.ts +269 -0
- package/src/tests/entrypoint-acp-target-binary.test.ts +31 -1
- package/src/tests/entrypoint-codex-oauth-seed.test.ts +12 -0
- package/src/tests/events-scrub.test.ts +88 -0
- package/src/tests/fixtures/secret-corpus.ts +320 -0
- package/src/tests/grok-adapter.test.ts +13 -0
- package/src/tests/haiku-5-5-pricing.test.ts +38 -0
- package/src/tests/heartbeat-checklist.test.ts +158 -1
- package/src/tests/onboarding.test.ts +44 -0
- package/src/tests/opencode-adapter.test.ts +66 -3
- package/src/tests/opencode-plugin.test.ts +37 -0
- package/src/tests/openrouter-attribution-call-sites.test.ts +204 -0
- package/src/tests/openrouter-base-url.test.ts +30 -39
- package/src/tests/pi-mono-extension.test.ts +161 -2
- package/src/tests/pricing-refresh.test.ts +70 -1
- package/src/tests/reasoning-effort.test.ts +3 -1
- package/src/tests/script-connections.test.ts +5 -0
- package/src/tests/script-executor-conformance.test.ts +3 -0
- package/src/tests/script-executor-quickjs.test.ts +442 -0
- package/src/tests/script-executor-registry.test.ts +6 -1
- package/src/tests/script-runs-http.test.ts +88 -1
- package/src/tests/script-runs-scrub.test.ts +275 -0
- package/src/tests/scripts-http.test.ts +82 -1
- package/src/tests/scrubbed-text-12e.test.ts +289 -0
- package/src/tests/sealed-key-guard.test.ts +166 -0
- package/src/tests/secret-canary-sweep.test.ts +958 -0
- package/src/tests/secret-registry.test.ts +355 -0
- package/src/tests/secret-rules.test.ts +230 -0
- package/src/tests/secret-scrubber.test.ts +3 -2
- package/src/tests/telemetry-trigger.test.ts +12 -1
- package/src/tests/workflow-llm.test.ts +14 -0
- package/src/tests/workflow-replay.test.ts +518 -0
- package/src/tests/workflow-scrub.test.ts +242 -0
- package/src/tests/workflow-system-one-decision-providers.test.ts +33 -0
- package/src/tools/db-query.ts +1 -1
- package/src/tools/inject-learning.ts +1 -1
- package/src/tools/request-human-input.ts +7 -2
- package/src/tools/workflows/get-workflow-run.ts +3 -2
- package/src/types.ts +1 -1
- package/src/utils/enabled-tools.ts +27 -0
- package/src/utils/internal-ai/complete-structured.ts +11 -3
- package/src/utils/openrouter-base-url.ts +23 -0
- package/src/utils/secret-rules.generated.ts +2055 -0
- package/src/utils/secret-scrubber.ts +363 -29
- package/src/workflows/engine.ts +39 -4
- package/src/workflows/executors/raw-llm.ts +1 -0
- package/src/workflows/executors/system-one-decision.ts +2 -0
- package/src/workflows/executors/validate.ts +1 -0
- package/src/workflows/executors/workflow-llm.ts +9 -2
- package/src/workflows/recovery.ts +10 -1
- package/src/workflows/resume.ts +62 -3
- package/src/workflows/retry-poller.ts +3 -0
- package/templates/skills/agent-browser/SKILL.md +2 -0
- package/templates/skills/agent-browser/content.md +2 -0
- package/templates/skills/code-quality/content.md +1 -0
- package/templates/skills/heartbeat-runbook/content.md +1 -1
- package/templates/skills/work-on-task/SKILL.md +4 -0
- package/templates/skills/work-on-task/content.md +4 -0
- package/templates/skills/workflow-iterate/content.md +9 -0
- package/dist/acp-adapter-w6zws6me.js +0 -23
- package/dist/boot-scrub-logs-246yn076.js +0 -99
- package/dist/cli-3a4m1aws.js +0 -572
- package/dist/cli-3dpj7atn.js +0 -11
- package/dist/cli-a87b04k8.js +0 -951
- package/dist/cli-cvk6yzw5.js +0 -40
- package/dist/cli-gvcgmx69.js +0 -183
- package/dist/cli-h1spv8v4.js +0 -427
- package/dist/cli-jqt9hrnz.js +0 -168
- package/dist/cli-yhmwmv0g.js +0 -9281
- package/dist/grok-adapter-yt9pab3k.js +0 -29
- package/src/be/boot-scrub-logs.ts +0 -132
- package/dist/{codex-hook-d2rkvf39.js → codex-hook-15dgc4cb.js} +1 -1
package/src/workflows/resume.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
updateWorkflowRun,
|
|
18
18
|
updateWorkflowRunStep,
|
|
19
19
|
} from "../be/db";
|
|
20
|
+
import type { WaitStateRow } from "../types";
|
|
20
21
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
21
22
|
import {
|
|
22
23
|
type ApprovalSlackClient,
|
|
@@ -26,7 +27,7 @@ import { shapeApprovalResolution } from "./approval-resolution";
|
|
|
26
27
|
import { loadCompletedStepRouting } from "./completed-step-routing";
|
|
27
28
|
import { FAILED_TASK_OUTPUT_PREFIX } from "./constants";
|
|
28
29
|
import { getNextTargets } from "./definition";
|
|
29
|
-
import { findReadyNodes, hasRunningStep, walkGraph } from "./engine";
|
|
30
|
+
import { failRunOnUnreadableReplay, findReadyNodes, hasRunningStep, walkGraph } from "./engine";
|
|
30
31
|
import type { WorkflowEventBus } from "./event-bus";
|
|
31
32
|
import { workflowEventBus } from "./event-bus";
|
|
32
33
|
import type { ExecutorRegistry } from "./executors/registry";
|
|
@@ -127,6 +128,23 @@ export function setupWorkflowResumeListener(
|
|
|
127
128
|
};
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Run one live resume of a waiting step. A sealed replay copy that cannot be
|
|
133
|
+
* opened fails the step and its run now, instead of logging and leaving the
|
|
134
|
+
* run `waiting` until a recovery sweep. Any other error rethrows.
|
|
135
|
+
*/
|
|
136
|
+
async function failClosedOnUnreadableReplay(
|
|
137
|
+
runId: string,
|
|
138
|
+
stepId: string,
|
|
139
|
+
resume: () => Promise<void>,
|
|
140
|
+
): Promise<void> {
|
|
141
|
+
try {
|
|
142
|
+
await resume();
|
|
143
|
+
} catch (err) {
|
|
144
|
+
if (!(await failRunOnUnreadableReplay(runId, err, stepId))) throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
130
148
|
/**
|
|
131
149
|
* Resume a workflow after a linked task completes.
|
|
132
150
|
*
|
|
@@ -138,6 +156,15 @@ export function setupWorkflowResumeListener(
|
|
|
138
156
|
async function resumeFromTaskCompletion(
|
|
139
157
|
event: TaskEvent,
|
|
140
158
|
registry: ExecutorRegistry,
|
|
159
|
+
): Promise<void> {
|
|
160
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
161
|
+
resumeFromTaskCompletionUnguarded(event, registry),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function resumeFromTaskCompletionUnguarded(
|
|
166
|
+
event: TaskEvent,
|
|
167
|
+
registry: ExecutorRegistry,
|
|
141
168
|
): Promise<void> {
|
|
142
169
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
143
170
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -245,6 +272,17 @@ async function handleTaskFailure(
|
|
|
245
272
|
reason: string,
|
|
246
273
|
registry: ExecutorRegistry,
|
|
247
274
|
options: { retryable: boolean },
|
|
275
|
+
): Promise<void> {
|
|
276
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
277
|
+
handleTaskFailureUnguarded(event, reason, registry, options),
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
async function handleTaskFailureUnguarded(
|
|
282
|
+
event: TaskEvent,
|
|
283
|
+
reason: string,
|
|
284
|
+
registry: ExecutorRegistry,
|
|
285
|
+
options: { retryable: boolean },
|
|
248
286
|
): Promise<void> {
|
|
249
287
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
250
288
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -541,6 +579,15 @@ export async function cancelWorkflowRunStep(
|
|
|
541
579
|
async function resumeFromApprovalResolution(
|
|
542
580
|
event: ApprovalEvent,
|
|
543
581
|
registry: ExecutorRegistry,
|
|
582
|
+
): Promise<void> {
|
|
583
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
584
|
+
resumeFromApprovalResolutionUnguarded(event, registry),
|
|
585
|
+
);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
async function resumeFromApprovalResolutionUnguarded(
|
|
589
|
+
event: ApprovalEvent,
|
|
590
|
+
registry: ExecutorRegistry,
|
|
544
591
|
): Promise<void> {
|
|
545
592
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
546
593
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -551,8 +598,6 @@ async function resumeFromApprovalResolution(
|
|
|
551
598
|
const workflow = await getWorkflow(run.workflowId);
|
|
552
599
|
if (!workflow) return;
|
|
553
600
|
|
|
554
|
-
const ctx = (run.context ?? {}) as Record<string, unknown>;
|
|
555
|
-
|
|
556
601
|
if (event.status === "cancelled") {
|
|
557
602
|
console.warn(
|
|
558
603
|
`[workflows] approval ${event.requestId} is cancelled; step ${event.workflowRunStepId} stays waiting for the run cancel path`,
|
|
@@ -560,6 +605,10 @@ async function resumeFromApprovalResolution(
|
|
|
560
605
|
return;
|
|
561
606
|
}
|
|
562
607
|
|
|
608
|
+
// Opens the sealed replay context: after the cancelled bail-out, which leaves
|
|
609
|
+
// the step to the run cancel path.
|
|
610
|
+
const ctx = (run.context ?? {}) as Record<string, unknown>;
|
|
611
|
+
|
|
563
612
|
// Output and port for the approval status. A step parked by an executor other
|
|
564
613
|
// than human-in-the-loop shapes its own (see shapeApprovalResolution).
|
|
565
614
|
const { output: stepOutput, nextPort } = shapeApprovalResolution(
|
|
@@ -643,7 +692,17 @@ export async function resumeWaitState(
|
|
|
643
692
|
if (!result.updated || !result.row) return;
|
|
644
693
|
|
|
645
694
|
const waitRow = result.row;
|
|
695
|
+
await failClosedOnUnreadableReplay(waitRow.workflowRunId, waitRow.workflowRunStepId, () =>
|
|
696
|
+
resumeClaimedWait(waitRow, status, cappedPayload, registry),
|
|
697
|
+
);
|
|
698
|
+
}
|
|
646
699
|
|
|
700
|
+
async function resumeClaimedWait(
|
|
701
|
+
waitRow: WaitStateRow,
|
|
702
|
+
status: "fired" | "timeout",
|
|
703
|
+
cappedPayload: unknown,
|
|
704
|
+
registry: ExecutorRegistry,
|
|
705
|
+
): Promise<void> {
|
|
647
706
|
// 2. Load the surrounding run + step. If anything has moved on (cancelled,
|
|
648
707
|
// failed, retried, etc.), stay quiet.
|
|
649
708
|
const run = await getWorkflowRun(waitRow.workflowRunId);
|
|
@@ -11,6 +11,7 @@ import { checkpointStep, checkpointStepFailure, checkpointStepWaiting } from "./
|
|
|
11
11
|
import { getSuccessors, resolveValidationPort } from "./definition";
|
|
12
12
|
import {
|
|
13
13
|
buildNodeInterpolationCtx,
|
|
14
|
+
failRunOnUnreadableReplay,
|
|
14
15
|
holdWorkflowRun,
|
|
15
16
|
interpolateNodeConfig,
|
|
16
17
|
rehydrateCompletedStepOutputs,
|
|
@@ -200,11 +201,13 @@ export function startRetryPoller(registry: ExecutorRegistry, intervalMs = 5000):
|
|
|
200
201
|
}
|
|
201
202
|
} catch (err) {
|
|
202
203
|
// Execution threw — treat as failure
|
|
204
|
+
if (await failRunOnUnreadableReplay(run.id, err, step.id)) continue;
|
|
203
205
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
204
206
|
const retryPolicy = node.retry || executor.retryPolicy;
|
|
205
207
|
await checkpointStepFailure(run.id, step.id, errorMsg, step.retryCount, retryPolicy);
|
|
206
208
|
}
|
|
207
209
|
} catch (err) {
|
|
210
|
+
if (await failRunOnUnreadableReplay(step.runId, err, step.id)) continue;
|
|
208
211
|
console.error(`[workflows] Retry failed for step ${step.id}:`, err);
|
|
209
212
|
} finally {
|
|
210
213
|
release?.();
|
|
@@ -47,6 +47,8 @@ agent-browser close
|
|
|
47
47
|
|
|
48
48
|
## Recording
|
|
49
49
|
|
|
50
|
+
Pass `record start` an absolute path (`/tmp/<topic>/raw.webm`). A relative path resolves against the agent-browser daemon's cwd, not yours, and fails with `ffmpeg write failed: Broken pipe` while `doctor` stays green.
|
|
51
|
+
|
|
50
52
|
Default: 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.
|
|
51
53
|
|
|
52
54
|
Open the page first, then record the interaction:
|
|
@@ -42,6 +42,8 @@ agent-browser close
|
|
|
42
42
|
|
|
43
43
|
## Recording
|
|
44
44
|
|
|
45
|
+
Pass `record start` an absolute path (`/tmp/<topic>/raw.webm`). A relative path resolves against the agent-browser daemon's cwd, not yours, and fails with `ffmpeg write failed: Broken pipe` while `doctor` stays green.
|
|
46
|
+
|
|
45
47
|
Default: 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.
|
|
46
48
|
|
|
47
49
|
Open the page first, then record the interaction:
|
|
@@ -38,6 +38,7 @@ The Repository Guidelines carry `allowMerge` and `mergeChecks`.
|
|
|
38
38
|
|
|
39
39
|
## Review a PR
|
|
40
40
|
|
|
41
|
+
0. Re-review check. If you reviewed this PR before, compare `gh pr view <number> --json headRefOid --jq .headRefOid` with the `commit_id` of your last review (`gh api repos/<owner>/<repo>/pulls/<number>/reviews`). Same SHA: reuse that verdict, link it and stop. New SHA: review the diff since that commit, then run the full list below. If the new head merged or rebased main, also read every conflict resolution (files both sides touched), check migration numbering and order against main, grep for stale migration numbers, and confirm CI is green at the exact head you review.
|
|
41
42
|
1. CI status first, including the fork checks below before treating CI as evidence. Failing CI is a REQUEST_CHANGES. Name the failing checks in the review.
|
|
42
43
|
2. Detect a GitHub fork PR with `gh pr view <number> --json isCrossRepository --jq .isCrossRepository`.
|
|
43
44
|
3. For a GitHub fork PR, inspect held runs with `SHA=$(gh pr view <number> --json headRefOid --jq .headRefOid); gh api --paginate "repos/<owner>/<repo>/actions/runs?head_sha=$SHA" --jq '.workflow_runs[] | "\(.conclusion // .status)|\(.name)"'`; `gh pr checks` and `statusCheckRollup` can omit them.
|
|
@@ -27,7 +27,7 @@ Two kinds of sections:
|
|
|
27
27
|
|
|
28
28
|
## Handle a heartbeat-checklist task
|
|
29
29
|
|
|
30
|
-
0. Quiet check. Take the fast path when three things hold: the system status
|
|
30
|
+
0. Quiet check. Take the fast path when three things hold: every failed, stalled or reboot-interrupted task in the system status was already named in the previous heartbeat-checklist task's output (newest completed one via `get-tasks`); no mention has gone unanswered since the last heartbeat; and no tracked item in the task's runbook snapshot is at or past its date. On the fast path, run the two step 3 scripts. If they report nothing the previous heartbeat had not already triaged, complete with one line citing the previous heartbeat task id and the counts, and skip steps 1, 2 and 4-7. Anything new means continue at step 1.
|
|
31
31
|
1. Read the latest runbook. The snapshot in the task may be stale.
|
|
32
32
|
2. Prune first. Check every tracked item against its lift trigger. Remove resolved, stale, and past-date items.
|
|
33
33
|
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.
|
|
@@ -13,4 +13,8 @@ When the task names a skill (`researching`, `planning`, `implementing`), use it.
|
|
|
13
13
|
|
|
14
14
|
Finish the task with one of the four endings in your operating contract: `completed`, `defer-task`, `request-human-input`, or `failed`. Then stop.
|
|
15
15
|
|
|
16
|
+
Resuming (a resume task, or work cut by a graceful shutdown): read the parent's last progress line, then re-read live state once (PR state and head SHA, branch, `git status`) before new work. Re-run controls only if the head moved. Never redo a pushed commit or open a second PR for the same branch. Store a progress line with branch, PR number and head SHA each time you push.
|
|
17
|
+
|
|
18
|
+
Write times in replies, outputs and defer notes in the requester's timezone when the Requester Profile names one, never raw UTC.
|
|
19
|
+
|
|
16
20
|
If the user interrupts, follow their instructions. To resume, call `/work-on-task <taskId>` again.
|
|
@@ -8,4 +8,8 @@ When the task names a skill (`researching`, `planning`, `implementing`), use it.
|
|
|
8
8
|
|
|
9
9
|
Finish the task with one of the four endings in your operating contract: `completed`, `defer-task`, `request-human-input`, or `failed`. Then stop.
|
|
10
10
|
|
|
11
|
+
Resuming (a resume task, or work cut by a graceful shutdown): read the parent's last progress line, then re-read live state once (PR state and head SHA, branch, `git status`) before new work. Re-run controls only if the head moved. Never redo a pushed commit or open a second PR for the same branch. Store a progress line with branch, PR number and head SHA each time you push.
|
|
12
|
+
|
|
13
|
+
Write times in replies, outputs and defer notes in the requester's timezone when the Requester Profile names one, never raw UTC.
|
|
14
|
+
|
|
11
15
|
If the user interrupts, follow their instructions. To resume, call `/work-on-task <taskId>` again.
|
|
@@ -173,6 +173,15 @@ Afterwards, a `warnings` entry on `create-workflow` or a patch tool means the ke
|
|
|
173
173
|
- 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.
|
|
174
174
|
- 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.
|
|
175
175
|
|
|
176
|
+
### `human-in-the-loop` (how approvals render)
|
|
177
|
+
|
|
178
|
+
The same rules apply to a standalone `request-human-input` call.
|
|
179
|
+
|
|
180
|
+
- **Dashboard card.** `title` is plain text. Each question's `label` is its heading and renders as markdown. `description` renders as full markdown and is the only field that shows images, so put drafts, diffs, and logs there.
|
|
181
|
+
- **Code.** Fence code, logs, and JSON with a language (```` ```json ````): the block keeps its lines and scrolls. Fence a prose draft with no language: it wraps. A single newline outside a fence becomes a paragraph break.
|
|
182
|
+
- **Images.** Put an `http(s)` URL ending in `.png`, `.jpg`, `.jpeg`, `.gif`, or `.webp` alone on its own line in `description`, or use ``. The link must outlive the request: an expired presigned URL shows an "image unavailable" note.
|
|
183
|
+
- **Slack.** A node's `notifications` post the title, the question labels (each collapsed to one line, capped at 3000 characters in total), a Review button, and the timeout. Descriptions, options, code, and images are not shown, so the title and labels must make sense alone. `request-human-input` posts nothing to Slack: share the returned URL yourself.
|
|
184
|
+
|
|
176
185
|
### `swarm-script`
|
|
177
186
|
|
|
178
187
|
```json
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ACPAdapter,
|
|
3
|
-
applyConfiguredOptions,
|
|
4
|
-
sanitizeAcpConfigOptions,
|
|
5
|
-
toAcpMcpServers
|
|
6
|
-
} from "./cli-5anb0ev3.js";
|
|
7
|
-
import"./cli-32bca7nr.js";
|
|
8
|
-
import"./cli-tng3131n.js";
|
|
9
|
-
import"./cli-fw6vdcq5.js";
|
|
10
|
-
import"./cli-ttbsse3f.js";
|
|
11
|
-
import"./cli-dpvkp2et.js";
|
|
12
|
-
import"./cli-zt3w1cn1.js";
|
|
13
|
-
import"./cli-zsh093hk.js";
|
|
14
|
-
import"./cli-w5e1d1vv.js";
|
|
15
|
-
import"./cli-1kzfvd1z.js";
|
|
16
|
-
import"./cli-h1spv8v4.js";
|
|
17
|
-
import"./cli-bc05qbss.js";
|
|
18
|
-
export {
|
|
19
|
-
ACPAdapter,
|
|
20
|
-
applyConfiguredOptions,
|
|
21
|
-
sanitizeAcpConfigOptions,
|
|
22
|
-
toAcpMcpServers
|
|
23
|
-
};
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getDbClient,
|
|
3
|
-
init_db
|
|
4
|
-
} from "./cli-qdv8kgz7.js";
|
|
5
|
-
import"./cli-9s3h836g.js";
|
|
6
|
-
import"./cli-3qhyh31j.js";
|
|
7
|
-
import"./cli-3a4m1aws.js";
|
|
8
|
-
import"./cli-7mm2r1kp.js";
|
|
9
|
-
import"./cli-g5erf0zt.js";
|
|
10
|
-
import"./cli-dmtrxqhg.js";
|
|
11
|
-
import"./cli-tadfgd0t.js";
|
|
12
|
-
import"./cli-ywybs5as.js";
|
|
13
|
-
import"./cli-gd4favx9.js";
|
|
14
|
-
import"./cli-agamgm0p.js";
|
|
15
|
-
import"./cli-5c2j5yvx.js";
|
|
16
|
-
import"./cli-1a2j50m0.js";
|
|
17
|
-
import"./cli-f9w1semm.js";
|
|
18
|
-
import"./cli-ej6gbxfb.js";
|
|
19
|
-
import"./cli-zsh093hk.js";
|
|
20
|
-
import"./cli-sd0mxa3c.js";
|
|
21
|
-
import"./cli-w5e1d1vv.js";
|
|
22
|
-
import"./cli-1kzfvd1z.js";
|
|
23
|
-
import"./cli-zf8jjwex.js";
|
|
24
|
-
import {
|
|
25
|
-
init_secret_scrubber,
|
|
26
|
-
scrubSecrets
|
|
27
|
-
} from "./cli-h1spv8v4.js";
|
|
28
|
-
import"./cli-bc05qbss.js";
|
|
29
|
-
|
|
30
|
-
// src/be/boot-scrub-logs.ts
|
|
31
|
-
init_secret_scrubber();
|
|
32
|
-
init_db();
|
|
33
|
-
var SCRUB_KEY = "boot-scrub-logs-v2";
|
|
34
|
-
var CURSOR_KEY = "boot-scrub-logs-v2-cursor";
|
|
35
|
-
var BATCH_SIZE = 200;
|
|
36
|
-
var yieldTick = () => new Promise((r) => setTimeout(r, 5));
|
|
37
|
-
async function runBootScrubLogs() {
|
|
38
|
-
const done = await getDbClient().get("SELECT key FROM seed_state WHERE kind = ? AND key = ?", ["maintenance", SCRUB_KEY]);
|
|
39
|
-
if (done)
|
|
40
|
-
return;
|
|
41
|
-
const savedCursor = (await getDbClient().get("SELECT seededHash FROM seed_state WHERE kind = ? AND key = ?", ["maintenance", CURSOR_KEY]))?.seededHash ?? "";
|
|
42
|
-
const lastProcessedId = savedCursor || "";
|
|
43
|
-
const totalRemaining = (await getDbClient().get(`SELECT COUNT(*) as count FROM session_logs
|
|
44
|
-
WHERE id > ?
|
|
45
|
-
AND (content LIKE '%lin!_oauth!_%' ESCAPE '!'
|
|
46
|
-
OR content LIKE '%lin!_api!_%' ESCAPE '!'
|
|
47
|
-
OR content LIKE '%npm!_%' ESCAPE '!'
|
|
48
|
-
OR content LIKE '%ATATT%')`, [lastProcessedId]))?.count ?? 0;
|
|
49
|
-
if (totalRemaining === 0) {
|
|
50
|
-
await markDone();
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
console.log(`[boot-scrub-logs] starting: ${totalRemaining} candidate rows remaining` + (lastProcessedId ? ` (resuming from cursor ${lastProcessedId.slice(0, 8)}…)` : ""));
|
|
54
|
-
const saveCursorSql = `INSERT INTO seed_state (kind, key, seededHash, seededAt)
|
|
55
|
-
VALUES ('maintenance', '${CURSOR_KEY}', ?, datetime('now'))
|
|
56
|
-
ON CONFLICT (kind, key) DO UPDATE SET seededHash = ?, seededAt = datetime('now')`;
|
|
57
|
-
let scrubbed = 0;
|
|
58
|
-
let scanned = 0;
|
|
59
|
-
let cursor = lastProcessedId;
|
|
60
|
-
for (;; ) {
|
|
61
|
-
const rows = await getDbClient().query(`SELECT id, content FROM session_logs
|
|
62
|
-
WHERE id > ?
|
|
63
|
-
AND (content LIKE '%lin!_oauth!_%' ESCAPE '!'
|
|
64
|
-
OR content LIKE '%lin!_api!_%' ESCAPE '!'
|
|
65
|
-
OR content LIKE '%npm!_%' ESCAPE '!'
|
|
66
|
-
OR content LIKE '%ATATT%')
|
|
67
|
-
ORDER BY id ASC
|
|
68
|
-
LIMIT ${BATCH_SIZE}`, [cursor]);
|
|
69
|
-
if (rows.length === 0)
|
|
70
|
-
break;
|
|
71
|
-
const batchLastId = rows[rows.length - 1].id;
|
|
72
|
-
await getDbClient().transaction(async (tx) => {
|
|
73
|
-
for (const row of rows) {
|
|
74
|
-
const cleaned = scrubSecrets(row.content);
|
|
75
|
-
if (cleaned !== row.content) {
|
|
76
|
-
await tx.run("UPDATE session_logs SET content = ? WHERE id = ?", [cleaned, row.id]);
|
|
77
|
-
scrubbed++;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
await tx.run(saveCursorSql, [batchLastId, batchLastId]);
|
|
81
|
-
});
|
|
82
|
-
scanned += rows.length;
|
|
83
|
-
cursor = batchLastId;
|
|
84
|
-
await yieldTick();
|
|
85
|
-
}
|
|
86
|
-
await markDone();
|
|
87
|
-
await getDbClient().run("DELETE FROM seed_state WHERE kind = 'maintenance' AND key = ?", [
|
|
88
|
-
CURSOR_KEY
|
|
89
|
-
]);
|
|
90
|
-
console.log(`[boot-scrub-logs] complete: scanned=${scanned} scrubbed=${scrubbed}`);
|
|
91
|
-
}
|
|
92
|
-
async function markDone() {
|
|
93
|
-
await getDbClient().run(`INSERT INTO seed_state (kind, key, seededHash, seededAt)
|
|
94
|
-
VALUES ('maintenance', ?, 'done', datetime('now'))
|
|
95
|
-
ON CONFLICT (kind, key) DO UPDATE SET seededHash = 'done', seededAt = datetime('now')`, [SCRUB_KEY]);
|
|
96
|
-
}
|
|
97
|
-
export {
|
|
98
|
-
runBootScrubLogs
|
|
99
|
-
};
|