@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
@@ -7,14 +7,18 @@
7
7
  * redelivered at turn teardown with a bounded retry budget).
8
8
  */
9
9
  import { randomUUID } from 'node:crypto';
10
- import { existsSync } from 'node:fs';
11
- import { join } from 'node:path';
10
+ import { readFileSync, realpathSync } from 'node:fs';
11
+ import { join, resolve } from 'node:path';
12
12
  import { SessionNotFound } from './store.js';
13
13
  import { str } from '../util.js';
14
- import { isDict } from './merge.js';
15
- import { batchUpdate, recordBackgroundUpdate } from './background-updates.js';
14
+ import { expandDotenv, parseDotenv } from '../cli/dotenv.js';
15
+ import { isDict, messageText } from './merge.js';
16
+ import { batchUpdate, recordBackgroundUpdate, completionAccepted } from './background-updates.js';
17
+ import { backgroundEventKind } from './background-events.js';
16
18
  import { HeldWakeups, deliveredPerProcess, heldKey, mergeWakeups, poolRecovery, wakeupPaused } from './wakeup-pause.js';
17
19
  export const COMPLETION_POLL_MS = 1000;
20
+ /** TAL-1395: each empty drain doubles the poll delay up to this cap; a routed event or `wake()` resets it to `pollMs`. */
21
+ const COMPLETION_IDLE_POLL_MS = 10_000;
18
22
  const EMIT_COALESCE_WINDOW_S = 1;
19
23
  const WAKEUP_RETRY_SECONDS = 30;
20
24
  const WAKEUP_RETRY_MAX_ATTEMPTS = 5;
@@ -22,6 +26,13 @@ const WAKEUP_BATCH_MAX_CHARS = 24_000;
22
26
  /** A session with held wakeups rechecks its pause at least this often (a credential edit has no deadline). */
23
27
  const HELD_RECHECK_SECONDS = 300;
24
28
  const DELIVERY_CONSUMER = 'webui';
29
+ const canonicalHome = (home) => { try {
30
+ return realpathSync(home);
31
+ }
32
+ catch {
33
+ return resolve(home);
34
+ } };
35
+ const completionKey = (home, event) => event.type === 'async_delegation' && event.delegation_id && !event.task_failure_notice ? JSON.stringify([canonicalHome(home), str(event.delegation_id)]) : '';
25
36
  /** Python `format_wakeup_prompt` for plain completion events; async delegations use the sidecar formatter. */
