@maudecode/talaria-web 1.17.2 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/auth-raw.d.ts +1 -1
  3. package/dist/api/auth-raw.js +4 -4
  4. package/dist/api/auth-raw.js.map +1 -1
  5. package/dist/api/automation-raw.d.ts +6 -0
  6. package/dist/api/automation-raw.js +53 -6
  7. package/dist/api/automation-raw.js.map +1 -1
  8. package/dist/api/automation-router.d.ts +26 -1
  9. package/dist/api/automation-router.js +16 -2
  10. package/dist/api/automation-router.js.map +1 -1
  11. package/dist/api/chat-router.d.ts +649 -15
  12. package/dist/api/chat-router.js +52 -50
  13. package/dist/api/chat-router.js.map +1 -1
  14. package/dist/api/git-router.d.ts +35 -1
  15. package/dist/api/git-router.js +18 -19
  16. package/dist/api/git-router.js.map +1 -1
  17. package/dist/api/raw-routes.d.ts +8 -0
  18. package/dist/api/raw-routes.js +247 -36
  19. package/dist/api/raw-routes.js.map +1 -1
  20. package/dist/api/router.d.ts +10 -0
  21. package/dist/api/router.js +10 -8
  22. package/dist/api/router.js.map +1 -1
  23. package/dist/api/sessions-router.d.ts +1492 -115
  24. package/dist/api/sessions-router.js +134 -8
  25. package/dist/api/sessions-router.js.map +1 -1
  26. package/dist/api/settings-router.d.ts +31 -0
  27. package/dist/api/settings-router.js +8 -3
  28. package/dist/api/settings-router.js.map +1 -1
  29. package/dist/api/sse-routes.d.ts +5 -0
  30. package/dist/api/sse-routes.js +50 -3
  31. package/dist/api/sse-routes.js.map +1 -1
  32. package/dist/api/tools-raw.js +6 -23
  33. package/dist/api/tools-raw.js.map +1 -1
  34. package/dist/api/tools-router.d.ts +356 -15
  35. package/dist/api/tools-router.js +148 -19
  36. package/dist/api/tools-router.js.map +1 -1
  37. package/dist/app.js +35 -15
  38. package/dist/app.js.map +1 -1
  39. package/dist/auth/gate.js +5 -2
  40. package/dist/auth/gate.js.map +1 -1
  41. package/dist/auth/oidc.d.ts +5 -2
  42. package/dist/auth/oidc.js +8 -7
  43. package/dist/auth/oidc.js.map +1 -1
  44. package/dist/bin/talaria-web.js +1 -1
  45. package/dist/bin/talaria-web.js.map +1 -1
  46. package/dist/cli/dotenv.js +1 -0
  47. package/dist/cli/dotenv.js.map +1 -1
  48. package/dist/config/agent-config.js +3 -2
  49. package/dist/config/agent-config.js.map +1 -1
  50. package/dist/config.d.ts +2 -0
  51. package/dist/config.js +5 -1
  52. package/dist/config.js.map +1 -1
  53. package/dist/http/context.d.ts +17 -3
  54. package/dist/http/context.js +31 -4
  55. package/dist/http/context.js.map +1 -1
  56. package/dist/http/csp.d.ts +2 -1
  57. package/dist/http/csp.js +3 -2
  58. package/dist/http/csp.js.map +1 -1
  59. package/dist/profiles/profiles.d.ts +10 -0
  60. package/dist/profiles/profiles.js +40 -2
  61. package/dist/profiles/profiles.js.map +1 -1
  62. package/dist/providers/catalog.d.ts +6 -2
  63. package/dist/providers/catalog.js +30 -11
  64. package/dist/providers/catalog.js.map +1 -1
  65. package/dist/raster-image.d.ts +7 -0
  66. package/dist/raster-image.js +267 -0
  67. package/dist/raster-image.js.map +1 -0
  68. package/dist/redact.js +327 -40
  69. package/dist/redact.js.map +1 -1
  70. package/dist/runtime.js +89 -23
  71. package/dist/runtime.js.map +1 -1
  72. package/dist/server.js +5 -0
  73. package/dist/server.js.map +1 -1
  74. package/dist/sessions/background-tasks.d.ts +2 -9
  75. package/dist/sessions/background-tasks.js +2 -12
  76. package/dist/sessions/background-tasks.js.map +1 -1
  77. package/dist/sessions/cli-sessions.d.ts +15 -4
  78. package/dist/sessions/cli-sessions.js +120 -29
  79. package/dist/sessions/cli-sessions.js.map +1 -1
  80. package/dist/sessions/completions.d.ts +48 -8
  81. package/dist/sessions/completions.js +222 -26
  82. package/dist/sessions/completions.js.map +1 -1
  83. package/dist/sessions/export.d.ts +5 -0
  84. package/dist/sessions/export.js +30 -0
  85. package/dist/sessions/export.js.map +1 -1
  86. package/dist/sessions/gateway-watcher.d.ts +7 -3
  87. package/dist/sessions/gateway-watcher.js +31 -19
  88. package/dist/sessions/gateway-watcher.js.map +1 -1
  89. package/dist/sessions/handoff.d.ts +32 -0
  90. package/dist/sessions/handoff.js +114 -0
  91. package/dist/sessions/handoff.js.map +1 -0
  92. package/dist/sessions/list.d.ts +7 -1
  93. package/dist/sessions/list.js +13 -5
  94. package/dist/sessions/list.js.map +1 -1
  95. package/dist/sessions/merge.d.ts +2 -4
  96. package/dist/sessions/merge.js +8 -15
  97. package/dist/sessions/merge.js.map +1 -1
  98. package/dist/sessions/recovery.d.ts +22 -0
  99. package/dist/sessions/recovery.js +506 -0
  100. package/dist/sessions/recovery.js.map +1 -0
  101. package/dist/sessions/relay.d.ts +21 -2
  102. package/dist/sessions/relay.js +156 -11
  103. package/dist/sessions/relay.js.map +1 -1
  104. package/dist/sessions/service.d.ts +108 -6
  105. package/dist/sessions/service.js +403 -29
  106. package/dist/sessions/service.js.map +1 -1
  107. package/dist/sessions/session.d.ts +6 -0
  108. package/dist/sessions/session.js +40 -2
  109. package/dist/sessions/session.js.map +1 -1
  110. package/dist/sessions/state-db-worker.d.ts +1 -0
  111. package/dist/sessions/state-db-worker.js +33 -0
  112. package/dist/sessions/state-db-worker.js.map +1 -0
  113. package/dist/sessions/state-db.d.ts +61 -0
  114. package/dist/sessions/state-db.js +291 -0
  115. package/dist/sessions/state-db.js.map +1 -1
  116. package/dist/sessions/store.d.ts +7 -0
  117. package/dist/sessions/store.js +31 -22
  118. package/dist/sessions/store.js.map +1 -1
  119. package/dist/sessions/titles.d.ts +2 -0
  120. package/dist/sessions/titles.js +4 -0
  121. package/dist/sessions/titles.js.map +1 -1
  122. package/dist/sessions/tool-display.d.ts +3 -3
  123. package/dist/sessions/tool-display.js +11 -37
  124. package/dist/sessions/tool-display.js.map +1 -1
  125. package/dist/sessions/turn-context.d.ts +1 -1
  126. package/dist/sessions/turn-context.js +11 -7
  127. package/dist/sessions/turn-context.js.map +1 -1
  128. package/dist/sessions/turn.d.ts +37 -2
  129. package/dist/sessions/turn.js +182 -49
  130. package/dist/sessions/turn.js.map +1 -1
  131. package/dist/sessions/wakeup-pause.d.ts +59 -0
  132. package/dist/sessions/wakeup-pause.js +181 -0
  133. package/dist/sessions/wakeup-pause.js.map +1 -0
  134. package/dist/settings.js +5 -7
  135. package/dist/settings.js.map +1 -1
  136. package/dist/sidecar/fake.d.ts +2 -2
  137. package/dist/sidecar/fake.js.map +1 -1
  138. package/dist/startup.d.ts +13 -5
  139. package/dist/startup.js +48 -0
  140. package/dist/startup.js.map +1 -1
  141. package/dist/test/ts-worker-hooks.d.ts +1 -0
  142. package/dist/test/ts-worker-hooks.js +24 -0
  143. package/dist/test/ts-worker-hooks.js.map +1 -0
  144. package/dist/text/diff.d.ts +9 -14
  145. package/dist/text/diff.js +74 -108
  146. package/dist/text/diff.js.map +1 -1
  147. package/dist/tools/crons.js +45 -8
  148. package/dist/tools/crons.js.map +1 -1
  149. package/dist/tools/dashboard-plugins.d.ts +53 -0
  150. package/dist/tools/dashboard-plugins.js +188 -0
  151. package/dist/tools/dashboard-plugins.js.map +1 -0
  152. package/dist/tools/extensions.d.ts +13 -1
  153. package/dist/tools/extensions.js +132 -60
  154. package/dist/tools/extensions.js.map +1 -1
  155. package/dist/tools/health.d.ts +32 -0
  156. package/dist/tools/health.js +111 -19
  157. package/dist/tools/health.js.map +1 -1
  158. package/dist/tools/mcp.d.ts +13 -0
  159. package/dist/tools/mcp.js +88 -0
  160. package/dist/tools/mcp.js.map +1 -1
  161. package/dist/tools/project-os.d.ts +11 -0
  162. package/dist/tools/project-os.js +267 -0
  163. package/dist/tools/project-os.js.map +1 -0
  164. package/dist/tools/skills.d.ts +5 -1
  165. package/dist/tools/skills.js +5 -3
  166. package/dist/tools/skills.js.map +1 -1
  167. package/dist/tools/updates.d.ts +27 -9
  168. package/dist/tools/updates.js +163 -51
  169. package/dist/tools/updates.js.map +1 -1
  170. package/dist/tools/wiki.d.ts +68 -0
  171. package/dist/tools/wiki.js +413 -0
  172. package/dist/tools/wiki.js.map +1 -0
  173. package/dist/workspace/escape.d.ts +61 -0
  174. package/dist/workspace/escape.js +149 -0
  175. package/dist/workspace/escape.js.map +1 -0
  176. package/dist/workspace/extract.d.ts +22 -0
  177. package/dist/workspace/extract.js +308 -0
  178. package/dist/workspace/extract.js.map +1 -0
  179. package/dist/workspace/fs.d.ts +12 -0
  180. package/dist/workspace/fs.js +92 -23
  181. package/dist/workspace/fs.js.map +1 -1
  182. package/dist/workspace/git.d.ts +18 -0
  183. package/dist/workspace/git.js +38 -25
  184. package/dist/workspace/git.js.map +1 -1
  185. package/dist/workspace/media.d.ts +4 -4
  186. package/dist/workspace/media.js +16 -45
  187. package/dist/workspace/media.js.map +1 -1
  188. package/dist/workspace/rollback.d.ts +34 -20
  189. package/dist/workspace/rollback.js +171 -265
  190. package/dist/workspace/rollback.js.map +1 -1
  191. package/dist/workspace/unzip.js +4 -1
  192. package/dist/workspace/unzip.js.map +1 -1
  193. package/dist/workspace/upload.d.ts +7 -4
  194. package/dist/workspace/upload.js +5 -2
  195. package/dist/workspace/upload.js.map +1 -1
  196. package/dist/workspace/worktrees.d.ts +2 -1
  197. package/dist/workspace/worktrees.js +14 -15
  198. package/dist/workspace/worktrees.js.map +1 -1
  199. package/package.json +4 -2
  200. package/sidecar/agent_dependency.json +4 -4
  201. package/sidecar/scripts/replay_sidecar.py +24 -0
  202. package/sidecar/talaria_sidecar/__init__.py +1 -1
  203. package/sidecar/talaria_sidecar/home.py +13 -2
  204. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  205. package/sidecar/talaria_sidecar/methods/aux.py +39 -5
  206. package/sidecar/talaria_sidecar/methods/chat.py +9 -5
  207. package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
  208. package/sidecar/talaria_sidecar/methods/commands.py +81 -0
  209. package/sidecar/talaria_sidecar/methods/cron.py +29 -2
  210. package/sidecar/talaria_sidecar/methods/gateway.py +32 -15
  211. package/sidecar/talaria_sidecar/methods/kanban.py +28 -7
  212. package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
  213. package/sidecar/talaria_sidecar/methods/process.py +58 -4
  214. package/sidecar/talaria_sidecar/methods/profiles.py +77 -7
  215. package/sidecar/talaria_sidecar/methods/providers.py +27 -8
  216. package/sidecar/talaria_sidecar/methods/state_db.py +39 -5
  217. package/sidecar/talaria_sidecar/runtime.py +17 -1
  218. package/static/dist/FILES.txt +127 -126
  219. package/static/dist/assets/AppShell-g3bkgnvt.js +1 -0
  220. package/static/dist/assets/ChatPage-oo7bdan6.js +25 -0
  221. package/static/dist/assets/Dialog-g355qxhp.js +1 -0
  222. package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +1 -0
  223. package/static/dist/assets/HubRoute-lmkrbw47.js +2 -0
  224. package/static/dist/assets/{Markdown-mdwlvj3w.js → Markdown-j4kut4j2.js} +114 -114
  225. package/static/dist/assets/{RightPanel-ftvrjlcp.js → RightPanel-ohlsdzfl.js} +1 -1
  226. package/static/dist/assets/Select-kddq75qc.js +1 -0
  227. package/static/dist/assets/SessionListPanel-lu3oy0hw.js +1 -0
  228. package/static/dist/assets/{SettingsLayout-jonjefmj.js → SettingsLayout-o9bv4mgb.js} +1 -1
  229. package/static/dist/assets/{States-nmejrwrm.js → States-eq6fe29m.js} +1 -1
  230. package/static/dist/assets/Toaster-pc247u9f.js +1 -0
  231. package/static/dist/assets/{_app-gdidzd94.js → _app-f8n1i0m1.js} +1 -1
  232. package/static/dist/assets/{_app.ext._extensionId-opyh9y0v.js → _app.ext._extensionId-gfbzpoou.js} +1 -1
  233. package/static/dist/assets/_app.index-bzzv80hk.js +1 -0
  234. package/static/dist/assets/_app.insights-dzixbryi.js +1 -0
  235. package/static/dist/assets/_app.kanban-c6hep2us.js +1 -0
  236. package/static/dist/assets/_app.logs-i69qds98.js +1 -0
  237. package/static/dist/assets/_app.memory-kl4vf0gd.js +1 -0
  238. package/static/dist/assets/_app.profiles-b8zinmyp.js +1 -0
  239. package/static/dist/assets/{_app.session._sessionId-bfd4h3id.js → _app.session._sessionId-fn1bhde6.js} +1 -1
  240. package/static/dist/assets/_app.settings-cg8plwmf.js +1 -0
  241. package/static/dist/assets/_app.settings._section-bkwbi9zn.js +3 -0
  242. package/static/dist/assets/_app.skills-cs47sbvs.js +1 -0
  243. package/static/dist/assets/_app.tasks-dwvk64tc.js +1 -0
  244. package/static/dist/assets/_app.todos-c8xjm8p3.js +1 -0
  245. package/static/dist/assets/_app.workspaces-ehvd1gds.js +1 -0
  246. package/static/dist/assets/{abnfDiagram-VCTEODGH-b2x1lqot.js → abnfDiagram-VCTEODGH-c8kdixke.js} +1 -1
  247. package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +1 -0
  248. package/static/dist/assets/{architectureDiagram-5GKGNRK7-h38o5l7b.js → architectureDiagram-5GKGNRK7-cku06x1p.js} +1 -1
  249. package/static/dist/assets/{back-bemaer09.js → back-h7aun7ew.js} +1 -1
  250. package/static/dist/assets/{blockDiagram-I7D4REHJ-bqquxv2u.js → blockDiagram-I7D4REHJ-jzthp1wa.js} +1 -1
  251. package/static/dist/assets/{c4Diagram-7LVT6UL2-f3fb8w6z.js → c4Diagram-7LVT6UL2-mwr67mt8.js} +1 -1
  252. package/static/dist/assets/{cancel-drd0g6d9.js → cancel-fhi0vcnu.js} +1 -1
  253. package/static/dist/assets/channel-b2zo73z1.js +1 -0
  254. package/static/dist/assets/{chunk-4HAMMTFA-bzfyyzp3.js → chunk-4HAMMTFA-gpq1y228.js} +1 -1
  255. package/static/dist/assets/{chunk-75Z2AOVW-ly99rfx5.js → chunk-75Z2AOVW-ktje58c4.js} +1 -1
  256. package/static/dist/assets/{chunk-DU6HZSFF-bg6ecfqf.js → chunk-DU6HZSFF-ofajdixh.js} +3 -3
  257. package/static/dist/assets/{chunk-F27PBJKO-e8k7mmqw.js → chunk-F27PBJKO-cmev85ti.js} +1 -1
  258. package/static/dist/assets/{chunk-GMAD6QVW-cmalnoaj.js → chunk-GMAD6QVW-htjgt22y.js} +1 -1
  259. package/static/dist/assets/{chunk-GVQU2GXP-gmif5o01.js → chunk-GVQU2GXP-qndvoxl7.js} +1 -1
  260. package/static/dist/assets/{chunk-IMKFNOWR-f1nwwh6u.js → chunk-IMKFNOWR-e5bkd5q6.js} +1 -1
  261. package/static/dist/assets/{chunk-L3NEJ4N5-oktfh5v7.js → chunk-L3NEJ4N5-mj1155r6.js} +1 -1
  262. package/static/dist/assets/{chunk-OSK3NFVY-b1sdx96z.js → chunk-OSK3NFVY-e7gkikcw.js} +1 -1
  263. package/static/dist/assets/{chunk-P2QGCYS3-fhu4nzxt.js → chunk-P2QGCYS3-f7t54xfm.js} +1 -1
  264. package/static/dist/assets/{chunk-POPQ4Y6H-em31rnef.js → chunk-POPQ4Y6H-i927v9oa.js} +1 -1
  265. package/static/dist/assets/{chunk-PWAF6VOD-bxhhyftw.js → chunk-PWAF6VOD-m84lmnyt.js} +1 -1
  266. package/static/dist/assets/{chunk-SHT3W25Y-fmrvwcav.js → chunk-SHT3W25Y-mi0tlcu9.js} +1 -1
  267. package/static/dist/assets/{chunk-SVP7TREG-lymukl2j.js → chunk-SVP7TREG-dnau702j.js} +1 -1
  268. package/static/dist/assets/{chunk-TICWLB2K-lmza6k23.js → chunk-TICWLB2K-edem1gkg.js} +1 -1
  269. package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +1 -0
  270. package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +1 -0
  271. package/static/dist/assets/{copied-ima3pysb.js → copied-hcplv46p.js} +1 -1
  272. package/static/dist/assets/{copy-fw5b1pc6.js → copy-magtofyp.js} +1 -1
  273. package/static/dist/assets/{cynefin-OW5HDTMX-czlhbyhs.js → cynefin-OW5HDTMX-siqlulkl.js} +1 -1
  274. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-gq7mvswb.js → cynefinDiagram-5FMLGOSQ-i648tah9.js} +1 -1
  275. package/static/dist/assets/{dagre-GXQ25YYZ-cqdbf7dr.js → dagre-GXQ25YYZ-mwn6uc17.js} +1 -1
  276. package/static/dist/assets/{diagram-S7CK7UJ4-o6arxa58.js → diagram-S7CK7UJ4-l8abxaes.js} +1 -1
  277. package/static/dist/assets/{diagram-UQ7AKVKN-nhnd68tz.js → diagram-UQ7AKVKN-mekq7zgq.js} +1 -1
  278. package/static/dist/assets/{diagram-VSXAHHWV-dk2sclzn.js → diagram-VSXAHHWV-fnky6lvc.js} +1 -1
  279. package/static/dist/assets/{diagram-VX7I27RA-n3k5nyx3.js → diagram-VX7I27RA-xe6r5qfw.js} +1 -1
  280. package/static/dist/assets/{diagram-Z3DM3KII-m6q9cwdh.js → diagram-Z3DM3KII-nq07dg7k.js} +1 -1
  281. package/static/dist/assets/{ebnfDiagram-PWID7BFC-lsa5641p.js → ebnfDiagram-PWID7BFC-c62ipm3g.js} +1 -1
  282. package/static/dist/assets/endpoints-klbxod4t.js +64 -0
  283. package/static/dist/assets/{erDiagram-RLTQ6QDP-fo2ckbe6.js → erDiagram-RLTQ6QDP-h39kmnzy.js} +1 -1
  284. package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +1 -0
  285. package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +1 -0
  286. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-nzqz6x9g.js → ganttDiagram-EL5Y4UJY-ngbsyp37.js} +1 -1
  287. package/static/dist/assets/{gitGraph-4MIJSDKK-gukvcxe6.js → gitGraph-4MIJSDKK-fr2i7caa.js} +1 -1
  288. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-lqhdp8f0.js → gitGraphDiagram-WWUBYQGX-eravdti4.js} +1 -1
  289. package/static/dist/assets/{highlighted-body-KPVGNVTW-igw6cp39.js → highlighted-body-KPVGNVTW-jwpop9p8.js} +1 -1
  290. package/static/dist/assets/host-i828xuo7.js +1 -0
  291. package/static/dist/assets/index-eh8zilnv.css +2 -0
  292. package/static/dist/assets/{index-cxq58xb1.js → index-r648f4o1.js} +5 -5
  293. package/static/dist/assets/{info-A6RAGUB7-gvu7a93l.js → info-A6RAGUB7-h11x0dxo.js} +1 -1
  294. package/static/dist/assets/{infoDiagram-27XIBGKW-m8t8g6w1.js → infoDiagram-27XIBGKW-dfh47dw9.js} +1 -1
  295. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-l07vkbgj.js → ishikawaDiagram-5VMMS53U-i6ypq351.js} +1 -1
  296. package/static/dist/assets/{journeyDiagram-3NMN7TZE-hybkgj8l.js → journeyDiagram-3NMN7TZE-lduf1z95.js} +1 -1
  297. package/static/dist/assets/{kanban-definition-UXKFOSKX-by13uvtn.js → kanban-definition-UXKFOSKX-e18bu4pg.js} +1 -1
  298. package/static/dist/assets/{lazyRouteComponent-af0lvgjx.js → lazyRouteComponent-e1y4t2i9.js} +1 -1
  299. package/static/dist/assets/{line-osxq6fq7.js → line-meizqsvn.js} +1 -1
  300. package/static/dist/assets/{link-jyxicdhg.js → link-oot2yn73.js} +1 -1
  301. package/static/dist/assets/login-gu28l9ou.js +1 -0
  302. package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +1 -0
  303. package/static/dist/assets/{mermaid-parser.core-i91oxmou.js → mermaid-parser.core-ntne45i9.js} +3 -3
  304. package/static/dist/assets/{mindmap-definition-YA3MSWOX-m82mx8ww.js → mindmap-definition-YA3MSWOX-27b26eok.js} +1 -1
  305. package/static/dist/assets/onboarding-lkphzu1s.js +1 -0
  306. package/static/dist/assets/{onboarding_model_label-dp7xffoh.js → onboarding_model_label-ftpjdwqk.js} +1 -1
  307. package/static/dist/assets/{packet-AYTQ26CC-nbtgge2o.js → packet-AYTQ26CC-l6jdka8p.js} +1 -1
  308. package/static/dist/assets/{pegDiagram-XKGWAZYB-f1zxzga1.js → pegDiagram-XKGWAZYB-g1er3bxj.js} +1 -1
  309. package/static/dist/assets/{pie-WAS4IAKB-of8vuhxs.js → pie-WAS4IAKB-i0ylcrt9.js} +1 -1
  310. package/static/dist/assets/{pieDiagram-E7YTZNPT-o7y8ftio.js → pieDiagram-E7YTZNPT-fbz1e55z.js} +1 -1
  311. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-iqiwia1t.js → quadrantDiagram-AXDQQJYC-hhue7d8o.js} +1 -1
  312. package/static/dist/assets/{radar-RG4KPBEZ-delnsy2v.js → radar-RG4KPBEZ-f9b70aa4.js} +1 -1
  313. package/static/dist/assets/{railroad-74A4TZTK-nspnyq9u.js → railroad-74A4TZTK-lgsuoeda.js} +1 -1
  314. package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +1 -0
  315. package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +1 -0
  316. package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +1 -0
  317. package/static/dist/assets/{railroadDiagram-O6MQD6OU-z41tqx5z.js → railroadDiagram-O6MQD6OU-eqpy9fnz.js} +1 -1
  318. package/static/dist/assets/{refresh-b4uams1i.js → refresh-abtu93ke.js} +1 -1
  319. package/static/dist/assets/{refresh-cw-nt1dtsx4.js → refresh-cw-hlwb02qv.js} +1 -1
  320. package/static/dist/assets/{requirementDiagram-BXWQKSXE-bdvif194.js → requirementDiagram-BXWQKSXE-ogf6puhi.js} +1 -1
  321. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-h73e0rol.js → sankeyDiagram-P5KCCOFB-fqb8xcjf.js} +1 -1
  322. package/static/dist/assets/{saved-kg52csy7.js → saved-girnabkf.js} +1 -1
  323. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-iv95mb1z.js → sequenceDiagram-WJ2MYXX4-dlcz6qjz.js} +1 -1
  324. package/static/dist/assets/{settings_section_extensions_title-ej0iapxe.js → settings_section_extensions_title-h14cwk6f.js} +1 -1
  325. package/static/dist/assets/share._token-kl0r7ido.js +2 -0
  326. package/static/dist/assets/{sliders-horizontal-fj18it47.js → sliders-horizontal-n1zm34qq.js} +1 -1
  327. package/static/dist/assets/sse-iwku0sjo.js +1 -0
  328. package/static/dist/assets/{stateDiagram-D77RDMKH-k417ixmf.js → stateDiagram-D77RDMKH-fyoznpcs.js} +1 -1
  329. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +1 -0
  330. package/static/dist/assets/{swimlanes-42K2YHIH-esola70w.js → swimlanes-42K2YHIH-oefldhfy.js} +1 -1
  331. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +8 -0
  332. package/static/dist/assets/{timeline-definition-24CTP7MA-getrz2y8.js → timeline-definition-24CTP7MA-b1vl2zil.js} +1 -1
  333. package/static/dist/assets/todoStore-jjr5yr78.js +1 -0
  334. package/static/dist/assets/{treeView-Q6P3EWNA-hc7ap1q7.js → treeView-Q6P3EWNA-f7hcci5o.js} +1 -1
  335. package/static/dist/assets/{treemap-WGGIJYW6-b7k1syy5.js → treemap-WGGIJYW6-nl85071a.js} +1 -1
  336. package/static/dist/assets/{tts-lxdxnmjd.js → units-kgxzxfhi.js} +1 -1
  337. package/static/dist/assets/{untitled-ovpfthg4.js → untitled-cikfjntn.js} +1 -1
  338. package/static/dist/assets/{useForm-bcblv1rx.js → useForm-kqoqg0k9.js} +1 -1
  339. package/static/dist/assets/useLocale-o59tbiea.js +1 -0
  340. package/static/dist/assets/{useParams-lhg566ew.js → useParams-b4dq6n4q.js} +1 -1
  341. package/static/dist/assets/{useSearch-lbrh6ejn.js → useSearch-ipfmv3he.js} +1 -1
  342. package/static/dist/assets/{vennDiagram-4TSXK5OY-n6pcy5qb.js → vennDiagram-4TSXK5OY-h5hzbk0n.js} +1 -1
  343. package/static/dist/assets/{wardley-WFR3VGLG-lpa18vz1.js → wardley-WFR3VGLG-jftvpm3e.js} +1 -1
  344. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-kpclwwg7.js → wardleyDiagram-VM6X3IG4-hedh85ge.js} +1 -1
  345. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-paa2n8y0.js → xychartDiagram-S5SC5T6Z-e49523ab.js} +1 -1
  346. package/static/dist/index.html +1 -1
  347. package/static/dist/sw.js +1 -1
  348. package/static/dist/assets/AppShell-fb2td9zi.js +0 -1
  349. package/static/dist/assets/ChatPage-cj96kiy9.js +0 -25
  350. package/static/dist/assets/Dialog-kxcg7ard.js +0 -1
  351. package/static/dist/assets/ExtensionRoute-jf7h0754.js +0 -1
  352. package/static/dist/assets/HubRoute-gmanpd5y.js +0 -2
  353. package/static/dist/assets/Select-bilaypej.js +0 -1
  354. package/static/dist/assets/SessionListPanel-og8n36qs.js +0 -1
  355. package/static/dist/assets/Toaster-nnl8zkt9.js +0 -1
  356. package/static/dist/assets/_app.index-hbarzbjx.js +0 -1
  357. package/static/dist/assets/_app.insights-luywlarz.js +0 -1
  358. package/static/dist/assets/_app.kanban-kincnbr8.js +0 -1
  359. package/static/dist/assets/_app.logs-oi2gr3gs.js +0 -1
  360. package/static/dist/assets/_app.memory-b6jfivt6.js +0 -1
  361. package/static/dist/assets/_app.profiles-lpvixmqp.js +0 -1
  362. package/static/dist/assets/_app.settings-vowx3iq0.js +0 -1
  363. package/static/dist/assets/_app.settings._section-cnntg1tu.js +0 -3
  364. package/static/dist/assets/_app.skills-fb57lpau.js +0 -1
  365. package/static/dist/assets/_app.tasks-eszpx1q7.js +0 -2
  366. package/static/dist/assets/_app.todos-nr05ac6w.js +0 -1
  367. package/static/dist/assets/_app.workspaces-d2luomu6.js +0 -1
  368. package/static/dist/assets/architecture-7GRP2DOG-hd0o7bde.js +0 -1
  369. package/static/dist/assets/channel-cpdgf867.js +0 -1
  370. package/static/dist/assets/classDiagram-ZZMXUADV-ko09sguk.js +0 -1
  371. package/static/dist/assets/classDiagram-v2-VYDZK3BY-ko09sguk.js +0 -1
  372. package/static/dist/assets/endpoints-d33siokx.js +0 -64
  373. package/static/dist/assets/eventmodeling-NTZA5JFV-emctlo64.js +0 -1
  374. package/static/dist/assets/flowDiagram-HODETNUW-bfi3moqa.js +0 -1
  375. package/static/dist/assets/index-hgtx08n5.css +0 -2
  376. package/static/dist/assets/login-ec21t39x.js +0 -1
  377. package/static/dist/assets/mermaid-HWGCJPDP-gfl8z3ep.js +0 -1
  378. package/static/dist/assets/onboarding-btnltvyz.js +0 -1
  379. package/static/dist/assets/railroad-abnf-HS5TGJTU-nst1qxyn.js +0 -1
  380. package/static/dist/assets/railroad-ebnf-LZEXJU2U-ci37x8qy.js +0 -1
  381. package/static/dist/assets/railroad-peg-WCYAUIDC-aimkk07z.js +0 -1
  382. package/static/dist/assets/share._token-f97e94r0.js +0 -2
  383. package/static/dist/assets/sse-fwpqtzbg.js +0 -1
  384. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hwn4apct.js +0 -1
  385. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d1h97oyg.js +0 -8
  386. package/static/dist/assets/todoStore-eginf9h4.js +0 -1
  387. package/static/dist/assets/useLocale-fi5jb8ma.js +0 -1
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Session recovery audit and safe repair (Python `api/session_recovery.py`, TAL-259). The store writes
3
+ * `<sid>.json.bak` before any save that shrinks a transcript; the audit classifies every backup, index row, WebUI-origin
4
+ * state.db row without a sidecar, and pending turn-journal entry as `repairable` or `unsafe_to_repair`, and safe repair
5
+ * restores, materializes, and reindexes only what is repairable.
6
+ *
7
+ * A backup never undoes a deliberate shrink: clear, manual compression, and truncate/retry/undo each leave provenance on
8
+ * the live sidecar (`clear_generation`, the compression anchor, `intentional_shrink_generation`). A backup older than the
9
+ * `recovery_stamping_since` marker may predate that provenance, so next to a readable live transcript it goes to manual
10
+ * review instead.
11
+ */
12
+ import { closeSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, statSync, unlinkSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import { atomicWriteText, writeFully } from '../fs/atomic.js';
15
+ import { str } from '../util.js';
16
+ import { isContextCompressionMarker } from './merge.js';
17
+ import { isSafeSessionId, Session } from './session.js';
18
+ import { normalizeAgentSessionSource, openStateDbReadonly } from './state-db.js';
19
+ const STAMPING_MARKER = 'recovery_stamping_since';
20
+ /** Python `STATE_DB_RECOVERY_BUSY_TIMEOUT_MS`: a recovery scan waits out a writer rather than read a lock as "nothing missing". */
21
+ const STATE_DB_RECOVERY_BUSY_TIMEOUT_MS = 5000;
22
+ const SHRINK_GENERATION_RE = /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/;
23
+ const TURN_JOURNAL_DIR = '_turn_journal';
24
+ const TURN_JOURNAL_ID_RE = /^[A-Za-z0-9_.-]+$/;
25
+ const TERMINAL_TURN_EVENTS = new Set(['completed', 'interrupted']);
26
+ const WORKTREE_FIELDS = ['worktree_path', 'worktree_branch', 'worktree_repo_root', 'worktree_created_at'];
27
+ let tmpCounter = 0;
28
+ const isDict = (v) => Boolean(v) && typeof v === 'object' && !Array.isArray(v);
29
+ const isEmptyList = (v) => Array.isArray(v) && v.length === 0;
30
+ /**
31
+ * Epoch seconds since which this server stamps every deliberate shrink, recorded in the state directory on first start.
32
+ * A missing or unreadable marker is recorded anew: a later marker only sends more backups to manual review.
33
+ */
34
+ export function recoveryStampingSince(stateDir) {
35
+ const path = join(stateDir, STAMPING_MARKER);
36
+ try {
37
+ const value = Number(readFileSync(path, 'utf8').trim());
38
+ if (Number.isFinite(value) && value > 0)
39
+ return value;
40
+ }
41
+ catch { /* record it below */ }
42
+ const now = Date.now() / 1000;
43
+ mkdirSync(stateDir, { recursive: true });
44
+ atomicWriteText(path, `${String(now)}\n`);
45
+ return now;
46
+ }
47
+ function readDoc(path) {
48
+ try {
49
+ const value = JSON.parse(readFileSync(path, 'utf8'));
50
+ return isDict(value) ? value : null;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ /** Python `_msg_count`: the transcript length, or -1 when the file is missing, unparseable, or not a session. */
57
+ function messageCount(doc) {
58
+ return doc && Array.isArray(doc.messages) ? doc.messages.length : -1;
59
+ }
60
+ // ── deliberate-shrink provenance ─────────────────────────────────────────
61
+ /**
62
+ * Python `_session_records_clear_sentinel` / `_live_supersedes_backup_by_clear_generation`: the live sidecar carries a
63
+ * clear generation the backup lacks and the clear's boundary reset, and is either the exact cleared shape or has new
64
+ * messages since.
65
+ */
66
+ function clearedAfterBackup(live, bak) {
67
+ const generation = live.clear_generation;
68
+ if (typeof generation !== 'string' || !generation || bak.clear_generation === generation)
69
+ return false;
70
+ if (live.truncation_watermark !== 0 || live.truncation_boundary !== 0)
71
+ return false;
72
+ if (Array.isArray(live.messages) && live.messages.length > 0)
73
+ return true;
74
+ const nulls = ['active_stream_id', 'pending_user_message', 'pending_started_at', 'pending_user_source'];
75
+ const lists = ['messages', 'context_messages', 'pending_attachments'];
76
+ return nulls.every((k) => k in live && live[k] === null) && lists.every((k) => isEmptyList(live[k]));
77
+ }
78
+ /** Python `_session_records_intentional_compress_shrink`: the live sidecar records a context compression. */
79
+ function recordsCompression(live) {
80
+ if (str(live.compression_anchor_mode).trim().toLowerCase() === 'manual')
81
+ return true;
82
+ const shorter = Array.isArray(live.context_messages) && Array.isArray(live.messages) && live.context_messages.length < live.messages.length;
83
+ if (!shorter)
84
+ return false;
85
+ const anchored = str(live.compression_anchor_summary).trim() !== '' && live.compression_anchor_message_key !== null && live.compression_anchor_message_key !== undefined;
86
+ return anchored || (live.truncation_watermark !== null && live.truncation_watermark !== undefined);
87
+ }
88
+ /**
89
+ * Python `_backup_predates_intentional_shrink`: the backup still holds the uncompressed context. A backup whose context
90
+ * carries the compaction marker was written after the compression and stays recoverable.
91
+ */
92
+ function backupPredatesCompression(live, bak) {
93
+ const bakContext = Array.isArray(bak.context_messages) ? bak.context_messages : [];
94
+ if (bakContext.some(isContextCompressionMarker))
95
+ return false;
96
+ return bakContext.length > (Array.isArray(live.context_messages) ? live.context_messages.length : 0);
97
+ }
98
+ /** Python `_session_records_intentional_message_shrink`: truncate, retry, or undo stamped a generation the backup lacks. */
99
+ function recordsMessageShrink(live, bak) {
100
+ const isGeneration = (v) => typeof v === 'string' && SHRINK_GENERATION_RE.test(v);
101
+ if (!isGeneration(live.intentional_shrink_generation))
102
+ return false;
103
+ const backup = bak.intentional_shrink_generation;
104
+ if (backup === undefined || backup === null)
105
+ return true;
106
+ return isGeneration(backup) && backup !== live.intentional_shrink_generation;
107
+ }
108
+ /** Python `inspect_session_recovery_status`: whether `<sid>.json.bak` should replace `<sid>.json`. */
109
+ function inspectBackup(dir, sid, stampingSince) {
110
+ const livePath = join(dir, `${sid}.json`);
111
+ let bakMtime;
112
+ try {
113
+ bakMtime = statSync(`${livePath}.bak`).mtimeMs / 1000;
114
+ }
115
+ catch {
116
+ return { session_id: sid, live_messages: messageCount(readDoc(livePath)), bak_messages: -1, recommend: 'no_backup' };
117
+ }
118
+ const live = readDoc(livePath);
119
+ const bak = readDoc(`${livePath}.bak`);
120
+ const base = { session_id: sid, live_messages: messageCount(live), bak_messages: messageCount(bak) };
121
+ if (base.bak_messages <= base.live_messages)
122
+ return { ...base, recommend: 'no_action' };
123
+ // Every guard needs both documents; an unreadable live file is a real loss and restores.
124
+ if (live && bak) {
125
+ if (clearedAfterBackup(live, bak))
126
+ return { ...base, recommend: 'no_action', reason: 'intentional_clear_truncate' };
127
+ if (recordsCompression(live) && backupPredatesCompression(live, bak))
128
+ return { ...base, recommend: 'no_action', reason: 'intentional_compress_shrink' };
129
+ if (recordsMessageShrink(live, bak))
130
+ return { ...base, recommend: 'no_action', reason: 'intentional_message_shrink' };
131
+ if (base.live_messages >= 0 && bakMtime < stampingSince)
132
+ return { ...base, recommend: 'manual_review', reason: 'unstamped_legacy_backup' };
133
+ }
134
+ return { ...base, recommend: 'restore' };
135
+ }
136
+ function columns(db, table) {
137
+ return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((r) => r.name));
138
+ }
139
+ /** Python `_read_state_db_missing_sidecar_rows` (with empty rows) plus the session ids, from one read-only handle. */
140
+ function readStateDb(path, sessionDir) {
141
+ const absent = { has: () => true, missing: [], unreadable: false };
142
+ if (!existsSync(path))
143
+ return absent;
144
+ let db;
145
+ try {
146
+ db = openStateDbReadonly(path, STATE_DB_RECOVERY_BUSY_TIMEOUT_MS);
147
+ }
148
+ catch {
149
+ return { ...absent, unreadable: true };
150
+ }
151
+ try {
152
+ const cols = columns(db, 'sessions');
153
+ if (!cols.has('id'))
154
+ return absent;
155
+ const ids = new Set(db.prepare('SELECT id FROM sessions').all().map((r) => str(r.id)));
156
+ const view = { has: (sid) => ids.has(sid), missing: [], unreadable: false };
157
+ if (!cols.has('source'))
158
+ return view;
159
+ const opt = (name, fallback = 'NULL') => (cols.has(name) ? name : `${fallback} AS ${name}`);
160
+ const select = ['id', opt('title'), opt('model'), opt('started_at', '0'), opt('parent_session_id'), opt('workspace'), ...WORKTREE_FIELDS.map((f) => opt(f))];
161
+ const order = cols.has('started_at') ? 'COALESCE(started_at, 0) DESC' : 'rowid';
162
+ const rows = db.prepare(`SELECT ${select.join(', ')} FROM sessions WHERE source = 'webui' ORDER BY ${order}`).all();
163
+ const msgCols = columns(db, 'messages');
164
+ const messages = ['session_id', 'role', 'content'].every((c) => msgCols.has(c))
165
+ ? db.prepare(`SELECT role, content, ${msgCols.has('timestamp') ? 'timestamp' : 'NULL AS timestamp'} FROM messages WHERE session_id = ? ORDER BY ${msgCols.has('timestamp') && msgCols.has('id') ? 'timestamp, id' : 'rowid'}`)
166
+ : null;
167
+ for (const row of rows) {
168
+ const sid = str(row.id).trim();
169
+ if (!isSafeSessionId(sid) || existsSync(join(sessionDir, `${sid}.json`)))
170
+ continue;
171
+ const transcript = (messages?.all(sid) ?? []).map((m) => ({ role: m.role, content: m.content || '', ...(m.timestamp !== null ? { timestamp: m.timestamp } : {}) }));
172
+ view.missing.push({ ...row, id: sid, messages: transcript });
173
+ }
174
+ return view;
175
+ }
176
+ catch {
177
+ return { ...absent, unreadable: true };
178
+ }
179
+ finally {
180
+ db.close();
181
+ }
182
+ }
183
+ /** Python `_state_db_row_to_sidecar`, through `Session` so the document matches every field the store persists. */
184
+ function sidecarFromStateDbRow(row, store, profile) {
185
+ const source = 'webui'; // the scan reads only WebUI-origin rows
186
+ const started = Number(row.started_at) || 0;
187
+ const last = Number(row.messages.at(-1)?.timestamp) || 0;
188
+ const workspace = typeof row.workspace === 'string' && row.workspace ? { workspace: row.workspace } : {};
189
+ const worktree = Object.fromEntries(WORKTREE_FIELDS.map((f) => [f, row[f] || null]));
190
+ const session = new Session({
191
+ session_id: row.id, title: str(row.title) || 'Recovered WebUI Session', ...workspace, model: str(row.model) || 'unknown', profile,
192
+ created_at: started, updated_at: last || started, parent_session_id: row.parent_session_id ?? null, ...worktree,
193
+ source_tag: source, ...normalizeAgentSessionSource(source), messages: row.messages,
194
+ }, store.deps.defaults(profile));
195
+ return session.toDocument();
196
+ }
197
+ // ── turn journal (read-only) ─────────────────────────────────────────────
198
+ const createdAt = (event) => { const n = Number(event.created_at ?? 0); return Number.isFinite(n) ? n : 0; };
199
+ /**
200
+ * Python `iter_turn_journal_session_ids` + `read_turn_journal`: each session's events across its pid shards
201
+ * (`<sid>~<pid>.jsonl`) and legacy file, oldest first. Only journals an earlier backend left behind exist; this server
202
+ * never writes one.
203
+ */
204
+ function readTurnJournals(sessionDir) {
205
+ const dir = join(sessionDir, TURN_JOURNAL_DIR);
206
+ const out = new Map();
207
+ let names;
208
+ try {
209
+ names = readdirSync(dir).sort();
210
+ }
211
+ catch {
212
+ return out;
213
+ }
214
+ for (const name of names) {
215
+ if (!name.endsWith('.jsonl'))
216
+ continue;
217
+ const stem = name.slice(0, -'.jsonl'.length);
218
+ const tilde = stem.indexOf('~');
219
+ const sid = tilde > 0 ? stem.slice(0, tilde) : stem;
220
+ if (!TURN_JOURNAL_ID_RE.test(sid))
221
+ continue;
222
+ let text;
223
+ try {
224
+ if (!statSync(join(dir, name)).isFile())
225
+ continue;
226
+ text = readFileSync(join(dir, name), 'utf8');
227
+ }
228
+ catch {
229
+ continue;
230
+ }
231
+ const events = out.get(sid) ?? [];
232
+ for (const line of text.split('\n')) {
233
+ if (!line.trim())
234
+ continue;
235
+ try {
236
+ const event = JSON.parse(line);
237
+ if (isDict(event))
238
+ events.push(event);
239
+ }
240
+ catch { /* a torn line */ }
241
+ }
242
+ out.set(sid, events);
243
+ }
244
+ for (const events of out.values())
245
+ events.sort((a, b) => createdAt(a) - createdAt(b));
246
+ return out;
247
+ }
248
+ /** What a turn sent: its trimmed text and attachment names, or null when it sent nothing identifiable. */
249
+ function turnKey(content, attachments) {
250
+ const text = str(content || '').trim();
251
+ const files = (Array.isArray(attachments) ? attachments : []).map((a) => (isDict(a) ? str(a.name || a.filename || a.path) : str(a))).filter(Boolean).sort();
252
+ return text || files.length ? JSON.stringify([text, files]) : null;
253
+ }
254
+ /** A sidecar user row this long before a journaled turn predates it, so it cannot be that turn's row. */
255
+ const TURN_ROW_CLOCK_SLACK_S = 5;
256
+ /**
257
+ * Turns whose latest event is not terminal and whose user message never reached the sidecar. A row stamped with the
258
+ * turn's id (or stream id) is that turn; otherwise rows and turns with the same text and attachments pair up in order,
259
+ * one row per turn, so a repeated message ("continue") or an attachment-only turn still counts as missing.
260
+ */
261
+ function pendingJournalTurns(sessionDir, sid, events) {
262
+ const turns = new Map();
263
+ for (const event of events) {
264
+ const id = str(event.turn_id).trim();
265
+ if (!id)
266
+ continue;
267
+ const turn = turns.get(id) ?? { id, ids: new Set([id]), first: createdAt(event), latest: event, key: null };
268
+ if (createdAt(event) >= createdAt(turn.latest))
269
+ turn.latest = event;
270
+ turn.key ??= turnKey(event.content, event.attachments);
271
+ const streamId = str(event.stream_id).trim();
272
+ if (streamId)
273
+ turn.ids.add(streamId);
274
+ turns.set(id, turn);
275
+ }
276
+ if (!turns.size)
277
+ return [];
278
+ const live = readDoc(join(sessionDir, `${sid}.json`));
279
+ const rows = (Array.isArray(live?.messages) ? live.messages : []).filter((m) => isDict(m) && m.role === 'user');
280
+ const rowTurnIds = new Set(rows.map((m) => str(m._turn_id)).filter(Boolean));
281
+ const journaled = new Set([...turns.values()].flatMap((t) => [...t.ids]));
282
+ const unmatched = [...turns.values()].filter((t) => ![...t.ids].some((id) => rowTurnIds.has(id))).sort((a, b) => a.first - b.first);
283
+ const missing = new Set();
284
+ for (const key of new Set(unmatched.map((t) => t.key))) {
285
+ if (key === null)
286
+ continue;
287
+ const keyed = unmatched.filter((t) => t.key === key);
288
+ const earliest = keyed[0].first - TURN_ROW_CLOCK_SLACK_S;
289
+ const available = rows.filter((m) => !journaled.has(str(m._turn_id)) && turnKey(m.content, m.attachments) === key && !(Number(m.timestamp) < earliest)).length;
290
+ for (const turn of keyed.slice(available))
291
+ missing.add(turn);
292
+ }
293
+ const items = [];
294
+ for (const turn of [...missing].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {
295
+ if (TERMINAL_TURN_EVENTS.has(str(turn.latest.event)))
296
+ continue;
297
+ items.push({ ...item(sid, 'turn_journal_pending_turn', 'repairable', 'audit_only_pending_turn_journal', messageCount(live)), turn_id: turn.id, event: str(turn.latest.event) });
298
+ }
299
+ return items;
300
+ }
301
+ // ── audit ────────────────────────────────────────────────────────────────
302
+ function item(session_id, kind, category, recommendation, live_messages = -1, bak_messages = -1) {
303
+ return { session_id, kind, category, recommendation, live_messages, bak_messages };
304
+ }
305
+ function scan(deps) {
306
+ const dir = deps.store.sessionDir;
307
+ let names = [];
308
+ try {
309
+ names = readdirSync(dir).sort();
310
+ }
311
+ catch { /* no sessions yet; state.db may still hold some */ }
312
+ const ids = (suffix) => names.filter((n) => n.endsWith(suffix) && !n.startsWith('_')).map((n) => n.slice(0, -suffix.length));
313
+ return { dir, liveIds: ids('.json'), backupIds: ids('.json.bak'), db: readStateDb(deps.stateDbPath, dir), tombstoned: deps.store.loadDeletedTombstone() };
314
+ }
315
+ /** Python `audit_session_recovery`: a read-only classification of every recovery finding. */
316
+ export function auditSessionRecovery(deps) {
317
+ const s = scan(deps);
318
+ const items = [];
319
+ const live = new Set(s.liveIds);
320
+ for (const sid of s.backupIds.filter((id) => live.has(id))) {
321
+ const status = inspectBackup(s.dir, sid, deps.stampingSince);
322
+ if (status.recommend === 'restore')
323
+ items.push(item(sid, 'shrunken_live', 'repairable', 'restore_from_bak', status.live_messages, status.bak_messages));
324
+ if (status.recommend === 'manual_review')
325
+ items.push(item(sid, 'unstamped_legacy_backup', 'unsafe_to_repair', 'manual_review', status.live_messages, status.bak_messages));
326
+ }
327
+ // A deleted session with both a surviving backup and a state.db row is reported once (#5504).
328
+ const reportedDeleted = new Set();
329
+ for (const sid of s.backupIds.filter((id) => !live.has(id))) {
330
+ const bakMessages = messageCount(readDoc(join(s.dir, `${sid}.json.bak`)));
331
+ if (bakMessages < 0 || !isSafeSessionId(sid))
332
+ items.push(item(sid, 'malformed_orphan_backup', 'unsafe_to_repair', 'manual_review', -1, bakMessages));
333
+ else if (s.tombstoned.has(sid)) {
334
+ reportedDeleted.add(sid);
335
+ items.push(item(sid, 'state_db_deleted_webui_tombstone', 'unsafe_to_repair', 'deleted_session_skipped', -1, bakMessages));
336
+ }
337
+ else if (s.db.has(sid))
338
+ items.push(item(sid, 'orphan_backup', 'repairable', 'restore_from_bak', -1, bakMessages));
339
+ else
340
+ items.push(item(sid, 'orphan_backup_without_state_row', 'unsafe_to_repair', 'manual_review', -1, bakMessages));
341
+ }
342
+ if (existsSync(deps.store.indexFile)) {
343
+ let indexed = null;
344
+ try {
345
+ indexed = new Set(deps.store.readIndexEntries().map((e) => e.session_id).filter((id) => typeof id === 'string'));
346
+ }
347
+ catch {
348
+ items.push(item('', 'index_unreadable', 'repairable', 'rebuild_index'));
349
+ }
350
+ if (indexed)
351
+ for (const sid of [...indexed].filter((id) => !live.has(id) && !s.tombstoned.has(id)).sort())
352
+ items.push(item(sid, 'index_missing_file', 'repairable', 'rebuild_index'));
353
+ if (indexed)
354
+ for (const sid of s.liveIds.filter((id) => !indexed.has(id)))
355
+ items.push(item(sid, 'index_missing_entry', 'repairable', 'rebuild_index', messageCount(readDoc(join(s.dir, `${sid}.json`)))));
356
+ }
357
+ for (const row of s.db.missing) {
358
+ if (reportedDeleted.has(row.id))
359
+ continue;
360
+ if (s.tombstoned.has(row.id))
361
+ items.push(item(row.id, 'state_db_deleted_webui_tombstone', 'unsafe_to_repair', 'deleted_session_skipped'));
362
+ else if (!row.messages.length)
363
+ items.push(item(row.id, 'state_db_orphan_webui_row', 'unsafe_to_repair', 'manual_review'));
364
+ else
365
+ items.push(item(row.id, 'state_db_missing_sidecar', 'repairable', 'materialize_from_state_db'));
366
+ }
367
+ if (s.db.unreadable)
368
+ items.push(item('', 'state_db_unreadable', 'unsafe_to_repair', 'manual_review'));
369
+ for (const [sid, events] of readTurnJournals(s.dir))
370
+ items.push(...pendingJournalTurns(s.dir, sid, events));
371
+ const summary = { ok: s.liveIds.length, repairable: 0, unsafe_to_repair: 0 };
372
+ for (const i of items)
373
+ summary[i.category] += 1;
374
+ return { status: summary.unsafe_to_repair ? 'needs_manual_review' : summary.repairable ? 'warn' : 'ok', summary, items };
375
+ }
376
+ // ── repair ───────────────────────────────────────────────────────────────
377
+ /** Write `text` to a synced sibling temp file and publish it: replace `target`, or with `create` only when it is absent. */
378
+ function publish(target, text, create) {
379
+ const tmp = `${target}.recover.tmp.${String(process.pid)}.${String(++tmpCounter)}`;
380
+ try {
381
+ const fd = openSync(tmp, 'w');
382
+ try {
383
+ writeFully(fd, text);
384
+ fsyncSync(fd);
385
+ }
386
+ finally {
387
+ closeSync(fd);
388
+ }
389
+ if (!create) {
390
+ renameSync(tmp, target);
391
+ return true;
392
+ }
393
+ // A link never replaces a sidecar a concurrent save created after the check.
394
+ try {
395
+ linkSync(tmp, target);
396
+ return true;
397
+ }
398
+ catch (error) {
399
+ if (error.code === 'EEXIST')
400
+ return false;
401
+ throw error;
402
+ }
403
+ }
404
+ finally {
405
+ try {
406
+ unlinkSync(tmp);
407
+ }
408
+ catch { /* renamed */ }
409
+ }
410
+ }
411
+ /** A resident session with a live turn would overwrite any restored file on its next save. */
412
+ function busy(store, sid) {
413
+ const s = store.sessions.get(sid);
414
+ return Boolean(s && (s.active_stream_id || s.pending_user_message || s.pending_started_at));
415
+ }
416
+ /** Restore shrunken and orphaned sidecars from their backups, each re-checked under the session lock. */
417
+ async function restoreBackups(deps, s) {
418
+ const { store } = deps;
419
+ const live = new Set(s.liveIds);
420
+ const orphans = s.backupIds.filter((sid) => !live.has(sid) && isSafeSessionId(sid) && !s.tombstoned.has(sid) && s.db.has(sid) && messageCount(readDoc(join(s.dir, `${sid}.json.bak`))) >= 0);
421
+ const result = { scanned: s.liveIds.length + orphans.length, restored: 0, orphaned_backups: orphans.length, details: [] };
422
+ for (const sid of [...s.backupIds.filter((id) => live.has(id) && isSafeSessionId(id)), ...orphans]) {
423
+ await store.withLock(sid, () => {
424
+ const status = inspectBackup(s.dir, sid, deps.stampingSince);
425
+ const path = store.pathFor(sid);
426
+ if (status.recommend !== 'restore' || (!existsSync(path) && store.wasDeleted(sid)))
427
+ return;
428
+ const counts = { live_messages: status.live_messages, bak_messages: status.bak_messages };
429
+ if (busy(store, sid)) {
430
+ result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'session_active' });
431
+ return;
432
+ }
433
+ try {
434
+ if (!publish(path, readFileSync(`${path}.bak`, 'utf8'), !existsSync(path))) {
435
+ result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'sidecar_appeared' });
436
+ return;
437
+ }
438
+ }
439
+ catch (error) {
440
+ result.details.push({ session_id: sid, restored: false, ...counts, error: error.message });
441
+ return;
442
+ }
443
+ store.sessions.delete(sid);
444
+ store.invalidatePersistedIds();
445
+ result.restored += 1;
446
+ result.details.push({ session_id: sid, restored: true, ...counts });
447
+ deps.log(`[webui] WARNING: session recovery restored ${sid} from .bak (live=${String(status.live_messages)} -> bak=${String(status.bak_messages)} messages)`);
448
+ });
449
+ }
450
+ return result;
451
+ }
452
+ /** Python `recover_missing_sidecars_from_state_db`: create each missing WebUI sidecar that state.db can rebuild. */
453
+ async function materializeSidecars(deps, s) {
454
+ const { store } = deps;
455
+ const rows = s.db.missing.filter((row) => row.messages.length && !s.tombstoned.has(row.id));
456
+ const result = { scanned: rows.length, materialized: 0, details: [] };
457
+ for (const row of rows) {
458
+ await store.withLock(row.id, () => {
459
+ if (store.wasDeleted(row.id))
460
+ return;
461
+ if (busy(store, row.id)) {
462
+ result.details.push({ session_id: row.id, materialized: false, skipped: 'session_active' });
463
+ return;
464
+ }
465
+ try {
466
+ mkdirSync(s.dir, { recursive: true });
467
+ if (!publish(store.pathFor(row.id), JSON.stringify(sidecarFromStateDbRow(row, store, deps.profile), null, 2), true)) {
468
+ result.details.push({ session_id: row.id, materialized: false, skipped: 'sidecar_appeared_during_reconcile' });
469
+ return;
470
+ }
471
+ }
472
+ catch (error) {
473
+ result.details.push({ session_id: row.id, materialized: false, error: error.message });
474
+ return;
475
+ }
476
+ store.sessions.delete(row.id);
477
+ store.invalidatePersistedIds();
478
+ result.materialized += 1;
479
+ result.details.push({ session_id: row.id, materialized: true, messages: row.messages.length });
480
+ });
481
+ }
482
+ return result;
483
+ }
484
+ /**
485
+ * Python `repair_safe_session_recovery`: restore repairable backups, materialize missing sidecars from state.db, rebuild
486
+ * the index from the sidecars on disk, and audit again. `clean` holds only when the second audit has no finding.
487
+ */
488
+ export async function repairSafeSessionRecovery(deps) {
489
+ const before = auditSessionRecovery(deps);
490
+ const s = scan(deps);
491
+ const backupRepair = await restoreBackups(deps, s);
492
+ const sidecarRepair = await materializeSidecars(deps, s);
493
+ const reindex = backupRepair.restored || sidecarRepair.materialized || !existsSync(deps.store.indexFile) || before.items.some((i) => i.recommendation === 'rebuild_index');
494
+ if (reindex && existsSync(s.dir)) {
495
+ try {
496
+ deps.store.rebuildIndex({ diskOnly: true });
497
+ }
498
+ catch (error) {
499
+ deps.log(`[webui] WARNING: session recovery index rebuild failed: ${error.message}`);
500
+ }
501
+ }
502
+ const after = auditSessionRecovery(deps);
503
+ const clean = after.summary.repairable === 0 && after.summary.unsafe_to_repair === 0;
504
+ return { clean, ok: clean, repaired: backupRepair.restored + sidecarRepair.materialized, before, backup_repair: backupRepair, sidecar_repair: sidecarRepair, after };
505
+ }
506
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/sessions/recovery.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@ import type { StreamRegistry } from './streams.js';
2
2
  import type { PendingPrompts } from './pending.js';
