@maudecode/talaria-web 1.17.2 → 1.18.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/auth-raw.d.ts +1 -1
- package/dist/api/auth-raw.js +4 -4
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +6 -0
- package/dist/api/automation-raw.js +53 -6
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +26 -1
- package/dist/api/automation-router.js +16 -2
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +649 -15
- package/dist/api/chat-router.js +52 -50
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +35 -1
- package/dist/api/git-router.js +18 -19
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +8 -0
- package/dist/api/raw-routes.js +247 -36
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +10 -0
- package/dist/api/router.js +10 -8
- package/dist/api/router.js.map +1 -1
- package/dist/api/sessions-router.d.ts +1492 -115
- package/dist/api/sessions-router.js +134 -8
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +31 -0
- package/dist/api/settings-router.js +8 -3
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +5 -0
- package/dist/api/sse-routes.js +50 -3
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.js +6 -23
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +356 -15
- package/dist/api/tools-router.js +148 -19
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.js +35 -15
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +5 -2
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/oidc.d.ts +5 -2
- package/dist/auth/oidc.js +8 -7
- package/dist/auth/oidc.js.map +1 -1
- package/dist/bin/talaria-web.js +1 -1
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/dotenv.js +1 -0
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/config/agent-config.js +3 -2
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/http/context.d.ts +17 -3
- package/dist/http/context.js +31 -4
- package/dist/http/context.js.map +1 -1
- package/dist/http/csp.d.ts +2 -1
- package/dist/http/csp.js +3 -2
- package/dist/http/csp.js.map +1 -1
- package/dist/profiles/profiles.d.ts +10 -0
- package/dist/profiles/profiles.js +40 -2
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/providers/catalog.d.ts +6 -2
- package/dist/providers/catalog.js +30 -11
- package/dist/providers/catalog.js.map +1 -1
- package/dist/raster-image.d.ts +7 -0
- package/dist/raster-image.js +267 -0
- package/dist/raster-image.js.map +1 -0
- package/dist/redact.js +327 -40
- package/dist/redact.js.map +1 -1
- package/dist/runtime.js +89 -23
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +2 -9
- package/dist/sessions/background-tasks.js +2 -12
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +15 -4
- package/dist/sessions/cli-sessions.js +120 -29
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +48 -8
- package/dist/sessions/completions.js +222 -26
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/export.d.ts +5 -0
- package/dist/sessions/export.js +30 -0
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-watcher.d.ts +7 -3
- package/dist/sessions/gateway-watcher.js +31 -19
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/handoff.d.ts +32 -0
- package/dist/sessions/handoff.js +114 -0
- package/dist/sessions/handoff.js.map +1 -0
- package/dist/sessions/list.d.ts +7 -1
- package/dist/sessions/list.js +13 -5
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +2 -4
- package/dist/sessions/merge.js +8 -15
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/recovery.d.ts +22 -0
- package/dist/sessions/recovery.js +506 -0
- package/dist/sessions/recovery.js.map +1 -0
- package/dist/sessions/relay.d.ts +21 -2
- package/dist/sessions/relay.js +156 -11
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +108 -6
- package/dist/sessions/service.js +403 -29
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +6 -0
- package/dist/sessions/session.js +40 -2
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/state-db-worker.d.ts +1 -0
- package/dist/sessions/state-db-worker.js +33 -0
- package/dist/sessions/state-db-worker.js.map +1 -0
- package/dist/sessions/state-db.d.ts +61 -0
- package/dist/sessions/state-db.js +291 -0
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/store.d.ts +7 -0
- package/dist/sessions/store.js +31 -22
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/titles.d.ts +2 -0
- package/dist/sessions/titles.js +4 -0
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +3 -3
- package/dist/sessions/tool-display.js +11 -37
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +1 -1
- package/dist/sessions/turn-context.js +11 -7
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +37 -2
- package/dist/sessions/turn.js +182 -49
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +59 -0
- package/dist/sessions/wakeup-pause.js +181 -0
- package/dist/sessions/wakeup-pause.js.map +1 -0
- package/dist/settings.js +5 -7
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/fake.d.ts +2 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/startup.d.ts +13 -5
- package/dist/startup.js +48 -0
- package/dist/startup.js.map +1 -1
- package/dist/test/ts-worker-hooks.d.ts +1 -0
- package/dist/test/ts-worker-hooks.js +24 -0
- package/dist/test/ts-worker-hooks.js.map +1 -0
- package/dist/text/diff.d.ts +9 -14
- package/dist/text/diff.js +74 -108
- package/dist/text/diff.js.map +1 -1
- package/dist/tools/crons.js +45 -8
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +53 -0
- package/dist/tools/dashboard-plugins.js +188 -0
- package/dist/tools/dashboard-plugins.js.map +1 -0
- package/dist/tools/extensions.d.ts +13 -1
- package/dist/tools/extensions.js +132 -60
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/health.d.ts +32 -0
- package/dist/tools/health.js +111 -19
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/mcp.d.ts +13 -0
- package/dist/tools/mcp.js +88 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/project-os.d.ts +11 -0
- package/dist/tools/project-os.js +267 -0
- package/dist/tools/project-os.js.map +1 -0
- package/dist/tools/skills.d.ts +5 -1
- package/dist/tools/skills.js +5 -3
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/updates.d.ts +27 -9
- package/dist/tools/updates.js +163 -51
- package/dist/tools/updates.js.map +1 -1
- package/dist/tools/wiki.d.ts +68 -0
- package/dist/tools/wiki.js +413 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/workspace/escape.d.ts +61 -0
- package/dist/workspace/escape.js +149 -0
- package/dist/workspace/escape.js.map +1 -0
- package/dist/workspace/extract.d.ts +22 -0
- package/dist/workspace/extract.js +308 -0
- package/dist/workspace/extract.js.map +1 -0
- package/dist/workspace/fs.d.ts +12 -0
- package/dist/workspace/fs.js +92 -23
- package/dist/workspace/fs.js.map +1 -1
- package/dist/workspace/git.d.ts +18 -0
- package/dist/workspace/git.js +38 -25
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +4 -4
- package/dist/workspace/media.js +16 -45
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/rollback.d.ts +34 -20
- package/dist/workspace/rollback.js +171 -265
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/unzip.js +4 -1
- package/dist/workspace/unzip.js.map +1 -1
- package/dist/workspace/upload.d.ts +7 -4
- package/dist/workspace/upload.js +5 -2
- package/dist/workspace/upload.js.map +1 -1
- package/dist/workspace/worktrees.d.ts +2 -1
- package/dist/workspace/worktrees.js +14 -15
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +4 -2
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/scripts/replay_sidecar.py +24 -0
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/home.py +13 -2
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +39 -5
- package/sidecar/talaria_sidecar/methods/chat.py +9 -5
- package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
- package/sidecar/talaria_sidecar/methods/commands.py +81 -0
- package/sidecar/talaria_sidecar/methods/cron.py +29 -2
- package/sidecar/talaria_sidecar/methods/gateway.py +32 -15
- package/sidecar/talaria_sidecar/methods/kanban.py +28 -7
- package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
- package/sidecar/talaria_sidecar/methods/process.py +58 -4
- package/sidecar/talaria_sidecar/methods/profiles.py +77 -7
- package/sidecar/talaria_sidecar/methods/providers.py +27 -8
- package/sidecar/talaria_sidecar/methods/state_db.py +39 -5
- package/sidecar/talaria_sidecar/runtime.py +17 -1
- package/static/dist/FILES.txt +127 -126
- package/static/dist/assets/AppShell-g3bkgnvt.js +1 -0
- package/static/dist/assets/ChatPage-oo7bdan6.js +25 -0
- package/static/dist/assets/Dialog-g355qxhp.js +1 -0
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +1 -0
- package/static/dist/assets/HubRoute-lmkrbw47.js +2 -0
- package/static/dist/assets/{Markdown-mdwlvj3w.js → Markdown-j4kut4j2.js} +114 -114
- package/static/dist/assets/{RightPanel-ftvrjlcp.js → RightPanel-ohlsdzfl.js} +1 -1
- package/static/dist/assets/Select-kddq75qc.js +1 -0
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +1 -0
- package/static/dist/assets/{SettingsLayout-jonjefmj.js → SettingsLayout-o9bv4mgb.js} +1 -1
- package/static/dist/assets/{States-nmejrwrm.js → States-eq6fe29m.js} +1 -1
- package/static/dist/assets/Toaster-pc247u9f.js +1 -0
- package/static/dist/assets/{_app-gdidzd94.js → _app-f8n1i0m1.js} +1 -1
- package/static/dist/assets/{_app.ext._extensionId-opyh9y0v.js → _app.ext._extensionId-gfbzpoou.js} +1 -1
- package/static/dist/assets/_app.index-bzzv80hk.js +1 -0
- package/static/dist/assets/_app.insights-dzixbryi.js +1 -0
- package/static/dist/assets/_app.kanban-c6hep2us.js +1 -0
- package/static/dist/assets/_app.logs-i69qds98.js +1 -0
- package/static/dist/assets/_app.memory-kl4vf0gd.js +1 -0
- package/static/dist/assets/_app.profiles-b8zinmyp.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-bfd4h3id.js → _app.session._sessionId-fn1bhde6.js} +1 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +1 -0
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +3 -0
- package/static/dist/assets/_app.skills-cs47sbvs.js +1 -0
- package/static/dist/assets/_app.tasks-dwvk64tc.js +1 -0
- package/static/dist/assets/_app.todos-c8xjm8p3.js +1 -0
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-b2x1lqot.js → abnfDiagram-VCTEODGH-c8kdixke.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-h38o5l7b.js → architectureDiagram-5GKGNRK7-cku06x1p.js} +1 -1
- package/static/dist/assets/{back-bemaer09.js → back-h7aun7ew.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-bqquxv2u.js → blockDiagram-I7D4REHJ-jzthp1wa.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-f3fb8w6z.js → c4Diagram-7LVT6UL2-mwr67mt8.js} +1 -1
- package/static/dist/assets/{cancel-drd0g6d9.js → cancel-fhi0vcnu.js} +1 -1
- package/static/dist/assets/channel-b2zo73z1.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-bzfyyzp3.js → chunk-4HAMMTFA-gpq1y228.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-ly99rfx5.js → chunk-75Z2AOVW-ktje58c4.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-bg6ecfqf.js → chunk-DU6HZSFF-ofajdixh.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-e8k7mmqw.js → chunk-F27PBJKO-cmev85ti.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-cmalnoaj.js → chunk-GMAD6QVW-htjgt22y.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-gmif5o01.js → chunk-GVQU2GXP-qndvoxl7.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-f1nwwh6u.js → chunk-IMKFNOWR-e5bkd5q6.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-oktfh5v7.js → chunk-L3NEJ4N5-mj1155r6.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-b1sdx96z.js → chunk-OSK3NFVY-e7gkikcw.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-fhu4nzxt.js → chunk-P2QGCYS3-f7t54xfm.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-em31rnef.js → chunk-POPQ4Y6H-i927v9oa.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-bxhhyftw.js → chunk-PWAF6VOD-m84lmnyt.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-fmrvwcav.js → chunk-SHT3W25Y-mi0tlcu9.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-lymukl2j.js → chunk-SVP7TREG-dnau702j.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-lmza6k23.js → chunk-TICWLB2K-edem1gkg.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +1 -0
- package/static/dist/assets/{copied-ima3pysb.js → copied-hcplv46p.js} +1 -1
- package/static/dist/assets/{copy-fw5b1pc6.js → copy-magtofyp.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-czlhbyhs.js → cynefin-OW5HDTMX-siqlulkl.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-gq7mvswb.js → cynefinDiagram-5FMLGOSQ-i648tah9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-cqdbf7dr.js → dagre-GXQ25YYZ-mwn6uc17.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-o6arxa58.js → diagram-S7CK7UJ4-l8abxaes.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-nhnd68tz.js → diagram-UQ7AKVKN-mekq7zgq.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-dk2sclzn.js → diagram-VSXAHHWV-fnky6lvc.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-n3k5nyx3.js → diagram-VX7I27RA-xe6r5qfw.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-m6q9cwdh.js → diagram-Z3DM3KII-nq07dg7k.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-lsa5641p.js → ebnfDiagram-PWID7BFC-c62ipm3g.js} +1 -1
- package/static/dist/assets/endpoints-klbxod4t.js +64 -0
- package/static/dist/assets/{erDiagram-RLTQ6QDP-fo2ckbe6.js → erDiagram-RLTQ6QDP-h39kmnzy.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-nzqz6x9g.js → ganttDiagram-EL5Y4UJY-ngbsyp37.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-gukvcxe6.js → gitGraph-4MIJSDKK-fr2i7caa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-lqhdp8f0.js → gitGraphDiagram-WWUBYQGX-eravdti4.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-igw6cp39.js → highlighted-body-KPVGNVTW-jwpop9p8.js} +1 -1
- package/static/dist/assets/host-i828xuo7.js +1 -0
- package/static/dist/assets/index-eh8zilnv.css +2 -0
- package/static/dist/assets/{index-cxq58xb1.js → index-r648f4o1.js} +5 -5
- package/static/dist/assets/{info-A6RAGUB7-gvu7a93l.js → info-A6RAGUB7-h11x0dxo.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-m8t8g6w1.js → infoDiagram-27XIBGKW-dfh47dw9.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-l07vkbgj.js → ishikawaDiagram-5VMMS53U-i6ypq351.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-hybkgj8l.js → journeyDiagram-3NMN7TZE-lduf1z95.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-by13uvtn.js → kanban-definition-UXKFOSKX-e18bu4pg.js} +1 -1
- package/static/dist/assets/{lazyRouteComponent-af0lvgjx.js → lazyRouteComponent-e1y4t2i9.js} +1 -1
- package/static/dist/assets/{line-osxq6fq7.js → line-meizqsvn.js} +1 -1
- package/static/dist/assets/{link-jyxicdhg.js → link-oot2yn73.js} +1 -1
- package/static/dist/assets/login-gu28l9ou.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-i91oxmou.js → mermaid-parser.core-ntne45i9.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-m82mx8ww.js → mindmap-definition-YA3MSWOX-27b26eok.js} +1 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +1 -0
- package/static/dist/assets/{onboarding_model_label-dp7xffoh.js → onboarding_model_label-ftpjdwqk.js} +1 -1
- package/static/dist/assets/{packet-AYTQ26CC-nbtgge2o.js → packet-AYTQ26CC-l6jdka8p.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-f1zxzga1.js → pegDiagram-XKGWAZYB-g1er3bxj.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-of8vuhxs.js → pie-WAS4IAKB-i0ylcrt9.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-o7y8ftio.js → pieDiagram-E7YTZNPT-fbz1e55z.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-iqiwia1t.js → quadrantDiagram-AXDQQJYC-hhue7d8o.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-delnsy2v.js → radar-RG4KPBEZ-f9b70aa4.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-nspnyq9u.js → railroad-74A4TZTK-lgsuoeda.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-z41tqx5z.js → railroadDiagram-O6MQD6OU-eqpy9fnz.js} +1 -1
- package/static/dist/assets/{refresh-b4uams1i.js → refresh-abtu93ke.js} +1 -1
- package/static/dist/assets/{refresh-cw-nt1dtsx4.js → refresh-cw-hlwb02qv.js} +1 -1
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-bdvif194.js → requirementDiagram-BXWQKSXE-ogf6puhi.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-h73e0rol.js → sankeyDiagram-P5KCCOFB-fqb8xcjf.js} +1 -1
- package/static/dist/assets/{saved-kg52csy7.js → saved-girnabkf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-iv95mb1z.js → sequenceDiagram-WJ2MYXX4-dlcz6qjz.js} +1 -1
- package/static/dist/assets/{settings_section_extensions_title-ej0iapxe.js → settings_section_extensions_title-h14cwk6f.js} +1 -1
- package/static/dist/assets/share._token-kl0r7ido.js +2 -0
- package/static/dist/assets/{sliders-horizontal-fj18it47.js → sliders-horizontal-n1zm34qq.js} +1 -1
- package/static/dist/assets/sse-iwku0sjo.js +1 -0
- package/static/dist/assets/{stateDiagram-D77RDMKH-k417ixmf.js → stateDiagram-D77RDMKH-fyoznpcs.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-esola70w.js → swimlanes-42K2YHIH-oefldhfy.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-getrz2y8.js → timeline-definition-24CTP7MA-b1vl2zil.js} +1 -1
- package/static/dist/assets/todoStore-jjr5yr78.js +1 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-hc7ap1q7.js → treeView-Q6P3EWNA-f7hcci5o.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-b7k1syy5.js → treemap-WGGIJYW6-nl85071a.js} +1 -1
- package/static/dist/assets/{tts-lxdxnmjd.js → units-kgxzxfhi.js} +1 -1
- package/static/dist/assets/{untitled-ovpfthg4.js → untitled-cikfjntn.js} +1 -1
- package/static/dist/assets/{useForm-bcblv1rx.js → useForm-kqoqg0k9.js} +1 -1
- package/static/dist/assets/useLocale-o59tbiea.js +1 -0
- package/static/dist/assets/{useParams-lhg566ew.js → useParams-b4dq6n4q.js} +1 -1
- package/static/dist/assets/{useSearch-lbrh6ejn.js → useSearch-ipfmv3he.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-n6pcy5qb.js → vennDiagram-4TSXK5OY-h5hzbk0n.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-lpa18vz1.js → wardley-WFR3VGLG-jftvpm3e.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-kpclwwg7.js → wardleyDiagram-VM6X3IG4-hedh85ge.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-paa2n8y0.js → xychartDiagram-S5SC5T6Z-e49523ab.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- package/static/dist/assets/AppShell-fb2td9zi.js +0 -1
- package/static/dist/assets/ChatPage-cj96kiy9.js +0 -25
- package/static/dist/assets/Dialog-kxcg7ard.js +0 -1
- package/static/dist/assets/ExtensionRoute-jf7h0754.js +0 -1
- package/static/dist/assets/HubRoute-gmanpd5y.js +0 -2
- package/static/dist/assets/Select-bilaypej.js +0 -1
- package/static/dist/assets/SessionListPanel-og8n36qs.js +0 -1
- package/static/dist/assets/Toaster-nnl8zkt9.js +0 -1
- package/static/dist/assets/_app.index-hbarzbjx.js +0 -1
- package/static/dist/assets/_app.insights-luywlarz.js +0 -1
- package/static/dist/assets/_app.kanban-kincnbr8.js +0 -1
- package/static/dist/assets/_app.logs-oi2gr3gs.js +0 -1
- package/static/dist/assets/_app.memory-b6jfivt6.js +0 -1
- package/static/dist/assets/_app.profiles-lpvixmqp.js +0 -1
- package/static/dist/assets/_app.settings-vowx3iq0.js +0 -1
- package/static/dist/assets/_app.settings._section-cnntg1tu.js +0 -3
- package/static/dist/assets/_app.skills-fb57lpau.js +0 -1
- package/static/dist/assets/_app.tasks-eszpx1q7.js +0 -2
- package/static/dist/assets/_app.todos-nr05ac6w.js +0 -1
- package/static/dist/assets/_app.workspaces-d2luomu6.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-hd0o7bde.js +0 -1
- package/static/dist/assets/channel-cpdgf867.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-ko09sguk.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-ko09sguk.js +0 -1
- package/static/dist/assets/endpoints-d33siokx.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-emctlo64.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-bfi3moqa.js +0 -1
- package/static/dist/assets/index-hgtx08n5.css +0 -2
- package/static/dist/assets/login-ec21t39x.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-gfl8z3ep.js +0 -1
- package/static/dist/assets/onboarding-btnltvyz.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nst1qxyn.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-ci37x8qy.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-aimkk07z.js +0 -1
- package/static/dist/assets/share._token-f97e94r0.js +0 -2
- package/static/dist/assets/sse-fwpqtzbg.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hwn4apct.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d1h97oyg.js +0 -8
- package/static/dist/assets/todoStore-eginf9h4.js +0 -1
- package/static/dist/assets/useLocale-fi5jb8ma.js +0 -1
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
9
|
import { existsSync } from 'node:fs';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
|
-
import {
|
|
11
|
+
import { cheapChangeFingerprintAsync, readImportableAgentSessionRowsAsync } from './state-db.js';
|
|
12
12
|
import { str } from '../util.js';
|
|
13
13
|
export const GATEWAY_POLL_INTERVAL_S = 5;
|
|
14
14
|
const PROJECTION_PARITY_INTERVAL_S = 300;
|
|
@@ -19,11 +19,11 @@ export function snapshotHash(sessions) {
|
|
|
19
19
|
return createHash('md5').update(key).digest('hex');
|
|
20
20
|
}
|
|
21
21
|
/** Python `_get_agent_sessions_from_db`: the watcher's lightweight projection (null when the read failed). */
|
|
22
|
-
export function agentSessionsFromDb(dbPath, onError) {
|
|
22
|
+
export async function agentSessionsFromDb(dbPath, onError) {
|
|
23
23
|
if (!existsSync(dbPath))
|
|
24
24
|
return [];
|
|
25
25
|
try {
|
|
26
|
-
return
|
|
26
|
+
return (await readImportableAgentSessionRowsAsync(dbPath, { limit: 200 })).map((row) => ({
|
|
27
27
|
session_id: row.id, title: row.title || 'Agent Session', model: row.model || null,
|
|
28
28
|
message_count: Number(row.message_count) || Number(row.actual_message_count) || 0,
|
|
29
29
|
created_at: row.started_at, updated_at: row.last_activity ?? row.started_at, source: row.source || 'cli',
|
|
@@ -48,6 +48,7 @@ export class GatewayWatcher {
|
|
|
48
48
|
lastCheapFp = '';
|
|
49
49
|
lastFullProjectionAt = null;
|
|
50
50
|
lastErrorLogAt = Number.NEGATIVE_INFINITY;
|
|
51
|
+
polling = null;
|
|
51
52
|
constructor(profileName, hermesHome, opts) {
|
|
52
53
|
this.profileName = profileName;
|
|
53
54
|
this.hermesHome = hermesHome;
|
|
@@ -64,16 +65,13 @@ export class GatewayWatcher {
|
|
|
64
65
|
const tick = () => {
|
|
65
66
|
if (this.stopping)
|
|
66
67
|
return;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
this.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return;
|
|
75
|
-
this.timer = setTimeout(tick, this.opts.pollIntervalMs ?? GATEWAY_POLL_INTERVAL_S * 1000);
|
|
76
|
-
this.timer.unref();
|
|
68
|
+
// The next tick is armed only once this poll settles, so the timer never stacks polls.
|
|
69
|
+
void this.pollOnce().catch((error) => { this.warnFailure('poll loop raised', error); }).then(() => {
|
|
70
|
+
if (this.stopping || this.timer !== null)
|
|
71
|
+
return;
|
|
72
|
+
this.timer = setTimeout(() => { this.timer = null; tick(); }, this.opts.pollIntervalMs ?? GATEWAY_POLL_INTERVAL_S * 1000);
|
|
73
|
+
this.timer.unref();
|
|
74
|
+
});
|
|
77
75
|
};
|
|
78
76
|
tick();
|
|
79
77
|
}
|
|
@@ -88,14 +86,19 @@ export class GatewayWatcher {
|
|
|
88
86
|
this.push(q, null);
|
|
89
87
|
}
|
|
90
88
|
subscribe() {
|
|
91
|
-
const q = { items: [], wake: null };
|
|
89
|
+
const q = { items: [], wake: null, ended: false };
|
|
92
90
|
this.subscribers.add(q);
|
|
93
91
|
// Stop-race safety: a subscriber attached after stop() still receives the sentinel so its SSE loop ends and reconnects.
|
|
94
92
|
if (this.stopping)
|
|
95
93
|
q.items.push(null);
|
|
96
94
|
return {
|
|
97
95
|
next: (signal) => new Promise((resolve) => {
|
|
98
|
-
const deliver = () => {
|
|
96
|
+
const deliver = () => {
|
|
97
|
+
const item = q.items.shift() ?? null;
|
|
98
|
+
if (item === null)
|
|
99
|
+
q.ended = true;
|
|
100
|
+
resolve(item);
|
|
101
|
+
};
|
|
99
102
|
if (q.items.length) {
|
|
100
103
|
deliver();
|
|
101
104
|
return;
|
|
@@ -108,6 +111,7 @@ export class GatewayWatcher {
|
|
|
108
111
|
signal?.addEventListener('abort', onAbort, { once: true });
|
|
109
112
|
q.wake = () => { signal?.removeEventListener('abort', onAbort); deliver(); };
|
|
110
113
|
}),
|
|
114
|
+
get ended() { return q.ended; },
|
|
111
115
|
close: () => { this.subscribers.delete(q); },
|
|
112
116
|
};
|
|
113
117
|
}
|
|
@@ -136,18 +140,26 @@ export class GatewayWatcher {
|
|
|
136
140
|
this.opts.log(`[webui] WARNING: Gateway watcher ${reason} for ${this.stateDbPath}; the session sidebar will not update until it recovers: ${error.message}`);
|
|
137
141
|
}
|
|
138
142
|
}
|
|
139
|
-
/** One change-detection pass; returns true when the projection ran. */
|
|
143
|
+
/** One change-detection pass; returns true when the projection ran. A call while a pass is in flight skips (false). */
|
|
140
144
|
pollOnce(now = this.opts.now()) {
|
|
145
|
+
if (this.polling)
|
|
146
|
+
return Promise.resolve(false);
|
|
147
|
+
const pass = this.poll(now).finally(() => { this.polling = null; });
|
|
148
|
+
this.polling = pass;
|
|
149
|
+
return pass;
|
|
150
|
+
}
|
|
151
|
+
async poll(now) {
|
|
141
152
|
const exists = existsSync(this.stateDbPath);
|
|
142
153
|
// Never publish an empty first snapshot before the Agent has created state.db.
|
|
143
154
|
if (!exists && this.lastFullProjectionAt === null && !this.lastHash)
|
|
144
155
|
return false;
|
|
145
|
-
const cheapFp = exists ?
|
|
156
|
+
const cheapFp = exists ? await cheapChangeFingerprintAsync(this.stateDbPath, (reason, error) => { this.warnFailure(reason, error); }) : '';
|
|
146
157
|
const parityDue = this.lastFullProjectionAt === null || now - this.lastFullProjectionAt >= PROJECTION_PARITY_INTERVAL_S;
|
|
147
158
|
if (cheapFp !== null && cheapFp === this.lastCheapFp && !parityDue)
|
|
148
159
|
return false;
|
|
149
|
-
const sessions = agentSessionsFromDb(this.stateDbPath, (reason, error) => { this.warnFailure(reason, error); });
|
|
150
|
-
|
|
160
|
+
const sessions = await agentSessionsFromDb(this.stateDbPath, (reason, error) => { this.warnFailure(reason, error); });
|
|
161
|
+
// A watcher stopped mid-pass has already sent its subscribers the end sentinel.
|
|
162
|
+
if (sessions === null || this.stopping)
|
|
151
163
|
return false;
|
|
152
164
|
const hash = snapshotHash(sessions);
|
|
153
165
|
if (cheapFp !== null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-watcher.js","sourceRoot":"","sources":["../../src/sessions/gateway-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gateway-watcher.js","sourceRoot":"","sources":["../../src/sessions/gateway-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type Message = Record<string, unknown>;
|
|
2
|
+
/** The summary prompt the session's main model answers. */
|
|
3
|
+
export declare const HANDOFF_SYSTEM_PROMPT: string;
|
|
4
|
+
/** Python `_extract_handoff_text`: a content-part list joins its text parts. */
|
|
5
|
+
export declare function handoffText(content: unknown): string;
|
|
6
|
+
/** The transcript the model reads: each user/assistant message's text, capped at 1000 characters. */
|
|
7
|
+
export declare function handoffTranscript(messages: Message[]): string;
|
|
8
|
+
/** Python `_fallback_handoff_summary`: the last user and assistant point, in the conversation's language. */
|
|
9
|
+
export declare function fallbackHandoffSummary(messages: Message[]): string;
|
|
10
|
+
/** Python `_summary_output_incomplete`: empty, ellipsized, or a last line that stops mid-sentence. */
|
|
11
|
+
export declare function summaryOutputIncomplete(raw: string): boolean;
|
|
12
|
+
/** Python `_agent_summary_incomplete`: the provider stopped on its token limit, or the text looks cut off. */
|
|
13
|
+
export declare function completionIncomplete(result: {
|
|
14
|
+
text: string;
|
|
15
|
+
finish_reason?: string | null;
|
|
16
|
+
}): boolean;
|
|
17
|
+
interface HandoffPayload {
|
|
18
|
+
session_id: string;
|
|
19
|
+
summary: string;
|
|
20
|
+
channel: unknown;
|
|
21
|
+
rounds: unknown;
|
|
22
|
+
fallback: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Python `_build_handoff_summary_tool_message`: an empty `tool_call_id` keeps the marker out of the model's history. */
|
|
25
|
+
export declare function handoffMarker(sid: string, summary: string, channel: string | null, rounds: number, fallback: boolean, now: number): Message;
|
|
26
|
+
/** A marker's card payload (Python `_extract_handoff_summary_payload` / `_is_matching_handoff_summary_content`). */
|
|
27
|
+
export declare function handoffPayload(content: unknown): HandoffPayload | null;
|
|
28
|
+
/** The tail dedupe: the same card regardless of when it was generated. */
|
|
29
|
+
export declare function sameHandoff(a: HandoffPayload | null, b: HandoffPayload | null): boolean;
|
|
30
|
+
/** A WebUI transcript row's card payload: only a `handoff_summary` tool row carries one. */
|
|
31
|
+
export declare function messageHandoffPayload(m: unknown): HandoffPayload | null;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAL-258: the handoff dock's summary (Python `_handle_handoff_summary` and its persistence helpers). The prompt, the
|
|
3
|
+
* deterministic English/Chinese fallback, the truncation guard, and the display-only `handoff_summary` tool marker.
|
|
4
|
+
*/
|
|
5
|
+
import { str } from '../util.js';
|
|
6
|
+
import { isDict } from './merge.js';
|
|
7
|
+
/** The summary prompt the session's main model answers. */
|
|
8
|
+
export const HANDOFF_SYSTEM_PROMPT = [
|
|
9
|
+
'You are summarizing an external-channel conversation so a Web UI reader can quickly catch up after switching contexts.',
|
|
10
|
+
'',
|
|
11
|
+
'Only use the latest messages, and never copy raw transcript lines.',
|
|
12
|
+
'Do not output role labels (no “你:” / “assistant:” / “user:” / “assistant”).',
|
|
13
|
+
'Use direct 2–5 bullet points in the conversation language.',
|
|
14
|
+
'English: speak using “you”.',
|
|
15
|
+
'中文: 使用“你”。',
|
|
16
|
+
'',
|
|
17
|
+
'Focus on:',
|
|
18
|
+
'- Unfinished tasks or action items',
|
|
19
|
+
'- Pending questions that need replies',
|
|
20
|
+
'- Key decisions made',
|
|
21
|
+
'- Open disagreements or TBD items',
|
|
22
|
+
'',
|
|
23
|
+
'If the conversation is purely casual with no actionable items, say so in one sentence.',
|
|
24
|
+
].join('\n');
|
|
25
|
+
/** Python `_extract_handoff_text`: a content-part list joins its text parts. */
|
|
26
|
+
export function handoffText(content) {
|
|
27
|
+
if (Array.isArray(content))
|
|
28
|
+
return content.filter(isDict).map((part) => str(part.text || part.content || '')).join(' ').trim();
|
|
29
|
+
return str(content ?? '').trim();
|
|
30
|
+
}
|
|
31
|
+
// Code points, as Python counts and slices them.
|
|
32
|
+
const chars = (text) => Array.from(text);
|
|
33
|
+
const isConversation = (m) => m.role === 'user' || m.role === 'assistant';
|
|
34
|
+
const isChinese = (messages) => messages.some((m) => /[一-鿿]/.test(handoffText(m.content)));
|
|
35
|
+
/** The transcript the model reads: each user/assistant message's text, capped at 1000 characters. */
|
|
36
|
+
export function handoffTranscript(messages) {
|
|
37
|
+
return messages.flatMap((m) => {
|
|
38
|
+
const text = chars(handoffText(m.content)).slice(0, 1000).join('').trim();
|
|
39
|
+
return isConversation(m) && text ? [text] : [];
|
|
40
|
+
}).join('\n');
|
|
41
|
+
}
|
|
42
|
+
function snippet(raw, max = 82) {
|
|
43
|
+
const text = raw.split(/\s+/).filter(Boolean).join(' ');
|
|
44
|
+
const cps = chars(text);
|
|
45
|
+
return cps.length <= max ? text : `${cps.slice(0, max - 1).join('').trimEnd()}…`;
|
|
46
|
+
}
|
|
47
|
+
/** Python `_fallback_handoff_summary`: the last user and assistant point, in the conversation's language. */
|
|
48
|
+
export function fallbackHandoffSummary(messages) {
|
|
49
|
+
const chinese = isChinese(messages);
|
|
50
|
+
const user = [];
|
|
51
|
+
const assistant = [];
|
|
52
|
+
for (const m of messages) {
|
|
53
|
+
const text = snippet(handoffText(m.content));
|
|
54
|
+
if (!isConversation(m) || !text)
|
|
55
|
+
continue;
|
|
56
|
+
(m.role === 'user' ? user : assistant).push(text);
|
|
57
|
+
}
|
|
58
|
+
if (!user.length && !assistant.length) {
|
|
59
|
+
return chinese ? '近期可读文本不足,无法生成更完整的交接摘要,请补充一条消息后重试。' : 'Not enough readable text to create a useful handoff summary; please send one more message and retry.';
|
|
60
|
+
}
|
|
61
|
+
const enough = user.length + assistant.length >= 2;
|
|
62
|
+
const bullets = chinese
|
|
63
|
+
? [...(user.length ? [`- 你刚讨论了:${user.at(-1)}。`] : []), ...(assistant.length ? [`- 助手已回复:${assistant.at(-1)}。`] : []), enough ? '- 当前对话存在尚未确认的后续动作。' : '- 当前信息偏少,建议补充关键点后再切换。']
|
|
64
|
+
: [...(user.length ? [`- You asked: ${user.at(-1)}.`] : []), ...(assistant.length ? [`- The assistant responded: ${assistant.at(-1)}.`] : []), enough ? '- There is pending context to continue next.' : '- The conversation is still short; add one more turn before summarizing.'];
|
|
65
|
+
return bullets.join('\n');
|
|
66
|
+
}
|
|
67
|
+
/** Python `_summary_output_incomplete`: empty, ellipsized, or a last line that stops mid-sentence. */
|
|
68
|
+
export function summaryOutputIncomplete(raw) {
|
|
69
|
+
const text = raw.trim();
|
|
70
|
+
if (!text || text.endsWith('...') || text.endsWith('…'))
|
|
71
|
+
return true;
|
|
72
|
+
const last = text.split('\n').map((line) => line.trim()).filter(Boolean).at(-1);
|
|
73
|
+
if (!last)
|
|
74
|
+
return true;
|
|
75
|
+
if (/[。!?;!?.;]$/.test(last))
|
|
76
|
+
return false;
|
|
77
|
+
if (chars(last).length >= 56 && !/\b(and|or|so|then|because|if|when|but|as)\b$/i.test(last))
|
|
78
|
+
return true;
|
|
79
|
+
return /\b(and|or|but|so|because|if|when)$/i.test(last);
|
|
80
|
+
}
|
|
81
|
+
/** Python `_agent_summary_incomplete`: the provider stopped on its token limit, or the text looks cut off. */
|
|
82
|
+
export function completionIncomplete(result) {
|
|
83
|
+
const reason = str(result.finish_reason).trim().toLowerCase();
|
|
84
|
+
return reason === 'length' || reason === 'max_tokens' || summaryOutputIncomplete(result.text);
|
|
85
|
+
}
|
|
86
|
+
/** Python `_build_handoff_summary_tool_message`: an empty `tool_call_id` keeps the marker out of the model's history. */
|
|
87
|
+
export function handoffMarker(sid, summary, channel, rounds, fallback, now) {
|
|
88
|
+
const content = JSON.stringify({ _handoff_summary_card: true, session_id: sid, summary: summary.trim(), channel: channel?.trim() || null, rounds, fallback, generated_at: now });
|
|
89
|
+
return { role: 'tool', tool_call_id: '', name: 'handoff_summary', timestamp: now, _ts: now, content };
|
|
90
|
+
}
|
|
91
|
+
/** A marker's card payload (Python `_extract_handoff_summary_payload` / `_is_matching_handoff_summary_content`). */
|
|
92
|
+
export function handoffPayload(content) {
|
|
93
|
+
let payload = content;
|
|
94
|
+
if (typeof content === 'string') {
|
|
95
|
+
try {
|
|
96
|
+
payload = JSON.parse(content);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!isDict(payload) || payload._handoff_summary_card !== true || payload.session_id === null || payload.session_id === undefined)
|
|
103
|
+
return null;
|
|
104
|
+
return { session_id: str(payload.session_id), summary: str(payload.summary ?? ''), channel: payload.channel ?? null, rounds: payload.rounds ?? null, fallback: Boolean(payload.fallback) };
|
|
105
|
+
}
|
|
106
|
+
/** The tail dedupe: the same card regardless of when it was generated. */
|
|
107
|
+
export function sameHandoff(a, b) {
|
|
108
|
+
return a !== null && b !== null && a.session_id === b.session_id && a.summary === b.summary && a.channel === b.channel && a.rounds === b.rounds && a.fallback === b.fallback;
|
|
109
|
+
}
|
|
110
|
+
/** A WebUI transcript row's card payload: only a `handoff_summary` tool row carries one. */
|
|
111
|
+
export function messageHandoffPayload(m) {
|
|
112
|
+
return isDict(m) && m.role === 'tool' && m.name === 'handoff_summary' ? handoffPayload(m.content) : null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/sessions/handoff.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/list.d.ts
CHANGED
|
@@ -49,6 +49,10 @@ export interface ListParams {
|
|
|
49
49
|
stateDbSources?: (ids: string[]) => Map<string, string> | null;
|
|
50
50
|
/** TAL-482: background kinds whose state.db rows stopped at the per-kind cap, so more exist than `cliRows` holds. */
|
|
51
51
|
truncatedSources?: ReadonlySet<string>;
|
|
52
|
+
/** TAL-590: removes the sidebar rows' orphaned imports (Python #3238) and answers their ids, which the list drops. */
|
|
53
|
+
pruneOrphanedImports?: (rows: Row[]) => Set<string>;
|
|
54
|
+
/** The sidebar's `allSessions` rows when the caller already read them for its state.db lookups (TAL-920). */
|
|
55
|
+
webuiRows?: Row[];
|
|
52
56
|
}
|
|
53
57
|
export interface GatewayIdentity {
|
|
54
58
|
session_key: string;
|
|
@@ -72,6 +76,8 @@ export declare function isClaimableCliSource(meta: Row, stateDbSource: string):
|
|
|
72
76
|
* unreadable state.db (null) locks every candidate, since an unknown owner is not a released one.
|
|
73
77
|
*/
|
|
74
78
|
export declare function withOwnerLocks(rows: Row[], stateDbSources: (ids: string[]) => Map<string, string> | null): Row[];
|
|
79
|
+
/** The ids `withOwnerLocks` asks `stateDbSources` about: rows not already read-only and not WebUI- or fork-born. */
|
|
80
|
+
export declare function ownerLockCandidates(rows: Row[]): string[];
|
|
75
81
|
/** Python `_session_is_subagent_view_only` on a row: a delegated child by any source marker. */
|
|
76
82
|
export declare function isSubagentRow(row: Row): boolean;
|
|
77
83
|
/**
|
|
@@ -125,7 +131,7 @@ export interface ListPayload {
|
|
|
125
131
|
other_profile_count: number;
|
|
126
132
|
settings: Record<string, boolean>;
|
|
127
133
|
}
|
|
128
|
-
/** Python `_build_session_list_cache_payload`;
|
|
134
|
+
/** Python `_build_session_list_cache_payload`; of its orphaned-sidecar prunes only the imported one (#3238) applies. */
|
|
129
135
|
export declare function buildSessionListPayload(store: SessionStore, params: ListParams): ListPayload;
|
|
130
136
|
export interface RuntimeOverlay {
|
|
131
137
|
activeStreamIds: Set<string>;
|
package/dist/sessions/list.js
CHANGED
|
@@ -527,8 +527,7 @@ export function isClaimableCliSource(meta, stateDbSource) {
|
|
|
527
527
|
* unreadable state.db (null) locks every candidate, since an unknown owner is not a released one.
|
|
528
528
|
*/
|
|
529
529
|
export function withOwnerLocks(rows, stateDbSources) {
|
|
530
|
-
const
|
|
531
|
-
const candidates = rows.filter((r) => !r.read_only && !webuiOwned(r)).map((r) => str(r.session_id));
|
|
530
|
+
const candidates = ownerLockCandidates(rows);
|
|
532
531
|
if (!candidates.length)
|
|
533
532
|
return rows;
|
|
534
533
|
const owners = stateDbSources(candidates);
|
|
@@ -540,6 +539,11 @@ export function withOwnerLocks(rows, stateDbSources) {
|
|
|
540
539
|
}));
|
|
541
540
|
return locked.size ? rows.map((r) => (locked.has(str(r.session_id)) ? { ...r, read_only: true } : r)) : rows;
|
|
542
541
|
}
|
|
542
|
+
/** The ids `withOwnerLocks` asks `stateDbSources` about: rows not already read-only and not WebUI- or fork-born. */
|
|
543
|
+
export function ownerLockCandidates(rows) {
|
|
544
|
+
const webuiOwned = (r) => ['source_tag', 'raw_source', 'session_source'].some((k) => ['webui', 'fork'].includes(str(r[k]).trim().toLowerCase()));
|
|
545
|
+
return rows.filter((r) => !r.read_only && !webuiOwned(r)).map((r) => str(r.session_id));
|
|
546
|
+
}
|
|
543
547
|
/** Python `_session_is_subagent_view_only` on a row: a delegated child by any source marker. */
|
|
544
548
|
export function isSubagentRow(row) {
|
|
545
549
|
return str(row.source_tag || row.raw_source || row.session_source || row.source).trim().toLowerCase() === 'subagent';
|
|
@@ -711,7 +715,8 @@ export function capRecentCliSessions(rows, cap = CLI_VISIBLE_SESSION_CAP) {
|
|
|
711
715
|
return true; seen += 1; return seen <= cap; });
|
|
712
716
|
}
|
|
713
717
|
function sessionHasServerVisibleMessages(row) {
|
|
714
|
-
|
|
718
|
+
// A worktree chat owns a directory on disk from creation; its row is where the user removes it (TAL-605).
|
|
719
|
+
if (sidebarMessageCount(row) > 0 || row.worktree_path)
|
|
715
720
|
return true;
|
|
716
721
|
const attention = row.attention;
|
|
717
722
|
if (attention && typeof attention === 'object' && attention.kind && num(attention.count) > 0)
|
|
@@ -744,9 +749,12 @@ function hiddenArchivedReferences(visible, archived) {
|
|
|
744
749
|
}
|
|
745
750
|
return references;
|
|
746
751
|
}
|
|
747
|
-
/** Python `_build_session_list_cache_payload`;
|
|
752
|
+
/** Python `_build_session_list_cache_payload`; of its orphaned-sidecar prunes only the imported one (#3238) applies. */
|
|
748
753
|
export function buildSessionListPayload(store, params) {
|
|
749
|
-
let webuiSessions = allSessions(store, { sidebarMetadataOnly: true }).map((r) => ({ ...r, is_cli_session: isCliSessionRow(r) }));
|
|
754
|
+
let webuiSessions = (params.webuiRows ?? allSessions(store, { sidebarMetadataOnly: true })).map((r) => ({ ...r, is_cli_session: isCliSessionRow(r) }));
|
|
755
|
+
const orphans = params.pruneOrphanedImports?.(webuiSessions);
|
|
756
|
+
if (orphans?.size)
|
|
757
|
+
webuiSessions = webuiSessions.filter((r) => !orphans.has(str(r.session_id)));
|
|
750
758
|
// Before the state.db overlay below replaces the sidecar's own source fields, which the WebUI-born exception reads.
|
|
751
759
|
if (params.stateDbSources)
|
|
752
760
|
webuiSessions = withOwnerLocks(webuiSessions, params.stateDbSources);
|