@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
package/dist/runtime.js CHANGED
@@ -1,6 +1,11 @@
1
+ /**
2
+ * Assemble the application dependencies for one state directory. Used by the
3
+ * launcher and by tests, which pass a temp directory and a fixed environment.
4
+ */
5
+ import { SIDECAR_METHODS } from '@maudecode/talaria-web-contracts';
1
6
  import { AsyncLocalStorage } from 'node:async_hooks';
2
7
  import { pinnedFetch, systemDnsLookup } from './http/pinned.js';
3
- import { mkdirSync, readFileSync } from 'node:fs';
8
+ import { mkdirSync, readdirSync, readFileSync } from 'node:fs';
4
9
  import { resolve } from 'node:path';
5
10
  import { AuthStore } from './auth/store.js';
6
11
  import { OidcService } from './auth/oidc.js';
@@ -9,20 +14,23 @@ import { PresenceLeases, RelayService } from './sessions/relay.js';
9
14
  import { CliSessionSource } from './sessions/cli-sessions.js';
10
15
  import { ClaudeCodeSessionSource, claudeCodeProjectsDir } from './sessions/claude-code.js';
11
16
  import { GatewayWatcherRegistry } from './sessions/gateway-watcher.js';
17
+ import { GatewaySessions, gatewayStreamVisible } from './sessions/gateway-sessions.js';
12
18
  import { readImportableAgentSessionRowsAsync } from './sessions/state-db.js';
13
19
  import { CompletionDrain } from './sessions/completions.js';
14
20
  import { BackgroundActivity, BackgroundTaskStore } from './sessions/background-tasks.js';
15
21
  import { HygieneTicker } from './tools/hygiene.js';
22
+ import { PruneAdvice } from './tools/prune-advice.js';
16
23
  import { McpHealthProber } from './tools/mcp-health.js';
17
24
  import { loadConfig, truthy } from './config.js';
18
25
  import { checkoutRevision, detectWebuiVersion, loadReleaseInfo } from './release.js';
19
- import { ghcrExperimental, githubJson, normalizeChannel, purgePycache, UpdateService, waitUntilRestartSafe } from './tools/updates.js';
26
+ import { gatewayDrainDetail, ghcrExperimental, githubJson, normalizeChannel, purgePycache, UpdateService, waitUntilRestartSafe } from './tools/updates.js';
20
27
  import { UpdateNotificationStore } from './tools/update-notifications.js';
21
28
  import { RESTART_EXIT_CODE } from './cli/supervise.js';
22
29
  import { displayBotName, pyBool, SettingsStore } from './settings.js';
23
30
  import { AssetCache, SpaShell } from './spa.js';
24
31
  import { StartupGate } from './startup.js';
25
32
  import { SessionStore } from './sessions/store.js';
33
+ import { JsonStorage } from './sessions/storage/json.js';
26
34
  import { DraftStore } from './sessions/drafts.js';
27
35
  import { SessionEventBus } from './sessions/events.js';
28
36
  import { ShareStore } from './sessions/shares.js';
@@ -40,9 +48,8 @@ import { EscapeGrants } from './workspace/escape.js';
40
48
  import { TurnRunner } from './sessions/turn.js';
41
49
  import { SessionChannels, StreamRegistry } from './sessions/streams.js';
42
50
  import { PendingPrompts } from './sessions/pending.js';
43
- import { RunJournal } from './sessions/journal.js';
44
51
  import { StreamSlots } from './api/sse-routes.js';
45
- import { AgentConfig, coerceProviderCostBudgetValue, dict as asDict, parseProviderQualifiedModel } from './config/agent-config.js';
52
+ import { AgentConfig, showReasoning, coerceProviderCostBudgetValue, dict as asDict, modelBaseUrl, parseProviderQualifiedModel } from './config/agent-config.js';
46
53
  import { ProviderCatalog } from './providers/catalog.js';
47
54
  import { containedProfileHome, escapedProfileMessage, ProfileError, ProfileService } from './profiles/profiles.js';
48
55
  import { Onboarding } from './onboarding.js';
@@ -53,7 +60,8 @@ import { CronService } from './tools/crons.js';
53
60
  import { KanbanService } from './tools/kanban.js';
54
61
  import { DashboardPlugins } from './tools/dashboard-plugins.js';
55
62
  import { ExtensionService } from './tools/extensions.js';
56
- import { dashboardStatus } from './tools/health.js';
63
+ import { dashboardStatus, gatewayRestartBlockers, liveGateways } from './tools/health.js';
64
+ import { GatewayRestartQueue, restartGateway } from './tools/gateway-restart.js';
57
65
  import { TerminalRegistry } from './tools/terminal.js';
