@maudecode/talaria-web 1.13.0 → 1.15.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 (268) hide show
  1. package/_release.json +4 -4
  2. package/dist/api/automation-router.d.ts +102 -0
  3. package/dist/api/automation-router.js +2 -0
  4. package/dist/api/automation-router.js.map +1 -1
  5. package/dist/api/chat-router.d.ts +589 -52
  6. package/dist/api/chat-router.js +111 -121
  7. package/dist/api/chat-router.js.map +1 -1
  8. package/dist/api/router.d.ts +2 -1
  9. package/dist/api/router.js +3 -1
  10. package/dist/api/router.js.map +1 -1
  11. package/dist/api/sessions-router.d.ts +1918 -299
  12. package/dist/api/sessions-router.js +39 -24
  13. package/dist/api/sessions-router.js.map +1 -1
  14. package/dist/api/settings-router.d.ts +45 -8
  15. package/dist/api/settings-router.js +14 -10
  16. package/dist/api/settings-router.js.map +1 -1
  17. package/dist/api/sse-routes.js +1 -1
  18. package/dist/api/sse-routes.js.map +1 -1
  19. package/dist/app.d.ts +2728 -416
  20. package/dist/config/agent-config.js +20 -15
  21. package/dist/config/agent-config.js.map +1 -1
  22. package/dist/http/context.d.ts +4 -2
  23. package/dist/http/context.js.map +1 -1
  24. package/dist/onboarding.d.ts +1 -1
  25. package/dist/onboarding.js +2 -1
  26. package/dist/onboarding.js.map +1 -1
  27. package/dist/providers/catalog.d.ts +11 -0
  28. package/dist/providers/catalog.js +32 -1
  29. package/dist/providers/catalog.js.map +1 -1
  30. package/dist/runtime.js +56 -17
  31. package/dist/runtime.js.map +1 -1
  32. package/dist/server.js +3 -0
  33. package/dist/server.js.map +1 -1
  34. package/dist/sessions/background-tasks.d.ts +137 -0
  35. package/dist/sessions/background-tasks.js +349 -0
  36. package/dist/sessions/background-tasks.js.map +1 -0
  37. package/dist/sessions/background-updates.d.ts +56 -0
  38. package/dist/sessions/background-updates.js +152 -0
  39. package/dist/sessions/background-updates.js.map +1 -0
  40. package/dist/sessions/cli-sessions.d.ts +6 -0
  41. package/dist/sessions/cli-sessions.js +20 -7
  42. package/dist/sessions/cli-sessions.js.map +1 -1
  43. package/dist/sessions/completions.d.ts +17 -1
  44. package/dist/sessions/completions.js +83 -12
  45. package/dist/sessions/completions.js.map +1 -1
  46. package/dist/sessions/compress.d.ts +33 -0
  47. package/dist/sessions/compress.js +66 -0
  48. package/dist/sessions/compress.js.map +1 -0
  49. package/dist/sessions/journal.d.ts +27 -12
  50. package/dist/sessions/journal.js +115 -40
  51. package/dist/sessions/journal.js.map +1 -1
  52. package/dist/sessions/list.d.ts +14 -0
  53. package/dist/sessions/list.js +89 -16
  54. package/dist/sessions/list.js.map +1 -1
  55. package/dist/sessions/merge.d.ts +19 -1
  56. package/dist/sessions/merge.js +75 -7
  57. package/dist/sessions/merge.js.map +1 -1
  58. package/dist/sessions/relay.d.ts +17 -1
  59. package/dist/sessions/relay.js +74 -13
  60. package/dist/sessions/relay.js.map +1 -1
  61. package/dist/sessions/service.d.ts +61 -3
  62. package/dist/sessions/service.js +244 -16
  63. package/dist/sessions/service.js.map +1 -1
  64. package/dist/sessions/session.d.ts +16 -0
  65. package/dist/sessions/session.js +23 -2
  66. package/dist/sessions/session.js.map +1 -1
  67. package/dist/sessions/source-kind.d.ts +22 -0
  68. package/dist/sessions/source-kind.js +54 -0
  69. package/dist/sessions/source-kind.js.map +1 -0
  70. package/dist/sessions/state-db.d.ts +10 -1
  71. package/dist/sessions/state-db.js +48 -17
  72. package/dist/sessions/state-db.js.map +1 -1
  73. package/dist/sessions/store.d.ts +2 -0
  74. package/dist/sessions/store.js +23 -4
  75. package/dist/sessions/store.js.map +1 -1
  76. package/dist/sessions/streams.d.ts +3 -0
  77. package/dist/sessions/streams.js +0 -5
  78. package/dist/sessions/streams.js.map +1 -1
  79. package/dist/sessions/titles.d.ts +4 -0
  80. package/dist/sessions/titles.js +16 -0
  81. package/dist/sessions/titles.js.map +1 -1
  82. package/dist/sessions/turn-context.d.ts +1 -0
  83. package/dist/sessions/turn-context.js +3 -0
  84. package/dist/sessions/turn-context.js.map +1 -1
  85. package/dist/sessions/turn.d.ts +66 -6
  86. package/dist/sessions/turn.js +306 -63
  87. package/dist/sessions/turn.js.map +1 -1
  88. package/dist/settings.d.ts +2 -0
  89. package/dist/settings.js +6 -0
  90. package/dist/settings.js.map +1 -1
  91. package/dist/tools/crons.d.ts +34 -3
  92. package/dist/tools/crons.js +271 -31
  93. package/dist/tools/crons.js.map +1 -1
  94. package/dist/tools/hygiene.d.ts +11 -3
  95. package/dist/tools/hygiene.js +32 -14
  96. package/dist/tools/hygiene.js.map +1 -1
  97. package/package.json +2 -2
  98. package/sidecar/talaria_sidecar/__init__.py +1 -1
  99. package/sidecar/talaria_sidecar/methods/chat.py +233 -6
  100. package/sidecar/talaria_sidecar/methods/cron.py +22 -14
  101. package/sidecar/talaria_sidecar/methods/process.py +318 -0
  102. package/static/dist/FILES.txt +120 -119
  103. package/static/dist/assets/AppShell-orat1s43.js +1 -0
  104. package/static/dist/assets/ChatPage-ojhka3hy.js +22 -0
  105. package/static/dist/assets/HubRoute-gxgw1t33.js +2 -0
  106. package/static/dist/assets/{Markdown-bx4n7qs4.js → Markdown-dy8t4dy7.js} +7 -7
  107. package/static/dist/assets/{RightPanel-ds4majj3.js → RightPanel-c66ani1s.js} +1 -1
  108. package/static/dist/assets/Select-fswf66up.js +1 -0
  109. package/static/dist/assets/SessionListPanel-goh5mtt8.js +1 -0
  110. package/static/dist/assets/{SettingsLayout-oigbg9rl.js → SettingsLayout-n5d4wq4m.js} +1 -1
  111. package/static/dist/assets/States-kxyu50at.js +1 -0
  112. package/static/dist/assets/Toaster-6zmbcqgg.js +1 -0
  113. package/static/dist/assets/_app-fowyruiu.js +1 -0
  114. package/static/dist/assets/_app.ext._extensionId-nvjyrwhy.js +1 -0
  115. package/static/dist/assets/_app.index-c9zv4y7w.js +1 -0
  116. package/static/dist/assets/_app.insights-jf12nofo.js +1 -0
  117. package/static/dist/assets/_app.kanban-lri5a4yu.js +1 -0
  118. package/static/dist/assets/_app.logs-md1p0zqo.js +1 -0
  119. package/static/dist/assets/_app.memory-bzvf2e28.js +1 -0
  120. package/static/dist/assets/_app.profiles-jpg7zmbn.js +1 -0
  121. package/static/dist/assets/{_app.session._sessionId-ciix6itb.js → _app.session._sessionId-gyoh5ylx.js} +1 -1
  122. package/static/dist/assets/_app.settings-mpuwlx4j.js +1 -0
  123. package/static/dist/assets/_app.settings._section-knz8rwoj.js +1 -0
  124. package/static/dist/assets/_app.skills-fwu1dkir.js +1 -0
  125. package/static/dist/assets/_app.tasks-h9gphtl3.js +2 -0
  126. package/static/dist/assets/_app.todos-hd1dnvrh.js +1 -0
  127. package/static/dist/assets/_app.workspaces-l8toyn5f.js +1 -0
  128. package/static/dist/assets/{abnfDiagram-VCTEODGH-krt0yaru.js → abnfDiagram-VCTEODGH-cjqletra.js} +1 -1
  129. package/static/dist/assets/architecture-7GRP2DOG-cavnusaw.js +1 -0
  130. package/static/dist/assets/{architectureDiagram-5GKGNRK7-i54t9ywl.js → architectureDiagram-5GKGNRK7-k5a7v36n.js} +1 -1
  131. package/static/dist/assets/back-e4m6nsnm.js +1 -0
  132. package/static/dist/assets/{blockDiagram-I7D4REHJ-fevbz4mz.js → blockDiagram-I7D4REHJ-b195z021.js} +1 -1
  133. package/static/dist/assets/{c4Diagram-7LVT6UL2-np8eclmc.js → c4Diagram-7LVT6UL2-olu212k1.js} +1 -1
  134. package/static/dist/assets/channel-gozy3dp3.js +1 -0
  135. package/static/dist/assets/{chunk-4HAMMTFA-owoi036m.js → chunk-4HAMMTFA-b8o1nufs.js} +1 -1
  136. package/static/dist/assets/{chunk-75Z2AOVW-md44zf1n.js → chunk-75Z2AOVW-l1seddto.js} +1 -1
  137. package/static/dist/assets/{chunk-DU6HZSFF-ka3rw8d6.js → chunk-DU6HZSFF-lo5zg15v.js} +3 -3
  138. package/static/dist/assets/{chunk-F27PBJKO-iasnjsky.js → chunk-F27PBJKO-dsdzrp16.js} +1 -1
  139. package/static/dist/assets/{chunk-GMAD6QVW-ex1up6tz.js → chunk-GMAD6QVW-f3fxqq8b.js} +1 -1
  140. package/static/dist/assets/{chunk-GVQU2GXP-d4kmmg9p.js → chunk-GVQU2GXP-h8egxtf6.js} +1 -1
  141. package/static/dist/assets/{chunk-IMKFNOWR-mwy42t85.js → chunk-IMKFNOWR-iolwd8s0.js} +1 -1
  142. package/static/dist/assets/{chunk-L3NEJ4N5-fv7ry213.js → chunk-L3NEJ4N5-b88bbtwi.js} +1 -1
  143. package/static/dist/assets/{chunk-OSK3NFVY-jg9ir8ac.js → chunk-OSK3NFVY-e3e7nr6s.js} +1 -1
  144. package/static/dist/assets/{chunk-P2QGCYS3-pe9ms3ua.js → chunk-P2QGCYS3-mdc46rt1.js} +1 -1
  145. package/static/dist/assets/{chunk-POPQ4Y6H-dimsjrn1.js → chunk-POPQ4Y6H-kqlllrrm.js} +1 -1
  146. package/static/dist/assets/{chunk-PWAF6VOD-m4hv98dy.js → chunk-PWAF6VOD-he585k2x.js} +1 -1
  147. package/static/dist/assets/{chunk-SHT3W25Y-gkjgl6qe.js → chunk-SHT3W25Y-gh94y9a4.js} +1 -1
  148. package/static/dist/assets/{chunk-SVP7TREG-bc8qss5l.js → chunk-SVP7TREG-euxp9y7e.js} +1 -1
  149. package/static/dist/assets/{chunk-TICWLB2K-k9wzw38w.js → chunk-TICWLB2K-c8cxes1q.js} +1 -1
  150. package/static/dist/assets/classDiagram-ZZMXUADV-n0vs2f2q.js +1 -0
  151. package/static/dist/assets/classDiagram-v2-VYDZK3BY-n0vs2f2q.js +1 -0
  152. package/static/dist/assets/{copied-d5joolw7.js → copied-kq0u3ht7.js} +1 -1
  153. package/static/dist/assets/{cynefin-OW5HDTMX-hueklikk.js → cynefin-OW5HDTMX-lxd44ux4.js} +1 -1
  154. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-e83o1wr1.js → cynefinDiagram-5FMLGOSQ-njpiwat8.js} +1 -1
  155. package/static/dist/assets/{dagre-GXQ25YYZ-ir1tj2ar.js → dagre-GXQ25YYZ-nvgy6yju.js} +1 -1
  156. package/static/dist/assets/{diagram-S7CK7UJ4-o5218p2q.js → diagram-S7CK7UJ4-g98nyv72.js} +1 -1
  157. package/static/dist/assets/{diagram-UQ7AKVKN-ciad4o1i.js → diagram-UQ7AKVKN-ovgm6lvv.js} +1 -1
  158. package/static/dist/assets/{diagram-VSXAHHWV-oharqjbt.js → diagram-VSXAHHWV-pb2bn2e4.js} +1 -1
  159. package/static/dist/assets/{diagram-VX7I27RA-wkwy62iv.js → diagram-VX7I27RA-6j4mvfqo.js} +1 -1
  160. package/static/dist/assets/{diagram-Z3DM3KII-bl252i7r.js → diagram-Z3DM3KII-dqmb982r.js} +1 -1
  161. package/static/dist/assets/{ebnfDiagram-PWID7BFC-nm0rcly7.js → ebnfDiagram-PWID7BFC-ozbpzb6d.js} +1 -1
  162. package/static/dist/assets/endpoints-k8agnro8.js +9 -0
  163. package/static/dist/assets/{erDiagram-RLTQ6QDP-m1w0vta2.js → erDiagram-RLTQ6QDP-hl7m8vua.js} +1 -1
  164. package/static/dist/assets/eventmodeling-NTZA5JFV-j1y2ekec.js +1 -0
  165. package/static/dist/assets/flowDiagram-HODETNUW-g2cvcbm5.js +1 -0
  166. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-czxo6iew.js → ganttDiagram-EL5Y4UJY-ompixqmh.js} +1 -1
  167. package/static/dist/assets/{gitGraph-4MIJSDKK-ip9j1rph.js → gitGraph-4MIJSDKK-b6vxwp9q.js} +1 -1
  168. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-kalxdole.js → gitGraphDiagram-WWUBYQGX-k98f57on.js} +1 -1
  169. package/static/dist/assets/{highlighted-body-KPVGNVTW-lgsj6fsk.js → highlighted-body-KPVGNVTW-cd3ff6ge.js} +1 -1
  170. package/static/dist/assets/index-nfy0ezs6.css +2 -0
  171. package/static/dist/assets/index-nqed3oum.js +11 -0
  172. package/static/dist/assets/{info-A6RAGUB7-fv4fbc5m.js → info-A6RAGUB7-hjcwjami.js} +1 -1
  173. package/static/dist/assets/{infoDiagram-27XIBGKW-kinx5jsl.js → infoDiagram-27XIBGKW-fm06rj36.js} +1 -1
  174. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-kozvlqdv.js → ishikawaDiagram-5VMMS53U-bxak4mwu.js} +1 -1
  175. package/static/dist/assets/{journeyDiagram-3NMN7TZE-lgpouxoe.js → journeyDiagram-3NMN7TZE-khmihclr.js} +1 -1
  176. package/static/dist/assets/{kanban-definition-UXKFOSKX-b320wo7b.js → kanban-definition-UXKFOSKX-h1r32wdx.js} +1 -1
  177. package/static/dist/assets/{lazyRouteComponent-hy8doeye.js → lazyRouteComponent-b2eg0fws.js} +1 -1
  178. package/static/dist/assets/{line-gxfwyhjq.js → line-friyjof3.js} +1 -1
  179. package/static/dist/assets/link-m90ahx3n.js +1 -0
  180. package/static/dist/assets/login-bw7m2fzo.js +1 -0
  181. package/static/dist/assets/mermaid-HWGCJPDP-njwcl62n.js +1 -0
  182. package/static/dist/assets/{mermaid-parser.core-loxeqsu3.js → mermaid-parser.core-f1gvpwrt.js} +3 -3
  183. package/static/dist/assets/{mindmap-definition-YA3MSWOX-edi534gc.js → mindmap-definition-YA3MSWOX-mt2oxwue.js} +1 -1
  184. package/static/dist/assets/onboarding-ret37j1e.js +1 -0
  185. package/static/dist/assets/{packet-AYTQ26CC-gmb3yy71.js → packet-AYTQ26CC-jik4ixlf.js} +1 -1
  186. package/static/dist/assets/{pegDiagram-XKGWAZYB-fxy5j8cx.js → pegDiagram-XKGWAZYB-erxlv6cc.js} +1 -1
  187. package/static/dist/assets/{pie-WAS4IAKB-do2pm4s6.js → pie-WAS4IAKB-mnkoldfl.js} +1 -1
  188. package/static/dist/assets/{pieDiagram-E7YTZNPT-mgjvb365.js → pieDiagram-E7YTZNPT-i7lwrada.js} +1 -1
  189. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-dhok6m1j.js → quadrantDiagram-AXDQQJYC-fr8ejdoy.js} +1 -1
  190. package/static/dist/assets/{radar-RG4KPBEZ-n5giw3vb.js → radar-RG4KPBEZ-otarjte2.js} +1 -1
  191. package/static/dist/assets/{railroad-74A4TZTK-h6nfs9bj.js → railroad-74A4TZTK-lw362oto.js} +1 -1
  192. package/static/dist/assets/railroad-abnf-HS5TGJTU-m741owar.js +1 -0
  193. package/static/dist/assets/railroad-ebnf-LZEXJU2U-noa4fbia.js +1 -0
  194. package/static/dist/assets/railroad-peg-WCYAUIDC-o4bpw4nb.js +1 -0
  195. package/static/dist/assets/{railroadDiagram-O6MQD6OU-lfwg92r4.js → railroadDiagram-O6MQD6OU-esyn75pw.js} +1 -1
  196. package/static/dist/assets/{refresh-cw-bg6oc499.js → refresh-cw-k66keho6.js} +1 -1
  197. package/static/dist/assets/{requirementDiagram-BXWQKSXE-c5k5pg07.js → requirementDiagram-BXWQKSXE-cyhi5u29.js} +1 -1
  198. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-o9auio4y.js → sankeyDiagram-P5KCCOFB-jljpbo0h.js} +1 -1
  199. package/static/dist/assets/{saved-j5wyhbik.js → saved-do49si3v.js} +1 -1
  200. package/static/dist/assets/{search-ipa17zlr.js → search-j5ki6a9o.js} +1 -1
  201. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-pfgodnmk.js → sequenceDiagram-WJ2MYXX4-fz0dhlu7.js} +1 -1
  202. package/static/dist/assets/{settings_section_extensions_title-fcfjf6l8.js → settings_section_extensions_title-b7lojn0o.js} +1 -1
  203. package/static/dist/assets/share._token-kg8w647b.js +2 -0
  204. package/static/dist/assets/{sliders-horizontal-bfrh4rch.js → sliders-horizontal-c4wya4dy.js} +1 -1
  205. package/static/dist/assets/{stateDiagram-D77RDMKH-m1y2cr3q.js → stateDiagram-D77RDMKH-kdnithdx.js} +1 -1
  206. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-k2wg2645.js +1 -0
  207. package/static/dist/assets/{swimlanes-42K2YHIH-hzai6fwo.js → swimlanes-42K2YHIH-esd6gmz3.js} +1 -1
  208. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-n5kvjtgr.js +8 -0
  209. package/static/dist/assets/tabBuild-bjmyvmn5.js +56 -0
  210. package/static/dist/assets/{timeline-definition-24CTP7MA-gwefy9gi.js → timeline-definition-24CTP7MA-g0qygccv.js} +1 -1
  211. package/static/dist/assets/todoStore-kjk5l0sy.js +1 -0
  212. package/static/dist/assets/{treeView-Q6P3EWNA-7q91p0dn.js → treeView-Q6P3EWNA-ndchzkuu.js} +1 -1
  213. package/static/dist/assets/{treemap-WGGIJYW6-occom39a.js → treemap-WGGIJYW6-hwjxj0zz.js} +1 -1
  214. package/static/dist/assets/{untitled-cgw2enra.js → untitled-mbr6tuhu.js} +1 -1
  215. package/static/dist/assets/useForm-ocxu460f.js +1 -0
  216. package/static/dist/assets/useLocale-fzy5jhg6.js +1 -0
  217. package/static/dist/assets/{useParams-gpbjxj8s.js → useParams-lo9u33d1.js} +1 -1
  218. package/static/dist/assets/{useSearch-bhdptos7.js → useSearch-lq1mr090.js} +1 -1
  219. package/static/dist/assets/{vennDiagram-4TSXK5OY-ew4bhldi.js → vennDiagram-4TSXK5OY-gubovd1r.js} +1 -1
  220. package/static/dist/assets/{wardley-WFR3VGLG-njdacy0u.js → wardley-WFR3VGLG-ir3om65j.js} +1 -1
  221. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-mkvxx7u9.js → wardleyDiagram-VM6X3IG4-ce0or1ie.js} +1 -1
  222. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-8uriotdw.js → xychartDiagram-S5SC5T6Z-dexylcjg.js} +1 -1
  223. package/static/dist/index.html +1 -1
  224. package/static/dist/sw.js +1 -1
  225. package/static/dist/assets/AppShell-irdqom6e.js +0 -1
  226. package/static/dist/assets/ChatPage-ldhqevjn.js +0 -20
  227. package/static/dist/assets/HubRoute-hq24vhj8.js +0 -2
  228. package/static/dist/assets/Select-gpqmt6x1.js +0 -1
  229. package/static/dist/assets/SessionListPanel-hkvipik4.js +0 -1
  230. package/static/dist/assets/States-fn4o2wdf.js +0 -1
  231. package/static/dist/assets/Toaster-cwnut53k.js +0 -1
  232. package/static/dist/assets/_app-h6ago6y6.js +0 -1
  233. package/static/dist/assets/_app.ext._extensionId-erqnfff5.js +0 -1
  234. package/static/dist/assets/_app.index-cq2fxmda.js +0 -1
  235. package/static/dist/assets/_app.insights-nzhld9gu.js +0 -1
  236. package/static/dist/assets/_app.kanban-m5uggety.js +0 -1
  237. package/static/dist/assets/_app.logs-d2kk9lza.js +0 -1
  238. package/static/dist/assets/_app.memory-gcmop1e7.js +0 -1
  239. package/static/dist/assets/_app.profiles-e9b2my7x.js +0 -1
  240. package/static/dist/assets/_app.settings-kcjum3c1.js +0 -1
  241. package/static/dist/assets/_app.settings._section-bi4jjex0.js +0 -1
  242. package/static/dist/assets/_app.skills-e4e61l23.js +0 -1
  243. package/static/dist/assets/_app.tasks-f1evdhbl.js +0 -2
  244. package/static/dist/assets/_app.todos-o7ijtk42.js +0 -1
  245. package/static/dist/assets/_app.workspaces-o18voh0w.js +0 -1
  246. package/static/dist/assets/architecture-7GRP2DOG-notdhmpv.js +0 -1
  247. package/static/dist/assets/channel-jpk1nas2.js +0 -1
  248. package/static/dist/assets/classDiagram-ZZMXUADV-hld301gc.js +0 -1
  249. package/static/dist/assets/classDiagram-v2-VYDZK3BY-hld301gc.js +0 -1
  250. package/static/dist/assets/endpoints-d8n28yf3.js +0 -64
  251. package/static/dist/assets/eventmodeling-NTZA5JFV-eaqs19mj.js +0 -1
  252. package/static/dist/assets/flowDiagram-HODETNUW-eli5764n.js +0 -1
  253. package/static/dist/assets/index-l08181vr.js +0 -11
  254. package/static/dist/assets/index-pdtcl20t.css +0 -2
  255. package/static/dist/assets/link-ib4prsn5.js +0 -1
  256. package/static/dist/assets/login-llplsuey.js +0 -1
  257. package/static/dist/assets/mermaid-HWGCJPDP-f3scrlds.js +0 -1
  258. package/static/dist/assets/onboarding-n1xhlgym.js +0 -1
  259. package/static/dist/assets/railroad-abnf-HS5TGJTU-d5gaaud9.js +0 -1
  260. package/static/dist/assets/railroad-ebnf-LZEXJU2U-ihudnbec.js +0 -1
  261. package/static/dist/assets/railroad-peg-WCYAUIDC-lgpvhel7.js +0 -1
  262. package/static/dist/assets/share._token-i339gqj4.js +0 -2
  263. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hehvfv55.js +0 -1
  264. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-nfk9mtst.js +0 -8
  265. package/static/dist/assets/todoStore-fhvdsen0.js +0 -1
  266. package/static/dist/assets/useForm-jwbfla68.js +0 -1
  267. package/static/dist/assets/useLocale-gieo1fn7.js +0 -1
  268. package/static/dist/assets/useSelector-f2aak1ol.js +0 -1
