@desplega.ai/agent-swarm 1.172.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-fpecx1g1.js → acp-adapter-sj2g0m84.js} +18 -17
- package/dist/{actions-pw87a1a8.js → actions-fegk44gr.js} +65 -35
- package/dist/{amp-adapter-8jem2bc0.js → amp-adapter-ad8ft89x.js} +8 -7
- package/dist/{anthropic-messages-8ee2f22q.js → anthropic-messages-r6czkjv1.js} +7 -7
- package/dist/{app-wmf0m843.js → app-kfvgbvzy.js} +19 -13
- package/dist/{assistant-emp1e108.js → assistant-z7zdy9ja.js} +65 -38
- package/dist/{boot-reembed-1de4f4aj.js → boot-reembed-5c2z0mbe.js} +11 -9
- package/dist/{boot-reembed-4ymn9atn.js → boot-reembed-j8xa181e.js} +11 -9
- package/dist/{boot-scrub-sweep-adhk1s8c.js → boot-scrub-sweep-hnkn3rgt.js} +12 -10
- package/dist/{boot-seeds-8q637aew.js → boot-seeds-kwjq4d2z.js} +15 -13
- package/dist/{claude-adapter-t26cv8a4.js → claude-adapter-9vmvpvgd.js} +20 -19
- 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-gsfsh662.js → claude-sdk-session-9jye6cxr.js} +12698 -11995
- package/dist/{cli-k46r9hmk.js → cli-03gedhng.js} +16 -14
- package/dist/{cli-kb4ehzx5.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-8vs9trd4.js → cli-3dj8k4vy.js} +1 -1
- package/dist/{cli-zxm9p3x4.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-6jb2rf77.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-pj6x9qce.js → cli-6jyj59nb.js} +2 -2
- package/dist/{cli-388egyf6.js → cli-6razj6t4.js} +2 -2
- package/dist/{cli-qsztpfry.js → cli-74ahz61x.js} +2 -2
- package/dist/{cli-4nz8p1p5.js → cli-7x0g4sn1.js} +15474 -16082
- 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-bf7485pm.js → cli-apx87jne.js} +2 -2
- package/dist/{cli-ztrv9y21.js → cli-bzszjf2p.js} +3689 -1081
- 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-1hgat6pa.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-j6kpj9az.js → cli-ee9gtz70.js} +1553 -68
- package/dist/{cli-e0a9sk00.js → cli-eejsgvm4.js} +4 -4
- package/dist/{cli-tgpfnm6r.js → cli-ef1hg1wv.js} +518 -59
- 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-4fnb6884.js → cli-hvqbtna4.js} +7 -1259
- package/dist/{cli-pstq9888.js → cli-j0pfptdp.js} +220 -103
- package/dist/cli-jta2eyzc.js +619 -0
- package/dist/{cli-esnpehf5.js → cli-k382tshb.js} +12 -13
- package/dist/cli-k3dp5tpf.js +263 -0
- package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
- package/dist/cli-kceah1eh.js +92 -0
- package/dist/{cli-prrt9fa0.js → cli-ke896fcf.js} +10 -10
- package/dist/{cli-nv4zd0b9.js → cli-kt6zqg0e.js} +6 -6
- package/dist/{cli-g6t9texm.js → cli-m50t4309.js} +5 -18
- package/dist/cli-n2wq4j7m.js +6985 -0
- package/dist/{cli-c2pq2rjb.js → cli-n3hzg89b.js} +46 -15
- package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
- package/dist/{cli-5rv1j9ga.js → cli-ne236afy.js} +53 -7
- package/dist/cli-p0sg24zp.js +16 -0
- package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
- package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
- package/dist/{cli-g4f5pj26.js → cli-q0ke1yww.js} +111 -25
- package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
- package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
- package/dist/{cli-gj81e47t.js → cli-r2pnvj8g.js} +2 -2
- package/dist/{cli-r8smj8b8.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-nyhb1r6x.js → cli-s2sp957d.js} +52 -29
- package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
- package/dist/{cli-xczpdp9e.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-cf69s3ew.js → cli-tr4sxp68.js} +3 -3
- package/dist/{cli-8hzfb6xz.js → cli-tsde1hdr.js} +15 -15
- package/dist/{cli-cceskcvt.js → cli-txqb9s38.js} +8 -8
- package/dist/{cli-aspcaef3.js → cli-v1yb0rqb.js} +6 -6
- package/dist/{cli-j1pmc07z.js → cli-vatyhshy.js} +268 -40
- package/dist/{cli-04emfe2q.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-hwwvy36w.js → cli-wayw93nt.js} +3 -3
- package/dist/cli-wmgrkscj.js +23254 -0
- package/dist/{cli-gp1rtyvk.js → cli-z5jjpaxw.js} +29 -6
- package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
- package/dist/cli.js +32 -48
- package/dist/{codex-adapter-m4tgdysy.js → codex-adapter-y81sssk0.js} +16 -15
- package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
- package/dist/{codex-session-runner-ymwzm6ea.js → codex-session-runner-8vx4j6a9.js} +16 -15
- package/dist/{commands-n0hshcvs.js → commands-kcpvpcrr.js} +21 -10
- package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
- package/dist/{controllers-connect-y07cqcvy.js → controllers-connect-kwpvj3rf.js} +45 -38
- package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
- package/dist/{db-hkqvrdcb.js → db-k8ankj20.js} +13 -11
- package/dist/{db-4w7tmt1g.js → db-ww5d7jq3.js} +29 -9
- package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
- package/dist/{dispatcher-5sd69y14.js → dispatcher-e8gq5m68.js} +41 -34
- package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
- package/dist/{dsh-adapter-2h8m4cab.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-h3359cwn.js +52 -0
- package/dist/{google-generative-ai-7pavrbv7.js → google-generative-ai-g8db7x0f.js} +5 -3
- package/dist/{google-vertex-3f1jk41f.js → google-vertex-r2692q0r.js} +5 -3
- package/dist/{grok-adapter-8m9yqzbq.js → grok-adapter-0d4x7gkx.js} +19 -18
- package/dist/{handlers-s20xr10r.js → handlers-an1gzv21.js} +44 -37
- package/dist/{heartbeat-3k31q4g2.js → heartbeat-6dakeb61.js} +46 -39
- package/dist/{hook-gdn6a2fn.js → hook-6v6cv6d5.js} +12 -24
- package/dist/{hook-ygwerrdh.js → hook-sa5xye4y.js} +13 -12
- package/dist/{http-jdteeg81.js → http-r7f3eky0.js} +1598 -279
- package/dist/index-52j1aja4.js +3465 -0
- package/dist/{index-e0snym4t.js → index-7ep4gzdk.js} +41 -34
- 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-vm3bm9t7.js → index-rmpw9a8q.js} +41 -34
- package/dist/{index-6ksewd5y.js → index-s2wxgzr0.js} +1015 -732
- package/dist/{index-tsszt7g9.js → index-v1v6n7hg.js} +46 -39
- package/dist/index-we27kd31.js +12810 -0
- package/dist/{index-ffqzqgwb.js → index-zk96aq1k.js} +11 -9
- package/dist/{keepalive-jekc896t.js → keepalive-be9vwy5h.js} +13 -11
- package/dist/{lead-4k9s9szx.js → lead-0861cwrf.js} +64 -57
- package/dist/{maintenance-shazch4n.js → maintenance-mzzgc8bn.js} +11 -9
- package/dist/node-c9we95xf.js +1 -1
- package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
- package/dist/{oauth-refresh-sweep-5gb36kn8.js → oauth-refresh-sweep-cpdnfwdj.js} +12 -10
- package/dist/{onboard-ydrbnvww.js → onboard-fh8qs4r3.js} +11 -3
- package/dist/{opencode-adapter-5zh0he20.js → opencode-adapter-nm42wwj8.js} +19 -14
- package/dist/{otel-impl-6pf5cv86.js → otel-impl-x6c1c9g4.js} +248 -869
- package/dist/{pi-mono-adapter-ef9wwx9m.js → pi-mono-adapter-9n2ya240.js} +245 -107
- package/dist/{pricing-refresh-s52nsa5q.js → pricing-refresh-qb0rv0ap.js} +13 -11
- package/dist/{rbac-roles-aq3msh4e.js → rbac-roles-1gzdwbh1.js} +12 -10
- package/dist/{rbac-roles-q5gb5e8v.js → rbac-roles-3mraey52.js} +13 -11
- package/dist/{render-v2-pd1rg54q.js → render-v2-agpa45zz.js} +19 -13
- package/dist/{resume-gw4a2c6v.js → resume-x0ydy9s9.js} +27 -21
- package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
- package/dist/{setup-jda1ksdh.js → setup-as9ga0d6.js} +2 -2
- package/dist/{virtual-modules-b3ga2m65.js → virtual-modules-9gkxqrap.js} +7 -6
- package/dist/{work-objects-tb7ycye8.js → work-objects-y5g1y7ev.js} +49 -37
- package/dist/{worker-njjccz5d.js → worker-860c3e38.js} +64 -57
- package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
- package/openapi.json +951 -356
- package/package.json +12 -13
- package/src/apps/catalog.generated.json +1309 -53
- package/src/apps/page-validator.ts +93 -31
- package/src/azure-devops/api.ts +94 -18
- package/src/azure-devops/auth.ts +32 -0
- package/src/azure-devops/boards-sync.ts +708 -0
- package/src/azure-devops/handlers.ts +52 -8
- package/src/azure-devops/html.ts +26 -0
- package/src/azure-devops/index.ts +15 -0
- package/src/azure-devops/templates.ts +86 -0
- package/src/azure-devops/types.ts +65 -1
- 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 +74 -13
- package/src/be/migrations/213_script_connections_sql.sql +79 -0
- 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-connections.ts +47 -8
- 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 +10 -18
- package/src/be/seed-skills/index.ts +107 -3
- package/src/be/sql-connections.ts +118 -0
- package/src/be/swarm-config-guard.ts +53 -0
- package/src/cli.tsx +0 -16
- package/src/commands/onboard/non-interactive.ts +4 -2
- package/src/commands/profile-sync.ts +5 -3
- package/src/commands/provider-credentials.ts +52 -6
- package/src/commands/runner.ts +196 -56
- 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-oauth.ts +6 -13
- package/src/http/mcp.ts +15 -5
- package/src/http/page-proxy.ts +2 -4
- package/src/http/pages-public.ts +6 -5
- package/src/http/pages.ts +5 -14
- package/src/http/poll.ts +28 -68
- package/src/http/requested-by.ts +54 -0
- package/src/http/route-def.ts +7 -6
- package/src/http/script-connection-proxy.ts +51 -4
- package/src/http/script-connections.ts +5 -2
- package/src/http/scripts.ts +1 -0
- package/src/http/session-cost-recompute.ts +12 -2
- package/src/http/session-data.ts +4 -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 +183 -2
- 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/jira/adf.ts +3 -1
- package/src/kv-reserved-namespaces.ts +2 -0
- package/src/oauth/mcp-wrapper.ts +10 -6
- package/src/otel-impl.ts +2 -1
- 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 +56 -3
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +27 -2
- package/src/providers/claude-flag-settings.ts +133 -0
- package/src/providers/claude-managed-adapter.ts +1 -1
- package/src/providers/claude-sdk-session.ts +7 -0
- package/src/providers/claude-session-events.ts +6 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/opencode-adapter.ts +268 -37
- package/src/providers/opencode-billing.ts +86 -0
- package/src/providers/opencode-swarm-plugin.ts +51 -0
- package/src/providers/pi-mono-adapter.ts +398 -153
- package/src/providers/pricing-sources.md +37 -3
- package/src/providers/reasoning-effort.ts +27 -0
- package/src/providers/types.ts +11 -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/api-client.ts +15 -1
- package/src/scripts-runtime/api-types.ts +9 -1
- package/src/scripts-runtime/ctx.ts +1 -1
- package/src/scripts-runtime/loader.ts +19 -7
- package/src/scripts-runtime/mcp-client.ts +30 -19
- 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/actions.ts +29 -1
- package/src/slack/app.ts +14 -2
- package/src/slack/assistant.ts +36 -2
- package/src/slack/channel-join.ts +3 -16
- package/src/slack/commands.ts +9 -1
- package/src/slack/event-dedup.ts +1 -1
- package/src/slack/external-channel-egress.ts +113 -0
- package/src/slack/external-channel.ts +309 -0
- package/src/slack/handlers.ts +61 -0
- package/src/slack/render-v2.ts +40 -47
- package/src/slack/work-objects.ts +5 -0
- package/src/tasks/additive-buffer.ts +4 -2
- package/src/tasks/context-key.ts +94 -2
- package/src/tasks/model-pin.ts +67 -0
- package/src/tasks/worker-follow-up.ts +4 -31
- package/src/telemetry.ts +2 -1
- package/src/tests/acp-adapter.test.ts +42 -0
- package/src/tests/api-drain-worker-e2e.test.ts +1 -6
- package/src/tests/apps-catalog-feedback.test.ts +310 -0
- package/src/tests/apps-catalog-inputs.test.ts +70 -0
- package/src/tests/apps-catalog-table.test.ts +113 -0
- package/src/tests/azure-devops-boards-sync.test.ts +584 -0
- package/src/tests/azure-devops-html.test.ts +13 -0
- package/src/tests/azure-devops-webhook-malformed.test.ts +4 -0
- 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 +144 -0
- package/src/tests/claude-flag-settings.test.ts +114 -0
- package/src/tests/claude-managed-adapter.test.ts +1 -1
- package/src/tests/claude-sdk-lifecycle.test.ts +148 -1
- package/src/tests/claude-sdk-process.fixture.ts +7 -0
- 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 +51 -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/deferred-task-wake.test.ts +52 -4
- 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/azure-boards/workitem.commented.json +89 -0
- package/src/tests/fixtures/azure-boards/workitem.created.json +81 -0
- package/src/tests/fixtures/azure-boards/workitem.deleted.json +70 -0
- package/src/tests/fixtures/azure-boards/workitem.restored.json +82 -0
- package/src/tests/fixtures/azure-boards/workitem.updated.json +130 -0
- package/src/tests/fixtures/catalog-feedback-definition.json.txt +860 -0
- package/src/tests/fixtures/catalog-inputs-definition.json.txt +910 -0
- package/src/tests/fixtures/catalog-table-definition.json.txt +468 -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-identity-refresh.ts +3 -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/node-env-runtime.test.ts +98 -0
- 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 +348 -3
- package/src/tests/opencode-billing.test.ts +28 -0
- 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-identity-refresh.test.ts +3 -0
- package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
- package/src/tests/script-connections-sql.test.ts +675 -0
- package/src/tests/script-connections.test.ts +7 -1
- 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 +94 -0
- package/src/tests/skill-get-name-resolution.test.ts +137 -0
- package/src/tests/slack-channel-join.test.ts +4 -1
- package/src/tests/slack-external-channel-config.test.ts +65 -0
- package/src/tests/slack-external-channel-egress.test.ts +237 -0
- package/src/tests/slack-external-channel-guard.test.ts +280 -0
- package/src/tests/slack-external-channel-tools.test.ts +173 -0
- package/src/tests/slack-external-channel.test.ts +370 -0
- package/src/tests/slack-render-v2.test.ts +86 -10
- package/src/tests/sonnet-5-5-registry.test.ts +9 -1
- package/src/tests/spec-base-url.test.ts +16 -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/vendored-openapi.test.ts +16 -1
- 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/defer-task.ts +17 -0
- 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/slack-post.ts +6 -0
- package/src/tools/slack-read.ts +8 -0
- package/src/tools/slack-reply.ts +6 -0
- package/src/tools/slack-start-thread.ts +6 -0
- package/src/tools/slack-update.ts +6 -0
- package/src/tools/slack-upload-file.ts +6 -0
- 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/node-env.ts +24 -0
- 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 +749 -0
- package/templates/skills/apps/content.md +60 -22
- 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/qa-loom/config.json +14 -0
- package/templates/skills/qa-loom/content.md +187 -0
- package/templates/skills/qa-loom/files/build-loom.mjs +221 -0
- package/templates/skills/qa-loom/files/run-qa.sh +57 -0
- package/templates/skills/slack-interaction/content.md +4 -0
- 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-9xsmdpdt.js +0 -56377
- package/dist/cli-bd957dgb.js +0 -153
- package/dist/cli-q51yprfq.js +0 -1104
- package/dist/cli-t1ze64h3.js +0 -811
- 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/dist/{azure-openai-responses-ap1gwxgr.js → azure-openai-responses-ygfreq4t.js} +5 -5
- package/dist/{cli-5rqrj7q0.js → cli-pw7ebjdt.js} +0 -0
- package/dist/{openai-codex-responses-33qhkkdy.js → openai-codex-responses-3bk0grnr.js} +4 -4
- package/dist/{openai-completions-s88xm3ns.js → openai-completions-5d4jpakc.js} +9 -9
- package/dist/{openai-responses-7xd2f2e2.js → openai-responses-krb51f59.js} +5 -5
- package/dist/{pi-messages-xszk613n.js → pi-messages-x9gzynm1.js} +3 -3
- /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
- /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
-- Chat SDK (chat-sdk.dev) channel: StateAdapter tables + durable outbound relay.
|
|
2
|
+
--
|
|
3
|
+
-- The five chat_* state tables back `SqliteChatState` (src/integrations/chat-sdk/state.ts).
|
|
4
|
+
-- Keys and thread ids written by the SDK already carry the adapter prefix
|
|
5
|
+
-- (`telegram:...`, `slack:...`), so no adapter column is needed.
|
|
6
|
+
-- Expiry columns are epoch milliseconds; NULL means no expiry.
|
|
7
|
+
|
|
8
|
+
CREATE TABLE chat_state_kv (
|
|
9
|
+
key TEXT PRIMARY KEY,
|
|
10
|
+
value TEXT NOT NULL,
|
|
11
|
+
expires_at INTEGER
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE chat_subscriptions (
|
|
15
|
+
thread_id TEXT PRIMARY KEY,
|
|
16
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
CREATE TABLE chat_locks (
|
|
20
|
+
thread_id TEXT PRIMARY KEY,
|
|
21
|
+
token TEXT NOT NULL,
|
|
22
|
+
expires_at INTEGER NOT NULL
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TABLE chat_lists (
|
|
26
|
+
key TEXT NOT NULL,
|
|
27
|
+
seq INTEGER NOT NULL,
|
|
28
|
+
value TEXT NOT NULL,
|
|
29
|
+
expires_at INTEGER,
|
|
30
|
+
PRIMARY KEY (key, seq)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE chat_queue (
|
|
34
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
+
thread_id TEXT NOT NULL,
|
|
36
|
+
entry TEXT NOT NULL
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
CREATE INDEX idx_chat_queue_thread ON chat_queue(thread_id, id);
|
|
40
|
+
|
|
41
|
+
-- Persist the obligation to publish a terminal result for every Chat SDK-rooted
|
|
42
|
+
-- task. Mirrors 144_slack_relay_obligations.sql, plus an attempt cap: a poison
|
|
43
|
+
-- row is marked given up (with the reason) instead of retrying forever.
|
|
44
|
+
CREATE TABLE chat_relay_obligations (
|
|
45
|
+
task_id TEXT PRIMARY KEY REFERENCES agent_tasks(id) ON DELETE CASCADE,
|
|
46
|
+
delivered_at TEXT,
|
|
47
|
+
attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
48
|
+
last_attempt_at TEXT,
|
|
49
|
+
given_up_at TEXT,
|
|
50
|
+
last_error TEXT,
|
|
51
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
52
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
53
|
+
created_by TEXT,
|
|
54
|
+
updated_by TEXT
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE INDEX idx_chat_relay_obligations_pending
|
|
58
|
+
ON chat_relay_obligations(last_attempt_at, created_at)
|
|
59
|
+
WHERE delivered_at IS NULL AND given_up_at IS NULL;
|
|
60
|
+
|
|
61
|
+
-- Lead follow-ups (`source='system'`, `taskType='follow-up'`) inherit the chat
|
|
62
|
+
-- contextKey and carry the lead's final answer, so they relay too. A resume
|
|
63
|
+
-- (`source='system'`, `taskType='resume'`, from `createResumeFollowUp` after a
|
|
64
|
+
-- graceful shutdown or crash recovery) inherits the contextKey too. It relays
|
|
65
|
+
-- only when a lead owns it: a worker task (resumed or not) reports back through
|
|
66
|
+
-- a lead follow-up, and the lead never gets one for its own tasks. Other system
|
|
67
|
+
-- tasks that inherit the key stay silent. GLOB, not LIKE: LIKE is
|
|
68
|
+
-- case-insensitive in SQLite.
|
|
69
|
+
CREATE TRIGGER enqueue_chat_relay_after_terminal_update
|
|
70
|
+
AFTER UPDATE OF status ON agent_tasks
|
|
71
|
+
WHEN OLD.status NOT IN ('completed', 'failed', 'cancelled', 'superseded')
|
|
72
|
+
AND NEW.status IN ('completed', 'failed', 'cancelled')
|
|
73
|
+
AND NEW.contextKey GLOB 'task:chat-sdk:*'
|
|
74
|
+
AND (
|
|
75
|
+
NEW.source = 'chat'
|
|
76
|
+
OR (NEW.source = 'system' AND NEW.taskType = 'follow-up')
|
|
77
|
+
OR (
|
|
78
|
+
NEW.source = 'system'
|
|
79
|
+
AND NEW.taskType = 'resume'
|
|
80
|
+
AND EXISTS (SELECT 1 FROM agents WHERE agents.id = NEW.agentId AND agents.isLead = 1)
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
BEGIN
|
|
84
|
+
INSERT OR IGNORE INTO chat_relay_obligations (task_id)
|
|
85
|
+
VALUES (NEW.id);
|
|
86
|
+
END;
|
|
87
|
+
|
|
88
|
+
CREATE TRIGGER enqueue_chat_relay_after_terminal_insert
|
|
89
|
+
AFTER INSERT ON agent_tasks
|
|
90
|
+
WHEN NEW.status IN ('completed', 'failed', 'cancelled')
|
|
91
|
+
AND NEW.contextKey GLOB 'task:chat-sdk:*'
|
|
92
|
+
AND (
|
|
93
|
+
NEW.source = 'chat'
|
|
94
|
+
OR (NEW.source = 'system' AND NEW.taskType = 'follow-up')
|
|
95
|
+
OR (
|
|
96
|
+
NEW.source = 'system'
|
|
97
|
+
AND NEW.taskType = 'resume'
|
|
98
|
+
AND EXISTS (SELECT 1 FROM agents WHERE agents.id = NEW.agentId AND agents.isLead = 1)
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
BEGIN
|
|
102
|
+
INSERT OR IGNORE INTO chat_relay_obligations (task_id)
|
|
103
|
+
VALUES (NEW.id);
|
|
104
|
+
END;
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* See runbooks/model-catalog.md.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { withAgentChatRegistrySections } from "@desplega/model-catalog";
|
|
16
17
|
import { type RuntimeCatalog, setRuntimeModelCatalog } from "../utils/runtime-model-catalog";
|
|
17
18
|
import {
|
|
18
19
|
getActivePricingRow,
|
|
@@ -180,7 +181,10 @@ function pickNumber(value: unknown): number | undefined {
|
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
/** Project a models.dev payload into `model_catalog` rows for CATALOG_PROVIDER_IDS. */
|
|
183
|
-
export function buildCatalogEntries(
|
|
184
|
+
export function buildCatalogEntries(raw: ModelsDevCache, checkedAt: number): ModelCatalogEntry[] {
|
|
185
|
+
// A live models.dev payload still carries the embeddings and image models of
|
|
186
|
+
// the registry gateways (`vercel`); pi and opencode cannot run them.
|
|
187
|
+
const cache = withAgentChatRegistrySections(raw);
|
|
184
188
|
const entries: ModelCatalogEntry[] = [];
|
|
185
189
|
for (const providerId of CATALOG_PROVIDER_IDS) {
|
|
186
190
|
const provider = cache[providerId];
|
|
@@ -509,6 +509,8 @@ export type ClaimModelFields = Partial<TaskModelResolution> & {
|
|
|
509
509
|
/**
|
|
510
510
|
* Resolve and record the model for a task the given agent is claiming. Runs
|
|
511
511
|
* inside the claim transaction. Returns the fields to merge into the trigger.
|
|
512
|
+
* `task.model` must be the task's own pin (`taskModelPin`), never the model a
|
|
513
|
+
* previous session reported into the column.
|
|
512
514
|
*/
|
|
513
515
|
export async function recordClaimModelResolution(
|
|
514
516
|
task: { id: string; model?: string | null; modelTier?: string | null },
|
|
@@ -521,7 +523,16 @@ export async function recordClaimModelResolution(
|
|
|
521
523
|
harnessProvider,
|
|
522
524
|
workerOverrides: await getAgentModelTierOverrides(agent.id),
|
|
523
525
|
});
|
|
524
|
-
if (!resolved)
|
|
526
|
+
if (!resolved) {
|
|
527
|
+
// A re-claimed row keeps the claim record of its previous run; drop it so
|
|
528
|
+
// the trigger and the row do not replay that run's model.
|
|
529
|
+
await getDbClient().run(
|
|
530
|
+
`UPDATE agent_tasks SET resolvedModel = NULL, modelSource = NULL, modelAlias = NULL
|
|
531
|
+
WHERE id = ? AND (resolvedModel IS NOT NULL OR modelSource IS NOT NULL OR modelAlias IS NOT NULL)`,
|
|
532
|
+
[task.id],
|
|
533
|
+
);
|
|
534
|
+
return {};
|
|
535
|
+
}
|
|
525
536
|
if ("harnessMismatch" in resolved) return { modelUnsupported: resolved.harnessMismatch };
|
|
526
537
|
const checked = await applyCliSupport(
|
|
527
538
|
resolved,
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
type ModelsDevCatalog,
|
|
30
30
|
parseAlias,
|
|
31
31
|
} from "@desplega/model-catalog";
|
|
32
|
+
import { type TaskModelPinFields, taskModelPin } from "../tasks/model-pin";
|
|
32
33
|
import { ampModelError, ampPinCatalogError, ampPinProviderError } from "../utils/amp-models";
|
|
33
34
|
import { getAgentById, getAllAgents } from "./db";
|
|
34
35
|
import { loadModelsCatalog } from "./model-catalog-store";
|
|
@@ -99,10 +100,12 @@ export async function harnessModelErrorFor(
|
|
|
99
100
|
* stays sync and catalog-free; this runs next to it.
|
|
100
101
|
*/
|
|
101
102
|
export async function poolTaskRunsOnHarness(
|
|
102
|
-
task:
|
|
103
|
+
task: TaskModelPinFields | null | undefined,
|
|
103
104
|
harness: string | null | undefined,
|
|
104
105
|
): Promise<boolean> {
|
|
105
|
-
|
|
106
|
+
// Only the task's own pin restricts harnesses; a model a previous run
|
|
107
|
+
// reported into `model` does not.
|
|
108
|
+
const model = taskModelPin(task ?? {})?.trim();
|
|
106
109
|
if (!model) return true;
|
|
107
110
|
return (await harnessModelErrorFor(model, harness)) === null;
|
|
108
111
|
}
|
package/src/be/models-catalog.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { openAICompatibleProviderIds, registryCatalogSections } from "@desplega/model-catalog";
|
|
1
2
|
import { loadModelsDevCache, type ModelsDevCache, type ModelsDevModel } from "./modelsdev-cache";
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -15,13 +16,18 @@ import { loadModelsDevCache, type ModelsDevCache, type ModelsDevModel } from "./
|
|
|
15
16
|
* same snapshot as its own fallback while the request is in flight.
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Mirrors the provider groups used by the direct harness and ACP model
|
|
21
|
+
* pickers, plus every OpenAI-compatible registry provider
|
|
22
|
+
* (`@desplega/model-catalog`).
|
|
23
|
+
*/
|
|
19
24
|
export const CATALOG_PROVIDER_IDS = [
|
|
20
25
|
"openrouter",
|
|
21
26
|
"anthropic",
|
|
22
27
|
"openai",
|
|
23
28
|
"amazon-bedrock",
|
|
24
29
|
"opencode",
|
|
30
|
+
...openAICompatibleProviderIds(),
|
|
25
31
|
] as const;
|
|
26
32
|
|
|
27
33
|
export type CatalogProviderId = (typeof CATALOG_PROVIDER_IDS)[number];
|
|
@@ -163,6 +169,24 @@ function mergePinnedEntries(catalog: ModelsCatalog): void {
|
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
171
|
|
|
172
|
+
/**
|
|
173
|
+
* Registry-synthesized sections (`catalog: "registry"` entries such as
|
|
174
|
+
* `helmcode`) are never on models.dev, so the live catalog built from it
|
|
175
|
+
* lacks them. Fill them from the bundled snapshot, which carries them
|
|
176
|
+
* (`loadModelsDevCache`); models already present (an overlay row) win.
|
|
177
|
+
*/
|
|
178
|
+
function mergeRegistrySections(catalog: ModelsCatalog): void {
|
|
179
|
+
const snapshot = bundledSnapshotCatalog();
|
|
180
|
+
for (const providerId of Object.keys(registryCatalogSections()) as CatalogProviderId[]) {
|
|
181
|
+
const section = snapshot[providerId];
|
|
182
|
+
if (!section) continue;
|
|
183
|
+
catalog[providerId] ??= { ...section, models: {} };
|
|
184
|
+
for (const [modelId, model] of Object.entries(section.models)) {
|
|
185
|
+
catalog[providerId].models[modelId] ??= model;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
166
190
|
/**
|
|
167
191
|
* Install a freshly built live catalog (already merged with the persistent
|
|
168
192
|
* table + overlay by `src/be/model-catalog-store.ts`). Pinned snapshot entries
|
|
@@ -170,6 +194,7 @@ function mergePinnedEntries(catalog: ModelsCatalog): void {
|
|
|
170
194
|
*/
|
|
171
195
|
export function setLiveModelsCatalog(catalog: ModelsCatalog, updatedAt: number | null): void {
|
|
172
196
|
mergePinnedEntries(catalog);
|
|
197
|
+
mergeRegistrySections(catalog);
|
|
173
198
|
liveCatalog = catalog;
|
|
174
199
|
liveUpdatedAt = updatedAt;
|
|
175
200
|
}
|
|
@@ -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 {
|