@maudecode/talaria-web 1.20.0 → 1.21.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 (267) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/automation-router.d.ts +313 -8
  3. package/dist/api/automation-router.js +21 -1
  4. package/dist/api/automation-router.js.map +1 -1
  5. package/dist/api/chat-router.d.ts +412 -15
  6. package/dist/api/chat-router.js +22 -170
  7. package/dist/api/chat-router.js.map +1 -1
  8. package/dist/api/git-router.d.ts +50 -0
  9. package/dist/api/git-router.js +17 -4
  10. package/dist/api/git-router.js.map +1 -1
  11. package/dist/api/router.d.ts +1 -1
  12. package/dist/api/sessions-router.d.ts +1138 -29
  13. package/dist/api/sessions-router.js +58 -41
  14. package/dist/api/sessions-router.js.map +1 -1
  15. package/dist/api/sse-routes.js +4 -2
  16. package/dist/api/sse-routes.js.map +1 -1
  17. package/dist/api/tools-router.d.ts +481 -29
  18. package/dist/api/tools-router.js +34 -9
  19. package/dist/api/tools-router.js.map +1 -1
  20. package/dist/http/context.d.ts +2 -0
  21. package/dist/http/context.js.map +1 -1
  22. package/dist/redact.d.ts +2 -0
  23. package/dist/redact.js +17 -2
  24. package/dist/redact.js.map +1 -1
  25. package/dist/runtime.js +36 -8
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/server.js +1 -0
  28. package/dist/server.js.map +1 -1
  29. package/dist/sessions/admission.d.ts +21 -0
  30. package/dist/sessions/admission.js +176 -0
  31. package/dist/sessions/admission.js.map +1 -0
  32. package/dist/sessions/anchor.d.ts +2 -0
  33. package/dist/sessions/anchor.js +4 -4
  34. package/dist/sessions/anchor.js.map +1 -1
  35. package/dist/sessions/background-tasks.d.ts +19 -1
  36. package/dist/sessions/background-tasks.js +36 -6
  37. package/dist/sessions/background-tasks.js.map +1 -1
  38. package/dist/sessions/events.d.ts +3 -0
  39. package/dist/sessions/events.js +4 -0
  40. package/dist/sessions/events.js.map +1 -1
  41. package/dist/sessions/gateway-sessions.d.ts +50 -2
  42. package/dist/sessions/gateway-sessions.js +144 -11
  43. package/dist/sessions/gateway-sessions.js.map +1 -1
  44. package/dist/sessions/merge.d.ts +1 -0
  45. package/dist/sessions/merge.js +7 -2
  46. package/dist/sessions/merge.js.map +1 -1
  47. package/dist/sessions/prefix-index.d.ts +8 -0
  48. package/dist/sessions/prefix-index.js +14 -3
  49. package/dist/sessions/prefix-index.js.map +1 -1
  50. package/dist/sessions/prompt-queues.d.ts +36 -0
  51. package/dist/sessions/prompt-queues.js +318 -0
  52. package/dist/sessions/prompt-queues.js.map +1 -0
  53. package/dist/sessions/relay.d.ts +12 -1
  54. package/dist/sessions/relay.js +75 -17
  55. package/dist/sessions/relay.js.map +1 -1
  56. package/dist/sessions/service.d.ts +26 -1
  57. package/dist/sessions/service.js +200 -6
  58. package/dist/sessions/service.js.map +1 -1
  59. package/dist/sessions/session.js +1 -0
  60. package/dist/sessions/session.js.map +1 -1
  61. package/dist/sessions/storage/json-documents.js +1 -0
  62. package/dist/sessions/storage/json-documents.js.map +1 -1
  63. package/dist/sessions/store.d.ts +1 -0
  64. package/dist/sessions/store.js +1 -0
  65. package/dist/sessions/store.js.map +1 -1
  66. package/dist/sessions/streams.d.ts +2 -0
  67. package/dist/sessions/streams.js.map +1 -1
  68. package/dist/sessions/tool-display.d.ts +8 -1
  69. package/dist/sessions/tool-display.js +39 -4
  70. package/dist/sessions/tool-display.js.map +1 -1
  71. package/dist/sessions/turn.d.ts +4 -1
  72. package/dist/sessions/turn.js +20 -13
  73. package/dist/sessions/turn.js.map +1 -1
  74. package/dist/tools/gateway-restart.d.ts +1 -1
  75. package/dist/tools/kanban.d.ts +10 -1
  76. package/dist/tools/kanban.js +73 -1
  77. package/dist/tools/kanban.js.map +1 -1
  78. package/dist/tools/mcp.d.ts +3 -1
  79. package/dist/tools/mcp.js +73 -0
  80. package/dist/tools/mcp.js.map +1 -1
  81. package/dist/tools/memory.d.ts +28 -0
  82. package/dist/tools/memory.js +120 -14
  83. package/dist/tools/memory.js.map +1 -1
  84. package/dist/tools/update-notifications.d.ts +12 -10
  85. package/dist/tools/update-notifications.js +124 -14
  86. package/dist/tools/update-notifications.js.map +1 -1
  87. package/dist/tools/updates.d.ts +22 -3
  88. package/dist/tools/updates.js +118 -20
  89. package/dist/tools/updates.js.map +1 -1
  90. package/dist/workspace/managed-buffers.d.ts +58 -0
  91. package/dist/workspace/managed-buffers.js +76 -0
  92. package/dist/workspace/managed-buffers.js.map +1 -0
  93. package/dist/workspace/rollback.js +1 -1
  94. package/dist/workspace/rollback.js.map +1 -1
  95. package/package.json +2 -2
  96. package/sidecar/agent_dependency.json +4 -4
  97. package/sidecar/agent_support.json +20 -8
  98. package/sidecar/talaria_sidecar/__init__.py +1 -1
  99. package/sidecar/talaria_sidecar/agent_mutation.py +87 -9
  100. package/sidecar/talaria_sidecar/agent_services.py +83 -23
  101. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  102. package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +4 -4
  103. package/sidecar/talaria_sidecar/methods/gateway_sessions.py +109 -19
  104. package/sidecar/talaria_sidecar/methods/kanban.py +48 -0
  105. package/sidecar/talaria_sidecar/methods/managed_buffers.py +110 -0
  106. package/sidecar/talaria_sidecar/methods/mcp.py +55 -0
  107. package/sidecar/talaria_sidecar/methods/outbound_drafts.py +165 -0
  108. package/static/dist/FILES.txt +127 -128
  109. package/static/dist/assets/AppShell-c5989995.js +8 -0
  110. package/static/dist/assets/Button-nuaikybd.js +1 -0
  111. package/static/dist/assets/ChatPage-bfg4khph.js +6 -0
  112. package/static/dist/assets/ConnectTargets-k5wo9yo8.js +1 -0
  113. package/static/dist/assets/{Dialog-hta5utr3.js → Dialog-o8vo2aws.js} +1 -1
  114. package/static/dist/assets/{ExtensionRoute-zrhjn0wm.js → ExtensionRoute-l1yjrso4.js} +1 -1
  115. package/static/dist/assets/Field-j7o8cfps.js +1 -0
  116. package/static/dist/assets/HubRoute-efnwe4xz.js +2 -0
  117. package/static/dist/assets/Markdown-clqf5m22.js +2 -0
  118. package/static/dist/assets/{MarkdownRenderer-fbswsgld.js → MarkdownRenderer-ccgqrza3.js} +18 -18
  119. package/static/dist/assets/OAuthSignIn-h7bjaqp6.js +1 -0
  120. package/static/dist/assets/{ResourceSwitch-odi6dy2o.js → ResourceSwitch-oai2zqaj.js} +1 -1
  121. package/static/dist/assets/RightPanel-ho161a45.js +1 -0
  122. package/static/dist/assets/{Select-kr07928w.js → Select-d1g5a8bm.js} +1 -1
  123. package/static/dist/assets/SessionListPanel-i7kaokhi.js +1 -0
  124. package/static/dist/assets/SettingsLayout-lnecm87w.js +1 -0
  125. package/static/dist/assets/{States-icab19yg.js → States-easntmry.js} +1 -1
  126. package/static/dist/assets/TerminalPanel-lxhwd4jl.js +16 -0
  127. package/static/dist/assets/Toaster-l4sciy8t.js +1 -0
  128. package/static/dist/assets/_app-mqexqbg8.js +1 -0
  129. package/static/dist/assets/{_app.ext._extensionId-na62087t.js → _app.ext._extensionId-n797jp72.js} +1 -1
  130. package/static/dist/assets/{_app.index-jypgdqoi.js → _app.index-ne43mdw2.js} +1 -1
  131. package/static/dist/assets/{_app.insights-kabejdtm.js → _app.insights-fqonovb4.js} +1 -1
  132. package/static/dist/assets/{_app.kanban-m19kfcmx.js → _app.kanban-kysliv19.js} +1 -1
  133. package/static/dist/assets/{_app.logs-iw4m96sz.js → _app.logs-febut82r.js} +1 -1
  134. package/static/dist/assets/{_app.memory-jq5frwcg.js → _app.memory-ha86oj1c.js} +1 -1
  135. package/static/dist/assets/{_app.profiles-kwa3m7rp.js → _app.profiles-cnu3gxxq.js} +1 -1
  136. package/static/dist/assets/{_app.session._sessionId-o5lyeipj.js → _app.session._sessionId-ifzjpcgn.js} +1 -1
  137. package/static/dist/assets/{_app.settings-ckl8hdll.js → _app.settings-nmakdiaf.js} +1 -1
  138. package/static/dist/assets/_app.settings._section-djglnjmi.js +3 -0
  139. package/static/dist/assets/{_app.skills-n016rihd.js → _app.skills-f3wad8yo.js} +1 -1
  140. package/static/dist/assets/_app.tasks-l10py1c0.js +1 -0
  141. package/static/dist/assets/{_app.todos-btew5v2s.js → _app.todos-bml1m3r1.js} +1 -1
  142. package/static/dist/assets/{_app.workspaces-lnfk95ch.js → _app.workspaces-f3d066lx.js} +1 -1
  143. package/static/dist/assets/{abnfDiagram-VCTEODGH-dttheegb.js → abnfDiagram-VCTEODGH-i53jc4yp.js} +1 -1
  144. package/static/dist/assets/{architecture-7GRP2DOG-ic435919.js → architecture-7GRP2DOG-e3bv5m6f.js} +1 -1
  145. package/static/dist/assets/{architectureDiagram-5GKGNRK7-8r3glgiq.js → architectureDiagram-5GKGNRK7-pakekxu2.js} +1 -1
  146. package/static/dist/assets/{archive-il7c6053.js → archive-ihqi7z2x.js} +1 -1
  147. package/static/dist/assets/{blockDiagram-I7D4REHJ-jenyos6c.js → blockDiagram-I7D4REHJ-bc6bo1n6.js} +1 -1
  148. package/static/dist/assets/{c4Diagram-7LVT6UL2-nzlx7yc4.js → c4Diagram-7LVT6UL2-btvwk2qx.js} +1 -1
  149. package/static/dist/assets/channel-jn4f8443.js +1 -0
  150. package/static/dist/assets/{chunk-4HAMMTFA-g0cru63b.js → chunk-4HAMMTFA-dlwab11c.js} +1 -1
  151. package/static/dist/assets/{chunk-75Z2AOVW-7rkswkjw.js → chunk-75Z2AOVW-dp5gh7i8.js} +1 -1
  152. package/static/dist/assets/{chunk-DU6HZSFF-fn73jzdo.js → chunk-DU6HZSFF-bi06zl1c.js} +1 -1
  153. package/static/dist/assets/{chunk-F27PBJKO-oey8e72m.js → chunk-F27PBJKO-kvv1rnlh.js} +1 -1
  154. package/static/dist/assets/{chunk-GMAD6QVW-l2a32wiy.js → chunk-GMAD6QVW-ji0rx9by.js} +1 -1
  155. package/static/dist/assets/{chunk-GVQU2GXP-o9dwzh8h.js → chunk-GVQU2GXP-nmz0j82p.js} +1 -1
  156. package/static/dist/assets/{chunk-IMKFNOWR-eblwj20b.js → chunk-IMKFNOWR-kmi1qx88.js} +1 -1
  157. package/static/dist/assets/{chunk-L3NEJ4N5-o2mufspb.js → chunk-L3NEJ4N5-xhb7mebj.js} +1 -1
  158. package/static/dist/assets/{chunk-OSK3NFVY-ijp9pw29.js → chunk-OSK3NFVY-5a9sgscq.js} +1 -1
  159. package/static/dist/assets/{chunk-P2QGCYS3-hs9hqwl4.js → chunk-P2QGCYS3-dfezp4vu.js} +1 -1
  160. package/static/dist/assets/{chunk-POPQ4Y6H-bp9rsqez.js → chunk-POPQ4Y6H-gd2vq3c0.js} +1 -1
  161. package/static/dist/assets/{chunk-PWAF6VOD-brkprov6.js → chunk-PWAF6VOD-wvw2nksf.js} +1 -1
  162. package/static/dist/assets/{chunk-SHT3W25Y-gmpv0pxz.js → chunk-SHT3W25Y-f58q97px.js} +1 -1
  163. package/static/dist/assets/{chunk-SVP7TREG-oldm08fu.js → chunk-SVP7TREG-abgwpyz9.js} +1 -1
  164. package/static/dist/assets/{chunk-TICWLB2K-ooqilfv7.js → chunk-TICWLB2K-h4sbs8ds.js} +1 -1
  165. package/static/dist/assets/classDiagram-ZZMXUADV-dzrw66se.js +1 -0
  166. package/static/dist/assets/classDiagram-v2-VYDZK3BY-dzrw66se.js +1 -0
  167. package/static/dist/assets/completionAudio-ce86msbu.js +1 -0
  168. package/static/dist/assets/{copy-jo006coq.js → copy-m9h56qa8.js} +1 -1
  169. package/static/dist/assets/{cynefin-OW5HDTMX-d47op7qs.js → cynefin-OW5HDTMX-g081vffs.js} +1 -1
  170. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-doa7594y.js → cynefinDiagram-5FMLGOSQ-odxvjesk.js} +1 -1
  171. package/static/dist/assets/{dagre-GXQ25YYZ-os768dp4.js → dagre-GXQ25YYZ-cpdwzjs4.js} +1 -1
  172. package/static/dist/assets/{diagram-S7CK7UJ4-fyi81nxd.js → diagram-S7CK7UJ4-clv5mxvu.js} +1 -1
  173. package/static/dist/assets/{diagram-UQ7AKVKN-j3exggaq.js → diagram-UQ7AKVKN-m2ia1mbf.js} +1 -1
  174. package/static/dist/assets/{diagram-VSXAHHWV-omo1en2l.js → diagram-VSXAHHWV-ea6zv636.js} +1 -1
  175. package/static/dist/assets/{diagram-VX7I27RA-oro2cyu0.js → diagram-VX7I27RA-oqlef685.js} +1 -1
  176. package/static/dist/assets/{diagram-Z3DM3KII-byt9vdb7.js → diagram-Z3DM3KII-kjubcbwu.js} +1 -1
  177. package/static/dist/assets/{dist-etpoyscq.js → dist-carq1azj.js} +4 -4
  178. package/static/dist/assets/{ebnfDiagram-PWID7BFC-ee3haugh.js → ebnfDiagram-PWID7BFC-fg0zri3e.js} +1 -1
  179. package/static/dist/assets/{erDiagram-RLTQ6QDP-d1e93yff.js → erDiagram-RLTQ6QDP-eb7pmk3x.js} +1 -1
  180. package/static/dist/assets/{eventmodeling-NTZA5JFV-i1ihb40c.js → eventmodeling-NTZA5JFV-gvi1fxhn.js} +1 -1
  181. package/static/dist/assets/flowDiagram-HODETNUW-abekab15.js +1 -0
  182. package/static/dist/assets/folder-plus-ksaons88.js +1 -0
  183. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-m7g0jud4.js → ganttDiagram-EL5Y4UJY-jmisowrc.js} +1 -1
  184. package/static/dist/assets/{gitGraph-4MIJSDKK-hzdj07yy.js → gitGraph-4MIJSDKK-m7kt3u6e.js} +1 -1
  185. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-dm9agbna.js → gitGraphDiagram-WWUBYQGX-nq7vfzh2.js} +1 -1
  186. package/static/dist/assets/{highlighted-body-KPVGNVTW-mmgz2czu.js → highlighted-body-KPVGNVTW-gcu017ay.js} +1 -1
  187. package/static/dist/assets/{host-fr6lni1p.js → host-ipp4e84c.js} +1 -1
  188. package/static/dist/assets/{index-73649w7o.js → index-d6vbxlra.js} +7 -4
  189. package/static/dist/assets/index-ey6qo0zx.css +2 -0
  190. package/static/dist/assets/{info-A6RAGUB7-lll1dqmm.js → info-A6RAGUB7-idazwfqe.js} +1 -1
  191. package/static/dist/assets/{infoDiagram-27XIBGKW-k7esc639.js → infoDiagram-27XIBGKW-bb9jh8gl.js} +1 -1
  192. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-lgr6k9wo.js → ishikawaDiagram-5VMMS53U-nqc132rv.js} +1 -1
  193. package/static/dist/assets/{journeyDiagram-3NMN7TZE-ndmbxuqk.js → journeyDiagram-3NMN7TZE-fpvnhy44.js} +1 -1
  194. package/static/dist/assets/{kanban-definition-UXKFOSKX-mjxym0jp.js → kanban-definition-UXKFOSKX-ndzqm6fu.js} +1 -1
  195. package/static/dist/assets/{lazyRouteComponent-cwb6l7xh.js → lazyRouteComponent-javud235.js} +1 -1
  196. package/static/dist/assets/{line-mtr5k6il.js → line-g625e7cj.js} +1 -1
  197. package/static/dist/assets/{link-iadw4ghw.js → link-gfdaho08.js} +1 -1
  198. package/static/dist/assets/{login-lkhtzfcl.js → login-iv6yq4xf.js} +1 -1
  199. package/static/dist/assets/mermaid-HWGCJPDP-cwj5cl6k.js +1 -0
  200. package/static/dist/assets/{mermaid-parser.core-k91vdnvi.js → mermaid-parser.core-plzkuzov.js} +3 -3
  201. package/static/dist/assets/{mindmap-definition-YA3MSWOX-ehztfea4.js → mindmap-definition-YA3MSWOX-ojrgs569.js} +1 -1
  202. package/static/dist/assets/onboarding-ff4emacu.js +1 -0
  203. package/static/dist/assets/{packet-AYTQ26CC-ok2xrblz.js → packet-AYTQ26CC-gyaf9s8h.js} +1 -1
  204. package/static/dist/assets/{pegDiagram-XKGWAZYB-ec3rpj0m.js → pegDiagram-XKGWAZYB-bf6xj8mq.js} +1 -1
  205. package/static/dist/assets/{pie-WAS4IAKB-iwkir23u.js → pie-WAS4IAKB-f5ymzelo.js} +1 -1
  206. package/static/dist/assets/{pieDiagram-E7YTZNPT-fcpqpekh.js → pieDiagram-E7YTZNPT-d0qjl3zi.js} +1 -1
  207. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-lqsync43.js → quadrantDiagram-AXDQQJYC-oqy1mras.js} +1 -1
  208. package/static/dist/assets/queryKeys-x8fjxhut.js +9 -0
  209. package/static/dist/assets/{radar-RG4KPBEZ-hje4jbk6.js → radar-RG4KPBEZ-b6jcjvda.js} +1 -1
  210. package/static/dist/assets/{railroad-74A4TZTK-gll9n6qi.js → railroad-74A4TZTK-e3a6lk5k.js} +1 -1
  211. package/static/dist/assets/{railroad-abnf-HS5TGJTU-o6h6lpn4.js → railroad-abnf-HS5TGJTU-ff5hocrx.js} +1 -1
  212. package/static/dist/assets/{railroad-ebnf-LZEXJU2U-juaefj6o.js → railroad-ebnf-LZEXJU2U-exkhyw4n.js} +1 -1
  213. package/static/dist/assets/{railroad-peg-WCYAUIDC-cgfhvpah.js → railroad-peg-WCYAUIDC-jefk9b7c.js} +1 -1
  214. package/static/dist/assets/{railroadDiagram-O6MQD6OU-lp3w7awf.js → railroadDiagram-O6MQD6OU-e4amks1i.js} +1 -1
  215. package/static/dist/assets/{refresh-cw-iccm7a4e.js → refresh-cw-lfp4u1oh.js} +1 -1
  216. package/static/dist/assets/{requirementDiagram-BXWQKSXE-ha8eibcf.js → requirementDiagram-BXWQKSXE-c77k1e2y.js} +1 -1
  217. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-oxf31pr9.js → sankeyDiagram-P5KCCOFB-oa1cc52s.js} +1 -1
  218. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-jiq8lhyo.js → sequenceDiagram-WJ2MYXX4-j20gqt22.js} +1 -1
  219. package/static/dist/assets/{share._token-o76ki0ly.js → share._token-kmfoflw6.js} +2 -2
  220. package/static/dist/assets/{sliders-horizontal-ddcs88av.js → sliders-horizontal-g5jkzd9k.js} +1 -1
  221. package/static/dist/assets/{stateDiagram-D77RDMKH-f3fslnon.js → stateDiagram-D77RDMKH-co2ghkdp.js} +1 -1
  222. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-faw1opgh.js +1 -0
  223. package/static/dist/assets/{swimlanes-42K2YHIH-k1hmk7jf.js → swimlanes-42K2YHIH-m30cktqe.js} +1 -1
  224. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hfil433g.js +8 -0
  225. package/static/dist/assets/{timeline-definition-24CTP7MA-n3ncfy9r.js → timeline-definition-24CTP7MA-liuep6fl.js} +1 -1
  226. package/static/dist/assets/toast-zmb35u3r.js +56 -0
  227. package/static/dist/assets/{treeView-Q6P3EWNA-l3y2pejt.js → treeView-Q6P3EWNA-np5d2jv2.js} +1 -1
  228. package/static/dist/assets/{treemap-WGGIJYW6-jown9axh.js → treemap-WGGIJYW6-cmpltxh1.js} +1 -1
  229. package/static/dist/assets/{useForm-o4uu74mx.js → useForm-f1udzsjf.js} +1 -1
  230. package/static/dist/assets/{useParams-ftsveu84.js → useParams-ierevvts.js} +1 -1
  231. package/static/dist/assets/{useSearch-crqueqga.js → useSearch-i7nr9ypl.js} +1 -1
  232. package/static/dist/assets/{vennDiagram-4TSXK5OY-dh59uq1c.js → vennDiagram-4TSXK5OY-b2g42qrg.js} +1 -1
  233. package/static/dist/assets/{wardley-WFR3VGLG-e6d74b0j.js → wardley-WFR3VGLG-lb0eqbff.js} +1 -1
  234. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hnofh78f.js → wardleyDiagram-VM6X3IG4-ermwaqha.js} +1 -1
  235. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-bpymjelb.js → xychartDiagram-S5SC5T6Z-dll0jldk.js} +1 -1
  236. package/static/dist/index.html +1 -1
  237. package/static/dist/sw.js +1 -1
  238. package/static/dist/assets/AppShell-3isgvoro.js +0 -8
  239. package/static/dist/assets/Button-f4n6dapf.js +0 -1
  240. package/static/dist/assets/ChatPage-k7b6xfax.js +0 -4
  241. package/static/dist/assets/ConnectTargets-juqvt5lm.js +0 -1
  242. package/static/dist/assets/Field-b6ez48oz.js +0 -1
  243. package/static/dist/assets/HubRoute-iwvso2tz.js +0 -2
  244. package/static/dist/assets/Markdown-jdeth7zq.js +0 -2
  245. package/static/dist/assets/OAuthSignIn-bpd8hom3.js +0 -1
  246. package/static/dist/assets/RightPanel-eu6enlo6.js +0 -1
  247. package/static/dist/assets/SessionListPanel-etb2i54l.js +0 -1
  248. package/static/dist/assets/SettingsLayout-eu3xxp23.js +0 -1
  249. package/static/dist/assets/TerminalPanel-hngmsr8b.js +0 -16
  250. package/static/dist/assets/Toaster-nb2uzjw1.js +0 -1
  251. package/static/dist/assets/_app-ga1moszl.js +0 -1
  252. package/static/dist/assets/_app.settings._section-dtdjk98a.js +0 -3
  253. package/static/dist/assets/_app.tasks-n8zuqsqe.js +0 -1
  254. package/static/dist/assets/cancel-bsnfo36u.js +0 -1
  255. package/static/dist/assets/channel-dsbtk01y.js +0 -1
  256. package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +0 -1
  257. package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +0 -1
  258. package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +0 -1
  259. package/static/dist/assets/folder-plus-ivoglq98.js +0 -1
  260. package/static/dist/assets/index-lhf1fsdf.css +0 -2
  261. package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +0 -1
  262. package/static/dist/assets/onboarding-f67z0a2r.js +0 -1
  263. package/static/dist/assets/queryKeys-ed4n2egc.js +0 -9
  264. package/static/dist/assets/refresh-i9ya9dvl.js +0 -1
  265. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +0 -1
  266. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +0 -8
  267. package/static/dist/assets/toast-liparz2j.js +0 -56
