@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.
Files changed (247) hide show
  1. package/_release.json +4 -4
  2. package/dist/api/chat-router.d.ts +68 -4
  3. package/dist/api/chat-router.js +11 -8
  4. package/dist/api/chat-router.js.map +1 -1
  5. package/dist/api/router.d.ts +10 -0
  6. package/dist/api/router.js +2 -1
  7. package/dist/api/router.js.map +1 -1
  8. package/dist/api/sessions-router.d.ts +407 -51
  9. package/dist/api/sessions-router.js +2 -2
  10. package/dist/api/sessions-router.js.map +1 -1
  11. package/dist/api/sse-routes.js +52 -8
  12. package/dist/api/sse-routes.js.map +1 -1
  13. package/dist/api/tools-router.d.ts +329 -0
  14. package/dist/api/tools-router.js +97 -4
  15. package/dist/api/tools-router.js.map +1 -1
  16. package/dist/app.d.ts +812 -55
  17. package/dist/auth/oidc.js +2 -0
  18. package/dist/auth/oidc.js.map +1 -1
  19. package/dist/auth/store.d.ts +17 -0
  20. package/dist/auth/store.js +77 -19
  21. package/dist/auth/store.js.map +1 -1
  22. package/dist/fs/atomic.d.ts +8 -1
  23. package/dist/fs/atomic.js +52 -3
  24. package/dist/fs/atomic.js.map +1 -1
  25. package/dist/http/context.d.ts +2 -0
  26. package/dist/http/context.js.map +1 -1
  27. package/dist/redact.d.ts +15 -0
  28. package/dist/redact.js +1393 -9
  29. package/dist/redact.js.map +1 -1
  30. package/dist/release.js +3 -1
  31. package/dist/release.js.map +1 -1
  32. package/dist/runtime.js +20 -9
  33. package/dist/runtime.js.map +1 -1
  34. package/dist/server.d.ts +1 -1
  35. package/dist/server.js +11 -5
  36. package/dist/server.js.map +1 -1
  37. package/dist/sessions/anchor.d.ts +2 -0
  38. package/dist/sessions/anchor.js +22 -17
  39. package/dist/sessions/anchor.js.map +1 -1
  40. package/dist/sessions/file-changes.d.ts +15 -0
  41. package/dist/sessions/file-changes.js +58 -0
  42. package/dist/sessions/file-changes.js.map +1 -0
  43. package/dist/sessions/journal.d.ts +6 -1
  44. package/dist/sessions/journal.js +9 -15
  45. package/dist/sessions/journal.js.map +1 -1
  46. package/dist/sessions/list.d.ts +21 -1
  47. package/dist/sessions/list.js +81 -17
  48. package/dist/sessions/list.js.map +1 -1
  49. package/dist/sessions/merge.d.ts +66 -2
  50. package/dist/sessions/merge.js +291 -9
  51. package/dist/sessions/merge.js.map +1 -1
  52. package/dist/sessions/pending.d.ts +11 -2
  53. package/dist/sessions/pending.js +52 -3
  54. package/dist/sessions/pending.js.map +1 -1
  55. package/dist/sessions/service.d.ts +16 -3
  56. package/dist/sessions/service.js +92 -54
  57. package/dist/sessions/service.js.map +1 -1
  58. package/dist/sessions/state-db.d.ts +5 -0
  59. package/dist/sessions/state-db.js +34 -0
  60. package/dist/sessions/state-db.js.map +1 -1
  61. package/dist/sessions/streams.d.ts +4 -1
  62. package/dist/sessions/streams.js +3 -0
  63. package/dist/sessions/streams.js.map +1 -1
  64. package/dist/sessions/tool-display.d.ts +21 -0
  65. package/dist/sessions/tool-display.js +113 -0
  66. package/dist/sessions/tool-display.js.map +1 -0
  67. package/dist/sessions/turn.d.ts +25 -7
  68. package/dist/sessions/turn.js +153 -90
  69. package/dist/sessions/turn.js.map +1 -1
  70. package/dist/spa.d.ts +2 -0
  71. package/dist/spa.js +9 -0
  72. package/dist/spa.js.map +1 -1
  73. package/dist/test/harness.d.ts +2 -0
  74. package/dist/test/harness.js +1 -1
  75. package/dist/test/harness.js.map +1 -1
  76. package/dist/tools/terminal.d.ts +6 -0
  77. package/dist/tools/terminal.js +24 -3
  78. package/dist/tools/terminal.js.map +1 -1
  79. package/dist/tools/update-notifications.d.ts +120 -0
  80. package/dist/tools/update-notifications.js +387 -0
  81. package/dist/tools/update-notifications.js.map +1 -0
  82. package/dist/tools/updates.d.ts +49 -3
  83. package/dist/tools/updates.js +319 -53
  84. package/dist/tools/updates.js.map +1 -1
  85. package/package.json +2 -2
  86. package/sidecar/scripts/replay_sidecar.py +17 -0
  87. package/sidecar/talaria_sidecar/__init__.py +1 -1
  88. package/sidecar/talaria_sidecar/home.py +39 -16
  89. package/sidecar/talaria_sidecar/methods/chat.py +113 -4
  90. package/static/dist/FILES.txt +115 -116
  91. package/static/dist/assets/AppShell-m4w420jl.js +1 -0
  92. package/static/dist/assets/ChatPage-cuqcnisv.js +20 -0
  93. package/static/dist/assets/HubRoute-hqgqtm35.js +2 -0
  94. package/static/dist/assets/{Markdown-ftyfzds0.js → Markdown-j2hlu30v.js} +7 -7
  95. package/static/dist/assets/RightPanel-oid5q557.js +1 -0
  96. package/static/dist/assets/Select-ot2zr0il.js +1 -0
  97. package/static/dist/assets/SessionListPanel-o3sgjnrq.js +1 -0
  98. package/static/dist/assets/{SettingsLayout-pdpmhy1o.js → SettingsLayout-b0idn649.js} +1 -1
  99. package/static/dist/assets/States-htz1oee5.js +1 -0
  100. package/static/dist/assets/Toaster-h49pk1hy.js +1 -0
  101. package/static/dist/assets/_app-h7eaezs7.js +1 -0
  102. package/static/dist/assets/_app.ext._extensionId-h8oaqzsj.js +1 -0
  103. package/static/dist/assets/_app.index-xinao3xh.js +1 -0
  104. package/static/dist/assets/_app.insights-cxplvhkm.js +1 -0
  105. package/static/dist/assets/_app.kanban-hhli8h0h.js +1 -0
  106. package/static/dist/assets/_app.logs-f6srwjfl.js +1 -0
  107. package/static/dist/assets/_app.memory-lntcea85.js +1 -0
  108. package/static/dist/assets/_app.profiles-lftyp6of.js +1 -0
  109. package/static/dist/assets/{_app.session._sessionId-n1ggcf5e.js → _app.session._sessionId-hhpcqih4.js} +1 -1
  110. package/static/dist/assets/_app.settings-rs93zpvw.js +1 -0
  111. package/static/dist/assets/_app.settings._section-nafqsbwm.js +1 -0
  112. package/static/dist/assets/_app.skills-jzoi1ivd.js +1 -0
  113. package/static/dist/assets/_app.tasks-ijphsw56.js +2 -0
  114. package/static/dist/assets/_app.todos-emyh8inv.js +1 -0
  115. package/static/dist/assets/_app.workspaces-fwr1cum8.js +1 -0
  116. package/static/dist/assets/{abnfDiagram-VCTEODGH-i4bgzu83.js → abnfDiagram-VCTEODGH-egykbz8h.js} +1 -1
  117. package/static/dist/assets/architecture-7GRP2DOG-l6y92mbn.js +1 -0
  118. package/static/dist/assets/{architectureDiagram-5GKGNRK7-mx21lwqa.js → architectureDiagram-5GKGNRK7-b2e0wk3y.js} +1 -1
  119. package/static/dist/assets/{blockDiagram-I7D4REHJ-o1hhchxv.js → blockDiagram-I7D4REHJ-i3cq67dn.js} +1 -1
  120. package/static/dist/assets/{c4Diagram-7LVT6UL2-jygqtvd8.js → c4Diagram-7LVT6UL2-lg1p1s7a.js} +1 -1
  121. package/static/dist/assets/channel-gq8cwu71.js +1 -0
  122. package/static/dist/assets/{chunk-4HAMMTFA-hjcpubgk.js → chunk-4HAMMTFA-i0s1s7zi.js} +1 -1
  123. package/static/dist/assets/{chunk-75Z2AOVW-eibnex6m.js → chunk-75Z2AOVW-kwinpapo.js} +1 -1
  124. package/static/dist/assets/{chunk-DU6HZSFF-k1tp3qnp.js → chunk-DU6HZSFF-hb8qrbc3.js} +3 -3
  125. package/static/dist/assets/{chunk-F27PBJKO-lvcgn16f.js → chunk-F27PBJKO-dy2tqtcs.js} +1 -1
  126. package/static/dist/assets/{chunk-GMAD6QVW-ldlzruv1.js → chunk-GMAD6QVW-fqox5yvt.js} +1 -1
  127. package/static/dist/assets/{chunk-GVQU2GXP-hs1mva9d.js → chunk-GVQU2GXP-bo3x6ze4.js} +1 -1
  128. package/static/dist/assets/{chunk-IMKFNOWR-o7eqx3yb.js → chunk-IMKFNOWR-nxs6rrcq.js} +1 -1
  129. package/static/dist/assets/{chunk-L3NEJ4N5-bp1ofl70.js → chunk-L3NEJ4N5-f9yeq1fi.js} +1 -1
  130. package/static/dist/assets/{chunk-OSK3NFVY-o8m6mdz5.js → chunk-OSK3NFVY-c7df44qv.js} +1 -1
  131. package/static/dist/assets/{chunk-P2QGCYS3-kx83fti2.js → chunk-P2QGCYS3-eyjzf5o5.js} +1 -1
  132. package/static/dist/assets/{chunk-POPQ4Y6H-mwl99e9y.js → chunk-POPQ4Y6H-iy3hp9rc.js} +1 -1
  133. package/static/dist/assets/{chunk-PWAF6VOD-oriuokxy.js → chunk-PWAF6VOD-co2yoefz.js} +1 -1
  134. package/static/dist/assets/{chunk-SHT3W25Y-ab5cf00v.js → chunk-SHT3W25Y-obzqmn9k.js} +1 -1
  135. package/static/dist/assets/{chunk-SVP7TREG-kqdrpr17.js → chunk-SVP7TREG-hqwdo6vt.js} +1 -1
  136. package/static/dist/assets/{chunk-TICWLB2K-kfbnjabk.js → chunk-TICWLB2K-l8t1mdfd.js} +1 -1
  137. package/static/dist/assets/classDiagram-ZZMXUADV-fg9sc5r8.js +1 -0
  138. package/static/dist/assets/classDiagram-v2-VYDZK3BY-fg9sc5r8.js +1 -0
  139. package/static/dist/assets/{copied-dp33szhq.js → copied-hurn8vn4.js} +1 -1
  140. package/static/dist/assets/{cynefin-OW5HDTMX-mm5sj9s7.js → cynefin-OW5HDTMX-ngx2ihay.js} +1 -1
  141. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-nfon5q38.js → cynefinDiagram-5FMLGOSQ-fiyooys3.js} +1 -1
  142. package/static/dist/assets/{dagre-GXQ25YYZ-dzdp9ypb.js → dagre-GXQ25YYZ-fctryel6.js} +1 -1
  143. package/static/dist/assets/{diagram-S7CK7UJ4-ckxzqo01.js → diagram-S7CK7UJ4-m27jopok.js} +1 -1
  144. package/static/dist/assets/{diagram-UQ7AKVKN-hw16h1um.js → diagram-UQ7AKVKN-ojgkbmp4.js} +1 -1
  145. package/static/dist/assets/{diagram-VSXAHHWV-mu7wu2zg.js → diagram-VSXAHHWV-gfafpgyj.js} +1 -1
  146. package/static/dist/assets/{diagram-VX7I27RA-k9uprwtj.js → diagram-VX7I27RA-daobicg4.js} +1 -1
  147. package/static/dist/assets/{diagram-Z3DM3KII-csdjzrg9.js → diagram-Z3DM3KII-mi475zvk.js} +1 -1
  148. package/static/dist/assets/{ebnfDiagram-PWID7BFC-n8mbw2jj.js → ebnfDiagram-PWID7BFC-daf4zvsy.js} +1 -1
  149. package/static/dist/assets/endpoints-cyjhnrbn.js +64 -0
  150. package/static/dist/assets/{erDiagram-RLTQ6QDP-fsfe1uj0.js → erDiagram-RLTQ6QDP-gxfhxvfp.js} +1 -1
  151. package/static/dist/assets/eventmodeling-NTZA5JFV-manga0bq.js +1 -0
  152. package/static/dist/assets/flowDiagram-HODETNUW-bpt13uny.js +1 -0
  153. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-gsba3iq9.js → ganttDiagram-EL5Y4UJY-k3208e0p.js} +1 -1
  154. package/static/dist/assets/{gitGraph-4MIJSDKK-na86q1pu.js → gitGraph-4MIJSDKK-gjuhj4zk.js} +1 -1
  155. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-g72ew3xz.js → gitGraphDiagram-WWUBYQGX-jglxvux1.js} +1 -1
  156. package/static/dist/assets/{highlighted-body-KPVGNVTW-okn18cp1.js → highlighted-body-KPVGNVTW-gh24xc9c.js} +1 -1
  157. package/static/dist/assets/index-gsg78cb4.css +2 -0
  158. package/static/dist/assets/index-jb47los5.js +11 -0
  159. package/static/dist/assets/{info-A6RAGUB7-i01jeltk.js → info-A6RAGUB7-huf0xaoq.js} +1 -1
  160. package/static/dist/assets/{infoDiagram-27XIBGKW-cayiv6fa.js → infoDiagram-27XIBGKW-jk3n96ix.js} +1 -1
  161. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-g4rf14bv.js → ishikawaDiagram-5VMMS53U-o95uo5dx.js} +1 -1
  162. package/static/dist/assets/{journeyDiagram-3NMN7TZE-fusb2424.js → journeyDiagram-3NMN7TZE-h5ye2l70.js} +1 -1
  163. package/static/dist/assets/{kanban-definition-UXKFOSKX-g831pwlr.js → kanban-definition-UXKFOSKX-lgrpk5yi.js} +1 -1
  164. package/static/dist/assets/{lazyRouteComponent-ol965zwk.js → lazyRouteComponent-owywngyt.js} +1 -1
  165. package/static/dist/assets/{line-md6em6gc.js → line-cihmc0pn.js} +1 -1
  166. package/static/dist/assets/{login-kfclsqd2.js → login-g063apx6.js} +1 -1
  167. package/static/dist/assets/mermaid-HWGCJPDP-okd1mnvj.js +1 -0
  168. package/static/dist/assets/{mermaid-parser.core-mq3uns9m.js → mermaid-parser.core-d1609aga.js} +3 -3
  169. package/static/dist/assets/{mindmap-definition-YA3MSWOX-oxafrned.js → mindmap-definition-YA3MSWOX-lbvtir31.js} +1 -1
  170. package/static/dist/assets/{onboarding-fo6hnkyv.js → onboarding-ngw0x0pr.js} +1 -1
  171. package/static/dist/assets/{packet-AYTQ26CC-ggxyvbym.js → packet-AYTQ26CC-o4cp5z3k.js} +1 -1
  172. package/static/dist/assets/{pegDiagram-XKGWAZYB-nk7xcqgp.js → pegDiagram-XKGWAZYB-e8xqu1qj.js} +1 -1
  173. package/static/dist/assets/{pie-WAS4IAKB-ito2razh.js → pie-WAS4IAKB-hm9icuov.js} +1 -1
  174. package/static/dist/assets/{pieDiagram-E7YTZNPT-g02xexar.js → pieDiagram-E7YTZNPT-hj96x7hn.js} +1 -1
  175. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-d4jn4xq5.js → quadrantDiagram-AXDQQJYC-80utbxhm.js} +1 -1
  176. package/static/dist/assets/{radar-RG4KPBEZ-nebvfdzt.js → radar-RG4KPBEZ-k39b6100.js} +1 -1
  177. package/static/dist/assets/{railroad-74A4TZTK-ny3gebse.js → railroad-74A4TZTK-ewyqz67j.js} +1 -1
  178. package/static/dist/assets/railroad-abnf-HS5TGJTU-dx2q0evz.js +1 -0
  179. package/static/dist/assets/railroad-ebnf-LZEXJU2U-l8xt49t5.js +1 -0
  180. package/static/dist/assets/railroad-peg-WCYAUIDC-kuxha9yz.js +1 -0
  181. package/static/dist/assets/{railroadDiagram-O6MQD6OU-m09mmu67.js → railroadDiagram-O6MQD6OU-iwv9dby8.js} +1 -1
  182. package/static/dist/assets/{refresh-cw-eitd7yva.js → refresh-cw-hjzomwlo.js} +1 -1
  183. package/static/dist/assets/{requirementDiagram-BXWQKSXE-evggpcbk.js → requirementDiagram-BXWQKSXE-cdgh5jha.js} +1 -1
  184. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-bun89039.js → sankeyDiagram-P5KCCOFB-dbu6p97m.js} +1 -1
  185. package/static/dist/assets/{saved-culx14ii.js → saved-feqhycco.js} +1 -1
  186. package/static/dist/assets/{search-nu6kzq55.js → search-n3jdc20p.js} +1 -1
  187. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-hhs9f09o.js → sequenceDiagram-WJ2MYXX4-b0wchifg.js} +1 -1
  188. package/static/dist/assets/{settings_section_extensions_title-mj0gcozh.js → settings_section_extensions_title-mtyviexd.js} +1 -1
  189. package/static/dist/assets/{share._token-k4pcnxqu.js → share._token-cwov8uqh.js} +2 -2
  190. package/static/dist/assets/{sliders-horizontal-b9ljga1o.js → sliders-horizontal-i1lseyg0.js} +1 -1
  191. package/static/dist/assets/{stateDiagram-D77RDMKH-gi7t1tro.js → stateDiagram-D77RDMKH-mb4b38xh.js} +1 -1
  192. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-cn1fnqrg.js +1 -0
  193. package/static/dist/assets/{swimlanes-42K2YHIH-ea5urvph.js → swimlanes-42K2YHIH-ofrpfwj0.js} +1 -1
  194. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d652ummv.js +8 -0
  195. package/static/dist/assets/{timeline-definition-24CTP7MA-mq64rm3b.js → timeline-definition-24CTP7MA-hlw0jg6o.js} +1 -1
  196. package/static/dist/assets/todoStore-mfy9lpio.js +1 -0
  197. package/static/dist/assets/{treeView-Q6P3EWNA-cimbtxlz.js → treeView-Q6P3EWNA-d93wr19c.js} +1 -1
  198. package/static/dist/assets/{treemap-WGGIJYW6-wig5gi1y.js → treemap-WGGIJYW6-g7ezdedz.js} +1 -1
  199. package/static/dist/assets/{untitled-mbwemvxf.js → untitled-mqxhd1eh.js} +1 -1
  200. package/static/dist/assets/{useForm-li4bljlv.js → useForm-hh33yrwa.js} +1 -1
  201. package/static/dist/assets/useLocale-cr30vl7r.js +1 -0
  202. package/static/dist/assets/{vennDiagram-4TSXK5OY-ez63kh7n.js → vennDiagram-4TSXK5OY-m5vgeba5.js} +1 -1
  203. package/static/dist/assets/{wardley-WFR3VGLG-r7rftz31.js → wardley-WFR3VGLG-gpao9bxv.js} +1 -1
  204. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-mvqg9eqc.js → wardleyDiagram-VM6X3IG4-g2yzwshm.js} +1 -1
  205. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-eqxdfc91.js → xychartDiagram-S5SC5T6Z-itakhpic.js} +1 -1
  206. package/static/dist/index.html +1 -1
  207. package/static/dist/sw.js +114 -152
  208. package/static/dist/assets/AppShell-hikzkcql.js +0 -1
  209. package/static/dist/assets/ChatPage-ofqn89h9.js +0 -21
  210. package/static/dist/assets/HubRoute-f2zrs9si.js +0 -2
  211. package/static/dist/assets/RightPanel-febk3dkd.js +0 -1
  212. package/static/dist/assets/Select-lvx8gihl.js +0 -1
  213. package/static/dist/assets/SessionListPanel-o70ljmik.js +0 -1
  214. package/static/dist/assets/States-i46tz8an.js +0 -1
  215. package/static/dist/assets/Toaster-fklyeeyh.js +0 -1
  216. package/static/dist/assets/_app-j3rors25.js +0 -1
  217. package/static/dist/assets/_app.ext._extensionId-c0ey5ec9.js +0 -1
  218. package/static/dist/assets/_app.index-coy9jrto.js +0 -1
  219. package/static/dist/assets/_app.insights-ebd2k0i5.js +0 -1
  220. package/static/dist/assets/_app.kanban-e2p7ypi5.js +0 -1
  221. package/static/dist/assets/_app.logs-ml21mfyz.js +0 -1
  222. package/static/dist/assets/_app.memory-lhu5mm47.js +0 -1
  223. package/static/dist/assets/_app.profiles-egx0fgjo.js +0 -1
  224. package/static/dist/assets/_app.settings-d0vqtyid.js +0 -1
  225. package/static/dist/assets/_app.settings._section-cnzj6pli.js +0 -1
  226. package/static/dist/assets/_app.skills-kkug8obu.js +0 -1
  227. package/static/dist/assets/_app.tasks-nf285d2o.js +0 -2
  228. package/static/dist/assets/_app.todos-dxalqp1e.js +0 -1
  229. package/static/dist/assets/_app.workspaces-bqtduujs.js +0 -1
  230. package/static/dist/assets/architecture-7GRP2DOG-o8zqevhv.js +0 -1
  231. package/static/dist/assets/channel-mw8l793e.js +0 -1
  232. package/static/dist/assets/classDiagram-ZZMXUADV-egajr1wp.js +0 -1
  233. package/static/dist/assets/classDiagram-v2-VYDZK3BY-egajr1wp.js +0 -1
  234. package/static/dist/assets/endpoints-f6ngsyu5.js +0 -64
  235. package/static/dist/assets/eventmodeling-NTZA5JFV-k3zhqcyl.js +0 -1
  236. package/static/dist/assets/flowDiagram-HODETNUW-bdxes51f.js +0 -1
  237. package/static/dist/assets/index-ab0wj9ik.css +0 -2
  238. package/static/dist/assets/index-fd27xooo.js +0 -11
  239. package/static/dist/assets/mermaid-HWGCJPDP-ejk0d88t.js +0 -1
  240. package/static/dist/assets/railroad-abnf-HS5TGJTU-gtd38edw.js +0 -1
  241. package/static/dist/assets/railroad-ebnf-LZEXJU2U-o238oax2.js +0 -1
  242. package/static/dist/assets/railroad-peg-WCYAUIDC-c4acqp2j.js +0 -1
  243. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-jtadbol7.js +0 -1
  244. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ki7weepw.js +0 -8
  245. package/static/dist/assets/todoStore-azvfuqbv.js +0 -1
  246. package/static/dist/assets/trash-osyo895g.js +0 -1
  247. package/static/dist/assets/useLocale-kdew6auf.js +0 -1