3
3
  import type { SessionStore } from './store.js';
4
4
  export declare const PRESENCE_LEASE_SECONDS = 90;
5
+ export declare const PRESENCE_MAX_LEASES = 256;
6
+ /** How long a tab's sequence fence outlives its lease, so a reloaded tab whose clock moved back recovers. */
7
+ export declare const PRESENCE_FENCE_SECONDS: number;
5
8
  export declare class RelayPairingError extends Error {
6
9
  readonly status: number;
7
10
  constructor(message: string, status: number);
@@ -25,12 +28,16 @@ export declare function loadRelayConfig(stateDir: string): RelayConfig | null;
25
28
  export declare function saveRelayConfig(stateDir: string, config: RelayConfig): void;
26
29
  /** Python `_profile_identity`: a persistent `pfi_<32 hex>` per profile home, minted on first use (0600). */
27
30
  export declare function profileIdentity(profileHome: string): string;
28
- /** Profile-scoped browser activity leases; a fresh active lease mutes alerts for that profile. */
31
+ /**
32
+ * Profile-scoped browser activity leases; a fresh active lease mutes alerts for that profile.
33
+ * Each tab's entry also fences its sequence number for PRESENCE_FENCE_SECONDS past lease expiry,
34
+ * so a delayed lower sequence stays rejected. At most PRESENCE_MAX_LEASES tabs are kept; the least
35
+ * recently updated tab is evicted first, which drops its fence too.
36
+ */
29
37
  export declare class PresenceLeases {
30
38
  private readonly now;
31
39
  private readonly leases;
32
40
  constructor(now: () => number);
33
- private prune;
34
41
  private apply;
35
42
  renew(profile: string, tabId: string, seq?: number): void;
36
43
  revoke(profile: string, tabId: string, seq?: number): void;
@@ -48,6 +55,8 @@ export interface RelayPublisherDeps {
48
55
  presence: PresenceLeases;
49
56
  profileHome: (profile: string) => string;
50
57
  profilesMatch: (row: string | null | undefined, active: string | null | undefined) => boolean;
58
+ /** The profile's messageful Agent `state.db` sessions (`readImportableAgentSessionRows`). */
59
+ agentSessions: (profile: string) => Promise<Record<string, unknown>[]>;
51
60
  fetch: () => typeof fetch;
52
61
  now: () => number;
53
62
  log: (line: string) => void;
@@ -69,6 +78,8 @@ export declare class RelayPublisher {
69
78
  private readonly deps;
70
79
  private readonly key;
71
80
  private readonly revisionPath;
81
+ private readonly startedPath;
82
+ private startedUnsupportedLogged;
72
83
  private lastRevision;
73
84
  private terminal;
74
85
  private readonly disabledProfiles;
@@ -101,6 +112,14 @@ export declare class RelayPublisher {
101
112
  private publishes;
102
113
  /** Validation publish for one newly enrolled profile (Python `publish_profile`). */
103
114
  publishProfile(profileId: string, expectedIdentity: string): Promise<void>;
115
+ private loadStarted;
116
+ private saveStarted;
117
+ /** Give each enrolled profile without a ledger entry a floor of now; true when the ledger changed. */
118
+ private trackProfiles;
119
+ /** Record every messageful Web or Agent session that started in an enrolled profile since tracking began. */
120
+ private observeStarted;
121
+ /** Announce each newly observed session once, oldest first, to the relay scope of the profile that owns it. */
122
+ publishStarted(): Promise<void>;
104
123
  private publishProfileSnapshot;
105
124
  private putSnapshot;
106
125
  private put;