@@ -0,0 +1,318 @@
1
+ /** Durable cross-chat runs; session queues and cron jobs keep their existing lifetimes. */
2
+ import { createHash } from 'node:crypto';
3
+ import { PromptQueueRunSchema } from '@maudecode/talaria-web-contracts';
4
+ import { updateDocument } from './storage/document.js';
5
+ import { HttpFailure } from './service.js';
6
+ import { startSessionChat } from './admission.js';
7
+ import { isSafeSessionId } from './session.js';
8
+ import { str } from '../util.js';
9
+ const namespace = 'prompt-queues';
10
+ const digest = (text) => createHash('sha256').update(text).digest('hex');
11
+ const terminal = new Set(['completed', 'failed', 'refused']);
12
+ function view(run) {
13
+ const actions = run.phase === 'draft' ? ['start', 'cancel'] : run.phase === 'running' ? ['pause', 'cancel']
14
+ : run.phase === 'paused' ? ['resume', 'cancel'] : run.phase === 'unknown' ? ['reconcile', 'cancel'] : [];
15
+ return { ...run, title: run.cards[0]?.text.split('\n')[0]?.slice(0, 80) || 'Prompt queue', actions, editable: run.phase === 'draft' };
16
+ }
17
+ export class PromptQueues {
18
+ documents;
19
+ deps;
20
+ active = new Set();
21
+ workers = new Map();
22
+ timer;
23
+ stopped = false;
24
+ constructor(documents, deps) {
25
+ this.documents = documents;
26
+ this.deps = deps;
27
+ }
28
+ scope() {
29
+ const deps = this.deps();
30
+ const profile = deps.activeProfile();
31
+ return { profile: deps.isRootProfile(profile) ? 'default' : profile, owner: deps.requestScope.getStore()?.notificationOwner ?? 'local-owner' };
32
+ }
33
+ parse(raw) {
34
+ if (!raw || typeof raw !== 'object' || typeof raw.owner !== 'string')
35
+ throw new Error('Invalid prompt queue document');
36
+ const saved = raw;
37
+ return { owner: saved.owner, run: PromptQueueRunSchema.parse(saved.run) };
38
+ }
39
+ owned(saved, scope) {
40
+ if (saved.owner !== scope.owner || saved.run.profile !== scope.profile)
41
+ throw new HttpFailure(404, 'Queue not found');
42
+ }
43
+ async load(id) {
44
+ if (!/^[a-f0-9]{64}$/.test(id))
45
+ throw new HttpFailure(404, 'Queue not found');
46
+ const doc = await this.documents.get(namespace, id);
47
+ if (!doc)
48
+ throw new HttpFailure(404, 'Queue not found');
49
+ return this.parse(doc.value);
50
+ }
51
+ async edit(id, fn, controlWrite = false) {
52
+ return updateDocument(this.documents, namespace, id, (raw) => {
53
+ const saved = this.parse(raw);
54
+ const before = JSON.stringify(saved);
55
+ const phase = saved.run.phase;
56
+ fn(saved);
57
+ saved.run = view(saved.run);
58
+ // Runtime receipts do not invalidate a still-permitted Pause/Cancel from the last read.
59
+ if (before !== JSON.stringify(saved) && (controlWrite || saved.run.phase !== phase))
60
+ saved.run.revision += 1;
61
+ return { value: saved, result: saved.run };
62
+ });
63
+ }
64
+ async list() {
65
+ const scope = this.scope();
66
+ const runs = [];
67
+ for (const { key } of await this.documents.list(namespace)) {
68
+ const saved = await this.load(key);
69
+ if (saved.owner === scope.owner && saved.run.profile === scope.profile)
70
+ runs.push(view(saved.run));
71
+ }
72
+ return { runs };
73
+ }
74
+ /** Revalidate the exact profile/project/backend at creation AND immediately before each admission. */
75
+ async target(input) {
76
+ const deps = this.deps();
77
+ if (!isSafeSessionId(input.session_id) || !(await deps.sessions.sessionIdVisible(input.session_id)))
78
+ throw new HttpFailure(404, 'Session not found');
79
+ const sid = await deps.sessions.resolveSessionId(input.session_id);
80
+ const detail = await deps.sessions.detail(sid, { messages: '0', resolve_model: '0' });
81
+ if (!deps.profilesMatch(str(detail.profile) || null, deps.activeProfile()))
82
+ throw new HttpFailure(404, 'Session not found');
83
+ if ((str(detail.project_id) || null) !== input.project_id || detail.archived === true)
84
+ throw new HttpFailure(409, 'The queue target changed project or was archived');
85
+ const owner = await deps.sessions.owner?.queueReceipt(sid);
86
+ if (owner) {
87
+ if (owner.state !== 'attached' || !owner.snapshot || owner.restarting || owner.snapshot.pending.some((p) => p.status === 'unknown'))
88
+ throw new HttpFailure(409, 'The owning Agent is unavailable or needs recovery');
89
+ return { session_id: sid, title: str(detail.title) || sid, backend: 'owner', authority_epoch: owner.snapshot.authority_epoch };
90
+ }
91
+ await deps.sessions.assertWritable(sid);
92
+ return { session_id: sid, title: str(detail.title) || sid, backend: 'direct', authority_epoch: null };
93
+ }
94
+ async cards(inputs, id, revision = 0) {
95
+ const cards = [];
96
+ for (const [index, input] of inputs.entries())
97
+ cards.push({ ...input, ...await this.target(input), request_id: `queue-${digest(`${id}:${revision}:${index}`)}`, status: 'waiting', stream_id: null, admission_id: null, outcome: null });
98
+ return cards;
99
+ }
100
+ async create(requestId, inputs) {
101
+ const scope = this.scope();
102
+ const id = digest(JSON.stringify([scope, requestId]));
103
+ const existing = await this.documents.get(namespace, id);
104
+ if (existing) {
105
+ const saved = this.parse(existing.value);
106
+ this.owned(saved, scope);
107
+ // A creation identity can recover a lost response but cannot replace a run's content.
108
+ const original = saved.run.cards.map(({ session_id, project_id, text }) => ({ session_id, project_id, text }));
109
+ if (JSON.stringify(original) !== JSON.stringify(inputs))
110
+ throw new HttpFailure(409, 'This queue creation identity was already used');
111
+ return view(saved.run);
112
+ }
113
+ const cards = await this.cards(inputs, id);
114
+ const run = view({ id, title: '', revision: 0, profile: scope.profile, phase: 'draft', current_step: 0, cards, actions: [], editable: true, error: null });
115
+ return updateDocument(this.documents, namespace, id, (raw) => {
116
+ if (raw) {
117
+ const saved = this.parse(raw);
118
+ this.owned(saved, scope);
119
+ if (JSON.stringify(saved.run.cards.map(({ session_id, project_id, text }) => ({ session_id, project_id, text }))) !== JSON.stringify(inputs))
120
+ throw new HttpFailure(409, 'This queue creation identity was already used');
121
+ return { value: saved, result: view(saved.run), skip: true };
122
+ }
123
+ return { value: { owner: scope.owner, run }, result: run };
124
+ });
125
+ }
126
+ async replace(id, revision, inputs) {
127
+ const scope = this.scope();
128
+ this.owned(await this.load(id), scope);
129
+ const cards = await this.cards(inputs, id, revision + 1);
130
+ return this.edit(id, (saved) => {
131
+ this.owned(saved, scope);
132
+ if (saved.run.revision !== revision || saved.run.phase !== 'draft')
133
+ throw new HttpFailure(409, 'Queue changed; refresh before editing');
134
+ saved.run.cards = cards;
135
+ }, true);
136
+ }
137
+ async action(id, revision, action) {
138
+ const scope = this.scope();
139
+ this.owned(await this.load(id), scope);
140
+ const run = await this.edit(id, (saved) => {
141
+ this.owned(saved, scope);
142
+ if (saved.run.revision !== revision || !view(saved.run).actions.includes(action))
143
+ throw new HttpFailure(409, 'Queue changed; refresh before acting');
144
+ if (action === 'start' || action === 'resume')
145
+ saved.run.phase = 'running';
146
+ if (action === 'pause')
147
+ saved.run.phase = 'paused';
148
+ if (action === 'cancel')
149
+ saved.run.phase = 'cancelled';
150
+ }, true);
151
+ this.active.add(id);
152
+ this.wake(id);
153
+ return run;
154
+ }
155
+ async initialize() {
156
+ for (const { key } of await this.documents.list(namespace)) {
157
+ const { run } = await this.load(key);
158
+ if (run.phase === 'running' || run.cards.some((c) => ['dispatching', 'running', 'unknown'].includes(c.status)))
159
+ this.active.add(key);
160
+ }
161
+ this.timer = setInterval(() => { for (const id of this.active)
162
+ this.wake(id); }, 2000);
163
+ this.timer.unref();
164
+ for (const id of this.active)
165
+ this.wake(id);
166
+ }
167
+ wake(id) {
168
+ if (this.stopped || this.workers.has(id))
169
+ return;
170
+ const worker = this.tick(id).catch((error) => { this.deps().log(`[webui] prompt queue reconciliation failed: ${error instanceof Error ? error.message : 'unknown error'}`); });
171
+ this.workers.set(id, worker);
172
+ void worker.finally(() => { this.workers.delete(id); });
173
+ }
174
+ /** Deterministic seam used by synthetic tests and the server's lifecycle worker. */
175
+ async settled() { await Promise.all([...this.workers.values()]); }
176
+ async close() {
177
+ this.stopped = true;
178
+ if (this.timer)
179
+ clearInterval(this.timer);
180
+ await this.settled();
181
+ }
182
+ async tick(id) {
183
+ const saved = await this.load(id);
184
+ await this.deps().requestScope.run({ requestProfile: saved.run.profile, notificationOwner: saved.owner }, async () => {
185
+ for (let count = 0; count <= saved.run.cards.length && !this.stopped; count += 1) {
186
+ const { run } = await this.load(id);
187
+ const card = run.cards[run.current_step];
188
+ if (!card) {
189
+ this.active.delete(id);
190
+ return;
191
+ }
192
+ if (card.status !== 'waiting') {
193
+ if (terminal.has(card.status)) {
194
+ this.active.delete(id);
195
+ return;
196
+ }
197
+ const status = await this.receipt(card).catch(() => ({ status: 'unknown', outcome: null }));
198
+ await this.edit(id, ({ run: latest }) => {
199
+ const current = latest.cards[latest.current_step];
200
+ if (current.request_id !== card.request_id)
201
+ return;
202
+ current.status = status.status;
203
+ current.outcome = status.outcome;
204
+ if (current.status === 'completed') {
205
+ latest.error = null;
206
+ latest.current_step += 1;
207
+ if (latest.phase !== 'cancelled' && latest.current_step === latest.cards.length)
208
+ latest.phase = 'completed';
209
+ else if (latest.phase === 'unknown')
210
+ latest.phase = 'paused';
211
+ }
212
+ else if (current.status === 'unknown' && latest.phase === 'running')
213
+ latest.phase = 'unknown';
214
+ else if (current.status === 'failed' && latest.phase !== 'cancelled')
215
+ latest.phase = 'failed';
216
+ });
217
+ if (status.status === 'completed')
218
+ continue;
219
+ return;
220
+ }
221
+ if (run.phase !== 'running') {
222
+ this.active.delete(id);
223
+ return;
224
+ }
225
+ // Validate outside the transaction; CAS below rejects a concurrent pause/cancel before dispatch.
226
+ let target;
227
+ try {
228
+ target = await this.target(card);
229
+ if (target.session_id !== card.session_id || target.backend !== card.backend || target.authority_epoch !== card.authority_epoch)
230
+ throw new HttpFailure(409, 'Queue target authority changed');
231
+ if (await this.deps().sessions.activeRunBlocking(card.session_id))
232
+ throw new HttpFailure(409, 'Queue target is busy');
233
+ if (card.backend === 'owner') {
234
+ const snapshot = await this.deps().sessions.owner.queueReceipt(card.session_id);
235
+ if (!snapshot?.snapshot || snapshot.snapshot.running || snapshot.snapshot.pending.some((p) => p.status !== 'terminal'))
236
+ throw new HttpFailure(409, 'Queue target is busy');
237
+ }
238
+ }
239
+ catch (error) {
240
+ await this.edit(id, ({ run: latest }) => {
241
+ if (latest.revision !== run.revision)
242
+ return;
243
+ latest.cards[latest.current_step].status = 'refused';
244
+ latest.phase = 'refused';
245
+ latest.error = error instanceof HttpFailure ? error.message : 'Queue target could not be verified';
246
+ });
247
+ return;
248
+ }
249
+ let claimed = false;
250
+ await this.edit(id, ({ run: latest }) => {
251
+ claimed = false;
252
+ if (latest.revision !== run.revision || latest.phase !== 'running')
253
+ return;
254
+ latest.cards[latest.current_step].status = 'dispatching';
255
+ claimed = true;
256
+ });
257
+ if (!claimed || this.stopped)
258
+ return;
259
+ // The durable claim is the linearization point. Pause/cancel after it hold successors, never resend this step.
260
+ try {
261
+ const lease = await this.deps().profiles.beginWrite(run.profile);
262
+ if (typeof lease !== 'function')
263
+ throw new HttpFailure(409, 'Queue target profile is unavailable');
264
+ let response;
265
+ try {
266
+ response = await startSessionChat(this.deps(), { session_id: card.session_id, message: card.text, submission_id: card.request_id }, {}, undefined, { ...card, profile: run.profile });
267
+ }
268
+ finally {
269
+ lease();
270
+ }
271
+ await this.edit(id, ({ run: latest }) => {
272
+ const current = latest.cards[latest.current_step];
273
+ current.stream_id = str(response.stream_id) || null;
274
+ current.admission_id = str(response.admission_id) || null;
275
+ current.status = current.stream_id || current.admission_id ? 'running' : 'unknown';
276
+ if (current.status === 'unknown' && latest.phase === 'running')
277
+ latest.phase = 'unknown';
278
+ });
279
+ }
280
+ catch (error) {
281
+ await this.edit(id, ({ run: latest }) => {
282
+ const current = latest.cards[latest.current_step];
283
+ // Admission errors after a side effect can be ambiguous; only typed definite refusals are terminal.
284
+ const refused = error instanceof HttpFailure && error.status < 500 && error.extra.outcome_unknown !== true;
285
+ current.status = refused ? 'refused' : 'unknown';
286
+ if (latest.phase !== 'cancelled' && latest.phase !== 'paused')
287
+ latest.phase = current.status;
288
+ latest.error = refused ? error.message : 'Admission outcome is unknown; reconcile before continuing';
289
+ });
290
+ return;
291
+ }
292
+ }
293
+ });
294
+ }
295
+ async receipt(card) {
296
+ const deps = this.deps();
297
+ if (card.backend === 'owner') {
298
+ if (!card.admission_id)
299
+ return { status: 'unknown', outcome: null };
300
+ const result = await deps.sessions.owner?.queueReceipt(card.session_id, card.admission_id);
301
+ const receipt = result?.receipt;
302
+ if (result?.state !== 'attached' || !receipt || !('admission_id' in receipt) || receipt.authority_epoch !== card.authority_epoch || card.admission_id && card.admission_id !== receipt.admission_id)
303
+ return { status: 'unknown', outcome: null };
304
+ if (receipt.status === 'terminal')
305
+ return { status: receipt.outcome === 'completed' ? 'completed' : 'failed', outcome: str(receipt.outcome) || null };
306
+ return { status: receipt.status === 'unknown' ? 'unknown' : 'running', outcome: null };
307
+ }
308
+ if (!card.stream_id)
309
+ return { status: 'unknown', outcome: null };
310
+ if (deps.registry.activeRuns.has(card.stream_id))
311
+ return { status: 'running', outcome: null };
312
+ const summary = await deps.journal.summary(card.session_id, card.stream_id);
313
+ if (!summary?.terminal)
314
+ return { status: 'unknown', outcome: null };
315
+ return { status: summary.terminal_state === 'completed' ? 'completed' : 'failed', outcome: summary.terminal_state };
316
+ }
317
+ }
318
+ //# sourceMappingURL=prompt-queues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-queues.js","sourceRoot":"","sources":["../../src/sessions/prompt-queues.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
+ import type { SessionEventBus } from './events.js';
1
2
  import type { DocumentBackend } from './storage/backend.js';