@@ -1,5 +1,7 @@
1
1
  import { type ApiContext } from './router.js';
2
2
  import { type Dict } from '../config/agent-config.js';
3
+ import type { SessionInfo } from '../auth/store.js';
4
+ export declare function updateNotificationOwner(session: SessionInfo | null): string;
3
5
  /** Rate limiter keyed by client IP over a sliding window (Python `_csp_report_rate_limited` / `_client_event_rate_limited`). */
4
6
  export declare class WindowLimiter {
5
7
  private readonly windowSeconds;
@@ -387,10 +389,12 @@ export declare const toolsRouter: {
387
389
  no_git: import("zod").ZodOptional<import("zod").ZodBoolean>;
388
390
  install_kind: import("zod").ZodOptional<import("zod").ZodLiteral<"npm">>;
389
391
  npm: import("zod").ZodOptional<import("zod").ZodString>;
392
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
390
393
  dirty: import("zod").ZodOptional<import("zod").ZodBoolean>;
391
394
  metadata_repair: import("zod").ZodOptional<import("zod").ZodBoolean>;
392
395
  release_url: import("zod").ZodOptional<import("zod").ZodString>;
393
396
  ignored: import("zod").ZodOptional<import("zod").ZodBoolean>;
397
+ stale_check: import("zod").ZodOptional<import("zod").ZodBoolean>;
394
398
  current_version: import("zod").ZodOptional<import("zod").ZodString>;
395
399
  }, import("zod/v4/core").$loose>>>;
396
400
  agent: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
@@ -414,10 +418,12 @@ export declare const toolsRouter: {
414
418
  no_git: import("zod").ZodOptional<import("zod").ZodBoolean>;
415
419
  install_kind: import("zod").ZodOptional<import("zod").ZodLiteral<"npm">>;
416
420
  npm: import("zod").ZodOptional<import("zod").ZodString>;
421
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
417
422
  dirty: import("zod").ZodOptional<import("zod").ZodBoolean>;
418
423
  metadata_repair: import("zod").ZodOptional<import("zod").ZodBoolean>;
419
424
  release_url: import("zod").ZodOptional<import("zod").ZodString>;
420
425
  ignored: import("zod").ZodOptional<import("zod").ZodBoolean>;
426
+ stale_check: import("zod").ZodOptional<import("zod").ZodBoolean>;
421
427
  current_version: import("zod").ZodOptional<import("zod").ZodString>;
422
428
  }, import("zod/v4/core").$loose>>>;
423
429
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
@@ -459,10 +465,12 @@ export declare const toolsRouter: {
459
465
  no_git: import("zod").ZodOptional<import("zod").ZodBoolean>;
460
466
  install_kind: import("zod").ZodOptional<import("zod").ZodLiteral<"npm">>;
461
467
  npm: import("zod").ZodOptional<import("zod").ZodString>;
468
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
462
469
  dirty: import("zod").ZodOptional<import("zod").ZodBoolean>;
463
470
  metadata_repair: import("zod").ZodOptional<import("zod").ZodBoolean>;
464
471
  release_url: import("zod").ZodOptional<import("zod").ZodString>;
465
472
  ignored: import("zod").ZodOptional<import("zod").ZodBoolean>;
473
+ stale_check: import("zod").ZodOptional<import("zod").ZodBoolean>;
466
474
  current_version: import("zod").ZodOptional<import("zod").ZodString>;
467
475
  }, import("zod/v4/core").$loose>>>;
468
476
  agent: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
@@ -486,10 +494,12 @@ export declare const toolsRouter: {
486
494
  no_git: import("zod").ZodOptional<import("zod").ZodBoolean>;
487
495
  install_kind: import("zod").ZodOptional<import("zod").ZodLiteral<"npm">>;
488
496
  npm: import("zod").ZodOptional<import("zod").ZodString>;
497
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
489
498
  dirty: import("zod").ZodOptional<import("zod").ZodBoolean>;
490
499
  metadata_repair: import("zod").ZodOptional<import("zod").ZodBoolean>;
491
500
  release_url: import("zod").ZodOptional<import("zod").ZodString>;
492
501
  ignored: import("zod").ZodOptional<import("zod").ZodBoolean>;
502
+ stale_check: import("zod").ZodOptional<import("zod").ZodBoolean>;
493
503
  current_version: import("zod").ZodOptional<import("zod").ZodString>;
494
504
  }, import("zod/v4/core").$loose>>>;
495
505
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
@@ -515,6 +525,10 @@ export declare const toolsRouter: {
515
525
  stable: "stable";
516
526
  experimental: "experimental";
517
527
  }>>;
528
+ notification_id: import("zod").ZodOptional<import("zod").ZodUUID>;
529
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
530
+ backup_dir: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
531
+ backup_failed: import("zod").ZodOptional<import("zod").ZodBoolean>;
518
532
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
519
533
  force: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
520
534
  agent_channel: import("zod").ZodOptional<import("zod").ZodEnum<{
@@ -538,6 +552,10 @@ export declare const toolsRouter: {
538
552
  stable: "stable";
539
553
  experimental: "experimental";
540
554
  }>>;
555
+ notification_id: import("zod").ZodOptional<import("zod").ZodUUID>;
556
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
557
+ backup_dir: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
558
+ backup_failed: import("zod").ZodOptional<import("zod").ZodBoolean>;
541
559
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
542
560
  clearLock: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
543
561
  agent_channel: import("zod").ZodOptional<import("zod").ZodEnum<{
@@ -561,6 +579,10 @@ export declare const toolsRouter: {
561
579
  stable: "stable";
562
580
  experimental: "experimental";
563
581
  }>>;
582
+ notification_id: import("zod").ZodOptional<import("zod").ZodUUID>;
583
+ channel_switch: import("zod").ZodOptional<import("zod").ZodBoolean>;
584
+ backup_dir: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
585
+ backup_failed: import("zod").ZodOptional<import("zod").ZodBoolean>;
564
586
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
565
587
  summary: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
566
588
  updates: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
@@ -573,6 +595,313 @@ export declare const toolsRouter: {
573
595
  diff_links: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnknown>>;
574
596
  }, import("zod/v4/core").$loose>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
575
597
  };
598
+ updateNotifications: {
599
+ list: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
600
+ tab_id: import("zod").ZodOptional<import("zod").ZodString>;
601
+ loaded_build: import("zod").ZodOptional<import("zod").ZodString>;
602
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
603
+ scope_id: import("zod").ZodString;
604
+ frontend_build: import("zod").ZodObject<{
605
+ current_build: import("zod").ZodNullable<import("zod").ZodString>;
606
+ loaded_build: import("zod").ZodNullable<import("zod").ZodString>;
607
+ refresh_required: import("zod").ZodBoolean;
608
+ notification_id: import("zod").ZodNullable<import("zod").ZodUUID>;
609
+ }, import("zod/v4/core").$strip>;
610
+ notifications: import("zod").ZodArray<import("zod").ZodObject<{
611
+ id: import("zod").ZodUUID;
612
+ kind: import("zod").ZodString;
613
+ target: import("zod").ZodNullable<import("zod").ZodEnum<{
614
+ agent: "agent";
615
+ webui: "webui";
616
+ }>>;
617
+ phase: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
618
+ unknown: "unknown";
619
+ failed: "failed";
620
+ applying: "applying";
621
+ awaiting_confirmation: "awaiting_confirmation";
622
+ restarting: "restarting";
623
+ succeeded: "succeeded";
624
+ blocked: "blocked";
625
+ }>, import("zod").ZodString]>;
626
+ severity: import("zod").ZodEnum<{
627
+ warning: "warning";
628
+ info: "info";
629
+ critical: "critical";
630
+ }>;
631
+ persistent: import("zod").ZodBoolean;
632
+ requires_acknowledgement: import("zod").ZodBoolean;
633
+ actions: import("zod").ZodArray<import("zod").ZodObject<{
634
+ id: import("zod").ZodString;
635
+ label: import("zod").ZodString;
636
+ style: import("zod").ZodEnum<{
637
+ default: "default";
638
+ primary: "primary";
639
+ destructive: "destructive";
640
+ }>;
641
+ acknowledges: import("zod").ZodBoolean;
642
+ }, import("zod/v4/core").$strip>>;
643
+ destination: import("zod").ZodNullable<import("zod").ZodObject<{
644
+ key: import("zod").ZodString;
645
+ label: import("zod").ZodString;
646
+ }, import("zod/v4/core").$strip>>;
647
+ title: import("zod").ZodString;
648
+ message: import("zod").ZodString;
649
+ created_at: import("zod").ZodISODateTime;
650
+ updated_at: import("zod").ZodISODateTime;
651
+ read_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
652
+ acknowledged_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
653
+ acknowledged_action_id: import("zod").ZodNullable<import("zod").ZodString>;
654
+ verified_revision: import("zod").ZodNullable<import("zod").ZodString>;
655
+ verified_version: import("zod").ZodNullable<import("zod").ZodString>;
656
+ unread: import("zod").ZodBoolean;
657
+ active: import("zod").ZodBoolean;
658
+ requires_interaction: import("zod").ZodBoolean;
659
+ can_dismiss: import("zod").ZodBoolean;
660
+ }, import("zod/v4/core").$strip>>;
661
+ unread_count: import("zod").ZodNumber;
662
+ clearable_count: import("zod").ZodNumber;
663
+ can_clear: import("zod").ZodBoolean;
664
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
665
+ read: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
666
+ id: import("zod").ZodUUID;
667
+ read: import("zod").ZodLiteral<true>;
668
+ tab_id: import("zod").ZodOptional<import("zod").ZodString>;
669
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
670
+ id: import("zod").ZodUUID;
671
+ kind: import("zod").ZodString;
672
+ target: import("zod").ZodNullable<import("zod").ZodEnum<{
673
+ agent: "agent";
674
+ webui: "webui";
675
+ }>>;
676
+ phase: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
677
+ unknown: "unknown";
678
+ failed: "failed";
679
+ applying: "applying";
680
+ awaiting_confirmation: "awaiting_confirmation";
681
+ restarting: "restarting";
682
+ succeeded: "succeeded";
683
+ blocked: "blocked";
684
+ }>, import("zod").ZodString]>;
685
+ severity: import("zod").ZodEnum<{
686
+ warning: "warning";
687
+ info: "info";
688
+ critical: "critical";
689
+ }>;
690
+ persistent: import("zod").ZodBoolean;
691
+ requires_acknowledgement: import("zod").ZodBoolean;
692
+ actions: import("zod").ZodArray<import("zod").ZodObject<{
693
+ id: import("zod").ZodString;
694
+ label: import("zod").ZodString;
695
+ style: import("zod").ZodEnum<{
696
+ default: "default";
697
+ primary: "primary";
698
+ destructive: "destructive";
699
+ }>;
700
+ acknowledges: import("zod").ZodBoolean;
701
+ }, import("zod/v4/core").$strip>>;
702
+ destination: import("zod").ZodNullable<import("zod").ZodObject<{
703
+ key: import("zod").ZodString;
704
+ label: import("zod").ZodString;
705
+ }, import("zod/v4/core").$strip>>;
706
+ title: import("zod").ZodString;
707
+ message: import("zod").ZodString;
708
+ created_at: import("zod").ZodISODateTime;
709
+ updated_at: import("zod").ZodISODateTime;
710
+ read_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
711
+ acknowledged_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
712
+ acknowledged_action_id: import("zod").ZodNullable<import("zod").ZodString>;
713
+ verified_revision: import("zod").ZodNullable<import("zod").ZodString>;
714
+ verified_version: import("zod").ZodNullable<import("zod").ZodString>;
715
+ unread: import("zod").ZodBoolean;
716
+ active: import("zod").ZodBoolean;
717
+ requires_interaction: import("zod").ZodBoolean;
718
+ can_dismiss: import("zod").ZodBoolean;
719
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
720
+ dismiss: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
721
+ id: import("zod").ZodUUID;
722
+ dismiss: import("zod").ZodLiteral<true>;
723
+ tab_id: import("zod").ZodOptional<import("zod").ZodString>;
724
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
725
+ ok: import("zod").ZodLiteral<true>;
726
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
727
+ clear: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
728
+ clear: import("zod").ZodLiteral<true>;
729
+ tab_id: import("zod").ZodOptional<import("zod").ZodString>;
730
+ loaded_build: import("zod").ZodOptional<import("zod").ZodString>;
731
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
732
+ scope_id: import("zod").ZodString;
733
+ frontend_build: import("zod").ZodObject<{
734
+ current_build: import("zod").ZodNullable<import("zod").ZodString>;
735
+ loaded_build: import("zod").ZodNullable<import("zod").ZodString>;
736
+ refresh_required: import("zod").ZodBoolean;
737
+ notification_id: import("zod").ZodNullable<import("zod").ZodUUID>;
738
+ }, import("zod/v4/core").$strip>;
739
+ notifications: import("zod").ZodArray<import("zod").ZodObject<{
740
+ id: import("zod").ZodUUID;
741
+ kind: import("zod").ZodString;
742
+ target: import("zod").ZodNullable<import("zod").ZodEnum<{
743
+ agent: "agent";
744
+ webui: "webui";
745
+ }>>;
746
+ phase: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
747
+ unknown: "unknown";
748
+ failed: "failed";
749
+ applying: "applying";
750
+ awaiting_confirmation: "awaiting_confirmation";
751
+ restarting: "restarting";
752
+ succeeded: "succeeded";
753
+ blocked: "blocked";
754
+ }>, import("zod").ZodString]>;
755
+ severity: import("zod").ZodEnum<{
756
+ warning: "warning";
757
+ info: "info";
758
+ critical: "critical";
759
+ }>;
760
+ persistent: import("zod").ZodBoolean;
761
+ requires_acknowledgement: import("zod").ZodBoolean;
762
+ actions: import("zod").ZodArray<import("zod").ZodObject<{
763
+ id: import("zod").ZodString;
764
+ label: import("zod").ZodString;
765
+ style: import("zod").ZodEnum<{
766
+ default: "default";
767
+ primary: "primary";
768
+ destructive: "destructive";
769
+ }>;
770
+ acknowledges: import("zod").ZodBoolean;
771
+ }, import("zod/v4/core").$strip>>;
772
+ destination: import("zod").ZodNullable<import("zod").ZodObject<{
773
+ key: import("zod").ZodString;
774
+ label: import("zod").ZodString;
775
+ }, import("zod/v4/core").$strip>>;
776
+ title: import("zod").ZodString;
777
+ message: import("zod").ZodString;
778
+ created_at: import("zod").ZodISODateTime;
779
+ updated_at: import("zod").ZodISODateTime;
780
+ read_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
781
+ acknowledged_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
782
+ acknowledged_action_id: import("zod").ZodNullable<import("zod").ZodString>;
783
+ verified_revision: import("zod").ZodNullable<import("zod").ZodString>;
784
+ verified_version: import("zod").ZodNullable<import("zod").ZodString>;
785
+ unread: import("zod").ZodBoolean;
786
+ active: import("zod").ZodBoolean;
787
+ requires_interaction: import("zod").ZodBoolean;
788
+ can_dismiss: import("zod").ZodBoolean;
789
+ }, import("zod/v4/core").$strip>>;
790
+ unread_count: import("zod").ZodNumber;
791
+ clearable_count: import("zod").ZodNumber;
792
+ can_clear: import("zod").ZodBoolean;
793
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
794
+ cancel: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
795
+ id: import("zod").ZodUUID;
796
+ cancel: import("zod").ZodLiteral<true>;
797
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
798
+ id: import("zod").ZodUUID;
799
+ kind: import("zod").ZodString;
800
+ target: import("zod").ZodNullable<import("zod").ZodEnum<{
801
+ agent: "agent";
802
+ webui: "webui";
803
+ }>>;
804
+ phase: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
805
+ unknown: "unknown";
806
+ failed: "failed";
807
+ applying: "applying";
808
+ awaiting_confirmation: "awaiting_confirmation";
809
+ restarting: "restarting";
810
+ succeeded: "succeeded";
811
+ blocked: "blocked";
812
+ }>, import("zod").ZodString]>;
813
+ severity: import("zod").ZodEnum<{
814
+ warning: "warning";
815
+ info: "info";
816
+ critical: "critical";
817
+ }>;
818
+ persistent: import("zod").ZodBoolean;
819
+ requires_acknowledgement: import("zod").ZodBoolean;
820
+ actions: import("zod").ZodArray<import("zod").ZodObject<{
821
+ id: import("zod").ZodString;
822
+ label: import("zod").ZodString;
823
+ style: import("zod").ZodEnum<{
824
+ default: "default";
825
+ primary: "primary";
826
+ destructive: "destructive";
827
+ }>;
828
+ acknowledges: import("zod").ZodBoolean;
829
+ }, import("zod/v4/core").$strip>>;
830
+ destination: import("zod").ZodNullable<import("zod").ZodObject<{
831
+ key: import("zod").ZodString;
832
+ label: import("zod").ZodString;
833
+ }, import("zod/v4/core").$strip>>;
834
+ title: import("zod").ZodString;
835
+ message: import("zod").ZodString;
836
+ created_at: import("zod").ZodISODateTime;
837
+ updated_at: import("zod").ZodISODateTime;
838
+ read_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
839
+ acknowledged_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
840
+ acknowledged_action_id: import("zod").ZodNullable<import("zod").ZodString>;
841
+ verified_revision: import("zod").ZodNullable<import("zod").ZodString>;
842
+ verified_version: import("zod").ZodNullable<import("zod").ZodString>;
843
+ unread: import("zod").ZodBoolean;
844
+ active: import("zod").ZodBoolean;
845
+ requires_interaction: import("zod").ZodBoolean;
846
+ can_dismiss: import("zod").ZodBoolean;
847
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
848
+ action: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("zod").ZodObject<{
849
+ id: import("zod").ZodUUID;
850
+ action_id: import("zod").ZodString;
851
+ perform: import("zod").ZodLiteral<true>;
852
+ tab_id: import("zod").ZodOptional<import("zod").ZodString>;
853
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
854
+ id: import("zod").ZodUUID;
855
+ kind: import("zod").ZodString;
856
+ target: import("zod").ZodNullable<import("zod").ZodEnum<{
857
+ agent: "agent";
858
+ webui: "webui";
859
+ }>>;
860
+ phase: import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
861
+ unknown: "unknown";
862
+ failed: "failed";
863
+ applying: "applying";
864
+ awaiting_confirmation: "awaiting_confirmation";
865
+ restarting: "restarting";
866
+ succeeded: "succeeded";
867
+ blocked: "blocked";
868
+ }>, import("zod").ZodString]>;
869
+ severity: import("zod").ZodEnum<{
870
+ warning: "warning";
871
+ info: "info";
872
+ critical: "critical";
873
+ }>;
874
+ persistent: import("zod").ZodBoolean;
875
+ requires_acknowledgement: import("zod").ZodBoolean;
876
+ actions: import("zod").ZodArray<import("zod").ZodObject<{
877
+ id: import("zod").ZodString;
878
+ label: import("zod").ZodString;
879
+ style: import("zod").ZodEnum<{
880
+ default: "default";
881
+ primary: "primary";
882
+ destructive: "destructive";
883
+ }>;
884
+ acknowledges: import("zod").ZodBoolean;
885
+ }, import("zod/v4/core").$strip>>;
886
+ destination: import("zod").ZodNullable<import("zod").ZodObject<{
887
+ key: import("zod").ZodString;
888
+ label: import("zod").ZodString;
889
+ }, import("zod/v4/core").$strip>>;
890
+ title: import("zod").ZodString;
891
+ message: import("zod").ZodString;
892
+ created_at: import("zod").ZodISODateTime;
893
+ updated_at: import("zod").ZodISODateTime;
894
+ read_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
895
+ acknowledged_at: import("zod").ZodNullable<import("zod").ZodISODateTime>;
896
+ acknowledged_action_id: import("zod").ZodNullable<import("zod").ZodString>;
897
+ verified_revision: import("zod").ZodNullable<import("zod").ZodString>;
898
+ verified_version: import("zod").ZodNullable<import("zod").ZodString>;
899
+ unread: import("zod").ZodBoolean;
900
+ active: import("zod").ZodBoolean;
901
+ requires_interaction: import("zod").ZodBoolean;
902
+ can_dismiss: import("zod").ZodBoolean;
903
+ }, import("zod/v4/core").$strip>, import("@orpc/server").MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
904
+ };
576
905
  transcribeCapability: import("@orpc/server").Procedure<import("@orpc/server").MergedInitialContext<import("@orpc/server").MergedInitialContext<ApiContext & Record<never, never>, ApiContext & Record<never, never>, ApiContext>, ApiContext & Record<never, never> & Omit<ApiContext & Record<never, never>, "ctx">, import("@orpc/server").MergedCurrentContext<ApiContext, Record<never, never>>>, Omit<ApiContext, never> & Record<never, never>, import("@orpc/server").Schema<unknown, unknown>, import("zod").ZodObject<{
577
906
  ok: import("zod").ZodLiteral<true>;
578
907
  available: import("zod").ZodBoolean;
@@ -1,9 +1,10 @@
1
1
  /** Skills, memory, prompts, commands, notes, insights, logs, health, MCP, plugins, updates, diagnostics (Python `api/routes.py` handlers of the same paths). */
2
2
  import { implement } from '@orpc/server';
3
+ import { createHash } from 'node:crypto';
3
4
  import { toolsContract } from '@maudecode/talaria-web-contracts';
4
5
  import { HttpError, requireFields } from './router.js';
5
6
  import { requestSessionIdGuard } from './session-visibility.js';
6
- import { activeProfileName } from '../auth/gate.js';
7
+ import { activeProfileName, ensureTrustedAuthSession, sessionCanManageServer } from '../auth/gate.js';
7
8
  import { HttpFailure } from '../sessions/service.js';
8
9
  import { SessionNotFound } from '../sessions/store.js';
9
10
  import { ConfigUnavailable } from '../config/agent-config.js';
@@ -39,6 +40,62 @@ async function run(fn) {
39
40
  }
40
41
  }
