@maudecode/talaria-web 1.14.0 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_release.json +4 -4
- package/dist/api/automation-router.d.ts +123 -7
- package/dist/api/automation-router.js +5 -0
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +728 -55
- package/dist/api/chat-router.js +122 -126
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.js +44 -32
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.js +5 -58
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +6 -3
- package/dist/api/router.js +10 -8
- package/dist/api/router.js.map +1 -1
- package/dist/api/sessions-router.d.ts +2583 -297
- package/dist/api/sessions-router.js +92 -47
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +188 -17
- package/dist/api/settings-router.js +75 -26
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.js +1 -1
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-router.d.ts +13 -1
- package/dist/api/tools-router.js +10 -8
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.d.ts +3620 -343
- package/dist/auth/gate.js +8 -4
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/oidc.d.ts +6 -2
- package/dist/auth/oidc.js +16 -11
- package/dist/auth/oidc.js.map +1 -1
- package/dist/auth/store.d.ts +14 -2
- package/dist/auth/store.js +26 -1
- package/dist/auth/store.js.map +1 -1
- package/dist/cli/dotenv.d.ts +1 -1
- package/dist/cli/dotenv.js +36 -3
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/config/agent-config.js +20 -15
- package/dist/config/agent-config.js.map +1 -1
- package/dist/http/addresses.d.ts +6 -0
- package/dist/http/addresses.js +26 -0
- package/dist/http/addresses.js.map +1 -1
- package/dist/http/context.d.ts +7 -5
- package/dist/http/context.js.map +1 -1
- package/dist/links.d.ts +26 -0
- package/dist/links.js +60 -0
- package/dist/links.js.map +1 -0
- package/dist/onboarding.d.ts +1 -1
- package/dist/onboarding.js +28 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.js +1 -1
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/providers/catalog.d.ts +85 -1
- package/dist/providers/catalog.js +280 -43
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/tables.d.ts +3 -1
- package/dist/providers/tables.js +9 -4
- package/dist/providers/tables.js.map +1 -1
- package/dist/redact.js +493 -13
- package/dist/redact.js.map +1 -1
- package/dist/runtime.js +104 -42
- package/dist/runtime.js.map +1 -1
- package/dist/sessions/anchor.d.ts +22 -3
- package/dist/sessions/anchor.js +87 -42
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +140 -0
- package/dist/sessions/background-tasks.js +352 -0
- package/dist/sessions/background-tasks.js.map +1 -0
- package/dist/sessions/background-updates.d.ts +56 -0
- package/dist/sessions/background-updates.js +152 -0
- package/dist/sessions/background-updates.js.map +1 -0
- package/dist/sessions/cli-sessions.d.ts +6 -0
- package/dist/sessions/cli-sessions.js +20 -7
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +17 -1
- package/dist/sessions/completions.js +84 -13
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +33 -0
- package/dist/sessions/compress.js +66 -0
- package/dist/sessions/compress.js.map +1 -0
- package/dist/sessions/list.d.ts +22 -4
- package/dist/sessions/list.js +113 -33
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +81 -7
- package/dist/sessions/merge.js +391 -26
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/pending.d.ts +5 -0
- package/dist/sessions/pending.js +30 -10
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/relay.d.ts +7 -1
- package/dist/sessions/relay.js +17 -4
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +118 -6
- package/dist/sessions/service.js +564 -65
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +22 -1
- package/dist/sessions/session.js +29 -2
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.js +11 -2
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/source-kind.d.ts +22 -0
- package/dist/sessions/source-kind.js +54 -0
- package/dist/sessions/source-kind.js.map +1 -0
- package/dist/sessions/state-db.d.ts +10 -1
- package/dist/sessions/state-db.js +48 -17
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -0
- package/dist/sessions/store.js +24 -5
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +3 -0
- package/dist/sessions/streams.js +0 -5
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.d.ts +4 -0
- package/dist/sessions/titles.js +16 -0
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +1 -0
- package/dist/sessions/turn-context.js +3 -0
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +85 -7
- package/dist/sessions/turn.js +518 -170
- package/dist/sessions/turn.js.map +1 -1
- package/dist/settings.d.ts +2 -0
- package/dist/settings.js +13 -0
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/fake.js +2 -0
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/tools/commands.d.ts +15 -0
- package/dist/tools/commands.js +52 -0
- package/dist/tools/commands.js.map +1 -0
- package/dist/tools/crons.d.ts +38 -4
- package/dist/tools/crons.js +323 -36
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/mcp.js +5 -1
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +1 -1
- package/dist/tools/update-notifications.js +1 -1
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/updates.d.ts +8 -3
- package/dist/tools/updates.js +133 -34
- package/dist/tools/updates.js.map +1 -1
- package/dist/workspace/git.d.ts +57 -10
- package/dist/workspace/git.js +302 -195
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media-refs.d.ts +13 -0
- package/dist/workspace/media-refs.js +165 -0
- package/dist/workspace/media-refs.js.map +1 -0
- package/dist/workspace/media.d.ts +19 -0
- package/dist/workspace/media.js +61 -2
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +7 -1
- package/dist/workspace/workspaces.js +30 -21
- package/dist/workspace/workspaces.js.map +1 -1
- package/dist/workspace/worktrees.d.ts +2 -4
- package/dist/workspace/worktrees.js +28 -33
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +4 -2
- package/sidecar/scripts/replay_sidecar.py +3 -1
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/home.py +59 -2
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +19 -3
- package/sidecar/talaria_sidecar/methods/chat.py +360 -27
- package/sidecar/talaria_sidecar/methods/commands.py +46 -31
- package/sidecar/talaria_sidecar/methods/config.py +14 -10
- package/sidecar/talaria_sidecar/methods/cron.py +22 -14
- package/sidecar/talaria_sidecar/methods/oauth.py +439 -0
- package/sidecar/talaria_sidecar/methods/process.py +318 -0
- package/sidecar/talaria_sidecar/methods/profiles.py +5 -4
- package/sidecar/talaria_sidecar/methods/providers.py +161 -1
- package/sidecar/talaria_sidecar/methods/runtime.py +2 -0
- package/sidecar/talaria_sidecar/methods/text.py +1 -20
- package/sidecar/talaria_sidecar/methods/usage.py +7 -1
- package/static/dist/FILES.txt +124 -119
- package/static/dist/assets/AppShell-ef3bhu32.js +1 -0
- package/static/dist/assets/Button-nx37f4u1.js +1 -0
- package/static/dist/assets/ChatPage-cdcpykcg.js +25 -0
- package/static/dist/assets/Dialog-mec42hvb.js +1 -0
- package/static/dist/assets/HubRoute-ecb65zpr.js +2 -0
- package/static/dist/assets/{Markdown-emii55o0.js → Markdown-jqrx5es0.js} +125 -125
- package/static/dist/assets/RightPanel-d1lgvk4s.js +1 -0
- package/static/dist/assets/Select-h4ivl9qf.js +1 -0
- package/static/dist/assets/SessionListPanel-ewib046b.js +1 -0
- package/static/dist/assets/SettingsLayout-lx654cup.js +1 -0
- package/static/dist/assets/States-ehsb6lzo.js +1 -0
- package/static/dist/assets/Toaster-mch1pa3t.js +1 -0
- package/static/dist/assets/_app-m8d961ef.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-mp33hbzi.js +1 -0
- package/static/dist/assets/_app.index-dk6zp7e0.js +1 -0
- package/static/dist/assets/_app.insights-jt2fk4i1.js +1 -0
- package/static/dist/assets/_app.kanban-if4pubeu.js +1 -0
- package/static/dist/assets/_app.logs-mfaw9m6g.js +1 -0
- package/static/dist/assets/_app.memory-h3eaarb6.js +1 -0
- package/static/dist/assets/_app.profiles-ienktovs.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-m6nx9g8t.js → _app.session._sessionId-hh27wwu2.js} +1 -1
- package/static/dist/assets/_app.settings-dpoe0bzf.js +1 -0
- package/static/dist/assets/_app.settings._section-l468ynag.js +3 -0
- package/static/dist/assets/_app.skills-kcbncc8i.js +1 -0
- package/static/dist/assets/_app.tasks-occdrqhw.js +2 -0
- package/static/dist/assets/_app.todos-nnke2rcc.js +1 -0
- package/static/dist/assets/_app.workspaces-cdlatvwj.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-kejgxpil.js → abnfDiagram-VCTEODGH-oity9y4o.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-hj11333z.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-ceaepnyr.js +36 -0
- package/static/dist/assets/back-eu64w89w.js +1 -0
- package/static/dist/assets/{blockDiagram-I7D4REHJ-l1466a7j.js → blockDiagram-I7D4REHJ-n79st4pj.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-gg3aq3sr.js → c4Diagram-7LVT6UL2-mi73akzk.js} +1 -1
- package/static/dist/assets/cancel-mzvkdjg8.js +1 -0
- package/static/dist/assets/channel-mbvmf2vv.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-oalgz5l8.js → chunk-4HAMMTFA-laat0g1q.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-babmzhdg.js → chunk-75Z2AOVW-0psy1tr2.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-lagu350c.js → chunk-DU6HZSFF-lw8uox8x.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-gjh2tqif.js → chunk-F27PBJKO-erassib3.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-ipdgja5c.js → chunk-GMAD6QVW-fz7rx619.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-j8wkn1at.js → chunk-GVQU2GXP-gdb0epb2.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-k00laqyk.js → chunk-IMKFNOWR-ea8t26qw.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-fju6xqj4.js → chunk-L3NEJ4N5-mb1gu9kz.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-bi6widqt.js → chunk-OSK3NFVY-eovmccvy.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-czr4tebv.js → chunk-P2QGCYS3-bo55zjo5.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-ktdhn67w.js → chunk-POPQ4Y6H-ja7ohe4h.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-ii4dsu0d.js → chunk-PWAF6VOD-e30g9nus.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-fpwk3xxp.js → chunk-SHT3W25Y-gbb798f7.js} +3 -3
- package/static/dist/assets/{chunk-SVP7TREG-k0jrvhei.js → chunk-SVP7TREG-h2iw8urm.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-nkqv9ot0.js → chunk-TICWLB2K-fd2cottz.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-o8r05k0n.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-o8r05k0n.js +1 -0
- package/static/dist/assets/{copied-gpchexqu.js → copied-h65fc3cx.js} +1 -1
- package/static/dist/assets/copy-e6977uwq.js +1 -0
- package/static/dist/assets/{cynefin-OW5HDTMX-lqxt8rs3.js → cynefin-OW5HDTMX-lbltyl5j.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-j9eqovf5.js → cynefinDiagram-5FMLGOSQ-lxhsqq4a.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-m9agobjm.js → dagre-GXQ25YYZ-gn4nnaln.js} +4 -4
- package/static/dist/assets/{diagram-S7CK7UJ4-itodc50c.js → diagram-S7CK7UJ4-pa3ij6q7.js} +3 -3
- package/static/dist/assets/{diagram-UQ7AKVKN-n1h2t4ah.js → diagram-UQ7AKVKN-zbipyz57.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-lvtvm9bj.js → diagram-VSXAHHWV-d1kbpzgf.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-cgas58sy.js → diagram-VX7I27RA-i3ty14xl.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-d0aeps1q.js → diagram-Z3DM3KII-m8xefqa7.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-md345fyq.js → ebnfDiagram-PWID7BFC-nz7wj05l.js} +1 -1
- package/static/dist/assets/endpoints-k7yf25m0.js +64 -0
- package/static/dist/assets/{erDiagram-RLTQ6QDP-i4rua63b.js → erDiagram-RLTQ6QDP-fa41ib83.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-kpbq09bx.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-lcz0kx14.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-geqx7zgl.js → ganttDiagram-EL5Y4UJY-n7zq01qu.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-leoq0z8t.js → gitGraph-4MIJSDKK-c89emb07.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-llrlxfha.js → gitGraphDiagram-WWUBYQGX-cz7cgr6w.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-kq2cnw6q.js → highlighted-body-KPVGNVTW-d9bapmni.js} +1 -1
- package/static/dist/assets/{index-f9bzglkn.js → index-h00usru2.js} +3 -3
- package/static/dist/assets/index-n73ijkv2.css +2 -0
- package/static/dist/assets/{info-A6RAGUB7-lkly4xj6.js → info-A6RAGUB7-ndddhhhh.js} +1 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-ccxigcpf.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-hq6jf374.js → ishikawaDiagram-5VMMS53U-le0z9vtc.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-is03ntb0.js → journeyDiagram-3NMN7TZE-ivsmb26o.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-jmerizqb.js → kanban-definition-UXKFOSKX-h6n2awt0.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-m1rtyk4t.js +1 -0
- package/static/dist/assets/{line-laaa8h99.js → line-dmzlfe0u.js} +1 -1
- package/static/dist/assets/link-budeg5t9.js +1 -0
- package/static/dist/assets/login-kjhasvp8.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-jb5d211j.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-ix4junux.js → mermaid-parser.core-gwyd5bnq.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-o0e0adl1.js → mindmap-definition-YA3MSWOX-l68gg5h7.js} +1 -1
- package/static/dist/assets/onboarding-cdfrk0pj.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-kl8pwsyg.js → packet-AYTQ26CC-gpv06065.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-bbqn9jo4.js → pegDiagram-XKGWAZYB-e52vs23u.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-cpyo8bkr.js → pie-WAS4IAKB-l6m7nz5s.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-pelug34f.js → pieDiagram-E7YTZNPT-b4is36bq.js} +3 -3
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-jds4jmr5.js → quadrantDiagram-AXDQQJYC-m8vt2788.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-e02oxnvd.js → radar-RG4KPBEZ-nxbrhiov.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-kz3delwo.js → railroad-74A4TZTK-222mu9hi.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-kdvgl6x8.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-itiqslby.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-go7kov78.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-jgroj2ew.js → railroadDiagram-O6MQD6OU-o8lldfzv.js} +1 -1
- package/static/dist/assets/{refresh-cw-k7yxjdn3.js → refresh-cw-kbcje1uy.js} +1 -1
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-m4az5e0j.js → requirementDiagram-BXWQKSXE-ovyq38kv.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-vlryqiv3.js → sankeyDiagram-P5KCCOFB-ou7lznor.js} +1 -1
- package/static/dist/assets/{saved-brdfjjnw.js → saved-bazmcup9.js} +1 -1
- package/static/dist/assets/search-jen74z4u.js +1 -0
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-fr8hrpql.js → sequenceDiagram-WJ2MYXX4-ovckdzf2.js} +1 -1
- package/static/dist/assets/{settings_section_extensions_title-l0zodj0b.js → settings_section_extensions_title-ertwwhlx.js} +1 -1
- package/static/dist/assets/share._token-dan9hgvj.js +2 -0
- package/static/dist/assets/{sliders-horizontal-gcgscv8r.js → sliders-horizontal-f9cb3lh3.js} +1 -1
- package/static/dist/assets/{stateDiagram-D77RDMKH-bg548iyr.js → stateDiagram-D77RDMKH-fcrexkkv.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-lcfraua2.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-hk5z3efh.js → swimlanes-42K2YHIH-f7usu8fw.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ogmanni0.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-olvknr62.js → timeline-definition-24CTP7MA-gp1hvz9f.js} +1 -1
- package/static/dist/assets/todoStore-eqtid4r4.js +1 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-ovvjsxtf.js → treeView-Q6P3EWNA-gb9gf11u.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-ggkipj59.js → treemap-WGGIJYW6-nuvfnvvi.js} +1 -1
- package/static/dist/assets/{untitled-c8ydw0bu.js → untitled-htelhc68.js} +1 -1
- package/static/dist/assets/useForm-h2t0u14e.js +1 -0
- package/static/dist/assets/useLocale-hcsb84pj.js +1 -0
- package/static/dist/assets/useNavigate-nwy70ztj.js +1 -0
- package/static/dist/assets/{useParams-katwvzil.js → useParams-dqd64jv7.js} +1 -1
- package/static/dist/assets/{useSearch-c70sgau1.js → useSearch-j30pvsy7.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-hzld7zt7.js → vennDiagram-4TSXK5OY-fzchbzaj.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-hxkeoms8.js → wardley-WFR3VGLG-m47mhfbh.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-ljh90mb1.js → wardleyDiagram-VM6X3IG4-odg6ct1z.js} +2 -2
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-mnuaes03.js → xychartDiagram-S5SC5T6Z-mrhms5um.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- package/static/dist/assets/AppShell-haqi9qzu.js +0 -1
- package/static/dist/assets/ChatPage-hjyu2g64.js +0 -22
- package/static/dist/assets/HubRoute-gkd8o1vg.js +0 -2
- package/static/dist/assets/RightPanel-o73y98dn.js +0 -1
- package/static/dist/assets/Select-jld3yeni.js +0 -1
- package/static/dist/assets/SessionListPanel-d3qx4ric.js +0 -1
- package/static/dist/assets/SettingsLayout-lnn2wo2s.js +0 -1
- package/static/dist/assets/States-e5hv6gdh.js +0 -1
- package/static/dist/assets/Toaster-c4jq1i26.js +0 -1
- package/static/dist/assets/_app-bnip2pjg.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-egptzrfy.js +0 -1
- package/static/dist/assets/_app.index-vdz13ul5.js +0 -1
- package/static/dist/assets/_app.insights-lgjshsba.js +0 -1
- package/static/dist/assets/_app.kanban-c18cjrpz.js +0 -1
- package/static/dist/assets/_app.logs-ezhojgeg.js +0 -1
- package/static/dist/assets/_app.memory-i00paisv.js +0 -1
- package/static/dist/assets/_app.profiles-kd02bwjx.js +0 -1
- package/static/dist/assets/_app.settings-giaudkuk.js +0 -1
- package/static/dist/assets/_app.settings._section-k4qtlexk.js +0 -1
- package/static/dist/assets/_app.skills-bby2uvl8.js +0 -1
- package/static/dist/assets/_app.tasks-1kz9bosm.js +0 -2
- package/static/dist/assets/_app.todos-izjdbkm2.js +0 -1
- package/static/dist/assets/_app.workspaces-lfh2kw7s.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-b4u9z1w3.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-hqnf84fc.js +0 -36
- package/static/dist/assets/channel-o77ioktg.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-f5rvod26.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-f5rvod26.js +0 -1
- package/static/dist/assets/endpoints-e58saih3.js +0 -9
- package/static/dist/assets/eventmodeling-NTZA5JFV-bn3fjsaq.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-li70d120.js +0 -1
- package/static/dist/assets/index-gkh7kum4.css +0 -2
- package/static/dist/assets/infoDiagram-27XIBGKW-oo7kdyte.js +0 -2
- package/static/dist/assets/lazyRouteComponent-b1h2ykmb.js +0 -1
- package/static/dist/assets/link-d8f0788e.js +0 -1
- package/static/dist/assets/login-llkohrcg.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-id0ffk2r.js +0 -1
- package/static/dist/assets/onboarding-lx0d6b38.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-l13ped2z.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-c7rg3g4g.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-od0b8niq.js +0 -1
- package/static/dist/assets/search-gt2ueyvg.js +0 -1
- package/static/dist/assets/share._token-oyjv046r.js +0 -2
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-j5v40qih.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-grzefo9c.js +0 -8
- package/static/dist/assets/tabBuild-idliyw9f.js +0 -56
- package/static/dist/assets/todoStore-j4c2xq0b.js +0 -1
- package/static/dist/assets/useForm-kd759sjk.js +0 -1
- package/static/dist/assets/useLocale-hds4xmja.js +0 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAL-372: one durable lifecycle for a session's background work: delegated agents (the Agent's ledger), notified or
|
|
3
|
+
* watched processes (the Agent's process registry and completion queue) and `/background` tasks (this server). Each piece
|
|
4
|
+
* of work is one record with a stable id; the server keeps a small receipt per record under
|
|
5
|
+
* `sessions/_background/<sid>.json`, so reloads, restarts and every client read the same history, and reading never
|
|
6
|
+
* consumes anything. The Agent stays authoritative for its own work: a receipt only fills in what it no longer reports.
|
|
7
|
+
*/
|
|
8
|
+
import { mkdirSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { atomicWriteText } from '../fs/atomic.js';
|
|
11
|
+
import { str } from '../util.js';
|
|
12
|
+
import { isDict, stripToolCallXml } from './merge.js';
|
|
13
|
+
import { isSafeSessionId } from './session.js';
|
|
14
|
+
const DIR_NAME = '_background';
|
|
15
|
+
const RECORD_LIMIT = 200;
|
|
16
|
+
const RESULT_LIMIT = 64_000;
|
|
17
|
+
const TITLE_LIMIT = 160;
|
|
18
|
+
const TERMINAL = new Set(['completed', 'failed', 'cancelled']);
|
|
19
|
+
const LIVE = new Set(['running', 'attention', 'unknown']);
|
|
20
|
+
const CHILD_DONE = new Set(['completed', 'success']);
|
|
21
|
+
const RUNNING_STATES = new Set(['running', 'stalling', 'finalizing']);
|
|
22
|
+
const RUNNING_LIKE = new Set(['running', 'attention']);
|
|
23
|
+
const CHILD_CANCELLED = new Set(['interrupted', 'cancelled']);
|
|
24
|
+
export function isTerminal(status) { return TERMINAL.has(status); }
|
|
25
|
+
/** One line, never output: the goal, command or prompt a record is about. */
|
|
26
|
+
export function taskTitle(text) {
|
|
27
|
+
const first = str(text).split('\n').map((l) => l.trim()).find(Boolean) ?? '';
|
|
28
|
+
return first.length <= TITLE_LIMIT ? first : `${first.slice(0, TITLE_LIMIT)}…`;
|
|
29
|
+
}
|
|
30
|
+
function bounded(text) { return text.length <= RESULT_LIMIT ? text : `${text.slice(0, RESULT_LIMIT)}\n…(truncated)`; }
|
|
31
|
+
/** Subagent counts of a delegation unit: finished children by outcome, the rest still running. */
|
|
32
|
+
export function agentCounts(total, childStatuses, running) {
|
|
33
|
+
const completed = childStatuses.filter((s) => CHILD_DONE.has(s)).length;
|
|
34
|
+
const failed = childStatuses.filter((s) => s && !CHILD_DONE.has(s)).length;
|
|
35
|
+
const n = Math.max(total, childStatuses.length, 1);
|
|
36
|
+
return { total: n, completed, failed, running: running ? Math.max(0, n - completed - failed) : 0 };
|
|
37
|
+
}
|
|
38
|
+
/** A finished unit's status from its children: all cancelled is cancelled, none done is failed, else completed. */
|
|
39
|
+
function unitStatus(state, childStatuses) {
|
|
40
|
+
if (CHILD_CANCELLED.has(state) || (childStatuses.length && childStatuses.every((s) => CHILD_CANCELLED.has(s))))
|
|
41
|
+
return 'cancelled';
|
|
42
|
+
if (childStatuses.length)
|
|
43
|
+
return childStatuses.some((s) => CHILD_DONE.has(s)) ? 'completed' : 'failed';
|
|
44
|
+
return CHILD_DONE.has(state) ? 'completed' : 'failed';
|
|
45
|
+
}
|
|
46
|
+
/** The record a ledger row describes; a live `stalling`/`stalled` unit needs attention. */
|
|
47
|
+
export function delegationReceipt(row, now) {
|
|
48
|
+
const running = RUNNING_STATES.has(row.state);
|
|
49
|
+
const status = running ? (row.live_status === 'stalling' || row.live_status === 'stalled' || row.state === 'stalling' ? 'attention' : 'running') : unitStatus(row.state, row.child_statuses);
|
|
50
|
+
const goals = row.goals.filter(Boolean);
|
|
51
|
+
return {
|
|
52
|
+
task_id: row.delegation_id, kind: 'delegation', status, title: taskTitle(goals.length > 1 ? `${goals.length} subagents: ${goals.join('; ')}` : goals[0]),
|
|
53
|
+
started_at: row.dispatched_at, completed_at: running ? null : row.completed_at ?? row.updated_at ?? now,
|
|
54
|
+
agents: agentCounts(goals.length, running ? [] : row.child_statuses, running), agent_result: row.has_result,
|
|
55
|
+
...(row.children?.length ? { children: row.children } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** A notified or watched process as the registry reports it: killed is cancelled, a non-zero exit failed. */
|
|
59
|
+
export function processReceipt(row) {
|
|
60
|
+
const exit = row.exit_code ?? null;
|
|
61
|
+
const status = !row.exited ? 'running' : row.completion_reason === 'killed' ? 'cancelled' : exit !== null && exit !== 0 ? 'failed' : 'completed';
|
|
62
|
+
return { task_id: row.process_id, kind: 'process', status, title: taskTitle(row.command), started_at: row.started_at, completed_at: row.exited ? row.exited_at : null, exit_code: exit };
|
|
63
|
+
}
|
|
64
|
+
/** The record one drained completion event settles, with the full result text when the Agent does not keep it. */
|
|
65
|
+
export function eventReceipt(evt, prompt, now) {
|
|
66
|
+
const type = str(evt.type ?? 'completion');
|
|
67
|
+
const id = str(evt.process_id).trim();
|
|
68
|
+
if (!id)
|
|
69
|
+
return null;
|
|
70
|
+
if (type === 'async_delegation') {
|
|
71
|
+
const goals = Array.isArray(evt.goals) ? evt.goals.map(str) : [];
|
|
72
|
+
const results = Array.isArray(evt.results) ? evt.results.filter(isDict) : [];
|
|
73
|
+
// A split unit's results index the call's goals; a whole call or a single task is all of them.
|
|
74
|
+
const unitGoals = results.length && results.every((r) => typeof r.task_index === 'number') ? results.map((r) => goals[Number(r.task_index)] ?? str(r.goal)) : goals.length ? goals : [str(evt.goal)];
|
|
75
|
+
const childStatuses = results.length ? results.map((r) => str(r.status)) : [str(evt.status)];
|
|
76
|
+
return { ...delegationReceipt({ delegation_id: id, state: str(evt.status) || 'completed', dispatched_at: Number(evt.dispatched_at) || null, completed_at: Number(evt.completed_at) || now, updated_at: now, goals: unitGoals, child_statuses: childStatuses, has_result: true, live_status: null }, now), result: prompt ? bounded(prompt) : null };
|
|
77
|
+
}
|
|
78
|
+
if (type === 'completion') {
|
|
79
|
+
return { ...processReceipt({ process_id: id, command: str(evt.command), started_at: null, exited: true, exited_at: now, exit_code: evt.exit_code === undefined || evt.exit_code === null ? null : Number(evt.exit_code), completion_reason: str(evt.completion_reason) || 'exited', watched: false }), result: prompt ? bounded(prompt) : null };
|
|
80
|
+
}
|
|
81
|
+
// A watch match (or watch notice) on a process that keeps running.
|
|
82
|
+
return { task_id: id, kind: 'process', status: 'attention', title: taskTitle(evt.command), result: prompt ? bounded(prompt) : null };
|
|
83
|
+
}
|
|
84
|
+
/** Children seen so far plus newly reported ones, by session id, first-seen order. */
|
|
85
|
+
function mergeChildren(known, reported) {
|
|
86
|
+
const out = [...(known ?? [])];
|
|
87
|
+
for (const c of reported ?? [])
|
|
88
|
+
if (!out.some((k) => k.session_id === c.session_id))
|
|
89
|
+
out.push(c);
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/** Fold an update into a receipt: a terminal record never reopens, and fields an update leaves out are kept. */
|
|
93
|
+
export function mergeReceipt(prev, next, now) {
|
|
94
|
+
const base = prev ?? { task_id: next.task_id, kind: next.kind, status: 'running', title: '', started_at: null, updated_at: now, completed_at: null, exit_code: null, agents: null, result: null, agent_result: false, stream_id: null, dismissed_at: null, legacy_reported: false };
|
|
95
|
+
const defined = Object.fromEntries(Object.entries(next).filter(([, v]) => v !== undefined && v !== null && v !== ''));
|
|
96
|
+
const children = mergeChildren(base.children, defined.children);
|
|
97
|
+
if (isTerminal(base.status)) {
|
|
98
|
+
// Settled once: later reports may add detail (the full result, counts, child sessions) but never change the outcome.
|
|
99
|
+
return { ...base, result: base.result ?? defined.result ?? null, agent_result: base.agent_result || Boolean(defined.agent_result), agents: base.agents ?? defined.agents ?? null, ...(children.length ? { children } : {}), updated_at: base.updated_at };
|
|
100
|
+
}
|
|
101
|
+
// A process's matched watch needs attention until it ends; the registry only knows it is still running.
|
|
102
|
+
if (base.kind === 'process' && base.status === 'attention' && defined.status === 'running')
|
|
103
|
+
delete defined.status;
|
|
104
|
+
const merged = { ...base, ...defined, task_id: base.task_id, kind: base.kind, ...(children.length ? { children } : {}), updated_at: now };
|
|
105
|
+
if (isTerminal(merged.status)) {
|
|
106
|
+
merged.completed_at = merged.completed_at ?? now;
|
|
107
|
+
merged.stream_id = null;
|
|
108
|
+
}
|
|
109
|
+
return merged;
|
|
110
|
+
}
|
|
111
|
+
function sameReceipt(a, b) {
|
|
112
|
+
if (!a)
|
|
113
|
+
return false;
|
|
114
|
+
return JSON.stringify({ ...a, updated_at: 0 }) === JSON.stringify({ ...b, updated_at: 0 });
|
|
115
|
+
}
|
|
116
|
+
function dismissible(r, status) {
|
|
117
|
+
return status === 'unknown' || (r.kind === 'background_command' && isTerminal(r.status));
|
|
118
|
+
}
|
|
119
|
+
/** The record every client sees; `unconfirmed` shows running work the Agent did not confirm as `unknown`. */
|
|
120
|
+
export function taskView(r, opts = {}) {
|
|
121
|
+
const status = opts.unconfirmed && LIVE.has(r.status) ? 'unknown' : r.status;
|
|
122
|
+
return {
|
|
123
|
+
task_id: r.task_id, kind: r.kind, status, title: r.title, started_at: r.started_at, updated_at: r.updated_at, completed_at: r.completed_at,
|
|
124
|
+
result_available: isTerminal(r.status) || r.status === 'attention' ? Boolean(r.result) || r.agent_result : false,
|
|
125
|
+
child_sessions: (r.children ?? []).filter((c) => isSafeSessionId(c.session_id)).map((c) => ({ goal: c.goal, session_id: c.session_id })), exit_code: r.exit_code, agents: r.agents,
|
|
126
|
+
// Work nobody can confirm (lost in an Agent or server restart) can be dismissed like a finished `/background` result.
|
|
127
|
+
pinned: status === 'running' || status === 'attention' || (dismissible(r, status) && r.dismissed_at === null),
|
|
128
|
+
// Dismissed work nobody can confirm will not settle on its own; clients stop refreshing for it.
|
|
129
|
+
active: LIVE.has(status) && !(status === 'unknown' && r.dismissed_at !== null),
|
|
130
|
+
dismissible: dismissible(r, status) && r.dismissed_at === null,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** The receipts of every session, one small file each, cached after the first read. */
|
|
134
|
+
export class BackgroundTaskStore {
|
|
135
|
+
sessionDir;
|
|
136
|
+
now;
|
|
137
|
+
onChange;
|
|
138
|
+
cache = new Map();
|
|
139
|
+
constructor(sessionDir, now, onChange) {
|
|
140
|
+
this.sessionDir = sessionDir;
|
|
141
|
+
this.now = now;
|
|
142
|
+
this.onChange = onChange;
|
|
143
|
+
}
|
|
144
|
+
path(sid) { return join(this.sessionDir, DIR_NAME, `${sid}.json`); }
|
|
145
|
+
list(sid) {
|
|
146
|
+
if (!isSafeSessionId(sid))
|
|
147
|
+
return [];
|
|
148
|
+
const cached = this.cache.get(sid);
|
|
149
|
+
if (cached)
|
|
150
|
+
return cached;
|
|
151
|
+
let receipts = [];
|
|
152
|
+
try {
|
|
153
|
+
const parsed = JSON.parse(readFileSync(this.path(sid), 'utf8'));
|
|
154
|
+
// ponytail: receipts are trusted as this server wrote them; validate per field if the file ever comes from elsewhere.
|
|
155
|
+
if (isDict(parsed) && Array.isArray(parsed.tasks))
|
|
156
|
+
receipts = parsed.tasks.filter(isDict);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
receipts = [];
|
|
160
|
+
}
|
|
161
|
+
this.cache.set(sid, receipts);
|
|
162
|
+
return receipts;
|
|
163
|
+
}
|
|
164
|
+
get(sid, taskId) { return this.list(sid).find((r) => r.task_id === taskId); }
|
|
165
|
+
/** Apply updates; writes and notifies only when something a client sees changed. */
|
|
166
|
+
update(sid, updates, opts = {}) {
|
|
167
|
+
if (!isSafeSessionId(sid) || !updates.length)
|
|
168
|
+
return false;
|
|
169
|
+
const now = this.now();
|
|
170
|
+
const receipts = [...this.list(sid)];
|
|
171
|
+
let changed = false;
|
|
172
|
+
for (const update of updates) {
|
|
173
|
+
const index = receipts.findIndex((r) => r.task_id === update.task_id);
|
|
174
|
+
const merged = mergeReceipt(index >= 0 ? receipts[index] : undefined, update, now);
|
|
175
|
+
if (sameReceipt(receipts[index], merged))
|
|
176
|
+
continue;
|
|
177
|
+
if (index >= 0)
|
|
178
|
+
receipts[index] = merged;
|
|
179
|
+
else
|
|
180
|
+
receipts.push(merged);
|
|
181
|
+
changed = true;
|
|
182
|
+
}
|
|
183
|
+
if (!changed)
|
|
184
|
+
return false;
|
|
185
|
+
this.write(sid, receipts);
|
|
186
|
+
if (opts.notify !== false)
|
|
187
|
+
this.onChange?.(sid);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
/** Flags that are not task state: dismissal, the legacy status read. */
|
|
191
|
+
mark(sid, taskId, fields) {
|
|
192
|
+
const receipts = [...this.list(sid)];
|
|
193
|
+
const index = receipts.findIndex((r) => r.task_id === taskId);
|
|
194
|
+
if (index < 0)
|
|
195
|
+
return null;
|
|
196
|
+
receipts[index] = { ...receipts[index], ...fields };
|
|
197
|
+
this.write(sid, receipts);
|
|
198
|
+
if (fields.dismissed_at !== undefined)
|
|
199
|
+
this.onChange?.(sid);
|
|
200
|
+
return receipts[index];
|
|
201
|
+
}
|
|
202
|
+
/** The session was deleted: its records go from memory too (the file goes with the session's other files). */
|
|
203
|
+
evict(sid) { this.cache.delete(sid); }
|
|
204
|
+
/** Drop a `/background` task that never started. */
|
|
205
|
+
forget(sid, taskId) {
|
|
206
|
+
const receipts = this.list(sid).filter((r) => r.task_id !== taskId);
|
|
207
|
+
this.write(sid, receipts);
|
|
208
|
+
}
|
|
209
|
+
write(sid, receipts) {
|
|
210
|
+
// Newest RECORD_LIMIT by start; running work is never pruned.
|
|
211
|
+
const kept = receipts.length <= RECORD_LIMIT ? receipts : [...receipts.filter((r) => !isTerminal(r.status)), ...receipts.filter((r) => isTerminal(r.status)).sort((a, b) => (b.completed_at ?? 0) - (a.completed_at ?? 0)).slice(0, RECORD_LIMIT)];
|
|
212
|
+
this.cache.set(sid, kept);
|
|
213
|
+
mkdirSync(join(this.sessionDir, DIR_NAME), { recursive: true });
|
|
214
|
+
atomicWriteText(this.path(sid), JSON.stringify({ version: 1, tasks: kept }));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** Delegation ids a `delegate_task` result names: the call's id (split units extend it as `<id>-<n>`) and any unit ids. */
|
|
218
|
+
export function dispatchedDelegationIds(result) {
|
|
219
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result ?? '');
|
|
220
|
+
if (!/"status"\s*:\s*"dispatched"/.test(text))
|
|
221
|
+
return [];
|
|
222
|
+
return [...new Set([...text.matchAll(/"delegation_id"\s*:\s*"([^"]+)"/g)].map((m) => m[1]))];
|
|
223
|
+
}
|
|
224
|
+
/** The link a delegation tool row shows: its units' records, one combined status, and summed subagent counts. */
|
|
225
|
+
export function backgroundLink(ids, receipts) {
|
|
226
|
+
const linked = receipts.filter((r) => r.kind === 'delegation' && ids.some((id) => r.task_id === id || r.task_id.startsWith(`${id}-`)));
|
|
227
|
+
if (!linked.length)
|
|
228
|
+
return null;
|
|
229
|
+
const agents = linked.reduce((sum, r) => {
|
|
230
|
+
const a = r.agents ?? { total: 1, completed: 0, failed: 0, running: isTerminal(r.status) ? 0 : 1 };
|
|
231
|
+
return { total: sum.total + a.total, completed: sum.completed + a.completed, failed: sum.failed + a.failed, running: sum.running + a.running };
|
|
232
|
+
}, { total: 0, completed: 0, failed: 0, running: 0 });
|
|
233
|
+
const statuses = new Set(linked.map((r) => r.status));
|
|
234
|
+
const status = statuses.has('attention') ? 'attention' : statuses.has('running') ? 'running' : statuses.has('unknown') ? 'unknown'
|
|
235
|
+
: statuses.size === 1 ? linked[0].status : statuses.has('completed') ? 'completed' : 'failed';
|
|
236
|
+
return { task_ids: linked.map((r) => r.task_id), status, agents };
|
|
237
|
+
}
|
|
238
|
+
/** Stamps `tool.background` on delegation rows of every turn's scene. Returns copies; stored rows are untouched. */
|
|
239
|
+
export function withBackgroundLinks(messages, receipts) {
|
|
240
|
+
if (!receipts.some((r) => r.kind === 'delegation'))
|
|
241
|
+
return messages;
|
|
242
|
+
return messages.map((m) => {
|
|
243
|
+
if (!isDict(m) || !isDict(m._anchor_activity_scene) || !Array.isArray(m._anchor_activity_scene.activity_rows))
|
|
244
|
+
return m;
|
|
245
|
+
let touched = false;
|
|
246
|
+
const rows = m._anchor_activity_scene.activity_rows.map((row) => {
|
|
247
|
+
if (!isDict(row) || !isDict(row.tool) || str(row.tool.name) !== 'delegate_task')
|
|
248
|
+
return row;
|
|
249
|
+
const link = backgroundLink(dispatchedDelegationIds(row.tool.result ?? row.tool.preview), receipts);
|
|
250
|
+
if (!link)
|
|
251
|
+
return row;
|
|
252
|
+
touched = true;
|
|
253
|
+
return { ...row, tool: { ...row.tool, background: link } };
|
|
254
|
+
});
|
|
255
|
+
return touched ? { ...m, _anchor_activity_scene: { ...m._anchor_activity_scene, activity_rows: rows } } : m;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/** The session-facing side: `/background` bookkeeping, drained completions, and the snapshot every client reads. */
|
|
259
|
+
export class BackgroundActivity {
|
|
260
|
+
deps;
|
|
261
|
+
constructor(deps) {
|
|
262
|
+
this.deps = deps;
|
|
263
|
+
}
|
|
264
|
+
receipts(sid) { return this.deps.store.list(sid); }
|
|
265
|
+
trackCommand(sid, taskId, prompt) {
|
|
266
|
+
this.deps.store.update(sid, [{ task_id: taskId, kind: 'background_command', status: 'running', title: taskTitle(prompt), started_at: this.deps.now() }]);
|
|
267
|
+
}
|
|
268
|
+
setCommandStream(sid, taskId, streamId) { this.deps.store.mark(sid, taskId, { stream_id: streamId || null }); }
|
|
269
|
+
/** The `/background` turn finished: its answer, or the failure text old clients showed, is the result. */
|
|
270
|
+
settleCommand(sid, taskId, outcome, text) {
|
|
271
|
+
this.deps.store.update(sid, [{ task_id: taskId, kind: 'background_command', status: outcome, result: bounded(text) }]);
|
|
272
|
+
}
|
|
273
|
+
forgetCommand(sid, taskId) { this.deps.store.forget(sid, taskId); }
|
|
274
|
+
/** A drained completion settles (or flags) its record. */
|
|
275
|
+
recordEvent(sid, evt, prompt) {
|
|
276
|
+
const receipt = eventReceipt(evt, prompt, this.deps.now());
|
|
277
|
+
if (receipt)
|
|
278
|
+
this.deps.store.update(sid, [receipt]);
|
|
279
|
+
}
|
|
280
|
+
/** The session's records, refreshed from the Agent; work it cannot confirm right now shows `unknown`. */
|
|
281
|
+
async snapshot(sid, profile) {
|
|
282
|
+
const sidecar = this.deps.sidecar();
|
|
283
|
+
let agent = null;
|
|
284
|
+
if (sidecar) {
|
|
285
|
+
try {
|
|
286
|
+
agent = await sidecar.call('process.background_list', { profile_home: this.deps.profileHome(profile), session_ids: [sid] });
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
this.deps.log(`[webui] WARNING: background tasks for ${sid} unavailable from the Agent: ${error.message}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const now = this.deps.now();
|
|
293
|
+
// A ledger row alone confirms only a settled unit: a running one must still be in the Agent's live registry, else it
|
|
294
|
+
// was lost in an Agent restart.
|
|
295
|
+
const liveDelegations = new Set((agent?.delegations ?? []).filter((r) => r.live_status !== null || !RUNNING_STATES.has(r.state)).map((r) => r.delegation_id));
|
|
296
|
+
const liveProcesses = new Set((agent?.processes ?? []).filter((p) => !p.exited).map((p) => p.process_id));
|
|
297
|
+
const confirmed = (r) => r.kind === 'background_command' ? Boolean(r.stream_id) && this.deps.liveStream(r.stream_id)
|
|
298
|
+
: r.kind === 'delegation' ? liveDelegations.has(r.task_id) : liveProcesses.has(r.task_id);
|
|
299
|
+
if (agent) {
|
|
300
|
+
const reported = [...agent.delegations.map((r) => delegationReceipt(r, now)), ...agent.processes.map(processReceipt)];
|
|
301
|
+
// The Agent answered: running work it no longer has is lost, and its record (the card and the delegation row alike)
|
|
302
|
+
// says unknown until the Agent reports it again.
|
|
303
|
+
const lost = this.deps.store.list(sid).filter((r) => LIVE.has(r.status) && r.status !== 'unknown' && !confirmed(r)).map((r) => ({ task_id: r.task_id, kind: r.kind, status: 'unknown' }));
|
|
304
|
+
const reportedIds = new Set(reported.map((r) => r.task_id));
|
|
305
|
+
this.deps.store.update(sid, [...reported.map((r) => (confirmed(r) || !RUNNING_LIKE.has(r.status ?? 'running') ? r : { ...r, status: 'unknown' })), ...lost.filter((r) => !reportedIds.has(r.task_id))]);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// The Agent cannot be asked: a running delegation's record says unknown too, so its transcript row matches the
|
|
309
|
+
// card; it returns to running once the Agent reports it again.
|
|
310
|
+
this.deps.store.update(sid, this.deps.store.list(sid).filter((r) => r.kind === 'delegation' && RUNNING_LIKE.has(r.status)).map((r) => ({ task_id: r.task_id, kind: r.kind, status: 'unknown' })));
|
|
311
|
+
}
|
|
312
|
+
const tasks = this.deps.store.list(sid).map((r) => taskView(r, { unconfirmed: !agent && !confirmed(r) }));
|
|
313
|
+
tasks.sort((a, b) => (b.started_at ?? b.updated_at) - (a.started_at ?? a.updated_at));
|
|
314
|
+
return { tasks, agent_available: agent !== null, agents_working: tasks.some((t) => t.kind === 'delegation' && (t.status === 'running' || t.status === 'attention')) };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* The full result: kept here for `/background` and drained completions, else the Agent's ledger for a delegation.
|
|
318
|
+
* Leaked tool-call XML is removed, as from a transcript reply (TAL-302).
|
|
319
|
+
*/
|
|
320
|
+
async result(sid, profile, taskId) {
|
|
321
|
+
const receipt = this.deps.store.get(sid, taskId);
|
|
322
|
+
if (!receipt)
|
|
323
|
+
return null;
|
|
324
|
+
if (receipt.result)
|
|
325
|
+
return stripToolCallXml(receipt.result);
|
|
326
|
+
const sidecar = this.deps.sidecar();
|
|
327
|
+
if (receipt.kind !== 'delegation' || !receipt.agent_result || !sidecar)
|
|
328
|
+
return null;
|
|
329
|
+
try {
|
|
330
|
+
return stripToolCallXml((await sidecar.call('process.delegation_result', { profile_home: this.deps.profileHome(profile), session_id: sid, delegation_id: taskId })).text) || null;
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/** Dismissal is read state, separate from the task: the record stays in the history and leaves the tray. */
|
|
337
|
+
dismiss(sid, taskId) {
|
|
338
|
+
const receipt = this.deps.store.mark(sid, taskId, { dismissed_at: this.deps.now() });
|
|
339
|
+
return receipt ? taskView(receipt) : null;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Old clients' `/api/background/status`: each finished `/background` result once per server, as before. The record and
|
|
343
|
+
* its result stay; the shared `tasks` view is not affected.
|
|
344
|
+
*/
|
|
345
|
+
legacyResults(sid) {
|
|
346
|
+
const done = this.deps.store.list(sid).filter((r) => r.kind === 'background_command' && isTerminal(r.status) && !r.legacy_reported);
|
|
347
|
+
for (const r of done)
|
|
348
|
+
this.deps.store.mark(sid, r.task_id, { legacy_reported: true });
|
|
349
|
+
return done.map((r) => ({ task_id: r.task_id, prompt: r.title, answer: r.result, completed_at: r.completed_at }));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=background-tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-tasks.js","sourceRoot":"","sources":["../../src/sessions/background-tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAL-371: automatic background wakeups (async delegation results, background process and watch notices) are shown as
|
|
3
|
+
* "background updates", not as messages the user sent. The server decides which rows are updates and what they say;
|
|
4
|
+
* clients only render `_background_update`. TAL-460: each update carries one completion line per result, and the
|
|
5
|
+
* Agent's reply to it is marked (`_background_reply`) and, when it is only a silence marker, silent (`_background_silent`).
|
|
6
|
+
*/
|
|
7
|
+
import type { Session } from './session.js';
|
|
8
|
+
type Dict = Record<string, unknown>;
|
|
9
|
+
export type BackgroundUpdateKind = 'delegation' | 'process' | 'mixed' | 'other';
|
|
10
|
+
/** One finished background item: an agent (by its goal), a command, or another notice (by its summary). */
|
|
11
|
+
export interface BackgroundLine {
|
|
12
|
+
kind: 'agent' | 'command' | 'other';
|
|
13
|
+
status: 'completed' | 'failed' | 'notice';
|
|
14
|
+
label: string;
|
|
15
|
+
exit_code?: number | null;
|
|
16
|
+
}
|
|
17
|
+
export interface BackgroundUpdate {
|
|
18
|
+
kind: BackgroundUpdateKind;
|
|
19
|
+
attention: boolean;
|
|
20
|
+
count: number;
|
|
21
|
+
summary: string;
|
|
22
|
+
lines: BackgroundLine[];
|
|
23
|
+
}
|
|
24
|
+
export type TurnOrigin = 'user' | 'background';
|
|
25
|
+
/** The one instruction a background turn gets on top of the usual ones (TAL-460). */
|
|
26
|
+
export declare const BACKGROUND_TURN_PROMPT = "This turn was started by a background result, not by the user. If it needs nothing from the user, reply exactly [SILENT]. Otherwise tell the user what matters.";
|
|
27
|
+
/** The notification's first line without its `[ … ]` wrapper, like the `bg_task_complete` summary. */
|
|
28
|
+
export declare function backgroundUpdateSummary(text: string): string;
|
|
29
|
+
export declare function turnOrigin(source: string | null | undefined): TurnOrigin;
|
|
30
|
+
/** Hermes `is_intentional_silence_response`: the whole reply is exactly a silence marker. */
|
|
31
|
+
export declare function isSilentReply(text: string): boolean;
|
|
32
|
+
/** Hermes's streaming counterpart: text so far that could still become a silence marker is held back. */
|
|
33
|
+
export declare function mayBecomeSilentReply(text: string): boolean;
|
|
34
|
+
/** The completion lines of one event: one per agent of a delegation batch, one for a command, else one notice. */
|
|
35
|
+
export declare function eventLines(evt: Dict, prompt: string): BackgroundLine[];
|
|
36
|
+
/** Kind and attention of one completion event: failures and watch notices need attention without expanding. */
|
|
37
|
+
export declare function eventUpdate(evt: Dict): {
|
|
38
|
+
kind: BackgroundUpdateKind;
|
|
39
|
+
attention: boolean;
|
|
40
|
+
};
|
|
41
|
+
/** One update for a batched wakeup of these events, summarised by its first notification. */
|
|
42
|
+
export declare function batchUpdate(entries: {
|
|
43
|
+
event: Dict;
|
|
44
|
+
prompt: string;
|
|
45
|
+
}[]): BackgroundUpdate;
|
|
46
|
+
/** Remember a started wakeup's update by its turn id; the transcript row only carries `_source` and `_turn_id`. */
|
|
47
|
+
export declare function recordBackgroundUpdate(session: Session, turnId: string, update: BackgroundUpdate): void;
|
|
48
|
+
/**
|
|
49
|
+
* Stamps `_background_update` on user rows that are automatic wakeups: Web's own (`_source: process_wakeup`, with the
|
|
50
|
+
* update recorded at delivery, else a generic one for older rows) and the Agent's (`display_kind` from state.db). A
|
|
51
|
+
* person typing the same text stays an ordinary user message. The rest of a wakeup's turn is the Agent's reply to it
|
|
52
|
+
* (`_background_reply`); a reply that ends on a silence marker is `_background_silent` throughout. Needs `_turn_id` on
|
|
53
|
+
* every row (`withTurnIds`). Returns copies; stored rows are untouched.
|
|
54
|
+
*/
|
|
55
|
+
export declare function withBackgroundUpdates<T>(messages: T[], session: Session): T[];
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { isDict, messageText } from './merge.js';
|
|
2
|
+
import { str } from '../util.js';
|
|
3
|
+
const RECORD_KEY = 'background_updates';
|
|
4
|
+
const RECORD_LIMIT = 200;
|
|
5
|
+
const SUMMARY_LIMIT = 200;
|
|
6
|
+
const LABEL_LIMIT = 120;
|
|
7
|
+
/** Hermes `LIVE_GATEWAY_SILENT_MARKERS`: a whole reply that is exactly one of these means "nothing to say". */
|
|
8
|
+
const SILENT_MARKERS = new Set(['[SILENT]', 'SILENT', 'NO_REPLY', 'NO REPLY']);
|
|
9
|
+
const SILENT_MAX_LENGTH = 64;
|
|
10
|
+
const BACKGROUND_SOURCE = 'process_wakeup';
|
|
11
|
+
/** The one instruction a background turn gets on top of the usual ones (TAL-460). */
|
|
12
|
+
export const BACKGROUND_TURN_PROMPT = 'This turn was started by a background result, not by the user. If it needs nothing from the user, reply exactly [SILENT]. Otherwise tell the user what matters.';
|
|
13
|
+
const DELEGATION_DONE = new Set(['completed', 'success']);
|
|
14
|
+
/** The Agent's own state.db tags for notifications it wrote into the transcript itself. */
|
|
15
|
+
const AGENT_UPDATE_KINDS = { async_delegation_complete: 'delegation', internal_notification: 'other' };
|
|
16
|
+
/** The notification's first line without its `[ … ]` wrapper, like the `bg_task_complete` summary. */
|
|
17
|
+
export function backgroundUpdateSummary(text) {
|
|
18
|
+
const first = text.split('\n').map((l) => l.trim()).find(Boolean)?.replace(/^\[/, '').replace(/\]$/, '').trim() ?? '';
|
|
19
|
+
return first.length <= SUMMARY_LIMIT ? first : `${first.slice(0, SUMMARY_LIMIT)}…`;
|
|
20
|
+
}
|
|
21
|
+
export function turnOrigin(source) {
|
|
22
|
+
return source === BACKGROUND_SOURCE ? 'background' : 'user';
|
|
23
|
+
}
|
|
24
|
+
/** Hermes `_canonical_silence_candidates`: the reply as written and without edge punctuation (brackets stay), upper-cased. */
|
|
25
|
+
function silenceCandidates(text) {
|
|
26
|
+
const canonical = (t) => t.trim().toUpperCase().split(/\s+/).join(' ');
|
|
27
|
+
const stripped = text.replace(/^(?:(?![[\]])\p{P})+/u, '').replace(/(?:(?![[\]])\p{P})+$/u, '').trim();
|
|
28
|
+
return [canonical(text), canonical(stripped)];
|
|
29
|
+
}
|
|
30
|
+
/** Hermes `is_intentional_silence_response`: the whole reply is exactly a silence marker. */
|
|
31
|
+
export function isSilentReply(text) {
|
|
32
|
+
const t = text.trim();
|
|
33
|
+
return Boolean(t) && t.length <= SILENT_MAX_LENGTH && silenceCandidates(t).some((c) => SILENT_MARKERS.has(c));
|
|
34
|
+
}
|
|
35
|
+
/** Hermes's streaming counterpart: text so far that could still become a silence marker is held back. */
|
|
36
|
+
export function mayBecomeSilentReply(text) {
|
|
37
|
+
const t = text.trim();
|
|
38
|
+
return Boolean(t) && t.length <= SILENT_MAX_LENGTH && silenceCandidates(t).some((c) => Boolean(c) && [...SILENT_MARKERS].some((m) => m.startsWith(c)));
|
|
39
|
+
}
|
|
40
|
+
function label(text) {
|
|
41
|
+
const first = str(text).split('\n').map((l) => l.trim()).find(Boolean) ?? '';
|
|
42
|
+
return first.length <= LABEL_LIMIT ? first : `${first.slice(0, LABEL_LIMIT)}…`;
|
|
43
|
+
}
|
|
44
|
+
/** The completion lines of one event: one per agent of a delegation batch, one for a command, else one notice. */
|
|
45
|
+
export function eventLines(evt, prompt) {
|
|
46
|
+
const type = str(evt.type ?? 'completion');
|
|
47
|
+
if (type === 'async_delegation') {
|
|
48
|
+
const results = Array.isArray(evt.results) ? evt.results.filter(isDict) : [];
|
|
49
|
+
const goals = Array.isArray(evt.goals) ? evt.goals : [];
|
|
50
|
+
if (!results.length)
|
|
51
|
+
return [{ kind: 'agent', status: eventUpdate(evt).attention ? 'failed' : 'completed', label: label(evt.goal) || backgroundUpdateSummary(prompt) }];
|
|
52
|
+
return results.map((r, i) => ({ kind: 'agent', status: DELEGATION_DONE.has(str(r.status)) ? 'completed' : 'failed', label: label(goals[i] ?? r.goal ?? evt.goal) }));
|
|
53
|
+
}
|
|
54
|
+
if (type === 'completion') {
|
|
55
|
+
const exit = evt.exit_code === undefined || evt.exit_code === null ? null : Number(evt.exit_code);
|
|
56
|
+
return [{ kind: 'command', status: exit !== null && exit !== 0 ? 'failed' : 'completed', label: label(evt.command), exit_code: exit }];
|
|
57
|
+
}
|
|
58
|
+
return [{ kind: 'other', status: 'notice', label: backgroundUpdateSummary(prompt) }];
|
|
59
|
+
}
|
|
60
|
+
/** Kind and attention of one completion event: failures and watch notices need attention without expanding. */
|
|
61
|
+
export function eventUpdate(evt) {
|
|
62
|
+
const type = str(evt.type ?? 'completion');
|
|
63
|
+
if (type === 'async_delegation') {
|
|
64
|
+
const results = Array.isArray(evt.results) ? evt.results.filter(isDict) : [];
|
|
65
|
+
const failed = Boolean(evt.task_failure_notice) || Boolean(evt.error) || results.some((r) => !DELEGATION_DONE.has(str(r.status)));
|
|
66
|
+
return { kind: 'delegation', attention: failed };
|
|
67
|
+
}
|
|
68
|
+
if (type === 'completion')
|
|
69
|
+
return { kind: 'process', attention: evt.exit_code !== undefined && evt.exit_code !== null && Number(evt.exit_code) !== 0 };
|
|
70
|
+
// Watch matches and watch overflow / disablement notices.
|
|
71
|
+
return { kind: 'process', attention: true };
|
|
72
|
+
}
|
|
73
|
+
/** One update for a batched wakeup of these events, summarised by its first notification. */
|
|
74
|
+
export function batchUpdate(entries) {
|
|
75
|
+
const parts = entries.map((e) => eventUpdate(e.event));
|
|
76
|
+
const kinds = new Set(parts.map((p) => p.kind));
|
|
77
|
+
return {
|
|
78
|
+
kind: kinds.size === 1 ? parts[0].kind : 'mixed',
|
|
79
|
+
attention: parts.some((p) => p.attention),
|
|
80
|
+
count: entries.length,
|
|
81
|
+
summary: backgroundUpdateSummary(entries[0]?.prompt ?? ''),
|
|
82
|
+
lines: entries.flatMap((e) => eventLines(e.event, e.prompt)),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** An update without event metadata (older records, the Agent's own rows): one line from its summary. */
|
|
86
|
+
function summaryUpdate(kind, attention, summary) {
|
|
87
|
+
return { kind, attention, count: 1, summary, lines: [{ kind: 'other', status: attention ? 'failed' : 'completed', label: summary }] };
|
|
88
|
+
}
|
|
89
|
+
/** Remember a started wakeup's update by its turn id; the transcript row only carries `_source` and `_turn_id`. */
|
|
90
|
+
export function recordBackgroundUpdate(session, turnId, update) {
|
|
91
|
+
if (!turnId)
|
|
92
|
+
return;
|
|
93
|
+
const existing = isDict(session.extra[RECORD_KEY]) ? session.extra[RECORD_KEY] : {};
|
|
94
|
+
// Oldest first in insertion order; keep the newest RECORD_LIMIT so the session file stays bounded.
|
|
95
|
+
const entries = Object.entries({ ...existing, [turnId]: update });
|
|
96
|
+
session.extra[RECORD_KEY] = Object.fromEntries(entries.slice(-RECORD_LIMIT));
|
|
97
|
+
}
|
|
98
|
+
function recordedUpdate(recorded, turnId) {
|
|
99
|
+
const raw = recorded[str(turnId)];
|
|
100
|
+
if (!isDict(raw))
|
|
101
|
+
return null;
|
|
102
|
+
const kind = str(raw.kind);
|
|
103
|
+
if (!['delegation', 'process', 'mixed', 'other'].includes(kind))
|
|
104
|
+
return null;
|
|
105
|
+
const update = summaryUpdate(kind, raw.attention === true, str(raw.summary));
|
|
106
|
+
// ponytail: line entries are trusted as the server wrote them; validate per field if records ever come from elsewhere.
|
|
107
|
+
return { ...update, count: Math.max(1, Number(raw.count) || 1), lines: Array.isArray(raw.lines) && raw.lines.length ? raw.lines.filter(isDict) : update.lines };
|
|
108
|
+
}
|
|
109
|
+
function agentUpdate(m) {
|
|
110
|
+
const kind = AGENT_UPDATE_KINDS[str(m.display_kind)];
|
|
111
|
+
if (!kind)
|
|
112
|
+
return null;
|
|
113
|
+
const meta = isDict(m.display_metadata) ? m.display_metadata : {};
|
|
114
|
+
return summaryUpdate(kind, Number(meta.failed_count) > 0, backgroundUpdateSummary(messageText(m.content)));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Stamps `_background_update` on user rows that are automatic wakeups: Web's own (`_source: process_wakeup`, with the
|
|
118
|
+
* update recorded at delivery, else a generic one for older rows) and the Agent's (`display_kind` from state.db). A
|
|
119
|
+
* person typing the same text stays an ordinary user message. The rest of a wakeup's turn is the Agent's reply to it
|
|
120
|
+
* (`_background_reply`); a reply that ends on a silence marker is `_background_silent` throughout. Needs `_turn_id` on
|
|
121
|
+
* every row (`withTurnIds`). Returns copies; stored rows are untouched.
|
|
122
|
+
*/
|
|
123
|
+
export function withBackgroundUpdates(messages, session) {
|
|
124
|
+
const recorded = isDict(session.extra[RECORD_KEY]) ? session.extra[RECORD_KEY] : {};
|
|
125
|
+
const backgroundTurns = new Set();
|
|
126
|
+
const stamped = messages.map((m) => {
|
|
127
|
+
if (!isDict(m) || m.role !== 'user')
|
|
128
|
+
return m;
|
|
129
|
+
const update = m._source === BACKGROUND_SOURCE
|
|
130
|
+
? recordedUpdate(recorded, m._turn_id) ?? summaryUpdate('other', false, backgroundUpdateSummary(messageText(m.content)))
|
|
131
|
+
: agentUpdate(m);
|
|
132
|
+
if (!update)
|
|
133
|
+
return m;
|
|
134
|
+
backgroundTurns.add(str(m._turn_id));
|
|
135
|
+
return { ...m, _background_update: update };
|
|
136
|
+
});
|
|
137
|
+
// A turn is silent when its last assistant text is exactly a silence marker; a running turn has no final text yet.
|
|
138
|
+
const silent = new Set();
|
|
139
|
+
const lastText = new Map();
|
|
140
|
+
for (const m of stamped)
|
|
141
|
+
if (isDict(m) && m.role === 'assistant' && backgroundTurns.has(str(m._turn_id)) && messageText(m.content).trim())
|
|
142
|
+
lastText.set(str(m._turn_id), messageText(m.content));
|
|
143
|
+
for (const [turn, text] of lastText)
|
|
144
|
+
if (isSilentReply(text))
|
|
145
|
+
silent.add(turn);
|
|
146
|
+
return stamped.map((m) => {
|
|
147
|
+
if (!isDict(m) || m.role === 'user' || !backgroundTurns.has(str(m._turn_id)))
|
|
148
|
+
return m;
|
|
149
|
+
return { ...m, _background_reply: true, ...(silent.has(str(m._turn_id)) ? { _background_silent: true } : {}) };
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=background-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-updates.js","sourceRoot":"","sources":["../../src/sessions/background-updates.ts"],"names":[],"mappings":"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"}
|