58
66
  export function packageVersion() {
59
67
  try {
@@ -63,40 +71,44 @@ export function packageVersion() {
63
71
  return undefined;
64
72
  }
65
73
  }
66
- export function createDeps(opts) {
74
+ export async function createDeps(opts) {
67
75
  const log = opts.log ?? ((line) => { console.log(line); });
68
76
  const config = loadConfig(opts);
69
77
  const env = config.env;
70
78
  mkdirSync(config.stateDir, { recursive: true });
71
79
  mkdirSync(config.sessionDir, { recursive: true });
72
- const settings = new SettingsStore({ file: config.settingsFile, env, stateDir: config.stateDir, defaultWorkspace: config.defaultWorkspace, botName: config.botName, log });
73
80
  const now = opts.now ?? (() => Date.now() / 1000);
74
- const passkeys = new PasskeyStore(config.stateDir, now);
81
+ const storage = opts.storage?.(config) ?? createStorage(config, now, (name) => profileHome(name));
82
+ const settings = new SettingsStore({ documents: storage.documents, env, stateDir: config.stateDir, defaultWorkspace: config.defaultWorkspace, botName: config.botName, log });
83
+ await settings.load();
84
+ const passkeys = new PasskeyStore(storage.documents, now);
75
85
  // Resolved below once the sidecar-backed config store exists; the auth store reads it lazily.
76
86
  let oidc = null;
77
87
  let operatorConfigPeek = () => null;
78
88
  const auth = new AuthStore({
79
- stateDir: config.stateDir, env, settings, log, now,
80
- passkeysEnabled: () => passkeys.available(),
89
+ documents: storage.documents, env, settings, log, now,
90
+ passkeysEnabled: async () => (await passkeys.available()),
81
91
  oidcEnabled: () => oidc?.enabledSync() ?? false,
82
92
  oidcAvailable: () => oidc?.availableSync() ?? false,
83
93
  oidcProbe: () => oidc?.resolve() ?? Promise.resolve(),
84
94
  passkeyConfigFlag: () => { const cfg = operatorConfigPeek(); return cfg === null ? null : cfg.webui_passkey_enabled; },
85
95
  });
96
+ await auth.initialize();
86
97
  settings.hooks = {
87
- hashPassword: (pw) => auth.hashPassword(pw),
98
+ hashPassword: async (pw) => (await auth.hashPassword(pw)),
88
99
  onPasswordChanged: () => { auth.invalidatePasswordHashCache(); },
89
100
  };
90
- settings.applyStartupWorkspace();
101
+ await settings.applyStartupWorkspace();
91
102
  config.defaultWorkspace = settings.defaultWorkspace;
92
103
  const release = loadReleaseInfo({ webRoot: config.webRoot });
93
104
  const stampedRelease = loadReleaseInfo({ webRoot: config.webRoot }, { verifyCheckout: false });
94
105
  const runningSourceRevision = checkoutRevision(config.webRoot);
95
106
  // Container images bake `TALARIA_WEB_VERSION` (Python `api/_version.py`) because .git is not shipped.
96
107
  const version = opts.version ?? detectWebuiVersion(release, config.webRoot, (env.TALARIA_WEB_VERSION ?? '').trim() || packageVersion());
97
- const updateNotifications = new UpdateNotificationStore(config.stateDir, () => new Date(now() * 1000));
108
+ const updateNotifications = new UpdateNotificationStore(storage.documents, () => new Date(now() * 1000));
109
+ await updateNotifications.initialize();
98
110
  const verifiedRunningVersion = /^web-(?:exp-)?v\d+\.\d+\.\d+$/.test(version) ? version : null;
99
- updateNotifications.reconcileInterruptedUpdates(runningSourceRevision ?? release.sourceRevision, verifiedRunningVersion);
111
+ await updateNotifications.reconcileInterruptedUpdates(runningSourceRevision ?? release.sourceRevision, verifiedRunningVersion);
100
112
  const home = opts.home ?? config.homeDir;
101
113
  const PROFILE_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
102
114
  // Python `init_profile_state` + `switch_profile(process_wide=False)`: the sticky `~/.hermes/active_profile` is
@@ -128,7 +140,7 @@ export function createDeps(opts) {
128
140
  if (profile && !isRootProfile(profile))
129
141
  return profile.charAt(0).toUpperCase() + profile.slice(1);
130
142
  try {
131
- return displayBotName(settings.load().bot_name);
143
+ return displayBotName(settings.peek().bot_name);
132
144
  }
133
145
  catch {
134
146
  return displayBotName(null);
@@ -147,11 +159,38 @@ export function createDeps(opts) {
147
159
  throw new ProfileError(escapedProfileMessage(name), 400);
148
160
  return contained;
149
161
  };
162
+ const profileNames = () => {
163
+ let names;
164
+ try {
165
+ names = readdirSync(join(baseHome, 'profiles'));
166
+ }
167
+ catch (error) {
168
+ if (error.code !== 'ENOENT')
169
+ throw error;
170
+ names = [];
171
+ }
172
+ return names.filter((name) => PROFILE_RE.test(name));
173
+ };
174
+ const agentHomes = () => {
175
+ if (isolatedProfileMode())
176
+ return [baseHome];
177
+ return [...new Set([baseHome, ...profileNames().map(profileHome)])];
178
+ };
179
+ /** Every Agent profile with its home, the root as `default`; a named home outside the profiles root is left out. */
180
+ const agentProfiles = () => {
181
+ if (isolatedProfileMode())
182
+ return [{ name: isolatedProfileName(), home: baseHome }];
183
+ return [{ name: 'default', home: baseHome }, ...profileNames().flatMap((name) => {
184
+ const home = containedProfileHome(baseHome, name);
185
+ return home === null ? [] : [{ name, home }];
186
+ })];
187
+ };
150
188
  const attachmentRoot = () => {
151
189
  const override = (env.HERMES_WEBUI_ATTACHMENT_DIR ?? '').trim();
152
190
  return resolvePathLikePython(override ? override.replace(/^~(?=$|\/)/, home) : join(config.stateDir, 'attachments'));
153
191
  };
154
192
  const sidecar = opts.sidecar ?? null;
193
+ const pruneAdvice = new PruneAdvice({ sidecar: () => deps.sidecar(), profiles: agentProfiles, lease: (name) => deps.profiles.beginWrite(name), notifications: updateNotifications, now, log });
155
194
  const agentConfig = new AgentConfig({ sidecar: () => sidecar, env });
156
195
  /** A profile's config.yaml `model` as [model, provider] as written; '' / null when unset or not yet read. */
157
196
  const profileDefaultModel = (profile) => {
@@ -168,12 +207,12 @@ export function createDeps(opts) {
168
207
  return [typeof d === 'string' ? d.trim() : '', typeof p === 'string' && p ? p : null];
169
208
  };
170
209
  const events = new SessionEventBus(isRootProfile);
171
- const drafts = new DraftStore(config.sessionDir);
172
- const registry = new StreamRegistry();
210
+ const drafts = new DraftStore(storage.documents);
211
+ const registry = new StreamRegistry((id) => gatewayStreamVisible(id, profileHome(activeProfile())));
173
212
  const activeStreamIds = registry.liveIds;
174
213
  const runningCronJobs = new Map();
175
214
  const workspaces = new WorkspaceRegistry({
176
- stateDir: config.stateDir,
215
+ documents: storage.documents,
177
216
  defaultWorkspace: () => config.defaultWorkspace,
178
217
  profileHome,
179
218
  activeProfile,
@@ -192,34 +231,34 @@ export function createDeps(opts) {
192
231
  return Number.isFinite(raw) && raw >= 1 ? raw : 100;
193
232
  };
194
233
  const store = new SessionStore({
195
- sessionDir: config.sessionDir,
234
+ storage,
196
235
  drafts,
197
236
  events,
198
237
  // Python `_profile_default_model_state`: the profile's own config.yaml model, else the global default. The provider
199
238
  // always comes with its model, so a provider-only profile never pairs with another profile's model.
200
- defaults: (profile) => {
239
+ defaults: async (profile) => {
201
240
  let [model, provider] = profileDefaultModel(profile);
202
241
  if (!model) {
203
- const s = settings.load();
242
+ const s = settings.peek();
204
243
  model = typeof s.default_model === 'string' ? s.default_model : '';
205
244
  provider = model && typeof s.default_model_provider === 'string' && s.default_model_provider ? s.default_model_provider : null;
206
245
  }
207
246
  const [bare, modelProvider] = parseProviderQualifiedModel(model) ?? [model || null, provider];
208
- return { workspace: workspaces.lastWorkspace(profile), model: bare, modelProvider };
247
+ return { workspace: (await workspaces.lastWorkspace(profile)), model: bare, modelProvider };
209
248
  },
210
249
  activeStreamIds: () => activeStreamIds,
211
250
  now,
212
251
  log,
213
252
  cacheMax,
214
- onDeleted: (sid) => { backgroundStore.evict(sid); },
253
+ onDeleted: async (sid) => { (await backgroundStore.delete(sid)); },
215
254
  });
216
- const projects = new ProjectStore(resolve(config.stateDir, 'projects.json'), () => store.readIndexEntries(), isRootProfile);
217
- const shares = new ShareStore(resolve(config.stateDir, 'shares'), now);
255
+ const projects = new ProjectStore(storage.documents, async () => (await store.readIndexEntries()), isRootProfile);
256
+ const shares = new ShareStore(storage.documents, now);
218
257
  const yoloSessions = new Set();
219
258
  const attachmentDir = (sid) => join(attachmentRoot(), (sid || 'session').replace(/[^\w.-]/g, '_').slice(0, 120));
220
- const cliSessions = new CliSessionSource({ store, profileHome, lastWorkspace: (p) => workspaces.lastWorkspace(p), backgroundProjectId: (kind, p) => projects.ensureSystemProject(kind, p, { create: kind === 'webhook' || projects.hasUserProjects(p) }), now, log });
221
- const gatewayWatchers = new GatewayWatcherRegistry({ profileHome, now, log, ...(opts.gatewayPollMs !== undefined ? { pollIntervalMs: opts.gatewayPollMs } : {}) });
222
- const journal = new RunJournal(config.sessionDir, env);
259
+ const cliSessions = new CliSessionSource({ store, profileHome, profilesMatch, lastWorkspace: async (p) => (await workspaces.lastWorkspace(p)), backgroundProjectId: async (kind, p) => (await projects.ensureSystemProject(kind, p, { create: kind === 'webhook' || (await projects.hasUserProjects(p)) })), now, log });
260
+ const gatewayWatchers = new GatewayWatcherRegistry({ profileHome, rows: (profile) => cliSessions.read(profile), now, log, ...(opts.gatewayPollMs !== undefined ? { pollIntervalMs: opts.gatewayPollMs } : {}) });
261
+ const journal = storage.journals;
223
262
  const contextLengths = new Map();
224
263
  const contextInflight = new Map();
225
264
  const contextKey = (model, provider, profile) => (model?.trim() ? `${profileHome(profile ?? activeProfile())}\0${provider?.trim() ?? ''}\0${model.trim()}` : null);
@@ -259,11 +298,11 @@ export function createDeps(opts) {
259
298
  profileOps.delete(key);
260
299
  };
261
300
  };
262
- const mediaActiveWorkspace = () => {
301
+ const mediaActiveWorkspace = async () => {
263
302
  if (!workspaces.profileSupportsLocalIo(null))
264
303
  return null;
265
304
  try {
266
- const ws = resolvePathLikePython(workspaces.lastWorkspace(activeProfile()));
305
+ const ws = resolvePathLikePython((await workspaces.lastWorkspace(activeProfile())));
267
306
  return statSync(ws).isDirectory() ? ws : null;
268
307
  }
269
308
  catch {
@@ -275,39 +314,48 @@ export function createDeps(opts) {
275
314
  const mediaAccess = { home: config.homeDir, hermesHome: config.hermesHome, extraRoots: env.MEDIA_ALLOWED_ROOTS ?? '', activeWorkspace: mediaActiveWorkspace, policy: mediaPolicy };
276
315
  // TAL-259: record when this server started stamping deliberate shrinks; older backups go to manual review.
277
316
  try {
278
- recoveryStampingSince(config.stateDir);
317
+ await recoveryStampingSince(storage.documents);
279
318
  }
280
319
  catch (error) {
281
320
  log(`[webui] WARNING: could not record recovery_stamping_since: ${error.message}`);
282
321
  }
283
322
  const sessions = new SessionService({
284
- recoveryStampingSince: () => recoveryStampingSince(config.stateDir),
323
+ recoveryStampingSince: async () => await recoveryStampingSince(storage.documents),
285
324
  sidecar: () => sidecar,
286
325
  media: { access: mediaAccess, localIo: (profile) => workspaces.profileSupportsLocalIo(profile) },
287
326
  profileActivity,
288
327
  profileDeleting: (profile) => profiles.isDeleting(profile),
289
- backgroundReceipts: (sid) => background.receipts(sid),
328
+ backgroundReceipts: async (sid) => (await background.receipts(sid)),
329
+ backgroundPending: async (sid) => (await completions.pendingDelegations(sid)),
290
330
  journal,
291
- clearRelayCompletions: (sid, profile) => { relay.clearDeleted(sid, profile); },
331
+ clearRelayCompletions: async (sid, profile) => { (await relay.clearDeleted(sid, profile)); },
292
332
  store,
293
- cliSessions: (profile, o) => cliSessions.read(profile, o),
294
- cliSessionsSync: (profile, o) => cliSessions.readSync(profile, o),
333
+ cliSessions: async (profile, o) => (await cliSessions.read(profile, o)),
295
334
  claudeCode: new ClaudeCodeSessionSource(() => claudeCodeProjectsDir(env, home)),
296
335
  profileHome,
297
336
  // The commit runs detached from the request, so it is registered as profile activity until it settles: profile
298
337
  // deletion must not remove the memory files the cached Agent is still writing.
299
- commitSessionMemory: (sid) => {
338
+ commitSessionMemory: async (sid) => {
300
339
  if (!sidecar)
301
340
  return;
341
+ const callerProfile = activeProfile();
342
+ // Reserve deletion protection before the asynchronous lookup knows which profile owns the session.
343
+ let release = profileActivity('*');
302
344
  let profile = null;
303
345
  try {
304
- profile = store.get(sid, { metadataOnly: true }).profile ?? null;
346
+ profile = (await store.get(sid, { metadataOnly: true })).profile ?? null;
305
347
  }
306
348
  catch {
307
349
  profile = null;
308
350
  }
309
- const release = profileActivity(profile);
310
- void Promise.resolve().then(() => sidecar.call('chat.commit_memory', { profile_home: profileHome(profile ?? activeProfile()), session_id: sid }))
351
+ const targetProfile = profile ?? callerProfile;
352
+ const releaseOwner = profileActivity(targetProfile);
353
+ release();
354
+ release = releaseOwner;
355
+ void Promise.resolve().then(async () => {
356
+ await sessions.assertWritable(sid, targetProfile);
357
+ return sidecar.call('chat.commit_memory', { profile_home: profileHome(targetProfile), session_id: sid });
358
+ })
311
359
  .catch((error) => { log(`[webui] memory commit for ${sid} failed: ${error.message}`); })
312
360
  .finally(release);
313
361
  },
@@ -330,12 +378,12 @@ export function createDeps(opts) {
330
378
  profilesMatch,
331
379
  assistantName,
332
380
  redactEnabled: () => { try {
333
- return settings.load().api_redact_enabled !== false;
381
+ return settings.peek().api_redact_enabled !== false;
334
382
  }
335
383
  catch {
336
384
  return true;
337
385
  } },
338
- pinnedSessionsLimit: () => { const v = settings.load().pinned_sessions_limit; return typeof v === 'number' && v >= 1 ? v : 3; },
386
+ pinnedSessionsLimit: () => { const v = settings.peek().pinned_sessions_limit; return typeof v === 'number' && v >= 1 ? v : 3; },
339
387
  // Chat runtime (checkpoint 6) replaces these with live stream and cron state.
340
388
  runtime: {
341
389
  activeStreamIds,
@@ -354,13 +402,21 @@ export function createDeps(opts) {
354
402
  activeRunStream: (sid) => registry.activeRunStreamForSession(sid),
355
403
  journalDegraded: (streamId) => registry.degradedJournals.has(streamId),
356
404
  pendingSteers: (streamId) => turns.pendingSteers(streamId),
357
- evictAgent: (sid, endSession) => { if (sidecar)
405
+ runStatus: (streamId) => turns.runStatus(streamId),
406
+ liveToolProgress: (streamId) => turns.liveToolProgress(streamId),
407
+ compressionStartedAt: (streamId) => turns.compressionStartedAt(streamId),
408
+ automaticTurnsHeld: async (sid) => (await turns.automaticTurnsHeld(sid)),
409
+ sessionNotices: (sid) => turns.sessionNotices(sid),
410
+ sessionGoal: (sid) => turns.sessionGoal(sid),
411
+ evictAgent: async (sid, endSession) => { if (sidecar && (!endSession || !(await sessions.readOnlyReason(sid))))
358
412
  sidecar.call('chat.evict_agent', endSession ? { session_id: sid, clear_session: true } : { session_id: sid }).catch(() => undefined); },
359
413
  closeTerminal: (sid) => { deps.terminals.close(sid); },
360
414
  deleteCliSession: async (profile, sid) => {
361
415
  if (!sidecar)
362
- return false;
363
- return (await sidecar.call('state_db.delete_cli_session', { profile_home: profileHome(profile ?? activeProfile()), session_id: sid })).ok;
416
+ return { ok: false };
417
+ const targetProfile = profile ?? activeProfile();
418
+ await sessions.assertWritable(sid, targetProfile);
419
+ return await sidecar.call('state_db.delete_cli_session', { profile_home: profileHome(targetProfile), session_id: sid, include_compression_lineage: true });
364
420
  },
365
421
  },
366
422
  attachmentDir,
@@ -368,11 +424,13 @@ export function createDeps(opts) {
368
424
  home,
369
425
  // Python `_sync_session_title_to_state_db`: with `sync_to_insights` on, the state.db row follows a rename.
370
426
  syncTitle: async (session, manual) => {
371
- if (!sidecar || !pyBool(settings.load().sync_to_insights))
427
+ if (!sidecar || !pyBool(settings.peek().sync_to_insights))
372
428
  return;
373
429
  // Awaited by callers: the rename/regenerate response and the title stream's teardown follow the state.db write.
374
430
  try {
375
- await sidecar.call('state_db.sync_title', { profile_home: profileHome(session.profile ?? activeProfile()), session_id: session.session_id, title: session.title, manual: manual === true });
431
+ const targetProfile = session.profile ?? activeProfile();
432
+ await sessions.assertWritable(session, targetProfile);
433
+ await sidecar.call('state_db.sync_title', { profile_home: profileHome(targetProfile), session_id: session.session_id, title: session.title, manual: manual === true });
376
434
  }
377
435
  catch (error) {
378
436
  log(`[webui] state.db title sync failed for ${session.session_id}: ${error.message}`);
@@ -407,6 +465,12 @@ export function createDeps(opts) {
407
465
  provider = currentProvider;
408
466
  return [raw, provider];
409
467
  },
468
+ profileLaunchRoute: (profile, provider) => {
469
+ const config = agentConfig.peek(profileHome(profile));
470
+ const baseUrl = config ? modelBaseUrl(config, provider) : '';
471
+ // A bypass owner reads no custom_providers entry, so a named custom endpoint launches as `custom` at its own URL.
472
+ return { provider: baseUrl && provider.toLowerCase().startsWith('custom:') ? 'custom' : provider, baseUrl: baseUrl || null };
473
+ },
410
474
  repairSessionModel: (profile, model, provider) => catalog.sessionModelRepair(profileHome(profile ?? activeProfile()), model, provider),
411
475
  warmSessionModelRepair: (profile) => catalog.warmSessionModelRepair(profileHome(profile ?? activeProfile())),
412
476
  yolo: { isEnabled: (sid) => yoloSessions.has(sid), set: (sid, enabled) => { if (enabled)
@@ -417,25 +481,21 @@ export function createDeps(opts) {
417
481
  // A working-tree mutation refuses while a run is active anywhere it would change files.
418
482
  const git = new GitRunner({ env, activeRunIn: (path) => [...registry.activeRuns.values()].some((run) => Boolean(run.workspace) && pathsOverlap(run.workspace, path)) });
419
483
  const rollback = new RollbackStore({
420
- sidecar: () => sidecar, profileHome: () => profileHome(activeProfile()), knownWorkspaces: () => workspaces.load(activeProfile()).map((w) => w.path),
484
+ sidecar: () => sidecar, profileHome: () => profileHome(activeProfile()), knownWorkspaces: async () => (await workspaces.load(activeProfile())).map((w) => w.path),
421
485
  // A run whose session cannot be read counts as one in the profile: refusing is the safe answer.
422
486
  activeRunInProfile: (home) => [...registry.activeRuns.values()].some((run) => {
423
- try {
424
- return profileHome(store.get(run.session_id, { metadataOnly: true }).profile ?? activeProfile()) === home;
425
- }
426
- catch {
427
- return true;
428
- }
487
+ const session = store.sessions.get(run.session_id);
488
+ return !session || profileHome(session.profile ?? activeProfile()) === home;
429
489
  }),
430
490
  });
431
491
  const uploads = new UploadInbox(attachmentRoot);
432
- const channels = new SessionChannels();
492
+ const channels = new SessionChannels(activeProfile, profileHome);
433
493
  const pending = new PendingPrompts(events, now);
434
494
  // TAL-372: one durable record per piece of background work; a change refreshes every client showing the session.
435
- const backgroundStore = new BackgroundTaskStore(config.sessionDir, now, (sid) => {
495
+ const backgroundStore = new BackgroundTaskStore(storage.documents, now, async (sid) => {
436
496
  let profile = null;
437
497
  try {
438
- profile = store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }).profile;
498
+ profile = (await store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false })).profile;
439
499
  }
440
500
  catch {
441
501
  profile = null;
@@ -450,14 +510,21 @@ export function createDeps(opts) {
450
510
  const relay = new RelayService({
451
511
  registry, pending, store, presence: new PresenceLeases(now), profileHome, profilesMatch, fetch: () => lazyFetch, now, log,
452
512
  agentSessions: (profile) => readImportableAgentSessionRowsAsync(join(profileHome(profile), 'state.db')),
453
- stateDir: config.stateDir, env, canonicalProfile: (p) => (isRootProfile(p) ? 'default' : p), addListener: (listener) => events.addListener(listener),
513
+ documents: storage.documents, env, canonicalProfile: (p) => (isRootProfile(p) ? 'default' : p), addListener: (listener) => events.addListener(listener),
454
514
  });
455
515
  const turns = new TurnRunner({
516
+ notifications: updateNotifications,
517
+ notificationOwner: () => {
518
+ const request = requestScope.getStore();
519
+ return request ? request.notificationOwner ?? 'local-owner' : null;
520
+ },
456
521
  store,
457
522
  service: () => sessions,
458
523
  events,
459
524
  onTerminal: (streamId, phase) => { relay.noteTerminal(streamId, phase); },
525
+ onTurnStart: () => { completions.wake(); },
460
526
  onTurnEnd: (sessionId) => { void completions.drainDeferred(sessionId); },
527
+ onBackgroundWork: (sessionId, profile) => { background.refresh(sessionId, profile); completions.wake(); },
461
528
  profileDeleting: (profile) => profiles.isDeleting(profile),
462
529
  updateInProgress: () => deps.updates.blocksNewWork(),
463
530
  workspaceBusy: (workspace) => deps.git.workspaceBusy(workspace),
@@ -465,11 +532,13 @@ export function createDeps(opts) {
465
532
  syncTitle: (session) => sessions.deps.syncTitle(session),
466
533
  // Python `sync_session_usage` after a settled turn: with `sync_to_insights` on, the state.db row carries the usage.
467
534
  syncUsage: async (session, model) => {
468
- if (!sidecar || !pyBool(settings.load().sync_to_insights))
535
+ if (!sidecar || !pyBool(settings.peek().sync_to_insights))
469
536
  return;
470
537
  try {
538
+ const targetProfile = session.profile ?? activeProfile();
539
+ await sessions.assertWritable(session, targetProfile);
471
540
  await sidecar.call('state_db.sync_usage', {
472
- profile_home: profileHome(session.profile ?? activeProfile()), session_id: session.session_id,
541
+ profile_home: profileHome(targetProfile), session_id: session.session_id,
473
542
  input_tokens: session.input_tokens || 0, output_tokens: session.output_tokens || 0, estimated_cost: typeof session.estimated_cost === 'number' ? session.estimated_cost : null,
474
543
  cache_read_tokens: session.cache_read_tokens || 0, cache_write_tokens: session.cache_write_tokens || 0,
475
544
  model, title: session.title, message_count: session.messages.length,
@@ -486,8 +555,10 @@ export function createDeps(opts) {
486
555
  catch {
487
556
  return null;
488
557
  } },
558
+ personalities: (profile) => agentConfig.agentPersonalities(profileHome(profile ?? activeProfile())),
559
+ providerLabel: (profile, provider) => catalog.providerLabel(profileHome(profile ?? activeProfile()), provider),
489
560
  titleRefreshEvery: () => { try {
490
- const every = Number(settings.load().auto_title_refresh_every);
561
+ const every = Number(settings.peek().auto_title_refresh_every);
491
562
  return Number.isInteger(every) && every > 0 ? every : 0;
492
563
  }
493
564
  catch {
@@ -507,7 +578,7 @@ export function createDeps(opts) {
507
578
  now,
508
579
  log,
509
580
  redactEnabled: () => { try {
510
- return settings.load().api_redact_enabled !== false;
581
+ return settings.peek().api_redact_enabled !== false;
511
582
  }
512
583
  catch {
513
584
  return true;
@@ -518,7 +589,7 @@ export function createDeps(opts) {
518
589
  });
519
590
  // Services read `deps.fetch` lazily so tests can swap the outbound HTTP client after boot.
520
591
  const lazyFetch = (input, init) => deps.fetch(input, init);
521
- const catalog = new ProviderCatalog({ sidecar: () => sidecar, config: agentConfig, env, now, log, costBudget: () => coerceProviderCostBudgetValue(settings.load().provider_cost_budget), quotaThresholds: (profile) => settings.quotaThresholds(profile), isRootProfileHome: (h) => resolvePathLikePython(h) === resolvePathLikePython(config.hermesHome), stateDir: config.stateDir });
592
+ const catalog = new ProviderCatalog({ sidecar: () => sidecar, config: agentConfig, env, now, log, costBudget: () => coerceProviderCostBudgetValue(settings.peek().provider_cost_budget), quotaThresholds: async (profile) => (await settings.quotaThresholds(profile)), isRootProfileHome: (h) => resolvePathLikePython(h) === resolvePathLikePython(config.hermesHome), documents: storage.documents });
522
593
  const agentStatus = () => {
523
594
  const describe = sidecar?.describe ?? null;
524
595
  const found = Boolean(describe?.agent_dir);
@@ -527,12 +598,13 @@ export function createDeps(opts) {
527
598
  };
528
599
  const profiles = new ProfileService({
529
600
  sidecar: () => sidecar,
601
+ forgetProfile: (name) => pruneAdvice.forget(name),
530
602
  baseHome,
531
603
  profileHome,
532
604
  isolatedProfileMode,
533
605
  isolatedProfileName,
534
606
  config: agentConfig,
535
- defaultWorkspace: (profile) => workspaces.profileDefaultWorkspace(profile),
607
+ defaultWorkspace: async (profile) => (await workspaces.profileDefaultWorkspace(profile)),
536
608
  models: (h) => catalog.models(h),
537
609
  streamsActive: () => activeStreamIds.size > 0,
538
610
  profileRunsActive: (name) => {
@@ -548,23 +620,22 @@ export function createDeps(opts) {
548
620
  }
549
621
  for (const sessionId of sessionIds) {
550
622
  let profile = null;
551
- try {
552
- profile = store.get(sessionId, { metadataOnly: true }).profile ?? null;
553
- }
554
- catch {
555
- continue;
556
- }
623
+ const session = store.sessions.get(sessionId);
624
+ if (!session)
625
+ return true;
626
+ profile = session.profile ?? null;
557
627
  if (profiles.isRootProfile(profile ?? 'default') ? profiles.isRootProfile(name) : profile === name)
558
628
  return true;
559
629
  }
560
630
  for (const [profile, count] of profileOps)
561
- if (count > 0 && (profiles.isRootProfile(profile) ? profiles.isRootProfile(name) : profile === name))
631
+ if (count > 0 && (profile === '*' || (profiles.isRootProfile(profile) ? profiles.isRootProfile(name) : profile === name)))
562
632
  return true;
563
633
  return false;
564
634
  },
565
- tombstoneFile: join(config.stateDir, 'deleted-profiles.json'),
635
+ documents: storage.documents,
566
636
  log,
567
637
  }, now);
638
+ await profiles.initialize();
568
639
  rootAlias = (name) => profiles.isRootProfile(name);
569
640
  const onboarding = new Onboarding({
570
641
  settings,
@@ -575,7 +646,7 @@ export function createDeps(opts) {
575
646
  sidecar: () => sidecar,
576
647
  agentStatus,
577
648
  isAuthEnabled: () => auth.isAuthEnabled(),
578
- workspaces: () => ({ items: workspaces.load(activeProfile()), last: workspaces.lastWorkspace(activeProfile()) }),
649
+ workspaces: async () => ({ items: (await workspaces.load(activeProfile())), last: (await workspaces.lastWorkspace(activeProfile())) }),
579
650
  models: (h) => catalog.models(h),
580
651
  defaultWorkspace: () => config.defaultWorkspace,
581
652
  defaultModel: () => (env.HERMES_WEBUI_DEFAULT_MODEL ?? '').trim(),
@@ -625,14 +696,12 @@ export function createDeps(opts) {
625
696
  },
626
697
  };
627
698
  };
628
- completions = new CompletionDrain({ sidecar: () => sidecar, configPath: (home) => agentConfig.path(home), baseHome, profileHome: (p) => profileHome(p ?? activeProfile()), activeProfile, store, channels, registry, startTurn: async (session, prompt) => {
699
+ completions = new CompletionDrain({ documents: storage.documents, sidecar: () => sidecar, configPath: (home) => agentConfig.path(home), readConfig: (home) => agentConfig.read(home), env, baseHome, profileHome: (p) => profileHome(p ?? activeProfile()), activeProfile, store, channels, registry, isReadOnly: async (session) => (await sessions.isReadOnly(session)), startTurn: async (session, prompt, completionKeys, backgroundUpdate) => {
629
700
  // TAL-577: a wakeup passes the user-turn admission; a stale runtime answers a retryable 409, which defers it on a retry timer.
630
701
  // TAL-542: its model repair reads the cached catalog only (Python `prefer_cached_catalog`), never waiting on a build.
631
702
  try {
632
703
  await ensureAgentRuntimeCurrent(sidecar);
633
- const workspace = sessions.turnWorkspace(session);
634
- const [model, modelProvider] = sessions.turnModel(session);
635
- return turns.start(session, { msg: prompt, attachments: [], workspace, model, modelProvider, source: 'process_wakeup' });
704
+ return (await turns.startServerTurn(session, { msg: prompt, source: 'process_wakeup', completionKeys, backgroundUpdate }));
636
705
  }
637
706
  catch (error) {
638
707
  if (error instanceof HttpFailure)
@@ -657,6 +726,8 @@ export function createDeps(opts) {
657
726
  catch {
658
727
  return false;
659
728
  } };
729
+ sessions.owner = new GatewaySessions({ service: sessions, sidecar: () => sidecar, registry, journal, events, channels,
730
+ profileHome, activeProfile, showReasoning: async (home) => showReasoning(await agentConfig.read(home)), redactEnabled: sessions.deps.redactEnabled, now, log });
660
731
  const deps = {
661
732
  config,
662
733
  settings,
@@ -675,7 +746,7 @@ export function createDeps(opts) {
675
746
  requestScope,
676
747
  isRootProfile,
677
748
  assistantName,
678
- onboardingCompleted: () => truthy(env.HERMES_WEBUI_SKIP_ONBOARDING) || Boolean(settings.load().onboarding_completed),
749
+ onboardingCompleted: () => truthy(env.HERMES_WEBUI_SKIP_ONBOARDING) || Boolean(settings.peek().onboarding_completed),
679
750
  health: () => ({ sessions: store.sessions.size, activeStreams: activeStreamIds.size, activeRuns: registry.activeRuns.size, runs: [...registry.activeRuns.values()].map((r) => ({ phase: r.phase, started_at: r.started_at })), lastRunFinishedAt: registry.lastRunFinishedAt }),
680
751
  sessions,
681
752
  sessionStore: store,
@@ -721,11 +792,11 @@ export function createDeps(opts) {
721
792
  oidc,
722
793
  passkeys,
723
794
  nativeOidcLimiter: new WindowLimiter(60, 10, now),
724
- clearPasskeys: () => { passkeys.clear(); },
795
+ clearPasskeys: async () => { (await passkeys.clear()); },
725
796
  skills: new SkillsService({ sidecar: () => sidecar, config: agentConfig, log }),
726
797
  mcp: new McpService({ sidecar: () => sidecar, config: agentConfig, health: mcpHealth }),
727
798
  completions,
728
- hygiene: new HygieneTicker({ env, stateDir: config.stateDir, port: () => config.port, journal, activeJournalPaths: () => turns.activeJournalPaths(), now, log, sweeps: [() => { completions.sweep(); }] }),
799
+ hygiene: new HygieneTicker({ env, stateDir: config.stateDir, port: () => config.port, journal, now, log, sweeps: [() => { completions.sweep(); }, async () => { (await turns.sweep()); }, () => pruneAdvice.sweep()] }),
729
800
  mcpHealth,
730
801
  nowSeconds: now,
731
802
  // Python `_webui_runtime_payload`: the four owner sections with their `available` flags.
@@ -744,12 +815,15 @@ export function createDeps(opts) {
744
815
  requestShutdown: () => { setTimeout(() => { process.kill(process.pid, 'SIGINT'); }, 300).unref(); },
745
816
  // Embedded shells are separate process groups that would outlive the worker: terminate and reap them on both exits.
746
817
  // A running retention sweep stops before the exit, like on shutdown.
747
- requestRestart: () => { void waitUntilRestartSafe(restartBlockers, { log }).then(() => deps.hygiene.stop()).then(() => auth.flushPersistence()).then(() => { deps.terminals.closeAll({ immediate: true }); purgeAgentPycache(); process.exit(RESTART_EXIT_CODE); }); },
818
+ requestRestart: () => { void waitUntilRestartSafe(restartBlockers, { log }).then(() => deps.gatewayRestarts.quiesce()).then(() => deps.hygiene.stop()).then(() => auth.flushPersistence()).then(() => store.close()).then(() => { deps.terminals.closeAll({ immediate: true }); purgeAgentPycache(); process.exit(RESTART_EXIT_CODE); }); },
748
819
  updates: null,
749
820
  updateNotifications,
821
+ pruneAdvice,
822
+ gatewayRestarts: null,
750
823
  cspLimiter: new WindowLimiter(60, 100, now),
751
824
  clientEventLimiter: new WindowLimiter(60, 30, now),
752
825
  ttsLimiter: new WindowLimiter(2, 1, now),
826
+ profileActivity,
753
827
  fetch: opts.fetch ?? fetch,
754
828
  dnsLookup: systemDnsLookup,
755
829
  pinnedFetch,
@@ -762,11 +836,12 @@ export function createDeps(opts) {
762
836
  log,
763
837
  publishSessionsChanged: (reason, profile) => { events.publish(reason, { profile }); },
764
838
  runningJobs: runningCronJobs,
765
- modelOptionFor: async (home, model, provider) => { await catalog.warmModelOptions(home); return catalog.modelOptionFor(home, model, provider); },
839
+ updateInProgress: () => deps.updates.blocksNewWork(),
840
+ modelOptions: (home) => catalog.modelOptionResolver(home),
766
841
  }),
767
842
  kanban: new KanbanService({ sidecar: () => sidecar, config: agentConfig }),
768
- extensions: new ExtensionService({ env, stateDir: config.stateDir, isAuthEnabled: () => auth.isAuthEnabled(), fetch: lazyFetch, log }),
769
- dashboardPlugins: new DashboardPlugins({ env, hermesHome: config.hermesHome, settings }),
843
+ extensions: new ExtensionService({ documents: storage.documents, env, stateDir: config.stateDir, isAuthEnabled: () => auth.isAuthEnabled(), fetch: lazyFetch, log }),
844
+ dashboardPlugins: new DashboardPlugins({ env, hermesHome: config.hermesHome, settings, sidecar: () => sidecar }),
770
845
  terminals,
771
846
  commitMessage: async (session, systemPrompt, userPrompt) => {
772
847
  if (!sidecar)
@@ -790,6 +865,12 @@ export function createDeps(opts) {
790
865
  };
791
866
  const purgeAgentPycache = () => { const dir = sidecar?.describe?.agent_dir; if (dir)
792
867
  purgePycache(dir); };
868
+ const agentDrain = (frame) => {
869
+ const parsed = SIDECAR_METHODS['runtime.agent_mutation'].stream.safeParse({ event: frame.event, data: frame.data });
870
+ return parsed.success ? parsed.data.data : null;
871
+ };
872
+ let recoveredAgentRevision = null;
873
+ let pendingRuntimeRecovery = null;
793
874
  deps.updates = new UpdateService({
794
875
  webRoot: config.webRoot,
795
876
  getJson: githubJson(lazyFetch, env),
@@ -805,22 +886,122 @@ export function createDeps(opts) {
805
886
  return deps.version;
806
887
  },
807
888
  agentDir: () => sidecar?.describe?.agent_dir ?? null,
808
- channel: () => normalizeChannel(settings.load().update_channel),
809
- agentChannel: () => normalizeChannel(settings.load().agent_update_channel),
810
- includeAgent: () => !pyBool(settings.load().ignore_agent_updates),
811
- autoApply: () => settings.load().check_for_updates !== false && settings.load().auto_apply_updates === true,
812
- checkEnabled: () => !truthy(env.HERMES_WEBUI_TEST_NETWORK_BLOCK) && settings.load().check_for_updates !== false,
813
- autoNotification: {
814
- begin: () => updateNotifications.begin({ owner: '*', profile: 'default', serverOwner: true }, 'webui').id,
815
- transition: (id, phase, expectedIdentity, verifiedIdentity, detail) => { updateNotifications.transition(id, phase, expectedIdentity, verifiedIdentity, detail); },
889
+ agentHomes,
890
+ ...(sidecar?.onHandshake ? { onAgentReconnect: (listener) => sidecar.onHandshake(listener) } : {}),
891
+ recoverAgent: async (probe = false, signal) => {
892
+ if (!sidecar)
893
+ throw new Error('Hermes Agent sidecar is unavailable for recovery.');
894
+ if (sidecar.status === 'starting' || sidecar.status === 'restarting' || sidecar.status === 'stopped')
895
+ throw new Error('Agent recovery is waiting for its sidecar connection.');
896
+ let completeRevision = null;
897
+ if (!probe && pendingRuntimeRecovery?.runtime_pending && recoveredAgentRevision) {
898
+ const current = await sidecar.call('runtime.status', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
899
+ if (signal?.aborted)
900
+ throw new Error('Agent recovery was cancelled.');
901
+ // A reconnected runtime must acknowledge the repaired generation before another repair retires it.
902
+ if (current.compatible && !current.stale && current.agent_revision === recoveredAgentRevision) {
903
+ completeRevision = recoveredAgentRevision;
904
+ pendingRuntimeRecovery = null; // A refused acknowledgement must re-enter native recovery.
905
+ }
906
+ }
907
+ let result = await sidecar.call('runtime.agent_recovery', completeRevision ? { complete_revision: completeRevision } : { probe }, { ...(signal ? { signal } : {}), timeoutMs: 660_000 });
908
+ if (signal?.aborted)
909
+ throw new Error('Agent recovery was cancelled.');
910
+ if (!probe && result.local_restore && result.revision)
911
+ recoveredAgentRevision = result.revision;
912
+ if (probe) {
913
+ if (pendingRuntimeRecovery?.fingerprint === result.fingerprint && restartBlockers().restart_blocked
914
+ && (sidecar.describe?.agent_revision !== recoveredAgentRevision || !sidecar.describe?.compatible)) {
915
+ return { ...result, waiting_for_idle: true, detail: 'Agent recovery is waiting for active Web work to finish before refreshing its runtime.' };
916
+ }
917
+ return result;
918
+ }
919
+ if (!result.ok || (result.owed && !result.runtime_pending))
920
+ return result;
921
+ if (result.revision)
922
+ recoveredAgentRevision = result.revision;
923
+ if (result.runtime_pending)
924
+ pendingRuntimeRecovery = result;
925
+ const runtime = await sidecar.call('runtime.status', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
926
+ if (signal?.aborted)
927
+ throw new Error('Agent recovery was cancelled.');
928
+ if (recoveredAgentRevision && (runtime.agent_revision !== recoveredAgentRevision || !runtime.compatible)) {
929
+ if (restartBlockers().restart_blocked)
930
+ return { ...result, waiting_for_idle: true, detail: 'Agent recovery is waiting for active Web work to finish before refreshing its runtime.' };
931
+ if (['ready', 'incompatible'].includes(sidecar.status))
932
+ sidecar.recycle('Verified retained Agent recovery requires the current interpreter and source');
933
+ throw new Error('Agent services recovered; waiting for the current sidecar runtime to become ready.');
934
+ }
935
+ if (result.runtime_pending && recoveredAgentRevision)
936
+ result = await sidecar.call('runtime.agent_recovery', { complete_revision: recoveredAgentRevision }, { ...(signal ? { signal } : {}), timeoutMs: 660_000 });
937
+ if (signal?.aborted || !result.ok || result.owed)
938
+ throw new Error(result.detail || 'Agent recovery remains recorded until loaded readiness is verified.');
939
+ await sidecar.call('runtime.ensure_current', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
940
+ if (signal?.aborted)
941
+ throw new Error('Agent recovery was cancelled.');
942
+ if (!runtime.compatible || runtime.stale)
943
+ throw new Error('Agent recovery has no matching loaded runtime evidence; admission remains closed.');
944
+ catalog.invalidate(undefined, undefined, { preserveConfirmed: true });
945
+ recoveredAgentRevision = null;
946
+ pendingRuntimeRecovery = null;
947
+ return result;
816
948
  },
817
- blockers: restartBlockers,
818
- scheduleRestart: () => { setTimeout(() => { void waitUntilRestartSafe(restartBlockers, { maxWaitMs: Infinity, log }).then(() => { deps.requestRestart(); }); }, 2000).unref(); },
819
- gatewayRestart: async () => {
949
+ recoveryChanged: (state) => updateNotifications.agentRecovery(state),
950
+ hasPendingRecovery: () => updateNotifications.hasPendingAgentRecovery(),
951
+ agentMutation: async (path, revision, mutate, consent) => {
952
+ if (!sidecar)
953
+ throw new Error('Hermes Agent sidecar is unavailable');
954
+ const begin = await sidecar.call('runtime.agent_mutation', { action: 'begin', agent_dir: path, revision, homes: agentHomes(), ...(consent?.mutationIntent ? { intent: consent.mutationIntent } : {}), ...(consent?.refreshToken ? { refresh_token: consent.refreshToken } : {}) }, {
955
+ timeoutMs: 330_000,
956
+ // TAL-1429: the lease declares its bounded native gateway drain; custody lasts that long plus the ordinary lease margin.
957
+ renewTimeout: (frame) => { const drain = agentDrain(frame); return drain ? drain.deadline_seconds * 1000 + 330_000 : undefined; },
958
+ onStream: (frame) => { const drain = agentDrain(frame); if (drain)
959
+ consent?.onProgress?.(gatewayDrainDetail(drain.services, drain.deadline_seconds)); },
960
+ });
961
+ if (begin.refresh_confirmation)
962
+ return { ok: false, refresh_confirmation: begin.refresh_confirmation, message: begin.detail };
963
+ if (!begin.ok || !begin.token)
964
+ throw new Error(begin.detail || 'Agent writer quiescence was not verified.');
965
+ const token = begin.token;
966
+ const leasedGit = async (args, cwd, timeoutMs = 10_000) => {
967
+ if (resolve(cwd) !== resolve(path))
968
+ throw new Error('Agent writer lease cannot mutate another checkout.');
969
+ const result = await sidecar.call('runtime.agent_mutation', { action: 'git', agent_dir: path, token, args, timeout_ms: timeoutMs }, { timeoutMs: 330_000 });
970
+ return { ok: result.ok, out: result.detail };
971
+ };
972
+ let result;
973
+ try {
974
+ result = await mutate(leasedGit, () => sidecar.call('runtime.agent_mutation', { action: 'sync', agent_dir: path, token }, { timeoutMs: 330_000 }));
975
+ }
976
+ catch (error) {
977
+ try {
978
+ await sidecar.call('runtime.agent_mutation', { action: 'finish', agent_dir: path, token }, { timeoutMs: 330_000 });
979
+ }
980
+ catch { /* The native pause journal retains any unverified recovery obligation. */ }
981
+ throw error;
982
+ }
983
+ const resumed = await sidecar.call('runtime.agent_mutation', { action: 'finish', agent_dir: path, token }, { timeoutMs: 330_000 });
984
+ return resumed.ok ? { ...result, ...(result.gateway_restart === 'waiting_for_idle' ? { gateway_restart: 'resumed' } : {}) }
985
+ : { ...result, ok: false, restart_scheduled: false, message: resumed.detail || 'Agent writer resume remains unverified; its recovery obligation is retained.' };
986
+ },
987
+ agentSync: async (agentDir) => {
820
988
  if (!sidecar)
821
989
  throw new Error('Hermes Agent sidecar is unavailable');
822
- return sidecar.call('gateway.restart', { profile_home: profileHome(activeProfile()) }, { timeoutMs: 300_000 });
990
+ return sidecar.call('runtime.sync_dependencies', { agent_dir: agentDir }, { timeoutMs: 330_000 });
991
+ },
992
+ channel: () => normalizeChannel(settings.peek().update_channel),
993
+ agentChannel: () => normalizeChannel(settings.peek().agent_update_channel),
994
+ includeAgent: () => !pyBool(settings.peek().ignore_agent_updates),
995
+ summarizeAutomatically: () => settings.peek().check_for_updates !== false && settings.peek().summarize_updates_automatically !== false,
996
+ autoApply: () => settings.peek().check_for_updates !== false && settings.peek().auto_apply_updates === true,
997
+ checkEnabled: () => !truthy(env.HERMES_WEBUI_TEST_NETWORK_BLOCK) && settings.peek().check_for_updates !== false,
998
+ autoNotification: {
999
+ begin: async () => (await updateNotifications.begin({ owner: '*', profile: 'default', serverOwner: true }, 'webui')).id,
1000
+ transition: async (id, phase, expectedIdentity, verifiedIdentity, detail) => { (await updateNotifications.transition(id, phase, expectedIdentity, verifiedIdentity, detail)); },
823
1001
  },
1002
+ blockers: restartBlockers,
1003
+ scheduleRestart: () => { setTimeout(() => { void waitUntilRestartSafe(restartBlockers, { maxWaitMs: Infinity, log }).then(() => { deps.requestRestart(); }); }, 2000).unref(); },
1004
+ gatewayRestarting: () => deps.gatewayRestarts.restarting(),
824
1005
  llm: async (system, user) => {
825
1006
  if (!sidecar)
826
1007
  return '';
@@ -829,6 +1010,26 @@ export function createDeps(opts) {
829
1010
  },
830
1011
  log,
831
1012
  });
1013
+ deps.gatewayRestarts = new GatewayRestartQueue({
1014
+ notifications: updateNotifications,
1015
+ blockers: (profile) => gatewayRestartBlockers(config.hermesHome, profileHome(profile), now()),
1016
+ updating: () => deps.updates.blocksNewWork(),
1017
+ restart: async (profile, interrupt) => {
1018
+ if (!sidecar)
1019
+ throw new Error('Hermes Agent sidecar is unavailable');
1020
+ return restartGateway(sidecar, profileHome(profile), interrupt);
1021
+ },
1022
+ gateways: (profile) => liveGateways(config.hermesHome, profileHome(profile), now()),
1023
+ runtimeReady: async () => {
1024
+ if (!sidecar)
1025
+ return false;
1026
+ const runtime = await sidecar.call('runtime.status', {}, { timeoutMs: 5000 });
1027
+ return runtime.compatible && !runtime.stale;
1028
+ },
1029
+ log,
1030
+ });
1031
+ // TAL-1254: every (re)started sidecar owns the worktree chats' locks before it reports ready, so the Agent's sweep keeps them.
1032
+ await sidecar?.addReadyGate?.((call) => sessions.retainWorktrees(call));
832
1033
  return deps;
833
1034
  }
834
1035
  /** Python `_read_active_profile_file`: the sticky profile name, or `default` when absent, unreadable, or malformed. */
@@ -841,4 +1042,10 @@ function readActiveProfileFile(hermesHome, pattern) {
841
1042
  return 'default';
842
1043
  }
843
1044
  }
1045
+ export function createStorage(config, now = () => Date.now() / 1000, profileHome = (name) => name === 'default' ? config.hermesHome : join(config.hermesHome, 'profiles', name)) {
1046
+ if (config.storage !== 'json')
1047
+ throw new Error(`Unknown TALARIA_STORAGE=${JSON.stringify(config.storage)}; supported backends: json`);
1048
+ const storage = new JsonStorage({ directory: config.sessionDir, stateDir: config.stateDir, profileHome, env: config.env, now, stampingSince: async () => (await recoveryStampingSince(storage.documents)) });
1049
+ return storage;
1050
+ }
844
1051
  //# sourceMappingURL=runtime.js.map