@maudecode/talaria-web 1.18.0 → 1.20.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 (774) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/auth-raw.js +16 -16
  3. package/dist/api/auth-raw.js.map +1 -1
  4. package/dist/api/automation-raw.d.ts +2 -2
  5. package/dist/api/automation-raw.js +93 -38
  6. package/dist/api/automation-raw.js.map +1 -1
  7. package/dist/api/automation-router.d.ts +99 -17
  8. package/dist/api/automation-router.js +22 -14
  9. package/dist/api/automation-router.js.map +1 -1
  10. package/dist/api/chat-router.d.ts +1433 -37
  11. package/dist/api/chat-router.js +205 -90
  12. package/dist/api/chat-router.js.map +1 -1
  13. package/dist/api/git-router.d.ts +6 -2
  14. package/dist/api/git-router.js +30 -30
  15. package/dist/api/git-router.js.map +1 -1
  16. package/dist/api/raw-routes.d.ts +3 -3
  17. package/dist/api/raw-routes.js +76 -62
  18. package/dist/api/raw-routes.js.map +1 -1
  19. package/dist/api/router.d.ts +5 -5
  20. package/dist/api/router.js +22 -22
  21. package/dist/api/router.js.map +1 -1
  22. package/dist/api/session-visibility.d.ts +4 -4
  23. package/dist/api/session-visibility.js +26 -16
  24. package/dist/api/session-visibility.js.map +1 -1
  25. package/dist/api/sessions-router.d.ts +2635 -151
  26. package/dist/api/sessions-router.js +193 -177
  27. package/dist/api/sessions-router.js.map +1 -1
  28. package/dist/api/settings-router.d.ts +450 -11
  29. package/dist/api/settings-router.js +102 -49
  30. package/dist/api/settings-router.js.map +1 -1
  31. package/dist/api/sse-routes.d.ts +2 -2
  32. package/dist/api/sse-routes.js +102 -80
  33. package/dist/api/sse-routes.js.map +1 -1
  34. package/dist/api/tools-raw.d.ts +5 -0
  35. package/dist/api/tools-raw.js +58 -33
  36. package/dist/api/tools-raw.js.map +1 -1
  37. package/dist/api/tools-router.d.ts +963 -109
  38. package/dist/api/tools-router.js +426 -72
  39. package/dist/api/tools-router.js.map +1 -1
  40. package/dist/api/transcribe-stream.d.ts +16 -0
  41. package/dist/api/transcribe-stream.js +172 -0
  42. package/dist/api/transcribe-stream.js.map +1 -0
  43. package/dist/app.d.ts +4 -1
  44. package/dist/app.js +80 -57
  45. package/dist/app.js.map +1 -1
  46. package/dist/auth/crypto.d.ts +3 -0
  47. package/dist/auth/crypto.js +18 -0
  48. package/dist/auth/crypto.js.map +1 -1
  49. package/dist/auth/gate.js +14 -9
  50. package/dist/auth/gate.js.map +1 -1
  51. package/dist/auth/passkeys.d.ts +15 -14
  52. package/dist/auth/passkeys.js +89 -91
  53. package/dist/auth/passkeys.js.map +1 -1
  54. package/dist/auth/store.d.ts +17 -7
  55. package/dist/auth/store.js +93 -52
  56. package/dist/auth/store.js.map +1 -1
  57. package/dist/bin/talaria-web.js +12 -81
  58. package/dist/bin/talaria-web.js.map +1 -1
  59. package/dist/cli/ctl.js +8 -2
  60. package/dist/cli/ctl.js.map +1 -1
  61. package/dist/cli/dotenv.d.ts +5 -0
  62. package/dist/cli/dotenv.js +14 -2
  63. package/dist/cli/dotenv.js.map +1 -1
  64. package/dist/cli/launcher.js +5 -5
  65. package/dist/cli/launcher.js.map +1 -1
  66. package/dist/cli/main.d.ts +1 -0
  67. package/dist/cli/main.js +90 -0
  68. package/dist/cli/main.js.map +1 -0
  69. package/dist/cli/supervise.d.ts +24 -0
  70. package/dist/cli/supervise.js +147 -6
  71. package/dist/cli/supervise.js.map +1 -1
  72. package/dist/config/agent-config.d.ts +37 -11
  73. package/dist/config/agent-config.js +146 -64
  74. package/dist/config/agent-config.js.map +1 -1
  75. package/dist/config.d.ts +2 -0
  76. package/dist/config.js +14 -5
  77. package/dist/config.js.map +1 -1
  78. package/dist/fs/atomic.d.ts +4 -0
  79. package/dist/fs/atomic.js +19 -2
  80. package/dist/fs/atomic.js.map +1 -1
  81. package/dist/fs/stat.d.ts +7 -0
  82. package/dist/fs/stat.js +27 -0
  83. package/dist/fs/stat.js.map +1 -0
  84. package/dist/http/context.d.ts +28 -9
  85. package/dist/http/context.js +77 -25
  86. package/dist/http/context.js.map +1 -1
  87. package/dist/onboarding.d.ts +2 -2
  88. package/dist/onboarding.js +10 -8
  89. package/dist/onboarding.js.map +1 -1
  90. package/dist/profiles/profiles.d.ts +12 -4
  91. package/dist/profiles/profiles.js +78 -30
  92. package/dist/profiles/profiles.js.map +1 -1
  93. package/dist/projects.d.ts +15 -6
  94. package/dist/projects.js +55 -47
  95. package/dist/projects.js.map +1 -1
  96. package/dist/providers/catalog.d.ts +85 -14
  97. package/dist/providers/catalog.js +502 -146
  98. package/dist/providers/catalog.js.map +1 -1
  99. package/dist/providers/env-file.d.ts +10 -3
  100. package/dist/providers/env-file.js +24 -75
  101. package/dist/providers/env-file.js.map +1 -1
  102. package/dist/providers/runtime-env.d.ts +4 -2
  103. package/dist/providers/runtime-env.js +9 -6
  104. package/dist/providers/runtime-env.js.map +1 -1
  105. package/dist/providers/tables.d.ts +3 -1
  106. package/dist/providers/tables.js +4 -2
  107. package/dist/providers/tables.js.map +1 -1
  108. package/dist/redact.js +56 -23
  109. package/dist/redact.js.map +1 -1
  110. package/dist/release.d.ts +7 -0
  111. package/dist/release.js +19 -3
  112. package/dist/release.js.map +1 -1
  113. package/dist/runtime.d.ts +5 -1
  114. package/dist/runtime.js +303 -96
  115. package/dist/runtime.js.map +1 -1
  116. package/dist/server.js +31 -18
  117. package/dist/server.js.map +1 -1
  118. package/dist/sessions/anchor.d.ts +11 -4
  119. package/dist/sessions/anchor.js +33 -37
  120. package/dist/sessions/anchor.js.map +1 -1
  121. package/dist/sessions/background-events.d.ts +2 -0
  122. package/dist/sessions/background-events.js +10 -0
  123. package/dist/sessions/background-events.js.map +1 -0
  124. package/dist/sessions/background-tasks.d.ts +49 -23
  125. package/dist/sessions/background-tasks.js +161 -89
  126. package/dist/sessions/background-tasks.js.map +1 -1
  127. package/dist/sessions/background-updates.d.ts +15 -8
  128. package/dist/sessions/background-updates.js +101 -25
  129. package/dist/sessions/background-updates.js.map +1 -1
  130. package/dist/sessions/cli-sessions.d.ts +23 -6
  131. package/dist/sessions/cli-sessions.js +84 -84
  132. package/dist/sessions/cli-sessions.js.map +1 -1
  133. package/dist/sessions/completions.d.ts +38 -2
  134. package/dist/sessions/completions.js +348 -77
  135. package/dist/sessions/completions.js.map +1 -1
  136. package/dist/sessions/compress.d.ts +8 -0
  137. package/dist/sessions/compress.js +2 -2
  138. package/dist/sessions/compress.js.map +1 -1
  139. package/dist/sessions/drafts.d.ts +14 -10
  140. package/dist/sessions/drafts.js +38 -43
  141. package/dist/sessions/drafts.js.map +1 -1
  142. package/dist/sessions/export.d.ts +2 -0
  143. package/dist/sessions/export.js +6 -2
  144. package/dist/sessions/export.js.map +1 -1
  145. package/dist/sessions/gateway-sessions.d.ts +86 -0
  146. package/dist/sessions/gateway-sessions.js +914 -0
  147. package/dist/sessions/gateway-sessions.js.map +1 -0
  148. package/dist/sessions/gateway-watcher.d.ts +10 -11
  149. package/dist/sessions/gateway-watcher.js +25 -21
  150. package/dist/sessions/gateway-watcher.js.map +1 -1
  151. package/dist/sessions/goals.d.ts +31 -0
  152. package/dist/sessions/goals.js +75 -0
  153. package/dist/sessions/goals.js.map +1 -0
  154. package/dist/sessions/journal.d.ts +5 -79
  155. package/dist/sessions/journal.js +15 -606
  156. package/dist/sessions/journal.js.map +1 -1
  157. package/dist/sessions/list.d.ts +34 -18
  158. package/dist/sessions/list.js +161 -147
  159. package/dist/sessions/list.js.map +1 -1
  160. package/dist/sessions/merge.d.ts +77 -13
  161. package/dist/sessions/merge.js +315 -65
  162. package/dist/sessions/merge.js.map +1 -1
  163. package/dist/sessions/notices.d.ts +22 -0
  164. package/dist/sessions/notices.js +72 -0
  165. package/dist/sessions/notices.js.map +1 -0
  166. package/dist/sessions/pending.d.ts +10 -4
  167. package/dist/sessions/pending.js +83 -7
  168. package/dist/sessions/pending.js.map +1 -1
  169. package/dist/sessions/prefix-index.d.ts +85 -0
  170. package/dist/sessions/prefix-index.js +243 -0
  171. package/dist/sessions/prefix-index.js.map +1 -0
  172. package/dist/sessions/recovery.d.ts +4 -7
  173. package/dist/sessions/recovery.js +100 -283
  174. package/dist/sessions/recovery.js.map +1 -1
  175. package/dist/sessions/relay.d.ts +20 -20
  176. package/dist/sessions/relay.js +205 -127
  177. package/dist/sessions/relay.js.map +1 -1
  178. package/dist/sessions/service.d.ts +251 -78
  179. package/dist/sessions/service.js +1510 -564
  180. package/dist/sessions/service.js.map +1 -1
  181. package/dist/sessions/session.d.ts +20 -2
  182. package/dist/sessions/session.js +33 -5
  183. package/dist/sessions/session.js.map +1 -1
  184. package/dist/sessions/shares.d.ts +7 -6
  185. package/dist/sessions/shares.js +22 -45
  186. package/dist/sessions/shares.js.map +1 -1
  187. package/dist/sessions/source-kind.js +1 -0
  188. package/dist/sessions/source-kind.js.map +1 -1
  189. package/dist/sessions/state-db-identity.d.ts +18 -0
  190. package/dist/sessions/state-db-identity.js +67 -0
  191. package/dist/sessions/state-db-identity.js.map +1 -0
  192. package/dist/sessions/state-db-worker.js +24 -5
  193. package/dist/sessions/state-db-worker.js.map +1 -1
  194. package/dist/sessions/state-db.d.ts +157 -21
  195. package/dist/sessions/state-db.js +1145 -204
  196. package/dist/sessions/state-db.js.map +1 -1
  197. package/dist/sessions/state-saved.d.ts +1 -1
  198. package/dist/sessions/state-saved.js +35 -11
  199. package/dist/sessions/state-saved.js.map +1 -1
  200. package/dist/sessions/storage/backend.d.ts +171 -0
  201. package/dist/sessions/storage/backend.js +19 -0
  202. package/dist/sessions/storage/backend.js.map +1 -0
  203. package/dist/sessions/storage/conformance.d.ts +20 -0
  204. package/dist/sessions/storage/conformance.js +237 -0
  205. package/dist/sessions/storage/conformance.js.map +1 -0
  206. package/dist/sessions/storage/document.d.ts +16 -0
  207. package/dist/sessions/storage/document.js +44 -0
  208. package/dist/sessions/storage/document.js.map +1 -0
  209. package/dist/sessions/storage/json-documents.d.ts +25 -0
  210. package/dist/sessions/storage/json-documents.js +277 -0
  211. package/dist/sessions/storage/json-documents.js.map +1 -0
  212. package/dist/sessions/storage/json-files.d.ts +23 -0
  213. package/dist/sessions/storage/json-files.js +244 -0
  214. package/dist/sessions/storage/json-files.js.map +1 -0
  215. package/dist/sessions/storage/json-installation.d.ts +3 -0
  216. package/dist/sessions/storage/json-installation.js +31 -0
  217. package/dist/sessions/storage/json-installation.js.map +1 -0
  218. package/dist/sessions/storage/json-journal.d.ts +113 -0
  219. package/dist/sessions/storage/json-journal.js +756 -0
  220. package/dist/sessions/storage/json-journal.js.map +1 -0
  221. package/dist/sessions/storage/json-recovery.d.ts +4 -0
  222. package/dist/sessions/storage/json-recovery.js +195 -0
  223. package/dist/sessions/storage/json-recovery.js.map +1 -0
  224. package/dist/sessions/storage/json.d.ts +82 -0
  225. package/dist/sessions/storage/json.js +350 -0
  226. package/dist/sessions/storage/json.js.map +1 -0
  227. package/dist/sessions/storage/row.d.ts +6 -0
  228. package/dist/sessions/storage/row.js +49 -0
  229. package/dist/sessions/storage/row.js.map +1 -0
  230. package/dist/sessions/storage/search-text.d.ts +4 -0
  231. package/dist/sessions/storage/search-text.js +16 -0
  232. package/dist/sessions/storage/search-text.js.map +1 -0
  233. package/dist/sessions/store.d.ts +67 -73
  234. package/dist/sessions/store.js +341 -607
  235. package/dist/sessions/store.js.map +1 -1
  236. package/dist/sessions/streams.d.ts +12 -7
  237. package/dist/sessions/streams.js +58 -15
  238. package/dist/sessions/streams.js.map +1 -1
  239. package/dist/sessions/titles.js +1 -1
  240. package/dist/sessions/titles.js.map +1 -1
  241. package/dist/sessions/todo.d.ts +5 -0
  242. package/dist/sessions/todo.js +28 -21
  243. package/dist/sessions/todo.js.map +1 -1
  244. package/dist/sessions/tool-display.d.ts +8 -5
  245. package/dist/sessions/tool-display.js +28 -16
  246. package/dist/sessions/tool-display.js.map +1 -1
  247. package/dist/sessions/turn-context.d.ts +10 -1
  248. package/dist/sessions/turn-context.js +13 -6
  249. package/dist/sessions/turn-context.js.map +1 -1
  250. package/dist/sessions/turn.d.ts +110 -22
  251. package/dist/sessions/turn.js +918 -380
  252. package/dist/sessions/turn.js.map +1 -1
  253. package/dist/sessions/wakeup-pause.d.ts +8 -13
  254. package/dist/sessions/wakeup-pause.js +31 -49
  255. package/dist/sessions/wakeup-pause.js.map +1 -1
  256. package/dist/sessions/window.js +13 -12
  257. package/dist/sessions/window.js.map +1 -1
  258. package/dist/settings.d.ts +19 -7
  259. package/dist/settings.js +179 -183
  260. package/dist/settings.js.map +1 -1
  261. package/dist/sidecar/client.d.ts +41 -4
  262. package/dist/sidecar/client.js +192 -42
  263. package/dist/sidecar/client.js.map +1 -1
  264. package/dist/sidecar/discover.d.ts +2 -1
  265. package/dist/sidecar/discover.js +93 -10
  266. package/dist/sidecar/discover.js.map +1 -1
  267. package/dist/sidecar/env.d.ts +4 -0
  268. package/dist/sidecar/env.js +3 -0
  269. package/dist/sidecar/env.js.map +1 -0
  270. package/dist/sidecar/fake.d.ts +6 -2
  271. package/dist/sidecar/fake.js +34 -4
  272. package/dist/sidecar/fake.js.map +1 -1
  273. package/dist/spa.d.ts +9 -4
  274. package/dist/spa.js +36 -12
  275. package/dist/spa.js.map +1 -1
  276. package/dist/startup-timing.d.ts +66 -0
  277. package/dist/startup-timing.js +129 -0
  278. package/dist/startup-timing.js.map +1 -0
  279. package/dist/test/env-file.d.ts +5 -0
  280. package/dist/test/env-file.js +88 -0
  281. package/dist/test/env-file.js.map +1 -0
  282. package/dist/test/fs-handles.d.ts +11 -0
  283. package/dist/test/fs-handles.js +31 -0
  284. package/dist/test/fs-handles.js.map +1 -0
  285. package/dist/test/harness.d.ts +1 -0
  286. package/dist/test/harness.js +1 -1
  287. package/dist/test/harness.js.map +1 -1
  288. package/dist/test/passkeys.d.ts +22 -0
  289. package/dist/test/passkeys.js +62 -0
  290. package/dist/test/passkeys.js.map +1 -0
  291. package/dist/test/storage.d.ts +15 -0
  292. package/dist/test/storage.js +26 -0
  293. package/dist/test/storage.js.map +1 -0
  294. package/dist/tools/commands.d.ts +6 -1
  295. package/dist/tools/commands.js +8 -2
  296. package/dist/tools/commands.js.map +1 -1
  297. package/dist/tools/connectors.d.ts +33 -0
  298. package/dist/tools/connectors.js +121 -0
  299. package/dist/tools/connectors.js.map +1 -0
  300. package/dist/tools/crons.d.ts +46 -5
  301. package/dist/tools/crons.js +100 -26
  302. package/dist/tools/crons.js.map +1 -1
  303. package/dist/tools/dashboard-plugins.d.ts +34 -5
  304. package/dist/tools/dashboard-plugins.js +146 -14
  305. package/dist/tools/dashboard-plugins.js.map +1 -1
  306. package/dist/tools/extensions.d.ts +5 -4
  307. package/dist/tools/extensions.js +213 -207
  308. package/dist/tools/extensions.js.map +1 -1
  309. package/dist/tools/gateway-restart.d.ts +82 -0
  310. package/dist/tools/gateway-restart.js +222 -0
  311. package/dist/tools/gateway-restart.js.map +1 -0
  312. package/dist/tools/health.d.ts +28 -4
  313. package/dist/tools/health.js +171 -50
  314. package/dist/tools/health.js.map +1 -1
  315. package/dist/tools/hygiene.d.ts +4 -3
  316. package/dist/tools/hygiene.js +23 -9
  317. package/dist/tools/hygiene.js.map +1 -1
  318. package/dist/tools/insights.d.ts +1 -1
  319. package/dist/tools/insights.js +2 -2
  320. package/dist/tools/insights.js.map +1 -1
  321. package/dist/tools/kanban.d.ts +4 -2
  322. package/dist/tools/kanban.js +28 -19
  323. package/dist/tools/kanban.js.map +1 -1
  324. package/dist/tools/mcp-health.js +74 -24
  325. package/dist/tools/mcp-health.js.map +1 -1
  326. package/dist/tools/mcp.js +19 -1
  327. package/dist/tools/mcp.js.map +1 -1
  328. package/dist/tools/memory-masks.d.ts +5 -0
  329. package/dist/tools/memory-masks.js +256 -0
  330. package/dist/tools/memory-masks.js.map +1 -0
  331. package/dist/tools/memory.d.ts +29 -3
  332. package/dist/tools/memory.js +69 -27
  333. package/dist/tools/memory.js.map +1 -1
  334. package/dist/tools/plugin-oauth.d.ts +14 -0
  335. package/dist/tools/plugin-oauth.js +53 -0
  336. package/dist/tools/plugin-oauth.js.map +1 -0
  337. package/dist/tools/plugin-settings.d.ts +15 -0
  338. package/dist/tools/plugin-settings.js +90 -0
  339. package/dist/tools/plugin-settings.js.map +1 -0
  340. package/dist/tools/prune-advice.d.ts +50 -0
  341. package/dist/tools/prune-advice.js +114 -0
  342. package/dist/tools/prune-advice.js.map +1 -0
  343. package/dist/tools/skills.d.ts +13 -5
  344. package/dist/tools/skills.js +53 -19
  345. package/dist/tools/skills.js.map +1 -1
  346. package/dist/tools/update-notifications.d.ts +102 -17
  347. package/dist/tools/update-notifications.js +400 -82
  348. package/dist/tools/update-notifications.js.map +1 -1
  349. package/dist/tools/update-rollback.d.ts +11 -0
  350. package/dist/tools/update-rollback.js +28 -0
  351. package/dist/tools/update-rollback.js.map +1 -0
  352. package/dist/tools/updates.d.ts +100 -33
  353. package/dist/tools/updates.js +1085 -345
  354. package/dist/tools/updates.js.map +1 -1
  355. package/dist/util.d.ts +2 -0
  356. package/dist/util.js +5 -0
  357. package/dist/util.js.map +1 -1
  358. package/dist/workspace/git.d.ts +16 -1
  359. package/dist/workspace/git.js +291 -11
  360. package/dist/workspace/git.js.map +1 -1
  361. package/dist/workspace/media.d.ts +12 -9
  362. package/dist/workspace/media.js +98 -38
  363. package/dist/workspace/media.js.map +1 -1
  364. package/dist/workspace/preview.js +4 -14
  365. package/dist/workspace/preview.js.map +1 -1
  366. package/dist/workspace/rollback.d.ts +8 -4
  367. package/dist/workspace/rollback.js +22 -12
  368. package/dist/workspace/rollback.js.map +1 -1
  369. package/dist/workspace/workspaces.d.ts +15 -19
  370. package/dist/workspace/workspaces.js +55 -127
  371. package/dist/workspace/workspaces.js.map +1 -1
  372. package/dist/workspace/worktrees.js +170 -32
  373. package/dist/workspace/worktrees.js.map +1 -1
  374. package/package.json +6 -4
  375. package/sidecar/agent_dependency.json +4 -4
  376. package/sidecar/agent_support.json +29 -0
  377. package/sidecar/scripts/record-fixtures.py +12 -3
  378. package/sidecar/scripts/replay_sidecar.py +8 -0
  379. package/sidecar/scripts/suite_runner.py +458 -0
  380. package/sidecar/scripts/test.sh +11 -5
  381. package/sidecar/talaria_sidecar/__init__.py +6 -1
  382. package/sidecar/talaria_sidecar/__main__.py +13 -4
  383. package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
  384. package/sidecar/talaria_sidecar/agent_services.py +1116 -0
  385. package/sidecar/talaria_sidecar/context_detail.py +59 -0
  386. package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
  387. package/sidecar/talaria_sidecar/home.py +133 -14
  388. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  389. package/sidecar/talaria_sidecar/methods/aux.py +211 -41
  390. package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
  391. package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
  392. package/sidecar/talaria_sidecar/methods/commands.py +483 -13
  393. package/sidecar/talaria_sidecar/methods/config.py +195 -6
  394. package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
  395. package/sidecar/talaria_sidecar/methods/cron.py +374 -36
  396. package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
  397. package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
  398. package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
  399. package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
  400. package/sidecar/talaria_sidecar/methods/goals.py +81 -41
  401. package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
  402. package/sidecar/talaria_sidecar/methods/memory.py +84 -0
  403. package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
  404. package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
  405. package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
  406. package/sidecar/talaria_sidecar/methods/process.py +229 -16
  407. package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
  408. package/sidecar/talaria_sidecar/methods/providers.py +196 -26
  409. package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
  410. package/sidecar/talaria_sidecar/methods/skills.py +83 -5
  411. package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
  412. package/sidecar/talaria_sidecar/methods/stt.py +159 -78
  413. package/sidecar/talaria_sidecar/methods/text.py +14 -1
  414. package/sidecar/talaria_sidecar/methods/toolsets.py +51 -0
  415. package/sidecar/talaria_sidecar/methods/usage.py +113 -14
  416. package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
  417. package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
  418. package/sidecar/talaria_sidecar/rpc.py +70 -7
  419. package/sidecar/talaria_sidecar/runtime.py +122 -14
  420. package/sidecar/talaria_sidecar/speed.py +47 -0
  421. package/sidecar/talaria_sidecar/startup_timing.py +119 -0
  422. package/static/dist/FILES.txt +242 -215
  423. package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
  424. package/static/dist/assets/AppShell-3isgvoro.js +8 -0
  425. package/static/dist/assets/Button-f4n6dapf.js +1 -0
  426. package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
  427. package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
  428. package/static/dist/assets/Dialog-hta5utr3.js +1 -0
  429. package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
  430. package/static/dist/assets/Field-b6ez48oz.js +1 -0
  431. package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
  432. package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
  433. package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
  434. package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
  435. package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
  436. package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
  437. package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
  438. package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
  439. package/static/dist/assets/Select-kr07928w.js +1 -0
  440. package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
  441. package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
  442. package/static/dist/assets/States-icab19yg.js +1 -0
  443. package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
  444. package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
  445. package/static/dist/assets/_app-ga1moszl.js +1 -0
  446. package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
  447. package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
  448. package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
  449. package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
  450. package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
  451. package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
  452. package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
  453. package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
  454. package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
  455. package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
  456. package/static/dist/assets/_app.skills-n016rihd.js +1 -0
  457. package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
  458. package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
  459. package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
  460. package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
  461. package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
  462. package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
  463. package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
  464. package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
  465. package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
  466. package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
  467. package/static/dist/assets/archive-il7c6053.js +1 -0
  468. package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
  469. package/static/dist/assets/back-gu3nu279.js +1 -0
  470. package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
  471. package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
  472. package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
  473. package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
  474. package/static/dist/assets/cancel-bsnfo36u.js +1 -0
  475. package/static/dist/assets/channel-dsbtk01y.js +1 -0
  476. package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
  477. package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
  478. package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
  479. package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
  480. package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
  481. package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
  482. package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
  483. package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
  484. package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
  485. package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
  486. package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
  487. package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
  488. package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
  489. package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
  490. package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
  491. package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
  492. package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
  493. package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
  494. package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
  495. package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
  496. package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
  497. package/static/dist/assets/copied-bz3gkazh.js +1 -0
  498. package/static/dist/assets/copy-jo006coq.js +1 -0
  499. package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
  500. package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
  501. package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
  502. package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
  503. package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
  504. package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
  505. package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
  506. package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
  507. package/static/dist/assets/dagre-o5jmjz46.js +1 -0
  508. package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
  509. package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
  510. package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
  511. package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
  512. package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
  513. package/static/dist/assets/dist-crc46di9.js +7 -0
  514. package/static/dist/assets/dist-etpoyscq.js +44 -0
  515. package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
  516. package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
  517. package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
  518. package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
  519. package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
  520. package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
  521. package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
  522. package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
  523. package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
  524. package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
  525. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
  526. package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
  527. package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
  528. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
  529. package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
  530. package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
  531. package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
  532. package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
  533. package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
  534. package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
  535. package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
  536. package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
  537. package/static/dist/assets/host-fr6lni1p.js +1 -0
  538. package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
  539. package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
  540. package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
  541. package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
  542. package/static/dist/assets/index-73649w7o.js +10 -0
  543. package/static/dist/assets/index-lhf1fsdf.css +2 -0
  544. package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
  545. package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
  546. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
  547. package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
  548. package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
  549. package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
  550. package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
  551. package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
  552. package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
  553. package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
  554. package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
  555. package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
  556. package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
  557. package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
  558. package/static/dist/assets/katex-cbdd1ohw.css +1 -0
  559. package/static/dist/assets/katex-pbij2oo6.js +257 -0
  560. package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
  561. package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
  562. package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
  563. package/static/dist/assets/linear-jlwrvvy6.js +1 -0
  564. package/static/dist/assets/link-iadw4ghw.js +2 -0
  565. package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
  566. package/static/dist/assets/locale-cs-n41hptse.js +5 -0
  567. package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
  568. package/static/dist/assets/locale-es-ih078lco.js +5 -0
  569. package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
  570. package/static/dist/assets/locale-it-kb96jufy.js +5 -0
  571. package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
  572. package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
  573. package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
  574. package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
  575. package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
  576. package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
  577. package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
  578. package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
  579. package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
  580. package/static/dist/assets/login-lkhtzfcl.js +1 -0
  581. package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
  582. package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
  583. package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
  584. package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
  585. package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
  586. package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
  587. package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
  588. package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
  589. package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
  590. package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
  591. package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
  592. package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
  593. package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
  594. package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
  595. package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
  596. package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
  597. package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
  598. package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
  599. package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
  600. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
  601. package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
  602. package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
  603. package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
  604. package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
  605. package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
  606. package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
  607. package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
  608. package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
  609. package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
  610. package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
  611. package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
  612. package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
  613. package/static/dist/assets/registry-g7w3353u.js +1 -0
  614. package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
  615. package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
  616. package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
  617. package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
  618. package/static/dist/assets/runtime-nlxpnegr.js +1 -0
  619. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
  620. package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
  621. package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
  622. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
  623. package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
  624. package/static/dist/assets/share._token-o76ki0ly.js +2 -0
  625. package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
  626. package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
  627. package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
  628. package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
  629. package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
  630. package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
  631. package/static/dist/assets/src-h89s0hs4.js +1 -0
  632. package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
  633. package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
  634. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
  635. package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
  636. package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
  637. package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
  638. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
  639. package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
  640. package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
  641. package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
  642. package/static/dist/assets/toast-liparz2j.js +56 -0
  643. package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
  644. package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
  645. package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
  646. package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
  647. package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
  648. package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
  649. package/static/dist/assets/untitled-mj86r4gz.js +1 -0
  650. package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
  651. package/static/dist/assets/useForm-o4uu74mx.js +1 -0
  652. package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
  653. package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
  654. package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
  655. package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
  656. package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
  657. package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
  658. package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
  659. package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
  660. package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
  661. package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
  662. package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
  663. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
  664. package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
  665. package/static/dist/extension-sdk.js +1 -1
  666. package/static/dist/index.html +1 -1
  667. package/static/dist/sw.js +180 -136
  668. package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
  669. package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
  670. package/static/dist/assets/Dialog-g355qxhp.js +0 -1
  671. package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
  672. package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
  673. package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
  674. package/static/dist/assets/Markdown-lwviulmg.css +0 -1
  675. package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
  676. package/static/dist/assets/Select-kddq75qc.js +0 -1
  677. package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
  678. package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
  679. package/static/dist/assets/States-eq6fe29m.js +0 -1
  680. package/static/dist/assets/Toaster-pc247u9f.js +0 -1
  681. package/static/dist/assets/_app-f8n1i0m1.js +0 -1
  682. package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +0 -1
  683. package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
  684. package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
  685. package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
  686. package/static/dist/assets/_app.logs-i69qds98.js +0 -1
  687. package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
  688. package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
  689. package/static/dist/assets/_app.session._sessionId-fn1bhde6.js +0 -1
  690. package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
  691. package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
  692. package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
  693. package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
  694. package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
  695. package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
  696. package/static/dist/assets/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
  697. package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
  698. package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
  699. package/static/dist/assets/back-h7aun7ew.js +0 -1
  700. package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
  701. package/static/dist/assets/channel-b2zo73z1.js +0 -1
  702. package/static/dist/assets/chunk-DU6HZSFF-ofajdixh.js +0 -128
  703. package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
  704. package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
  705. package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
  706. package/static/dist/assets/copied-hcplv46p.js +0 -1
  707. package/static/dist/assets/copy-magtofyp.js +0 -1
  708. package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
  709. package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
  710. package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
  711. package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
  712. package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
  713. package/static/dist/assets/dagre-lkoknbjn.js +0 -1
  714. package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
  715. package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
  716. package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
  717. package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
  718. package/static/dist/assets/endpoints-klbxod4t.js +0 -64
  719. package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
  720. package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
  721. package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
  722. package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
  723. package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.js +0 -1
  724. package/static/dist/assets/host-i828xuo7.js +0 -1
  725. package/static/dist/assets/index-eh8zilnv.css +0 -2
  726. package/static/dist/assets/index-r648f4o1.js +0 -11
  727. package/static/dist/assets/info-A6RAGUB7-h11x0dxo.js +0 -1
  728. package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
  729. package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
  730. package/static/dist/assets/linear-becwlnhk.js +0 -1
  731. package/static/dist/assets/link-oot2yn73.js +0 -1
  732. package/static/dist/assets/login-gu28l9ou.js +0 -1
  733. package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
  734. package/static/dist/assets/mermaid-parser.core-ntne45i9.js +0 -7
  735. package/static/dist/assets/not-found-ccnnac39.js +0 -1
  736. package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
  737. package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
  738. package/static/dist/assets/packet-AYTQ26CC-l6jdka8p.js +0 -1
  739. package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
  740. package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
  741. package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
  742. package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
  743. package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.js +0 -1
  744. package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
  745. package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
  746. package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
  747. package/static/dist/assets/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
  748. package/static/dist/assets/refresh-abtu93ke.js +0 -1
  749. package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
  750. package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
  751. package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
  752. package/static/dist/assets/root-mbklpuv4.js +0 -1
  753. package/static/dist/assets/saved-girnabkf.js +0 -1
  754. package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
  755. package/static/dist/assets/share._token-kl0r7ido.js +0 -2
  756. package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
  757. package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
  758. package/static/dist/assets/src-hjyib4mu.js +0 -1
  759. package/static/dist/assets/sse-iwku0sjo.js +0 -1
  760. package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
  761. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
  762. package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.js +0 -1
  763. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
  764. package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
  765. package/static/dist/assets/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
  766. package/static/dist/assets/treemap-WGGIJYW6-nl85071a.js +0 -1
  767. package/static/dist/assets/units-kgxzxfhi.js +0 -1
  768. package/static/dist/assets/untitled-cikfjntn.js +0 -1
  769. package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
  770. package/static/dist/assets/useLocale-o59tbiea.js +0 -1
  771. package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
  772. package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
  773. package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
  774. /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
