@desplega.ai/agent-swarm 2.7.4 → 2.7.5
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-g3ads55s.js +15 -0
- package/dist/{actions-gfrr9vb7.js → actions-zwfykqqk.js} +18 -18
- package/dist/{amp-adapter-0s58gm46.js → amp-adapter-z3s0ssdt.js} +3 -3
- package/dist/{app-stvq692g.js → app-vmp4fgep.js} +3 -3
- package/dist/{assistant-5s37fr9n.js → assistant-vwde653f.js} +28 -21
- package/dist/{boot-reembed-yzy1841n.js → boot-reembed-375t7tbk.js} +1 -1
- package/dist/{boot-reembed-cv82gz7y.js → boot-reembed-gq9rcpnj.js} +1 -1
- package/dist/{boot-scrub-sweep-8k4q95ap.js → boot-scrub-sweep-nd938kyf.js} +4 -4
- package/dist/{boot-seeds-ftt9htah.js → boot-seeds-aykx51v3.js} +4 -4
- package/dist/{boxd-515v1t8z.js → boxd-k1j26g3h.js} +1 -1
- package/dist/{claude-adapter-t00wrzeh.js → claude-adapter-8j4hm099.js} +7 -7
- package/dist/{claude-managed-adapter-g6vmjccb.js → claude-managed-adapter-dvs2xw5n.js} +2 -2
- package/dist/{claude-managed-setup-afpa82f7.js → claude-managed-setup-0wyynpn1.js} +3 -3
- package/dist/{claude-sdk-session-vj0c2azx.js → claude-sdk-session-q6wj5hmy.js} +9 -9
- package/dist/{cli-wndv9p7g.js → cli-0731hvbw.js} +6 -6
- package/dist/{cli-d2pzqej1.js → cli-0bxqnvq9.js} +719 -7
- package/dist/{cli-jkt52mgt.js → cli-0gey5fzy.js} +2 -2
- package/dist/{cli-1yekbyqm.js → cli-1338796d.js} +205 -48
- package/dist/{cli-1s1dqn1j.js → cli-1ayk1eas.js} +171 -123
- package/dist/{cli-a4btqqft.js → cli-1b7btd38.js} +1 -1
- package/dist/{cli-a2jw6ee5.js → cli-1p89xny0.js} +1 -1
- package/dist/{cli-v726afdm.js → cli-2pnswgh8.js} +1 -1
- package/dist/{cli-kvtc7aez.js → cli-3h4nhjn8.js} +42 -14
- package/dist/{cli-655xm9ms.js → cli-583frbyr.js} +1 -1
- package/dist/{cli-4r12t6w6.js → cli-5c4hjzne.js} +101 -4
- package/dist/{cli-az0bpf8p.js → cli-5pag6rmn.js} +3 -3
- package/dist/{cli-36g23z21.js → cli-6s7vdcta.js} +4 -4
- package/dist/{cli-rtk9g7av.js → cli-73jzwksr.js} +6 -2
- package/dist/{cli-jg0nfda6.js → cli-75gkpjvw.js} +52 -21
- package/dist/{cli-a81qevyg.js → cli-7a42nfy0.js} +20 -36
- package/dist/{cli-0sbkss7h.js → cli-7wcyk2s5.js} +2 -2
- package/dist/{cli-41z8xwj0.js → cli-7wspm5gm.js} +14 -4
- package/dist/{cli-byqfbnjw.js → cli-82ae98pz.js} +9 -9
- package/dist/{cli-bq2pcphn.js → cli-8hs41zy2.js} +1 -1
- package/dist/{cli-vqgnyh76.js → cli-98rw5dt5.js} +15 -3
- package/dist/{cli-9cctx1tn.js → cli-a22h291q.js} +1 -1
- package/dist/{cli-j4kt1mpb.js → cli-a47xy8eq.js} +3 -3
- package/dist/{cli-ycm6180s.js → cli-a7v854rf.js} +5 -3
- package/dist/{cli-98pke4vk.js → cli-ae7mrdf9.js} +2 -2
- package/dist/{cli-ahd90bwt.js → cli-afrrppsw.js} +6 -6
- package/dist/{cli-8yy525ad.js → cli-bhjt02p8.js} +2 -2
- package/dist/{cli-v1yw3wha.js → cli-bnz7a7qf.js} +4 -4
- package/dist/{cli-j4kw3rsx.js → cli-cm5yqn35.js} +18 -0
- package/dist/{cli-h55y2bjc.js → cli-dhar9qay.js} +2 -2
- package/dist/{cli-5gr1g711.js → cli-fqzx7gwa.js} +2 -2
- package/dist/{cli-tzrpv5sc.js → cli-ftyxyspd.js} +1 -1
- package/dist/cli-fw2w0kva.js +47 -0
- package/dist/{cli-2dfbv8qr.js → cli-fy6x31ps.js} +1 -0
- package/dist/{cli-mvckssyq.js → cli-g61qxmge.js} +5 -5
- package/dist/{cli-aq58fk5m.js → cli-g83s9ewh.js} +7 -1
- package/dist/{cli-224epwwf.js → cli-hn9hxmz9.js} +3 -3
- package/dist/{cli-5hjced2v.js → cli-j3jvnpe8.js} +6 -6
- package/dist/{cli-dae4sbgy.js → cli-jm2vfpfd.js} +2 -2
- package/dist/{cli-zn15c46z.js → cli-mjzynrse.js} +1 -1
- package/dist/{cli-a1fhj4n9.js → cli-mmwm7zbf.js} +2 -2
- package/dist/{cli-cq1pf336.js → cli-mry0qzym.js} +5 -5
- package/dist/{cli-bwty35gx.js → cli-mthwvjre.js} +1 -1
- package/dist/{cli-s0exq74r.js → cli-nmbmy64z.js} +3 -3
- package/dist/{cli-wcmnan2g.js → cli-nn4d8dne.js} +5 -5
- package/dist/{cli-jg4p5t36.js → cli-nzxr556s.js} +121 -51
- package/dist/{cli-bcz074zx.js → cli-p599f1qm.js} +1 -1
- package/dist/{cli-k76tgq03.js → cli-pywf3eh5.js} +2 -2
- package/dist/{cli-wk9md5px.js → cli-qxnf8z2z.js} +2 -2
- package/dist/{cli-je8yeyc5.js → cli-rhw40jgb.js} +5 -5
- package/dist/{cli-avgcz4ra.js → cli-rm6hqj3z.js} +406 -35
- package/dist/{cli-0fgr1w9b.js → cli-rpm2sgv0.js} +2 -2
- package/dist/{cli-t282jgab.js → cli-rqkxrmgw.js} +12 -12
- package/dist/{cli-2qpvmmkw.js → cli-s0qnd4wv.js} +1 -1
- package/dist/{cli-pwyevs29.js → cli-spknvxbq.js} +22 -21
- package/dist/{cli-9y354g3j.js → cli-srye3vdt.js} +1 -1
- package/dist/{cli-pe09p6dv.js → cli-tqgg40ek.js} +1 -1
- package/dist/{cli-f255yaqn.js → cli-vbyfwh92.js} +3 -3
- package/dist/{cli-gcbdjt47.js → cli-vfym7wmz.js} +6 -6
- package/dist/{cli-edmm9d9y.js → cli-vqypxzh4.js} +7 -7
- package/dist/{cli-1gm8jcyr.js → cli-wvaawacd.js} +13 -13
- package/dist/{cli-eny54typ.js → cli-wx3rhnm0.js} +1 -1
- package/dist/{cli-b1afgtj3.js → cli-xbkdm710.js} +3 -3
- package/dist/{cli-mc97xy2s.js → cli-xtjhfmpc.js} +16 -4
- package/dist/{cli-eqx6k993.js → cli-y24sc29k.js} +25 -13
- package/dist/{cli-ktmvb20s.js → cli-z6jkx23q.js} +12 -12
- package/dist/{cli-7n5sbw0z.js → cli-z8eh3ex8.js} +5 -5
- package/dist/cli-zh3fp8v2.js +151 -0
- package/dist/{cli-13jvmew3.js → cli-zppwg9p9.js} +7 -7
- package/dist/cli.js +18 -18
- package/dist/{codex-adapter-g0gctw29.js → codex-adapter-q6k3gnyg.js} +5 -5
- package/dist/{codex-hook-vrzz2xhr.js → codex-hook-9efm2x1m.js} +1 -1
- package/dist/{codex-login-0gg46ygn.js → codex-login-y0pmff1c.js} +1 -1
- package/dist/{codex-session-runner-dr2cxe1c.js → codex-session-runner-3mwmk3d9.js} +6 -6
- package/dist/{commands-1p07cvff.js → commands-evrenjn9.js} +2 -2
- package/dist/{controller-z0s7sv6r.js → controller-xjp8vswh.js} +4 -4
- package/dist/{controllers-connect-x9kvvhyk.js → controllers-connect-pp5jnxvc.js} +20 -20
- package/dist/{cursor-adapter-m5b98pvk.js → cursor-adapter-yf47w4t0.js} +2 -2
- package/dist/{db-rsh04kh3.js → db-rgfsh91f.js} +2 -2
- package/dist/{db-capk2raj.js → db-zxpw6aht.js} +3 -3
- package/dist/{devin-adapter-yxm87fe9.js → devin-adapter-r9phbnc9.js} +1 -1
- package/dist/{dispatcher-304q6fwa.js → dispatcher-smasgws7.js} +17 -17
- package/dist/{docker-7rxt0rry.js → docker-rrjhaqt9.js} +2 -2
- package/dist/{dsh-adapter-btewem0y.js → dsh-adapter-ftyy8dnp.js} +2 -2
- package/dist/{e2b-renc0k8q.js → e2b-qcaj675y.js} +2 -2
- package/dist/{e2b-7fc9b9bd.js → e2b-w1p0bnpm.js} +2 -2
- package/dist/{easter-egg-3d-fm1p3n4d.js → easter-egg-3d-yyts7p16.js} +1 -1
- package/dist/{embedding-space-s68v49ct.js → embedding-space-1z0mbg95.js} +6 -6
- package/dist/{embeddings-4ms3604w.js → embeddings-ygeg7tm7.js} +1 -1
- package/dist/{event-bus-dfjx2qdh.js → event-bus-g0ka3pbw.js} +1 -1
- package/dist/{execute-mcdgccjs.js → execute-14qhqp4d.js} +1 -1
- package/dist/{external-channel-9dxwfztn.js → external-channel-ttgrs3sx.js} +2 -2
- package/dist/fx-adapter-gt6pncj2.js +18 -0
- package/dist/{grok-adapter-05ecv4h0.js → grok-adapter-sm4m5k4g.js} +8 -8
- package/dist/handlers-vwmba1m2.js +31 -0
- package/dist/{heartbeat-3n94heh3.js → heartbeat-qahz4p62.js} +20 -20
- package/dist/{hook-zxwje86c.js → hook-4fd5wq5w.js} +4 -4
- package/dist/{hook-aadrn69x.js → hook-kj3d398m.js} +6 -6
- package/dist/{http-xzxk9mst.js → http-1ted0j1k.js} +100 -64
- package/dist/index-5r71rf98.js +32 -0
- package/dist/{index-d34f6r87.js → index-6rq3r5zb.js} +1 -1
- package/dist/{index-9j4zwcht.js → index-7v51awbn.js} +158 -672
- package/dist/index-anmwxs87.js +29 -0
- package/dist/{index-qeb82z37.js → index-q4b917zs.js} +1 -1
- package/dist/index-spp0ra5c.js +36 -0
- package/dist/{keepalive-w4aakbyk.js → keepalive-6cf311t5.js} +4 -4
- package/dist/lead-fjy418cw.js +69 -0
- package/dist/{maintenance-hbptpk6p.js → maintenance-a4bm1bmt.js} +1 -1
- package/dist/{oauth-refresh-sweep-217semrv.js → oauth-refresh-sweep-3h0dfw1k.js} +3 -3
- package/dist/{onboard-vz2s5df3.js → onboard-myn5hraa.js} +3 -3
- package/dist/{opencode-adapter-gtfd7d7v.js → opencode-adapter-p2nkb5am.js} +5 -5
- package/dist/{otel-impl-aefave37.js → otel-impl-a1a0ef6b.js} +2 -2
- package/dist/{pi-mono-adapter-f8h5yseh.js → pi-mono-adapter-rzmpb72a.js} +117 -23
- package/dist/{pricing-refresh-m1yhh9ya.js → pricing-refresh-83drrnxj.js} +3 -3
- package/dist/{rbac-roles-svj72cdf.js → rbac-roles-0fb6e7pj.js} +2 -2
- package/dist/{rbac-roles-rrw8twdz.js → rbac-roles-s8y6ecb5.js} +1 -1
- package/dist/{render-v2-amwbnfxh.js → render-v2-twmbgrz4.js} +3 -3
- package/dist/{resume-9cd6wf6z.js → resume-zfqc36xj.js} +7 -7
- package/dist/{runtime-fp4vrx7m.js → runtime-qwggdpqr.js} +1 -1
- package/dist/{session-access-21t6yjyg.js → session-access-sc9pn9da.js} +4 -4
- package/dist/{session-source-backfill-pxbzcsc6.js → session-source-backfill-qh07xr8g.js} +3 -3
- package/dist/{setup-4592tqz4.js → setup-4fr0m7a1.js} +1 -1
- package/dist/{virtual-modules-gzfnpmnz.js → virtual-modules-fh4ha15b.js} +2 -2
- package/dist/{work-objects-t9tcf174.js → work-objects-0wr8zxct.js} +20 -20
- package/dist/worker-0c5tyzqe.js +69 -0
- package/dist/{worker-follow-up-q32jh4yk.js → worker-follow-up-ktyyazyp.js} +17 -17
- package/dist/{x-b6wxntdt.js → x-vmmye1kb.js} +2 -2
- package/openapi.json +97 -32
- package/package.json +1 -1
- package/src/be/db/session-summaries.ts +8 -2
- package/src/be/db/session-tree.ts +174 -61
- package/src/be/db/session-visibility.ts +5 -4
- package/src/be/db.ts +8 -4
- package/src/be/migrations/259_session_summaries_open_tasks.sql +111 -0
- package/src/be/model-validation.ts +5 -1
- package/src/be/pricing-normalize.ts +7 -2
- package/src/be/scripts/typecheck.ts +1 -0
- package/src/be/seed/schedules-seeder.ts +135 -9
- package/src/be/seed/workflows-seeder.ts +65 -1
- package/src/be/seed-pricing.ts +23 -0
- package/src/be/steering.ts +50 -3
- package/src/be/swarm-config-guard.ts +1 -0
- package/src/commands/provider-credentials.ts +29 -2
- package/src/commands/runner.ts +86 -5
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +27 -1
- package/src/extensions/dispatcher.ts +4 -0
- package/src/http/agents.ts +1 -0
- package/src/http/mcp-bridge.ts +4 -0
- package/src/integrations/chat-sdk/inbound.ts +15 -5
- package/src/integrations/chat-sdk/steering.ts +3 -1
- package/src/kv-reserved-namespaces.ts +2 -0
- package/src/prompts/base-prompt.ts +4 -1
- package/src/prompts/session-templates.ts +26 -0
- package/src/providers/acp-adapter.ts +190 -26
- package/src/providers/acp-targets.ts +306 -6
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/codex-adapter.ts +9 -44
- package/src/providers/codex-oauth/flow.ts +24 -3
- package/src/providers/codex-oauth/storage.ts +56 -17
- package/src/providers/codex-oauth/subscription.ts +67 -0
- package/src/providers/fx-adapter.ts +211 -0
- package/src/providers/index.ts +5 -1
- package/src/providers/mcp-loopback-proxy.ts +94 -0
- package/src/providers/pi-mono-adapter.ts +98 -13
- package/src/providers/pricing-sources.md +8 -0
- package/src/providers/reasoning-effort.ts +17 -1
- package/src/providers/types.ts +2 -1
- package/src/scheduler/scheduler.ts +36 -3
- package/src/scripts-runtime/sdk-allowlist.ts +1 -0
- package/src/scripts-runtime/types/stdlib.d.ts +5 -0
- package/src/scripts-runtime/types/swarm-extension.d.ts +33 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +5 -0
- package/src/server.ts +7 -0
- package/src/slack/assistant.ts +17 -1
- package/src/slack/handlers.ts +18 -5
- package/src/slack/left-threads.ts +65 -0
- package/src/slack/steering.ts +3 -0
- package/src/slack/thread-buffer.ts +40 -16
- package/src/tests/acp-adapter.test.ts +79 -0
- package/src/tests/base-prompt.test.ts +12 -0
- package/src/tests/chat-sdk-inbound.test.ts +30 -0
- package/src/tests/chatgpt-subscription-model-groups.test.ts +62 -0
- package/src/tests/chatgpt-subscription-pi.test.ts +170 -0
- package/src/tests/chatgpt-subscription-session-bench.test.ts +198 -0
- package/src/tests/codex-oauth-credential-info.test.ts +40 -0
- package/src/tests/codex-oauth-refresh-egress.test.ts +194 -0
- package/src/tests/context-window.test.ts +7 -0
- package/src/tests/explicit-model-validation.test.ts +99 -0
- package/src/tests/extensions-run-context.test.ts +11 -0
- package/src/tests/extensions-steering.test.ts +353 -0
- package/src/tests/extensions-validate.test.ts +5 -0
- package/src/tests/fixtures/extensions/steering-policy/hooks.ts +39 -0
- package/src/tests/fixtures/extensions/steering-policy/manifest.json +7 -0
- package/src/tests/fixtures/fake-fx.ts +167 -0
- package/src/tests/fixtures/fx/acp-responses-recorded.json +157 -0
- package/src/tests/fixtures/fx/acp-updates-recorded.jsonl +15 -0
- package/src/tests/fx-adapter.test.ts +771 -0
- package/src/tests/grok-adapter.test.ts +36 -0
- package/src/tests/mcp-loopback-proxy.test.ts +193 -0
- package/src/tests/model-tier-resolution.test.ts +3 -3
- package/src/tests/pricing-refresh.test.ts +5 -5
- package/src/tests/prompt-template-session.test.ts +5 -3
- package/src/tests/provider-registration.test.ts +2 -1
- package/src/tests/query-audit-plans.test.ts +3 -2
- package/src/tests/script-connections.test.ts +2 -0
- package/src/tests/seed-model-profiles.test.ts +2 -2
- package/src/tests/seed-schedules.test.ts +138 -0
- package/src/tests/session-cost-recompute-unit.test.ts +39 -0
- package/src/tests/session-costs-golden.test.ts +26 -0
- package/src/tests/session-summaries-plans.test.ts +120 -0
- package/src/tests/session-summaries.test.ts +72 -12
- package/src/tests/sessions-tree.test.ts +11 -3
- package/src/tests/slack-leave-thread.test.ts +431 -0
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/workflow-engine-v2.test.ts +42 -0
- package/src/tests/workflow-script-principal.test.ts +207 -7
- package/src/tools/slack-leave-thread.ts +104 -0
- package/src/tools/steer-task.ts +3 -2
- package/src/tools/tool-config.ts +2 -1
- package/src/types.ts +19 -0
- package/src/utils/codex-auth-failure.ts +30 -0
- package/src/utils/context-window.ts +4 -1
- package/src/utils/credentials.ts +7 -0
- package/src/utils/fx-models.ts +43 -0
- package/src/workflows/cooldown.ts +3 -2
- package/src/workflows/engine.ts +24 -9
- package/templates/schedules/dreaming-daily/config.json +1 -1
- package/templates/schedules/dreaming-daily/content.md +6 -14
- package/templates/skills/swarm-docs/content.md +1 -0
- package/templates/workflows/dreaming/content.md +5 -1
- package/dist/acp-adapter-96dc64m2.js +0 -15
- package/dist/handlers-jg7v74ty.js +0 -31
- package/dist/index-8c1zbz59.js +0 -29
- package/dist/index-8k8tmfxd.js +0 -32
- package/dist/index-hq617xdj.js +0 -36
- package/dist/lead-567kw7x3.js +0 -68
- package/dist/worker-fjdqra6q.js +0 -68
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
ACP_TARGET_IDS,
|
|
3
3
|
isAcpTarget,
|
|
4
4
|
getAcpTargetCatalogEntry
|
|
5
|
-
} from "./cli-
|
|
5
|
+
} from "./cli-a22h291q.js";
|
|
6
6
|
import {
|
|
7
7
|
applyReasoningEffort
|
|
8
|
-
} from "./cli-
|
|
8
|
+
} from "./cli-98rw5dt5.js";
|
|
9
9
|
import {
|
|
10
10
|
applyOpenRouterBaseUrlOverride2,
|
|
11
11
|
buildOpenAICompatibleProviderBlock2
|
|
12
|
-
} from "./cli-
|
|
12
|
+
} from "./cli-zppwg9p9.js";
|
|
13
13
|
import {
|
|
14
14
|
fetchInstalledMcpServers
|
|
15
15
|
} from "./cli-bst1vp7e.js";
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
getContextWindowSize,
|
|
18
18
|
clampContextPercent,
|
|
19
19
|
init_context_window
|
|
20
|
-
} from "./cli-
|
|
20
|
+
} from "./cli-73jzwksr.js";
|
|
21
21
|
import {
|
|
22
22
|
detachedProcessGroup,
|
|
23
23
|
registerProcessGroup,
|
|
@@ -27,6 +27,16 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
init_v4
|
|
29
29
|
} from "./cli-5xaqj21p.js";
|
|
30
|
+
import {
|
|
31
|
+
DEFAULT_MODEL_TIER_MAP,
|
|
32
|
+
init_types4
|
|
33
|
+
} from "./cli-7wspm5gm.js";
|
|
34
|
+
import {
|
|
35
|
+
resolveTemplateFromCode,
|
|
36
|
+
resolveTemplateAsync,
|
|
37
|
+
init_resolver,
|
|
38
|
+
init_session_templates
|
|
39
|
+
} from "./cli-cm5yqn35.js";
|
|
30
40
|
import {
|
|
31
41
|
NEVER,
|
|
32
42
|
string2,
|
|
@@ -48,18 +58,39 @@ import {
|
|
|
48
58
|
import {
|
|
49
59
|
init_package,
|
|
50
60
|
package_default
|
|
51
|
-
} from "./cli-
|
|
61
|
+
} from "./cli-tqgg40ek.js";
|
|
52
62
|
import {
|
|
53
63
|
scrubSecrets,
|
|
54
64
|
init_secret_scrubber
|
|
55
|
-
} from "./cli-
|
|
65
|
+
} from "./cli-1b7btd38.js";
|
|
56
66
|
import {
|
|
67
|
+
fxModelRoute,
|
|
57
68
|
normalizeGrokModel,
|
|
58
69
|
baseUrlOverride,
|
|
59
70
|
providerBaseUrl,
|
|
60
71
|
providerForModel,
|
|
61
72
|
init_src2
|
|
62
|
-
} from "./cli-
|
|
73
|
+
} from "./cli-5c4hjzne.js";
|
|
74
|
+
|
|
75
|
+
// src/utils/fx-models.ts
|
|
76
|
+
init_src2();
|
|
77
|
+
init_types4();
|
|
78
|
+
var FX_ROUTE_KEY_VARS = [
|
|
79
|
+
"OPENROUTER_API_KEY",
|
|
80
|
+
"OPENAI_API_KEY",
|
|
81
|
+
"AI_GATEWAY_API_KEY"
|
|
82
|
+
];
|
|
83
|
+
function resolveFxRoute(model) {
|
|
84
|
+
const value = model?.trim() || DEFAULT_MODEL_TIER_MAP.fx.regular;
|
|
85
|
+
const route = fxModelRoute(value);
|
|
86
|
+
return "error" in route ? route : { ...route, model: value };
|
|
87
|
+
}
|
|
88
|
+
function requireFxRoute(model) {
|
|
89
|
+
const route = resolveFxRoute(model);
|
|
90
|
+
if ("error" in route)
|
|
91
|
+
throw new Error(route.error);
|
|
92
|
+
return route;
|
|
93
|
+
}
|
|
63
94
|
|
|
64
95
|
// node_modules/@agentclientprotocol/sdk/dist/v1/unstable/schema/index.js
|
|
65
96
|
var AGENT_METHODS = {
|
|
@@ -4180,10 +4211,13 @@ function translateAcpSessionNotification(notification) {
|
|
|
4180
4211
|
|
|
4181
4212
|
// src/providers/acp-targets.ts
|
|
4182
4213
|
init_src2();
|
|
4214
|
+
init_resolver();
|
|
4215
|
+
init_session_templates();
|
|
4183
4216
|
init_context_window();
|
|
4184
|
-
import { mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
4217
|
+
import { chmod, mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
4185
4218
|
import { tmpdir } from "node:os";
|
|
4186
4219
|
import { join } from "node:path";
|
|
4220
|
+
init_secret_scrubber();
|
|
4187
4221
|
class AcpTargetResolutionError extends Error {
|
|
4188
4222
|
constructor(message) {
|
|
4189
4223
|
super(message);
|
|
@@ -4678,6 +4712,171 @@ var grokTargetProfile = {
|
|
|
4678
4712
|
return `Grok rejected the credentials (XAI_API_KEY or OPENROUTER_API_KEY invalid or missing): ${message}`;
|
|
4679
4713
|
}
|
|
4680
4714
|
};
|
|
4715
|
+
var FX_SYSTEM_PROMPT_INLINE_MAX_BYTES = 60 * 1024;
|
|
4716
|
+
var FX_SYSTEM_PROMPT_HEAD_BYTES = 56 * 1024;
|
|
4717
|
+
var FX_SYSTEM_PROMPT_FILE_TEMPLATE = "system.agent.fx.system_prompt_file";
|
|
4718
|
+
var FX_CONTEXT_NOTICE_PREFIX = "[context] ";
|
|
4719
|
+
var FX_AUTH_ERROR_RE = /authentication is unavailable|credential is unavailable|MissingApiKey|unauthorized|\b401\b/i;
|
|
4720
|
+
function fxRunDir(config) {
|
|
4721
|
+
const safe = config.taskId.replace(/[^A-Za-z0-9._-]/g, "_") || "session";
|
|
4722
|
+
return join(tmpdir(), `fx-${safe}`);
|
|
4723
|
+
}
|
|
4724
|
+
function utf8Head(bytes, max) {
|
|
4725
|
+
let end = Math.min(max, bytes.length);
|
|
4726
|
+
while (end > 0 && end < bytes.length && ((bytes[end] ?? 0) & 192) === 128)
|
|
4727
|
+
end -= 1;
|
|
4728
|
+
return new TextDecoder().decode(bytes.subarray(0, end));
|
|
4729
|
+
}
|
|
4730
|
+
async function fxSystemPromptPointer(path) {
|
|
4731
|
+
try {
|
|
4732
|
+
const result = await resolveTemplateAsync(FX_SYSTEM_PROMPT_FILE_TEMPLATE, { path });
|
|
4733
|
+
if (!result.skipped && result.text.trim())
|
|
4734
|
+
return result.text;
|
|
4735
|
+
} catch {}
|
|
4736
|
+
return resolveTemplateFromCode(FX_SYSTEM_PROMPT_FILE_TEMPLATE, { path }).text;
|
|
4737
|
+
}
|
|
4738
|
+
async function fxSystemPrompt(systemPrompt, dir) {
|
|
4739
|
+
if (!systemPrompt.trim())
|
|
4740
|
+
return;
|
|
4741
|
+
const bytes = new TextEncoder().encode(systemPrompt);
|
|
4742
|
+
if (bytes.length <= FX_SYSTEM_PROMPT_INLINE_MAX_BYTES) {
|
|
4743
|
+
return { blocks: [{ type: "text", text: systemPrompt }] };
|
|
4744
|
+
}
|
|
4745
|
+
const artifactPath = join(dir, "SYSTEM.md");
|
|
4746
|
+
await mkdir(dir, { recursive: true });
|
|
4747
|
+
await Bun.write(artifactPath, systemPrompt);
|
|
4748
|
+
await chmod(artifactPath, 384);
|
|
4749
|
+
const head = utf8Head(bytes, FX_SYSTEM_PROMPT_HEAD_BYTES);
|
|
4750
|
+
const pointer = await fxSystemPromptPointer(artifactPath);
|
|
4751
|
+
return { blocks: [{ type: "text", text: `${head}
|
|
4752
|
+
|
|
4753
|
+
${pointer}` }], artifactPath };
|
|
4754
|
+
}
|
|
4755
|
+
async function fxSessionExists(sessionId, home) {
|
|
4756
|
+
if (!home || !/^[A-Za-z0-9_-]+$/.test(sessionId))
|
|
4757
|
+
return false;
|
|
4758
|
+
return Bun.file(join(home, ".fx", "sessions", "v2", sessionId, "log.jsonl")).exists();
|
|
4759
|
+
}
|
|
4760
|
+
function rewriteFxEvent(event, update) {
|
|
4761
|
+
if (event.type === "message" && event.role === "assistant" && event.content.startsWith(FX_CONTEXT_NOTICE_PREFIX)) {
|
|
4762
|
+
return {
|
|
4763
|
+
type: "custom",
|
|
4764
|
+
name: "fx_context_notice",
|
|
4765
|
+
data: { text: event.content, messageId: event.messageId ?? null }
|
|
4766
|
+
};
|
|
4767
|
+
}
|
|
4768
|
+
if (event.type === "tool_start" && update?.sessionUpdate === "tool_call") {
|
|
4769
|
+
const mcp = update._meta?.fx?.toolCall?.mcp;
|
|
4770
|
+
if (typeof mcp?.server === "string" && typeof mcp.tool === "string" && mcp.server && mcp.tool) {
|
|
4771
|
+
return { ...event, toolName: `mcp__${mcp.server}__${mcp.tool}` };
|
|
4772
|
+
}
|
|
4773
|
+
const name = update.name;
|
|
4774
|
+
if (typeof name === "string" && name.trim())
|
|
4775
|
+
return { ...event, toolName: name.trim() };
|
|
4776
|
+
}
|
|
4777
|
+
return event;
|
|
4778
|
+
}
|
|
4779
|
+
async function steerFx({
|
|
4780
|
+
sessionId,
|
|
4781
|
+
delivery,
|
|
4782
|
+
initResult,
|
|
4783
|
+
prompt,
|
|
4784
|
+
onUpdate
|
|
4785
|
+
}) {
|
|
4786
|
+
if (delivery.mode !== "steer") {
|
|
4787
|
+
return { delivered: false, reason: `fx supports steer only, not ${delivery.mode}` };
|
|
4788
|
+
}
|
|
4789
|
+
const meta = initResult.agentCapabilities?._meta;
|
|
4790
|
+
if (meta?.fx?.steering !== true) {
|
|
4791
|
+
return { delivered: false, reason: "fx did not advertise _meta.fx.steering" };
|
|
4792
|
+
}
|
|
4793
|
+
return new Promise((resolve) => {
|
|
4794
|
+
let settled = false;
|
|
4795
|
+
let stopListening = () => {};
|
|
4796
|
+
const settle = (result) => {
|
|
4797
|
+
if (settled)
|
|
4798
|
+
return;
|
|
4799
|
+
settled = true;
|
|
4800
|
+
stopListening();
|
|
4801
|
+
resolve(result);
|
|
4802
|
+
};
|
|
4803
|
+
stopListening = onUpdate((update) => {
|
|
4804
|
+
if (update.sessionUpdate !== "user_message_chunk")
|
|
4805
|
+
return;
|
|
4806
|
+
const steering = update._meta?.fx?.steering;
|
|
4807
|
+
if (!steering || update.content.type !== "text" || update.content.text !== delivery.text) {
|
|
4808
|
+
return;
|
|
4809
|
+
}
|
|
4810
|
+
settle({ delivered: true, mode: "steer" });
|
|
4811
|
+
});
|
|
4812
|
+
prompt({
|
|
4813
|
+
sessionId,
|
|
4814
|
+
prompt: [{ type: "text", text: delivery.text }],
|
|
4815
|
+
_meta: { fx: { steer: true } }
|
|
4816
|
+
}).then((response) => {
|
|
4817
|
+
const state = response._meta?.fx?.steering;
|
|
4818
|
+
settle(state === "absorbed" ? { delivered: true, mode: "steer" } : {
|
|
4819
|
+
delivered: false,
|
|
4820
|
+
reason: `fx did not absorb the steer (stopReason ${response.stopReason}, steering ${JSON.stringify(state ?? null)})`
|
|
4821
|
+
});
|
|
4822
|
+
}, (err) => {
|
|
4823
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
4824
|
+
settle({ delivered: false, reason: scrubSecrets(`fx steer failed: ${message}`) });
|
|
4825
|
+
});
|
|
4826
|
+
});
|
|
4827
|
+
}
|
|
4828
|
+
var fxTargetProfile = {
|
|
4829
|
+
target: "fx",
|
|
4830
|
+
command(config) {
|
|
4831
|
+
const binary = readEnv(config, "FX_BINARY")?.trim() || "fx";
|
|
4832
|
+
const route = requireFxRoute(config.model);
|
|
4833
|
+
return [
|
|
4834
|
+
binary,
|
|
4835
|
+
"acp",
|
|
4836
|
+
"--model",
|
|
4837
|
+
route.fxModel,
|
|
4838
|
+
"--log-file",
|
|
4839
|
+
join(fxRunDir(config), "acp.log")
|
|
4840
|
+
];
|
|
4841
|
+
},
|
|
4842
|
+
env(config) {
|
|
4843
|
+
const route = requireFxRoute(config.model);
|
|
4844
|
+
const env = baseTargetEnv(config);
|
|
4845
|
+
copyEnvKeys(config, env, [route.keyVar]);
|
|
4846
|
+
env.FX_PROVIDER = route.fxProvider;
|
|
4847
|
+
env.FX_PERMISSION_MODE = "full-access";
|
|
4848
|
+
env.FX_AUTO_UPGRADE = "0";
|
|
4849
|
+
env.FX_NO_OPEN_BROWSER = "1";
|
|
4850
|
+
return env;
|
|
4851
|
+
},
|
|
4852
|
+
configuredOptions(config) {
|
|
4853
|
+
if (!config.reasoningEffort)
|
|
4854
|
+
return {};
|
|
4855
|
+
const effort = applyReasoningEffort("fx", config.model.trim(), config.reasoningEffort);
|
|
4856
|
+
return effort.kind === "fx-effort" ? { effort: effort.reasoningEffort } : {};
|
|
4857
|
+
},
|
|
4858
|
+
async writeSystemPromptArtifact(config) {
|
|
4859
|
+
await mkdir(fxRunDir(config), { recursive: true, mode: 448 });
|
|
4860
|
+
},
|
|
4861
|
+
async cleanupSystemPromptArtifact(config) {
|
|
4862
|
+
await rm(fxRunDir(config), { recursive: true, force: true });
|
|
4863
|
+
},
|
|
4864
|
+
sessionSystemPrompt(config) {
|
|
4865
|
+
return fxSystemPrompt(config.systemPrompt ?? "", fxRunDir(config));
|
|
4866
|
+
},
|
|
4867
|
+
requiresSecureMcpUrl: true,
|
|
4868
|
+
steer: steerFx,
|
|
4869
|
+
resume: {
|
|
4870
|
+
method: "session/resume",
|
|
4871
|
+
canResume: (sessionId) => fxSessionExists(sessionId, process.env.HOME)
|
|
4872
|
+
},
|
|
4873
|
+
rewriteEvent: rewriteFxEvent,
|
|
4874
|
+
describeError(message) {
|
|
4875
|
+
if (!FX_AUTH_ERROR_RE.test(message))
|
|
4876
|
+
return;
|
|
4877
|
+
return `fx could not authenticate the model route (OPENROUTER_API_KEY, OPENAI_API_KEY or AI_GATEWAY_API_KEY invalid or missing): ${message}`;
|
|
4878
|
+
}
|
|
4879
|
+
};
|
|
4681
4880
|
function resolveAcpTarget(config) {
|
|
4682
4881
|
const target = readEnv(config, "ACP_TARGET") ?? "custom";
|
|
4683
4882
|
if (!isAcpTarget(target)) {
|
|
@@ -4701,6 +4900,69 @@ function resolveAcpTarget(config) {
|
|
|
4701
4900
|
}
|
|
4702
4901
|
}
|
|
4703
4902
|
|
|
4903
|
+
// src/providers/mcp-loopback-proxy.ts
|
|
4904
|
+
init_secret_scrubber();
|
|
4905
|
+
var DROPPED_REQUEST_HEADERS = [
|
|
4906
|
+
"host",
|
|
4907
|
+
"connection",
|
|
4908
|
+
"keep-alive",
|
|
4909
|
+
"proxy-connection",
|
|
4910
|
+
"transfer-encoding",
|
|
4911
|
+
"upgrade"
|
|
4912
|
+
];
|
|
4913
|
+
var LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
4914
|
+
function needsLoopbackProxy(url) {
|
|
4915
|
+
let parsed;
|
|
4916
|
+
try {
|
|
4917
|
+
parsed = new URL(url);
|
|
4918
|
+
} catch {
|
|
4919
|
+
return false;
|
|
4920
|
+
}
|
|
4921
|
+
return parsed.protocol === "http:" && !LOOPBACK_HOSTS.has(parsed.hostname.toLowerCase());
|
|
4922
|
+
}
|
|
4923
|
+
async function startMcpLoopbackProxy(upstream) {
|
|
4924
|
+
const base = new URL(upstream);
|
|
4925
|
+
const prefix = base.pathname.replace(/\/+$/, "");
|
|
4926
|
+
const server = Bun.serve({
|
|
4927
|
+
hostname: "127.0.0.1",
|
|
4928
|
+
port: 0,
|
|
4929
|
+
idleTimeout: 0,
|
|
4930
|
+
async fetch(req) {
|
|
4931
|
+
const incoming = new URL(req.url);
|
|
4932
|
+
const target = new URL(base);
|
|
4933
|
+
target.pathname = `${prefix}${incoming.pathname}`;
|
|
4934
|
+
target.search = incoming.search;
|
|
4935
|
+
const headers = new Headers(req.headers);
|
|
4936
|
+
for (const name of DROPPED_REQUEST_HEADERS)
|
|
4937
|
+
headers.delete(name);
|
|
4938
|
+
try {
|
|
4939
|
+
const hasBody = req.method !== "GET" && req.method !== "HEAD";
|
|
4940
|
+
return await fetch(target, {
|
|
4941
|
+
method: req.method,
|
|
4942
|
+
headers,
|
|
4943
|
+
body: hasBody ? req.body : undefined,
|
|
4944
|
+
redirect: "manual",
|
|
4945
|
+
signal: req.signal,
|
|
4946
|
+
decompress: false
|
|
4947
|
+
});
|
|
4948
|
+
} catch (err) {
|
|
4949
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
4950
|
+
return new Response(JSON.stringify({
|
|
4951
|
+
error: scrubSecrets(`MCP loopback proxy: upstream failed: ${message}`)
|
|
4952
|
+
}), { status: 502, headers: { "Content-Type": "application/json" } });
|
|
4953
|
+
}
|
|
4954
|
+
}
|
|
4955
|
+
});
|
|
4956
|
+
let stopped = null;
|
|
4957
|
+
return {
|
|
4958
|
+
url: `http://127.0.0.1:${server.port}`,
|
|
4959
|
+
stop() {
|
|
4960
|
+
stopped ??= server.stop(true);
|
|
4961
|
+
return stopped;
|
|
4962
|
+
}
|
|
4963
|
+
};
|
|
4964
|
+
}
|
|
4965
|
+
|
|
4704
4966
|
// src/providers/acp-adapter.ts
|
|
4705
4967
|
var ACP_LOG_MAX_CHARS = 30000;
|
|
4706
4968
|
var ACP_CANCEL_SETTLE_MS = 3000;
|
|
@@ -4802,6 +5064,7 @@ class SwarmAcpClient {
|
|
|
4802
5064
|
emit;
|
|
4803
5065
|
target;
|
|
4804
5066
|
reportedCostUsd = null;
|
|
5067
|
+
updateListeners = new Set;
|
|
4805
5068
|
constructor(emit, target) {
|
|
4806
5069
|
this.emit = emit;
|
|
4807
5070
|
this.target = target;
|
|
@@ -4818,8 +5081,16 @@ class SwarmAcpClient {
|
|
|
4818
5081
|
if (costUsd !== null)
|
|
4819
5082
|
this.reportedCostUsd = costUsd;
|
|
4820
5083
|
for (const event of translateAcpSessionNotification(params)) {
|
|
4821
|
-
this.emit(this.target?.rewriteEvent?.(event) ?? event);
|
|
5084
|
+
this.emit(this.target?.rewriteEvent?.(event, params.update) ?? event);
|
|
4822
5085
|
}
|
|
5086
|
+
for (const listener of this.updateListeners)
|
|
5087
|
+
listener(params.update);
|
|
5088
|
+
}
|
|
5089
|
+
onUpdate(listener) {
|
|
5090
|
+
this.updateListeners.add(listener);
|
|
5091
|
+
return () => {
|
|
5092
|
+
this.updateListeners.delete(listener);
|
|
5093
|
+
};
|
|
4823
5094
|
}
|
|
4824
5095
|
}
|
|
4825
5096
|
|
|
@@ -4830,6 +5101,7 @@ class ACPSession {
|
|
|
4830
5101
|
config;
|
|
4831
5102
|
providerName;
|
|
4832
5103
|
target;
|
|
5104
|
+
extras;
|
|
4833
5105
|
sessionId;
|
|
4834
5106
|
listeners = new Set;
|
|
4835
5107
|
pendingEvents = [];
|
|
@@ -4840,20 +5112,44 @@ class ACPSession {
|
|
|
4840
5112
|
completionPromise;
|
|
4841
5113
|
completionResolve;
|
|
4842
5114
|
ephemeralTokenId = null;
|
|
4843
|
-
|
|
5115
|
+
deliverSteering;
|
|
5116
|
+
constructor(agent, client, process2, config, sessionId, providerName, target, providerMeta, ephemeralTokenId, extras) {
|
|
4844
5117
|
this.agent = agent;
|
|
4845
5118
|
this.client = client;
|
|
4846
5119
|
this.process = process2;
|
|
4847
5120
|
this.config = config;
|
|
4848
5121
|
this.providerName = providerName;
|
|
4849
5122
|
this.target = target;
|
|
5123
|
+
this.extras = extras;
|
|
4850
5124
|
this.sessionId = sessionId;
|
|
4851
5125
|
this.ephemeralTokenId = ephemeralTokenId ?? null;
|
|
4852
5126
|
this.completionPromise = new Promise((resolve) => {
|
|
4853
5127
|
this.completionResolve = resolve;
|
|
4854
5128
|
});
|
|
5129
|
+
const steer = target.steer;
|
|
5130
|
+
if (steer && extras) {
|
|
5131
|
+
const initResult = extras.initResult;
|
|
5132
|
+
this.deliverSteering = async (delivery) => {
|
|
5133
|
+
if (this.completed || this.aborted) {
|
|
5134
|
+
return { delivered: false, reason: "The ACP session has already finished" };
|
|
5135
|
+
}
|
|
5136
|
+
return steer({
|
|
5137
|
+
sessionId,
|
|
5138
|
+
delivery,
|
|
5139
|
+
initResult,
|
|
5140
|
+
prompt: (params) => this.agent.request(methods.agent.session.prompt, params),
|
|
5141
|
+
onUpdate: (listener) => this.client.onUpdate(listener)
|
|
5142
|
+
});
|
|
5143
|
+
};
|
|
5144
|
+
}
|
|
4855
5145
|
this.consumeStderr();
|
|
4856
|
-
this.emit({
|
|
5146
|
+
this.emit({
|
|
5147
|
+
type: "session_init",
|
|
5148
|
+
sessionId,
|
|
5149
|
+
provider: providerName,
|
|
5150
|
+
providerMeta,
|
|
5151
|
+
...extras?.harnessVariantMeta ? { harnessVariantMeta: extras.harnessVariantMeta } : {}
|
|
5152
|
+
});
|
|
4857
5153
|
this.runPrompt();
|
|
4858
5154
|
}
|
|
4859
5155
|
onEvent(listener) {
|
|
@@ -5003,6 +5299,7 @@ class ACPSession {
|
|
|
5003
5299
|
return;
|
|
5004
5300
|
this.completed = true;
|
|
5005
5301
|
this.completionResolve(result);
|
|
5302
|
+
stopProxies(this.extras?.proxies ?? []);
|
|
5006
5303
|
if (this.ephemeralTokenId) {
|
|
5007
5304
|
revokeAcpSessionToken(this.config.apiUrl, this.config.apiKey, this.ephemeralTokenId);
|
|
5008
5305
|
}
|
|
@@ -5056,39 +5353,71 @@ class ACPAdapter2 {
|
|
|
5056
5353
|
const stream = ndJsonStream2(fileSinkWritableStream(proc.stdin), proc.stdout);
|
|
5057
5354
|
const agent = client().onRequest(methods.client.session.requestPermission, ({ params }) => client2.requestPermission(params)).onNotification(methods.client.session.update, ({ params }) => client2.sessionUpdate(params)).connect(stream).agent;
|
|
5058
5355
|
let ephemeralToken = null;
|
|
5356
|
+
const proxies = [];
|
|
5059
5357
|
try {
|
|
5060
|
-
await agent.request(methods.agent.initialize, {
|
|
5358
|
+
const initResult = await agent.request(methods.agent.initialize, {
|
|
5061
5359
|
protocolVersion: PROTOCOL_VERSION,
|
|
5062
5360
|
clientInfo: { name: "agent-swarm", version: package_default.version },
|
|
5063
5361
|
clientCapabilities: { session: { configOptions: { boolean: {} } } }
|
|
5064
5362
|
});
|
|
5065
5363
|
ephemeralToken = await mintAcpSessionToken(config.apiUrl, config.apiKey, config.agentId, config.taskId);
|
|
5066
5364
|
const installedServers = await fetchInstalledMcpServers(config.apiUrl, config.apiKey, config.agentId, "claude");
|
|
5365
|
+
let mcpServers = [
|
|
5366
|
+
{
|
|
5367
|
+
type: "http",
|
|
5368
|
+
name: "swarm",
|
|
5369
|
+
url: `${config.apiUrl.replace(/\/+$/, "")}/mcp`,
|
|
5370
|
+
headers: [
|
|
5371
|
+
{ name: "Authorization", value: `Bearer ${ephemeralToken.plaintext}` },
|
|
5372
|
+
{ name: "X-Agent-ID", value: config.agentId },
|
|
5373
|
+
{ name: "X-Source-Task-Id", value: config.taskId }
|
|
5374
|
+
]
|
|
5375
|
+
},
|
|
5376
|
+
...toAcpMcpServers(installedServers)
|
|
5377
|
+
];
|
|
5378
|
+
if (target.requiresSecureMcpUrl) {
|
|
5379
|
+
mcpServers = await secureMcpServers(mcpServers, initResult.agentCapabilities?.mcpCapabilities?.sse === true, proxies);
|
|
5380
|
+
}
|
|
5067
5381
|
const sessionMeta = target.sessionMeta?.(config);
|
|
5068
|
-
const
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5075
|
-
|
|
5076
|
-
|
|
5077
|
-
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5382
|
+
const resumeId = target.resume ? config.resumeSessionId?.trim() : undefined;
|
|
5383
|
+
let sessionId;
|
|
5384
|
+
let advertisedOptions;
|
|
5385
|
+
if (resumeId && initResult.agentCapabilities?.sessionCapabilities?.resume) {
|
|
5386
|
+
const resumed = await agent.request(methods.agent.session.resume, {
|
|
5387
|
+
...sessionMeta ? { _meta: sessionMeta } : {},
|
|
5388
|
+
sessionId: resumeId,
|
|
5389
|
+
cwd: config.cwd,
|
|
5390
|
+
mcpServers
|
|
5391
|
+
});
|
|
5392
|
+
sessionId = resumeId;
|
|
5393
|
+
advertisedOptions = resumed.configOptions ?? [];
|
|
5394
|
+
} else {
|
|
5395
|
+
if (resumeId) {
|
|
5396
|
+
console.warn("\x1B[33m[acp]\x1B[0m Target does not advertise session/resume; starting a new session");
|
|
5397
|
+
}
|
|
5398
|
+
const systemPrompt = await sessionSystemPromptBlocks(target, config, initResult);
|
|
5399
|
+
const newSessionParams = {
|
|
5400
|
+
...sessionMeta ? { _meta: sessionMeta } : {},
|
|
5401
|
+
cwd: config.cwd,
|
|
5402
|
+
mcpServers,
|
|
5403
|
+
...systemPrompt ? { systemPrompt } : {}
|
|
5404
|
+
};
|
|
5405
|
+
const newSession = await agent.request(methods.agent.session.new, newSessionParams);
|
|
5406
|
+
sessionId = newSession.sessionId;
|
|
5407
|
+
advertisedOptions = newSession.configOptions ?? [];
|
|
5408
|
+
}
|
|
5085
5409
|
const configOptions = await applyConfiguredOptions({
|
|
5086
5410
|
setSessionConfigOption: (params) => agent.request(methods.agent.session.setConfigOption, params)
|
|
5087
|
-
},
|
|
5088
|
-
|
|
5411
|
+
}, sessionId, advertisedOptions, target.configuredOptions(config));
|
|
5412
|
+
const agentVersion = initResult.agentInfo?.version?.trim();
|
|
5413
|
+
session = new ACPSession(agent, client2, proc, config, sessionId, this.name, target, {
|
|
5089
5414
|
target: target.target,
|
|
5090
5415
|
configOptions: sanitizeAcpConfigOptions(configOptions)
|
|
5091
|
-
}, ephemeralToken.tokenId
|
|
5416
|
+
}, ephemeralToken.tokenId, {
|
|
5417
|
+
initResult,
|
|
5418
|
+
...agentVersion ? { harnessVariantMeta: { version: scrubSecrets(agentVersion) } } : {},
|
|
5419
|
+
proxies
|
|
5420
|
+
});
|
|
5092
5421
|
for (const event of preSessionEvents)
|
|
5093
5422
|
session.emitFromAcp(event);
|
|
5094
5423
|
session.waitForCompletion().finally(cleanupArtifact);
|
|
@@ -5098,12 +5427,14 @@ class ACPAdapter2 {
|
|
|
5098
5427
|
revokeAcpSessionToken(config.apiUrl, config.apiKey, ephemeralToken.tokenId);
|
|
5099
5428
|
}
|
|
5100
5429
|
await terminateProcessGroup(proc.pid);
|
|
5430
|
+
await stopProxies(proxies);
|
|
5101
5431
|
await cleanupArtifact();
|
|
5102
5432
|
throw new Error(`ACP target failed during startup: ${describeTargetError(target, scrubSecrets(formatError(err)))}`);
|
|
5103
5433
|
}
|
|
5104
5434
|
}
|
|
5105
|
-
async canResume(
|
|
5106
|
-
|
|
5435
|
+
async canResume(sessionId) {
|
|
5436
|
+
const resume = this.options.target?.resume;
|
|
5437
|
+
return resume ? resume.canResume(sessionId) : false;
|
|
5107
5438
|
}
|
|
5108
5439
|
formatCommand(commandName) {
|
|
5109
5440
|
return `/${commandName}`;
|
|
@@ -5199,6 +5530,46 @@ function toAcpMcpServers(installed) {
|
|
|
5199
5530
|
}
|
|
5200
5531
|
return servers;
|
|
5201
5532
|
}
|
|
5533
|
+
async function sessionSystemPromptBlocks(target, config, initResult) {
|
|
5534
|
+
if (!target.sessionSystemPrompt)
|
|
5535
|
+
return;
|
|
5536
|
+
if (!initResult.agentCapabilities?.sessionCapabilities?.systemPrompt) {
|
|
5537
|
+
console.warn("\x1B[33m[acp]\x1B[0m Target does not advertise sessionCapabilities.systemPrompt; the swarm system prompt is not sent");
|
|
5538
|
+
return;
|
|
5539
|
+
}
|
|
5540
|
+
const plan = await target.sessionSystemPrompt(config);
|
|
5541
|
+
return plan?.blocks.length ? plan.blocks : undefined;
|
|
5542
|
+
}
|
|
5543
|
+
async function secureMcpServers(servers, sseSupported, proxies) {
|
|
5544
|
+
const byOrigin = new Map;
|
|
5545
|
+
const result = [];
|
|
5546
|
+
for (const server of servers) {
|
|
5547
|
+
if (!("url" in server)) {
|
|
5548
|
+
result.push(server);
|
|
5549
|
+
continue;
|
|
5550
|
+
}
|
|
5551
|
+
if (server.type === "sse" && !sseSupported) {
|
|
5552
|
+
console.warn(`\x1B[33m[acp]\x1B[0m Skipping installed MCP server "${server.name}": the target does not support SSE MCP servers`);
|
|
5553
|
+
continue;
|
|
5554
|
+
}
|
|
5555
|
+
if (!needsLoopbackProxy(server.url)) {
|
|
5556
|
+
result.push(server);
|
|
5557
|
+
continue;
|
|
5558
|
+
}
|
|
5559
|
+
const url = new URL(server.url);
|
|
5560
|
+
let proxy = byOrigin.get(url.origin);
|
|
5561
|
+
if (!proxy) {
|
|
5562
|
+
proxy = await startMcpLoopbackProxy(url.origin);
|
|
5563
|
+
byOrigin.set(url.origin, proxy);
|
|
5564
|
+
proxies.push(proxy);
|
|
5565
|
+
}
|
|
5566
|
+
result.push({ ...server, url: `${proxy.url}${url.pathname}${url.search}` });
|
|
5567
|
+
}
|
|
5568
|
+
return result;
|
|
5569
|
+
}
|
|
5570
|
+
async function stopProxies(proxies) {
|
|
5571
|
+
await Promise.all(proxies.splice(0).map((proxy) => proxy.stop().catch(() => {})));
|
|
5572
|
+
}
|
|
5202
5573
|
function describeTargetError(target, message) {
|
|
5203
5574
|
return target.describeError?.(message) ?? message;
|
|
5204
5575
|
}
|
|
@@ -5220,4 +5591,4 @@ function fileSinkWritableStream(sink) {
|
|
|
5220
5591
|
});
|
|
5221
5592
|
}
|
|
5222
5593
|
|
|
5223
|
-
export { isGrokOpenRouterModel, grokTargetProfile, ACPAdapter2 };
|
|
5594
|
+
export { FX_ROUTE_KEY_VARS, requireFxRoute, isGrokOpenRouterModel, grokTargetProfile, fxSessionExists, fxTargetProfile, ACPAdapter2 };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RuntimeProviderKindSchema,
|
|
3
3
|
init_types4
|
|
4
|
-
} from "./cli-
|
|
4
|
+
} from "./cli-7wspm5gm.js";
|
|
5
5
|
import {
|
|
6
6
|
init_zod
|
|
7
7
|
} from "./cli-k5671be5.js";
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
scrubSecrets,
|
|
23
23
|
init_secret_scrubber
|
|
24
|
-
} from "./cli-
|
|
24
|
+
} from "./cli-1b7btd38.js";
|
|
25
25
|
|
|
26
26
|
// src/runtime-providers/controller.ts
|
|
27
27
|
init_secret_scrubber();
|