@@ -4,8 +4,13 @@ routing; the sidecar drains and formats registry events."""
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
+ import json
7
8
  import logging
8
9
  import queue
10
+ import sqlite3
11
+ import time
12
+ from contextlib import closing
13
+ from pathlib import Path
9
14
 
10
15
  from ..errors import InvalidParams
11
16
  from ..home import profile_home_param, scoped_home
@@ -89,6 +94,62 @@ def mark_consumed(process_id: str) -> bool:
89
94
  return False
90
95
 
91
96
 
97
+ def _delivery_api():
98
+ """The Agent's durable delivery ledger (``tools.async_delegation``), or None on an Agent without it."""
99
+ try:
100
+ from tools import async_delegation
101
+ except Exception: # noqa: BLE001
102
+ return None
103
+ names = ("claim_event_delivery", "complete_event_delivery", "release_event_delivery")
104
+ return async_delegation if all(callable(getattr(async_delegation, n, None)) for n in names) else None
105
+
106
+
107
+ def _ledger_event(evt: dict) -> dict:
108
+ return {k: v for k, v in evt.items() if k not in ("process_id", "consumed")}
109
+
110
+
111
+ def claim_delivery(evt: dict, consumer: str) -> str | None:
112
+ """Claim a durable delegation completion before delivering it (TAL-459).
113
+
114
+ ``None``: another consumer holds it, or the ledger already delivered or dropped it, so do not deliver.
115
+ ``""``: nothing durable to acknowledge (interim notice, legacy event, or an Agent without the ledger)."""
116
+ api = _delivery_api()
117
+ if api is None:
118
+ return ""
119
+ claim_id = api.claim_event_delivery(_ledger_event(evt), consumer)
120
+ return None if claim_id is None else str(claim_id)
121
+
122
+
123
+ def complete_delivery(evt: dict, claim_id: str) -> bool:
124
+ api = _delivery_api()
125
+ if api is None or not claim_id:
126
+ return False
127
+ api.complete_event_delivery(_ledger_event(evt), claim_id)
128
+ return True
129
+
130
+
131
+ def release_delivery(evt: dict, claim_id: str) -> bool:
132
+ api = _delivery_api()
133
+ if api is None or not claim_id:
134
+ return False
135
+ api.release_event_delivery(_ledger_event(evt), claim_id)
136
+ return True
137
+
138
+
139
+ def defer_delivery(evt: dict, claim_id: str) -> bool:
140
+ """Hand back a claim the target never admitted (its session was busy) without spending a delivery attempt;
141
+ the Agent drops a row for good after its attempt budget, so a busy session must not burn it."""
142
+ api = _delivery_api()
143
+ if api is None or not claim_id:
144
+ return False
145
+ defer = getattr(api, "defer_completion_delivery", None)
146
+ if not callable(defer) or evt.get("type") != "async_delegation" or not evt.get("delegation_id"):
147
+ api.release_event_delivery(_ledger_event(evt), claim_id)
148
+ return True
149
+ defer(str(evt["delegation_id"]), claim_id)
150
+ return True
151
+
152
+
92
153
  def format_notification(evt: dict) -> str:
