@desplega.ai/agent-swarm 2.4.4 → 2.5.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 +4 -2
- package/dist/{acp-adapter-thq04adh.js → acp-adapter-11gp67nr.js} +8 -6
- package/dist/{actions-j6ywh6x5.js → actions-8p2kze8j.js} +24 -22
- package/dist/{amp-adapter-k8b5xmj8.js → amp-adapter-z4qvhacj.js} +2 -2
- package/dist/{anthropic-messages-g6pqmqk4.js → anthropic-messages-txs190dd.js} +17 -20
- package/dist/{app-rb7vc02s.js → app-0qp0a2gk.js} +3 -3
- package/dist/{assistant-ftta1zjf.js → assistant-jedd3ktm.js} +27 -25
- package/dist/{azure-openai-responses-9dbmj346.js → azure-openai-responses-9kfwhmn7.js} +18 -13
- package/dist/{boot-reembed-xns7h5h9.js → boot-reembed-4xwq5tg0.js} +1 -1
- package/dist/{boot-reembed-srp6v6af.js → boot-reembed-n4wq5dd2.js} +1 -1
- package/dist/{boot-scrub-sweep-3qqrh2mz.js → boot-scrub-sweep-69h90xcq.js} +4 -4
- package/dist/{boot-seeds-9ks8hce7.js → boot-seeds-3vn0m9sg.js} +4 -4
- package/dist/{claude-adapter-k5ksyres.js → claude-adapter-221mvad5.js} +8 -6
- package/dist/{claude-managed-adapter-h2y889ge.js → claude-managed-adapter-gt6pa35d.js} +2 -2
- package/dist/{claude-managed-setup-n5a5eqks.js → claude-managed-setup-c3hp36ph.js} +4 -4
- package/dist/{claude-sdk-session-2j3j4kwn.js → claude-sdk-session-8thjsk5e.js} +9729 -9628
- package/dist/{cli-b9fcxxev.js → cli-007cnhm1.js} +50 -4
- package/dist/{cli-j4rqdf2n.js → cli-03vpq45j.js} +2 -2
- package/dist/{cli-amyhm3gj.js → cli-0y6f0ckq.js} +1 -1
- package/dist/{cli-4dg55wsk.js → cli-0z3vjrpm.js} +1 -1
- package/dist/{cli-pccfmtb5.js → cli-179xcyky.js} +11 -11
- package/dist/{cli-3r8samv3.js → cli-1f0gp9vz.js} +3 -2
- package/dist/{cli-hj3debgw.js → cli-1pr672hz.js} +3 -3
- package/dist/{cli-0bqteszy.js → cli-2nf3b08t.js} +328 -25
- package/dist/{cli-t7cyef5g.js → cli-36j4jnk3.js} +4 -4
- package/dist/{cli-er83cjbn.js → cli-3qv8naq8.js} +527 -231
- package/dist/cli-3zwye9sn.js +1193 -0
- package/dist/{cli-60cgh1rv.js → cli-459fk97x.js} +7 -7
- package/dist/{cli-xj0re5tm.js → cli-4w24f7z3.js} +1 -1
- package/dist/{cli-v3yr2gbg.js → cli-5kzk3472.js} +2198 -968
- package/dist/{cli-h7gc0b4r.js → cli-5m84zd2k.js} +55 -18
- package/dist/{cli-w6nadkh4.js → cli-5rvg1ddk.js} +5 -5
- package/dist/{cli-dvkmp9bt.js → cli-6ctwrf1z.js} +20 -10
- package/dist/{cli-9qtjfd60.js → cli-6rg2jn2y.js} +3 -2
- package/dist/{cli-2v045xyf.js → cli-7bwtc6yx.js} +3 -3
- package/dist/{cli-3cgngyd8.js → cli-7g40g8hq.js} +35 -17
- package/dist/{cli-q6r7t299.js → cli-92mqenkc.js} +2379 -154
- package/dist/{cli-cynvc9fj.js → cli-9ce2xw98.js} +8 -8
- package/dist/{cli-gqvh8d8a.js → cli-bgdtv62r.js} +36 -22
- package/dist/{cli-wxbn3yfx.js → cli-cz5nmdxt.js} +2 -2
- package/dist/{cli-wt645v7q.js → cli-dabehxhp.js} +1 -1
- package/dist/{cli-vfha21c9.js → cli-e5bxnjps.js} +2 -2
- package/dist/{cli-p20r8w42.js → cli-fcc5qe3f.js} +763 -268
- package/dist/{cli-1ephgwnq.js → cli-fes51ya2.js} +3 -3
- package/dist/{cli-1d70crsy.js → cli-ftmq4nvk.js} +2 -2
- package/dist/{cli-qkhc5aqy.js → cli-fy1jyyym.js} +13 -13
- package/dist/{cli-s95dknxh.js → cli-g1cw7xtt.js} +1 -1
- package/dist/{cli-qje9k2nh.js → cli-g9ypd5en.js} +12 -2
- package/dist/{cli-74c1wpm0.js → cli-gpv60278.js} +1 -1
- package/dist/{cli-pemywhfq.js → cli-ha9rmwgq.js} +2 -1
- package/dist/{cli-bnz0r3kc.js → cli-j1eghqfm.js} +5 -5
- package/dist/{cli-2zqpkvtt.js → cli-jpxsrxcb.js} +1 -1
- package/dist/{cli-ejs3m1sx.js → cli-kxpfx2xr.js} +1 -1
- package/dist/{cli-37yb7307.js → cli-mbfj11fq.js} +1 -1
- package/dist/{cli-pnp2j5zg.js → cli-mmhj8vd7.js} +2 -2
- package/dist/{cli-xf234ws8.js → cli-n4c8e3s5.js} +2 -0
- package/dist/{cli-a0kcty51.js → cli-n6kmqngw.js} +2 -2
- package/dist/{cli-te6b5wvg.js → cli-nnvjb17s.js} +3 -3
- package/dist/{cli-1dmcq2eh.js → cli-nzfnt2gs.js} +1 -1
- package/dist/{cli-625tb7aq.js → cli-p859hcc8.js} +2 -2
- package/dist/{cli-smvcw9z5.js → cli-pasyvjmm.js} +1 -1
- package/dist/cli-pkaqk57w.js +128 -0
- package/dist/{cli-8nyhf7za.js → cli-qqzmjxkf.js} +129 -105
- package/dist/{cli-zrwpctp4.js → cli-r25qpaxt.js} +161 -63
- package/dist/{cli-nc35pxb7.js → cli-rh5smt8t.js} +19 -4
- package/dist/{cli-qwkcwjdn.js → cli-rycdaj0a.js} +1 -1
- package/dist/{cli-esxerzg7.js → cli-s4sntwt4.js} +2 -2
- package/dist/{cli-b8k7epj1.js → cli-segs7hx9.js} +8 -8
- package/dist/{cli-36ckw0wx.js → cli-stxdrqs2.js} +2 -2
- package/dist/{cli-vdm20wej.js → cli-sy8f9705.js} +4 -4
- package/dist/{cli-1m17dc9d.js → cli-ta8bd7th.js} +2 -2
- package/dist/{cli-2y91wnbh.js → cli-we0ra057.js} +222 -10
- package/dist/{cli-55qmbp6z.js → cli-x21dqn18.js} +5 -5
- package/dist/{cli-dqb4n629.js → cli-x6vf4sad.js} +11 -11
- package/dist/{cli-d2mb5s8a.js → cli-x77gen2p.js} +680 -440
- package/dist/{cli-vq97g1jq.js → cli-xawhpgc9.js} +95 -195
- package/dist/{cli-82d3nkc3.js → cli-xd4eqtr2.js} +2 -2
- package/dist/{cli-9fhkkpj5.js → cli-xt768r5m.js} +2 -2
- package/dist/{cli-zrk6jxv8.js → cli-y4x8ww6s.js} +2 -2
- package/dist/{cli-xc27fwzg.js → cli-y9jvxfhk.js} +3 -3
- package/dist/{cli-44159k28.js → cli-z63a269p.js} +2 -2
- package/dist/{cli-sm8rses9.js → cli-zfdp01hn.js} +8 -5
- package/dist/cli.js +31 -29
- package/dist/{cloudflare-workers-ai-system-one-ch2wxfcp.js → cloudflare-workers-ai-system-one-43v9qkjk.js} +7 -2
- package/dist/{codex-adapter-968xwfy7.js → codex-adapter-tcg1q3jk.js} +6 -4
- package/dist/{codex-login-m819c41r.js → codex-login-rn7c5gxt.js} +1 -1
- package/dist/{codex-session-runner-ht4z99fa.js → codex-session-runner-xfx4wd9x.js} +7 -5
- package/dist/{commands-pcymaeg9.js → commands-ew83nj70.js} +2 -2
- package/dist/{controller-fpjyk46r.js → controller-gnq1k1mf.js} +4 -4
- package/dist/{controllers-connect-mwzx1fh6.js → controllers-connect-tw1dan9r.js} +26 -24
- package/dist/{cursor-adapter-cp4s2e2f.js → cursor-adapter-yq5xgfcg.js} +1 -1
- package/dist/{db-xsjg9jqq.js → db-7gbc53fd.js} +14 -2
- package/dist/{db-sgd12bt9.js → db-t86xrnes.js} +3 -3
- package/dist/{devin-adapter-zgqadvnm.js → devin-adapter-4ycy4vrf.js} +1 -1
- package/dist/{dispatcher-x0jfw2c9.js → dispatcher-64bdyhps.js} +23 -21
- package/dist/{docker-fkgtr75t.js → docker-nfy2gc8t.js} +2 -2
- package/dist/{dsh-adapter-jrq7ma7h.js → dsh-adapter-tvhc4k2d.js} +1 -1
- package/dist/{e2b-16d6ch39.js → e2b-9gkdhm3c.js} +2 -2
- package/dist/{e2b-zn0b4w5w.js → e2b-cjtf8k1z.js} +2 -2
- package/dist/{easter-egg-3d-5cgynaja.js → easter-egg-3d-e4qv8dxj.js} +1 -1
- package/dist/{event-bus-9vpk8gmq.js → event-bus-3z78ep5n.js} +1 -1
- package/dist/{execute-t4e6m3rw.js → execute-0xpz8950.js} +85 -23
- package/dist/{external-channel-8njj4h3b.js → external-channel-e9nw24zv.js} +2 -2
- package/dist/{google-generative-ai-bmq8gkf3.js → google-generative-ai-mk9vcpe1.js} +15 -15
- package/dist/{google-vertex-b1rvp52s.js → google-vertex-q580kz8k.js} +20 -20
- package/dist/{grok-adapter-kkr97v2f.js → grok-adapter-v82srhrx.js} +9 -7
- package/dist/handlers-c9ajzhbn.js +41 -0
- package/dist/{heartbeat-wd03zhn0.js → heartbeat-2vqs1319.js} +26 -24
- package/dist/{hook-xzj2ts2p.js → hook-01nk13wx.js} +7 -5
- package/dist/{hook-f0vghj42.js → hook-jzpheegg.js} +9 -7
- package/dist/{http-4hwxv62p.js → http-fc1k6ec8.js} +859 -252
- package/dist/index-07ef7nkm.js +42 -0
- package/dist/{index-g6tbb6ve.js → index-31ceyf42.js} +1 -1
- package/dist/index-7yts8n9s.js +43 -0
- package/dist/{index-c4ykd0f1.js → index-dr94zbnh.js} +13348 -11611
- package/dist/index-q3t40ryv.js +46 -0
- package/dist/{index-ww2vznkp.js → index-sepja052.js} +1 -1
- package/dist/{index-97q4xn03.js → index-zdycv3ja.js} +135 -79
- package/dist/{index-g216q6jr.js → index-zsyx51ap.js} +1 -4
- package/dist/{keepalive-hrh7xnr9.js → keepalive-5nh2rhmr.js} +4 -4
- package/dist/lead-aayq64jn.js +79 -0
- package/dist/{llama-cpp-classify-vv43gswy.js → llama-cpp-classify-ee7vmd7q.js} +4 -1
- package/dist/{maintenance-e8wnwnqx.js → maintenance-hjhzdt3k.js} +1 -1
- package/dist/{mistral-conversations-1medfwv7.js → mistral-conversations-sd0xf1tn.js} +13 -13
- package/dist/{node-3v3f08f7.js → node-jzjj7r9x.js} +10 -9
- package/dist/{oauth-refresh-sweep-zm0yj4sj.js → oauth-refresh-sweep-y3n1knmd.js} +3 -3
- package/dist/{onboard-dtwcq603.js → onboard-1zq3m7db.js} +2 -2
- package/dist/{openai-codex-responses-de9pvs4d.js → openai-codex-responses-79s8xnbh.js} +29 -23
- package/dist/{openai-completions-mtqge3nf.js → openai-completions-tdbyts0x.js} +21 -20
- package/dist/{openai-decisions-ygk4kkxd.js → openai-decisions-bqhnjyfz.js} +2 -1
- package/dist/{openai-responses-dkyng71g.js → openai-responses-dm3t5vqp.js} +26 -17
- package/dist/{opencode-adapter-x4tqzhkh.js → opencode-adapter-e56086m1.js} +7 -5
- package/dist/{openrouter-images-wvv7camj.js → openrouter-images-ssttr1y4.js} +6 -3
- package/dist/{otel-impl-w3fbhpn0.js → otel-impl-h9yyza47.js} +2 -2
- package/dist/{pi-messages-nhh1pkz2.js → pi-messages-3nf8bq1a.js} +6 -4
- package/dist/{pi-mono-adapter-mcfkn9vf.js → pi-mono-adapter-tzps8f38.js} +9 -37
- package/dist/{pricing-refresh-j38dehfs.js → pricing-refresh-nevhat8h.js} +3 -3
- package/dist/{rbac-roles-ae8yttq4.js → rbac-roles-4y6ngvzq.js} +1 -1
- package/dist/{rbac-roles-ejxx9b35.js → rbac-roles-exbg8xb6.js} +2 -2
- package/dist/{registry-rxw10xzg.js → registry-ajhexe44.js} +1 -1
- package/dist/{render-v2-n16n0phe.js → render-v2-cfsh13z3.js} +3 -3
- package/dist/{resume-z0fgjc38.js → resume-5s2t0dbs.js} +10 -8
- package/dist/{runtime-xe3aqy4x.js → runtime-bt5pkpm1.js} +1 -1
- package/dist/{session-access-cv3mq6mc.js → session-access-dnbyp3cn.js} +6 -4
- package/dist/{setup-mafhj3yt.js → setup-1wj1y77j.js} +1 -1
- package/dist/{typesafe-system-one-2hgpayzy.js → typesafe-system-one-bre38hvs.js} +4 -2
- package/dist/{virtual-modules-4r3zkc20.js → virtual-modules-mnfbh5mr.js} +8 -2
- package/dist/{work-objects-8b86mgjp.js → work-objects-7mg6216g.js} +26 -24
- package/dist/worker-nwb789mg.js +79 -0
- package/dist/{x-y45mthwn.js → x-pbpezr0s.js} +2 -2
- package/openapi.json +793 -6
- package/package.json +11 -11
- package/src/apps/catalog.generated.json +206 -4
- package/src/apps/page-validator.ts +13 -1
- package/src/assets/key.ts +17 -0
- package/src/azure-devops/handlers.ts +1 -1
- package/src/be/chunking.ts +42 -9
- package/src/be/db/approvals.ts +18 -0
- package/src/be/db/session-moves.ts +164 -0
- package/src/be/db/session-tree.ts +384 -0
- package/src/be/db/tasks/draft-text.ts +15 -0
- package/src/be/db/tasks/read.ts +54 -5
- package/src/be/db/workflow-runs.ts +96 -0
- package/src/be/db.ts +85 -237
- package/src/be/memory/index-content.ts +36 -17
- package/src/be/memory/providers/openai-embedding.ts +115 -61
- package/src/be/memory/providers/sqlite-store.ts +69 -23
- package/src/be/memory/reranker.ts +31 -1
- package/src/be/memory/search-candidates.ts +47 -0
- package/src/be/memory/types.ts +14 -0
- package/src/be/onboarding.ts +3 -0
- package/src/be/scripts/typecheck.ts +2 -0
- package/src/be/seed-scripts/catalog/heartbeat-jev-gate.ts +106 -54
- package/src/be/seed-scripts/index.ts +2 -2
- package/src/be/skill-sync.ts +43 -2
- package/src/be/swarm-config-guard.ts +25 -1
- package/src/be/task-attachment-store.ts +30 -0
- package/src/bitbucket/api.ts +81 -0
- package/src/bitbucket/auth.ts +64 -0
- package/src/bitbucket/handlers.ts +434 -0
- package/src/bitbucket/index.ts +28 -0
- package/src/bitbucket/templates.ts +134 -0
- package/src/bitbucket/types.ts +65 -0
- package/src/commands/runner.ts +55 -3
- package/src/e2b/env.ts +1 -0
- package/src/extensions/catalog.generated.json +4 -4
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +9 -2
- package/src/extensions/post-bridge.ts +1 -0
- package/src/fs/provider.ts +13 -1
- package/src/github/handlers.ts +6 -6
- package/src/gitlab/handlers.ts +5 -5
- package/src/heartbeat/heartbeat.ts +31 -11
- package/src/http/assets.ts +14 -2
- package/src/http/core.ts +12 -0
- package/src/http/fs.ts +54 -34
- package/src/http/index.ts +4 -0
- package/src/http/mcp-body.ts +37 -0
- package/src/http/mcp-user.ts +3 -5
- package/src/http/mcp.ts +6 -7
- package/src/http/memory.ts +26 -15
- package/src/http/onboarding.ts +1 -0
- package/src/http/page-proxy.ts +61 -5
- package/src/http/pages-public.ts +27 -44
- package/src/http/pages.ts +4 -4
- package/src/http/script-runs.ts +2 -0
- package/src/http/sessions.ts +366 -12
- package/src/http/skills.ts +48 -1
- package/src/http/tasks.ts +1 -1
- package/src/http/users.ts +13 -1
- package/src/http/webhooks.ts +141 -0
- package/src/integrations/chat-sdk/adapters.ts +24 -4
- package/src/integrations/chat-sdk/attachments.ts +90 -12
- package/src/integrations/chat-sdk/facts.ts +138 -0
- package/src/integrations/chat-sdk/inbound.ts +156 -8
- package/src/integrations/chat-sdk/limits.ts +24 -0
- package/src/integrations/chat-sdk/outbound-files.ts +186 -0
- package/src/integrations/chat-sdk/outbound.ts +272 -5
- package/src/integrations/chat-sdk/relay.ts +4 -1
- package/src/integrations/chat-sdk/router.ts +28 -2
- package/src/integrations/chat-sdk/steering.ts +9 -0
- package/src/integrations/chat-sdk/templates.ts +14 -0
- package/src/integrations/chat-sdk/thread-buffer.ts +4 -0
- package/src/mcp-limits.ts +20 -0
- package/src/pages/browser-sdk.ts +8 -3
- package/src/pages/feedback-overlay.ts +1 -1
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/codex-adapter.ts +106 -119
- package/src/providers/codex-agents-md.ts +35 -229
- package/src/providers/cursor-adapter.ts +1 -1
- package/src/providers/pi-mono-adapter.ts +5 -53
- package/src/realtime/transport.ts +1 -2
- package/src/script-workflows/workflow-ctx.ts +1 -0
- package/src/scripts-runtime/types/stdlib.d.ts +2 -0
- package/src/scripts-runtime/types/swarm-extension.d.ts +14 -4
- package/src/scripts-runtime/types/swarm-sdk.d.ts +2 -0
- package/src/server-user.ts +2 -0
- package/src/server.ts +2 -0
- package/src/slack/assistant.ts +2 -2
- package/src/slack/files.ts +2 -0
- package/src/slack/handlers.test.ts +158 -0
- package/src/slack/handlers.ts +23 -32
- package/src/slack/inbound-files.ts +39 -6
- package/src/slack/thread-buffer.ts +2 -1
- package/src/tasks/context-key.ts +61 -1
- package/src/tasks/task-terminal-effects.ts +21 -17
- package/src/tests/apps-card-grid.test.ts +197 -0
- package/src/tests/apps-catalog-additions.test.ts +120 -0
- package/src/tests/apps-tree.test.ts +129 -0
- package/src/tests/bitbucket-auth.test.ts +156 -0
- package/src/tests/bitbucket-handlers.test.ts +425 -0
- package/src/tests/bitbucket-webhook.test.ts +220 -0
- package/src/tests/chat-sdk-attachments-reply.test.ts +52 -0
- package/src/tests/chat-sdk-config.test.ts +11 -0
- package/src/tests/chat-sdk-facts.test.ts +23 -0
- package/src/tests/chat-sdk-inbound.test.ts +597 -4
- package/src/tests/chat-sdk-outbound-files.test.ts +652 -0
- package/src/tests/chat-sdk-telegram-markdown.test.ts +92 -0
- package/src/tests/codex-adapter.test.ts +167 -242
- package/src/tests/config-api-only-keys.test.ts +9 -0
- package/src/tests/context-key.test.ts +50 -0
- package/src/tests/core-auth.test.ts +5 -0
- package/src/tests/cors-allowlist.test.ts +1 -1
- package/src/tests/db-task-read-contract.test.ts +7 -0
- package/src/tests/db-task-write-contract.test.ts +6 -0
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/extensions-example-slack-reply-gate.test.ts +262 -91
- package/src/tests/fixtures/bitbucket/pullrequest-comment-created-inline.json +174 -0
- package/src/tests/fixtures/bitbucket/pullrequest-comment-created.json +170 -0
- package/src/tests/fixtures/bitbucket/pullrequest-created-mention.json +132 -0
- package/src/tests/fixtures/bitbucket/pullrequest-created-reviewer.json +140 -0
- package/src/tests/fixtures/bitbucket/pullrequest-fulfilled.json +134 -0
- package/src/tests/fixtures/bitbucket/pullrequest-rejected.json +133 -0
- package/src/tests/generate-mcp-docs.test.ts +101 -0
- package/src/tests/gitlab-handlers.test.ts +3 -3
- package/src/tests/gitlab-vcs-db.test.ts +4 -4
- package/src/tests/heartbeat-checklist.test.ts +33 -0
- package/src/tests/heartbeat-jev-gate-credentials.test.ts +44 -0
- package/src/tests/heartbeat-jev-gate.test.ts +242 -1
- package/src/tests/integration-disable-flags.test.ts +36 -0
- package/src/tests/kv-page-proxy.test.ts +91 -5
- package/src/tests/launch-password-rejection.test.ts +2 -2
- package/src/tests/mcp-input-caps.test.ts +294 -0
- package/src/tests/mcp-tools.test.ts +1 -1
- package/src/tests/memory-chunked-search-starvation.test.ts +200 -0
- package/src/tests/memory-embedding-input-cap.test.ts +114 -0
- package/src/tests/memory.test.ts +14 -0
- package/src/tests/onboarding.test.ts +12 -0
- package/src/tests/page-guest-session.test.ts +19 -8
- package/src/tests/page-proxy-authed.test.ts +1 -1
- package/src/tests/page-proxy.test.ts +17 -10
- package/src/tests/page-session.test.ts +102 -1
- package/src/tests/pages-authed-mode.test.ts +82 -12
- package/src/tests/pages-password-mode.test.ts +5 -5
- package/src/tests/pi-codemode.test.ts +8 -2
- package/src/tests/preload-env.test.ts +57 -0
- package/src/tests/preload.ts +21 -0
- package/src/tests/prompt-template-remaining.test.ts +38 -0
- package/src/tests/realtime-transport.test.ts +13 -7
- package/src/tests/run-root-coverage.test.ts +39 -0
- package/src/tests/runner-bitbucket-vcs.test.ts +191 -0
- package/src/tests/runner-skills-refresh.test.ts +58 -0
- package/src/tests/script-runs-http.test.ts +84 -0
- package/src/tests/scripts-http.test.ts +10 -1
- package/src/tests/secret-scrubber.test.ts +15 -0
- package/src/tests/sessions-move.test.ts +576 -0
- package/src/tests/sessions-tree.test.ts +493 -0
- package/src/tests/skill-files-http.test.ts +50 -0
- package/src/tests/skills-bundle.test.ts +99 -0
- package/src/tests/swarm-config-export-to-env.test.ts +23 -3
- package/src/tests/task-audio-transcription.test.ts +299 -0
- package/src/tests/task-completion-memory-chunking.test.ts +434 -0
- package/src/tests/task-terminal-secret-scrub.test.ts +6 -1
- package/src/tests/transcription.test.ts +299 -0
- package/src/tests/vcs-bitbucket.test.ts +91 -0
- package/src/tests/vcs-provider-isolation.test.ts +123 -0
- package/src/tests/vcs-provider.test.ts +16 -1
- package/src/tests/vcs-tracking.test.ts +3 -3
- package/src/tests/workflow-foreach-bodies.test.ts +637 -0
- package/src/tests/workflow-foreach-concurrency.test.ts +342 -0
- package/src/tests/workflow-foreach-retry.test.ts +537 -0
- package/src/tests/workflow-foreach.test.ts +44 -23
- package/src/tests/workflow-step-claims.test.ts +6 -6
- package/src/tests/workflow-system-one-decision-providers.test.ts +98 -1
- package/src/tests/workflow-system-one-decision.test.ts +2 -1
- package/src/tests/workflow-tla-races.test.ts +2 -2
- package/src/tools/chat-access.ts +10 -0
- package/src/tools/chat-post.ts +31 -11
- package/src/tools/chat-reply.ts +32 -10
- package/src/tools/memory-search.ts +3 -1
- package/src/tools/script-delete.ts +1 -1
- package/src/tools/system-one-decide.ts +17 -4
- package/src/tools/workflows/create-workflow.ts +5 -3
- package/src/types.ts +9 -2
- package/src/utils/config-env-export.ts +4 -1
- package/src/utils/page-session.ts +133 -20
- package/src/utils/secret-scrubber.ts +4 -0
- package/src/utils/skills-refresh.ts +83 -43
- package/src/utils/transcription.ts +246 -0
- package/src/vcs/bitbucket.ts +58 -0
- package/src/vcs/index.ts +2 -0
- package/src/vcs/types.ts +2 -2
- package/src/workflows/approval-resolution.ts +4 -1
- package/src/workflows/checkpoint.ts +9 -1
- package/src/workflows/constants.ts +3 -0
- package/src/workflows/definition.ts +48 -17
- package/src/workflows/engine.ts +25 -15
- package/src/workflows/executors/foreach.ts +45 -99
- package/src/workflows/executors/system-one-decision.ts +28 -7
- package/src/workflows/executors/system-one-providers.ts +39 -4
- package/src/workflows/foreach-body.ts +146 -0
- package/src/workflows/foreach-driver.ts +552 -0
- package/src/workflows/foreach-join.ts +206 -7
- package/src/workflows/node-timeout.ts +21 -0
- package/src/workflows/recovery.ts +68 -3
- package/src/workflows/resume.ts +221 -43
- package/src/workflows/retry-poller.ts +39 -24
- package/src/workflows/step-input.ts +59 -0
- package/src/workflows/task-step-routing.ts +114 -56
- package/templates/extensions/slack-reply-gate/README.md +24 -22
- package/templates/extensions/slack-reply-gate/hooks.ts +146 -95
- package/templates/extensions/slack-reply-gate/manifest.json +2 -2
- package/templates/skills/apps/SKILL.md +28 -6
- package/templates/skills/apps/content.md +28 -6
- package/templates/skills/chat-sdk/content.md +6 -2
- package/templates/skills/code-quality/content.md +2 -1
- package/templates/skills/heartbeat-runbook/content.md +5 -5
- package/templates/skills/pages/content.md +6 -4
- package/templates/skills/slack-interaction/content.md +5 -0
- package/templates/skills/swarm-scripts/SKILL.md +2 -2
- package/templates/skills/swarm-scripts/content.md +2 -2
- package/templates/skills/work-on-task/SKILL.md +1 -1
- package/templates/skills/work-on-task/content.md +1 -1
- package/dist/cli-51y09c6p.js +0 -2657
- package/dist/cli-yw91rnmw.js +0 -13
- package/dist/handlers-0pvee9nw.js +0 -39
- package/dist/index-gdh8jrdm.js +0 -43
- package/dist/index-hg0x2cdv.js +0 -40
- package/dist/index-thm0y6a8.js +0 -41
- package/dist/lead-ee8vazz2.js +0 -77
- package/dist/worker-16s75hm5.js +0 -77
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desplega.ai/agent-swarm",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "agent-swarm.dev — an open-source operating system for AI work: a lead agent breaks goals into tasks, routes them to specialized workers such as Claude Code or Codex, runs each worker in an isolated container, and preserves shared memory, tools, schedules, and review gates so delegated work compounds across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-swarm.dev",
|
|
@@ -179,8 +179,8 @@
|
|
|
179
179
|
"@desplega/model-catalog": "workspace:*",
|
|
180
180
|
"@desplega/model-routing": "workspace:*",
|
|
181
181
|
"@faker-js/faker": "^10.4.0",
|
|
182
|
-
"@opencode/plugin": "2.1.
|
|
183
|
-
"@opencode/sdk": "2.1.
|
|
182
|
+
"@opencode/plugin": "2.1.3",
|
|
183
|
+
"@opencode/sdk": "2.1.3",
|
|
184
184
|
"@oxlint/plugins": "1.78.0",
|
|
185
185
|
"@types/bun": "latest",
|
|
186
186
|
"dependency-cruiser": "^18.0.0",
|
|
@@ -198,26 +198,26 @@
|
|
|
198
198
|
"bun": ">=1.3.12"
|
|
199
199
|
},
|
|
200
200
|
"dependencies": {
|
|
201
|
-
"@agentclientprotocol/sdk": "2.0.
|
|
201
|
+
"@agentclientprotocol/sdk": "2.0.1",
|
|
202
202
|
"@ai-sdk/openai": "^3.0.41",
|
|
203
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.
|
|
204
|
-
"@anthropic-ai/sdk": "^
|
|
203
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.308",
|
|
204
|
+
"@anthropic-ai/sdk": "^1.1.0",
|
|
205
205
|
"@asteasolutions/zod-to-openapi": "^8.0.0",
|
|
206
206
|
"@aws-sdk/client-bedrock": "3.1048.0",
|
|
207
207
|
"@chat-adapter/discord": "4.41.1",
|
|
208
208
|
"@chat-adapter/slack": "4.41.1",
|
|
209
209
|
"@chat-adapter/teams": "4.41.1",
|
|
210
210
|
"@chat-adapter/telegram": "4.41.1",
|
|
211
|
-
"@cursor/sdk": "1.0.
|
|
211
|
+
"@cursor/sdk": "1.0.40",
|
|
212
212
|
"@desplega.ai/agent-fs-just-bash": "0.18.5",
|
|
213
213
|
"@desplega.ai/business-use": "^0.4.2",
|
|
214
|
-
"@earendil-works/pi-agent-core": "^1.
|
|
215
|
-
"@earendil-works/pi-ai": "^1.
|
|
216
|
-
"@earendil-works/pi-coding-agent": "^1.
|
|
214
|
+
"@earendil-works/pi-agent-core": "^1.4.0",
|
|
215
|
+
"@earendil-works/pi-ai": "^1.4.0",
|
|
216
|
+
"@earendil-works/pi-coding-agent": "^1.4.0",
|
|
217
217
|
"@inkjs/ui": "^2.0.0",
|
|
218
218
|
"@jitl/quickjs-singlefile-mjs-release-sync": "0.32.0",
|
|
219
219
|
"@linear/sdk": "^77.0.0",
|
|
220
|
-
"@modelcontextprotocol/sdk": "1.
|
|
220
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
221
221
|
"@openai/codex": "0.163.0",
|
|
222
222
|
"@openfort/openfort-node": "^0.9.1",
|
|
223
223
|
"@opentelemetry/api": "^1.9.1",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"Markdown",
|
|
14
14
|
"SearchInput",
|
|
15
15
|
"Select",
|
|
16
|
+
"NumberInput",
|
|
16
17
|
"Button",
|
|
17
18
|
"Metric",
|
|
18
19
|
"Alert",
|
|
@@ -31,9 +32,11 @@
|
|
|
31
32
|
"Form",
|
|
32
33
|
"Drawer",
|
|
33
34
|
"DetailList",
|
|
35
|
+
"CardGrid",
|
|
34
36
|
"Kanban",
|
|
35
37
|
"Calendar",
|
|
36
38
|
"ContributionGraph",
|
|
39
|
+
"Tree",
|
|
37
40
|
"ElementRef",
|
|
38
41
|
"ElementSlot"
|
|
39
42
|
],
|
|
@@ -48,7 +51,7 @@
|
|
|
48
51
|
],
|
|
49
52
|
"components": {
|
|
50
53
|
"Stack": {
|
|
51
|
-
"description": "THE primary layout primitive — a flex column (default) or row of its children. `gap`/`padding` use the shared spacing scale (none|xs|sm|md|lg|xl, default gap md); `align` is the cross axis, `justify` the main axis, `wrap` lets a row reflow. For rows, set `collapseBelow` (sm|md|lg) so the row stacks vertically on narrow viewports — filter bars should always set it. `motion` (rise|fade|none, default rise) is the entrance of the direct children on first paint: a 200ms fade plus a 4px rise, staggered 30ms; it never replays on data polls, nested Stacks inherit the parent's entrance, and reduced-motion viewers get a short fade. Use this as the page root and for every section; `Container` is the legacy 2-prop alias kept for older pages.",
|
|
54
|
+
"description": "THE primary layout primitive — a flex column (default) or row of its children. `gap`/`padding` use the shared spacing scale (none|xs|sm|md|lg|xl, default gap md); `align` is the cross axis, `justify` the main axis, `wrap` lets a row reflow. For rows, set `collapseBelow` (sm|md|lg) so the row stacks vertically on narrow viewports — filter bars should always set it. `motion` (rise|fade|none, default rise) is the entrance of the direct children on first paint: a 200ms fade plus a 4px rise, staggered 30ms; it never replays on data polls, nested Stacks inherit the parent's entrance, and reduced-motion viewers get a short fade. Use this as the page root and for every section; `Container` is the legacy 2-prop alias kept for older pages. `fill: true` makes this Stack grow to fill the remaining height of a `fill`-aware parent instead of sizing to content — chain it from the page root down to a scrolling leaf to build a viewport-height layout with no page scroll; a non-`fill` sibling keeps its natural height and the `fill` sibling absorbs whatever is left.",
|
|
52
55
|
"slots": ["default"],
|
|
53
56
|
"props": {
|
|
54
57
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
@@ -84,6 +87,9 @@
|
|
|
84
87
|
"motion": {
|
|
85
88
|
"type": "string",
|
|
86
89
|
"enum": ["rise", "fade", "none"]
|
|
90
|
+
},
|
|
91
|
+
"fill": {
|
|
92
|
+
"type": "boolean"
|
|
87
93
|
}
|
|
88
94
|
},
|
|
89
95
|
"additionalProperties": false
|
|
@@ -144,7 +150,7 @@
|
|
|
144
150
|
}
|
|
145
151
|
},
|
|
146
152
|
"Split": {
|
|
147
|
-
"description": "Two-pane layout. POSITIONAL children: the FIRST child is the left pane, the SECOND is the right pane, and any further children stack inside the right pane. `ratio` sizes them (1-1|1-2|2-1|1-3|3-1, default 2-1 = wide left). Below `collapseBelow` (sm|md|lg, default md) the panes stack vertically; `reverse` only flips that stacked order (right pane first on narrow screens).",
|
|
153
|
+
"description": "Two-pane layout. POSITIONAL children: the FIRST child is the left pane, the SECOND is the right pane, and any further children stack inside the right pane. `ratio` sizes them (1-1|1-2|2-1|1-3|3-1, default 2-1 = wide left). Below `collapseBelow` (sm|md|lg, default md) the panes stack vertically; `reverse` only flips that stacked order (right pane first on narrow screens). `fill: true` makes this Split grow to fill the remaining height of a `fill`-aware parent (same contract as `Stack.fill`) — both panes stretch to the full row height, so nesting a `fill` Split inside one pane of another `fill` Split is the standard way to build a 3+ column viewport-height layout (ratio is only ever 2 panes).",
|
|
148
154
|
"slots": ["default"],
|
|
149
155
|
"props": {
|
|
150
156
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
@@ -168,6 +174,9 @@
|
|
|
168
174
|
"padding": {
|
|
169
175
|
"type": "string",
|
|
170
176
|
"enum": ["none", "xs", "sm", "md", "lg", "xl"]
|
|
177
|
+
},
|
|
178
|
+
"fill": {
|
|
179
|
+
"type": "boolean"
|
|
171
180
|
}
|
|
172
181
|
},
|
|
173
182
|
"additionalProperties": false
|
|
@@ -385,7 +394,7 @@
|
|
|
385
394
|
}
|
|
386
395
|
},
|
|
387
396
|
"Select": {
|
|
388
|
-
"description": "Dropdown filter/picker. `options` are plain strings or `{ value, label?, icon?, hint? }` objects. Writes the chosen value into state at `/ui/<id>/value` (clearing writes `null`); bind it into a Table with `\"filters\": { \"<column>\": { \"$state\": \"/ui/<id>/value\" } }`. `clearable` (default true) shows a clear button. `searchable` adds a type-to-filter field (on by default past 8 options; `searchPlaceholder` sets its hint). `multiple` picks several: the value is a string array (empty = nothing picked), which a Table filter reads as \"cell is one of\".",
|
|
397
|
+
"description": "Dropdown filter/picker. `options` are plain strings or `{ value, label?, icon?, hint? }` objects. Writes the chosen value into state at `/ui/<id>/value` (clearing writes `null`); bind it into a Table with `\"filters\": { \"<column>\": { \"$state\": \"/ui/<id>/value\" } }`. `clearable` (default true) shows a clear button. `searchable` adds a type-to-filter field (on by default past 8 options; `searchPlaceholder` sets its hint). `multiple` picks several: the value is a string array (empty = nothing picked), which a Table filter reads as \"cell is one of\". `defaultValue` seeds `/ui/<id>/value` the first time it is read, before any interaction (a one-entry array with `multiple`).",
|
|
389
398
|
"props": {
|
|
390
399
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
391
400
|
"type": "object",
|
|
@@ -482,12 +491,41 @@
|
|
|
482
491
|
},
|
|
483
492
|
"searchPlaceholder": {
|
|
484
493
|
"type": "string"
|
|
494
|
+
},
|
|
495
|
+
"defaultValue": {
|
|
496
|
+
"type": "string"
|
|
485
497
|
}
|
|
486
498
|
},
|
|
487
499
|
"required": ["id", "options"],
|
|
488
500
|
"additionalProperties": false
|
|
489
501
|
}
|
|
490
502
|
},
|
|
503
|
+
"NumberInput": {
|
|
504
|
+
"description": "Labelled numeric text field (decimal keyboard on touch devices, no debounce). Writes the parsed number into state at `/ui/<id>/value` on every change, or `null` when the field is empty; non-numeric text (a bare '-' mid-edit, letters) leaves the stored value untouched until it parses. `min`/`max` clamp the stored value, and the visible text snaps to that clamped value when the field loses focus.",
|
|
505
|
+
"props": {
|
|
506
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
507
|
+
"type": "object",
|
|
508
|
+
"properties": {
|
|
509
|
+
"id": {
|
|
510
|
+
"type": "string"
|
|
511
|
+
},
|
|
512
|
+
"label": {
|
|
513
|
+
"type": "string"
|
|
514
|
+
},
|
|
515
|
+
"placeholder": {
|
|
516
|
+
"type": "string"
|
|
517
|
+
},
|
|
518
|
+
"min": {
|
|
519
|
+
"type": "number"
|
|
520
|
+
},
|
|
521
|
+
"max": {
|
|
522
|
+
"type": "number"
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
"required": ["id"],
|
|
526
|
+
"additionalProperties": false
|
|
527
|
+
}
|
|
528
|
+
},
|
|
491
529
|
"Button": {
|
|
492
530
|
"description": "Interactive button. Wire to actions via `on.press`. `variant: \"destructive-outline\"` is the canonical red-outlined destructive look (standalone deletes should use it, not solid red). `disabled` accepts a constant or a bound boolean; `busyWith: \"<actionName>\"` swaps the label for a spinner (presses ignored) while that custom action is running, then shows a check plus `successLabel` for ~1.5s when it finishes ok. `icon` + `iconPosition` (start|end) add an icon from the curated set; `size` sm|default|lg. `shortcut` (one key, e.g. `\"n\"`) shows a keycap inside the button and presses it from anywhere on the page (not while typing in a field, not with Ctrl/Cmd/Alt). `hint` is a hover tooltip.",
|
|
493
531
|
"props": {
|
|
@@ -1243,7 +1281,7 @@
|
|
|
1243
1281
|
}
|
|
1244
1282
|
},
|
|
1245
1283
|
"Table": {
|
|
1246
|
-
"description": "Data table. Bind `data`/`loading`/`error` to a named query (`/queries/<name>/...`). `rowActions` chains receive `{ \"$row\": \"<col>\" }` (or `{ \"$row\": \"\" }` for the whole row) and `{ \"$rowIndex\": true }`. Destructive row actions always confirm via a dialog; override the copy with `confirm: { title, description, confirmLabel }`. `search` (case-insensitive substring across every listed column) and `filters` (per-column equality, `null`/`\"\"` disables one; an array means \"one of\", which is what a multiple `Chips` writes, and an empty array disables it) narrow the polled rows client-side — bind them to a `SearchInput` / `Select` via `/ui/<id>/value`, or pin a constant (e.g. `\"filters\": { \"pinned\": true }`). Columns take `pinned: \"left\"|\"right\"` to survive horizontal scroll; `pagination` pages large row sets (auto past 200 rows); `density: \"compact\"` tightens row height. Column kinds: `status` (lifecycle values like pending/in_progress/completed/failed get the dashboard status icon, anything else a `tones` pill), `user` / `agent` (avatar + name), `relative` (smart time with the exact time on hover), `duration` (ms → 1m 23s), `progress` (bar, `max` default 100), `copy` (value + copy button), `switch` (runs the column's `onChange` chain with `$row` set to the new value; read-only without it), `link` (http(s) URL, opens in a new tab), `json` (compact single-line `JSON.stringify` preview, truncated). Columns also take `align`, `truncate: \"middle\"` (ids, paths), a header `icon` and `tooltip` (a row field shown on hover). `onRowClick` runs a chain with `$row` when a row is clicked — pair it with `app.navigate` + a Drawer and bind `selectedId` to the drawer param to highlight the open row. `rowId` names the id field (default `id`). Below 768px the table renders as a phone list (`mobile: \"list\"`, fields picked by `mobileFields: { title, subtitle?, meta?, status? }`); `mobile: \"scroll\"` keeps the grid. `emptyState: { icon?, title, body? }` replaces the empty message. Row actions take `icon` and `placement: \"menu\"` (collected into a More menu).",
|
|
1284
|
+
"description": "Data table. Bind `data`/`loading`/`error` to a named query (`/queries/<name>/...`). `rowActions` chains receive `{ \"$row\": \"<col>\" }` (or `{ \"$row\": \"\" }` for the whole row) and `{ \"$rowIndex\": true }`. Destructive row actions always confirm via a dialog; override the copy with `confirm: { title, description, confirmLabel }`. `search` (case-insensitive substring across every listed column) and `filters` (per-column equality, `null`/`\"\"` disables one; an array means \"one of\", which is what a multiple `Chips` writes, and an empty array disables it) narrow the polled rows client-side — bind them to a `SearchInput` / `Select` via `/ui/<id>/value`, or pin a constant (e.g. `\"filters\": { \"pinned\": true }`). Columns take `pinned: \"left\"|\"right\"` to survive horizontal scroll; `pagination` pages large row sets (auto past 200 rows); `density: \"compact\"` tightens row height. Column kinds: `status` (lifecycle values like pending/in_progress/completed/failed get the dashboard status icon, anything else a `tones` pill), `user` / `agent` (avatar + name), `relative` (smart time with the exact time on hover), `duration` (ms → 1m 23s), `progress` (bar, `max` default 100), `copy` (value + copy button), `switch` (runs the column's `onChange` chain with `$row` set to the new value; read-only without it), `link` (http(s) URL, opens in a new tab), `json` (compact single-line `JSON.stringify` preview, truncated). Columns also take `align`, `truncate: \"middle\"` (ids, paths), a header `icon` and `tooltip` (a row field shown on hover), and `format` — a `{{field}}` template (e.g. `\"{{name}} · v{{version}}\"`) that combines several row fields into one cell and overrides `key`/`kind` rendering on desktop and in the phone list (placeholder names match `[w.]+`, no hyphens or spaces; sorting uses the composed text; `search` and `filters` still read the column's `key`). `onRowClick` runs a chain with `$row` when a row is clicked — pair it with `app.navigate` + a Drawer and bind `selectedId` to the drawer param to highlight the open row. `rowId` names the id field (default `id`). Below 768px the table renders as a phone list (`mobile: \"list\"`, fields picked by `mobileFields: { title, subtitle?, meta?, status? }`); `mobile: \"scroll\"` keeps the grid. `emptyState: { icon?, title, body? }` replaces the empty message. Row actions take `icon` and `placement: \"menu\"` (collected into a More menu).",
|
|
1247
1285
|
"props": {
|
|
1248
1286
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1249
1287
|
"type": "object",
|
|
@@ -1317,6 +1355,9 @@
|
|
|
1317
1355
|
"type": "string",
|
|
1318
1356
|
"enum": ["left", "right"]
|
|
1319
1357
|
},
|
|
1358
|
+
"format": {
|
|
1359
|
+
"type": "string"
|
|
1360
|
+
},
|
|
1320
1361
|
"align": {
|
|
1321
1362
|
"type": "string",
|
|
1322
1363
|
"enum": ["start", "end"]
|
|
@@ -2037,6 +2078,140 @@
|
|
|
2037
2078
|
"additionalProperties": false
|
|
2038
2079
|
}
|
|
2039
2080
|
},
|
|
2081
|
+
"CardGrid": {
|
|
2082
|
+
"description": "Responsive grid of data-bound cards, one per row — the visual counterpart to `Table` for record browsers (projects, documents, media). Bind `data`/`loading`/`error` to a named query like Table. `titleKey` picks the row field shown as the card title. `imageKey` picks a row field holding an absolute http(s) image URL and adds an image tile to every card (a non-URL value or a failed load shows a placeholder); omit it for text-only cards. `fields` render as an unlabeled `·`-joined meta line under the title; each field's `kind` is one of `text`, `string`, `enum`, `number`, `boolean`, `date`, `badge` (with `tones`) or `json`. `onClick` is an action chain (params may use `$row` / `$rowIndex`) dispatched on card click or Enter/Space, commonly `app.navigate` into a detail page. `columns` is the same responsive shorthand as `Grid.columns` (default `{ base: 1, sm: 2, md: 3 }`). Renders 200 cards at a time with a Show more button.",
|
|
2083
|
+
"props": {
|
|
2084
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
2085
|
+
"type": "object",
|
|
2086
|
+
"properties": {
|
|
2087
|
+
"data": {
|
|
2088
|
+
"type": "array",
|
|
2089
|
+
"items": {
|
|
2090
|
+
"type": "object",
|
|
2091
|
+
"propertyNames": {
|
|
2092
|
+
"type": "string"
|
|
2093
|
+
},
|
|
2094
|
+
"additionalProperties": {}
|
|
2095
|
+
}
|
|
2096
|
+
},
|
|
2097
|
+
"titleKey": {
|
|
2098
|
+
"type": "string"
|
|
2099
|
+
},
|
|
2100
|
+
"imageKey": {
|
|
2101
|
+
"type": "string"
|
|
2102
|
+
},
|
|
2103
|
+
"fields": {
|
|
2104
|
+
"type": "array",
|
|
2105
|
+
"items": {
|
|
2106
|
+
"type": "object",
|
|
2107
|
+
"properties": {
|
|
2108
|
+
"key": {
|
|
2109
|
+
"type": "string"
|
|
2110
|
+
},
|
|
2111
|
+
"kind": {
|
|
2112
|
+
"type": "string",
|
|
2113
|
+
"enum": ["text", "string", "number", "boolean", "date", "badge", "enum", "json"]
|
|
2114
|
+
},
|
|
2115
|
+
"tones": {
|
|
2116
|
+
"type": "object",
|
|
2117
|
+
"propertyNames": {
|
|
2118
|
+
"type": "string"
|
|
2119
|
+
},
|
|
2120
|
+
"additionalProperties": {
|
|
2121
|
+
"type": "string",
|
|
2122
|
+
"enum": [
|
|
2123
|
+
"neutral",
|
|
2124
|
+
"success",
|
|
2125
|
+
"active",
|
|
2126
|
+
"error",
|
|
2127
|
+
"info",
|
|
2128
|
+
"pending",
|
|
2129
|
+
"warning",
|
|
2130
|
+
"paused"
|
|
2131
|
+
]
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
},
|
|
2135
|
+
"required": ["key"],
|
|
2136
|
+
"additionalProperties": false
|
|
2137
|
+
}
|
|
2138
|
+
},
|
|
2139
|
+
"columns": {
|
|
2140
|
+
"anyOf": [
|
|
2141
|
+
{
|
|
2142
|
+
"type": "integer",
|
|
2143
|
+
"minimum": 1,
|
|
2144
|
+
"maximum": 6
|
|
2145
|
+
},
|
|
2146
|
+
{
|
|
2147
|
+
"type": "object",
|
|
2148
|
+
"properties": {
|
|
2149
|
+
"base": {
|
|
2150
|
+
"type": "integer",
|
|
2151
|
+
"minimum": 1,
|
|
2152
|
+
"maximum": 6
|
|
2153
|
+
},
|
|
2154
|
+
"sm": {
|
|
2155
|
+
"type": "integer",
|
|
2156
|
+
"minimum": 1,
|
|
2157
|
+
"maximum": 6
|
|
2158
|
+
},
|
|
2159
|
+
"md": {
|
|
2160
|
+
"type": "integer",
|
|
2161
|
+
"minimum": 1,
|
|
2162
|
+
"maximum": 6
|
|
2163
|
+
},
|
|
2164
|
+
"lg": {
|
|
2165
|
+
"type": "integer",
|
|
2166
|
+
"minimum": 1,
|
|
2167
|
+
"maximum": 6
|
|
2168
|
+
}
|
|
2169
|
+
},
|
|
2170
|
+
"additionalProperties": false
|
|
2171
|
+
}
|
|
2172
|
+
]
|
|
2173
|
+
},
|
|
2174
|
+
"onClick": {
|
|
2175
|
+
"type": "array",
|
|
2176
|
+
"items": {
|
|
2177
|
+
"type": "object",
|
|
2178
|
+
"properties": {
|
|
2179
|
+
"action": {
|
|
2180
|
+
"type": "string"
|
|
2181
|
+
},
|
|
2182
|
+
"params": {
|
|
2183
|
+
"type": "object",
|
|
2184
|
+
"propertyNames": {
|
|
2185
|
+
"type": "string"
|
|
2186
|
+
},
|
|
2187
|
+
"additionalProperties": {}
|
|
2188
|
+
}
|
|
2189
|
+
},
|
|
2190
|
+
"required": ["action"],
|
|
2191
|
+
"additionalProperties": false
|
|
2192
|
+
}
|
|
2193
|
+
},
|
|
2194
|
+
"loading": {
|
|
2195
|
+
"type": "boolean"
|
|
2196
|
+
},
|
|
2197
|
+
"error": {
|
|
2198
|
+
"anyOf": [
|
|
2199
|
+
{
|
|
2200
|
+
"type": "string"
|
|
2201
|
+
},
|
|
2202
|
+
{
|
|
2203
|
+
"type": "null"
|
|
2204
|
+
}
|
|
2205
|
+
]
|
|
2206
|
+
},
|
|
2207
|
+
"emptyMessage": {
|
|
2208
|
+
"type": "string"
|
|
2209
|
+
}
|
|
2210
|
+
},
|
|
2211
|
+
"required": ["titleKey"],
|
|
2212
|
+
"additionalProperties": false
|
|
2213
|
+
}
|
|
2214
|
+
},
|
|
2040
2215
|
"Kanban": {
|
|
2041
2216
|
"description": "Kanban board: one card per row, grouped into `columns` by the row's `columnField`. Bind `data`/`loading` to a named query. `titleField` is the card title; `cardFields` add label/value lines with the DetailList field kinds (badge tones, status, user, relative, copy, ...). Dragging a card to another column runs `onMove` with `$row` = the moved row, `columnField` already set to the new column — typically `[{ \"action\": \"app.mutate\", \"params\": { \"model\": \"<m>\", \"op\": \"update\", \"rowId\": { \"$row\": \"id\" }, \"values\": { \"<columnField>\": { \"$row\": \"<columnField>\" } } } }]`. Without `onMove` the board is read-only. `onCardClick` runs with `$row` (e.g. an `app.navigate` that opens a Drawer).",
|
|
2042
2217
|
"props": {
|
|
@@ -2277,6 +2452,33 @@
|
|
|
2277
2452
|
"additionalProperties": false
|
|
2278
2453
|
}
|
|
2279
2454
|
},
|
|
2455
|
+
"Tree": {
|
|
2456
|
+
"description": "Collapsible tree view of a json-render flat element map. Bind `nodes` to a doc-shaped value (`{ root: string | string[], elements: Record<key,{type,children?}> }`) — usually `{ \"$state\": \"/queries/<name>/data/0/<jsonColumn>\" }`. Each row shows `key — type`; clicking one writes the node key to `/ui/<id>/value`, and the row bound to that path renders selected. A malformed or absent `nodes` value renders an empty state. Rows scroll inside a fixed-height viewport — `maxHeight` overrides the default `480px` — or set `fill: true` to grow inside a `fill`-aware parent and scroll within whatever height that gives it instead (ignores `maxHeight`). Outlines are cut at 2,000 rows with a notice; branches deeper than 32 levels keep a disabled chevron.",
|
|
2457
|
+
"props": {
|
|
2458
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
2459
|
+
"type": "object",
|
|
2460
|
+
"properties": {
|
|
2461
|
+
"id": {
|
|
2462
|
+
"type": "string"
|
|
2463
|
+
},
|
|
2464
|
+
"nodes": {
|
|
2465
|
+
"description": "json-render flat element map: { root: string | string[], elements: Record<key,{type,children?}> } — usually a {$state} binding to a query row's json column"
|
|
2466
|
+
},
|
|
2467
|
+
"label": {
|
|
2468
|
+
"type": "string"
|
|
2469
|
+
},
|
|
2470
|
+
"maxHeight": {
|
|
2471
|
+
"description": "CSS max-height for the scrollable row list, e.g. '480px' (default '480px')",
|
|
2472
|
+
"type": "string"
|
|
2473
|
+
},
|
|
2474
|
+
"fill": {
|
|
2475
|
+
"type": "boolean"
|
|
2476
|
+
}
|
|
2477
|
+
},
|
|
2478
|
+
"required": ["id", "nodes"],
|
|
2479
|
+
"additionalProperties": false
|
|
2480
|
+
}
|
|
2481
|
+
},
|
|
2280
2482
|
"ElementRef": {
|
|
2281
2483
|
"description": "Reference a reusable element from this app or an exported element from another app. Consumer children are inserted at the target's ElementSlot.",
|
|
2282
2484
|
"slots": ["default"],
|
|
@@ -14,6 +14,9 @@ interface JsonSchema {
|
|
|
14
14
|
const?: unknown;
|
|
15
15
|
items?: JsonSchema;
|
|
16
16
|
anyOf?: JsonSchema[];
|
|
17
|
+
// A bare `z.unknown()` prop (e.g. Tree.nodes) serializes to a schema carrying
|
|
18
|
+
// only `description` and no `type` — a valid, type-less JSON Schema.
|
|
19
|
+
description?: string;
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
export interface AppCatalog {
|
|
@@ -42,7 +45,15 @@ export const ELEMENT_KEYS = new Set([
|
|
|
42
45
|
"repeat",
|
|
43
46
|
"watch",
|
|
44
47
|
]);
|
|
45
|
-
|
|
48
|
+
// Components whose `id` claims a `/ui/<id>/...` state slot.
|
|
49
|
+
const UI_STATE_COMPONENTS = new Set([
|
|
50
|
+
"SearchInput",
|
|
51
|
+
"Select",
|
|
52
|
+
"NumberInput",
|
|
53
|
+
"Tabs",
|
|
54
|
+
"Chips",
|
|
55
|
+
"Tree",
|
|
56
|
+
]);
|
|
46
57
|
|
|
47
58
|
/**
|
|
48
59
|
* Props that hold a plain action chain (an array of `{ action, params }`),
|
|
@@ -54,6 +65,7 @@ const PROP_ACTION_CHAINS: Record<string, readonly string[]> = {
|
|
|
54
65
|
Form: ["onSubmit"],
|
|
55
66
|
Kanban: ["onMove", "onCardClick"],
|
|
56
67
|
Calendar: ["onSelect"],
|
|
68
|
+
CardGrid: ["onClick"],
|
|
57
69
|
};
|
|
58
70
|
|
|
59
71
|
/**
|
package/src/assets/key.ts
CHANGED
|
@@ -83,6 +83,23 @@ export function defaultAssetKey(resource: AssetKeyResource, id: string): string
|
|
|
83
83
|
return normalizeAssetKey(`shared/${resource}:${id}/`);
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
/** Bounds for an indexed, literal prefix lookup on canonical asset keys. */
|
|
87
|
+
export function keyPrefixRange(prefix: string): { lo: string; hi: string } {
|
|
88
|
+
const lo = normalizeAssetKey(prefix);
|
|
89
|
+
return { lo, hi: `${lo.slice(0, -1)}${String.fromCharCode(lo.charCodeAt(lo.length - 1) + 1)}` };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const SESSION_LEAF_KINDS = ["task", "thread", "schedule", "workflow"] as const;
|
|
93
|
+
const sessionLeafPattern = new RegExp(`/(?:${SESSION_LEAF_KINDS.join("|")}):[^/]+/$`);
|
|
94
|
+
|
|
95
|
+
/** Remove only a resource leaf, preserving user groups that contain a colon. */
|
|
96
|
+
export function sessionGroupKey(key: string): string {
|
|
97
|
+
const normalized = normalizeAssetKey(key);
|
|
98
|
+
const namespace = parseAssetKey(normalized);
|
|
99
|
+
if (namespace.relativeSegments.length === 0) return normalized;
|
|
100
|
+
return normalized.replace(sessionLeafPattern, "/");
|
|
101
|
+
}
|
|
102
|
+
|
|
86
103
|
export function parseAssetKey(input: string): AssetNamespace {
|
|
87
104
|
const key = normalizeAssetKey(input);
|
|
88
105
|
const segments = key.slice(0, -1).split("/");
|
|
@@ -394,7 +394,7 @@ export async function handlePullRequestCommented(
|
|
|
394
394
|
);
|
|
395
395
|
|
|
396
396
|
// Check if there's already an active task for this PR
|
|
397
|
-
const existingTask = await findTaskByVcs(repo, pr.pullRequestId);
|
|
397
|
+
const existingTask = await findTaskByVcs(repo, pr.pullRequestId, "azure-devops");
|
|
398
398
|
const existingTaskNote = existingTask
|
|
399
399
|
? `\n\n_Note: There's an active task (${existingTask.id}) for this PR #${pr.pullRequestId}._`
|
|
400
400
|
: "";
|
package/src/be/chunking.ts
CHANGED
|
@@ -42,20 +42,53 @@ export function chunkContent(text: string): MemoryChunk[] {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return [{ content: trimmed, chunkIndex: 0, totalChunks: 1, headings: [] }];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return filtered.map((c, i) => ({
|
|
52
|
-
content: c.headings.length > 0 ? `${c.headings.join(" > ")}\n\n${c.content}` : c.content,
|
|
45
|
+
const packed = packSmallSections(rawChunks);
|
|
46
|
+
return packed.map((c, i) => ({
|
|
47
|
+
content: c.content,
|
|
53
48
|
chunkIndex: i,
|
|
54
|
-
totalChunks:
|
|
49
|
+
totalChunks: packed.length,
|
|
55
50
|
headings: c.headings,
|
|
56
51
|
}));
|
|
57
52
|
}
|
|
58
53
|
|
|
54
|
+
function renderSection(section: Section): string {
|
|
55
|
+
return section.headings.length > 0
|
|
56
|
+
? `${section.headings.join(" > ")}\n\n${section.content}`
|
|
57
|
+
: section.content;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Render each section with its heading path. A section below MIN_CHUNK_SIZE
|
|
62
|
+
* is too small to embed on its own, so consecutive small sections share a
|
|
63
|
+
* chunk up to MAX_CHUNK_SIZE. No section content is dropped.
|
|
64
|
+
*/
|
|
65
|
+
function packSmallSections(sections: Section[]): Section[] {
|
|
66
|
+
const out: Section[] = [];
|
|
67
|
+
let pending: { parts: string[]; length: number; headings: string[] } | null = null;
|
|
68
|
+
const flush = () => {
|
|
69
|
+
if (pending) out.push({ content: pending.parts.join("\n\n"), headings: pending.headings });
|
|
70
|
+
pending = null;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
for (const section of sections) {
|
|
74
|
+
const rendered = renderSection(section);
|
|
75
|
+
if (section.content.trim().length >= MIN_CHUNK_SIZE) {
|
|
76
|
+
flush();
|
|
77
|
+
out.push({ content: rendered, headings: section.headings });
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (pending && pending.length + 2 + rendered.length > MAX_CHUNK_SIZE) flush();
|
|
81
|
+
if (pending) {
|
|
82
|
+
pending.parts.push(rendered);
|
|
83
|
+
pending.length += 2 + rendered.length;
|
|
84
|
+
} else {
|
|
85
|
+
pending = { parts: [rendered], length: rendered.length, headings: section.headings };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
flush();
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
59
92
|
interface Section {
|
|
60
93
|
content: string;
|
|
61
94
|
headings: string[];
|
package/src/be/db/approvals.ts
CHANGED
|
@@ -144,3 +144,21 @@ export function scrubApprovalVotesJson(approvals: ApprovalVote[]): ScrubbedText
|
|
|
144
144
|
if (!breaksJsonValidity(raw, scrubbed)) return scrubbed;
|
|
145
145
|
return JSON.stringify(scrubObject(approvals)) as ScrubbedText;
|
|
146
146
|
}
|
|
147
|
+
|
|
148
|
+
/** Pending approval summaries for an already loaded session chain. */
|
|
149
|
+
export async function getPendingApprovalsForTasks(taskIds: string[]): Promise<
|
|
150
|
+
{
|
|
151
|
+
id: string;
|
|
152
|
+
status: "pending";
|
|
153
|
+
sourceTaskId: string;
|
|
154
|
+
title: string;
|
|
155
|
+
}[]
|
|
156
|
+
> {
|
|
157
|
+
if (!taskIds.length) return [];
|
|
158
|
+
return getDbClient().query(
|
|
159
|
+
`SELECT id, status, sourceTaskId, title FROM approval_requests
|
|
160
|
+
WHERE sourceTaskId IN (${taskIds.map(() => "?").join(",")}) AND status = 'pending'
|
|
161
|
+
ORDER BY createdAt, id`,
|
|
162
|
+
taskIds,
|
|
163
|
+
);
|
|
164
|
+
}
|