@@ -1,6 +1,6 @@
1
1
  /**
2
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
3
+ * a shrink backup before any save that shrinks a transcript; the audit classifies every backup, index row, WebUI-origin
4
4
  * state.db row without a sidecar, and pending turn-journal entry as `repairable` or `unsafe_to_repair`, and safe repair
5
5
  * restores, materializes, and reindexes only what is repairable.
6
6
  *
@@ -9,141 +9,42 @@
9
9
  * `recovery_stamping_since` marker may predate that provenance, so next to a readable live transcript it goes to manual
10
10
  * review instead.
11
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';
12
+ import { existsSync } from 'node:fs';
13
+ import { DatabaseSync } from 'node:sqlite';
14
+ import { updateDocument } from './storage/document.js';
15
15
  import { str } from '../util.js';
16
- import { isContextCompressionMarker } from './merge.js';
17
16
  import { isSafeSessionId, Session } from './session.js';
18
- import { normalizeAgentSessionSource, openStateDbReadonly } from './state-db.js';
19
- const STAMPING_MARKER = 'recovery_stamping_since';
17
+ import { normalizeAgentSessionSource } from './state-db.js';
20
18
  /** Python `STATE_DB_RECOVERY_BUSY_TIMEOUT_MS`: a recovery scan waits out a writer rather than read a lock as "nothing missing". */
