@desplega.ai/agent-swarm 1.131.1 → 1.134.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 +3 -3
- package/dist/{actions-jgcy477k.js → actions-7kast243.js} +20 -18
- package/dist/{anthropic-messages-rjmd2e7n.js → anthropic-messages-706yad38.js} +33 -17
- package/dist/app-0g84t8wf.js +28 -0
- package/dist/{artifact-jysj3wrg.js → artifact-dje5ke4h.js} +37 -131
- package/dist/{assistant-f2vkk1hj.js → assistant-ac4htcky.js} +25 -22
- package/dist/{azure-openai-responses-c0yjmbfd.js → azure-openai-responses-be59fbsz.js} +13 -13
- package/dist/{boot-reembed-q7mp8hcr.js → boot-reembed-b1rcqn85.js} +13 -11
- package/dist/{boot-reembed-xmw8wcx6.js → boot-reembed-kw2541c4.js} +14 -12
- package/dist/{boot-scrub-logs-dsqrv79n.js → boot-scrub-logs-ja29t92g.js} +11 -9
- package/dist/{claude-adapter-q6x7yspx.js → claude-adapter-5cg1fv8s.js} +33 -29
- package/dist/{claude-managed-adapter-wsg37bt8.js → claude-managed-adapter-9z9sdytx.js} +9 -9
- package/dist/{claude-managed-setup-52z4mq9w.js → claude-managed-setup-3zqp51cr.js} +5 -5
- package/dist/{claude-1ex232fc.js → claude-wqn3dtca.js} +1 -1
- package/dist/{cli-4wgngmwv.js → cli-00w4hbam.js} +1 -1
- package/dist/{cli-er3a4bb0.js → cli-15429qdw.js} +6 -1
- package/dist/{cli-e5dabkx0.js → cli-1cwhyvta.js} +4 -4
- package/dist/{cli-zsspvvm2.js → cli-1ybr6vw2.js} +237 -237
- package/dist/{cli-xpxde7rm.js → cli-2wv4kj0e.js} +60 -31
- package/dist/cli-34w2584r.js +530 -0
- package/dist/{cli-se2p6rkb.js → cli-38taxznr.js} +6 -6
- package/dist/{cli-9sbhdpvb.js → cli-3cgfyfzm.js} +14 -14
- package/dist/{cli-5n6e5yfn.js → cli-3zmdzfjf.js} +79 -74
- package/dist/{cli-3ty0t082.js → cli-43x36mty.js} +197 -8
- package/dist/{cli-ycrnynpw.js → cli-480nehnh.js} +29 -22
- package/dist/{cli-0258203w.js → cli-492e7ap5.js} +140 -20
- package/dist/{cli-3fj60etf.js → cli-497b685t.js} +3 -3
- package/dist/{cli-pxfxkx5m.js → cli-4bap00k0.js} +1 -1
- package/dist/{cli-w2wxd56v.js → cli-4bc8vmhm.js} +848 -770
- package/dist/{cli-aca5pz9f.js → cli-589599p9.js} +1 -1
- package/dist/{cli-t930g0xh.js → cli-5tnr64pm.js} +1 -1
- package/dist/{cli-jxg3s9ey.js → cli-65d93ves.js} +7 -7
- package/dist/{cli-6dpytdr2.js → cli-6x363v1z.js} +2 -2
- package/dist/{cli-dxak0fqd.js → cli-787ph852.js} +11 -11
- package/dist/{cli-793jvbsh.js → cli-7bv8nckk.js} +16 -11
- package/dist/{cli-zyxs93y9.js → cli-7jcc9y1r.js} +3 -3
- package/dist/{cli-f1am9szv.js → cli-87t2gstf.js} +1 -1
- package/dist/{cli-9aryf9tv.js → cli-95m51ztz.js} +1 -1
- package/dist/{cli-4w4fmq9x.js → cli-9w49enmh.js} +2 -2
- package/dist/{cli-v69vk5h0.js → cli-9y5b02vr.js} +13 -13
- package/dist/{cli-x23me2mg.js → cli-a1rrkrb4.js} +1 -1
- package/dist/{cli-psrqtw2m.js → cli-a3pkfpqs.js} +2 -2
- package/dist/{cli-h0rgxd24.js → cli-a4ajmfvp.js} +6 -6
- package/dist/{cli-ygrbmjja.js → cli-aw8bb6sf.js} +6 -6
- package/dist/{cli-g74vpjp2.js → cli-brm3et47.js} +55 -22
- package/dist/{cli-czkae1fp.js → cli-c5ddbdfj.js} +9 -9
- package/dist/{cli-114fvtmj.js → cli-c79a9zrc.js} +1 -1
- package/dist/{cli-49n9f49x.js → cli-dx3dz0ms.js} +3 -3
- package/dist/{cli-6dp3ydxa.js → cli-e07exmsb.js} +18 -14
- package/dist/cli-et1bbwqf.js +13 -0
- package/dist/{cli-yazx6hap.js → cli-f3s9dry0.js} +14 -14
- package/dist/{cli-t8d349cy.js → cli-f4wj0s3m.js} +3 -3
- package/dist/{cli-d6n0thxw.js → cli-f64gdfxc.js} +1 -1
- package/dist/{cli-pwfsqc2x.js → cli-fyd58xgb.js} +55 -55
- package/dist/{cli-7dm2zqy2.js → cli-g0j14czv.js} +2 -2
- package/dist/{cli-b0p7rfnd.js → cli-g2p9bd1z.js} +14 -14
- package/dist/{cli-z905tvmm.js → cli-g814jbst.js} +2 -2
- package/dist/{cli-5dsbcjjw.js → cli-ghexzd2d.js} +970 -970
- package/dist/{cli-jvv0g8bh.js → cli-gpt9kf01.js} +15 -15
- package/dist/{cli-rgrfzg8z.js → cli-grt6qv91.js} +380 -380
- package/dist/{cli-wz9115x0.js → cli-gtafvdy0.js} +8 -8
- package/dist/{cli-q5dzzak0.js → cli-gy07xk4s.js} +2 -2
- package/dist/{cli-sy7jk3tx.js → cli-h0djenzm.js} +2 -2
- package/dist/{cli-nrkkknat.js → cli-h37gbjbf.js} +2 -281
- package/dist/{cli-jevgrb4w.js → cli-h39xxnq6.js} +1200 -491
- package/dist/{cli-gz9sbyk3.js → cli-jepmgn7r.js} +1 -1
- package/dist/{cli-ccf9vy7q.js → cli-jmvk6et8.js} +7 -7
- package/dist/{cli-2rk0cx7s.js → cli-jxj92gkt.js} +51 -41
- package/dist/{cli-bqw0mt1n.js → cli-k46t4664.js} +18 -3
- package/dist/{cli-50vbt00w.js → cli-m07313tr.js} +1153 -696
- package/dist/{cli-4j2mrzag.js → cli-mkq1rk7b.js} +1 -1
- package/dist/{cli-1z7048dy.js → cli-mnm7w46e.js} +1 -1
- package/dist/{cli-kd1ck4rx.js → cli-mp9sg4cg.js} +14 -8
- package/dist/{cli-jbcva0xj.js → cli-mrammd8c.js} +60 -35
- package/dist/cli-nanaxrz6.js +27 -0
- package/dist/{cli-p9swy5t3.js → cli-pq2ee5ja.js} +8 -6
- package/dist/{cli-2wadx7p2.js → cli-pt43pdp1.js} +2 -2
- package/dist/{cli-7sgrxg9a.js → cli-q6d0vvey.js} +4 -4
- package/dist/{cli-k9qkf1hw.js → cli-qf9kpsve.js} +9 -9
- package/dist/cli-qh4sqfws.js +15 -0
- package/dist/{cli-e15jhafb.js → cli-qntkxysp.js} +14 -14
- package/dist/{cli-sajgpkqg.js → cli-qs9hhsvb.js} +1723 -325
- package/dist/{cli-z2zcxes1.js → cli-qt5bt3vk.js} +1 -1
- package/dist/{cli-wx82tw1k.js → cli-qtekrty1.js} +3 -3
- package/dist/{cli-g1re8r05.js → cli-rh6f3s9n.js} +3 -3
- package/dist/{cli-n0krnc6d.js → cli-rzhcrw2p.js} +2 -2
- package/dist/{cli-gecy3z2s.js → cli-snw62ze5.js} +4 -4
- package/dist/{cli-n6h8qt8n.js → cli-snz3p4yf.js} +15 -10
- package/dist/{cli-r6kqqbj0.js → cli-tkf8n6cw.js} +11 -11
- package/dist/{cli-4rkfg1wx.js → cli-tkrr24mz.js} +14 -9
- package/dist/{cli-9dr5qzc0.js → cli-tv9f1kyb.js} +54 -43
- package/dist/{cli-gm9cbhbq.js → cli-vtz6yj3v.js} +28 -9
- package/dist/{cli-2f07m0xr.js → cli-wf86d5t7.js} +1 -1
- package/dist/{cli-7zd05xb4.js → cli-whrvct19.js} +45 -45
- package/dist/{cli-ap1czx8f.js → cli-wrrea8xm.js} +3 -3
- package/dist/{cli-57khth04.js → cli-xmyqv00z.js} +120 -4
- package/dist/{cli-cwy5hqbq.js → cli-yjmk7tzc.js} +1 -1
- package/dist/{cli-6pcz9h15.js → cli-zykjrwcx.js} +180 -394
- package/dist/cli.js +45 -45
- package/dist/{codex-adapter-htjkn22b.js → codex-adapter-hsq6mz3m.js} +21 -19
- package/dist/{codex-hook-hq54t9ft.js → codex-hook-8c500gq8.js} +8 -7
- package/dist/{codex-login-z6yhbkmk.js → codex-login-x7603481.js} +3 -3
- package/dist/{codex-session-runner-wjfc7smz.js → codex-session-runner-c1x3x143.js} +15 -13
- package/dist/{commands-xhrfwqsk.js → commands-rwtddtst.js} +11 -9
- package/dist/{db-anvwb22f.js → db-j2b355vz.js} +458 -444
- package/dist/{devin-adapter-v1sarqtw.js → devin-adapter-8qmhqpy3.js} +3 -3
- package/dist/{devtools-2y1r7yqk.js → devtools-j2rnj8w7.js} +4 -4
- package/dist/{e2b-jdkwemv2.js → e2b-znpx78eg.js} +16 -16
- package/dist/{es5-vjgtkgp6.js → es5-fmqrjzy3.js} +2 -2
- package/dist/{event-bus-axn823e9.js → event-bus-n8sb35pw.js} +4 -4
- package/dist/{getMachineId-bsd-6tc9wxdj.js → getMachineId-bsd-wpzbhkm6.js} +4 -4
- package/dist/{getMachineId-darwin-sjt9sgnc.js → getMachineId-darwin-45zabjy0.js} +4 -4
- package/dist/{getMachineId-linux-v5n18y9p.js → getMachineId-linux-warnp5pd.js} +3 -3
- package/dist/{getMachineId-unsupported-yrjyqw3d.js → getMachineId-unsupported-5spent2a.js} +3 -3
- package/dist/{getMachineId-win-w3r8063c.js → getMachineId-win-v4bvcw7a.js} +4 -4
- package/dist/{google-generative-ai-hysrd8qx.js → google-generative-ai-b0wzss55.js} +17 -14
- package/dist/{google-vertex-p5arrga0.js → google-vertex-e8q4dpya.js} +18 -15
- package/dist/{handlers-b9kbc621.js → handlers-hchgrxkh.js} +32 -29
- package/dist/{hook-xkvn6c5h.js → hook-p49egqc0.js} +66 -52
- package/dist/hook-spb00w76.js +34 -0
- package/dist/{http-9xh6ta4r.js → http-nh14kkms.js} +663 -181
- package/dist/index-1qthq7vc.js +6 -0
- package/dist/{index-0g68f0p6.js → index-20xqmn3v.js} +3 -3
- package/dist/{index-vdkr5z2w.js → index-3e03k6e4.js} +114 -114
- package/dist/{index-ywds4812.js → index-4cbyhq2g.js} +43 -41
- package/dist/index-67pzqfrb.js +36 -0
- package/dist/{index-bccrkdkn.js → index-7m8yxkw5.js} +16 -16
- package/dist/{index-eaxyqcmj.js → index-dvsk64sm.js} +163 -83
- package/dist/{index-dqkpnmqm.js → index-e19s2m8k.js} +18 -18
- package/dist/{index-j30k5zxn.js → index-emvxcy98.js} +16 -16
- package/dist/{index-7ndw6ecy.js → index-gqnmr60d.js} +9 -9
- package/dist/{index-9znhar3x.js → index-j02xvjtd.js} +184 -185
- package/dist/{index-1s2442yw.js → index-ns5kksc1.js} +7 -7
- package/dist/{index-dpy2hth8.js → index-pdxc8kfh.js} +71 -71
- package/dist/{index-z1m7pw0v.js → index-ptcqm8bc.js} +107 -107
- package/dist/{index-070v4eyb.js → index-pyp7rexm.js} +5 -6
- package/dist/{index-86znjz1p.js → index-shne41sd.js} +13 -13
- package/dist/{index-2qn2qndv.js → index-t36q2v4t.js} +183 -183
- package/dist/index-tcnvv8w6.js +7 -0
- package/dist/index-w91qbfv1.js +7 -0
- package/dist/{index-fzc0mwvj.js → index-yqweff5n.js} +32 -32
- package/dist/index-yrfphye1.js +39 -0
- package/dist/{keepalive-vc7s2aa6.js → keepalive-9k51nqhc.js} +21 -15
- package/dist/lead-2xq3dxbz.js +88 -0
- package/dist/maintenance-0c0g6nym.js +28 -0
- package/dist/mistral-conversations-2njwdwhj.js +717 -0
- package/dist/{multipart-parser-qaktc7p8.js → multipart-parser-6gftesw0.js} +2 -2
- package/dist/{oauth-refresh-sweep-yecgjpk4.js → oauth-refresh-sweep-273a64r2.js} +14 -12
- package/dist/{onboard-xj0f73f9.js → onboard-tsv9wwhz.js} +12 -12
- package/dist/{openai-codex-responses-5g27pd6f.js → openai-codex-responses-kt84eq86.js} +26 -26
- package/dist/{openai-completions-3vkmfz2a.js → openai-completions-mrypq7qp.js} +17 -16
- package/dist/{openai-responses-dg4t7j7a.js → openai-responses-qhrk21ez.js} +20 -17
- package/dist/{opencode-adapter-1gm38aba.js → opencode-adapter-rar9676j.js} +13 -11
- package/dist/{openrouter-images-g3gm8931.js → openrouter-images-684fysx9.js} +5 -5
- package/dist/{otel-impl-nxg0n0b3.js → otel-impl-wp1mfzd2.js} +752 -537
- package/dist/{photon_rs-ky7dj5qw.js → photon_rs-8dwt2pzy.js} +581 -581
- package/dist/{pi-messages-tqj8q6b9.js → pi-messages-txp9f97r.js} +7 -7
- package/dist/{pi-mono-adapter-4g5kby31.js → pi-mono-adapter-yz47kk8e.js} +1910 -1180
- package/dist/pricing-refresh-jw1yw2fn.js +22 -0
- package/dist/rbac-roles-dg964c8p.js +32 -0
- package/dist/{rbac-roles-1hcxdtg7.js → rbac-roles-p53cg5cv.js} +19 -17
- package/dist/{registry-02cy9z5z.js → registry-mh12y17v.js} +4 -4
- package/dist/render-v2-56vn2rk9.js +36 -0
- package/dist/seed-pricing-52xx6z63.js +19 -0
- package/dist/{setup-46xtgq3c.js → setup-e8gp79sy.js} +7 -7
- package/dist/token-util-zy908s1a.js +6 -0
- package/dist/{token-fxkn2zf2.js → token-xg5711x5.js} +4 -4
- package/dist/worker-s17f1g46.js +88 -0
- package/dist/{x-6mg4kfpe.js → x-xkfh0w0v.js} +5 -5
- package/openapi.json +566 -22
- package/package.json +6 -6
- package/src/be/budget-refusal-notify.ts +14 -7
- package/src/be/db-queries/task-artifacts.ts +182 -0
- package/src/be/db.ts +834 -171
- package/src/be/events.ts +5 -0
- package/src/be/migrations/131_session_logs_created_at_index.sql +2 -0
- package/src/be/migrations/132_multi_runtime_instances.sql +44 -0
- package/src/be/migrations/133_workflow_run_trigger_type.sql +12 -0
- package/src/be/migrations/135_backfill_task_pull_request_attachments.sql +228 -0
- package/src/be/migrations/136_task_requester_provenance.sql +37 -0
- package/src/be/migrations/137_memory_retrieval_composite_index.sql +1 -0
- package/src/be/migrations/runner.ts +17 -11
- package/src/be/multi-runtime.ts +430 -0
- package/src/be/scripts/extract-schema.ts +3 -1
- package/src/be/scripts/typecheck.ts +6 -2
- package/src/be/seed-prompt-templates.ts +25 -2
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/steering.ts +1 -1
- package/src/be/swarm-config-guard.ts +18 -0
- package/src/commands/credential-wait.ts +54 -0
- package/src/commands/onboard/steps/core-credentials.tsx +1 -1
- package/src/commands/onboard/steps/custom-templates.tsx +1 -1
- package/src/commands/onboard/steps/harness-credentials.tsx +1 -1
- package/src/commands/onboard/steps/health-check.tsx +1 -1
- package/src/commands/onboard/steps/start.tsx +1 -1
- package/src/commands/profile-sync-audit.ts +56 -0
- package/src/commands/profile-sync.ts +287 -15
- package/src/commands/provider-credentials.ts +46 -19
- package/src/commands/runner.ts +199 -33
- package/src/commands/templates.ts +22 -0
- package/src/github/handlers.ts +55 -9
- package/src/heartbeat/heartbeat.ts +109 -17
- package/src/hooks/hook.ts +49 -33
- package/src/http/active-sessions.ts +11 -1
- package/src/http/agents.ts +261 -30
- package/src/http/all-routes.ts +1 -0
- package/src/http/config.ts +13 -2
- package/src/http/core.ts +102 -4
- package/src/http/db-query-bounded.ts +313 -0
- package/src/http/db-query-shared.ts +249 -0
- package/src/http/db-query.ts +54 -42
- package/src/http/events.ts +2 -0
- package/src/http/index.ts +23 -2
- package/src/http/mcp-bridge.ts +37 -3
- package/src/http/mcp.ts +12 -0
- package/src/http/memory.ts +13 -2
- package/src/http/openapi.ts +1 -0
- package/src/http/poll.ts +70 -27
- package/src/http/prompt-templates.ts +36 -13
- package/src/http/route-def.ts +43 -9
- package/src/http/schedules.ts +2 -2
- package/src/http/scripts.ts +10 -1
- package/src/http/session-data.ts +44 -0
- package/src/http/tasks.ts +2 -2
- package/src/http/users.ts +74 -52
- package/src/http/webhooks.ts +5 -2
- package/src/http/workflows.ts +1 -4
- package/src/integrations/kapso/inbound.ts +1 -1
- package/src/jira/outbound.ts +39 -8
- package/src/jira/webhook-lifecycle.ts +13 -2
- package/src/linear/outbound.ts +43 -10
- package/src/oauth/keepalive.ts +13 -2
- package/src/prompts/base-prompt.ts +1 -1
- package/src/prompts/default-drift.ts +21 -0
- package/src/prompts/session-templates.ts +56 -7
- package/src/providers/claude-adapter.ts +6 -0
- package/src/providers/codex-adapter.ts +6 -0
- package/src/providers/opencode-adapter.ts +6 -0
- package/src/providers/pi-mono-adapter.ts +8 -0
- package/src/providers/pricing-sources.md +24 -0
- package/src/queue-stall-alarm.ts +216 -0
- package/src/rbac/legacy-policy.ts +3 -0
- package/src/rbac/permissions.ts +12 -0
- package/src/scheduler/scheduler.ts +7 -0
- package/src/script-workflows/executor.ts +2 -1
- package/src/scripts-runtime/executors/native.ts +2 -1
- package/src/scripts-runtime/executors/types.ts +5 -0
- package/src/scripts-runtime/loader.ts +5 -0
- package/src/scripts-runtime/sdk-allowlist.ts +3 -0
- package/src/scripts-runtime/swarm-config.ts +8 -0
- package/src/scripts-runtime/swarm-sdk.ts +7 -0
- package/src/scripts-runtime/types/stdlib.d.ts +4 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +4 -0
- package/src/server.ts +6 -0
- package/src/slack/channel-join.ts +22 -3
- package/src/slack/channel-lifecycle.ts +114 -0
- package/src/tests/budget-claim-gate.test.ts +20 -0
- package/src/tests/claude-adapter.test.ts +32 -0
- package/src/tests/codex-adapter.test.ts +30 -0
- package/src/tests/create-task-validation.test.ts +128 -0
- package/src/tests/credential-wait.test.ts +67 -1
- package/src/tests/db-query.test.ts +711 -2
- package/src/tests/heartbeat-checklist.test.ts +28 -0
- package/src/tests/http-api-integration.test.ts +81 -0
- package/src/tests/http-users.test.ts +166 -1
- package/src/tests/identity-field-budget.test.ts +176 -0
- package/src/tests/mcp-tools-user.test.ts +34 -0
- package/src/tests/mcp-user-route.test.ts +17 -0
- package/src/tests/metrics-http.test.ts +44 -0
- package/src/tests/migration-failure.test.ts +86 -0
- package/src/tests/multi-runtime-registration.test.ts +2810 -0
- package/src/tests/openapi-response-contract.test.ts +24 -0
- package/src/tests/openapi-route-headers.test.ts +83 -0
- package/src/tests/opencode-adapter.test.ts +40 -0
- package/src/tests/outbound-listener-rejection.test.ts +138 -0
- package/src/tests/pi-mono-adapter.test.ts +98 -0
- package/src/tests/preload.ts +2 -0
- package/src/tests/profile-sync-warning.test.ts +277 -0
- package/src/tests/profile-sync.test.ts +232 -6
- package/src/tests/prompt-template-resolver.test.ts +177 -6
- package/src/tests/prompt-template-session.test.ts +39 -3
- package/src/tests/queue-stall-alarm.test.ts +226 -0
- package/src/tests/rbac-charact-slack.test.ts +29 -0
- package/src/tests/rbac-engine.test.ts +3 -0
- package/src/tests/requester-comms.test.ts +32 -0
- package/src/tests/runner-requester-profile.test.ts +38 -0
- package/src/tests/schedule-target-type.test.ts +38 -0
- package/src/tests/script-connections.test.ts +13 -1
- package/src/tests/scripts-runtime-identity.test.ts +375 -0
- package/src/tests/scripts-runtime.test.ts +4 -3
- package/src/tests/sdk-allowlist.test.ts +47 -0
- package/src/tests/send-task-requested-by.test.ts +9 -0
- package/src/tests/session-costs.test.ts +506 -1
- package/src/tests/shutdown-error-scrubbing.test.ts +92 -0
- package/src/tests/slack-channel-lifecycle.test.ts +241 -0
- package/src/tests/slack-render-v2.test.ts +43 -0
- package/src/tests/steering-core.test.ts +28 -0
- package/src/tests/swarm-config-reserved-keys.test.ts +22 -0
- package/src/tests/task-artifacts.test.ts +386 -0
- package/src/tests/task-attachments-schema.test.ts +17 -1
- package/src/tests/task-completion-idempotency.test.ts +57 -0
- package/src/tests/task-pull-request-backfill-migration.test.ts +321 -0
- package/src/tests/tool-annotations.test.ts +4 -0
- package/src/tests/update-profile-api.test.ts +67 -39
- package/src/tests/update-profile-auth.test.ts +48 -4
- package/src/tests/user-attribution-migration.test.ts +54 -0
- package/src/tests/user-identity.test.ts +72 -0
- package/src/tests/workflow-async-v2.test.ts +39 -1
- package/src/tests/workflow-http-v2.test.ts +3 -2
- package/src/tests/workflow-mcp-trigger-schema.test.ts +52 -3
- package/src/tests/workflow-retry-v2.test.ts +45 -1
- package/src/tools/db-query.ts +18 -8
- package/src/tools/get-task-details.ts +24 -3
- package/src/tools/manage-user.ts +36 -3
- package/src/tools/poll-task.ts +93 -14
- package/src/tools/script-common.ts +5 -0
- package/src/tools/send-task.ts +1 -4
- package/src/tools/slack-archive-channel.ts +70 -0
- package/src/tools/slack-create-channel.ts +74 -0
- package/src/tools/slack-invite-to-channel.ts +78 -0
- package/src/tools/store-progress.ts +13 -2
- package/src/tools/swarm-config/delete-config.ts +9 -0
- package/src/tools/swarm-config/set-config.ts +3 -2
- package/src/tools/task-action.ts +30 -0
- package/src/tools/task-tool-ctx.ts +8 -1
- package/src/tools/tool-config.ts +4 -1
- package/src/tools/update-profile.ts +16 -21
- package/src/tools/utils.ts +5 -0
- package/src/tools/workflows/trigger-workflow.ts +7 -1
- package/src/types.ts +165 -1
- package/src/utils/github-pull-request.ts +76 -0
- package/src/utils/identity-field-budget.ts +73 -0
- package/src/utils/multi-runtime.ts +20 -0
- package/src/utils/requester-comms.ts +24 -0
- package/src/workflows/engine.ts +22 -2
- package/src/workflows/resume.ts +19 -11
- package/src/workflows/retry-poller.ts +1 -0
- package/src/workflows/triggers.ts +4 -0
- package/templates/skills/db-query-guidance/config.json +14 -0
- package/templates/skills/db-query-guidance/content.md +57 -0
- package/dist/app-5da78bd4.js +0 -26
- package/dist/cli-3te4jdkm.js +0 -225
- package/dist/cli-bmze986d.js +0 -7
- package/dist/cli-kh3ba2zf.js +0 -607
- package/dist/hook-cgk4wxmx.js +0 -31
- package/dist/index-25wjsdv2.js +0 -34
- package/dist/index-76at2ymp.js +0 -7
- package/dist/index-hase6zbe.js +0 -6
- package/dist/index-vg4snay4.js +0 -36
- package/dist/index-vy8edt27.js +0 -7
- package/dist/lead-r2yqfmx7.js +0 -85
- package/dist/maintenance-mw70k468.js +0 -26
- package/dist/mistral-conversations-81fwav0j.js +0 -30578
- package/dist/otel-nqa12wf3.js +0 -3149
- package/dist/pricing-refresh-2cn6effr.js +0 -20
- package/dist/rbac-roles-vynday5g.js +0 -30
- package/dist/render-v2-tc0bh8kk.js +0 -34
- package/dist/seed-pricing-8kceb43f.js +0 -17
- package/dist/token-util-pqyc8kng.js +0 -6
- package/dist/worker-qrbz6hmv.js +0 -85
package/src/jira/outbound.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getTrackerSync, updateTrackerSync } from "../be/db-queries/tracker";
|
|
2
|
+
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
2
3
|
import { workflowEventBus } from "../workflows/event-bus";
|
|
3
4
|
import { jiraFetch } from "./client";
|
|
4
5
|
|
|
@@ -28,14 +29,44 @@ const OUTPUT_TRUNCATE_CHARS = 4000;
|
|
|
28
29
|
* as a known v1 limitation; a per-issue debounce / bounded outbound queue
|
|
29
30
|
* could be added in v2 if it becomes a real problem.
|
|
30
31
|
*/
|
|
32
|
+
/**
|
|
33
|
+
* `EventEmitter.emit()` calls listeners synchronously and discards whatever
|
|
34
|
+
* they return, so a rejected async handler is never seen by the emitting side
|
|
35
|
+
* — it escapes to the process-level `unhandledRejection` handler with no
|
|
36
|
+
* subsystem context. These wrappers observe the *complete* handler body,
|
|
37
|
+
* including work that runs before any internal `try` (e.g. `getTrackerSync`).
|
|
38
|
+
*
|
|
39
|
+
* Each wrapper is created once at module scope so `off()` is passed the exact
|
|
40
|
+
* reference `on()` registered; building them inside `init` would leave the
|
|
41
|
+
* listeners attached after teardown.
|
|
42
|
+
*/
|
|
43
|
+
function observed(
|
|
44
|
+
eventName: string,
|
|
45
|
+
handler: (data: unknown) => Promise<void>,
|
|
46
|
+
): (data: unknown) => void {
|
|
47
|
+
return (data: unknown): void => {
|
|
48
|
+
handler(data).catch((error) => {
|
|
49
|
+
console.error(
|
|
50
|
+
`[Jira Outbound] ${eventName} handler failed:`,
|
|
51
|
+
scrubSecrets(error instanceof Error ? error.message : String(error)),
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const onTaskCreated = observed("task.created", handleTaskCreated);
|
|
58
|
+
const onTaskCompleted = observed("task.completed", handleTaskCompleted);
|
|
59
|
+
const onTaskFailed = observed("task.failed", handleTaskFailed);
|
|
60
|
+
const onTaskCancelled = observed("task.cancelled", handleTaskCancelled);
|
|
61
|
+
|
|
31
62
|
export function initJiraOutboundSync(): void {
|
|
32
63
|
if (subscribed) return;
|
|
33
64
|
subscribed = true;
|
|
34
65
|
|
|
35
|
-
workflowEventBus.on("task.created",
|
|
36
|
-
workflowEventBus.on("task.completed",
|
|
37
|
-
workflowEventBus.on("task.failed",
|
|
38
|
-
workflowEventBus.on("task.cancelled",
|
|
66
|
+
workflowEventBus.on("task.created", onTaskCreated);
|
|
67
|
+
workflowEventBus.on("task.completed", onTaskCompleted);
|
|
68
|
+
workflowEventBus.on("task.failed", onTaskFailed);
|
|
69
|
+
workflowEventBus.on("task.cancelled", onTaskCancelled);
|
|
39
70
|
console.log("[Jira] Outbound sync subscribed to event bus");
|
|
40
71
|
}
|
|
41
72
|
|
|
@@ -43,10 +74,10 @@ export function teardownJiraOutboundSync(): void {
|
|
|
43
74
|
if (!subscribed) return;
|
|
44
75
|
subscribed = false;
|
|
45
76
|
|
|
46
|
-
workflowEventBus.off("task.created",
|
|
47
|
-
workflowEventBus.off("task.completed",
|
|
48
|
-
workflowEventBus.off("task.failed",
|
|
49
|
-
workflowEventBus.off("task.cancelled",
|
|
77
|
+
workflowEventBus.off("task.created", onTaskCreated);
|
|
78
|
+
workflowEventBus.off("task.completed", onTaskCompleted);
|
|
79
|
+
workflowEventBus.off("task.failed", onTaskFailed);
|
|
80
|
+
workflowEventBus.off("task.cancelled", onTaskCancelled);
|
|
50
81
|
console.log("[Jira] Outbound sync unsubscribed from event bus");
|
|
51
82
|
}
|
|
52
83
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getPublicMcpBaseUrl } from "../utils/constants";
|
|
2
|
+
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
2
3
|
import { jiraFetch } from "./client";
|
|
3
4
|
import { getJiraMetadata, updateJiraMetadata } from "./metadata";
|
|
4
5
|
|
|
@@ -359,11 +360,21 @@ export function startJiraWebhookKeepalive(): void {
|
|
|
359
360
|
// Immediate-on-boot check (after a short delay so server finishes startup
|
|
360
361
|
// and OAuth tokens are loaded). Mirrors src/oauth/keepalive.ts pattern.
|
|
361
362
|
setTimeout(() => {
|
|
362
|
-
runKeepalive()
|
|
363
|
+
runKeepalive().catch((err) =>
|
|
364
|
+
console.error(
|
|
365
|
+
"[Jira webhook keepalive] run failed:",
|
|
366
|
+
scrubSecrets(err instanceof Error ? err.message : String(err)),
|
|
367
|
+
),
|
|
368
|
+
);
|
|
363
369
|
}, 10_000);
|
|
364
370
|
|
|
365
371
|
keepaliveInterval = setInterval(() => {
|
|
366
|
-
runKeepalive()
|
|
372
|
+
runKeepalive().catch((err) =>
|
|
373
|
+
console.error(
|
|
374
|
+
"[Jira webhook keepalive] run failed:",
|
|
375
|
+
scrubSecrets(err instanceof Error ? err.message : String(err)),
|
|
376
|
+
),
|
|
377
|
+
);
|
|
367
378
|
}, TWELVE_HOURS_MS);
|
|
368
379
|
}
|
|
369
380
|
|
package/src/linear/outbound.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getTrackerSync, updateTrackerSync } from "../be/db-queries/tracker";
|
|
2
2
|
import { ensureToken } from "../oauth/ensure-token";
|
|
3
|
+
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
3
4
|
import { workflowEventBus } from "../workflows/event-bus";
|
|
4
5
|
import { getLinearClient, resetLinearClient } from "./client";
|
|
5
6
|
import { endAgentSession, postAgentSessionAction, taskSessionMap } from "./sync";
|
|
@@ -8,15 +9,47 @@ let subscribed = false;
|
|
|
8
9
|
|
|
9
10
|
const LOOP_PREVENTION_WINDOW_MS = 5_000;
|
|
10
11
|
|
|
12
|
+
/**
|
|
13
|
+
* `EventEmitter.emit()` calls listeners synchronously and discards whatever
|
|
14
|
+
* they return, so a rejected async handler is never seen by the emitting side
|
|
15
|
+
* — it escapes to the process-level `unhandledRejection` handler with no
|
|
16
|
+
* subsystem context. These wrappers observe the *complete* handler body,
|
|
17
|
+
* including work that runs before any internal `try` (e.g. `getTrackerSync`)
|
|
18
|
+
* and the `updateTrackerSync` write that runs after it.
|
|
19
|
+
*
|
|
20
|
+
* Each wrapper is created once at module scope so `off()` is passed the exact
|
|
21
|
+
* reference `on()` registered; building them inside `init` would leave the
|
|
22
|
+
* listeners attached after teardown.
|
|
23
|
+
*/
|
|
24
|
+
function observed(
|
|
25
|
+
eventName: string,
|
|
26
|
+
handler: (data: unknown) => Promise<void>,
|
|
27
|
+
): (data: unknown) => void {
|
|
28
|
+
return (data: unknown): void => {
|
|
29
|
+
handler(data).catch((error) => {
|
|
30
|
+
console.error(
|
|
31
|
+
`[Linear Outbound] ${eventName} handler failed:`,
|
|
32
|
+
scrubSecrets(error instanceof Error ? error.message : String(error)),
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const onTaskCreated = observed("task.created", handleTaskCreated);
|
|
39
|
+
const onTaskCompleted = observed("task.completed", handleTaskCompleted);
|
|
40
|
+
const onTaskFailed = observed("task.failed", handleTaskFailed);
|
|
41
|
+
const onTaskCancelled = observed("task.cancelled", handleTaskCancelled);
|
|
42
|
+
const onTaskProgress = observed("task.progress", handleTaskProgress);
|
|
43
|
+
|
|
11
44
|
export function initLinearOutboundSync(): void {
|
|
12
45
|
if (subscribed) return;
|
|
13
46
|
subscribed = true;
|
|
14
47
|
|
|
15
|
-
workflowEventBus.on("task.created",
|
|
16
|
-
workflowEventBus.on("task.completed",
|
|
17
|
-
workflowEventBus.on("task.failed",
|
|
18
|
-
workflowEventBus.on("task.cancelled",
|
|
19
|
-
workflowEventBus.on("task.progress",
|
|
48
|
+
workflowEventBus.on("task.created", onTaskCreated);
|
|
49
|
+
workflowEventBus.on("task.completed", onTaskCompleted);
|
|
50
|
+
workflowEventBus.on("task.failed", onTaskFailed);
|
|
51
|
+
workflowEventBus.on("task.cancelled", onTaskCancelled);
|
|
52
|
+
workflowEventBus.on("task.progress", onTaskProgress);
|
|
20
53
|
console.log("[Linear] Outbound sync subscribed to event bus");
|
|
21
54
|
}
|
|
22
55
|
|
|
@@ -24,11 +57,11 @@ export function teardownLinearOutboundSync(): void {
|
|
|
24
57
|
if (!subscribed) return;
|
|
25
58
|
subscribed = false;
|
|
26
59
|
|
|
27
|
-
workflowEventBus.off("task.created",
|
|
28
|
-
workflowEventBus.off("task.completed",
|
|
29
|
-
workflowEventBus.off("task.failed",
|
|
30
|
-
workflowEventBus.off("task.cancelled",
|
|
31
|
-
workflowEventBus.off("task.progress",
|
|
60
|
+
workflowEventBus.off("task.created", onTaskCreated);
|
|
61
|
+
workflowEventBus.off("task.completed", onTaskCompleted);
|
|
62
|
+
workflowEventBus.off("task.failed", onTaskFailed);
|
|
63
|
+
workflowEventBus.off("task.cancelled", onTaskCancelled);
|
|
64
|
+
workflowEventBus.off("task.progress", onTaskProgress);
|
|
32
65
|
console.log("[Linear] Outbound sync unsubscribed from event bus");
|
|
33
66
|
}
|
|
34
67
|
|
package/src/oauth/keepalive.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { listKeepAliveAuthorizations } from "../be/db-queries/oauth";
|
|
2
|
+
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
2
3
|
import { ensureAuthorizationTokenOrThrow } from "./ensure-token";
|
|
3
4
|
|
|
4
5
|
// Keep refresh tokens warm without constantly rotating strict-rotation
|
|
@@ -115,11 +116,21 @@ export function startOAuthKeepalive(): void {
|
|
|
115
116
|
// Run once after a short delay (let server finish startup).
|
|
116
117
|
startupKeepaliveTimeout = setTimeout(() => {
|
|
117
118
|
startupKeepaliveTimeout = null;
|
|
118
|
-
scheduleKeepaliveRun("startup")
|
|
119
|
+
scheduleKeepaliveRun("startup").catch((err) =>
|
|
120
|
+
console.error(
|
|
121
|
+
"[OAuth Keepalive] startup run failed:",
|
|
122
|
+
scrubSecrets(err instanceof Error ? err.message : String(err)),
|
|
123
|
+
),
|
|
124
|
+
);
|
|
119
125
|
}, STARTUP_KEEPALIVE_DELAY_MS);
|
|
120
126
|
|
|
121
127
|
keepaliveInterval = setInterval(() => {
|
|
122
|
-
scheduleKeepaliveRun("interval")
|
|
128
|
+
scheduleKeepaliveRun("interval").catch((err) =>
|
|
129
|
+
console.error(
|
|
130
|
+
"[OAuth Keepalive] interval run failed:",
|
|
131
|
+
scrubSecrets(err instanceof Error ? err.message : String(err)),
|
|
132
|
+
),
|
|
133
|
+
);
|
|
123
134
|
}, KEEPALIVE_INTERVAL_MS);
|
|
124
135
|
}
|
|
125
136
|
|
|
@@ -16,7 +16,7 @@ import { resolveTemplateAsync } from "./resolver";
|
|
|
16
16
|
import "./session-templates";
|
|
17
17
|
|
|
18
18
|
/** Max characters per individual injected section before truncation */
|
|
19
|
-
const BOOTSTRAP_MAX_CHARS = 20_000;
|
|
19
|
+
export const BOOTSTRAP_MAX_CHARS = 20_000;
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Max total characters across all injected sections combined.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface PromptTemplateDefaultDrift {
|
|
2
|
+
defaultDrifted: boolean;
|
|
3
|
+
customizedBytes: number;
|
|
4
|
+
defaultBytes: number;
|
|
5
|
+
byteDelta: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getPromptTemplateDefaultDrift(
|
|
9
|
+
template: { body: string; isDefault: boolean },
|
|
10
|
+
defaultBody: string,
|
|
11
|
+
): PromptTemplateDefaultDrift {
|
|
12
|
+
const customizedBytes = Buffer.byteLength(template.body, "utf8");
|
|
13
|
+
const defaultBytes = Buffer.byteLength(defaultBody, "utf8");
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
defaultDrifted: !template.isDefault && template.body !== defaultBody,
|
|
17
|
+
customizedBytes,
|
|
18
|
+
defaultBytes,
|
|
19
|
+
byteDelta: defaultBytes - customizedBytes,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -63,7 +63,7 @@ As the lead agent, you coordinate all worker agents in the swarm.
|
|
|
63
63
|
|
|
64
64
|
**Identity:**
|
|
65
65
|
- \`update-profile\`: Update your own or other agents' profile fields (name, role, capabilities, soulMd, identityMd, heartbeatMd, claudeMd, toolsMd, setupScript)
|
|
66
|
-
- \`manage-user\`: Register or update human users (resolve from GitHub/GitLab identity or other source metadata)
|
|
66
|
+
- \`manage-user\`: Register or update human users (resolve from GitHub/GitLab identity or other source metadata). When you learn a requester's stable communication preferences (tone, language, verbosity), persist them with its \`comms\` field so future sessions adapt.
|
|
67
67
|
|
|
68
68
|
#### Task Routing
|
|
69
69
|
|
|
@@ -145,6 +145,17 @@ As a worker agent of the swarm, you are responsible for executing tasks assigned
|
|
|
145
145
|
- Each worker focuses on specific tasks or objectives, contributing to the overall goals of the swarm.
|
|
146
146
|
- Workers MUST report their progress back to the lead and collaborate with other workers as needed.
|
|
147
147
|
|
|
148
|
+
#### Skills (CHECK BEFORE STARTING WORK)
|
|
149
|
+
|
|
150
|
+
You have installed skills with tested procedures for common tasks. Before doing manual research or implementation, check the installed skill catalog and invoke a matching skill first.
|
|
151
|
+
|
|
152
|
+
Examples:
|
|
153
|
+
- Researching a codebase → use \`researching\`
|
|
154
|
+
- Planning an implementation → use \`planning\`
|
|
155
|
+
- Reviewing code changes → use \`code-reviewing\`
|
|
156
|
+
|
|
157
|
+
**Rule: If a skill exists for your task type, USE IT. Do not research what the skill already documents.**
|
|
158
|
+
|
|
148
159
|
#### Useful tools for workers
|
|
149
160
|
|
|
150
161
|
- \`store-progress\`: Save your work progress on tasks (critical!)
|
|
@@ -803,6 +814,32 @@ When working in a repository, your system prompt may include a **Repository Guid
|
|
|
803
814
|
category: "system",
|
|
804
815
|
});
|
|
805
816
|
|
|
817
|
+
registerTemplate({
|
|
818
|
+
eventType: "system.agent.communication_style",
|
|
819
|
+
header: "",
|
|
820
|
+
defaultBody: `
|
|
821
|
+
### Communication Style
|
|
822
|
+
|
|
823
|
+
Your persona lives in your SOUL.md (see Your Identity, when present). It defines who you are. The rules below define how you write, whoever you are.
|
|
824
|
+
|
|
825
|
+
They govern everything a human reads from you: Slack, PR and issue comments, tickets, email, pages, and task summaries.
|
|
826
|
+
|
|
827
|
+
- Write like a person, not a press release. Plain words, direct statements.
|
|
828
|
+
- Lead with the outcome or the answer. Context comes after.
|
|
829
|
+
- Keep sentences short (25 words or fewer). One idea per sentence.
|
|
830
|
+
- Use active voice. Say who did what.
|
|
831
|
+
- Never use em dashes. Use a period, a comma, a colon, or parentheses.
|
|
832
|
+
- No marketing adjectives (seamless, robust, powerful). State the fact that earns the claim instead.
|
|
833
|
+
- No hedge stacks ("might possibly perhaps"). Keep a hedge only when you are genuinely unsure, and keep it: "may have failed" never becomes "failed".
|
|
834
|
+
- No filler ("I hope this helps", "Great question!") and no formal sign-offs.
|
|
835
|
+
- If something is broken, blocked, or a bad idea, say so plainly and say why.
|
|
836
|
+
- Mirror the requester: reply in the language they wrote in, match their register, and answer at the depth they asked. A one-line question gets the answer first, detail after.
|
|
837
|
+
- If a Requester Profile section is present, it wins on tone, depth, and format. Correctness always wins over style.
|
|
838
|
+
`,
|
|
839
|
+
variables: [],
|
|
840
|
+
category: "system",
|
|
841
|
+
});
|
|
842
|
+
|
|
806
843
|
// ============================================================================
|
|
807
844
|
// Per-task prompt templates (category: "task_lifecycle")
|
|
808
845
|
// ============================================================================
|
|
@@ -812,12 +849,18 @@ registerTemplate({
|
|
|
812
849
|
header: "",
|
|
813
850
|
defaultBody: `
|
|
814
851
|
## Requester Profile
|
|
815
|
-
This task was requested by {{requester_name}}{{requester_role_suffix}}.{{requester_notes_section}}
|
|
852
|
+
This task was requested by {{requester_name}}{{requester_role_suffix}}.{{requester_comms_section}}{{requester_notes_section}}
|
|
816
853
|
Honor this requester profile in tone, depth, and format where it doesn't conflict with correctness or your operating rules.
|
|
854
|
+
If this task reveals new stable communication preferences for this requester, persist them: the lead updates \`comms\` (tone, language, verbosity) via \`manage-user\`.
|
|
817
855
|
`,
|
|
818
856
|
variables: [
|
|
819
857
|
{ name: "requester_name", description: "The requesting user's display name" },
|
|
820
858
|
{ name: "requester_role_suffix", description: "Formatted role suffix, including parentheses" },
|
|
859
|
+
{
|
|
860
|
+
name: "requester_comms_section",
|
|
861
|
+
description:
|
|
862
|
+
"Formatted communication preferences (tone/language/verbosity) sourced from users.metadata.comms, or empty string",
|
|
863
|
+
},
|
|
821
864
|
{
|
|
822
865
|
name: "requester_notes_section",
|
|
823
866
|
description: "Formatted notes section sourced from users.notes, or empty string",
|
|
@@ -859,7 +902,8 @@ registerTemplate({
|
|
|
859
902
|
|
|
860
903
|
{{@template[system.agent.system]}}
|
|
861
904
|
{{@template[system.agent.share_urls]}}
|
|
862
|
-
{{@template[system.agent.code_quality]}}
|
|
905
|
+
{{@template[system.agent.code_quality]}}
|
|
906
|
+
{{@template[system.agent.communication_style]}}`,
|
|
863
907
|
variables: [
|
|
864
908
|
{ name: "role", description: "The agent's role" },
|
|
865
909
|
{ name: "agentId", description: "The agent's unique identifier" },
|
|
@@ -881,7 +925,8 @@ registerTemplate({
|
|
|
881
925
|
|
|
882
926
|
{{@template[system.agent.system]}}
|
|
883
927
|
{{@template[system.agent.share_urls]}}
|
|
884
|
-
{{@template[system.agent.code_quality]}}
|
|
928
|
+
{{@template[system.agent.code_quality]}}
|
|
929
|
+
{{@template[system.agent.communication_style]}}`,
|
|
885
930
|
variables: [
|
|
886
931
|
{ name: "role", description: "The agent's role" },
|
|
887
932
|
{ name: "agentId", description: "The agent's unique identifier" },
|
|
@@ -910,7 +955,8 @@ registerTemplate({
|
|
|
910
955
|
|
|
911
956
|
{{@template[system.agent.system]}}
|
|
912
957
|
{{@template[system.agent.share_urls]}}
|
|
913
|
-
{{@template[system.agent.code_quality]}}
|
|
958
|
+
{{@template[system.agent.code_quality]}}
|
|
959
|
+
{{@template[system.agent.communication_style]}}`,
|
|
914
960
|
variables: [
|
|
915
961
|
{ name: "role", description: "The agent's role" },
|
|
916
962
|
{ name: "agentId", description: "The agent's unique identifier" },
|
|
@@ -939,7 +985,8 @@ registerTemplate({
|
|
|
939
985
|
|
|
940
986
|
{{@template[system.agent.system]}}
|
|
941
987
|
{{@template[system.agent.share_urls]}}
|
|
942
|
-
{{@template[system.agent.code_quality]}}
|
|
988
|
+
{{@template[system.agent.code_quality]}}
|
|
989
|
+
{{@template[system.agent.communication_style]}}`,
|
|
943
990
|
variables: [
|
|
944
991
|
{ name: "role", description: "The agent's role" },
|
|
945
992
|
{ name: "agentId", description: "The agent's unique identifier" },
|
|
@@ -982,7 +1029,9 @@ registerTemplate({
|
|
|
982
1029
|
header: "",
|
|
983
1030
|
defaultBody: `{{@template[system.agent.role]}}
|
|
984
1031
|
|
|
985
|
-
{{@template[system.agent.worker.remote]}}
|
|
1032
|
+
{{@template[system.agent.worker.remote]}}
|
|
1033
|
+
|
|
1034
|
+
{{@template[system.agent.communication_style]}}`,
|
|
986
1035
|
variables: [
|
|
987
1036
|
{ name: "role", description: "The agent's role" },
|
|
988
1037
|
{ name: "agentId", description: "The agent's unique identifier" },
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
trackErrorFromJson,
|
|
20
20
|
} from "../utils/error-tracker";
|
|
21
21
|
import { fetchInstalledMcpServers } from "../utils/mcp-server-fetcher";
|
|
22
|
+
import { swarmRuntimeInstanceId } from "../utils/multi-runtime";
|
|
22
23
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
23
24
|
import { CTX_MODE_NUDGE_EVERY } from "./ctx-mode-env";
|
|
24
25
|
import { buildOtelTraceparentEnv, isHarnessOtelEnabled } from "./otel-env";
|
|
@@ -332,6 +333,7 @@ export function mergeMcpConfig(
|
|
|
332
333
|
installedServers: Record<string, Record<string, unknown>> | null,
|
|
333
334
|
taskId: string,
|
|
334
335
|
contextKey?: string,
|
|
336
|
+
runtimeInstanceId?: string,
|
|
335
337
|
): { mcpServers: Record<string, unknown> } {
|
|
336
338
|
const config: { mcpServers: Record<string, unknown> } = {
|
|
337
339
|
mcpServers: { ...(baseConfig?.mcpServers ?? {}) },
|
|
@@ -360,6 +362,9 @@ export function mergeMcpConfig(
|
|
|
360
362
|
if (contextKey) {
|
|
361
363
|
(server.headers as Record<string, string>)["X-Context-Key"] = contextKey;
|
|
362
364
|
}
|
|
365
|
+
if (runtimeInstanceId) {
|
|
366
|
+
(server.headers as Record<string, string>)["X-Runtime-Instance-ID"] = runtimeInstanceId;
|
|
367
|
+
}
|
|
363
368
|
}
|
|
364
369
|
|
|
365
370
|
return config;
|
|
@@ -434,6 +439,7 @@ export async function createSessionMcpConfig(
|
|
|
434
439
|
installedServers ?? null,
|
|
435
440
|
taskId,
|
|
436
441
|
contextKey,
|
|
442
|
+
swarmRuntimeInstanceId(),
|
|
437
443
|
);
|
|
438
444
|
const sessionConfigPath = `/tmp/mcp-${taskId}.json`;
|
|
439
445
|
await writeFile(sessionConfigPath, JSON.stringify(config, null, 2));
|
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
} from "../utils/context-window";
|
|
78
78
|
import { SessionErrorTracker } from "../utils/error-tracker";
|
|
79
79
|
import { summarizeSession as runSummarize } from "../utils/internal-ai";
|
|
80
|
+
import { swarmRuntimeInstanceId } from "../utils/multi-runtime";
|
|
80
81
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
81
82
|
import { type CodexAgentsMdHandle, writeCodexAgentsMd } from "./codex-agents-md";
|
|
82
83
|
import { computeCodexCostUsd, getCodexContextWindow, resolveCodexModel } from "./codex-models";
|
|
@@ -365,12 +366,17 @@ export async function buildCodexConfig(
|
|
|
365
366
|
// (2) Swarm MCP server — Streamable HTTP transport.
|
|
366
367
|
// Field names verified against https://developers.openai.com/codex/mcp:
|
|
367
368
|
// `url`, `http_headers`, `enabled`, `startup_timeout_sec`, `tool_timeout_sec`.
|
|
369
|
+
// Same per-boot runtime identity the runner registers with — dispatch tools
|
|
370
|
+
// require it in multi-runtime mode, and it travels as request context, not
|
|
371
|
+
// as a tool argument.
|
|
372
|
+
const runtimeInstanceId = swarmRuntimeInstanceId();
|
|
368
373
|
mcpServers["agent-swarm"] = {
|
|
369
374
|
url: `${config.apiUrl}/mcp`,
|
|
370
375
|
http_headers: {
|
|
371
376
|
Authorization: `Bearer ${config.apiKey}`,
|
|
372
377
|
"X-Agent-ID": config.agentId,
|
|
373
378
|
"X-Source-Task-Id": config.taskId ?? "",
|
|
379
|
+
...(runtimeInstanceId ? { "X-Runtime-Instance-ID": runtimeInstanceId } : {}),
|
|
374
380
|
},
|
|
375
381
|
enabled: true,
|
|
376
382
|
startup_timeout_sec: 30,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from "../utils/context-window";
|
|
20
20
|
import { validateOpencodeCredentials } from "../utils/credentials";
|
|
21
21
|
import { fetchInstalledMcpServers } from "../utils/mcp-server-fetcher";
|
|
22
|
+
import { swarmRuntimeInstanceId } from "../utils/multi-runtime";
|
|
22
23
|
import { DEFAULT_OPENROUTER_BASE_URL, getOpenRouterBaseUrl } from "../utils/openrouter-base-url";
|
|
23
24
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
24
25
|
import { resolveSlashSkillPrompt } from "./codex-skill-resolver";
|
|
@@ -726,6 +727,10 @@ export class OpencodeAdapter implements ProviderAdapter {
|
|
|
726
727
|
const installedMcp =
|
|
727
728
|
(await fetchInstalledMcpServers(config.apiUrl, config.apiKey, config.agentId, "opencode")) ??
|
|
728
729
|
{};
|
|
730
|
+
// Same per-boot runtime identity the runner registers with — dispatch
|
|
731
|
+
// tools require it in multi-runtime mode, and it travels as request
|
|
732
|
+
// context, not as a tool argument.
|
|
733
|
+
const runtimeInstanceId = swarmRuntimeInstanceId();
|
|
729
734
|
const mcpConfig: Config["mcp"] = {
|
|
730
735
|
swarm: {
|
|
731
736
|
type: "remote",
|
|
@@ -733,6 +738,7 @@ export class OpencodeAdapter implements ProviderAdapter {
|
|
|
733
738
|
headers: {
|
|
734
739
|
Authorization: `Bearer ${config.apiKey}`,
|
|
735
740
|
"X-Agent-ID": config.agentId,
|
|
741
|
+
...(runtimeInstanceId ? { "X-Runtime-Instance-ID": runtimeInstanceId } : {}),
|
|
736
742
|
},
|
|
737
743
|
},
|
|
738
744
|
...installedMcp,
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
} from "@earendil-works/pi-coding-agent";
|
|
29
29
|
import { type TSchema, Type } from "typebox";
|
|
30
30
|
import { classifyAwsSdkError } from "../utils/aws-error-classifier";
|
|
31
|
+
import { swarmRuntimeInstanceId } from "../utils/multi-runtime";
|
|
31
32
|
import { DEFAULT_OPENROUTER_BASE_URL, getOpenRouterBaseUrl } from "../utils/openrouter-base-url";
|
|
32
33
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
33
34
|
import { readPkgVersion } from "./harness-version";
|
|
@@ -1089,6 +1090,13 @@ export class PiMonoAdapter implements ProviderAdapter {
|
|
|
1089
1090
|
config.agentId,
|
|
1090
1091
|
config.taskId,
|
|
1091
1092
|
);
|
|
1093
|
+
// Same per-boot runtime identity the runner registers with — dispatch
|
|
1094
|
+
// tools require it in multi-runtime mode, and it travels as request
|
|
1095
|
+
// context, not as a tool argument.
|
|
1096
|
+
const runtimeInstanceId = swarmRuntimeInstanceId();
|
|
1097
|
+
if (runtimeInstanceId) {
|
|
1098
|
+
mcpClient.customHeaders["X-Runtime-Instance-ID"] = runtimeInstanceId;
|
|
1099
|
+
}
|
|
1092
1100
|
await mcpClient.initialize();
|
|
1093
1101
|
const tools = await mcpClient.listTools();
|
|
1094
1102
|
customTools = mcpToolsToDefinitions(mcpClient, tools);
|
|
@@ -84,6 +84,30 @@ Unlike token rates — where a missing rate marks the whole row
|
|
|
84
84
|
That asymmetry is deliberate (a small request fee shouldn't unprice an entire
|
|
85
85
|
session) and is documented in the cost-and-context-computation guide.
|
|
86
86
|
|
|
87
|
+
## Attribution reporting contract
|
|
88
|
+
|
|
89
|
+
Usage reporting keeps total spend separate from the cost population that can
|
|
90
|
+
truthfully carry a human requester:
|
|
91
|
+
|
|
92
|
+
- `attributableCostUsd` is total cost minus structurally human-free work;
|
|
93
|
+
coverage is `attributedCostUsd / attributableCostUsd`.
|
|
94
|
+
- `excludedCostUsd` and `excludedTaskCount` retain visibility into the removed
|
|
95
|
+
population. A stale requester id on structurally human-free work does not put
|
|
96
|
+
that cost back into either side of the coverage ratio.
|
|
97
|
+
- Human-free seeds are the `heartbeat`, `heartbeat-checklist`, and
|
|
98
|
+
`boot-triage` task types; legacy JSON tag rows matched by the `heartbeat`
|
|
99
|
+
tags `LIKE` check; creatorless schedules (including their workflow roots);
|
|
100
|
+
and requester-less system follow-ups of requester-less parents.
|
|
101
|
+
- The classification propagates through requester-less descendants. An
|
|
102
|
+
explicitly attributed child is a human handoff and stops propagation down
|
|
103
|
+
that branch.
|
|
104
|
+
|
|
105
|
+
The per-person report uses the same requester data model without grouping the
|
|
106
|
+
cost denominator or turning it into a leaderboard. Human-requested root tasks
|
|
107
|
+
determine Problems Initiated and Problems Shipped; their full task trees
|
|
108
|
+
determine Agents, Repos, and Surfaces Reached. Requester-less autonomous roots
|
|
109
|
+
and heartbeat-classified roots are omitted, and the metrics remain separate.
|
|
110
|
+
|
|
87
111
|
## Provider pricing caveats
|
|
88
112
|
|
|
89
113
|
- **Claude Sonnet 5 introductory rate:** Anthropic's pricing page lists
|