26
37
  export function formatWakeupPrompt(evt) {
27
38
  const type = str(evt.type ?? 'completion');
@@ -38,7 +49,7 @@ export function formatWakeupPrompt(evt) {
38
49
  body += `\n(${str(evt.suppressed)} earlier matches were suppressed by rate limit)`;
39
50
  return body + ']';
40
51
  }
41
- if (type !== 'completion')
52
+ if (backgroundEventKind(evt) !== 'completion')
42
53
  return null;
43
54
  if (!(sid || cmd || 'exit_code' in evt || evt.output))
44
55
  return null;
@@ -58,6 +69,10 @@ export class CompletionDrain {
58
69
  deps;
59
70
  timer = null;
60
71
  stopped = false;
72
+ draining = false;
73
+ /** Consecutive drains that routed nothing; a `wake()` during a drain resets the count when it settles. */
74
+ idleDrains = 0;
75
+ woken = false;
61
76
  seen = new Map();
62
77
  pendingSessions = new Set();
63
78
  deferred = new Map();
@@ -75,31 +90,68 @@ export class CompletionDrain {
75
90
  unreleased = new Map();
76
91
  /** TAL-576: wakeups held while their session is paused. */
77
92
  heldWakeups;
93
+ /** Waiting requires an unadmitted result, not an admitted turn's outstanding ledger acknowledgement. */
94
+ async pendingDelegations(sid) {
95
+ try {
96
+ const session = (await this.deps.store.get(sid)), home = this.ownerHome(session);
97
+ return new Set((await this.heldWakeups.get(sid)).filter((entry) => {
98
+ const key = completionKey(home, entry.event ?? {});
99
+ return Boolean(key) && !completionAccepted(session, key);
100
+ }).map((entry) => str(entry.event?.delegation_id)).filter(Boolean));
101
+ }
102
+ catch {
103
+ return new Set();
104
+ }
105
+ }
78
106
  constructor(deps) {
79
107
  this.deps = deps;
80
- this.heldWakeups = new HeldWakeups(join(deps.store.sessionDir, '_wakeup_held.json'));
108
+ this.heldWakeups = new HeldWakeups(deps.documents);
81
109
  }
82
110
  start() {
83
- if (this.timer || this.stopped)
111
+ if (this.timer || this.draining || this.stopped)
112
+ return;
113
+ this.tick();
114
+ }
115
+ /** TAL-1395: a turn started or background work spawned; drain now and poll at the base interval again. */
116
+ wake() {
117
+ if (this.stopped)
118
+ return;
119
+ this.idleDrains = 0;
120
+ if (this.draining) {
121
+ this.woken = true;
122
+ return;
123
+ }
124
+ if (!this.timer)
125
+ return;
126
+ clearTimeout(this.timer);
127
+ this.schedule(0);
128
+ }
129
+ schedule(delay) {
130
+ this.timer = setTimeout(this.tick, delay);
131
+ this.timer.unref();
132
+ }
133
+ tick = () => {
134
+ if (this.stopped)
84
135
  return;
85
- const tick = () => {
136
+ this.timer = null;
137
+ this.draining = true;
138
+ this.woken = false;
139
+ // A lasting failure (an unrecoverable checkpoint fails every call in its home, TAL-533) is logged once, not every poll.
140
+ void this.drainOnce().then((routed) => { this.lastDrainError = null; return routed; }, (error) => {
141
+ const message = error.message;
142
+ if (message !== this.lastDrainError)
143
+ this.deps.log(`[webui] WARNING: bg_task_complete drain failed: ${message}`);
144
+ this.lastDrainError = message;
145
+ return 0;
146
+ }).catch(() => 0).then((routed) => {
147
+ this.draining = false;
86
148
  if (this.stopped)
87
149
  return;
88
- // A lasting failure (an unrecoverable checkpoint fails every call in its home, TAL-533) is logged once, not every poll.
89
- void this.drainOnce().then(() => { this.lastDrainError = null; }, (error) => {
90
- const message = error.message;
91
- if (message !== this.lastDrainError)
92
- this.deps.log(`[webui] WARNING: bg_task_complete drain failed: ${message}`);
93
- this.lastDrainError = message;
94
- }).finally(() => {
95
- if (this.stopped)
96
- return;
97
- this.timer = setTimeout(tick, this.deps.pollMs ?? COMPLETION_POLL_MS);
98
- this.timer.unref();
99
- });
100
- };
101
- tick();
102
- }
150
+ this.idleDrains = routed > 0 || this.woken ? 0 : this.idleDrains + 1;
151
+ const base = this.deps.pollMs ?? COMPLETION_POLL_MS;
152
+ this.schedule(Math.min(base * 2 ** Math.max(0, this.idleDrains - 1), Math.max(base, COMPLETION_IDLE_POLL_MS)));
153
+ });
154
+ };
103
155
  stop() {
104
156
  this.stopped = true;
105
157
  if (this.timer) {
@@ -133,7 +185,7 @@ export class CompletionDrain {
133
185
  }
134
186
  // TAL-576: whether or not every profile recovered, the sessions left holding wakeups resume once a sidecar answers.
135
187
  if (!this.heldResumed)
136
- this.resumeHeld();
188
+ (await this.resumeHeld());
137
189
  // The drain is sidecar-wide; an active profile whose home escapes the profiles root (`profileHome` throws) scopes it
138
190
  // to the base home instead of stalling every other profile's completions.
139
191
  let scope;
@@ -166,19 +218,19 @@ export class CompletionDrain {
166
218
  }
167
219
  return routed;
168
220
  }
169
- resolveTarget(evt) {
221
+ async resolveTarget(evt) {
170
222
  const sessionKey = str(evt.session_key).trim();
171
223
  const origin = str(evt.origin_ui_session_id).trim();
172
- const live = (sid) => { if (!sid)
224
+ const live = async (sid) => { if (!sid)
173
225
  return ''; try {
174
- this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false });
226
+ (await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }));
175
227
  return sid;
176
228
  }
177
229
  catch {
178
230
  return '';
179
231
  } };
180
- const resolved = live(sessionKey);
181
- const owner = live(origin);
232
+ const resolved = (await live(sessionKey));
233
+ const owner = (await live(origin));
182
234
  if (!owner)
183
235
  return resolved;
184
236
  if (resolved && resolved !== owner)
@@ -192,7 +244,8 @@ export class CompletionDrain {
192
244
  return false;
193
245
  }
194
246
  async wakeupPrompt(evt) {
195
- if (evt.type === 'async_delegation') {
247
+ const kind = backgroundEventKind(evt);
248
+ if (kind === 'delegation' || kind === 'progress') {
196
249
  const sidecar = this.deps.sidecar();
197
250
  if (!sidecar)
198
251
  return '';
@@ -205,30 +258,175 @@ export class CompletionDrain {
205
258
  }
206
259
  return (formatWakeupPrompt(evt) ?? '').trim();
207
260
  }
261
+ /** The session's owning profile home; a session without a profile belongs to the root profile (`profilesMatch`). */
262
+ ownerHome(session) { return this.deps.profileHome(session.profile ?? 'default'); }
263
+ /** A profile's config; null when it cannot be read. */
264
+ async profileConfig(home) {
265
+ try {
266
+ return (await this.deps.readConfig?.(home)) ?? {};
267
+ }
268
+ catch {
269
+ return null;
270
+ }
271
+ }
272
+ /** The owning profile's `delegation.surface_child_process_notifications`; off, the Agent's default, when it cannot be read. */
273
+ async surfacesChildProcesses(sid) {
274
+ let config;
275
+ try {
276
+ config = await this.profileConfig(this.ownerHome((await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }))));
277
+ }
278
+ catch {
279
+ return false;
280
+ }
281
+ return isDict(config?.delegation) && config.delegation.surface_child_process_notifications === true;
282
+ }
283
+ /**
284
+ * TAL-907 (Agent `_load_background_notifications_mode`): `HERMES_BACKGROUND_NOTIFICATIONS` from the profile's `.env`
285
+ * (which overrides the shell, as in the Agent) or the server environment, else `display.background_process_notifications`
286
+ * (YAML `false` is off). Only `off` changes Web delivery; null when the setting cannot be read.
287
+ */
288
+ async notificationsOff(home) {
289
+ let mode;
290
+ try {
291
+ mode = expandDotenv(parseDotenv(readFileSync(join(home, '.env'), 'utf8')), this.deps.env ?? {}).HERMES_BACKGROUND_NOTIFICATIONS?.trim();
292
+ }
293
+ catch (error) {
294
+ if (error.code !== 'ENOENT')
295
+ return null;
296
+ }
297
+ mode ||= this.deps.env?.HERMES_BACKGROUND_NOTIFICATIONS?.trim();
298
+ if (!mode) {
299
+ const config = await this.profileConfig(home);
300
+ if (!config)
301
+ return null;
302
+ mode = isDict(config.display) ? config.display.background_process_notifications : undefined;
303
+ }
304
+ return mode === false || str(mode).trim().toLowerCase() === 'off';
305
+ }
306
+ async isReadOnly(session) { return await this.deps.isReadOnly?.(session) ?? session.read_only; }
307
+ /** Hand durable results back without acknowledging delivery or mutating the canonical session. */
308
+ async relinquish(sid, session, entries, claims = []) {
309
+ try {
310
+ if (!(await this.settleClaims(this.ownerHome(session), 'process.defer_delivery', claims)))
311
+ throw new Error('delivery claim could not be returned');
312
+ const events = entries.flatMap((e) => e.event?.type === 'async_delegation' ? [e.event] : []);
313
+ if (events.length) {
314
+ const sidecar = this.deps.sidecar();
315
+ if (!sidecar)
316
+ throw new Error('sidecar unavailable');
317
+ await sidecar.call('process.requeue', { events });
318
+ }
319
+ this.deferred.delete(sid);
320
+ this.pendingSessions.delete(sid);
321
+ this.retryAttempts.delete(sid);
322
+ const timer = this.retryTimers.get(sid);
323
+ if (timer)
324
+ clearTimeout(timer);
325
+ this.retryTimers.delete(sid);
326
+ await this.release(sid);
327
+ }
328
+ catch (error) {
329
+ for (const entry of entries)
330
+ this.defer(sid, entry);
331
+ this.scheduleRetry(sid);
332
+ this.deps.log(`[webui] WARNING: completion hand-back failed for ${sid}: ${error.message}`);
333
+ }
334
+ }
208
335
  /** Python `_process_one`; returns false when the event has no owning WebUI session. */
209
336
  async processOne(evt) {
210
337
  const processId = str(evt.process_id).trim();
211
- const sid = this.resolveTarget(evt);
338
+ const sid = (await this.resolveTarget(evt));
212
339
  if (!sid)
213
340
  return false;
341
+ let owner;
342
+ let home;
343
+ let homeError = '';
344
+ try {
345
+ owner = (await this.deps.store.get(sid));
346
+ }
347
+ catch {
348
+ return false;
349
+ }
350
+ try {
351
+ home = this.ownerHome(owner);
352
+ }
353
+ catch (error) {
354
+ home = '';
355
+ homeError = error.message;
356
+ }
357
+ if (home && (await this.isReadOnly(owner)))
358
+ return false;
359
+ // Reconciliation needs positive profile proof; live events retain the existing admission deferral on home errors.
360
+ if (evt.reconciliation_profile_home && (!home || canonicalHome(str(evt.reconciliation_profile_home)) !== canonicalHome(home)))
361
+ return false;
362
+ if (evt.reconciliation_profile_home && completionAccepted(owner, completionKey(home, evt)))
363
+ return true;
214
364
  if (evt.consumed === true)
215
365
  return true;
366
+ // TAL-933 (Agent `should_surface_notification`): a subagent's own process notices stay out of the parent chat unless
367
+ // the session's profile opts in. Dropped, not consumed, as in the Agent: an exit nobody read still reaches the parent
368
+ // as the child's `unread_completions`.
369
+ if (evt.child_process === true && !(await this.surfacesChildProcesses(sid)))
370
+ return true;
216
371
  const seen = this.seen.get(sid) ?? new Set();
217
372
  this.seen.set(sid, seen);
218
373
  // Only a per-process delivery can repeat: a watch event's key is unique, so remembering it would only grow `seen`.
219
374
  if (processId && deliveredPerProcess(evt)) {
220
375
  if (seen.has(processId))
221
376
  return true;
222
- seen.add(processId);
223
377
  }
224
- this.pendingSessions.add(sid);
225
378
  const prompt = await this.wakeupPrompt(evt);
226
- this.deps.background?.recordEvent(sid, evt, prompt);
227
- this.emitCoalesced(sid, this.buildPayload(evt, sid, prompt));
228
- if (!prompt)
379
+ if ((await this.isReadOnly(owner))) {
380
+ if (home)
381
+ return false;
382
+ this.defer(sid, { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt });
383
+ this.scheduleRetry(sid);
384
+ this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${homeError || 'ownership home unavailable'}; retrying`);
385
+ return true;
386
+ }
387
+ if (evt.reconciliation_profile_home && evt.delegation_id && prompt.includes(str(evt.delegation_id))) {
388
+ // Upgrade a proven pre-receipt Web turn; typed Agent bookkeeping alone never qualifies.
389
+ const previous = owner.messages.find((m) => m._source === 'process_wakeup' && m._turn_id && messageText(m.content) === prompt);
390
+ const turnId = str(previous?._turn_id) || (owner.pending_user_source === 'process_wakeup' && owner.pending_user_message === prompt ? str(owner.active_stream_id) : '');
391
+ if (turnId) {
392
+ const receipts = isDict(owner.extra.completion_acceptances) ? owner.extra.completion_acceptances : {};
393
+ owner.extra.completion_acceptances = { ...receipts, [completionKey(home, evt)]: turnId };
394
+ await this.deps.store.save(owner, { touchUpdatedAt: false });
395
+ return true;
396
+ }
397
+ }
398
+ // The formatter awaits the sidecar; another drain may have retained this event meanwhile.
399
+ if (processId && deliveredPerProcess(evt) && seen.has(processId))
229
400
  return true;
230
401
  const entry = { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt };
231
- if (this.hasActiveTurn(sid))
402
+ if (prompt && evt.type === 'async_delegation')
403
+ this.defer(sid, entry);
404
+ if (prompt && evt.type === 'async_delegation' && !evt.task_failure_notice) {
405
+ try {
406
+ // Busy, Stop, sealed and provider-paused entries survive either process restarting.
407
+ await this.heldWakeups.hold(sid, [entry]);
408
+ recordBackgroundUpdate(owner, `delegation:${str(evt.delegation_id)}`, batchUpdate([{ event: evt, prompt }]));
409
+ await this.deps.store.save(owner, { touchUpdatedAt: false });
410
+ }
411
+ catch (error) {
412
+ this.scheduleRetry(sid);
413
+ this.deps.log(`[webui] WARNING: failed to persist delegation wakeup for session ${sid}; retained in memory for retry: ${error.message}`);
414
+ return true;
415
+ }
416
+ }
417
+ if (processId && deliveredPerProcess(evt))
418
+ seen.add(processId);
419
+ this.pendingSessions.add(sid);
420
+ await this.deps.background?.recordEvent(sid, evt, prompt);
421
+ if (backgroundEventKind(evt) !== 'progress')
422
+ this.emitCoalesced(sid, this.buildPayload(evt, sid, prompt), owner.profile ?? 'default');
423
+ if (!prompt)
424
+ return true;
425
+ if (evt.type === 'async_delegation') {
426
+ if (!this.hasActiveTurn(sid))
427
+ await this.drainDeferred(sid);
428
+ }
429
+ else if (this.hasActiveTurn(sid))
232
430
  this.defer(sid, entry);
233
431
  else
234
432
  await this.startWakeup(sid, [entry]);
@@ -241,7 +439,7 @@ export class CompletionDrain {
241
439
  payload.summary = first.length <= 200 ? first : `${first.slice(0, 200)}\n…(truncated)`;
242
440
  return payload;
243
441
  }
244
- emitNow(sid, payload) {
442
+ emitNow(sid, payload, profile) {
245
443
  let emitted = 0;
246
444
  for (const [streamId, channel] of this.deps.registry.streams) {
247
445
  if (this.deps.registry.activeRuns.get(streamId)?.session_id !== sid)
@@ -250,12 +448,12 @@ export class CompletionDrain {
250
448
  channel.put(['process_complete', { ...payload }, null]);
251
449
  emitted += 2;
252
450
  }
253
- emitted += this.deps.channels.emit(sid, 'bg_task_complete', { ...payload });
254
- emitted += this.deps.channels.emit(sid, 'process_complete', { ...payload });
451
+ emitted += this.deps.channels.emit(sid, 'bg_task_complete', { ...payload }, profile);
452
+ emitted += this.deps.channels.emit(sid, 'process_complete', { ...payload }, profile);
255
453
  return emitted;
256
454
  }
257
455
  /** Python `_emit_bg_task_complete_events_coalesced`: first emit immediately, bursts flush the latest payload after 1 s of quiet. */
258
- emitCoalesced(sid, payload) {
456
+ emitCoalesced(sid, payload, profile) {
259
457
  const now = this.deps.now();
260
458
  const last = this.lastEmitAt.get(sid);
261
459
  const pending = this.pendingEmit.get(sid);
@@ -265,7 +463,7 @@ export class CompletionDrain {
265
463
  this.pendingEmit.delete(sid);
266
464
  }
267
465
  this.lastEmitAt.set(sid, now);
268
- this.emitNow(sid, payload);
466
+ this.emitNow(sid, payload, profile);
269
467
  return;
270
468
  }
271
469
  if (pending)
@@ -276,10 +474,10 @@ export class CompletionDrain {
276
474
  if (!entry)
277
475
  return;
278
476
  this.lastEmitAt.set(sid, this.deps.now());
279
- this.emitNow(sid, entry.payload);
477
+ this.emitNow(sid, entry.payload, entry.profile);
280
478
  }, EMIT_COALESCE_WINDOW_S * 1000);
281
479
  timer.unref();
282
- this.pendingEmit.set(sid, { payload, timer });
480
+ this.pendingEmit.set(sid, { payload, profile, timer });
283
481
  }
284
482
  recordDeferred(sid, processId, prompt, event) {
285
483
  this.defer(sid, { process_id: deliveryKey(event ?? {}, processId), wakeup_prompt: prompt, ...(event ? { event } : {}) });
@@ -313,10 +511,12 @@ export class CompletionDrain {
313
511
  * another consumer delivered (or holds) it, so it leaves the batch; a sidecar failure returns null so the caller keeps
314
512
  * every entry pending. Claims are taken at delivery, never while deferred, so a long turn cannot outlive the lease.
315
513
  */
316
- async claimBatch(home, batched) {
514
+ async claimBatch(home, batched, session) {
317
515
  const deliver = [];
318
516
  const held = [];
319
517
  for (const entry of batched) {
518
+ if ((await this.isReadOnly(session)))
519
+ break;
320
520
  if (entry.event?.type !== 'async_delegation') {
321
521
  deliver.push(entry);
322
522
  continue;
@@ -326,7 +526,10 @@ export class CompletionDrain {
326
526
  try {
327
527
  if (!sidecar)
328
528
  throw new Error('sidecar unavailable');
329
- claimId = (await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER })).claim_id;
529
+ const claim = await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER });
530
+ if (claim.retryable)
531
+ throw new Error('another consumer holds the pending result');
532
+ claimId = claim.claim_id;
330
533
  }
331
534
  catch (error) {
332
535
  await this.settleClaims(home, 'process.release_delivery', held);
@@ -349,15 +552,18 @@ export class CompletionDrain {
349
552
  async settleClaims(home, method, held) {
350
553
  const sidecar = this.deps.sidecar();
351
554
  if (!sidecar)
352
- return;
555
+ return held.length === 0;
556
+ let ok = true;
353
557
  for (const claim of held) {
354
558
  try {
355
559
  await sidecar.call(method, { profile_home: home, event: claim.event, claim_id: claim.claim_id });
356
560
  }
357
561
  catch (error) {
562
+ ok = false;
358
563
  this.deps.log(`[webui] WARNING: ${method} failed for ${str(claim.event.delegation_id)}: ${error.message}`);
359
564
  }
360
565
  }
566
+ return ok;
361
567
  }
362
568
  scheduleRetry(sid) {
363
569
  const attempts = (this.retryAttempts.get(sid) ?? 0) + 1;
@@ -391,10 +597,10 @@ export class CompletionDrain {
391
597
  }
392
598
  }
393
599
  /** A restarted server resumes every session it left holding wakeups (`startWakeup` drops a deleted session's). */
394
- resumeHeld() {
600
+ async resumeHeld() {
395
601
  let sids;
396
602
  try {
397
- sids = this.heldWakeups.sessions();
603
+ sids = (await this.heldWakeups.sessions());
398
604
  }
399
605
  catch (error) {
400
606
  this.deps.log(`[webui] WARNING: held wakeups unreadable; retrying: ${error.message}`);
@@ -404,12 +610,12 @@ export class CompletionDrain {
404
610
  for (const sid of sids)
405
611
  void this.drainDeferred(sid);
406
612
  }
407
- held(sid) {
613
+ async held(sid) {
408
614
  if (this.unreleased.has(sid))
409
- this.release(sid, []);
615
+ (await this.release(sid, []));
410
616
  const done = new Set((this.unreleased.get(sid) ?? []).map(heldKey));
411
617
  try {
412
- return this.heldWakeups.get(sid).filter((e) => !done.has(heldKey(e)));
618
+ return (await this.heldWakeups.get(sid)).filter((e) => !done.has(heldKey(e)));
413
619
  }
414
620
  catch (error) {
415
621
  // An unreadable store is unknown, not empty: recheck later rather than leave the session dormant.
@@ -419,15 +625,15 @@ export class CompletionDrain {
419
625
  }
420
626
  }
421
627
  /** A session whose file is gone was deleted; any other load failure keeps its wakeups. */
422
- deleted(sid, error) {
423
- return error instanceof SessionNotFound && !existsSync(this.deps.store.pathFor(sid));
628
+ async deleted(sid, error) {
629
+ return error instanceof SessionNotFound && !await this.deps.store.exists(sid);
424
630
  }
425
631
  /** Admitted or settled wakeups (every one, with none given) leave the held file. */
426
- release(sid, entries) {
632
+ async release(sid, entries) {
427
633
  // Earlier releases that could not be written go with this one.
428
634
  const batch = entries ? mergeWakeups([...(this.unreleased.get(sid) ?? [])], entries) : undefined;
429
635
  try {
430
- this.heldWakeups.release(sid, batch);
636
+ await this.heldWakeups.release(sid, batch);
431
637
  this.unreleased.delete(sid);
432
638
  }
433
639
  catch (error) {
@@ -436,9 +642,9 @@ export class CompletionDrain {
436
642
  this.deps.log(`[webui] WARNING: failed to release held wakeups for session ${sid}; they are not delivered again: ${error.message}`);
437
643
  }
438
644
  }
439
- saveSession(sid, session) {
645
+ async saveSession(sid, session) {
440
646
  try {
441
- this.deps.store.save(session, { touchUpdatedAt: false });
647
+ (await this.deps.store.save(session, { touchUpdatedAt: false }));
442
648
  }
443
649
  catch (error) {
444
650
  this.deps.log(`[webui] WARNING: failed to save wakeup pause for session ${sid}: ${error.message}`);
@@ -450,10 +656,14 @@ export class CompletionDrain {
450
656
  * Returns whether the wakeup is handled here (held, or dropped with its deleted session).
451
657
  */
452
658
  async holdWhilePaused(sid, session, home, batched) {
659
+ if ((await this.isReadOnly(session))) {
660
+ await this.relinquish(sid, session, batched);
661
+ return true;
662
+ }
453
663
  const pause = session.process_wakeup_pause;
454
664
  if (!wakeupPaused(session, home, this.deps.configPath?.(home))) {
455
665
  if (pause !== session.process_wakeup_pause)
456
- this.saveSession(sid, session);
666
+ (await this.saveSession(sid, session));
457
667
  return false;
458
668
  }
459
669
  const recovery = await this.poolRecovery(home, session);
@@ -461,26 +671,30 @@ export class CompletionDrain {
461
671
  // A deleted session owns no turn; a transient load failure holds the wakeups for the next recheck.
462
672
  let current = null;
463
673
  try {
464
- current = this.deps.store.get(sid);
674
+ current = (await this.deps.store.get(sid));
465
675
  }
466
676
  catch (error) {
467
- if (this.deleted(sid, error)) {
468
- this.release(sid);
677
+ if ((await this.deleted(sid, error))) {
678
+ (await this.release(sid));
469
679
  return true;
470
680
  }
471
681
  }
472
682
  if (current) {
683
+ if ((await this.isReadOnly(current))) {
684
+ await this.relinquish(sid, current, batched);
685
+ return true;
686
+ }
473
687
  const before = current.process_wakeup_pause;
474
688
  if (recovery === true)
475
689
  current.process_wakeup_pause = null;
476
690
  if (recovery === true || !wakeupPaused(current, home, this.deps.configPath?.(home))) {
477
691
  if (before !== current.process_wakeup_pause)
478
- this.saveSession(sid, current);
692
+ (await this.saveSession(sid, current));
479
693
  return false;
480
694
  }
481
695
  }
482
696
  try {
483
- this.heldWakeups.hold(sid, batched);
697
+ (await this.heldWakeups.hold(sid, batched));
484
698
  }
485
699
  catch (error) {
486
700
  for (const e of batched)
@@ -493,17 +707,18 @@ export class CompletionDrain {
493
707
  return true;
494
708
  }
495
709
  /** Python `_start_server_side_wakeup_turn`: one batched turn; 409 re-defers, other failures re-defer with a timed retry. */
496
- async startWakeup(sid, batched) {
710
+ async startWakeup(sid, wakeups) {
711
+ let batched = wakeups;
497
712
  const redefer = (entries) => { for (const e of entries)
498
713
  this.defer(sid, e); };
499
714
  let session;
500
715
  try {
501
- session = this.deps.store.get(sid);
716
+ session = (await this.deps.store.get(sid));
502
717
  }
503
718
  catch (error) {
504
719
  // A deleted session owns no turn: its wakeups, held ones included, go with it.
505
- if (this.deleted(sid, error)) {
506
- this.release(sid);
720
+ if ((await this.deleted(sid, error))) {
721
+ (await this.release(sid));
507
722
  this.deps.log(`[webui] server-side wakeup dropped for deleted session ${sid}`);
508
723
  return false;
509
724
  }
@@ -520,25 +735,72 @@ export class CompletionDrain {
520
735
  // TAL-534: the delegation's ledger row lives in the session's own profile, whichever profile is active now.
521
736
  let home;
522
737
  try {
523
- home = this.deps.profileHome(session.profile ?? this.deps.activeProfile());
738
+ home = this.ownerHome(session);
524
739
  }
525
740
  catch (error) {
526
741
  redefer(batched);
527
742
  this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${error.message}`);
528
743
  return false;
529
744
  }
745
+ if ((await this.isReadOnly(session))) {
746
+ await this.relinquish(sid, session, batched);
747
+ return false;
748
+ }
749
+ const accepted = batched.filter((e) => completionAccepted(session, completionKey(home, e.event ?? {})));
750
+ if (accepted.length) {
751
+ // A crash may have saved admission before acknowledging the Agent. Finish that handshake without a new turn.
752
+ const claims = await this.claimBatch(home, accepted, session);
753
+ if (claims && (await this.isReadOnly(session))) {
754
+ await this.relinquish(sid, session, batched, claims.held);
755
+ return false;
756
+ }
757
+ if (!claims || !(await this.settleClaims(home, 'process.complete_delivery', claims.held))) {
758
+ redefer(batched);
759
+ this.scheduleRetry(sid);
760
+ return false;
761
+ }
762
+ await this.release(sid, accepted);
763
+ batched = batched.filter((e) => !accepted.includes(e));
764
+ }
765
+ if (!batched.length)
766
+ return false;
767
+ // TAL-907: `off` mutes process-driven wakeups at delivery, so a deferred or held wakeup follows the current setting; the
768
+ // drained event's record and status row are its whole delivery. A subagent result is not a process notification and
769
+ // still lands, as in the Agent. A setting that cannot be read retains the wakeups rather than start a turn.
770
+ const muted = batched.filter((e) => e.event?.type !== 'async_delegation');
771
+ if (muted.length) {
772
+ const off = await this.notificationsOff(home);
773
+ if (off === null) {
774
+ redefer(batched);
775
+ this.scheduleRetry(sid);
776
+ this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: background_process_notifications is unreadable; retrying`);
777
+ return false;
778
+ }
779
+ if (off) {
780
+ await this.release(sid, muted);
781
+ batched = batched.filter((e) => !muted.includes(e));
782
+ if (!batched.length) {
783
+ this.retryAttempts.delete(sid);
784
+ return false;
785
+ }
786
+ }
787
+ }
530
788
  if (await this.holdWhilePaused(sid, session, home, batched))
531
789
  return false;
532
- const claimed = await this.claimBatch(home, batched);
790
+ const claimed = await this.claimBatch(home, batched, session);
533
791
  if (!claimed) {
534
792
  redefer(batched);
535
793
  this.scheduleRetry(sid);
536
794
  return false;
537
795
  }
538
796
  const { deliver, held } = claimed;
797
+ if ((await this.isReadOnly(session))) {
798
+ await this.relinquish(sid, session, batched, held);
799
+ return false;
800
+ }
539
801
  // Entries another consumer already delivered are done here too.
540
802
  if (!deliver.length) {
541
- this.release(sid, batched);
803
+ (await this.release(sid, batched));
542
804
  await this.markConsumed(batched);
543
805
  return true;
544
806
  }
@@ -547,7 +809,7 @@ export class CompletionDrain {
547
809
  const prompt = deliver.length === 1 ? deliver[0].wakeup_prompt : deliver.map((e) => e.wakeup_prompt).join('\n\n');
548
810
  let resp;
549
811
  try {
550
- resp = await this.deps.startTurn(session, prompt);
812
+ resp = await this.deps.startTurn(session, prompt, deliver.map((e) => completionKey(home, e.event ?? {})).filter(Boolean), batchUpdate(deliver.map((e) => ({ event: e.event ?? {}, prompt: e.wakeup_prompt }))));
551
813
  }
552
814
  catch (error) {
553
815
  await giveBack();
@@ -555,6 +817,10 @@ export class CompletionDrain {
555
817
  this.deps.log(`[webui] WARNING: server-side wakeup turn raised for session ${sid}: ${error.message}`);
556
818
  return false;
557
819
  }
820
+ if ((await this.isReadOnly(session))) {
821
+ await this.relinquish(sid, session, batched, held);
822
+ return false;
823
+ }
558
824
  const status = resp._status ?? (resp.stream_id ? 200 : 500);
559
825
  // A busy session redelivers at its turn teardown; a stale runtime admits no turn, so it is retried on a timer (TAL-577).
560
826
  if (status === 409) {
@@ -570,9 +836,14 @@ export class CompletionDrain {
570
836
  return false;
571
837
  }
572
838
  this.retryAttempts.delete(sid);
573
- this.release(sid, batched);
574
839
  recordBackgroundUpdate(session, str(resp.stream_id), batchUpdate(deliver.map((e) => ({ event: e.event ?? {}, prompt: e.wakeup_prompt }))));
575
- await this.settleClaims(home, 'process.complete_delivery', held);
840
+ await this.saveSession(sid, session);
841
+ if (await this.settleClaims(home, 'process.complete_delivery', held))
842
+ (await this.release(sid, batched));
843
+ else {
844
+ redefer(deliver);
845
+ this.scheduleRetry(sid);
846
+ }
576
847
  await this.markConsumed(batched);
577
848
  this.deps.log(`[webui] server-side wakeup turn started for session ${sid} (stream_id=${str(resp.stream_id)})`);
578
849
  return true;
@@ -601,7 +872,7 @@ export class CompletionDrain {
601
872
  * TAL-576: one drain per session at a time, so two never copy the same held wakeups before either admits them.
602
873
  */
603
874
  drainDeferred(sid) {
604
- const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(() => this.drainDeferredNow(sid));
875
+ const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(async () => (await this.drainDeferredNow(sid)));
605
876
  this.drains.set(sid, run);
606
877
  void run.finally(() => { if (this.drains.get(sid) === run)
607
878
  this.drains.delete(sid); }).catch(() => undefined);
@@ -610,7 +881,7 @@ export class CompletionDrain {
610
881
  async drainDeferredNow(sid) {
611
882
  if (!sid || this.hasActiveTurn(sid))
612
883
  return 0;
613
- const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], this.held(sid));
884
+ const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], (await this.held(sid)));
614
885
  if (!entries.length)
615
886
  return 0;
616
887
  this.deferred.delete(sid);
@@ -618,7 +889,7 @@ export class CompletionDrain {
618
889
  const prompted = entries.filter((e) => e.wakeup_prompt.trim());
619
890
  const held = await this.alreadyConsumed(prompted);
620
891
  if (held.size) {
621
- this.release(sid, [...held]);
892
+ await this.release(sid, [...held]);
622
893
  const ids = [...held].map((e) => e.process_id);
623
894
  await this.markConsumed([...held]);
624
895
  this.deps.log(`[webui] dropped ${String(held.size)} deferred wakeup(s) already consumed by the agent's own turn for session ${sid}: ${ids.join(', ')}`);