21
19
  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
20
  const TERMINAL_TURN_EVENTS = new Set(['completed', 'interrupted']);
21
+ const createdAt = (event) => { const value = Number(event.created_at ?? 0); return Number.isFinite(value) ? value : 0; };
26
22
  const WORKTREE_FIELDS = ['worktree_path', 'worktree_branch', 'worktree_repo_root', 'worktree_created_at'];
27
- let tmpCounter = 0;
28
23
  const isDict = (v) => Boolean(v) && typeof v === 'object' && !Array.isArray(v);
29
- const isEmptyList = (v) => Array.isArray(v) && v.length === 0;
30
24
  /**
31
25
  * Epoch seconds since which this server stamps every deliberate shrink, recorded in the state directory on first start.
32
26
  * A missing or unreadable marker is recorded anew: a later marker only sends more backups to manual review.
33
27
  */
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' };
28
+ export async function recoveryStampingSince(documents) {
29
+ return (await updateDocument(documents, 'recovery', 'stamping-since', (value) => {
30
+ const stored = Number(typeof value === 'string' ? value.trim() : '');
31
+ if (Number.isFinite(stored) && stored > 0)
32
+ return { value, result: stored };
33
+ const now = Date.now() / 1000;
34
+ return { value: `${String(now)}\n`, result: now };
35
+ }, { replaceInvalid: true }));
135
36
  }
