@maudecode/talaria-web 1.18.0 → 1.19.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 (567) 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 +32 -32
  6. package/dist/api/automation-raw.js.map +1 -1
  7. package/dist/api/automation-router.d.ts +102 -22
  8. package/dist/api/automation-router.js +15 -13
  9. package/dist/api/automation-router.js.map +1 -1
  10. package/dist/api/chat-router.d.ts +1205 -34
  11. package/dist/api/chat-router.js +158 -78
  12. package/dist/api/chat-router.js.map +1 -1
  13. package/dist/api/git-router.d.ts +2 -2
  14. package/dist/api/git-router.js +29 -29
  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 +63 -61
  18. package/dist/api/raw-routes.js.map +1 -1
  19. package/dist/api/router.d.ts +6 -6
  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 +1928 -124
  26. package/dist/api/sessions-router.js +177 -173
  27. package/dist/api/sessions-router.js.map +1 -1
  28. package/dist/api/settings-router.d.ts +427 -9
  29. package/dist/api/settings-router.js +48 -32
  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 +63 -63
  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 +663 -91
  38. package/dist/api/tools-router.js +309 -52
  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 +66 -47
  45. package/dist/app.js.map +1 -1
  46. package/dist/auth/gate.js +10 -9
  47. package/dist/auth/gate.js.map +1 -1
  48. package/dist/auth/passkeys.d.ts +15 -14
  49. package/dist/auth/passkeys.js +89 -91
  50. package/dist/auth/passkeys.js.map +1 -1
  51. package/dist/auth/store.d.ts +17 -7
  52. package/dist/auth/store.js +93 -52
  53. package/dist/auth/store.js.map +1 -1
  54. package/dist/bin/talaria-web.js +12 -81
  55. package/dist/bin/talaria-web.js.map +1 -1
  56. package/dist/cli/ctl.js +2 -1
  57. package/dist/cli/ctl.js.map +1 -1
  58. package/dist/cli/dotenv.d.ts +5 -0
  59. package/dist/cli/dotenv.js +14 -2
  60. package/dist/cli/dotenv.js.map +1 -1
  61. package/dist/cli/launcher.js +5 -5
  62. package/dist/cli/launcher.js.map +1 -1
  63. package/dist/cli/main.d.ts +1 -0
  64. package/dist/cli/main.js +85 -0
  65. package/dist/cli/main.js.map +1 -0
  66. package/dist/cli/supervise.d.ts +2 -0
  67. package/dist/cli/supervise.js +67 -4
  68. package/dist/cli/supervise.js.map +1 -1
  69. package/dist/config/agent-config.d.ts +34 -11
  70. package/dist/config/agent-config.js +113 -58
  71. package/dist/config/agent-config.js.map +1 -1
  72. package/dist/config.d.ts +2 -0
  73. package/dist/config.js +14 -5
  74. package/dist/config.js.map +1 -1
  75. package/dist/fs/atomic.d.ts +1 -0
  76. package/dist/fs/atomic.js +4 -1
  77. package/dist/fs/atomic.js.map +1 -1
  78. package/dist/fs/stat.d.ts +1 -0
  79. package/dist/fs/stat.js +11 -0
  80. package/dist/fs/stat.js.map +1 -0
  81. package/dist/http/context.d.ts +14 -9
  82. package/dist/http/context.js +29 -20
  83. package/dist/http/context.js.map +1 -1
  84. package/dist/onboarding.d.ts +2 -2
  85. package/dist/onboarding.js +10 -8
  86. package/dist/onboarding.js.map +1 -1
  87. package/dist/profiles/profiles.d.ts +10 -4
  88. package/dist/profiles/profiles.js +77 -30
  89. package/dist/profiles/profiles.js.map +1 -1
  90. package/dist/projects.d.ts +15 -6
  91. package/dist/projects.js +55 -47
  92. package/dist/projects.js.map +1 -1
  93. package/dist/providers/catalog.d.ts +78 -12
  94. package/dist/providers/catalog.js +445 -141
  95. package/dist/providers/catalog.js.map +1 -1
  96. package/dist/providers/env-file.d.ts +10 -3
  97. package/dist/providers/env-file.js +24 -75
  98. package/dist/providers/env-file.js.map +1 -1
  99. package/dist/providers/runtime-env.d.ts +4 -2
  100. package/dist/providers/runtime-env.js +9 -6
  101. package/dist/providers/runtime-env.js.map +1 -1
  102. package/dist/providers/tables.d.ts +3 -1
  103. package/dist/providers/tables.js +4 -2
  104. package/dist/providers/tables.js.map +1 -1
  105. package/dist/redact.js +18 -9
  106. package/dist/redact.js.map +1 -1
  107. package/dist/release.d.ts +7 -0
  108. package/dist/release.js +14 -0
  109. package/dist/release.js.map +1 -1
  110. package/dist/runtime.d.ts +5 -1
  111. package/dist/runtime.js +233 -90
  112. package/dist/runtime.js.map +1 -1
  113. package/dist/server.js +10 -0
  114. package/dist/server.js.map +1 -1
  115. package/dist/sessions/anchor.d.ts +9 -3
  116. package/dist/sessions/anchor.js +28 -36
  117. package/dist/sessions/anchor.js.map +1 -1
  118. package/dist/sessions/background-events.d.ts +2 -0
  119. package/dist/sessions/background-events.js +10 -0
  120. package/dist/sessions/background-events.js.map +1 -0
  121. package/dist/sessions/background-tasks.d.ts +26 -20
  122. package/dist/sessions/background-tasks.js +88 -86
  123. package/dist/sessions/background-tasks.js.map +1 -1
  124. package/dist/sessions/background-updates.d.ts +15 -8
  125. package/dist/sessions/background-updates.js +101 -25
  126. package/dist/sessions/background-updates.js.map +1 -1
  127. package/dist/sessions/cli-sessions.d.ts +15 -5
  128. package/dist/sessions/cli-sessions.js +62 -43
  129. package/dist/sessions/cli-sessions.js.map +1 -1
  130. package/dist/sessions/completions.d.ts +30 -2
  131. package/dist/sessions/completions.js +294 -53
  132. package/dist/sessions/completions.js.map +1 -1
  133. package/dist/sessions/compress.d.ts +8 -0
  134. package/dist/sessions/compress.js +2 -2
  135. package/dist/sessions/compress.js.map +1 -1
  136. package/dist/sessions/drafts.d.ts +14 -10
  137. package/dist/sessions/drafts.js +38 -43
  138. package/dist/sessions/drafts.js.map +1 -1
  139. package/dist/sessions/gateway-sessions.d.ts +46 -0
  140. package/dist/sessions/gateway-sessions.js +378 -0
  141. package/dist/sessions/gateway-sessions.js.map +1 -0
  142. package/dist/sessions/goals.d.ts +31 -0
  143. package/dist/sessions/goals.js +75 -0
  144. package/dist/sessions/goals.js.map +1 -0
  145. package/dist/sessions/journal.d.ts +5 -79
  146. package/dist/sessions/journal.js +15 -606
  147. package/dist/sessions/journal.js.map +1 -1
  148. package/dist/sessions/list.d.ts +27 -18
  149. package/dist/sessions/list.js +133 -131
  150. package/dist/sessions/list.js.map +1 -1
  151. package/dist/sessions/merge.d.ts +68 -10
  152. package/dist/sessions/merge.js +259 -51
  153. package/dist/sessions/merge.js.map +1 -1
  154. package/dist/sessions/notices.d.ts +22 -0
  155. package/dist/sessions/notices.js +72 -0
  156. package/dist/sessions/notices.js.map +1 -0
  157. package/dist/sessions/pending.d.ts +10 -4
  158. package/dist/sessions/pending.js +83 -7
  159. package/dist/sessions/pending.js.map +1 -1
  160. package/dist/sessions/prefix-index.d.ts +82 -0
  161. package/dist/sessions/prefix-index.js +232 -0
  162. package/dist/sessions/prefix-index.js.map +1 -0
  163. package/dist/sessions/recovery.d.ts +4 -7
  164. package/dist/sessions/recovery.js +97 -281
  165. package/dist/sessions/recovery.js.map +1 -1
  166. package/dist/sessions/relay.d.ts +20 -20
  167. package/dist/sessions/relay.js +205 -127
  168. package/dist/sessions/relay.js.map +1 -1
  169. package/dist/sessions/service.d.ts +162 -59
  170. package/dist/sessions/service.js +1133 -521
  171. package/dist/sessions/service.js.map +1 -1
  172. package/dist/sessions/session.d.ts +18 -2
  173. package/dist/sessions/session.js +29 -5
  174. package/dist/sessions/session.js.map +1 -1
  175. package/dist/sessions/shares.d.ts +7 -6
  176. package/dist/sessions/shares.js +22 -45
  177. package/dist/sessions/shares.js.map +1 -1
  178. package/dist/sessions/source-kind.js +1 -0
  179. package/dist/sessions/source-kind.js.map +1 -1
  180. package/dist/sessions/state-db-identity.d.ts +18 -0
  181. package/dist/sessions/state-db-identity.js +67 -0
  182. package/dist/sessions/state-db-identity.js.map +1 -0
  183. package/dist/sessions/state-db-worker.js +3 -1
  184. package/dist/sessions/state-db-worker.js.map +1 -1
  185. package/dist/sessions/state-db.d.ts +53 -8
  186. package/dist/sessions/state-db.js +576 -50
  187. package/dist/sessions/state-db.js.map +1 -1
  188. package/dist/sessions/storage/backend.d.ts +162 -0
  189. package/dist/sessions/storage/backend.js +19 -0
  190. package/dist/sessions/storage/backend.js.map +1 -0
  191. package/dist/sessions/storage/conformance.d.ts +20 -0
  192. package/dist/sessions/storage/conformance.js +237 -0
  193. package/dist/sessions/storage/conformance.js.map +1 -0
  194. package/dist/sessions/storage/document.d.ts +16 -0
  195. package/dist/sessions/storage/document.js +44 -0
  196. package/dist/sessions/storage/document.js.map +1 -0
  197. package/dist/sessions/storage/json-documents.d.ts +23 -0
  198. package/dist/sessions/storage/json-documents.js +233 -0
  199. package/dist/sessions/storage/json-documents.js.map +1 -0
  200. package/dist/sessions/storage/json-files.d.ts +12 -0
  201. package/dist/sessions/storage/json-files.js +124 -0
  202. package/dist/sessions/storage/json-files.js.map +1 -0
  203. package/dist/sessions/storage/json-installation.d.ts +3 -0
  204. package/dist/sessions/storage/json-installation.js +31 -0
  205. package/dist/sessions/storage/json-installation.js.map +1 -0
  206. package/dist/sessions/storage/json-journal.d.ts +114 -0
  207. package/dist/sessions/storage/json-journal.js +686 -0
  208. package/dist/sessions/storage/json-journal.js.map +1 -0
  209. package/dist/sessions/storage/json-recovery.d.ts +4 -0
  210. package/dist/sessions/storage/json-recovery.js +195 -0
  211. package/dist/sessions/storage/json-recovery.js.map +1 -0
  212. package/dist/sessions/storage/json.d.ts +68 -0
  213. package/dist/sessions/storage/json.js +258 -0
  214. package/dist/sessions/storage/json.js.map +1 -0
  215. package/dist/sessions/storage/row.d.ts +6 -0
  216. package/dist/sessions/storage/row.js +49 -0
  217. package/dist/sessions/storage/row.js.map +1 -0
  218. package/dist/sessions/storage/search-text.d.ts +4 -0
  219. package/dist/sessions/storage/search-text.js +16 -0
  220. package/dist/sessions/storage/search-text.js.map +1 -0
  221. package/dist/sessions/store.d.ts +63 -73
  222. package/dist/sessions/store.js +305 -611
  223. package/dist/sessions/store.js.map +1 -1
  224. package/dist/sessions/streams.d.ts +4 -0
  225. package/dist/sessions/streams.js +9 -1
  226. package/dist/sessions/streams.js.map +1 -1
  227. package/dist/sessions/titles.js +1 -1
  228. package/dist/sessions/titles.js.map +1 -1
  229. package/dist/sessions/todo.d.ts +5 -0
  230. package/dist/sessions/todo.js +28 -21
  231. package/dist/sessions/todo.js.map +1 -1
  232. package/dist/sessions/tool-display.d.ts +5 -4
  233. package/dist/sessions/tool-display.js +22 -16
  234. package/dist/sessions/tool-display.js.map +1 -1
  235. package/dist/sessions/turn-context.d.ts +10 -1
  236. package/dist/sessions/turn-context.js +7 -4
  237. package/dist/sessions/turn-context.js.map +1 -1
  238. package/dist/sessions/turn.d.ts +87 -17
  239. package/dist/sessions/turn.js +795 -347
  240. package/dist/sessions/turn.js.map +1 -1
  241. package/dist/sessions/wakeup-pause.d.ts +8 -13
  242. package/dist/sessions/wakeup-pause.js +31 -49
  243. package/dist/sessions/wakeup-pause.js.map +1 -1
  244. package/dist/sessions/window.js +13 -12
  245. package/dist/sessions/window.js.map +1 -1
  246. package/dist/settings.d.ts +19 -7
  247. package/dist/settings.js +179 -183
  248. package/dist/settings.js.map +1 -1
  249. package/dist/sidecar/client.d.ts +17 -3
  250. package/dist/sidecar/client.js +78 -8
  251. package/dist/sidecar/client.js.map +1 -1
  252. package/dist/sidecar/discover.d.ts +2 -1
  253. package/dist/sidecar/discover.js +93 -10
  254. package/dist/sidecar/discover.js.map +1 -1
  255. package/dist/sidecar/env.d.ts +4 -0
  256. package/dist/sidecar/env.js +3 -0
  257. package/dist/sidecar/env.js.map +1 -0
  258. package/dist/sidecar/fake.js +19 -2
  259. package/dist/sidecar/fake.js.map +1 -1
  260. package/dist/test/env-file.d.ts +5 -0
  261. package/dist/test/env-file.js +88 -0
  262. package/dist/test/env-file.js.map +1 -0
  263. package/dist/test/harness.d.ts +1 -0
  264. package/dist/test/harness.js +1 -1
  265. package/dist/test/harness.js.map +1 -1
  266. package/dist/test/passkeys.d.ts +22 -0
  267. package/dist/test/passkeys.js +62 -0
  268. package/dist/test/passkeys.js.map +1 -0
  269. package/dist/test/storage.d.ts +15 -0
  270. package/dist/test/storage.js +26 -0
  271. package/dist/test/storage.js.map +1 -0
  272. package/dist/tools/commands.d.ts +6 -1
  273. package/dist/tools/commands.js +8 -2
  274. package/dist/tools/commands.js.map +1 -1
  275. package/dist/tools/connectors.d.ts +33 -0
  276. package/dist/tools/connectors.js +121 -0
  277. package/dist/tools/connectors.js.map +1 -0
  278. package/dist/tools/crons.d.ts +38 -1
  279. package/dist/tools/crons.js +82 -15
  280. package/dist/tools/crons.js.map +1 -1
  281. package/dist/tools/dashboard-plugins.d.ts +5 -5
  282. package/dist/tools/dashboard-plugins.js +14 -14
  283. package/dist/tools/dashboard-plugins.js.map +1 -1
  284. package/dist/tools/extensions.d.ts +5 -4
  285. package/dist/tools/extensions.js +213 -207
  286. package/dist/tools/extensions.js.map +1 -1
  287. package/dist/tools/gateway-restart.d.ts +62 -0
  288. package/dist/tools/gateway-restart.js +142 -0
  289. package/dist/tools/gateway-restart.js.map +1 -0
  290. package/dist/tools/health.d.ts +15 -3
  291. package/dist/tools/health.js +97 -34
  292. package/dist/tools/health.js.map +1 -1
  293. package/dist/tools/hygiene.d.ts +4 -3
  294. package/dist/tools/hygiene.js +23 -9
  295. package/dist/tools/hygiene.js.map +1 -1
  296. package/dist/tools/kanban.d.ts +4 -2
  297. package/dist/tools/kanban.js +28 -19
  298. package/dist/tools/kanban.js.map +1 -1
  299. package/dist/tools/memory-masks.d.ts +5 -0
  300. package/dist/tools/memory-masks.js +256 -0
  301. package/dist/tools/memory-masks.js.map +1 -0
  302. package/dist/tools/memory.d.ts +29 -3
  303. package/dist/tools/memory.js +69 -27
  304. package/dist/tools/memory.js.map +1 -1
  305. package/dist/tools/plugin-settings.d.ts +15 -0
  306. package/dist/tools/plugin-settings.js +90 -0
  307. package/dist/tools/plugin-settings.js.map +1 -0
  308. package/dist/tools/skills.d.ts +9 -4
  309. package/dist/tools/skills.js +44 -13
  310. package/dist/tools/skills.js.map +1 -1
  311. package/dist/tools/update-notifications.d.ts +34 -15
  312. package/dist/tools/update-notifications.js +141 -57
  313. package/dist/tools/update-notifications.js.map +1 -1
  314. package/dist/tools/update-rollback.d.ts +11 -0
  315. package/dist/tools/update-rollback.js +28 -0
  316. package/dist/tools/update-rollback.js.map +1 -0
  317. package/dist/tools/updates.d.ts +93 -33
  318. package/dist/tools/updates.js +1051 -345
  319. package/dist/tools/updates.js.map +1 -1
  320. package/dist/util.d.ts +2 -0
  321. package/dist/util.js +5 -0
  322. package/dist/util.js.map +1 -1
  323. package/dist/workspace/git.d.ts +16 -1
  324. package/dist/workspace/git.js +291 -11
  325. package/dist/workspace/git.js.map +1 -1
  326. package/dist/workspace/media.d.ts +12 -9
  327. package/dist/workspace/media.js +31 -20
  328. package/dist/workspace/media.js.map +1 -1
  329. package/dist/workspace/rollback.d.ts +2 -2
  330. package/dist/workspace/rollback.js +5 -5
  331. package/dist/workspace/rollback.js.map +1 -1
  332. package/dist/workspace/workspaces.d.ts +15 -19
  333. package/dist/workspace/workspaces.js +55 -127
  334. package/dist/workspace/workspaces.js.map +1 -1
  335. package/dist/workspace/worktrees.js +170 -32
  336. package/dist/workspace/worktrees.js.map +1 -1
  337. package/package.json +5 -3
  338. package/sidecar/agent_dependency.json +4 -4
  339. package/sidecar/agent_support.json +26 -0
  340. package/sidecar/scripts/record-fixtures.py +12 -3
  341. package/sidecar/scripts/replay_sidecar.py +8 -0
  342. package/sidecar/scripts/suite_runner.py +302 -0
  343. package/sidecar/scripts/test.sh +12 -4
  344. package/sidecar/talaria_sidecar/__init__.py +6 -1
  345. package/sidecar/talaria_sidecar/__main__.py +4 -2
  346. package/sidecar/talaria_sidecar/agent_mutation.py +975 -0
  347. package/sidecar/talaria_sidecar/agent_services.py +1053 -0
  348. package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
  349. package/sidecar/talaria_sidecar/home.py +43 -1
  350. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  351. package/sidecar/talaria_sidecar/methods/aux.py +139 -31
  352. package/sidecar/talaria_sidecar/methods/chat.py +847 -134
  353. package/sidecar/talaria_sidecar/methods/commands.py +213 -4
  354. package/sidecar/talaria_sidecar/methods/config.py +123 -4
  355. package/sidecar/talaria_sidecar/methods/connectors.py +343 -0
  356. package/sidecar/talaria_sidecar/methods/cron.py +366 -34
  357. package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
  358. package/sidecar/talaria_sidecar/methods/gateway.py +194 -54
  359. package/sidecar/talaria_sidecar/methods/gateway_sessions.py +234 -0
  360. package/sidecar/talaria_sidecar/methods/goals.py +81 -41
  361. package/sidecar/talaria_sidecar/methods/kanban.py +80 -27
  362. package/sidecar/talaria_sidecar/methods/memory.py +84 -0
  363. package/sidecar/talaria_sidecar/methods/oauth.py +5 -2
  364. package/sidecar/talaria_sidecar/methods/process.py +160 -11
  365. package/sidecar/talaria_sidecar/methods/profiles.py +44 -6
  366. package/sidecar/talaria_sidecar/methods/providers.py +196 -26
  367. package/sidecar/talaria_sidecar/methods/runtime.py +69 -1
  368. package/sidecar/talaria_sidecar/methods/skills.py +67 -4
  369. package/sidecar/talaria_sidecar/methods/state_db.py +277 -70
  370. package/sidecar/talaria_sidecar/methods/stt.py +159 -78
  371. package/sidecar/talaria_sidecar/methods/text.py +14 -1
  372. package/sidecar/talaria_sidecar/methods/toolsets.py +49 -0
  373. package/sidecar/talaria_sidecar/methods/usage.py +113 -14
  374. package/sidecar/talaria_sidecar/methods/worktree.py +26 -19
  375. package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
  376. package/sidecar/talaria_sidecar/rpc.py +45 -4
  377. package/sidecar/talaria_sidecar/runtime.py +81 -12
  378. package/sidecar/talaria_sidecar/speed.py +35 -0
  379. package/static/dist/FILES.txt +126 -127
  380. package/static/dist/assets/AppShell-cey33v9s.js +8 -0
  381. package/static/dist/assets/ChatPage-i8wnugr7.js +18 -0
  382. package/static/dist/assets/ConnectTargets-hg19553x.js +1 -0
  383. package/static/dist/assets/ExtensionRoute-cly4apm5.js +1 -0
  384. package/static/dist/assets/Field-j8uqoigz.js +9 -0
  385. package/static/dist/assets/HubRoute-e4bgz41j.js +2 -0
  386. package/static/dist/assets/Markdown-lahuichm.js +598 -0
  387. package/static/dist/assets/RightPanel-lbo4i0fn.js +1 -0
  388. package/static/dist/assets/Select-gqatm2e0.js +1 -0
  389. package/static/dist/assets/SessionListPanel-mfqayfjh.js +1 -0
  390. package/static/dist/assets/SettingsLayout-b8980u7k.js +1 -0
  391. package/static/dist/assets/States-e7dkgtxf.js +1 -0
  392. package/static/dist/assets/Toaster-bfqqy786.js +1 -0
  393. package/static/dist/assets/_app-n1n6pfx1.js +1 -0
  394. package/static/dist/assets/{_app.ext._extensionId-gfbzpoou.js → _app.ext._extensionId-buxjxav3.js} +1 -1
  395. package/static/dist/assets/_app.index-jt8zwiu2.js +1 -0
  396. package/static/dist/assets/_app.insights-cv76ml71.js +1 -0
  397. package/static/dist/assets/_app.kanban-h6ts53j7.js +1 -0
  398. package/static/dist/assets/_app.logs-dm873z90.js +1 -0
  399. package/static/dist/assets/_app.memory-glk5y6m8.js +1 -0
  400. package/static/dist/assets/_app.profiles-ka6zpstq.js +1 -0
  401. package/static/dist/assets/{_app.session._sessionId-fn1bhde6.js → _app.session._sessionId-g2vzghvc.js} +1 -1
  402. package/static/dist/assets/_app.settings-hgjdhzcd.js +1 -0
  403. package/static/dist/assets/_app.settings._section-jf2kmhae.js +3 -0
  404. package/static/dist/assets/_app.skills-cii852yq.js +1 -0
  405. package/static/dist/assets/_app.tasks-fp9q7atm.js +1 -0
  406. package/static/dist/assets/_app.todos-dw94qzue.js +1 -0
  407. package/static/dist/assets/_app.workspaces-inyygzze.js +1 -0
  408. package/static/dist/assets/{abnfDiagram-VCTEODGH-c8kdixke.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
  409. package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
  410. package/static/dist/assets/{architectureDiagram-5GKGNRK7-cku06x1p.js → architectureDiagram-5GKGNRK7-nwb3xovn.js} +1 -1
  411. package/static/dist/assets/archive-b1j004vn.js +1 -0
  412. package/static/dist/assets/back-g74gkozu.js +1 -0
  413. package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
  414. package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
  415. package/static/dist/assets/channel-es95o4y8.js +1 -0
  416. package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
  417. package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
  418. package/static/dist/assets/{chunk-DU6HZSFF-ofajdixh.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
  419. package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
  420. package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
  421. package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
  422. package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
  423. package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
  424. package/static/dist/assets/{chunk-OSK3NFVY-e7gkikcw.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
  425. package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
  426. package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
  427. package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
  428. package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
  429. package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
  430. package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-bnk3m1mq.js} +1 -1
  431. package/static/dist/assets/classDiagram-ZZMXUADV-kmihoqxh.js +1 -0
  432. package/static/dist/assets/classDiagram-v2-VYDZK3BY-kmihoqxh.js +1 -0
  433. package/static/dist/assets/copied-bli9tbcx.js +1 -0
  434. package/static/dist/assets/{copy-magtofyp.js → copy-jamtd1pf.js} +1 -1
  435. package/static/dist/assets/{cynefin-OW5HDTMX-siqlulkl.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
  436. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-i648tah9.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
  437. package/static/dist/assets/{dagre-GXQ25YYZ-mwn6uc17.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
  438. package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
  439. package/static/dist/assets/{diagram-UQ7AKVKN-mekq7zgq.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
  440. package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
  441. package/static/dist/assets/{diagram-VX7I27RA-xe6r5qfw.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
  442. package/static/dist/assets/{diagram-Z3DM3KII-nq07dg7k.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
  443. package/static/dist/assets/{ebnfDiagram-PWID7BFC-c62ipm3g.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
  444. package/static/dist/assets/{erDiagram-RLTQ6QDP-h39kmnzy.js → erDiagram-RLTQ6QDP-brdu9lcm.js} +1 -1
  445. package/static/dist/assets/eventmodeling-NTZA5JFV-njk1j8wl.js +1 -0
  446. package/static/dist/assets/flowDiagram-HODETNUW-nma6f0ga.js +1 -0
  447. package/static/dist/assets/folder-plus-lvt9kudb.js +1 -0
  448. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
  449. package/static/dist/assets/{gitGraph-4MIJSDKK-fr2i7caa.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
  450. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
  451. package/static/dist/assets/{highlighted-body-KPVGNVTW-jwpop9p8.js → highlighted-body-KPVGNVTW-ghoavj8d.js} +1 -1
  452. package/static/dist/assets/host-hzm8n85n.js +1 -0
  453. package/static/dist/assets/index-drdcaqeq.css +2 -0
  454. package/static/dist/assets/index-jzm844he.js +11 -0
  455. package/static/dist/assets/{info-A6RAGUB7-h11x0dxo.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
  456. package/static/dist/assets/{infoDiagram-27XIBGKW-dfh47dw9.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
  457. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
  458. package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
  459. package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
  460. package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
  461. package/static/dist/assets/{line-meizqsvn.js → line-h0ojzsvs.js} +1 -1
  462. package/static/dist/assets/link-k01ryaf9.js +1 -0
  463. package/static/dist/assets/login-bsae49ew.js +1 -0
  464. package/static/dist/assets/mermaid-HWGCJPDP-ihl34s74.js +1 -0
  465. package/static/dist/assets/{mermaid-parser.core-ntne45i9.js → mermaid-parser.core-bnre27u8.js} +3 -3
  466. package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-o1vathns.js} +1 -1
  467. package/static/dist/assets/onboarding-c65tysya.js +1 -0
  468. package/static/dist/assets/onboarding_model_label-gpn28uix.js +1 -0
  469. package/static/dist/assets/{packet-AYTQ26CC-l6jdka8p.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
  470. package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
  471. package/static/dist/assets/{pegDiagram-XKGWAZYB-g1er3bxj.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
  472. package/static/dist/assets/{pie-WAS4IAKB-i0ylcrt9.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
  473. package/static/dist/assets/{pieDiagram-E7YTZNPT-fbz1e55z.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
  474. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
  475. package/static/dist/assets/{radar-RG4KPBEZ-f9b70aa4.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
  476. package/static/dist/assets/{railroad-74A4TZTK-lgsuoeda.js → railroad-74A4TZTK-a7t5eibp.js} +1 -1
  477. package/static/dist/assets/railroad-abnf-HS5TGJTU-ol8cdktf.js +1 -0
  478. package/static/dist/assets/railroad-ebnf-LZEXJU2U-i8vzd429.js +1 -0
  479. package/static/dist/assets/railroad-peg-WCYAUIDC-nw3ulewz.js +1 -0
  480. package/static/dist/assets/{railroadDiagram-O6MQD6OU-eqpy9fnz.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
  481. package/static/dist/assets/{refresh-cw-hlwb02qv.js → refresh-cw-mqbkv2a3.js} +1 -1
  482. package/static/dist/assets/refresh-l29ljp76.js +1 -0
  483. package/static/dist/assets/{requirementDiagram-BXWQKSXE-ogf6puhi.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
  484. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
  485. package/static/dist/assets/saved-ndd4t2xb.js +1 -0
  486. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-i0v116q0.js} +2 -2
  487. package/static/dist/assets/settings_section_extensions_title-jhfo6o8z.js +1 -0
  488. package/static/dist/assets/share._token-c1ri0hy1.js +2 -0
  489. package/static/dist/assets/sliders-horizontal-j3jjt9tv.js +1 -0
  490. package/static/dist/assets/{stateDiagram-D77RDMKH-fyoznpcs.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
  491. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
  492. package/static/dist/assets/{swimlanes-42K2YHIH-oefldhfy.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
  493. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
  494. package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
  495. package/static/dist/assets/toast-i3h34v6o.js +64 -0
  496. package/static/dist/assets/{treeView-Q6P3EWNA-f7hcci5o.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
  497. package/static/dist/assets/{treemap-WGGIJYW6-nl85071a.js → treemap-WGGIJYW6-lzr49vv5.js} +1 -1
  498. package/static/dist/assets/untitled-oaoya4qj.js +1 -0
  499. package/static/dist/assets/useForm-nfaxgmsk.js +1 -0
  500. package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-gjc70qru.js} +1 -1
  501. package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-e6ae539u.js} +1 -1
  502. package/static/dist/assets/{vennDiagram-4TSXK5OY-h5hzbk0n.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
  503. package/static/dist/assets/{wardley-WFR3VGLG-jftvpm3e.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
  504. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hedh85ge.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
  505. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-aqbgvujg.js} +1 -1
  506. package/static/dist/index.html +1 -1
  507. package/static/dist/sw.js +1 -1
  508. package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
  509. package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
  510. package/static/dist/assets/Dialog-g355qxhp.js +0 -1
  511. package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
  512. package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
  513. package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
  514. package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
  515. package/static/dist/assets/Select-kddq75qc.js +0 -1
  516. package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
  517. package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
  518. package/static/dist/assets/States-eq6fe29m.js +0 -1
  519. package/static/dist/assets/Toaster-pc247u9f.js +0 -1
  520. package/static/dist/assets/_app-f8n1i0m1.js +0 -1
  521. package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
  522. package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
  523. package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
  524. package/static/dist/assets/_app.logs-i69qds98.js +0 -1
  525. package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
  526. package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
  527. package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
  528. package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
  529. package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
  530. package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
  531. package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
  532. package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
  533. package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
  534. package/static/dist/assets/back-h7aun7ew.js +0 -1
  535. package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
  536. package/static/dist/assets/channel-b2zo73z1.js +0 -1
  537. package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
  538. package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
  539. package/static/dist/assets/copied-hcplv46p.js +0 -1
  540. package/static/dist/assets/endpoints-klbxod4t.js +0 -64
  541. package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
  542. package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
  543. package/static/dist/assets/host-i828xuo7.js +0 -1
  544. package/static/dist/assets/index-eh8zilnv.css +0 -2
  545. package/static/dist/assets/index-r648f4o1.js +0 -11
  546. package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
  547. package/static/dist/assets/link-oot2yn73.js +0 -1
  548. package/static/dist/assets/login-gu28l9ou.js +0 -1
  549. package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
  550. package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
  551. package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
  552. package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
  553. package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
  554. package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
  555. package/static/dist/assets/refresh-abtu93ke.js +0 -1
  556. package/static/dist/assets/saved-girnabkf.js +0 -1
  557. package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
  558. package/static/dist/assets/share._token-kl0r7ido.js +0 -2
  559. package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
  560. package/static/dist/assets/sse-iwku0sjo.js +0 -1
  561. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
  562. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
  563. package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
  564. package/static/dist/assets/units-kgxzxfhi.js +0 -1
  565. package/static/dist/assets/untitled-cikfjntn.js +0 -1
  566. package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
  567. package/static/dist/assets/useLocale-o59tbiea.js +0 -1
@@ -7,12 +7,14 @@
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;
18
20
  const EMIT_COALESCE_WINDOW_S = 1;
@@ -22,6 +24,13 @@ const WAKEUP_BATCH_MAX_CHARS = 24_000;
22
24
  /** A session with held wakeups rechecks its pause at least this often (a credential edit has no deadline). */
23
25
  const HELD_RECHECK_SECONDS = 300;
24
26
  const DELIVERY_CONSUMER = 'webui';
27
+ const canonicalHome = (home) => { try {
28
+ return realpathSync(home);
29
+ }
30
+ catch {
31
+ return resolve(home);
32
+ } };
33
+ const completionKey = (home, event) => event.type === 'async_delegation' && event.delegation_id && !event.task_failure_notice ? JSON.stringify([canonicalHome(home), str(event.delegation_id)]) : '';
25
34
  /** Python `format_wakeup_prompt` for plain completion events; async delegations use the sidecar formatter. */
26
35
  export function formatWakeupPrompt(evt) {
27
36
  const type = str(evt.type ?? 'completion');
@@ -38,7 +47,7 @@ export function formatWakeupPrompt(evt) {
38
47
  body += `\n(${str(evt.suppressed)} earlier matches were suppressed by rate limit)`;
39
48
  return body + ']';
40
49
  }
41
- if (type !== 'completion')
50
+ if (backgroundEventKind(evt) !== 'completion')
42
51
  return null;
43
52
  if (!(sid || cmd || 'exit_code' in evt || evt.output))
44
53
  return null;
@@ -75,9 +84,22 @@ export class CompletionDrain {
75
84
  unreleased = new Map();
76
85
  /** TAL-576: wakeups held while their session is paused. */
77
86
  heldWakeups;
87
+ /** Waiting requires an unadmitted result, not an admitted turn's outstanding ledger acknowledgement. */
88
+ async pendingDelegations(sid) {
89
+ try {
90
+ const session = (await this.deps.store.get(sid)), home = this.ownerHome(session);
91
+ return new Set((await this.heldWakeups.get(sid)).filter((entry) => {
92
+ const key = completionKey(home, entry.event ?? {});
93
+ return Boolean(key) && !completionAccepted(session, key);
94
+ }).map((entry) => str(entry.event?.delegation_id)).filter(Boolean));
95
+ }
96
+ catch {
97
+ return new Set();
98
+ }
99
+ }
78
100
  constructor(deps) {
79
101
  this.deps = deps;
80
- this.heldWakeups = new HeldWakeups(join(deps.store.sessionDir, '_wakeup_held.json'));
102
+ this.heldWakeups = new HeldWakeups(deps.documents);
81
103
  }
82
104
  start() {
83
105
  if (this.timer || this.stopped)
@@ -133,7 +155,7 @@ export class CompletionDrain {
133
155
  }
134
156
  // TAL-576: whether or not every profile recovered, the sessions left holding wakeups resume once a sidecar answers.
135
157
  if (!this.heldResumed)
136
- this.resumeHeld();
158
+ (await this.resumeHeld());
137
159
  // The drain is sidecar-wide; an active profile whose home escapes the profiles root (`profileHome` throws) scopes it
138
160
  // to the base home instead of stalling every other profile's completions.
139
161
  let scope;
@@ -166,19 +188,19 @@ export class CompletionDrain {
166
188
  }
167
189
  return routed;
168
190
  }
169
- resolveTarget(evt) {
191
+ async resolveTarget(evt) {
170
192
  const sessionKey = str(evt.session_key).trim();
171
193
  const origin = str(evt.origin_ui_session_id).trim();
172
- const live = (sid) => { if (!sid)
194
+ const live = async (sid) => { if (!sid)
173
195
  return ''; try {
174
- this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false });
196
+ (await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }));
175
197
  return sid;
176
198
  }
177
199
  catch {
178
200
  return '';
179
201
  } };
180
- const resolved = live(sessionKey);
181
- const owner = live(origin);
202
+ const resolved = (await live(sessionKey));
203
+ const owner = (await live(origin));
182
204
  if (!owner)
183
205
  return resolved;
184
206
  if (resolved && resolved !== owner)
@@ -192,7 +214,8 @@ export class CompletionDrain {
192
214
  return false;
193
215
  }
194
216
  async wakeupPrompt(evt) {
195
- if (evt.type === 'async_delegation') {
217
+ const kind = backgroundEventKind(evt);
218
+ if (kind === 'delegation' || kind === 'progress') {
196
219
  const sidecar = this.deps.sidecar();
197
220
  if (!sidecar)
198
221
  return '';
@@ -205,30 +228,175 @@ export class CompletionDrain {
205
228
  }
206
229
  return (formatWakeupPrompt(evt) ?? '').trim();
207
230
  }
231
+ /** The session's owning profile home; a session without a profile belongs to the root profile (`profilesMatch`). */
232
+ ownerHome(session) { return this.deps.profileHome(session.profile ?? 'default'); }
233
+ /** A profile's config; null when it cannot be read. */
234
+ async profileConfig(home) {
235
+ try {
236
+ return (await this.deps.readConfig?.(home)) ?? {};
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ }
242
+ /** The owning profile's `delegation.surface_child_process_notifications`; off, the Agent's default, when it cannot be read. */
243
+ async surfacesChildProcesses(sid) {
244
+ let config;
245
+ try {
246
+ config = await this.profileConfig(this.ownerHome((await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }))));
247
+ }
248
+ catch {
249
+ return false;
250
+ }
251
+ return isDict(config?.delegation) && config.delegation.surface_child_process_notifications === true;
252
+ }
253
+ /**
254
+ * TAL-907 (Agent `_load_background_notifications_mode`): `HERMES_BACKGROUND_NOTIFICATIONS` from the profile's `.env`
255
+ * (which overrides the shell, as in the Agent) or the server environment, else `display.background_process_notifications`
256
+ * (YAML `false` is off). Only `off` changes Web delivery; null when the setting cannot be read.
257
+ */
258
+ async notificationsOff(home) {
259
+ let mode;
260
+ try {
261
+ mode = expandDotenv(parseDotenv(readFileSync(join(home, '.env'), 'utf8')), this.deps.env ?? {}).HERMES_BACKGROUND_NOTIFICATIONS?.trim();
262
+ }
263
+ catch (error) {
264
+ if (error.code !== 'ENOENT')
265
+ return null;
266
+ }
267
+ mode ||= this.deps.env?.HERMES_BACKGROUND_NOTIFICATIONS?.trim();
268
+ if (!mode) {
269
+ const config = await this.profileConfig(home);
270
+ if (!config)
271
+ return null;
272
+ mode = isDict(config.display) ? config.display.background_process_notifications : undefined;
273
+ }
274
+ return mode === false || str(mode).trim().toLowerCase() === 'off';
275
+ }
276
+ async isReadOnly(session) { return await this.deps.isReadOnly?.(session) ?? session.read_only; }
277
+ /** Hand durable results back without acknowledging delivery or mutating the canonical session. */
278
+ async relinquish(sid, session, entries, claims = []) {
279
+ try {
280
+ if (!(await this.settleClaims(this.ownerHome(session), 'process.defer_delivery', claims)))
281
+ throw new Error('delivery claim could not be returned');
282
+ const events = entries.flatMap((e) => e.event?.type === 'async_delegation' ? [e.event] : []);
283
+ if (events.length) {
284
+ const sidecar = this.deps.sidecar();
285
+ if (!sidecar)
286
+ throw new Error('sidecar unavailable');
287
+ await sidecar.call('process.requeue', { events });
288
+ }
289
+ this.deferred.delete(sid);
290
+ this.pendingSessions.delete(sid);
291
+ this.retryAttempts.delete(sid);
292
+ const timer = this.retryTimers.get(sid);
293
+ if (timer)
294
+ clearTimeout(timer);
295
+ this.retryTimers.delete(sid);
296
+ await this.release(sid);
297
+ }
298
+ catch (error) {
299
+ for (const entry of entries)
300
+ this.defer(sid, entry);
301
+ this.scheduleRetry(sid);
302
+ this.deps.log(`[webui] WARNING: completion hand-back failed for ${sid}: ${error.message}`);
303
+ }
304
+ }
208
305
  /** Python `_process_one`; returns false when the event has no owning WebUI session. */
209
306
  async processOne(evt) {
210
307
  const processId = str(evt.process_id).trim();
211
- const sid = this.resolveTarget(evt);
308
+ const sid = (await this.resolveTarget(evt));
212
309
  if (!sid)
213
310
  return false;
311
+ let owner;
312
+ let home;
313
+ let homeError = '';
314
+ try {
315
+ owner = (await this.deps.store.get(sid));
316
+ }
317
+ catch {
318
+ return false;
319
+ }
320
+ try {
321
+ home = this.ownerHome(owner);
322
+ }
323
+ catch (error) {
324
+ home = '';
325
+ homeError = error.message;
326
+ }
327
+ if (home && (await this.isReadOnly(owner)))
328
+ return false;
329
+ // Reconciliation needs positive profile proof; live events retain the existing admission deferral on home errors.
330
+ if (evt.reconciliation_profile_home && (!home || canonicalHome(str(evt.reconciliation_profile_home)) !== canonicalHome(home)))
331
+ return false;
332
+ if (evt.reconciliation_profile_home && completionAccepted(owner, completionKey(home, evt)))
333
+ return true;
214
334
  if (evt.consumed === true)
215
335
  return true;
336
+ // TAL-933 (Agent `should_surface_notification`): a subagent's own process notices stay out of the parent chat unless
337
+ // the session's profile opts in. Dropped, not consumed, as in the Agent: an exit nobody read still reaches the parent
338
+ // as the child's `unread_completions`.
339
+ if (evt.child_process === true && !(await this.surfacesChildProcesses(sid)))
340
+ return true;
216
341
  const seen = this.seen.get(sid) ?? new Set();
217
342
  this.seen.set(sid, seen);
218
343
  // Only a per-process delivery can repeat: a watch event's key is unique, so remembering it would only grow `seen`.
219
344
  if (processId && deliveredPerProcess(evt)) {
220
345
  if (seen.has(processId))
221
346
  return true;
222
- seen.add(processId);
223
347
  }
224
- this.pendingSessions.add(sid);
225
348
  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)
349
+ if ((await this.isReadOnly(owner))) {
350
+ if (home)
351
+ return false;
352
+ this.defer(sid, { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt });
353
+ this.scheduleRetry(sid);
354
+ this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${homeError || 'ownership home unavailable'}; retrying`);
355
+ return true;
356
+ }
357
+ if (evt.reconciliation_profile_home && evt.delegation_id && prompt.includes(str(evt.delegation_id))) {
358
+ // Upgrade a proven pre-receipt Web turn; typed Agent bookkeeping alone never qualifies.
359
+ const previous = owner.messages.find((m) => m._source === 'process_wakeup' && m._turn_id && messageText(m.content) === prompt);
360
+ const turnId = str(previous?._turn_id) || (owner.pending_user_source === 'process_wakeup' && owner.pending_user_message === prompt ? str(owner.active_stream_id) : '');
361
+ if (turnId) {
362
+ const receipts = isDict(owner.extra.completion_acceptances) ? owner.extra.completion_acceptances : {};
363
+ owner.extra.completion_acceptances = { ...receipts, [completionKey(home, evt)]: turnId };
364
+ await this.deps.store.save(owner, { touchUpdatedAt: false });
365
+ return true;
366
+ }
367
+ }
368
+ // The formatter awaits the sidecar; another drain may have retained this event meanwhile.
369
+ if (processId && deliveredPerProcess(evt) && seen.has(processId))
229
370
  return true;
230
371
  const entry = { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt };
231
- if (this.hasActiveTurn(sid))
372
+ if (prompt && evt.type === 'async_delegation')
373
+ this.defer(sid, entry);
374
+ if (prompt && evt.type === 'async_delegation' && !evt.task_failure_notice) {
375
+ try {
376
+ // Busy, Stop, sealed and provider-paused entries survive either process restarting.
377
+ await this.heldWakeups.hold(sid, [entry]);
378
+ recordBackgroundUpdate(owner, `delegation:${str(evt.delegation_id)}`, batchUpdate([{ event: evt, prompt }]));
379
+ await this.deps.store.save(owner, { touchUpdatedAt: false });
380
+ }
381
+ catch (error) {
382
+ this.scheduleRetry(sid);
383
+ this.deps.log(`[webui] WARNING: failed to persist delegation wakeup for session ${sid}; retained in memory for retry: ${error.message}`);
384
+ return true;
385
+ }
386
+ }
387
+ if (processId && deliveredPerProcess(evt))
388
+ seen.add(processId);
389
+ this.pendingSessions.add(sid);
390
+ await this.deps.background?.recordEvent(sid, evt, prompt);
391
+ if (backgroundEventKind(evt) !== 'progress')
392
+ this.emitCoalesced(sid, this.buildPayload(evt, sid, prompt));
393
+ if (!prompt)
394
+ return true;
395
+ if (evt.type === 'async_delegation') {
396
+ if (!this.hasActiveTurn(sid))
397
+ await this.drainDeferred(sid);
398
+ }
399
+ else if (this.hasActiveTurn(sid))
232
400
  this.defer(sid, entry);
233
401
  else
234
402
  await this.startWakeup(sid, [entry]);
@@ -313,10 +481,12 @@ export class CompletionDrain {
313
481
  * another consumer delivered (or holds) it, so it leaves the batch; a sidecar failure returns null so the caller keeps
314
482
  * every entry pending. Claims are taken at delivery, never while deferred, so a long turn cannot outlive the lease.
315
483
  */
316
- async claimBatch(home, batched) {
484
+ async claimBatch(home, batched, session) {
317
485
  const deliver = [];
318
486
  const held = [];
319
487
  for (const entry of batched) {
488
+ if ((await this.isReadOnly(session)))
489
+ break;
320
490
  if (entry.event?.type !== 'async_delegation') {
321
491
  deliver.push(entry);
322
492
  continue;
@@ -326,7 +496,10 @@ export class CompletionDrain {
326
496
  try {
327
497
  if (!sidecar)
328
498
  throw new Error('sidecar unavailable');
329
- claimId = (await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER })).claim_id;
499
+ const claim = await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER });
500
+ if (claim.retryable)
501
+ throw new Error('another consumer holds the pending result');
502
+ claimId = claim.claim_id;
330
503
  }
331
504
  catch (error) {
332
505
  await this.settleClaims(home, 'process.release_delivery', held);
@@ -349,15 +522,18 @@ export class CompletionDrain {
349
522
  async settleClaims(home, method, held) {
350
523
  const sidecar = this.deps.sidecar();
351
524
  if (!sidecar)
352
- return;
525
+ return held.length === 0;
526
+ let ok = true;
353
527
  for (const claim of held) {
354
528
  try {
355
529
  await sidecar.call(method, { profile_home: home, event: claim.event, claim_id: claim.claim_id });
356
530
  }
357
531
  catch (error) {
532
+ ok = false;
358
533
  this.deps.log(`[webui] WARNING: ${method} failed for ${str(claim.event.delegation_id)}: ${error.message}`);
359
534
  }
360
535
  }
536
+ return ok;
361
537
  }
362
538
  scheduleRetry(sid) {
363
539
  const attempts = (this.retryAttempts.get(sid) ?? 0) + 1;
@@ -391,10 +567,10 @@ export class CompletionDrain {
391
567
  }
392
568
  }
393
569
  /** A restarted server resumes every session it left holding wakeups (`startWakeup` drops a deleted session's). */
394
- resumeHeld() {
570
+ async resumeHeld() {
395
571
  let sids;
396
572
  try {
397
- sids = this.heldWakeups.sessions();
573
+ sids = (await this.heldWakeups.sessions());
398
574
  }
399
575
  catch (error) {
400
576
  this.deps.log(`[webui] WARNING: held wakeups unreadable; retrying: ${error.message}`);
@@ -404,12 +580,12 @@ export class CompletionDrain {
404
580
  for (const sid of sids)
405
581
  void this.drainDeferred(sid);
406
582
  }
407
- held(sid) {
583
+ async held(sid) {
408
584
  if (this.unreleased.has(sid))
409
- this.release(sid, []);
585
+ (await this.release(sid, []));
410
586
  const done = new Set((this.unreleased.get(sid) ?? []).map(heldKey));
411
587
  try {
412
- return this.heldWakeups.get(sid).filter((e) => !done.has(heldKey(e)));
588
+ return (await this.heldWakeups.get(sid)).filter((e) => !done.has(heldKey(e)));
413
589
  }
414
590
  catch (error) {
415
591
  // An unreadable store is unknown, not empty: recheck later rather than leave the session dormant.
@@ -419,15 +595,15 @@ export class CompletionDrain {
419
595
  }
420
596
  }
421
597
  /** 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));
598
+ async deleted(sid, error) {
599
+ return error instanceof SessionNotFound && !await this.deps.store.exists(sid);
424
600
  }
425
601
  /** Admitted or settled wakeups (every one, with none given) leave the held file. */
426
- release(sid, entries) {
602
+ async release(sid, entries) {
427
603
  // Earlier releases that could not be written go with this one.
428
604
  const batch = entries ? mergeWakeups([...(this.unreleased.get(sid) ?? [])], entries) : undefined;
429
605
  try {
430
- this.heldWakeups.release(sid, batch);
606
+ await this.heldWakeups.release(sid, batch);
431
607
  this.unreleased.delete(sid);
432
608
  }
433
609
  catch (error) {
@@ -436,9 +612,9 @@ export class CompletionDrain {
436
612
  this.deps.log(`[webui] WARNING: failed to release held wakeups for session ${sid}; they are not delivered again: ${error.message}`);
437
613
  }
438
614
  }
439
- saveSession(sid, session) {
615
+ async saveSession(sid, session) {
440
616
  try {
441
- this.deps.store.save(session, { touchUpdatedAt: false });
617
+ (await this.deps.store.save(session, { touchUpdatedAt: false }));
442
618
  }
443
619
  catch (error) {
444
620
  this.deps.log(`[webui] WARNING: failed to save wakeup pause for session ${sid}: ${error.message}`);
@@ -450,10 +626,14 @@ export class CompletionDrain {
450
626
  * Returns whether the wakeup is handled here (held, or dropped with its deleted session).
451
627
  */
452
628
  async holdWhilePaused(sid, session, home, batched) {
629
+ if ((await this.isReadOnly(session))) {
630
+ await this.relinquish(sid, session, batched);
631
+ return true;
632
+ }
453
633
  const pause = session.process_wakeup_pause;
454
634
  if (!wakeupPaused(session, home, this.deps.configPath?.(home))) {
455
635
  if (pause !== session.process_wakeup_pause)
456
- this.saveSession(sid, session);
636
+ (await this.saveSession(sid, session));
457
637
  return false;
458
638
  }
459
639
  const recovery = await this.poolRecovery(home, session);
@@ -461,26 +641,30 @@ export class CompletionDrain {
461
641
  // A deleted session owns no turn; a transient load failure holds the wakeups for the next recheck.
462
642
  let current = null;
463
643
  try {
464
- current = this.deps.store.get(sid);
644
+ current = (await this.deps.store.get(sid));
465
645
  }
466
646
  catch (error) {
467
- if (this.deleted(sid, error)) {
468
- this.release(sid);
647
+ if ((await this.deleted(sid, error))) {
648
+ (await this.release(sid));
469
649
  return true;
470
650
  }
471
651
  }
472
652
  if (current) {
653
+ if ((await this.isReadOnly(current))) {
654
+ await this.relinquish(sid, current, batched);
655
+ return true;
656
+ }
473
657
  const before = current.process_wakeup_pause;
474
658
  if (recovery === true)
475
659
  current.process_wakeup_pause = null;
476
660
  if (recovery === true || !wakeupPaused(current, home, this.deps.configPath?.(home))) {
477
661
  if (before !== current.process_wakeup_pause)
478
- this.saveSession(sid, current);
662
+ (await this.saveSession(sid, current));
479
663
  return false;
480
664
  }
481
665
  }
482
666
  try {
483
- this.heldWakeups.hold(sid, batched);
667
+ (await this.heldWakeups.hold(sid, batched));
484
668
  }
485
669
  catch (error) {
486
670
  for (const e of batched)
@@ -493,17 +677,18 @@ export class CompletionDrain {
493
677
  return true;
494
678
  }
495
679
  /** 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) {
680
+ async startWakeup(sid, wakeups) {
681
+ let batched = wakeups;
497
682
  const redefer = (entries) => { for (const e of entries)
498
683
  this.defer(sid, e); };
499
684
  let session;
500
685
  try {
501
- session = this.deps.store.get(sid);
686
+ session = (await this.deps.store.get(sid));
502
687
  }
503
688
  catch (error) {
504
689
  // A deleted session owns no turn: its wakeups, held ones included, go with it.
505
- if (this.deleted(sid, error)) {
506
- this.release(sid);
690
+ if ((await this.deleted(sid, error))) {
691
+ (await this.release(sid));
507
692
  this.deps.log(`[webui] server-side wakeup dropped for deleted session ${sid}`);
508
693
  return false;
509
694
  }
@@ -520,25 +705,72 @@ export class CompletionDrain {
520
705
  // TAL-534: the delegation's ledger row lives in the session's own profile, whichever profile is active now.
521
706
  let home;
522
707
  try {
523
- home = this.deps.profileHome(session.profile ?? this.deps.activeProfile());
708
+ home = this.ownerHome(session);
524
709
  }
525
710
  catch (error) {
526
711
  redefer(batched);
527
712
  this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${error.message}`);
528
713
  return false;
529
714
  }
715
+ if ((await this.isReadOnly(session))) {
716
+ await this.relinquish(sid, session, batched);
717
+ return false;
718
+ }
719
+ const accepted = batched.filter((e) => completionAccepted(session, completionKey(home, e.event ?? {})));
720
+ if (accepted.length) {
721
+ // A crash may have saved admission before acknowledging the Agent. Finish that handshake without a new turn.
722
+ const claims = await this.claimBatch(home, accepted, session);
723
+ if (claims && (await this.isReadOnly(session))) {
724
+ await this.relinquish(sid, session, batched, claims.held);
725
+ return false;
726
+ }
727
+ if (!claims || !(await this.settleClaims(home, 'process.complete_delivery', claims.held))) {
728
+ redefer(batched);
729
+ this.scheduleRetry(sid);
730
+ return false;
731
+ }
732
+ await this.release(sid, accepted);
733
+ batched = batched.filter((e) => !accepted.includes(e));
734
+ }
735
+ if (!batched.length)
736
+ return false;
737
+ // TAL-907: `off` mutes process-driven wakeups at delivery, so a deferred or held wakeup follows the current setting; the
738
+ // drained event's record and status row are its whole delivery. A subagent result is not a process notification and
739
+ // still lands, as in the Agent. A setting that cannot be read retains the wakeups rather than start a turn.
740
+ const muted = batched.filter((e) => e.event?.type !== 'async_delegation');
741
+ if (muted.length) {
742
+ const off = await this.notificationsOff(home);
743
+ if (off === null) {
744
+ redefer(batched);
745
+ this.scheduleRetry(sid);
746
+ this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: background_process_notifications is unreadable; retrying`);
747
+ return false;
748
+ }
749
+ if (off) {
750
+ await this.release(sid, muted);
751
+ batched = batched.filter((e) => !muted.includes(e));
752
+ if (!batched.length) {
753
+ this.retryAttempts.delete(sid);
754
+ return false;
755
+ }
756
+ }
757
+ }
530
758
  if (await this.holdWhilePaused(sid, session, home, batched))
531
759
  return false;
532
- const claimed = await this.claimBatch(home, batched);
760
+ const claimed = await this.claimBatch(home, batched, session);
533
761
  if (!claimed) {
534
762
  redefer(batched);
535
763
  this.scheduleRetry(sid);
536
764
  return false;
537
765
  }
538
766
  const { deliver, held } = claimed;
767
+ if ((await this.isReadOnly(session))) {
768
+ await this.relinquish(sid, session, batched, held);
769
+ return false;
770
+ }
539
771
  // Entries another consumer already delivered are done here too.
540
772
  if (!deliver.length) {
541
- this.release(sid, batched);
773
+ (await this.release(sid, batched));
542
774
  await this.markConsumed(batched);
543
775
  return true;
544
776
  }
@@ -547,7 +779,7 @@ export class CompletionDrain {
547
779
  const prompt = deliver.length === 1 ? deliver[0].wakeup_prompt : deliver.map((e) => e.wakeup_prompt).join('\n\n');
548
780
  let resp;
549
781
  try {
550
- resp = await this.deps.startTurn(session, prompt);
782
+ 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
783
  }
552
784
  catch (error) {
553
785
  await giveBack();
@@ -555,6 +787,10 @@ export class CompletionDrain {
555
787
  this.deps.log(`[webui] WARNING: server-side wakeup turn raised for session ${sid}: ${error.message}`);
556
788
  return false;
557
789
  }
790
+ if ((await this.isReadOnly(session))) {
791
+ await this.relinquish(sid, session, batched, held);
792
+ return false;
793
+ }
558
794
  const status = resp._status ?? (resp.stream_id ? 200 : 500);
559
795
  // A busy session redelivers at its turn teardown; a stale runtime admits no turn, so it is retried on a timer (TAL-577).
560
796
  if (status === 409) {
@@ -570,9 +806,14 @@ export class CompletionDrain {
570
806
  return false;
571
807
  }
572
808
  this.retryAttempts.delete(sid);
573
- this.release(sid, batched);
574
809
  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);
810
+ await this.saveSession(sid, session);
811
+ if (await this.settleClaims(home, 'process.complete_delivery', held))
812
+ (await this.release(sid, batched));
813
+ else {
814
+ redefer(deliver);
815
+ this.scheduleRetry(sid);
816
+ }
576
817
  await this.markConsumed(batched);
577
818
  this.deps.log(`[webui] server-side wakeup turn started for session ${sid} (stream_id=${str(resp.stream_id)})`);
578
819
  return true;
@@ -601,7 +842,7 @@ export class CompletionDrain {
601
842
  * TAL-576: one drain per session at a time, so two never copy the same held wakeups before either admits them.
602
843
  */
603
844
  drainDeferred(sid) {
604
- const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(() => this.drainDeferredNow(sid));
845
+ const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(async () => (await this.drainDeferredNow(sid)));
605
846
  this.drains.set(sid, run);
606
847
  void run.finally(() => { if (this.drains.get(sid) === run)
607
848
  this.drains.delete(sid); }).catch(() => undefined);
@@ -610,7 +851,7 @@ export class CompletionDrain {
610
851
  async drainDeferredNow(sid) {
611
852
  if (!sid || this.hasActiveTurn(sid))
612
853
  return 0;
613
- const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], this.held(sid));
854
+ const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], (await this.held(sid)));
614
855
  if (!entries.length)
615
856
  return 0;
616
857
  this.deferred.delete(sid);
@@ -618,7 +859,7 @@ export class CompletionDrain {
618
859
  const prompted = entries.filter((e) => e.wakeup_prompt.trim());
619
860
  const held = await this.alreadyConsumed(prompted);
620
861
  if (held.size) {
621
- this.release(sid, [...held]);
862
+ await this.release(sid, [...held]);
622
863
  const ids = [...held].map((e) => e.process_id);
623
864
  await this.markConsumed([...held]);
624
865
  this.deps.log(`[webui] dropped ${String(held.size)} deferred wakeup(s) already consumed by the agent's own turn for session ${sid}: ${ids.join(', ')}`);