@desplega.ai/agent-swarm 2.3.0 → 2.4.1
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 -0
- package/dist/{acp-adapter-v85a2bqy.js → acp-adapter-zvzr538d.js} +9 -9
- package/dist/{actions-zgcxfspj.js → actions-jhtqdw69.js} +21 -19
- package/dist/{amp-adapter-jw9xfz42.js → amp-adapter-bd84rhs2.js} +4 -4
- package/dist/{app-4e1s4675.js → app-kreq1gwg.js} +3 -3
- package/dist/{assistant-v238n9dk.js → assistant-3k22sbsq.js} +23 -21
- package/dist/{boot-reembed-p666cw5n.js → boot-reembed-e53x6b9v.js} +1 -1
- package/dist/{boot-reembed-w6pm64j4.js → boot-reembed-f6z923ny.js} +1 -1
- package/dist/{boot-scrub-sweep-jcyjagn3.js → boot-scrub-sweep-0538vsb7.js} +4 -4
- package/dist/{boot-seeds-gbedmamp.js → boot-seeds-6wxqkfk2.js} +4 -4
- package/dist/{claude-adapter-q7wspzt8.js → claude-adapter-gfts5044.js} +9 -9
- package/dist/{claude-managed-adapter-n7ahjyx6.js → claude-managed-adapter-h2y889ge.js} +3 -3
- package/dist/{claude-managed-setup-wza784fb.js → claude-managed-setup-h00hsgtz.js} +2 -2
- package/dist/{claude-sdk-session-yf400ptr.js → claude-sdk-session-56besmfz.js} +13 -13
- package/dist/{cli-65q70v2v.js → cli-0bh477zn.js} +33 -6
- package/dist/{cli-4ync7m60.js → cli-0ebey9hg.js} +1 -1
- package/dist/{cli-665j3feb.js → cli-0xk505e8.js} +1 -1
- package/dist/{cli-7gh7020n.js → cli-1dmcq2eh.js} +1 -1
- package/dist/{cli-gzvb3d4a.js → cli-1jx0srjt.js} +3 -3
- package/dist/{cli-zj4d6afs.js → cli-1pa3rz69.js} +21 -6
- package/dist/{cli-7ayprxp7.js → cli-2dfbv8qr.js} +8 -0
- package/dist/{cli-30m5q8mc.js → cli-3kh4kpqy.js} +6 -6
- package/dist/{cli-qrwp40st.js → cli-3p8fqcnh.js} +2 -2
- package/dist/{cli-y3dvz6ge.js → cli-3r448dqn.js} +3 -3
- package/dist/{cli-a17tzmn0.js → cli-3tnpj2bh.js} +7 -7
- package/dist/{cli-ea7chd26.js → cli-471qk6s2.js} +93 -46
- package/dist/{cli-a49vpbf3.js → cli-5kqnemen.js} +1 -1
- package/dist/{cli-0rh20bp3.js → cli-6ncjvx55.js} +3 -3
- package/dist/{cli-fb6t92v8.js → cli-6x9ma5w5.js} +1 -1
- package/dist/{cli-k28p6xh7.js → cli-7225gwj7.js} +2 -2
- package/dist/{cli-8cvvytad.js → cli-8nyhf7za.js} +3 -3
- package/dist/{cli-e09hj50q.js → cli-8wkb09q5.js} +11 -11
- package/dist/{cli-j0v75y13.js → cli-a0kcty51.js} +4 -4
- package/dist/{cli-zes4tsbb.js → cli-a4gvwttf.js} +4 -4
- package/dist/{cli-jhp7w1fy.js → cli-a5ebc95n.js} +2 -2
- package/dist/{cli-5d1m1qca.js → cli-ash6xxk7.js} +2 -2
- package/dist/{cli-fp4xbw07.js → cli-axh29tyr.js} +14 -12
- package/dist/{cli-p22zdvnt.js → cli-bn0rewsy.js} +3 -3
- package/dist/{cli-hz64bcnj.js → cli-bn5kevnf.js} +11 -373
- package/dist/{cli-8jtrekpy.js → cli-d2mb5s8a.js} +7 -7
- package/dist/{cli-c5sbmw1v.js → cli-d82btycs.js} +94 -15
- package/dist/{cli-vjfpshn3.js → cli-ejs3m1sx.js} +1 -1
- package/dist/{cli-yv0vgscc.js → cli-fpmsqq59.js} +18 -2
- package/dist/cli-fz9kewbh.js +382 -0
- package/dist/{cli-4s1kqrqg.js → cli-g0hgtz4p.js} +6 -6
- package/dist/{cli-hn3pftj2.js → cli-gf0kfg81.js} +7 -7
- package/dist/{cli-d43xqzbe.js → cli-hqhzg1qq.js} +2 -2
- package/dist/{cli-azs9bhc5.js → cli-j4rqdf2n.js} +2 -2
- package/dist/{cli-wtg6edvd.js → cli-jh0qcrga.js} +1 -1
- package/dist/{cli-kqypty34.js → cli-k9z4zd4p.js} +6 -5
- package/dist/{cli-jhmjwqcg.js → cli-kmqgmcnb.js} +47 -14
- package/dist/{cli-8qsx817b.js → cli-kr2pmfqx.js} +583 -769
- package/dist/{cli-4g629sgr.js → cli-m2qgh5sv.js} +20 -1
- package/dist/{cli-9e9kjqsj.js → cli-mfe7f7b5.js} +2 -2
- package/dist/{cli-x3en6ct3.js → cli-nwyw3zhg.js} +1 -1
- package/dist/{cli-6vcyw6v7.js → cli-nx462e4v.js} +5 -3
- package/dist/{cli-tr24eeny.js → cli-p0rakbrk.js} +9 -9
- package/dist/{cli-4hmaheb6.js → cli-p6argxh9.js} +9 -9
- package/dist/{cli-3avfh5az.js → cli-pemywhfq.js} +2 -2
- package/dist/{cli-etvn5ej2.js → cli-pnp2j5zg.js} +2 -2
- package/dist/{cli-wk8ccrz6.js → cli-pw7v69vp.js} +2 -2
- package/dist/{cli-ka01m5rb.js → cli-rdq7tzwm.js} +17 -14
- package/dist/{cli-re4wkbzx.js → cli-rqqsfz30.js} +677 -104
- package/dist/{cli-xgn4rwyv.js → cli-s48yvzb8.js} +4 -4
- package/dist/{cli-zv4vy2b0.js → cli-s95dknxh.js} +1 -1
- package/dist/{cli-g6p7c2my.js → cli-sjyetj21.js} +2 -2
- package/dist/{cli-rdr166ht.js → cli-smvcw9z5.js} +1 -1
- package/dist/{cli-fhvqt2fp.js → cli-sv5gb0yb.js} +1 -1
- package/dist/{cli-yv3n83x8.js → cli-syhq378v.js} +2 -2
- package/dist/{cli-q1812jbw.js → cli-tbhwrxpt.js} +9 -9
- package/dist/{cli-w7z94e6c.js → cli-tx00c0h6.js} +4 -2
- package/dist/{cli-dxwh4j32.js → cli-vy0fay6k.js} +46 -37
- package/dist/{cli-ptkpaqfy.js → cli-wt645v7q.js} +1 -1
- package/dist/{cli-ppapy34w.js → cli-wxbn3yfx.js} +2 -2
- package/dist/{cli-cby329ny.js → cli-x5mq1fyq.js} +3 -3
- package/dist/{cli-rc3r0bnh.js → cli-xbzvet96.js} +6 -6
- package/dist/{cli-4mkvwgzr.js → cli-xf234ws8.js} +1 -1
- package/dist/{cli-6p7ddg72.js → cli-xftrvxag.js} +5 -5
- package/dist/cli-z071fb95.js +848 -0
- package/dist/{cli-1v8w782f.js → cli-z1ew8vbq.js} +14 -7
- package/dist/{cli-9td5ss65.js → cli-zfg9enh9.js} +3 -3
- package/dist/{cli-yxqag76b.js → cli-zw88zjba.js} +1 -1
- package/dist/cli.js +19 -19
- package/dist/{codex-adapter-nhjj2veb.js → codex-adapter-p6rmm7vv.js} +6 -6
- package/dist/{codex-hook-x6tm6y5m.js → codex-hook-x7nejyrr.js} +8 -5
- package/dist/{codex-login-35p4sk85.js → codex-login-m819c41r.js} +1 -1
- package/dist/{codex-session-runner-6hggrjbx.js → codex-session-runner-8vd5t9t0.js} +7 -7
- package/dist/{commands-mrw1ph2w.js → commands-7ems2p13.js} +2 -2
- package/dist/{controller-pt1zam5w.js → controller-m263fg43.js} +4 -4
- package/dist/{controllers-connect-ymw5541d.js → controllers-connect-bg33ae53.js} +28 -24
- package/dist/{cursor-adapter-cf4zh5x0.js → cursor-adapter-cz6nm6mj.js} +3 -3
- package/dist/{db-hy80219q.js → db-w505dwa8.js} +2 -2
- package/dist/{db-hhpy6m4x.js → db-ys2rbdft.js} +3 -2
- package/dist/{devin-adapter-7egzmt0k.js → devin-adapter-zgqadvnm.js} +1 -1
- package/dist/{dispatcher-6pdjtkr1.js → dispatcher-0s0mckqr.js} +20 -18
- package/dist/{docker-njavd3fb.js → docker-fkgtr75t.js} +2 -2
- package/dist/{dsh-adapter-fbx06re2.js → dsh-adapter-3n3net33.js} +3 -3
- package/dist/{e2b-5r6a5jeb.js → e2b-7am6tmq6.js} +2 -2
- package/dist/{e2b-pw1nvtmh.js → e2b-thdcxtjd.js} +2 -2
- package/dist/{easter-egg-3d-6hg2r942.js → easter-egg-3d-5cgynaja.js} +1 -1
- package/dist/{event-bus-101fenkh.js → event-bus-9vpk8gmq.js} +1 -1
- package/dist/{execute-bcqc69a5.js → execute-t4e6m3rw.js} +1 -1
- package/dist/{external-channel-j6vb6ya1.js → external-channel-5b23fv8z.js} +2 -2
- package/dist/{google-generative-ai-phpmwxvg.js → google-generative-ai-bmq8gkf3.js} +1 -1
- package/dist/{google-vertex-es9ybgdy.js → google-vertex-b1rvp52s.js} +1 -1
- package/dist/{grok-adapter-1193sprp.js → grok-adapter-q9fghe5q.js} +10 -10
- package/dist/handlers-mqrym347.js +39 -0
- package/dist/{heartbeat-h1w1ktce.js → heartbeat-tww6yx1w.js} +23 -21
- package/dist/{hook-ejja4bpe.js → hook-dx0pkvar.js} +16 -9
- package/dist/{hook-skrbja18.js → hook-pvmh9b6m.js} +6 -6
- package/dist/{http-mzh41mfj.js → http-k2ejbt05.js} +975 -292
- package/dist/{index-6rmnn89d.js → index-2z710v4x.js} +10 -10
- package/dist/{index-xmmkyx82.js → index-dgz61nff.js} +20 -18
- package/dist/{index-wgsw9xcz.js → index-g6tbb6ve.js} +1 -1
- package/dist/index-h2ek08d6.js +40 -0
- package/dist/index-pqfwh9nn.js +41 -0
- package/dist/{index-epr2gnbw.js → index-x5aktmp8.js} +1 -1
- package/dist/{index-x0q2a4f9.js → index-ysd45kgc.js} +1 -1
- package/dist/{index-g909y089.js → index-zgvqzjsw.js} +8 -8
- package/dist/{keepalive-4djvbm2j.js → keepalive-nhvpw10z.js} +4 -4
- package/dist/lead-jb6sf69z.js +78 -0
- package/dist/{maintenance-f3xhnjsm.js → maintenance-agakc519.js} +1 -1
- package/dist/{oauth-refresh-sweep-fpd6x6rw.js → oauth-refresh-sweep-4dcbhtn0.js} +3 -3
- package/dist/{onboard-196tjgyn.js → onboard-4n2kwa4v.js} +3 -3
- package/dist/{opencode-adapter-eeesgfqk.js → opencode-adapter-3s7ax02e.js} +7 -7
- package/dist/{otel-impl-g8fh4c21.js → otel-impl-tfa12080.js} +2 -2
- package/dist/{pi-mono-adapter-zasp3ze3.js → pi-mono-adapter-ytp7gz8b.js} +24 -13
- package/dist/{pricing-refresh-sdcf5yaz.js → pricing-refresh-3cqx3f3x.js} +3 -3
- package/dist/{rbac-roles-bsp5657v.js → rbac-roles-9fae5rnv.js} +5 -3
- package/dist/{rbac-roles-2x4g1wb5.js → rbac-roles-y6zbfzve.js} +2 -2
- package/dist/{render-v2-0pyb39bb.js → render-v2-emawjvc4.js} +3 -3
- package/dist/{resume-a86tkj6r.js → resume-zhgts7h7.js} +10 -8
- package/dist/{runtime-ar8310ba.js → runtime-xe3aqy4x.js} +1 -1
- package/dist/session-access-cm823e06.js +25 -0
- package/dist/{setup-ypbzcapd.js → setup-tkp99w1e.js} +1 -1
- package/dist/{virtual-modules-wzk6jf3a.js → virtual-modules-4r3zkc20.js} +2 -2
- package/dist/{work-objects-yjp8de12.js → work-objects-f722h263.js} +23 -21
- package/dist/worker-p7f336rq.js +78 -0
- package/dist/{x-8ewt8gxn.js → x-y45mthwn.js} +2 -2
- package/openapi.json +1086 -305
- package/package.json +2 -2
- package/src/apps/action-caller.ts +6 -0
- package/src/apps/action-runner.ts +146 -0
- package/src/apps/row-store.ts +4 -2
- package/src/apps/script-types.ts +17 -4
- package/src/be/db/active-sessions.ts +5 -0
- package/src/be/db/session-visibility.ts +29 -0
- package/src/be/db/tasks/read.ts +61 -3
- package/src/be/db/tasks/write.ts +15 -6
- package/src/be/db.ts +106 -37
- package/src/be/events.ts +11 -0
- package/src/be/fleet-benchmark-stats.ts +10 -5
- package/src/be/migrations/230_session_shares.sql +23 -0
- package/src/be/models-catalog.ts +4 -0
- package/src/be/onboarding.ts +6 -0
- package/src/be/rbac-roles.ts +2 -0
- package/src/be/scripts/typecheck.ts +13 -0
- package/src/be/session-shares.ts +244 -0
- package/src/be/swarm-config-guard.ts +33 -3
- package/src/be/telemetry-enable.ts +1 -1
- package/src/commands/provider-credentials.ts +12 -2
- package/src/commands/runner.ts +14 -0
- package/src/heartbeat/heartbeat.ts +2 -2
- package/src/hooks/codex-hook.ts +6 -2
- package/src/hooks/hook.ts +7 -0
- package/src/hooks/pr-body-guard.ts +38 -11
- package/src/hooks/pr-room-guard.ts +88 -0
- package/src/http/active-sessions.ts +13 -2
- package/src/http/agents.ts +11 -3
- package/src/http/all-routes.ts +1 -0
- package/src/http/api-keys.ts +3 -1
- package/src/http/approval-requests.ts +2 -1
- package/src/http/apps.ts +118 -190
- package/src/http/config.ts +3 -0
- package/src/http/context.ts +2 -0
- package/src/http/core.ts +39 -2
- package/src/http/events.ts +6 -2
- package/src/http/favorite-owner.ts +1 -1
- package/src/http/fleet-benchmark.ts +79 -30
- package/src/http/fs.ts +38 -3
- package/src/http/global-config.ts +7 -0
- package/src/http/index.ts +3 -1
- package/src/http/memory.ts +3 -1
- package/src/http/ranking.ts +351 -0
- package/src/http/realtime.ts +26 -21
- package/src/http/route-def.ts +77 -11
- package/src/http/script-runs.ts +2 -1
- package/src/http/scripts.ts +8 -0
- package/src/http/session-access.ts +179 -0
- package/src/http/session-data.ts +10 -2
- package/src/http/sessions.ts +212 -12
- package/src/http/stats.ts +7 -3
- package/src/http/tasks.ts +85 -8
- package/src/http/telemetry-ui.ts +1 -1
- package/src/http/used-by.ts +64 -20
- package/src/http/users.ts +2 -2
- package/src/prompts/session-templates.ts +3 -1
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/pi-mono-adapter.ts +15 -0
- package/src/providers/reasoning-effort.ts +2 -1
- package/src/providers/types.ts +2 -0
- package/src/ranking/telemetry-ranking.ts +119 -0
- package/src/ranking/usage.ts +57 -0
- package/src/rbac/admission.ts +22 -7
- package/src/rbac/legacy-policy.ts +2 -0
- package/src/rbac/permissions.ts +9 -0
- package/src/realtime/auth.ts +69 -0
- package/src/realtime/tickets.ts +4 -1
- package/src/realtime/transport.ts +77 -9
- package/src/scripts-runtime/sdk-allowlist.ts +7 -0
- package/src/scripts-runtime/types/stdlib.d.ts +31 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +31 -0
- package/src/server.ts +4 -0
- package/src/slack/blocks.ts +18 -0
- package/src/slack/dm.ts +29 -0
- package/src/telemetry-context.ts +19 -1
- package/src/telemetry-contract/EVENTS.md +45 -8
- package/src/telemetry-contract/SOURCE.json +38 -4
- package/src/telemetry-contract/catalog.json +294 -5
- package/src/telemetry-contract/ranking/fixtures/expected.json +30 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/bad-category.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/bad-claim.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/blank-description.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/blank-name.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/description-too-long.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/domain-uppercase.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/domain-with-scheme.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/domain-with-www.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/http-source-url.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/missing-description.json +10 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/missing-version.json +10 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/name-not-string.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/name-too-long.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/not-object.json +1 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/null.json +1 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/other-with-subcategory.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/oversize.json +1 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/short-claim.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/subcategory-other-category.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/trailing-data.json +1 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/unknown-field.json +12 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/unsupported-version.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/updated-at-not-date.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/updated-at-offset.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/invalid/wrong-case-field.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/valid/category-without-subcategory.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/valid/full.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/valid/minimal.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/valid/no-claim.json +10 -0
- package/src/telemetry-contract/ranking/fixtures/valid/padded-text.json +11 -0
- package/src/telemetry-contract/ranking/fixtures/valid/unicode-name.json +11 -0
- package/src/telemetry-contract/ranking/listing.v1.schema.json +61 -0
- package/src/telemetry-contract/ranking/taxonomy.json +8 -0
- package/src/telemetry-contract/ranking-taxonomy.gen.ts +11 -0
- package/src/telemetry-contract/types.gen.ts +963 -58
- package/src/telemetry-identity.ts +47 -9
- package/src/telemetry-snapshot.ts +9 -1
- package/src/telemetry-ui-events.ts +9 -2
- package/src/telemetry.ts +40 -5
- package/src/tests/app-action-run-tool.test.ts +178 -0
- package/src/tests/app-row-tools.test.ts +360 -0
- package/src/tests/apps-rbac.test.ts +189 -2
- package/src/tests/apps-script-types.test.ts +16 -3
- package/src/tests/credential-check.test.ts +38 -0
- package/src/tests/db-extraction-contract.test.ts +1 -0
- package/src/tests/db-task-read-contract.test.ts +1 -0
- package/src/tests/docs-index-footprint.test.js +2 -2
- package/src/tests/fleet-benchmark.test.ts +122 -2
- package/src/tests/http-users.test.ts +62 -1
- package/src/tests/model-catalog-table.test.ts +63 -0
- package/src/tests/model-profiles-api.test.ts +19 -7
- package/src/tests/models-catalog.test.ts +50 -0
- package/src/tests/onboarding.test.ts +21 -0
- package/src/tests/org-identity.test.ts +44 -0
- package/src/tests/org-website.test.ts +62 -0
- package/src/tests/pi-mono-adapter.test.ts +23 -0
- package/src/tests/pr-body-leaks.test.ts +4 -0
- package/src/tests/pr-room-guard.test.ts +242 -0
- package/src/tests/ranking-listing.test.ts +97 -0
- package/src/tests/ranking-route.test.ts +321 -0
- package/src/tests/ranking-usage.test.ts +50 -0
- package/src/tests/rbac-admission-e2e.test.ts +8 -0
- package/src/tests/rbac-admission.test.ts +38 -0
- package/src/tests/rbac-charact-http.test.ts +4 -3
- package/src/tests/rbac-engine.test.ts +2 -0
- package/src/tests/rbac-roles.test.ts +2 -0
- package/src/tests/realtime-room-surfaces.test.ts +3 -1
- package/src/tests/realtime-session-join-race.test.ts +142 -0
- package/src/tests/realtime-tickets.test.ts +24 -17
- package/src/tests/realtime-transport.test.ts +91 -0
- package/src/tests/reasoning-effort.test.ts +39 -3
- package/src/tests/runner-harness-telemetry-env.test.ts +56 -1
- package/src/tests/session-route-posture.test.ts +639 -0
- package/src/tests/session-sharing-routes.test.ts +282 -0
- package/src/tests/session-sharing.test.ts +526 -0
- package/src/tests/sessions-detail-batch.test.ts +7 -1
- package/src/tests/slack-tool-blocks.test.ts +101 -0
- package/src/tests/slack-update.test.ts +55 -0
- package/src/tests/slack-user-dm.test.ts +177 -0
- package/src/tests/swarm-tool-result-gate.test.ts +2 -4
- package/src/tests/telemetry-context.test.ts +128 -2
- package/src/tests/telemetry-ui-route.test.ts +123 -0
- package/src/tests/tool-annotations.test.ts +3 -2
- package/src/tests/used-by-route.test.ts +153 -9
- package/src/tests/workflow-agent-task-retry.test.ts +130 -4
- package/src/tests/workflow-wait-recovery.test.ts +116 -4
- package/src/tools/app-action-run.ts +63 -0
- package/src/tools/app-rows.ts +234 -0
- package/src/tools/model-catalog/index.ts +1 -1
- package/src/tools/slack-post.ts +18 -12
- package/src/tools/slack-read.ts +13 -1
- package/src/tools/slack-reply.ts +7 -10
- package/src/tools/slack-start-thread.ts +18 -11
- package/src/tools/slack-update.ts +2 -9
- package/src/tools/tool-config.ts +8 -0
- package/src/tools/utils.ts +1 -1
- package/src/tools/workflows/retry-workflow-run.ts +1 -1
- package/src/types.ts +52 -0
- package/src/utils/company-profile.ts +24 -0
- package/src/utils/org-identity.ts +33 -0
- package/src/utils/org-website.ts +58 -21
- package/src/workflows/recovery.ts +10 -22
- package/src/workflows/resume.ts +16 -0
- package/src/workflows/task-step-routing.ts +47 -7
- package/templates/skills/apps/SKILL.md +58 -2
- package/templates/skills/apps/content.md +58 -2
- package/dist/handlers-tb3xgjnm.js +0 -37
- package/dist/index-nyfcdpky.js +0 -39
- package/dist/index-vjn3wbzf.js +0 -38
- package/dist/lead-61kqp604.js +0 -76
- package/dist/worker-4ptnn1ge.js +0 -76
- package/dist/{cli-n5mrsg0f.js → cli-60cgh1rv.js} +3 -3
package/src/be/db.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import { realtimeBus } from "../realtime/bus";
|
|
11
11
|
import { slackChannelFromContextKey } from "../tasks/slack-routing";
|
|
12
12
|
import { _resolveIntegrationType, emitIntegrationConnected, telemetry } from "../telemetry";
|
|
13
|
-
import { scheduleOrgDomainRecompute } from "../telemetry-identity";
|
|
13
|
+
import { invalidateTelemetryUserRole, scheduleOrgDomainRecompute } from "../telemetry-identity";
|
|
14
14
|
import {
|
|
15
15
|
emitTaskTelemetry,
|
|
16
16
|
type TaskTelemetryEvent,
|
|
@@ -195,6 +195,7 @@ import {
|
|
|
195
195
|
} from "./db/context-versions";
|
|
196
196
|
import { clearAgentModelProfileOnOverrideChange } from "./db/model-profiles";
|
|
197
197
|
import { getDb, getDbClient } from "./db/runtime";
|
|
198
|
+
import { type SessionViewer, sessionViewerCondition } from "./db/session-visibility";
|
|
198
199
|
import { classifyTaskHumanFree, reclassifyTaskHumanFree } from "./db/tasks/human-free";
|
|
199
200
|
import {
|
|
200
201
|
type AgentTaskRow,
|
|
@@ -203,6 +204,7 @@ import {
|
|
|
203
204
|
findExistingLinearTrackerContextWork,
|
|
204
205
|
getTaskById,
|
|
205
206
|
getTasksByAgentId,
|
|
207
|
+
readableSessionCondition,
|
|
206
208
|
rowToAgentTask,
|
|
207
209
|
rowToAgentTaskSummary,
|
|
208
210
|
} from "./db/tasks/read";
|
|
@@ -2081,13 +2083,17 @@ export async function getPendingSteeringForTask(taskId: string): Promise<Steerin
|
|
|
2081
2083
|
return await getSteeringMessagesForTask(taskId, { status: "pending" });
|
|
2082
2084
|
}
|
|
2083
2085
|
|
|
2084
|
-
export async function getPendingSteeringForAgent(
|
|
2086
|
+
export async function getPendingSteeringForAgent(
|
|
2087
|
+
agentId: string,
|
|
2088
|
+
readableBy?: { userId: string | null },
|
|
2089
|
+
): Promise<SteeringMessage[]> {
|
|
2090
|
+
const readable = readableBy ? readableSessionCondition(readableBy.userId, "t.id") : undefined;
|
|
2085
2091
|
const rows = await getDbClient().query<TaskSteeringMessageRow>(
|
|
2086
2092
|
`${STEERING_MESSAGE_SELECT}
|
|
2087
2093
|
JOIN agent_tasks t ON t.id = m.task_id
|
|
2088
|
-
WHERE t.agentId = ? AND m.status = 'pending'
|
|
2094
|
+
WHERE t.agentId = ? AND m.status = 'pending'${readable ? ` AND ${readable.sql}` : ""}
|
|
2089
2095
|
ORDER BY m.created_at ASC, m.rowid ASC`,
|
|
2090
|
-
[agentId],
|
|
2096
|
+
[agentId, ...(readable?.params ?? [])],
|
|
2091
2097
|
);
|
|
2092
2098
|
return rows.map(rowToSteeringMessage);
|
|
2093
2099
|
}
|
|
@@ -2185,27 +2191,33 @@ export async function hasPendingSteering(taskId: string): Promise<boolean> {
|
|
|
2185
2191
|
// Combined Queries (Agent with Tasks)
|
|
2186
2192
|
// ============================================================================
|
|
2187
2193
|
|
|
2188
|
-
export async function getAgentWithTasks(
|
|
2194
|
+
export async function getAgentWithTasks(
|
|
2195
|
+
id: string,
|
|
2196
|
+
readableBy?: { userId: string | null },
|
|
2197
|
+
): Promise<AgentWithTasks | null> {
|
|
2189
2198
|
return await getDbClient().transaction(
|
|
2190
2199
|
async () => {
|
|
2191
2200
|
const agent = await getAgentById(id);
|
|
2192
2201
|
if (!agent) return null;
|
|
2193
2202
|
|
|
2194
|
-
const tasks = await getTasksByAgentId(id);
|
|
2203
|
+
const tasks = await getTasksByAgentId(id, readableBy);
|
|
2195
2204
|
return { ...agent, tasks };
|
|
2196
2205
|
},
|
|
2197
2206
|
{ readOnly: true },
|
|
2198
2207
|
);
|
|
2199
2208
|
}
|
|
2200
2209
|
|
|
2201
|
-
export async function getAllAgentsWithTasks(opts?: {
|
|
2210
|
+
export async function getAllAgentsWithTasks(opts?: {
|
|
2211
|
+
slim?: boolean;
|
|
2212
|
+
readableBy?: { userId: string | null };
|
|
2213
|
+
}): Promise<AgentWithTasks[]> {
|
|
2202
2214
|
return await getDbClient().transaction(
|
|
2203
2215
|
async () => {
|
|
2204
2216
|
const agents = await getAllAgents({ slim: opts?.slim ?? false });
|
|
2205
2217
|
return await Promise.all(
|
|
2206
2218
|
agents.map(async (agent) => ({
|
|
2207
2219
|
...agent,
|
|
2208
|
-
tasks: await getTasksByAgentId(agent.id),
|
|
2220
|
+
tasks: await getTasksByAgentId(agent.id, opts?.readableBy),
|
|
2209
2221
|
})),
|
|
2210
2222
|
);
|
|
2211
2223
|
},
|
|
@@ -2268,10 +2280,16 @@ export async function createLogEntry(entry: {
|
|
|
2268
2280
|
return rowToAgentLog(row);
|
|
2269
2281
|
}
|
|
2270
2282
|
|
|
2271
|
-
export async function getLogsByAgentId(
|
|
2283
|
+
export async function getLogsByAgentId(
|
|
2284
|
+
agentId: string,
|
|
2285
|
+
readableBy?: { userId: string | null },
|
|
2286
|
+
): Promise<AgentLog[]> {
|
|
2287
|
+
const readable = readableBy
|
|
2288
|
+
? readableSessionCondition(readableBy.userId, "agent_log.taskId", { nullable: true })
|
|
2289
|
+
: undefined;
|
|
2272
2290
|
const rows = await getDbClient().query<AgentLogRow>(
|
|
2273
|
-
|
|
2274
|
-
[agentId],
|
|
2291
|
+
`SELECT * FROM agent_log WHERE agentId = ?${readable ? ` AND ${readable.sql}` : ""} ORDER BY createdAt DESC`,
|
|
2292
|
+
[agentId, ...(readable?.params ?? [])],
|
|
2275
2293
|
);
|
|
2276
2294
|
return rows.map(rowToAgentLog);
|
|
2277
2295
|
}
|
|
@@ -2315,16 +2333,24 @@ export async function getLogsByEventType(eventType: AgentLogEventType): Promise<
|
|
|
2315
2333
|
return rows.map(rowToAgentLog);
|
|
2316
2334
|
}
|
|
2317
2335
|
|
|
2318
|
-
export async function getAllLogs(
|
|
2336
|
+
export async function getAllLogs(
|
|
2337
|
+
limit?: number,
|
|
2338
|
+
readableBy?: { userId: string | null },
|
|
2339
|
+
): Promise<AgentLog[]> {
|
|
2340
|
+
const readable = readableBy
|
|
2341
|
+
? readableSessionCondition(readableBy.userId, "agent_log.taskId", { nullable: true })
|
|
2342
|
+
: undefined;
|
|
2343
|
+
const readableParams = readable?.params ?? [];
|
|
2319
2344
|
if (limit) {
|
|
2320
2345
|
const rows = await getDbClient().query<AgentLogRow>(
|
|
2321
|
-
|
|
2322
|
-
[limit],
|
|
2346
|
+
`SELECT * FROM agent_log WHERE eventType != 'agent_status_change'${readable ? ` AND ${readable.sql}` : ""} ORDER BY createdAt DESC LIMIT ?`,
|
|
2347
|
+
[...readableParams, limit],
|
|
2323
2348
|
);
|
|
2324
2349
|
return rows.map(rowToAgentLog);
|
|
2325
2350
|
}
|
|
2326
2351
|
const rows = await getDbClient().query<AgentLogRow>(
|
|
2327
|
-
|
|
2352
|
+
`SELECT * FROM agent_log${readable ? ` WHERE ${readable.sql}` : ""} ORDER BY createdAt DESC`,
|
|
2353
|
+
readableParams,
|
|
2328
2354
|
);
|
|
2329
2355
|
return rows.map(rowToAgentLog);
|
|
2330
2356
|
}
|
|
@@ -5820,8 +5846,13 @@ export interface ConcurrentContext {
|
|
|
5820
5846
|
* Returns processing inbox messages, recent task delegations by leads,
|
|
5821
5847
|
* and currently active (in-progress) tasks across the swarm.
|
|
5822
5848
|
*/
|
|
5823
|
-
export async function getConcurrentContext(
|
|
5849
|
+
export async function getConcurrentContext(readableBy?: {
|
|
5850
|
+
userId: string | null;
|
|
5851
|
+
}): Promise<ConcurrentContext> {
|
|
5824
5852
|
const client = getDbClient();
|
|
5853
|
+
const readable = readableBy ? readableSessionCondition(readableBy.userId, "t.id") : undefined;
|
|
5854
|
+
const readableSql = readable ? ` AND ${readable.sql}` : "";
|
|
5855
|
+
const readableParams = readable?.params ?? [];
|
|
5825
5856
|
|
|
5826
5857
|
// 1. Inbox messages currently being processed (status = 'processing')
|
|
5827
5858
|
const processingInboxMessages = await client.query<{
|
|
@@ -5850,9 +5881,9 @@ export async function getConcurrentContext(): Promise<ConcurrentContext> {
|
|
|
5850
5881
|
FROM agent_tasks t
|
|
5851
5882
|
LEFT JOIN agents a ON t.agentId = a.id
|
|
5852
5883
|
WHERE t.createdAt > ?
|
|
5853
|
-
AND t.creatorAgentId IN (SELECT id FROM agents WHERE isLead = 1)
|
|
5884
|
+
AND t.creatorAgentId IN (SELECT id FROM agents WHERE isLead = 1)${readableSql}
|
|
5854
5885
|
ORDER BY t.createdAt DESC`,
|
|
5855
|
-
[fiveMinutesAgo],
|
|
5886
|
+
[fiveMinutesAgo, ...readableParams],
|
|
5856
5887
|
);
|
|
5857
5888
|
|
|
5858
5889
|
// 3. Currently in-progress tasks across the swarm
|
|
@@ -5868,8 +5899,9 @@ export async function getConcurrentContext(): Promise<ConcurrentContext> {
|
|
|
5868
5899
|
`SELECT t.id, t.task, t.agentId, a.name as agentName, t.status, t.createdAt, t.progress
|
|
5869
5900
|
FROM agent_tasks t
|
|
5870
5901
|
LEFT JOIN agents a ON t.agentId = a.id
|
|
5871
|
-
WHERE t.status = 'in_progress'
|
|
5902
|
+
WHERE t.status = 'in_progress'${readableSql}
|
|
5872
5903
|
ORDER BY t.createdAt DESC`,
|
|
5904
|
+
readableParams,
|
|
5873
5905
|
);
|
|
5874
5906
|
|
|
5875
5907
|
return {
|
|
@@ -7157,15 +7189,27 @@ export async function deleteActiveSessionById(id: string): Promise<boolean> {
|
|
|
7157
7189
|
return result.changes > 0;
|
|
7158
7190
|
}
|
|
7159
7191
|
|
|
7160
|
-
export async function getActiveSessions(
|
|
7192
|
+
export async function getActiveSessions(
|
|
7193
|
+
agentId?: string,
|
|
7194
|
+
readableBy?: { userId: string | null },
|
|
7195
|
+
): Promise<ActiveSession[]> {
|
|
7196
|
+
const conditions: string[] = [];
|
|
7197
|
+
const params: string[] = [];
|
|
7161
7198
|
if (agentId) {
|
|
7162
|
-
|
|
7163
|
-
|
|
7164
|
-
|
|
7165
|
-
|
|
7199
|
+
conditions.push("agentId = ?");
|
|
7200
|
+
params.push(agentId);
|
|
7201
|
+
}
|
|
7202
|
+
if (readableBy) {
|
|
7203
|
+
const readable = readableSessionCondition(readableBy.userId, "active_sessions.taskId", {
|
|
7204
|
+
nullable: true,
|
|
7205
|
+
});
|
|
7206
|
+
conditions.push(readable.sql);
|
|
7207
|
+
params.push(...readable.params);
|
|
7166
7208
|
}
|
|
7209
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
7167
7210
|
return await getDbClient().query<ActiveSession>(
|
|
7168
|
-
|
|
7211
|
+
`SELECT * FROM active_sessions ${where} ORDER BY startedAt DESC`,
|
|
7212
|
+
params,
|
|
7169
7213
|
);
|
|
7170
7214
|
}
|
|
7171
7215
|
|
|
@@ -12310,7 +12354,7 @@ export async function updateUser(
|
|
|
12310
12354
|
id: string,
|
|
12311
12355
|
data: Partial<{
|
|
12312
12356
|
name: string;
|
|
12313
|
-
email: string;
|
|
12357
|
+
email: string | null;
|
|
12314
12358
|
role: string;
|
|
12315
12359
|
notes: string;
|
|
12316
12360
|
emailAliases: string[];
|
|
@@ -12375,7 +12419,12 @@ export async function updateUser(
|
|
|
12375
12419
|
`UPDATE users SET ${sets.join(", ")} WHERE id = ? RETURNING *`,
|
|
12376
12420
|
params,
|
|
12377
12421
|
);
|
|
12378
|
-
if (row)
|
|
12422
|
+
if (row) {
|
|
12423
|
+
getDbClient().afterCommit(() => {
|
|
12424
|
+
invalidateTelemetryUserRole(id);
|
|
12425
|
+
scheduleOrgDomainRecompute();
|
|
12426
|
+
});
|
|
12427
|
+
}
|
|
12379
12428
|
return row ? rowToUser(row) : null;
|
|
12380
12429
|
}
|
|
12381
12430
|
|
|
@@ -12512,7 +12561,12 @@ export async function deleteUser(id: string, replacementUserId?: string): Promis
|
|
|
12512
12561
|
await reclassifyTaskHumanFree(reclassifySeedIds);
|
|
12513
12562
|
|
|
12514
12563
|
const result = await tx.run("DELETE FROM users WHERE id = ?", [id]);
|
|
12515
|
-
if (result.changes > 0)
|
|
12564
|
+
if (result.changes > 0) {
|
|
12565
|
+
getDbClient().afterCommit(() => {
|
|
12566
|
+
invalidateTelemetryUserRole(id);
|
|
12567
|
+
scheduleOrgDomainRecompute();
|
|
12568
|
+
});
|
|
12569
|
+
}
|
|
12516
12570
|
return result.changes > 0;
|
|
12517
12571
|
});
|
|
12518
12572
|
}
|
|
@@ -12905,6 +12959,8 @@ interface ListRecentSessionsOpts {
|
|
|
12905
12959
|
contextKeyPrefix?: string;
|
|
12906
12960
|
/** When true, return slim `SessionListItemSummary` rows (default: full). */
|
|
12907
12961
|
slim?: boolean;
|
|
12962
|
+
/** Restrict to sessions this viewer may open (session sharing). */
|
|
12963
|
+
viewer?: SessionViewer;
|
|
12908
12964
|
}
|
|
12909
12965
|
|
|
12910
12966
|
export async function listRecentSessions(
|
|
@@ -12923,7 +12979,7 @@ export async function listRecentSessions(
|
|
|
12923
12979
|
const requestedByUserId = opts?.requestedByUserId?.trim() || undefined;
|
|
12924
12980
|
|
|
12925
12981
|
const conditions: string[] = ["r.parentTaskId IS NULL"];
|
|
12926
|
-
const params: (string | number)[] = [];
|
|
12982
|
+
const params: (string | number | null)[] = [];
|
|
12927
12983
|
|
|
12928
12984
|
if (sources.length > 0) {
|
|
12929
12985
|
conditions.push(`r.source IN (${sources.map(() => "?").join(", ")})`);
|
|
@@ -12942,6 +12998,11 @@ export async function listRecentSessions(
|
|
|
12942
12998
|
conditions.push(`r.contextKey LIKE ? ESCAPE '\\'`);
|
|
12943
12999
|
params.push(literalPrefixPattern(opts.contextKeyPrefix));
|
|
12944
13000
|
}
|
|
13001
|
+
if (opts?.viewer) {
|
|
13002
|
+
const viewer = sessionViewerCondition(opts.viewer);
|
|
13003
|
+
conditions.push(viewer.sql);
|
|
13004
|
+
params.push(...viewer.params);
|
|
13005
|
+
}
|
|
12945
13006
|
params.push(limit, offset);
|
|
12946
13007
|
|
|
12947
13008
|
const rootRows = await getDbClient().query<
|
|
@@ -13013,35 +13074,43 @@ export async function listRecentSessions(
|
|
|
13013
13074
|
* a plain count, no recursive chain walk needed.
|
|
13014
13075
|
*/
|
|
13015
13076
|
export async function countSessions(
|
|
13016
|
-
opts?: Pick<
|
|
13077
|
+
opts?: Pick<
|
|
13078
|
+
ListRecentSessionsOpts,
|
|
13079
|
+
"source" | "q" | "requestedByUserId" | "contextKeyPrefix" | "viewer"
|
|
13080
|
+
>,
|
|
13017
13081
|
): Promise<number> {
|
|
13018
13082
|
const sources = opts?.source?.filter((s) => s.length > 0) ?? [];
|
|
13019
13083
|
const q = opts?.q?.trim();
|
|
13020
13084
|
const requestedByUserId = opts?.requestedByUserId?.trim() || undefined;
|
|
13021
13085
|
|
|
13022
|
-
const conditions: string[] = ["parentTaskId IS NULL"];
|
|
13023
|
-
const params: string[] = [];
|
|
13086
|
+
const conditions: string[] = ["r.parentTaskId IS NULL"];
|
|
13087
|
+
const params: (string | null)[] = [];
|
|
13024
13088
|
|
|
13025
13089
|
if (sources.length > 0) {
|
|
13026
|
-
conditions.push(`source IN (${sources.map(() => "?").join(", ")})`);
|
|
13090
|
+
conditions.push(`r.source IN (${sources.map(() => "?").join(", ")})`);
|
|
13027
13091
|
params.push(...sources);
|
|
13028
13092
|
}
|
|
13029
13093
|
if (q && q.length > 0) {
|
|
13030
|
-
conditions.push("(lower(task) LIKE ? OR lower(COALESCE(title, '')) LIKE ?)");
|
|
13094
|
+
conditions.push("(lower(r.task) LIKE ? OR lower(COALESCE(r.title, '')) LIKE ?)");
|
|
13031
13095
|
const like = `%${q.toLowerCase()}%`;
|
|
13032
13096
|
params.push(like, like);
|
|
13033
13097
|
}
|
|
13034
13098
|
if (requestedByUserId) {
|
|
13035
|
-
conditions.push("requestedByUserId = ?");
|
|
13099
|
+
conditions.push("r.requestedByUserId = ?");
|
|
13036
13100
|
params.push(requestedByUserId);
|
|
13037
13101
|
}
|
|
13038
13102
|
if (opts?.contextKeyPrefix) {
|
|
13039
|
-
conditions.push(`contextKey LIKE ? ESCAPE '\\'`);
|
|
13103
|
+
conditions.push(`r.contextKey LIKE ? ESCAPE '\\'`);
|
|
13040
13104
|
params.push(literalPrefixPattern(opts.contextKeyPrefix));
|
|
13041
13105
|
}
|
|
13106
|
+
if (opts?.viewer) {
|
|
13107
|
+
const viewer = sessionViewerCondition(opts.viewer);
|
|
13108
|
+
conditions.push(viewer.sql);
|
|
13109
|
+
params.push(...viewer.params);
|
|
13110
|
+
}
|
|
13042
13111
|
|
|
13043
13112
|
const row = await getDbClient().get<{ count: number }>(
|
|
13044
|
-
`SELECT COUNT(*) AS count FROM agent_tasks WHERE ${conditions.join(" AND ")}`,
|
|
13113
|
+
`SELECT COUNT(*) AS count FROM agent_tasks r WHERE ${conditions.join(" AND ")}`,
|
|
13045
13114
|
params,
|
|
13046
13115
|
);
|
|
13047
13116
|
return row?.count ?? 0;
|
package/src/be/events.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EventCategory, EventName, EventSource, EventStatus, SwarmEvent } from "../types";
|
|
2
2
|
import { type ScrubbedText, scrubObject, scrubSecrets } from "../utils/secret-scrubber";
|
|
3
3
|
import { getDbClient } from "./db";
|
|
4
|
+
import { readableSessionCondition } from "./db/tasks/read";
|
|
4
5
|
import type { DbExecutor } from "./db-client";
|
|
5
6
|
import { breaksJsonValidity } from "./scrub-json";
|
|
6
7
|
import { recordSkillInvocation } from "./skill-invocations";
|
|
@@ -262,10 +263,20 @@ export async function getEventsFiltered(filters: {
|
|
|
262
263
|
* the agent's event history.
|
|
263
264
|
*/
|
|
264
265
|
latestPerDataField?: { events: EventName[]; dataFields: string[] };
|
|
266
|
+
/** Only events outside sessions this user may not read; `userId: null` is a guest. */
|
|
267
|
+
readableBy?: { userId: string | null };
|
|
265
268
|
}): Promise<SwarmEvent[]> {
|
|
266
269
|
const conditions: string[] = [];
|
|
267
270
|
const params: (string | number)[] = [];
|
|
268
271
|
|
|
272
|
+
if (filters.readableBy) {
|
|
273
|
+
const readable = readableSessionCondition(filters.readableBy.userId, "events.taskId", {
|
|
274
|
+
nullable: true,
|
|
275
|
+
});
|
|
276
|
+
conditions.push(readable.sql);
|
|
277
|
+
params.push(...readable.params);
|
|
278
|
+
}
|
|
279
|
+
|
|
269
280
|
if (filters.category) {
|
|
270
281
|
conditions.push("category = ?");
|
|
271
282
|
params.push(filters.category);
|
|
@@ -5,15 +5,20 @@
|
|
|
5
5
|
* registered agent count (the same count `org.snapshot` reports as
|
|
6
6
|
* `agents_total`).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Comparisons require a known ingest start. With telemetry off, callers can
|
|
9
|
+
* use the local 30-day window without an ingest anchor.
|
|
10
10
|
*/
|
|
11
|
-
import { fleetCountStart, type LocalFleetStats } from "../fleet-benchmark";
|
|
11
|
+
import { FLEET_WINDOW_DAYS, fleetCountStart, type LocalFleetStats } from "../fleet-benchmark";
|
|
12
12
|
import { getDbClient } from "./db/runtime";
|
|
13
13
|
import { getTelemetryIngestAnchor } from "./telemetry-ingest-anchor";
|
|
14
14
|
|
|
15
|
-
export async function getLocalFleetStats(
|
|
16
|
-
|
|
15
|
+
export async function getLocalFleetStats(
|
|
16
|
+
now = new Date(),
|
|
17
|
+
{ requireIngestAnchor = true } = {},
|
|
18
|
+
): Promise<LocalFleetStats | null> {
|
|
19
|
+
const start = requireIngestAnchor
|
|
20
|
+
? fleetCountStart(await getTelemetryIngestAnchor(), now)
|
|
21
|
+
: new Date(now.getTime() - FLEET_WINDOW_DAYS * 86_400_000);
|
|
17
22
|
if (!start) return null;
|
|
18
23
|
const since = start.toISOString();
|
|
19
24
|
const client = getDbClient();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- Session sharing. A session is a root task (parentTaskId IS NULL) plus its
|
|
2
|
+
-- descendants. A root with no active row stays private to its owner
|
|
3
|
+
-- (agent_tasks.requestedByUserId); a root with no owner stays open to all.
|
|
4
|
+
--
|
|
5
|
+
-- Rows are never deleted: revoking sets revokedAt/revokedBy, and an access
|
|
6
|
+
-- change revokes the active row and inserts a new one in one transaction, so
|
|
7
|
+
-- every row for a root is its share history. userId NULL means everyone.
|
|
8
|
+
CREATE TABLE session_shares (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
rootTaskId TEXT NOT NULL REFERENCES agent_tasks(id) ON DELETE CASCADE,
|
|
11
|
+
userId TEXT REFERENCES users(id),
|
|
12
|
+
access TEXT NOT NULL CHECK (access IN ('read', 'write')),
|
|
13
|
+
createdAt TEXT NOT NULL,
|
|
14
|
+
revokedAt TEXT,
|
|
15
|
+
revokedBy TEXT REFERENCES users(id),
|
|
16
|
+
created_by TEXT REFERENCES users(id),
|
|
17
|
+
updated_by TEXT REFERENCES users(id)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
-- At most one active row per (root, target); revoked rows pile up beside it.
|
|
21
|
+
CREATE UNIQUE INDEX session_shares_active
|
|
22
|
+
ON session_shares(rootTaskId, COALESCE(userId, '*')) WHERE revokedAt IS NULL;
|
|
23
|
+
CREATE INDEX session_shares_user ON session_shares(userId) WHERE revokedAt IS NULL;
|
package/src/be/models-catalog.ts
CHANGED
|
@@ -27,6 +27,10 @@ export const CATALOG_PROVIDER_IDS = [
|
|
|
27
27
|
"openai",
|
|
28
28
|
"amazon-bedrock",
|
|
29
29
|
"opencode",
|
|
30
|
+
// OpenCode Go is opencode's first-party subscription provider, a sibling of
|
|
31
|
+
// its Zen section (`opencode`). models.dev lists it, so projecting it gives
|
|
32
|
+
// `opencode-go/<model>` ids their context window and reasoning facts.
|
|
33
|
+
"opencode-go",
|
|
30
34
|
...openAICompatibleProviderIds(),
|
|
31
35
|
] as const;
|
|
32
36
|
|
package/src/be/onboarding.ts
CHANGED
|
@@ -498,6 +498,12 @@ function deriveState(
|
|
|
498
498
|
if (state.steps.connect.status !== "done") {
|
|
499
499
|
changed = completeStep(state, "connect", "api_key", true, events) || changed;
|
|
500
500
|
}
|
|
501
|
+
// A name saved anywhere (setup, the org-name popup, Settings, the API) names
|
|
502
|
+
// the swarm. The old setup default "Your Swarm" does not count.
|
|
503
|
+
const orgName = process.env.SWARM_ORG_NAME?.trim();
|
|
504
|
+
if (state.steps.name.status !== "done" && orgName && orgName !== "Your Swarm") {
|
|
505
|
+
changed = completeStep(state, "name", "custom_name", true, events) || changed;
|
|
506
|
+
}
|
|
501
507
|
if (
|
|
502
508
|
state.steps.ai.status !== "done" &&
|
|
503
509
|
signals.providers.some((entry) => entry.state === "verified")
|
package/src/be/rbac-roles.ts
CHANGED
|
@@ -419,6 +419,19 @@ export interface SwarmSdk {
|
|
|
419
419
|
query: string;
|
|
420
420
|
params?: Record<string, string | number | boolean>;
|
|
421
421
|
}): Promise<unknown>;
|
|
422
|
+
app_rows_list(args: {
|
|
423
|
+
appId: string;
|
|
424
|
+
model: string;
|
|
425
|
+
equals?: Record<string, string | number | boolean>;
|
|
426
|
+
sort?: \`\${string}:asc\` | \`\${string}:desc\`;
|
|
427
|
+
limit?: number;
|
|
428
|
+
}): Promise<unknown>;
|
|
429
|
+
app_row_get(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
|
|
430
|
+
app_row_create(args: { appId: string; model: string; values: Record<string, unknown> }): Promise<unknown>;
|
|
431
|
+
app_rows_create(args: { appId: string; model: string; rows: Record<string, unknown>[] }): Promise<unknown>;
|
|
432
|
+
app_row_patch(args: { appId: string; model: string; rowId: string; values: Record<string, unknown> }): Promise<unknown>;
|
|
433
|
+
app_row_delete(args: { appId: string; model: string; rowId: string }): Promise<unknown>;
|
|
434
|
+
app_rows_delete(args: { appId: string; model: string; equals: Record<string, string | number | boolean>; limit?: number }): Promise<unknown>;
|
|
422
435
|
app_rollback(args: {
|
|
423
436
|
appId: string;
|
|
424
437
|
version: number;
|