41
42
  const home = (ctx) => ctx.deps.profileHome(activeProfileName(ctx));
43
+ const principalHash = (...parts) => createHash('sha256').update(JSON.stringify(parts), 'utf8').digest('hex');
44
+ export function updateNotificationOwner(session) {
45
+ const authType = str(session?.auth_type).trim();
46
+ if (authType === 'oidc') {
47
+ const issuer = str(session?.oidc_issuer).trim();
48
+ const subject = typeof session?.oidc_subject === 'string' ? session.oidc_subject : '';
49
+ if (issuer && subject.trim())
50
+ return `oidc:${principalHash(issuer, subject)}`;
51
+ const token = str(session?.token).trim();
52
+ if (token)
53
+ return `oidc-session:${principalHash(token)}`;
54
+ }
55
+ const username = str(session?.username).trim();
56
+ return username ? `${authType || 'auth'}:${username}` : 'local-owner';
57
+ }
58
+ async function updateNotificationScope(ctx, tab) {
59
+ const session = await ensureTrustedAuthSession(ctx);
60
+ return {
61
+ owner: updateNotificationOwner(session),
62
+ profile: activeProfileName(ctx),
63
+ serverOwner: await sessionCanManageServer(ctx, session),
64
+ tab: tab ?? null,
65
+ };
66
+ }
67
+ async function applyWithNotification(ctx, target, apply, confirmed = false) {
68
+ const scope = await updateNotificationScope(ctx);
69
+ const active = ctx.deps.updateNotifications.activeUpdate(scope, target);
70
+ if (active && (active.phase === 'applying' || active.phase === 'restarting')) {
71
+ return { ok: false, status: 'already_in_progress', message: 'Update already in progress', notification_id: active.id };
72
+ }
73
+ const notification = active ?? ctx.deps.updateNotifications.begin(scope, target);
74
+ if (active?.phase === 'awaiting_confirmation' && confirmed)
75
+ ctx.deps.updateNotifications.transition(notification.id, 'applying');
76
+ try {
77
+ const result = await apply();
78
+ const verifiedIdentity = typeof result.verified_revision === 'string'
79
+ ? { revision: result.verified_revision, version: typeof result.verified_version === 'string' ? result.verified_version : null }
80
+ : undefined;
81
+ if (result.confirmation_required === true)
82
+ ctx.deps.updateNotifications.transition(notification.id, 'awaiting_confirmation', null, verifiedIdentity);
83
+ else if (result.restart_blocked === true)
84
+ ctx.deps.updateNotifications.transition(notification.id, 'blocked', null, verifiedIdentity);
85
+ else if (result.ok !== true)
86
+ ctx.deps.updateNotifications.transition(notification.id, 'failed', null, verifiedIdentity);
87
+ else if (target === 'webui' && result.restart_scheduled === true) {
88
+ ctx.deps.updateNotifications.transition(notification.id, 'restarting', str(result.sourceRevision || result.candidate_revision), verifiedIdentity);
89
+ }
90
+ else
91
+ ctx.deps.updateNotifications.transition(notification.id, 'succeeded', null, verifiedIdentity);
92
+ return { ...result, notification_id: notification.id };
93
+ }
94
+ catch (error) {
95
+ ctx.deps.updateNotifications.transition(notification.id, 'failed');
96
+ throw error;
97
+ }
98
+ }
42
99
  /** Rate limiter keyed by client IP over a sliding window (Python `_csp_report_rate_limited` / `_client_event_rate_limited`). */
