@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.
- package/dist/chunk-K32XEQLH.mjs +28 -0
- package/dist/chunk-K32XEQLH.mjs.map +1 -0
- package/dist/{chunk-K4XELOSO.mjs → chunk-QKPZWWHH.mjs} +3 -2
- package/dist/{chunk-K4XELOSO.mjs.map → chunk-QKPZWWHH.mjs.map} +1 -1
- package/dist/embed/agent-chat-loader.js +1 -0
- package/dist/embed/embed-page-1c-75E4QIWF.js +1 -0
- package/dist/embed/embed-page-AgentDetailSideApp-6CVXM3P3.js +1 -0
- package/dist/embed/embed-page-AgentDetailSideApp-DRGKJ6C5.css +1 -0
- package/dist/embed/embed-page-AgentGovernanceWorkbench-4B3NJPCY.js +5 -0
- package/dist/embed/embed-page-AgentGovernanceWorkbench-SDS3GBCC.css +1 -0
- package/dist/embed/embed-page-ReactChart-OG5Z43H7.js +1 -0
- package/dist/embed/embed-page-ReactChart-VBM467ER.css +1 -0
- package/dist/embed/embed-page-ReactInfographic-IABAC7DO.js +574 -0
- package/dist/embed/embed-page-SkillFlow-GS4OUCJJ.js +1 -0
- package/dist/embed/embed-page-SkillFlow-VDPP5DFL.css +1 -0
- package/dist/embed/embed-page-TasksSideApp-F4XUHPTG.css +1 -0
- package/dist/embed/embed-page-TasksSideApp-I6Z7BOT2.js +241 -0
- package/dist/embed/embed-page-TeamWorkspace-DXKGNQ3C.css +1 -0
- package/dist/embed/embed-page-TeamWorkspace-LSCUIJDA.js +748 -0
- package/dist/embed/embed-page-TopologyRuntimeView-2NQ3OOYI.css +1 -0
- package/dist/embed/embed-page-TopologyRuntimeView-RY7NOUB7.js +6 -0
- package/dist/embed/embed-page-WorkflowAutomationView-MAYS27YJ.css +1 -0
- package/dist/embed/embed-page-WorkflowAutomationView-RNKIKDUX.js +3 -0
- package/dist/embed/embed-page-abap-QKV7XZRP.js +1 -0
- package/dist/embed/embed-page-abnf-534KGIL5.js +1 -0
- package/dist/embed/embed-page-abnf-NNWX7KPS.js +1 -0
- package/dist/embed/embed-page-accesslog-K5DAETBI.js +1 -0
- package/dist/embed/embed-page-actionscript-MLTGVDIY.js +1 -0
- package/dist/embed/embed-page-actionscript-YXZSI3FP.js +1 -0
- package/dist/embed/embed-page-ada-SMIJQ6T7.js +1 -0
- package/dist/embed/embed-page-ada-Z5BYNU6B.js +1 -0
- package/dist/embed/embed-page-agda-WCRTGDJB.js +1 -0
- package/dist/embed/embed-page-al-2LSX2G2U.js +1 -0
- package/dist/embed/embed-page-all-RTJLYZHS.js +1 -0
- package/dist/embed/embed-page-angelscript-4S3XC2EJ.js +1 -0
- package/dist/embed/embed-page-antlr4-OLOPZLHD.js +1 -0
- package/dist/embed/embed-page-apache-RGO2UM6T.js +1 -0
- package/dist/embed/embed-page-apacheconf-EKQ6F4ZQ.js +1 -0
- package/dist/embed/embed-page-apex-ZJTOIW4M.js +1 -0
- package/dist/embed/embed-page-apl-W7YETB5L.js +1 -0
- package/dist/embed/embed-page-applescript-I4PV6U4X.js +1 -0
- package/dist/embed/embed-page-applescript-M2D2KKDY.js +1 -0
- package/dist/embed/embed-page-aql-V6TCDQAH.js +1 -0
- package/dist/embed/embed-page-arcade-TSPLEDM5.js +1 -0
- package/dist/embed/embed-page-architecture-U656AL7Q-55BYHO3H.js +1 -0
- package/dist/embed/embed-page-architectureDiagram-VXUJARFQ-GDHKRBZH.js +36 -0
- package/dist/embed/embed-page-arduino-7N264XVW.js +1 -0
- package/dist/embed/embed-page-arduino-XUEUIP7S.js +1 -0
- package/dist/embed/embed-page-arff-M7PKJV7Y.js +1 -0
- package/dist/embed/embed-page-armasm-OAQGLAMS.js +1 -0
- package/dist/embed/embed-page-armasm-PTMJUNBD.js +1 -0
- package/dist/embed/embed-page-arturo-VYVR5YRA.js +1 -0
- package/dist/embed/embed-page-asciidoc-6GDV5NP4.js +1 -0
- package/dist/embed/embed-page-asciidoc-PDLRDQNM.js +1 -0
- package/dist/embed/embed-page-asm6502-LVC7KLV5.js +1 -0
- package/dist/embed/embed-page-asmatmel-B4D7TBZY.js +1 -0
- package/dist/embed/embed-page-aspectj-QZFNA4MK.js +1 -0
- package/dist/embed/embed-page-aspnet-4JJQ3PPT.js +1 -0
- package/dist/embed/embed-page-autohotkey-4QUCSDML.js +1 -0
- package/dist/embed/embed-page-autohotkey-SVPZNOL7.js +1 -0
- package/dist/embed/embed-page-autoit-IXYC6T6A.js +1 -0
- package/dist/embed/embed-page-autoit-PFZZYGX5.js +1 -0
- package/dist/embed/embed-page-avisynth-MVQJIFSP.js +1 -0
- package/dist/embed/embed-page-avrasm-XYNKWFKC.js +1 -0
- package/dist/embed/embed-page-avro-idl-4AA2QRRU.js +1 -0
- package/dist/embed/embed-page-awk-JNS3RERS.js +1 -0
- package/dist/embed/embed-page-awk-RMGF56MA.js +1 -0
- package/dist/embed/embed-page-axapta-6U5QN2JT.js +1 -0
- package/dist/embed/embed-page-bash-UJJ4GKW6.js +1 -0
- package/dist/embed/embed-page-bash-VYDNQBY7.js +1 -0
- package/dist/embed/embed-page-basic-6KLN4O27.js +1 -0
- package/dist/embed/embed-page-basic-EJRJ7W4E.js +1 -0
- package/dist/embed/embed-page-batch-AJOBLMJ2.js +1 -0
- package/dist/embed/embed-page-bbcode-CIP6MR7G.js +1 -0
- package/dist/embed/embed-page-bbj-OPFURIS3.js +1 -0
- package/dist/embed/embed-page-bicep-7BI3OTK4.js +1 -0
- package/dist/embed/embed-page-birb-LWSJQUWN.js +1 -0
- package/dist/embed/embed-page-bison-HDVOA2OF.js +1 -0
- package/dist/embed/embed-page-blockDiagram-VD42YOAC-6GQBPG3N.js +122 -0
- package/dist/embed/embed-page-bnf-7O24GKM6.js +1 -0
- package/dist/embed/embed-page-bnf-TCLPD45L.js +1 -0
- package/dist/embed/embed-page-bqn-LADFOREK.js +1 -0
- package/dist/embed/embed-page-brainfuck-B2QDW5Y5.js +1 -0
- package/dist/embed/embed-page-brainfuck-HUZY5LJA.js +1 -0
- package/dist/embed/embed-page-brightscript-4E54PL3L.js +1 -0
- package/dist/embed/embed-page-bro-DEBMJONL.js +1 -0
- package/dist/embed/embed-page-bsl-5HTEKAYP.js +1 -0
- package/dist/embed/embed-page-c-LFRMHVS4.js +1 -0
- package/dist/embed/embed-page-c-X5PJHL4T.js +1 -0
- package/dist/embed/embed-page-c-like-UPVRYRH5.js +1 -0
- package/dist/embed/embed-page-c4Diagram-YG6GDRKO-UBUOGTT3.js +10 -0
- package/dist/embed/embed-page-cal-MS5NKCDW.js +1 -0
- package/dist/embed/embed-page-capnproto-VVJPMDQX.js +1 -0
- package/dist/embed/embed-page-ceylon-TOPAPEAZ.js +1 -0
- package/dist/embed/embed-page-cfscript-P3X63VSB.js +1 -0
- package/dist/embed/embed-page-chaiscript-QZLDHGV3.js +1 -0
- package/dist/embed/embed-page-chunk-2AUFZBHG.js +1 -0
- package/dist/embed/embed-page-chunk-2AX46B4A.js +1 -0
- package/dist/embed/embed-page-chunk-2BEHY2KL.js +1 -0
- package/dist/embed/embed-page-chunk-2CM5KQAO.js +1 -0
- package/dist/embed/embed-page-chunk-2DKYYWQC.js +1 -0
- package/dist/embed/embed-page-chunk-2GFIRW6Z.js +1 -0
- package/dist/embed/embed-page-chunk-2GGHQJ6Z.js +1 -0
- package/dist/embed/embed-page-chunk-2IURSVR2.js +7 -0
- package/dist/embed/embed-page-chunk-2NLG2PBF.js +1 -0
- package/dist/embed/embed-page-chunk-2REOJOLY.js +1 -0
- package/dist/embed/embed-page-chunk-2SKSDKSN.js +1 -0
- package/dist/embed/embed-page-chunk-2V6IHON2.js +1 -0
- package/dist/embed/embed-page-chunk-2VJ7T35I.js +1 -0
- package/dist/embed/embed-page-chunk-2WL6TSEG.js +1 -0
- package/dist/embed/embed-page-chunk-2XLPEIWW.js +1 -0
- package/dist/embed/embed-page-chunk-2YRVPZIU.js +1 -0
- package/dist/embed/embed-page-chunk-33GTW5LX.js +1 -0
- package/dist/embed/embed-page-chunk-33LYY5FY.js +1 -0
- package/dist/embed/embed-page-chunk-342GWWY6.js +1 -0
- package/dist/embed/embed-page-chunk-34RH2U7Z.js +1 -0
- package/dist/embed/embed-page-chunk-37BFU4NL.js +1 -0
- package/dist/embed/embed-page-chunk-3C32LJTO.js +1 -0
- package/dist/embed/embed-page-chunk-3D3RUB6Q.js +1 -0
- package/dist/embed/embed-page-chunk-3DDNDQND.js +1 -0
- package/dist/embed/embed-page-chunk-3FQ3EELN.js +1 -0
- package/dist/embed/embed-page-chunk-3GRDXHWH.js +1 -0
- package/dist/embed/embed-page-chunk-3GTSDITA.js +1 -0
- package/dist/embed/embed-page-chunk-3IP6ESHH.js +1 -0
- package/dist/embed/embed-page-chunk-3J7LPOGR.js +1 -0
- package/dist/embed/embed-page-chunk-3KBA5YLX.js +1 -0
- package/dist/embed/embed-page-chunk-3MESXVLG.js +1 -0
- package/dist/embed/embed-page-chunk-3QOIYWK3.js +1 -0
- package/dist/embed/embed-page-chunk-3WBHNFJP.js +1 -0
- package/dist/embed/embed-page-chunk-3YID7Y73.js +1 -0
- package/dist/embed/embed-page-chunk-43APLD2U.js +1 -0
- package/dist/embed/embed-page-chunk-447KJWVF.js +1 -0
- package/dist/embed/embed-page-chunk-47OYOFAD.js +1 -0
- package/dist/embed/embed-page-chunk-4APB7U5B.js +1 -0
- package/dist/embed/embed-page-chunk-4BIOW547.js +3 -0
- package/dist/embed/embed-page-chunk-4BKXE5ON.js +14 -0
- package/dist/embed/embed-page-chunk-4BRWUEYH.js +1 -0
- package/dist/embed/embed-page-chunk-4C2ZTZLC.js +1 -0
- package/dist/embed/embed-page-chunk-4DT3DP4G.js +3 -0
- package/dist/embed/embed-page-chunk-4FS42IYM.js +1 -0
- package/dist/embed/embed-page-chunk-4JZFQLML.js +1 -0
- package/dist/embed/embed-page-chunk-4LC4UT4R.js +1 -0
- package/dist/embed/embed-page-chunk-4MNX7JDW.js +2 -0
- package/dist/embed/embed-page-chunk-4NIWV5BC.js +1 -0
- package/dist/embed/embed-page-chunk-4O7YNJLI.js +1 -0
- package/dist/embed/embed-page-chunk-4OTU4CRR.js +1 -0
- package/dist/embed/embed-page-chunk-4PR66FMJ.js +1 -0
- package/dist/embed/embed-page-chunk-4R5F5OQK.js +1 -0
- package/dist/embed/embed-page-chunk-4SGVKO3D.js +1 -0
- package/dist/embed/embed-page-chunk-4TEJCUD5.js +1 -0
- package/dist/embed/embed-page-chunk-4WOTSHAW.js +1 -0
- package/dist/embed/embed-page-chunk-4X5XHAMX.js +5 -0
- package/dist/embed/embed-page-chunk-4XVBSVFM.js +1 -0
- package/dist/embed/embed-page-chunk-4ZIJQUGM.js +1 -0
- package/dist/embed/embed-page-chunk-53PYTL4U.js +1 -0
- package/dist/embed/embed-page-chunk-53QS4RRO.js +1 -0
- package/dist/embed/embed-page-chunk-54DGJLXZ.js +1 -0
- package/dist/embed/embed-page-chunk-57BJJSAV.js +1 -0
- package/dist/embed/embed-page-chunk-5DAOHO64.js +1 -0
- package/dist/embed/embed-page-chunk-5HA2MCVW.js +1 -0
- package/dist/embed/embed-page-chunk-5HNRARTT.js +1 -0
- package/dist/embed/embed-page-chunk-5IG7MZQF.js +1 -0
- package/dist/embed/embed-page-chunk-5JDQ456X.js +7 -0
- package/dist/embed/embed-page-chunk-5LKQWBUZ.js +339 -0
- package/dist/embed/embed-page-chunk-5LZHM64O.js +1 -0
- package/dist/embed/embed-page-chunk-5OTSEOBG.js +1 -0
- package/dist/embed/embed-page-chunk-5WMGNRUZ.js +79 -0
- package/dist/embed/embed-page-chunk-5YNTYDFR.js +1 -0
- package/dist/embed/embed-page-chunk-62XZFSLM.js +1 -0
- package/dist/embed/embed-page-chunk-6433URSF.js +1 -0
- package/dist/embed/embed-page-chunk-6633JIZI.js +1 -0
- package/dist/embed/embed-page-chunk-664ZGB66.js +1 -0
- package/dist/embed/embed-page-chunk-66JWK64A.js +1 -0
- package/dist/embed/embed-page-chunk-66PSFC5S.js +1 -0
- package/dist/embed/embed-page-chunk-67RFPBNS.js +1 -0
- package/dist/embed/embed-page-chunk-6A6HYD7S.js +1 -0
- package/dist/embed/embed-page-chunk-6AF3OC6E.js +1 -0
- package/dist/embed/embed-page-chunk-6BL2XYV2.js +1 -0
- package/dist/embed/embed-page-chunk-6BUDTOPG.js +54 -0
- package/dist/embed/embed-page-chunk-6D23MLVG.js +1 -0
- package/dist/embed/embed-page-chunk-6DD7CBYV.js +1 -0
- package/dist/embed/embed-page-chunk-6DYN2PCR.js +1 -0
- package/dist/embed/embed-page-chunk-6E33CLHM.js +1 -0
- package/dist/embed/embed-page-chunk-6FFWZNBJ.js +1 -0
- package/dist/embed/embed-page-chunk-6G24DMH3.js +1 -0
- package/dist/embed/embed-page-chunk-6JFHQ7NQ.js +1 -0
- package/dist/embed/embed-page-chunk-6NWENUQ7.js +1 -0
- package/dist/embed/embed-page-chunk-6OKUWTCF.js +1 -0
- package/dist/embed/embed-page-chunk-6QTEF2NW.js +1 -0
- package/dist/embed/embed-page-chunk-6SFPT5PF.js +1 -0
- package/dist/embed/embed-page-chunk-6VRE3UPC.js +1 -0
- package/dist/embed/embed-page-chunk-6XNKALVC.js +1 -0
- package/dist/embed/embed-page-chunk-6XZZ6A3N.js +1 -0
- package/dist/embed/embed-page-chunk-6Y3UYJ6Z.js +1 -0
- package/dist/embed/embed-page-chunk-6ZXRL3VU.js +1 -0
- package/dist/embed/embed-page-chunk-72JNWX43.js +1 -0
- package/dist/embed/embed-page-chunk-734LUAPQ.js +1 -0
- package/dist/embed/embed-page-chunk-74YMVV5T.js +1 -0
- package/dist/embed/embed-page-chunk-75BP54HX.js +1 -0
- package/dist/embed/embed-page-chunk-76S2KVCN.js +1 -0
- package/dist/embed/embed-page-chunk-77SKWVKH.js +1 -0
- package/dist/embed/embed-page-chunk-7AKQRM6L.js +1 -0
- package/dist/embed/embed-page-chunk-7ASML425.js +1 -0
- package/dist/embed/embed-page-chunk-7BEP247X.js +1 -0
- package/dist/embed/embed-page-chunk-7CFGO35V.js +153 -0
- package/dist/embed/embed-page-chunk-7CW4T6JX.js +1 -0
- package/dist/embed/embed-page-chunk-7GLQRV3J.js +1 -0
- package/dist/embed/embed-page-chunk-7I5CUKLE.js +1 -0
- package/dist/embed/embed-page-chunk-7IYYKQJE.js +1 -0
- package/dist/embed/embed-page-chunk-7JBDPIC6.js +1 -0
- package/dist/embed/embed-page-chunk-7KSOII2E.js +1 -0
- package/dist/embed/embed-page-chunk-7MYHMZR7.js +1 -0
- package/dist/embed/embed-page-chunk-7OYMAA4V.js +1 -0
- package/dist/embed/embed-page-chunk-7Q3EEWYO.js +1 -0
- package/dist/embed/embed-page-chunk-7RPAJAU7.js +1 -0
- package/dist/embed/embed-page-chunk-7TH7FFVA.js +1 -0
- package/dist/embed/embed-page-chunk-7TMVQS3E.js +1 -0
- package/dist/embed/embed-page-chunk-7TY2R7O2.js +1 -0
- package/dist/embed/embed-page-chunk-7XMMIQFH.js +1 -0
- package/dist/embed/embed-page-chunk-A2LQIHX4.js +261 -0
- package/dist/embed/embed-page-chunk-A2QFCP3F.js +1 -0
- package/dist/embed/embed-page-chunk-A2XJ36CA.js +1 -0
- package/dist/embed/embed-page-chunk-A3QFY3IA.js +1 -0
- package/dist/embed/embed-page-chunk-A5CPK26D.js +1 -0
- package/dist/embed/embed-page-chunk-AAU4RSSU.js +1 -0
- package/dist/embed/embed-page-chunk-AB3Q2HOO.js +1 -0
- package/dist/embed/embed-page-chunk-ABFWMLOR.js +1 -0
- package/dist/embed/embed-page-chunk-ABIN3BPL.js +1 -0
- package/dist/embed/embed-page-chunk-ACIRZYZQ.js +1 -0
- package/dist/embed/embed-page-chunk-AEGLPY52.js +1 -0
- package/dist/embed/embed-page-chunk-AJPIJ5Q6.js +1 -0
- package/dist/embed/embed-page-chunk-AKPA6XS3.js +2 -0
- package/dist/embed/embed-page-chunk-ANZXYPYQ.js +1 -0
- package/dist/embed/embed-page-chunk-AO6KUNOD.js +1 -0
- package/dist/embed/embed-page-chunk-APIN6IE2.js +1 -0
- package/dist/embed/embed-page-chunk-AQ7P7MPQ.js +1 -0
- package/dist/embed/embed-page-chunk-AQLFD3FB.js +1 -0
- package/dist/embed/embed-page-chunk-AQTLXHTW.js +1 -0
- package/dist/embed/embed-page-chunk-ARHDAWDT.js +1 -0
- package/dist/embed/embed-page-chunk-ARM7QQNJ.js +1 -0
- package/dist/embed/embed-page-chunk-ARRA262W.js +1 -0
- package/dist/embed/embed-page-chunk-AWTS5ZYY.js +1 -0
- package/dist/embed/embed-page-chunk-AYOVLRHX.js +2167 -0
- package/dist/embed/embed-page-chunk-B43OSKKN.js +1 -0
- package/dist/embed/embed-page-chunk-B537QK4H.js +1 -0
- package/dist/embed/embed-page-chunk-B6767LVL.js +1 -0
- package/dist/embed/embed-page-chunk-BBSIPZIJ.js +2 -0
- package/dist/embed/embed-page-chunk-BDE6VTZO.js +1 -0
- package/dist/embed/embed-page-chunk-BDR2AV4C.js +1 -0
- package/dist/embed/embed-page-chunk-BEZUVEQG.js +1 -0
- package/dist/embed/embed-page-chunk-BHFBNKCC.js +1 -0
- package/dist/embed/embed-page-chunk-BIXWOREM.js +1 -0
- package/dist/embed/embed-page-chunk-BO56ESC4.js +1 -0
- package/dist/embed/embed-page-chunk-BOBSU3BS.js +1 -0
- package/dist/embed/embed-page-chunk-BOEM7RR2.js +1 -0
- package/dist/embed/embed-page-chunk-BOGY5UJK.js +1 -0
- package/dist/embed/embed-page-chunk-BOQ4YJRC.js +1 -0
- package/dist/embed/embed-page-chunk-BR7RHIPR.js +1 -0
- package/dist/embed/embed-page-chunk-BRF3QA4U.js +1 -0
- package/dist/embed/embed-page-chunk-BSHGJSTY.js +1 -0
- package/dist/embed/embed-page-chunk-BTZ6QKA5.js +1 -0
- package/dist/embed/embed-page-chunk-BXUFKFRH.js +1 -0
- package/dist/embed/embed-page-chunk-BYGKM25Z.js +1 -0
- package/dist/embed/embed-page-chunk-BZI3YCE7.js +1 -0
- package/dist/embed/embed-page-chunk-CADGB443.js +1 -0
- package/dist/embed/embed-page-chunk-CCNLQNKX.js +1 -0
- package/dist/embed/embed-page-chunk-CDFDSWNI.js +1 -0
- package/dist/embed/embed-page-chunk-CGMYXHWK.js +1 -0
- package/dist/embed/embed-page-chunk-CIVBRTV6.js +1 -0
- package/dist/embed/embed-page-chunk-CN3CMET4.js +1 -0
- package/dist/embed/embed-page-chunk-CT5EIC3O.js +1 -0
- package/dist/embed/embed-page-chunk-CTA4NVOR.js +1 -0
- package/dist/embed/embed-page-chunk-CTC4RKCL.js +1 -0
- package/dist/embed/embed-page-chunk-CUEEKFI2.js +1 -0
- package/dist/embed/embed-page-chunk-CUHPLIQJ.js +1 -0
- package/dist/embed/embed-page-chunk-CV7IET55.js +1 -0
- package/dist/embed/embed-page-chunk-CYZTUSN2.js +1 -0
- package/dist/embed/embed-page-chunk-CZBGTBTK.js +1 -0
- package/dist/embed/embed-page-chunk-CZXPKAAI.js +1 -0
- package/dist/embed/embed-page-chunk-D2R2NSRR.js +1 -0
- package/dist/embed/embed-page-chunk-D5AJQJD5.js +2 -0
- package/dist/embed/embed-page-chunk-D63UWHSO.js +1 -0
- package/dist/embed/embed-page-chunk-D6DA3A6A.js +1 -0
- package/dist/embed/embed-page-chunk-D73UXOFT.js +1 -0
- package/dist/embed/embed-page-chunk-DCS7FNFS.js +1 -0
- package/dist/embed/embed-page-chunk-DDTPPBJY.js +1 -0
- package/dist/embed/embed-page-chunk-DE7BGENS.js +1 -0
- package/dist/embed/embed-page-chunk-DEHJLLKN.js +1 -0
- package/dist/embed/embed-page-chunk-DHGHAGLL.js +1 -0
- package/dist/embed/embed-page-chunk-DIE6AVGX.js +1 -0
- package/dist/embed/embed-page-chunk-DM5ESF6C.js +1 -0
- package/dist/embed/embed-page-chunk-DQ4UEELI.js +1 -0
- package/dist/embed/embed-page-chunk-DVHOG6AY.js +31 -0
- package/dist/embed/embed-page-chunk-DWJV4T7Q.js +1 -0
- package/dist/embed/embed-page-chunk-DXVMFTPC.js +1 -0
- package/dist/embed/embed-page-chunk-DYBQVRXS.js +1 -0
- package/dist/embed/embed-page-chunk-DYPHXOEP.js +1 -0
- package/dist/embed/embed-page-chunk-DZRJEWQO.js +1 -0
- package/dist/embed/embed-page-chunk-E4OFRMJJ.js +1 -0
- package/dist/embed/embed-page-chunk-E7ECPW5G.js +1 -0
- package/dist/embed/embed-page-chunk-E7MYEYS3.js +1 -0
- package/dist/embed/embed-page-chunk-EAFE4NIS.js +1 -0
- package/dist/embed/embed-page-chunk-EAUQPBSN.js +1 -0
- package/dist/embed/embed-page-chunk-EBXTVXZF.js +1 -0
- package/dist/embed/embed-page-chunk-EG5CLCWE.js +1 -0
- package/dist/embed/embed-page-chunk-EGTJFOFF.js +1 -0
- package/dist/embed/embed-page-chunk-EKYNYNIX.js +1 -0
- package/dist/embed/embed-page-chunk-EPEKIAZP.js +37 -0
- package/dist/embed/embed-page-chunk-ER4O2WLO.js +1 -0
- package/dist/embed/embed-page-chunk-ESAZNCCX.js +1 -0
- package/dist/embed/embed-page-chunk-ESCA5JCS.js +1 -0
- package/dist/embed/embed-page-chunk-ESJEHJ5L.js +140 -0
- package/dist/embed/embed-page-chunk-ESLOGPBN.js +60 -0
- package/dist/embed/embed-page-chunk-ETP6AXEM.js +1 -0
- package/dist/embed/embed-page-chunk-ETY7U4DI.js +1 -0
- package/dist/embed/embed-page-chunk-EUOOO2LS.js +1 -0
- package/dist/embed/embed-page-chunk-EWKLGZMO.js +1 -0
- package/dist/embed/embed-page-chunk-EY64QEHF.js +1 -0
- package/dist/embed/embed-page-chunk-EY7WOIDX.js +1 -0
- package/dist/embed/embed-page-chunk-EYRF75EG.js +1 -0
- package/dist/embed/embed-page-chunk-EYZS7M3F.js +1 -0
- package/dist/embed/embed-page-chunk-F45LQ3RS.js +1 -0
- package/dist/embed/embed-page-chunk-F7IBVBXT.js +1 -0
- package/dist/embed/embed-page-chunk-FBXKGHOH.js +1 -0
- package/dist/embed/embed-page-chunk-FEEJAFK4.js +1 -0
- package/dist/embed/embed-page-chunk-FEOK4OPE.js +1 -0
- package/dist/embed/embed-page-chunk-FJ3EESJB.js +1 -0
- package/dist/embed/embed-page-chunk-FM5K6PQS.js +1 -0
- package/dist/embed/embed-page-chunk-FMMAQPSK.js +1 -0
- package/dist/embed/embed-page-chunk-FSDLV5QO.js +1 -0
- package/dist/embed/embed-page-chunk-FTXNVWT5.js +1 -0
- package/dist/embed/embed-page-chunk-FUIKRW55.js +1 -0
- package/dist/embed/embed-page-chunk-FVK265KY.js +1 -0
- package/dist/embed/embed-page-chunk-FWTICTEC.js +1 -0
- package/dist/embed/embed-page-chunk-FWXSX2W4.js +1 -0
- package/dist/embed/embed-page-chunk-FYBEULVS.js +1 -0
- package/dist/embed/embed-page-chunk-G5HXFDFC.js +1 -0
- package/dist/embed/embed-page-chunk-G5KW2SOV.js +1 -0
- package/dist/embed/embed-page-chunk-GAF3UVZE.js +1 -0
- package/dist/embed/embed-page-chunk-GFOWXZE5.js +1 -0
- package/dist/embed/embed-page-chunk-GH22I3LG.js +1 -0
- package/dist/embed/embed-page-chunk-GJCMO4YN.js +1 -0
- package/dist/embed/embed-page-chunk-GKA7H24K.js +1 -0
- package/dist/embed/embed-page-chunk-GL7A7IDD.js +1 -0
- package/dist/embed/embed-page-chunk-GNEIDEFX.js +1 -0
- package/dist/embed/embed-page-chunk-GPISFLXW.js +1 -0
- package/dist/embed/embed-page-chunk-GSWEZJ66.js +1 -0
- package/dist/embed/embed-page-chunk-GU7JLLYO.js +1 -0
- package/dist/embed/embed-page-chunk-GVZMVAXF.js +70 -0
- package/dist/embed/embed-page-chunk-GZBFDD4Y.js +1 -0
- package/dist/embed/embed-page-chunk-H3HFE6RK.js +1 -0
- package/dist/embed/embed-page-chunk-H3NYTZT4.js +3 -0
- package/dist/embed/embed-page-chunk-H7CZ6EXN.js +1 -0
- package/dist/embed/embed-page-chunk-H7HZ35QN.js +1 -0
- package/dist/embed/embed-page-chunk-H7XTOBKB.js +1 -0
- package/dist/embed/embed-page-chunk-HD5CA5Q2.js +1 -0
- package/dist/embed/embed-page-chunk-HDAHRUIT.js +1 -0
- package/dist/embed/embed-page-chunk-HGSQ4AUI.js +1 -0
- package/dist/embed/embed-page-chunk-HJJHFV6J.js +1 -0
- package/dist/embed/embed-page-chunk-HK4QMNL5.js +1 -0
- package/dist/embed/embed-page-chunk-HNWETJWB.js +1 -0
- package/dist/embed/embed-page-chunk-HQCMCYUS.js +1 -0
- package/dist/embed/embed-page-chunk-HQUXJKTG.js +1 -0
- package/dist/embed/embed-page-chunk-HTEALTO4.js +1 -0
- package/dist/embed/embed-page-chunk-HUKTQVZB.js +1 -0
- package/dist/embed/embed-page-chunk-HVN56UNP.js +1 -0
- package/dist/embed/embed-page-chunk-HVTV25TI.js +1 -0
- package/dist/embed/embed-page-chunk-HWNFA7PS.js +1 -0
- package/dist/embed/embed-page-chunk-I2JNPKJK.js +1 -0
- package/dist/embed/embed-page-chunk-I4BCBOUA.js +1 -0
- package/dist/embed/embed-page-chunk-I55FBKLU.js +3 -0
- package/dist/embed/embed-page-chunk-I5KTSZJX.js +1 -0
- package/dist/embed/embed-page-chunk-I7YQ2TGZ.js +1 -0
- package/dist/embed/embed-page-chunk-ICJOJGQ6.js +1 -0
- package/dist/embed/embed-page-chunk-IDJWNYLR.js +1 -0
- package/dist/embed/embed-page-chunk-IE6O7ZMQ.js +15 -0
- package/dist/embed/embed-page-chunk-IFCJLAOB.js +1 -0
- package/dist/embed/embed-page-chunk-IFEQPNI2.js +1 -0
- package/dist/embed/embed-page-chunk-IGBRMGDS.js +1 -0
- package/dist/embed/embed-page-chunk-IGIFLYCQ.js +1 -0
- package/dist/embed/embed-page-chunk-IGOT476M.js +1 -0
- package/dist/embed/embed-page-chunk-IHNNPY3P.js +1 -0
- package/dist/embed/embed-page-chunk-II6ODJLE.js +1 -0
- package/dist/embed/embed-page-chunk-IIIA5HUO.js +1 -0
- package/dist/embed/embed-page-chunk-IIYOOZDE.js +1 -0
- package/dist/embed/embed-page-chunk-IJPRKD63.js +1 -0
- package/dist/embed/embed-page-chunk-IK2TPQVX.js +1 -0
- package/dist/embed/embed-page-chunk-INGZ5SYE.js +1 -0
- package/dist/embed/embed-page-chunk-INUQ73SI.js +1 -0
- package/dist/embed/embed-page-chunk-IPI53MN3.js +1 -0
- package/dist/embed/embed-page-chunk-IPMWXKCK.js +1 -0
- package/dist/embed/embed-page-chunk-IRP2UOPH.js +1 -0
- package/dist/embed/embed-page-chunk-ISY7S7N6.js +1 -0
- package/dist/embed/embed-page-chunk-IT5VM3N7.js +1 -0
- package/dist/embed/embed-page-chunk-IX4WLWCY.js +28 -0
- package/dist/embed/embed-page-chunk-IYK5VAB3.js +1 -0
- package/dist/embed/embed-page-chunk-IZ6ZGFSG.js +1 -0
- package/dist/embed/embed-page-chunk-J4VBM2JB.js +1 -0
- package/dist/embed/embed-page-chunk-J7KNZGPV.js +1 -0
- package/dist/embed/embed-page-chunk-JADTV5YD.js +1 -0
- package/dist/embed/embed-page-chunk-JEW2Y2ED.js +1 -0
- package/dist/embed/embed-page-chunk-JFK56NZW.js +1 -0
- package/dist/embed/embed-page-chunk-JLWIJ4BP.js +1 -0
- package/dist/embed/embed-page-chunk-JNXBKMN6.js +1 -0
- package/dist/embed/embed-page-chunk-JOJ4VSO5.js +1 -0
- package/dist/embed/embed-page-chunk-JQQ6C3ST.js +1 -0
- package/dist/embed/embed-page-chunk-JUZFORQA.js +1 -0
- package/dist/embed/embed-page-chunk-JYEMOI5G.js +1 -0
- package/dist/embed/embed-page-chunk-JYQTTU7F.js +1 -0
- package/dist/embed/embed-page-chunk-K2NBNWDK.js +1 -0
- package/dist/embed/embed-page-chunk-K7I5Z2RN.js +1 -0
- package/dist/embed/embed-page-chunk-K7JAB46X.js +1 -0
- package/dist/embed/embed-page-chunk-KE32OJIP.js +1 -0
- package/dist/embed/embed-page-chunk-KEKB3BUG.js +1 -0
- package/dist/embed/embed-page-chunk-KG5A66WX.js +525 -0
- package/dist/embed/embed-page-chunk-KGP2RGEC.js +1 -0
- package/dist/embed/embed-page-chunk-KGX7G7XQ.js +1 -0
- package/dist/embed/embed-page-chunk-KM5NL7BL.js +1 -0
- package/dist/embed/embed-page-chunk-KQNRWZKR.js +1 -0
- package/dist/embed/embed-page-chunk-KUTM5AGJ.js +1 -0
- package/dist/embed/embed-page-chunk-KW44NUT4.js +1 -0
- package/dist/embed/embed-page-chunk-KWRAXHKX.js +1 -0
- package/dist/embed/embed-page-chunk-KZWWYO7Z.js +1 -0
- package/dist/embed/embed-page-chunk-L2QFIJ4P.js +1 -0
- package/dist/embed/embed-page-chunk-L3RQ76LD.js +1 -0
- package/dist/embed/embed-page-chunk-L6GX525D.js +1 -0
- package/dist/embed/embed-page-chunk-LDFGGZC6.js +1 -0
- package/dist/embed/embed-page-chunk-LEAHYMKH.js +1 -0
- package/dist/embed/embed-page-chunk-LH2NUQ2C.js +1 -0
- package/dist/embed/embed-page-chunk-LIJVWBYO.js +1 -0
- package/dist/embed/embed-page-chunk-LJBLK3MD.js +1 -0
- package/dist/embed/embed-page-chunk-LJJJJZT7.js +1 -0
- package/dist/embed/embed-page-chunk-LJZ2VDC6.js +1 -0
- package/dist/embed/embed-page-chunk-LKBECLX2.js +1 -0
- package/dist/embed/embed-page-chunk-LL4XKLOG.js +1 -0
- package/dist/embed/embed-page-chunk-LLFEIUVK.js +1 -0
- package/dist/embed/embed-page-chunk-LMLHHN2B.js +1 -0
- package/dist/embed/embed-page-chunk-LOLMAI3V.js +1 -0
- package/dist/embed/embed-page-chunk-LPXAKW7Q.js +1 -0
- package/dist/embed/embed-page-chunk-LRB5IXLV.js +1 -0
- package/dist/embed/embed-page-chunk-LW3LUJEG.js +1 -0
- package/dist/embed/embed-page-chunk-LWERP7BS.js +1 -0
- package/dist/embed/embed-page-chunk-M4ACA43K.js +1 -0
- package/dist/embed/embed-page-chunk-M5HO3OG6.js +1 -0
- package/dist/embed/embed-page-chunk-M7F46E23.js +1 -0
- package/dist/embed/embed-page-chunk-MASNBRHM.js +1 -0
- package/dist/embed/embed-page-chunk-MB65DZAX.js +14 -0
- package/dist/embed/embed-page-chunk-MB77ZI4D.js +1 -0
- package/dist/embed/embed-page-chunk-MEC3JUW7.js +1 -0
- package/dist/embed/embed-page-chunk-MG5LALIS.js +1 -0
- package/dist/embed/embed-page-chunk-MHSEFTKR.js +1 -0
- package/dist/embed/embed-page-chunk-MKV2QNSI.js +1 -0
- package/dist/embed/embed-page-chunk-MMHCEL7E.js +1 -0
- package/dist/embed/embed-page-chunk-MMXDBRLY.js +1 -0
- package/dist/embed/embed-page-chunk-MSYFW3OJ.js +1 -0
- package/dist/embed/embed-page-chunk-MVLHDASB.js +1 -0
- package/dist/embed/embed-page-chunk-N252QSMT.js +1 -0
- package/dist/embed/embed-page-chunk-N7NXBLSR.js +1 -0
- package/dist/embed/embed-page-chunk-NBNJGF7O.js +1 -0
- package/dist/embed/embed-page-chunk-NG7LKEPN.js +1 -0
- package/dist/embed/embed-page-chunk-NHOBB2JQ.js +1 -0
- package/dist/embed/embed-page-chunk-NIFSD4XH.js +1 -0
- package/dist/embed/embed-page-chunk-NJP7LGPJ.js +1 -0
- package/dist/embed/embed-page-chunk-NLMEH7HI.js +1 -0
- package/dist/embed/embed-page-chunk-NLZ6F3ON.js +1 -0
- package/dist/embed/embed-page-chunk-NMUKLFBY.js +1 -0
- package/dist/embed/embed-page-chunk-NMZP7U6I.js +1 -0
- package/dist/embed/embed-page-chunk-NN7VEJ2G.js +1 -0
- package/dist/embed/embed-page-chunk-NNNI4647.js +1 -0
- package/dist/embed/embed-page-chunk-NNZA747K.js +1 -0
- package/dist/embed/embed-page-chunk-NOMBKADH.js +1 -0
- package/dist/embed/embed-page-chunk-NQRVVPLU.js +1 -0
- package/dist/embed/embed-page-chunk-O2YMBFJK.js +1 -0
- package/dist/embed/embed-page-chunk-O6DJHMEC.js +1 -0
- package/dist/embed/embed-page-chunk-OAUK7LXS.js +1 -0
- package/dist/embed/embed-page-chunk-OCFVEAMV.js +1 -0
- package/dist/embed/embed-page-chunk-OEC4EWNI.js +1 -0
- package/dist/embed/embed-page-chunk-OF6SGGWX.js +1 -0
- package/dist/embed/embed-page-chunk-OJ7436DP.js +1 -0
- package/dist/embed/embed-page-chunk-OK6DC5YX.js +1 -0
- package/dist/embed/embed-page-chunk-ONZ74YHS.js +1 -0
- package/dist/embed/embed-page-chunk-OOZDPBUK.js +69 -0
- package/dist/embed/embed-page-chunk-OPME5GF2.js +1 -0
- package/dist/embed/embed-page-chunk-ORPDSJ5S.js +1 -0
- package/dist/embed/embed-page-chunk-ORPUVSKY.js +1 -0
- package/dist/embed/embed-page-chunk-OWGBADV6.js +3880 -0
- package/dist/embed/embed-page-chunk-OWTE7YMF.js +1 -0
- package/dist/embed/embed-page-chunk-OZKVHTL6.js +1 -0
- package/dist/embed/embed-page-chunk-OZUIA6GJ.js +1 -0
- package/dist/embed/embed-page-chunk-P4MXODKA.js +1 -0
- package/dist/embed/embed-page-chunk-P56KTNVT.js +1 -0
- package/dist/embed/embed-page-chunk-PADSMXWH.js +3 -0
- package/dist/embed/embed-page-chunk-PEFXE5Y4.js +1 -0
- package/dist/embed/embed-page-chunk-PHVA2KHO.js +1 -0
- package/dist/embed/embed-page-chunk-PJJPSDVD.js +1 -0
- package/dist/embed/embed-page-chunk-PKNTJERD.js +1 -0
- package/dist/embed/embed-page-chunk-PLAF2Q2L.js +1 -0
- package/dist/embed/embed-page-chunk-PLNJRORR.js +1 -0
- package/dist/embed/embed-page-chunk-PO2WVZC2.js +1 -0
- package/dist/embed/embed-page-chunk-PRYNHKKK.js +1 -0
- package/dist/embed/embed-page-chunk-PSTS2K7H.js +1 -0
- package/dist/embed/embed-page-chunk-PVL27S2O.js +1 -0
- package/dist/embed/embed-page-chunk-PVOA7ARZ.js +1 -0
- package/dist/embed/embed-page-chunk-PXADN2PY.js +1 -0
- package/dist/embed/embed-page-chunk-Q2HL7S3R.js +41 -0
- package/dist/embed/embed-page-chunk-Q2LWO44N.js +1 -0
- package/dist/embed/embed-page-chunk-Q2YEQQJF.js +1 -0
- package/dist/embed/embed-page-chunk-Q32Y7CP2.js +5 -0
- package/dist/embed/embed-page-chunk-Q3AOMIJ7.js +1 -0
- package/dist/embed/embed-page-chunk-Q4NFAO5G.js +1 -0
- package/dist/embed/embed-page-chunk-Q6ZPKMOZ.js +1 -0
- package/dist/embed/embed-page-chunk-QA2R2R55.js +165 -0
- package/dist/embed/embed-page-chunk-QANF3D34.js +1 -0
- package/dist/embed/embed-page-chunk-QBSFVKIB.js +1 -0
- package/dist/embed/embed-page-chunk-QCLLEPYT.js +1 -0
- package/dist/embed/embed-page-chunk-QDBK4ZDE.js +1 -0
- package/dist/embed/embed-page-chunk-QENDQ7H3.js +1 -0
- package/dist/embed/embed-page-chunk-QF7NBK3B.js +1 -0
- package/dist/embed/embed-page-chunk-QFTY233A.js +1 -0
- package/dist/embed/embed-page-chunk-QHV7PE5D.js +3 -0
- package/dist/embed/embed-page-chunk-QIJBDPZP.js +1 -0
- package/dist/embed/embed-page-chunk-QLA2XU73.js +1 -0
- package/dist/embed/embed-page-chunk-QNIB3Q7U.js +1 -0
- package/dist/embed/embed-page-chunk-QQLF4AV6.js +1 -0
- package/dist/embed/embed-page-chunk-QQUV5KZD.js +1 -0
- package/dist/embed/embed-page-chunk-QRKEL65F.js +1 -0
- package/dist/embed/embed-page-chunk-QRPDJVB7.js +1 -0
- package/dist/embed/embed-page-chunk-QVHTN5HT.js +1 -0
- package/dist/embed/embed-page-chunk-R2BGZIR7.js +1 -0
- package/dist/embed/embed-page-chunk-R2K4OIQO.js +1 -0
- package/dist/embed/embed-page-chunk-R4FTAO2H.js +1 -0
- package/dist/embed/embed-page-chunk-R54S6SKK.js +1 -0
- package/dist/embed/embed-page-chunk-R5I2GTYT.js +1 -0
- package/dist/embed/embed-page-chunk-R672RZXS.js +1 -0
- package/dist/embed/embed-page-chunk-RABAC5H3.js +1 -0
- package/dist/embed/embed-page-chunk-RG3BI65W.js +1 -0
- package/dist/embed/embed-page-chunk-RKPK7MLC.js +1 -0
- package/dist/embed/embed-page-chunk-RN7JLKLZ.js +1 -0
- package/dist/embed/embed-page-chunk-RNOETEGH.js +1 -0
- package/dist/embed/embed-page-chunk-RPK5SOLP.js +1 -0
- package/dist/embed/embed-page-chunk-RUOFG3OD.js +1 -0
- package/dist/embed/embed-page-chunk-RV2IAP52.js +1 -0
- package/dist/embed/embed-page-chunk-RXLB27EG.js +1 -0
- package/dist/embed/embed-page-chunk-S4XZPBRM.js +1 -0
- package/dist/embed/embed-page-chunk-SAML73QO.js +1 -0
- package/dist/embed/embed-page-chunk-SEH5ZYHX.js +1 -0
- package/dist/embed/embed-page-chunk-SL4X4KPS.js +1 -0
- package/dist/embed/embed-page-chunk-SMMEMIZS.js +1 -0
- package/dist/embed/embed-page-chunk-SMZUIXFD.js +1 -0
- package/dist/embed/embed-page-chunk-SQ4GANYE.js +1 -0
- package/dist/embed/embed-page-chunk-SRW4AAQ4.js +1 -0
- package/dist/embed/embed-page-chunk-SU5GXLKX.js +467 -0
- package/dist/embed/embed-page-chunk-SV2BM3WO.js +1 -0
- package/dist/embed/embed-page-chunk-SWGBMELE.js +1 -0
- package/dist/embed/embed-page-chunk-SYAPUMNM.js +1 -0
- package/dist/embed/embed-page-chunk-T4AZ556W.js +1 -0
- package/dist/embed/embed-page-chunk-T6QXBMXO.js +1 -0
- package/dist/embed/embed-page-chunk-TAOVZBLV.js +1 -0
- package/dist/embed/embed-page-chunk-TBRAGK3D.js +1 -0
- package/dist/embed/embed-page-chunk-TENLHB44.js +1 -0
- package/dist/embed/embed-page-chunk-TFSDCDJS.js +1 -0
- package/dist/embed/embed-page-chunk-TIGSOALR.js +1 -0
- package/dist/embed/embed-page-chunk-TKOSVUN2.js +1 -0
- package/dist/embed/embed-page-chunk-TLWGSINF.js +1 -0
- package/dist/embed/embed-page-chunk-TMUCZ7XO.js +1 -0
- package/dist/embed/embed-page-chunk-TP7772GL.js +1 -0
- package/dist/embed/embed-page-chunk-TPCI3CNJ.js +1 -0
- package/dist/embed/embed-page-chunk-TPGW6RUI.js +1 -0
- package/dist/embed/embed-page-chunk-TPQGFG2C.js +1 -0
- package/dist/embed/embed-page-chunk-TSZIWR3X.js +1 -0
- package/dist/embed/embed-page-chunk-TUFYJMMA.js +1 -0
- package/dist/embed/embed-page-chunk-TWDJUUXZ.js +1 -0
- package/dist/embed/embed-page-chunk-TWNAGURL.js +4 -0
- package/dist/embed/embed-page-chunk-TWU6UJLL.js +1 -0
- package/dist/embed/embed-page-chunk-TYA3PYZB.js +1 -0
- package/dist/embed/embed-page-chunk-U32PAI3Y.js +1 -0
- package/dist/embed/embed-page-chunk-U3B5KKSV.js +1 -0
- package/dist/embed/embed-page-chunk-U3YIXQYB.js +1 -0
- package/dist/embed/embed-page-chunk-U7OC25B3.js +1 -0
- package/dist/embed/embed-page-chunk-UBWHZLJN.js +1 -0
- package/dist/embed/embed-page-chunk-UCGT4CTV.js +1 -0
- package/dist/embed/embed-page-chunk-UCR4ZILJ.js +1 -0
- package/dist/embed/embed-page-chunk-UGBSF5HI.js +1 -0
- package/dist/embed/embed-page-chunk-UGCW7PZD.js +1 -0
- package/dist/embed/embed-page-chunk-UIZLGSJE.js +1 -0
- package/dist/embed/embed-page-chunk-UJODN4PG.js +1 -0
- package/dist/embed/embed-page-chunk-UPUUWWBK.js +1 -0
- package/dist/embed/embed-page-chunk-UR5VOXA3.js +1 -0
- package/dist/embed/embed-page-chunk-UZNSI2X3.js +1 -0
- package/dist/embed/embed-page-chunk-UZW2LQZV.js +1 -0
- package/dist/embed/embed-page-chunk-V2V73RFB.js +1 -0
- package/dist/embed/embed-page-chunk-V7R2Y72J.js +14 -0
- package/dist/embed/embed-page-chunk-VEYJHY36.js +1 -0
- package/dist/embed/embed-page-chunk-VNK6MED4.js +1 -0
- package/dist/embed/embed-page-chunk-VP2J7NES.js +1 -0
- package/dist/embed/embed-page-chunk-VRDH6A7Z.js +1 -0
- package/dist/embed/embed-page-chunk-VTUD3VPX.js +1 -0
- package/dist/embed/embed-page-chunk-VULBATQG.js +1 -0
- package/dist/embed/embed-page-chunk-VUOXEXHU.js +1 -0
- package/dist/embed/embed-page-chunk-VVTZ23LK.js +1 -0
- package/dist/embed/embed-page-chunk-VW3NF5NT.js +1 -0
- package/dist/embed/embed-page-chunk-VY6MAPHR.js +1 -0
- package/dist/embed/embed-page-chunk-WAANDEAQ.js +1 -0
- package/dist/embed/embed-page-chunk-WCKHIRD5.js +1 -0
- package/dist/embed/embed-page-chunk-WDS66MAN.js +1 -0
- package/dist/embed/embed-page-chunk-WLZW4FEZ.js +1 -0
- package/dist/embed/embed-page-chunk-WNEY2A2R.js +1 -0
- package/dist/embed/embed-page-chunk-WQOZWRIS.js +1 -0
- package/dist/embed/embed-page-chunk-WUYZIBLV.js +1 -0
- package/dist/embed/embed-page-chunk-WYJNNBFP.js +1 -0
- package/dist/embed/embed-page-chunk-X55NDWBH.js +1 -0
- package/dist/embed/embed-page-chunk-XA4KNRQW.js +1 -0
- package/dist/embed/embed-page-chunk-XAJFFWM3.js +1 -0
- package/dist/embed/embed-page-chunk-XIJHCNBW.js +1 -0
- package/dist/embed/embed-page-chunk-XNZ46IEF.js +1 -0
- package/dist/embed/embed-page-chunk-XO5WZF3D.js +1 -0
- package/dist/embed/embed-page-chunk-XPDEOKHX.js +1 -0
- package/dist/embed/embed-page-chunk-XQNO7AN3.js +1 -0
- package/dist/embed/embed-page-chunk-XR3Q4GDZ.js +1 -0
- package/dist/embed/embed-page-chunk-XRRCORI5.js +1 -0
- package/dist/embed/embed-page-chunk-XTMDFHMJ.js +1 -0
- package/dist/embed/embed-page-chunk-XUZKZF3V.js +1 -0
- package/dist/embed/embed-page-chunk-XWAJRAFC.js +1 -0
- package/dist/embed/embed-page-chunk-XWRBMESB.js +1 -0
- package/dist/embed/embed-page-chunk-XXT7RMBT.js +220 -0
- package/dist/embed/embed-page-chunk-XY5NGMFT.js +1 -0
- package/dist/embed/embed-page-chunk-XYCU2ZON.js +1 -0
- package/dist/embed/embed-page-chunk-XZ6CLWS2.js +1 -0
- package/dist/embed/embed-page-chunk-XZYJX7MY.js +1 -0
- package/dist/embed/embed-page-chunk-Y2JWLZJF.js +1 -0
- package/dist/embed/embed-page-chunk-Y4KTS6EE.js +1 -0
- package/dist/embed/embed-page-chunk-YBPVSBMU.js +1 -0
- package/dist/embed/embed-page-chunk-YEHTVTMO.js +1 -0
- package/dist/embed/embed-page-chunk-YFEUMUCL.js +1 -0
- package/dist/embed/embed-page-chunk-YFWCKZW7.js +1 -0
- package/dist/embed/embed-page-chunk-YHEFVON2.js +1 -0
- package/dist/embed/embed-page-chunk-YJBX3AFL.js +1 -0
- package/dist/embed/embed-page-chunk-YJZJFCLP.js +1 -0
- package/dist/embed/embed-page-chunk-YLUGLAWD.js +1 -0
- package/dist/embed/embed-page-chunk-YMMUR7L6.js +1 -0
- package/dist/embed/embed-page-chunk-YNIEMXW5.js +1 -0
- package/dist/embed/embed-page-chunk-YPK6G5D7.js +1 -0
- package/dist/embed/embed-page-chunk-Z26BSJ5Y.js +1 -0
- package/dist/embed/embed-page-chunk-Z2GE34ES.js +1 -0
- package/dist/embed/embed-page-chunk-Z6N3GKM5.js +1 -0
- package/dist/embed/embed-page-chunk-Z6PDLQOB.js +1 -0
- package/dist/embed/embed-page-chunk-ZESVZCWO.js +1 -0
- package/dist/embed/embed-page-chunk-ZITVGQ52.js +1 -0
- package/dist/embed/embed-page-chunk-ZNWEXQQ4.js +1 -0
- package/dist/embed/embed-page-chunk-ZQ6WYVOD.js +1 -0
- package/dist/embed/embed-page-chunk-ZR7ZLGLV.js +1 -0
- package/dist/embed/embed-page-chunk-ZT2EZUXI.js +1 -0
- package/dist/embed/embed-page-chunk-ZZCMWB6F.js +1 -0
- package/dist/embed/embed-page-cil-ZQIVHSN6.js +1 -0
- package/dist/embed/embed-page-cilkc-AJET62TW.js +1 -0
- package/dist/embed/embed-page-cilkcpp-FRBVBYEF.js +1 -0
- package/dist/embed/embed-page-classDiagram-2ON5EDUG-S5GEC2UC.js +1 -0
- package/dist/embed/embed-page-classDiagram-v2-WZHVMYZB-NL3HKXC3.js +1 -0
- package/dist/embed/embed-page-clean-OPHY52MY.js +1 -0
- package/dist/embed/embed-page-clike-5NRFTOCK.js +1 -0
- package/dist/embed/embed-page-clojure-4GC77VYK.js +1 -0
- package/dist/embed/embed-page-clojure-7B3FI7TH.js +1 -0
- package/dist/embed/embed-page-clojure-repl-56WG27Z3.js +1 -0
- package/dist/embed/embed-page-cmake-F3SKZMUJ.js +1 -0
- package/dist/embed/embed-page-cmake-UIBPQIVG.js +1 -0
- package/dist/embed/embed-page-cobol-7TW6OZHG.js +1 -0
- package/dist/embed/embed-page-code-highlighter-TBT4ICNZ.js +1 -0
- package/dist/embed/embed-page-coffeescript-BCKZ4N2E.js +1 -0
- package/dist/embed/embed-page-coffeescript-N2ENFNNR.js +1 -0
- package/dist/embed/embed-page-concurnas-MCN7VYPE.js +1 -0
- package/dist/embed/embed-page-cooklang-JSLOQBDM.js +1 -0
- package/dist/embed/embed-page-coq-WH3J7SKF.js +1 -0
- package/dist/embed/embed-page-coq-XRXAXI5X.js +1 -0
- package/dist/embed/embed-page-core-Q6IGWM4Q.js +1 -0
- package/dist/embed/embed-page-core-TQNBW2MM.js +1 -0
- package/dist/embed/embed-page-cos-MP7YM5FO.js +1 -0
- package/dist/embed/embed-page-cose-bilkent-S5V4N54A-KJMAAFJL.js +1 -0
- package/dist/embed/embed-page-cpp-FFAXKUCJ.js +1 -0
- package/dist/embed/embed-page-cpp-PRCT5QAC.js +1 -0
- package/dist/embed/embed-page-crmsh-PF5MF5PC.js +1 -0
- package/dist/embed/embed-page-crystal-GYFU35L2.js +1 -0
- package/dist/embed/embed-page-crystal-W2TOACW4.js +1 -0
- package/dist/embed/embed-page-csharp-DHR2XRZW.js +1 -0
- package/dist/embed/embed-page-csharp-UNF62ZBO.js +1 -0
- package/dist/embed/embed-page-cshtml-G7ML4LE3.js +1 -0
- package/dist/embed/embed-page-csp-UDQUZUZW.js +1 -0
- package/dist/embed/embed-page-csp-YPF3N7BE.js +1 -0
- package/dist/embed/embed-page-css-774MOM42.js +1 -0
- package/dist/embed/embed-page-css-EHGZALYG.js +1 -0
- package/dist/embed/embed-page-css-extras-SI7Q5IJ6.js +1 -0
- package/dist/embed/embed-page-csv-MT4GPPO7.js +1 -0
- package/dist/embed/embed-page-cue-BMTFVAKL.js +1 -0
- package/dist/embed/embed-page-cypher-QDHM3LFO.js +1 -0
- package/dist/embed/embed-page-d-KHBJT5ZU.js +1 -0
- package/dist/embed/embed-page-d-VF7XFFMN.js +1 -0
- package/dist/embed/embed-page-dagre-6UL2VRFP-QSIK5LGS.js +4 -0
- package/dist/embed/embed-page-dart-3L3U2DJ3.js +1 -0
- package/dist/embed/embed-page-dart-6AOCMAXR.js +1 -0
- package/dist/embed/embed-page-dataweave-LNNDNKWG.js +1 -0
- package/dist/embed/embed-page-dax-J2FYUNXR.js +1 -0
- package/dist/embed/embed-page-delphi-T3RKZ33G.js +1 -0
- package/dist/embed/embed-page-dhall-MGZ2X6D6.js +1 -0
- package/dist/embed/embed-page-diagram-PSM6KHXK-PLOM5KG7.js +24 -0
- package/dist/embed/embed-page-diagram-QEK2KX5R-RUNGK25X.js +43 -0
- package/dist/embed/embed-page-diagram-S2PKOQOG-LWDHM5TL.js +24 -0
- package/dist/embed/embed-page-diff-AZNWSOQ3.js +1 -0
- package/dist/embed/embed-page-diff-BYMKQAM5.js +1 -0
- package/dist/embed/embed-page-django-5BVMXLOO.js +1 -0
- package/dist/embed/embed-page-django-OLTKKRJC.js +1 -0
- package/dist/embed/embed-page-dns-LKEA7NVQ.js +1 -0
- package/dist/embed/embed-page-dns-zone-file-MLDJYBWW.js +1 -0
- package/dist/embed/embed-page-docker-7ZWVGIHF.js +1 -0
- package/dist/embed/embed-page-dockerfile-YJABIQ3Q.js +1 -0
- package/dist/embed/embed-page-dos-CZOUXBDN.js +1 -0
- package/dist/embed/embed-page-dot-USOBKZIN.js +1 -0
- package/dist/embed/embed-page-dsconfig-5E37MQM4.js +1 -0
- package/dist/embed/embed-page-dts-DPBFPVA5.js +1 -0
- package/dist/embed/embed-page-dust-OAZ4NEIP.js +1 -0
- package/dist/embed/embed-page-ebnf-XFC6NV6I.js +1 -0
- package/dist/embed/embed-page-ebnf-XSYP4JUB.js +1 -0
- package/dist/embed/embed-page-echarts-7KZDMH4F.js +1 -0
- package/dist/embed/embed-page-editorconfig-FQHUYGTR.js +1 -0
- package/dist/embed/embed-page-eiffel-Z22STSPG.js +1 -0
- package/dist/embed/embed-page-ejs-VHHMOK6Y.js +1 -0
- package/dist/embed/embed-page-elixir-BGO72I74.js +1 -0
- package/dist/embed/embed-page-elixir-H3KPRECP.js +1 -0
- package/dist/embed/embed-page-elm-HZWFYFUN.js +1 -0
- package/dist/embed/embed-page-elm-IZAWNYFC.js +1 -0
- package/dist/embed/embed-page-erDiagram-Q2GNP2WA-C6CZYEPF.js +60 -0
- package/dist/embed/embed-page-erb-AK646PXX.js +1 -0
- package/dist/embed/embed-page-erb-YBV2NO4W.js +1 -0
- package/dist/embed/embed-page-erlang-6LMYF4BN.js +1 -0
- package/dist/embed/embed-page-erlang-PXGHX7XB.js +1 -0
- package/dist/embed/embed-page-erlang-repl-UJPNMOCE.js +1 -0
- package/dist/embed/embed-page-etlua-XNKJ7UTQ.js +1 -0
- package/dist/embed/embed-page-excel-PCWQ5ZDK.js +1 -0
- package/dist/embed/embed-page-excel-formula-CEZ7KVDN.js +1 -0
- package/dist/embed/embed-page-factor-3PZO4CCJ.js +1 -0
- package/dist/embed/embed-page-false-OX3DNOF4.js +1 -0
- package/dist/embed/embed-page-firestore-security-rules-IQBOB7PZ.js +1 -0
- package/dist/embed/embed-page-fix-Q3F7Z2HQ.js +1 -0
- package/dist/embed/embed-page-flix-LVDGNPRS.js +1 -0
- package/dist/embed/embed-page-flow-4UPRJEF2.js +1 -0
- package/dist/embed/embed-page-flowDiagram-NV44I4VS-DLT3KEOP.js +162 -0
- package/dist/embed/embed-page-fortran-65P3TPQ7.js +1 -0
- package/dist/embed/embed-page-fortran-LWYFHCCB.js +1 -0
- package/dist/embed/embed-page-fsharp-BSA736XP.js +1 -0
- package/dist/embed/embed-page-fsharp-GDIVPYAB.js +1 -0
- package/dist/embed/embed-page-ftl-27Y3T2XT.js +1 -0
- package/dist/embed/embed-page-gams-7UM23CTD.js +1 -0
- package/dist/embed/embed-page-ganttDiagram-JELNMOA3-YXTLQI5X.js +267 -0
- package/dist/embed/embed-page-gap-JNDMTZYG.js +1 -0
- package/dist/embed/embed-page-gauss-4OCQQOQQ.js +1 -0
- package/dist/embed/embed-page-gcode-7ZDB2FDS.js +1 -0
- package/dist/embed/embed-page-gcode-U2UWK2IF.js +1 -0
- package/dist/embed/embed-page-gdscript-UOAGAMMO.js +1 -0
- package/dist/embed/embed-page-gedcom-WSTJUY6R.js +1 -0
- package/dist/embed/embed-page-gettext-BNGNGT6W.js +1 -0
- package/dist/embed/embed-page-gherkin-CPRNYA24.js +1 -0
- package/dist/embed/embed-page-gherkin-IVS5YUAH.js +1 -0
- package/dist/embed/embed-page-git-WWKMYMUR.js +1 -0
- package/dist/embed/embed-page-gitGraph-F6HP7TQM-AT36TKLZ.js +1 -0
- package/dist/embed/embed-page-gitGraphDiagram-NY62KEGX-U36ULO4Y.js +65 -0
- package/dist/embed/embed-page-glsl-2QJTMF6X.js +1 -0
- package/dist/embed/embed-page-glsl-6C6F26XK.js +1 -0
- package/dist/embed/embed-page-gml-67HHHYLB.js +1 -0
- package/dist/embed/embed-page-gml-ZFY32X23.js +1 -0
- package/dist/embed/embed-page-gn-KO2XPJDA.js +1 -0
- package/dist/embed/embed-page-go-HAQ77N2R.js +1 -0
- package/dist/embed/embed-page-go-SYFPAV4X.js +1 -0
- package/dist/embed/embed-page-go-module-XICPRQ5N.js +1 -0
- package/dist/embed/embed-page-golo-KQZ2PQG7.js +1 -0
- package/dist/embed/embed-page-gradle-7PN7DUJT.js +1 -0
- package/dist/embed/embed-page-gradle-GN34ZONG.js +1 -0
- package/dist/embed/embed-page-graphql-CVSK5MA2.js +1 -0
- package/dist/embed/embed-page-groovy-3R2X7GQD.js +1 -0
- package/dist/embed/embed-page-groovy-YCAJV7XB.js +1 -0
- package/dist/embed/embed-page-haml-6VEPXH2O.js +1 -0
- package/dist/embed/embed-page-haml-TYLXIXHD.js +1 -0
- package/dist/embed/embed-page-handlebars-7Y74ECRG.js +1 -0
- package/dist/embed/embed-page-handlebars-WVRARLIY.js +1 -0
- package/dist/embed/embed-page-haskell-7U743UEW.js +1 -0
- package/dist/embed/embed-page-haskell-BATAJHBH.js +1 -0
- package/dist/embed/embed-page-haxe-C234CZTQ.js +1 -0
- package/dist/embed/embed-page-haxe-PYBC3T4M.js +1 -0
- package/dist/embed/embed-page-hcl-BITT4ESF.js +1 -0
- package/dist/embed/embed-page-hlsl-KYOSJMB5.js +1 -0
- package/dist/embed/embed-page-hoon-NTFQ2YYJ.js +1 -0
- package/dist/embed/embed-page-hpkp-KN6XKLGI.js +1 -0
- package/dist/embed/embed-page-hsp-QFZDPSDA.js +1 -0
- package/dist/embed/embed-page-hsts-5COZ5S32.js +1 -0
- package/dist/embed/embed-page-html2canvas-HMTC4TFR.js +1 -0
- package/dist/embed/embed-page-htmlbars-L7NSSG62.js +1 -0
- package/dist/embed/embed-page-http-ALSJXSOJ.js +1 -0
- package/dist/embed/embed-page-http-E4UEITFW.js +1 -0
- package/dist/embed/embed-page-hy-5ROLZHNZ.js +1 -0
- package/dist/embed/embed-page-ichigojam-T6UG6OA7.js +1 -0
- package/dist/embed/embed-page-icon-74CJY73I.js +1 -0
- package/dist/embed/embed-page-icu-message-format-2RX6DV2B.js +1 -0
- package/dist/embed/embed-page-idris-OH6VYNRJ.js +1 -0
- package/dist/embed/embed-page-iecst-SJFFJ4PC.js +1 -0
- package/dist/embed/embed-page-ignore-QLXHF7QX.js +1 -0
- package/dist/embed/embed-page-index.es-N6YIYNKZ.js +23 -0
- package/dist/embed/embed-page-info-NVLQJR56-2XLQRFF4.js +1 -0
- package/dist/embed/embed-page-infoDiagram-WHAUD3N6-2U2VIHJP.js +2 -0
- package/dist/embed/embed-page-inform7-6Y7MAAME.js +1 -0
- package/dist/embed/embed-page-inform7-HZB3RNF4.js +1 -0
- package/dist/embed/embed-page-ini-7C2L4IDF.js +1 -0
- package/dist/embed/embed-page-ini-TMKFFGPD.js +1 -0
- package/dist/embed/embed-page-io-X5SCSO5G.js +1 -0
- package/dist/embed/embed-page-irpf90-A5FIGB26.js +1 -0
- package/dist/embed/embed-page-isbl-Q77V4FXF.js +1 -0
- package/dist/embed/embed-page-j-MA6BTTGA.js +1 -0
- package/dist/embed/embed-page-java-CYPVO64F.js +1 -0
- package/dist/embed/embed-page-java-O37XO6YL.js +1 -0
- package/dist/embed/embed-page-javadoc-LWLUAHHX.js +1 -0
- package/dist/embed/embed-page-javadoclike-BMEJGG2H.js +1 -0
- package/dist/embed/embed-page-javascript-GU26522Z.js +1 -0
- package/dist/embed/embed-page-javascript-M37PIZZC.js +1 -0
- package/dist/embed/embed-page-javastacktrace-ENINDMIF.js +1 -0
- package/dist/embed/embed-page-jboss-cli-Q2WN2KZS.js +1 -0
- package/dist/embed/embed-page-jexl-EU2C4LRG.js +1 -0
- package/dist/embed/embed-page-jolie-WJIQVPRR.js +1 -0
- package/dist/embed/embed-page-journeyDiagram-XKPGCS4Q-D4A2GN62.js +139 -0
- package/dist/embed/embed-page-jq-BRF5PIAN.js +1 -0
- package/dist/embed/embed-page-js-extras-WQMVOPIZ.js +1 -0
- package/dist/embed/embed-page-js-templates-YO6IJU6R.js +1 -0
- package/dist/embed/embed-page-jsdoc-ZKI7O6VF.js +1 -0
- package/dist/embed/embed-page-json-MRFYB7NT.js +1 -0
- package/dist/embed/embed-page-json-PSHSOWQY.js +1 -0
- package/dist/embed/embed-page-json5-VQKDKRNE.js +1 -0
- package/dist/embed/embed-page-jsonp-ANEJBBKD.js +1 -0
- package/dist/embed/embed-page-jsstacktrace-XYAXX4Z3.js +1 -0
- package/dist/embed/embed-page-jsx-FZEE3QI5.js +1 -0
- package/dist/embed/embed-page-julia-5W6JANPT.js +1 -0
- package/dist/embed/embed-page-julia-EY2DW2U2.js +1 -0
- package/dist/embed/embed-page-julia-repl-O5XO6CSL.js +1 -0
- package/dist/embed/embed-page-kanban-definition-3W4ZIXB7-5JTDNV4G.js +89 -0
- package/dist/embed/embed-page-katex-BO63LHUI.js +261 -0
- package/dist/embed/embed-page-keepalived-OPG3P3WJ.js +1 -0
- package/dist/embed/embed-page-keyman-CXJENJBT.js +1 -0
- package/dist/embed/embed-page-kotlin-62Q32YH3.js +1 -0
- package/dist/embed/embed-page-kotlin-V4IBLBDP.js +1 -0
- package/dist/embed/embed-page-kumir-TIJGTYC3.js +1 -0
- package/dist/embed/embed-page-kusto-BXI53DND.js +1 -0
- package/dist/embed/embed-page-lasso-2CPND7XH.js +1 -0
- package/dist/embed/embed-page-latex-F3X5K6QF.js +1 -0
- package/dist/embed/embed-page-latex-MVG52AHA.js +1 -0
- package/dist/embed/embed-page-latte-J3LVOB6S.js +1 -0
- package/dist/embed/embed-page-ldif-5OWTENAQ.js +1 -0
- package/dist/embed/embed-page-leaf-EYR425IG.js +1 -0
- package/dist/embed/embed-page-less-S6CBMQQZ.js +1 -0
- package/dist/embed/embed-page-less-WDPLNQ5B.js +1 -0
- package/dist/embed/embed-page-lilypond-IJV67NKP.js +1 -0
- package/dist/embed/embed-page-linker-script-MIX3HOEH.js +1 -0
- package/dist/embed/embed-page-liquid-CFWS6T2J.js +1 -0
- package/dist/embed/embed-page-lisp-C6XPBZ5U.js +1 -0
- package/dist/embed/embed-page-lisp-IM4ILKS7.js +1 -0
- package/dist/embed/embed-page-livecodeserver-6F3SUK5W.js +1 -0
- package/dist/embed/embed-page-livescript-GNIYPIHH.js +1 -0
- package/dist/embed/embed-page-livescript-HOLSYBIG.js +1 -0
- package/dist/embed/embed-page-llvm-IWL5DLNH.js +1 -0
- package/dist/embed/embed-page-llvm-K2USHCCC.js +1 -0
- package/dist/embed/embed-page-log-BLJX5RSC.js +1 -0
- package/dist/embed/embed-page-lolcode-6COIIRQ6.js +1 -0
- package/dist/embed/embed-page-lsl-KDZSWM6S.js +1 -0
- package/dist/embed/embed-page-lua-5KEV5KHK.js +1 -0
- package/dist/embed/embed-page-lua-F7VBLUI5.js +1 -0
- package/dist/embed/embed-page-magma-TTQUX26J.js +1 -0
- package/dist/embed/embed-page-makefile-4VQZE7FW.js +1 -0
- package/dist/embed/embed-page-makefile-LDN5QGHW.js +1 -0
- package/dist/embed/embed-page-markdown-GU3NFA6A.js +1 -0
- package/dist/embed/embed-page-markdown-ODPEZXUU.js +1 -0
- package/dist/embed/embed-page-markup-W6JMQ64H.js +1 -0
- package/dist/embed/embed-page-markup-templating-RYGNVTG7.js +1 -0
- package/dist/embed/embed-page-mata-D4O4BNGS.js +1 -0
- package/dist/embed/embed-page-mathematica-YSU2VUX4.js +1 -0
- package/dist/embed/embed-page-matlab-6TYO6LKK.js +1 -0
- package/dist/embed/embed-page-matlab-DCIHZIZM.js +1 -0
- package/dist/embed/embed-page-maxima-K2VWPGLA.js +1 -0
- package/dist/embed/embed-page-maxscript-3ARRWLS6.js +1 -0
- package/dist/embed/embed-page-mel-E3F6H7ZF.js +1 -0
- package/dist/embed/embed-page-mel-YGI273IY.js +1 -0
- package/dist/embed/embed-page-mercury-LXCDDOJN.js +1 -0
- package/dist/embed/embed-page-mermaid-4FMYB3TJ.js +1 -0
- package/dist/embed/embed-page-mermaid-TBO3M7GX.js +18 -0
- package/dist/embed/embed-page-metafont-33QDNLJC.js +1 -0
- package/dist/embed/embed-page-mindmap-definition-VGOIOE7T-LVIRJQDW.js +68 -0
- package/dist/embed/embed-page-mipsasm-HSMSNEPP.js +1 -0
- package/dist/embed/embed-page-mizar-OTR4FHWG.js +1 -0
- package/dist/embed/embed-page-mizar-ZDNSLX4H.js +1 -0
- package/dist/embed/embed-page-mojolicious-2VJDUL4M.js +1 -0
- package/dist/embed/embed-page-mongodb-E62Y62DN.js +1 -0
- package/dist/embed/embed-page-monkey-KOVSP7SE.js +1 -0
- package/dist/embed/embed-page-monkey-MWSXB6DH.js +1 -0
- package/dist/embed/embed-page-moonscript-7DWCIDI5.js +1 -0
- package/dist/embed/embed-page-moonscript-AIMMMW7W.js +1 -0
- package/dist/embed/embed-page-n1ql-TKR2PAQ4.js +1 -0
- package/dist/embed/embed-page-n1ql-VSPMFQEE.js +1 -0
- package/dist/embed/embed-page-n4js-VQSAFSQG.js +1 -0
- package/dist/embed/embed-page-nand2tetris-hdl-ZN4LQDMB.js +1 -0
- package/dist/embed/embed-page-naniscript-FX42SAZY.js +1 -0
- package/dist/embed/embed-page-nasm-FGR3ELJL.js +1 -0
- package/dist/embed/embed-page-neon-4JXYQJP3.js +1 -0
- package/dist/embed/embed-page-nevod-2EHVRC32.js +1 -0
- package/dist/embed/embed-page-nginx-3W4BPZZB.js +1 -0
- package/dist/embed/embed-page-nginx-672JEBEN.js +1 -0
- package/dist/embed/embed-page-nim-CNSA5KTJ.js +1 -0
- package/dist/embed/embed-page-nim-CS7GVCRH.js +1 -0
- package/dist/embed/embed-page-nix-H37VR2HL.js +1 -0
- package/dist/embed/embed-page-nix-ODG6AI37.js +1 -0
- package/dist/embed/embed-page-node-repl-F5RCYIN3.js +1 -0
- package/dist/embed/embed-page-nsis-LEW5NHHS.js +1 -0
- package/dist/embed/embed-page-nsis-P73IQUMW.js +1 -0
- package/dist/embed/embed-page-objectivec-GOD2BEHI.js +1 -0
- package/dist/embed/embed-page-objectivec-UO34JBT5.js +1 -0
- package/dist/embed/embed-page-ocaml-ODOKMPKS.js +1 -0
- package/dist/embed/embed-page-ocaml-PW67TSNU.js +1 -0
- package/dist/embed/embed-page-odin-42BCJRMU.js +1 -0
- package/dist/embed/embed-page-opencl-FWU2AVTW.js +1 -0
- package/dist/embed/embed-page-openqasm-D2QQCO47.js +1 -0
- package/dist/embed/embed-page-openscad-LZPRFY2W.js +1 -0
- package/dist/embed/embed-page-oxygene-HZG7OO7G.js +1 -0
- package/dist/embed/embed-page-oz-MQNQCKRU.js +1 -0
- package/dist/embed/embed-page-packet-BFZMPI3H-JUHAABU6.js +1 -0
- package/dist/embed/embed-page-parigp-MAX3X22G.js +1 -0
- package/dist/embed/embed-page-parser-2WFCRGYE.js +1 -0
- package/dist/embed/embed-page-parser3-C3KVU5ZC.js +1 -0
- package/dist/embed/embed-page-pascal-LVXMXCNE.js +1 -0
- package/dist/embed/embed-page-pascaligo-6RIW5OHU.js +1 -0
- package/dist/embed/embed-page-pcaxis-ZO5S5UAO.js +1 -0
- package/dist/embed/embed-page-peoplecode-EAE6M4AF.js +1 -0
- package/dist/embed/embed-page-perl-CAUIKKUT.js +1 -0
- package/dist/embed/embed-page-perl-NCR5YMVT.js +1 -0
- package/dist/embed/embed-page-pf-TXMTVH7H.js +1 -0
- package/dist/embed/embed-page-pgsql-M7L7YRCD.js +1 -0
- package/dist/embed/embed-page-php-IE2N3QI4.js +1 -0
- package/dist/embed/embed-page-php-QCBSAYIC.js +1 -0
- package/dist/embed/embed-page-php-extras-VRZO47SA.js +1 -0
- package/dist/embed/embed-page-php-template-U54UCRKN.js +1 -0
- package/dist/embed/embed-page-phpdoc-ZQWB2OXG.js +1 -0
- package/dist/embed/embed-page-pie-7BOR55EZ-GU56BHQJ.js +1 -0
- package/dist/embed/embed-page-pieDiagram-ADFJNKIX-JXFHXEAJ.js +30 -0
- package/dist/embed/embed-page-plaintext-OINTKMAM.js +1 -0
- package/dist/embed/embed-page-plant-uml-3RVWLPWM.js +1 -0
- package/dist/embed/embed-page-plsql-XQEBXO73.js +1 -0
- package/dist/embed/embed-page-pony-UEK5X7OI.js +1 -0
- package/dist/embed/embed-page-powerquery-DEKKCZY7.js +1 -0
- package/dist/embed/embed-page-powershell-EBW7RZTN.js +1 -0
- package/dist/embed/embed-page-powershell-UMB53SPC.js +1 -0
- package/dist/embed/embed-page-processing-56OIROQG.js +1 -0
- package/dist/embed/embed-page-processing-ZIDQ7SB3.js +1 -0
- package/dist/embed/embed-page-profile-6SSPU7PG.js +1 -0
- package/dist/embed/embed-page-prolog-7JA2UBRP.js +1 -0
- package/dist/embed/embed-page-prolog-L55HYSKT.js +1 -0
- package/dist/embed/embed-page-promql-L4YBO3EF.js +1 -0
- package/dist/embed/embed-page-properties-O3BOEJXJ.js +1 -0
- package/dist/embed/embed-page-properties-VGZTUJ5E.js +1 -0
- package/dist/embed/embed-page-protobuf-F7X2PLJJ.js +1 -0
- package/dist/embed/embed-page-protobuf-GS5HMEMS.js +1 -0
- package/dist/embed/embed-page-psl-HLKSMRWT.js +1 -0
- package/dist/embed/embed-page-pug-MI7HPGUX.js +1 -0
- package/dist/embed/embed-page-puppet-2HD3DPH2.js +1 -0
- package/dist/embed/embed-page-puppet-BRWZHTKL.js +1 -0
- package/dist/embed/embed-page-pure-FVSDVQ2B.js +1 -0
- package/dist/embed/embed-page-purebasic-PPHAGMQH.js +1 -0
- package/dist/embed/embed-page-purebasic-UVZDR2HE.js +1 -0
- package/dist/embed/embed-page-purescript-Q3TGKQZY.js +1 -0
- package/dist/embed/embed-page-purify-QTVE4GEG.js +8 -0
- package/dist/embed/embed-page-python-NO3SIOCK.js +1 -0
- package/dist/embed/embed-page-python-YAPGCWHR.js +1 -0
- package/dist/embed/embed-page-python-repl-EIGKWV4T.js +1 -0
- package/dist/embed/embed-page-q-5YCCZLRO.js +1 -0
- package/dist/embed/embed-page-q-FWJ5L5RH.js +1 -0
- package/dist/embed/embed-page-qml-PNZK27ST.js +1 -0
- package/dist/embed/embed-page-qml-YVZULPLY.js +1 -0
- package/dist/embed/embed-page-qore-QU7W2FQD.js +1 -0
- package/dist/embed/embed-page-qsharp-FNGNB3PK.js +1 -0
- package/dist/embed/embed-page-quadrantDiagram-AYHSOK5B-4BXTDPJ4.js +7 -0
- package/dist/embed/embed-page-r-52DQANKK.js +1 -0
- package/dist/embed/embed-page-r-B2QMYOFX.js +1 -0
- package/dist/embed/embed-page-racket-OA22GPFB.js +1 -0
- package/dist/embed/embed-page-radar-NHE76QYJ-A7QQXLRI.js +1 -0
- package/dist/embed/embed-page-reason-QQ4RYUQI.js +1 -0
- package/dist/embed/embed-page-reasonml-CQAWSREB.js +1 -0
- package/dist/embed/embed-page-regex-5JJLL4V6.js +1 -0
- package/dist/embed/embed-page-rego-OLGGN4OK.js +1 -0
- package/dist/embed/embed-page-renpy-72F6BTO6.js +1 -0
- package/dist/embed/embed-page-requirementDiagram-UZGBJVZJ-WA3XXOP7.js +64 -0
- package/dist/embed/embed-page-rescript-VYN4PAG7.js +1 -0
- package/dist/embed/embed-page-rest-YZNSQW6O.js +1 -0
- package/dist/embed/embed-page-rib-U4ELGIV2.js +1 -0
- package/dist/embed/embed-page-rip-ZA4CVYFN.js +1 -0
- package/dist/embed/embed-page-roboconf-5IGYRDNH.js +1 -0
- package/dist/embed/embed-page-roboconf-HKSGWVI6.js +1 -0
- package/dist/embed/embed-page-robotframework-ARNA4YNR.js +1 -0
- package/dist/embed/embed-page-routeros-DKQKHPKR.js +1 -0
- package/dist/embed/embed-page-rsl-WZYNFUWJ.js +1 -0
- package/dist/embed/embed-page-ruby-DLLZKK7A.js +1 -0
- package/dist/embed/embed-page-ruby-TKJZO362.js +1 -0
- package/dist/embed/embed-page-ruleslanguage-7CSB4CWD.js +1 -0
- package/dist/embed/embed-page-rust-6JUJCSHC.js +1 -0
- package/dist/embed/embed-page-rust-ZZUD5RKM.js +1 -0
- package/dist/embed/embed-page-sankeyDiagram-TZEHDZUN-SAVUI2Q4.js +10 -0
- package/dist/embed/embed-page-sas-6H3LYHVP.js +1 -0
- package/dist/embed/embed-page-sas-EUBD2V4Z.js +1 -0
- package/dist/embed/embed-page-sass-U6G7R7AZ.js +1 -0
- package/dist/embed/embed-page-scala-HFYNBK2U.js +1 -0
- package/dist/embed/embed-page-scala-OJM3677P.js +1 -0
- package/dist/embed/embed-page-scheme-KBT7Z3ND.js +1 -0
- package/dist/embed/embed-page-scheme-QQ2VPTFQ.js +1 -0
- package/dist/embed/embed-page-scilab-LA3HLVKQ.js +1 -0
- package/dist/embed/embed-page-scss-FDEUPWYR.js +1 -0
- package/dist/embed/embed-page-scss-IH2AODYU.js +1 -0
- package/dist/embed/embed-page-sequenceDiagram-WL72ISMW-C2QRTOTL.js +145 -0
- package/dist/embed/embed-page-shell-O7OU7Y7F.js +1 -0
- package/dist/embed/embed-page-shell-session-CPCKA76Q.js +1 -0
- package/dist/embed/embed-page-smali-3HHDEBNE.js +1 -0
- package/dist/embed/embed-page-smali-L7H7BQUY.js +1 -0
- package/dist/embed/embed-page-smalltalk-KQLA6XRI.js +1 -0
- package/dist/embed/embed-page-smalltalk-WMM37MR4.js +1 -0
- package/dist/embed/embed-page-smarty-AF5LZRHA.js +1 -0
- package/dist/embed/embed-page-sml-4ARWLXZU.js +1 -0
- package/dist/embed/embed-page-sml-6BNN3PMR.js +1 -0
- package/dist/embed/embed-page-solidity-5WL56MR7.js +1 -0
- package/dist/embed/embed-page-solution-file-FJJU2R2L.js +1 -0
- package/dist/embed/embed-page-soy-54PPSPCO.js +1 -0
- package/dist/embed/embed-page-sparql-AC7LG2EE.js +1 -0
- package/dist/embed/embed-page-splunk-spl-YBP24JOS.js +1 -0
- package/dist/embed/embed-page-sqf-4E5P576B.js +1 -0
- package/dist/embed/embed-page-sqf-CSHANDQB.js +1 -0
- package/dist/embed/embed-page-sql-MGWNK6FE.js +1 -0
- package/dist/embed/embed-page-sql-ZOJORZUC.js +1 -0
- package/dist/embed/embed-page-sql_more-NACOUKSZ.js +1 -0
- package/dist/embed/embed-page-squirrel-XG35KUR2.js +1 -0
- package/dist/embed/embed-page-stan-GDB32LYB.js +1 -0
- package/dist/embed/embed-page-stan-UJ7WCNJT.js +1 -0
- package/dist/embed/embed-page-stata-DEQ57OIC.js +1 -0
- package/dist/embed/embed-page-stata-WJUFDMUW.js +1 -0
- package/dist/embed/embed-page-stateDiagram-FKZM4ZOC-6LDVHEHS.js +1 -0
- package/dist/embed/embed-page-stateDiagram-v2-4FDKWEC3-UJYGEYF5.js +1 -0
- package/dist/embed/embed-page-step21-6AYDKM5N.js +1 -0
- package/dist/embed/embed-page-stylus-CFL6FZN3.js +1 -0
- package/dist/embed/embed-page-stylus-MLEF22IY.js +1 -0
- package/dist/embed/embed-page-subunit-OZQ2HNNA.js +1 -0
- package/dist/embed/embed-page-supercollider-ZK2ECEDQ.js +1 -0
- package/dist/embed/embed-page-swift-MNLMKF5F.js +1 -0
- package/dist/embed/embed-page-swift-UJP2CPA4.js +1 -0
- package/dist/embed/embed-page-systemd-DQXTIGWD.js +1 -0
- package/dist/embed/embed-page-t4-cs-ZPHNHWPR.js +1 -0
- package/dist/embed/embed-page-t4-templating-OA7FNPXM.js +1 -0
- package/dist/embed/embed-page-t4-vb-XBX2HBI5.js +1 -0
- package/dist/embed/embed-page-taggerscript-XVALJYA3.js +1 -0
- package/dist/embed/embed-page-tap-EMOHKH5F.js +1 -0
- package/dist/embed/embed-page-tap-HZHER7FY.js +1 -0
- package/dist/embed/embed-page-tcl-GN4WSRHR.js +1 -0
- package/dist/embed/embed-page-tcl-T3WWKS3Q.js +1 -0
- package/dist/embed/embed-page-textile-OXFYF2DV.js +1 -0
- package/dist/embed/embed-page-thrift-Q26IKVBC.js +1 -0
- package/dist/embed/embed-page-timeline-definition-IT6M3QCI-OF6FTGVN.js +61 -0
- package/dist/embed/embed-page-toml-ZVNI7WJB.js +1 -0
- package/dist/embed/embed-page-tp-24NWOAQZ.js +1 -0
- package/dist/embed/embed-page-treemap-KMMF4GRG-HPTV3SYE.js +1 -0
- package/dist/embed/embed-page-tremor-443PBNWC.js +1 -0
- package/dist/embed/embed-page-tsx-PX2Z4GDU.js +1 -0
- package/dist/embed/embed-page-tt2-L43LNTGL.js +1 -0
- package/dist/embed/embed-page-turtle-IXYYTHLU.js +1 -0
- package/dist/embed/embed-page-twig-MZBQAWRC.js +1 -0
- package/dist/embed/embed-page-twig-WSAAZNH3.js +1 -0
- package/dist/embed/embed-page-typescript-5UWO3Y3K.js +1 -0
- package/dist/embed/embed-page-typescript-BPIRCQG7.js +1 -0
- package/dist/embed/embed-page-typoscript-UUKPTXPH.js +1 -0
- package/dist/embed/embed-page-unrealscript-G2VHZRFN.js +1 -0
- package/dist/embed/embed-page-uorazor-WYGVL7PT.js +1 -0
- package/dist/embed/embed-page-uri-NRWWZBB7.js +1 -0
- package/dist/embed/embed-page-v-LKVTPKDV.js +1 -0
- package/dist/embed/embed-page-vala-EL5BNKYD.js +1 -0
- package/dist/embed/embed-page-vala-MLIRE3PS.js +1 -0
- package/dist/embed/embed-page-vbnet-5JKSIZ56.js +1 -0
- package/dist/embed/embed-page-vbnet-KOGX2JTL.js +1 -0
- package/dist/embed/embed-page-vbscript-637T6GXI.js +1 -0
- package/dist/embed/embed-page-vbscript-html-YKWMMXG4.js +1 -0
- package/dist/embed/embed-page-velocity-7Q63BBW2.js +1 -0
- package/dist/embed/embed-page-verilog-B6EWQWMJ.js +1 -0
- package/dist/embed/embed-page-verilog-G566LGG4.js +1 -0
- package/dist/embed/embed-page-vhdl-R5JIOJNH.js +1 -0
- package/dist/embed/embed-page-vhdl-RMOYZXLG.js +1 -0
- package/dist/embed/embed-page-vim-47Q56RS4.js +1 -0
- package/dist/embed/embed-page-vim-KBCAYMER.js +1 -0
- package/dist/embed/embed-page-visual-basic-ZYE5FD6G.js +1 -0
- package/dist/embed/embed-page-warpscript-65UOMFFU.js +1 -0
- package/dist/embed/embed-page-wasm-MSBGNWUM.js +1 -0
- package/dist/embed/embed-page-web-idl-7WW5RGOI.js +1 -0
- package/dist/embed/embed-page-wgsl-FG3PI6M7.js +1 -0
- package/dist/embed/embed-page-wiki-DGVS4GPN.js +1 -0
- package/dist/embed/embed-page-wolfram-MOURXWVE.js +1 -0
- package/dist/embed/embed-page-wren-PYL5ZRVR.js +1 -0
- package/dist/embed/embed-page-x86asm-WQ6M3VHZ.js +1 -0
- package/dist/embed/embed-page-xeora-JSPZIDKL.js +1 -0
- package/dist/embed/embed-page-xl-DTY4E7YS.js +1 -0
- package/dist/embed/embed-page-xml-P5QA5BKM.js +1 -0
- package/dist/embed/embed-page-xml-doc-VAJOIYSW.js +1 -0
- package/dist/embed/embed-page-xojo-L2PDU7MC.js +1 -0
- package/dist/embed/embed-page-xquery-EWBQ7NVP.js +1 -0
- package/dist/embed/embed-page-xquery-RUKMMBO2.js +1 -0
- package/dist/embed/embed-page-xychartDiagram-PRI3JC2R-EWLR5Z3I.js +7 -0
- package/dist/embed/embed-page-yaml-76KRB6BP.js +1 -0
- package/dist/embed/embed-page-yaml-RR5MLWRK.js +1 -0
- package/dist/embed/embed-page-yang-J62Y5RPD.js +1 -0
- package/dist/embed/embed-page-zephir-OIOOQGNI.js +1 -0
- package/dist/embed/embed-page-zig-75SL5ZWR.js +1 -0
- package/dist/embed/embed-page.css +1 -0
- package/dist/embed/embed-page.js +6 -0
- package/dist/index.d.mts +19 -40
- package/dist/index.d.ts +19 -40
- package/dist/index.js +1157 -701
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +885 -659
- package/dist/index.mjs.map +1 -1
- package/dist/{mcp-configs-SHRMQHIL.mjs → mcp-configs-IIKQM5GM.mjs} +2 -2
- package/dist/mcpTransportRegistry-XMJ5Y2RG.mjs +13 -0
- package/dist/mcpTransportRegistry-XMJ5Y2RG.mjs.map +1 -0
- package/dist/open-DCAOL5CG.mjs +176 -0
- package/dist/open-DCAOL5CG.mjs.map +1 -0
- package/package.json +11 -8
- /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-
|
|
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
|
|
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 [
|
|
4125
|
-
if (
|
|
4126
|
-
result.set(
|
|
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
|
|
6227
|
+
const path5 = request.query.path || "/";
|
|
6228
6228
|
const assistantId = request.query.assistantId;
|
|
6229
|
-
console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${
|
|
6230
|
-
const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId,
|
|
6231
|
-
console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${
|
|
6232
|
-
const files = await backend.lsInfo(
|
|
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:
|
|
6240
|
-
const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId,
|
|
6241
|
-
const content = await backend.read(
|
|
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
|
|
9102
|
+
const path5 = request.url.split("?")[0];
|
|
9103
9103
|
const method = request.method;
|
|
9104
|
-
if (method === "GET" && /^\/api\/web-apps\/[^/]+\/runtime\/bootstrap$/.test(
|
|
9105
|
-
if (request.method === "GET" && /^\/api\/a2a\/agents\/[^/]+\/\.well-known\/agent-card\.json$/.test(
|
|
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(
|
|
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
|
|
9132
|
-
if (request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/viewfile$/.test(
|
|
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(
|
|
10261
|
-
const match =
|
|
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
|
|
13225
|
+
import { z as z8 } from "zod";
|
|
13120
13226
|
|
|
13121
13227
|
// src/services/capability/CapabilityBundleService.ts
|
|
13122
|
-
import { z as
|
|
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 =
|
|
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 =
|
|
13335
|
-
var createSchema =
|
|
13336
|
-
var updateSchema = createSchema.partial().extend({ expectedUpdatedAt:
|
|
13337
|
-
var bundleIdSchema =
|
|
13338
|
-
var bundleParamsSchema =
|
|
13339
|
-
var projectSchema =
|
|
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
|
|
14214
|
-
var id2 =
|
|
14215
|
-
var isoDate =
|
|
14216
|
-
var expectedUpdatedAt =
|
|
14217
|
-
var projectRoomParamsSchema =
|
|
14218
|
-
var membershipParamsSchema =
|
|
14219
|
-
var roomMessagesQuerySchema =
|
|
14220
|
-
beforeCreatedAt:
|
|
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:
|
|
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 =
|
|
14225
|
-
text:
|
|
14226
|
-
mentions:
|
|
14227
|
-
|
|
14228
|
-
|
|
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 =
|
|
14233
|
-
var updateProjectMemberSchema =
|
|
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 =
|
|
14236
|
-
var emptyObjectSchema =
|
|
14237
|
-
var idempotencyKeySchema =
|
|
14238
|
-
var addProjectBotSchema =
|
|
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:
|
|
14241
|
-
title:
|
|
14242
|
-
responsibility:
|
|
14243
|
-
mentionName:
|
|
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 =
|
|
14246
|
-
role:
|
|
14247
|
-
title:
|
|
14248
|
-
responsibility:
|
|
14249
|
-
mentionName:
|
|
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
|
-
|
|
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
|
|
14465
|
-
const bTime = b.lastMessage
|
|
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:
|
|
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/
|
|
17685
|
-
import {
|
|
17686
|
-
|
|
17687
|
-
|
|
17688
|
-
|
|
17689
|
-
|
|
17690
|
-
|
|
17691
|
-
|
|
17692
|
-
|
|
17693
|
-
|
|
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.
|
|
17714
|
-
this.
|
|
17715
|
-
this.
|
|
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
|
-
/**
|
|
17731
|
-
|
|
17732
|
-
this.
|
|
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
|
-
/**
|
|
17735
|
-
|
|
17736
|
-
this.
|
|
17926
|
+
/** Closes admission without interrupting accepted work. */
|
|
17927
|
+
closeAdmission() {
|
|
17928
|
+
this.accepting = false;
|
|
17737
17929
|
}
|
|
17738
|
-
/**
|
|
17739
|
-
|
|
17740
|
-
|
|
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
|
|
17743
|
-
|
|
17744
|
-
|
|
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
|
-
|
|
17762
|
-
|
|
17763
|
-
|
|
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.
|
|
17784
|
-
|
|
17785
|
-
|
|
17786
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
17821
|
-
|
|
17822
|
-
|
|
17823
|
-
|
|
17824
|
-
this.
|
|
17825
|
-
|
|
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
|
-
|
|
17829
|
-
|
|
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
|
-
|
|
17833
|
-
|
|
17834
|
-
|
|
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
|
-
|
|
17837
|
-
if (this.closed) return;
|
|
17999
|
+
warn(message, context) {
|
|
17838
18000
|
try {
|
|
17839
|
-
|
|
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
|
-
|
|
17857
|
-
|
|
17858
|
-
|
|
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
|
|
17875
|
-
|
|
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/
|
|
17880
|
-
var
|
|
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.
|
|
17887
|
-
this.
|
|
17888
|
-
this.
|
|
17889
|
-
this.
|
|
17890
|
-
this.
|
|
17891
|
-
|
|
17892
|
-
|
|
17893
|
-
|
|
17894
|
-
|
|
17895
|
-
|
|
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
|
-
|
|
18019
|
-
|
|
18020
|
-
|
|
18021
|
-
|
|
18022
|
-
|
|
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
|
-
/**
|
|
18036
|
+
/** Stops admission, drains accepted work, and closes transport resources exactly once. */
|
|
18026
18037
|
close() {
|
|
18027
|
-
|
|
18028
|
-
this.
|
|
18029
|
-
|
|
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
|
|
18033
|
-
|
|
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
|
|
18036
|
-
|
|
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
|
-
|
|
18039
|
-
|
|
18040
|
-
|
|
18041
|
-
|
|
18042
|
-
|
|
18043
|
-
|
|
18044
|
-
|
|
18045
|
-
|
|
18046
|
-
|
|
18047
|
-
|
|
18048
|
-
|
|
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
|
-
|
|
18053
|
-
|
|
18054
|
-
|
|
18055
|
-
|
|
18056
|
-
|
|
18057
|
-
|
|
18058
|
-
this.
|
|
18059
|
-
this.
|
|
18060
|
-
this.
|
|
18061
|
-
this.
|
|
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.
|
|
18064
|
-
this.
|
|
18065
|
-
|
|
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
|
-
/**
|
|
18068
|
-
|
|
18069
|
-
|
|
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
|
-
/**
|
|
18098
|
-
|
|
18099
|
-
this.
|
|
18135
|
+
/** Enqueues one connection control event. */
|
|
18136
|
+
enqueueControl(event) {
|
|
18137
|
+
this.enqueue(serializeControl(event));
|
|
18100
18138
|
}
|
|
18101
|
-
/**
|
|
18102
|
-
|
|
18103
|
-
|
|
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
|
-
/**
|
|
18115
|
-
|
|
18116
|
-
this.
|
|
18117
|
-
|
|
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
|
-
|
|
18121
|
-
|
|
18122
|
-
|
|
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 (
|
|
18125
|
-
|
|
18126
|
-
|
|
18127
|
-
|
|
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
|
-
|
|
18198
|
+
return promise;
|
|
18131
18199
|
}
|
|
18132
|
-
|
|
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
|
-
|
|
18135
|
-
|
|
18136
|
-
|
|
18137
|
-
|
|
18138
|
-
this.
|
|
18139
|
-
|
|
18140
|
-
|
|
18141
|
-
|
|
18142
|
-
|
|
18143
|
-
|
|
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
|
-
|
|
18164
|
-
|
|
18165
|
-
|
|
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
|
-
|
|
18241
|
+
writeFrame(frame) {
|
|
18242
|
+
if (this.closed) return;
|
|
18171
18243
|
try {
|
|
18172
|
-
this.
|
|
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
|
-
|
|
18177
|
-
this.
|
|
18178
|
-
|
|
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
|
|
18182
|
-
|
|
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/
|
|
18186
|
-
var
|
|
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.
|
|
18190
|
-
this.
|
|
18191
|
-
this.
|
|
18192
|
-
this.
|
|
18193
|
-
this.
|
|
18194
|
-
this.
|
|
18195
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
18211
|
-
|
|
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
|
-
|
|
18214
|
-
|
|
18215
|
-
|
|
18216
|
-
|
|
18217
|
-
|
|
18218
|
-
|
|
18219
|
-
|
|
18220
|
-
|
|
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
|
-
|
|
18223
|
-
this.service.close();
|
|
18224
|
-
this.broker.close();
|
|
18467
|
+
return record;
|
|
18225
18468
|
}
|
|
18226
18469
|
};
|
|
18227
|
-
|
|
18228
|
-
|
|
18229
|
-
|
|
18230
|
-
|
|
18231
|
-
|
|
18232
|
-
|
|
18233
|
-
|
|
18234
|
-
|
|
18235
|
-
|
|
18236
|
-
|
|
18237
|
-
|
|
18238
|
-
|
|
18239
|
-
|
|
18240
|
-
|
|
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/
|
|
18261
|
-
import {
|
|
18262
|
-
function
|
|
18263
|
-
app2.get("/api/
|
|
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
|
|
18266
|
-
const headers = strictHeaders(request
|
|
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.
|
|
18284
|
-
|
|
18285
|
-
|
|
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
|
|
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 >
|
|
18309
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
21696
|
+
import { z as z10 } from "zod";
|
|
21465
21697
|
import { snapshotExactRecord as snapshotExactRecord15 } from "@axiom-lattice/protocols";
|
|
21466
|
-
var roomConfigSchema =
|
|
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" ?
|
|
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-
|
|
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");
|