@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
package/src/slack/render-v2.ts
CHANGED
|
@@ -53,6 +53,12 @@ import {
|
|
|
53
53
|
import { buildAskClosure, type ClosureState, closureState } from "./closure";
|
|
54
54
|
import { reactionName, type SlackReactionEvent } from "./reaction-shortcode";
|
|
55
55
|
import { getAgentDisplayName, getAgentEmoji } from "./responses";
|
|
56
|
+
import {
|
|
57
|
+
_resetSlackSessionStatusForTests,
|
|
58
|
+
beginSlackStatusTick,
|
|
59
|
+
reconcileSlackSessionStatus,
|
|
60
|
+
type StatusBudget,
|
|
61
|
+
} from "./session-status";
|
|
56
62
|
import { getSlackOutputAttachments } from "./task-attachments";
|
|
57
63
|
import { isAwaitingWake, isDeferredTask, slackTaskOutput } from "./task-output";
|
|
58
64
|
|
|
@@ -167,6 +173,7 @@ function outcomeDeliveryGate(taskId: string, card: SlackMessageRecord | null): b
|
|
|
167
173
|
async function reconcileStuckOutcomeDelivery(
|
|
168
174
|
task: AgentTask,
|
|
169
175
|
card: SlackMessageRecord | null,
|
|
176
|
+
statusBudget: StatusBudget | undefined,
|
|
170
177
|
): Promise<void> {
|
|
171
178
|
if (!card || card.deliveryAbandonedAt) return;
|
|
172
179
|
if (card.deliveryAttempts < OUTCOME_DELIVERY_MAX_ATTEMPTS) return;
|
|
@@ -178,15 +185,16 @@ async function reconcileStuckOutcomeDelivery(
|
|
|
178
185
|
`[Slack] Recovered a stuck outcome delivery for task ${task.id} left at ` +
|
|
179
186
|
`${card.deliveryAttempts} attempt(s) without a give-up; surfacing failure and clearing the working indicator`,
|
|
180
187
|
);
|
|
181
|
-
await surfaceOutcomeDeliveryGiveUp(task, lastError, card.deliveryAttempts);
|
|
188
|
+
await surfaceOutcomeDeliveryGiveUp(task, lastError, card.deliveryAttempts, statusBudget);
|
|
182
189
|
}
|
|
183
190
|
|
|
184
191
|
/** Reconciles a stuck card (see reconcileStuckOutcomeDelivery), then applies the gate. */
|
|
185
192
|
async function checkOutcomeDeliveryGate(
|
|
186
193
|
task: AgentTask,
|
|
187
194
|
card: SlackMessageRecord | null,
|
|
195
|
+
statusBudget: StatusBudget | undefined,
|
|
188
196
|
): Promise<boolean> {
|
|
189
|
-
await reconcileStuckOutcomeDelivery(task, card);
|
|
197
|
+
await reconcileStuckOutcomeDelivery(task, card, statusBudget);
|
|
190
198
|
return outcomeDeliveryGate(task.id, card);
|
|
191
199
|
}
|
|
192
200
|
|
|
@@ -198,6 +206,7 @@ async function noteOutcomeDeliveryFailure(
|
|
|
198
206
|
task: AgentTask,
|
|
199
207
|
tree: SlackMessageRecord,
|
|
200
208
|
error: unknown,
|
|
209
|
+
statusBudget: StatusBudget | undefined,
|
|
201
210
|
): Promise<void> {
|
|
202
211
|
const detail = describeSlackError(error);
|
|
203
212
|
// Scrubbed once here so every downstream sink — the two DB writes below and
|
|
@@ -249,7 +258,7 @@ async function noteOutcomeDeliveryFailure(
|
|
|
249
258
|
`[Slack] Giving up on outcome delivery for task ${task.id} after ${attempts} attempt(s)` +
|
|
250
259
|
`${terminal ? " (Slack refused the delivery)" : ""}; surfacing failure and clearing the working indicator`,
|
|
251
260
|
);
|
|
252
|
-
await surfaceOutcomeDeliveryGiveUp(task, summary, attempts);
|
|
261
|
+
await surfaceOutcomeDeliveryGiveUp(task, summary, attempts, statusBudget);
|
|
253
262
|
}
|
|
254
263
|
|
|
255
264
|
/** Best-effort: post a visible failure notice and clear the "is working" status.
|
|
@@ -258,6 +267,7 @@ async function surfaceOutcomeDeliveryGiveUp(
|
|
|
258
267
|
task: AgentTask,
|
|
259
268
|
summary: string,
|
|
260
269
|
attempts: number,
|
|
270
|
+
statusBudget: StatusBudget | undefined,
|
|
261
271
|
): Promise<void> {
|
|
262
272
|
const app = getSlackApp();
|
|
263
273
|
if (!app || !task.slackChannelId || !task.slackThreadTs) return;
|
|
@@ -273,27 +283,27 @@ async function surfaceOutcomeDeliveryGiveUp(
|
|
|
273
283
|
scrubSecrets(postError instanceof Error ? postError.message : String(postError)),
|
|
274
284
|
);
|
|
275
285
|
}
|
|
276
|
-
await clearAssistantStatus(app.client, task.slackChannelId, task.slackThreadTs);
|
|
286
|
+
await clearAssistantStatus(app.client, task.slackChannelId, task.slackThreadTs, statusBudget);
|
|
277
287
|
}
|
|
278
288
|
|
|
279
|
-
/**
|
|
280
|
-
*
|
|
281
|
-
*
|
|
289
|
+
/** Re-syncs Slack's native "working" status once an outcome card has landed:
|
|
290
|
+
* cleared when nothing else in the thread is still running, kept while it is.
|
|
291
|
+
* Best-effort and never throws. When the native call is unavailable a DM
|
|
292
|
+
* falls back to clearing the legacy assistant indicator, as it always did.
|
|
293
|
+
* A render tick passes its budget; past it the clear waits for the next tick. */
|
|
282
294
|
async function clearAssistantStatus(
|
|
283
295
|
client: WebClient,
|
|
284
296
|
channelId: string,
|
|
285
297
|
threadTs: string,
|
|
298
|
+
statusBudget: StatusBudget | undefined,
|
|
286
299
|
): Promise<void> {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
} catch (error) {
|
|
295
|
-
console.warn(`[Slack] Failed to clear assistant status for ${channelId}/${threadTs}:`, error);
|
|
296
|
-
}
|
|
300
|
+
await reconcileSlackSessionStatus({
|
|
301
|
+
client,
|
|
302
|
+
channelId,
|
|
303
|
+
threadTs,
|
|
304
|
+
budget: statusBudget,
|
|
305
|
+
outcomeDelivered: true,
|
|
306
|
+
});
|
|
297
307
|
}
|
|
298
308
|
|
|
299
309
|
function slackTreeStallMinutes(): number {
|
|
@@ -698,11 +708,25 @@ async function createThreadTree(task: AgentTask): Promise<SlackMessageRecord | n
|
|
|
698
708
|
return record;
|
|
699
709
|
}
|
|
700
710
|
|
|
701
|
-
|
|
711
|
+
/**
|
|
712
|
+
* `statusBudget` is the render tick's shared cap on native status writes; calls
|
|
713
|
+
* from outside a tick (a newly accepted ask) pass none.
|
|
714
|
+
*/
|
|
715
|
+
export async function ensureSlackThreadTree(
|
|
716
|
+
taskIds: string[],
|
|
717
|
+
statusBudget?: StatusBudget,
|
|
718
|
+
): Promise<SlackMessageRecord | null> {
|
|
702
719
|
const task = (await Promise.all(taskIds.map(getTaskById))).find(
|
|
703
720
|
(candidate): candidate is AgentTask => !!candidate,
|
|
704
721
|
);
|
|
705
722
|
if (!task?.slackChannelId || !task.slackThreadTs) return null;
|
|
723
|
+
// Every accepted ask passes through here: start Slack's own "working" state
|
|
724
|
+
// with the tree. A no-op when the thread is already showing it.
|
|
725
|
+
await reconcileSlackSessionStatus({
|
|
726
|
+
channelId: task.slackChannelId,
|
|
727
|
+
threadTs: task.slackThreadTs,
|
|
728
|
+
budget: statusBudget,
|
|
729
|
+
});
|
|
706
730
|
const contextKey =
|
|
707
731
|
task.contextKey ??
|
|
708
732
|
slackContextKey({
|
|
@@ -719,7 +743,7 @@ export async function ensureSlackThreadTree(taskIds: string[]): Promise<SlackMes
|
|
|
719
743
|
} catch (error) {
|
|
720
744
|
if (!isSlackMessageNotFound(error)) throw error;
|
|
721
745
|
await discardTreeRecord(existing);
|
|
722
|
-
return ensureSlackThreadTree(taskIds);
|
|
746
|
+
return ensureSlackThreadTree(taskIds, statusBudget);
|
|
723
747
|
}
|
|
724
748
|
}
|
|
725
749
|
const creationKey = physicalThreadKey(task.slackChannelId, task.slackThreadTs);
|
|
@@ -770,17 +794,21 @@ async function withTreeUpdateLock<T>(
|
|
|
770
794
|
}
|
|
771
795
|
}
|
|
772
796
|
|
|
773
|
-
async function replaceMissingTree(
|
|
797
|
+
async function replaceMissingTree(
|
|
798
|
+
tree: SlackMessageRecord,
|
|
799
|
+
statusBudget: StatusBudget | undefined,
|
|
800
|
+
): Promise<SlackMessageRecord | null> {
|
|
774
801
|
await discardTreeRecord(tree);
|
|
775
802
|
const taskIds = (await getSlackTasksInThread(tree.channelId, tree.threadTs)).map(
|
|
776
803
|
(task) => task.id,
|
|
777
804
|
);
|
|
778
|
-
return taskIds.length > 0 ? ensureSlackThreadTree(taskIds) : null;
|
|
805
|
+
return taskIds.length > 0 ? ensureSlackThreadTree(taskIds, statusBudget) : null;
|
|
779
806
|
}
|
|
780
807
|
|
|
781
808
|
async function updateThreadTree(
|
|
782
809
|
tree: SlackMessageRecord,
|
|
783
810
|
bypassThrottle = false,
|
|
811
|
+
statusBudget?: StatusBudget,
|
|
784
812
|
): Promise<boolean> {
|
|
785
813
|
const result = await withTreeUpdateLock(tree.channelId, tree.threadTs, async () => {
|
|
786
814
|
const app = getSlackApp();
|
|
@@ -824,7 +852,7 @@ async function updateThreadTree(
|
|
|
824
852
|
});
|
|
825
853
|
|
|
826
854
|
if (result === "missing") {
|
|
827
|
-
await replaceMissingTree(tree);
|
|
855
|
+
await replaceMissingTree(tree, statusBudget);
|
|
828
856
|
return false;
|
|
829
857
|
}
|
|
830
858
|
return result === "updated";
|
|
@@ -1237,6 +1265,8 @@ export async function streamOutcomeCard(
|
|
|
1237
1265
|
options?: {
|
|
1238
1266
|
buildContent?: (task: AgentTask, slackReplySent: boolean) => Promise<string>;
|
|
1239
1267
|
conclusionKind?: SlackConclusionKind;
|
|
1268
|
+
/** The render tick's shared cap on native status writes. */
|
|
1269
|
+
statusBudget?: StatusBudget;
|
|
1240
1270
|
},
|
|
1241
1271
|
): Promise<SlackMessageRecord | null> {
|
|
1242
1272
|
const app = getSlackApp();
|
|
@@ -1387,7 +1417,12 @@ export async function streamOutcomeCard(
|
|
|
1387
1417
|
// what normally clears Slack's own "is working…" assistant indicator.
|
|
1388
1418
|
// Clear it explicitly too, so a delivery that only ever fails still
|
|
1389
1419
|
// doesn't leave the thread stuck spinning.
|
|
1390
|
-
await clearAssistantStatus(
|
|
1420
|
+
await clearAssistantStatus(
|
|
1421
|
+
app.client,
|
|
1422
|
+
task.slackChannelId,
|
|
1423
|
+
task.slackThreadTs,
|
|
1424
|
+
options?.statusBudget,
|
|
1425
|
+
);
|
|
1391
1426
|
const permalink = await resolvePermalink(app.client, task.slackChannelId, outcome.ts);
|
|
1392
1427
|
return await updateSlackMessageRecord(outcome.id, {
|
|
1393
1428
|
permalink,
|
|
@@ -1559,12 +1594,13 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1559
1594
|
const activatedAt = await ensureSlackRenderV2Activation();
|
|
1560
1595
|
const delegationEnabled = isSlackDelegationEnabled();
|
|
1561
1596
|
const delegationActivatedAt = delegationEnabled ? await ensureSlackDelegationActivation() : null;
|
|
1597
|
+
const statusTick = beginSlackStatusTick();
|
|
1562
1598
|
|
|
1563
1599
|
for (const task of await getSlackTasksMissingTree()) {
|
|
1564
1600
|
if (!isSlackRenderV2Enabled()) return;
|
|
1565
1601
|
if (!task.slackChannelId || !task.slackThreadTs) continue;
|
|
1566
1602
|
try {
|
|
1567
|
-
await ensureSlackThreadTree([task.id]);
|
|
1603
|
+
await ensureSlackThreadTree([task.id], statusTick.budget);
|
|
1568
1604
|
} catch (error) {
|
|
1569
1605
|
console.error(`[Slack] Failed to create v2 tree for task ${task.id}:`, error);
|
|
1570
1606
|
}
|
|
@@ -1576,7 +1612,10 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1576
1612
|
const initialTasks = await getSlackTasksInThread(tree.channelId, tree.threadTs);
|
|
1577
1613
|
if (isPendingSlackMessage(tree)) {
|
|
1578
1614
|
try {
|
|
1579
|
-
const recovered = await ensureSlackThreadTree(
|
|
1615
|
+
const recovered = await ensureSlackThreadTree(
|
|
1616
|
+
initialTasks.map((task) => task.id),
|
|
1617
|
+
statusTick.budget,
|
|
1618
|
+
);
|
|
1580
1619
|
if (!recovered) continue;
|
|
1581
1620
|
tree = recovered;
|
|
1582
1621
|
} catch (error) {
|
|
@@ -1591,7 +1630,7 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1591
1630
|
} catch (error) {
|
|
1592
1631
|
if (isSlackMessageNotFound(error)) {
|
|
1593
1632
|
try {
|
|
1594
|
-
await replaceMissingTree(tree);
|
|
1633
|
+
await replaceMissingTree(tree, statusTick.budget);
|
|
1595
1634
|
} catch (replacementError) {
|
|
1596
1635
|
console.error(
|
|
1597
1636
|
`[Slack] Failed to replace missing v2 tree ${tree.id}:`,
|
|
@@ -1635,7 +1674,7 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1635
1674
|
continue;
|
|
1636
1675
|
}
|
|
1637
1676
|
try {
|
|
1638
|
-
const replacement = await replaceMissingTree(tree);
|
|
1677
|
+
const replacement = await replaceMissingTree(tree, statusTick.budget);
|
|
1639
1678
|
if (!replacement) continue;
|
|
1640
1679
|
tree = replacement;
|
|
1641
1680
|
tasks = await getSlackTasksInThread(tree.channelId, tree.threadTs);
|
|
@@ -1692,9 +1731,12 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1692
1731
|
if (!ownerAsk || ownerAsk.createdAt < delegationActivatedAt) continue;
|
|
1693
1732
|
if (childCardsThisTick >= CHILD_CARDS_PER_TICK) continue;
|
|
1694
1733
|
if (askId && (await childCardCountFor(askId)) >= CHILD_CARDS_PER_ASK) continue;
|
|
1695
|
-
if (!(await checkOutcomeDeliveryGate(task, card))) continue;
|
|
1734
|
+
if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
|
|
1696
1735
|
try {
|
|
1697
|
-
const outcome = await streamOutcomeCard(task, tree, {
|
|
1736
|
+
const outcome = await streamOutcomeCard(task, tree, {
|
|
1737
|
+
buildContent: childOutcomeContent,
|
|
1738
|
+
statusBudget: statusTick.budget,
|
|
1739
|
+
});
|
|
1698
1740
|
if (outcome) {
|
|
1699
1741
|
noteOutcomeDeliverySuccess(task.id);
|
|
1700
1742
|
childCardsThisTick++;
|
|
@@ -1703,7 +1745,7 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1703
1745
|
}
|
|
1704
1746
|
outcomeCreated ||= !!outcome;
|
|
1705
1747
|
} catch (error) {
|
|
1706
|
-
await noteOutcomeDeliveryFailure(task, tree, error);
|
|
1748
|
+
await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
|
|
1707
1749
|
}
|
|
1708
1750
|
}
|
|
1709
1751
|
|
|
@@ -1720,16 +1762,16 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1720
1762
|
task.createdAt >= delegationActivatedAt;
|
|
1721
1763
|
|
|
1722
1764
|
if (!deferByClosure) {
|
|
1723
|
-
if (!(await checkOutcomeDeliveryGate(task, card))) continue;
|
|
1765
|
+
if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
|
|
1724
1766
|
try {
|
|
1725
|
-
const outcome = await streamOutcomeCard(task, tree);
|
|
1767
|
+
const outcome = await streamOutcomeCard(task, tree, { statusBudget: statusTick.budget });
|
|
1726
1768
|
if (outcome) {
|
|
1727
1769
|
noteOutcomeDeliverySuccess(task.id);
|
|
1728
1770
|
await finalizeTerminalSlackReactions([task]);
|
|
1729
1771
|
}
|
|
1730
1772
|
outcomeCreated ||= !!outcome;
|
|
1731
1773
|
} catch (error) {
|
|
1732
|
-
await noteOutcomeDeliveryFailure(task, tree, error);
|
|
1774
|
+
await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
|
|
1733
1775
|
}
|
|
1734
1776
|
continue;
|
|
1735
1777
|
}
|
|
@@ -1755,12 +1797,13 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1755
1797
|
if (childCardPending) continue;
|
|
1756
1798
|
const state = closureState(task, closure, new Date(), settleSec, timeoutMin);
|
|
1757
1799
|
if (state === "open") continue;
|
|
1758
|
-
if (!(await checkOutcomeDeliveryGate(task, card))) continue;
|
|
1800
|
+
if (!(await checkOutcomeDeliveryGate(task, card, statusTick.budget))) continue;
|
|
1759
1801
|
try {
|
|
1760
1802
|
const outcome = await streamOutcomeCard(task, tree, {
|
|
1761
1803
|
buildContent: (_t, slackReplySent) =>
|
|
1762
1804
|
askConclusionContent(task, closure, state, slackReplySent),
|
|
1763
1805
|
conclusionKind: state === "timedOut" ? "timeout" : "complete",
|
|
1806
|
+
statusBudget: statusTick.budget,
|
|
1764
1807
|
});
|
|
1765
1808
|
if (outcome) {
|
|
1766
1809
|
noteOutcomeDeliverySuccess(task.id);
|
|
@@ -1784,17 +1827,19 @@ export async function processSlackRenderV2(): Promise<void> {
|
|
|
1784
1827
|
}
|
|
1785
1828
|
outcomeCreated ||= !!outcome;
|
|
1786
1829
|
} catch (error) {
|
|
1787
|
-
await noteOutcomeDeliveryFailure(task, tree, error);
|
|
1830
|
+
await noteOutcomeDeliveryFailure(task, tree, error, statusTick.budget);
|
|
1788
1831
|
}
|
|
1789
1832
|
}
|
|
1790
1833
|
try {
|
|
1791
|
-
await updateThreadTree(tree, outcomeCreated);
|
|
1834
|
+
await updateThreadTree(tree, outcomeCreated, statusTick.budget);
|
|
1792
1835
|
} catch (error) {
|
|
1793
1836
|
console.error(`[Slack] Failed to update v2 tree ${tree.id}:`, error);
|
|
1794
1837
|
}
|
|
1838
|
+
await statusTick.reconcile(tree.channelId, tree.threadTs);
|
|
1795
1839
|
}
|
|
1796
1840
|
|
|
1797
1841
|
await refreshResolvedDeferralCards();
|
|
1842
|
+
await statusTick.finish();
|
|
1798
1843
|
}
|
|
1799
1844
|
|
|
1800
1845
|
export function _resetSlackRenderV2ForTests(): void {
|
|
@@ -1807,6 +1852,7 @@ export function _resetSlackRenderV2ForTests(): void {
|
|
|
1807
1852
|
cachedTeamId = undefined;
|
|
1808
1853
|
outcomeDeliveryNextAttemptAt.clear();
|
|
1809
1854
|
outcomeReservedWithoutAttempt.clear();
|
|
1855
|
+
_resetSlackSessionStatusForTests();
|
|
1810
1856
|
}
|
|
1811
1857
|
|
|
1812
1858
|
/**
|
|
@@ -1814,4 +1860,8 @@ export function _resetSlackRenderV2ForTests(): void {
|
|
|
1814
1860
|
* its pre-reservation branch (a DB read throwing before streamOutcomeCard's
|
|
1815
1861
|
* own reservation) aren't practical to reproduce end-to-end in tests.
|
|
1816
1862
|
*/
|
|
1817
|
-
export const _noteOutcomeDeliveryFailureForTests =
|
|
1863
|
+
export const _noteOutcomeDeliveryFailureForTests = (
|
|
1864
|
+
task: AgentTask,
|
|
1865
|
+
tree: SlackMessageRecord,
|
|
1866
|
+
error: unknown,
|
|
1867
|
+
): Promise<void> => noteOutcomeDeliveryFailure(task, tree, error, undefined);
|