@desplega.ai/agent-swarm 1.173.0 → 2.0.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-ccm9xrep.js → acp-adapter-sj2g0m84.js} +17 -16
- package/dist/{actions-sgeyv08k.js → actions-fegk44gr.js} +39 -34
- package/dist/{amp-adapter-gpxp3kc9.js → amp-adapter-ad8ft89x.js} +8 -7
- package/dist/{app-km9qnv2f.js → app-kfvgbvzy.js} +18 -14
- package/dist/{assistant-5r8tcvvd.js → assistant-z7zdy9ja.js} +40 -35
- package/dist/{boot-reembed-swwzdgd7.js → boot-reembed-5c2z0mbe.js} +10 -9
- package/dist/{boot-reembed-16rv9843.js → boot-reembed-j8xa181e.js} +10 -9
- package/dist/{boot-scrub-sweep-zkr6vkqb.js → boot-scrub-sweep-hnkn3rgt.js} +11 -10
- package/dist/{boot-seeds-d8sp49t2.js → boot-seeds-kwjq4d2z.js} +14 -13
- package/dist/{claude-adapter-yzzzh8jp.js → claude-adapter-9vmvpvgd.js} +19 -18
- package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-k9qae05j.js} +7 -5
- package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-q54zx5q2.js} +6 -4
- package/dist/{claude-sdk-session-4whxere4.js → claude-sdk-session-9jye6cxr.js} +11881 -11472
- package/dist/{cli-94b48jhk.js → cli-03gedhng.js} +16 -14
- package/dist/{cli-1w0vj3gw.js → cli-1e4b6bzh.js} +7 -7
- package/dist/{cli-d603qf86.js → cli-29jc5q7w.js} +10 -8
- package/dist/cli-2m1ktfzz.js +17795 -0
- package/dist/{cli-x119kdba.js → cli-3dj8k4vy.js} +1 -1
- package/dist/{cli-srqq3gc5.js → cli-3fbmmawm.js} +5 -5
- package/dist/{cli-gmdajfw5.js → cli-4jxm2qtz.js} +4987 -1708
- package/dist/{cli-tadfgd0t.js → cli-5hkm7whv.js} +33 -4
- package/dist/{cli-42qhyvwx.js → cli-5t4f29ez.js} +3 -3
- package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
- package/dist/cli-6cvfxs8r.js +47 -0
- package/dist/{cli-0kxf81jj.js → cli-6jyj59nb.js} +2 -2
- package/dist/{cli-w1apjecb.js → cli-6razj6t4.js} +2 -2
- package/dist/{cli-anzdk0z4.js → cli-74ahz61x.js} +2 -2
- package/dist/{cli-m89t9jdf.js → cli-7x0g4sn1.js} +15416 -16024
- package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
- package/dist/{cli-81r1wjyv.js → cli-9nfx44eh.js} +1 -1
- package/dist/cli-9traj3dn.js +638 -0
- package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
- package/dist/{cli-na2pxe4f.js → cli-apx87jne.js} +2 -2
- package/dist/{cli-rfz2ve55.js → cli-bzszjf2p.js} +2855 -862
- package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
- package/dist/{cli-hsem16hb.js → cli-cgtksawx.js} +7 -4
- package/dist/{cli-db3m6zdt.js → cli-d2qr7aj4.js} +1 -1
- package/dist/{cli-rfs4vddv.js → cli-d5f9ed5c.js} +5 -5
- package/dist/cli-e3g5mbkz.js +776 -0
- package/dist/{cli-7jykv7ef.js → cli-e6mpjhed.js} +1 -1
- package/dist/{cli-7a93cv8c.js → cli-ee9gtz70.js} +98 -23
- package/dist/{cli-3nxdmjrc.js → cli-eejsgvm4.js} +4 -4
- package/dist/{cli-fmhj1ehj.js → cli-ef1hg1wv.js} +470 -51
- package/dist/cli-f527ce74.js +781 -0
- package/dist/{cli-ppy4nnnh.js → cli-f7kr7svz.js} +2 -2
- package/dist/cli-hjwmhcg1.js +10622 -0
- package/dist/{cli-2bw3w47j.js → cli-hnhtk6cj.js} +1 -1
- package/dist/{cli-ywm1azg9.js → cli-hnmhtzvh.js} +6 -4
- package/dist/{cli-h7k0xtry.js → cli-hvqbtna4.js} +4 -1256
- package/dist/{cli-s8z6x4b4.js → cli-j0pfptdp.js} +218 -102
- package/dist/cli-jta2eyzc.js +619 -0
- package/dist/{cli-5er5gjbm.js → cli-k382tshb.js} +10 -11
- package/dist/{cli-v3zhnxsb.js → cli-k3dp5tpf.js} +2 -2
- package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
- package/dist/cli-kceah1eh.js +92 -0
- package/dist/{cli-ne7smj1b.js → cli-ke896fcf.js} +10 -10
- package/dist/{cli-xc7p7s3g.js → cli-kt6zqg0e.js} +6 -6
- package/dist/{cli-wrh08zjd.js → cli-m50t4309.js} +5 -18
- package/dist/cli-n2wq4j7m.js +6985 -0
- package/dist/{cli-bv2etw2y.js → cli-n3hzg89b.js} +46 -15
- package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
- package/dist/{cli-qm1448f9.js → cli-ne236afy.js} +8 -8
- package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
- package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
- package/dist/{cli-0a7mm3zp.js → cli-q0ke1yww.js} +25 -21
- package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
- package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
- package/dist/{cli-phcqp1b9.js → cli-r2pnvj8g.js} +2 -2
- package/dist/{cli-jpc4r224.js → cli-r62a35ea.js} +19 -3
- package/dist/{cli-cd0hv9nh.js → cli-ra0xzggj.js} +2 -2
- package/dist/cli-rhs9pz33.js +294 -0
- package/dist/{cli-r4fqfpwf.js → cli-s2sp957d.js} +50 -27
- package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
- package/dist/{cli-6thk4jz3.js → cli-se8w6wny.js} +6 -6
- package/dist/cli-skxvvpap.js +10140 -0
- package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
- package/dist/{cli-0p3enk35.js → cli-tqaazemc.js} +9 -1
- package/dist/{cli-nwrdx840.js → cli-tr4sxp68.js} +3 -3
- package/dist/{cli-r0byd61h.js → cli-tsde1hdr.js} +15 -15
- package/dist/{cli-b07hr3bt.js → cli-txqb9s38.js} +2 -2
- package/dist/{cli-6r2f7edk.js → cli-v1yb0rqb.js} +6 -6
- package/dist/{cli-saqyage0.js → cli-vatyhshy.js} +179 -27
- package/dist/{cli-5wpw4rab.js → cli-vdach5a9.js} +5 -5
- package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
- package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
- package/dist/{cli-c3rk1v0x.js → cli-wayw93nt.js} +3 -3
- package/dist/cli-wmgrkscj.js +23254 -0
- package/dist/{cli-9xf7fdtp.js → cli-z5jjpaxw.js} +29 -6
- package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
- package/dist/cli.js +29 -45
- package/dist/{codex-adapter-r3dn4fp5.js → codex-adapter-y81sssk0.js} +15 -14
- package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
- package/dist/{codex-session-runner-fwt793h4.js → codex-session-runner-8vx4j6a9.js} +15 -14
- package/dist/{commands-z8fq9qna.js → commands-kcpvpcrr.js} +11 -10
- package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
- package/dist/{controllers-connect-3mf2btyj.js → controllers-connect-kwpvj3rf.js} +42 -37
- package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
- package/dist/{db-yyhqqrbf.js → db-k8ankj20.js} +12 -11
- package/dist/{db-qfpq4bt7.js → db-ww5d7jq3.js} +28 -9
- package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
- package/dist/{dispatcher-x0x7qfcq.js → dispatcher-e8gq5m68.js} +38 -33
- package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
- package/dist/{dsh-adapter-34etvb5m.js → dsh-adapter-3epjm3af.js} +7 -6
- package/dist/{e2b-66xra4az.js → e2b-8ygwhg0f.js} +4 -3
- package/dist/{e2b-xwhyj8cw.js → e2b-swhnpw3n.js} +4 -3
- package/dist/{event-bus-vjtv82gm.js → event-bus-6axnngdj.js} +3 -2
- package/dist/{external-channel-h1fjecwe.js → external-channel-h3359cwn.js} +11 -10
- package/dist/{google-generative-ai-szdxbpqg.js → google-generative-ai-g8db7x0f.js} +4 -2
- package/dist/{google-vertex-qzw3p36d.js → google-vertex-r2692q0r.js} +4 -2
- package/dist/{grok-adapter-e7mr287e.js → grok-adapter-0d4x7gkx.js} +18 -17
- package/dist/{handlers-znb9n7d4.js → handlers-an1gzv21.js} +41 -36
- package/dist/{heartbeat-bm4qkn8d.js → heartbeat-6dakeb61.js} +43 -38
- package/dist/{hook-254r4mza.js → hook-6v6cv6d5.js} +11 -23
- package/dist/{hook-xaa3q80s.js → hook-sa5xye4y.js} +12 -11
- package/dist/{http-3dgrgp8y.js → http-r7f3eky0.js} +1499 -251
- package/dist/index-52j1aja4.js +3465 -0
- package/dist/{index-fx3jqq1e.js → index-7ep4gzdk.js} +38 -33
- package/dist/index-9gw58n4k.js +193 -0
- package/dist/index-9j87mcm8.js +56305 -0
- package/dist/index-bsmcresk.js +79424 -0
- package/dist/index-mh85qhec.js +475 -0
- package/dist/{index-g2byveez.js → index-rmpw9a8q.js} +38 -33
- package/dist/{index-2ybk7khy.js → index-s2wxgzr0.js} +468 -683
- package/dist/{index-bdsqa799.js → index-v1v6n7hg.js} +43 -38
- package/dist/index-we27kd31.js +12810 -0
- package/dist/{index-jd7sejm2.js → index-zk96aq1k.js} +10 -9
- package/dist/{keepalive-6ywhpja1.js → keepalive-be9vwy5h.js} +12 -11
- package/dist/{lead-cw45n21s.js → lead-0861cwrf.js} +61 -56
- package/dist/{maintenance-ss1a1ge9.js → maintenance-mzzgc8bn.js} +10 -9
- package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
- package/dist/{oauth-refresh-sweep-3c6f8vyy.js → oauth-refresh-sweep-cpdnfwdj.js} +11 -10
- package/dist/{onboard-8hzdhc1k.js → onboard-fh8qs4r3.js} +11 -3
- package/dist/{opencode-adapter-qbchbcfz.js → opencode-adapter-nm42wwj8.js} +18 -13
- package/dist/{otel-impl-e6mnvc4v.js → otel-impl-x6c1c9g4.js} +242 -868
- package/dist/{pi-mono-adapter-3c9g9snh.js → pi-mono-adapter-9n2ya240.js} +244 -106
- package/dist/{pricing-refresh-gedkjdw0.js → pricing-refresh-qb0rv0ap.js} +12 -11
- package/dist/{rbac-roles-dt4vh1yy.js → rbac-roles-1gzdwbh1.js} +11 -10
- package/dist/{rbac-roles-eszdg6pm.js → rbac-roles-3mraey52.js} +12 -11
- package/dist/{render-v2-907cy6sa.js → render-v2-agpa45zz.js} +18 -14
- package/dist/{resume-42stcaz0.js → resume-x0ydy9s9.js} +25 -21
- package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
- package/dist/{setup-adbc1c10.js → setup-as9ga0d6.js} +2 -2
- package/dist/{virtual-modules-rtmt494q.js → virtual-modules-9gkxqrap.js} +6 -5
- package/dist/{work-objects-wpj8ck95.js → work-objects-y5g1y7ev.js} +41 -36
- package/dist/{worker-bzdra9rf.js → worker-860c3e38.js} +61 -56
- package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
- package/openapi.json +523 -344
- package/package.json +10 -11
- package/src/be/config-refs.ts +60 -0
- package/src/be/db/page-versions.ts +15 -0
- package/src/be/db/runtime.ts +35 -8
- package/src/be/db/skill-name-resolution.ts +36 -0
- package/src/be/db/tasks/read.ts +230 -0
- package/src/be/db/tasks/write.ts +7 -0
- package/src/be/db.ts +52 -7
- package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
- package/src/be/migrations/216_task_resolved_effort.sql +5 -0
- package/src/be/migrations/217_chat_sdk_state.sql +104 -0
- package/src/be/model-catalog-store.ts +5 -1
- package/src/be/model-tier-resolution.ts +12 -1
- package/src/be/model-validation.ts +5 -2
- package/src/be/models-catalog.ts +26 -1
- package/src/be/modelsdev-cache.json +198 -63
- package/src/be/modelsdev-cache.ts +9 -1
- package/src/be/script-credential-broker.ts +39 -2
- package/src/be/scripts/run-saved.ts +1 -0
- package/src/be/scripts/typecheck.ts +10 -8
- package/src/be/seed/runner.ts +13 -1
- package/src/be/seed/state-db.ts +5 -0
- package/src/be/seed/types.ts +6 -0
- package/src/be/seed-pricing.ts +19 -2
- package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
- package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
- package/src/be/seed-skills/bundled-files.generated.json +0 -18
- package/src/be/seed-skills/index.ts +104 -3
- package/src/be/swarm-config-guard.ts +52 -0
- package/src/cli.tsx +0 -16
- package/src/commands/onboard/non-interactive.ts +4 -2
- package/src/commands/provider-credentials.ts +52 -6
- package/src/commands/runner.ts +190 -54
- package/src/e2b/env.ts +5 -0
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +45 -0
- package/src/extensions/dispatcher.ts +7 -0
- package/src/extensions/post-bridge.ts +40 -0
- package/src/github/handlers.ts +11 -4
- package/src/heartbeat/templates.ts +8 -5
- package/src/hooks/hook.ts +0 -26
- package/src/http/all-routes.ts +0 -1
- package/src/http/config.ts +36 -17
- package/src/http/core.ts +4 -0
- package/src/http/index.ts +14 -2
- package/src/http/integrations.ts +88 -1
- package/src/http/mcp.ts +15 -5
- package/src/http/page-proxy.ts +2 -4
- package/src/http/pages-public.ts +3 -3
- package/src/http/pages.ts +3 -13
- package/src/http/poll.ts +28 -68
- package/src/http/requested-by.ts +54 -0
- package/src/http/scripts.ts +1 -0
- package/src/http/stats.ts +1 -30
- package/src/http/tasks.ts +61 -5
- package/src/http/utils.ts +14 -0
- package/src/http/webhooks.ts +159 -1
- package/src/http/x.ts +1 -0
- package/src/integrations/chat-sdk/adapters.ts +129 -0
- package/src/integrations/chat-sdk/attachments.ts +232 -0
- package/src/integrations/chat-sdk/background.ts +36 -0
- package/src/integrations/chat-sdk/commands.ts +194 -0
- package/src/integrations/chat-sdk/config.ts +198 -0
- package/src/integrations/chat-sdk/discord-api.ts +63 -0
- package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
- package/src/integrations/chat-sdk/handlers.ts +28 -0
- package/src/integrations/chat-sdk/inbound.ts +426 -0
- package/src/integrations/chat-sdk/limits.ts +48 -0
- package/src/integrations/chat-sdk/logger.ts +81 -0
- package/src/integrations/chat-sdk/outbound.ts +123 -0
- package/src/integrations/chat-sdk/relay.ts +172 -0
- package/src/integrations/chat-sdk/router.ts +169 -0
- package/src/integrations/chat-sdk/runtime.ts +351 -0
- package/src/integrations/chat-sdk/schema.ts +245 -0
- package/src/integrations/chat-sdk/state.ts +243 -0
- package/src/integrations/chat-sdk/status.ts +244 -0
- package/src/integrations/chat-sdk/steering.ts +58 -0
- package/src/integrations/chat-sdk/teams-origin.ts +77 -0
- package/src/integrations/chat-sdk/telegram-api.ts +56 -0
- package/src/integrations/chat-sdk/templates.ts +16 -0
- package/src/integrations/chat-sdk/test-hooks.ts +37 -0
- package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
- package/src/integrations/chat-sdk/typing.ts +65 -0
- package/src/pages/version.ts +4 -5
- package/src/prompts/base-prompt.ts +111 -45
- package/src/providers/acp-target-catalog.ts +6 -0
- package/src/providers/acp-targets.ts +55 -2
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +1 -1
- package/src/providers/claude-flag-settings.ts +17 -5
- package/src/providers/claude-managed-adapter.ts +1 -1
- package/src/providers/claude-session-events.ts +6 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/opencode-adapter.ts +243 -26
- package/src/providers/opencode-swarm-plugin.ts +31 -0
- package/src/providers/pi-mono-adapter.ts +398 -153
- package/src/providers/pricing-sources.md +33 -2
- package/src/providers/reasoning-effort.ts +27 -0
- package/src/providers/types.ts +6 -2
- package/src/rbac/legacy-policy.ts +8 -2
- package/src/rbac/permissions.ts +21 -0
- package/src/scheduler/scheduler.ts +4 -2
- package/src/scripts-runtime/loader.ts +19 -7
- package/src/scripts-runtime/sdk-allowlist.ts +8 -6
- package/src/scripts-runtime/swarm-sdk.ts +0 -11
- package/src/scripts-runtime/types/stdlib.d.ts +27 -15
- package/src/scripts-runtime/types/swarm-extension.d.ts +63 -1
- package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -15
- package/src/server.ts +52 -18
- package/src/slack/event-dedup.ts +1 -1
- package/src/tasks/additive-buffer.ts +4 -2
- package/src/tasks/context-key.ts +60 -1
- package/src/tasks/model-pin.ts +67 -0
- package/src/tasks/worker-follow-up.ts +4 -31
- package/src/tests/acp-adapter.test.ts +42 -0
- package/src/tests/api-drain-worker-e2e.test.ts +1 -6
- package/src/tests/base-prompt.test.ts +58 -54
- package/src/tests/chat-sdk-commands.test.ts +191 -0
- package/src/tests/chat-sdk-config.test.ts +334 -0
- package/src/tests/chat-sdk-discord-api.test.ts +68 -0
- package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
- package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
- package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
- package/src/tests/chat-sdk-harness.ts +146 -0
- package/src/tests/chat-sdk-inbound.test.ts +363 -0
- package/src/tests/chat-sdk-relay.test.ts +470 -0
- package/src/tests/chat-sdk-reload.test.ts +128 -0
- package/src/tests/chat-sdk-shutdown.test.ts +220 -0
- package/src/tests/chat-sdk-slack.test.ts +268 -0
- package/src/tests/chat-sdk-state.test.ts +163 -0
- package/src/tests/chat-sdk-status-route.test.ts +382 -0
- package/src/tests/chat-sdk-teams.test.ts +277 -0
- package/src/tests/chat-sdk-tools.test.ts +520 -0
- package/src/tests/chat-sdk-typing.test.ts +120 -0
- package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
- package/src/tests/claude-adapter-binary.test.ts +9 -4
- package/src/tests/claude-flag-settings.test.ts +11 -3
- package/src/tests/claude-managed-adapter.test.ts +1 -1
- package/src/tests/claude-sdk-lifecycle.test.ts +9 -3
- package/src/tests/claude-thinking-tokens.test.ts +57 -0
- package/src/tests/claude-worker-parity.test.ts +2 -7
- package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
- package/src/tests/config-refs.test.ts +66 -0
- package/src/tests/context-key.test.ts +19 -0
- package/src/tests/cors-allowlist.test.ts +25 -0
- package/src/tests/create-page-tool.test.ts +18 -0
- package/src/tests/credential-check.test.ts +139 -0
- package/src/tests/credentials.test.ts +21 -0
- package/src/tests/db-runtime.test.ts +61 -0
- package/src/tests/db-task-read-contract.test.ts +20 -0
- package/src/tests/db-task-write-contract.test.ts +10 -0
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/enabled-capabilities.test.ts +20 -0
- package/src/tests/entrypoint-api-readiness.test.ts +14 -8
- package/src/tests/entrypoint-config-env-export.test.ts +5 -2
- package/src/tests/entrypoint-export-to-env.test.ts +78 -0
- package/src/tests/explicit-model-validation.test.ts +105 -1
- package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
- package/src/tests/extensions-post-bridge.test.ts +51 -0
- package/src/tests/fetch-resolved-env.test.ts +128 -0
- package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
- package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
- package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
- package/src/tests/github-handlers.test.ts +35 -0
- package/src/tests/harness-provider-resolution.test.ts +12 -0
- package/src/tests/heartbeat-checklist.test.ts +3 -2
- package/src/tests/hook-runtime-close.test.ts +0 -2
- package/src/tests/http-api-integration.test.ts +0 -25
- package/src/tests/migration-046-budgets.test.ts +17 -16
- package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
- package/src/tests/model-tier-resolution.test.ts +93 -0
- package/src/tests/models-catalog.test.ts +42 -1
- package/src/tests/openai-compatible-providers.test.ts +134 -0
- package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
- package/src/tests/opencode-adapter.test.ts +216 -2
- package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
- package/src/tests/opencode-shell-env.test.ts +145 -0
- package/src/tests/openrouter-base-url.test.ts +101 -151
- package/src/tests/page-proxy.test.ts +1 -1
- package/src/tests/pages-browser-sdk.test.ts +76 -0
- package/src/tests/pages-feedback.test.ts +1 -1
- package/src/tests/paused-tasks-requested-by.test.ts +102 -0
- package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
- package/src/tests/pi-mono-adapter.test.ts +385 -5
- package/src/tests/pi-shell-env.test.ts +170 -0
- package/src/tests/prompt-template-remaining.test.ts +35 -0
- package/src/tests/rbac-engine.test.ts +11 -3
- package/src/tests/runner-exit-after-tasks.test.ts +0 -4
- package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
- package/src/tests/script-connections.test.ts +2 -0
- package/src/tests/scripts-http.test.ts +201 -1
- package/src/tests/scripts-only-gating.test.ts +2 -3
- package/src/tests/scripts-runtime.test.ts +58 -40
- package/src/tests/secret-scrubber.test.ts +86 -0
- package/src/tests/seed-skills-bundled-files.test.ts +45 -53
- package/src/tests/seed-skills-retire.test.ts +182 -0
- package/src/tests/send-task-requester-gate.test.ts +58 -0
- package/src/tests/session-cost-recompute-unit.test.ts +46 -0
- package/src/tests/skill-get-name-resolution.test.ts +137 -0
- package/src/tests/sonnet-5-5-registry.test.ts +9 -1
- package/src/tests/swarm-config-export-to-env.test.ts +267 -0
- package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
- package/src/tests/swarm-diff.test.ts +1 -1
- package/src/tests/task-model-effort-rerun.test.ts +164 -0
- package/src/tests/task-session-prompts.test.ts +132 -0
- package/src/tests/task-tool-manifest.test.ts +14 -0
- package/src/tests/task-tools-ctx.test.ts +2 -0
- package/src/tests/tool-annotations.test.ts +6 -6
- package/src/tests/ui-logs-parser.test.ts +43 -0
- package/src/tests/used-by-route.test.ts +6 -0
- package/src/tests/vercel-ai-gateway.test.ts +149 -0
- package/src/tests/workflow-swarm-script.test.ts +38 -0
- package/src/tests/workflow-wait-filter.test.ts +5 -3
- package/src/tools/chat-access.ts +41 -0
- package/src/tools/chat-open-dm.ts +59 -0
- package/src/tools/chat-post.ts +74 -0
- package/src/tools/chat-read-thread.ts +100 -0
- package/src/tools/chat-reply.ts +75 -0
- package/src/tools/create-page.ts +3 -13
- package/src/tools/model-catalog/index.ts +2 -1
- package/src/tools/register-chat-channel.ts +139 -0
- package/src/tools/send-task.ts +24 -0
- package/src/tools/skills/skill-get.ts +17 -9
- package/src/tools/swarm-config/get-config.ts +2 -1
- package/src/tools/swarm-config/list-config.ts +2 -1
- package/src/tools/swarm-config/set-config.ts +16 -3
- package/src/tools/tool-config.ts +8 -6
- package/src/types.ts +12 -2
- package/src/utils/config-env-export.ts +74 -0
- package/src/utils/credentials.test.ts +92 -0
- package/src/utils/credentials.ts +52 -4
- package/src/utils/harness-provider.ts +15 -6
- package/src/utils/runtime-model-catalog.ts +11 -1
- package/src/utils/secret-scrubber.ts +71 -2
- package/src/utils/task-tool-manifest.ts +19 -2
- package/src/workflows/executors/swarm-script.ts +1 -0
- package/templates/skills/agent-browser/SKILL.md +1 -1
- package/templates/skills/agent-browser/content.md +1 -1
- package/templates/skills/apps/SKILL.md +8 -1
- package/templates/skills/apps/content.md +8 -1
- package/templates/skills/chat-sdk/config.json +14 -0
- package/templates/skills/chat-sdk/content.md +84 -0
- package/templates/skills/composio-gmail/content.md +7 -0
- package/templates/skills/composio-google-docs/content.md +1 -1
- package/templates/skills/email-domain-health/config.json +14 -0
- package/templates/skills/email-domain-health/content.md +131 -0
- package/templates/skills/kv-storage/content.md +2 -2
- package/templates/skills/pages/content.md +8 -10
- package/templates/skills/swarm-extensions/content.md +2 -0
- package/templates/skills/swarm-scripts/SKILL.md +4 -2
- package/templates/skills/swarm-scripts/config.json +1 -1
- package/templates/skills/swarm-scripts/content.md +4 -2
- package/templates/skills/workflow-iterate/content.md +38 -0
- package/dist/artifact-eczsknc3.js +0 -3843
- package/dist/cli-bd957dgb.js +0 -153
- package/dist/cli-q51yprfq.js +0 -1104
- package/dist/cli-t1ze64h3.js +0 -811
- package/dist/cli-tcc4wd5d.js +0 -56471
- package/dist/index-9ch1n761.js +0 -1102
- package/src/artifact-sdk/index.ts +0 -2
- package/src/artifact-sdk/localtunnel.d.ts +0 -20
- package/src/artifact-sdk/port.ts +0 -12
- package/src/artifact-sdk/server.ts +0 -183
- package/src/artifact-sdk/tunnel.ts +0 -19
- package/src/commands/artifact.ts +0 -249
- package/src/http/ecosystem.ts +0 -77
- package/src/tests/artifact-commands.test.ts +0 -92
- package/src/tests/artifact-sdk.test.ts +0 -793
- package/src/tests/register-service-security.test.ts +0 -194
- package/src/tools/list-services.ts +0 -107
- package/src/tools/register-service.ts +0 -177
- package/src/tools/unregister-service.ts +0 -73
- package/src/tools/update-service-status.ts +0 -96
- package/templates/skills/artifacts/config.json +0 -14
- package/templates/skills/artifacts/content.md +0 -344
- package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
- package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
- package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
- package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
- /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
- /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cardChildToFallbackText2,
|
|
3
|
+
convertEmojiPlaceholders,
|
|
4
|
+
isCardElement2,
|
|
5
|
+
tableElementToAscii
|
|
6
|
+
} from "./cli-2m1ktfzz.js";
|
|
7
|
+
|
|
8
|
+
// node_modules/@chat-adapter/shared/dist/index.js
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import { lookup as resolve } from "dns/promises";
|
|
11
|
+
import { request as secure } from "https";
|
|
12
|
+
import { BlockList, isIP } from "net";
|
|
13
|
+
import { pipeline } from "stream";
|
|
14
|
+
import { createBrotliDecompress, createGunzip, createInflate } from "zlib";
|
|
15
|
+
function extractCard(message) {
|
|
16
|
+
if (isCardElement2(message)) {
|
|
17
|
+
return message;
|
|
18
|
+
}
|
|
19
|
+
if (typeof message === "object" && message !== null && "card" in message) {
|
|
20
|
+
return message.card;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function extractFiles(message) {
|
|
25
|
+
if (typeof message === "object" && message !== null && "files" in message) {
|
|
26
|
+
return message.files ?? [];
|
|
27
|
+
}
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
function extractPostableAttachments(message) {
|
|
31
|
+
if (typeof message === "object" && message !== null && "attachments" in message) {
|
|
32
|
+
return message.attachments ?? [];
|
|
33
|
+
}
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
var AdapterError = class extends Error {
|
|
37
|
+
adapter;
|
|
38
|
+
code;
|
|
39
|
+
constructor(message, adapter, code) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = "AdapterError";
|
|
42
|
+
this.adapter = adapter;
|
|
43
|
+
this.code = code;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var AdapterRateLimitError = class extends AdapterError {
|
|
47
|
+
retryAfter;
|
|
48
|
+
constructor(adapter, retryAfter) {
|
|
49
|
+
super(`Rate limited by ${adapter}${retryAfter ? `, retry after ${retryAfter}s` : ""}`, adapter, "RATE_LIMITED");
|
|
50
|
+
this.name = "AdapterRateLimitError";
|
|
51
|
+
this.retryAfter = retryAfter;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var AuthenticationError = class extends AdapterError {
|
|
55
|
+
constructor(adapter, message) {
|
|
56
|
+
super(message || `Authentication failed for ${adapter}`, adapter, "AUTH_FAILED");
|
|
57
|
+
this.name = "AuthenticationError";
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var ResourceNotFoundError = class extends AdapterError {
|
|
61
|
+
resourceType;
|
|
62
|
+
resourceId;
|
|
63
|
+
constructor(adapter, resourceType, resourceId) {
|
|
64
|
+
const idPart = resourceId ? ` '${resourceId}'` : "";
|
|
65
|
+
super(`${resourceType}${idPart} not found in ${adapter}`, adapter, "NOT_FOUND");
|
|
66
|
+
this.name = "ResourceNotFoundError";
|
|
67
|
+
this.resourceType = resourceType;
|
|
68
|
+
this.resourceId = resourceId;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
var PermissionError = class extends AdapterError {
|
|
72
|
+
action;
|
|
73
|
+
requiredScope;
|
|
74
|
+
constructor(adapter, action, requiredScope) {
|
|
75
|
+
const scopePart = requiredScope ? ` (requires: ${requiredScope})` : "";
|
|
76
|
+
super(`Permission denied: cannot ${action} in ${adapter}${scopePart}`, adapter, "PERMISSION_DENIED");
|
|
77
|
+
this.name = "PermissionError";
|
|
78
|
+
this.action = action;
|
|
79
|
+
this.requiredScope = requiredScope;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var ValidationError = class extends AdapterError {
|
|
83
|
+
constructor(adapter, message) {
|
|
84
|
+
super(message, adapter, "VALIDATION_ERROR");
|
|
85
|
+
this.name = "ValidationError";
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
var NetworkError = class extends AdapterError {
|
|
89
|
+
originalError;
|
|
90
|
+
constructor(adapter, message, originalError) {
|
|
91
|
+
super(message || `Network error communicating with ${adapter}`, adapter, "NETWORK_ERROR");
|
|
92
|
+
this.name = "NetworkError";
|
|
93
|
+
this.originalError = originalError;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
async function toBuffer(data, options) {
|
|
97
|
+
const { platform, throwOnUnsupported = true } = options;
|
|
98
|
+
if (Buffer.isBuffer(data)) {
|
|
99
|
+
return data;
|
|
100
|
+
}
|
|
101
|
+
if (data instanceof ArrayBuffer) {
|
|
102
|
+
return Buffer.from(data);
|
|
103
|
+
}
|
|
104
|
+
if (data instanceof Blob) {
|
|
105
|
+
const arrayBuffer = await data.arrayBuffer();
|
|
106
|
+
return Buffer.from(arrayBuffer);
|
|
107
|
+
}
|
|
108
|
+
if (throwOnUnsupported) {
|
|
109
|
+
throw new ValidationError(platform, "Unsupported file data type");
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
function bufferToDataUri(buffer, mimeType = "application/octet-stream") {
|
|
114
|
+
const base64 = buffer.toString("base64");
|
|
115
|
+
return `data:${mimeType};base64,${base64}`;
|
|
116
|
+
}
|
|
117
|
+
var BUTTON_STYLE_MAPPINGS = {
|
|
118
|
+
slack: { primary: "primary", danger: "danger" },
|
|
119
|
+
gchat: { primary: "primary", danger: "danger" },
|
|
120
|
+
teams: { primary: "positive", danger: "destructive" },
|
|
121
|
+
discord: { primary: "primary", danger: "danger" }
|
|
122
|
+
};
|
|
123
|
+
function createEmojiConverter(platform) {
|
|
124
|
+
return (text) => convertEmojiPlaceholders(text, platform);
|
|
125
|
+
}
|
|
126
|
+
function mapButtonStyle(style, platform) {
|
|
127
|
+
if (!style) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
return BUTTON_STYLE_MAPPINGS[platform][style];
|
|
131
|
+
}
|
|
132
|
+
function cardToFallbackText(card, options = {}) {
|
|
133
|
+
const { boldFormat = "*", lineBreak = `
|
|
134
|
+
`, platform } = options;
|
|
135
|
+
const convertText = platform ? createEmojiConverter(platform) : (t) => t;
|
|
136
|
+
const parts = [];
|
|
137
|
+
if (card.title) {
|
|
138
|
+
parts.push(`${boldFormat}${convertText(card.title)}${boldFormat}`);
|
|
139
|
+
}
|
|
140
|
+
if (card.subtitle) {
|
|
141
|
+
parts.push(convertText(card.subtitle));
|
|
142
|
+
}
|
|
143
|
+
for (const child of card.children) {
|
|
144
|
+
const text = childToFallbackText(child, convertText);
|
|
145
|
+
if (text) {
|
|
146
|
+
parts.push(text);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return parts.join(lineBreak);
|
|
150
|
+
}
|
|
151
|
+
function childToFallbackText(child, convertText) {
|
|
152
|
+
switch (child.type) {
|
|
153
|
+
case "text":
|
|
154
|
+
return convertText(child.content);
|
|
155
|
+
case "link":
|
|
156
|
+
return `${convertText(child.label)} (${child.url})`;
|
|
157
|
+
case "fields":
|
|
158
|
+
return child.children.map((f) => `${convertText(f.label)}: ${convertText(f.value)}`).join(`
|
|
159
|
+
`);
|
|
160
|
+
case "actions":
|
|
161
|
+
return null;
|
|
162
|
+
case "section":
|
|
163
|
+
return child.children.map((c) => childToFallbackText(c, convertText)).filter(Boolean).join(`
|
|
164
|
+
`);
|
|
165
|
+
case "table":
|
|
166
|
+
return tableElementToAscii(child.headers, child.rows);
|
|
167
|
+
case "divider":
|
|
168
|
+
return "---";
|
|
169
|
+
default:
|
|
170
|
+
return cardChildToFallbackText2(child);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function escapeTableCell(value) {
|
|
174
|
+
return value.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\n/g, " ");
|
|
175
|
+
}
|
|
176
|
+
function renderGfmTable(table) {
|
|
177
|
+
const headers = table.headers.map(escapeTableCell);
|
|
178
|
+
const lines = [];
|
|
179
|
+
lines.push(`| ${headers.join(" | ")} |`);
|
|
180
|
+
lines.push(`| ${headers.map(() => "---").join(" | ")} |`);
|
|
181
|
+
for (const row of table.rows) {
|
|
182
|
+
const cells = row.map(escapeTableCell);
|
|
183
|
+
lines.push(`| ${cells.join(" | ")} |`);
|
|
184
|
+
}
|
|
185
|
+
return lines;
|
|
186
|
+
}
|
|
187
|
+
var ALGORITHM = "aes-256-gcm";
|
|
188
|
+
var IV_LENGTH = 12;
|
|
189
|
+
var AUTH_TAG_LENGTH = 16;
|
|
190
|
+
var HEX_KEY_PATTERN = /^[0-9a-fA-F]{64}$/;
|
|
191
|
+
function encryptToken(plaintext, key) {
|
|
192
|
+
const iv = crypto.randomBytes(IV_LENGTH);
|
|
193
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv, {
|
|
194
|
+
authTagLength: AUTH_TAG_LENGTH
|
|
195
|
+
});
|
|
196
|
+
const ciphertext = Buffer.concat([
|
|
197
|
+
cipher.update(plaintext, "utf8"),
|
|
198
|
+
cipher.final()
|
|
199
|
+
]);
|
|
200
|
+
const tag = cipher.getAuthTag();
|
|
201
|
+
return {
|
|
202
|
+
iv: iv.toString("base64"),
|
|
203
|
+
data: ciphertext.toString("base64"),
|
|
204
|
+
tag: tag.toString("base64")
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function decryptToken(encrypted, key) {
|
|
208
|
+
const iv = Buffer.from(encrypted.iv, "base64");
|
|
209
|
+
const ciphertext = Buffer.from(encrypted.data, "base64");
|
|
210
|
+
const tag = Buffer.from(encrypted.tag, "base64");
|
|
211
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv, {
|
|
212
|
+
authTagLength: AUTH_TAG_LENGTH
|
|
213
|
+
});
|
|
214
|
+
decipher.setAuthTag(tag);
|
|
215
|
+
return Buffer.concat([
|
|
216
|
+
decipher.update(ciphertext),
|
|
217
|
+
decipher.final()
|
|
218
|
+
]).toString("utf8");
|
|
219
|
+
}
|
|
220
|
+
function isEncryptedTokenData(value) {
|
|
221
|
+
if (!value || typeof value !== "object") {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
const obj = value;
|
|
225
|
+
return typeof obj.iv === "string" && typeof obj.data === "string" && typeof obj.tag === "string";
|
|
226
|
+
}
|
|
227
|
+
function decodeKey(rawKey) {
|
|
228
|
+
const trimmed = rawKey.trim();
|
|
229
|
+
const isHex = HEX_KEY_PATTERN.test(trimmed);
|
|
230
|
+
const key = Buffer.from(trimmed, isHex ? "hex" : "base64");
|
|
231
|
+
if (key.length !== 32) {
|
|
232
|
+
throw new Error(`Encryption key must decode to exactly 32 bytes (received ${key.length}). Use a 64-char hex string or 44-char base64 string.`);
|
|
233
|
+
}
|
|
234
|
+
return key;
|
|
235
|
+
}
|
|
236
|
+
var LIMIT = 25 * 1024 * 1024;
|
|
237
|
+
var REDIRECTS = 5;
|
|
238
|
+
var TIMEOUT = 30000;
|
|
239
|
+
var STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
|
|
240
|
+
var BRACKETS = /^\[|\]$/g;
|
|
241
|
+
var IPV4 = [
|
|
242
|
+
["0.0.0.0", 8],
|
|
243
|
+
["10.0.0.0", 8],
|
|
244
|
+
["100.64.0.0", 10],
|
|
245
|
+
["127.0.0.0", 8],
|
|
246
|
+
["169.254.0.0", 16],
|
|
247
|
+
["172.16.0.0", 12],
|
|
248
|
+
["192.0.0.0", 24],
|
|
249
|
+
["192.0.2.0", 24],
|
|
250
|
+
["192.88.99.0", 24],
|
|
251
|
+
["192.168.0.0", 16],
|
|
252
|
+
["198.18.0.0", 15],
|
|
253
|
+
["198.51.100.0", 24],
|
|
254
|
+
["203.0.113.0", 24],
|
|
255
|
+
["224.0.0.0", 4],
|
|
256
|
+
["240.0.0.0", 4]
|
|
257
|
+
];
|
|
258
|
+
var IPV6 = [
|
|
259
|
+
["::", 3],
|
|
260
|
+
["2001::", 23],
|
|
261
|
+
["2001:db8::", 32],
|
|
262
|
+
["2002::", 16],
|
|
263
|
+
["3fff::", 20],
|
|
264
|
+
["4000::", 2],
|
|
265
|
+
["8000::", 1]
|
|
266
|
+
];
|
|
267
|
+
var DECODERS = {
|
|
268
|
+
br: createBrotliDecompress,
|
|
269
|
+
deflate: createInflate,
|
|
270
|
+
gzip: createGunzip,
|
|
271
|
+
"x-gzip": createGunzip
|
|
272
|
+
};
|
|
273
|
+
function blocklist(ranges, family) {
|
|
274
|
+
const list = new BlockList;
|
|
275
|
+
for (const [address, prefix] of ranges) {
|
|
276
|
+
list.addSubnet(address, prefix, family);
|
|
277
|
+
}
|
|
278
|
+
return list;
|
|
279
|
+
}
|
|
280
|
+
var BLOCKED4 = blocklist(IPV4, "ipv4");
|
|
281
|
+
var BLOCKED6 = blocklist(IPV6, "ipv6");
|
|
282
|
+
function blocked(address, family) {
|
|
283
|
+
if (family !== 4 && family !== 6) {
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
return family === 6 ? BLOCKED6.check(address, "ipv6") : BLOCKED4.check(address, "ipv4");
|
|
287
|
+
}
|
|
288
|
+
function refusal(adapter) {
|
|
289
|
+
return new NetworkError(adapter, "Refusing to fetch an internal attachment URL");
|
|
290
|
+
}
|
|
291
|
+
function createResolver(adapter, query = resolve) {
|
|
292
|
+
return (hostname, options, callback) => {
|
|
293
|
+
query(hostname, { ...options, all: true }).then((addresses) => {
|
|
294
|
+
if (addresses.length === 0) {
|
|
295
|
+
callback(new NetworkError(adapter, "Could not resolve the attachment host"), "", 0);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (addresses.some(({ address: address2, family }) => blocked(address2, family))) {
|
|
299
|
+
callback(refusal(adapter), "", 0);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (options.all) {
|
|
303
|
+
callback(null, addresses);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const [address] = addresses;
|
|
307
|
+
callback(null, address.address, address.family);
|
|
308
|
+
}, (error) => {
|
|
309
|
+
callback(error instanceof Error ? error : new Error(String(error)), "", 0);
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function validateAttachmentUrl(value, adapter, hosts) {
|
|
314
|
+
const url = value instanceof URL ? value : new URL(value);
|
|
315
|
+
const hostname = url.hostname.replace(BRACKETS, "");
|
|
316
|
+
const family = isIP(hostname);
|
|
317
|
+
if (family && blocked(hostname, family)) {
|
|
318
|
+
throw refusal(adapter);
|
|
319
|
+
}
|
|
320
|
+
if (url.protocol !== "https:" || hosts && !hosts.some((host) => {
|
|
321
|
+
const allowed = host.toLowerCase();
|
|
322
|
+
return hostname === allowed || hostname.endsWith(`.${allowed}`);
|
|
323
|
+
})) {
|
|
324
|
+
throw new NetworkError(adapter, "Refusing to fetch an untrusted attachment URL");
|
|
325
|
+
}
|
|
326
|
+
return url;
|
|
327
|
+
}
|
|
328
|
+
function createTransport(adapter) {
|
|
329
|
+
const lookup = createResolver(adapter);
|
|
330
|
+
return (url, signal, headers) => new Promise((fulfill, reject) => {
|
|
331
|
+
const request = secure(url, {
|
|
332
|
+
agent: false,
|
|
333
|
+
headers,
|
|
334
|
+
lookup,
|
|
335
|
+
signal
|
|
336
|
+
}, fulfill);
|
|
337
|
+
request.on("error", reject);
|
|
338
|
+
request.end();
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
async function readAttachmentBody(response, adapter, limit = LIMIT, signal) {
|
|
342
|
+
if (signal?.aborted) {
|
|
343
|
+
response.destroy();
|
|
344
|
+
throw new NetworkError(adapter, "Timed out fetching the attachment");
|
|
345
|
+
}
|
|
346
|
+
const abort = () => response.destroy(signalError(signal));
|
|
347
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
348
|
+
try {
|
|
349
|
+
return await readBody(response, adapter, limit);
|
|
350
|
+
} finally {
|
|
351
|
+
signal?.removeEventListener("abort", abort);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
function signalError(signal) {
|
|
355
|
+
const reason = signal?.reason;
|
|
356
|
+
return reason instanceof Error ? reason : new Error(String(reason));
|
|
357
|
+
}
|
|
358
|
+
function awaitResponse(pending, signal, adapter) {
|
|
359
|
+
return new Promise((fulfill, reject) => {
|
|
360
|
+
const abort = () => reject(new NetworkError(adapter, "Timed out fetching the attachment"));
|
|
361
|
+
if (signal.aborted) {
|
|
362
|
+
abort();
|
|
363
|
+
} else {
|
|
364
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
365
|
+
}
|
|
366
|
+
pending.then((response) => {
|
|
367
|
+
signal.removeEventListener("abort", abort);
|
|
368
|
+
if (signal.aborted) {
|
|
369
|
+
response.destroy();
|
|
370
|
+
}
|
|
371
|
+
fulfill(response);
|
|
372
|
+
}, (error) => {
|
|
373
|
+
signal.removeEventListener("abort", abort);
|
|
374
|
+
reject(error);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
async function readBody(response, adapter, limit) {
|
|
379
|
+
const header = response.headers["content-encoding"]?.trim().toLowerCase() || "identity";
|
|
380
|
+
const decode = header === "identity" ? undefined : DECODERS[header];
|
|
381
|
+
if (header !== "identity" && !decode) {
|
|
382
|
+
response.destroy();
|
|
383
|
+
throw new NetworkError(adapter, `Unsupported attachment encoding: ${header}`);
|
|
384
|
+
}
|
|
385
|
+
const declared = decode ? Number.NaN : Number(response.headers["content-length"]);
|
|
386
|
+
if (Number.isFinite(declared) && declared > limit) {
|
|
387
|
+
response.destroy();
|
|
388
|
+
throw new NetworkError(adapter, "Attachment exceeds the download limit");
|
|
389
|
+
}
|
|
390
|
+
const source = decode ? pipeline(response, decode(), () => {
|
|
391
|
+
return;
|
|
392
|
+
}) : response;
|
|
393
|
+
if (Number.isFinite(declared)) {
|
|
394
|
+
const body = Buffer.allocUnsafe(declared);
|
|
395
|
+
let offset = 0;
|
|
396
|
+
for await (const chunk of source) {
|
|
397
|
+
const piece = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
398
|
+
if (offset + piece.length > declared) {
|
|
399
|
+
response.destroy();
|
|
400
|
+
throw new NetworkError(adapter, "Attachment body exceeds its declared length");
|
|
401
|
+
}
|
|
402
|
+
piece.copy(body, offset);
|
|
403
|
+
offset += piece.length;
|
|
404
|
+
}
|
|
405
|
+
return offset === declared ? body : body.subarray(0, offset);
|
|
406
|
+
}
|
|
407
|
+
const chunks = [];
|
|
408
|
+
let size = 0;
|
|
409
|
+
for await (const chunk of source) {
|
|
410
|
+
const piece = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
411
|
+
size += piece.length;
|
|
412
|
+
if (size > limit) {
|
|
413
|
+
response.destroy();
|
|
414
|
+
throw new NetworkError(adapter, "Attachment exceeds the download limit");
|
|
415
|
+
}
|
|
416
|
+
chunks.push(piece);
|
|
417
|
+
}
|
|
418
|
+
return Buffer.concat(chunks, size);
|
|
419
|
+
}
|
|
420
|
+
async function downloadAttachment(value, options) {
|
|
421
|
+
const {
|
|
422
|
+
adapter,
|
|
423
|
+
headers,
|
|
424
|
+
hosts,
|
|
425
|
+
limit = LIMIT,
|
|
426
|
+
onResponse,
|
|
427
|
+
redirects = REDIRECTS,
|
|
428
|
+
timeoutMs = TIMEOUT,
|
|
429
|
+
transport
|
|
430
|
+
} = options;
|
|
431
|
+
const send = transport ?? createTransport(adapter);
|
|
432
|
+
const signal = AbortSignal.timeout(timeoutMs);
|
|
433
|
+
let url = validateAttachmentUrl(value, adapter, hosts);
|
|
434
|
+
try {
|
|
435
|
+
for (let hop = 0;hop <= redirects; hop += 1) {
|
|
436
|
+
const response = await awaitResponse(send(url, signal, {
|
|
437
|
+
"accept-encoding": "gzip, deflate, br",
|
|
438
|
+
"user-agent": "Vercel.ChatSDK",
|
|
439
|
+
...typeof headers === "function" ? headers(url) : headers
|
|
440
|
+
}), signal, adapter);
|
|
441
|
+
const status = response.statusCode ?? 0;
|
|
442
|
+
if (STATUSES.has(status)) {
|
|
443
|
+
const location = response.headers.location;
|
|
444
|
+
response.destroy();
|
|
445
|
+
if (!location) {
|
|
446
|
+
throw new NetworkError(adapter, "Attachment redirect has no location");
|
|
447
|
+
}
|
|
448
|
+
if (hop === redirects) {
|
|
449
|
+
throw new NetworkError(adapter, "Too many attachment redirects");
|
|
450
|
+
}
|
|
451
|
+
url = validateAttachmentUrl(new URL(location, url), adapter, hosts);
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
if (status < 200 || status >= 300) {
|
|
455
|
+
response.destroy();
|
|
456
|
+
throw new NetworkError(adapter, `Failed to fetch file: ${status} ${response.statusMessage ?? ""}`.trim());
|
|
457
|
+
}
|
|
458
|
+
if (onResponse) {
|
|
459
|
+
try {
|
|
460
|
+
onResponse(response);
|
|
461
|
+
} catch (error) {
|
|
462
|
+
response.destroy();
|
|
463
|
+
throw error;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return await readAttachmentBody(response, adapter, limit, signal);
|
|
467
|
+
}
|
|
468
|
+
throw new NetworkError(adapter, "Too many attachment redirects");
|
|
469
|
+
} catch (error) {
|
|
470
|
+
if (signal.aborted && !(error instanceof NetworkError)) {
|
|
471
|
+
throw new NetworkError(adapter, "Timed out fetching the attachment", error instanceof Error ? error : undefined);
|
|
472
|
+
}
|
|
473
|
+
throw error;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
var HTTP = "http://";
|
|
477
|
+
var HTTPS = "https://";
|
|
478
|
+
function isLetter(char) {
|
|
479
|
+
const code = char.charCodeAt(0);
|
|
480
|
+
return code >= 65 && code <= 90 || code >= 97 && code <= 122;
|
|
481
|
+
}
|
|
482
|
+
function isNumber(char) {
|
|
483
|
+
const code = char.charCodeAt(0);
|
|
484
|
+
return code >= 48 && code <= 57;
|
|
485
|
+
}
|
|
486
|
+
function isWord(char) {
|
|
487
|
+
return char !== undefined && (isLetter(char) || isNumber(char) || char === "_");
|
|
488
|
+
}
|
|
489
|
+
function isHost(char) {
|
|
490
|
+
return isLetter(char) || isNumber(char) || char === "." || char === "-";
|
|
491
|
+
}
|
|
492
|
+
function isBoundary(char) {
|
|
493
|
+
return char === "<" || char === ">" || char.trim() === "";
|
|
494
|
+
}
|
|
495
|
+
function startsWith(text, index, value) {
|
|
496
|
+
return text.slice(index, index + value.length).toLowerCase() === value;
|
|
497
|
+
}
|
|
498
|
+
function findUrlEnd(text, index, end) {
|
|
499
|
+
let prefix = 0;
|
|
500
|
+
if (startsWith(text, index, HTTPS)) {
|
|
501
|
+
prefix = HTTPS.length;
|
|
502
|
+
} else if (startsWith(text, index, HTTP)) {
|
|
503
|
+
prefix = HTTP.length;
|
|
504
|
+
}
|
|
505
|
+
if (prefix === 0 || index + prefix >= end) {
|
|
506
|
+
return index;
|
|
507
|
+
}
|
|
508
|
+
let cursor = index + prefix;
|
|
509
|
+
while (cursor < end && !isBoundary(text[cursor])) {
|
|
510
|
+
cursor += 1;
|
|
511
|
+
}
|
|
512
|
+
return cursor;
|
|
513
|
+
}
|
|
514
|
+
function findHostEnd(text, index, end) {
|
|
515
|
+
if (!(isLetter(text[index]) || isNumber(text[index]))) {
|
|
516
|
+
return index;
|
|
517
|
+
}
|
|
518
|
+
if (index > 0 && isHost(text[index - 1])) {
|
|
519
|
+
return index;
|
|
520
|
+
}
|
|
521
|
+
let cursor = index;
|
|
522
|
+
while (cursor < end && isHost(text[cursor])) {
|
|
523
|
+
cursor += 1;
|
|
524
|
+
}
|
|
525
|
+
const separator = text[cursor];
|
|
526
|
+
if (separator !== "/" && separator !== "?" && separator !== "#") {
|
|
527
|
+
return index;
|
|
528
|
+
}
|
|
529
|
+
const host = text.slice(index, cursor);
|
|
530
|
+
const dot = host.lastIndexOf(".");
|
|
531
|
+
const suffix = host.slice(dot + 1);
|
|
532
|
+
if (dot <= 0 || suffix.length < 2) {
|
|
533
|
+
return index;
|
|
534
|
+
}
|
|
535
|
+
for (const char of suffix) {
|
|
536
|
+
if (!isLetter(char)) {
|
|
537
|
+
return index;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
cursor += 1;
|
|
541
|
+
while (cursor < end && !isBoundary(text[cursor])) {
|
|
542
|
+
cursor += 1;
|
|
543
|
+
}
|
|
544
|
+
return cursor;
|
|
545
|
+
}
|
|
546
|
+
function findCodeEnd(text, index, end) {
|
|
547
|
+
if (text[index] !== "`") {
|
|
548
|
+
return index;
|
|
549
|
+
}
|
|
550
|
+
const fence = text.startsWith("```", index);
|
|
551
|
+
const marker = fence ? "```" : "`";
|
|
552
|
+
const start = index + marker.length;
|
|
553
|
+
const close = text.indexOf(marker, start);
|
|
554
|
+
if (close === -1 || close >= end) {
|
|
555
|
+
return index;
|
|
556
|
+
}
|
|
557
|
+
if (!fence) {
|
|
558
|
+
const newline = text.indexOf(`
|
|
559
|
+
`, start);
|
|
560
|
+
if (newline !== -1 && newline < close) {
|
|
561
|
+
return index;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return close + marker.length;
|
|
565
|
+
}
|
|
566
|
+
function replaceRange(text, start, end, replacer, angles) {
|
|
567
|
+
let result = "";
|
|
568
|
+
let index = start;
|
|
569
|
+
while (index < end) {
|
|
570
|
+
const codeEnd = findCodeEnd(text, index, end);
|
|
571
|
+
if (codeEnd > index) {
|
|
572
|
+
result += text.slice(index, codeEnd);
|
|
573
|
+
index = codeEnd;
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
if (angles && text[index] === "<") {
|
|
577
|
+
let cursor = index + 1;
|
|
578
|
+
while (cursor < end && text[cursor] !== ">" && text[cursor] !== `
|
|
579
|
+
` && text[cursor] !== "\r") {
|
|
580
|
+
cursor += 1;
|
|
581
|
+
}
|
|
582
|
+
if (text[cursor] === ">") {
|
|
583
|
+
result += text.slice(index, cursor + 1);
|
|
584
|
+
index = cursor + 1;
|
|
585
|
+
continue;
|
|
586
|
+
}
|
|
587
|
+
result += replaceRange(text, index, cursor, replacer, false);
|
|
588
|
+
index = cursor;
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
591
|
+
const urlEnd = findUrlEnd(text, index, end);
|
|
592
|
+
if (urlEnd > index) {
|
|
593
|
+
result += text.slice(index, urlEnd);
|
|
594
|
+
index = urlEnd;
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
597
|
+
const hostEnd = findHostEnd(text, index, end);
|
|
598
|
+
if (hostEnd > index) {
|
|
599
|
+
result += text.slice(index, hostEnd);
|
|
600
|
+
index = hostEnd;
|
|
601
|
+
continue;
|
|
602
|
+
}
|
|
603
|
+
if (text[index] === "@" && text[index - 1] !== "<" && !isWord(text[index - 1]) && isWord(text[index + 1])) {
|
|
604
|
+
let cursor = index + 2;
|
|
605
|
+
while (cursor < end && isWord(text[cursor])) {
|
|
606
|
+
cursor += 1;
|
|
607
|
+
}
|
|
608
|
+
const mention = text.slice(index, cursor);
|
|
609
|
+
result += replacer(mention, mention.slice(1));
|
|
610
|
+
index = cursor;
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
result += text[index];
|
|
614
|
+
index += 1;
|
|
615
|
+
}
|
|
616
|
+
return result;
|
|
617
|
+
}
|
|
618
|
+
function replaceBareMentions(text, replacer) {
|
|
619
|
+
return replaceRange(text, 0, text.length, replacer, true);
|
|
620
|
+
}
|
|
621
|
+
function maskCodeSpans(text, replacement = " ") {
|
|
622
|
+
let result = "";
|
|
623
|
+
let index = 0;
|
|
624
|
+
const end = text.length;
|
|
625
|
+
while (index < end) {
|
|
626
|
+
const codeEnd = findCodeEnd(text, index, end);
|
|
627
|
+
if (codeEnd > index) {
|
|
628
|
+
result += replacement;
|
|
629
|
+
index = codeEnd;
|
|
630
|
+
continue;
|
|
631
|
+
}
|
|
632
|
+
result += text[index];
|
|
633
|
+
index += 1;
|
|
634
|
+
}
|
|
635
|
+
return result;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
export { extractCard, extractFiles, extractPostableAttachments, AdapterRateLimitError, AuthenticationError, ResourceNotFoundError, PermissionError, ValidationError, NetworkError, toBuffer, bufferToDataUri, createEmojiConverter, mapButtonStyle, cardToFallbackText, escapeTableCell, renderGfmTable, encryptToken, decryptToken, isEncryptedTokenData, decodeKey, downloadAttachment, replaceBareMentions, maskCodeSpans };
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ProjectTrustStore,
|
|
3
|
-
addMcpServerConfig,
|
|
4
|
-
loadMcpConfig,
|
|
5
|
-
openBrowser,
|
|
6
|
-
removeMcpServerConfig
|
|
7
|
-
} from "./cli-c5km5znr.js";
|
|
8
1
|
import {
|
|
9
2
|
McpOAuthCredentialStore,
|
|
10
3
|
McpServerConnection,
|
|
@@ -12,11 +5,18 @@ import {
|
|
|
12
5
|
McpSignInCancelledError,
|
|
13
6
|
createDefaultTransport,
|
|
14
7
|
signInMcpServer
|
|
15
|
-
} from "./cli-
|
|
8
|
+
} from "./cli-w7m81tb7.js";
|
|
9
|
+
import {
|
|
10
|
+
ProjectTrustStore,
|
|
11
|
+
addMcpServerConfig,
|
|
12
|
+
loadMcpConfig,
|
|
13
|
+
openBrowser,
|
|
14
|
+
removeMcpServerConfig
|
|
15
|
+
} from "./cli-c8r3kzzb.js";
|
|
16
16
|
import {
|
|
17
17
|
getMcpToolExposure,
|
|
18
18
|
validateMcpServerConfig
|
|
19
|
-
} from "./cli-
|
|
19
|
+
} from "./cli-r106725k.js";
|
|
20
20
|
import"./cli-ev91t6xp.js";
|
|
21
21
|
import {
|
|
22
22
|
source_default
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
summarizeSession
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-tr4sxp68.js";
|
|
4
4
|
import {
|
|
5
5
|
checkToolLoop,
|
|
6
6
|
clearToolHistory
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
import {
|
|
25
25
|
init_secret_scrubber,
|
|
26
26
|
scrubSecrets
|
|
27
|
-
} from "./cli-
|
|
27
|
+
} from "./cli-p1x85d2t.js";
|
|
28
28
|
|
|
29
29
|
// src/prompts/goal-reminder.ts
|
|
30
30
|
init_session_templates();
|