@maudecode/talaria-web 1.11.0 → 1.12.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/chat-router.d.ts +68 -4
- package/dist/api/chat-router.js +11 -8
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/router.d.ts +10 -0
- package/dist/api/router.js +2 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/sessions-router.d.ts +407 -51
- package/dist/api/sessions-router.js +2 -2
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/sse-routes.js +52 -8
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-router.d.ts +329 -0
- package/dist/api/tools-router.js +97 -4
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.d.ts +812 -55
- package/dist/auth/oidc.js +2 -0
- package/dist/auth/oidc.js.map +1 -1
- package/dist/auth/store.d.ts +17 -0
- package/dist/auth/store.js +77 -19
- package/dist/auth/store.js.map +1 -1
- package/dist/fs/atomic.d.ts +8 -1
- package/dist/fs/atomic.js +52 -3
- package/dist/fs/atomic.js.map +1 -1
- package/dist/http/context.d.ts +2 -0
- package/dist/http/context.js.map +1 -1
- package/dist/redact.d.ts +15 -0
- package/dist/redact.js +1393 -9
- package/dist/redact.js.map +1 -1
- package/dist/release.js +3 -1
- package/dist/release.js.map +1 -1
- package/dist/runtime.js +20 -9
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +11 -5
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +2 -0
- package/dist/sessions/anchor.js +22 -17
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/file-changes.d.ts +15 -0
- package/dist/sessions/file-changes.js +58 -0
- package/dist/sessions/file-changes.js.map +1 -0
- package/dist/sessions/journal.d.ts +6 -1
- package/dist/sessions/journal.js +9 -15
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +21 -1
- package/dist/sessions/list.js +81 -17
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +66 -2
- package/dist/sessions/merge.js +291 -9
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/pending.d.ts +11 -2
- package/dist/sessions/pending.js +52 -3
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/service.d.ts +16 -3
- package/dist/sessions/service.js +92 -54
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/state-db.d.ts +5 -0
- package/dist/sessions/state-db.js +34 -0
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/streams.d.ts +4 -1
- package/dist/sessions/streams.js +3 -0
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +21 -0
- package/dist/sessions/tool-display.js +113 -0
- package/dist/sessions/tool-display.js.map +1 -0
- package/dist/sessions/turn.d.ts +25 -7
- package/dist/sessions/turn.js +153 -90
- package/dist/sessions/turn.js.map +1 -1
- package/dist/spa.d.ts +2 -0
- package/dist/spa.js +9 -0
- package/dist/spa.js.map +1 -1
- package/dist/test/harness.d.ts +2 -0
- package/dist/test/harness.js +1 -1
- package/dist/test/harness.js.map +1 -1
- package/dist/tools/terminal.d.ts +6 -0
- package/dist/tools/terminal.js +24 -3
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +120 -0
- package/dist/tools/update-notifications.js +387 -0
- package/dist/tools/update-notifications.js.map +1 -0
- package/dist/tools/updates.d.ts +49 -3
- package/dist/tools/updates.js +319 -53
- package/dist/tools/updates.js.map +1 -1
- package/package.json +2 -2
- package/sidecar/scripts/replay_sidecar.py +17 -0
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/home.py +39 -16
- package/sidecar/talaria_sidecar/methods/chat.py +113 -4
- package/static/dist/FILES.txt +115 -116
- package/static/dist/assets/AppShell-m4w420jl.js +1 -0
- package/static/dist/assets/ChatPage-cuqcnisv.js +20 -0
- package/static/dist/assets/HubRoute-hqgqtm35.js +2 -0
- package/static/dist/assets/{Markdown-ftyfzds0.js → Markdown-j2hlu30v.js} +7 -7
- package/static/dist/assets/RightPanel-oid5q557.js +1 -0
- package/static/dist/assets/Select-ot2zr0il.js +1 -0
- package/static/dist/assets/SessionListPanel-o3sgjnrq.js +1 -0
- package/static/dist/assets/{SettingsLayout-pdpmhy1o.js → SettingsLayout-b0idn649.js} +1 -1
- package/static/dist/assets/States-htz1oee5.js +1 -0
- package/static/dist/assets/Toaster-h49pk1hy.js +1 -0
- package/static/dist/assets/_app-h7eaezs7.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-h8oaqzsj.js +1 -0
- package/static/dist/assets/_app.index-xinao3xh.js +1 -0
- package/static/dist/assets/_app.insights-cxplvhkm.js +1 -0
- package/static/dist/assets/_app.kanban-hhli8h0h.js +1 -0
- package/static/dist/assets/_app.logs-f6srwjfl.js +1 -0
- package/static/dist/assets/_app.memory-lntcea85.js +1 -0
- package/static/dist/assets/_app.profiles-lftyp6of.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-n1ggcf5e.js → _app.session._sessionId-hhpcqih4.js} +1 -1
- package/static/dist/assets/_app.settings-rs93zpvw.js +1 -0
- package/static/dist/assets/_app.settings._section-nafqsbwm.js +1 -0
- package/static/dist/assets/_app.skills-jzoi1ivd.js +1 -0
- package/static/dist/assets/_app.tasks-ijphsw56.js +2 -0
- package/static/dist/assets/_app.todos-emyh8inv.js +1 -0
- package/static/dist/assets/_app.workspaces-fwr1cum8.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-i4bgzu83.js → abnfDiagram-VCTEODGH-egykbz8h.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-l6y92mbn.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-mx21lwqa.js → architectureDiagram-5GKGNRK7-b2e0wk3y.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-o1hhchxv.js → blockDiagram-I7D4REHJ-i3cq67dn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-jygqtvd8.js → c4Diagram-7LVT6UL2-lg1p1s7a.js} +1 -1
- package/static/dist/assets/channel-gq8cwu71.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-hjcpubgk.js → chunk-4HAMMTFA-i0s1s7zi.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-eibnex6m.js → chunk-75Z2AOVW-kwinpapo.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-k1tp3qnp.js → chunk-DU6HZSFF-hb8qrbc3.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-lvcgn16f.js → chunk-F27PBJKO-dy2tqtcs.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-ldlzruv1.js → chunk-GMAD6QVW-fqox5yvt.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-hs1mva9d.js → chunk-GVQU2GXP-bo3x6ze4.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-o7eqx3yb.js → chunk-IMKFNOWR-nxs6rrcq.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-bp1ofl70.js → chunk-L3NEJ4N5-f9yeq1fi.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-o8m6mdz5.js → chunk-OSK3NFVY-c7df44qv.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-kx83fti2.js → chunk-P2QGCYS3-eyjzf5o5.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-mwl99e9y.js → chunk-POPQ4Y6H-iy3hp9rc.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-oriuokxy.js → chunk-PWAF6VOD-co2yoefz.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-ab5cf00v.js → chunk-SHT3W25Y-obzqmn9k.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-kqdrpr17.js → chunk-SVP7TREG-hqwdo6vt.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-kfbnjabk.js → chunk-TICWLB2K-l8t1mdfd.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fg9sc5r8.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fg9sc5r8.js +1 -0
- package/static/dist/assets/{copied-dp33szhq.js → copied-hurn8vn4.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-mm5sj9s7.js → cynefin-OW5HDTMX-ngx2ihay.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-nfon5q38.js → cynefinDiagram-5FMLGOSQ-fiyooys3.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-dzdp9ypb.js → dagre-GXQ25YYZ-fctryel6.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-ckxzqo01.js → diagram-S7CK7UJ4-m27jopok.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-hw16h1um.js → diagram-UQ7AKVKN-ojgkbmp4.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-mu7wu2zg.js → diagram-VSXAHHWV-gfafpgyj.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-k9uprwtj.js → diagram-VX7I27RA-daobicg4.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-csdjzrg9.js → diagram-Z3DM3KII-mi475zvk.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-n8mbw2jj.js → ebnfDiagram-PWID7BFC-daf4zvsy.js} +1 -1
- package/static/dist/assets/endpoints-cyjhnrbn.js +64 -0
- package/static/dist/assets/{erDiagram-RLTQ6QDP-fsfe1uj0.js → erDiagram-RLTQ6QDP-gxfhxvfp.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-manga0bq.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-bpt13uny.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-gsba3iq9.js → ganttDiagram-EL5Y4UJY-k3208e0p.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-na86q1pu.js → gitGraph-4MIJSDKK-gjuhj4zk.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-g72ew3xz.js → gitGraphDiagram-WWUBYQGX-jglxvux1.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-okn18cp1.js → highlighted-body-KPVGNVTW-gh24xc9c.js} +1 -1
- package/static/dist/assets/index-gsg78cb4.css +2 -0
- package/static/dist/assets/index-jb47los5.js +11 -0
- package/static/dist/assets/{info-A6RAGUB7-i01jeltk.js → info-A6RAGUB7-huf0xaoq.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-cayiv6fa.js → infoDiagram-27XIBGKW-jk3n96ix.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-g4rf14bv.js → ishikawaDiagram-5VMMS53U-o95uo5dx.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-fusb2424.js → journeyDiagram-3NMN7TZE-h5ye2l70.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-g831pwlr.js → kanban-definition-UXKFOSKX-lgrpk5yi.js} +1 -1
- package/static/dist/assets/{lazyRouteComponent-ol965zwk.js → lazyRouteComponent-owywngyt.js} +1 -1
- package/static/dist/assets/{line-md6em6gc.js → line-cihmc0pn.js} +1 -1
- package/static/dist/assets/{login-kfclsqd2.js → login-g063apx6.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-okd1mnvj.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-mq3uns9m.js → mermaid-parser.core-d1609aga.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-oxafrned.js → mindmap-definition-YA3MSWOX-lbvtir31.js} +1 -1
- package/static/dist/assets/{onboarding-fo6hnkyv.js → onboarding-ngw0x0pr.js} +1 -1
- package/static/dist/assets/{packet-AYTQ26CC-ggxyvbym.js → packet-AYTQ26CC-o4cp5z3k.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-nk7xcqgp.js → pegDiagram-XKGWAZYB-e8xqu1qj.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-ito2razh.js → pie-WAS4IAKB-hm9icuov.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-g02xexar.js → pieDiagram-E7YTZNPT-hj96x7hn.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-d4jn4xq5.js → quadrantDiagram-AXDQQJYC-80utbxhm.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-nebvfdzt.js → radar-RG4KPBEZ-k39b6100.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-ny3gebse.js → railroad-74A4TZTK-ewyqz67j.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-dx2q0evz.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-l8xt49t5.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-kuxha9yz.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-m09mmu67.js → railroadDiagram-O6MQD6OU-iwv9dby8.js} +1 -1
- package/static/dist/assets/{refresh-cw-eitd7yva.js → refresh-cw-hjzomwlo.js} +1 -1
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-evggpcbk.js → requirementDiagram-BXWQKSXE-cdgh5jha.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-bun89039.js → sankeyDiagram-P5KCCOFB-dbu6p97m.js} +1 -1
- package/static/dist/assets/{saved-culx14ii.js → saved-feqhycco.js} +1 -1
- package/static/dist/assets/{search-nu6kzq55.js → search-n3jdc20p.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-hhs9f09o.js → sequenceDiagram-WJ2MYXX4-b0wchifg.js} +1 -1
- package/static/dist/assets/{settings_section_extensions_title-mj0gcozh.js → settings_section_extensions_title-mtyviexd.js} +1 -1
- package/static/dist/assets/{share._token-k4pcnxqu.js → share._token-cwov8uqh.js} +2 -2
- package/static/dist/assets/{sliders-horizontal-b9ljga1o.js → sliders-horizontal-i1lseyg0.js} +1 -1
- package/static/dist/assets/{stateDiagram-D77RDMKH-gi7t1tro.js → stateDiagram-D77RDMKH-mb4b38xh.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-cn1fnqrg.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-ea5urvph.js → swimlanes-42K2YHIH-ofrpfwj0.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d652ummv.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-mq64rm3b.js → timeline-definition-24CTP7MA-hlw0jg6o.js} +1 -1
- package/static/dist/assets/todoStore-mfy9lpio.js +1 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-cimbtxlz.js → treeView-Q6P3EWNA-d93wr19c.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-wig5gi1y.js → treemap-WGGIJYW6-g7ezdedz.js} +1 -1
- package/static/dist/assets/{untitled-mbwemvxf.js → untitled-mqxhd1eh.js} +1 -1
- package/static/dist/assets/{useForm-li4bljlv.js → useForm-hh33yrwa.js} +1 -1
- package/static/dist/assets/useLocale-cr30vl7r.js +1 -0
- package/static/dist/assets/{vennDiagram-4TSXK5OY-ez63kh7n.js → vennDiagram-4TSXK5OY-m5vgeba5.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-r7rftz31.js → wardley-WFR3VGLG-gpao9bxv.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-mvqg9eqc.js → wardleyDiagram-VM6X3IG4-g2yzwshm.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-eqxdfc91.js → xychartDiagram-S5SC5T6Z-itakhpic.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +114 -152
- package/static/dist/assets/AppShell-hikzkcql.js +0 -1
- package/static/dist/assets/ChatPage-ofqn89h9.js +0 -21
- package/static/dist/assets/HubRoute-f2zrs9si.js +0 -2
- package/static/dist/assets/RightPanel-febk3dkd.js +0 -1
- package/static/dist/assets/Select-lvx8gihl.js +0 -1
- package/static/dist/assets/SessionListPanel-o70ljmik.js +0 -1
- package/static/dist/assets/States-i46tz8an.js +0 -1
- package/static/dist/assets/Toaster-fklyeeyh.js +0 -1
- package/static/dist/assets/_app-j3rors25.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-c0ey5ec9.js +0 -1
- package/static/dist/assets/_app.index-coy9jrto.js +0 -1
- package/static/dist/assets/_app.insights-ebd2k0i5.js +0 -1
- package/static/dist/assets/_app.kanban-e2p7ypi5.js +0 -1
- package/static/dist/assets/_app.logs-ml21mfyz.js +0 -1
- package/static/dist/assets/_app.memory-lhu5mm47.js +0 -1
- package/static/dist/assets/_app.profiles-egx0fgjo.js +0 -1
- package/static/dist/assets/_app.settings-d0vqtyid.js +0 -1
- package/static/dist/assets/_app.settings._section-cnzj6pli.js +0 -1
- package/static/dist/assets/_app.skills-kkug8obu.js +0 -1
- package/static/dist/assets/_app.tasks-nf285d2o.js +0 -2
- package/static/dist/assets/_app.todos-dxalqp1e.js +0 -1
- package/static/dist/assets/_app.workspaces-bqtduujs.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-o8zqevhv.js +0 -1
- package/static/dist/assets/channel-mw8l793e.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-egajr1wp.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-egajr1wp.js +0 -1
- package/static/dist/assets/endpoints-f6ngsyu5.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-k3zhqcyl.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-bdxes51f.js +0 -1
- package/static/dist/assets/index-ab0wj9ik.css +0 -2
- package/static/dist/assets/index-fd27xooo.js +0 -11
- package/static/dist/assets/mermaid-HWGCJPDP-ejk0d88t.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-gtd38edw.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-o238oax2.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-c4acqp2j.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-jtadbol7.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ki7weepw.js +0 -8
- package/static/dist/assets/todoStore-azvfuqbv.js +0 -1
- package/static/dist/assets/trash-osyo895g.js +0 -1
- package/static/dist/assets/useLocale-kdew6auf.js +0 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export type UpdateNotificationTarget = 'webui' | 'agent';
|
|
2
|
+
export type UpdateNotificationPhase = 'applying' | 'awaiting_confirmation' | 'restarting' | 'succeeded' | 'blocked' | 'failed' | 'unknown';
|
|
3
|
+
/** `tab` names one open Talaria Web tab; rows stamped with a tab are visible only to that tab. */
|
|
4
|
+
export interface UpdateNotificationScope {
|
|
5
|
+
owner: string;
|
|
6
|
+
profile: string;
|
|
7
|
+
serverOwner?: boolean;
|
|
8
|
+
tab?: string | null;
|
|
9
|
+
}
|
|
10
|
+
interface StoredUpdateNotification {
|
|
11
|
+
id: string;
|
|
12
|
+
owner: string;
|
|
13
|
+
profile: string;
|
|
14
|
+
visibility: 'server' | 'profile';
|
|
15
|
+
kind: string;
|
|
16
|
+
target: UpdateNotificationTarget | null;
|
|
17
|
+
phase: string;
|
|
18
|
+
severity: 'info' | 'warning' | 'critical';
|
|
19
|
+
persistent: boolean;
|
|
20
|
+
requires_acknowledgement: boolean;
|
|
21
|
+
actions: UpdateNotificationAction[];
|
|
22
|
+
destination: UpdateNotificationDestination | null;
|
|
23
|
+
title: string;
|
|
24
|
+
message: string;
|
|
25
|
+
created_at: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
read_at: string | null;
|
|
28
|
+
acknowledged_at: string | null;
|
|
29
|
+
acknowledged_action_id: string | null;
|
|
30
|
+
verified_revision: string | null;
|
|
31
|
+
verified_version: string | null;
|
|
32
|
+
performed_action_ids: string[];
|
|
33
|
+
dismissed_at: string | null;
|
|
34
|
+
expected_identity: string | null;
|
|
35
|
+
tab_id: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface UpdateNotificationAction {
|
|
38
|
+
id: string;
|
|
39
|
+
label: string;
|
|
40
|
+
style: 'default' | 'primary' | 'destructive';
|
|
41
|
+
acknowledges: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface UpdateNotificationDestination {
|
|
44
|
+
key: string;
|
|
45
|
+
label: string;
|
|
46
|
+
}
|
|
47
|
+
export interface VerifiedUpdateIdentity {
|
|
48
|
+
revision: string | null;
|
|
49
|
+
version: string | null;
|
|
50
|
+
}
|
|
51
|
+
export type PublicUpdateNotification = Omit<StoredUpdateNotification, 'owner' | 'profile' | 'visibility' | 'dismissed_at' | 'expected_identity' | 'performed_action_ids' | 'tab_id'> & {
|
|
52
|
+
unread: boolean;
|
|
53
|
+
active: boolean;
|
|
54
|
+
requires_interaction: boolean;
|
|
55
|
+
can_dismiss: boolean;
|
|
56
|
+
};
|
|
57
|
+
export interface FrontendBuildState {
|
|
58
|
+
current_build: string | null;
|
|
59
|
+
loaded_build: string | null;
|
|
60
|
+
refresh_required: boolean;
|
|
61
|
+
notification_id: string | null;
|
|
62
|
+
}
|
|
63
|
+
export interface UpdateNotificationList {
|
|
64
|
+
scope_id: string;
|
|
65
|
+
notifications: PublicUpdateNotification[];
|
|
66
|
+
unread_count: number;
|
|
67
|
+
clearable_count: number;
|
|
68
|
+
can_clear: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface CreateUpdateNotificationInput {
|
|
71
|
+
kind: string;
|
|
72
|
+
target?: UpdateNotificationTarget | null;
|
|
73
|
+
phase: string;
|
|
74
|
+
severity?: 'info' | 'warning' | 'critical';
|
|
75
|
+
persistent?: boolean;
|
|
76
|
+
requiresAcknowledgement?: boolean;
|
|
77
|
+
actions?: UpdateNotificationAction[];
|
|
78
|
+
destination?: UpdateNotificationDestination | null;
|
|
79
|
+
title: string;
|
|
80
|
+
message: string;
|
|
81
|
+
visibility?: 'server' | 'profile';
|
|
82
|
+
}
|
|
83
|
+
export declare const FRONTEND_BUILD: RegExp;
|
|
84
|
+
export declare const TAB_ID: RegExp;
|
|
85
|
+
export declare const WEB_REFRESH_KIND = "web_refresh";
|
|
86
|
+
export declare const WEB_REFRESH_ACTION = "reload";
|
|
87
|
+
export declare class UpdateNotificationStore {
|
|
88
|
+
private readonly now;
|
|
89
|
+
private rows;
|
|
90
|
+
private readonly file;
|
|
91
|
+
/** Last check-in per tab refresh notice; kept in memory so polling never rewrites the store. */
|
|
92
|
+
private readonly tabSeen;
|
|
93
|
+
private readonly loadedAt;
|
|
94
|
+
constructor(stateDir: string, now?: () => Date);
|
|
95
|
+
/**
|
|
96
|
+
* Compare the frontend build a tab loaded with the build this server now serves. A mismatch keeps one
|
|
97
|
+
* persistent, tab-scoped refresh notice per tab; a match resolves and removes it. Unknown builds change nothing.
|
|
98
|
+
*/
|
|
99
|
+
syncTabBuild(scope: UpdateNotificationScope, loadedBuild: string | null, currentBuild: string | null): FrontendBuildState;
|
|
100
|
+
begin(scope: UpdateNotificationScope, target: UpdateNotificationTarget): PublicUpdateNotification;
|
|
101
|
+
create(scope: UpdateNotificationScope, input: CreateUpdateNotificationInput): PublicUpdateNotification;
|
|
102
|
+
activeUpdate(scope: UpdateNotificationScope, target: UpdateNotificationTarget): PublicUpdateNotification | null;
|
|
103
|
+
transition(id: string, phase: UpdateNotificationPhase, expectedIdentity?: string | null, verifiedIdentity?: VerifiedUpdateIdentity): PublicUpdateNotification | null;
|
|
104
|
+
list(scope: UpdateNotificationScope): UpdateNotificationList;
|
|
105
|
+
clear(scope: UpdateNotificationScope): UpdateNotificationList;
|
|
106
|
+
read(scope: UpdateNotificationScope, id: string): PublicUpdateNotification | null;
|
|
107
|
+
dismiss(scope: UpdateNotificationScope, id: string): 'dismissed' | 'not_found' | 'acknowledgement_required';
|
|
108
|
+
action(scope: UpdateNotificationScope, id: string, actionId: string): PublicUpdateNotification | null;
|
|
109
|
+
cancelUpdate(scope: UpdateNotificationScope, id: string): PublicUpdateNotification | null;
|
|
110
|
+
reconcileInterruptedUpdates(currentWebIdentity: string | null, currentWebVersion?: string | null): void;
|
|
111
|
+
private visible;
|
|
112
|
+
private isVisible;
|
|
113
|
+
private hasProtectedCapacity;
|
|
114
|
+
private pruneClosedTabs;
|
|
115
|
+
private load;
|
|
116
|
+
/** Tab refresh notices are bounded by `hasProtectedCapacity` and kept apart, so they never evict or block other notifications. */
|
|
117
|
+
private save;
|
|
118
|
+
}
|
|
119
|
+
export declare const updateNotificationScopeId: (scope: UpdateNotificationScope) => string;
|
|
120
|
+
export {};
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
|
+
import { atomicWriteSecretJson } from '../fs/atomic.js';
|
|
5
|
+
const PHASES = new Set(['applying', 'awaiting_confirmation', 'restarting', 'succeeded', 'blocked', 'failed', 'unknown']);
|
|
6
|
+
const REVISION = /^[a-f0-9]{40}$/;
|
|
7
|
+
const PER_SCOPE_LIMIT = 50;
|
|
8
|
+
const GLOBAL_LIMIT = 500;
|
|
9
|
+
export const FRONTEND_BUILD = /^[a-f0-9]{64}$/;
|
|
10
|
+
export const TAB_ID = /^[A-Za-z0-9_-]{8,64}$/;
|
|
11
|
+
export const WEB_REFRESH_KIND = 'web_refresh';
|
|
12
|
+
export const WEB_REFRESH_ACTION = 'reload';
|
|
13
|
+
/** A closed tab stops checking in; its refresh notice is dropped once unseen this long. An open tab recreates it on its next check. */
|
|
14
|
+
const TAB_TTL_MS = 60 * 60 * 1000;
|
|
15
|
+
const copy = (row) => ({
|
|
16
|
+
id: row.id, kind: row.kind, target: row.target, phase: row.phase, severity: row.severity,
|
|
17
|
+
persistent: row.persistent, requires_acknowledgement: row.requires_acknowledgement, actions: row.actions,
|
|
18
|
+
destination: row.destination,
|
|
19
|
+
title: row.title, message: row.message, created_at: row.created_at, updated_at: row.updated_at, read_at: row.read_at,
|
|
20
|
+
acknowledged_at: row.acknowledged_at, acknowledged_action_id: row.acknowledged_action_id,
|
|
21
|
+
verified_revision: row.verified_revision, verified_version: row.verified_version,
|
|
22
|
+
unread: row.read_at === null,
|
|
23
|
+
active: row.kind === 'update' && ['applying', 'restarting'].includes(row.phase),
|
|
24
|
+
requires_interaction: row.requires_acknowledgement && row.acknowledged_at === null,
|
|
25
|
+
can_dismiss: isDismissible(row),
|
|
26
|
+
});
|
|
27
|
+
const wording = (target, phase) => {
|
|
28
|
+
const name = target === 'webui' ? 'Talaria Web' : 'Hermes Agent';
|
|
29
|
+
const messages = {
|
|
30
|
+
applying: `Installing the selected ${name} update.`,
|
|
31
|
+
awaiting_confirmation: 'This Hermes Agent revision needs confirmation before it can be installed.',
|
|
32
|
+
restarting: target === 'webui' ? 'The update is installed. Talaria Web is restarting.' : 'The update is installed. Hermes Agent is restarting.',
|
|
33
|
+
succeeded: `${name} was updated successfully.`,
|
|
34
|
+
blocked: 'The update is waiting for active work to finish.',
|
|
35
|
+
failed: 'The update could not be completed. Open System settings for details.',
|
|
36
|
+
unknown: 'The connection closed before completion could be verified. Check the installed version before trying again.',
|
|
37
|
+
};
|
|
38
|
+
return { title: `${name} update`, message: messages[phase] };
|
|
39
|
+
};
|
|
40
|
+
export class UpdateNotificationStore {
|
|
41
|
+
now;
|
|
42
|
+
rows;
|
|
43
|
+
file;
|
|
44
|
+
/** Last check-in per tab refresh notice; kept in memory so polling never rewrites the store. */
|
|
45
|
+
tabSeen = new Map();
|
|
46
|
+
loadedAt;
|
|
47
|
+
constructor(stateDir, now = () => new Date()) {
|
|
48
|
+
this.now = now;
|
|
49
|
+
this.file = resolve(stateDir, 'update-notifications.json');
|
|
50
|
+
this.rows = this.load();
|
|
51
|
+
this.loadedAt = this.now().valueOf();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Compare the frontend build a tab loaded with the build this server now serves. A mismatch keeps one
|
|
55
|
+
* persistent, tab-scoped refresh notice per tab; a match resolves and removes it. Unknown builds change nothing.
|
|
56
|
+
*/
|
|
57
|
+
syncTabBuild(scope, loadedBuild, currentBuild) {
|
|
58
|
+
this.pruneClosedTabs();
|
|
59
|
+
const tab = scope.tab && TAB_ID.test(scope.tab) ? scope.tab : null;
|
|
60
|
+
const loaded = loadedBuild && FRONTEND_BUILD.test(loadedBuild) ? loadedBuild : null;
|
|
61
|
+
const current = currentBuild && FRONTEND_BUILD.test(currentBuild) ? currentBuild : null;
|
|
62
|
+
const state = { current_build: current, loaded_build: loaded, refresh_required: false, notification_id: null };
|
|
63
|
+
if (!tab || !loaded || !current)
|
|
64
|
+
return state;
|
|
65
|
+
const existing = this.rows.find((row) => row.kind === WEB_REFRESH_KIND && row.tab_id === tab && row.owner === scope.owner && row.profile === scope.profile);
|
|
66
|
+
if (loaded === current) {
|
|
67
|
+
if (existing) {
|
|
68
|
+
this.rows = this.rows.filter((row) => row !== existing);
|
|
69
|
+
this.tabSeen.delete(existing.id);
|
|
70
|
+
this.save();
|
|
71
|
+
}
|
|
72
|
+
return state;
|
|
73
|
+
}
|
|
74
|
+
state.refresh_required = true;
|
|
75
|
+
const stamp = this.now().toISOString();
|
|
76
|
+
if (existing) {
|
|
77
|
+
this.tabSeen.set(existing.id, this.now().valueOf());
|
|
78
|
+
if (existing.expected_identity !== current) {
|
|
79
|
+
existing.expected_identity = current;
|
|
80
|
+
existing.updated_at = stamp;
|
|
81
|
+
existing.read_at = null;
|
|
82
|
+
this.save();
|
|
83
|
+
}
|
|
84
|
+
state.notification_id = existing.id;
|
|
85
|
+
return state;
|
|
86
|
+
}
|
|
87
|
+
const row = {
|
|
88
|
+
id: randomUUID(), owner: scope.owner.slice(0, 256), profile: scope.profile.slice(0, 64), visibility: 'profile',
|
|
89
|
+
kind: WEB_REFRESH_KIND, target: 'webui', phase: 'refresh_required', severity: 'warning',
|
|
90
|
+
persistent: true, requires_acknowledgement: true,
|
|
91
|
+
actions: [{ id: WEB_REFRESH_ACTION, label: 'Refresh now', style: 'primary', acknowledges: false }],
|
|
92
|
+
destination: null, title: 'Talaria Web was updated', message: 'Refresh this tab to load the new version.',
|
|
93
|
+
created_at: stamp, updated_at: stamp, read_at: null, acknowledged_at: null,
|
|
94
|
+
acknowledged_action_id: null, verified_revision: null, verified_version: null,
|
|
95
|
+
performed_action_ids: [], dismissed_at: null, expected_identity: current, tab_id: tab,
|
|
96
|
+
};
|
|
97
|
+
if (!this.hasProtectedCapacity(row))
|
|
98
|
+
return state;
|
|
99
|
+
this.rows.push(row);
|
|
100
|
+
this.tabSeen.set(row.id, this.now().valueOf());
|
|
101
|
+
this.save();
|
|
102
|
+
state.notification_id = row.id;
|
|
103
|
+
return state;
|
|
104
|
+
}
|
|
105
|
+
begin(scope, target) {
|
|
106
|
+
const text = wording(target, 'applying');
|
|
107
|
+
return this.create(scope, {
|
|
108
|
+
kind: 'update', target, phase: 'applying', ...text,
|
|
109
|
+
destination: { key: 'settings.system', label: 'Open System settings' },
|
|
110
|
+
visibility: 'server',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
create(scope, input) {
|
|
114
|
+
const kind = safeToken(input.kind, '');
|
|
115
|
+
const phase = safeToken(input.phase, '');
|
|
116
|
+
const title = safeText(input.title, '', 160);
|
|
117
|
+
const message = safeText(input.message, '', 500);
|
|
118
|
+
const actions = safeActions(input.actions);
|
|
119
|
+
if (!kind || !phase || !title || !message)
|
|
120
|
+
throw new Error('Invalid update notification');
|
|
121
|
+
if (input.requiresAcknowledgement && !actions.some((action) => action.acknowledges))
|
|
122
|
+
throw new Error('Required acknowledgement needs an acknowledging action');
|
|
123
|
+
const stamp = this.now().toISOString();
|
|
124
|
+
const row = {
|
|
125
|
+
id: randomUUID(), owner: scope.owner.slice(0, 256), profile: scope.profile.slice(0, 64), visibility: input.visibility ?? 'profile',
|
|
126
|
+
kind, target: input.target ?? null, phase, severity: input.severity ?? 'info',
|
|
127
|
+
persistent: input.requiresAcknowledgement === true || input.persistent === true,
|
|
128
|
+
requires_acknowledgement: input.requiresAcknowledgement === true, actions,
|
|
129
|
+
destination: safeDestination(input.destination), title, message,
|
|
130
|
+
created_at: stamp, updated_at: stamp, read_at: null, acknowledged_at: null,
|
|
131
|
+
acknowledged_action_id: null, verified_revision: null, verified_version: null,
|
|
132
|
+
performed_action_ids: [], dismissed_at: null, expected_identity: null, tab_id: null,
|
|
133
|
+
};
|
|
134
|
+
if (!this.hasProtectedCapacity(row))
|
|
135
|
+
throw new Error('Update notification protected capacity reached');
|
|
136
|
+
this.rows.push(row);
|
|
137
|
+
this.save();
|
|
138
|
+
return copy(row);
|
|
139
|
+
}
|
|
140
|
+
activeUpdate(scope, target) {
|
|
141
|
+
const row = [...this.rows].reverse().find((entry) => this.isVisible(entry, scope) && entry.kind === 'update' && entry.target === target && ['applying', 'awaiting_confirmation', 'restarting'].includes(entry.phase));
|
|
142
|
+
return row ? copy(row) : null;
|
|
143
|
+
}
|
|
144
|
+
transition(id, phase, expectedIdentity, verifiedIdentity) {
|
|
145
|
+
const row = this.rows.find((entry) => entry.id === id);
|
|
146
|
+
if (!row)
|
|
147
|
+
return null;
|
|
148
|
+
const phaseChanged = row.phase !== phase;
|
|
149
|
+
row.phase = phase;
|
|
150
|
+
if (row.target)
|
|
151
|
+
Object.assign(row, wording(row.target, phase));
|
|
152
|
+
row.updated_at = this.now().toISOString();
|
|
153
|
+
if (phaseChanged)
|
|
154
|
+
row.read_at = null;
|
|
155
|
+
row.expected_identity = expectedIdentity?.trim().slice(0, 160) || null;
|
|
156
|
+
if (verifiedIdentity) {
|
|
157
|
+
row.verified_revision = typeof verifiedIdentity.revision === 'string' && REVISION.test(verifiedIdentity.revision) ? verifiedIdentity.revision : null;
|
|
158
|
+
row.verified_version = safeText(verifiedIdentity.version, '', 80) || null;
|
|
159
|
+
}
|
|
160
|
+
this.save();
|
|
161
|
+
return copy(row);
|
|
162
|
+
}
|
|
163
|
+
list(scope) {
|
|
164
|
+
this.pruneClosedTabs();
|
|
165
|
+
const scoped = this.rows.filter((row) => this.isVisible(row, scope) && row.dismissed_at === null);
|
|
166
|
+
const ordered = scoped.sort((a, b) => b.updated_at.localeCompare(a.updated_at));
|
|
167
|
+
const protectedRows = ordered.filter(isProtected);
|
|
168
|
+
const visible = [...protectedRows, ...ordered.filter((row) => !isProtected(row)).slice(0, Math.max(0, PER_SCOPE_LIMIT - protectedRows.length))]
|
|
169
|
+
.sort((a, b) => b.updated_at.localeCompare(a.updated_at));
|
|
170
|
+
const notifications = visible.map(copy);
|
|
171
|
+
const clearableCount = scoped.filter(isDismissible).length;
|
|
172
|
+
return { scope_id: updateNotificationScopeId(scope), notifications, unread_count: visible.filter((row) => row.read_at === null).length, clearable_count: clearableCount, can_clear: clearableCount > 0 };
|
|
173
|
+
}
|
|
174
|
+
clear(scope) {
|
|
175
|
+
const stamp = this.now().toISOString();
|
|
176
|
+
let changed = false;
|
|
177
|
+
for (const row of this.rows) {
|
|
178
|
+
if (!this.isVisible(row, scope) || row.dismissed_at !== null || !isDismissible(row))
|
|
179
|
+
continue;
|
|
180
|
+
row.dismissed_at = stamp;
|
|
181
|
+
changed = true;
|
|
182
|
+
}
|
|
183
|
+
if (changed)
|
|
184
|
+
this.save();
|
|
185
|
+
return this.list(scope);
|
|
186
|
+
}
|
|
187
|
+
read(scope, id) {
|
|
188
|
+
const row = this.visible(scope, id);
|
|
189
|
+
if (!row)
|
|
190
|
+
return null;
|
|
191
|
+
if (row.read_at === null) {
|
|
192
|
+
row.read_at = this.now().toISOString();
|
|
193
|
+
this.save();
|
|
194
|
+
}
|
|
195
|
+
return copy(row);
|
|
196
|
+
}
|
|
197
|
+
dismiss(scope, id) {
|
|
198
|
+
const row = this.rows.find((entry) => entry.id === id && this.isVisible(entry, scope));
|
|
199
|
+
if (!row)
|
|
200
|
+
return 'not_found';
|
|
201
|
+
if (row.requires_acknowledgement && row.acknowledged_at === null)
|
|
202
|
+
return 'acknowledgement_required';
|
|
203
|
+
if (row.dismissed_at === null) {
|
|
204
|
+
const stamp = this.now().toISOString();
|
|
205
|
+
row.dismissed_at = stamp;
|
|
206
|
+
row.read_at ??= stamp;
|
|
207
|
+
this.save();
|
|
208
|
+
}
|
|
209
|
+
return 'dismissed';
|
|
210
|
+
}
|
|
211
|
+
action(scope, id, actionId) {
|
|
212
|
+
const row = this.visible(scope, id);
|
|
213
|
+
const action = row?.actions.find((candidate) => candidate.id === actionId);
|
|
214
|
+
if (!row || !action)
|
|
215
|
+
return null;
|
|
216
|
+
if (row.performed_action_ids.includes(action.id))
|
|
217
|
+
return copy(row);
|
|
218
|
+
const stamp = this.now().toISOString();
|
|
219
|
+
row.updated_at = stamp;
|
|
220
|
+
row.read_at ??= stamp;
|
|
221
|
+
row.performed_action_ids.push(action.id);
|
|
222
|
+
if (action.acknowledges) {
|
|
223
|
+
row.acknowledged_at = stamp;
|
|
224
|
+
row.acknowledged_action_id = action.id;
|
|
225
|
+
}
|
|
226
|
+
this.save();
|
|
227
|
+
return copy(row);
|
|
228
|
+
}
|
|
229
|
+
cancelUpdate(scope, id) {
|
|
230
|
+
const row = this.rows.find((entry) => entry.id === id && this.isVisible(entry, scope) && entry.kind === 'update');
|
|
231
|
+
if (!row)
|
|
232
|
+
return null;
|
|
233
|
+
if (row.phase === 'blocked' && row.message === 'The update was cancelled before installation.')
|
|
234
|
+
return copy(row);
|
|
235
|
+
if (row.phase !== 'awaiting_confirmation')
|
|
236
|
+
return null;
|
|
237
|
+
const stamp = this.now().toISOString();
|
|
238
|
+
row.phase = 'blocked';
|
|
239
|
+
row.message = 'The update was cancelled before installation.';
|
|
240
|
+
row.updated_at = stamp;
|
|
241
|
+
row.read_at ??= stamp;
|
|
242
|
+
this.save();
|
|
243
|
+
return copy(row);
|
|
244
|
+
}
|
|
245
|
+
reconcileInterruptedUpdates(currentWebIdentity, currentWebVersion = null) {
|
|
246
|
+
let changed = false;
|
|
247
|
+
for (const row of this.rows) {
|
|
248
|
+
if (row.kind !== 'update' || (row.target !== 'webui' && row.target !== 'agent') || !['applying', 'restarting'].includes(row.phase))
|
|
249
|
+
continue;
|
|
250
|
+
const phase = row.target === 'webui' && row.phase === 'restarting' && currentWebIdentity && REVISION.test(currentWebIdentity) && row.expected_identity === currentWebIdentity ? 'succeeded' : 'unknown';
|
|
251
|
+
row.phase = phase;
|
|
252
|
+
Object.assign(row, wording(row.target, phase));
|
|
253
|
+
row.updated_at = this.now().toISOString();
|
|
254
|
+
row.read_at = null;
|
|
255
|
+
if (phase === 'succeeded') {
|
|
256
|
+
row.verified_revision = currentWebIdentity;
|
|
257
|
+
row.verified_version = safeText(currentWebVersion, '', 80) || null;
|
|
258
|
+
}
|
|
259
|
+
changed = true;
|
|
260
|
+
}
|
|
261
|
+
if (changed)
|
|
262
|
+
this.save();
|
|
263
|
+
}
|
|
264
|
+
visible(scope, id) {
|
|
265
|
+
return this.rows.find((row) => row.id === id && this.isVisible(row, scope) && row.dismissed_at === null) ?? null;
|
|
266
|
+
}
|
|
267
|
+
isVisible(row, scope) {
|
|
268
|
+
if (row.tab_id !== null)
|
|
269
|
+
return row.tab_id === scope.tab && row.owner === scope.owner && row.profile === scope.profile;
|
|
270
|
+
if (row.visibility === 'server')
|
|
271
|
+
return scope.serverOwner === true && (row.owner === scope.owner || row.owner === '*');
|
|
272
|
+
return row.owner === scope.owner && row.profile === scope.profile;
|
|
273
|
+
}
|
|
274
|
+
hasProtectedCapacity(row) {
|
|
275
|
+
const peers = this.rows.filter((entry) => isProtected(entry) && isTabNotice(entry) === isTabNotice(row));
|
|
276
|
+
return peers.filter((entry) => retentionBucket(entry) === retentionBucket(row)).length < PER_SCOPE_LIMIT && peers.length < GLOBAL_LIMIT;
|
|
277
|
+
}
|
|
278
|
+
pruneClosedTabs() {
|
|
279
|
+
const cutoff = this.now().valueOf() - TAB_TTL_MS;
|
|
280
|
+
const closed = this.rows.filter((row) => row.tab_id !== null && (this.tabSeen.get(row.id) ?? this.loadedAt) < cutoff);
|
|
281
|
+
if (closed.length === 0)
|
|
282
|
+
return;
|
|
283
|
+
for (const row of closed)
|
|
284
|
+
this.tabSeen.delete(row.id);
|
|
285
|
+
this.rows = this.rows.filter((row) => !closed.includes(row));
|
|
286
|
+
this.save();
|
|
287
|
+
}
|
|
288
|
+
load() {
|
|
289
|
+
if (!existsSync(this.file))
|
|
290
|
+
return [];
|
|
291
|
+
try {
|
|
292
|
+
const parsed = JSON.parse(readFileSync(this.file, 'utf8'));
|
|
293
|
+
if (!Array.isArray(parsed))
|
|
294
|
+
return [];
|
|
295
|
+
return parsed.flatMap((value) => {
|
|
296
|
+
if (!isRecord(value))
|
|
297
|
+
return [];
|
|
298
|
+
const row = value;
|
|
299
|
+
if (typeof row.id !== 'string' || typeof row.owner !== 'string' || typeof row.profile !== 'string'
|
|
300
|
+
|| (row.target != null && row.target !== 'webui' && row.target !== 'agent') || typeof row.phase !== 'string'
|
|
301
|
+
|| typeof row.created_at !== 'string' || typeof row.updated_at !== 'string'
|
|
302
|
+
|| (row.tab_id != null && !(typeof row.tab_id === 'string' && TAB_ID.test(row.tab_id))))
|
|
303
|
+
return [];
|
|
304
|
+
const kind = safeToken(row.kind, 'update');
|
|
305
|
+
const target = row.target === 'webui' || row.target === 'agent' ? row.target : null;
|
|
306
|
+
const phase = safeToken(row.phase, 'unknown');
|
|
307
|
+
const fallback = target && PHASES.has(phase) ? wording(target, phase) : { title: 'Server notification', message: 'This server needs your attention.' };
|
|
308
|
+
return [{
|
|
309
|
+
id: row.id, owner: row.owner.slice(0, 256), profile: row.profile.slice(0, 64), visibility: row.visibility === 'profile' ? 'profile' : 'server', kind, target, phase,
|
|
310
|
+
severity: row.severity === 'critical' || row.severity === 'warning' ? row.severity : 'info',
|
|
311
|
+
persistent: row.persistent === true,
|
|
312
|
+
requires_acknowledgement: row.requires_acknowledgement === true,
|
|
313
|
+
actions: safeActions(row.actions),
|
|
314
|
+
destination: safeDestination(row.destination),
|
|
315
|
+
title: safeText(row.title, fallback.title, 160), message: safeText(row.message, fallback.message, 500),
|
|
316
|
+
created_at: row.created_at, updated_at: row.updated_at,
|
|
317
|
+
read_at: typeof row.read_at === 'string' ? row.read_at : null,
|
|
318
|
+
acknowledged_at: typeof row.acknowledged_at === 'string' ? row.acknowledged_at : null,
|
|
319
|
+
acknowledged_action_id: typeof row.acknowledged_action_id === 'string' ? row.acknowledged_action_id.slice(0, 64) : null,
|
|
320
|
+
verified_revision: typeof row.verified_revision === 'string' && REVISION.test(row.verified_revision) ? row.verified_revision : null,
|
|
321
|
+
verified_version: safeText(row.verified_version, '', 80) || null,
|
|
322
|
+
performed_action_ids: Array.isArray(row.performed_action_ids) ? row.performed_action_ids.map((id) => safeToken(id, '')).filter(Boolean).slice(0, 16) : [],
|
|
323
|
+
dismissed_at: typeof row.dismissed_at === 'string' ? row.dismissed_at : null,
|
|
324
|
+
expected_identity: typeof row.expected_identity === 'string' ? row.expected_identity.slice(0, 160) : null,
|
|
325
|
+
tab_id: typeof row.tab_id === 'string' ? row.tab_id : null,
|
|
326
|
+
}];
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/** Tab refresh notices are bounded by `hasProtectedCapacity` and kept apart, so they never evict or block other notifications. */
|
|
334
|
+
save() {
|
|
335
|
+
const tabNotices = this.rows.filter(isTabNotice);
|
|
336
|
+
const sorted = this.rows.filter((row) => !isTabNotice(row)).sort((a, b) => b.updated_at.localeCompare(a.updated_at));
|
|
337
|
+
const protectedRows = sorted.filter(isProtected);
|
|
338
|
+
if (protectedRows.length > GLOBAL_LIMIT)
|
|
339
|
+
throw new Error('Update notification protected capacity exceeded');
|
|
340
|
+
const kept = [...protectedRows];
|
|
341
|
+
const counts = new Map();
|
|
342
|
+
for (const row of protectedRows) {
|
|
343
|
+
const key = retentionBucket(row);
|
|
344
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
345
|
+
}
|
|
346
|
+
for (const row of sorted) {
|
|
347
|
+
if (isProtected(row))
|
|
348
|
+
continue;
|
|
349
|
+
const key = retentionBucket(row);
|
|
350
|
+
const count = counts.get(key) ?? 0;
|
|
351
|
+
if (count >= PER_SCOPE_LIMIT || kept.length >= GLOBAL_LIMIT)
|
|
352
|
+
continue;
|
|
353
|
+
counts.set(key, count + 1);
|
|
354
|
+
kept.push(row);
|
|
355
|
+
}
|
|
356
|
+
this.rows = [...kept.reverse(), ...tabNotices];
|
|
357
|
+
mkdirSync(dirname(this.file), { recursive: true });
|
|
358
|
+
atomicWriteSecretJson(this.file, this.rows);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const safeToken = (value, fallback) => typeof value === 'string' && /^[a-z0-9][a-z0-9_-]{0,63}$/.test(value) ? value : fallback;
|
|
362
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
363
|
+
const safeText = (value, fallback, limit) => typeof value === 'string' && value.trim() ? value.trim().replace(/[\x00-\x1f\x7f]+/g, ' ').slice(0, limit) : fallback;
|
|
364
|
+
const safeActions = (value) => !Array.isArray(value) ? [] : value.slice(0, 4).flatMap((raw) => {
|
|
365
|
+
if (!raw || typeof raw !== 'object')
|
|
366
|
+
return [];
|
|
367
|
+
const action = raw;
|
|
368
|
+
const id = safeToken(action.id, '');
|
|
369
|
+
const label = safeText(action.label, '', 80);
|
|
370
|
+
if (!id || !label)
|
|
371
|
+
return [];
|
|
372
|
+
return [{ id, label, style: action.style === 'primary' || action.style === 'destructive' ? action.style : 'default', acknowledges: action.acknowledges === true }];
|
|
373
|
+
});
|
|
374
|
+
const safeDestination = (value) => {
|
|
375
|
+
if (!value || typeof value !== 'object')
|
|
376
|
+
return null;
|
|
377
|
+
const destination = value;
|
|
378
|
+
const key = typeof destination.key === 'string' && /^[a-z0-9][a-z0-9_.-]{0,63}$/.test(destination.key) ? destination.key : '';
|
|
379
|
+
const label = safeText(destination.label, '', 80);
|
|
380
|
+
return key && label ? { key, label } : null;
|
|
381
|
+
};
|
|
382
|
+
const isTabNotice = (row) => row.tab_id !== null;
|
|
383
|
+
const isDismissible = (row) => !row.requires_acknowledgement || row.acknowledged_at !== null;
|
|
384
|
+
const isProtected = (row) => (row.requires_acknowledgement && row.acknowledged_at === null) || (row.kind === 'update' && ['applying', 'awaiting_confirmation', 'restarting'].includes(row.phase));
|
|
385
|
+
const retentionBucket = (row) => `${row.owner}\u0000${row.visibility === 'server' ? '*' : row.profile}`;
|
|
386
|
+
export const updateNotificationScopeId = (scope) => createHash('sha256').update(`${scope.owner}\u0000${scope.profile}\u0000${scope.serverOwner === true ? 'owner' : 'member'}`).digest('hex').slice(0, 24);
|
|
387
|
+
//# sourceMappingURL=update-notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifications.js","sourceRoot":"","sources":["../../src/tools/update-notifications.ts"],"names":[],"mappings":"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"}
|