93
154
  if evt.get("type") == "async_delegation":
94
155
  try:
@@ -122,6 +183,210 @@ def list_sessions() -> list[dict]:
122
183
  return out
123
184
 
124
185
 
186
+ _LEDGER_COLUMNS = "delegation_id, origin_ui_session_id, state, dispatched_at, completed_at, updated_at, task_json, result_json, event_json IS NOT NULL"
187
+ _LEDGER_LIMIT = 200
188
+
189
+
190
+ def _json(text) -> dict:
191
+ try:
192
+ value = json.loads(text) if text else {}
193
+ except (TypeError, ValueError):
194
+ return {}
195
+ return value if isinstance(value, dict) else {}
196
+
197
+
198
+ def _unit_goals(task: dict) -> list[str]:
199
+ goals = task.get("goals") if isinstance(task.get("goals"), list) else None
200
+ indexes = task.get("task_indexes") if isinstance(task.get("task_indexes"), list) else None
201
+ if goals and indexes:
202
+ return [str(goals[i]) for i in indexes if isinstance(i, int) and 0 <= i < len(goals)]
203
+ if goals:
204
+ return [str(g) for g in goals]
205
+ return [str(task.get("goal") or "")]
206
+
207
+
208
+ def _child_statuses(result: dict) -> list[str]:
209
+ """Per-subagent outcome of a finished unit: a batch carries ``results``, a single task is its own result."""
210
+ if isinstance(result.get("results"), list):
211
+ return [str(r.get("status") or "") for r in result["results"] if isinstance(r, dict)]
212
+ return [str(result.get("status") or "")] if result else []
213
+
214
+
215
+ def _ledger_rows(home: Path, session_ids: list[str]) -> list[dict]:
216
+ db_path = home / "state.db"
217
+ if not db_path.exists() or not session_ids:
218
+ return []
219
+ marks = ",".join("?" * len(session_ids))
220
+ with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
221
+ try:
222
+ rows = conn.execute(f"SELECT {_LEDGER_COLUMNS} FROM async_delegations WHERE origin_ui_session_id IN ({marks}) ORDER BY dispatched_at DESC LIMIT ?", [*session_ids, _LEDGER_LIMIT]).fetchall()
223
+ except sqlite3.OperationalError: # an Agent that never delegated has no ledger table yet
224
+ return []
225
+ out = []
226
+ for delegation_id, origin, state, dispatched_at, completed_at, updated_at, task_json, result_json, has_event in rows:
227
+ task, result = _json(task_json), _json(result_json)
228
+ goals = _unit_goals(task)
229
+ out.append({
230
+ "delegation_id": delegation_id, "origin_ui_session_id": origin, "state": state, "dispatched_at": dispatched_at,
231
+ "completed_at": completed_at, "updated_at": updated_at, "goals": goals,
232
+ "child_statuses": _child_statuses(result), "has_result": bool(has_event),
233
+ })
234
+ return out
235
+
236
+
237
+ def _live_delegations() -> dict[str, dict]:
238
+ try:
239
+ from tools.async_delegation import list_async_delegations
240
+ items = list_async_delegations()
241
+ except Exception: # noqa: BLE001 - an Agent without the live registry reports from the ledger alone
242
+ return {}
243
+ return {str(i.get("delegation_id")): {"status": str(i.get("status") or "")} for i in items if isinstance(i, dict) and i.get("delegation_id")}
244
+
245
+
246
+ def _owned_processes(session_ids: set[str]) -> list[dict]:
247
+ """Notified or watched processes a WebUI session started (``session_key`` is the WebUI session id)."""
248
+ registry = _registry()
249
+ if registry is None:
250
+ return []
251
+ try:
252
+ with registry._lock:
253
+ sessions = [*registry._running.values(), *registry._finished.values()]
254
+ except Exception: # noqa: BLE001
255
+ return []
256
+ out = []
257
+ for proc in sessions:
258
+ if str(getattr(proc, "session_key", "") or "") not in session_ids:
259
+ continue
260
+ watched = bool(getattr(proc, "watch_patterns", None))
261
+ if not (getattr(proc, "notify_on_complete", False) or watched):
262
+ continue
263
+ exited = bool(getattr(proc, "exited", False))
264
+ out.append({
265
+ "process_id": str(proc.id), "session_key": str(proc.session_key), "command": str(getattr(proc, "command", "") or "")[:200],
266
+ "started_at": float(getattr(proc, "started_at", 0) or 0) or None, "exited": exited,
267
+ "exited_at": float(getattr(proc, "exited_at", 0) or 0) or None, "exit_code": getattr(proc, "exit_code", None),
268
+ "completion_reason": str(getattr(proc, "completion_reason", "") or ""), "watched": watched,
269
+ })
270
+ return out
271
+
272
+
273
+ _CHILD_WINDOW_S = 5
274
+
275
+
276
+ def _live_children() -> list[dict]:
277
+ """Running subagents from the Agent's in-process registry: the only place a child's session id sits next to its
278
+ delegation id. An Agent without the registry reports none."""
279
+ try:
280
+ from tools.delegate_tool_registry import _active_subagents, _active_subagents_lock
281
+ with _active_subagents_lock:
282
+ records = list(_active_subagents.values())
283
+ except Exception: # noqa: BLE001
284
+ return []
285
+ out = []
286
+ for r in records:
287
+ sid = getattr(r.get("agent"), "session_id", None)
288
+ if isinstance(sid, str) and sid:
289
+ out.append({"delegation_id": str(r.get("delegation_id") or ""), "goal": str(r.get("goal") or ""), "owner": str(r.get("owner_agent_session_id") or ""), "session_id": sid})
290
+ return out
291
+
292
+
293
+ def _ledger_children(home: Path, owners: list[str]) -> list[dict]:
294
+ """Finished subagents' own sessions in state.db: ``source = subagent`` rows tagged ``_delegate_from`` with their
295
+ parent's session, each with its start time and first user message (the child's goal, sent verbatim)."""
296
+ db_path = home / "state.db"
297
+ if not db_path.exists() or not owners:
298
+ return []
299
+ marks = ",".join("?" * len(owners))
300
+ with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
301
+ try:
302
+ # Only these chats' children: a long-lived profile keeps every subagent session it ever ran.
303
+ rows = conn.execute(
304
+ "SELECT s.id, s.model_config, s.started_at, (SELECT m.content FROM messages m WHERE m.session_id = s.id AND m.role = 'user' ORDER BY m.id LIMIT 1)"
305
+ f" FROM sessions s WHERE s.source = 'subagent' AND json_extract(s.model_config, '$._delegate_from') IN ({marks})", owners).fetchall()
306
+ except sqlite3.OperationalError:
307
+ return []
308
+ out = []
309
+ for sid, model_config, started_at, first in rows:
310
+ owner = _json(model_config).get("_delegate_from")
311
+ goal = _goal_text(first)
312
+ if owner in owners and goal:
313
+ out.append({"owner": owner, "session_id": sid, "started_at": started_at, "goal": goal})
314
+ return out
315
+
316
+
317
+ _CONTENT_JSON_PREFIX = "\x00json:"
318
+ _IMAGE_HINTS = "\n\n[Image attached"
319
+
320
+
321
+ def _goal_text(content) -> str:
322
+ """The goal a child was sent, from its stored first message: a task with images is stored as multimodal parts
323
+ (native image input; the goal is the text part) or as the goal followed by image hints (text input)."""
324
+ if not isinstance(content, str):
325
+ return ""
326
+ if content.startswith(_CONTENT_JSON_PREFIX):
327
+ try:
328
+ parts = json.loads(content[len(_CONTENT_JSON_PREFIX):])
329
+ except ValueError:
330
+ return ""
331
+ texts = [p.get("text") for p in parts if isinstance(p, dict) and p.get("type") == "text"] if isinstance(parts, list) else []
332
+ return str(texts[0]) if texts and texts[0] else ""
333
+ return content.split(_IMAGE_HINTS, 1)[0]
334
+
335
+
336
+ def unit_children(unit: dict, owner: str, live: list[dict], finished: list[dict], now: float) -> list[dict]:
337
+ """The subagent sessions one delegation unit ran, as ``{goal, session_id}`` per task, in task order. A live registry
338
+ record is exact (same owner, the unit's call id, the task's goal) and is used once. Without one, finished sessions
339
+ of that owner whose goal matches, started in the unit's window, count only when there are exactly as many as tasks
340
+ with that goal; anything else stays unlinked rather than guessed."""
341
+ unit_id, goals = unit["delegation_id"], [g for g in unit["goals"] if g]
342
+ pool = [r for r in live if r["owner"] == owner and r["delegation_id"] and (unit_id == r["delegation_id"] or unit_id.startswith(f"{r['delegation_id']}-"))]
343
+ linked: list[str | None] = []
344
+ used: set[str] = set()
345
+ for goal in goals:
346
+ record = next((r for r in pool if r["goal"] == goal and r["session_id"] not in used), None)
347
+ if record:
348
+ used.add(record["session_id"])
349
+ linked.append(record["session_id"] if record else None)
350
+ start = (unit.get("dispatched_at") or 0) - _CHILD_WINDOW_S
351
+ end = (unit.get("completed_at") or now) + _CHILD_WINDOW_S
352
+ for goal in {g for g, sid in zip(goals, linked) if sid is None}:
353
+ slots = [i for i, (g, sid) in enumerate(zip(goals, linked)) if g == goal and sid is None]
354
+ matches = sorted((c for c in finished if c["owner"] == owner and c["goal"] == goal and c["session_id"] not in used and start <= (c["started_at"] or 0) <= end), key=lambda c: c["started_at"] or 0)
355
+ if len(matches) == len(slots):
356
+ for i, c in zip(slots, matches):
357
+ linked[i] = c["session_id"]
358
+ return [{"goal": g, "session_id": sid} for g, sid in zip(goals, linked) if sid]
359
+
360
+
361
+ def background_list(home: Path, session_ids: list[str]) -> dict:
362
+ """TAL-372: what the Agent knows about the background work of these WebUI sessions: delegations from the durable
363
+ ledger (with the live registry's status while they run) and notified processes from the process registry.
364
+ TAL-494: each delegation also names the subagent sessions it ran."""
365
+ live = _live_delegations()
366
+ delegations = _ledger_rows(home, session_ids)
367
+ live_children = _live_children()
368
+ finished = _ledger_children(home, session_ids) if delegations else []
369
+ now = time.time()
370
+ for row in delegations:
371
+ row["live_status"] = live.get(row["delegation_id"], {}).get("status")
372
+ row["children"] = unit_children(row, row["origin_ui_session_id"], live_children, finished, now)
373
+ return {"delegations": delegations, "processes": _owned_processes(set(session_ids))}
374
+
375
+
376
+ def delegation_result(home: Path, session_id: str, delegation_id: str) -> str:
377
+ """The full result of a finished delegation unit, as the Agent words it for its own notification."""
378
+ db_path = home / "state.db"
379
+ if not db_path.exists():
380
+ return ""
381
+ with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
382
+ try:
383
+ row = conn.execute("SELECT event_json FROM async_delegations WHERE delegation_id = ? AND origin_ui_session_id = ?", (delegation_id, session_id)).fetchone()
384
+ except sqlite3.OperationalError:
385
+ return ""
386
+ event = _json(row[0]) if row else {}
387
+ return format_notification(event) if event else ""
388
+
389
+
125
390
  def register(registry_) -> None:
