@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
|
@@ -147258,7 +147258,7 @@
|
|
|
147258
147258
|
"cost": {
|
|
147259
147259
|
"input": 2,
|
|
147260
147260
|
"output": 10,
|
|
147261
|
-
"cache_read": 0.
|
|
147261
|
+
"cache_read": 0.1,
|
|
147262
147262
|
"cache_write": 2.5
|
|
147263
147263
|
},
|
|
147264
147264
|
"limit": {
|
|
@@ -314158,23 +314158,59 @@
|
|
|
314158
314158
|
"name": "NaN",
|
|
314159
314159
|
"doc": "https://nan.builders/docs/models",
|
|
314160
314160
|
"models": {
|
|
314161
|
-
"
|
|
314162
|
-
"id": "
|
|
314163
|
-
"name": "
|
|
314164
|
-
"description": "
|
|
314161
|
+
"qwen-image-2.1": {
|
|
314162
|
+
"id": "qwen-image-2.1",
|
|
314163
|
+
"name": "Qwen-Image-2.1",
|
|
314164
|
+
"description": "Unified text-to-image generation and image editing model with native RGBA transparency and reference-image editing",
|
|
314165
314165
|
"family": "qwen",
|
|
314166
|
+
"attachment": false,
|
|
314167
|
+
"reasoning": false,
|
|
314168
|
+
"tool_call": false,
|
|
314169
|
+
"temperature": true,
|
|
314170
|
+
"release_date": "2026-09-14",
|
|
314171
|
+
"last_updated": "2026-09-21",
|
|
314172
|
+
"modalities": {
|
|
314173
|
+
"input": [
|
|
314174
|
+
"text"
|
|
314175
|
+
],
|
|
314176
|
+
"output": [
|
|
314177
|
+
"image"
|
|
314178
|
+
]
|
|
314179
|
+
},
|
|
314180
|
+
"open_weights": true,
|
|
314181
|
+
"limit": {
|
|
314182
|
+
"context": 8192,
|
|
314183
|
+
"output": 0
|
|
314184
|
+
},
|
|
314185
|
+
"cost": {
|
|
314186
|
+
"input": 0,
|
|
314187
|
+
"output": 0
|
|
314188
|
+
},
|
|
314189
|
+
"canonical_model_id": "alibaba/qwen-image-2.1"
|
|
314190
|
+
},
|
|
314191
|
+
"glm5.3-flash": {
|
|
314192
|
+
"id": "glm5.3-flash",
|
|
314193
|
+
"name": "GLM-5.3-Flash",
|
|
314194
|
+
"description": "Native multimodal GLM model for efficient coding and long-horizon agent tasks",
|
|
314195
|
+
"family": "glm-flash",
|
|
314166
314196
|
"attachment": true,
|
|
314167
314197
|
"reasoning": true,
|
|
314168
314198
|
"reasoning_options": [
|
|
314169
314199
|
{
|
|
314170
|
-
"type": "
|
|
314200
|
+
"type": "effort",
|
|
314201
|
+
"values": [
|
|
314202
|
+
"low",
|
|
314203
|
+
"medium",
|
|
314204
|
+
"high",
|
|
314205
|
+
"max"
|
|
314206
|
+
]
|
|
314171
314207
|
}
|
|
314172
314208
|
],
|
|
314173
314209
|
"tool_call": true,
|
|
314174
314210
|
"structured_output": true,
|
|
314175
314211
|
"temperature": true,
|
|
314176
|
-
"release_date": "2026-
|
|
314177
|
-
"last_updated": "2026-
|
|
314212
|
+
"release_date": "2026-08-26",
|
|
314213
|
+
"last_updated": "2026-08-26",
|
|
314178
314214
|
"modalities": {
|
|
314179
314215
|
"input": [
|
|
314180
314216
|
"text",
|
|
@@ -314186,31 +314222,43 @@
|
|
|
314186
314222
|
},
|
|
314187
314223
|
"open_weights": true,
|
|
314188
314224
|
"limit": {
|
|
314189
|
-
"context":
|
|
314190
|
-
"output":
|
|
314225
|
+
"context": 1000000,
|
|
314226
|
+
"output": 131072
|
|
314191
314227
|
},
|
|
314192
314228
|
"cost": {
|
|
314193
314229
|
"input": 0,
|
|
314194
314230
|
"output": 0
|
|
314195
|
-
}
|
|
314231
|
+
},
|
|
314232
|
+
"canonical_model_id": "zhipuai/glm-5.3-flash"
|
|
314196
314233
|
},
|
|
314197
|
-
"
|
|
314198
|
-
"id": "
|
|
314199
|
-
"name": "
|
|
314200
|
-
"description": "
|
|
314201
|
-
"family": "
|
|
314202
|
-
"attachment":
|
|
314234
|
+
"gemma4": {
|
|
314235
|
+
"id": "gemma4",
|
|
314236
|
+
"name": "Gemma 4 26B A4B IT",
|
|
314237
|
+
"description": "Open Gemma instruction model for efficient chat and self-hosted deployments",
|
|
314238
|
+
"family": "gemma",
|
|
314239
|
+
"attachment": true,
|
|
314203
314240
|
"reasoning": true,
|
|
314204
|
-
"reasoning_options": [
|
|
314241
|
+
"reasoning_options": [
|
|
314242
|
+
{
|
|
314243
|
+
"type": "effort",
|
|
314244
|
+
"values": [
|
|
314245
|
+
"none",
|
|
314246
|
+
"low",
|
|
314247
|
+
"medium",
|
|
314248
|
+
"high",
|
|
314249
|
+
"max"
|
|
314250
|
+
]
|
|
314251
|
+
}
|
|
314252
|
+
],
|
|
314205
314253
|
"tool_call": true,
|
|
314206
314254
|
"structured_output": true,
|
|
314207
314255
|
"temperature": true,
|
|
314208
|
-
"
|
|
314209
|
-
"
|
|
314210
|
-
"last_updated": "2026-04-24",
|
|
314256
|
+
"release_date": "2026-04-02",
|
|
314257
|
+
"last_updated": "2026-04-02",
|
|
314211
314258
|
"modalities": {
|
|
314212
314259
|
"input": [
|
|
314213
|
-
"text"
|
|
314260
|
+
"text",
|
|
314261
|
+
"image"
|
|
314214
314262
|
],
|
|
314215
314263
|
"output": [
|
|
314216
314264
|
"text"
|
|
@@ -314218,30 +314266,43 @@
|
|
|
314218
314266
|
},
|
|
314219
314267
|
"open_weights": true,
|
|
314220
314268
|
"limit": {
|
|
314221
|
-
"context":
|
|
314222
|
-
"output":
|
|
314269
|
+
"context": 262144,
|
|
314270
|
+
"output": 32768
|
|
314223
314271
|
},
|
|
314224
314272
|
"cost": {
|
|
314225
314273
|
"input": 0,
|
|
314226
314274
|
"output": 0
|
|
314227
|
-
}
|
|
314275
|
+
},
|
|
314276
|
+
"canonical_model_id": "google/gemma-4-26b-a4b-it"
|
|
314228
314277
|
},
|
|
314229
|
-
"
|
|
314230
|
-
"id": "
|
|
314231
|
-
"name": "
|
|
314232
|
-
"description": "Open
|
|
314233
|
-
"family": "
|
|
314234
|
-
"attachment":
|
|
314278
|
+
"qwen3.6": {
|
|
314279
|
+
"id": "qwen3.6",
|
|
314280
|
+
"name": "Qwen3.6 35B-A3B",
|
|
314281
|
+
"description": "Open multimodal Qwen MoE for local agents that need vision, audio, and code",
|
|
314282
|
+
"family": "qwen",
|
|
314283
|
+
"attachment": true,
|
|
314235
314284
|
"reasoning": true,
|
|
314236
|
-
"reasoning_options": [
|
|
314285
|
+
"reasoning_options": [
|
|
314286
|
+
{
|
|
314287
|
+
"type": "effort",
|
|
314288
|
+
"values": [
|
|
314289
|
+
"none",
|
|
314290
|
+
"low",
|
|
314291
|
+
"medium",
|
|
314292
|
+
"high",
|
|
314293
|
+
"max"
|
|
314294
|
+
]
|
|
314295
|
+
}
|
|
314296
|
+
],
|
|
314237
314297
|
"tool_call": true,
|
|
314238
314298
|
"structured_output": true,
|
|
314239
314299
|
"temperature": true,
|
|
314240
|
-
"release_date": "2026-
|
|
314241
|
-
"last_updated": "2026-
|
|
314300
|
+
"release_date": "2026-04-17",
|
|
314301
|
+
"last_updated": "2026-04-17",
|
|
314242
314302
|
"modalities": {
|
|
314243
314303
|
"input": [
|
|
314244
|
-
"text"
|
|
314304
|
+
"text",
|
|
314305
|
+
"image"
|
|
314245
314306
|
],
|
|
314246
314307
|
"output": [
|
|
314247
314308
|
"text"
|
|
@@ -314249,35 +314310,32 @@
|
|
|
314249
314310
|
},
|
|
314250
314311
|
"open_weights": true,
|
|
314251
314312
|
"limit": {
|
|
314252
|
-
"context":
|
|
314253
|
-
"output":
|
|
314313
|
+
"context": 262144,
|
|
314314
|
+
"output": 65536
|
|
314254
314315
|
},
|
|
314255
314316
|
"cost": {
|
|
314256
314317
|
"input": 0,
|
|
314257
314318
|
"output": 0
|
|
314258
|
-
}
|
|
314319
|
+
},
|
|
314320
|
+
"canonical_model_id": "alibaba/qwen3.6-35b-a3b"
|
|
314259
314321
|
},
|
|
314260
|
-
"
|
|
314261
|
-
"id": "
|
|
314262
|
-
"name": "
|
|
314263
|
-
"description": "
|
|
314264
|
-
"family": "
|
|
314322
|
+
"mimo-v2.6-flash": {
|
|
314323
|
+
"id": "mimo-v2.6-flash",
|
|
314324
|
+
"name": "MiMo-V2.6-Flash",
|
|
314325
|
+
"description": "MiMo Flash model for multimodal coding agents and long-context automation",
|
|
314326
|
+
"family": "mimo",
|
|
314265
314327
|
"attachment": true,
|
|
314266
314328
|
"reasoning": true,
|
|
314267
|
-
"reasoning_options": [
|
|
314268
|
-
{
|
|
314269
|
-
"type": "toggle"
|
|
314270
|
-
}
|
|
314271
|
-
],
|
|
314329
|
+
"reasoning_options": [],
|
|
314272
314330
|
"tool_call": true,
|
|
314273
|
-
"structured_output": true,
|
|
314274
314331
|
"temperature": true,
|
|
314275
|
-
"release_date": "2026-
|
|
314276
|
-
"last_updated": "2026-
|
|
314332
|
+
"release_date": "2026-09-22",
|
|
314333
|
+
"last_updated": "2026-09-22",
|
|
314277
314334
|
"modalities": {
|
|
314278
314335
|
"input": [
|
|
314279
314336
|
"text",
|
|
314280
|
-
"image"
|
|
314337
|
+
"image",
|
|
314338
|
+
"audio"
|
|
314281
314339
|
],
|
|
314282
314340
|
"output": [
|
|
314283
314341
|
"text"
|
|
@@ -314285,13 +314343,14 @@
|
|
|
314285
314343
|
},
|
|
314286
314344
|
"open_weights": true,
|
|
314287
314345
|
"limit": {
|
|
314288
|
-
"context":
|
|
314289
|
-
"output":
|
|
314346
|
+
"context": 1048576,
|
|
314347
|
+
"output": 131072
|
|
314290
314348
|
},
|
|
314291
314349
|
"cost": {
|
|
314292
314350
|
"input": 0,
|
|
314293
314351
|
"output": 0
|
|
314294
|
-
}
|
|
314352
|
+
},
|
|
314353
|
+
"canonical_model_id": "xiaomi/mimo-v2.6-flash"
|
|
314295
314354
|
},
|
|
314296
314355
|
"qwen3.8-flash": {
|
|
314297
314356
|
"id": "qwen3.8-flash",
|
|
@@ -314322,21 +314381,65 @@
|
|
|
314322
314381
|
"cost": {
|
|
314323
314382
|
"input": 0,
|
|
314324
314383
|
"output": 0
|
|
314325
|
-
}
|
|
314384
|
+
},
|
|
314385
|
+
"canonical_model_id": "alibaba/qwen3.8-flash"
|
|
314326
314386
|
},
|
|
314327
|
-
"glm5.3
|
|
314328
|
-
"id": "glm5.3
|
|
314329
|
-
"name": "GLM-5.3
|
|
314330
|
-
"description": "
|
|
314387
|
+
"glm5.3": {
|
|
314388
|
+
"id": "glm5.3",
|
|
314389
|
+
"name": "GLM-5.3",
|
|
314390
|
+
"description": "Flagship GLM model for long-horizon coding, agents, and complex project delivery",
|
|
314331
314391
|
"family": "glm",
|
|
314392
|
+
"attachment": false,
|
|
314393
|
+
"reasoning": true,
|
|
314394
|
+
"reasoning_options": [
|
|
314395
|
+
{
|
|
314396
|
+
"type": "effort",
|
|
314397
|
+
"values": [
|
|
314398
|
+
"low",
|
|
314399
|
+
"medium",
|
|
314400
|
+
"high",
|
|
314401
|
+
"max"
|
|
314402
|
+
]
|
|
314403
|
+
}
|
|
314404
|
+
],
|
|
314405
|
+
"tool_call": true,
|
|
314406
|
+
"structured_output": true,
|
|
314407
|
+
"temperature": true,
|
|
314408
|
+
"release_date": "2026-08-14",
|
|
314409
|
+
"last_updated": "2026-08-14",
|
|
314410
|
+
"modalities": {
|
|
314411
|
+
"input": [
|
|
314412
|
+
"text"
|
|
314413
|
+
],
|
|
314414
|
+
"output": [
|
|
314415
|
+
"text"
|
|
314416
|
+
]
|
|
314417
|
+
},
|
|
314418
|
+
"open_weights": true,
|
|
314419
|
+
"limit": {
|
|
314420
|
+
"context": 1000000,
|
|
314421
|
+
"output": 131072
|
|
314422
|
+
},
|
|
314423
|
+
"cost": {
|
|
314424
|
+
"input": 0,
|
|
314425
|
+
"output": 0
|
|
314426
|
+
},
|
|
314427
|
+
"canonical_model_id": "zhipuai/glm-5.3"
|
|
314428
|
+
},
|
|
314429
|
+
"deepseek-v4-flash": {
|
|
314430
|
+
"id": "deepseek-v4-flash",
|
|
314431
|
+
"name": "DeepSeek V4.1 Flash",
|
|
314432
|
+
"description": "DeepSeek V4.1 Flash model for reasoning and agentic coding",
|
|
314433
|
+
"family": "deepseek-flash",
|
|
314332
314434
|
"attachment": true,
|
|
314333
314435
|
"reasoning": true,
|
|
314334
314436
|
"reasoning_options": [],
|
|
314335
314437
|
"tool_call": true,
|
|
314336
314438
|
"structured_output": true,
|
|
314337
314439
|
"temperature": true,
|
|
314338
|
-
"
|
|
314339
|
-
"
|
|
314440
|
+
"knowledge": "2025-05",
|
|
314441
|
+
"release_date": "2026-09-10",
|
|
314442
|
+
"last_updated": "2026-09-10",
|
|
314340
314443
|
"modalities": {
|
|
314341
314444
|
"input": [
|
|
314342
314445
|
"text",
|
|
@@ -314346,9 +314449,41 @@
|
|
|
314346
314449
|
"text"
|
|
314347
314450
|
]
|
|
314348
314451
|
},
|
|
314349
|
-
"open_weights":
|
|
314452
|
+
"open_weights": true,
|
|
314350
314453
|
"limit": {
|
|
314351
314454
|
"context": 1000000,
|
|
314455
|
+
"output": 384000
|
|
314456
|
+
},
|
|
314457
|
+
"cost": {
|
|
314458
|
+
"input": 0,
|
|
314459
|
+
"output": 0
|
|
314460
|
+
},
|
|
314461
|
+
"canonical_model_id": "deepseek/deepseek-v4.1-flash"
|
|
314462
|
+
},
|
|
314463
|
+
"glm5.2": {
|
|
314464
|
+
"id": "glm5.2",
|
|
314465
|
+
"name": "GLM-5.2",
|
|
314466
|
+
"description": "Open flagship GLM for long-horizon coding agents, served at 500K context on the NaN premium tier",
|
|
314467
|
+
"family": "glm",
|
|
314468
|
+
"attachment": false,
|
|
314469
|
+
"reasoning": true,
|
|
314470
|
+
"reasoning_options": [],
|
|
314471
|
+
"tool_call": true,
|
|
314472
|
+
"structured_output": true,
|
|
314473
|
+
"temperature": true,
|
|
314474
|
+
"release_date": "2026-06-13",
|
|
314475
|
+
"last_updated": "2026-06-13",
|
|
314476
|
+
"modalities": {
|
|
314477
|
+
"input": [
|
|
314478
|
+
"text"
|
|
314479
|
+
],
|
|
314480
|
+
"output": [
|
|
314481
|
+
"text"
|
|
314482
|
+
]
|
|
314483
|
+
},
|
|
314484
|
+
"open_weights": true,
|
|
314485
|
+
"limit": {
|
|
314486
|
+
"context": 500000,
|
|
314352
314487
|
"output": 131072
|
|
314353
314488
|
},
|
|
314354
314489
|
"cost": {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { withRegistryCatalogSections } from "@desplega/model-catalog";
|
|
3
4
|
|
|
4
5
|
export interface ModelsDevCostBlock {
|
|
5
6
|
input?: number;
|
|
@@ -53,6 +54,11 @@ const parsedCaches = new Map<string, WeakRef<ModelsDevCache>>();
|
|
|
53
54
|
* fetches the live catalog from `GET /api/models-catalog`
|
|
54
55
|
* (`src/be/models-catalog.ts`) and only falls back to its bundled copy of
|
|
55
56
|
* this snapshot when that request hasn't resolved.
|
|
57
|
+
*
|
|
58
|
+
* The result also carries the sections of the OpenAI-compatible registry
|
|
59
|
+
* providers models.dev does not list (`helmcode`), synthesized from the
|
|
60
|
+
* registry (`withRegistryCatalogSections`), so every snapshot consumer
|
|
61
|
+
* (catalog, pricing seed, tier resolution) sees them like any other section.
|
|
56
62
|
*/
|
|
57
63
|
export function loadModelsDevCache(): ModelsDevCache | null {
|
|
58
64
|
const explicitPath = process.env.MODELSDEV_CACHE_PATH;
|
|
@@ -67,7 +73,9 @@ export function loadModelsDevCache(): ModelsDevCache | null {
|
|
|
67
73
|
const memoized = parsedCaches.get(candidate)?.deref();
|
|
68
74
|
if (memoized) return memoized;
|
|
69
75
|
try {
|
|
70
|
-
const parsed =
|
|
76
|
+
const parsed = withRegistryCatalogSections(
|
|
77
|
+
JSON.parse(readFileSync(candidate, "utf-8")) as ModelsDevCache,
|
|
78
|
+
);
|
|
71
79
|
parsedCaches.set(candidate, new WeakRef(parsed));
|
|
72
80
|
return parsed;
|
|
73
81
|
} catch {
|
|
@@ -11,6 +11,7 @@ import { registerVolatileSecret } from "@/utils/secret-scrubber";
|
|
|
11
11
|
import { getResolvedConfig } from "./db";
|
|
12
12
|
import { resolveOAuthBindingToken } from "./oauth-credential-bindings";
|
|
13
13
|
import { listRelationalCredentialBindings } from "./script-connections";
|
|
14
|
+
import { isApiOnlyConfigKey, isInternalConfigKey } from "./swarm-config-guard";
|
|
14
15
|
|
|
15
16
|
// Relational-only credential binding store. The legacy SCRIPT_CREDENTIAL_BINDINGS
|
|
16
17
|
// swarm-config JSON blob is retired (migrated to relational rows at boot), so
|
|
@@ -22,6 +23,32 @@ class RelationalCredentialBindingStore implements CredentialBindingStore {
|
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
|
|
26
|
+
export type ScriptUserConfig = Record<string, { value: string; isSecret: boolean }>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The values behind `ctx.swarm.config.get(KEY)`: the invoking agent's resolved
|
|
30
|
+
* config (agent over global, plus repo when given), minus the keys the
|
|
31
|
+
* `/api/config/resolved` route never hands out. A script's own SDK bearer
|
|
32
|
+
* already reads every one of these through `ctx.swarm.config_get`, so this
|
|
33
|
+
* widens nothing; it only makes the documented accessor return them. Secret
|
|
34
|
+
* values are registered with the scrubber so they never leave in run output.
|
|
35
|
+
*/
|
|
36
|
+
function toScriptUserConfig(configs: Awaited<ReturnType<typeof getResolvedConfig>>) {
|
|
37
|
+
const exposed = configs.filter(
|
|
38
|
+
(config) => !isApiOnlyConfigKey(config.key) && !isInternalConfigKey(config.key),
|
|
39
|
+
);
|
|
40
|
+
for (const config of exposed) {
|
|
41
|
+
if (config.isSecret && config.value) {
|
|
42
|
+
registerVolatileSecret(config.value, `config:${config.key}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// fromEntries defines own properties, so a `__proto__` key survives
|
|
46
|
+
// (assigning it into `{}` would hit the prototype setter instead).
|
|
47
|
+
return Object.fromEntries(
|
|
48
|
+
exposed.map((config) => [config.key, { value: config.value, isSecret: config.isSecret }]),
|
|
49
|
+
) as ScriptUserConfig;
|
|
50
|
+
}
|
|
51
|
+
|
|
25
52
|
/**
|
|
26
53
|
* Resolve credential bindings for a script run, partitioning OAuth bindings
|
|
27
54
|
* whose refresh failed into `failedBindings` (surfaced to the sandbox so the
|
|
@@ -32,8 +59,14 @@ class RelationalCredentialBindingStore implements CredentialBindingStore {
|
|
|
32
59
|
export async function buildScriptCredentialBindingsWithFailures(input: {
|
|
33
60
|
agentId?: string;
|
|
34
61
|
repoId?: string;
|
|
35
|
-
}): Promise<{
|
|
62
|
+
}): Promise<{
|
|
63
|
+
egressSecrets: EgressSecretEntry[];
|
|
64
|
+
failedBindings: FailedCredentialBinding[];
|
|
65
|
+
userConfig: ScriptUserConfig;
|
|
66
|
+
}> {
|
|
36
67
|
const resolvedConfigs = await getResolvedConfig(input.agentId, input.repoId);
|
|
68
|
+
// Before the binding loop below, so a binding's own scrubber label wins.
|
|
69
|
+
const userConfig = toScriptUserConfig(resolvedConfigs);
|
|
37
70
|
const configMap = new Map(resolvedConfigs.map((config) => [config.key, config.value]));
|
|
38
71
|
const broker = new CredentialBroker(
|
|
39
72
|
new RelationalCredentialBindingStore(),
|
|
@@ -49,7 +82,11 @@ export async function buildScriptCredentialBindingsWithFailures(input: {
|
|
|
49
82
|
for (const binding of resolved) {
|
|
50
83
|
registerVolatileSecret(binding.value, binding.configKey);
|
|
51
84
|
}
|
|
52
|
-
return {
|
|
85
|
+
return {
|
|
86
|
+
egressSecrets: resolved,
|
|
87
|
+
failedBindings: failed,
|
|
88
|
+
userConfig,
|
|
89
|
+
};
|
|
53
90
|
}
|
|
54
91
|
|
|
55
92
|
export async function buildScriptCredentialBindings(input: {
|
|
@@ -52,6 +52,7 @@ export async function runSavedScriptAsAgent(
|
|
|
52
52
|
agentId: args.agentId,
|
|
53
53
|
egressSecrets: credentials.egressSecrets,
|
|
54
54
|
failedBindings: credentials.failedBindings,
|
|
55
|
+
userConfig: credentials.userConfig,
|
|
55
56
|
apiConnections: getScriptApiConnectionDescriptors({ agentId: args.agentId }),
|
|
56
57
|
mcpConnections: getScriptMcpConnectionDescriptors({ agentId: args.agentId }),
|
|
57
58
|
...(args.timeoutMs ? { timeoutMs: args.timeoutMs } : {}),
|
|
@@ -235,10 +235,10 @@ export interface SwarmSdk {
|
|
|
235
235
|
// --- slack ---
|
|
236
236
|
slack_read(args?: { inboxMessageId?: string; taskId?: string; channelId?: string; threadTs?: string; limit?: number; includeFiles?: boolean }): Promise<unknown>;
|
|
237
237
|
slack_listChannels(args?: { types?: Array<"public" | "private" | "dm" | "mpim">; limit?: number }): Promise<unknown>;
|
|
238
|
+
// --- chat sdk ---
|
|
239
|
+
chat_readThread(args: { threadId: string; limit?: number }): Promise<unknown>;
|
|
238
240
|
// --- messaging ---
|
|
239
241
|
message_read(args?: { channel?: string; limit?: number; since?: string; unreadOnly?: boolean; mentionsOnly?: boolean; markAsRead?: boolean }): Promise<unknown>;
|
|
240
|
-
// --- services ---
|
|
241
|
-
service_list(args?: { agentId?: string; name?: string; status?: "starting" | "healthy" | "unhealthy" | "stopped"; includeOwn?: boolean }): Promise<unknown>;
|
|
242
242
|
// --- context / profiles ---
|
|
243
243
|
context_history(args?: { agentId?: string; field?: "soulMd" | "identityMd" | "toolsMd" | "claudeMd" | "setupScript"; limit?: number }): Promise<unknown>;
|
|
244
244
|
context_diff(args: { versionId: string; compareToVersionId?: string }): Promise<unknown>;
|
|
@@ -281,7 +281,7 @@ export interface SwarmSdk {
|
|
|
281
281
|
task_action(args: Record<string, unknown>): Promise<unknown>;
|
|
282
282
|
|
|
283
283
|
// --- write: config ---
|
|
284
|
-
config_set(args: { key: string; value: unknown; scope?: "global" | "agent" | "repo"; scopeId?: string; isSecret?: boolean }): Promise<unknown>;
|
|
284
|
+
config_set(args: { key: string; value: unknown; scope?: "global" | "agent" | "repo"; scopeId?: string; isSecret?: boolean; exportToEnv?: boolean }): Promise<unknown>;
|
|
285
285
|
config_delete(args: { id: string }): Promise<unknown>;
|
|
286
286
|
|
|
287
287
|
// --- write: model catalog ---
|
|
@@ -311,17 +311,19 @@ export interface SwarmSdk {
|
|
|
311
311
|
slack_delete(args: { channelId: string; messageTs: string }): Promise<unknown>;
|
|
312
312
|
slack_update(args: { channelId: string; messageTs: string; message: string }): Promise<unknown>;
|
|
313
313
|
|
|
314
|
+
// --- write: chat sdk ---
|
|
315
|
+
chat_reply(args: { text: string }): Promise<unknown>;
|
|
316
|
+
chat_post(args: { adapter: "telegram" | "slack" | "discord" | "teams"; threadId?: string; channelId?: string; text: string }): Promise<unknown>;
|
|
317
|
+
chat_openDm(args: { adapter: "telegram" | "slack" | "discord" | "teams"; userId: string }): Promise<unknown>;
|
|
318
|
+
chat_registerChannel(args: { adapter: "telegram" | "slack" | "discord" | "teams"; channelId: string; agentId?: string; workflowId?: string; name?: string }): Promise<unknown>;
|
|
319
|
+
chat_unregisterChannel(args: { adapter: "telegram" | "slack" | "discord" | "teams"; channelId: string }): Promise<unknown>;
|
|
320
|
+
|
|
314
321
|
// --- write: messaging (internal) ---
|
|
315
322
|
message_post(args: { channel?: string; content: string; to?: string }): Promise<unknown>;
|
|
316
323
|
|
|
317
324
|
// --- write: profiles ---
|
|
318
325
|
profile_update(args: Record<string, unknown>): Promise<unknown>;
|
|
319
326
|
|
|
320
|
-
// --- write: services ---
|
|
321
|
-
service_register(args: Record<string, unknown>): Promise<unknown>;
|
|
322
|
-
service_unregister(args: { name: string }): Promise<unknown>;
|
|
323
|
-
service_updateStatus(args: { name: string; status: "starting" | "healthy" | "unhealthy" | "stopped" }): Promise<unknown>;
|
|
324
|
-
|
|
325
327
|
// --- write: schedules ---
|
|
326
328
|
schedule_create(args: Record<string, unknown>): Promise<unknown>;
|
|
327
329
|
schedule_update(args: Record<string, unknown>): Promise<unknown>;
|
package/src/be/seed/runner.ts
CHANGED
|
@@ -22,6 +22,7 @@ export async function runSeeder(seeder: Seeder, opts?: SeederRunOptions): Promis
|
|
|
22
22
|
updated: 0,
|
|
23
23
|
skippedUnchanged: 0,
|
|
24
24
|
skippedUserModified: 0,
|
|
25
|
+
retired: 0,
|
|
25
26
|
failed: [],
|
|
26
27
|
};
|
|
27
28
|
|
|
@@ -77,11 +78,22 @@ export async function runSeeder(seeder: Seeder, opts?: SeederRunOptions): Promis
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
if (seeder.retire) {
|
|
82
|
+
try {
|
|
83
|
+
result.retired = (await seeder.retire()).length;
|
|
84
|
+
} catch (err) {
|
|
85
|
+
result.failed.push({
|
|
86
|
+
key: "(retire)",
|
|
87
|
+
error: err instanceof Error ? err.message : String(err),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
80
92
|
if (!opts?.quiet) {
|
|
81
93
|
console.log(
|
|
82
94
|
`[seed:${result.kind}] created=${result.created} updated=${result.updated} ` +
|
|
83
95
|
`unchanged=${result.skippedUnchanged} preserved=${result.skippedUserModified} ` +
|
|
84
|
-
`failed=${result.failed.length}`,
|
|
96
|
+
`retired=${result.retired} failed=${result.failed.length}`,
|
|
85
97
|
);
|
|
86
98
|
for (const f of result.failed) {
|
|
87
99
|
console.error(`[seed:${result.kind}] FAILED ${f.key}: ${f.error}`);
|
package/src/be/seed/state-db.ts
CHANGED
|
@@ -36,3 +36,8 @@ export async function recordSeedState(
|
|
|
36
36
|
[kind, key, seededHash, new Date().toISOString()],
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
|
+
|
|
40
|
+
/** Forget `(kind, key)`, e.g. after the seeder retires the entity it seeded. */
|
|
41
|
+
export async function deleteSeedState(kind: string, key: string): Promise<void> {
|
|
42
|
+
await getDbClient().run("DELETE FROM seed_state WHERE kind = ? AND key = ?", [kind, key]);
|
|
43
|
+
}
|
package/src/be/seed/types.ts
CHANGED
|
@@ -53,6 +53,11 @@ export interface Seeder<TItem extends SeedItem = SeedItem> {
|
|
|
53
53
|
upstreamHash(item: TItem): string | null | Promise<string | null>;
|
|
54
54
|
/** Create or update the upstream entity so it matches the source definition. */
|
|
55
55
|
apply(item: TItem, action: "create" | "update", opts?: SeederRunOptions): void | Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Optional: remove upstream entities for keys the source no longer ships.
|
|
58
|
+
* Must leave user-modified entities in place. Returns the removed keys.
|
|
59
|
+
*/
|
|
60
|
+
retire?(): Promise<string[]>;
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
export type SeederResult = {
|
|
@@ -61,5 +66,6 @@ export type SeederResult = {
|
|
|
61
66
|
updated: number;
|
|
62
67
|
skippedUnchanged: number;
|
|
63
68
|
skippedUserModified: number;
|
|
69
|
+
retired: number;
|
|
64
70
|
failed: Array<{ key: string; error: string }>;
|
|
65
71
|
};
|
package/src/be/seed-pricing.ts
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* admin route (`POST /api/pricing`) — we don't overwrite seed rows.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
import { openAICompatibleProviderIds } from "@desplega/model-catalog";
|
|
22
23
|
import type { PricingProvider, PricingTokenClass } from "../types";
|
|
23
24
|
import { getDb } from "./db";
|
|
24
25
|
import {
|
|
@@ -98,8 +99,9 @@ const ANTHROPIC_SHORTNAME_TO_MODELSDEV: Record<string, string> = {
|
|
|
98
99
|
const ANTHROPIC_SHORTNAME_PRICING_FALLBACKS: Record<string, ModelsDevCostBlock> = {
|
|
99
100
|
// https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-09-22)
|
|
100
101
|
"claude-opus-5-5": { input: 4, output: 20, cache_read: 0.2, cache_write: 5 },
|
|
101
|
-
// https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-
|
|
102
|
-
|
|
102
|
+
// https://platform.claude.com/docs/en/about-claude/pricing (verified 2026-10-15):
|
|
103
|
+
// cache hits on Sonnet 5.5 cost 0.05x input, not the usual 0.1x.
|
|
104
|
+
"claude-sonnet-5-5": { input: 2, output: 10, cache_read: 0.1, cache_write: 2.5 },
|
|
103
105
|
"claude-fable-5-1": { input: 10, output: 50, cache_read: 0.25, cache_write: 12.5 },
|
|
104
106
|
"claude-mythos-5-1": { input: 10, output: 50, cache_read: 0.25, cache_write: 12.5 },
|
|
105
107
|
};
|
|
@@ -367,6 +369,21 @@ export function buildModelsDevSeedRows(cache: ModelsDevCache): PricingSeedRow[]
|
|
|
367
369
|
}
|
|
368
370
|
}
|
|
369
371
|
|
|
372
|
+
// ---- OpenAI-compatible registry providers ($0 flat-rate subscriptions) --
|
|
373
|
+
// pi and opencode run these as `<provider>/<id>`. The models.dev `nan`
|
|
374
|
+
// section and the registry-synthesized `helmcode` section
|
|
375
|
+
// (`withRegistryCatalogSections`) carry cost {0, 0}, so the sessions price
|
|
376
|
+
// as `pricing-table` at $0 instead of `unpriced`. The provider prefix stays
|
|
377
|
+
// in the key: `nan/qwen3.6` and `helmcode/qwen3.6` are separate rows.
|
|
378
|
+
for (const provider of openAICompatibleProviderIds()) {
|
|
379
|
+
for (const [id, model] of Object.entries(cache[provider]?.models ?? {})) {
|
|
380
|
+
if (!model?.cost) continue;
|
|
381
|
+
const key = `${provider}/${id}`;
|
|
382
|
+
add(key, projectCostBlock("pi", key, model.cost));
|
|
383
|
+
add(key, projectCostBlock("opencode", key, model.cost));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
370
387
|
return collapseNormalizedIds(sourced);
|
|
371
388
|
}
|
|
372
389
|
|
|
@@ -38,7 +38,7 @@ const CONTRADICTORY_RE =
|
|
|
38
38
|
/\b(do not|don't|never)\b[\s\S]{0,240}\b(always|must|required)\b|\b(always|must|required)\b[\s\S]{0,240}\b(do not|don't|never)\b/i;
|
|
39
39
|
|
|
40
40
|
const CODE_REGISTRY_EVENTS =
|
|
41
|
-
"agentmail.email.followup agentmail.email.mapped_lead agentmail.email.mapped_worker agentmail.email.no_agent agentmail.email.unmapped common.command_suggestions.github_comment_issue common.command_suggestions.github_comment_pr common.command_suggestions.github_issue common.command_suggestions.github_pr common.command_suggestions.gitlab_issue common.command_suggestions.gitlab_mr common.delegation_instruction common.delegation_instruction.gitlab github.check_run.failed github.check_suite.failed github.comment.mentioned github.issue.assigned github.issue.labeled github.issue.mentioned github.pull_request.assigned github.pull_request.closed github.pull_request.labeled github.pull_request.mentioned github.pull_request.review_requested github.pull_request.review_submitted github.pull_request.synchronize github.workflow_run.failed gitlab.comment.mentioned gitlab.issue.assigned gitlab.merge_request.opened gitlab.pipeline.failed heartbeat.boot-triage heartbeat.checklist jira.issue.assigned jira.issue.commented jira.issue.followup kapso.message.received linear.issue.assigned linear.issue.followup linear.issue.reassigned slack.assistant.greeting slack.assistant.offline slack.assistant.suggested_prompts slack.message.attachment_failed slack.message.thread_context system.agent.communication system.agent.lead system.agent.memory system.agent.memory.remote system.agent.outputs system.agent.outputs.no_agent_fs system.agent.repository system.agent.role system.agent.secrets system.agent.slack system.agent.tools_skills system.agent.worker system.agent.worker.remote system.agent.workspace system.agent.workspace.remote system.session.lead system.session.lead.managed system.session.worker system.session.worker.managed system.session.worker.remote task.budget.refused task.requester.profile task.worker.completed task.worker.failed".split(
|
|
41
|
+
"agentmail.email.followup agentmail.email.mapped_lead agentmail.email.mapped_worker agentmail.email.no_agent agentmail.email.unmapped chat.message.thread_context common.command_suggestions.github_comment_issue common.command_suggestions.github_comment_pr common.command_suggestions.github_issue common.command_suggestions.github_pr common.command_suggestions.gitlab_issue common.command_suggestions.gitlab_mr common.delegation_instruction common.delegation_instruction.gitlab github.check_run.failed github.check_suite.failed github.comment.mentioned github.issue.assigned github.issue.labeled github.issue.mentioned github.pull_request.assigned github.pull_request.closed github.pull_request.labeled github.pull_request.mentioned github.pull_request.review_requested github.pull_request.review_submitted github.pull_request.synchronize github.workflow_run.failed gitlab.comment.mentioned gitlab.issue.assigned gitlab.merge_request.opened gitlab.pipeline.failed heartbeat.boot-triage heartbeat.checklist jira.issue.assigned jira.issue.commented jira.issue.followup kapso.message.received linear.issue.assigned linear.issue.followup linear.issue.reassigned slack.assistant.greeting slack.assistant.offline slack.assistant.suggested_prompts slack.message.attachment_failed slack.message.thread_context system.agent.communication system.agent.lead system.agent.memory system.agent.memory.remote system.agent.outputs system.agent.outputs.no_agent_fs system.agent.repository system.agent.role system.agent.secrets system.agent.slack system.agent.tools_skills system.agent.worker system.agent.worker.remote system.agent.workspace system.agent.workspace.remote system.session.lead system.session.lead.managed system.session.worker system.session.worker.managed system.session.worker.remote task.budget.refused task.requester.profile task.worker.completed task.worker.failed".split(
|
|
42
42
|
" ",
|
|
43
43
|
);
|
|
44
44
|
|