136
37
  function columns(db, table) {
137
38
  return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((r) => r.name));
138
39
  }
139
40
  /** Python `_read_state_db_missing_sidecar_rows` (with empty rows) plus the session ids, from one read-only handle. */
140
- function readStateDb(path, sessionDir) {
41
+ function readStateDb(path, persisted) {
141
42
  const absent = { has: () => true, missing: [], unreadable: false };
142
43
  if (!existsSync(path))
143
44
  return absent;
144
45
  let db;
145
46
  try {
146
- db = openStateDbReadonly(path, STATE_DB_RECOVERY_BUSY_TIMEOUT_MS);
47
+ db = new DatabaseSync(path, { readOnly: true, timeout: STATE_DB_RECOVERY_BUSY_TIMEOUT_MS });
147
48
  }
148
49
  catch {
149
50
  return { ...absent, unreadable: true };
@@ -166,7 +67,7 @@ function readStateDb(path, sessionDir) {
166
67
  : null;
167
68
  for (const row of rows) {
168
69
  const sid = str(row.id).trim();
169
- if (!isSafeSessionId(sid) || existsSync(join(sessionDir, `${sid}.json`)))
70
+ if (!isSafeSessionId(sid) || persisted.has(sid))
170
71
  continue;
171
72
  const transcript = (messages?.all(sid) ?? []).map((m) => ({ role: m.role, content: m.content || '', ...(m.timestamp !== null ? { timestamp: m.timestamp } : {}) }));
172
73
  view.missing.push({ ...row, id: sid, messages: transcript });
@@ -181,7 +82,7 @@ function readStateDb(path, sessionDir) {
181
82
  }
182
83
  }
183
84
  /** Python `_state_db_row_to_sidecar`, through `Session` so the document matches every field the store persists. */
184
- function sidecarFromStateDbRow(row, store, profile) {
85
+ async function sidecarFromStateDbRow(row, store, profile) {
185
86
  const source = 'webui'; // the scan reads only WebUI-origin rows
186
87
  const started = Number(row.started_at) || 0;
187
88
  const last = Number(row.messages.at(-1)?.timestamp) || 0;
@@ -191,60 +92,10 @@ function sidecarFromStateDbRow(row, store, profile) {
191
92
  session_id: row.id, title: str(row.title) || 'Recovered WebUI Session', ...workspace, model: str(row.model) || 'unknown', profile,
192
93
  created_at: started, updated_at: last || started, parent_session_id: row.parent_session_id ?? null, ...worktree,
193
94
  source_tag: source, ...normalizeAgentSessionSource(source), messages: row.messages,
194
- }, store.deps.defaults(profile));
95
+ }, (await store.deps.defaults(profile)));
195
96
  return session.toDocument();
196
97
  }
197
98
  // ── 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
99
  /** What a turn sent: its trimmed text and attachment names, or null when it sent nothing identifiable. */
249
100
  function turnKey(content, attachments) {
250
101
  const text = str(content || '').trim();
@@ -258,7 +109,7 @@ const TURN_ROW_CLOCK_SLACK_S = 5;
258
109
  * turn's id (or stream id) is that turn; otherwise rows and turns with the same text and attachments pair up in order,
259
110
  * one row per turn, so a repeated message ("continue") or an attachment-only turn still counts as missing.
260
111
  */
261
- function pendingJournalTurns(sessionDir, sid, events) {
112
+ function pendingJournalTurns(live, sid, events) {
262
113
  const turns = new Map();
263
114
  for (const event of events) {
264
115
  const id = str(event.turn_id).trim();
@@ -275,7 +126,6 @@ function pendingJournalTurns(sessionDir, sid, events) {
275
126
  }
276
127
  if (!turns.size)
277
128
  return [];
278
- const live = readDoc(join(sessionDir, `${sid}.json`));
279
129
  const rows = (Array.isArray(live?.messages) ? live.messages : []).filter((m) => isDict(m) && m.role === 'user');
280
130
  const rowTurnIds = new Set(rows.map((m) => str(m._turn_id)).filter(Boolean));
281
131
  const journaled = new Set([...turns.values()].flatMap((t) => [...t.ids]));
@@ -294,7 +144,7 @@ function pendingJournalTurns(sessionDir, sid, events) {
294
144
  for (const turn of [...missing].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {
295
145
  if (TERMINAL_TURN_EVENTS.has(str(turn.latest.event)))
296
146
  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) });
147
+ items.push({ ...item(sid, 'turn_journal_pending_turn', 'repairable', 'audit_only_pending_turn_journal', Array.isArray(live?.messages) ? live.messages.length : -1), turn_id: turn.id, event: str(turn.latest.event) });
298
148
  }
299
149
  return items;
300
150
  }
@@ -302,57 +152,51 @@ function pendingJournalTurns(sessionDir, sid, events) {
302
152
  function item(session_id, kind, category, recommendation, live_messages = -1, bak_messages = -1) {
303
153
  return { session_id, kind, category, recommendation, live_messages, bak_messages };
304
154
  }
305
- function scan(deps) {
306
- const dir = deps.store.sessionDir;
307
- let names = [];
308
- try {
309
- names = readdirSync(dir).sort();
155
+ async function scan(deps) {
156
+ const persisted = await deps.store.persistedIds();
157
+ return { liveIds: [...persisted].sort(), issues: await deps.store.diagnose(), db: readStateDb(deps.stateDbPath, persisted), tombstoned: await deps.store.loadDeletedTombstone() };
158
+ }
159
+ async function readOnlyRecovery(deps, sid, profile) {
160
+ if (profile === undefined) {
161
+ try {
162
+ profile = (await deps.store.loadMetadataOnly(sid))?.profile ?? deps.profile;
163
+ }
164
+ catch {
165
+ profile = deps.profile;
166
+ }
310
167
  }
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() };
168
+ return await deps.isReadOnly(sid, profile);
314
169
  }
315
- /** Python `audit_session_recovery`: a read-only classification of every recovery finding. */
316
- export function auditSessionRecovery(deps) {
317
- const s = scan(deps);
170
+ export async function auditSessionRecovery(deps) {
171
+ const s = await scan(deps);
318
172
  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
173
  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'));
174
+ for (const issue of s.issues) {
175
+ const { profile } = issue;
176
+ const finding = { ...issue };
177
+ delete finding.profile;
178
+ delete finding.revision;
179
+ delete finding.backupRevision;
180
+ if (finding.kind === 'index_missing_file' && s.tombstoned.has(finding.session_id))
181
+ continue;
182
+ if (finding.kind === 'orphan_backup') {
183
+ if (s.tombstoned.has(finding.session_id)) {
184
+ reportedDeleted.add(finding.session_id);
185
+ finding.kind = 'state_db_deleted_webui_tombstone';
186
+ finding.category = 'unsafe_to_repair';
187
+ finding.recommendation = 'deleted_session_skipped';
188
+ }
189
+ else if (!s.db.has(finding.session_id)) {
190
+ finding.kind = 'orphan_backup_without_state_row';
191
+ finding.category = 'unsafe_to_repair';
192
+ finding.recommendation = 'manual_review';
193
+ }
346
194
  }
347
- catch {
348
- items.push(item('', 'index_unreadable', 'repairable', 'rebuild_index'));
195
+ if (finding.recommendation === 'restore_from_bak' && await readOnlyRecovery(deps, finding.session_id, profile)) {
196
+ finding.category = 'unsafe_to_repair';
197
+ finding.recommendation = 'manual_review';
349
198
  }
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`)))));
199
+ items.push(finding);
356
200
  }
357
201
  for (const row of s.db.missing) {
358
202
  if (reportedDeleted.has(row.id))
@@ -366,72 +210,49 @@ export function auditSessionRecovery(deps) {
366
210
  }
367
211
  if (s.db.unreadable)
368
212
  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.
213
+ for (const [sid, events] of await deps.store.deps.storage.journals.recoveryEvents()) {
214
+ let doc = null;
394
215
  try {
395
- linkSync(tmp, target);
396
- return true;
397
- }
398
- catch (error) {
399
- if (error.code === 'EEXIST')
400
- return false;
401
- throw error;
216
+ if (await deps.store.exists(sid))
217
+ doc = { messages: await deps.store.readMessages(sid, { start: 0, end: Infinity }) };
402
218
  }
219
+ catch { /* corrupt */ }
220
+ items.push(...pendingJournalTurns(doc, sid, events));
403
221
  }
404
- finally {
405
- try {
406
- unlinkSync(tmp);
222
+ for (const finding of items)
223
+ if (finding.recommendation === 'materialize_from_state_db' && await readOnlyRecovery(deps, finding.session_id)) {
224
+ finding.category = 'unsafe_to_repair';
225
+ finding.recommendation = 'manual_review';
407
226
  }
408
- catch { /* renamed */ }
409
- }
227
+ const summary = { ok: s.liveIds.length, repairable: 0, unsafe_to_repair: 0 };
228
+ for (const i of items)
229
+ summary[i.category] += 1;
230
+ return { status: summary.unsafe_to_repair ? 'needs_manual_review' : summary.repairable ? 'warn' : 'ok', summary, items };
410
231
  }
411
- /** A resident session with a live turn would overwrite any restored file on its next save. */
412
232
  function busy(store, sid) {
413
233
  const s = store.sessions.get(sid);
414
234
  return Boolean(s && (s.active_stream_id || s.pending_user_message || s.pending_started_at));
415
235
  }
416
- /** Restore shrunken and orphaned sidecars from their backups, each re-checked under the session lock. */
417
236
  async function restoreBackups(deps, s) {
418
237
  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);
238
+ const orphans = s.issues.filter((i) => i.kind === 'orphan_backup' && !s.tombstoned.has(i.session_id) && s.db.has(i.session_id));
421
239
  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)))
240
+ for (const issue of [...s.issues.filter((i) => i.kind === 'shrunken_live'), ...orphans]) {
241
+ const sid = issue.session_id;
242
+ await store.withLock(sid, async () => {
243
+ if (!await store.exists(sid) && await store.wasDeleted(sid))
244
+ return;
245
+ const counts = { live_messages: issue.live_messages, bak_messages: issue.bak_messages };
246
+ if (await readOnlyRecovery(deps, sid, issue.profile)) {
247
+ result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'read_only' });
427
248
  return;
428
- const counts = { live_messages: status.live_messages, bak_messages: status.bak_messages };
249
+ }
429
250
  if (busy(store, sid)) {
430
251
  result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'session_active' });
431
252
  return;
432
253
  }
433
254
  try {
434
- if (!publish(path, readFileSync(`${path}.bak`, 'utf8'), !existsSync(path))) {
255
+ if (!await store.repair(issue)) {
435
256
  result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'sidecar_appeared' });
436
257
  return;
437
258
  }
@@ -440,66 +261,62 @@ async function restoreBackups(deps, s) {
440
261
  result.details.push({ session_id: sid, restored: false, ...counts, error: error.message });
441
262
  return;
442
263
  }
443
- store.sessions.delete(sid);
444
- store.invalidatePersistedIds();
445
264
  result.restored += 1;
446
265
  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)`);
266
+ deps.log(`[webui] WARNING: session recovery restored ${sid} from its backup (live=${String(issue.live_messages)} -> bak=${String(issue.bak_messages)} messages)`);
448
267
  });
449
268
  }
450
269
  return result;
451
270
  }
452
- /** Python `recover_missing_sidecars_from_state_db`: create each missing WebUI sidecar that state.db can rebuild. */
453
271
  async function materializeSidecars(deps, s) {
454
272
  const { store } = deps;
455
273
  const rows = s.db.missing.filter((row) => row.messages.length && !s.tombstoned.has(row.id));
456
274
  const result = { scanned: rows.length, materialized: 0, details: [] };
457
275
  for (const row of rows) {
458
- await store.withLock(row.id, () => {
459
- if (store.wasDeleted(row.id))
276
+ await store.withLock(row.id, async () => {
277
+ if (await store.wasDeleted(row.id))
278
+ return;
279
+ if (await readOnlyRecovery(deps, row.id)) {
280
+ result.details.push({ session_id: row.id, materialized: false, skipped: 'read_only' });
460
281
  return;
282
+ }
461
283
  if (busy(store, row.id)) {
462
284
  result.details.push({ session_id: row.id, materialized: false, skipped: 'session_active' });
463
285
  return;
464
286
  }
465
287
  try {
466
- mkdirSync(s.dir, { recursive: true });
467
- if (!publish(store.pathFor(row.id), JSON.stringify(sidecarFromStateDbRow(row, store, deps.profile), null, 2), true)) {
288
+ if (await store.exists(row.id)) {
468
289
  result.details.push({ session_id: row.id, materialized: false, skipped: 'sidecar_appeared_during_reconcile' });
469
290
  return;
470
291
  }
292
+ await store.save(new Session((await sidecarFromStateDbRow(row, store, deps.profile)), (await store.deps.defaults(deps.profile))), { touchUpdatedAt: false, skipIndex: true });
471
293
  }
472
294
  catch (error) {
473
295
  result.details.push({ session_id: row.id, materialized: false, error: error.message });
474
296
  return;
475
297
  }
476
298
  store.sessions.delete(row.id);
477
- store.invalidatePersistedIds();
478
299
  result.materialized += 1;
479
300
  result.details.push({ session_id: row.id, materialized: true, messages: row.messages.length });
480
301
  });
481
302
  }
482
303
  return result;
483
304
  }
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
305
  export async function repairSafeSessionRecovery(deps) {
489
- const before = auditSessionRecovery(deps);
490
- const s = scan(deps);
306
+ const before = await auditSessionRecovery(deps);
307
+ const s = await scan(deps);
491
308
  const backupRepair = await restoreBackups(deps, s);
492
309
  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)) {
310
+ const reindex = backupRepair.restored || sidecarRepair.materialized || !await deps.store.hasIndex() || before.items.some((i) => i.recommendation === 'rebuild_index');
311
+ if (reindex) {
495
312
  try {
496
- deps.store.rebuildIndex({ diskOnly: true });
313
+ await deps.store.rebuildIndex({ diskOnly: true });
497
314
  }
498
315
  catch (error) {
499
316
  deps.log(`[webui] WARNING: session recovery index rebuild failed: ${error.message}`);
500
317
  }
501
318
  }
502
- const after = auditSessionRecovery(deps);
319
+ const after = await auditSessionRecovery(deps);
503
320
  const clean = after.summary.repairable === 0 && after.summary.unsafe_to_repair === 0;
504
321
  return { clean, ok: clean, repaired: backupRepair.restored + sidecarRepair.materialized, before, backup_repair: backupRepair, sidecar_repair: sidecarRepair, after };
505
322
  }