3
+ import type { SessionActivityPhase } from '@maudecode/talaria-web-contracts';
4
+ import type { BackgroundActivity } from './background-tasks.js';
2
5
  import type { StreamRegistry } from './streams.js';
3
6
  import type { PendingPrompts } from './pending.js';
7
+ import type { Session } from './session.js';
8
+ import type { SessionPrefixIndex } from './prefix-index.js';
4
9
  import type { SessionStore } from './store.js';
5
10
  export declare const PRESENCE_LEASE_SECONDS = 90;
6
11
  export declare const PRESENCE_MAX_LEASES = 256;
@@ -55,6 +60,8 @@ export interface RelayPublisherDeps {
55
60
  pending: PendingPrompts;
56
61
  store: SessionStore;
57
62
  presence: PresenceLeases;
63
+ background?: BackgroundActivity;
64
+ activitySummary?: (session: Session) => ReturnType<SessionPrefixIndex['activitySummary']>;
58
65
  profileHome: (profile: string) => string;
59
66
  profilesMatch: (row: string | null | undefined, active: string | null | undefined) => boolean;
60
67
  /** The profile's messageful Agent `state.db` sessions (`readImportableAgentSessionRows`). */
@@ -70,6 +77,7 @@ export interface RelayState {
70
77
  revision: number;
71
78
  title: string;
72
79
  phase: string;
80
+ activityPhase?: SessionActivityPhase;
73
81
  updatedAt: number;
74
82
  deepLink: string;
75
83
  alertEligible?: false;
@@ -106,7 +114,7 @@ export declare class RelayPublisher {
106
114
  private pendingDeleted;
107
115
  /** Send the views queued before the snapshot just published, so the relay already holds every outcome they saw. */
108
116
  private flushViews;
109
- private nextRevision;
117
+ private reserveRevisions;
110
118
  private sleep;
111
119
  private run;
112
120
  /** Python `build_states`: one row per session with a live or recently terminal run in this profile. */
@@ -129,6 +137,7 @@ export declare class RelayPublisher {
129
137
  private put;
130
138
  }
131
139
  export interface RelayServiceDeps extends RelayPublisherDeps {
140
+ events: SessionEventBus;
132
141
  env: Record<string, string | undefined>;
133
142
  canonicalProfile: (profile: string) => string;
134
143
  addListener: (listener: () => void) => () => void;
@@ -154,6 +163,8 @@ export declare class RelayService {
154
163
  clearDeleted(sid: string, profile: string | null): Promise<void>;
155
164
  /** Terminal turn events reach the relay even mid-swap (Python `note_talaria_terminal`). */
156
165
  noteTerminal(streamId: string, phase: string): void;
166
+ /** Shared Web-only projection for direct turns and receipt-confirmed native owner executions. */
167
+ noteWebCompletion(profileName: string, sessionId: string, runIdentity: string): void;
157
168
  /** Python `configure_talaria_relay_publisher`: validate with a real snapshot before swapping publishers. */
158
169
  private configure;
159
170
  /** Python `pair_talaria_relay`, serialised so concurrent enrollments preserve both mappings. */
@@ -294,6 +294,10 @@ export class RelayPublisher {
294
294
  const path = `/v1/publishers/${encodeURIComponent(this.config.publisher_id)}/profiles/${encodeURIComponent(cfg.profile_id)}/sessions/${encodeURIComponent(sid)}/viewed`;
295
295
  try {
296
296
  await this.put(path, JSON.stringify({ through: view.through }));
297
+ if (view.deleted && !await hasSessionData(this.deps.store, sid)) {
298
+ const revision = (await this.reserveRevisions(1))[0];
299
+ await this.put(path.replace(/\/viewed$/, '/activity'), JSON.stringify({ eventId: `deleted:${view.deleted.id}`, revision, state: null }));
300
+ }
297
301
  accepted = true;
298
302
  }
299
303
  catch (error) {
@@ -316,9 +320,16 @@ export class RelayPublisher {
316
320
  this.views.delete(sid);
317
321
  }
318
322
  }
319
- nextRevision() {
320
- this.lastRevision = Math.max(this.lastRevision + 1, Math.floor(this.deps.now() * 1000));
321
- return this.lastRevision;
323
+ async reserveRevisions(count) {
324
+ return (await updateDocument(this.deps.documents, 'relay', 'revision', (raw) => {
325
+ let floor = Number.parseInt(str(raw), 10) || 0;
326
+ const revisions = Array.from({ length: count }, () => {
327
+ this.lastRevision = Math.max(this.lastRevision + 1, floor + 1, Math.floor(this.deps.now() * 1000));
328
+ floor = this.lastRevision;
329
+ return floor;
330
+ });
331
+ return { value: `${String(this.lastRevision)}\n`, result: revisions };
332
+ }));
322
333
  }
323
334
  sleep(seconds) {
324
335
  return new Promise((resolve) => {
@@ -361,8 +372,13 @@ export class RelayPublisher {
361
372
  /** Python `build_states`: one row per session with a live or recently terminal run in this profile. */
362
373
  async buildStates(profile) {
363
374
  const cutoff = this.deps.now() - TERMINAL_RETENTION_S;
375
+ const backgroundIds = new Set();
376
+ for (const sid of await this.deps.background?.sessionIds() ?? []) {
377
+ if ((await this.deps.background.receipts(sid)).some((receipt) => ['running', 'attention', 'unknown'].includes(receipt.status) || (receipt.completed_at ?? 0) >= cutoff))
378
+ backgroundIds.add(sid);
379
+ }
364
380
  for (const [sid, run] of this.terminal)
365
- if (run.terminal_at < cutoff)
381
+ if (run.terminal_at < cutoff && !backgroundIds.has(sid))
366
382
  this.terminal.delete(sid);
367
383
  const bySession = new Map();
368
384
  for (const run of this.deps.registry.activeRuns.values()) {
@@ -378,9 +394,21 @@ export class RelayPublisher {
378
394
  for (const [sid, run] of this.terminal)
379
395
  if (!bySession.has(sid))
380
396
  bySession.set(sid, run);
397
+ for (const sid of backgroundIds) {
398
+ if (bySession.has(sid) || !await hasSessionData(this.deps.store, sid))
399
+ continue;
400
+ const session = await this.deps.store.get(sid);
401
+ const latest = this.deps.activitySummary?.(session);
402
+ const terminal = latest?.terminalState ?? null;
403
+ const relay_phase = terminal === null ? undefined : terminal === 'completed' || terminal === 'tool_limit_reached' ? 'completed' : terminal === 'cancelled' ? 'cancelled' : 'failed';
404
+ bySession.set(sid, { session_id: sid, stream_id: latest?.turnId ?? '', started_at: latest?.timestamp ?? 0, phase: 'settled', workspace: session.workspace, model: session.model, provider: session.model_provider, ephemeral: false,
405
+ ...(relay_phase ? { relay_phase, terminal_at: Number(latest?.timestamp) || session.updated_at } : {}) });
406
+ }
381
407
  const alertEligible = this.alertEligibilitySupported ? !this.deps.presence.has(profile) : true;
382
408
  const states = [];
383
409
  for (const [sid, run] of bySession) {
410
+ if (run.activity_parent_session_id)
411
+ continue;
384
412
  let session;
385
413
  try {
386
414
  session = (await this.deps.store.get(sid, { metadataOnly: true }));
@@ -390,7 +418,7 @@ export class RelayPublisher {
390
418
  }
391
419
  if (!this.deps.profilesMatch(session.profile, profile))
392
420
  continue;
393
- const revision = this.nextRevision();
421
+ const revision = 0;
394
422
  let phase = run.relay_phase ?? 'running';
395
423
  if (!['completed', 'failed', 'cancelled'].includes(phase) && this.deps.pending.approvalPending(sid).pending)
396
424
  phase = 'waiting_for_approval';
@@ -398,24 +426,34 @@ export class RelayPublisher {
398
426
  phase = 'waiting_for_input';
399
427
  if (phase === 'running' && run.phase.endsWith('starting'))
400
428
  phase = 'starting';
429
+ const snapshot = await this.deps.background?.snapshot(sid, session.profile, { ...(run.relay_phase ? { excludeStreamId: run.stream_id, terminalPhase: run.relay_phase } : {}) });
430
+ if ([...this.deps.registry.activeRuns.values()].some((current) => current.session_id === sid && current.stream_id !== run.stream_id && current.started_at >= run.started_at)) {
431
+ this.changed();
432
+ continue;
433
+ }
434
+ try {
435
+ if (!this.deps.profilesMatch((await this.deps.store.get(sid, { metadataOnly: true })).profile, profile))
436
+ continue;
437
+ }
438
+ catch {
439
+ continue;
440
+ }
441
+ if (run.phase === 'settled' && !run.stream_id)
442
+ phase = snapshot?.activity_phase ?? 'stale';
401
443
  // A finished run keeps the instant it ended, so a viewer who saw that turn covers it whenever the snapshot is built.
402
444
  const updatedAt = Math.floor((run.terminal_at ?? this.deps.now()) * 1000);
403
- const state = { sessionId: sid, streamId: run.stream_id || null, eventId: `snapshot:${String(revision)}:${sid}`, revision, title: (session.title || 'Untitled').slice(0, 120), phase, updatedAt, deepLink: `/sessions/${encodeURIComponent(sid)}` };
445
+ const state = { sessionId: sid, streamId: run.stream_id || null, eventId: `snapshot:${String(revision)}:${sid}`, revision, ...(snapshot ? { activityPhase: snapshot.activity_phase } : {}), title: (session.title || 'Untitled').slice(0, 120), phase, updatedAt, deepLink: `/sessions/${encodeURIComponent(sid)}` };
404
446
  if (!alertEligible)
405
447
  state.alertEligible = false;
406
448
  states.push(state);
407
449
  }
408
- if (states.length)
409
- await updateDocument(this.deps.documents, 'relay', 'revision', (raw) => {
410
- let floor = Number.parseInt(str(raw), 10) || 0;
411
- for (const state of states) {
412
- state.revision = Math.max(state.revision, floor + 1);
413
- state.eventId = `snapshot:${String(state.revision)}:${state.sessionId}`;
414
- floor = state.revision;
415
- }
416
- this.lastRevision = Math.max(this.lastRevision, floor);
417
- return { value: `${String(this.lastRevision)}\n`, result: undefined };
418
- });
450
+ if (states.length) {
451
+ const revisions = await this.reserveRevisions(states.length);
452
+ for (const [index, state] of states.entries()) {
453
+ state.revision = revisions[index];
454
+ state.eventId = `snapshot:${String(state.revision)}:${state.sessionId}`;
455
+ }
456
+ }
419
457
  return states;
420
458
  }
421
459
  async publishSnapshot(isolatePermanent = false) {
@@ -587,6 +625,9 @@ export class RelayPublisher {
587
625
  }
588
626
  async publishProfileSnapshot(profile, profileId) {
589
627
  const states = (await this.buildStates(profile));
628
+ const config = this.config.profiles[profile];
629
+ if (config?.profile_id !== profileId || !await this.publishes(profile, config))
630
+ return;
590
631
  try {
591
632
  await this.putSnapshot(profileId, states);
592
633
  }
@@ -728,6 +769,23 @@ export class RelayService {
728
769
  const current = this.publisher ?? this.candidate;
729
770
  if (current && current !== publisher)
730
771
  current.noteTerminal(streamId, phase);
772
+ const run = this.deps.registry.activeRuns.get(streamId);
773
+ if (phase !== 'completed' || !run || run.ephemeral || run.health_only)
774
+ return;
775
+ // Capture the run before teardown; this never materializes an owner-managed session.
776
+ void this.deps.store.get(run.session_id, { metadataOnly: true }).then((session) => {
777
+ this.noteWebCompletion(session.profile ?? 'default', run.session_id, run.stream_id);
778
+ }).catch(() => undefined);
779
+ }
780
+ /** Shared Web-only projection for direct turns and receipt-confirmed native owner executions. */
781
+ noteWebCompletion(profileName, sessionId, runIdentity) {
782
+ const profile = this.deps.canonicalProfile(profileName);
783
+ const expires = this.deps.now() * 1000 + 60_000;
784
+ void (async () => {
785
+ const scope = await profileIdentity(this.deps, profile);
786
+ const identity = createHash('sha256').update(JSON.stringify([scope, runIdentity])).digest('hex');
787
+ this.deps.events.publish('web_completion', { profile, sessionId, webAudio: { identity, scope, profile, eligible: true, expires_at: expires } });
788
+ })().catch(() => undefined);
731
789
  }
732
790
  /** Python `configure_talaria_relay_publisher`: validate with a real snapshot before swapping publishers. */
733
791
  async configure(config, validate) {