126
391
  @registry_.method("process.drain")
127
392
  def drain_(ctx: CallContext, params: dict) -> dict:
@@ -142,6 +407,39 @@ def register(registry_) -> None:
142
407
  raise InvalidParams("process_id is required")
143
408
  return {"ok": mark_consumed(process_id)}
144
409
 
410
+ def _delivery_params(params: dict) -> dict:
411
+ evt = params.get("event")
412
+ if not isinstance(evt, dict):
413
+ raise InvalidParams("event must be an object")
414
+ return evt
415
+
416
+ @registry_.method("process.claim_delivery")
417
+ def claim_(ctx: CallContext, params: dict) -> dict:
418
+ evt = _delivery_params(params)
419
+ consumer = str(params.get("consumer") or "").strip()
420
+ if not consumer:
421
+ raise InvalidParams("consumer is required")
422
+ with scoped_home(profile_home_param(params)):
423
+ return {"claim_id": claim_delivery(evt, consumer)}
424
+
425
+ @registry_.method("process.complete_delivery")
426
+ def complete_(ctx: CallContext, params: dict) -> dict:
427
+ evt = _delivery_params(params)
428
+ with scoped_home(profile_home_param(params)):
429
+ return {"ok": complete_delivery(evt, str(params.get("claim_id") or ""))}
430
+
431
+ @registry_.method("process.release_delivery")
432
+ def release_(ctx: CallContext, params: dict) -> dict:
433
+ evt = _delivery_params(params)
434
+ with scoped_home(profile_home_param(params)):
435
+ return {"ok": release_delivery(evt, str(params.get("claim_id") or ""))}
436
+
437
+ @registry_.method("process.defer_delivery")
438
+ def defer_(ctx: CallContext, params: dict) -> dict:
439
+ evt = _delivery_params(params)
440
+ with scoped_home(profile_home_param(params)):
441
+ return {"ok": defer_delivery(evt, str(params.get("claim_id") or ""))}
442
+
145
443
  @registry_.method("process.format_notification")