43
100
  export class WindowLimiter {
44
101
  windowSeconds;
@@ -315,11 +372,47 @@ export const toolsRouter = os.router({
315
372
  ctx.deps.log(`[updates] checking for updates (force=${String(force)}, channel=${channel})`);
316
373
  return (await ctx.deps.updates.check(force, !pyBool(settings.ignore_agent_updates), channel, input.agent_channel));
317
374
  })),
318
- apply: os.updates.apply.handler(({ input, context: { ctx } }) => run(() => ctx.deps.updates.apply(updateTarget(input.target), bodyChannel(input.channel), () => true, { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }))),
319
- force: os.updates.force.handler(({ input, context: { ctx } }) => run(() => ctx.deps.updates.force(updateTarget(input.target), bodyChannel(input.channel), { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }))),
320
- clearLock: os.updates.clearLock.handler(({ input, context: { ctx } }) => run(() => ctx.deps.updates.clearLock(updateTarget(input.target), { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }))),
375
+ apply: os.updates.apply.handler(({ input, context: { ctx } }) => run(() => { const target = updateTarget(input.target); return applyWithNotification(ctx, target, () => ctx.deps.updates.apply(target, bodyChannel(input.channel), () => true, { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }), input.confirmed_agent_revision !== undefined); })),
376
+ force: os.updates.force.handler(({ input, context: { ctx } }) => run(() => { const target = updateTarget(input.target); return applyWithNotification(ctx, target, () => ctx.deps.updates.force(target, bodyChannel(input.channel), { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }), input.confirmed_agent_revision !== undefined); })),
377
+ clearLock: os.updates.clearLock.handler(({ input, context: { ctx } }) => run(() => { const target = updateTarget(input.target); return applyWithNotification(ctx, target, () => ctx.deps.updates.clearLock(target, { agentChannel: input.agent_channel, confirmedRevision: input.confirmed_agent_revision }), input.confirmed_agent_revision !== undefined); })),
321
378
  summary: os.updates.summary.handler(({ input, context: { ctx } }) => run(() => ctx.deps.updates.summarize(input.updates ?? {}, input.target))),
