@axiom-lattice/gateway 4.1.7 → 4.2.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 (1126) hide show
  1. package/dist/chunk-K32XEQLH.mjs +28 -0
  2. package/dist/chunk-K32XEQLH.mjs.map +1 -0
  3. package/dist/{chunk-K4XELOSO.mjs → chunk-QKPZWWHH.mjs} +3 -2
  4. package/dist/{chunk-K4XELOSO.mjs.map → chunk-QKPZWWHH.mjs.map} +1 -1
  5. package/dist/embed/agent-chat-loader.js +1 -0
  6. package/dist/embed/embed-page-1c-75E4QIWF.js +1 -0
  7. package/dist/embed/embed-page-AgentDetailSideApp-6CVXM3P3.js +1 -0
  8. package/dist/embed/embed-page-AgentDetailSideApp-DRGKJ6C5.css +1 -0
  9. package/dist/embed/embed-page-AgentGovernanceWorkbench-4B3NJPCY.js +5 -0
  10. package/dist/embed/embed-page-AgentGovernanceWorkbench-SDS3GBCC.css +1 -0
  11. package/dist/embed/embed-page-ReactChart-OG5Z43H7.js +1 -0
  12. package/dist/embed/embed-page-ReactChart-VBM467ER.css +1 -0
  13. package/dist/embed/embed-page-ReactInfographic-IABAC7DO.js +574 -0
  14. package/dist/embed/embed-page-SkillFlow-GS4OUCJJ.js +1 -0
  15. package/dist/embed/embed-page-SkillFlow-VDPP5DFL.css +1 -0
  16. package/dist/embed/embed-page-TasksSideApp-F4XUHPTG.css +1 -0
  17. package/dist/embed/embed-page-TasksSideApp-I6Z7BOT2.js +241 -0
  18. package/dist/embed/embed-page-TeamWorkspace-DXKGNQ3C.css +1 -0
  19. package/dist/embed/embed-page-TeamWorkspace-LSCUIJDA.js +748 -0
  20. package/dist/embed/embed-page-TopologyRuntimeView-2NQ3OOYI.css +1 -0
  21. package/dist/embed/embed-page-TopologyRuntimeView-RY7NOUB7.js +6 -0
  22. package/dist/embed/embed-page-WorkflowAutomationView-MAYS27YJ.css +1 -0
  23. package/dist/embed/embed-page-WorkflowAutomationView-RNKIKDUX.js +3 -0
  24. package/dist/embed/embed-page-abap-QKV7XZRP.js +1 -0
  25. package/dist/embed/embed-page-abnf-534KGIL5.js +1 -0
  26. package/dist/embed/embed-page-abnf-NNWX7KPS.js +1 -0
  27. package/dist/embed/embed-page-accesslog-K5DAETBI.js +1 -0
  28. package/dist/embed/embed-page-actionscript-MLTGVDIY.js +1 -0
  29. package/dist/embed/embed-page-actionscript-YXZSI3FP.js +1 -0
  30. package/dist/embed/embed-page-ada-SMIJQ6T7.js +1 -0
  31. package/dist/embed/embed-page-ada-Z5BYNU6B.js +1 -0
  32. package/dist/embed/embed-page-agda-WCRTGDJB.js +1 -0
  33. package/dist/embed/embed-page-al-2LSX2G2U.js +1 -0
  34. package/dist/embed/embed-page-all-RTJLYZHS.js +1 -0
  35. package/dist/embed/embed-page-angelscript-4S3XC2EJ.js +1 -0
  36. package/dist/embed/embed-page-antlr4-OLOPZLHD.js +1 -0
  37. package/dist/embed/embed-page-apache-RGO2UM6T.js +1 -0
  38. package/dist/embed/embed-page-apacheconf-EKQ6F4ZQ.js +1 -0
  39. package/dist/embed/embed-page-apex-ZJTOIW4M.js +1 -0
  40. package/dist/embed/embed-page-apl-W7YETB5L.js +1 -0
  41. package/dist/embed/embed-page-applescript-I4PV6U4X.js +1 -0
  42. package/dist/embed/embed-page-applescript-M2D2KKDY.js +1 -0
  43. package/dist/embed/embed-page-aql-V6TCDQAH.js +1 -0
  44. package/dist/embed/embed-page-arcade-TSPLEDM5.js +1 -0
  45. package/dist/embed/embed-page-architecture-U656AL7Q-55BYHO3H.js +1 -0
  46. package/dist/embed/embed-page-architectureDiagram-VXUJARFQ-GDHKRBZH.js +36 -0
  47. package/dist/embed/embed-page-arduino-7N264XVW.js +1 -0
  48. package/dist/embed/embed-page-arduino-XUEUIP7S.js +1 -0
  49. package/dist/embed/embed-page-arff-M7PKJV7Y.js +1 -0
  50. package/dist/embed/embed-page-armasm-OAQGLAMS.js +1 -0
  51. package/dist/embed/embed-page-armasm-PTMJUNBD.js +1 -0
  52. package/dist/embed/embed-page-arturo-VYVR5YRA.js +1 -0
  53. package/dist/embed/embed-page-asciidoc-6GDV5NP4.js +1 -0
  54. package/dist/embed/embed-page-asciidoc-PDLRDQNM.js +1 -0
  55. package/dist/embed/embed-page-asm6502-LVC7KLV5.js +1 -0
  56. package/dist/embed/embed-page-asmatmel-B4D7TBZY.js +1 -0
  57. package/dist/embed/embed-page-aspectj-QZFNA4MK.js +1 -0
  58. package/dist/embed/embed-page-aspnet-4JJQ3PPT.js +1 -0
  59. package/dist/embed/embed-page-autohotkey-4QUCSDML.js +1 -0
  60. package/dist/embed/embed-page-autohotkey-SVPZNOL7.js +1 -0
  61. package/dist/embed/embed-page-autoit-IXYC6T6A.js +1 -0
  62. package/dist/embed/embed-page-autoit-PFZZYGX5.js +1 -0
  63. package/dist/embed/embed-page-avisynth-MVQJIFSP.js +1 -0
  64. package/dist/embed/embed-page-avrasm-XYNKWFKC.js +1 -0
  65. package/dist/embed/embed-page-avro-idl-4AA2QRRU.js +1 -0
  66. package/dist/embed/embed-page-awk-JNS3RERS.js +1 -0
  67. package/dist/embed/embed-page-awk-RMGF56MA.js +1 -0
  68. package/dist/embed/embed-page-axapta-6U5QN2JT.js +1 -0
  69. package/dist/embed/embed-page-bash-UJJ4GKW6.js +1 -0
  70. package/dist/embed/embed-page-bash-VYDNQBY7.js +1 -0
  71. package/dist/embed/embed-page-basic-6KLN4O27.js +1 -0
  72. package/dist/embed/embed-page-basic-EJRJ7W4E.js +1 -0
  73. package/dist/embed/embed-page-batch-AJOBLMJ2.js +1 -0
  74. package/dist/embed/embed-page-bbcode-CIP6MR7G.js +1 -0
  75. package/dist/embed/embed-page-bbj-OPFURIS3.js +1 -0
  76. package/dist/embed/embed-page-bicep-7BI3OTK4.js +1 -0
  77. package/dist/embed/embed-page-birb-LWSJQUWN.js +1 -0
  78. package/dist/embed/embed-page-bison-HDVOA2OF.js +1 -0
  79. package/dist/embed/embed-page-blockDiagram-VD42YOAC-6GQBPG3N.js +122 -0
  80. package/dist/embed/embed-page-bnf-7O24GKM6.js +1 -0
  81. package/dist/embed/embed-page-bnf-TCLPD45L.js +1 -0
  82. package/dist/embed/embed-page-bqn-LADFOREK.js +1 -0
  83. package/dist/embed/embed-page-brainfuck-B2QDW5Y5.js +1 -0
  84. package/dist/embed/embed-page-brainfuck-HUZY5LJA.js +1 -0
  85. package/dist/embed/embed-page-brightscript-4E54PL3L.js +1 -0
  86. package/dist/embed/embed-page-bro-DEBMJONL.js +1 -0
  87. package/dist/embed/embed-page-bsl-5HTEKAYP.js +1 -0
  88. package/dist/embed/embed-page-c-LFRMHVS4.js +1 -0
  89. package/dist/embed/embed-page-c-X5PJHL4T.js +1 -0
  90. package/dist/embed/embed-page-c-like-UPVRYRH5.js +1 -0
  91. package/dist/embed/embed-page-c4Diagram-YG6GDRKO-UBUOGTT3.js +10 -0
  92. package/dist/embed/embed-page-cal-MS5NKCDW.js +1 -0
  93. package/dist/embed/embed-page-capnproto-VVJPMDQX.js +1 -0
  94. package/dist/embed/embed-page-ceylon-TOPAPEAZ.js +1 -0
  95. package/dist/embed/embed-page-cfscript-P3X63VSB.js +1 -0
  96. package/dist/embed/embed-page-chaiscript-QZLDHGV3.js +1 -0
  97. package/dist/embed/embed-page-chunk-2AUFZBHG.js +1 -0
  98. package/dist/embed/embed-page-chunk-2AX46B4A.js +1 -0
  99. package/dist/embed/embed-page-chunk-2BEHY2KL.js +1 -0
  100. package/dist/embed/embed-page-chunk-2CM5KQAO.js +1 -0
  101. package/dist/embed/embed-page-chunk-2DKYYWQC.js +1 -0
  102. package/dist/embed/embed-page-chunk-2GFIRW6Z.js +1 -0
  103. package/dist/embed/embed-page-chunk-2GGHQJ6Z.js +1 -0
  104. package/dist/embed/embed-page-chunk-2IURSVR2.js +7 -0
  105. package/dist/embed/embed-page-chunk-2NLG2PBF.js +1 -0
  106. package/dist/embed/embed-page-chunk-2REOJOLY.js +1 -0
  107. package/dist/embed/embed-page-chunk-2SKSDKSN.js +1 -0
  108. package/dist/embed/embed-page-chunk-2V6IHON2.js +1 -0
  109. package/dist/embed/embed-page-chunk-2VJ7T35I.js +1 -0
  110. package/dist/embed/embed-page-chunk-2WL6TSEG.js +1 -0
  111. package/dist/embed/embed-page-chunk-2XLPEIWW.js +1 -0
  112. package/dist/embed/embed-page-chunk-2YRVPZIU.js +1 -0
  113. package/dist/embed/embed-page-chunk-33GTW5LX.js +1 -0
  114. package/dist/embed/embed-page-chunk-33LYY5FY.js +1 -0
  115. package/dist/embed/embed-page-chunk-342GWWY6.js +1 -0
  116. package/dist/embed/embed-page-chunk-34RH2U7Z.js +1 -0
  117. package/dist/embed/embed-page-chunk-37BFU4NL.js +1 -0
  118. package/dist/embed/embed-page-chunk-3C32LJTO.js +1 -0
  119. package/dist/embed/embed-page-chunk-3D3RUB6Q.js +1 -0
  120. package/dist/embed/embed-page-chunk-3DDNDQND.js +1 -0
  121. package/dist/embed/embed-page-chunk-3FQ3EELN.js +1 -0
  122. package/dist/embed/embed-page-chunk-3GRDXHWH.js +1 -0
  123. package/dist/embed/embed-page-chunk-3GTSDITA.js +1 -0
  124. package/dist/embed/embed-page-chunk-3IP6ESHH.js +1 -0
  125. package/dist/embed/embed-page-chunk-3J7LPOGR.js +1 -0
  126. package/dist/embed/embed-page-chunk-3KBA5YLX.js +1 -0
  127. package/dist/embed/embed-page-chunk-3MESXVLG.js +1 -0
  128. package/dist/embed/embed-page-chunk-3QOIYWK3.js +1 -0
  129. package/dist/embed/embed-page-chunk-3WBHNFJP.js +1 -0
  130. package/dist/embed/embed-page-chunk-3YID7Y73.js +1 -0
  131. package/dist/embed/embed-page-chunk-43APLD2U.js +1 -0
  132. package/dist/embed/embed-page-chunk-447KJWVF.js +1 -0
  133. package/dist/embed/embed-page-chunk-47OYOFAD.js +1 -0
  134. package/dist/embed/embed-page-chunk-4APB7U5B.js +1 -0
  135. package/dist/embed/embed-page-chunk-4BIOW547.js +3 -0
  136. package/dist/embed/embed-page-chunk-4BKXE5ON.js +14 -0
  137. package/dist/embed/embed-page-chunk-4BRWUEYH.js +1 -0
  138. package/dist/embed/embed-page-chunk-4C2ZTZLC.js +1 -0
  139. package/dist/embed/embed-page-chunk-4DT3DP4G.js +3 -0
  140. package/dist/embed/embed-page-chunk-4FS42IYM.js +1 -0
  141. package/dist/embed/embed-page-chunk-4JZFQLML.js +1 -0
  142. package/dist/embed/embed-page-chunk-4LC4UT4R.js +1 -0
  143. package/dist/embed/embed-page-chunk-4MNX7JDW.js +2 -0
  144. package/dist/embed/embed-page-chunk-4NIWV5BC.js +1 -0
  145. package/dist/embed/embed-page-chunk-4O7YNJLI.js +1 -0
  146. package/dist/embed/embed-page-chunk-4OTU4CRR.js +1 -0
  147. package/dist/embed/embed-page-chunk-4PR66FMJ.js +1 -0
  148. package/dist/embed/embed-page-chunk-4R5F5OQK.js +1 -0
  149. package/dist/embed/embed-page-chunk-4SGVKO3D.js +1 -0
  150. package/dist/embed/embed-page-chunk-4TEJCUD5.js +1 -0
  151. package/dist/embed/embed-page-chunk-4WOTSHAW.js +1 -0
  152. package/dist/embed/embed-page-chunk-4X5XHAMX.js +5 -0
  153. package/dist/embed/embed-page-chunk-4XVBSVFM.js +1 -0
  154. package/dist/embed/embed-page-chunk-4ZIJQUGM.js +1 -0
  155. package/dist/embed/embed-page-chunk-53PYTL4U.js +1 -0
  156. package/dist/embed/embed-page-chunk-53QS4RRO.js +1 -0
  157. package/dist/embed/embed-page-chunk-54DGJLXZ.js +1 -0
  158. package/dist/embed/embed-page-chunk-57BJJSAV.js +1 -0
  159. package/dist/embed/embed-page-chunk-5DAOHO64.js +1 -0
  160. package/dist/embed/embed-page-chunk-5HA2MCVW.js +1 -0
  161. package/dist/embed/embed-page-chunk-5HNRARTT.js +1 -0
  162. package/dist/embed/embed-page-chunk-5IG7MZQF.js +1 -0
  163. package/dist/embed/embed-page-chunk-5JDQ456X.js +7 -0
  164. package/dist/embed/embed-page-chunk-5LKQWBUZ.js +339 -0
  165. package/dist/embed/embed-page-chunk-5LZHM64O.js +1 -0
  166. package/dist/embed/embed-page-chunk-5OTSEOBG.js +1 -0
  167. package/dist/embed/embed-page-chunk-5WMGNRUZ.js +79 -0
  168. package/dist/embed/embed-page-chunk-5YNTYDFR.js +1 -0
  169. package/dist/embed/embed-page-chunk-62XZFSLM.js +1 -0
  170. package/dist/embed/embed-page-chunk-6433URSF.js +1 -0
  171. package/dist/embed/embed-page-chunk-6633JIZI.js +1 -0
  172. package/dist/embed/embed-page-chunk-664ZGB66.js +1 -0
  173. package/dist/embed/embed-page-chunk-66JWK64A.js +1 -0
  174. package/dist/embed/embed-page-chunk-66PSFC5S.js +1 -0
  175. package/dist/embed/embed-page-chunk-67RFPBNS.js +1 -0
  176. package/dist/embed/embed-page-chunk-6A6HYD7S.js +1 -0
  177. package/dist/embed/embed-page-chunk-6AF3OC6E.js +1 -0
  178. package/dist/embed/embed-page-chunk-6BL2XYV2.js +1 -0
  179. package/dist/embed/embed-page-chunk-6BUDTOPG.js +54 -0
  180. package/dist/embed/embed-page-chunk-6D23MLVG.js +1 -0
  181. package/dist/embed/embed-page-chunk-6DD7CBYV.js +1 -0
  182. package/dist/embed/embed-page-chunk-6DYN2PCR.js +1 -0
  183. package/dist/embed/embed-page-chunk-6E33CLHM.js +1 -0
  184. package/dist/embed/embed-page-chunk-6FFWZNBJ.js +1 -0
  185. package/dist/embed/embed-page-chunk-6G24DMH3.js +1 -0
  186. package/dist/embed/embed-page-chunk-6JFHQ7NQ.js +1 -0
  187. package/dist/embed/embed-page-chunk-6NWENUQ7.js +1 -0
  188. package/dist/embed/embed-page-chunk-6OKUWTCF.js +1 -0
  189. package/dist/embed/embed-page-chunk-6QTEF2NW.js +1 -0
  190. package/dist/embed/embed-page-chunk-6SFPT5PF.js +1 -0
  191. package/dist/embed/embed-page-chunk-6VRE3UPC.js +1 -0
  192. package/dist/embed/embed-page-chunk-6XNKALVC.js +1 -0
  193. package/dist/embed/embed-page-chunk-6XZZ6A3N.js +1 -0
  194. package/dist/embed/embed-page-chunk-6Y3UYJ6Z.js +1 -0
  195. package/dist/embed/embed-page-chunk-6ZXRL3VU.js +1 -0
  196. package/dist/embed/embed-page-chunk-72JNWX43.js +1 -0
  197. package/dist/embed/embed-page-chunk-734LUAPQ.js +1 -0
  198. package/dist/embed/embed-page-chunk-74YMVV5T.js +1 -0
  199. package/dist/embed/embed-page-chunk-75BP54HX.js +1 -0
  200. package/dist/embed/embed-page-chunk-76S2KVCN.js +1 -0
  201. package/dist/embed/embed-page-chunk-77SKWVKH.js +1 -0
  202. package/dist/embed/embed-page-chunk-7AKQRM6L.js +1 -0
  203. package/dist/embed/embed-page-chunk-7ASML425.js +1 -0
  204. package/dist/embed/embed-page-chunk-7BEP247X.js +1 -0
  205. package/dist/embed/embed-page-chunk-7CFGO35V.js +153 -0
  206. package/dist/embed/embed-page-chunk-7CW4T6JX.js +1 -0
  207. package/dist/embed/embed-page-chunk-7GLQRV3J.js +1 -0
  208. package/dist/embed/embed-page-chunk-7I5CUKLE.js +1 -0
  209. package/dist/embed/embed-page-chunk-7IYYKQJE.js +1 -0
  210. package/dist/embed/embed-page-chunk-7JBDPIC6.js +1 -0
  211. package/dist/embed/embed-page-chunk-7KSOII2E.js +1 -0
  212. package/dist/embed/embed-page-chunk-7MYHMZR7.js +1 -0
  213. package/dist/embed/embed-page-chunk-7OYMAA4V.js +1 -0
  214. package/dist/embed/embed-page-chunk-7Q3EEWYO.js +1 -0
  215. package/dist/embed/embed-page-chunk-7RPAJAU7.js +1 -0
  216. package/dist/embed/embed-page-chunk-7TH7FFVA.js +1 -0
  217. package/dist/embed/embed-page-chunk-7TMVQS3E.js +1 -0
  218. package/dist/embed/embed-page-chunk-7TY2R7O2.js +1 -0
  219. package/dist/embed/embed-page-chunk-7XMMIQFH.js +1 -0
  220. package/dist/embed/embed-page-chunk-A2LQIHX4.js +261 -0
  221. package/dist/embed/embed-page-chunk-A2QFCP3F.js +1 -0
  222. package/dist/embed/embed-page-chunk-A2XJ36CA.js +1 -0
  223. package/dist/embed/embed-page-chunk-A3QFY3IA.js +1 -0
  224. package/dist/embed/embed-page-chunk-A5CPK26D.js +1 -0
  225. package/dist/embed/embed-page-chunk-AAU4RSSU.js +1 -0
  226. package/dist/embed/embed-page-chunk-AB3Q2HOO.js +1 -0
  227. package/dist/embed/embed-page-chunk-ABFWMLOR.js +1 -0
  228. package/dist/embed/embed-page-chunk-ABIN3BPL.js +1 -0
  229. package/dist/embed/embed-page-chunk-ACIRZYZQ.js +1 -0
  230. package/dist/embed/embed-page-chunk-AEGLPY52.js +1 -0
  231. package/dist/embed/embed-page-chunk-AJPIJ5Q6.js +1 -0
  232. package/dist/embed/embed-page-chunk-AKPA6XS3.js +2 -0
  233. package/dist/embed/embed-page-chunk-ANZXYPYQ.js +1 -0
  234. package/dist/embed/embed-page-chunk-AO6KUNOD.js +1 -0
  235. package/dist/embed/embed-page-chunk-APIN6IE2.js +1 -0
  236. package/dist/embed/embed-page-chunk-AQ7P7MPQ.js +1 -0
  237. package/dist/embed/embed-page-chunk-AQLFD3FB.js +1 -0
  238. package/dist/embed/embed-page-chunk-AQTLXHTW.js +1 -0
  239. package/dist/embed/embed-page-chunk-ARHDAWDT.js +1 -0
  240. package/dist/embed/embed-page-chunk-ARM7QQNJ.js +1 -0
  241. package/dist/embed/embed-page-chunk-ARRA262W.js +1 -0
  242. package/dist/embed/embed-page-chunk-AWTS5ZYY.js +1 -0
  243. package/dist/embed/embed-page-chunk-AYOVLRHX.js +2167 -0
  244. package/dist/embed/embed-page-chunk-B43OSKKN.js +1 -0
  245. package/dist/embed/embed-page-chunk-B537QK4H.js +1 -0
  246. package/dist/embed/embed-page-chunk-B6767LVL.js +1 -0
  247. package/dist/embed/embed-page-chunk-BBSIPZIJ.js +2 -0
  248. package/dist/embed/embed-page-chunk-BDE6VTZO.js +1 -0
  249. package/dist/embed/embed-page-chunk-BDR2AV4C.js +1 -0
  250. package/dist/embed/embed-page-chunk-BEZUVEQG.js +1 -0
  251. package/dist/embed/embed-page-chunk-BHFBNKCC.js +1 -0
  252. package/dist/embed/embed-page-chunk-BIXWOREM.js +1 -0
  253. package/dist/embed/embed-page-chunk-BO56ESC4.js +1 -0
  254. package/dist/embed/embed-page-chunk-BOBSU3BS.js +1 -0
  255. package/dist/embed/embed-page-chunk-BOEM7RR2.js +1 -0
  256. package/dist/embed/embed-page-chunk-BOGY5UJK.js +1 -0
  257. package/dist/embed/embed-page-chunk-BOQ4YJRC.js +1 -0
  258. package/dist/embed/embed-page-chunk-BR7RHIPR.js +1 -0
  259. package/dist/embed/embed-page-chunk-BRF3QA4U.js +1 -0
  260. package/dist/embed/embed-page-chunk-BSHGJSTY.js +1 -0
  261. package/dist/embed/embed-page-chunk-BTZ6QKA5.js +1 -0
  262. package/dist/embed/embed-page-chunk-BXUFKFRH.js +1 -0
  263. package/dist/embed/embed-page-chunk-BYGKM25Z.js +1 -0
  264. package/dist/embed/embed-page-chunk-BZI3YCE7.js +1 -0
  265. package/dist/embed/embed-page-chunk-CADGB443.js +1 -0
  266. package/dist/embed/embed-page-chunk-CCNLQNKX.js +1 -0
  267. package/dist/embed/embed-page-chunk-CDFDSWNI.js +1 -0
  268. package/dist/embed/embed-page-chunk-CGMYXHWK.js +1 -0
  269. package/dist/embed/embed-page-chunk-CIVBRTV6.js +1 -0
  270. package/dist/embed/embed-page-chunk-CN3CMET4.js +1 -0
  271. package/dist/embed/embed-page-chunk-CT5EIC3O.js +1 -0
  272. package/dist/embed/embed-page-chunk-CTA4NVOR.js +1 -0
  273. package/dist/embed/embed-page-chunk-CTC4RKCL.js +1 -0
  274. package/dist/embed/embed-page-chunk-CUEEKFI2.js +1 -0
  275. package/dist/embed/embed-page-chunk-CUHPLIQJ.js +1 -0
  276. package/dist/embed/embed-page-chunk-CV7IET55.js +1 -0
  277. package/dist/embed/embed-page-chunk-CYZTUSN2.js +1 -0
  278. package/dist/embed/embed-page-chunk-CZBGTBTK.js +1 -0
  279. package/dist/embed/embed-page-chunk-CZXPKAAI.js +1 -0
  280. package/dist/embed/embed-page-chunk-D2R2NSRR.js +1 -0
  281. package/dist/embed/embed-page-chunk-D5AJQJD5.js +2 -0
  282. package/dist/embed/embed-page-chunk-D63UWHSO.js +1 -0
  283. package/dist/embed/embed-page-chunk-D6DA3A6A.js +1 -0
  284. package/dist/embed/embed-page-chunk-D73UXOFT.js +1 -0
  285. package/dist/embed/embed-page-chunk-DCS7FNFS.js +1 -0
  286. package/dist/embed/embed-page-chunk-DDTPPBJY.js +1 -0
  287. package/dist/embed/embed-page-chunk-DE7BGENS.js +1 -0
  288. package/dist/embed/embed-page-chunk-DEHJLLKN.js +1 -0
  289. package/dist/embed/embed-page-chunk-DHGHAGLL.js +1 -0
  290. package/dist/embed/embed-page-chunk-DIE6AVGX.js +1 -0
  291. package/dist/embed/embed-page-chunk-DM5ESF6C.js +1 -0
  292. package/dist/embed/embed-page-chunk-DQ4UEELI.js +1 -0
  293. package/dist/embed/embed-page-chunk-DVHOG6AY.js +31 -0
  294. package/dist/embed/embed-page-chunk-DWJV4T7Q.js +1 -0
  295. package/dist/embed/embed-page-chunk-DXVMFTPC.js +1 -0
  296. package/dist/embed/embed-page-chunk-DYBQVRXS.js +1 -0
  297. package/dist/embed/embed-page-chunk-DYPHXOEP.js +1 -0
  298. package/dist/embed/embed-page-chunk-DZRJEWQO.js +1 -0
  299. package/dist/embed/embed-page-chunk-E4OFRMJJ.js +1 -0
  300. package/dist/embed/embed-page-chunk-E7ECPW5G.js +1 -0
  301. package/dist/embed/embed-page-chunk-E7MYEYS3.js +1 -0
  302. package/dist/embed/embed-page-chunk-EAFE4NIS.js +1 -0
  303. package/dist/embed/embed-page-chunk-EAUQPBSN.js +1 -0
  304. package/dist/embed/embed-page-chunk-EBXTVXZF.js +1 -0
  305. package/dist/embed/embed-page-chunk-EG5CLCWE.js +1 -0
  306. package/dist/embed/embed-page-chunk-EGTJFOFF.js +1 -0
  307. package/dist/embed/embed-page-chunk-EKYNYNIX.js +1 -0
  308. package/dist/embed/embed-page-chunk-EPEKIAZP.js +37 -0
  309. package/dist/embed/embed-page-chunk-ER4O2WLO.js +1 -0
  310. package/dist/embed/embed-page-chunk-ESAZNCCX.js +1 -0
  311. package/dist/embed/embed-page-chunk-ESCA5JCS.js +1 -0
  312. package/dist/embed/embed-page-chunk-ESJEHJ5L.js +140 -0
  313. package/dist/embed/embed-page-chunk-ESLOGPBN.js +60 -0
  314. package/dist/embed/embed-page-chunk-ETP6AXEM.js +1 -0
  315. package/dist/embed/embed-page-chunk-ETY7U4DI.js +1 -0
  316. package/dist/embed/embed-page-chunk-EUOOO2LS.js +1 -0
  317. package/dist/embed/embed-page-chunk-EWKLGZMO.js +1 -0
  318. package/dist/embed/embed-page-chunk-EY64QEHF.js +1 -0
  319. package/dist/embed/embed-page-chunk-EY7WOIDX.js +1 -0
  320. package/dist/embed/embed-page-chunk-EYRF75EG.js +1 -0
  321. package/dist/embed/embed-page-chunk-EYZS7M3F.js +1 -0
  322. package/dist/embed/embed-page-chunk-F45LQ3RS.js +1 -0
  323. package/dist/embed/embed-page-chunk-F7IBVBXT.js +1 -0
  324. package/dist/embed/embed-page-chunk-FBXKGHOH.js +1 -0
  325. package/dist/embed/embed-page-chunk-FEEJAFK4.js +1 -0
  326. package/dist/embed/embed-page-chunk-FEOK4OPE.js +1 -0
  327. package/dist/embed/embed-page-chunk-FJ3EESJB.js +1 -0
  328. package/dist/embed/embed-page-chunk-FM5K6PQS.js +1 -0
  329. package/dist/embed/embed-page-chunk-FMMAQPSK.js +1 -0
  330. package/dist/embed/embed-page-chunk-FSDLV5QO.js +1 -0
  331. package/dist/embed/embed-page-chunk-FTXNVWT5.js +1 -0
  332. package/dist/embed/embed-page-chunk-FUIKRW55.js +1 -0
  333. package/dist/embed/embed-page-chunk-FVK265KY.js +1 -0
  334. package/dist/embed/embed-page-chunk-FWTICTEC.js +1 -0
  335. package/dist/embed/embed-page-chunk-FWXSX2W4.js +1 -0
  336. package/dist/embed/embed-page-chunk-FYBEULVS.js +1 -0
  337. package/dist/embed/embed-page-chunk-G5HXFDFC.js +1 -0
  338. package/dist/embed/embed-page-chunk-G5KW2SOV.js +1 -0
  339. package/dist/embed/embed-page-chunk-GAF3UVZE.js +1 -0
  340. package/dist/embed/embed-page-chunk-GFOWXZE5.js +1 -0
  341. package/dist/embed/embed-page-chunk-GH22I3LG.js +1 -0
  342. package/dist/embed/embed-page-chunk-GJCMO4YN.js +1 -0
  343. package/dist/embed/embed-page-chunk-GKA7H24K.js +1 -0
  344. package/dist/embed/embed-page-chunk-GL7A7IDD.js +1 -0
  345. package/dist/embed/embed-page-chunk-GNEIDEFX.js +1 -0
  346. package/dist/embed/embed-page-chunk-GPISFLXW.js +1 -0
  347. package/dist/embed/embed-page-chunk-GSWEZJ66.js +1 -0
  348. package/dist/embed/embed-page-chunk-GU7JLLYO.js +1 -0
  349. package/dist/embed/embed-page-chunk-GVZMVAXF.js +70 -0
  350. package/dist/embed/embed-page-chunk-GZBFDD4Y.js +1 -0
  351. package/dist/embed/embed-page-chunk-H3HFE6RK.js +1 -0
  352. package/dist/embed/embed-page-chunk-H3NYTZT4.js +3 -0
  353. package/dist/embed/embed-page-chunk-H7CZ6EXN.js +1 -0
  354. package/dist/embed/embed-page-chunk-H7HZ35QN.js +1 -0
  355. package/dist/embed/embed-page-chunk-H7XTOBKB.js +1 -0
  356. package/dist/embed/embed-page-chunk-HD5CA5Q2.js +1 -0
  357. package/dist/embed/embed-page-chunk-HDAHRUIT.js +1 -0
  358. package/dist/embed/embed-page-chunk-HGSQ4AUI.js +1 -0
  359. package/dist/embed/embed-page-chunk-HJJHFV6J.js +1 -0
  360. package/dist/embed/embed-page-chunk-HK4QMNL5.js +1 -0
  361. package/dist/embed/embed-page-chunk-HNWETJWB.js +1 -0
  362. package/dist/embed/embed-page-chunk-HQCMCYUS.js +1 -0
  363. package/dist/embed/embed-page-chunk-HQUXJKTG.js +1 -0
  364. package/dist/embed/embed-page-chunk-HTEALTO4.js +1 -0
  365. package/dist/embed/embed-page-chunk-HUKTQVZB.js +1 -0
  366. package/dist/embed/embed-page-chunk-HVN56UNP.js +1 -0
  367. package/dist/embed/embed-page-chunk-HVTV25TI.js +1 -0
  368. package/dist/embed/embed-page-chunk-HWNFA7PS.js +1 -0
  369. package/dist/embed/embed-page-chunk-I2JNPKJK.js +1 -0
  370. package/dist/embed/embed-page-chunk-I4BCBOUA.js +1 -0
  371. package/dist/embed/embed-page-chunk-I55FBKLU.js +3 -0
  372. package/dist/embed/embed-page-chunk-I5KTSZJX.js +1 -0
  373. package/dist/embed/embed-page-chunk-I7YQ2TGZ.js +1 -0
  374. package/dist/embed/embed-page-chunk-ICJOJGQ6.js +1 -0
  375. package/dist/embed/embed-page-chunk-IDJWNYLR.js +1 -0
  376. package/dist/embed/embed-page-chunk-IE6O7ZMQ.js +15 -0
  377. package/dist/embed/embed-page-chunk-IFCJLAOB.js +1 -0
  378. package/dist/embed/embed-page-chunk-IFEQPNI2.js +1 -0
  379. package/dist/embed/embed-page-chunk-IGBRMGDS.js +1 -0
  380. package/dist/embed/embed-page-chunk-IGIFLYCQ.js +1 -0
  381. package/dist/embed/embed-page-chunk-IGOT476M.js +1 -0
  382. package/dist/embed/embed-page-chunk-IHNNPY3P.js +1 -0
  383. package/dist/embed/embed-page-chunk-II6ODJLE.js +1 -0
  384. package/dist/embed/embed-page-chunk-IIIA5HUO.js +1 -0
  385. package/dist/embed/embed-page-chunk-IIYOOZDE.js +1 -0
  386. package/dist/embed/embed-page-chunk-IJPRKD63.js +1 -0
  387. package/dist/embed/embed-page-chunk-IK2TPQVX.js +1 -0
  388. package/dist/embed/embed-page-chunk-INGZ5SYE.js +1 -0
  389. package/dist/embed/embed-page-chunk-INUQ73SI.js +1 -0
  390. package/dist/embed/embed-page-chunk-IPI53MN3.js +1 -0
  391. package/dist/embed/embed-page-chunk-IPMWXKCK.js +1 -0
  392. package/dist/embed/embed-page-chunk-IRP2UOPH.js +1 -0
  393. package/dist/embed/embed-page-chunk-ISY7S7N6.js +1 -0
  394. package/dist/embed/embed-page-chunk-IT5VM3N7.js +1 -0
  395. package/dist/embed/embed-page-chunk-IX4WLWCY.js +28 -0
  396. package/dist/embed/embed-page-chunk-IYK5VAB3.js +1 -0
  397. package/dist/embed/embed-page-chunk-IZ6ZGFSG.js +1 -0
  398. package/dist/embed/embed-page-chunk-J4VBM2JB.js +1 -0
  399. package/dist/embed/embed-page-chunk-J7KNZGPV.js +1 -0
  400. package/dist/embed/embed-page-chunk-JADTV5YD.js +1 -0
  401. package/dist/embed/embed-page-chunk-JEW2Y2ED.js +1 -0
  402. package/dist/embed/embed-page-chunk-JFK56NZW.js +1 -0
  403. package/dist/embed/embed-page-chunk-JLWIJ4BP.js +1 -0
  404. package/dist/embed/embed-page-chunk-JNXBKMN6.js +1 -0
  405. package/dist/embed/embed-page-chunk-JOJ4VSO5.js +1 -0
  406. package/dist/embed/embed-page-chunk-JQQ6C3ST.js +1 -0
  407. package/dist/embed/embed-page-chunk-JUZFORQA.js +1 -0
  408. package/dist/embed/embed-page-chunk-JYEMOI5G.js +1 -0
  409. package/dist/embed/embed-page-chunk-JYQTTU7F.js +1 -0
  410. package/dist/embed/embed-page-chunk-K2NBNWDK.js +1 -0
  411. package/dist/embed/embed-page-chunk-K7I5Z2RN.js +1 -0
  412. package/dist/embed/embed-page-chunk-K7JAB46X.js +1 -0
  413. package/dist/embed/embed-page-chunk-KE32OJIP.js +1 -0
  414. package/dist/embed/embed-page-chunk-KEKB3BUG.js +1 -0
  415. package/dist/embed/embed-page-chunk-KG5A66WX.js +525 -0
  416. package/dist/embed/embed-page-chunk-KGP2RGEC.js +1 -0
  417. package/dist/embed/embed-page-chunk-KGX7G7XQ.js +1 -0
  418. package/dist/embed/embed-page-chunk-KM5NL7BL.js +1 -0
  419. package/dist/embed/embed-page-chunk-KQNRWZKR.js +1 -0
  420. package/dist/embed/embed-page-chunk-KUTM5AGJ.js +1 -0
  421. package/dist/embed/embed-page-chunk-KW44NUT4.js +1 -0
  422. package/dist/embed/embed-page-chunk-KWRAXHKX.js +1 -0
  423. package/dist/embed/embed-page-chunk-KZWWYO7Z.js +1 -0
  424. package/dist/embed/embed-page-chunk-L2QFIJ4P.js +1 -0
  425. package/dist/embed/embed-page-chunk-L3RQ76LD.js +1 -0
  426. package/dist/embed/embed-page-chunk-L6GX525D.js +1 -0
  427. package/dist/embed/embed-page-chunk-LDFGGZC6.js +1 -0
  428. package/dist/embed/embed-page-chunk-LEAHYMKH.js +1 -0
  429. package/dist/embed/embed-page-chunk-LH2NUQ2C.js +1 -0
  430. package/dist/embed/embed-page-chunk-LIJVWBYO.js +1 -0
  431. package/dist/embed/embed-page-chunk-LJBLK3MD.js +1 -0
  432. package/dist/embed/embed-page-chunk-LJJJJZT7.js +1 -0
  433. package/dist/embed/embed-page-chunk-LJZ2VDC6.js +1 -0
  434. package/dist/embed/embed-page-chunk-LKBECLX2.js +1 -0
  435. package/dist/embed/embed-page-chunk-LL4XKLOG.js +1 -0
  436. package/dist/embed/embed-page-chunk-LLFEIUVK.js +1 -0
  437. package/dist/embed/embed-page-chunk-LMLHHN2B.js +1 -0
  438. package/dist/embed/embed-page-chunk-LOLMAI3V.js +1 -0
  439. package/dist/embed/embed-page-chunk-LPXAKW7Q.js +1 -0
  440. package/dist/embed/embed-page-chunk-LRB5IXLV.js +1 -0
  441. package/dist/embed/embed-page-chunk-LW3LUJEG.js +1 -0
  442. package/dist/embed/embed-page-chunk-LWERP7BS.js +1 -0
  443. package/dist/embed/embed-page-chunk-M4ACA43K.js +1 -0
  444. package/dist/embed/embed-page-chunk-M5HO3OG6.js +1 -0
  445. package/dist/embed/embed-page-chunk-M7F46E23.js +1 -0
  446. package/dist/embed/embed-page-chunk-MASNBRHM.js +1 -0
  447. package/dist/embed/embed-page-chunk-MB65DZAX.js +14 -0
  448. package/dist/embed/embed-page-chunk-MB77ZI4D.js +1 -0
  449. package/dist/embed/embed-page-chunk-MEC3JUW7.js +1 -0
  450. package/dist/embed/embed-page-chunk-MG5LALIS.js +1 -0
  451. package/dist/embed/embed-page-chunk-MHSEFTKR.js +1 -0
  452. package/dist/embed/embed-page-chunk-MKV2QNSI.js +1 -0
  453. package/dist/embed/embed-page-chunk-MMHCEL7E.js +1 -0
  454. package/dist/embed/embed-page-chunk-MMXDBRLY.js +1 -0
  455. package/dist/embed/embed-page-chunk-MSYFW3OJ.js +1 -0
  456. package/dist/embed/embed-page-chunk-MVLHDASB.js +1 -0
  457. package/dist/embed/embed-page-chunk-N252QSMT.js +1 -0
  458. package/dist/embed/embed-page-chunk-N7NXBLSR.js +1 -0
  459. package/dist/embed/embed-page-chunk-NBNJGF7O.js +1 -0
  460. package/dist/embed/embed-page-chunk-NG7LKEPN.js +1 -0
  461. package/dist/embed/embed-page-chunk-NHOBB2JQ.js +1 -0
  462. package/dist/embed/embed-page-chunk-NIFSD4XH.js +1 -0
  463. package/dist/embed/embed-page-chunk-NJP7LGPJ.js +1 -0
  464. package/dist/embed/embed-page-chunk-NLMEH7HI.js +1 -0
  465. package/dist/embed/embed-page-chunk-NLZ6F3ON.js +1 -0
  466. package/dist/embed/embed-page-chunk-NMUKLFBY.js +1 -0
  467. package/dist/embed/embed-page-chunk-NMZP7U6I.js +1 -0
  468. package/dist/embed/embed-page-chunk-NN7VEJ2G.js +1 -0
  469. package/dist/embed/embed-page-chunk-NNNI4647.js +1 -0
  470. package/dist/embed/embed-page-chunk-NNZA747K.js +1 -0
  471. package/dist/embed/embed-page-chunk-NOMBKADH.js +1 -0
  472. package/dist/embed/embed-page-chunk-NQRVVPLU.js +1 -0
  473. package/dist/embed/embed-page-chunk-O2YMBFJK.js +1 -0
  474. package/dist/embed/embed-page-chunk-O6DJHMEC.js +1 -0
  475. package/dist/embed/embed-page-chunk-OAUK7LXS.js +1 -0
  476. package/dist/embed/embed-page-chunk-OCFVEAMV.js +1 -0
  477. package/dist/embed/embed-page-chunk-OEC4EWNI.js +1 -0
  478. package/dist/embed/embed-page-chunk-OF6SGGWX.js +1 -0
  479. package/dist/embed/embed-page-chunk-OJ7436DP.js +1 -0
  480. package/dist/embed/embed-page-chunk-OK6DC5YX.js +1 -0
  481. package/dist/embed/embed-page-chunk-ONZ74YHS.js +1 -0
  482. package/dist/embed/embed-page-chunk-OOZDPBUK.js +69 -0
  483. package/dist/embed/embed-page-chunk-OPME5GF2.js +1 -0
  484. package/dist/embed/embed-page-chunk-ORPDSJ5S.js +1 -0
  485. package/dist/embed/embed-page-chunk-ORPUVSKY.js +1 -0
  486. package/dist/embed/embed-page-chunk-OWGBADV6.js +3880 -0
  487. package/dist/embed/embed-page-chunk-OWTE7YMF.js +1 -0
  488. package/dist/embed/embed-page-chunk-OZKVHTL6.js +1 -0
  489. package/dist/embed/embed-page-chunk-OZUIA6GJ.js +1 -0
  490. package/dist/embed/embed-page-chunk-P4MXODKA.js +1 -0
  491. package/dist/embed/embed-page-chunk-P56KTNVT.js +1 -0
  492. package/dist/embed/embed-page-chunk-PADSMXWH.js +3 -0
  493. package/dist/embed/embed-page-chunk-PEFXE5Y4.js +1 -0
  494. package/dist/embed/embed-page-chunk-PHVA2KHO.js +1 -0
  495. package/dist/embed/embed-page-chunk-PJJPSDVD.js +1 -0
  496. package/dist/embed/embed-page-chunk-PKNTJERD.js +1 -0
  497. package/dist/embed/embed-page-chunk-PLAF2Q2L.js +1 -0
  498. package/dist/embed/embed-page-chunk-PLNJRORR.js +1 -0
  499. package/dist/embed/embed-page-chunk-PO2WVZC2.js +1 -0
  500. package/dist/embed/embed-page-chunk-PRYNHKKK.js +1 -0
  501. package/dist/embed/embed-page-chunk-PSTS2K7H.js +1 -0
  502. package/dist/embed/embed-page-chunk-PVL27S2O.js +1 -0
  503. package/dist/embed/embed-page-chunk-PVOA7ARZ.js +1 -0
  504. package/dist/embed/embed-page-chunk-PXADN2PY.js +1 -0
  505. package/dist/embed/embed-page-chunk-Q2HL7S3R.js +41 -0
  506. package/dist/embed/embed-page-chunk-Q2LWO44N.js +1 -0
  507. package/dist/embed/embed-page-chunk-Q2YEQQJF.js +1 -0
  508. package/dist/embed/embed-page-chunk-Q32Y7CP2.js +5 -0
  509. package/dist/embed/embed-page-chunk-Q3AOMIJ7.js +1 -0
  510. package/dist/embed/embed-page-chunk-Q4NFAO5G.js +1 -0
  511. package/dist/embed/embed-page-chunk-Q6ZPKMOZ.js +1 -0
  512. package/dist/embed/embed-page-chunk-QA2R2R55.js +165 -0
  513. package/dist/embed/embed-page-chunk-QANF3D34.js +1 -0
  514. package/dist/embed/embed-page-chunk-QBSFVKIB.js +1 -0
  515. package/dist/embed/embed-page-chunk-QCLLEPYT.js +1 -0
  516. package/dist/embed/embed-page-chunk-QDBK4ZDE.js +1 -0
  517. package/dist/embed/embed-page-chunk-QENDQ7H3.js +1 -0
  518. package/dist/embed/embed-page-chunk-QF7NBK3B.js +1 -0
  519. package/dist/embed/embed-page-chunk-QFTY233A.js +1 -0
  520. package/dist/embed/embed-page-chunk-QHV7PE5D.js +3 -0
  521. package/dist/embed/embed-page-chunk-QIJBDPZP.js +1 -0
  522. package/dist/embed/embed-page-chunk-QLA2XU73.js +1 -0
  523. package/dist/embed/embed-page-chunk-QNIB3Q7U.js +1 -0
  524. package/dist/embed/embed-page-chunk-QQLF4AV6.js +1 -0
  525. package/dist/embed/embed-page-chunk-QQUV5KZD.js +1 -0
  526. package/dist/embed/embed-page-chunk-QRKEL65F.js +1 -0
  527. package/dist/embed/embed-page-chunk-QRPDJVB7.js +1 -0
  528. package/dist/embed/embed-page-chunk-QVHTN5HT.js +1 -0
  529. package/dist/embed/embed-page-chunk-R2BGZIR7.js +1 -0
  530. package/dist/embed/embed-page-chunk-R2K4OIQO.js +1 -0
  531. package/dist/embed/embed-page-chunk-R4FTAO2H.js +1 -0
  532. package/dist/embed/embed-page-chunk-R54S6SKK.js +1 -0
  533. package/dist/embed/embed-page-chunk-R5I2GTYT.js +1 -0
  534. package/dist/embed/embed-page-chunk-R672RZXS.js +1 -0
  535. package/dist/embed/embed-page-chunk-RABAC5H3.js +1 -0
  536. package/dist/embed/embed-page-chunk-RG3BI65W.js +1 -0
  537. package/dist/embed/embed-page-chunk-RKPK7MLC.js +1 -0
  538. package/dist/embed/embed-page-chunk-RN7JLKLZ.js +1 -0
  539. package/dist/embed/embed-page-chunk-RNOETEGH.js +1 -0
  540. package/dist/embed/embed-page-chunk-RPK5SOLP.js +1 -0
  541. package/dist/embed/embed-page-chunk-RUOFG3OD.js +1 -0
  542. package/dist/embed/embed-page-chunk-RV2IAP52.js +1 -0
  543. package/dist/embed/embed-page-chunk-RXLB27EG.js +1 -0
  544. package/dist/embed/embed-page-chunk-S4XZPBRM.js +1 -0
  545. package/dist/embed/embed-page-chunk-SAML73QO.js +1 -0
  546. package/dist/embed/embed-page-chunk-SEH5ZYHX.js +1 -0
  547. package/dist/embed/embed-page-chunk-SL4X4KPS.js +1 -0
  548. package/dist/embed/embed-page-chunk-SMMEMIZS.js +1 -0
  549. package/dist/embed/embed-page-chunk-SMZUIXFD.js +1 -0
  550. package/dist/embed/embed-page-chunk-SQ4GANYE.js +1 -0
  551. package/dist/embed/embed-page-chunk-SRW4AAQ4.js +1 -0
  552. package/dist/embed/embed-page-chunk-SU5GXLKX.js +467 -0
  553. package/dist/embed/embed-page-chunk-SV2BM3WO.js +1 -0
  554. package/dist/embed/embed-page-chunk-SWGBMELE.js +1 -0
  555. package/dist/embed/embed-page-chunk-SYAPUMNM.js +1 -0
  556. package/dist/embed/embed-page-chunk-T4AZ556W.js +1 -0
  557. package/dist/embed/embed-page-chunk-T6QXBMXO.js +1 -0
  558. package/dist/embed/embed-page-chunk-TAOVZBLV.js +1 -0
  559. package/dist/embed/embed-page-chunk-TBRAGK3D.js +1 -0
  560. package/dist/embed/embed-page-chunk-TENLHB44.js +1 -0
  561. package/dist/embed/embed-page-chunk-TFSDCDJS.js +1 -0
  562. package/dist/embed/embed-page-chunk-TIGSOALR.js +1 -0
  563. package/dist/embed/embed-page-chunk-TKOSVUN2.js +1 -0
  564. package/dist/embed/embed-page-chunk-TLWGSINF.js +1 -0
  565. package/dist/embed/embed-page-chunk-TMUCZ7XO.js +1 -0
  566. package/dist/embed/embed-page-chunk-TP7772GL.js +1 -0
  567. package/dist/embed/embed-page-chunk-TPCI3CNJ.js +1 -0
  568. package/dist/embed/embed-page-chunk-TPGW6RUI.js +1 -0
  569. package/dist/embed/embed-page-chunk-TPQGFG2C.js +1 -0
  570. package/dist/embed/embed-page-chunk-TSZIWR3X.js +1 -0
  571. package/dist/embed/embed-page-chunk-TUFYJMMA.js +1 -0
  572. package/dist/embed/embed-page-chunk-TWDJUUXZ.js +1 -0
  573. package/dist/embed/embed-page-chunk-TWNAGURL.js +4 -0
  574. package/dist/embed/embed-page-chunk-TWU6UJLL.js +1 -0
  575. package/dist/embed/embed-page-chunk-TYA3PYZB.js +1 -0
  576. package/dist/embed/embed-page-chunk-U32PAI3Y.js +1 -0
  577. package/dist/embed/embed-page-chunk-U3B5KKSV.js +1 -0
  578. package/dist/embed/embed-page-chunk-U3YIXQYB.js +1 -0
  579. package/dist/embed/embed-page-chunk-U7OC25B3.js +1 -0
  580. package/dist/embed/embed-page-chunk-UBWHZLJN.js +1 -0
  581. package/dist/embed/embed-page-chunk-UCGT4CTV.js +1 -0
  582. package/dist/embed/embed-page-chunk-UCR4ZILJ.js +1 -0
  583. package/dist/embed/embed-page-chunk-UGBSF5HI.js +1 -0
  584. package/dist/embed/embed-page-chunk-UGCW7PZD.js +1 -0
  585. package/dist/embed/embed-page-chunk-UIZLGSJE.js +1 -0
  586. package/dist/embed/embed-page-chunk-UJODN4PG.js +1 -0
  587. package/dist/embed/embed-page-chunk-UPUUWWBK.js +1 -0
  588. package/dist/embed/embed-page-chunk-UR5VOXA3.js +1 -0
  589. package/dist/embed/embed-page-chunk-UZNSI2X3.js +1 -0
  590. package/dist/embed/embed-page-chunk-UZW2LQZV.js +1 -0
  591. package/dist/embed/embed-page-chunk-V2V73RFB.js +1 -0
  592. package/dist/embed/embed-page-chunk-V7R2Y72J.js +14 -0
  593. package/dist/embed/embed-page-chunk-VEYJHY36.js +1 -0
  594. package/dist/embed/embed-page-chunk-VNK6MED4.js +1 -0
  595. package/dist/embed/embed-page-chunk-VP2J7NES.js +1 -0
  596. package/dist/embed/embed-page-chunk-VRDH6A7Z.js +1 -0
  597. package/dist/embed/embed-page-chunk-VTUD3VPX.js +1 -0
  598. package/dist/embed/embed-page-chunk-VULBATQG.js +1 -0
  599. package/dist/embed/embed-page-chunk-VUOXEXHU.js +1 -0
  600. package/dist/embed/embed-page-chunk-VVTZ23LK.js +1 -0
  601. package/dist/embed/embed-page-chunk-VW3NF5NT.js +1 -0
  602. package/dist/embed/embed-page-chunk-VY6MAPHR.js +1 -0
  603. package/dist/embed/embed-page-chunk-WAANDEAQ.js +1 -0
  604. package/dist/embed/embed-page-chunk-WCKHIRD5.js +1 -0
  605. package/dist/embed/embed-page-chunk-WDS66MAN.js +1 -0
  606. package/dist/embed/embed-page-chunk-WLZW4FEZ.js +1 -0
  607. package/dist/embed/embed-page-chunk-WNEY2A2R.js +1 -0
  608. package/dist/embed/embed-page-chunk-WQOZWRIS.js +1 -0
  609. package/dist/embed/embed-page-chunk-WUYZIBLV.js +1 -0
  610. package/dist/embed/embed-page-chunk-WYJNNBFP.js +1 -0
  611. package/dist/embed/embed-page-chunk-X55NDWBH.js +1 -0
  612. package/dist/embed/embed-page-chunk-XA4KNRQW.js +1 -0
  613. package/dist/embed/embed-page-chunk-XAJFFWM3.js +1 -0
  614. package/dist/embed/embed-page-chunk-XIJHCNBW.js +1 -0
  615. package/dist/embed/embed-page-chunk-XNZ46IEF.js +1 -0
  616. package/dist/embed/embed-page-chunk-XO5WZF3D.js +1 -0
  617. package/dist/embed/embed-page-chunk-XPDEOKHX.js +1 -0
  618. package/dist/embed/embed-page-chunk-XQNO7AN3.js +1 -0
  619. package/dist/embed/embed-page-chunk-XR3Q4GDZ.js +1 -0
  620. package/dist/embed/embed-page-chunk-XRRCORI5.js +1 -0
  621. package/dist/embed/embed-page-chunk-XTMDFHMJ.js +1 -0
  622. package/dist/embed/embed-page-chunk-XUZKZF3V.js +1 -0
  623. package/dist/embed/embed-page-chunk-XWAJRAFC.js +1 -0
  624. package/dist/embed/embed-page-chunk-XWRBMESB.js +1 -0
  625. package/dist/embed/embed-page-chunk-XXT7RMBT.js +220 -0
  626. package/dist/embed/embed-page-chunk-XY5NGMFT.js +1 -0
  627. package/dist/embed/embed-page-chunk-XYCU2ZON.js +1 -0
  628. package/dist/embed/embed-page-chunk-XZ6CLWS2.js +1 -0
  629. package/dist/embed/embed-page-chunk-XZYJX7MY.js +1 -0
  630. package/dist/embed/embed-page-chunk-Y2JWLZJF.js +1 -0
  631. package/dist/embed/embed-page-chunk-Y4KTS6EE.js +1 -0
  632. package/dist/embed/embed-page-chunk-YBPVSBMU.js +1 -0
  633. package/dist/embed/embed-page-chunk-YEHTVTMO.js +1 -0
  634. package/dist/embed/embed-page-chunk-YFEUMUCL.js +1 -0
  635. package/dist/embed/embed-page-chunk-YFWCKZW7.js +1 -0
  636. package/dist/embed/embed-page-chunk-YHEFVON2.js +1 -0
  637. package/dist/embed/embed-page-chunk-YJBX3AFL.js +1 -0
  638. package/dist/embed/embed-page-chunk-YJZJFCLP.js +1 -0
  639. package/dist/embed/embed-page-chunk-YLUGLAWD.js +1 -0
  640. package/dist/embed/embed-page-chunk-YMMUR7L6.js +1 -0
  641. package/dist/embed/embed-page-chunk-YNIEMXW5.js +1 -0
  642. package/dist/embed/embed-page-chunk-YPK6G5D7.js +1 -0
  643. package/dist/embed/embed-page-chunk-Z26BSJ5Y.js +1 -0
  644. package/dist/embed/embed-page-chunk-Z2GE34ES.js +1 -0
  645. package/dist/embed/embed-page-chunk-Z6N3GKM5.js +1 -0
  646. package/dist/embed/embed-page-chunk-Z6PDLQOB.js +1 -0
  647. package/dist/embed/embed-page-chunk-ZESVZCWO.js +1 -0
  648. package/dist/embed/embed-page-chunk-ZITVGQ52.js +1 -0
  649. package/dist/embed/embed-page-chunk-ZNWEXQQ4.js +1 -0
  650. package/dist/embed/embed-page-chunk-ZQ6WYVOD.js +1 -0
  651. package/dist/embed/embed-page-chunk-ZR7ZLGLV.js +1 -0
  652. package/dist/embed/embed-page-chunk-ZT2EZUXI.js +1 -0
  653. package/dist/embed/embed-page-chunk-ZZCMWB6F.js +1 -0
  654. package/dist/embed/embed-page-cil-ZQIVHSN6.js +1 -0
  655. package/dist/embed/embed-page-cilkc-AJET62TW.js +1 -0
  656. package/dist/embed/embed-page-cilkcpp-FRBVBYEF.js +1 -0
  657. package/dist/embed/embed-page-classDiagram-2ON5EDUG-S5GEC2UC.js +1 -0
  658. package/dist/embed/embed-page-classDiagram-v2-WZHVMYZB-NL3HKXC3.js +1 -0
  659. package/dist/embed/embed-page-clean-OPHY52MY.js +1 -0
  660. package/dist/embed/embed-page-clike-5NRFTOCK.js +1 -0
  661. package/dist/embed/embed-page-clojure-4GC77VYK.js +1 -0
  662. package/dist/embed/embed-page-clojure-7B3FI7TH.js +1 -0
  663. package/dist/embed/embed-page-clojure-repl-56WG27Z3.js +1 -0
  664. package/dist/embed/embed-page-cmake-F3SKZMUJ.js +1 -0
  665. package/dist/embed/embed-page-cmake-UIBPQIVG.js +1 -0
  666. package/dist/embed/embed-page-cobol-7TW6OZHG.js +1 -0
  667. package/dist/embed/embed-page-code-highlighter-TBT4ICNZ.js +1 -0
  668. package/dist/embed/embed-page-coffeescript-BCKZ4N2E.js +1 -0
  669. package/dist/embed/embed-page-coffeescript-N2ENFNNR.js +1 -0
  670. package/dist/embed/embed-page-concurnas-MCN7VYPE.js +1 -0
  671. package/dist/embed/embed-page-cooklang-JSLOQBDM.js +1 -0
  672. package/dist/embed/embed-page-coq-WH3J7SKF.js +1 -0
  673. package/dist/embed/embed-page-coq-XRXAXI5X.js +1 -0
  674. package/dist/embed/embed-page-core-Q6IGWM4Q.js +1 -0
  675. package/dist/embed/embed-page-core-TQNBW2MM.js +1 -0
  676. package/dist/embed/embed-page-cos-MP7YM5FO.js +1 -0
  677. package/dist/embed/embed-page-cose-bilkent-S5V4N54A-KJMAAFJL.js +1 -0
  678. package/dist/embed/embed-page-cpp-FFAXKUCJ.js +1 -0
  679. package/dist/embed/embed-page-cpp-PRCT5QAC.js +1 -0
  680. package/dist/embed/embed-page-crmsh-PF5MF5PC.js +1 -0
  681. package/dist/embed/embed-page-crystal-GYFU35L2.js +1 -0
  682. package/dist/embed/embed-page-crystal-W2TOACW4.js +1 -0
  683. package/dist/embed/embed-page-csharp-DHR2XRZW.js +1 -0
  684. package/dist/embed/embed-page-csharp-UNF62ZBO.js +1 -0
  685. package/dist/embed/embed-page-cshtml-G7ML4LE3.js +1 -0
  686. package/dist/embed/embed-page-csp-UDQUZUZW.js +1 -0
  687. package/dist/embed/embed-page-csp-YPF3N7BE.js +1 -0
  688. package/dist/embed/embed-page-css-774MOM42.js +1 -0
  689. package/dist/embed/embed-page-css-EHGZALYG.js +1 -0
  690. package/dist/embed/embed-page-css-extras-SI7Q5IJ6.js +1 -0
  691. package/dist/embed/embed-page-csv-MT4GPPO7.js +1 -0
  692. package/dist/embed/embed-page-cue-BMTFVAKL.js +1 -0
  693. package/dist/embed/embed-page-cypher-QDHM3LFO.js +1 -0
  694. package/dist/embed/embed-page-d-KHBJT5ZU.js +1 -0
  695. package/dist/embed/embed-page-d-VF7XFFMN.js +1 -0
  696. package/dist/embed/embed-page-dagre-6UL2VRFP-QSIK5LGS.js +4 -0
  697. package/dist/embed/embed-page-dart-3L3U2DJ3.js +1 -0
  698. package/dist/embed/embed-page-dart-6AOCMAXR.js +1 -0
  699. package/dist/embed/embed-page-dataweave-LNNDNKWG.js +1 -0
  700. package/dist/embed/embed-page-dax-J2FYUNXR.js +1 -0
  701. package/dist/embed/embed-page-delphi-T3RKZ33G.js +1 -0
  702. package/dist/embed/embed-page-dhall-MGZ2X6D6.js +1 -0
  703. package/dist/embed/embed-page-diagram-PSM6KHXK-PLOM5KG7.js +24 -0
  704. package/dist/embed/embed-page-diagram-QEK2KX5R-RUNGK25X.js +43 -0
  705. package/dist/embed/embed-page-diagram-S2PKOQOG-LWDHM5TL.js +24 -0
  706. package/dist/embed/embed-page-diff-AZNWSOQ3.js +1 -0
  707. package/dist/embed/embed-page-diff-BYMKQAM5.js +1 -0
  708. package/dist/embed/embed-page-django-5BVMXLOO.js +1 -0
  709. package/dist/embed/embed-page-django-OLTKKRJC.js +1 -0
  710. package/dist/embed/embed-page-dns-LKEA7NVQ.js +1 -0
  711. package/dist/embed/embed-page-dns-zone-file-MLDJYBWW.js +1 -0
  712. package/dist/embed/embed-page-docker-7ZWVGIHF.js +1 -0
  713. package/dist/embed/embed-page-dockerfile-YJABIQ3Q.js +1 -0
  714. package/dist/embed/embed-page-dos-CZOUXBDN.js +1 -0
  715. package/dist/embed/embed-page-dot-USOBKZIN.js +1 -0
  716. package/dist/embed/embed-page-dsconfig-5E37MQM4.js +1 -0
  717. package/dist/embed/embed-page-dts-DPBFPVA5.js +1 -0
  718. package/dist/embed/embed-page-dust-OAZ4NEIP.js +1 -0
  719. package/dist/embed/embed-page-ebnf-XFC6NV6I.js +1 -0
  720. package/dist/embed/embed-page-ebnf-XSYP4JUB.js +1 -0
  721. package/dist/embed/embed-page-echarts-7KZDMH4F.js +1 -0
  722. package/dist/embed/embed-page-editorconfig-FQHUYGTR.js +1 -0
  723. package/dist/embed/embed-page-eiffel-Z22STSPG.js +1 -0
  724. package/dist/embed/embed-page-ejs-VHHMOK6Y.js +1 -0
  725. package/dist/embed/embed-page-elixir-BGO72I74.js +1 -0
  726. package/dist/embed/embed-page-elixir-H3KPRECP.js +1 -0
  727. package/dist/embed/embed-page-elm-HZWFYFUN.js +1 -0
  728. package/dist/embed/embed-page-elm-IZAWNYFC.js +1 -0
  729. package/dist/embed/embed-page-erDiagram-Q2GNP2WA-C6CZYEPF.js +60 -0
  730. package/dist/embed/embed-page-erb-AK646PXX.js +1 -0
  731. package/dist/embed/embed-page-erb-YBV2NO4W.js +1 -0
  732. package/dist/embed/embed-page-erlang-6LMYF4BN.js +1 -0
  733. package/dist/embed/embed-page-erlang-PXGHX7XB.js +1 -0
  734. package/dist/embed/embed-page-erlang-repl-UJPNMOCE.js +1 -0
  735. package/dist/embed/embed-page-etlua-XNKJ7UTQ.js +1 -0
  736. package/dist/embed/embed-page-excel-PCWQ5ZDK.js +1 -0
  737. package/dist/embed/embed-page-excel-formula-CEZ7KVDN.js +1 -0
  738. package/dist/embed/embed-page-factor-3PZO4CCJ.js +1 -0
  739. package/dist/embed/embed-page-false-OX3DNOF4.js +1 -0
  740. package/dist/embed/embed-page-firestore-security-rules-IQBOB7PZ.js +1 -0
  741. package/dist/embed/embed-page-fix-Q3F7Z2HQ.js +1 -0
  742. package/dist/embed/embed-page-flix-LVDGNPRS.js +1 -0
  743. package/dist/embed/embed-page-flow-4UPRJEF2.js +1 -0
  744. package/dist/embed/embed-page-flowDiagram-NV44I4VS-DLT3KEOP.js +162 -0
  745. package/dist/embed/embed-page-fortran-65P3TPQ7.js +1 -0
  746. package/dist/embed/embed-page-fortran-LWYFHCCB.js +1 -0
  747. package/dist/embed/embed-page-fsharp-BSA736XP.js +1 -0
  748. package/dist/embed/embed-page-fsharp-GDIVPYAB.js +1 -0
  749. package/dist/embed/embed-page-ftl-27Y3T2XT.js +1 -0
  750. package/dist/embed/embed-page-gams-7UM23CTD.js +1 -0
  751. package/dist/embed/embed-page-ganttDiagram-JELNMOA3-YXTLQI5X.js +267 -0
  752. package/dist/embed/embed-page-gap-JNDMTZYG.js +1 -0
  753. package/dist/embed/embed-page-gauss-4OCQQOQQ.js +1 -0
  754. package/dist/embed/embed-page-gcode-7ZDB2FDS.js +1 -0
  755. package/dist/embed/embed-page-gcode-U2UWK2IF.js +1 -0
  756. package/dist/embed/embed-page-gdscript-UOAGAMMO.js +1 -0
  757. package/dist/embed/embed-page-gedcom-WSTJUY6R.js +1 -0
  758. package/dist/embed/embed-page-gettext-BNGNGT6W.js +1 -0
  759. package/dist/embed/embed-page-gherkin-CPRNYA24.js +1 -0
  760. package/dist/embed/embed-page-gherkin-IVS5YUAH.js +1 -0
  761. package/dist/embed/embed-page-git-WWKMYMUR.js +1 -0
  762. package/dist/embed/embed-page-gitGraph-F6HP7TQM-AT36TKLZ.js +1 -0
  763. package/dist/embed/embed-page-gitGraphDiagram-NY62KEGX-U36ULO4Y.js +65 -0
  764. package/dist/embed/embed-page-glsl-2QJTMF6X.js +1 -0
  765. package/dist/embed/embed-page-glsl-6C6F26XK.js +1 -0
  766. package/dist/embed/embed-page-gml-67HHHYLB.js +1 -0
  767. package/dist/embed/embed-page-gml-ZFY32X23.js +1 -0
  768. package/dist/embed/embed-page-gn-KO2XPJDA.js +1 -0
  769. package/dist/embed/embed-page-go-HAQ77N2R.js +1 -0
  770. package/dist/embed/embed-page-go-SYFPAV4X.js +1 -0
  771. package/dist/embed/embed-page-go-module-XICPRQ5N.js +1 -0
  772. package/dist/embed/embed-page-golo-KQZ2PQG7.js +1 -0
  773. package/dist/embed/embed-page-gradle-7PN7DUJT.js +1 -0
  774. package/dist/embed/embed-page-gradle-GN34ZONG.js +1 -0
  775. package/dist/embed/embed-page-graphql-CVSK5MA2.js +1 -0
  776. package/dist/embed/embed-page-groovy-3R2X7GQD.js +1 -0
  777. package/dist/embed/embed-page-groovy-YCAJV7XB.js +1 -0
  778. package/dist/embed/embed-page-haml-6VEPXH2O.js +1 -0
  779. package/dist/embed/embed-page-haml-TYLXIXHD.js +1 -0
  780. package/dist/embed/embed-page-handlebars-7Y74ECRG.js +1 -0
  781. package/dist/embed/embed-page-handlebars-WVRARLIY.js +1 -0
  782. package/dist/embed/embed-page-haskell-7U743UEW.js +1 -0
  783. package/dist/embed/embed-page-haskell-BATAJHBH.js +1 -0
  784. package/dist/embed/embed-page-haxe-C234CZTQ.js +1 -0
  785. package/dist/embed/embed-page-haxe-PYBC3T4M.js +1 -0
  786. package/dist/embed/embed-page-hcl-BITT4ESF.js +1 -0
  787. package/dist/embed/embed-page-hlsl-KYOSJMB5.js +1 -0
  788. package/dist/embed/embed-page-hoon-NTFQ2YYJ.js +1 -0
  789. package/dist/embed/embed-page-hpkp-KN6XKLGI.js +1 -0
  790. package/dist/embed/embed-page-hsp-QFZDPSDA.js +1 -0
  791. package/dist/embed/embed-page-hsts-5COZ5S32.js +1 -0
  792. package/dist/embed/embed-page-html2canvas-HMTC4TFR.js +1 -0
  793. package/dist/embed/embed-page-htmlbars-L7NSSG62.js +1 -0
  794. package/dist/embed/embed-page-http-ALSJXSOJ.js +1 -0
  795. package/dist/embed/embed-page-http-E4UEITFW.js +1 -0
  796. package/dist/embed/embed-page-hy-5ROLZHNZ.js +1 -0
  797. package/dist/embed/embed-page-ichigojam-T6UG6OA7.js +1 -0
  798. package/dist/embed/embed-page-icon-74CJY73I.js +1 -0
  799. package/dist/embed/embed-page-icu-message-format-2RX6DV2B.js +1 -0
  800. package/dist/embed/embed-page-idris-OH6VYNRJ.js +1 -0
  801. package/dist/embed/embed-page-iecst-SJFFJ4PC.js +1 -0
  802. package/dist/embed/embed-page-ignore-QLXHF7QX.js +1 -0
  803. package/dist/embed/embed-page-index.es-N6YIYNKZ.js +23 -0
  804. package/dist/embed/embed-page-info-NVLQJR56-2XLQRFF4.js +1 -0
  805. package/dist/embed/embed-page-infoDiagram-WHAUD3N6-2U2VIHJP.js +2 -0
  806. package/dist/embed/embed-page-inform7-6Y7MAAME.js +1 -0
  807. package/dist/embed/embed-page-inform7-HZB3RNF4.js +1 -0
  808. package/dist/embed/embed-page-ini-7C2L4IDF.js +1 -0
  809. package/dist/embed/embed-page-ini-TMKFFGPD.js +1 -0
  810. package/dist/embed/embed-page-io-X5SCSO5G.js +1 -0
  811. package/dist/embed/embed-page-irpf90-A5FIGB26.js +1 -0
  812. package/dist/embed/embed-page-isbl-Q77V4FXF.js +1 -0
  813. package/dist/embed/embed-page-j-MA6BTTGA.js +1 -0
  814. package/dist/embed/embed-page-java-CYPVO64F.js +1 -0
  815. package/dist/embed/embed-page-java-O37XO6YL.js +1 -0
  816. package/dist/embed/embed-page-javadoc-LWLUAHHX.js +1 -0
  817. package/dist/embed/embed-page-javadoclike-BMEJGG2H.js +1 -0
  818. package/dist/embed/embed-page-javascript-GU26522Z.js +1 -0
  819. package/dist/embed/embed-page-javascript-M37PIZZC.js +1 -0
  820. package/dist/embed/embed-page-javastacktrace-ENINDMIF.js +1 -0
  821. package/dist/embed/embed-page-jboss-cli-Q2WN2KZS.js +1 -0
  822. package/dist/embed/embed-page-jexl-EU2C4LRG.js +1 -0
  823. package/dist/embed/embed-page-jolie-WJIQVPRR.js +1 -0
  824. package/dist/embed/embed-page-journeyDiagram-XKPGCS4Q-D4A2GN62.js +139 -0
  825. package/dist/embed/embed-page-jq-BRF5PIAN.js +1 -0
  826. package/dist/embed/embed-page-js-extras-WQMVOPIZ.js +1 -0
  827. package/dist/embed/embed-page-js-templates-YO6IJU6R.js +1 -0
  828. package/dist/embed/embed-page-jsdoc-ZKI7O6VF.js +1 -0
  829. package/dist/embed/embed-page-json-MRFYB7NT.js +1 -0
  830. package/dist/embed/embed-page-json-PSHSOWQY.js +1 -0
  831. package/dist/embed/embed-page-json5-VQKDKRNE.js +1 -0
  832. package/dist/embed/embed-page-jsonp-ANEJBBKD.js +1 -0
  833. package/dist/embed/embed-page-jsstacktrace-XYAXX4Z3.js +1 -0
  834. package/dist/embed/embed-page-jsx-FZEE3QI5.js +1 -0
  835. package/dist/embed/embed-page-julia-5W6JANPT.js +1 -0
  836. package/dist/embed/embed-page-julia-EY2DW2U2.js +1 -0
  837. package/dist/embed/embed-page-julia-repl-O5XO6CSL.js +1 -0
  838. package/dist/embed/embed-page-kanban-definition-3W4ZIXB7-5JTDNV4G.js +89 -0
  839. package/dist/embed/embed-page-katex-BO63LHUI.js +261 -0
  840. package/dist/embed/embed-page-keepalived-OPG3P3WJ.js +1 -0
  841. package/dist/embed/embed-page-keyman-CXJENJBT.js +1 -0
  842. package/dist/embed/embed-page-kotlin-62Q32YH3.js +1 -0
  843. package/dist/embed/embed-page-kotlin-V4IBLBDP.js +1 -0
  844. package/dist/embed/embed-page-kumir-TIJGTYC3.js +1 -0
  845. package/dist/embed/embed-page-kusto-BXI53DND.js +1 -0
  846. package/dist/embed/embed-page-lasso-2CPND7XH.js +1 -0
  847. package/dist/embed/embed-page-latex-F3X5K6QF.js +1 -0
  848. package/dist/embed/embed-page-latex-MVG52AHA.js +1 -0
  849. package/dist/embed/embed-page-latte-J3LVOB6S.js +1 -0
  850. package/dist/embed/embed-page-ldif-5OWTENAQ.js +1 -0
  851. package/dist/embed/embed-page-leaf-EYR425IG.js +1 -0
  852. package/dist/embed/embed-page-less-S6CBMQQZ.js +1 -0
  853. package/dist/embed/embed-page-less-WDPLNQ5B.js +1 -0
  854. package/dist/embed/embed-page-lilypond-IJV67NKP.js +1 -0
  855. package/dist/embed/embed-page-linker-script-MIX3HOEH.js +1 -0
  856. package/dist/embed/embed-page-liquid-CFWS6T2J.js +1 -0
  857. package/dist/embed/embed-page-lisp-C6XPBZ5U.js +1 -0
  858. package/dist/embed/embed-page-lisp-IM4ILKS7.js +1 -0
  859. package/dist/embed/embed-page-livecodeserver-6F3SUK5W.js +1 -0
  860. package/dist/embed/embed-page-livescript-GNIYPIHH.js +1 -0
  861. package/dist/embed/embed-page-livescript-HOLSYBIG.js +1 -0
  862. package/dist/embed/embed-page-llvm-IWL5DLNH.js +1 -0
  863. package/dist/embed/embed-page-llvm-K2USHCCC.js +1 -0
  864. package/dist/embed/embed-page-log-BLJX5RSC.js +1 -0
  865. package/dist/embed/embed-page-lolcode-6COIIRQ6.js +1 -0
  866. package/dist/embed/embed-page-lsl-KDZSWM6S.js +1 -0
  867. package/dist/embed/embed-page-lua-5KEV5KHK.js +1 -0
  868. package/dist/embed/embed-page-lua-F7VBLUI5.js +1 -0
  869. package/dist/embed/embed-page-magma-TTQUX26J.js +1 -0
  870. package/dist/embed/embed-page-makefile-4VQZE7FW.js +1 -0
  871. package/dist/embed/embed-page-makefile-LDN5QGHW.js +1 -0
  872. package/dist/embed/embed-page-markdown-GU3NFA6A.js +1 -0
  873. package/dist/embed/embed-page-markdown-ODPEZXUU.js +1 -0
  874. package/dist/embed/embed-page-markup-W6JMQ64H.js +1 -0
  875. package/dist/embed/embed-page-markup-templating-RYGNVTG7.js +1 -0
  876. package/dist/embed/embed-page-mata-D4O4BNGS.js +1 -0
  877. package/dist/embed/embed-page-mathematica-YSU2VUX4.js +1 -0
  878. package/dist/embed/embed-page-matlab-6TYO6LKK.js +1 -0
  879. package/dist/embed/embed-page-matlab-DCIHZIZM.js +1 -0
  880. package/dist/embed/embed-page-maxima-K2VWPGLA.js +1 -0
  881. package/dist/embed/embed-page-maxscript-3ARRWLS6.js +1 -0
  882. package/dist/embed/embed-page-mel-E3F6H7ZF.js +1 -0
  883. package/dist/embed/embed-page-mel-YGI273IY.js +1 -0
  884. package/dist/embed/embed-page-mercury-LXCDDOJN.js +1 -0
  885. package/dist/embed/embed-page-mermaid-4FMYB3TJ.js +1 -0
  886. package/dist/embed/embed-page-mermaid-TBO3M7GX.js +18 -0
  887. package/dist/embed/embed-page-metafont-33QDNLJC.js +1 -0
  888. package/dist/embed/embed-page-mindmap-definition-VGOIOE7T-LVIRJQDW.js +68 -0
  889. package/dist/embed/embed-page-mipsasm-HSMSNEPP.js +1 -0
  890. package/dist/embed/embed-page-mizar-OTR4FHWG.js +1 -0
  891. package/dist/embed/embed-page-mizar-ZDNSLX4H.js +1 -0
  892. package/dist/embed/embed-page-mojolicious-2VJDUL4M.js +1 -0
  893. package/dist/embed/embed-page-mongodb-E62Y62DN.js +1 -0
  894. package/dist/embed/embed-page-monkey-KOVSP7SE.js +1 -0
  895. package/dist/embed/embed-page-monkey-MWSXB6DH.js +1 -0
  896. package/dist/embed/embed-page-moonscript-7DWCIDI5.js +1 -0
  897. package/dist/embed/embed-page-moonscript-AIMMMW7W.js +1 -0
  898. package/dist/embed/embed-page-n1ql-TKR2PAQ4.js +1 -0
  899. package/dist/embed/embed-page-n1ql-VSPMFQEE.js +1 -0
  900. package/dist/embed/embed-page-n4js-VQSAFSQG.js +1 -0
  901. package/dist/embed/embed-page-nand2tetris-hdl-ZN4LQDMB.js +1 -0
  902. package/dist/embed/embed-page-naniscript-FX42SAZY.js +1 -0
  903. package/dist/embed/embed-page-nasm-FGR3ELJL.js +1 -0
  904. package/dist/embed/embed-page-neon-4JXYQJP3.js +1 -0
  905. package/dist/embed/embed-page-nevod-2EHVRC32.js +1 -0
  906. package/dist/embed/embed-page-nginx-3W4BPZZB.js +1 -0
  907. package/dist/embed/embed-page-nginx-672JEBEN.js +1 -0
  908. package/dist/embed/embed-page-nim-CNSA5KTJ.js +1 -0
  909. package/dist/embed/embed-page-nim-CS7GVCRH.js +1 -0
  910. package/dist/embed/embed-page-nix-H37VR2HL.js +1 -0
  911. package/dist/embed/embed-page-nix-ODG6AI37.js +1 -0
  912. package/dist/embed/embed-page-node-repl-F5RCYIN3.js +1 -0
  913. package/dist/embed/embed-page-nsis-LEW5NHHS.js +1 -0
  914. package/dist/embed/embed-page-nsis-P73IQUMW.js +1 -0
  915. package/dist/embed/embed-page-objectivec-GOD2BEHI.js +1 -0
  916. package/dist/embed/embed-page-objectivec-UO34JBT5.js +1 -0
  917. package/dist/embed/embed-page-ocaml-ODOKMPKS.js +1 -0
  918. package/dist/embed/embed-page-ocaml-PW67TSNU.js +1 -0
  919. package/dist/embed/embed-page-odin-42BCJRMU.js +1 -0
  920. package/dist/embed/embed-page-opencl-FWU2AVTW.js +1 -0
  921. package/dist/embed/embed-page-openqasm-D2QQCO47.js +1 -0
  922. package/dist/embed/embed-page-openscad-LZPRFY2W.js +1 -0
  923. package/dist/embed/embed-page-oxygene-HZG7OO7G.js +1 -0
  924. package/dist/embed/embed-page-oz-MQNQCKRU.js +1 -0
  925. package/dist/embed/embed-page-packet-BFZMPI3H-JUHAABU6.js +1 -0
  926. package/dist/embed/embed-page-parigp-MAX3X22G.js +1 -0
  927. package/dist/embed/embed-page-parser-2WFCRGYE.js +1 -0
  928. package/dist/embed/embed-page-parser3-C3KVU5ZC.js +1 -0
  929. package/dist/embed/embed-page-pascal-LVXMXCNE.js +1 -0
  930. package/dist/embed/embed-page-pascaligo-6RIW5OHU.js +1 -0
  931. package/dist/embed/embed-page-pcaxis-ZO5S5UAO.js +1 -0
  932. package/dist/embed/embed-page-peoplecode-EAE6M4AF.js +1 -0
  933. package/dist/embed/embed-page-perl-CAUIKKUT.js +1 -0
  934. package/dist/embed/embed-page-perl-NCR5YMVT.js +1 -0
  935. package/dist/embed/embed-page-pf-TXMTVH7H.js +1 -0
  936. package/dist/embed/embed-page-pgsql-M7L7YRCD.js +1 -0
  937. package/dist/embed/embed-page-php-IE2N3QI4.js +1 -0
  938. package/dist/embed/embed-page-php-QCBSAYIC.js +1 -0
  939. package/dist/embed/embed-page-php-extras-VRZO47SA.js +1 -0
  940. package/dist/embed/embed-page-php-template-U54UCRKN.js +1 -0
  941. package/dist/embed/embed-page-phpdoc-ZQWB2OXG.js +1 -0
  942. package/dist/embed/embed-page-pie-7BOR55EZ-GU56BHQJ.js +1 -0
  943. package/dist/embed/embed-page-pieDiagram-ADFJNKIX-JXFHXEAJ.js +30 -0
  944. package/dist/embed/embed-page-plaintext-OINTKMAM.js +1 -0
  945. package/dist/embed/embed-page-plant-uml-3RVWLPWM.js +1 -0
  946. package/dist/embed/embed-page-plsql-XQEBXO73.js +1 -0
  947. package/dist/embed/embed-page-pony-UEK5X7OI.js +1 -0
  948. package/dist/embed/embed-page-powerquery-DEKKCZY7.js +1 -0
  949. package/dist/embed/embed-page-powershell-EBW7RZTN.js +1 -0
  950. package/dist/embed/embed-page-powershell-UMB53SPC.js +1 -0
  951. package/dist/embed/embed-page-processing-56OIROQG.js +1 -0
  952. package/dist/embed/embed-page-processing-ZIDQ7SB3.js +1 -0
  953. package/dist/embed/embed-page-profile-6SSPU7PG.js +1 -0
  954. package/dist/embed/embed-page-prolog-7JA2UBRP.js +1 -0
  955. package/dist/embed/embed-page-prolog-L55HYSKT.js +1 -0
  956. package/dist/embed/embed-page-promql-L4YBO3EF.js +1 -0
  957. package/dist/embed/embed-page-properties-O3BOEJXJ.js +1 -0
  958. package/dist/embed/embed-page-properties-VGZTUJ5E.js +1 -0
  959. package/dist/embed/embed-page-protobuf-F7X2PLJJ.js +1 -0
  960. package/dist/embed/embed-page-protobuf-GS5HMEMS.js +1 -0
  961. package/dist/embed/embed-page-psl-HLKSMRWT.js +1 -0
  962. package/dist/embed/embed-page-pug-MI7HPGUX.js +1 -0
  963. package/dist/embed/embed-page-puppet-2HD3DPH2.js +1 -0
  964. package/dist/embed/embed-page-puppet-BRWZHTKL.js +1 -0
  965. package/dist/embed/embed-page-pure-FVSDVQ2B.js +1 -0
  966. package/dist/embed/embed-page-purebasic-PPHAGMQH.js +1 -0
  967. package/dist/embed/embed-page-purebasic-UVZDR2HE.js +1 -0
  968. package/dist/embed/embed-page-purescript-Q3TGKQZY.js +1 -0
  969. package/dist/embed/embed-page-purify-QTVE4GEG.js +8 -0
  970. package/dist/embed/embed-page-python-NO3SIOCK.js +1 -0
  971. package/dist/embed/embed-page-python-YAPGCWHR.js +1 -0
  972. package/dist/embed/embed-page-python-repl-EIGKWV4T.js +1 -0
  973. package/dist/embed/embed-page-q-5YCCZLRO.js +1 -0
  974. package/dist/embed/embed-page-q-FWJ5L5RH.js +1 -0
  975. package/dist/embed/embed-page-qml-PNZK27ST.js +1 -0
  976. package/dist/embed/embed-page-qml-YVZULPLY.js +1 -0
  977. package/dist/embed/embed-page-qore-QU7W2FQD.js +1 -0
  978. package/dist/embed/embed-page-qsharp-FNGNB3PK.js +1 -0
  979. package/dist/embed/embed-page-quadrantDiagram-AYHSOK5B-4BXTDPJ4.js +7 -0
  980. package/dist/embed/embed-page-r-52DQANKK.js +1 -0
  981. package/dist/embed/embed-page-r-B2QMYOFX.js +1 -0
  982. package/dist/embed/embed-page-racket-OA22GPFB.js +1 -0
  983. package/dist/embed/embed-page-radar-NHE76QYJ-A7QQXLRI.js +1 -0
  984. package/dist/embed/embed-page-reason-QQ4RYUQI.js +1 -0
  985. package/dist/embed/embed-page-reasonml-CQAWSREB.js +1 -0
  986. package/dist/embed/embed-page-regex-5JJLL4V6.js +1 -0
  987. package/dist/embed/embed-page-rego-OLGGN4OK.js +1 -0
  988. package/dist/embed/embed-page-renpy-72F6BTO6.js +1 -0
  989. package/dist/embed/embed-page-requirementDiagram-UZGBJVZJ-WA3XXOP7.js +64 -0
  990. package/dist/embed/embed-page-rescript-VYN4PAG7.js +1 -0
  991. package/dist/embed/embed-page-rest-YZNSQW6O.js +1 -0
  992. package/dist/embed/embed-page-rib-U4ELGIV2.js +1 -0
  993. package/dist/embed/embed-page-rip-ZA4CVYFN.js +1 -0
  994. package/dist/embed/embed-page-roboconf-5IGYRDNH.js +1 -0
  995. package/dist/embed/embed-page-roboconf-HKSGWVI6.js +1 -0
  996. package/dist/embed/embed-page-robotframework-ARNA4YNR.js +1 -0
  997. package/dist/embed/embed-page-routeros-DKQKHPKR.js +1 -0
  998. package/dist/embed/embed-page-rsl-WZYNFUWJ.js +1 -0
  999. package/dist/embed/embed-page-ruby-DLLZKK7A.js +1 -0
  1000. package/dist/embed/embed-page-ruby-TKJZO362.js +1 -0
  1001. package/dist/embed/embed-page-ruleslanguage-7CSB4CWD.js +1 -0
  1002. package/dist/embed/embed-page-rust-6JUJCSHC.js +1 -0
  1003. package/dist/embed/embed-page-rust-ZZUD5RKM.js +1 -0
  1004. package/dist/embed/embed-page-sankeyDiagram-TZEHDZUN-SAVUI2Q4.js +10 -0
  1005. package/dist/embed/embed-page-sas-6H3LYHVP.js +1 -0
  1006. package/dist/embed/embed-page-sas-EUBD2V4Z.js +1 -0
  1007. package/dist/embed/embed-page-sass-U6G7R7AZ.js +1 -0
  1008. package/dist/embed/embed-page-scala-HFYNBK2U.js +1 -0
  1009. package/dist/embed/embed-page-scala-OJM3677P.js +1 -0
  1010. package/dist/embed/embed-page-scheme-KBT7Z3ND.js +1 -0
  1011. package/dist/embed/embed-page-scheme-QQ2VPTFQ.js +1 -0
  1012. package/dist/embed/embed-page-scilab-LA3HLVKQ.js +1 -0
  1013. package/dist/embed/embed-page-scss-FDEUPWYR.js +1 -0
  1014. package/dist/embed/embed-page-scss-IH2AODYU.js +1 -0
  1015. package/dist/embed/embed-page-sequenceDiagram-WL72ISMW-C2QRTOTL.js +145 -0
  1016. package/dist/embed/embed-page-shell-O7OU7Y7F.js +1 -0
  1017. package/dist/embed/embed-page-shell-session-CPCKA76Q.js +1 -0
  1018. package/dist/embed/embed-page-smali-3HHDEBNE.js +1 -0
  1019. package/dist/embed/embed-page-smali-L7H7BQUY.js +1 -0
  1020. package/dist/embed/embed-page-smalltalk-KQLA6XRI.js +1 -0
  1021. package/dist/embed/embed-page-smalltalk-WMM37MR4.js +1 -0
  1022. package/dist/embed/embed-page-smarty-AF5LZRHA.js +1 -0
  1023. package/dist/embed/embed-page-sml-4ARWLXZU.js +1 -0
  1024. package/dist/embed/embed-page-sml-6BNN3PMR.js +1 -0
  1025. package/dist/embed/embed-page-solidity-5WL56MR7.js +1 -0
  1026. package/dist/embed/embed-page-solution-file-FJJU2R2L.js +1 -0
  1027. package/dist/embed/embed-page-soy-54PPSPCO.js +1 -0
  1028. package/dist/embed/embed-page-sparql-AC7LG2EE.js +1 -0
  1029. package/dist/embed/embed-page-splunk-spl-YBP24JOS.js +1 -0
  1030. package/dist/embed/embed-page-sqf-4E5P576B.js +1 -0
  1031. package/dist/embed/embed-page-sqf-CSHANDQB.js +1 -0
  1032. package/dist/embed/embed-page-sql-MGWNK6FE.js +1 -0
  1033. package/dist/embed/embed-page-sql-ZOJORZUC.js +1 -0
  1034. package/dist/embed/embed-page-sql_more-NACOUKSZ.js +1 -0
  1035. package/dist/embed/embed-page-squirrel-XG35KUR2.js +1 -0
  1036. package/dist/embed/embed-page-stan-GDB32LYB.js +1 -0
  1037. package/dist/embed/embed-page-stan-UJ7WCNJT.js +1 -0
  1038. package/dist/embed/embed-page-stata-DEQ57OIC.js +1 -0
  1039. package/dist/embed/embed-page-stata-WJUFDMUW.js +1 -0
  1040. package/dist/embed/embed-page-stateDiagram-FKZM4ZOC-6LDVHEHS.js +1 -0
  1041. package/dist/embed/embed-page-stateDiagram-v2-4FDKWEC3-UJYGEYF5.js +1 -0
  1042. package/dist/embed/embed-page-step21-6AYDKM5N.js +1 -0
  1043. package/dist/embed/embed-page-stylus-CFL6FZN3.js +1 -0
  1044. package/dist/embed/embed-page-stylus-MLEF22IY.js +1 -0
  1045. package/dist/embed/embed-page-subunit-OZQ2HNNA.js +1 -0
  1046. package/dist/embed/embed-page-supercollider-ZK2ECEDQ.js +1 -0
  1047. package/dist/embed/embed-page-swift-MNLMKF5F.js +1 -0
  1048. package/dist/embed/embed-page-swift-UJP2CPA4.js +1 -0
  1049. package/dist/embed/embed-page-systemd-DQXTIGWD.js +1 -0
  1050. package/dist/embed/embed-page-t4-cs-ZPHNHWPR.js +1 -0
  1051. package/dist/embed/embed-page-t4-templating-OA7FNPXM.js +1 -0
  1052. package/dist/embed/embed-page-t4-vb-XBX2HBI5.js +1 -0
  1053. package/dist/embed/embed-page-taggerscript-XVALJYA3.js +1 -0
  1054. package/dist/embed/embed-page-tap-EMOHKH5F.js +1 -0
  1055. package/dist/embed/embed-page-tap-HZHER7FY.js +1 -0
  1056. package/dist/embed/embed-page-tcl-GN4WSRHR.js +1 -0
  1057. package/dist/embed/embed-page-tcl-T3WWKS3Q.js +1 -0
  1058. package/dist/embed/embed-page-textile-OXFYF2DV.js +1 -0
  1059. package/dist/embed/embed-page-thrift-Q26IKVBC.js +1 -0
  1060. package/dist/embed/embed-page-timeline-definition-IT6M3QCI-OF6FTGVN.js +61 -0
  1061. package/dist/embed/embed-page-toml-ZVNI7WJB.js +1 -0
  1062. package/dist/embed/embed-page-tp-24NWOAQZ.js +1 -0
  1063. package/dist/embed/embed-page-treemap-KMMF4GRG-HPTV3SYE.js +1 -0
  1064. package/dist/embed/embed-page-tremor-443PBNWC.js +1 -0
  1065. package/dist/embed/embed-page-tsx-PX2Z4GDU.js +1 -0
  1066. package/dist/embed/embed-page-tt2-L43LNTGL.js +1 -0
  1067. package/dist/embed/embed-page-turtle-IXYYTHLU.js +1 -0
  1068. package/dist/embed/embed-page-twig-MZBQAWRC.js +1 -0
  1069. package/dist/embed/embed-page-twig-WSAAZNH3.js +1 -0
  1070. package/dist/embed/embed-page-typescript-5UWO3Y3K.js +1 -0
  1071. package/dist/embed/embed-page-typescript-BPIRCQG7.js +1 -0
  1072. package/dist/embed/embed-page-typoscript-UUKPTXPH.js +1 -0
  1073. package/dist/embed/embed-page-unrealscript-G2VHZRFN.js +1 -0
  1074. package/dist/embed/embed-page-uorazor-WYGVL7PT.js +1 -0
  1075. package/dist/embed/embed-page-uri-NRWWZBB7.js +1 -0
  1076. package/dist/embed/embed-page-v-LKVTPKDV.js +1 -0
  1077. package/dist/embed/embed-page-vala-EL5BNKYD.js +1 -0
  1078. package/dist/embed/embed-page-vala-MLIRE3PS.js +1 -0
  1079. package/dist/embed/embed-page-vbnet-5JKSIZ56.js +1 -0
  1080. package/dist/embed/embed-page-vbnet-KOGX2JTL.js +1 -0
  1081. package/dist/embed/embed-page-vbscript-637T6GXI.js +1 -0
  1082. package/dist/embed/embed-page-vbscript-html-YKWMMXG4.js +1 -0
  1083. package/dist/embed/embed-page-velocity-7Q63BBW2.js +1 -0
  1084. package/dist/embed/embed-page-verilog-B6EWQWMJ.js +1 -0
  1085. package/dist/embed/embed-page-verilog-G566LGG4.js +1 -0
  1086. package/dist/embed/embed-page-vhdl-R5JIOJNH.js +1 -0
  1087. package/dist/embed/embed-page-vhdl-RMOYZXLG.js +1 -0
  1088. package/dist/embed/embed-page-vim-47Q56RS4.js +1 -0
  1089. package/dist/embed/embed-page-vim-KBCAYMER.js +1 -0
  1090. package/dist/embed/embed-page-visual-basic-ZYE5FD6G.js +1 -0
  1091. package/dist/embed/embed-page-warpscript-65UOMFFU.js +1 -0
  1092. package/dist/embed/embed-page-wasm-MSBGNWUM.js +1 -0
  1093. package/dist/embed/embed-page-web-idl-7WW5RGOI.js +1 -0
  1094. package/dist/embed/embed-page-wgsl-FG3PI6M7.js +1 -0
  1095. package/dist/embed/embed-page-wiki-DGVS4GPN.js +1 -0
  1096. package/dist/embed/embed-page-wolfram-MOURXWVE.js +1 -0
  1097. package/dist/embed/embed-page-wren-PYL5ZRVR.js +1 -0
  1098. package/dist/embed/embed-page-x86asm-WQ6M3VHZ.js +1 -0
  1099. package/dist/embed/embed-page-xeora-JSPZIDKL.js +1 -0
  1100. package/dist/embed/embed-page-xl-DTY4E7YS.js +1 -0
  1101. package/dist/embed/embed-page-xml-P5QA5BKM.js +1 -0
  1102. package/dist/embed/embed-page-xml-doc-VAJOIYSW.js +1 -0
  1103. package/dist/embed/embed-page-xojo-L2PDU7MC.js +1 -0
  1104. package/dist/embed/embed-page-xquery-EWBQ7NVP.js +1 -0
  1105. package/dist/embed/embed-page-xquery-RUKMMBO2.js +1 -0
  1106. package/dist/embed/embed-page-xychartDiagram-PRI3JC2R-EWLR5Z3I.js +7 -0
  1107. package/dist/embed/embed-page-yaml-76KRB6BP.js +1 -0
  1108. package/dist/embed/embed-page-yaml-RR5MLWRK.js +1 -0
  1109. package/dist/embed/embed-page-yang-J62Y5RPD.js +1 -0
  1110. package/dist/embed/embed-page-zephir-OIOOQGNI.js +1 -0
  1111. package/dist/embed/embed-page-zig-75SL5ZWR.js +1 -0
  1112. package/dist/embed/embed-page.css +1 -0
  1113. package/dist/embed/embed-page.js +6 -0
  1114. package/dist/index.d.mts +19 -40
  1115. package/dist/index.d.ts +19 -40
  1116. package/dist/index.js +1157 -701
  1117. package/dist/index.js.map +1 -1
  1118. package/dist/index.mjs +885 -659
  1119. package/dist/index.mjs.map +1 -1
  1120. package/dist/{mcp-configs-SHRMQHIL.mjs → mcp-configs-IIKQM5GM.mjs} +2 -2
  1121. package/dist/mcpTransportRegistry-XMJ5Y2RG.mjs +13 -0
  1122. package/dist/mcpTransportRegistry-XMJ5Y2RG.mjs.map +1 -0
  1123. package/dist/open-DCAOL5CG.mjs +176 -0
  1124. package/dist/open-DCAOL5CG.mjs.map +1 -0
  1125. package/package.json +11 -8
  1126. /package/dist/{mcp-configs-SHRMQHIL.mjs.map → mcp-configs-IIKQM5GM.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -1,6 +1,10 @@
1
+ import {
2
+ getContentTypeFromFilename,
3
+ getFilenameFromPath
4
+ } from "./chunk-LHQY46YB.mjs";
1
5
  import {
2
6
  registerMcpServerConfigRoutes
3
- } from "./chunk-K4XELOSO.mjs";
7
+ } from "./chunk-QKPZWWHH.mjs";
4
8
  import {
5
9
  Logger,
6
10
  getQrCode,
@@ -16,10 +20,6 @@ import {
16
20
  resolvePathWithinRoot,
17
21
  saveProjectFile
18
22
  } from "./chunk-J4BK77PA.mjs";
19
- import {
20
- getContentTypeFromFilename,
21
- getFilenameFromPath
22
- } from "./chunk-LHQY46YB.mjs";
23
23
 
24
24
  // src/index.ts
25
25
  import "dotenv/config";
@@ -29,7 +29,7 @@ import multipart from "@fastify/multipart";
29
29
  import sensible from "@fastify/sensible";
30
30
  import websocket from "@fastify/websocket";
31
31
  import staticPlugin from "@fastify/static";
32
- import path3 from "path";
32
+ import path4 from "path";
33
33
 
34
34
  // src/routes/index.ts
35
35
  import { randomUUID as randomUUID19 } from "crypto";
@@ -4121,9 +4121,9 @@ var ExportImportService = class {
4121
4121
  if (!files || files.size === 0) return void 0;
4122
4122
  const prefix = `files/${entityType}/${entityId}/`;
4123
4123
  const result = /* @__PURE__ */ new Map();
4124
- for (const [path4, content] of files.entries()) {
4125
- if (path4.startsWith(prefix)) {
4126
- result.set(path4.slice(prefix.length), content);
4124
+ for (const [path5, content] of files.entries()) {
4125
+ if (path5.startsWith(prefix)) {
4126
+ result.set(path5.slice(prefix.length), content);
4127
4127
  }
4128
4128
  }
4129
4129
  return result.size > 0 ? result : void 0;
@@ -6224,21 +6224,21 @@ var WorkspaceController = class {
6224
6224
  async listPath(request) {
6225
6225
  const tenantId = this.getTenantId(request);
6226
6226
  const { workspaceId, projectId } = request.params;
6227
- const path4 = request.query.path || "/";
6227
+ const path5 = request.query.path || "/";
6228
6228
  const assistantId = request.query.assistantId;
6229
- console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${path4} assistantId=${assistantId}`);
6230
- const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path4);
6231
- console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${path4})`);
6232
- const files = await backend.lsInfo(path4);
6229
+ console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${path5} assistantId=${assistantId}`);
6230
+ const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path5);
6231
+ console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${path5})`);
6232
+ const files = await backend.lsInfo(path5);
6233
6233
  console.log(`[listPath] result count=${files.length}`);
6234
6234
  return { success: true, data: files };
6235
6235
  }
6236
6236
  async readFile(request) {
6237
6237
  const tenantId = this.getTenantId(request);
6238
6238
  const { workspaceId, projectId } = request.params;
6239
- const { path: path4, offset = 0, limit = 1e3, assistantId } = request.query;
6240
- const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path4);
6241
- const content = await backend.read(path4, Number(offset), Number(limit));
6239
+ const { path: path5, offset = 0, limit = 1e3, assistantId } = request.query;
6240
+ const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path5);
6241
+ const content = await backend.read(path5, Number(offset), Number(limit));
6242
6242
  return { success: true, data: { content, offset, limit } };
6243
6243
  }
6244
6244
  /**
@@ -9099,13 +9099,13 @@ function isStaleConsoleSessionCredential(authHeader) {
9099
9099
  }
9100
9100
  }
9101
9101
  function bypassesConsoleAuth(request) {
9102
- const path4 = request.url.split("?")[0];
9102
+ const path5 = request.url.split("?")[0];
9103
9103
  const method = request.method;
9104
- if (method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/bootstrap$/.test(path4) || (method === "GET" || method === "POST") && /^\/api\/web-apps\/[^/]+\/runtime\/threads$/.test(path4) || (method === "PATCH" || method === "DELETE") && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+$/.test(path4) || method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/messages$/.test(path4) || method === "POST" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/(messages\/stream|abort|attachments)$/.test(path4) || method === "POST" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/interrupts\/[^/]+\/resume$/.test(path4)) return true;
9105
- if (request.method === "GET" && /^\/api\/a2a\/agents\/[^/]+\/\.well-known\/agent-card\.json$/.test(path4)) {
9104
+ if (method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/bootstrap$/.test(path5) || (method === "GET" || method === "POST") && /^\/api\/web-apps\/[^/]+\/runtime\/threads$/.test(path5) || (method === "PATCH" || method === "DELETE") && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+$/.test(path5) || method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/messages$/.test(path5) || method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/files\/(viewfile|downloadfile)$/.test(path5) || method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/api\/assistants\/[^/]+\/threads\/[^/]+\/sandbox\/(viewfile|downloadfile)$/.test(path5) || method === "POST" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/(messages\/stream|abort|attachments)$/.test(path5) || method === "POST" && /^\/api\/web-apps\/[^/]+\/runtime\/threads\/[^/]+\/interrupts\/[^/]+\/resume$/.test(path5) || method === "GET" && /^\/api\/web-apps\/[^/]+\/chat$/.test(path5) || method === "GET" && /^\/embed\/[^/]+$/.test(path5) || (method === "POST" || method === "DELETE") && path5 === "/open/mcp") return true;
9105
+ if (request.method === "GET" && /^\/api\/a2a\/agents\/[^/]+\/\.well-known\/agent-card\.json$/.test(path5)) {
9106
9106
  return true;
9107
9107
  }
9108
- return request.method === "POST" && /^\/api\/a2a\/agents\/[^/]+\/jsonrpc$/.test(path4);
9108
+ return request.method === "POST" && /^\/api\/a2a\/agents\/[^/]+\/jsonrpc$/.test(path5);
9109
9109
  }
9110
9110
  function registerConsoleAuthHook(app2, options) {
9111
9111
  app2.addHook("preHandler", async (request, reply) => {
@@ -9128,8 +9128,8 @@ function registerConsoleAuthHook(app2, options) {
9128
9128
  }
9129
9129
  if (PUBLIC_ROUTES.some((route) => request.url === route)) return;
9130
9130
  if (request.url.startsWith("/s/")) return;
9131
- const path4 = request.url.split("?")[0];
9132
- if (request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/viewfile$/.test(path4) || request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/downloadfile$/.test(path4) || request.method === "POST" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/uploadfile$/.test(path4) || path4.startsWith("/f/") || path4 === "/f") {
9131
+ const path5 = request.url.split("?")[0];
9132
+ if (request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/viewfile$/.test(path5) || request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/downloadfile$/.test(path5) || request.method === "POST" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/uploadfile$/.test(path5) || path5.startsWith("/f/") || path5 === "/f") {
9133
9133
  return;
9134
9134
  }
9135
9135
  await reply.status(401).send({
@@ -10257,8 +10257,8 @@ var log = {
10257
10257
  };
10258
10258
  var connections = /* @__PURE__ */ new Map();
10259
10259
  var pending = /* @__PURE__ */ new Map();
10260
- function getAgentIdFromPath(path4) {
10261
- const match = path4.match(/^\/api\/a2a\/bridge\/proxy\/([^/]+)/);
10260
+ function getAgentIdFromPath(path5) {
10261
+ const match = path5.match(/^\/api\/a2a\/bridge\/proxy\/([^/]+)/);
10262
10262
  return match ? match[1] : null;
10263
10263
  }
10264
10264
  function handleBridgeConnection(socket, _request) {
@@ -12811,7 +12811,6 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
12811
12811
  });
12812
12812
  routes.get("/api/web-apps/:webAppId/runtime/files/viewfile", async (request, reply) => {
12813
12813
  const { webAppId } = paramsSchema.parse(request.params);
12814
- const identity = await resolveRuntimeIdentity(request, webAppId, identities);
12815
12814
  const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
12816
12815
  const query = { ...request.query, assistantId: scope.assistantId };
12817
12816
  await workspace.viewFile(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
@@ -12819,7 +12818,6 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
12819
12818
  });
12820
12819
  routes.get("/api/web-apps/:webAppId/runtime/files/downloadfile", async (request, reply) => {
12821
12820
  const { webAppId } = paramsSchema.parse(request.params);
12822
- const identity = await resolveRuntimeIdentity(request, webAppId, identities);
12823
12821
  const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
12824
12822
  const query = { ...request.query, assistantId: scope.assistantId };
12825
12823
  await workspace.downloadFile(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
@@ -12844,6 +12842,15 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
12844
12842
  };
12845
12843
  routes.get("/api/web-apps/:webAppId/runtime/assistants/:assistantId/threads/:threadId/sandbox/downloadfile", delegateGenuiFile(workspace.downloadFile.bind(workspace)));
12846
12844
  routes.get("/api/web-apps/:webAppId/runtime/assistants/:assistantId/threads/:threadId/sandbox/viewfile", delegateGenuiFile(workspace.viewFile.bind(workspace)));
12845
+ const delegateAnonGenuiFile = (method) => async (request, reply) => {
12846
+ const { webAppId } = genuiSandboxParams.parse(request.params);
12847
+ const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
12848
+ const query = { ...request.query, assistantId: scope.assistantId };
12849
+ await method(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
12850
+ return reply;
12851
+ };
12852
+ routes.get("/api/web-apps/:webAppId/runtime/api/assistants/:assistantId/threads/:threadId/sandbox/downloadfile", delegateAnonGenuiFile(workspace.downloadFile.bind(workspace)));
12853
+ routes.get("/api/web-apps/:webAppId/runtime/api/assistants/:assistantId/threads/:threadId/sandbox/viewfile", delegateAnonGenuiFile(workspace.viewFile.bind(workspace)));
12847
12854
  }
12848
12855
  const mirrorThreadParams = z5.object({ webAppId: idSchema, assistantId: idSchema, threadId: idSchema }).strict();
12849
12856
  const mirrorBody = z5.object({ metadata: z5.object({ label: z5.string().max(300).optional() }).strict().optional(), projectId: idSchema.optional(), modelKey: idSchema.optional() }).strict();
@@ -13034,6 +13041,105 @@ function isMultipartRequestError(error) {
13034
13041
  return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && error.code.startsWith("FST_");
13035
13042
  }
13036
13043
 
13044
+ // src/routes/agent-web-app-embed.ts
13045
+ import { existsSync as existsSync2 } from "fs";
13046
+ import { readFile, readdir as readdir2 } from "fs/promises";
13047
+ import path3 from "path";
13048
+ import { z as z6 } from "zod";
13049
+ var idSchema2 = z6.string().min(1).max(128).regex(/^[A-Za-z0-9._:@-]+$/);
13050
+ var JS_CONTENT_TYPE = "application/javascript; charset=utf-8";
13051
+ var CSS_CONTENT_TYPE = "text/css; charset=utf-8";
13052
+ var EXACT_ASSETS = {
13053
+ "agent-chat-loader.js": { contentType: JS_CONTENT_TYPE },
13054
+ "embed-page.js": { contentType: JS_CONTENT_TYPE },
13055
+ "embed-page.css": { contentType: CSS_CONTENT_TYPE }
13056
+ };
13057
+ var HASHED_CHUNK_PATTERN = /^embed-page-[A-Za-z0-9._-]+\.(js|css)$/;
13058
+ var CHUNK_CSS_PATTERN = /^embed-page-[A-Za-z0-9._-]+\.css$/;
13059
+ function resolveAsset(asset) {
13060
+ if (asset.includes("..")) return null;
13061
+ const exact2 = EXACT_ASSETS[asset];
13062
+ if (exact2 !== void 0) return { contentType: exact2.contentType, immutable: false };
13063
+ const hashed = HASHED_CHUNK_PATTERN.exec(asset);
13064
+ if (hashed) {
13065
+ return { contentType: hashed[1] === "css" ? CSS_CONTENT_TYPE : JS_CONTENT_TYPE, immutable: true };
13066
+ }
13067
+ return null;
13068
+ }
13069
+ async function listChunkCssFiles(assetsDir) {
13070
+ try {
13071
+ return (await readdir2(assetsDir)).filter((name) => CHUNK_CSS_PATTERN.test(name) && !name.includes("..")).sort();
13072
+ } catch {
13073
+ return [];
13074
+ }
13075
+ }
13076
+ var BUNDLED_MARKER = "agent-chat-loader.js";
13077
+ function resolveBundledEmbedDir() {
13078
+ if (typeof __dirname === "string") {
13079
+ const compiled = path3.resolve(__dirname, "embed");
13080
+ if (existsSync2(path3.join(compiled, BUNDLED_MARKER))) return compiled;
13081
+ }
13082
+ let dir = path3.dirname(path3.resolve(process.argv[1] ?? process.cwd()));
13083
+ for (let depth = 0; depth < 8; depth += 1) {
13084
+ const candidate = path3.join(dir, "packages", "gateway", "dist", "embed");
13085
+ if (existsSync2(path3.join(candidate, BUNDLED_MARKER))) return candidate;
13086
+ const parent = path3.dirname(dir);
13087
+ if (parent === dir) break;
13088
+ dir = parent;
13089
+ }
13090
+ return null;
13091
+ }
13092
+ function renderChatShell(chunkCssFiles) {
13093
+ const chunkCssLinks = chunkCssFiles.map(
13094
+ (name) => ` <link rel="stylesheet" href="/embed/${name}" />`
13095
+ );
13096
+ return [
13097
+ "<!doctype html>",
13098
+ '<html lang="en">',
13099
+ " <head>",
13100
+ ' <meta charset="utf-8" />',
13101
+ ' <meta name="viewport" content="width=device-width, initial-scale=1" />',
13102
+ " <title>Agent chat</title>",
13103
+ ' <link rel="stylesheet" href="/embed/embed-page.css" />',
13104
+ ...chunkCssLinks,
13105
+ " </head>",
13106
+ " <body>",
13107
+ ' <div id="axiom-embed-root">',
13108
+ " <noscript>This chat requires JavaScript.</noscript>",
13109
+ ' <p class="axiom-embed-loading">Loading chat\u2026</p>',
13110
+ " </div>",
13111
+ ' <script type="module" src="/embed/embed-page.js"></script>',
13112
+ " </body>",
13113
+ "</html>"
13114
+ ].join("\n");
13115
+ }
13116
+ function registerAgentWebAppEmbedRoutes(app2, deps = {}) {
13117
+ const bundledDir = resolveBundledEmbedDir();
13118
+ const assetsDir = deps.assetsDir ?? process.env.AXIOM_EMBED_ASSETS_DIR ?? bundledDir ?? path3.resolve(process.cwd(), "assets/embed");
13119
+ let chunkCssFiles = null;
13120
+ app2.get("/api/web-apps/:webAppId/chat", async (request, reply) => {
13121
+ const parsed = idSchema2.safeParse(request.params.webAppId);
13122
+ if (!parsed.success) {
13123
+ return reply.code(400).send({ success: false, error: { code: "INVALID_REQUEST", message: "Invalid web app id", retryable: false } });
13124
+ }
13125
+ chunkCssFiles ?? (chunkCssFiles = await listChunkCssFiles(assetsDir));
13126
+ return reply.header("content-type", "text/html; charset=utf-8").header("cache-control", "no-store").send(renderChatShell(chunkCssFiles));
13127
+ });
13128
+ app2.get("/embed/:asset", async (request, reply) => {
13129
+ const asset = request.params.asset ?? "";
13130
+ const resolved = resolveAsset(asset);
13131
+ if (resolved === null) {
13132
+ return reply.code(404).send({ success: false, error: { code: "INVALID_REQUEST", message: "Unknown embed asset", retryable: false } });
13133
+ }
13134
+ try {
13135
+ const body = await readFile(path3.join(assetsDir, asset));
13136
+ return reply.header("content-type", resolved.contentType).header("cache-control", resolved.immutable ? "public, max-age=31536000, immutable" : "public, max-age=300").send(body);
13137
+ } catch {
13138
+ return reply.code(404).send({ success: false, error: { code: "INVALID_REQUEST", message: "Embed asset not built", retryable: false } });
13139
+ }
13140
+ });
13141
+ }
13142
+
13037
13143
  // src/services/agent-web-app/AgentWebAppAttachmentRef.ts
13038
13144
  import { createCipheriv, createDecipheriv, createHash as createHash3, randomBytes as randomBytes2 } from "crypto";
13039
13145
  var TTL_MS = 15 * 6e4;
@@ -13116,10 +13222,10 @@ function isAttachmentPayload(value) {
13116
13222
  }
13117
13223
 
13118
13224
  // src/controllers/capability-bundles.ts
13119
- import { z as z7 } from "zod";
13225
+ import { z as z8 } from "zod";
13120
13226
 
13121
13227
  // src/services/capability/CapabilityBundleService.ts
13122
- import { z as z6 } from "zod";
13228
+ import { z as z7 } from "zod";
13123
13229
  import { CapabilityBundleMergeError, CapabilityBundleValidationError, mergeCapabilityBundles, validateCapabilityBundleInput } from "@axiom-lattice/core";
13124
13230
  var CapabilityBundleServiceError = class extends Error {
13125
13231
  constructor(code, message, statusCode) {
@@ -13129,7 +13235,7 @@ var CapabilityBundleServiceError = class extends Error {
13129
13235
  this.name = "CapabilityBundleServiceError";
13130
13236
  }
13131
13237
  };
13132
- var uuid = z6.string().uuid();
13238
+ var uuid = z7.string().uuid();
13133
13239
  function ownRecord(value) {
13134
13240
  if (value === void 0 || value === null) return {};
13135
13241
  if (typeof value !== "object" || Array.isArray(value)) throw new CapabilityBundleServiceError("INVALID_BUNDLE_CONFIG", "Project config must be an object", 409);
@@ -13331,12 +13437,12 @@ var CapabilityBundleService = class {
13331
13437
 
13332
13438
  // src/controllers/capability-bundles.ts
13333
13439
  var logger3 = new Logger({ serviceName: "lattice/gateway/capability-bundles" });
13334
- var capability = z7.unknown();
13335
- var createSchema = z7.object({ name: z7.string(), description: z7.string().optional(), capabilities: z7.array(capability) }).strict();
13336
- var updateSchema = createSchema.partial().extend({ expectedUpdatedAt: z7.string().optional() });
13337
- var bundleIdSchema = z7.string().uuid();
13338
- var bundleParamsSchema = z7.object({ bundleId: bundleIdSchema });
13339
- var projectSchema = z7.object({ bundleIds: z7.array(bundleIdSchema), expectedRevisions: z7.record(z7.string()).optional() }).strict();
13440
+ var capability = z8.unknown();
13441
+ var createSchema = z8.object({ name: z8.string(), description: z8.string().optional(), capabilities: z8.array(capability) }).strict();
13442
+ var updateSchema = createSchema.partial().extend({ expectedUpdatedAt: z8.string().optional() });
13443
+ var bundleIdSchema = z8.string().uuid();
13444
+ var bundleParamsSchema = z8.object({ bundleId: bundleIdSchema });
13445
+ var projectSchema = z8.object({ bundleIds: z8.array(bundleIdSchema), expectedRevisions: z8.record(z8.string()).optional() }).strict();
13340
13446
  function tenant(request, authRequired2) {
13341
13447
  const authenticated = request.user?.tenantId;
13342
13448
  const header2 = request.headers["x-tenant-id"];
@@ -13604,6 +13710,14 @@ var ProjectMembershipService = class {
13604
13710
  const room = await this.deps.roomStore.getMainRoom(membership.tenantId, membership.projectId);
13605
13711
  if (!room) throw new Error("Project main room not found");
13606
13712
  this.deps.realtime.membershipChanged({ tenantId: membership.tenantId, roomId: room.id, membership, change, sourceKey });
13713
+ this.deps.realtime.membershipAffected({
13714
+ tenantId: membership.tenantId,
13715
+ userId: membership.userId,
13716
+ change,
13717
+ projectId: membership.projectId,
13718
+ roomId: room.id,
13719
+ sourceKey: `membership-affected:${sourceKey}`
13720
+ });
13607
13721
  }).catch((error) => {
13608
13722
  this.reportRealtimeFailure(membership.id);
13609
13723
  });
@@ -14208,45 +14322,46 @@ function matchesNormalizedPayload(message, input) {
14208
14322
 
14209
14323
  // src/routes/project-rooms.ts
14210
14324
  import { ZodError as ZodError3 } from "zod";
14325
+ import { toProjectRoomPublicMessage } from "@axiom-lattice/protocols";
14211
14326
 
14212
14327
  // src/schemas/project-room.ts
14213
- import { z as z8 } from "zod";
14214
- var id2 = z8.string().trim().min(1).max(128);
14215
- var isoDate = z8.string().datetime({ offset: true }).transform((value) => new Date(value));
14216
- var expectedUpdatedAt = z8.object({ expectedUpdatedAt: isoDate }).strict();
14217
- var projectRoomParamsSchema = z8.object({ projectId: id2 }).strict();
14218
- var membershipParamsSchema = z8.object({ projectId: id2, membershipId: id2 }).strict();
14219
- var roomMessagesQuerySchema = z8.object({
14220
- beforeCreatedAt: z8.string().datetime({ offset: true }).transform((value) => new Date(value)).optional(),
14328
+ import { z as z9 } from "zod";
14329
+ var id2 = z9.string().trim().min(1).max(128);
14330
+ var isoDate = z9.string().datetime({ offset: true }).transform((value) => new Date(value));
14331
+ var expectedUpdatedAt = z9.object({ expectedUpdatedAt: isoDate }).strict();
14332
+ var projectRoomParamsSchema = z9.object({ projectId: id2 }).strict();
14333
+ var membershipParamsSchema = z9.object({ projectId: id2, membershipId: id2 }).strict();
14334
+ var roomMessagesQuerySchema = z9.object({
14335
+ beforeCreatedAt: z9.string().datetime({ offset: true }).transform((value) => new Date(value)).optional(),
14221
14336
  beforeId: id2.optional(),
14222
- limit: z8.coerce.number().int().min(1).max(100).optional()
14337
+ limit: z9.coerce.number().int().min(1).max(100).optional()
14223
14338
  }).strict().refine((value) => value.beforeCreatedAt === void 0 === (value.beforeId === void 0), { message: "Both cursor fields are required" });
14224
- var createRoomMessageSchema = z8.object({
14225
- text: z8.string(),
14226
- mentions: z8.array(z8.union([
14227
- z8.object({ type: z8.literal("team") }).strict(),
14228
- z8.object({ type: z8.literal("bot"), membershipId: id2 }).strict()
14339
+ var createRoomMessageSchema = z9.object({
14340
+ text: z9.string(),
14341
+ mentions: z9.array(z9.union([
14342
+ z9.object({ type: z9.literal("team") }).strict(),
14343
+ z9.object({ type: z9.literal("bot"), membershipId: id2 }).strict()
14229
14344
  ])).optional(),
14230
14345
  replyToMessageId: id2.optional()
14231
14346
  }).strict();
14232
- var addProjectMemberSchema = z8.object({ userId: id2, role: z8.enum(["owner", "admin", "member", "viewer"]) }).strict();
14233
- var updateProjectMemberSchema = z8.object({ role: z8.enum(["owner", "admin", "member", "viewer"]), expectedUpdatedAt: isoDate }).strict();
14347
+ var addProjectMemberSchema = z9.object({ userId: id2, role: z9.enum(["owner", "admin", "member", "viewer"]) }).strict();
14348
+ var updateProjectMemberSchema = z9.object({ role: z9.enum(["owner", "admin", "member", "viewer"]), expectedUpdatedAt: isoDate }).strict();
14234
14349
  var mutationExpectedUpdatedAtSchema = expectedUpdatedAt;
14235
- var roomMessageRetryParamsSchema = z8.object({ projectId: id2, messageId: id2 }).strict();
14236
- var emptyObjectSchema = z8.object({}).strict();
14237
- var idempotencyKeySchema = z8.string().refine((value) => value.trim().length >= 1 && value.trim().length <= 200 && /^[\x20-\x7e]+$/.test(value.trim()), "Invalid idempotency key").transform((value) => value.trim());
14238
- var addProjectBotSchema = z8.object({
14350
+ var roomMessageRetryParamsSchema = z9.object({ projectId: id2, messageId: id2 }).strict();
14351
+ var emptyObjectSchema = z9.object({}).strict();
14352
+ var idempotencyKeySchema = z9.string().refine((value) => value.trim().length >= 1 && value.trim().length <= 200 && /^[\x20-\x7e]+$/.test(value.trim()), "Invalid idempotency key").transform((value) => value.trim());
14353
+ var addProjectBotSchema = z9.object({
14239
14354
  assistantId: id2,
14240
- role: z8.enum(["coordinator", "specialist"]),
14241
- title: z8.string(),
14242
- responsibility: z8.string().optional(),
14243
- mentionName: z8.string()
14355
+ role: z9.enum(["coordinator", "specialist"]),
14356
+ title: z9.string(),
14357
+ responsibility: z9.string().optional(),
14358
+ mentionName: z9.string()
14244
14359
  }).strict();
14245
- var updateProjectBotSchema = z8.object({
14246
- role: z8.enum(["coordinator", "specialist"]).optional(),
14247
- title: z8.string().optional(),
14248
- responsibility: z8.string().optional(),
14249
- mentionName: z8.string().optional(),
14360
+ var updateProjectBotSchema = z9.object({
14361
+ role: z9.enum(["coordinator", "specialist"]).optional(),
14362
+ title: z9.string().optional(),
14363
+ responsibility: z9.string().optional(),
14364
+ mentionName: z9.string().optional(),
14250
14365
  expectedUpdatedAt: isoDate
14251
14366
  }).strict().refine((value) => value.role !== void 0 || value.title !== void 0 || value.responsibility !== void 0 || value.mentionName !== void 0, { message: "At least one mutable field is required" });
14252
14367
 
@@ -14264,7 +14379,8 @@ function registerProjectRoomRoutes(app2, deps) {
14264
14379
  const params = projectRoomParamsSchema.parse(request.params);
14265
14380
  const query = roomMessagesQuerySchema.parse(request.query);
14266
14381
  const before = query.beforeCreatedAt === void 0 && query.beforeId === void 0 ? void 0 : { createdAt: query.beforeCreatedAt, id: query.beforeId };
14267
- return { data: await deps.messageService.list(actor(request, params.projectId), { ...before ? { before } : {}, ...query.limit === void 0 ? {} : { limit: query.limit } }) };
14382
+ const messages = await deps.messageService.list(actor(request, params.projectId), { ...before ? { before } : {}, ...query.limit === void 0 ? {} : { limit: query.limit } });
14383
+ return { data: messages.map(toProjectRoomMessage) };
14268
14384
  }));
14269
14385
  app2.post("/api/projects/:projectId/room/messages", async (request, reply) => run(reply, async () => {
14270
14386
  const params = projectRoomParamsSchema.parse(request.params);
@@ -14275,7 +14391,7 @@ function registerProjectRoomRoutes(app2, deps) {
14275
14391
  const idempotencyKey = rawIdempotencyKey === void 0 ? void 0 : idempotencyKeySchema.parse(rawIdempotencyKey);
14276
14392
  const result = await deps.messageService.createAndDispatch(requestActor, { ...input, ...idempotencyKey === void 0 ? {} : { requestIdempotencyKey: idempotencyKey } });
14277
14393
  const allSucceeded = result.dispatch.length > 0 && result.dispatch.every((entry) => entry.success);
14278
- return { statusCode: allSucceeded ? result.replayed ? 200 : 201 : 202, data: result };
14394
+ return { statusCode: allSucceeded ? result.replayed ? 200 : 201 : 202, data: { message: toProjectRoomMessage(result.message), dispatch: result.dispatch, replayed: result.replayed } };
14279
14395
  }));
14280
14396
  app2.post("/api/projects/:projectId/room/messages/:messageId/retry", async (request, reply) => run(reply, async () => {
14281
14397
  const params = roomMessageRetryParamsSchema.parse(request.params);
@@ -14284,6 +14400,12 @@ function registerProjectRoomRoutes(app2, deps) {
14284
14400
  const dispatch = await deps.messageService.retry(actor(request, params.projectId), params.messageId);
14285
14401
  return { statusCode: dispatch.length > 0 && dispatch.every((entry) => entry.success) ? 200 : 202, data: dispatch };
14286
14402
  }));
14403
+ app2.post("/api/projects/:projectId/room/read-state", async (request, reply) => run(reply, async () => {
14404
+ const params = projectRoomParamsSchema.parse(request.params);
14405
+ emptyObjectSchema.parse(request.body ?? {});
14406
+ await deps.readStateService.mark(actor(request, params.projectId));
14407
+ return { data: { marked: true } };
14408
+ }));
14287
14409
  app2.get("/api/projects/:projectId/members", async (request, reply) => run(reply, async () => ({ data: await deps.membershipService.list(actor(request, projectRoomParamsSchema.parse(request.params).projectId)) })));
14288
14410
  app2.post("/api/projects/:projectId/members", async (request, reply) => run(reply, async () => {
14289
14411
  const p = projectRoomParamsSchema.parse(request.params);
@@ -14306,6 +14428,11 @@ function actor(request, projectId) {
14306
14428
  projectRoomParamsSchema.parse({ projectId });
14307
14429
  return { tenantId: user.tenantId, userId: user.id, projectId };
14308
14430
  }
14431
+ function toProjectRoomMessage(message) {
14432
+ const publicMessage = toProjectRoomPublicMessage(message);
14433
+ if (publicMessage === void 0) throw new Error("Room message could not be mapped to its public DTO");
14434
+ return publicMessage;
14435
+ }
14309
14436
  async function run(reply, operation) {
14310
14437
  try {
14311
14438
  const result = await operation();
@@ -14371,6 +14498,7 @@ import {
14371
14498
  generateDirectHumanProjectId,
14372
14499
  generateDirectBotProjectId
14373
14500
  } from "@axiom-lattice/core";
14501
+ import { toProjectRoomPublicMessage as toProjectRoomPublicMessage2 } from "@axiom-lattice/protocols";
14374
14502
  var CoSpaceAuthError = class extends Error {
14375
14503
  constructor() {
14376
14504
  super(...arguments);
@@ -14385,6 +14513,18 @@ function getActor2(request) {
14385
14513
  }
14386
14514
  return { tenantId: user.tenantId, userId: user.id };
14387
14515
  }
14516
+ async function computeUnread(deps, tenantId, userId, roomId, lastMessage) {
14517
+ if (!lastMessage) return 0;
14518
+ const readState = await deps.readStateStore.get(tenantId, roomId, userId);
14519
+ const horizon = readState?.lastReadAt;
14520
+ if (horizon && lastMessage.createdAt.getTime() <= horizon.getTime()) return 0;
14521
+ return deps.messageStore.countAfter({
14522
+ tenantId,
14523
+ roomId,
14524
+ after: horizon ?? /* @__PURE__ */ new Date(0),
14525
+ excludeAuthorUserId: userId
14526
+ });
14527
+ }
14388
14528
  function registerCoSpaceRoutes(app2, deps) {
14389
14529
  const idFactory = deps.idFactory ?? (() => randomUUID16());
14390
14530
  app2.get(
@@ -14435,6 +14575,7 @@ function registerCoSpaceRoutes(app2, deps) {
14435
14575
  limit: 1
14436
14576
  });
14437
14577
  const lastMessage = messages[0];
14578
+ const publicLastMessage = lastMessage === void 0 ? void 0 : toProjectRoomPublicMessage2(lastMessage);
14438
14579
  const memberships = await deps.membershipStore.list(
14439
14580
  actor2.tenantId,
14440
14581
  project.id
@@ -14450,19 +14591,26 @@ function registerCoSpaceRoutes(app2, deps) {
14450
14591
  rooms.push({
14451
14592
  project,
14452
14593
  room,
14453
- lastMessage,
14594
+ lastMessage: publicLastMessage,
14454
14595
  participantCount: memberships.filter(
14455
14596
  (m) => m.status === "active"
14456
14597
  ).length,
14457
- participantNames
14598
+ participantNames,
14599
+ unreadCount: await computeUnread(
14600
+ deps,
14601
+ actor2.tenantId,
14602
+ actor2.userId,
14603
+ room.id,
14604
+ lastMessage
14605
+ )
14458
14606
  });
14459
14607
  } catch (e) {
14460
14608
  console.error("[CoSpace] Failed to process room for project:", project.id, e);
14461
14609
  }
14462
14610
  }
14463
14611
  rooms.sort((a, b) => {
14464
- const aTime = a.lastMessage?.createdAt?.getTime() ?? 0;
14465
- const bTime = b.lastMessage?.createdAt?.getTime() ?? 0;
14612
+ const aTime = a.lastMessage ? Date.parse(a.lastMessage.createdAt) : 0;
14613
+ const bTime = b.lastMessage ? Date.parse(b.lastMessage.createdAt) : 0;
14466
14614
  return bTime - aTime;
14467
14615
  });
14468
14616
  const publicRoom = await deps.publicRoom.ensure(actor2.tenantId, params.workspaceId);
@@ -14472,6 +14620,7 @@ function registerCoSpaceRoutes(app2, deps) {
14472
14620
  roomId: publicRoom.room.id,
14473
14621
  limit: 1
14474
14622
  });
14623
+ const publicLastMessage = publicMessages[0];
14475
14624
  const publicMemberships = await deps.membershipStore.list(
14476
14625
  actor2.tenantId,
14477
14626
  publicRoom.project.id
@@ -14487,10 +14636,17 @@ function registerCoSpaceRoutes(app2, deps) {
14487
14636
  rooms.unshift({
14488
14637
  project: publicRoom.project,
14489
14638
  room: publicRoom.room,
14490
- lastMessage: publicMessages[0],
14639
+ lastMessage: publicLastMessage === void 0 ? void 0 : toProjectRoomPublicMessage2(publicLastMessage),
14491
14640
  participantCount: publicMemberships.filter((m) => m.status === "active").length,
14492
14641
  participantNames: publicParticipantNames,
14493
- isPublic: true
14642
+ isPublic: true,
14643
+ unreadCount: await computeUnread(
14644
+ deps,
14645
+ actor2.tenantId,
14646
+ actor2.userId,
14647
+ publicRoom.room.id,
14648
+ publicLastMessage
14649
+ )
14494
14650
  });
14495
14651
  }
14496
14652
  return { data: { rooms } };
@@ -17549,6 +17705,7 @@ function snapshotJson(value, ancestors = /* @__PURE__ */ new Set()) {
17549
17705
  // src/services/collaboration/ProjectRoomRealtimePublisher.ts
17550
17706
  import { createHash as createHash7 } from "crypto";
17551
17707
  import {
17708
+ projectRoomUserEventScope,
17552
17709
  snapshotExactRecord as snapshotExactRecord10,
17553
17710
  snapshotProjectRoomBotMembershipRealtime,
17554
17711
  snapshotProjectRoomMembershipRealtime,
@@ -17623,6 +17780,46 @@ var BrokerProjectRoomRealtimePublisher = class {
17623
17780
  };
17624
17781
  });
17625
17782
  }
17783
+ /** Publishes a membership notice onto the affected user's channel scope. */
17784
+ membershipAffected(input) {
17785
+ this.publish("membership.affected", () => {
17786
+ const value = snapshotExactRecord10(input, ["tenantId", "userId", "change", "projectId", "roomId", "sourceKey"]);
17787
+ if (!value || !safeId2(value.tenantId) || !safeId2(value.userId) || !safeId2(value.projectId) || !safeId2(value.roomId) || !safeSourceKey(value.sourceKey) || !["added", "removed", "role_changed"].includes(value.change)) {
17788
+ throw new TypeError("Invalid membership input");
17789
+ }
17790
+ const scope = projectRoomUserEventScope(value.tenantId, value.userId);
17791
+ return {
17792
+ sourceKey: value.sourceKey,
17793
+ id: value.sourceKey,
17794
+ scope,
17795
+ draft: {
17796
+ type: "membership.affected",
17797
+ occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
17798
+ data: { change: value.change, projectId: value.projectId, roomId: value.roomId }
17799
+ }
17800
+ };
17801
+ });
17802
+ }
17803
+ /** Publishes a read-marker update onto the acting user's channel scope. */
17804
+ readChanged(input) {
17805
+ this.publish("read.changed", () => {
17806
+ const value = snapshotExactRecord10(input, ["tenantId", "userId", "projectId", "roomId", "lastReadAt", "sourceKey"]);
17807
+ if (!value || !safeId2(value.tenantId) || !safeId2(value.userId) || !safeId2(value.projectId) || !safeId2(value.roomId) || !safeSourceKey(value.sourceKey) || typeof value.lastReadAt !== "string" || !Number.isFinite(Date.parse(value.lastReadAt))) {
17808
+ throw new TypeError("Invalid read input");
17809
+ }
17810
+ const scope = projectRoomUserEventScope(value.tenantId, value.userId);
17811
+ return {
17812
+ sourceKey: value.sourceKey,
17813
+ id: value.sourceKey,
17814
+ scope,
17815
+ draft: {
17816
+ type: "read.changed",
17817
+ occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
17818
+ data: { projectId: value.projectId, roomId: value.roomId, lastReadAt: new Date(Date.parse(value.lastReadAt)).toISOString() }
17819
+ }
17820
+ };
17821
+ });
17822
+ }
17626
17823
  publish(type, build) {
17627
17824
  let event;
17628
17825
  try {
@@ -17681,597 +17878,621 @@ function safeErrorCode(error) {
17681
17878
  return error instanceof Error && error.name === "Error" ? "Error" : "UnknownError";
17682
17879
  }
17683
17880
 
17684
- // src/services/collaboration/ProjectRoomRealtimeService.ts
17685
- import { ProjectRoomCursorError as ProjectRoomCursorError2 } from "@axiom-lattice/protocols";
17686
-
17687
- // src/services/collaboration/ProjectRoomSseWriter.ts
17688
- var DEFAULT_MAX_FRAMES = 256;
17689
- var DEFAULT_MAX_BYTES = 1024 * 1024;
17690
- var DEFAULT_DRAIN_TIMEOUT_MS = 1e4;
17691
- function serializeBusiness(event) {
17692
- return `id: ${event.id}
17693
- event: ${event.type}
17694
- data: ${JSON.stringify(event)}
17695
-
17696
- `;
17697
- }
17698
- function serializeControl(event) {
17699
- return `event: ${event.type}
17700
- data: ${JSON.stringify(event.data)}
17701
-
17702
- `;
17703
- }
17704
- var ProjectRoomSseWriter = class {
17705
- /** Creates a writer over a raw HTTP response/socket. */
17706
- constructor(raw, options = {}) {
17707
- this.raw = raw;
17708
- this.frames = [];
17709
- this.queuedBytes = 0;
17710
- this.blockedBytes = 0;
17711
- this.writing = false;
17881
+ // src/services/collaboration/ProjectRoomTaskEventSubscriber.ts
17882
+ import { isProjectLifecycleTask as isProjectLifecycleTask6 } from "@axiom-lattice/core";
17883
+ import { snapshotExactRecord as snapshotExactRecord11 } from "@axiom-lattice/protocols";
17884
+ var ProjectRoomTaskEventSubscriber = class {
17885
+ /** Creates a bounded Project task lifecycle observer. */
17886
+ constructor(deps) {
17887
+ this.deps = deps;
17888
+ this.queues = /* @__PURE__ */ new Map();
17889
+ this.pendingCount = 0;
17890
+ this.accepting = true;
17712
17891
  this.closed = false;
17713
- this.terminal = false;
17714
- this.slowConsumerAttempted = false;
17715
- this.closeListener = () => this.close();
17716
- this.errorListener = () => this.close();
17717
- this.drainListener = () => {
17718
- if (this.closed || !this.writing) return;
17719
- this.clearDrainTimer();
17720
- this.blockedBytes = 0;
17721
- this.writing = false;
17722
- this.flush();
17723
- };
17724
- this.maxFrames = positive(options.maxFrames ?? DEFAULT_MAX_FRAMES, "maxFrames");
17725
- this.maxBytes = positive(options.maxBytes ?? DEFAULT_MAX_BYTES, "maxBytes");
17726
- this.drainTimeoutMs = positive(options.drainTimeoutMs ?? DEFAULT_DRAIN_TIMEOUT_MS, "drainTimeoutMs");
17727
- this.onClose = options.onClose;
17728
- raw.on("close", this.closeListener).on("error", this.errorListener).on("drain", this.drainListener);
17892
+ this.accepted = /* @__PURE__ */ new Set();
17893
+ this.maxPending = deps.maxPending ?? 1024;
17894
+ if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1) throw new RangeError("maxPending must be a positive safe integer");
17729
17895
  }
17730
- /** Enqueues one public business event. */
17731
- enqueueBusiness(event) {
17732
- this.enqueue(serializeBusiness(event));
17896
+ /** Admits one notification without awaiting any store operation. */
17897
+ handle(value) {
17898
+ const event = this.parse(value);
17899
+ if (!event) {
17900
+ this.warn("Project task realtime notification rejected", { code: "INVALID_TASK_REALTIME_EVENT" });
17901
+ return Promise.resolve();
17902
+ }
17903
+ if (!this.accepting || this.closed) return Promise.resolve();
17904
+ const scopeKey3 = JSON.stringify([event.tenantId, event.workspaceId, event.projectId, event.taskId]);
17905
+ const eventKey = event.eventKey;
17906
+ let queue = this.queues.get(scopeKey3);
17907
+ if (!queue) {
17908
+ if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
17909
+ queue = { events: [], keys: /* @__PURE__ */ new Set(), tail: Promise.resolve() };
17910
+ this.queues.set(scopeKey3, queue);
17911
+ }
17912
+ if (queue.keys.has(eventKey)) return queue.tail;
17913
+ if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
17914
+ queue.keys.add(eventKey);
17915
+ queue.events.push(event);
17916
+ this.pendingCount += 1;
17917
+ const previousTail = queue.tail;
17918
+ queue.tail = previousTail.then(() => this.processQueue(scopeKey3, queue)).catch((error) => {
17919
+ this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", error: error instanceof Error ? error.name : "UnknownError" });
17920
+ });
17921
+ const accepted = queue.tail;
17922
+ this.accepted.add(accepted);
17923
+ void accepted.finally(() => this.accepted.delete(accepted));
17924
+ return accepted;
17733
17925
  }
17734
- /** Enqueues one connection control event. */
17735
- enqueueControl(event) {
17736
- this.enqueue(serializeControl(event));
17926
+ /** Closes admission without interrupting accepted work. */
17927
+ closeAdmission() {
17928
+ this.accepting = false;
17737
17929
  }
17738
- /** Writes a heartbeat comment when the socket is not currently blocked. */
17739
- heartbeat() {
17740
- if (!this.closed && !this.writing) this.writeFrame(": heartbeat\n\n");
17930
+ /** Drains accepted work, closing permanently if the bound expires. */
17931
+ async drain(timeoutMs = 5e3) {
17932
+ const work = Promise.allSettled([...this.accepted]).then(() => void 0);
17933
+ let timer;
17934
+ const timeout = new Promise((resolve3) => {
17935
+ timer = setTimeout(() => resolve3("timeout"), timeoutMs);
17936
+ timer.unref?.();
17937
+ });
17938
+ const outcome = await Promise.race([work.then(() => "drained"), timeout]);
17939
+ if (timer) clearTimeout(timer);
17940
+ this.closed = true;
17941
+ if (outcome === "timeout") this.queues.clear();
17741
17942
  }
17742
- /** Closes the writer and removes every socket listener exactly once. */
17743
- close() {
17744
- if (this.closed) return;
17943
+ /** Closes admission and drains accepted work. */
17944
+ async dispose() {
17945
+ this.closeAdmission();
17946
+ await this.drain();
17745
17947
  this.closed = true;
17746
- this.clearDrainTimer();
17747
- if (this.terminalTimer !== void 0) clearTimeout(this.terminalTimer);
17748
- this.terminalResolve?.();
17749
- this.terminalResolve = void 0;
17750
- this.terminalFinish = void 0;
17751
- this.raw.off("close", this.closeListener).off("error", this.errorListener).off("drain", this.drainListener);
17752
- this.frames.length = 0;
17753
- this.queuedBytes = 0;
17754
- try {
17755
- this.raw.end();
17756
- } catch {
17757
- this.raw.destroy();
17758
- }
17759
- this.onClose?.();
17760
17948
  }
17761
- /** Stops ordinary delivery and attempts one terminal control before ending. */
17762
- closeWithControl(control, deadlineMs = 250) {
17763
- if (this.closed) return Promise.resolve();
17764
- if (this.terminal) return new Promise((resolve3) => {
17765
- this.terminalResolve = resolve3;
17766
- });
17767
- this.terminal = true;
17768
- this.frames.length = 0;
17769
- this.queuedBytes = 0;
17770
- const frame = serializeControl(control);
17771
- const finish = () => {
17772
- if (this.closed) return;
17773
- if (this.terminalTimer !== void 0) clearTimeout(this.terminalTimer);
17774
- this.terminalTimer = void 0;
17775
- this.close();
17776
- };
17777
- this.terminalFinish = finish;
17778
- const promise = new Promise((resolve3) => {
17779
- this.terminalResolve = resolve3;
17780
- });
17781
- if (!this.writing) {
17949
+ async processQueue(scopeKey3, queue) {
17950
+ while (queue.events.length > 0) {
17951
+ const event = queue.events.shift();
17782
17952
  try {
17783
- if (this.raw.write(frame)) finish();
17784
- else this.armTerminalDeadline(deadlineMs, finish);
17785
- } catch {
17786
- finish();
17953
+ if (!this.closed) await this.publish(event);
17954
+ } finally {
17955
+ queue.keys.delete(event.eventKey);
17956
+ this.pendingCount -= 1;
17787
17957
  }
17788
- } else {
17789
- this.frames.push(frame);
17790
- this.flushTerminal(finish);
17791
- this.armTerminalDeadline(deadlineMs, finish);
17792
17958
  }
17793
- return promise;
17794
- }
17795
- enqueue(frame) {
17796
- if (this.closed || this.terminal) return;
17797
- const bytes = Buffer.byteLength(frame, "utf8");
17798
- const inFlightFrames = this.writing ? 1 : 0;
17799
- if (bytes > this.maxBytes || this.frames.length + inFlightFrames + 1 > this.maxFrames || this.queuedBytes + this.blockedBytes + bytes > this.maxBytes) return this.failSlowConsumer();
17800
- this.frames.push(frame);
17801
- this.queuedBytes += bytes;
17802
- this.flush();
17959
+ if (queue.events.length === 0 && this.queues.get(scopeKey3) === queue) this.queues.delete(scopeKey3);
17803
17960
  }
17804
- flush() {
17805
- if (this.closed || this.writing || this.frames.length === 0) return;
17806
- const frame = this.frames.shift();
17807
- if (!frame) return;
17808
- this.queuedBytes -= Buffer.byteLength(frame, "utf8");
17809
- if (this.terminal) this.writeTerminalFrame(frame, this.terminalFinish ?? (() => this.close()));
17810
- else this.writeFrame(frame);
17811
- }
17812
- flushTerminal(finish) {
17813
- if (this.closed || this.writing || this.frames.length === 0) return;
17814
- const frame = this.frames.shift();
17815
- if (!frame) return;
17816
- this.writeTerminalFrame(frame, finish);
17817
- }
17818
- writeTerminalFrame(frame, finish) {
17961
+ async publish(event) {
17819
17962
  try {
17820
- if (!this.raw.write(frame)) {
17821
- this.writing = true;
17822
- this.blockedBytes = Buffer.byteLength(frame, "utf8");
17823
- } else {
17824
- this.writing = false;
17825
- this.blockedBytes = 0;
17826
- (finish ?? (() => this.close()))();
17963
+ const taskValue = await this.deps.tasks.getById(event.tenantId, event.taskId);
17964
+ const task = taskValue === null ? void 0 : snapshotTaskItem(taskValue);
17965
+ if (this.closed) return;
17966
+ if (!task || !isProjectLifecycleTask6(task) || task.tenantId !== event.tenantId || task.workspaceId !== event.workspaceId || task.projectId !== event.projectId || task.status !== event.status || task.updatedAt.toISOString() !== event.updatedAt || event.threadId !== void 0 && task.context?.thread_id !== event.threadId) {
17967
+ this.warn("project-room:task-event-stale", { taskId: safeId3(event.taskId), eventKey: safeId3(event.eventKey) });
17968
+ return;
17827
17969
  }
17828
- } catch {
17829
- this.close();
17970
+ const roomValue = await this.deps.rooms.getMainRoom(event.tenantId, event.projectId);
17971
+ const room = snapshotProjectRoom(roomValue);
17972
+ if (this.closed) return;
17973
+ if (!room || room.tenantId !== event.tenantId || room.workspaceId !== event.workspaceId || room.projectId !== event.projectId) return;
17974
+ const membershipValue = await this.deps.memberships.findByAssistant(event.tenantId, event.projectId, task.ownerId);
17975
+ const membership = snapshotProjectBotMembership(membershipValue);
17976
+ if (this.closed) return;
17977
+ if (!membership || membership.tenantId !== event.tenantId || membership.workspaceId !== event.workspaceId || membership.projectId !== event.projectId || membership.roomId !== room.id || membership.assistantId !== task.ownerId) return;
17978
+ this.deps.realtime.taskChanged({
17979
+ tenantId: event.tenantId,
17980
+ roomId: room.id,
17981
+ projectId: event.projectId,
17982
+ taskId: task.id,
17983
+ status: task.status,
17984
+ ownerMembershipId: membership.id,
17985
+ updatedAt: task.updatedAt.toISOString(),
17986
+ sourceKey: `task:${task.id}:${event.eventKey}`
17987
+ });
17988
+ } catch (error) {
17989
+ this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", taskId: safeId3(event.taskId), error: error instanceof Error ? error.name : "UnknownError" });
17830
17990
  }
17831
17991
  }
17832
- armTerminalDeadline(deadlineMs, finish) {
17833
- this.terminalTimer = setTimeout(finish, deadlineMs);
17834
- this.terminalTimer.unref?.();
17992
+ parse(value) {
17993
+ const row = snapshotExactRecord11(value, ["tenantId", "workspaceId", "projectId", "taskId", "status", "action", "eventKey", "updatedAt"], ["threadId"]);
17994
+ const actions = ["in_progress", "interrupted", "failed", "completed", "cancelled", "reassigned"];
17995
+ const statuses = ["pending", "in_progress", "review", "failed", "interrupted", "completed", "cancelled"];
17996
+ if (!row || !actions.includes(String(row.action)) || !statuses.includes(String(row.status)) || !["tenantId", "workspaceId", "projectId", "taskId", "eventKey", "updatedAt"].every((key) => typeof row[key] === "string" && row[key].length > 0) || !Number.isFinite(Date.parse(row.updatedAt)) || row.threadId !== void 0 && typeof row.threadId !== "string") return void 0;
17997
+ return row;
17835
17998
  }
17836
- writeFrame(frame) {
17837
- if (this.closed) return;
17999
+ warn(message, context) {
17838
18000
  try {
17839
- if (!this.raw.write(frame)) {
17840
- this.writing = true;
17841
- this.blockedBytes = Buffer.byteLength(frame, "utf8");
17842
- this.drainTimer = setTimeout(() => {
17843
- this.drainTimer = void 0;
17844
- this.failSlowConsumer();
17845
- }, this.drainTimeoutMs);
17846
- this.drainTimer.unref?.();
17847
- } else {
17848
- this.writing = false;
17849
- this.blockedBytes = 0;
17850
- this.flush();
17851
- }
18001
+ this.deps.log.warn(message, context);
17852
18002
  } catch {
17853
- this.close();
17854
18003
  }
17855
18004
  }
17856
- clearDrainTimer() {
17857
- if (this.drainTimer !== void 0) clearTimeout(this.drainTimer);
17858
- this.drainTimer = void 0;
17859
- }
17860
- failSlowConsumer() {
17861
- if (this.closed) return;
17862
- this.frames.length = 0;
17863
- this.queuedBytes = 0;
17864
- if (!this.slowConsumerAttempted) {
17865
- this.slowConsumerAttempted = true;
17866
- try {
17867
- this.raw.write(serializeControl({ type: "resync", data: { reason: "SLOW_CONSUMER" } }));
17868
- } catch {
17869
- }
17870
- }
17871
- this.close();
18005
+ overflow(taskId) {
18006
+ this.warn("project-room:task-realtime-overflow", { code: "TASK_REALTIME_QUEUE_FULL", taskId });
18007
+ return Promise.resolve();
17872
18008
  }
17873
18009
  };
17874
- function positive(value, name) {
17875
- if (!Number.isSafeInteger(value) || value <= 0) throw new RangeError(`${name} must be positive`);
17876
- return value;
18010
+ function safeId3(value) {
18011
+ return typeof value === "string" && value.length > 0 ? value : void 0;
17877
18012
  }
17878
18013
 
17879
- // src/services/collaboration/ProjectRoomRealtimeService.ts
17880
- var MAX_REPLAY_EVENTS = 1e4;
17881
- var MAX_NODE_TIMER_DELAY = 2147e6;
17882
- var ProjectRoomRealtimeService = class {
17883
- /** Creates a service using one process-local broker and read-only authorizer. */
18014
+ // src/services/collaboration/ProjectRoomRealtimeRuntime.ts
18015
+ var ProjectRoomRealtimeRuntime = class {
17884
18016
  constructor(deps) {
17885
18017
  this.deps = deps;
17886
- this.connections = /* @__PURE__ */ new Set();
17887
- this.closed = false;
17888
- this.activeConnections = /* @__PURE__ */ new Map();
17889
- this.now = deps.now ?? Date.now;
17890
- this.authRecheckMs = deps.authRecheckMs ?? 15e3;
17891
- this.heartbeatMs = deps.heartbeatMs ?? 15e3;
17892
- }
17893
- /** Returns whether the actor's tenant/user/project stream quota has capacity. */
17894
- canConnect(actor2) {
17895
- if (this.closed) return false;
17896
- return (this.activeConnections.get(connectionKey(actor2)) ?? 0) < (this.deps.maxConnectionsPerUserProject ?? 5);
17897
- }
17898
- /** Starts a connection; authorization is assumed to have been performed by the route. */
17899
- connect(input) {
17900
- if (!this.canConnect(input.actor)) {
17901
- input.raw.end();
17902
- return;
17903
- }
17904
- const quotaKey = connectionKey(input.actor);
17905
- this.activeConnections.set(quotaKey, (this.activeConnections.get(quotaKey) ?? 0) + 1);
17906
- const writer = new ProjectRoomSseWriter(input.raw, { onClose: () => connection.close() });
17907
- let phase = "initializing";
17908
- let subscription;
17909
- let accessTimer;
17910
- let heartbeatTimer;
17911
- let expiryTimer;
17912
- const lifetimeAbort = new AbortController();
17913
- let accessAbort;
17914
- let closed = false;
17915
- const buffered = [];
17916
- const clearTimer = (timer) => {
17917
- if (timer !== void 0) clearTimeout(timer);
17918
- };
17919
- const cleanup = () => {
17920
- if (closed) return;
17921
- closed = true;
17922
- phase = "closed";
17923
- clearTimer(accessTimer);
17924
- clearTimer(heartbeatTimer);
17925
- clearTimer(expiryTimer);
17926
- lifetimeAbort.abort();
17927
- accessAbort?.abort();
17928
- subscription?.unsubscribe();
17929
- writer.close();
17930
- this.connections.delete(connection);
17931
- const remainingConnections = (this.activeConnections.get(quotaKey) ?? 1) - 1;
17932
- if (remainingConnections === 0) this.activeConnections.delete(quotaKey);
17933
- else this.activeConnections.set(quotaKey, remainingConnections);
17934
- };
17935
- const revoke = (reason) => {
17936
- if (closed) return;
17937
- void writer.closeWithControl({ type: "access.revoked", data: { reason } }).then(cleanup, cleanup);
17938
- };
17939
- const scheduleAccessCheck = () => {
17940
- if (closed) return;
17941
- accessTimer = setTimeout(() => {
17942
- accessTimer = void 0;
17943
- if (closed) return;
17944
- accessAbort = new AbortController();
17945
- const combined = combineSignals2(lifetimeAbort.signal, accessAbort.signal);
17946
- Promise.resolve().then(() => this.deps.requireReadAccess(input.actor, combined.signal)).then(() => {
17947
- combined.cleanup();
17948
- accessAbort = void 0;
17949
- scheduleAccessCheck();
17950
- }, (_error) => {
17951
- combined.cleanup();
17952
- accessAbort = void 0;
17953
- if (!closed) revoke("PROJECT_ACCESS_REVOKED");
17954
- });
17955
- }, this.authRecheckMs);
17956
- accessTimer.unref?.();
17957
- };
17958
- const connection = { close: cleanup };
17959
- this.connections.add(connection);
17960
- const scheduleHeartbeat = () => {
17961
- if (closed) return;
17962
- heartbeatTimer = setTimeout(() => {
17963
- heartbeatTimer = void 0;
17964
- if (closed) return;
17965
- writer.heartbeat();
17966
- scheduleHeartbeat();
17967
- }, this.heartbeatMs);
17968
- heartbeatTimer.unref?.();
17969
- };
17970
- scheduleHeartbeat();
17971
- const remaining = input.actor.tokenExpiresAt - this.now();
17972
- if (remaining <= 0) {
17973
- revoke("TOKEN_EXPIRED");
17974
- return;
17975
- }
17976
- const maxTimerDelay = this.deps.maxTimerDelay ?? MAX_NODE_TIMER_DELAY;
17977
- const scheduleExpiry = () => {
17978
- if (closed) return;
17979
- const delay2 = input.actor.tokenExpiresAt - this.now();
17980
- if (delay2 <= 0) {
17981
- revoke("TOKEN_EXPIRED");
17982
- return;
17983
- }
17984
- expiryTimer = setTimeout(() => {
17985
- expiryTimer = void 0;
17986
- scheduleExpiry();
17987
- }, Math.min(delay2, maxTimerDelay));
17988
- expiryTimer.unref?.();
17989
- };
17990
- scheduleExpiry();
17991
- try {
17992
- subscription = this.deps.broker.subscribe(
17993
- { tenantId: input.actor.tenantId, roomId: input.roomId, projectId: input.actor.projectId },
17994
- input.lastEventId,
17995
- (event) => {
17996
- if (phase === "initializing") buffered.push(event);
17997
- else if (phase === "direct") writer.enqueueBusiness(event);
17998
- }
17999
- );
18000
- if (subscription.replay.length > MAX_REPLAY_EVENTS) {
18001
- void writer.closeWithControl({ type: "resync", data: { reason: "CURSOR_EXPIRED" } }).then(cleanup, cleanup);
18002
- return;
18003
- }
18004
- let lastSequence = sequence(subscription.headEventId);
18005
- for (const event of subscription.replay) {
18006
- writer.enqueueBusiness(event);
18007
- lastSequence = sequence(event.id);
18008
- }
18009
- writer.enqueueControl({ type: "ready", data: { epoch: this.deps.broker.epoch, headEventId: subscription.headEventId } });
18010
- while (buffered.length > 0) {
18011
- for (const event of buffered.splice(0).sort((left, right) => sequence(left.id) - sequence(right.id))) {
18012
- if (sequence(event.id) > lastSequence) {
18013
- writer.enqueueBusiness(event);
18014
- lastSequence = sequence(event.id);
18015
- }
18016
- }
18018
+ this.accepted = /* @__PURE__ */ new Set();
18019
+ this.broker = deps.broker;
18020
+ this.publisher = deps.publisher;
18021
+ this.shutdownTimeoutMs = deps.shutdownTimeoutMs ?? 5e3;
18022
+ this.unsubscribe = deps.subscribe(((event) => {
18023
+ let work;
18024
+ try {
18025
+ work = Promise.resolve(deps.subscriber.handle(event));
18026
+ } catch (error) {
18027
+ work = Promise.reject(error);
18017
18028
  }
18018
- phase = "direct";
18019
- scheduleAccessCheck();
18020
- } catch (error) {
18021
- if (error instanceof ProjectRoomCursorError2) void writer.closeWithControl({ type: "resync", data: { reason: error.code } }).then(cleanup, cleanup);
18022
- else cleanup();
18023
- }
18029
+ const accepted = work.catch((error) => {
18030
+ deps.log.warn("project-room:task-subscriber-failed", { error: error instanceof Error ? error.name : "UnknownError" });
18031
+ });
18032
+ this.accepted.add(accepted);
18033
+ void accepted.finally(() => this.accepted.delete(accepted));
18034
+ }));
18024
18035
  }
18025
- /** Closes every connection and prevents new connections. */
18036
+ /** Stops admission, drains accepted work, and closes transport resources exactly once. */
18026
18037
  close() {
18027
- if (this.closed) return;
18028
- this.closed = true;
18029
- for (const connection of [...this.connections]) connection.close();
18038
+ this.closing ?? (this.closing = this.dispose());
18039
+ return this.closing;
18040
+ }
18041
+ async dispose() {
18042
+ this.unsubscribe();
18043
+ this.deps.subscriber.closeAdmission();
18044
+ const accepted = [...this.accepted];
18045
+ const drained = await boundedAllSettled(accepted, this.shutdownTimeoutMs);
18046
+ if (!drained) this.deps.log.warn("project-room:runtime-drain-timeout", {
18047
+ timeoutMs: this.shutdownTimeoutMs,
18048
+ pending: accepted.length
18049
+ });
18050
+ await this.deps.subscriber.drain(drained ? this.shutdownTimeoutMs : 0);
18051
+ this.broker.close();
18030
18052
  }
18031
18053
  };
18032
- function sequence(id3) {
18033
- return id3 === null ? 0 : Number(id3.slice(id3.lastIndexOf(":") + 1));
18054
+ function createProjectRoomRealtimeRuntime(deps) {
18055
+ const broker = new ProjectRoomEventBroker({ log: deps.log });
18056
+ const publisher = new BrokerProjectRoomRealtimePublisher({ broker, log: deps.log });
18057
+ const subscriber = new ProjectRoomTaskEventSubscriber({
18058
+ tasks: deps.tasks,
18059
+ rooms: deps.rooms,
18060
+ memberships: deps.memberships,
18061
+ realtime: publisher,
18062
+ log: deps.log
18063
+ });
18064
+ return new ProjectRoomRealtimeRuntime({
18065
+ broker,
18066
+ publisher,
18067
+ subscriber,
18068
+ subscribe: (listener) => taskLifecycleNotifier.subscribe(listener),
18069
+ log: deps.log,
18070
+ shutdownTimeoutMs: deps.shutdownTimeoutMs
18071
+ });
18034
18072
  }
18035
- function connectionKey(actor2) {
18036
- return JSON.stringify([actor2.tenantId, actor2.userId, actor2.projectId]);
18073
+ async function boundedAllSettled(promises, timeoutMs) {
18074
+ if (promises.length === 0) return true;
18075
+ let timer;
18076
+ const timeout = new Promise((resolve3) => {
18077
+ timer = setTimeout(() => resolve3(false), timeoutMs);
18078
+ timer.unref?.();
18079
+ });
18080
+ const result = await Promise.race([Promise.allSettled(promises).then(() => true), timeout]);
18081
+ if (timer) clearTimeout(timer);
18082
+ return result;
18037
18083
  }
18038
- function combineSignals2(first, second) {
18039
- const controller = new AbortController();
18040
- const abort = () => controller.abort();
18041
- if (first.aborted || second.aborted) abort();
18042
- else {
18043
- first.addEventListener("abort", abort, { once: true });
18044
- second.addEventListener("abort", abort, { once: true });
18045
- }
18046
- return { signal: controller.signal, cleanup: () => {
18047
- first.removeEventListener("abort", abort);
18048
- second.removeEventListener("abort", abort);
18049
- } };
18084
+
18085
+ // src/services/collaboration/WorkspaceRoomEventsService.ts
18086
+ import { PROJECT_ROOM_USER_CHANNEL_PROJECT, projectRoomUserEventScope as projectRoomUserEventScope2 } from "@axiom-lattice/protocols";
18087
+
18088
+ // src/services/collaboration/ProjectRoomSseWriter.ts
18089
+ var DEFAULT_MAX_FRAMES = 256;
18090
+ var DEFAULT_MAX_BYTES = 1024 * 1024;
18091
+ var DEFAULT_DRAIN_TIMEOUT_MS = 1e4;
18092
+ function serializeBusiness(event) {
18093
+ return `id: ${event.id}
18094
+ event: ${event.type}
18095
+ data: ${JSON.stringify(event)}
18096
+
18097
+ `;
18050
18098
  }
18099
+ function serializeControl(event) {
18100
+ return `event: ${event.type}
18101
+ data: ${JSON.stringify(event.data)}
18051
18102
 
18052
- // src/services/collaboration/ProjectRoomTaskEventSubscriber.ts
18053
- import { isProjectLifecycleTask as isProjectLifecycleTask6 } from "@axiom-lattice/core";
18054
- import { snapshotExactRecord as snapshotExactRecord11 } from "@axiom-lattice/protocols";
18055
- var ProjectRoomTaskEventSubscriber = class {
18056
- /** Creates a bounded Project task lifecycle observer. */
18057
- constructor(deps) {
18058
- this.deps = deps;
18059
- this.queues = /* @__PURE__ */ new Map();
18060
- this.pendingCount = 0;
18061
- this.accepting = true;
18103
+ `;
18104
+ }
18105
+ var ProjectRoomSseWriter = class {
18106
+ /** Creates a writer over a raw HTTP response/socket. */
18107
+ constructor(raw, options = {}) {
18108
+ this.raw = raw;
18109
+ this.frames = [];
18110
+ this.queuedBytes = 0;
18111
+ this.blockedBytes = 0;
18112
+ this.writing = false;
18062
18113
  this.closed = false;
18063
- this.accepted = /* @__PURE__ */ new Set();
18064
- this.maxPending = deps.maxPending ?? 1024;
18065
- if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1) throw new RangeError("maxPending must be a positive safe integer");
18114
+ this.terminal = false;
18115
+ this.slowConsumerAttempted = false;
18116
+ this.closeListener = () => this.close();
18117
+ this.errorListener = () => this.close();
18118
+ this.drainListener = () => {
18119
+ if (this.closed || !this.writing) return;
18120
+ this.clearDrainTimer();
18121
+ this.blockedBytes = 0;
18122
+ this.writing = false;
18123
+ this.flush();
18124
+ };
18125
+ this.maxFrames = positive(options.maxFrames ?? DEFAULT_MAX_FRAMES, "maxFrames");
18126
+ this.maxBytes = positive(options.maxBytes ?? DEFAULT_MAX_BYTES, "maxBytes");
18127
+ this.drainTimeoutMs = positive(options.drainTimeoutMs ?? DEFAULT_DRAIN_TIMEOUT_MS, "drainTimeoutMs");
18128
+ this.onClose = options.onClose;
18129
+ raw.on("close", this.closeListener).on("error", this.errorListener).on("drain", this.drainListener);
18066
18130
  }
18067
- /** Admits one notification without awaiting any store operation. */
18068
- handle(value) {
18069
- const event = this.parse(value);
18070
- if (!event) {
18071
- this.warn("Project task realtime notification rejected", { code: "INVALID_TASK_REALTIME_EVENT" });
18072
- return Promise.resolve();
18073
- }
18074
- if (!this.accepting || this.closed) return Promise.resolve();
18075
- const scopeKey3 = JSON.stringify([event.tenantId, event.workspaceId, event.projectId, event.taskId]);
18076
- const eventKey = event.eventKey;
18077
- let queue = this.queues.get(scopeKey3);
18078
- if (!queue) {
18079
- if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
18080
- queue = { events: [], keys: /* @__PURE__ */ new Set(), tail: Promise.resolve() };
18081
- this.queues.set(scopeKey3, queue);
18082
- }
18083
- if (queue.keys.has(eventKey)) return queue.tail;
18084
- if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
18085
- queue.keys.add(eventKey);
18086
- queue.events.push(event);
18087
- this.pendingCount += 1;
18088
- const previousTail = queue.tail;
18089
- queue.tail = previousTail.then(() => this.processQueue(scopeKey3, queue)).catch((error) => {
18090
- this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", error: error instanceof Error ? error.name : "UnknownError" });
18091
- });
18092
- const accepted = queue.tail;
18093
- this.accepted.add(accepted);
18094
- void accepted.finally(() => this.accepted.delete(accepted));
18095
- return accepted;
18131
+ /** Enqueues one public business event. */
18132
+ enqueueBusiness(event) {
18133
+ this.enqueue(serializeBusiness(event));
18096
18134
  }
18097
- /** Closes admission without interrupting accepted work. */
18098
- closeAdmission() {
18099
- this.accepting = false;
18135
+ /** Enqueues one connection control event. */
18136
+ enqueueControl(event) {
18137
+ this.enqueue(serializeControl(event));
18100
18138
  }
18101
- /** Drains accepted work, closing permanently if the bound expires. */
18102
- async drain(timeoutMs = 5e3) {
18103
- const work = Promise.allSettled([...this.accepted]).then(() => void 0);
18104
- let timer;
18105
- const timeout = new Promise((resolve3) => {
18106
- timer = setTimeout(() => resolve3("timeout"), timeoutMs);
18107
- timer.unref?.();
18108
- });
18109
- const outcome = await Promise.race([work.then(() => "drained"), timeout]);
18110
- if (timer) clearTimeout(timer);
18111
- this.closed = true;
18112
- if (outcome === "timeout") this.queues.clear();
18139
+ /** Enqueues a pre-serialized SSE frame (used by scoped multi-room streams). */
18140
+ enqueueRaw(frame) {
18141
+ this.enqueue(frame);
18113
18142
  }
18114
- /** Closes admission and drains accepted work. */
18115
- async dispose() {
18116
- this.closeAdmission();
18117
- await this.drain();
18143
+ /** Writes a heartbeat comment when the socket is not currently blocked. */
18144
+ heartbeat() {
18145
+ if (!this.closed && !this.writing) this.writeFrame(": heartbeat\n\n");
18146
+ }
18147
+ /** Closes the writer and removes every socket listener exactly once. */
18148
+ close() {
18149
+ if (this.closed) return;
18118
18150
  this.closed = true;
18151
+ this.clearDrainTimer();
18152
+ if (this.terminalTimer !== void 0) clearTimeout(this.terminalTimer);
18153
+ this.terminalResolve?.();
18154
+ this.terminalResolve = void 0;
18155
+ this.terminalFinish = void 0;
18156
+ this.raw.off("close", this.closeListener).off("error", this.errorListener).off("drain", this.drainListener);
18157
+ this.frames.length = 0;
18158
+ this.queuedBytes = 0;
18159
+ try {
18160
+ this.raw.end();
18161
+ } catch {
18162
+ this.raw.destroy();
18163
+ }
18164
+ this.onClose?.();
18119
18165
  }
18120
- async processQueue(scopeKey3, queue) {
18121
- while (queue.events.length > 0) {
18122
- const event = queue.events.shift();
18166
+ /** Stops ordinary delivery and attempts one terminal control before ending. */
18167
+ closeWithControl(control, deadlineMs = 250) {
18168
+ if (this.closed) return Promise.resolve();
18169
+ if (this.terminal) return new Promise((resolve3) => {
18170
+ this.terminalResolve = resolve3;
18171
+ });
18172
+ this.terminal = true;
18173
+ this.frames.length = 0;
18174
+ this.queuedBytes = 0;
18175
+ const frame = serializeControl(control);
18176
+ const finish = () => {
18177
+ if (this.closed) return;
18178
+ if (this.terminalTimer !== void 0) clearTimeout(this.terminalTimer);
18179
+ this.terminalTimer = void 0;
18180
+ this.close();
18181
+ };
18182
+ this.terminalFinish = finish;
18183
+ const promise = new Promise((resolve3) => {
18184
+ this.terminalResolve = resolve3;
18185
+ });
18186
+ if (!this.writing) {
18123
18187
  try {
18124
- if (!this.closed) await this.publish(event);
18125
- } finally {
18126
- queue.keys.delete(event.eventKey);
18127
- this.pendingCount -= 1;
18188
+ if (this.raw.write(frame)) finish();
18189
+ else this.armTerminalDeadline(deadlineMs, finish);
18190
+ } catch {
18191
+ finish();
18128
18192
  }
18193
+ } else {
18194
+ this.frames.push(frame);
18195
+ this.flushTerminal(finish);
18196
+ this.armTerminalDeadline(deadlineMs, finish);
18129
18197
  }
18130
- if (queue.events.length === 0 && this.queues.get(scopeKey3) === queue) this.queues.delete(scopeKey3);
18198
+ return promise;
18131
18199
  }
18132
- async publish(event) {
18200
+ enqueue(frame) {
18201
+ if (this.closed || this.terminal) return;
18202
+ const bytes = Buffer.byteLength(frame, "utf8");
18203
+ const inFlightFrames = this.writing ? 1 : 0;
18204
+ if (bytes > this.maxBytes || this.frames.length + inFlightFrames + 1 > this.maxFrames || this.queuedBytes + this.blockedBytes + bytes > this.maxBytes) return this.failSlowConsumer();
18205
+ this.frames.push(frame);
18206
+ this.queuedBytes += bytes;
18207
+ this.flush();
18208
+ }
18209
+ flush() {
18210
+ if (this.closed || this.writing || this.frames.length === 0) return;
18211
+ const frame = this.frames.shift();
18212
+ if (!frame) return;
18213
+ this.queuedBytes -= Buffer.byteLength(frame, "utf8");
18214
+ if (this.terminal) this.writeTerminalFrame(frame, this.terminalFinish ?? (() => this.close()));
18215
+ else this.writeFrame(frame);
18216
+ }
18217
+ flushTerminal(finish) {
18218
+ if (this.closed || this.writing || this.frames.length === 0) return;
18219
+ const frame = this.frames.shift();
18220
+ if (!frame) return;
18221
+ this.writeTerminalFrame(frame, finish);
18222
+ }
18223
+ writeTerminalFrame(frame, finish) {
18133
18224
  try {
18134
- const taskValue = await this.deps.tasks.getById(event.tenantId, event.taskId);
18135
- const task = taskValue === null ? void 0 : snapshotTaskItem(taskValue);
18136
- if (this.closed) return;
18137
- if (!task || !isProjectLifecycleTask6(task) || task.tenantId !== event.tenantId || task.workspaceId !== event.workspaceId || task.projectId !== event.projectId || task.status !== event.status || task.updatedAt.toISOString() !== event.updatedAt || event.threadId !== void 0 && task.context?.thread_id !== event.threadId) {
18138
- this.warn("project-room:task-event-stale", { taskId: safeId3(event.taskId), eventKey: safeId3(event.eventKey) });
18139
- return;
18140
- }
18141
- const roomValue = await this.deps.rooms.getMainRoom(event.tenantId, event.projectId);
18142
- const room = snapshotProjectRoom(roomValue);
18143
- if (this.closed) return;
18144
- if (!room || room.tenantId !== event.tenantId || room.workspaceId !== event.workspaceId || room.projectId !== event.projectId) return;
18145
- const membershipValue = await this.deps.memberships.findByAssistant(event.tenantId, event.projectId, task.ownerId);
18146
- const membership = snapshotProjectBotMembership(membershipValue);
18147
- if (this.closed) return;
18148
- if (!membership || membership.tenantId !== event.tenantId || membership.workspaceId !== event.workspaceId || membership.projectId !== event.projectId || membership.roomId !== room.id || membership.assistantId !== task.ownerId) return;
18149
- this.deps.realtime.taskChanged({
18150
- tenantId: event.tenantId,
18151
- roomId: room.id,
18152
- projectId: event.projectId,
18153
- taskId: task.id,
18154
- status: task.status,
18155
- ownerMembershipId: membership.id,
18156
- updatedAt: task.updatedAt.toISOString(),
18157
- sourceKey: `task:${task.id}:${event.eventKey}`
18158
- });
18159
- } catch (error) {
18160
- this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", taskId: safeId3(event.taskId), error: error instanceof Error ? error.name : "UnknownError" });
18225
+ if (!this.raw.write(frame)) {
18226
+ this.writing = true;
18227
+ this.blockedBytes = Buffer.byteLength(frame, "utf8");
18228
+ } else {
18229
+ this.writing = false;
18230
+ this.blockedBytes = 0;
18231
+ (finish ?? (() => this.close()))();
18232
+ }
18233
+ } catch {
18234
+ this.close();
18161
18235
  }
18162
18236
  }
18163
- parse(value) {
18164
- const row = snapshotExactRecord11(value, ["tenantId", "workspaceId", "projectId", "taskId", "status", "action", "eventKey", "updatedAt"], ["threadId"]);
18165
- const actions = ["in_progress", "interrupted", "failed", "completed", "cancelled", "reassigned"];
18166
- const statuses = ["pending", "in_progress", "review", "failed", "interrupted", "completed", "cancelled"];
18167
- if (!row || !actions.includes(String(row.action)) || !statuses.includes(String(row.status)) || !["tenantId", "workspaceId", "projectId", "taskId", "eventKey", "updatedAt"].every((key) => typeof row[key] === "string" && row[key].length > 0) || !Number.isFinite(Date.parse(row.updatedAt)) || row.threadId !== void 0 && typeof row.threadId !== "string") return void 0;
18168
- return row;
18237
+ armTerminalDeadline(deadlineMs, finish) {
18238
+ this.terminalTimer = setTimeout(finish, deadlineMs);
18239
+ this.terminalTimer.unref?.();
18169
18240
  }
18170
- warn(message, context) {
18241
+ writeFrame(frame) {
18242
+ if (this.closed) return;
18171
18243
  try {
18172
- this.deps.log.warn(message, context);
18244
+ if (!this.raw.write(frame)) {
18245
+ this.writing = true;
18246
+ this.blockedBytes = Buffer.byteLength(frame, "utf8");
18247
+ this.drainTimer = setTimeout(() => {
18248
+ this.drainTimer = void 0;
18249
+ this.failSlowConsumer();
18250
+ }, this.drainTimeoutMs);
18251
+ this.drainTimer.unref?.();
18252
+ } else {
18253
+ this.writing = false;
18254
+ this.blockedBytes = 0;
18255
+ this.flush();
18256
+ }
18173
18257
  } catch {
18258
+ this.close();
18174
18259
  }
18175
18260
  }
18176
- overflow(taskId) {
18177
- this.warn("project-room:task-realtime-overflow", { code: "TASK_REALTIME_QUEUE_FULL", taskId });
18178
- return Promise.resolve();
18261
+ clearDrainTimer() {
18262
+ if (this.drainTimer !== void 0) clearTimeout(this.drainTimer);
18263
+ this.drainTimer = void 0;
18264
+ }
18265
+ failSlowConsumer() {
18266
+ if (this.closed) return;
18267
+ this.frames.length = 0;
18268
+ this.queuedBytes = 0;
18269
+ if (!this.slowConsumerAttempted) {
18270
+ this.slowConsumerAttempted = true;
18271
+ try {
18272
+ this.raw.write(serializeControl({ type: "resync", data: { reason: "SLOW_CONSUMER" } }));
18273
+ } catch {
18274
+ }
18275
+ }
18276
+ this.close();
18179
18277
  }
18180
18278
  };
18181
- function safeId3(value) {
18182
- return typeof value === "string" && value.length > 0 ? value : void 0;
18279
+ function positive(value, name) {
18280
+ if (!Number.isSafeInteger(value) || value <= 0) throw new RangeError(`${name} must be positive`);
18281
+ return value;
18183
18282
  }
18184
18283
 
18185
- // src/services/collaboration/ProjectRoomRealtimeRuntime.ts
18186
- var ProjectRoomRealtimeRuntime = class {
18284
+ // src/services/collaboration/WorkspaceRoomEventsService.ts
18285
+ var MAX_NODE_TIMER_DELAY = 2147e6;
18286
+ var WorkspaceRoomEventsService = class {
18287
+ /** Creates a service over the shared process-local broker. */
18187
18288
  constructor(deps) {
18188
18289
  this.deps = deps;
18189
- this.accepted = /* @__PURE__ */ new Set();
18190
- this.broker = deps.broker;
18191
- this.publisher = deps.publisher;
18192
- this.service = deps.service;
18193
- this.shutdownTimeoutMs = deps.shutdownTimeoutMs ?? 5e3;
18194
- this.unsubscribe = deps.subscribe(((event) => {
18195
- let work;
18196
- try {
18197
- work = Promise.resolve(deps.subscriber.handle(event));
18198
- } catch (error) {
18199
- work = Promise.reject(error);
18200
- }
18201
- const accepted = work.catch((error) => {
18202
- deps.log.warn("project-room:task-subscriber-failed", { error: error instanceof Error ? error.name : "UnknownError" });
18203
- });
18204
- this.accepted.add(accepted);
18205
- void accepted.finally(() => this.accepted.delete(accepted));
18206
- }));
18290
+ this.connections = /* @__PURE__ */ new Map();
18291
+ this.closed = false;
18292
+ this.now = deps.now ?? Date.now;
18293
+ this.heartbeatMs = deps.heartbeatMs ?? 15e3;
18294
+ this.authRecheckMs = deps.authRecheckMs ?? 15e3;
18295
+ this.maxConnectionsPerUser = deps.maxConnectionsPerUser ?? 2;
18296
+ this.maxTimerDelay = deps.maxTimerDelay ?? MAX_NODE_TIMER_DELAY;
18207
18297
  }
18208
- /** Stops admission, drains accepted work, and closes transport resources exactly once. */
18298
+ /** Starts a live-only connection; the route performs authentication beforehand. */
18299
+ connect(input) {
18300
+ if (this.closed) {
18301
+ input.raw.end();
18302
+ return;
18303
+ }
18304
+ const userKey = JSON.stringify([input.actor.tenantId, input.actor.userId]);
18305
+ const active = this.connections.get(userKey) ?? /* @__PURE__ */ new Set();
18306
+ if (active.size >= this.maxConnectionsPerUser) {
18307
+ const oldest = [...active].sort((left, right) => left.startedAt - right.startedAt)[0];
18308
+ oldest?.supersede();
18309
+ }
18310
+ const connection = this.buildConnection(input.actor, input.workspaceId, input.raw);
18311
+ active.add(connection);
18312
+ this.connections.set(userKey, active);
18313
+ }
18314
+ /** Closes every connection and stops admitting new ones. */
18209
18315
  close() {
18210
- this.closing ?? (this.closing = this.dispose());
18211
- return this.closing;
18316
+ if (this.closed) return;
18317
+ this.closed = true;
18318
+ for (const active of [...this.connections.values()]) for (const connection of [...active]) connection.close();
18319
+ this.connections.clear();
18212
18320
  }
18213
- async dispose() {
18214
- this.unsubscribe();
18215
- this.deps.subscriber.closeAdmission();
18216
- const accepted = [...this.accepted];
18217
- const drained = await boundedAllSettled(accepted, this.shutdownTimeoutMs);
18218
- if (!drained) this.deps.log.warn("project-room:runtime-drain-timeout", {
18219
- timeoutMs: this.shutdownTimeoutMs,
18220
- pending: accepted.length
18321
+ buildConnection(actor2, workspaceId, raw) {
18322
+ let phase = "initializing";
18323
+ const subscriptions = /* @__PURE__ */ new Map();
18324
+ let heartbeatTimer;
18325
+ let accessTimer;
18326
+ let expiryTimer;
18327
+ let closed = false;
18328
+ const recordRef = {};
18329
+ let rebuildTail = Promise.resolve(true);
18330
+ const lifetimeAbort = new AbortController();
18331
+ const clear = (timer) => {
18332
+ if (timer !== void 0) clearTimeout(timer);
18333
+ };
18334
+ const userScope = projectRoomUserEventScope2(actor2.tenantId, actor2.userId);
18335
+ const userScopeKey = JSON.stringify([userScope.tenantId, userScope.roomId, userScope.projectId]);
18336
+ const roomScopeKey = (scope) => JSON.stringify([scope.tenantId, scope.roomId, scope.projectId]);
18337
+ const serializeScoped = (scope, event) => scope === null ? `id: ${event.id}
18338
+ event: ${event.type}
18339
+ data: ${JSON.stringify(event)}
18340
+
18341
+ ` : `id: ${event.id}
18342
+ event: ${event.type}
18343
+ data: ${JSON.stringify({ ...event, scope })}
18344
+
18345
+ `;
18346
+ const writer = new ProjectRoomSseWriter(raw, { onClose: () => cleanup() });
18347
+ const cleanup = () => {
18348
+ if (closed) return;
18349
+ closed = true;
18350
+ phase = "closed";
18351
+ clear(heartbeatTimer);
18352
+ clear(accessTimer);
18353
+ clear(expiryTimer);
18354
+ lifetimeAbort.abort();
18355
+ for (const entry of subscriptions.values()) entry.unsubscribe();
18356
+ subscriptions.clear();
18357
+ writer.close();
18358
+ const userKey = JSON.stringify([actor2.tenantId, actor2.userId]);
18359
+ const active = this.connections.get(userKey);
18360
+ if (active && recordRef.current !== void 0) {
18361
+ active.delete(recordRef.current);
18362
+ if (active.size === 0) this.connections.delete(userKey);
18363
+ }
18364
+ };
18365
+ const revoke = (reason) => {
18366
+ if (closed) return;
18367
+ void writer.closeWithControl({ type: "access.revoked", data: { reason } }).then(cleanup, cleanup);
18368
+ };
18369
+ const record = {
18370
+ startedAt: this.now(),
18371
+ supersede: () => revoke("CONNECTION_SUPERSEDED"),
18372
+ close: cleanup
18373
+ };
18374
+ recordRef.current = record;
18375
+ const rebuildSubscriptions = async () => {
18376
+ try {
18377
+ const rooms = await this.deps.listMemberRooms({ tenantId: actor2.tenantId, userId: actor2.userId, workspaceId });
18378
+ if (closed) return true;
18379
+ const wanted = /* @__PURE__ */ new Map();
18380
+ for (const room of rooms) {
18381
+ const scope = { tenantId: actor2.tenantId, roomId: room.roomId, projectId: room.projectId };
18382
+ wanted.set(roomScopeKey(scope), scope);
18383
+ }
18384
+ for (const [key, entry] of [...subscriptions]) {
18385
+ if (key === userScopeKey || wanted.has(key)) continue;
18386
+ entry.unsubscribe();
18387
+ subscriptions.delete(key);
18388
+ }
18389
+ for (const [key, scope] of wanted) {
18390
+ if (subscriptions.has(key)) continue;
18391
+ const subscription = this.deps.broker.subscribe(scope, void 0, roomListener(scope));
18392
+ subscriptions.set(key, { scope, unsubscribe: subscription.unsubscribe });
18393
+ }
18394
+ if (!subscriptions.has(userScopeKey)) {
18395
+ const subscription = this.deps.broker.subscribe(userScope, void 0, userListener);
18396
+ subscriptions.set(userScopeKey, { scope: userScope, unsubscribe: subscription.unsubscribe });
18397
+ }
18398
+ return true;
18399
+ } catch (error) {
18400
+ this.deps.log.warn("workspace-room-events:resubscribe-failed", {
18401
+ error: error instanceof Error ? error.message : String(error)
18402
+ });
18403
+ return false;
18404
+ }
18405
+ };
18406
+ const enqueueRebuild = () => {
18407
+ rebuildTail = rebuildTail.then(rebuildSubscriptions, rebuildSubscriptions);
18408
+ };
18409
+ const userListener = (event) => {
18410
+ if (phase === "live") writer.enqueueRaw(serializeScoped(null, event));
18411
+ if (event.type === "membership.affected") enqueueRebuild();
18412
+ };
18413
+ const roomListener = (scope) => (event) => {
18414
+ if (phase === "live") writer.enqueueRaw(serializeScoped(scope, event));
18415
+ };
18416
+ const scheduleExpiry = () => {
18417
+ if (closed) return;
18418
+ const delay2 = actor2.tokenExpiresAt - this.now();
18419
+ if (delay2 <= 0) {
18420
+ revoke("TOKEN_EXPIRED");
18421
+ return;
18422
+ }
18423
+ expiryTimer = setTimeout(() => {
18424
+ expiryTimer = void 0;
18425
+ scheduleExpiry();
18426
+ }, Math.min(delay2, this.maxTimerDelay));
18427
+ expiryTimer.unref?.();
18428
+ };
18429
+ const scheduleHeartbeat = () => {
18430
+ if (closed) return;
18431
+ heartbeatTimer = setTimeout(() => {
18432
+ heartbeatTimer = void 0;
18433
+ if (closed) return;
18434
+ writer.heartbeat();
18435
+ scheduleHeartbeat();
18436
+ }, this.heartbeatMs);
18437
+ heartbeatTimer.unref?.();
18438
+ };
18439
+ const scheduleAccessCheck = () => {
18440
+ if (closed) return;
18441
+ accessTimer = setTimeout(() => {
18442
+ accessTimer = void 0;
18443
+ if (closed) return;
18444
+ const projectIds = [...subscriptions.values()].map((entry) => entry.scope.projectId).filter((projectId) => projectId !== PROJECT_ROOM_USER_CHANNEL_PROJECT);
18445
+ Promise.all(projectIds.map((projectId) => Promise.resolve().then(() => this.deps.requireReadAccess({ tenantId: actor2.tenantId, userId: actor2.userId, projectId })))).then(() => {
18446
+ if (!closed) scheduleAccessCheck();
18447
+ }, () => {
18448
+ if (!closed) revoke("PROJECT_ACCESS_REVOKED");
18449
+ });
18450
+ }, this.authRecheckMs);
18451
+ accessTimer.unref?.();
18452
+ };
18453
+ scheduleHeartbeat();
18454
+ enqueueRebuild();
18455
+ const initialRebuild = rebuildTail;
18456
+ void initialRebuild.then((ok) => {
18457
+ if (closed) return;
18458
+ if (!ok) {
18459
+ cleanup();
18460
+ return;
18461
+ }
18462
+ writer.enqueueControl({ type: "ready", data: { epoch: this.deps.broker.epoch, headEventId: null } });
18463
+ phase = "live";
18464
+ scheduleExpiry();
18465
+ scheduleAccessCheck();
18221
18466
  });
18222
- await this.deps.subscriber.drain(drained ? this.shutdownTimeoutMs : 0);
18223
- this.service.close();
18224
- this.broker.close();
18467
+ return record;
18225
18468
  }
18226
18469
  };
18227
- function createProjectRoomRealtimeRuntime(deps) {
18228
- const broker = new ProjectRoomEventBroker({ log: deps.log });
18229
- const publisher = new BrokerProjectRoomRealtimePublisher({ broker, log: deps.log });
18230
- const service2 = new ProjectRoomRealtimeService({ broker, log: deps.log, requireReadAccess: deps.requireReadAccess });
18231
- const subscriber = new ProjectRoomTaskEventSubscriber({
18232
- tasks: deps.tasks,
18233
- rooms: deps.rooms,
18234
- memberships: deps.memberships,
18235
- realtime: publisher,
18236
- log: deps.log
18237
- });
18238
- return new ProjectRoomRealtimeRuntime({
18239
- broker,
18240
- publisher,
18241
- service: service2,
18242
- subscriber,
18243
- subscribe: (listener) => taskLifecycleNotifier.subscribe(listener),
18244
- log: deps.log,
18245
- shutdownTimeoutMs: deps.shutdownTimeoutMs
18246
- });
18247
- }
18248
- async function boundedAllSettled(promises, timeoutMs) {
18249
- if (promises.length === 0) return true;
18250
- let timer;
18251
- const timeout = new Promise((resolve3) => {
18252
- timer = setTimeout(() => resolve3(false), timeoutMs);
18253
- timer.unref?.();
18254
- });
18255
- const result = await Promise.race([Promise.allSettled(promises).then(() => true), timeout]);
18256
- if (timer) clearTimeout(timer);
18257
- return result;
18470
+
18471
+ // src/services/collaboration/WorkspaceMemberRoomLister.ts
18472
+ function createWorkspaceMemberRoomLister(deps) {
18473
+ return async (input) => {
18474
+ const projects = await deps.projects.getProjectsByWorkspace(input.tenantId, input.workspaceId);
18475
+ const memberRooms = [];
18476
+ for (const project of projects) {
18477
+ const membership = await deps.memberships.findByUser(input.tenantId, project.id, input.userId);
18478
+ if (!membership || membership.status !== "active") continue;
18479
+ const room = await deps.rooms.getMainRoom(input.tenantId, project.id);
18480
+ if (room) memberRooms.push({ projectId: project.id, roomId: room.id });
18481
+ }
18482
+ return memberRooms;
18483
+ };
18258
18484
  }
18259
18485
 
18260
- // src/routes/project-room-events.ts
18261
- import { isProjectRoomEventId, snapshotExactRecord as snapshotExactRecord12 } from "@axiom-lattice/protocols";
18262
- function registerProjectRoomEventRoutes(app2, deps) {
18263
- app2.get("/api/projects/:projectId/room/events", async (request, reply) => {
18486
+ // src/routes/workspace-room-events.ts
18487
+ import { snapshotExactRecord as snapshotExactRecord12 } from "@axiom-lattice/protocols";
18488
+ function registerWorkspaceRoomEventRoutes(app2, deps) {
18489
+ app2.get("/api/workspaces/:workspaceId/room-events", async (request, reply) => {
18264
18490
  try {
18265
- const projectId = exactProjectId(request.params);
18266
- const headers = strictHeaders(request, true);
18491
+ const params = exactParams(request.params);
18492
+ const headers = strictHeaders(request);
18267
18493
  if (request.body !== void 0 || Object.keys(request.query).length !== 0) return invalid(reply);
18268
18494
  const session = verifyConsoleSessionAuthHeader(headers.authorization, deps.tokenSecret);
18269
18495
  if (!session?.tenantId) return unauthorized(reply);
18270
- await deps.access.requireExistingProjectAccess({ tenantId: session.tenantId, userId: session.id, projectId, capability: "read" });
18271
- const room = exactRoom(await deps.rooms.getMainRoom(session.tenantId, projectId), session.tenantId, projectId);
18272
- if (!room) return reply.code(404).send({ success: false, error: { code: "PROJECT_ROOM_NOT_FOUND", message: "Project room not found", retryable: false } });
18273
- const actor2 = { tenantId: session.tenantId, userId: session.id, projectId, tokenExpiresAt: session.expiresAt };
18274
- if (!deps.realtime.canConnect(actor2)) return reply.code(429).send({ success: false, error: { code: "PROJECT_ROOM_STREAM_LIMIT", message: "Project room stream limit reached", retryable: true } });
18275
18496
  reply.hijack();
18276
18497
  reply.raw.writeHead(200, {
18277
18498
  "Content-Type": "text/event-stream",
@@ -18280,53 +18501,35 @@ function registerProjectRoomEventRoutes(app2, deps) {
18280
18501
  "X-Accel-Buffering": "no",
18281
18502
  "Access-Control-Allow-Origin": "*"
18282
18503
  });
18283
- deps.realtime.connect({ actor: actor2, roomId: room.id, ...headers.lastEventId ? { lastEventId: headers.lastEventId } : {}, raw: reply.raw });
18284
- } catch (error) {
18285
- return routeError(reply, error);
18286
- }
18287
- });
18288
- app2.get("/api/projects/:projectId/room/realtime-mode", async (request, reply) => {
18289
- try {
18290
- const projectId = exactProjectId(request.params);
18291
- const headers = strictHeaders(request, false);
18292
- if (request.body !== void 0 || Object.keys(request.query).length !== 0) return invalid(reply);
18293
- const session = verifyConsoleSessionAuthHeader(headers.authorization, deps.tokenSecret);
18294
- if (!session?.tenantId) return unauthorized(reply);
18295
- await deps.access.requireExistingProjectAccess({ tenantId: session.tenantId, userId: session.id, projectId, capability: "read" });
18296
- return reply.send({ success: true, data: { mode: "single-gateway", supportedGatewayProcesses: 1, durableReplay: false, epoch: deps.broker.epoch } });
18504
+ deps.service.connect({
18505
+ actor: { tenantId: session.tenantId, userId: session.id, tokenExpiresAt: session.expiresAt },
18506
+ workspaceId: params.workspaceId,
18507
+ raw: reply.raw
18508
+ });
18297
18509
  } catch (error) {
18298
18510
  return routeError(reply, error);
18299
18511
  }
18300
18512
  });
18301
18513
  }
18302
- function strictHeaders(request, requireSse) {
18514
+ function exactParams(params) {
18515
+ const value = snapshotExactRecord12(params, ["workspaceId"]);
18516
+ if (!value || typeof value.workspaceId !== "string" || !value.workspaceId.trim()) throw new InvalidRealtimeRequestError();
18517
+ return { workspaceId: value.workspaceId };
18518
+ }
18519
+ function strictHeaders(request) {
18303
18520
  const raw = request.raw.rawHeaders;
18304
18521
  const values = (name) => raw.flatMap((value, index) => index % 2 === 0 && value.toLowerCase() === name ? [raw[index + 1]] : []);
18305
18522
  const authorization = values("authorization");
18306
18523
  const accept = values("accept");
18307
18524
  const cursor = values("last-event-id");
18308
- if (authorization.length !== 1 || authorization[0].includes(",") || cursor.length > 1 || cursor.some((value) => value.includes(",")) || requireSse && (accept.length !== 1 || !isSseAccept(accept[0]))) {
18309
- throw new InvalidRealtimeRequestError();
18310
- }
18311
- const lastEventId = cursor[0]?.trim();
18312
- if (lastEventId !== void 0 && (!lastEventId || !isProjectRoomEventId(lastEventId))) throw new InvalidRealtimeRequestError();
18313
- return { authorization: authorization[0], ...lastEventId ? { lastEventId } : {} };
18525
+ if (authorization.length !== 1 || authorization[0].includes(",") || cursor.length > 0 || accept.length !== 1 || !isSseAccept(accept[0])) throw new InvalidRealtimeRequestError();
18526
+ return { authorization: authorization[0] };
18314
18527
  }
18315
18528
  function isSseAccept(value) {
18316
18529
  if (value.includes(",")) return false;
18317
18530
  const [mediaType, ...parameters] = value.split(";");
18318
18531
  return mediaType.trim() === "text/event-stream" && parameters.every((parameter) => /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\s*=\s*(?:[!#$%&'*+.^_`|~0-9A-Za-z-]+|"[^"]*")$/.test(parameter.trim()));
18319
18532
  }
18320
- function exactProjectId(params) {
18321
- const value = snapshotExactRecord12(params, ["projectId"]);
18322
- if (!value || typeof value.projectId !== "string" || !value.projectId.trim()) throw new InvalidRealtimeRequestError();
18323
- return value.projectId;
18324
- }
18325
- function exactRoom(value, tenantId, projectId) {
18326
- if (!value || typeof value !== "object") return void 0;
18327
- const room = value;
18328
- return typeof room.id === "string" && room.id && room.tenantId === tenantId && room.projectId === projectId ? { id: room.id } : void 0;
18329
- }
18330
18533
  var InvalidRealtimeRequestError = class extends Error {
18331
18534
  };
18332
18535
  function invalid(reply) {
@@ -18337,7 +18540,6 @@ function unauthorized(reply) {
18337
18540
  }
18338
18541
  function routeError(reply, error) {
18339
18542
  if (error instanceof InvalidRealtimeRequestError) return invalid(reply);
18340
- if (error instanceof ProjectCollaborationError) return reply.code(error.statusCode).send({ success: false, error: { code: error.code, message: error.message, retryable: false } });
18341
18543
  return reply.code(500).send({ success: false, error: { code: "INTERNAL_ERROR", message: "Internal server error", retryable: false } });
18342
18544
  }
18343
18545
 
@@ -18476,6 +18678,7 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
18476
18678
  const projectRoomStore = getStoreLattice16("default", "projectRoom").store;
18477
18679
  const projectBotMembershipStore = getStoreLattice16("default", "projectBotMembership").store;
18478
18680
  const projectRoomMessageStore = getStoreLattice16("default", "projectRoomMessage").store;
18681
+ const projectRoomReadStateStore = getStoreLattice16("default", "projectRoomReadState").store;
18479
18682
  const threadStore = getStoreLattice16("default", "thread").store;
18480
18683
  const taskStore = getStoreLattice16("default", "task").store;
18481
18684
  const taskWorkItemStore = getStoreLattice16("default", "taskWorkItem").store;
@@ -18487,23 +18690,30 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
18487
18690
  tasks: taskStore,
18488
18691
  rooms: projectRoomStore,
18489
18692
  memberships: projectBotMembershipStore,
18490
- log: realtimeLog,
18491
- requireReadAccess: async (actor2) => {
18492
- await accessService.requireExistingProjectAccess({
18493
- tenantId: actor2.tenantId,
18494
- userId: actor2.userId,
18495
- projectId: actor2.projectId,
18496
- capability: "read"
18497
- });
18498
- }
18693
+ log: realtimeLog
18499
18694
  }) : void 0;
18500
18695
  if (projectRoomRealtimeRuntime) {
18501
18696
  app2.addHook("onClose", async () => projectRoomRealtimeRuntime?.close());
18502
- registerProjectRoomEventRoutes(app2, {
18503
- access: accessService,
18504
- rooms: projectRoomStore,
18505
- realtime: projectRoomRealtimeRuntime.service,
18697
+ const workspaceRoomEventsService = new WorkspaceRoomEventsService({
18506
18698
  broker: projectRoomRealtimeRuntime.broker,
18699
+ listMemberRooms: createWorkspaceMemberRoomLister({
18700
+ projects: projectStore,
18701
+ memberships: projectMembershipStore,
18702
+ rooms: projectRoomStore
18703
+ }),
18704
+ requireReadAccess: async (input) => {
18705
+ await accessService.requireExistingProjectAccess({
18706
+ tenantId: input.tenantId,
18707
+ userId: input.userId,
18708
+ projectId: input.projectId,
18709
+ capability: "read"
18710
+ });
18711
+ },
18712
+ log: realtimeLog
18713
+ });
18714
+ app2.addHook("onClose", async () => workspaceRoomEventsService.close());
18715
+ registerWorkspaceRoomEventRoutes(app2, {
18716
+ service: workspaceRoomEventsService,
18507
18717
  tokenSecret: resolveConsoleTokenSecret(process.env.AUTH_REQUIRED === "true")
18508
18718
  });
18509
18719
  }
@@ -18585,7 +18795,24 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
18585
18795
  saveBot: projectBotMembershipStore.save.bind(projectBotMembershipStore),
18586
18796
  ensureCoordinator: (tenantId) => coordinatorProvisioner.ensure(tenantId)
18587
18797
  });
18588
- registerProjectRoomRoutes(app2, { roomService, membershipService, messageService });
18798
+ const readStateService = {
18799
+ mark: async (actorRef) => {
18800
+ await accessService.requireExistingProjectAccess({ ...actorRef, capability: "read" });
18801
+ const room = await projectRoomStore.getMainRoom(actorRef.tenantId, actorRef.projectId);
18802
+ if (!room) return;
18803
+ const lastReadAt = /* @__PURE__ */ new Date();
18804
+ await projectRoomReadStateStore.markRead({ tenantId: actorRef.tenantId, roomId: room.id, userId: actorRef.userId, lastReadAt });
18805
+ projectRoomRealtimeRuntime?.publisher.readChanged({
18806
+ tenantId: actorRef.tenantId,
18807
+ userId: actorRef.userId,
18808
+ projectId: actorRef.projectId,
18809
+ roomId: room.id,
18810
+ lastReadAt: lastReadAt.toISOString(),
18811
+ sourceKey: `read:${actorRef.userId}:${room.id}:${lastReadAt.getTime()}`
18812
+ });
18813
+ }
18814
+ };
18815
+ registerProjectRoomRoutes(app2, { roomService, membershipService, messageService, readStateService });
18589
18816
  registerProjectRosterRoutes(app2, { service: rosterService });
18590
18817
  registerCoSpaceRoutes(app2, {
18591
18818
  projectStore: {
@@ -18607,7 +18834,11 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
18607
18834
  },
18608
18835
  messageStore: {
18609
18836
  list: projectRoomMessageStore.list.bind(projectRoomMessageStore),
18610
- create: projectRoomMessageStore.create.bind(projectRoomMessageStore)
18837
+ create: projectRoomMessageStore.create.bind(projectRoomMessageStore),
18838
+ countAfter: projectRoomMessageStore.countAfter.bind(projectRoomMessageStore)
18839
+ },
18840
+ readStateStore: {
18841
+ get: projectRoomReadStateStore.get.bind(projectRoomReadStateStore)
18611
18842
  },
18612
18843
  userTenantLinkStore: {
18613
18844
  getUsersByTenant: userTenantLinkStore.getUsersByTenant.bind(userTenantLinkStore)
@@ -18740,6 +18971,7 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
18740
18971
  }
18741
18972
  })
18742
18973
  });
18974
+ registerAgentWebAppEmbedRoutes(app2, {});
18743
18975
  registerA2ABridgeRoutes(app2);
18744
18976
  registerSTTRoutes(app2);
18745
18977
  app2.get("/api/local-a2a", getLocalA2AStatus);
@@ -21461,9 +21693,9 @@ var MessageRouter = class {
21461
21693
  };
21462
21694
 
21463
21695
  // src/channels/room/RoomChannelAdapter.ts
21464
- import { z as z9 } from "zod";
21696
+ import { z as z10 } from "zod";
21465
21697
  import { snapshotExactRecord as snapshotExactRecord15 } from "@axiom-lattice/protocols";
21466
- var roomConfigSchema = z9.object({}).strict();
21698
+ var roomConfigSchema = z10.object({}).strict();
21467
21699
  function createRoomChannelAdapter(writer) {
21468
21700
  return {
21469
21701
  channel: "room",
@@ -21643,7 +21875,7 @@ app.register(multipart, {
21643
21875
  });
21644
21876
  app.register(websocket);
21645
21877
  app.register(staticPlugin, {
21646
- root: typeof __dirname === "string" ? path3.join(__dirname, "../public") : path3.resolve(process.cwd(), "public"),
21878
+ root: typeof __dirname === "string" ? path4.join(__dirname, "../public") : path4.resolve(process.cwd(), "public"),
21647
21879
  prefix: "/"
21648
21880
  });
21649
21881
  app.setErrorHandler((error, request, reply) => {
@@ -21694,7 +21926,7 @@ async function restoreMcpConnections() {
21694
21926
  const connectedConfigs = configs.filter((c2) => c2.status === "connected");
21695
21927
  if (connectedConfigs.length === 0) return;
21696
21928
  logger5.info(`Restoring ${connectedConfigs.length} MCP server connections...`);
21697
- const { convertToConnection } = await import("./mcp-configs-SHRMQHIL.mjs");
21929
+ const { convertToConnection } = await import("./mcp-configs-IIKQM5GM.mjs");
21698
21930
  for (const config of connectedConfigs) {
21699
21931
  try {
21700
21932
  const connection = convertToConnection(config.config);
@@ -21733,26 +21965,11 @@ var start = async (config) => {
21733
21965
  const projectRoomRealtimeMode = resolveProjectRoomRealtimeMode();
21734
21966
  let projectRoomRealtimeRuntime;
21735
21967
  if (projectRoomRealtimeMode === "single-gateway") {
21736
- const projectStore = getStoreLattice27("default", "project").store;
21737
- const membershipStore = getStoreLattice27("default", "projectMembership").store;
21738
- const access = new ProjectAccessService({
21739
- projectStore,
21740
- membershipStore,
21741
- userTenantLinkStore: getStoreLattice27("default", "userTenantLink").store
21742
- });
21743
21968
  projectRoomRealtimeRuntime = createProjectRoomRealtimeRuntime({
21744
21969
  tasks: getStoreLattice27("default", "task").store,
21745
21970
  rooms: getStoreLattice27("default", "projectRoom").store,
21746
21971
  memberships: getStoreLattice27("default", "projectBotMembership").store,
21747
- log: { warn: (message, context) => logger5.warn(message, context) },
21748
- requireReadAccess: async (actor2) => {
21749
- await access.requireExistingProjectAccess({
21750
- tenantId: actor2.tenantId,
21751
- userId: actor2.userId,
21752
- projectId: actor2.projectId,
21753
- capability: "read"
21754
- });
21755
- }
21972
+ log: { warn: (message, context) => logger5.warn(message, context) }
21756
21973
  });
21757
21974
  }
21758
21975
  let channelDeps;
@@ -21839,6 +22056,15 @@ var start = async (config) => {
21839
22056
  error: err instanceof Error ? err.message : String(err)
21840
22057
  });
21841
22058
  }
22059
+ try {
22060
+ const { registerOpenRoutes } = await import("./open-DCAOL5CG.mjs");
22061
+ registerOpenRoutes(app);
22062
+ logger5.info("Open MCP spike routes registered");
22063
+ } catch (err) {
22064
+ logger5.warn("Open MCP spike routes unavailable", {
22065
+ error: err instanceof Error ? err.message : String(err)
22066
+ });
22067
+ }
21842
22068
  if (!sandboxLatticeManager2.hasLattice("default")) {
21843
22069
  sandboxLatticeManager2.registerLattice("default", getConfiguredSandboxProvider());
21844
22070
  logger5.info("Registered sandbox manager from env configuration");