@maudecode/talaria-web 1.20.0 → 1.22.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/_release.json +8 -8
- package/dist/api/automation-router.d.ts +319 -14
- package/dist/api/automation-router.js +21 -1
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +615 -69
- package/dist/api/chat-router.js +22 -170
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +50 -0
- package/dist/api/git-router.js +17 -4
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/groups-router.d.ts +764 -0
- package/dist/api/groups-router.js +79 -0
- package/dist/api/groups-router.js.map +1 -0
- package/dist/api/raw-routes.js +3 -1
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +1 -1
- package/dist/api/sessions-router.d.ts +1675 -167
- package/dist/api/sessions-router.js +67 -53
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +911 -1
- package/dist/api/settings-router.js +53 -2
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +1 -1
- package/dist/api/sse-routes.js +15 -5
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.js +27 -136
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +588 -51
- package/dist/api/tools-router.js +98 -16
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.js +5 -1
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +5 -1
- package/dist/auth/gate.js.map +1 -1
- package/dist/config/agent-config.d.ts +6 -1
- package/dist/config/agent-config.js +75 -3
- package/dist/config/agent-config.js.map +1 -1
- package/dist/feedback.d.ts +18 -0
- package/dist/feedback.js +145 -0
- package/dist/feedback.js.map +1 -0
- package/dist/fs/stat.d.ts +2 -0
- package/dist/fs/stat.js +4 -0
- package/dist/fs/stat.js.map +1 -1
- package/dist/http/context.d.ts +9 -0
- package/dist/http/context.js +0 -6
- package/dist/http/context.js.map +1 -1
- package/dist/http/pinned.js +19 -8
- package/dist/http/pinned.js.map +1 -1
- package/dist/providers/catalog.d.ts +9 -1
- package/dist/providers/catalog.js +86 -6
- package/dist/providers/catalog.js.map +1 -1
- package/dist/redact.d.ts +2 -0
- package/dist/redact.js +26 -5
- package/dist/redact.js.map +1 -1
- package/dist/runtime.js +62 -11
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/admission.d.ts +21 -0
- package/dist/sessions/admission.js +176 -0
- package/dist/sessions/admission.js.map +1 -0
- package/dist/sessions/anchor.d.ts +5 -2
- package/dist/sessions/anchor.js +14 -13
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +19 -1
- package/dist/sessions/background-tasks.js +36 -6
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/cli-sessions.js +11 -6
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/compress.d.ts +10 -9
- package/dist/sessions/compress.js +31 -20
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/events.d.ts +3 -0
- package/dist/sessions/events.js +4 -0
- package/dist/sessions/events.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +61 -2
- package/dist/sessions/gateway-sessions.js +223 -35
- package/dist/sessions/gateway-sessions.js.map +1 -1
- package/dist/sessions/gateway-watcher.js +8 -4
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/groups.d.ts +60 -0
- package/dist/sessions/groups.js +339 -0
- package/dist/sessions/groups.js.map +1 -0
- package/dist/sessions/list.d.ts +7 -2
- package/dist/sessions/list.js +13 -4
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +15 -5
- package/dist/sessions/merge.js +49 -15
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/pending.d.ts +1 -1
- package/dist/sessions/pending.js +15 -6
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +9 -14
- package/dist/sessions/prefix-index.js +14 -52
- package/dist/sessions/prefix-index.js.map +1 -1
- package/dist/sessions/prompt-queues.d.ts +36 -0
- package/dist/sessions/prompt-queues.js +318 -0
- package/dist/sessions/prompt-queues.js.map +1 -0
- package/dist/sessions/reasoning-display.d.ts +2 -0
- package/dist/sessions/reasoning-display.js +31 -0
- package/dist/sessions/reasoning-display.js.map +1 -0
- package/dist/sessions/relay.d.ts +16 -2
- package/dist/sessions/relay.js +119 -24
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +33 -3
- package/dist/sessions/service.js +304 -70
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +6 -0
- package/dist/sessions/session.js +14 -0
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.d.ts +1 -1
- package/dist/sessions/shares.js +13 -4
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/state-db.d.ts +2 -1
- package/dist/sessions/state-db.js +7 -3
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/storage/json-documents.js +3 -0
- package/dist/sessions/storage/json-documents.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -0
- package/dist/sessions/store.js +11 -3
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +4 -0
- package/dist/sessions/streams.js +12 -0
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/todo.js +10 -1
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +8 -1
- package/dist/sessions/tool-display.js +39 -4
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn.d.ts +4 -1
- package/dist/sessions/turn.js +53 -22
- package/dist/sessions/turn.js.map +1 -1
- package/dist/settings.js +2 -1
- package/dist/settings.js.map +1 -1
- package/dist/spa.js +1 -1
- package/dist/spa.js.map +1 -1
- package/dist/test/group-fixture.d.ts +66 -0
- package/dist/test/group-fixture.js +89 -0
- package/dist/test/group-fixture.js.map +1 -0
- package/dist/test/harness.d.ts +3 -0
- package/dist/test/harness.js +3 -0
- package/dist/test/harness.js.map +1 -1
- package/dist/tools/connectors.d.ts +9 -1
- package/dist/tools/connectors.js +48 -0
- package/dist/tools/connectors.js.map +1 -1
- package/dist/tools/kanban.d.ts +10 -1
- package/dist/tools/kanban.js +73 -1
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp.d.ts +3 -1
- package/dist/tools/mcp.js +73 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory.d.ts +28 -0
- package/dist/tools/memory.js +120 -14
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/skills.d.ts +6 -0
- package/dist/tools/skills.js +17 -0
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +12 -10
- package/dist/tools/update-notifications.js +124 -14
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/updates.d.ts +38 -12
- package/dist/tools/updates.js +180 -44
- package/dist/tools/updates.js.map +1 -1
- package/dist/workspace/fs.d.ts +2 -0
- package/dist/workspace/fs.js +63 -1
- package/dist/workspace/fs.js.map +1 -1
- package/dist/workspace/managed-buffers.d.ts +58 -0
- package/dist/workspace/managed-buffers.js +76 -0
- package/dist/workspace/managed-buffers.js.map +1 -0
- package/dist/workspace/rollback.js +1 -1
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/upload.d.ts +1 -1
- package/dist/workspace/upload.js +52 -37
- package/dist/workspace/upload.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +5 -1
- package/dist/workspace/workspaces.js +32 -6
- package/dist/workspace/workspaces.js.map +1 -1
- package/package.json +2 -2
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_importer.json +8 -0
- package/sidecar/agent_support.json +20 -8
- package/sidecar/scripts/agent_importer_contract.py +19 -0
- package/sidecar/scripts/test.sh +3 -1
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/agent_mutation.py +87 -9
- package/sidecar/talaria_sidecar/agent_services.py +83 -23
- package/sidecar/talaria_sidecar/home.py +12 -5
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/agent_imports.py +346 -0
- package/sidecar/talaria_sidecar/methods/chat.py +141 -58
- package/sidecar/talaria_sidecar/methods/commands.py +6 -4
- package/sidecar/talaria_sidecar/methods/config.py +8 -3
- package/sidecar/talaria_sidecar/methods/connectors.py +138 -4
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +25 -4
- package/sidecar/talaria_sidecar/methods/delegation.py +126 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +5 -0
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +142 -23
- package/sidecar/talaria_sidecar/methods/groups.py +120 -0
- package/sidecar/talaria_sidecar/methods/kanban.py +48 -0
- package/sidecar/talaria_sidecar/methods/managed_buffers.py +110 -0
- package/sidecar/talaria_sidecar/methods/mcp.py +55 -0
- package/sidecar/talaria_sidecar/methods/memory.py +27 -3
- package/sidecar/talaria_sidecar/methods/nous_account.py +130 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +25 -4
- package/sidecar/talaria_sidecar/methods/outbound_drafts.py +147 -0
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +73 -2
- package/sidecar/talaria_sidecar/methods/providers.py +51 -1
- package/sidecar/talaria_sidecar/methods/skill_revisions.py +177 -0
- package/sidecar/talaria_sidecar/methods/skills.py +10 -0
- package/sidecar/talaria_sidecar/methods/tts.py +67 -0
- package/sidecar/talaria_sidecar/rpc.py +11 -2
- package/static/dist/FILES.txt +155 -144
- package/static/dist/THIRD_PARTY_LICENSES.md +1 -1
- package/static/dist/assets/AppShell-hvysbd9x.js +8 -0
- package/static/dist/assets/Button-dlsibkzq.js +1 -0
- package/static/dist/assets/ChatPage-jikwrwfd.js +2 -0
- package/static/dist/assets/Composer-mnke8ss2.js +5 -0
- package/static/dist/assets/ConnectTargets-ejplzo4q.js +1 -0
- package/static/dist/assets/Dialog-rksfyyq5.js +1 -0
- package/static/dist/assets/{ExtensionRoute-zrhjn0wm.js → ExtensionRoute-igk5h0rj.js} +1 -1
- package/static/dist/assets/HubRoute-eooassx4.js +2 -0
- package/static/dist/assets/Markdown-m5pzgvtx.js +2 -0
- package/static/dist/assets/{MarkdownRenderer-fbswsgld.js → MarkdownRenderer-74ysuomr.js} +18 -18
- package/static/dist/assets/OAuthSignIn-i4flsuq2.js +1 -0
- package/static/dist/assets/QueueCard-msz9wd1m.js +1 -0
- package/static/dist/assets/ResourceSwitch-b70zg4xd.js +1 -0
- package/static/dist/assets/RightPanel-f5v61m8j.js +1 -0
- package/static/dist/assets/Select-f3l897pt.js +1 -0
- package/static/dist/assets/SessionListPanel-brnzacw9.js +1 -0
- package/static/dist/assets/SettingsLayout-f4akmrt2.js +1 -0
- package/static/dist/assets/States-msohx3c0.js +1 -0
- package/static/dist/assets/TerminalPanel-bnu5xawo.js +16 -0
- package/static/dist/assets/Toaster-d6col3ch.js +1 -0
- package/static/dist/assets/_app-lrjgufcy.js +1 -0
- package/static/dist/assets/{_app.ext._extensionId-na62087t.js → _app.ext._extensionId-k3xitxr1.js} +1 -1
- package/static/dist/assets/_app.groups-bt4wdwnd.js +1 -0
- package/static/dist/assets/{_app.index-jypgdqoi.js → _app.index-n3otiki0.js} +1 -1
- package/static/dist/assets/{_app.insights-kabejdtm.js → _app.insights-b0mzlh6m.js} +1 -1
- package/static/dist/assets/{_app.kanban-m19kfcmx.js → _app.kanban-d923g7j5.js} +1 -1
- package/static/dist/assets/{_app.logs-iw4m96sz.js → _app.logs-donegue1.js} +1 -1
- package/static/dist/assets/{_app.memory-jq5frwcg.js → _app.memory-hdnled08.js} +1 -1
- package/static/dist/assets/{_app.profiles-kwa3m7rp.js → _app.profiles-fumot3jk.js} +1 -1
- package/static/dist/assets/{_app.session._sessionId-o5lyeipj.js → _app.session._sessionId-crmdl2ux.js} +1 -1
- package/static/dist/assets/{_app.settings-ckl8hdll.js → _app.settings-jui8iesz.js} +1 -1
- package/static/dist/assets/_app.settings._section-do84hsqw.js +3 -0
- package/static/dist/assets/{_app.skills-n016rihd.js → _app.skills-heqcn21m.js} +1 -1
- package/static/dist/assets/_app.tasks-jiudtutt.js +1 -0
- package/static/dist/assets/{_app.todos-btew5v2s.js → _app.todos-bl6kk2zq.js} +1 -1
- package/static/dist/assets/{_app.workspaces-lnfk95ch.js → _app.workspaces-frvh3o7w.js} +1 -1
- package/static/dist/assets/_delete-qnxuo87s.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-dttheegb.js → abnfDiagram-VCTEODGH-dppg3yfx.js} +1 -1
- package/static/dist/assets/{architecture-7GRP2DOG-ic435919.js → architecture-7GRP2DOG-gbajejh3.js} +1 -1
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-8r3glgiq.js → architectureDiagram-5GKGNRK7-bzrxyais.js} +1 -1
- package/static/dist/assets/archive-yhdyz231.js +1 -0
- package/static/dist/assets/autoReadClaim-nlyv8tu9.js +1 -0
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jenyos6c.js → blockDiagram-I7D4REHJ-gmk9koab.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-nzlx7yc4.js → c4Diagram-7LVT6UL2-bfqiqqcz.js} +1 -1
- package/static/dist/assets/channel-grt3rob4.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-g0cru63b.js → chunk-4HAMMTFA-i9s6h4wv.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-7rkswkjw.js → chunk-75Z2AOVW-gnt6pnso.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-fn73jzdo.js → chunk-DU6HZSFF-gq439wot.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-oey8e72m.js → chunk-F27PBJKO-wvx90pbt.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-l2a32wiy.js → chunk-GMAD6QVW-mc2gu30k.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-o9dwzh8h.js → chunk-GVQU2GXP-f8fxa2ym.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-eblwj20b.js → chunk-IMKFNOWR-lnsl31hj.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-o2mufspb.js → chunk-L3NEJ4N5-kbfdidwu.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-ijp9pw29.js → chunk-OSK3NFVY-dvxsduj6.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-hs9hqwl4.js → chunk-P2QGCYS3-ivo3i1wf.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-bp9rsqez.js → chunk-POPQ4Y6H-i0gfu0hx.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-brkprov6.js → chunk-PWAF6VOD-jb0fdyb0.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-gmpv0pxz.js → chunk-SHT3W25Y-b7ou2xsp.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-oldm08fu.js → chunk-SVP7TREG-e2v7me5v.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-ooqilfv7.js → chunk-TICWLB2K-e5zlai62.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-nnsp49jr.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-nnsp49jr.js +1 -0
- package/static/dist/assets/completionAudio-c5at041z.js +1 -0
- package/static/dist/assets/{copy-jo006coq.js → copy-jj3oiw13.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-d47op7qs.js → cynefin-OW5HDTMX-n5n1ck70.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-doa7594y.js → cynefinDiagram-5FMLGOSQ-b33npu4f.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-os768dp4.js → dagre-GXQ25YYZ-miwvae07.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-fyi81nxd.js → diagram-S7CK7UJ4-j8fphsp4.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-j3exggaq.js → diagram-UQ7AKVKN-5cixo166.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-omo1en2l.js → diagram-VSXAHHWV-ii3bf92m.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-oro2cyu0.js → diagram-VX7I27RA-b3cfgx81.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-byt9vdb7.js → diagram-Z3DM3KII-bey9lqr8.js} +1 -1
- package/static/dist/assets/{dist-etpoyscq.js → dist-cb8um5dh.js} +4 -4
- package/static/dist/assets/{dist-crc46di9.js → dist-kpg5ccm9.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-ee3haugh.js → ebnfDiagram-PWID7BFC-2m4wrnqc.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-d1e93yff.js → erDiagram-RLTQ6QDP-kak5te0n.js} +1 -1
- package/static/dist/assets/{eventmodeling-NTZA5JFV-i1ihb40c.js → eventmodeling-NTZA5JFV-ojcc486t.js} +1 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kxr9sicu.js +1 -0
- package/static/dist/assets/folder-plus-fk6j7tlv.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-m7g0jud4.js → ganttDiagram-EL5Y4UJY-k6nfmhrh.js} +1 -1
- package/static/dist/assets/getPseudoElementBounds-mwj3vqni.js +1 -0
- package/static/dist/assets/{gitGraph-4MIJSDKK-hzdj07yy.js → gitGraph-4MIJSDKK-bxq1lbhy.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-dm9agbna.js → gitGraphDiagram-WWUBYQGX-ehvoankt.js} +1 -1
- package/static/dist/assets/group_discussions-fk5hry4l.js +1 -0
- package/static/dist/assets/{highlighted-body-KPVGNVTW-mmgz2czu.js → highlighted-body-KPVGNVTW-nr4nfdq7.js} +1 -1
- package/static/dist/assets/{host-fr6lni1p.js → host-dhgqiozp.js} +1 -1
- package/static/dist/assets/index-hx7z4wdj.js +13 -0
- package/static/dist/assets/index-o8ebuc5x.css +2 -0
- package/static/dist/assets/{info-A6RAGUB7-lll1dqmm.js → info-A6RAGUB7-dtsj0ybw.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-k7esc639.js → infoDiagram-27XIBGKW-jena90ao.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-lgr6k9wo.js → ishikawaDiagram-5VMMS53U-kia6bn5u.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-ndmbxuqk.js → journeyDiagram-3NMN7TZE-ipsa6icb.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-mjxym0jp.js → kanban-definition-UXKFOSKX-moxx59kp.js} +1 -1
- package/static/dist/assets/katex-ic33v820.js +257 -0
- package/static/dist/assets/katex-qcv7xo0t.css +1 -0
- package/static/dist/assets/{lazyRouteComponent-cwb6l7xh.js → lazyRouteComponent-i74ujrfk.js} +1 -1
- package/static/dist/assets/{line-mtr5k6il.js → line-lgrkg9no.js} +1 -1
- package/static/dist/assets/link-2-fp49mwl2.js +1 -0
- package/static/dist/assets/{link-iadw4ghw.js → link-es18mse1.js} +2 -2
- package/static/dist/assets/{locale-cs-n41hptse.js → locale-cs-brltdkcp.js} +1 -1
- package/static/dist/assets/{locale-de-k7ht47ew.js → locale-de-h6e9oq6v.js} +1 -1
- package/static/dist/assets/{locale-es-ih078lco.js → locale-es-oklmh80f.js} +1 -1
- package/static/dist/assets/{locale-fr-ojabnf41.js → locale-fr-b17ozoi2.js} +1 -1
- package/static/dist/assets/{locale-it-kb96jufy.js → locale-it-whe01eef.js} +1 -1
- package/static/dist/assets/{locale-ja-jpsp3xs1.js → locale-ja-g1s0rtpc.js} +1 -1
- package/static/dist/assets/{locale-pl-dbap4leu.js → locale-pl-d9p3lqcb.js} +1 -1
- package/static/dist/assets/{locale-pt-nci7w72x.js → locale-pt-l75on74f.js} +1 -1
- package/static/dist/assets/{locale-ru-soghe4cs.js → locale-ru-wl3mbsaw.js} +1 -1
- package/static/dist/assets/{locale-tr-ks00mu68.js → locale-tr-cz87itrq.js} +1 -1
- package/static/dist/assets/{locale-vi-ij7twfm6.js → locale-vi-elqj1y4k.js} +1 -1
- package/static/dist/assets/{locale-zh-Hant-feakwr7a.js → locale-zh-Hant-hf8gqm7d.js} +1 -1
- package/static/dist/assets/{locale-zh-ren0vjyv.js → locale-zh-cdckwb0u.js} +1 -1
- package/static/dist/assets/login-o6gfl4gy.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-n2kbzsao.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-k91vdnvi.js → mermaid-parser.core-fflovwf2.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-ehztfea4.js → mindmap-definition-YA3MSWOX-ic8l9whi.js} +1 -1
- package/static/dist/assets/onboarding-bxm7gdrr.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-ok2xrblz.js → packet-AYTQ26CC-ntci3088.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-ec3rpj0m.js → pegDiagram-XKGWAZYB-e3btz04w.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-iwkir23u.js → pie-WAS4IAKB-o2dc7l36.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-fcpqpekh.js → pieDiagram-E7YTZNPT-gro55rrw.js} +1 -1
- package/static/dist/assets/presence-lq6m12ga.js +1 -0
- package/static/dist/assets/prompt_queue_cancelled-cebcuagu.js +1 -0
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-lqsync43.js → quadrantDiagram-AXDQQJYC-fxulmd7d.js} +1 -1
- package/static/dist/assets/queryKeys-cnvn6pea.js +9 -0
- package/static/dist/assets/{radar-RG4KPBEZ-hje4jbk6.js → radar-RG4KPBEZ-9pcospra.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-gll9n6qi.js → railroad-74A4TZTK-nzdga12j.js} +1 -1
- package/static/dist/assets/{railroad-abnf-HS5TGJTU-o6h6lpn4.js → railroad-abnf-HS5TGJTU-ep3ytel0.js} +1 -1
- package/static/dist/assets/{railroad-ebnf-LZEXJU2U-juaefj6o.js → railroad-ebnf-LZEXJU2U-iw7uc1wy.js} +1 -1
- package/static/dist/assets/{railroad-peg-WCYAUIDC-cgfhvpah.js → railroad-peg-WCYAUIDC-fo3b3gme.js} +1 -1
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-lp3w7awf.js → railroadDiagram-O6MQD6OU-lxpxf8f0.js} +1 -1
- package/static/dist/assets/{refresh-cw-iccm7a4e.js → refresh-cw-d14h79x5.js} +1 -1
- package/static/dist/assets/rename-ccd52yws.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-ha8eibcf.js → requirementDiagram-BXWQKSXE-lrozucd2.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-oxf31pr9.js → sankeyDiagram-P5KCCOFB-iusxy9mq.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-jiq8lhyo.js → sequenceDiagram-WJ2MYXX4-o987q8ti.js} +1 -1
- package/static/dist/assets/{share._token-o76ki0ly.js → share._token-bfw7f9m5.js} +1 -1
- package/static/dist/assets/sliders-horizontal-l65hoa3x.js +1 -0
- package/static/dist/assets/{stateDiagram-D77RDMKH-f3fslnon.js → stateDiagram-D77RDMKH-hh23v7y5.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-jukr0d8h.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-k1hmk7jf.js → swimlanes-42K2YHIH-gj2t3rm8.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ik9m9j2m.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-n3ncfy9r.js → timeline-definition-24CTP7MA-84s2w2sr.js} +1 -1
- package/static/dist/assets/toast-gqqcvxiy.js +56 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-l3y2pejt.js → treeView-Q6P3EWNA-cmuj50l7.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-jown9axh.js → treemap-WGGIJYW6-dpjlg0xc.js} +1 -1
- package/static/dist/assets/tts-jw84jlqy.js +1 -0
- package/static/dist/assets/{useForm-o4uu74mx.js → useForm-lxzhiqao.js} +1 -1
- package/static/dist/assets/{useParams-ftsveu84.js → useParams-dt6gkoq7.js} +1 -1
- package/static/dist/assets/{useSearch-crqueqga.js → useSearch-o8t49csk.js} +1 -1
- package/static/dist/assets/useTranscript-gx9umcc2.js +1 -0
- package/static/dist/assets/{vennDiagram-4TSXK5OY-dh59uq1c.js → vennDiagram-4TSXK5OY-g9g5o8vy.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-e6d74b0j.js → wardley-WFR3VGLG-ij35obrl.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hnofh78f.js → wardleyDiagram-VM6X3IG4-f9my7q7w.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-bpymjelb.js → xychartDiagram-S5SC5T6Z-olqx1s1p.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- package/static/dist/assets/AppShell-3isgvoro.js +0 -8
- package/static/dist/assets/Button-f4n6dapf.js +0 -1
- package/static/dist/assets/ChatPage-k7b6xfax.js +0 -4
- package/static/dist/assets/ConnectTargets-juqvt5lm.js +0 -1
- package/static/dist/assets/Dialog-hta5utr3.js +0 -1
- package/static/dist/assets/Field-b6ez48oz.js +0 -1
- package/static/dist/assets/HubRoute-iwvso2tz.js +0 -2
- package/static/dist/assets/Markdown-jdeth7zq.js +0 -2
- package/static/dist/assets/OAuthSignIn-bpd8hom3.js +0 -1
- package/static/dist/assets/ResourceSwitch-odi6dy2o.js +0 -1
- package/static/dist/assets/RightPanel-eu6enlo6.js +0 -1
- package/static/dist/assets/Select-kr07928w.js +0 -1
- package/static/dist/assets/SessionListPanel-etb2i54l.js +0 -1
- package/static/dist/assets/SettingsLayout-eu3xxp23.js +0 -1
- package/static/dist/assets/States-icab19yg.js +0 -1
- package/static/dist/assets/TerminalPanel-hngmsr8b.js +0 -16
- package/static/dist/assets/Toaster-nb2uzjw1.js +0 -1
- package/static/dist/assets/_app-ga1moszl.js +0 -1
- package/static/dist/assets/_app.settings._section-dtdjk98a.js +0 -3
- package/static/dist/assets/_app.tasks-n8zuqsqe.js +0 -1
- package/static/dist/assets/archive-il7c6053.js +0 -1
- package/static/dist/assets/cancel-bsnfo36u.js +0 -1
- package/static/dist/assets/channel-dsbtk01y.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +0 -1
- package/static/dist/assets/folder-plus-ivoglq98.js +0 -1
- package/static/dist/assets/index-73649w7o.js +0 -10
- package/static/dist/assets/index-lhf1fsdf.css +0 -2
- package/static/dist/assets/katex-cbdd1ohw.css +0 -1
- package/static/dist/assets/katex-pbij2oo6.js +0 -257
- package/static/dist/assets/login-lkhtzfcl.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +0 -1
- package/static/dist/assets/onboarding-f67z0a2r.js +0 -1
- package/static/dist/assets/queryKeys-ed4n2egc.js +0 -9
- package/static/dist/assets/refresh-i9ya9dvl.js +0 -1
- package/static/dist/assets/sliders-horizontal-ddcs88av.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +0 -8
- package/static/dist/assets/toast-liparz2j.js +0 -56
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/** Native rooms own their durable log/tasks; this service owns bounded display observations only. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { GROUP_ATTACHMENT_BYTES, GROUP_ATTACHMENT_LIMIT, GROUP_ATTACHMENT_BASE64_LIMIT, GroupAttachmentSchema, GroupMemberSchema, NativeGroupCapabilitiesSchema, NativeGroupListSchema, NativeGroupLogSchema, NativeGroupStateSchema, NativeGroupEventSchema } from '@maudecode/talaria-web-contracts';
|
|
6
|
+
import { HttpFailure } from './service.js';
|
|
7
|
+
import { StreamChannel } from './streams.js';
|
|
8
|
+
import { redactString } from '../redact.js';
|
|
9
|
+
const hash = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
10
|
+
const nativeEventId = (requestId) => `user:${createHash('sha256').update(requestId).digest('hex')}`;
|
|
11
|
+
const empty = (reason) => ({ available: false, reason, room: null, rows: [], cursor: 0, has_more: false, next_before_seq: null });
|
|
12
|
+
const reasons = new Set(['unsupported', 'stopped', 'refused', 'unavailable', 'unknown', 'driver_inactive']);
|
|
13
|
+
const safeReason = (reason) => reasons.has(reason ?? '') ? reason : 'unavailable';
|
|
14
|
+
const sameMembers = (left, right) => left.length === right.length && left.every((m, i) => m.member_id === right[i]?.member_id && m.profile === right[i]?.profile && m.handle === right[i]?.handle);
|
|
15
|
+
const localMembers = (members) => members.every((m) => !m.target || m.target.kind === 'local' && m.target.profile === m.profile);
|
|
16
|
+
export class Groups {
|
|
17
|
+
deps;
|
|
18
|
+
pollMs;
|
|
19
|
+
watchers = new Map();
|
|
20
|
+
constructor(deps, pollMs = 1000) {
|
|
21
|
+
this.deps = deps;
|
|
22
|
+
this.pollMs = pollMs;
|
|
23
|
+
}
|
|
24
|
+
/** Resolve protocol identity before dispatch so SSE can confirm an in-flight occurrence. No owner access. */
|
|
25
|
+
sendIdentity(requestId) { return { event_id: nativeEventId(requestId) }; }
|
|
26
|
+
scope(profile, owner) {
|
|
27
|
+
return { home: this.deps().profileHome(profile), subject: hash(['talaria', owner]), profile };
|
|
28
|
+
}
|
|
29
|
+
async call(scope, operation, signal, expectedRoom) {
|
|
30
|
+
const sidecar = this.deps().sidecar();
|
|
31
|
+
if (!sidecar)
|
|
32
|
+
return { state: 'unavailable', reason: 'unsupported', value: null };
|
|
33
|
+
try {
|
|
34
|
+
return await sidecar.call('gateway.groups', { profile_home: scope.home, subject: scope.subject, operation, ...(expectedRoom ? { expected_room: expectedRoom } : {}) }, { timeoutMs: 35_000, ...(signal ? { signal } : {}) });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { state: ['capabilities', 'list', 'state', 'log', 'attachment.download'].includes(operation.action) ? 'unavailable' : 'unknown', reason: 'unknown', value: null };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async supported(scope, signal) {
|
|
41
|
+
const response = await this.call(scope, { action: 'capabilities' }, signal);
|
|
42
|
+
if (response.state !== 'available')
|
|
43
|
+
return { caps: null, reason: safeReason(response.reason) };
|
|
44
|
+
const parsed = NativeGroupCapabilitiesSchema.safeParse(response.value);
|
|
45
|
+
if (!parsed.success)
|
|
46
|
+
return { caps: null, reason: 'unsupported' };
|
|
47
|
+
if (!parsed.data.driver)
|
|
48
|
+
return { caps: null, reason: 'driver_inactive' };
|
|
49
|
+
return { caps: parsed.data, reason: null };
|
|
50
|
+
}
|
|
51
|
+
async profiles(scope) {
|
|
52
|
+
const rows = await this.deps().profiles.list(scope.profile);
|
|
53
|
+
return rows.flatMap((row) => typeof row.name === 'string' ? [{ profile: row.is_default === true ? 'default' : row.name, label: typeof row.display_name === 'string' && row.display_name ? redactString(row.display_name) : row.name }] : []);
|
|
54
|
+
}
|
|
55
|
+
authorityIdentity(scope, gatewayId) { return hash([scope, gatewayId]); }
|
|
56
|
+
identity(scope, room) { return hash([this.authorityIdentity(scope, room.authority_gateway_id), room.room_id, room.authority_epoch]); }
|
|
57
|
+
project(scope, state, caps, events = []) {
|
|
58
|
+
const room = state.room, driver = state.driver_status;
|
|
59
|
+
const active = !room.disbanded_at && driver?.running === true;
|
|
60
|
+
const actions = new Set(caps.methods);
|
|
61
|
+
return { id: room.room_id, name: redactString(room.name), identity: this.identity(scope, room), revision: room.revision, disbanded: room.disbanded_at !== undefined,
|
|
62
|
+
max_upload_bytes: Math.min(GROUP_ATTACHMENT_BYTES, this.deps().config.maxUploadBytes), attachment_limit: GROUP_ATTACHMENT_LIMIT,
|
|
63
|
+
members: room.members.map((member) => {
|
|
64
|
+
const pending = active ? (driver?.pending_actions ?? []).filter((a) => a.member_id === member.member_id && actions.has(`groups.${a.kind === 'approval' ? 'approve' : a.kind}`)) : [];
|
|
65
|
+
const status = driver?.member_activity?.find((a) => a.member_id === member.member_id)?.status;
|
|
66
|
+
const terminal = events.findLast((e) => e.payload.member_id === member.member_id && ['turn.failed', 'turn.settled', 'turn.cancelled', 'turn.deferred'].includes(e.kind));
|
|
67
|
+
const phase = pending.some((a) => a.kind === 'approval') ? 'approval' : status === 'indeterminate' || pending.some((a) => a.kind === 'discard') ? 'unknown' : status === 'deferred' || pending.some((a) => a.kind === 'retry') ? 'failed' : status ?? (driver?.working && driver.member_activity === undefined ? 'unknown' : terminal?.kind === 'turn.failed' ? 'failed' : 'idle');
|
|
68
|
+
return { ...GroupMemberSchema.parse(member), display_name: redactString(member.display_name || member.profile), phase,
|
|
69
|
+
actions: pending.map((a) => ({ ...a, approval: a.approval ? { ...a.approval, command: a.approval.command ? redactString(a.approval.command) : undefined, description: a.approval.description ? redactString(a.approval.description) : undefined } : undefined })) };
|
|
70
|
+
}),
|
|
71
|
+
actions: active ? ['send', 'rename', 'disband', 'stop'].filter((action) => actions.has(`groups.${action}`) && (action !== 'stop' || driver.working || driver.blocked)) : [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async catalog(scope, offset = 0) {
|
|
75
|
+
const { caps, reason } = await this.supported(scope);
|
|
76
|
+
const unavailable = { identity: null, available: false, reason, profiles: [], rooms: [], actions: [], next_offset: null };
|
|
77
|
+
if (!caps)
|
|
78
|
+
return unavailable;
|
|
79
|
+
const [profiles, response] = await Promise.all([this.profiles(scope), this.call(scope, { action: 'list', offset, limit: 50 })]);
|
|
80
|
+
const parsed = NativeGroupListSchema.safeParse(response.value);
|
|
81
|
+
if (response.state !== 'available' || !parsed.success)
|
|
82
|
+
return { ...unavailable, reason: safeReason(response.reason) };
|
|
83
|
+
const managed = new Set(profiles.map((p) => p.profile));
|
|
84
|
+
return { identity: this.authorityIdentity(scope, caps.authority_gateway_id), available: true, reason: null, profiles: profiles.filter((p) => caps.seatable_profiles.includes(p.profile)),
|
|
85
|
+
rooms: parsed.data.rooms.filter((r) => localMembers(r.members) && r.members.every((m) => managed.has(m.profile))).map((room) => this.project(scope, { room }, caps)), actions: caps.methods.includes('groups.create') ? ['create'] : [], next_offset: parsed.data.next_offset };
|
|
86
|
+
}
|
|
87
|
+
async state(scope, roomId, caps, signal) {
|
|
88
|
+
const response = await this.call(scope, { action: 'state', room_id: roomId, include_disbanded: true }, signal);
|
|
89
|
+
if (response.state !== 'available')
|
|
90
|
+
throw new HttpFailure(409, 'Discussion unavailable', { reason: safeReason(response.reason) });
|
|
91
|
+
const state = NativeGroupStateSchema.parse(response.value);
|
|
92
|
+
const managed = new Set((await this.profiles(scope)).map((p) => p.profile));
|
|
93
|
+
if (state.room.room_id !== roomId || state.room.authority_gateway_id !== caps.authority_gateway_id || !localMembers(state.room.members) || !state.room.members.every((m) => managed.has(m.profile)))
|
|
94
|
+
throw new HttpFailure(404, 'Discussion not found');
|
|
95
|
+
return state;
|
|
96
|
+
}
|
|
97
|
+
rows(scope, state, events) {
|
|
98
|
+
return events.flatMap((event) => {
|
|
99
|
+
const member = state.room.members.find((m) => m.member_id === event.actor.id && m.member_id === event.payload.member_id && m.profile === event.actor.profile);
|
|
100
|
+
const user = event.kind === 'message.user' && event.actor.kind === 'user';
|
|
101
|
+
if (!user && (event.kind !== 'message.member' || event.actor.kind !== 'member' || !member))
|
|
102
|
+
return [];
|
|
103
|
+
const attachments = (event.payload.attachments ?? []).map((a) => ({ ...a, event_id: event.event_id, download_url: `/api/groups/file?${new URLSearchParams({ room_id: state.room.room_id, event_id: event.event_id, attachment_id: a.attachment_id, identity: this.identity(scope, state.room) }).toString()}` }));
|
|
104
|
+
return [{ key: `${event.seq}:${event.event_id}`, index: event.seq, author: user ? '' : redactString(member?.display_name || member?.profile || ''),
|
|
105
|
+
message: { role: user ? 'user' : 'assistant', content: redactString(event.payload.text ?? ''), message_id: event.event_id, timestamp: event.created_at, _turn_id: event.event_id, attachments: attachments.map((a) => ({ name: a.name, mime: a.mime, size: a.size, is_image: a.kind === 'image', download_url: a.download_url })) }, attachments }];
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async log(scope, room, cursor, limit, signal) {
|
|
109
|
+
const response = await this.call(scope, { action: 'log', room_id: room.room_id, since_seq: cursor, limit }, signal);
|
|
110
|
+
const parsed = NativeGroupLogSchema.safeParse(response.value);
|
|
111
|
+
if (response.state !== 'available' || !parsed.success)
|
|
112
|
+
return null;
|
|
113
|
+
const log = parsed.data;
|
|
114
|
+
if (log.authority.gateway_id !== room.authority_gateway_id || log.authority.epoch !== room.authority_epoch)
|
|
115
|
+
return null;
|
|
116
|
+
let seq = cursor;
|
|
117
|
+
for (const event of log.events) {
|
|
118
|
+
if (event.room_id !== room.room_id || event.seq !== seq + 1)
|
|
119
|
+
return null;
|
|
120
|
+
seq = event.seq;
|
|
121
|
+
}
|
|
122
|
+
return log.cursor === seq ? log : null;
|
|
123
|
+
}
|
|
124
|
+
async view(scope, roomId, before, signal, observation) {
|
|
125
|
+
const { caps, reason } = await this.supported(scope, signal);
|
|
126
|
+
if (!caps)
|
|
127
|
+
return empty(reason);
|
|
128
|
+
const state = await this.state(scope, roomId, caps, signal);
|
|
129
|
+
if (state.room.disbanded_at !== undefined)
|
|
130
|
+
return { available: true, reason: null, room: this.project(scope, state, caps), rows: [], cursor: state.room.latest_seq ?? 0, has_more: false, next_before_seq: null };
|
|
131
|
+
const latest = state.room.latest_seq ?? 0;
|
|
132
|
+
const end = Math.min(before === undefined ? latest : before - 1, latest);
|
|
133
|
+
const identity = this.identity(scope, state.room);
|
|
134
|
+
const resumed = observation?.identity === identity && observation.cursor <= latest && latest - observation.cursor <= 100;
|
|
135
|
+
const start = resumed ? observation.cursor : Math.max(0, end - 100);
|
|
136
|
+
const events = resumed ? [...observation.events] : [];
|
|
137
|
+
let seq = start;
|
|
138
|
+
// Native byte caps can shorten a page. Drain this bounded window without skipping its tail.
|
|
139
|
+
do {
|
|
140
|
+
const log = await this.log(scope, state.room, seq, Math.min(caps.max_log_limit, 100), signal);
|
|
141
|
+
if (!log) {
|
|
142
|
+
if (observation) {
|
|
143
|
+
observation.identity = '';
|
|
144
|
+
return this.view(scope, roomId, before, signal);
|
|
145
|
+
}
|
|
146
|
+
return empty('unavailable');
|
|
147
|
+
}
|
|
148
|
+
const page = log.events.filter((e) => e.seq <= end);
|
|
149
|
+
for (const event of page) {
|
|
150
|
+
if (event.room_id !== roomId || event.seq !== seq + 1) {
|
|
151
|
+
if (observation) {
|
|
152
|
+
observation.identity = '';
|
|
153
|
+
return this.view(scope, roomId, before, signal);
|
|
154
|
+
}
|
|
155
|
+
return empty('unavailable');
|
|
156
|
+
}
|
|
157
|
+
seq = event.seq;
|
|
158
|
+
events.push(event);
|
|
159
|
+
}
|
|
160
|
+
if (!page.length || seq >= end)
|
|
161
|
+
break;
|
|
162
|
+
} while (!signal?.aborted);
|
|
163
|
+
const retained = events.slice(-100);
|
|
164
|
+
if (observation)
|
|
165
|
+
Object.assign(observation, { identity, cursor: seq, events: retained });
|
|
166
|
+
const previous = (retained[0]?.seq ?? 1) > 1 ? retained[0].seq : null;
|
|
167
|
+
return { available: true, reason: null, room: this.project(scope, state, caps, retained), rows: this.rows(scope, state, retained), cursor: seq, has_more: previous !== null, next_before_seq: previous };
|
|
168
|
+
}
|
|
169
|
+
async write(scope, identity, operation) {
|
|
170
|
+
if (!('room_id' in operation) || ['state', 'log', 'attachment.download'].includes(operation.action))
|
|
171
|
+
throw new HttpFailure(400, 'Invalid discussion action');
|
|
172
|
+
const result = { outcome: 'refused', reason: 'unavailable', room_id: operation.room_id, event_id: 'event_id' in operation ? operation.action === 'send' ? nativeEventId(operation.event_id) : operation.event_id : null, attachment: null };
|
|
173
|
+
let forwarded = operation;
|
|
174
|
+
let expectedRoom;
|
|
175
|
+
if (operation.action === 'attachment.upload' && Buffer.from(operation.data_base64, 'base64').length > Math.min(GROUP_ATTACHMENT_BYTES, this.deps().config.maxUploadBytes))
|
|
176
|
+
throw new HttpFailure(413, 'Discussion attachment exceeds the upload limit');
|
|
177
|
+
const { caps, reason } = await this.supported(scope);
|
|
178
|
+
if (!caps)
|
|
179
|
+
return { ...result, reason };
|
|
180
|
+
if (!caps.methods.includes(`groups.${operation.action}`))
|
|
181
|
+
return { ...result, reason: 'unsupported' };
|
|
182
|
+
if (operation.action === 'create') {
|
|
183
|
+
if (identity !== this.authorityIdentity(scope, caps.authority_gateway_id))
|
|
184
|
+
throw new HttpFailure(409, 'Discussion profile changed');
|
|
185
|
+
const profiles = await this.profiles(scope);
|
|
186
|
+
const managed = new Set(profiles.map((p) => p.profile));
|
|
187
|
+
if (operation.members.some((m) => !managed.has(m.profile) || !caps.seatable_profiles.includes(m.profile)) || new Set(operation.members.map((m) => m.member_id)).size !== operation.members.length)
|
|
188
|
+
throw new HttpFailure(400, 'Ineligible discussion member');
|
|
189
|
+
forwarded = { ...operation, members: operation.members.map((member) => ({ ...member, display_name: profiles.find((p) => p.profile === member.profile)?.label ?? member.profile })) };
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const current = await this.state(scope, operation.room_id, caps);
|
|
193
|
+
expectedRoom = { room_id: current.room.room_id, gateway_id: current.room.authority_gateway_id, authority_epoch: current.room.authority_epoch };
|
|
194
|
+
if (!identity || identity !== this.identity(scope, current.room))
|
|
195
|
+
throw new HttpFailure(409, 'Discussion identity changed');
|
|
196
|
+
const room = this.project(scope, current, caps);
|
|
197
|
+
if (['send', 'rename', 'disband', 'stop'].includes(operation.action) && !room.actions.includes(operation.action))
|
|
198
|
+
return { ...result, reason: 'refused' };
|
|
199
|
+
if (['retry', 'discard', 'approve'].includes(operation.action) && 'task_id' in operation) {
|
|
200
|
+
const permitted = room.members.flatMap((m) => m.actions).some((a) => a.kind === (operation.action === 'approve' ? 'approval' : operation.action) && a.member_id === operation.member_id && a.task_id === operation.task_id && a.execution_generation === operation.execution_generation && (operation.action !== 'approve' || a.request_id === operation.request_id));
|
|
201
|
+
if (!permitted)
|
|
202
|
+
throw new HttpFailure(409, 'Discussion task changed');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
let response = await this.call(scope, forwarded, undefined, expectedRoom);
|
|
206
|
+
if (response.state === 'available' && !this.validReceipt(forwarded, response.value))
|
|
207
|
+
response = { state: 'unknown', reason: 'unknown', value: null };
|
|
208
|
+
if (response.state !== 'available') {
|
|
209
|
+
// Reconcile durable send/create identities; a transport loss never triggers another write.
|
|
210
|
+
if (response.state === 'unknown' && ['send', 'create', 'rename', 'disband'].includes(operation.action)) {
|
|
211
|
+
if (operation.action === 'send') {
|
|
212
|
+
const event = await this.findEvent(scope, operation.room_id, nativeEventId(operation.event_id)).catch(() => null);
|
|
213
|
+
if (event?.payload.text === operation.payload.text.trim() && isDeepStrictEqual(event.payload.attachments ?? [], operation.payload.attachments ?? []))
|
|
214
|
+
return { ...result, outcome: 'confirmed', reason: null };
|
|
215
|
+
}
|
|
216
|
+
const read = await this.view(scope, operation.room_id).catch(() => null);
|
|
217
|
+
if (read?.available && read.room && ((operation.action === 'create' && read.room.name === redactString(operation.name) && sameMembers(read.room.members, operation.members)) || (operation.action === 'rename' && read.room.name === redactString(operation.name)) || (operation.action === 'disband' && read.room.disbanded)))
|
|
218
|
+
return { ...result, outcome: 'confirmed', reason: null };
|
|
219
|
+
}
|
|
220
|
+
return { ...result, outcome: response.state === 'unknown' ? 'unknown' : 'refused', reason: safeReason(response.reason) };
|
|
221
|
+
}
|
|
222
|
+
const attachment = operation.action === 'attachment.upload' ? GroupAttachmentSchema.parse(response.value) : null;
|
|
223
|
+
return { ...result, outcome: 'confirmed', reason: null, attachment };
|
|
224
|
+
}
|
|
225
|
+
validReceipt(operation, value) {
|
|
226
|
+
try {
|
|
227
|
+
switch (operation.action) {
|
|
228
|
+
case 'create':
|
|
229
|
+
case 'rename': {
|
|
230
|
+
const state = NativeGroupStateSchema.parse(value);
|
|
231
|
+
return state.room.room_id === operation.room_id && state.room.name === operation.name && localMembers(state.room.members) && (operation.action !== 'create' || sameMembers(state.room.members, operation.members));
|
|
232
|
+
}
|
|
233
|
+
case 'send': {
|
|
234
|
+
const receipt = z.object({ accepted: z.literal(true), client_event_id: z.string(), event: NativeGroupEventSchema }).parse(value);
|
|
235
|
+
return receipt.client_event_id === operation.event_id && receipt.event.room_id === operation.room_id && receipt.event.event_id === nativeEventId(operation.event_id);
|
|
236
|
+
}
|
|
237
|
+
case 'stop': return z.object({ cancelled: z.number().int().nonnegative() }).safeParse(value).success;
|
|
238
|
+
case 'disband': return z.object({ tombstone: z.object({ room_id: z.literal(operation.room_id), disbanded_at: z.number() }) }).safeParse(value).success;
|
|
239
|
+
case 'approve': return z.object({ approved: z.literal(true) }).safeParse(value).success;
|
|
240
|
+
case 'retry': return z.object({ retried: z.literal(true) }).safeParse(value).success;
|
|
241
|
+
case 'discard': return z.object({ discarded: z.literal(true) }).safeParse(value).success;
|
|
242
|
+
case 'attachment.upload': {
|
|
243
|
+
const receipt = GroupAttachmentSchema.extend({ sha256: z.string().regex(/^[0-9a-f]{64}$/) }).parse(value);
|
|
244
|
+
const bytes = Buffer.from(operation.data_base64, 'base64');
|
|
245
|
+
return receipt.size === bytes.length && receipt.sha256 === createHash('sha256').update(bytes).digest('hex') && receipt.kind === operation.kind && receipt.name === operation.name && receipt.mime === operation.mime;
|
|
246
|
+
}
|
|
247
|
+
default: return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async findEvent(scope, roomId, eventId) {
|
|
255
|
+
const { caps } = await this.supported(scope);
|
|
256
|
+
if (!caps)
|
|
257
|
+
return null;
|
|
258
|
+
const { room } = await this.state(scope, roomId, caps);
|
|
259
|
+
const tail = Math.max(0, (room.latest_seq ?? 0) - 100);
|
|
260
|
+
const match = (events) => events.find((e) => e.event_id === eventId && e.kind === 'message.user' && e.actor.kind === 'user') ?? null;
|
|
261
|
+
// A bounded search may remain unknown; it never grants a resend.
|
|
262
|
+
let remaining = 100;
|
|
263
|
+
for (const [start, end] of [[tail, room.latest_seq ?? 0], [0, tail]]) {
|
|
264
|
+
let cursor = start;
|
|
265
|
+
while (remaining-- > 0 && cursor < end) {
|
|
266
|
+
const log = await this.log(scope, room, cursor, Math.min(caps.max_log_limit, 100));
|
|
267
|
+
if (!log || log.cursor <= cursor)
|
|
268
|
+
break;
|
|
269
|
+
const event = match(log.events);
|
|
270
|
+
if (event)
|
|
271
|
+
return event;
|
|
272
|
+
cursor = log.cursor;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
async receipt(scope, roomId, requestId) {
|
|
278
|
+
const eventId = nativeEventId(requestId);
|
|
279
|
+
const observed = await this.findEvent(scope, roomId, eventId) !== null;
|
|
280
|
+
return { outcome: observed ? 'confirmed' : 'unknown', reason: observed ? null : 'unknown', room_id: roomId, event_id: eventId, attachment: null };
|
|
281
|
+
}
|
|
282
|
+
async download(scope, roomId, identity, eventId, attachmentId) {
|
|
283
|
+
const { caps } = await this.supported(scope);
|
|
284
|
+
if (!caps)
|
|
285
|
+
throw new HttpFailure(409, 'Discussion unavailable');
|
|
286
|
+
const state = await this.state(scope, roomId, caps);
|
|
287
|
+
if (identity !== this.identity(scope, state.room))
|
|
288
|
+
throw new HttpFailure(409, 'Discussion identity changed');
|
|
289
|
+
const response = await this.call(scope, { action: 'attachment.download', room_id: roomId, event_id: eventId, attachment_id: attachmentId }, undefined, { room_id: roomId, gateway_id: state.room.authority_gateway_id, authority_epoch: state.room.authority_epoch });
|
|
290
|
+
if (response.state !== 'available')
|
|
291
|
+
throw new HttpFailure(404, 'Attachment unavailable');
|
|
292
|
+
const attachment = GroupAttachmentSchema.extend({ data_base64: z.string().max(GROUP_ATTACHMENT_BASE64_LIMIT), sha256: z.string().regex(/^[0-9a-f]{64}$/), event_id: z.literal(eventId) }).parse(response.value);
|
|
293
|
+
const bytes = Buffer.from(attachment.data_base64, 'base64');
|
|
294
|
+
if (attachment.attachment_id !== attachmentId || bytes.length !== attachment.size || createHash('sha256').update(bytes).digest('hex') !== attachment.sha256 || bytes.toString('base64') !== attachment.data_base64)
|
|
295
|
+
throw new HttpFailure(404, 'Attachment unavailable');
|
|
296
|
+
return { attachment, bytes };
|
|
297
|
+
}
|
|
298
|
+
watch(scope, roomId) {
|
|
299
|
+
const key = hash([scope, roomId]);
|
|
300
|
+
let watcher = this.watchers.get(key);
|
|
301
|
+
if (!watcher) {
|
|
302
|
+
const channel = new StreamChannel(), controller = new AbortController();
|
|
303
|
+
watcher = { channel, controller, done: Promise.resolve() };
|
|
304
|
+
this.watchers.set(key, watcher);
|
|
305
|
+
const run = async () => {
|
|
306
|
+
const observation = { identity: '', cursor: 0, events: [] };
|
|
307
|
+
while (!controller.signal.aborted) {
|
|
308
|
+
const view = await this.view(scope, roomId, undefined, controller.signal, observation).catch(() => empty('unavailable'));
|
|
309
|
+
if (controller.signal.aborted)
|
|
310
|
+
break;
|
|
311
|
+
channel.replace(['snapshot', view, view.room ? `${view.room.identity}:${view.cursor}` : null]);
|
|
312
|
+
await new Promise((resolve) => {
|
|
313
|
+
const finish = () => { clearTimeout(timer); controller.signal.removeEventListener('abort', finish); resolve(); };
|
|
314
|
+
const timer = setTimeout(finish, this.pollMs);
|
|
315
|
+
controller.signal.addEventListener('abort', finish, { once: true });
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
watcher.done = run();
|
|
320
|
+
}
|
|
321
|
+
const [subscriber] = watcher.channel.subscribeWithSnapshot();
|
|
322
|
+
const current = watcher;
|
|
323
|
+
let released = false;
|
|
324
|
+
return { subscriber, release: () => {
|
|
325
|
+
if (released)
|
|
326
|
+
return;
|
|
327
|
+
released = true;
|
|
328
|
+
current.channel.unsubscribe(subscriber);
|
|
329
|
+
if (!current.channel.subscriberCount) {
|
|
330
|
+
current.controller.abort();
|
|
331
|
+
if (this.watchers.get(key) === current)
|
|
332
|
+
this.watchers.delete(key);
|
|
333
|
+
}
|
|
334
|
+
} };
|
|
335
|
+
}
|
|
336
|
+
async close() { const watchers = [...this.watchers.values()]; this.watchers.clear(); for (const w of watchers)
|
|
337
|
+
w.controller.abort(); await Promise.all(watchers.map((w) => w.done)); }
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/sessions/groups.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/list.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Session } from './session.js';
|
|
2
2
|
import type { SessionStore } from './store.js';
|
|
3
3
|
import { type StateDbSessionSource } from './state-db.js';
|
|
4
|
-
import { type AgentStorage } from '@maudecode/talaria-web-contracts';
|
|
4
|
+
import { type AgentStorage, type SidebarGroup } from '@maudecode/talaria-web-contracts';
|
|
5
5
|
export type Row = Record<string, unknown>;
|
|
6
6
|
export { sanitizeSessionRow } from './storage/row.js';
|
|
7
7
|
export declare function sessionSortTimestamp(row: Row): number;
|
|
@@ -154,7 +154,11 @@ export declare function buildSessionListPayload(store: SessionStore, params: Lis
|
|
|
154
154
|
export interface RuntimeOverlay {
|
|
155
155
|
activeStreamIds: Set<string>;
|
|
156
156
|
runningCronJobs: Map<string, number>;
|
|
157
|
-
|
|
157
|
+
/** The session's registered run stream, with its Web session when a direct turn owns it. */
|
|
158
|
+
live: (sid: string) => {
|
|
159
|
+
stream_id: string;
|
|
160
|
+
session: Session | undefined;
|
|
161
|
+
} | undefined;
|
|
158
162
|
attention: (sid: string) => Row | null;
|
|
159
163
|
}
|
|
160
164
|
/** Overlay live runtime state and cron liveness, then sort canonically (Python `_session_list_cache_overlay_runtime_rows`). */
|
|
@@ -179,6 +183,7 @@ export interface ListResponse extends Record<string, unknown> {
|
|
|
179
183
|
scheduled_sessions_truncated: boolean;
|
|
180
184
|
webhook_session_count: number;
|
|
181
185
|
webhook_sessions_truncated: boolean;
|
|
186
|
+
sidebar_groups: SidebarGroup[];
|
|
182
187
|
agent_storage: AgentStorage;
|
|
183
188
|
archived_limit?: number;
|
|
184
189
|
archived_offset?: number;
|
package/dist/sessions/list.js
CHANGED
|
@@ -914,12 +914,14 @@ export function overlayRuntimeRows(rows, overlay) {
|
|
|
914
914
|
const item = { ...row };
|
|
915
915
|
const sid = str(item.session_id).trim();
|
|
916
916
|
const live = overlay.live(sid);
|
|
917
|
-
if (live)
|
|
918
|
-
item.active_stream_id = live.
|
|
919
|
-
|
|
917
|
+
if (live)
|
|
918
|
+
item.active_stream_id = live.stream_id;
|
|
919
|
+
const session = live?.session;
|
|
920
|
+
if (session) {
|
|
921
|
+
item.has_pending_user_message = session.hasPendingPrompt;
|
|
920
922
|
for (const key of ['pending_started_at', 'updated_at', 'last_message_at']) {
|
|
921
923
|
const current = num(item[key]);
|
|
922
|
-
const raw = key === 'last_message_at' ?
|
|
924
|
+
const raw = key === 'last_message_at' ? session.compact().last_message_at : session[key];
|
|
923
925
|
if (num(raw) > current)
|
|
924
926
|
item[key] = raw;
|
|
925
927
|
}
|
|
@@ -931,6 +933,11 @@ export function overlayRuntimeRows(rows, overlay) {
|
|
|
931
933
|
}
|
|
932
934
|
return out.sort(compareSessionRows);
|
|
933
935
|
}
|
|
936
|
+
const SIDEBAR_GROUP_TITLES = { pinned: 'Pinned', recent: 'Recents' };
|
|
937
|
+
/** TAL-1534: the sidebar group the canonical order (pinned first) files a row under; an archived row is in none. */
|
|
938
|
+
function sidebarGroup(row) {
|
|
939
|
+
return row.archived ? null : row.pinned ? 'pinned' : 'recent';
|
|
940
|
+
}
|
|
934
941
|
export function sidebarSessionResponseItem(row, redactEnabled, attention, activeStreamIds, workspaceName) {
|
|
935
942
|
const item = {};
|
|
936
943
|
for (const [k, v] of Object.entries(row))
|
|
@@ -945,6 +952,7 @@ export function sidebarSessionResponseItem(row, redactEnabled, attention, active
|
|
|
945
952
|
// Python reconciles stale stream state before serialising (#2157): a dead stream id is not exposed as active.
|
|
946
953
|
withSessionWireFlags(item, activeStreamIds);
|
|
947
954
|
item.attention = attention;
|
|
955
|
+
item.sidebar_group = sidebarGroup(row);
|
|
948
956
|
return item;
|
|
949
957
|
}
|
|
950
958
|
export function serverTz(date = new Date()) {
|
|
@@ -978,6 +986,7 @@ export function sessionListResponse(payload, overlay, redactEnabled, now, worksp
|
|
|
978
986
|
scheduled_sessions_truncated: payload.scheduled_sessions_truncated,
|
|
979
987
|
webhook_session_count: payload.webhook_session_count,
|
|
980
988
|
webhook_sessions_truncated: payload.webhook_sessions_truncated,
|
|
989
|
+
sidebar_groups: Object.keys(SIDEBAR_GROUP_TITLES).filter((kind) => sessions.some((r) => r.sidebar_group === kind)).map((kind) => ({ kind, title: SIDEBAR_GROUP_TITLES[kind] })),
|
|
981
990
|
agent_storage: payload.agent_storage,
|
|
982
991
|
};
|
|
983
992
|
if (payload.archived_limit !== null) {
|