322
379
  },
380
+ updateNotifications: {
381
+ list: os.updateNotifications.list.handler(({ input, context: { ctx } }) => run(async () => {
382
+ const scope = await updateNotificationScope(ctx, input.tab_id);
383
+ const frontendBuild = ctx.deps.updateNotifications.syncTabBuild(scope, input.loaded_build ?? null, ctx.deps.spa.buildId());
384
+ return { ...ctx.deps.updateNotifications.list(scope), frontend_build: frontendBuild };
385
+ })),
386
+ read: os.updateNotifications.read.handler(({ input, context: { ctx } }) => run(async () => {
387
+ const notification = ctx.deps.updateNotifications.read(await updateNotificationScope(ctx, input.tab_id), input.id);
388
+ if (!notification)
389
+ throw new HttpError(404, 'Update notification not found');
390
+ return notification;
391
+ })),
392
+ dismiss: os.updateNotifications.dismiss.handler(({ input, context: { ctx } }) => run(async () => {
393
+ const result = ctx.deps.updateNotifications.dismiss(await updateNotificationScope(ctx, input.tab_id), input.id);
394
+ if (result === 'acknowledgement_required')
395
+ throw new HttpError(409, 'This notification requires acknowledgement before it can be dismissed');
396
+ return { ok: true };
397
+ })),
398
+ clear: os.updateNotifications.clear.handler(({ input, context: { ctx } }) => run(async () => {
399
+ const scope = await updateNotificationScope(ctx, input.tab_id);
400
+ const frontendBuild = ctx.deps.updateNotifications.syncTabBuild(scope, input.loaded_build ?? null, ctx.deps.spa.buildId());
401
+ return { ...ctx.deps.updateNotifications.clear(scope), frontend_build: frontendBuild };
402
+ })),
403
+ cancel: os.updateNotifications.cancel.handler(({ input, context: { ctx } }) => run(async () => {
404
+ const notification = ctx.deps.updateNotifications.cancelUpdate(await updateNotificationScope(ctx), input.id);
405
+ if (!notification)
406
+ throw new HttpError(404, 'Awaiting update notification not found');
407
+ return notification;
408
+ })),
409
+ action: os.updateNotifications.action.handler(({ input, context: { ctx } }) => run(async () => {
410
+ const notification = ctx.deps.updateNotifications.action(await updateNotificationScope(ctx, input.tab_id), input.id, input.action_id);
411
+ if (!notification)
412
+ throw new HttpError(404, 'Notification action not found');
413
+ return notification;
414
+ })),
415
+ },
323
416
  transcribeCapability: os.transcribeCapability.handler(({ context: { ctx } }) => run(async () => {
324
417
  const sidecar = ctx.deps.sidecar();
325
418
  if (!sidecar)