146
444
  def format_(ctx: CallContext, params: dict) -> dict:
147
445
  evt = params.get("event")
@@ -149,6 +447,26 @@ def register(registry_) -> None:
149
447
  raise InvalidParams("event must be an object")
150
448
  return {"text": format_notification(evt)}
151
449
 
450
+ def _session_ids(params: dict) -> list[str]:
451
+ ids = params.get("session_ids")
452
+ if not isinstance(ids, list) or not all(isinstance(i, str) and i for i in ids):
453
+ raise InvalidParams("session_ids must be a list of session ids")
454
+ return ids
455
+
456
+ @registry_.method("process.background_list")
457
+ def background_list_(ctx: CallContext, params: dict) -> dict:
458
+ ids = _session_ids(params)
459
+ with scoped_home(profile_home_param(params)) as home:
460
+ return background_list(home, ids)
461
+
462
+ @registry_.method("process.delegation_result")
463
+ def delegation_result_(ctx: CallContext, params: dict) -> dict:
464
+ sid, did = str(params.get("session_id") or ""), str(params.get("delegation_id") or "")
465
+ if not sid or not did:
466
+ raise InvalidParams("session_id and delegation_id are required")
467
+ with scoped_home(profile_home_param(params)) as home:
468
+ return {"text": delegation_result(home, sid, did)}
469
+
152
470
  @registry_.method("process.list")
153
471
  def list_(ctx: CallContext, params: dict) -> dict:
154
472
  with scoped_home(profile_home_param(params)):