@maudecode/talaria-web 1.20.0 → 1.21.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 +313 -8
- package/dist/api/automation-router.js +21 -1
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +412 -15
- 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/router.d.ts +1 -1
- package/dist/api/sessions-router.d.ts +1138 -29
- package/dist/api/sessions-router.js +58 -41
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/sse-routes.js +4 -2
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-router.d.ts +481 -29
- package/dist/api/tools-router.js +34 -9
- package/dist/api/tools-router.js.map +1 -1
- package/dist/http/context.d.ts +2 -0
- package/dist/http/context.js.map +1 -1
- package/dist/redact.d.ts +2 -0
- package/dist/redact.js +17 -2
- package/dist/redact.js.map +1 -1
- package/dist/runtime.js +36 -8
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +1 -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 +2 -0
- package/dist/sessions/anchor.js +4 -4
- 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/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 +50 -2
- package/dist/sessions/gateway-sessions.js +144 -11
- package/dist/sessions/gateway-sessions.js.map +1 -1
- package/dist/sessions/merge.d.ts +1 -0
- package/dist/sessions/merge.js +7 -2
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +8 -0
- package/dist/sessions/prefix-index.js +14 -3
- 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/relay.d.ts +12 -1
- package/dist/sessions/relay.js +75 -17
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +26 -1
- package/dist/sessions/service.js +200 -6
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.js +1 -0
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/storage/json-documents.js +1 -0
- package/dist/sessions/storage/json-documents.js.map +1 -1
- package/dist/sessions/store.d.ts +1 -0
- package/dist/sessions/store.js +1 -0
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +2 -0
- package/dist/sessions/streams.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 +20 -13
- package/dist/sessions/turn.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +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/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 +22 -3
- package/dist/tools/updates.js +118 -20
- package/dist/tools/updates.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/package.json +2 -2
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +20 -8
- 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/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +4 -4
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +109 -19
- 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/outbound_drafts.py +165 -0
- package/static/dist/FILES.txt +127 -128
- package/static/dist/assets/AppShell-c5989995.js +8 -0
- package/static/dist/assets/Button-nuaikybd.js +1 -0
- package/static/dist/assets/ChatPage-bfg4khph.js +6 -0
- package/static/dist/assets/ConnectTargets-k5wo9yo8.js +1 -0
- package/static/dist/assets/{Dialog-hta5utr3.js → Dialog-o8vo2aws.js} +1 -1
- package/static/dist/assets/{ExtensionRoute-zrhjn0wm.js → ExtensionRoute-l1yjrso4.js} +1 -1
- package/static/dist/assets/Field-j7o8cfps.js +1 -0
- package/static/dist/assets/HubRoute-efnwe4xz.js +2 -0
- package/static/dist/assets/Markdown-clqf5m22.js +2 -0
- package/static/dist/assets/{MarkdownRenderer-fbswsgld.js → MarkdownRenderer-ccgqrza3.js} +18 -18
- package/static/dist/assets/OAuthSignIn-h7bjaqp6.js +1 -0
- package/static/dist/assets/{ResourceSwitch-odi6dy2o.js → ResourceSwitch-oai2zqaj.js} +1 -1
- package/static/dist/assets/RightPanel-ho161a45.js +1 -0
- package/static/dist/assets/{Select-kr07928w.js → Select-d1g5a8bm.js} +1 -1
- package/static/dist/assets/SessionListPanel-i7kaokhi.js +1 -0
- package/static/dist/assets/SettingsLayout-lnecm87w.js +1 -0
- package/static/dist/assets/{States-icab19yg.js → States-easntmry.js} +1 -1
- package/static/dist/assets/TerminalPanel-lxhwd4jl.js +16 -0
- package/static/dist/assets/Toaster-l4sciy8t.js +1 -0
- package/static/dist/assets/_app-mqexqbg8.js +1 -0
- package/static/dist/assets/{_app.ext._extensionId-na62087t.js → _app.ext._extensionId-n797jp72.js} +1 -1
- package/static/dist/assets/{_app.index-jypgdqoi.js → _app.index-ne43mdw2.js} +1 -1
- package/static/dist/assets/{_app.insights-kabejdtm.js → _app.insights-fqonovb4.js} +1 -1
- package/static/dist/assets/{_app.kanban-m19kfcmx.js → _app.kanban-kysliv19.js} +1 -1
- package/static/dist/assets/{_app.logs-iw4m96sz.js → _app.logs-febut82r.js} +1 -1
- package/static/dist/assets/{_app.memory-jq5frwcg.js → _app.memory-ha86oj1c.js} +1 -1
- package/static/dist/assets/{_app.profiles-kwa3m7rp.js → _app.profiles-cnu3gxxq.js} +1 -1
- package/static/dist/assets/{_app.session._sessionId-o5lyeipj.js → _app.session._sessionId-ifzjpcgn.js} +1 -1
- package/static/dist/assets/{_app.settings-ckl8hdll.js → _app.settings-nmakdiaf.js} +1 -1
- package/static/dist/assets/_app.settings._section-djglnjmi.js +3 -0
- package/static/dist/assets/{_app.skills-n016rihd.js → _app.skills-f3wad8yo.js} +1 -1
- package/static/dist/assets/_app.tasks-l10py1c0.js +1 -0
- package/static/dist/assets/{_app.todos-btew5v2s.js → _app.todos-bml1m3r1.js} +1 -1
- package/static/dist/assets/{_app.workspaces-lnfk95ch.js → _app.workspaces-f3d066lx.js} +1 -1
- package/static/dist/assets/{abnfDiagram-VCTEODGH-dttheegb.js → abnfDiagram-VCTEODGH-i53jc4yp.js} +1 -1
- package/static/dist/assets/{architecture-7GRP2DOG-ic435919.js → architecture-7GRP2DOG-e3bv5m6f.js} +1 -1
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-8r3glgiq.js → architectureDiagram-5GKGNRK7-pakekxu2.js} +1 -1
- package/static/dist/assets/{archive-il7c6053.js → archive-ihqi7z2x.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jenyos6c.js → blockDiagram-I7D4REHJ-bc6bo1n6.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-nzlx7yc4.js → c4Diagram-7LVT6UL2-btvwk2qx.js} +1 -1
- package/static/dist/assets/channel-jn4f8443.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-g0cru63b.js → chunk-4HAMMTFA-dlwab11c.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-7rkswkjw.js → chunk-75Z2AOVW-dp5gh7i8.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-fn73jzdo.js → chunk-DU6HZSFF-bi06zl1c.js} +1 -1
- package/static/dist/assets/{chunk-F27PBJKO-oey8e72m.js → chunk-F27PBJKO-kvv1rnlh.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-l2a32wiy.js → chunk-GMAD6QVW-ji0rx9by.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-o9dwzh8h.js → chunk-GVQU2GXP-nmz0j82p.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-eblwj20b.js → chunk-IMKFNOWR-kmi1qx88.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-o2mufspb.js → chunk-L3NEJ4N5-xhb7mebj.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-ijp9pw29.js → chunk-OSK3NFVY-5a9sgscq.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-hs9hqwl4.js → chunk-P2QGCYS3-dfezp4vu.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-bp9rsqez.js → chunk-POPQ4Y6H-gd2vq3c0.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-brkprov6.js → chunk-PWAF6VOD-wvw2nksf.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-gmpv0pxz.js → chunk-SHT3W25Y-f58q97px.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-oldm08fu.js → chunk-SVP7TREG-abgwpyz9.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-ooqilfv7.js → chunk-TICWLB2K-h4sbs8ds.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-dzrw66se.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-dzrw66se.js +1 -0
- package/static/dist/assets/completionAudio-ce86msbu.js +1 -0
- package/static/dist/assets/{copy-jo006coq.js → copy-m9h56qa8.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-d47op7qs.js → cynefin-OW5HDTMX-g081vffs.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-doa7594y.js → cynefinDiagram-5FMLGOSQ-odxvjesk.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-os768dp4.js → dagre-GXQ25YYZ-cpdwzjs4.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-fyi81nxd.js → diagram-S7CK7UJ4-clv5mxvu.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-j3exggaq.js → diagram-UQ7AKVKN-m2ia1mbf.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-omo1en2l.js → diagram-VSXAHHWV-ea6zv636.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-oro2cyu0.js → diagram-VX7I27RA-oqlef685.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-byt9vdb7.js → diagram-Z3DM3KII-kjubcbwu.js} +1 -1
- package/static/dist/assets/{dist-etpoyscq.js → dist-carq1azj.js} +4 -4
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-ee3haugh.js → ebnfDiagram-PWID7BFC-fg0zri3e.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-d1e93yff.js → erDiagram-RLTQ6QDP-eb7pmk3x.js} +1 -1
- package/static/dist/assets/{eventmodeling-NTZA5JFV-i1ihb40c.js → eventmodeling-NTZA5JFV-gvi1fxhn.js} +1 -1
- package/static/dist/assets/flowDiagram-HODETNUW-abekab15.js +1 -0
- package/static/dist/assets/folder-plus-ksaons88.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-m7g0jud4.js → ganttDiagram-EL5Y4UJY-jmisowrc.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-hzdj07yy.js → gitGraph-4MIJSDKK-m7kt3u6e.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-dm9agbna.js → gitGraphDiagram-WWUBYQGX-nq7vfzh2.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-mmgz2czu.js → highlighted-body-KPVGNVTW-gcu017ay.js} +1 -1
- package/static/dist/assets/{host-fr6lni1p.js → host-ipp4e84c.js} +1 -1
- package/static/dist/assets/{index-73649w7o.js → index-d6vbxlra.js} +7 -4
- package/static/dist/assets/index-ey6qo0zx.css +2 -0
- package/static/dist/assets/{info-A6RAGUB7-lll1dqmm.js → info-A6RAGUB7-idazwfqe.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-k7esc639.js → infoDiagram-27XIBGKW-bb9jh8gl.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-lgr6k9wo.js → ishikawaDiagram-5VMMS53U-nqc132rv.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-ndmbxuqk.js → journeyDiagram-3NMN7TZE-fpvnhy44.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-mjxym0jp.js → kanban-definition-UXKFOSKX-ndzqm6fu.js} +1 -1
- package/static/dist/assets/{lazyRouteComponent-cwb6l7xh.js → lazyRouteComponent-javud235.js} +1 -1
- package/static/dist/assets/{line-mtr5k6il.js → line-g625e7cj.js} +1 -1
- package/static/dist/assets/{link-iadw4ghw.js → link-gfdaho08.js} +1 -1
- package/static/dist/assets/{login-lkhtzfcl.js → login-iv6yq4xf.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-cwj5cl6k.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-k91vdnvi.js → mermaid-parser.core-plzkuzov.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-ehztfea4.js → mindmap-definition-YA3MSWOX-ojrgs569.js} +1 -1
- package/static/dist/assets/onboarding-ff4emacu.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-ok2xrblz.js → packet-AYTQ26CC-gyaf9s8h.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-ec3rpj0m.js → pegDiagram-XKGWAZYB-bf6xj8mq.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-iwkir23u.js → pie-WAS4IAKB-f5ymzelo.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-fcpqpekh.js → pieDiagram-E7YTZNPT-d0qjl3zi.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-lqsync43.js → quadrantDiagram-AXDQQJYC-oqy1mras.js} +1 -1
- package/static/dist/assets/queryKeys-x8fjxhut.js +9 -0
- package/static/dist/assets/{radar-RG4KPBEZ-hje4jbk6.js → radar-RG4KPBEZ-b6jcjvda.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-gll9n6qi.js → railroad-74A4TZTK-e3a6lk5k.js} +1 -1
- package/static/dist/assets/{railroad-abnf-HS5TGJTU-o6h6lpn4.js → railroad-abnf-HS5TGJTU-ff5hocrx.js} +1 -1
- package/static/dist/assets/{railroad-ebnf-LZEXJU2U-juaefj6o.js → railroad-ebnf-LZEXJU2U-exkhyw4n.js} +1 -1
- package/static/dist/assets/{railroad-peg-WCYAUIDC-cgfhvpah.js → railroad-peg-WCYAUIDC-jefk9b7c.js} +1 -1
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-lp3w7awf.js → railroadDiagram-O6MQD6OU-e4amks1i.js} +1 -1
- package/static/dist/assets/{refresh-cw-iccm7a4e.js → refresh-cw-lfp4u1oh.js} +1 -1
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-ha8eibcf.js → requirementDiagram-BXWQKSXE-c77k1e2y.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-oxf31pr9.js → sankeyDiagram-P5KCCOFB-oa1cc52s.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-jiq8lhyo.js → sequenceDiagram-WJ2MYXX4-j20gqt22.js} +1 -1
- package/static/dist/assets/{share._token-o76ki0ly.js → share._token-kmfoflw6.js} +2 -2
- package/static/dist/assets/{sliders-horizontal-ddcs88av.js → sliders-horizontal-g5jkzd9k.js} +1 -1
- package/static/dist/assets/{stateDiagram-D77RDMKH-f3fslnon.js → stateDiagram-D77RDMKH-co2ghkdp.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-faw1opgh.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-k1hmk7jf.js → swimlanes-42K2YHIH-m30cktqe.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hfil433g.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-n3ncfy9r.js → timeline-definition-24CTP7MA-liuep6fl.js} +1 -1
- package/static/dist/assets/toast-zmb35u3r.js +56 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-l3y2pejt.js → treeView-Q6P3EWNA-np5d2jv2.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-jown9axh.js → treemap-WGGIJYW6-cmpltxh1.js} +1 -1
- package/static/dist/assets/{useForm-o4uu74mx.js → useForm-f1udzsjf.js} +1 -1
- package/static/dist/assets/{useParams-ftsveu84.js → useParams-ierevvts.js} +1 -1
- package/static/dist/assets/{useSearch-crqueqga.js → useSearch-i7nr9ypl.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-dh59uq1c.js → vennDiagram-4TSXK5OY-b2g42qrg.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-e6d74b0j.js → wardley-WFR3VGLG-lb0eqbff.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hnofh78f.js → wardleyDiagram-VM6X3IG4-ermwaqha.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-bpymjelb.js → xychartDiagram-S5SC5T6Z-dll0jldk.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/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/RightPanel-eu6enlo6.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/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/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-lhf1fsdf.css +0 -2
- 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/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,318 @@
|
|
|
1
|
+
/** Durable cross-chat runs; session queues and cron jobs keep their existing lifetimes. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { PromptQueueRunSchema } from '@maudecode/talaria-web-contracts';
|
|
4
|
+
import { updateDocument } from './storage/document.js';
|
|
5
|
+
import { HttpFailure } from './service.js';
|
|
6
|
+
import { startSessionChat } from './admission.js';
|
|
7
|
+
import { isSafeSessionId } from './session.js';
|
|
8
|
+
import { str } from '../util.js';
|
|
9
|
+
const namespace = 'prompt-queues';
|
|
10
|
+
const digest = (text) => createHash('sha256').update(text).digest('hex');
|
|
11
|
+
const terminal = new Set(['completed', 'failed', 'refused']);
|
|
12
|
+
function view(run) {
|
|
13
|
+
const actions = run.phase === 'draft' ? ['start', 'cancel'] : run.phase === 'running' ? ['pause', 'cancel']
|
|
14
|
+
: run.phase === 'paused' ? ['resume', 'cancel'] : run.phase === 'unknown' ? ['reconcile', 'cancel'] : [];
|
|
15
|
+
return { ...run, title: run.cards[0]?.text.split('\n')[0]?.slice(0, 80) || 'Prompt queue', actions, editable: run.phase === 'draft' };
|
|
16
|
+
}
|
|
17
|
+
export class PromptQueues {
|
|
18
|
+
documents;
|
|
19
|
+
deps;
|
|
20
|
+
active = new Set();
|
|
21
|
+
workers = new Map();
|
|
22
|
+
timer;
|
|
23
|
+
stopped = false;
|
|
24
|
+
constructor(documents, deps) {
|
|
25
|
+
this.documents = documents;
|
|
26
|
+
this.deps = deps;
|
|
27
|
+
}
|
|
28
|
+
scope() {
|
|
29
|
+
const deps = this.deps();
|
|
30
|
+
const profile = deps.activeProfile();
|
|
31
|
+
return { profile: deps.isRootProfile(profile) ? 'default' : profile, owner: deps.requestScope.getStore()?.notificationOwner ?? 'local-owner' };
|
|
32
|
+
}
|
|
33
|
+
parse(raw) {
|
|
34
|
+
if (!raw || typeof raw !== 'object' || typeof raw.owner !== 'string')
|
|
35
|
+
throw new Error('Invalid prompt queue document');
|
|
36
|
+
const saved = raw;
|
|
37
|
+
return { owner: saved.owner, run: PromptQueueRunSchema.parse(saved.run) };
|
|
38
|
+
}
|
|
39
|
+
owned(saved, scope) {
|
|
40
|
+
if (saved.owner !== scope.owner || saved.run.profile !== scope.profile)
|
|
41
|
+
throw new HttpFailure(404, 'Queue not found');
|
|
42
|
+
}
|
|
43
|
+
async load(id) {
|
|
44
|
+
if (!/^[a-f0-9]{64}$/.test(id))
|
|
45
|
+
throw new HttpFailure(404, 'Queue not found');
|
|
46
|
+
const doc = await this.documents.get(namespace, id);
|
|
47
|
+
if (!doc)
|
|
48
|
+
throw new HttpFailure(404, 'Queue not found');
|
|
49
|
+
return this.parse(doc.value);
|
|
50
|
+
}
|
|
51
|
+
async edit(id, fn, controlWrite = false) {
|
|
52
|
+
return updateDocument(this.documents, namespace, id, (raw) => {
|
|
53
|
+
const saved = this.parse(raw);
|
|
54
|
+
const before = JSON.stringify(saved);
|
|
55
|
+
const phase = saved.run.phase;
|
|
56
|
+
fn(saved);
|
|
57
|
+
saved.run = view(saved.run);
|
|
58
|
+
// Runtime receipts do not invalidate a still-permitted Pause/Cancel from the last read.
|
|
59
|
+
if (before !== JSON.stringify(saved) && (controlWrite || saved.run.phase !== phase))
|
|
60
|
+
saved.run.revision += 1;
|
|
61
|
+
return { value: saved, result: saved.run };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async list() {
|
|
65
|
+
const scope = this.scope();
|
|
66
|
+
const runs = [];
|
|
67
|
+
for (const { key } of await this.documents.list(namespace)) {
|
|
68
|
+
const saved = await this.load(key);
|
|
69
|
+
if (saved.owner === scope.owner && saved.run.profile === scope.profile)
|
|
70
|
+
runs.push(view(saved.run));
|
|
71
|
+
}
|
|
72
|
+
return { runs };
|
|
73
|
+
}
|
|
74
|
+
/** Revalidate the exact profile/project/backend at creation AND immediately before each admission. */
|
|
75
|
+
async target(input) {
|
|
76
|
+
const deps = this.deps();
|
|
77
|
+
if (!isSafeSessionId(input.session_id) || !(await deps.sessions.sessionIdVisible(input.session_id)))
|
|
78
|
+
throw new HttpFailure(404, 'Session not found');
|
|
79
|
+
const sid = await deps.sessions.resolveSessionId(input.session_id);
|
|
80
|
+
const detail = await deps.sessions.detail(sid, { messages: '0', resolve_model: '0' });
|
|
81
|
+
if (!deps.profilesMatch(str(detail.profile) || null, deps.activeProfile()))
|
|
82
|
+
throw new HttpFailure(404, 'Session not found');
|
|
83
|
+
if ((str(detail.project_id) || null) !== input.project_id || detail.archived === true)
|
|
84
|
+
throw new HttpFailure(409, 'The queue target changed project or was archived');
|
|
85
|
+
const owner = await deps.sessions.owner?.queueReceipt(sid);
|
|
86
|
+
if (owner) {
|
|
87
|
+
if (owner.state !== 'attached' || !owner.snapshot || owner.restarting || owner.snapshot.pending.some((p) => p.status === 'unknown'))
|
|
88
|
+
throw new HttpFailure(409, 'The owning Agent is unavailable or needs recovery');
|
|
89
|
+
return { session_id: sid, title: str(detail.title) || sid, backend: 'owner', authority_epoch: owner.snapshot.authority_epoch };
|
|
90
|
+
}
|
|
91
|
+
await deps.sessions.assertWritable(sid);
|
|
92
|
+
return { session_id: sid, title: str(detail.title) || sid, backend: 'direct', authority_epoch: null };
|
|
93
|
+
}
|
|
94
|
+
async cards(inputs, id, revision = 0) {
|
|
95
|
+
const cards = [];
|
|
96
|
+
for (const [index, input] of inputs.entries())
|
|
97
|
+
cards.push({ ...input, ...await this.target(input), request_id: `queue-${digest(`${id}:${revision}:${index}`)}`, status: 'waiting', stream_id: null, admission_id: null, outcome: null });
|
|
98
|
+
return cards;
|
|
99
|
+
}
|
|
100
|
+
async create(requestId, inputs) {
|
|
101
|
+
const scope = this.scope();
|
|
102
|
+
const id = digest(JSON.stringify([scope, requestId]));
|
|
103
|
+
const existing = await this.documents.get(namespace, id);
|
|
104
|
+
if (existing) {
|
|
105
|
+
const saved = this.parse(existing.value);
|
|
106
|
+
this.owned(saved, scope);
|
|
107
|
+
// A creation identity can recover a lost response but cannot replace a run's content.
|
|
108
|
+
const original = saved.run.cards.map(({ session_id, project_id, text }) => ({ session_id, project_id, text }));
|
|
109
|
+
if (JSON.stringify(original) !== JSON.stringify(inputs))
|
|
110
|
+
throw new HttpFailure(409, 'This queue creation identity was already used');
|
|
111
|
+
return view(saved.run);
|
|
112
|
+
}
|
|
113
|
+
const cards = await this.cards(inputs, id);
|
|
114
|
+
const run = view({ id, title: '', revision: 0, profile: scope.profile, phase: 'draft', current_step: 0, cards, actions: [], editable: true, error: null });
|
|
115
|
+
return updateDocument(this.documents, namespace, id, (raw) => {
|
|
116
|
+
if (raw) {
|
|
117
|
+
const saved = this.parse(raw);
|
|
118
|
+
this.owned(saved, scope);
|
|
119
|
+
if (JSON.stringify(saved.run.cards.map(({ session_id, project_id, text }) => ({ session_id, project_id, text }))) !== JSON.stringify(inputs))
|
|
120
|
+
throw new HttpFailure(409, 'This queue creation identity was already used');
|
|
121
|
+
return { value: saved, result: view(saved.run), skip: true };
|
|
122
|
+
}
|
|
123
|
+
return { value: { owner: scope.owner, run }, result: run };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async replace(id, revision, inputs) {
|
|
127
|
+
const scope = this.scope();
|
|
128
|
+
this.owned(await this.load(id), scope);
|
|
129
|
+
const cards = await this.cards(inputs, id, revision + 1);
|
|
130
|
+
return this.edit(id, (saved) => {
|
|
131
|
+
this.owned(saved, scope);
|
|
132
|
+
if (saved.run.revision !== revision || saved.run.phase !== 'draft')
|
|
133
|
+
throw new HttpFailure(409, 'Queue changed; refresh before editing');
|
|
134
|
+
saved.run.cards = cards;
|
|
135
|
+
}, true);
|
|
136
|
+
}
|
|
137
|
+
async action(id, revision, action) {
|
|
138
|
+
const scope = this.scope();
|
|
139
|
+
this.owned(await this.load(id), scope);
|
|
140
|
+
const run = await this.edit(id, (saved) => {
|
|
141
|
+
this.owned(saved, scope);
|
|
142
|
+
if (saved.run.revision !== revision || !view(saved.run).actions.includes(action))
|
|
143
|
+
throw new HttpFailure(409, 'Queue changed; refresh before acting');
|
|
144
|
+
if (action === 'start' || action === 'resume')
|
|
145
|
+
saved.run.phase = 'running';
|
|
146
|
+
if (action === 'pause')
|
|
147
|
+
saved.run.phase = 'paused';
|
|
148
|
+
if (action === 'cancel')
|
|
149
|
+
saved.run.phase = 'cancelled';
|
|
150
|
+
}, true);
|
|
151
|
+
this.active.add(id);
|
|
152
|
+
this.wake(id);
|
|
153
|
+
return run;
|
|
154
|
+
}
|
|
155
|
+
async initialize() {
|
|
156
|
+
for (const { key } of await this.documents.list(namespace)) {
|
|
157
|
+
const { run } = await this.load(key);
|
|
158
|
+
if (run.phase === 'running' || run.cards.some((c) => ['dispatching', 'running', 'unknown'].includes(c.status)))
|
|
159
|
+
this.active.add(key);
|
|
160
|
+
}
|
|
161
|
+
this.timer = setInterval(() => { for (const id of this.active)
|
|
162
|
+
this.wake(id); }, 2000);
|
|
163
|
+
this.timer.unref();
|
|
164
|
+
for (const id of this.active)
|
|
165
|
+
this.wake(id);
|
|
166
|
+
}
|
|
167
|
+
wake(id) {
|
|
168
|
+
if (this.stopped || this.workers.has(id))
|
|
169
|
+
return;
|
|
170
|
+
const worker = this.tick(id).catch((error) => { this.deps().log(`[webui] prompt queue reconciliation failed: ${error instanceof Error ? error.message : 'unknown error'}`); });
|
|
171
|
+
this.workers.set(id, worker);
|
|
172
|
+
void worker.finally(() => { this.workers.delete(id); });
|
|
173
|
+
}
|
|
174
|
+
/** Deterministic seam used by synthetic tests and the server's lifecycle worker. */
|
|
175
|
+
async settled() { await Promise.all([...this.workers.values()]); }
|
|
176
|
+
async close() {
|
|
177
|
+
this.stopped = true;
|
|
178
|
+
if (this.timer)
|
|
179
|
+
clearInterval(this.timer);
|
|
180
|
+
await this.settled();
|
|
181
|
+
}
|
|
182
|
+
async tick(id) {
|
|
183
|
+
const saved = await this.load(id);
|
|
184
|
+
await this.deps().requestScope.run({ requestProfile: saved.run.profile, notificationOwner: saved.owner }, async () => {
|
|
185
|
+
for (let count = 0; count <= saved.run.cards.length && !this.stopped; count += 1) {
|
|
186
|
+
const { run } = await this.load(id);
|
|
187
|
+
const card = run.cards[run.current_step];
|
|
188
|
+
if (!card) {
|
|
189
|
+
this.active.delete(id);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (card.status !== 'waiting') {
|
|
193
|
+
if (terminal.has(card.status)) {
|
|
194
|
+
this.active.delete(id);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const status = await this.receipt(card).catch(() => ({ status: 'unknown', outcome: null }));
|
|
198
|
+
await this.edit(id, ({ run: latest }) => {
|
|
199
|
+
const current = latest.cards[latest.current_step];
|
|
200
|
+
if (current.request_id !== card.request_id)
|
|
201
|
+
return;
|
|
202
|
+
current.status = status.status;
|
|
203
|
+
current.outcome = status.outcome;
|
|
204
|
+
if (current.status === 'completed') {
|
|
205
|
+
latest.error = null;
|
|
206
|
+
latest.current_step += 1;
|
|
207
|
+
if (latest.phase !== 'cancelled' && latest.current_step === latest.cards.length)
|
|
208
|
+
latest.phase = 'completed';
|
|
209
|
+
else if (latest.phase === 'unknown')
|
|
210
|
+
latest.phase = 'paused';
|
|
211
|
+
}
|
|
212
|
+
else if (current.status === 'unknown' && latest.phase === 'running')
|
|
213
|
+
latest.phase = 'unknown';
|
|
214
|
+
else if (current.status === 'failed' && latest.phase !== 'cancelled')
|
|
215
|
+
latest.phase = 'failed';
|
|
216
|
+
});
|
|
217
|
+
if (status.status === 'completed')
|
|
218
|
+
continue;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (run.phase !== 'running') {
|
|
222
|
+
this.active.delete(id);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Validate outside the transaction; CAS below rejects a concurrent pause/cancel before dispatch.
|
|
226
|
+
let target;
|
|
227
|
+
try {
|
|
228
|
+
target = await this.target(card);
|
|
229
|
+
if (target.session_id !== card.session_id || target.backend !== card.backend || target.authority_epoch !== card.authority_epoch)
|
|
230
|
+
throw new HttpFailure(409, 'Queue target authority changed');
|
|
231
|
+
if (await this.deps().sessions.activeRunBlocking(card.session_id))
|
|
232
|
+
throw new HttpFailure(409, 'Queue target is busy');
|
|
233
|
+
if (card.backend === 'owner') {
|
|
234
|
+
const snapshot = await this.deps().sessions.owner.queueReceipt(card.session_id);
|
|
235
|
+
if (!snapshot?.snapshot || snapshot.snapshot.running || snapshot.snapshot.pending.some((p) => p.status !== 'terminal'))
|
|
236
|
+
throw new HttpFailure(409, 'Queue target is busy');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
await this.edit(id, ({ run: latest }) => {
|
|
241
|
+
if (latest.revision !== run.revision)
|
|
242
|
+
return;
|
|
243
|
+
latest.cards[latest.current_step].status = 'refused';
|
|
244
|
+
latest.phase = 'refused';
|
|
245
|
+
latest.error = error instanceof HttpFailure ? error.message : 'Queue target could not be verified';
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
let claimed = false;
|
|
250
|
+
await this.edit(id, ({ run: latest }) => {
|
|
251
|
+
claimed = false;
|
|
252
|
+
if (latest.revision !== run.revision || latest.phase !== 'running')
|
|
253
|
+
return;
|
|
254
|
+
latest.cards[latest.current_step].status = 'dispatching';
|
|
255
|
+
claimed = true;
|
|
256
|
+
});
|
|
257
|
+
if (!claimed || this.stopped)
|
|
258
|
+
return;
|
|
259
|
+
// The durable claim is the linearization point. Pause/cancel after it hold successors, never resend this step.
|
|
260
|
+
try {
|
|
261
|
+
const lease = await this.deps().profiles.beginWrite(run.profile);
|
|
262
|
+
if (typeof lease !== 'function')
|
|
263
|
+
throw new HttpFailure(409, 'Queue target profile is unavailable');
|
|
264
|
+
let response;
|
|
265
|
+
try {
|
|
266
|
+
response = await startSessionChat(this.deps(), { session_id: card.session_id, message: card.text, submission_id: card.request_id }, {}, undefined, { ...card, profile: run.profile });
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
lease();
|
|
270
|
+
}
|
|
271
|
+
await this.edit(id, ({ run: latest }) => {
|
|
272
|
+
const current = latest.cards[latest.current_step];
|
|
273
|
+
current.stream_id = str(response.stream_id) || null;
|
|
274
|
+
current.admission_id = str(response.admission_id) || null;
|
|
275
|
+
current.status = current.stream_id || current.admission_id ? 'running' : 'unknown';
|
|
276
|
+
if (current.status === 'unknown' && latest.phase === 'running')
|
|
277
|
+
latest.phase = 'unknown';
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
await this.edit(id, ({ run: latest }) => {
|
|
282
|
+
const current = latest.cards[latest.current_step];
|
|
283
|
+
// Admission errors after a side effect can be ambiguous; only typed definite refusals are terminal.
|
|
284
|
+
const refused = error instanceof HttpFailure && error.status < 500 && error.extra.outcome_unknown !== true;
|
|
285
|
+
current.status = refused ? 'refused' : 'unknown';
|
|
286
|
+
if (latest.phase !== 'cancelled' && latest.phase !== 'paused')
|
|
287
|
+
latest.phase = current.status;
|
|
288
|
+
latest.error = refused ? error.message : 'Admission outcome is unknown; reconcile before continuing';
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
async receipt(card) {
|
|
296
|
+
const deps = this.deps();
|
|
297
|
+
if (card.backend === 'owner') {
|
|
298
|
+
if (!card.admission_id)
|
|
299
|
+
return { status: 'unknown', outcome: null };
|
|
300
|
+
const result = await deps.sessions.owner?.queueReceipt(card.session_id, card.admission_id);
|
|
301
|
+
const receipt = result?.receipt;
|
|
302
|
+
if (result?.state !== 'attached' || !receipt || !('admission_id' in receipt) || receipt.authority_epoch !== card.authority_epoch || card.admission_id && card.admission_id !== receipt.admission_id)
|
|
303
|
+
return { status: 'unknown', outcome: null };
|
|
304
|
+
if (receipt.status === 'terminal')
|
|
305
|
+
return { status: receipt.outcome === 'completed' ? 'completed' : 'failed', outcome: str(receipt.outcome) || null };
|
|
306
|
+
return { status: receipt.status === 'unknown' ? 'unknown' : 'running', outcome: null };
|
|
307
|
+
}
|
|
308
|
+
if (!card.stream_id)
|
|
309
|
+
return { status: 'unknown', outcome: null };
|
|
310
|
+
if (deps.registry.activeRuns.has(card.stream_id))
|
|
311
|
+
return { status: 'running', outcome: null };
|
|
312
|
+
const summary = await deps.journal.summary(card.session_id, card.stream_id);
|
|
313
|
+
if (!summary?.terminal)
|
|
314
|
+
return { status: 'unknown', outcome: null };
|
|
315
|
+
return { status: summary.terminal_state === 'completed' ? 'completed' : 'failed', outcome: summary.terminal_state };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=prompt-queues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-queues.js","sourceRoot":"","sources":["../../src/sessions/prompt-queues.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/relay.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import type { SessionEventBus } from './events.js';
|
|
1
2
|
import type { DocumentBackend } from './storage/backend.js';
|
|
3
|
+
import type { SessionActivityPhase } from '@maudecode/talaria-web-contracts';
|
|
4
|
+
import type { BackgroundActivity } from './background-tasks.js';
|
|
2
5
|
import type { StreamRegistry } from './streams.js';
|
|
3
6
|
import type { PendingPrompts } from './pending.js';
|
|
7
|
+
import type { Session } from './session.js';
|
|
8
|
+
import type { SessionPrefixIndex } from './prefix-index.js';
|
|
4
9
|
import type { SessionStore } from './store.js';
|
|
5
10
|
export declare const PRESENCE_LEASE_SECONDS = 90;
|
|
6
11
|
export declare const PRESENCE_MAX_LEASES = 256;
|
|
@@ -55,6 +60,8 @@ export interface RelayPublisherDeps {
|
|
|
55
60
|
pending: PendingPrompts;
|
|
56
61
|
store: SessionStore;
|
|
57
62
|
presence: PresenceLeases;
|
|
63
|
+
background?: BackgroundActivity;
|
|
64
|
+
activitySummary?: (session: Session) => ReturnType<SessionPrefixIndex['activitySummary']>;
|
|
58
65
|
profileHome: (profile: string) => string;
|
|
59
66
|
profilesMatch: (row: string | null | undefined, active: string | null | undefined) => boolean;
|
|
60
67
|
/** The profile's messageful Agent `state.db` sessions (`readImportableAgentSessionRows`). */
|
|
@@ -70,6 +77,7 @@ export interface RelayState {
|
|
|
70
77
|
revision: number;
|
|
71
78
|
title: string;
|
|
72
79
|
phase: string;
|
|
80
|
+
activityPhase?: SessionActivityPhase;
|
|
73
81
|
updatedAt: number;
|
|
74
82
|
deepLink: string;
|
|
75
83
|
alertEligible?: false;
|
|
@@ -106,7 +114,7 @@ export declare class RelayPublisher {
|
|
|
106
114
|
private pendingDeleted;
|
|
107
115
|
/** Send the views queued before the snapshot just published, so the relay already holds every outcome they saw. */
|
|
108
116
|
private flushViews;
|
|
109
|
-
private
|
|
117
|
+
private reserveRevisions;
|
|
110
118
|
private sleep;
|
|
111
119
|
private run;
|
|
112
120
|
/** Python `build_states`: one row per session with a live or recently terminal run in this profile. */
|
|
@@ -129,6 +137,7 @@ export declare class RelayPublisher {
|
|
|
129
137
|
private put;
|
|
130
138
|
}
|
|
131
139
|
export interface RelayServiceDeps extends RelayPublisherDeps {
|
|
140
|
+
events: SessionEventBus;
|
|
132
141
|
env: Record<string, string | undefined>;
|
|
133
142
|
canonicalProfile: (profile: string) => string;
|
|
134
143
|
addListener: (listener: () => void) => () => void;
|
|
@@ -154,6 +163,8 @@ export declare class RelayService {
|
|
|
154
163
|
clearDeleted(sid: string, profile: string | null): Promise<void>;
|
|
155
164
|
/** Terminal turn events reach the relay even mid-swap (Python `note_talaria_terminal`). */
|
|
156
165
|
noteTerminal(streamId: string, phase: string): void;
|
|
166
|
+
/** Shared Web-only projection for direct turns and receipt-confirmed native owner executions. */
|
|
167
|
+
noteWebCompletion(profileName: string, sessionId: string, runIdentity: string): void;
|
|
157
168
|
/** Python `configure_talaria_relay_publisher`: validate with a real snapshot before swapping publishers. */
|
|
158
169
|
private configure;
|
|
159
170
|
/** Python `pair_talaria_relay`, serialised so concurrent enrollments preserve both mappings. */
|
package/dist/sessions/relay.js
CHANGED
|
@@ -294,6 +294,10 @@ export class RelayPublisher {
|
|
|
294
294
|
const path = `/v1/publishers/${encodeURIComponent(this.config.publisher_id)}/profiles/${encodeURIComponent(cfg.profile_id)}/sessions/${encodeURIComponent(sid)}/viewed`;
|
|
295
295
|
try {
|
|
296
296
|
await this.put(path, JSON.stringify({ through: view.through }));
|
|
297
|
+
if (view.deleted && !await hasSessionData(this.deps.store, sid)) {
|
|
298
|
+
const revision = (await this.reserveRevisions(1))[0];
|
|
299
|
+
await this.put(path.replace(/\/viewed$/, '/activity'), JSON.stringify({ eventId: `deleted:${view.deleted.id}`, revision, state: null }));
|
|
300
|
+
}
|
|
297
301
|
accepted = true;
|
|
298
302
|
}
|
|
299
303
|
catch (error) {
|
|
@@ -316,9 +320,16 @@ export class RelayPublisher {
|
|
|
316
320
|
this.views.delete(sid);
|
|
317
321
|
}
|
|
318
322
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
323
|
+
async reserveRevisions(count) {
|
|
324
|
+
return (await updateDocument(this.deps.documents, 'relay', 'revision', (raw) => {
|
|
325
|
+
let floor = Number.parseInt(str(raw), 10) || 0;
|
|
326
|
+
const revisions = Array.from({ length: count }, () => {
|
|
327
|
+
this.lastRevision = Math.max(this.lastRevision + 1, floor + 1, Math.floor(this.deps.now() * 1000));
|
|
328
|
+
floor = this.lastRevision;
|
|
329
|
+
return floor;
|
|
330
|
+
});
|
|
331
|
+
return { value: `${String(this.lastRevision)}\n`, result: revisions };
|
|
332
|
+
}));
|
|
322
333
|
}
|
|
323
334
|
sleep(seconds) {
|
|
324
335
|
return new Promise((resolve) => {
|
|
@@ -361,8 +372,13 @@ export class RelayPublisher {
|
|
|
361
372
|
/** Python `build_states`: one row per session with a live or recently terminal run in this profile. */
|
|
362
373
|
async buildStates(profile) {
|
|
363
374
|
const cutoff = this.deps.now() - TERMINAL_RETENTION_S;
|
|
375
|
+
const backgroundIds = new Set();
|
|
376
|
+
for (const sid of await this.deps.background?.sessionIds() ?? []) {
|
|
377
|
+
if ((await this.deps.background.receipts(sid)).some((receipt) => ['running', 'attention', 'unknown'].includes(receipt.status) || (receipt.completed_at ?? 0) >= cutoff))
|
|
378
|
+
backgroundIds.add(sid);
|
|
379
|
+
}
|
|
364
380
|
for (const [sid, run] of this.terminal)
|
|
365
|
-
if (run.terminal_at < cutoff)
|
|
381
|
+
if (run.terminal_at < cutoff && !backgroundIds.has(sid))
|
|
366
382
|
this.terminal.delete(sid);
|
|
367
383
|
const bySession = new Map();
|
|
368
384
|
for (const run of this.deps.registry.activeRuns.values()) {
|
|
@@ -378,9 +394,21 @@ export class RelayPublisher {
|
|
|
378
394
|
for (const [sid, run] of this.terminal)
|
|
379
395
|
if (!bySession.has(sid))
|
|
380
396
|
bySession.set(sid, run);
|
|
397
|
+
for (const sid of backgroundIds) {
|
|
398
|
+
if (bySession.has(sid) || !await hasSessionData(this.deps.store, sid))
|
|
399
|
+
continue;
|
|
400
|
+
const session = await this.deps.store.get(sid);
|
|
401
|
+
const latest = this.deps.activitySummary?.(session);
|
|
402
|
+
const terminal = latest?.terminalState ?? null;
|
|
403
|
+
const relay_phase = terminal === null ? undefined : terminal === 'completed' || terminal === 'tool_limit_reached' ? 'completed' : terminal === 'cancelled' ? 'cancelled' : 'failed';
|
|
404
|
+
bySession.set(sid, { session_id: sid, stream_id: latest?.turnId ?? '', started_at: latest?.timestamp ?? 0, phase: 'settled', workspace: session.workspace, model: session.model, provider: session.model_provider, ephemeral: false,
|
|
405
|
+
...(relay_phase ? { relay_phase, terminal_at: Number(latest?.timestamp) || session.updated_at } : {}) });
|
|
406
|
+
}
|
|
381
407
|
const alertEligible = this.alertEligibilitySupported ? !this.deps.presence.has(profile) : true;
|
|
382
408
|
const states = [];
|
|
383
409
|
for (const [sid, run] of bySession) {
|
|
410
|
+
if (run.activity_parent_session_id)
|
|
411
|
+
continue;
|
|
384
412
|
let session;
|
|
385
413
|
try {
|
|
386
414
|
session = (await this.deps.store.get(sid, { metadataOnly: true }));
|
|
@@ -390,7 +418,7 @@ export class RelayPublisher {
|
|
|
390
418
|
}
|
|
391
419
|
if (!this.deps.profilesMatch(session.profile, profile))
|
|
392
420
|
continue;
|
|
393
|
-
const revision =
|
|
421
|
+
const revision = 0;
|
|
394
422
|
let phase = run.relay_phase ?? 'running';
|
|
395
423
|
if (!['completed', 'failed', 'cancelled'].includes(phase) && this.deps.pending.approvalPending(sid).pending)
|
|
396
424
|
phase = 'waiting_for_approval';
|
|
@@ -398,24 +426,34 @@ export class RelayPublisher {
|
|
|
398
426
|
phase = 'waiting_for_input';
|
|
399
427
|
if (phase === 'running' && run.phase.endsWith('starting'))
|
|
400
428
|
phase = 'starting';
|
|
429
|
+
const snapshot = await this.deps.background?.snapshot(sid, session.profile, { ...(run.relay_phase ? { excludeStreamId: run.stream_id, terminalPhase: run.relay_phase } : {}) });
|
|
430
|
+
if ([...this.deps.registry.activeRuns.values()].some((current) => current.session_id === sid && current.stream_id !== run.stream_id && current.started_at >= run.started_at)) {
|
|
431
|
+
this.changed();
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
try {
|
|
435
|
+
if (!this.deps.profilesMatch((await this.deps.store.get(sid, { metadataOnly: true })).profile, profile))
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
if (run.phase === 'settled' && !run.stream_id)
|
|
442
|
+
phase = snapshot?.activity_phase ?? 'stale';
|
|
401
443
|
// A finished run keeps the instant it ended, so a viewer who saw that turn covers it whenever the snapshot is built.
|
|
402
444
|
const updatedAt = Math.floor((run.terminal_at ?? this.deps.now()) * 1000);
|
|
403
|
-
const state = { sessionId: sid, streamId: run.stream_id || null, eventId: `snapshot:${String(revision)}:${sid}`, revision, title: (session.title || 'Untitled').slice(0, 120), phase, updatedAt, deepLink: `/sessions/${encodeURIComponent(sid)}` };
|
|
445
|
+
const state = { sessionId: sid, streamId: run.stream_id || null, eventId: `snapshot:${String(revision)}:${sid}`, revision, ...(snapshot ? { activityPhase: snapshot.activity_phase } : {}), title: (session.title || 'Untitled').slice(0, 120), phase, updatedAt, deepLink: `/sessions/${encodeURIComponent(sid)}` };
|
|
404
446
|
if (!alertEligible)
|
|
405
447
|
state.alertEligible = false;
|
|
406
448
|
states.push(state);
|
|
407
449
|
}
|
|
408
|
-
if (states.length)
|
|
409
|
-
await
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
}
|
|
416
|
-
this.lastRevision = Math.max(this.lastRevision, floor);
|
|
417
|
-
return { value: `${String(this.lastRevision)}\n`, result: undefined };
|
|
418
|
-
});
|
|
450
|
+
if (states.length) {
|
|
451
|
+
const revisions = await this.reserveRevisions(states.length);
|
|
452
|
+
for (const [index, state] of states.entries()) {
|
|
453
|
+
state.revision = revisions[index];
|
|
454
|
+
state.eventId = `snapshot:${String(state.revision)}:${state.sessionId}`;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
419
457
|
return states;
|
|
420
458
|
}
|
|
421
459
|
async publishSnapshot(isolatePermanent = false) {
|
|
@@ -587,6 +625,9 @@ export class RelayPublisher {
|
|
|
587
625
|
}
|
|
588
626
|
async publishProfileSnapshot(profile, profileId) {
|
|
589
627
|
const states = (await this.buildStates(profile));
|
|
628
|
+
const config = this.config.profiles[profile];
|
|
629
|
+
if (config?.profile_id !== profileId || !await this.publishes(profile, config))
|
|
630
|
+
return;
|
|
590
631
|
try {
|
|
591
632
|
await this.putSnapshot(profileId, states);
|
|
592
633
|
}
|
|
@@ -728,6 +769,23 @@ export class RelayService {
|
|
|
728
769
|
const current = this.publisher ?? this.candidate;
|
|
729
770
|
if (current && current !== publisher)
|
|
730
771
|
current.noteTerminal(streamId, phase);
|
|
772
|
+
const run = this.deps.registry.activeRuns.get(streamId);
|
|
773
|
+
if (phase !== 'completed' || !run || run.ephemeral || run.health_only)
|
|
774
|
+
return;
|
|
775
|
+
// Capture the run before teardown; this never materializes an owner-managed session.
|
|
776
|
+
void this.deps.store.get(run.session_id, { metadataOnly: true }).then((session) => {
|
|
777
|
+
this.noteWebCompletion(session.profile ?? 'default', run.session_id, run.stream_id);
|
|
778
|
+
}).catch(() => undefined);
|
|
779
|
+
}
|
|
780
|
+
/** Shared Web-only projection for direct turns and receipt-confirmed native owner executions. */
|
|
781
|
+
noteWebCompletion(profileName, sessionId, runIdentity) {
|
|
782
|
+
const profile = this.deps.canonicalProfile(profileName);
|
|
783
|
+
const expires = this.deps.now() * 1000 + 60_000;
|
|
784
|
+
void (async () => {
|
|
785
|
+
const scope = await profileIdentity(this.deps, profile);
|
|
786
|
+
const identity = createHash('sha256').update(JSON.stringify([scope, runIdentity])).digest('hex');
|
|
787
|
+
this.deps.events.publish('web_completion', { profile, sessionId, webAudio: { identity, scope, profile, eligible: true, expires_at: expires } });
|
|
788
|
+
})().catch(() => undefined);
|
|
731
789
|
}
|
|
732
790
|
/** Python `configure_talaria_relay_publisher`: validate with a real snapshot before swapping publishers. */
|
|
733
791
|
async configure(config, validate) {
|