@axiom-lattice/gateway 4.1.7 → 4.2.1
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/{A2AAuthService-DK5X6VIL.mjs → A2AAuthService-7UGQ7GMW.mjs} +3 -2
- package/dist/{WechatChannelAdapter-WSDKR4OA.mjs → WechatChannelAdapter-7WHE5UGY.mjs} +2 -1
- package/dist/{WechatChannelAdapter-WSDKR4OA.mjs.map → WechatChannelAdapter-7WHE5UGY.mjs.map} +1 -1
- package/dist/{a2a-7N3WDAOP.mjs → a2a-FGYX2HH3.mjs} +71 -32
- package/dist/a2a-FGYX2HH3.mjs.map +1 -0
- package/dist/{a2a-standard-WC2BSOFV.mjs → a2a-standard-VEQBXBMM.mjs} +93 -115
- package/dist/a2a-standard-VEQBXBMM.mjs.map +1 -0
- package/dist/agentProvider-X4FVQPKW.mjs +88 -0
- package/dist/agentProvider-X4FVQPKW.mjs.map +1 -0
- package/dist/chunk-2POW27EI.mjs +27 -0
- package/dist/chunk-2POW27EI.mjs.map +1 -0
- package/dist/chunk-52SUWMOX.mjs +121 -0
- package/dist/chunk-52SUWMOX.mjs.map +1 -0
- package/dist/chunk-GF4GGTWJ.mjs +164 -0
- package/dist/chunk-GF4GGTWJ.mjs.map +1 -0
- package/dist/{chunk-2HOCF46L.mjs → chunk-GPHOYR3X.mjs} +33 -11
- package/dist/chunk-GPHOYR3X.mjs.map +1 -0
- package/dist/chunk-K32XEQLH.mjs +28 -0
- package/dist/chunk-K32XEQLH.mjs.map +1 -0
- package/dist/chunk-NFEGQTCC.mjs +27 -0
- package/dist/chunk-PWHUWFXL.mjs +173 -0
- package/dist/chunk-PWHUWFXL.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/chunk-QUT2DS4R.mjs +50 -0
- package/dist/chunk-QUT2DS4R.mjs.map +1 -0
- package/dist/chunk-TJAUXMYJ.mjs +109 -0
- package/dist/chunk-TJAUXMYJ.mjs.map +1 -0
- package/dist/chunk-WKNZ7GBC.mjs +56 -0
- package/dist/chunk-WKNZ7GBC.mjs.map +1 -0
- package/dist/collection_service-RTRJEQFL.mjs +8 -0
- package/dist/collection_service-RTRJEQFL.mjs.map +1 -0
- 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-KGYKTMZR.js +1 -0
- package/dist/embed/embed-page-AgentDetailSideApp-O6G4NJ7I.css +1 -0
- package/dist/embed/embed-page-AgentGovernanceWorkbench-F42AJH77.js +5 -0
- package/dist/embed/embed-page-AgentGovernanceWorkbench-SFZNVMUH.css +1 -0
- package/dist/embed/embed-page-MessageGraph-ACHQORG7.js +6 -0
- package/dist/embed/embed-page-MessageGraph-TYOOATYV.css +1 -0
- package/dist/embed/embed-page-ReactChart-FGUHXBED.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-SFZ5HLMK.js +1 -0
- package/dist/embed/embed-page-SkillFlow-VDPP5DFL.css +1 -0
- package/dist/embed/embed-page-TasksSideApp-4GY5YBTN.js +241 -0
- package/dist/embed/embed-page-TasksSideApp-F4XUHPTG.css +1 -0
- package/dist/embed/embed-page-TeamWorkspace-DXKGNQ3C.css +1 -0
- package/dist/embed/embed-page-TeamWorkspace-YWE6ZTLB.js +748 -0
- package/dist/embed/embed-page-TopologyRuntimeView-2NQ3OOYI.css +1 -0
- package/dist/embed/embed-page-TopologyRuntimeView-MKFPCHT3.js +6 -0
- package/dist/embed/embed-page-WorkflowAutomationView-MAYS27YJ.css +1 -0
- package/dist/embed/embed-page-WorkflowAutomationView-WT6VH5HD.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-3PY2YGBU.js +153 -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-3WXEO6CG.js +245 -0
- package/dist/embed/embed-page-chunk-3YID7Y73.js +1 -0
- package/dist/embed/embed-page-chunk-42S7N5Y5.js +4084 -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-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-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-67U2KZFL.js +467 -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-74BPRLSV.js +5 -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-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-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-AC6X2XRH.js +31 -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-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-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-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-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-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-FDID7LZP.js +3 -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-FU2KMTSK.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-HS5VQFWH.js +37 -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-IV5C4DYL.js +5 -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-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-KEL6XU6R.js +1 -0
- package/dist/embed/embed-page-chunk-KGP2RGEC.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-MGZK7ELC.js +2192 -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-N46WJ2FS.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-O4QK5LWZ.js +525 -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-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-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-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-Z7USDLHI.js +60 -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-Y6CQA4CN.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-CW4QCAH3.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 +3605 -1694
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1125 -900
- package/dist/index.mjs.map +1 -1
- package/dist/kbProvider-2D6DZ34N.mjs +50 -0
- package/dist/kbProvider-2D6DZ34N.mjs.map +1 -0
- package/dist/{mcp-configs-SHRMQHIL.mjs → mcp-configs-WCY5EXCW.mjs} +3 -2
- package/dist/mcp-configs-WCY5EXCW.mjs.map +1 -0
- package/dist/mcpTransportRegistry-VXUVJKBC.mjs +14 -0
- package/dist/mcpTransportRegistry-VXUVJKBC.mjs.map +1 -0
- package/dist/open-HH7RKGML.mjs +260 -0
- package/dist/open-HH7RKGML.mjs.map +1 -0
- package/dist/open-audit-UJ3NXCGW.mjs +32 -0
- package/dist/open-audit-UJ3NXCGW.mjs.map +1 -0
- package/dist/open-catalog-WYS2AENM.mjs +59 -0
- package/dist/open-catalog-WYS2AENM.mjs.map +1 -0
- package/dist/open-exposure-FK4G6O6L.mjs +67 -0
- package/dist/open-exposure-FK4G6O6L.mjs.map +1 -0
- package/dist/open-files-GVRMK5PL.mjs +146 -0
- package/dist/open-files-GVRMK5PL.mjs.map +1 -0
- package/dist/open-session-3VN65PRR.mjs +53 -0
- package/dist/open-session-3VN65PRR.mjs.map +1 -0
- package/dist/openLattice-GAAGQJST.mjs +16 -0
- package/dist/openLattice-GAAGQJST.mjs.map +1 -0
- package/dist/registerExposedPlugins-63EUF4VS.mjs +99 -0
- package/dist/registerExposedPlugins-63EUF4VS.mjs.map +1 -0
- package/dist/{resources-VA7LSDKN.mjs → resources-SRQRKW5G.mjs} +47 -4
- package/dist/resources-SRQRKW5G.mjs.map +1 -0
- package/dist/sandboxProvider-I3P66VXT.mjs +10 -0
- package/dist/sandboxProvider-I3P66VXT.mjs.map +1 -0
- package/dist/{sender-PX32VSHB.mjs → sender-PLDU5EZ3.mjs} +3 -1
- package/dist/{sender-PX32VSHB.mjs.map → sender-PLDU5EZ3.mjs.map} +1 -1
- package/package.json +11 -8
- package/dist/a2a-7N3WDAOP.mjs.map +0 -1
- package/dist/a2a-standard-WC2BSOFV.mjs.map +0 -1
- package/dist/chunk-2HOCF46L.mjs.map +0 -1
- package/dist/resources-VA7LSDKN.mjs.map +0 -1
- /package/dist/{A2AAuthService-DK5X6VIL.mjs.map → A2AAuthService-7UGQ7GMW.mjs.map} +0 -0
- /package/dist/{mcp-configs-SHRMQHIL.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getContentTypeFromFilename,
|
|
3
|
+
getFilenameFromPath
|
|
4
|
+
} from "./chunk-LHQY46YB.mjs";
|
|
5
|
+
import {
|
|
6
|
+
buildPreviewTokenScript
|
|
7
|
+
} from "./chunk-2POW27EI.mjs";
|
|
8
|
+
import "./chunk-WKNZ7GBC.mjs";
|
|
9
|
+
import {
|
|
10
|
+
CollectionService
|
|
11
|
+
} from "./chunk-PWHUWFXL.mjs";
|
|
1
12
|
import {
|
|
2
13
|
registerMcpServerConfigRoutes
|
|
3
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-QKPZWWHH.mjs";
|
|
4
15
|
import {
|
|
5
16
|
Logger,
|
|
6
17
|
getQrCode,
|
|
@@ -16,10 +27,7 @@ import {
|
|
|
16
27
|
resolvePathWithinRoot,
|
|
17
28
|
saveProjectFile
|
|
18
29
|
} from "./chunk-J4BK77PA.mjs";
|
|
19
|
-
import
|
|
20
|
-
getContentTypeFromFilename,
|
|
21
|
-
getFilenameFromPath
|
|
22
|
-
} from "./chunk-LHQY46YB.mjs";
|
|
30
|
+
import "./chunk-NFEGQTCC.mjs";
|
|
23
31
|
|
|
24
32
|
// src/index.ts
|
|
25
33
|
import "dotenv/config";
|
|
@@ -29,7 +37,7 @@ import multipart from "@fastify/multipart";
|
|
|
29
37
|
import sensible from "@fastify/sensible";
|
|
30
38
|
import websocket from "@fastify/websocket";
|
|
31
39
|
import staticPlugin from "@fastify/static";
|
|
32
|
-
import
|
|
40
|
+
import path4 from "path";
|
|
33
41
|
|
|
34
42
|
// src/routes/index.ts
|
|
35
43
|
import { randomUUID as randomUUID19 } from "crypto";
|
|
@@ -2022,7 +2030,12 @@ async function getHealth(request, reply) {
|
|
|
2022
2030
|
}
|
|
2023
2031
|
|
|
2024
2032
|
// src/services/skill_service.ts
|
|
2025
|
-
import {
|
|
2033
|
+
import {
|
|
2034
|
+
SandboxSkillStore,
|
|
2035
|
+
PluginRegistry,
|
|
2036
|
+
getSandboxPluginCatalog,
|
|
2037
|
+
parseSkillFrontmatter
|
|
2038
|
+
} from "@axiom-lattice/core";
|
|
2026
2039
|
var PLUGIN_SKILL_SOURCE = "builtin-plugin";
|
|
2027
2040
|
function getTenantId4(request) {
|
|
2028
2041
|
return request.user?.tenantId || request.headers["x-tenant-id"] || "default";
|
|
@@ -2059,6 +2072,36 @@ var SkillService = class {
|
|
|
2059
2072
|
constructor() {
|
|
2060
2073
|
this.store = new SandboxSkillStore();
|
|
2061
2074
|
}
|
|
2075
|
+
/**
|
|
2076
|
+
* Read the read-only skills contributed by the tenant's sandbox plugins.
|
|
2077
|
+
* Sandbox failures degrade silently so the system view still returns
|
|
2078
|
+
* built-in and store skills.
|
|
2079
|
+
*/
|
|
2080
|
+
async tenantPluginSkills(tenantId) {
|
|
2081
|
+
const items = [];
|
|
2082
|
+
try {
|
|
2083
|
+
const loaded = await getSandboxPluginCatalog().ensureLoaded(tenantId);
|
|
2084
|
+
for (const plugin of loaded.plugins) {
|
|
2085
|
+
for (const [name, definition] of Object.entries(plugin.skills ?? {})) {
|
|
2086
|
+
const { meta } = parseSkillFrontmatter(definition.content);
|
|
2087
|
+
items.push({
|
|
2088
|
+
id: name,
|
|
2089
|
+
name: meta.name || name,
|
|
2090
|
+
description: meta.description || "",
|
|
2091
|
+
version: definition.version,
|
|
2092
|
+
pluginType: plugin.meta.type,
|
|
2093
|
+
resourcePaths: Object.entries(definition.resources ?? {}).map(([path5, resource]) => ({
|
|
2094
|
+
path: path5,
|
|
2095
|
+
mimeType: resource.mimeType
|
|
2096
|
+
})),
|
|
2097
|
+
content: definition.content
|
|
2098
|
+
});
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2101
|
+
} catch {
|
|
2102
|
+
}
|
|
2103
|
+
return items;
|
|
2104
|
+
}
|
|
2062
2105
|
async getAllSkills(request) {
|
|
2063
2106
|
const tenantId = getTenantId4(request);
|
|
2064
2107
|
const storeSkills = await this.store.getAllSkills(tenantId, buildContext(request));
|
|
@@ -2069,6 +2112,9 @@ var SkillService = class {
|
|
|
2069
2112
|
for (const item of PluginRegistry.listSkills()) {
|
|
2070
2113
|
merged.set(item.id, pluginSkillToSkill(item, tenantId));
|
|
2071
2114
|
}
|
|
2115
|
+
for (const item of await this.tenantPluginSkills(tenantId)) {
|
|
2116
|
+
merged.set(item.id, pluginSkillToSkill(item, tenantId, item.content));
|
|
2117
|
+
}
|
|
2072
2118
|
return Array.from(merged.values());
|
|
2073
2119
|
}
|
|
2074
2120
|
async getSkillById(request, id3) {
|
|
@@ -2081,21 +2127,23 @@ var SkillService = class {
|
|
|
2081
2127
|
return pluginSkillToSkill(item, tenantId, definition.content);
|
|
2082
2128
|
}
|
|
2083
2129
|
}
|
|
2130
|
+
const tenantItem = (await this.tenantPluginSkills(tenantId)).find((entry) => entry.id === id3);
|
|
2131
|
+
if (tenantItem) return pluginSkillToSkill(tenantItem, tenantId, tenantItem.content);
|
|
2084
2132
|
return this.store.getSkillById(tenantId, id3, buildContext(request));
|
|
2085
2133
|
}
|
|
2086
2134
|
async createSkill(request, id3, data) {
|
|
2087
2135
|
const tenantId = getTenantId4(request);
|
|
2088
|
-
this.
|
|
2136
|
+
await this.assertMutable(tenantId, id3, "created");
|
|
2089
2137
|
return this.store.createSkill(tenantId, id3, data, buildContext(request));
|
|
2090
2138
|
}
|
|
2091
2139
|
async updateSkill(request, id3, updates) {
|
|
2092
2140
|
const tenantId = getTenantId4(request);
|
|
2093
|
-
this.
|
|
2141
|
+
await this.assertMutable(tenantId, id3, "modified");
|
|
2094
2142
|
return this.store.updateSkill(tenantId, id3, updates, buildContext(request));
|
|
2095
2143
|
}
|
|
2096
2144
|
async deleteSkill(request, id3) {
|
|
2097
2145
|
const tenantId = getTenantId4(request);
|
|
2098
|
-
this.
|
|
2146
|
+
await this.assertMutable(tenantId, id3, "deleted");
|
|
2099
2147
|
return this.store.deleteSkill(tenantId, id3, buildContext(request));
|
|
2100
2148
|
}
|
|
2101
2149
|
async searchByMetadata(request, key, value) {
|
|
@@ -2111,7 +2159,18 @@ var SkillService = class {
|
|
|
2111
2159
|
return this.store.filterByLicense(tenantId, license, buildContext(request));
|
|
2112
2160
|
}
|
|
2113
2161
|
/**
|
|
2114
|
-
* Guard against mutating a
|
|
2162
|
+
* Guard against mutating a built-in or tenant-plugin skill.
|
|
2163
|
+
* Message style mirrors SandboxSkillStore built-in errors so the controller's
|
|
2164
|
+
* existing "built-in skill" -> 403 mapping applies. Runs before any store write.
|
|
2165
|
+
*/
|
|
2166
|
+
async assertMutable(tenantId, id3, action) {
|
|
2167
|
+
this.assertNotPluginSkill(id3, action);
|
|
2168
|
+
if ((await this.tenantPluginSkills(tenantId)).some((skill) => skill.id === id3)) {
|
|
2169
|
+
throw new Error(`Skill "${id3}" is a built-in skill and cannot be ${action}`);
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
/**
|
|
2173
|
+
* Guard against mutating a globally registered plugin skill.
|
|
2115
2174
|
* Message style mirrors SandboxSkillStore built-in errors so the controller's
|
|
2116
2175
|
* existing "built-in skill" -> 403 mapping applies.
|
|
2117
2176
|
*/
|
|
@@ -2317,175 +2376,6 @@ async function filterSkillsByLicense(request, reply) {
|
|
|
2317
2376
|
}
|
|
2318
2377
|
}
|
|
2319
2378
|
|
|
2320
|
-
// src/services/collection_service.ts
|
|
2321
|
-
import { v4 as uuidv4 } from "uuid";
|
|
2322
|
-
import { Document } from "@langchain/core/documents";
|
|
2323
|
-
import {
|
|
2324
|
-
collectionLatticeManager,
|
|
2325
|
-
embeddingsLatticeManager,
|
|
2326
|
-
getOrCreateCollectionVectorStore,
|
|
2327
|
-
getCollectionEntryCount,
|
|
2328
|
-
listCollectionEntries,
|
|
2329
|
-
removeCollectionVectorStore
|
|
2330
|
-
} from "@axiom-lattice/core";
|
|
2331
|
-
function getTenantId5(request) {
|
|
2332
|
-
return request.user?.tenantId || request.headers["x-tenant-id"] || "default";
|
|
2333
|
-
}
|
|
2334
|
-
var CollectionService = class {
|
|
2335
|
-
// ─── Collection CRUD ──────────────────────────────────────────
|
|
2336
|
-
async getAllCollections(request) {
|
|
2337
|
-
const tenantId = getTenantId5(request);
|
|
2338
|
-
const collections = await collectionLatticeManager.getAllCollections(tenantId);
|
|
2339
|
-
for (const c2 of collections) {
|
|
2340
|
-
try {
|
|
2341
|
-
c2._entryCount = await getCollectionEntryCount(c2.name, c2.embeddingKey, c2.tenantId);
|
|
2342
|
-
} catch {
|
|
2343
|
-
c2._entryCount = 0;
|
|
2344
|
-
}
|
|
2345
|
-
}
|
|
2346
|
-
return collections;
|
|
2347
|
-
}
|
|
2348
|
-
async getCollectionByName(request, name) {
|
|
2349
|
-
const tenantId = getTenantId5(request);
|
|
2350
|
-
return collectionLatticeManager.getCollection(tenantId, name);
|
|
2351
|
-
}
|
|
2352
|
-
async createCollection(request, data) {
|
|
2353
|
-
const tenantId = getTenantId5(request);
|
|
2354
|
-
const collection = await collectionLatticeManager.registerCollection(tenantId, data);
|
|
2355
|
-
try {
|
|
2356
|
-
await getOrCreateCollectionVectorStore(data.name, data.embeddingKey, tenantId);
|
|
2357
|
-
} catch (err) {
|
|
2358
|
-
console.warn(`[CollectionService] Failed to init vector store for ${data.name}:`, err);
|
|
2359
|
-
}
|
|
2360
|
-
return collection;
|
|
2361
|
-
}
|
|
2362
|
-
async updateCollection(request, name, updates) {
|
|
2363
|
-
const tenantId = getTenantId5(request);
|
|
2364
|
-
return collectionLatticeManager.updateCollection(tenantId, name, updates);
|
|
2365
|
-
}
|
|
2366
|
-
async deleteCollection(request, name) {
|
|
2367
|
-
const tenantId = getTenantId5(request);
|
|
2368
|
-
await removeCollectionVectorStore(name, tenantId);
|
|
2369
|
-
return collectionLatticeManager.removeCollection(tenantId, name);
|
|
2370
|
-
}
|
|
2371
|
-
// ─── Entry CRUD ───────────────────────────────────────────────
|
|
2372
|
-
async getEntries(request, collectionName) {
|
|
2373
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2374
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2375
|
-
const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);
|
|
2376
|
-
return docs.map((doc) => ({
|
|
2377
|
-
id: doc.metadata._id || "",
|
|
2378
|
-
content: doc.pageContent,
|
|
2379
|
-
metadata: Object.fromEntries(
|
|
2380
|
-
Object.entries(doc.metadata).filter(([k]) => !k.startsWith("_"))
|
|
2381
|
-
)
|
|
2382
|
-
}));
|
|
2383
|
-
}
|
|
2384
|
-
async createEntry(request, collectionName, data) {
|
|
2385
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2386
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2387
|
-
const vectorStore = await getOrCreateCollectionVectorStore(
|
|
2388
|
-
collectionName,
|
|
2389
|
-
collection.embeddingKey,
|
|
2390
|
-
collection.tenantId
|
|
2391
|
-
);
|
|
2392
|
-
const entryId = uuidv4();
|
|
2393
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2394
|
-
const doc = new Document({
|
|
2395
|
-
pageContent: data.content,
|
|
2396
|
-
metadata: {
|
|
2397
|
-
_id: entryId,
|
|
2398
|
-
_created_at: now,
|
|
2399
|
-
_updated_at: now,
|
|
2400
|
-
...data.metadata || {}
|
|
2401
|
-
}
|
|
2402
|
-
});
|
|
2403
|
-
await vectorStore.addDocuments([doc]);
|
|
2404
|
-
return { id: entryId, content: data.content, metadata: data.metadata || {} };
|
|
2405
|
-
}
|
|
2406
|
-
async getEntry(request, collectionName, entryId) {
|
|
2407
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2408
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2409
|
-
const docs = await listCollectionEntries(collectionName, collection.embeddingKey, collection.tenantId);
|
|
2410
|
-
const doc = docs.find((d) => d.metadata._id === entryId);
|
|
2411
|
-
if (!doc) return null;
|
|
2412
|
-
return {
|
|
2413
|
-
id: entryId,
|
|
2414
|
-
content: doc.pageContent,
|
|
2415
|
-
metadata: Object.fromEntries(
|
|
2416
|
-
Object.entries(doc.metadata).filter(([k]) => !k.startsWith("_"))
|
|
2417
|
-
)
|
|
2418
|
-
};
|
|
2419
|
-
}
|
|
2420
|
-
async updateEntry(request, collectionName, entryId, data) {
|
|
2421
|
-
const existing = await this.getEntry(request, collectionName, entryId);
|
|
2422
|
-
if (!existing) return null;
|
|
2423
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2424
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2425
|
-
const vectorStore = await getOrCreateCollectionVectorStore(
|
|
2426
|
-
collectionName,
|
|
2427
|
-
collection.embeddingKey,
|
|
2428
|
-
collection.tenantId
|
|
2429
|
-
);
|
|
2430
|
-
try {
|
|
2431
|
-
await vectorStore.delete({ filter: { _id: entryId } });
|
|
2432
|
-
} catch {
|
|
2433
|
-
}
|
|
2434
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2435
|
-
const mergedMetadata = { ...existing.metadata, ...data.metadata || {} };
|
|
2436
|
-
const doc = new Document({
|
|
2437
|
-
pageContent: data.content ?? existing.content,
|
|
2438
|
-
metadata: { _id: entryId, _created_at: now, _updated_at: now, ...mergedMetadata }
|
|
2439
|
-
});
|
|
2440
|
-
await vectorStore.addDocuments([doc]);
|
|
2441
|
-
return { id: entryId, content: data.content ?? existing.content, metadata: mergedMetadata };
|
|
2442
|
-
}
|
|
2443
|
-
async deleteEntry(request, collectionName, entryId) {
|
|
2444
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2445
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2446
|
-
const vectorStore = await getOrCreateCollectionVectorStore(
|
|
2447
|
-
collectionName,
|
|
2448
|
-
collection.embeddingKey,
|
|
2449
|
-
collection.tenantId
|
|
2450
|
-
);
|
|
2451
|
-
try {
|
|
2452
|
-
await vectorStore.delete({ filter: { _id: entryId } });
|
|
2453
|
-
return true;
|
|
2454
|
-
} catch {
|
|
2455
|
-
return false;
|
|
2456
|
-
}
|
|
2457
|
-
}
|
|
2458
|
-
async searchEntries(request, collectionName, params) {
|
|
2459
|
-
const collection = await this.getCollectionByName(request, collectionName);
|
|
2460
|
-
if (!collection) throw new Error(`Collection "${collectionName}" not found`);
|
|
2461
|
-
const vectorStore = await getOrCreateCollectionVectorStore(
|
|
2462
|
-
collectionName,
|
|
2463
|
-
collection.embeddingKey,
|
|
2464
|
-
collection.tenantId
|
|
2465
|
-
);
|
|
2466
|
-
let embeddings;
|
|
2467
|
-
try {
|
|
2468
|
-
embeddings = embeddingsLatticeManager.getEmbeddingsClient(collection.embeddingKey);
|
|
2469
|
-
} catch {
|
|
2470
|
-
embeddings = embeddingsLatticeManager.getEmbeddingsClient("default");
|
|
2471
|
-
}
|
|
2472
|
-
const queryVector = await embeddings.embedQuery(params.query);
|
|
2473
|
-
const results = await vectorStore.similaritySearchVectorWithScore(
|
|
2474
|
-
queryVector,
|
|
2475
|
-
params.top_k || 5,
|
|
2476
|
-
params.filter
|
|
2477
|
-
);
|
|
2478
|
-
return results.map(([doc, score]) => ({
|
|
2479
|
-
id: doc.metadata._id || uuidv4(),
|
|
2480
|
-
content: doc.pageContent,
|
|
2481
|
-
metadata: Object.fromEntries(
|
|
2482
|
-
Object.entries(doc.metadata).filter(([k]) => !k.startsWith("_"))
|
|
2483
|
-
),
|
|
2484
|
-
score
|
|
2485
|
-
}));
|
|
2486
|
-
}
|
|
2487
|
-
};
|
|
2488
|
-
|
|
2489
2379
|
// src/controllers/collections.ts
|
|
2490
2380
|
var collectionService = new CollectionService();
|
|
2491
2381
|
function serializeCollection(collection) {
|
|
@@ -2607,10 +2497,10 @@ async function deleteCollection(request, reply) {
|
|
|
2607
2497
|
}
|
|
2608
2498
|
|
|
2609
2499
|
// src/controllers/embeddings.ts
|
|
2610
|
-
import { embeddingsLatticeManager
|
|
2500
|
+
import { embeddingsLatticeManager } from "@axiom-lattice/core";
|
|
2611
2501
|
async function listEmbeddings(_request, _reply) {
|
|
2612
2502
|
try {
|
|
2613
|
-
const info =
|
|
2503
|
+
const info = embeddingsLatticeManager.getAllEmbeddingsInfo();
|
|
2614
2504
|
return {
|
|
2615
2505
|
success: true,
|
|
2616
2506
|
message: "Successfully retrieved embedding models",
|
|
@@ -2840,11 +2730,11 @@ import {
|
|
|
2840
2730
|
getStoreLattice as getStoreLattice3,
|
|
2841
2731
|
metricsServerManager
|
|
2842
2732
|
} from "@axiom-lattice/core";
|
|
2843
|
-
function
|
|
2733
|
+
function getTenantId5(request) {
|
|
2844
2734
|
return request.headers["x-tenant-id"] || "default";
|
|
2845
2735
|
}
|
|
2846
2736
|
async function executeDataQuery(request, reply) {
|
|
2847
|
-
const tenantId =
|
|
2737
|
+
const tenantId = getTenantId5(request);
|
|
2848
2738
|
const body = request.body;
|
|
2849
2739
|
try {
|
|
2850
2740
|
if (!body.serverKey && !body.datasourceId) {
|
|
@@ -2980,7 +2870,7 @@ async function executeSqlQuery(client, body, reply) {
|
|
|
2980
2870
|
// src/controllers/workflow-tracking.ts
|
|
2981
2871
|
import { getStoreLattice as getStoreLattice4, agentInstanceManager as agentInstanceManager4, ThreadStatus as ThreadStatus2, abortWorkflowRun as signalAbort } from "@axiom-lattice/core";
|
|
2982
2872
|
import { MessageChunkTypes as MessageChunkTypes2 } from "@axiom-lattice/protocols";
|
|
2983
|
-
function
|
|
2873
|
+
function getTenantId6(request) {
|
|
2984
2874
|
const userTenantId = request.user?.tenantId;
|
|
2985
2875
|
if (userTenantId) return userTenantId;
|
|
2986
2876
|
return request.headers["x-tenant-id"] || "default";
|
|
@@ -3021,7 +2911,7 @@ async function getDefinitionsFromAssistants(tenantId) {
|
|
|
3021
2911
|
}
|
|
3022
2912
|
}
|
|
3023
2913
|
async function getAllWorkflowDefinitions(request, reply) {
|
|
3024
|
-
const tenantId =
|
|
2914
|
+
const tenantId = getTenantId6(request);
|
|
3025
2915
|
try {
|
|
3026
2916
|
const configDefs = await getDefinitionsFromAssistants(tenantId);
|
|
3027
2917
|
if (configDefs.length === 0) {
|
|
@@ -3066,7 +2956,7 @@ async function getAllWorkflowDefinitions(request, reply) {
|
|
|
3066
2956
|
}
|
|
3067
2957
|
}
|
|
3068
2958
|
async function getAllWorkflowRuns(request, reply) {
|
|
3069
|
-
const tenantId =
|
|
2959
|
+
const tenantId = getTenantId6(request);
|
|
3070
2960
|
const { assistantId, status } = request.query;
|
|
3071
2961
|
try {
|
|
3072
2962
|
const store = getTrackingStore();
|
|
@@ -3120,7 +3010,7 @@ async function getAllWorkflowRuns(request, reply) {
|
|
|
3120
3010
|
var INBOX_DEFAULT_PAGE_SIZE = 20;
|
|
3121
3011
|
var INBOX_MAX_PAGE_SIZE = 100;
|
|
3122
3012
|
async function getInboxItems(request, reply) {
|
|
3123
|
-
const tenantId =
|
|
3013
|
+
const tenantId = getTenantId6(request);
|
|
3124
3014
|
try {
|
|
3125
3015
|
const store = getTrackingStore();
|
|
3126
3016
|
if (!store) {
|
|
@@ -3228,7 +3118,7 @@ async function getInboxItems(request, reply) {
|
|
|
3228
3118
|
}
|
|
3229
3119
|
async function getWorkflowDefinitions(request, reply) {
|
|
3230
3120
|
const { assistantId } = request.params;
|
|
3231
|
-
const tenantId =
|
|
3121
|
+
const tenantId = getTenantId6(request);
|
|
3232
3122
|
try {
|
|
3233
3123
|
const store = getTrackingStore();
|
|
3234
3124
|
if (!store) {
|
|
@@ -3259,7 +3149,7 @@ async function getWorkflowDefinitions(request, reply) {
|
|
|
3259
3149
|
}
|
|
3260
3150
|
async function getWorkflowRuns(request, reply) {
|
|
3261
3151
|
const { threadId } = request.params;
|
|
3262
|
-
const tenantId =
|
|
3152
|
+
const tenantId = getTenantId6(request);
|
|
3263
3153
|
try {
|
|
3264
3154
|
const store = getTrackingStore();
|
|
3265
3155
|
if (!store) {
|
|
@@ -3295,7 +3185,7 @@ async function getWorkflowRun(request, reply) {
|
|
|
3295
3185
|
}
|
|
3296
3186
|
async function deleteWorkflowRun(request, reply) {
|
|
3297
3187
|
const { runId } = request.params;
|
|
3298
|
-
const tenantId =
|
|
3188
|
+
const tenantId = getTenantId6(request);
|
|
3299
3189
|
try {
|
|
3300
3190
|
const store = getTrackingStore();
|
|
3301
3191
|
if (!store) {
|
|
@@ -3378,7 +3268,7 @@ async function getRunTasks(request, reply) {
|
|
|
3378
3268
|
}
|
|
3379
3269
|
async function replyInboxTask(request, reply) {
|
|
3380
3270
|
const { runId, answers } = request.body;
|
|
3381
|
-
const tenantId =
|
|
3271
|
+
const tenantId = getTenantId6(request);
|
|
3382
3272
|
try {
|
|
3383
3273
|
const store = getTrackingStore();
|
|
3384
3274
|
if (!store) {
|
|
@@ -3455,7 +3345,7 @@ async function replyInboxTask(request, reply) {
|
|
|
3455
3345
|
async function abortWorkflowRun(request, reply) {
|
|
3456
3346
|
try {
|
|
3457
3347
|
const { runId } = request.params;
|
|
3458
|
-
const tenantId =
|
|
3348
|
+
const tenantId = getTenantId6(request);
|
|
3459
3349
|
const store = getTrackingStore();
|
|
3460
3350
|
if (!store) {
|
|
3461
3351
|
return reply.status(404).send({
|
|
@@ -3507,7 +3397,7 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
3507
3397
|
function getWorkspaceId2(request) {
|
|
3508
3398
|
return request.headers["x-workspace-id"] || "default";
|
|
3509
3399
|
}
|
|
3510
|
-
function
|
|
3400
|
+
function getTenantId7(request) {
|
|
3511
3401
|
const userTenantId = request.user?.tenantId;
|
|
3512
3402
|
if (userTenantId) return userTenantId;
|
|
3513
3403
|
return request.headers["x-tenant-id"] || "default";
|
|
@@ -3534,7 +3424,7 @@ async function updateLinkMeta(userId, tenantId, meta) {
|
|
|
3534
3424
|
await getLinkStore().updateLink(userId, tenantId, { metadata: meta });
|
|
3535
3425
|
}
|
|
3536
3426
|
async function createPersonalAssistant(request, reply) {
|
|
3537
|
-
const tenantId =
|
|
3427
|
+
const tenantId = getTenantId7(request);
|
|
3538
3428
|
const userId = getUserId3(request);
|
|
3539
3429
|
const { name, personality } = request.body;
|
|
3540
3430
|
if (!name || !personality) {
|
|
@@ -3571,7 +3461,7 @@ async function createPersonalAssistant(request, reply) {
|
|
|
3571
3461
|
});
|
|
3572
3462
|
}
|
|
3573
3463
|
async function getPersonalAssistant(request, reply) {
|
|
3574
|
-
const tenantId =
|
|
3464
|
+
const tenantId = getTenantId7(request);
|
|
3575
3465
|
const userId = getUserId3(request);
|
|
3576
3466
|
const store = getAssistantStore();
|
|
3577
3467
|
const assistant = await store.getByOwner(tenantId, userId);
|
|
@@ -3588,7 +3478,7 @@ async function getPersonalAssistant(request, reply) {
|
|
|
3588
3478
|
};
|
|
3589
3479
|
}
|
|
3590
3480
|
async function deletePersonalAssistant(request, reply) {
|
|
3591
|
-
const tenantId =
|
|
3481
|
+
const tenantId = getTenantId7(request);
|
|
3592
3482
|
const userId = getUserId3(request);
|
|
3593
3483
|
const store = getAssistantStore();
|
|
3594
3484
|
const assistant = await store.getByOwner(tenantId, userId);
|
|
@@ -4121,9 +4011,9 @@ var ExportImportService = class {
|
|
|
4121
4011
|
if (!files || files.size === 0) return void 0;
|
|
4122
4012
|
const prefix = `files/${entityType}/${entityId}/`;
|
|
4123
4013
|
const result = /* @__PURE__ */ new Map();
|
|
4124
|
-
for (const [
|
|
4125
|
-
if (
|
|
4126
|
-
result.set(
|
|
4014
|
+
for (const [path5, content] of files.entries()) {
|
|
4015
|
+
if (path5.startsWith(prefix)) {
|
|
4016
|
+
result.set(path5.slice(prefix.length), content);
|
|
4127
4017
|
}
|
|
4128
4018
|
}
|
|
4129
4019
|
return result.size > 0 ? result : void 0;
|
|
@@ -4497,11 +4387,26 @@ async function importApply(request, reply) {
|
|
|
4497
4387
|
}
|
|
4498
4388
|
|
|
4499
4389
|
// src/controllers/middleware-types.ts
|
|
4500
|
-
import {
|
|
4390
|
+
import {
|
|
4391
|
+
PluginRegistry as PluginRegistry2,
|
|
4392
|
+
getSandboxPluginCatalog as getSandboxPluginCatalog2,
|
|
4393
|
+
mergePluginSources,
|
|
4394
|
+
serializePluginMeta
|
|
4395
|
+
} from "@axiom-lattice/core";
|
|
4396
|
+
async function collectMiddlewareMetas(tenantId) {
|
|
4397
|
+
let tenantPlugins = [];
|
|
4398
|
+
try {
|
|
4399
|
+
tenantPlugins = (await getSandboxPluginCatalog2().ensureLoaded(tenantId)).plugins;
|
|
4400
|
+
} catch {
|
|
4401
|
+
tenantPlugins = [];
|
|
4402
|
+
}
|
|
4403
|
+
const globalPlugins = PluginRegistry2.list().map((type) => PluginRegistry2.get(type)).filter((p) => Boolean(p));
|
|
4404
|
+
return mergePluginSources(globalPlugins, tenantPlugins).map(serializePluginMeta);
|
|
4405
|
+
}
|
|
4501
4406
|
function middlewareTypesRoutes(fastify2) {
|
|
4502
|
-
fastify2.get("/api/middleware-types", async (
|
|
4503
|
-
const
|
|
4504
|
-
return reply.send(
|
|
4407
|
+
fastify2.get("/api/middleware-types", async (request, reply) => {
|
|
4408
|
+
const tenantId = request.user?.tenantId || request.headers["x-tenant-id"] || "default";
|
|
4409
|
+
return reply.send(await collectMiddlewareMetas(tenantId));
|
|
4505
4410
|
});
|
|
4506
4411
|
}
|
|
4507
4412
|
|
|
@@ -5220,7 +5125,7 @@ import * as os2 from "os";
|
|
|
5220
5125
|
import { getStoreLattice as getStoreLattice6 } from "@axiom-lattice/core";
|
|
5221
5126
|
import { SandboxFilesystem, FilesystemBackend } from "@axiom-lattice/core";
|
|
5222
5127
|
import { getSandBoxManager as getSandBoxManager3 } from "@axiom-lattice/core";
|
|
5223
|
-
import { v4 as
|
|
5128
|
+
import { v4 as uuidv4 } from "uuid";
|
|
5224
5129
|
|
|
5225
5130
|
// src/services/collaboration/RoomCoordinatorProvisioner.ts
|
|
5226
5131
|
var ROOM_COORDINATOR_KEY = "room-coordinator";
|
|
@@ -5423,7 +5328,7 @@ var ProjectCollaborationInitializationError = class extends Error {
|
|
|
5423
5328
|
}
|
|
5424
5329
|
};
|
|
5425
5330
|
function createProjectCollaborationInitializer(deps) {
|
|
5426
|
-
const idFactory = deps.idFactory ??
|
|
5331
|
+
const idFactory = deps.idFactory ?? uuidv4;
|
|
5427
5332
|
return {
|
|
5428
5333
|
authorizeCreator: async ({ tenantId, userId }) => await deps.userTenantLinkStore.getLink(userId, tenantId) !== null,
|
|
5429
5334
|
initialize: async ({ tenantId, userId, project }) => {
|
|
@@ -5498,7 +5403,7 @@ var WorkspaceController = class {
|
|
|
5498
5403
|
async createWorkspace(request, reply) {
|
|
5499
5404
|
const tenantId = this.getTenantId(request);
|
|
5500
5405
|
const data = request.body;
|
|
5501
|
-
const id3 =
|
|
5406
|
+
const id3 = uuidv4();
|
|
5502
5407
|
const workspace = await this.workspaceStore.createWorkspace(
|
|
5503
5408
|
tenantId,
|
|
5504
5409
|
id3,
|
|
@@ -5571,7 +5476,7 @@ var WorkspaceController = class {
|
|
|
5571
5476
|
if (existing.length > 0) {
|
|
5572
5477
|
return;
|
|
5573
5478
|
}
|
|
5574
|
-
await this.projectStore.createProject(tenantId, workspaceId,
|
|
5479
|
+
await this.projectStore.createProject(tenantId, workspaceId, uuidv4(), {
|
|
5575
5480
|
name: "Training",
|
|
5576
5481
|
description: "Shared workspace for agent training",
|
|
5577
5482
|
kind: "training"
|
|
@@ -5624,7 +5529,7 @@ var WorkspaceController = class {
|
|
|
5624
5529
|
});
|
|
5625
5530
|
}
|
|
5626
5531
|
}
|
|
5627
|
-
const id3 =
|
|
5532
|
+
const id3 = uuidv4();
|
|
5628
5533
|
const project = await this.projectStore.createProject(
|
|
5629
5534
|
tenantId,
|
|
5630
5535
|
workspaceId,
|
|
@@ -6171,7 +6076,7 @@ var WorkspaceController = class {
|
|
|
6171
6076
|
workspaceId,
|
|
6172
6077
|
projectId,
|
|
6173
6078
|
timestamp: Date.now()
|
|
6174
|
-
})};</script
|
|
6079
|
+
})};</script>` + buildPreviewTokenScript({ tenantId, workspaceId, projectId });
|
|
6175
6080
|
if (content2.toLowerCase().includes("</head>")) {
|
|
6176
6081
|
content2 = content2.replace(/<\/head>/i, `${contextScript}</head>`);
|
|
6177
6082
|
console.log(`[viewFile] Context script injected before </head>`);
|
|
@@ -6202,7 +6107,7 @@ var WorkspaceController = class {
|
|
|
6202
6107
|
workspaceId,
|
|
6203
6108
|
projectId,
|
|
6204
6109
|
timestamp: Date.now()
|
|
6205
|
-
})};</script
|
|
6110
|
+
})};</script>` + buildPreviewTokenScript({ tenantId, workspaceId, projectId });
|
|
6206
6111
|
if (content.toLowerCase().includes("</head>")) {
|
|
6207
6112
|
finalContent = content.replace(/<\/head>/i, `${contextScript}</head>`);
|
|
6208
6113
|
console.log(`[viewFile] Context script injected before </head>`);
|
|
@@ -6224,21 +6129,21 @@ var WorkspaceController = class {
|
|
|
6224
6129
|
async listPath(request) {
|
|
6225
6130
|
const tenantId = this.getTenantId(request);
|
|
6226
6131
|
const { workspaceId, projectId } = request.params;
|
|
6227
|
-
const
|
|
6132
|
+
const path5 = request.query.path || "/";
|
|
6228
6133
|
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(
|
|
6134
|
+
console.log(`[listPath] tenantId=${tenantId} workspaceId=${workspaceId} projectId=${projectId} path=${path5} assistantId=${assistantId}`);
|
|
6135
|
+
const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path5);
|
|
6136
|
+
console.log(`[listPath] backend type=${backend.constructor.name} calling lsInfo(${path5})`);
|
|
6137
|
+
const files = await backend.lsInfo(path5);
|
|
6233
6138
|
console.log(`[listPath] result count=${files.length}`);
|
|
6234
6139
|
return { success: true, data: files };
|
|
6235
6140
|
}
|
|
6236
6141
|
async readFile(request) {
|
|
6237
6142
|
const tenantId = this.getTenantId(request);
|
|
6238
6143
|
const { workspaceId, projectId } = request.params;
|
|
6239
|
-
const { path:
|
|
6240
|
-
const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId,
|
|
6241
|
-
const content = await backend.read(
|
|
6144
|
+
const { path: path5, offset = 0, limit = 1e3, assistantId } = request.query;
|
|
6145
|
+
const { backend } = await this.getBackend(tenantId, workspaceId, projectId, assistantId, path5);
|
|
6146
|
+
const content = await backend.read(path5, Number(offset), Number(limit));
|
|
6242
6147
|
return { success: true, data: { content, offset, limit } };
|
|
6243
6148
|
}
|
|
6244
6149
|
/**
|
|
@@ -6525,13 +6430,17 @@ var ProjectAccessService = class {
|
|
|
6525
6430
|
this.requireCapability(membership, input.capability);
|
|
6526
6431
|
return { project, membership };
|
|
6527
6432
|
}
|
|
6528
|
-
/**
|
|
6433
|
+
/**
|
|
6434
|
+
* Authorizes roster visibility for any active participant (owner/admin/member/viewer).
|
|
6435
|
+
* Mutating the roster requires `manage` separately; reading it never does, because every
|
|
6436
|
+
* room participant needs the member list to render the room and derive their own capabilities.
|
|
6437
|
+
*/
|
|
6529
6438
|
async requireRosterAccess(input) {
|
|
6530
6439
|
const project = await this.deps.projectStore.getProjectById(input.tenantId, input.projectId);
|
|
6531
6440
|
if (!project) throw new ProjectCollaborationError("PROJECT_NOT_FOUND", 404, "Project not found");
|
|
6532
6441
|
return this.requireProjectAccess({
|
|
6533
6442
|
...input,
|
|
6534
|
-
capability:
|
|
6443
|
+
capability: "read"
|
|
6535
6444
|
});
|
|
6536
6445
|
}
|
|
6537
6446
|
async requirePublicProjectAccess(project, input) {
|
|
@@ -6620,7 +6529,7 @@ import {
|
|
|
6620
6529
|
sqlDatabaseManager
|
|
6621
6530
|
} from "@axiom-lattice/core";
|
|
6622
6531
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
6623
|
-
function
|
|
6532
|
+
function getTenantId8(request) {
|
|
6624
6533
|
const userTenantId = request.user?.tenantId;
|
|
6625
6534
|
if (userTenantId) {
|
|
6626
6535
|
return userTenantId;
|
|
@@ -6628,7 +6537,7 @@ function getTenantId9(request) {
|
|
|
6628
6537
|
return request.headers["x-tenant-id"] || "default";
|
|
6629
6538
|
}
|
|
6630
6539
|
async function getDatabaseConfigList(request, reply) {
|
|
6631
|
-
const tenantId =
|
|
6540
|
+
const tenantId = getTenantId8(request);
|
|
6632
6541
|
try {
|
|
6633
6542
|
const storeLattice = getStoreLattice7("default", "database");
|
|
6634
6543
|
const store = storeLattice.store;
|
|
@@ -6658,7 +6567,7 @@ async function getDatabaseConfigList(request, reply) {
|
|
|
6658
6567
|
}
|
|
6659
6568
|
}
|
|
6660
6569
|
async function getDatabaseConfig(request, reply) {
|
|
6661
|
-
const tenantId =
|
|
6570
|
+
const tenantId = getTenantId8(request);
|
|
6662
6571
|
const { key } = request.params;
|
|
6663
6572
|
try {
|
|
6664
6573
|
const storeLattice = getStoreLattice7("default", "database");
|
|
@@ -6684,7 +6593,7 @@ async function getDatabaseConfig(request, reply) {
|
|
|
6684
6593
|
}
|
|
6685
6594
|
}
|
|
6686
6595
|
async function createDatabaseConfig(request, reply) {
|
|
6687
|
-
const tenantId =
|
|
6596
|
+
const tenantId = getTenantId8(request);
|
|
6688
6597
|
const body = request.body;
|
|
6689
6598
|
try {
|
|
6690
6599
|
const storeLattice = getStoreLattice7("default", "database");
|
|
@@ -6719,7 +6628,7 @@ async function createDatabaseConfig(request, reply) {
|
|
|
6719
6628
|
}
|
|
6720
6629
|
}
|
|
6721
6630
|
async function updateDatabaseConfig(request, reply) {
|
|
6722
|
-
const tenantId =
|
|
6631
|
+
const tenantId = getTenantId8(request);
|
|
6723
6632
|
const { key } = request.params;
|
|
6724
6633
|
const updates = request.body;
|
|
6725
6634
|
try {
|
|
@@ -6761,7 +6670,7 @@ async function updateDatabaseConfig(request, reply) {
|
|
|
6761
6670
|
}
|
|
6762
6671
|
}
|
|
6763
6672
|
async function deleteDatabaseConfig(request, reply) {
|
|
6764
|
-
const tenantId =
|
|
6673
|
+
const tenantId = getTenantId8(request);
|
|
6765
6674
|
const { keyOrId } = request.params;
|
|
6766
6675
|
try {
|
|
6767
6676
|
const storeLattice = getStoreLattice7("default", "database");
|
|
@@ -6810,7 +6719,7 @@ async function deleteDatabaseConfig(request, reply) {
|
|
|
6810
6719
|
}
|
|
6811
6720
|
}
|
|
6812
6721
|
async function testDatabaseConnection(request, reply) {
|
|
6813
|
-
const tenantId =
|
|
6722
|
+
const tenantId = getTenantId8(request);
|
|
6814
6723
|
const { key } = request.params;
|
|
6815
6724
|
try {
|
|
6816
6725
|
const storeLattice = getStoreLattice7("default", "database");
|
|
@@ -6903,7 +6812,7 @@ import {
|
|
|
6903
6812
|
SemanticMetricsClient as SemanticMetricsClient2
|
|
6904
6813
|
} from "@axiom-lattice/core";
|
|
6905
6814
|
import { randomUUID as randomUUID8 } from "crypto";
|
|
6906
|
-
function
|
|
6815
|
+
function getTenantId9(request) {
|
|
6907
6816
|
const userTenantId = request.user?.tenantId;
|
|
6908
6817
|
if (userTenantId) {
|
|
6909
6818
|
return userTenantId;
|
|
@@ -6911,7 +6820,7 @@ function getTenantId10(request) {
|
|
|
6911
6820
|
return request.headers["x-tenant-id"] || "default";
|
|
6912
6821
|
}
|
|
6913
6822
|
async function getMetricsServerConfigList(request, reply) {
|
|
6914
|
-
const tenantId =
|
|
6823
|
+
const tenantId = getTenantId9(request);
|
|
6915
6824
|
try {
|
|
6916
6825
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
6917
6826
|
const store = storeLattice.store;
|
|
@@ -6937,7 +6846,7 @@ async function getMetricsServerConfigList(request, reply) {
|
|
|
6937
6846
|
}
|
|
6938
6847
|
}
|
|
6939
6848
|
async function getMetricsServerConfig(request, reply) {
|
|
6940
|
-
const tenantId =
|
|
6849
|
+
const tenantId = getTenantId9(request);
|
|
6941
6850
|
const { key } = request.params;
|
|
6942
6851
|
try {
|
|
6943
6852
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -6963,7 +6872,7 @@ async function getMetricsServerConfig(request, reply) {
|
|
|
6963
6872
|
}
|
|
6964
6873
|
}
|
|
6965
6874
|
async function createMetricsServerConfig(request, reply) {
|
|
6966
|
-
const tenantId =
|
|
6875
|
+
const tenantId = getTenantId9(request);
|
|
6967
6876
|
const body = request.body;
|
|
6968
6877
|
try {
|
|
6969
6878
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7014,7 +6923,7 @@ async function createMetricsServerConfig(request, reply) {
|
|
|
7014
6923
|
}
|
|
7015
6924
|
}
|
|
7016
6925
|
async function updateMetricsServerConfig(request, reply) {
|
|
7017
|
-
const tenantId =
|
|
6926
|
+
const tenantId = getTenantId9(request);
|
|
7018
6927
|
const { key } = request.params;
|
|
7019
6928
|
const updates = request.body;
|
|
7020
6929
|
try {
|
|
@@ -7065,7 +6974,7 @@ async function updateMetricsServerConfig(request, reply) {
|
|
|
7065
6974
|
}
|
|
7066
6975
|
}
|
|
7067
6976
|
async function deleteMetricsServerConfig(request, reply) {
|
|
7068
|
-
const tenantId =
|
|
6977
|
+
const tenantId = getTenantId9(request);
|
|
7069
6978
|
const { keyOrId } = request.params;
|
|
7070
6979
|
try {
|
|
7071
6980
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7112,7 +7021,7 @@ async function deleteMetricsServerConfig(request, reply) {
|
|
|
7112
7021
|
}
|
|
7113
7022
|
}
|
|
7114
7023
|
async function testMetricsServerConnection(request, reply) {
|
|
7115
|
-
const tenantId =
|
|
7024
|
+
const tenantId = getTenantId9(request);
|
|
7116
7025
|
const { key } = request.params;
|
|
7117
7026
|
try {
|
|
7118
7027
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7163,7 +7072,7 @@ async function testMetricsServerConnection(request, reply) {
|
|
|
7163
7072
|
}
|
|
7164
7073
|
}
|
|
7165
7074
|
async function listAvailableMetrics(request, reply) {
|
|
7166
|
-
const tenantId =
|
|
7075
|
+
const tenantId = getTenantId9(request);
|
|
7167
7076
|
const { key } = request.params;
|
|
7168
7077
|
try {
|
|
7169
7078
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7201,7 +7110,7 @@ async function listAvailableMetrics(request, reply) {
|
|
|
7201
7110
|
}
|
|
7202
7111
|
}
|
|
7203
7112
|
async function queryMetricsData(request, reply) {
|
|
7204
|
-
const tenantId =
|
|
7113
|
+
const tenantId = getTenantId9(request);
|
|
7205
7114
|
const { key } = request.params;
|
|
7206
7115
|
const { metricName, startTime, endTime, step, labels } = request.body;
|
|
7207
7116
|
try {
|
|
@@ -7249,7 +7158,7 @@ async function queryMetricsData(request, reply) {
|
|
|
7249
7158
|
}
|
|
7250
7159
|
}
|
|
7251
7160
|
async function getDataSources(request, reply) {
|
|
7252
|
-
const tenantId =
|
|
7161
|
+
const tenantId = getTenantId9(request);
|
|
7253
7162
|
const { key } = request.params;
|
|
7254
7163
|
try {
|
|
7255
7164
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7290,7 +7199,7 @@ async function getDataSources(request, reply) {
|
|
|
7290
7199
|
}
|
|
7291
7200
|
}
|
|
7292
7201
|
async function getDatasourceMetrics(request, reply) {
|
|
7293
|
-
const tenantId =
|
|
7202
|
+
const tenantId = getTenantId9(request);
|
|
7294
7203
|
const { key, datasourceId } = request.params;
|
|
7295
7204
|
try {
|
|
7296
7205
|
const storeLattice = getStoreLattice8("default", "metrics");
|
|
@@ -7327,7 +7236,7 @@ async function getDatasourceMetrics(request, reply) {
|
|
|
7327
7236
|
}
|
|
7328
7237
|
}
|
|
7329
7238
|
async function querySemanticMetrics(request, reply) {
|
|
7330
|
-
const tenantId =
|
|
7239
|
+
const tenantId = getTenantId9(request);
|
|
7331
7240
|
const { key } = request.params;
|
|
7332
7241
|
const body = request.body;
|
|
7333
7242
|
try {
|
|
@@ -7484,7 +7393,7 @@ function registerMetricsServerConfigRoutes(app2) {
|
|
|
7484
7393
|
}
|
|
7485
7394
|
|
|
7486
7395
|
// src/controllers/connections.ts
|
|
7487
|
-
import { ConnectionRegistry, PluginRegistry as PluginRegistry3 } from "@axiom-lattice/core";
|
|
7396
|
+
import { ConnectionRegistry, PluginRegistry as PluginRegistry3, getSandboxPluginCatalog as getSandboxPluginCatalog3, mergePluginSources as mergePluginSources2 } from "@axiom-lattice/core";
|
|
7488
7397
|
import { z as z2 } from "zod";
|
|
7489
7398
|
var createBody = z2.object({
|
|
7490
7399
|
type: z2.string().min(1),
|
|
@@ -7504,6 +7413,17 @@ function getTenant(request) {
|
|
|
7504
7413
|
}
|
|
7505
7414
|
return request.headers["x-tenant-id"] || "default";
|
|
7506
7415
|
}
|
|
7416
|
+
async function getTenantPlugin(request, type) {
|
|
7417
|
+
const tenantId = getTenant(request);
|
|
7418
|
+
let tenantPlugins = [];
|
|
7419
|
+
try {
|
|
7420
|
+
tenantPlugins = (await getSandboxPluginCatalog3().ensureLoaded(tenantId)).plugins;
|
|
7421
|
+
} catch {
|
|
7422
|
+
tenantPlugins = [];
|
|
7423
|
+
}
|
|
7424
|
+
const globalPlugins = PluginRegistry3.list().map((t2) => PluginRegistry3.get(t2)).filter((p) => Boolean(p));
|
|
7425
|
+
return mergePluginSources2(globalPlugins, tenantPlugins).find((p) => p.meta.type === type);
|
|
7426
|
+
}
|
|
7507
7427
|
function maskSecrets(config) {
|
|
7508
7428
|
const sensitive = /* @__PURE__ */ new Set([
|
|
7509
7429
|
"password",
|
|
@@ -7587,7 +7507,7 @@ function connectionRoutes(fastify2) {
|
|
|
7587
7507
|
fastify2.post("/api/connections/test", async (request, reply) => {
|
|
7588
7508
|
const { type } = request.query;
|
|
7589
7509
|
if (!type) return reply.status(400).send({ error: "query 'type' required" });
|
|
7590
|
-
const plugin =
|
|
7510
|
+
const plugin = await getTenantPlugin(request, type);
|
|
7591
7511
|
if (!plugin?.connection?.test) {
|
|
7592
7512
|
return reply.status(400).send({ error: "plugin does not support connection testing" });
|
|
7593
7513
|
}
|
|
@@ -7615,7 +7535,7 @@ function connectionRoutes(fastify2) {
|
|
|
7615
7535
|
fastify2.post("/api/connections/discover", async (request, reply) => {
|
|
7616
7536
|
const { type } = request.query;
|
|
7617
7537
|
if (!type) return reply.status(400).send({ error: "query 'type' required" });
|
|
7618
|
-
const plugin =
|
|
7538
|
+
const plugin = await getTenantPlugin(request, type);
|
|
7619
7539
|
if (!plugin?.connection?.discover) {
|
|
7620
7540
|
return reply.status(400).send({ error: "plugin does not support resource discovery" });
|
|
7621
7541
|
}
|
|
@@ -7643,7 +7563,7 @@ function connectionRoutes(fastify2) {
|
|
|
7643
7563
|
|
|
7644
7564
|
// src/controllers/eval.ts
|
|
7645
7565
|
import { getStoreLattice as getStoreLattice10 } from "@axiom-lattice/core";
|
|
7646
|
-
import { v4 as
|
|
7566
|
+
import { v4 as uuidv43 } from "uuid";
|
|
7647
7567
|
|
|
7648
7568
|
// src/services/eval-runner.ts
|
|
7649
7569
|
import { EventEmitter } from "events";
|
|
@@ -7652,7 +7572,7 @@ import {
|
|
|
7652
7572
|
modelLatticeManager as modelLatticeManager2,
|
|
7653
7573
|
LatticeEvalProject
|
|
7654
7574
|
} from "@axiom-lattice/core";
|
|
7655
|
-
import { v4 as
|
|
7575
|
+
import { v4 as uuidv42 } from "uuid";
|
|
7656
7576
|
var TERMINAL_PERSIST_ATTEMPTS = 2;
|
|
7657
7577
|
function mapLogs(logs) {
|
|
7658
7578
|
return logs.map((l) => ({
|
|
@@ -7776,7 +7696,7 @@ var EvalRunner = class {
|
|
|
7776
7696
|
console.warn(`[eval-runner] Project "${project.name}" has no judge modelKey and no "default" model \u2014 falling back to first registered model "${resolvedJudgeModelKey}"`);
|
|
7777
7697
|
}
|
|
7778
7698
|
}
|
|
7779
|
-
const runId =
|
|
7699
|
+
const runId = uuidv42();
|
|
7780
7700
|
const concurrency = Math.max(1, Math.floor(project.concurrency) || 3);
|
|
7781
7701
|
const isHoldout = suites.length > 0 && suites.every((s) => s.name.endsWith("-validation"));
|
|
7782
7702
|
const workspaceId = runConfig?.workspaceId || "";
|
|
@@ -7833,7 +7753,7 @@ var EvalRunner = class {
|
|
|
7833
7753
|
if (terminalUnavailable()) return;
|
|
7834
7754
|
const passed = result.result?.pass ?? false;
|
|
7835
7755
|
const score = result.result?.final_score ?? 0;
|
|
7836
|
-
await store.createRunResult(tenantId, runId,
|
|
7756
|
+
await store.createRunResult(tenantId, runId, uuidv42(), {
|
|
7837
7757
|
suiteName,
|
|
7838
7758
|
caseId: result.caseId,
|
|
7839
7759
|
pass: passed,
|
|
@@ -7987,7 +7907,7 @@ var EvalRunner = class {
|
|
|
7987
7907
|
var evalRunner = new EvalRunner();
|
|
7988
7908
|
|
|
7989
7909
|
// src/controllers/eval.ts
|
|
7990
|
-
function
|
|
7910
|
+
function getTenantId10(request) {
|
|
7991
7911
|
const userTenantId = request.user?.tenantId;
|
|
7992
7912
|
if (userTenantId) {
|
|
7993
7913
|
return userTenantId;
|
|
@@ -8011,9 +7931,9 @@ async function getOwnedCase(store, tenantId, projectId, suiteId, caseId) {
|
|
|
8011
7931
|
}
|
|
8012
7932
|
async function createProject(request, reply) {
|
|
8013
7933
|
try {
|
|
8014
|
-
const tenantId =
|
|
7934
|
+
const tenantId = getTenantId10(request);
|
|
8015
7935
|
const store = getEvalStore();
|
|
8016
|
-
const id3 =
|
|
7936
|
+
const id3 = uuidv43();
|
|
8017
7937
|
const data = request.body;
|
|
8018
7938
|
const existing = await store.getProjectsByTenant(tenantId);
|
|
8019
7939
|
if (existing.some((p) => p.name === data.name)) {
|
|
@@ -8068,7 +7988,7 @@ async function createProject(request, reply) {
|
|
|
8068
7988
|
}
|
|
8069
7989
|
async function listProjects(request, reply) {
|
|
8070
7990
|
try {
|
|
8071
|
-
const tenantId =
|
|
7991
|
+
const tenantId = getTenantId10(request);
|
|
8072
7992
|
const store = getEvalStore();
|
|
8073
7993
|
let projects = await store.getProjectsByTenant(tenantId);
|
|
8074
7994
|
if (projects.length === 0) {
|
|
@@ -8079,7 +7999,7 @@ async function listProjects(request, reply) {
|
|
|
8079
7999
|
const judgeModel = first ? { modelKey: first.key } : {};
|
|
8080
8000
|
const host = request.hostname || "localhost";
|
|
8081
8001
|
const baseUrl = `http://${host}:${process.env.PORT || 4001}`;
|
|
8082
|
-
await store.createProject(tenantId,
|
|
8002
|
+
await store.createProject(tenantId, uuidv43(), {
|
|
8083
8003
|
name: "Default",
|
|
8084
8004
|
description: "Built-in project for testing eval against this server",
|
|
8085
8005
|
judgeModelConfig: judgeModel,
|
|
@@ -8102,7 +8022,7 @@ async function listProjects(request, reply) {
|
|
|
8102
8022
|
}
|
|
8103
8023
|
async function getProject(request, reply) {
|
|
8104
8024
|
try {
|
|
8105
|
-
const tenantId =
|
|
8025
|
+
const tenantId = getTenantId10(request);
|
|
8106
8026
|
const store = getEvalStore();
|
|
8107
8027
|
const { pid } = request.params;
|
|
8108
8028
|
const project = await store.getProjectById(tenantId, pid);
|
|
@@ -8122,7 +8042,7 @@ async function getProject(request, reply) {
|
|
|
8122
8042
|
}
|
|
8123
8043
|
async function updateProject(request, reply) {
|
|
8124
8044
|
try {
|
|
8125
|
-
const tenantId =
|
|
8045
|
+
const tenantId = getTenantId10(request);
|
|
8126
8046
|
const store = getEvalStore();
|
|
8127
8047
|
const { pid } = request.params;
|
|
8128
8048
|
const existing = await store.getProjectById(tenantId, pid);
|
|
@@ -8166,7 +8086,7 @@ async function updateProject(request, reply) {
|
|
|
8166
8086
|
async function deleteProject(request, reply) {
|
|
8167
8087
|
let releaseDeletion;
|
|
8168
8088
|
try {
|
|
8169
|
-
const tenantId =
|
|
8089
|
+
const tenantId = getTenantId10(request);
|
|
8170
8090
|
const store = getEvalStore();
|
|
8171
8091
|
const { pid } = request.params;
|
|
8172
8092
|
const existing = await store.getProjectById(tenantId, pid);
|
|
@@ -8204,14 +8124,14 @@ async function deleteProject(request, reply) {
|
|
|
8204
8124
|
}
|
|
8205
8125
|
async function createSuite(request, reply) {
|
|
8206
8126
|
try {
|
|
8207
|
-
const tenantId =
|
|
8127
|
+
const tenantId = getTenantId10(request);
|
|
8208
8128
|
const store = getEvalStore();
|
|
8209
8129
|
const { pid } = request.params;
|
|
8210
8130
|
const project = await store.getProjectById(tenantId, pid);
|
|
8211
8131
|
if (!project) {
|
|
8212
8132
|
return reply.status(404).send({ success: false, message: "Project not found" });
|
|
8213
8133
|
}
|
|
8214
|
-
const id3 =
|
|
8134
|
+
const id3 = uuidv43();
|
|
8215
8135
|
const data = request.body;
|
|
8216
8136
|
const suite = await store.createSuite(tenantId, pid, id3, { name: data.name });
|
|
8217
8137
|
return reply.status(201).send({
|
|
@@ -8226,7 +8146,7 @@ async function createSuite(request, reply) {
|
|
|
8226
8146
|
}
|
|
8227
8147
|
async function updateSuite(request, reply) {
|
|
8228
8148
|
try {
|
|
8229
|
-
const tenantId =
|
|
8149
|
+
const tenantId = getTenantId10(request);
|
|
8230
8150
|
const store = getEvalStore();
|
|
8231
8151
|
const { pid, sid } = request.params;
|
|
8232
8152
|
const existing = await getOwnedSuite(store, tenantId, pid, sid);
|
|
@@ -8246,7 +8166,7 @@ async function updateSuite(request, reply) {
|
|
|
8246
8166
|
}
|
|
8247
8167
|
async function deleteSuite(request, reply) {
|
|
8248
8168
|
try {
|
|
8249
|
-
const tenantId =
|
|
8169
|
+
const tenantId = getTenantId10(request);
|
|
8250
8170
|
const store = getEvalStore();
|
|
8251
8171
|
const { pid, sid } = request.params;
|
|
8252
8172
|
const existing = await getOwnedSuite(store, tenantId, pid, sid);
|
|
@@ -8265,14 +8185,14 @@ async function deleteSuite(request, reply) {
|
|
|
8265
8185
|
}
|
|
8266
8186
|
async function createCase(request, reply) {
|
|
8267
8187
|
try {
|
|
8268
|
-
const tenantId =
|
|
8188
|
+
const tenantId = getTenantId10(request);
|
|
8269
8189
|
const store = getEvalStore();
|
|
8270
8190
|
const { pid, sid } = request.params;
|
|
8271
8191
|
const suite = await getOwnedSuite(store, tenantId, pid, sid);
|
|
8272
8192
|
if (!suite) {
|
|
8273
8193
|
return reply.status(404).send({ success: false, message: "Suite not found" });
|
|
8274
8194
|
}
|
|
8275
|
-
const id3 =
|
|
8195
|
+
const id3 = uuidv43();
|
|
8276
8196
|
const data = request.body;
|
|
8277
8197
|
const created = await store.createCase(tenantId, sid, id3, {
|
|
8278
8198
|
inputMessage: data.inputMessage,
|
|
@@ -8295,7 +8215,7 @@ async function createCase(request, reply) {
|
|
|
8295
8215
|
}
|
|
8296
8216
|
async function listCasesForSuite(request, reply) {
|
|
8297
8217
|
try {
|
|
8298
|
-
const tenantId =
|
|
8218
|
+
const tenantId = getTenantId10(request);
|
|
8299
8219
|
const store = getEvalStore();
|
|
8300
8220
|
const { pid, sid } = request.params;
|
|
8301
8221
|
const suite = await getOwnedSuite(store, tenantId, pid, sid);
|
|
@@ -8315,7 +8235,7 @@ async function listCasesForSuite(request, reply) {
|
|
|
8315
8235
|
}
|
|
8316
8236
|
async function updateCase(request, reply) {
|
|
8317
8237
|
try {
|
|
8318
|
-
const tenantId =
|
|
8238
|
+
const tenantId = getTenantId10(request);
|
|
8319
8239
|
const store = getEvalStore();
|
|
8320
8240
|
const { pid, sid, cid } = request.params;
|
|
8321
8241
|
const existing = await getOwnedCase(store, tenantId, pid, sid, cid);
|
|
@@ -8335,7 +8255,7 @@ async function updateCase(request, reply) {
|
|
|
8335
8255
|
}
|
|
8336
8256
|
async function deleteCase(request, reply) {
|
|
8337
8257
|
try {
|
|
8338
|
-
const tenantId =
|
|
8258
|
+
const tenantId = getTenantId10(request);
|
|
8339
8259
|
const store = getEvalStore();
|
|
8340
8260
|
const { pid, sid, cid } = request.params;
|
|
8341
8261
|
const existing = await getOwnedCase(store, tenantId, pid, sid, cid);
|
|
@@ -8367,7 +8287,7 @@ function registerEvalRoutes(app2) {
|
|
|
8367
8287
|
app2.delete("/api/eval/projects/:pid/suites/:sid/cases/:cid", deleteCase);
|
|
8368
8288
|
app2.post("/api/eval/projects/:pid/runs", async (request, reply) => {
|
|
8369
8289
|
try {
|
|
8370
|
-
const tenantId =
|
|
8290
|
+
const tenantId = getTenantId10(request);
|
|
8371
8291
|
const { pid } = request.params;
|
|
8372
8292
|
const body = request.body ?? {};
|
|
8373
8293
|
const bodyWs = request.headers["x-workspace-id"] || "";
|
|
@@ -8386,7 +8306,7 @@ function registerEvalRoutes(app2) {
|
|
|
8386
8306
|
});
|
|
8387
8307
|
app2.get("/api/eval/runs", async (request, reply) => {
|
|
8388
8308
|
try {
|
|
8389
|
-
const tenantId =
|
|
8309
|
+
const tenantId = getTenantId10(request);
|
|
8390
8310
|
const query = request.query;
|
|
8391
8311
|
const runs = await getEvalStore().getRunsByTenant(tenantId, { projectId: query.project_id, status: query.status });
|
|
8392
8312
|
reply.send({ success: true, message: "Ok", data: { records: runs, total: runs.length } });
|
|
@@ -8396,7 +8316,7 @@ function registerEvalRoutes(app2) {
|
|
|
8396
8316
|
});
|
|
8397
8317
|
app2.get("/api/eval/runs/:rid", async (request, reply) => {
|
|
8398
8318
|
try {
|
|
8399
|
-
const tenantId =
|
|
8319
|
+
const tenantId = getTenantId10(request);
|
|
8400
8320
|
const { rid } = request.params;
|
|
8401
8321
|
const run2 = await getEvalStore().getRunById(tenantId, rid);
|
|
8402
8322
|
if (!run2) return reply.status(404).send({ success: false, message: "Run not found" });
|
|
@@ -8407,7 +8327,7 @@ function registerEvalRoutes(app2) {
|
|
|
8407
8327
|
}
|
|
8408
8328
|
});
|
|
8409
8329
|
app2.get("/api/eval/runs/:rid/stream", async (request, reply) => {
|
|
8410
|
-
const tenantId =
|
|
8330
|
+
const tenantId = getTenantId10(request);
|
|
8411
8331
|
const { rid } = request.params;
|
|
8412
8332
|
const store = getEvalStore();
|
|
8413
8333
|
const ownedRun = await store.getRunById(tenantId, rid);
|
|
@@ -8483,7 +8403,7 @@ data: ${JSON.stringify(event.data)}
|
|
|
8483
8403
|
});
|
|
8484
8404
|
app2.post("/api/eval/runs/:rid/abort", async (request, reply) => {
|
|
8485
8405
|
try {
|
|
8486
|
-
const tenantId =
|
|
8406
|
+
const tenantId = getTenantId10(request);
|
|
8487
8407
|
const { rid } = request.params;
|
|
8488
8408
|
const run2 = await getEvalStore().getRunById(tenantId, rid);
|
|
8489
8409
|
if (!run2) return reply.status(404).send({ success: false, message: "Run not found" });
|
|
@@ -8496,7 +8416,7 @@ data: ${JSON.stringify(event.data)}
|
|
|
8496
8416
|
});
|
|
8497
8417
|
app2.delete("/api/eval/runs/:rid", async (request, reply) => {
|
|
8498
8418
|
try {
|
|
8499
|
-
const tenantId =
|
|
8419
|
+
const tenantId = getTenantId10(request);
|
|
8500
8420
|
const { rid } = request.params;
|
|
8501
8421
|
const store = getEvalStore();
|
|
8502
8422
|
const run2 = await store.getRunById(tenantId, rid);
|
|
@@ -8513,7 +8433,7 @@ data: ${JSON.stringify(event.data)}
|
|
|
8513
8433
|
});
|
|
8514
8434
|
app2.get("/api/eval/reports/projects/:pid", async (request, reply) => {
|
|
8515
8435
|
try {
|
|
8516
|
-
const tenantId =
|
|
8436
|
+
const tenantId = getTenantId10(request);
|
|
8517
8437
|
const { pid } = request.params;
|
|
8518
8438
|
const report = await getEvalStore().getProjectReport(tenantId, pid);
|
|
8519
8439
|
if (!report) return reply.status(404).send({ success: false, message: "Project not found" });
|
|
@@ -8526,7 +8446,7 @@ data: ${JSON.stringify(event.data)}
|
|
|
8526
8446
|
|
|
8527
8447
|
// src/controllers/users.ts
|
|
8528
8448
|
import { getStoreLattice as getStoreLattice11 } from "@axiom-lattice/core";
|
|
8529
|
-
import { v4 as
|
|
8449
|
+
import { v4 as uuidv44 } from "uuid";
|
|
8530
8450
|
var UsersController = class {
|
|
8531
8451
|
constructor() {
|
|
8532
8452
|
this.userStore = getStoreLattice11("default", "user").store;
|
|
@@ -8542,7 +8462,7 @@ var UsersController = class {
|
|
|
8542
8462
|
}
|
|
8543
8463
|
async createUser(request, reply) {
|
|
8544
8464
|
const data = request.body;
|
|
8545
|
-
const id3 =
|
|
8465
|
+
const id3 = uuidv44();
|
|
8546
8466
|
const existingUser = await this.userStore.getUserByEmail(data.email);
|
|
8547
8467
|
if (existingUser) {
|
|
8548
8468
|
return reply.status(409).send({
|
|
@@ -8608,7 +8528,7 @@ function registerUserRoutes(app2) {
|
|
|
8608
8528
|
|
|
8609
8529
|
// src/controllers/tenants.ts
|
|
8610
8530
|
import { getStoreLattice as getStoreLattice12 } from "@axiom-lattice/core";
|
|
8611
|
-
import { v4 as
|
|
8531
|
+
import { v4 as uuidv45 } from "uuid";
|
|
8612
8532
|
var TenantsController = class {
|
|
8613
8533
|
constructor() {
|
|
8614
8534
|
this.tenantStore = getStoreLattice12("default", "tenant").store;
|
|
@@ -8620,7 +8540,7 @@ var TenantsController = class {
|
|
|
8620
8540
|
}
|
|
8621
8541
|
async createTenant(request, reply) {
|
|
8622
8542
|
const data = request.body;
|
|
8623
|
-
const id3 =
|
|
8543
|
+
const id3 = uuidv45();
|
|
8624
8544
|
const tenant2 = await this.tenantStore.createTenant(id3, data);
|
|
8625
8545
|
return reply.status(201).send({ success: true, data: tenant2 });
|
|
8626
8546
|
}
|
|
@@ -8676,7 +8596,7 @@ function registerTenantRoutes(app2) {
|
|
|
8676
8596
|
|
|
8677
8597
|
// src/controllers/auth.ts
|
|
8678
8598
|
import { getStoreLattice as getStoreLattice13 } from "@axiom-lattice/core";
|
|
8679
|
-
import { v4 as
|
|
8599
|
+
import { v4 as uuidv46 } from "uuid";
|
|
8680
8600
|
import { createHmac, randomBytes, timingSafeEqual } from "crypto";
|
|
8681
8601
|
var defaultAuthConfig = {
|
|
8682
8602
|
autoApproveUsers: true,
|
|
@@ -8700,7 +8620,7 @@ var AuthController = class {
|
|
|
8700
8620
|
error: "User with this email already exists"
|
|
8701
8621
|
});
|
|
8702
8622
|
}
|
|
8703
|
-
const userId =
|
|
8623
|
+
const userId = uuidv46();
|
|
8704
8624
|
const userStatus = this.config.autoApproveUsers ? "active" : "pending";
|
|
8705
8625
|
const userData = {
|
|
8706
8626
|
email,
|
|
@@ -9099,13 +9019,13 @@ function isStaleConsoleSessionCredential(authHeader) {
|
|
|
9099
9019
|
}
|
|
9100
9020
|
}
|
|
9101
9021
|
function bypassesConsoleAuth(request) {
|
|
9102
|
-
const
|
|
9022
|
+
const path5 = request.url.split("?")[0];
|
|
9103
9023
|
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(
|
|
9024
|
+
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" || method === "POST" && path5 === "/open/session" || (method === "GET" || method === "POST") && path5.startsWith("/open/sandbox/files/")) return true;
|
|
9025
|
+
if (request.method === "GET" && /^\/api\/a2a\/agents\/[^/]+\/\.well-known\/agent-card\.json$/.test(path5)) {
|
|
9106
9026
|
return true;
|
|
9107
9027
|
}
|
|
9108
|
-
return request.method === "POST" && /^\/api\/a2a\/agents\/[^/]+\/jsonrpc$/.test(
|
|
9028
|
+
return request.method === "POST" && /^\/api\/a2a\/agents\/[^/]+\/jsonrpc$/.test(path5);
|
|
9109
9029
|
}
|
|
9110
9030
|
function registerConsoleAuthHook(app2, options) {
|
|
9111
9031
|
app2.addHook("preHandler", async (request, reply) => {
|
|
@@ -9128,8 +9048,8 @@ function registerConsoleAuthHook(app2, options) {
|
|
|
9128
9048
|
}
|
|
9129
9049
|
if (PUBLIC_ROUTES.some((route) => request.url === route)) return;
|
|
9130
9050
|
if (request.url.startsWith("/s/")) return;
|
|
9131
|
-
const
|
|
9132
|
-
if (request.method === "GET" && /^\/api\/workspaces\/[^/]+\/projects\/[^/]+\/viewfile$/.test(
|
|
9051
|
+
const path5 = request.url.split("?")[0];
|
|
9052
|
+
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
9053
|
return;
|
|
9134
9054
|
}
|
|
9135
9055
|
await reply.status(401).send({
|
|
@@ -9277,7 +9197,7 @@ var larkChannelAdapter = {
|
|
|
9277
9197
|
};
|
|
9278
9198
|
},
|
|
9279
9199
|
async sendReply(replyTarget, message, installation) {
|
|
9280
|
-
const { createLarkSender } = await import("./sender-
|
|
9200
|
+
const { createLarkSender } = await import("./sender-PLDU5EZ3.mjs");
|
|
9281
9201
|
const sender = await createLarkSender(installation.config);
|
|
9282
9202
|
await sender.sendTextReply({
|
|
9283
9203
|
chatId: replyTarget.rawTarget.chatId,
|
|
@@ -9500,7 +9420,7 @@ function setChannelControllerDeps(deps) {
|
|
|
9500
9420
|
_adapterRegistry = deps.adapterRegistry;
|
|
9501
9421
|
_router = deps.router;
|
|
9502
9422
|
}
|
|
9503
|
-
function
|
|
9423
|
+
function getTenantId11(request) {
|
|
9504
9424
|
const userTenantId = request.user?.tenantId;
|
|
9505
9425
|
if (typeof userTenantId === "string" && userTenantId) {
|
|
9506
9426
|
return userTenantId;
|
|
@@ -9630,7 +9550,7 @@ async function getInstallationStore() {
|
|
|
9630
9550
|
});
|
|
9631
9551
|
}
|
|
9632
9552
|
async function getChannelInstallationList(request) {
|
|
9633
|
-
const tenantId =
|
|
9553
|
+
const tenantId = getTenantId11(request);
|
|
9634
9554
|
const { channel } = request.query;
|
|
9635
9555
|
try {
|
|
9636
9556
|
const store = await getInstallationStore();
|
|
@@ -9656,7 +9576,7 @@ async function getChannelInstallationList(request) {
|
|
|
9656
9576
|
}
|
|
9657
9577
|
}
|
|
9658
9578
|
async function getChannelInstallation(request, reply) {
|
|
9659
|
-
const tenantId =
|
|
9579
|
+
const tenantId = getTenantId11(request);
|
|
9660
9580
|
const { installationId } = request.params;
|
|
9661
9581
|
try {
|
|
9662
9582
|
const store = await getInstallationStore();
|
|
@@ -9683,7 +9603,7 @@ async function getChannelInstallation(request, reply) {
|
|
|
9683
9603
|
}
|
|
9684
9604
|
}
|
|
9685
9605
|
async function createChannelInstallation(request, reply) {
|
|
9686
|
-
const tenantId =
|
|
9606
|
+
const tenantId = getTenantId11(request);
|
|
9687
9607
|
try {
|
|
9688
9608
|
const body = snapshotPublicCreateRequest(request.body);
|
|
9689
9609
|
if (!body) {
|
|
@@ -9742,7 +9662,7 @@ async function createChannelInstallation(request, reply) {
|
|
|
9742
9662
|
}
|
|
9743
9663
|
}
|
|
9744
9664
|
async function updateChannelInstallation(request, reply) {
|
|
9745
|
-
const tenantId =
|
|
9665
|
+
const tenantId = getTenantId11(request);
|
|
9746
9666
|
const { installationId } = request.params;
|
|
9747
9667
|
try {
|
|
9748
9668
|
const store = await getInstallationStore();
|
|
@@ -9866,7 +9786,7 @@ async function updateChannelInstallation(request, reply) {
|
|
|
9866
9786
|
}
|
|
9867
9787
|
}
|
|
9868
9788
|
async function deleteChannelInstallation(request, reply) {
|
|
9869
|
-
const tenantId =
|
|
9789
|
+
const tenantId = getTenantId11(request);
|
|
9870
9790
|
const { installationId } = request.params;
|
|
9871
9791
|
try {
|
|
9872
9792
|
const store = await getInstallationStore();
|
|
@@ -9938,7 +9858,7 @@ import {
|
|
|
9938
9858
|
descriptorDataValue as descriptorDataValue2
|
|
9939
9859
|
} from "@axiom-lattice/protocols";
|
|
9940
9860
|
import { getBindingRegistry, getStoreLattice as getStoreLattice14 } from "@axiom-lattice/core";
|
|
9941
|
-
function
|
|
9861
|
+
function getTenantId12(request) {
|
|
9942
9862
|
const userTenantId = request.user?.tenantId;
|
|
9943
9863
|
if (typeof userTenantId === "string" && userTenantId) return userTenantId;
|
|
9944
9864
|
return request.headers["x-tenant-id"] || "default";
|
|
@@ -10011,7 +9931,7 @@ function invalidCreateRequest(reply) {
|
|
|
10011
9931
|
}
|
|
10012
9932
|
async function getBindingList(request, _reply) {
|
|
10013
9933
|
void _reply;
|
|
10014
|
-
const tenantId =
|
|
9934
|
+
const tenantId = getTenantId12(request);
|
|
10015
9935
|
const { channel, agentId, channelInstallationId, limit, offset } = request.query;
|
|
10016
9936
|
try {
|
|
10017
9937
|
const registry = getBindingRegistry();
|
|
@@ -10031,7 +9951,7 @@ async function getBindingList(request, _reply) {
|
|
|
10031
9951
|
}
|
|
10032
9952
|
}
|
|
10033
9953
|
async function getBinding(request, reply) {
|
|
10034
|
-
const tenantId =
|
|
9954
|
+
const tenantId = getTenantId12(request);
|
|
10035
9955
|
try {
|
|
10036
9956
|
const registry = getBindingRegistry();
|
|
10037
9957
|
const binding = await registry.findById(tenantId, request.params.id);
|
|
@@ -10046,7 +9966,7 @@ async function getBinding(request, reply) {
|
|
|
10046
9966
|
}
|
|
10047
9967
|
}
|
|
10048
9968
|
async function createBinding(request, reply) {
|
|
10049
|
-
const tenantId =
|
|
9969
|
+
const tenantId = getTenantId12(request);
|
|
10050
9970
|
try {
|
|
10051
9971
|
const input = snapshotPublicCreate(request.body);
|
|
10052
9972
|
if (!input) return invalidCreateRequest(reply);
|
|
@@ -10071,7 +9991,7 @@ async function createBinding(request, reply) {
|
|
|
10071
9991
|
}
|
|
10072
9992
|
async function updateBinding(request, reply) {
|
|
10073
9993
|
try {
|
|
10074
|
-
const tenantId =
|
|
9994
|
+
const tenantId = getTenantId12(request);
|
|
10075
9995
|
const registry = getBindingRegistry();
|
|
10076
9996
|
const existing = await registry.findById(tenantId, request.params.id);
|
|
10077
9997
|
if (!existing || isInternalBinding(existing)) {
|
|
@@ -10098,7 +10018,7 @@ async function updateBinding(request, reply) {
|
|
|
10098
10018
|
}
|
|
10099
10019
|
async function deleteBinding(request, reply) {
|
|
10100
10020
|
try {
|
|
10101
|
-
const tenantId =
|
|
10021
|
+
const tenantId = getTenantId12(request);
|
|
10102
10022
|
const registry = getBindingRegistry();
|
|
10103
10023
|
const existing = await registry.findById(tenantId, request.params.id);
|
|
10104
10024
|
if (!existing || isInternalBinding(existing)) {
|
|
@@ -10115,7 +10035,7 @@ async function deleteBinding(request, reply) {
|
|
|
10115
10035
|
}
|
|
10116
10036
|
async function resolveBinding(request, _reply) {
|
|
10117
10037
|
void _reply;
|
|
10118
|
-
const tenantId =
|
|
10038
|
+
const tenantId = getTenantId12(request);
|
|
10119
10039
|
const { channel, senderId, channelInstallationId } = request.query;
|
|
10120
10040
|
if (channel === "room") {
|
|
10121
10041
|
return { success: false, message: "No binding found", data: null };
|
|
@@ -10145,7 +10065,7 @@ function registerChannelBindingRoutes(app2) {
|
|
|
10145
10065
|
|
|
10146
10066
|
// src/controllers/menu-items.ts
|
|
10147
10067
|
import { getMenuRegistry } from "@axiom-lattice/core";
|
|
10148
|
-
function
|
|
10068
|
+
function getTenantId13(request) {
|
|
10149
10069
|
const userTenantId = request.user?.tenantId;
|
|
10150
10070
|
if (userTenantId) return userTenantId;
|
|
10151
10071
|
return request.headers["x-tenant-id"] || "default";
|
|
@@ -10154,7 +10074,7 @@ function errorMessage(err) {
|
|
|
10154
10074
|
return err instanceof Error ? err.message : "Unexpected error";
|
|
10155
10075
|
}
|
|
10156
10076
|
async function getMenuItemList(request, _reply) {
|
|
10157
|
-
const tenantId =
|
|
10077
|
+
const tenantId = getTenantId13(request);
|
|
10158
10078
|
try {
|
|
10159
10079
|
const registry = getMenuRegistry();
|
|
10160
10080
|
const items = await registry.list({ tenantId, menuTarget: request.query.menuTarget });
|
|
@@ -10166,7 +10086,7 @@ async function getMenuItemList(request, _reply) {
|
|
|
10166
10086
|
}
|
|
10167
10087
|
}
|
|
10168
10088
|
async function getMenuItem(request, reply) {
|
|
10169
|
-
const tenantId =
|
|
10089
|
+
const tenantId = getTenantId13(request);
|
|
10170
10090
|
try {
|
|
10171
10091
|
const registry = getMenuRegistry();
|
|
10172
10092
|
const item = await registry.getById(request.params.id);
|
|
@@ -10183,7 +10103,7 @@ async function getMenuItem(request, reply) {
|
|
|
10183
10103
|
}
|
|
10184
10104
|
}
|
|
10185
10105
|
async function createMenuItem(request, reply) {
|
|
10186
|
-
const tenantId =
|
|
10106
|
+
const tenantId = getTenantId13(request);
|
|
10187
10107
|
try {
|
|
10188
10108
|
const registry = getMenuRegistry();
|
|
10189
10109
|
const item = await registry.create({ ...request.body, tenantId });
|
|
@@ -10198,7 +10118,7 @@ async function createMenuItem(request, reply) {
|
|
|
10198
10118
|
}
|
|
10199
10119
|
async function updateMenuItem(request, reply) {
|
|
10200
10120
|
try {
|
|
10201
|
-
const tenantId =
|
|
10121
|
+
const tenantId = getTenantId13(request);
|
|
10202
10122
|
const registry = getMenuRegistry();
|
|
10203
10123
|
const existing = await registry.getById(request.params.id);
|
|
10204
10124
|
if (!existing || existing.tenantId !== tenantId) {
|
|
@@ -10216,7 +10136,7 @@ async function updateMenuItem(request, reply) {
|
|
|
10216
10136
|
}
|
|
10217
10137
|
async function deleteMenuItem(request, reply) {
|
|
10218
10138
|
try {
|
|
10219
|
-
const tenantId =
|
|
10139
|
+
const tenantId = getTenantId13(request);
|
|
10220
10140
|
const registry = getMenuRegistry();
|
|
10221
10141
|
const existing = await registry.getById(request.params.id);
|
|
10222
10142
|
if (!existing || existing.tenantId !== tenantId) {
|
|
@@ -10257,8 +10177,8 @@ var log = {
|
|
|
10257
10177
|
};
|
|
10258
10178
|
var connections = /* @__PURE__ */ new Map();
|
|
10259
10179
|
var pending = /* @__PURE__ */ new Map();
|
|
10260
|
-
function getAgentIdFromPath(
|
|
10261
|
-
const match =
|
|
10180
|
+
function getAgentIdFromPath(path5) {
|
|
10181
|
+
const match = path5.match(/^\/api\/a2a\/bridge\/proxy\/([^/]+)/);
|
|
10262
10182
|
return match ? match[1] : null;
|
|
10263
10183
|
}
|
|
10264
10184
|
function handleBridgeConnection(socket, _request) {
|
|
@@ -10499,7 +10419,7 @@ import { getStoreLattice as getStoreLattice15 } from "@axiom-lattice/core";
|
|
|
10499
10419
|
import {
|
|
10500
10420
|
AgentType as AgentType2
|
|
10501
10421
|
} from "@axiom-lattice/protocols";
|
|
10502
|
-
function
|
|
10422
|
+
function getTenantId14(request) {
|
|
10503
10423
|
const userTenantId = request.user?.tenantId;
|
|
10504
10424
|
if (userTenantId) return userTenantId;
|
|
10505
10425
|
return request.headers["x-tenant-id"] || "default";
|
|
@@ -10536,7 +10456,7 @@ async function requireManagedAssistant(request, reply) {
|
|
|
10536
10456
|
reply.status(400).send({ success: false, error: "assistantId is required" });
|
|
10537
10457
|
return null;
|
|
10538
10458
|
}
|
|
10539
|
-
const registered = await getLocalA2AAssistant(
|
|
10459
|
+
const registered = await getLocalA2AAssistant(getTenantId14(request), assistantId);
|
|
10540
10460
|
if (!registered) {
|
|
10541
10461
|
reply.status(404).send({
|
|
10542
10462
|
success: false,
|
|
@@ -10547,7 +10467,7 @@ async function requireManagedAssistant(request, reply) {
|
|
|
10547
10467
|
return { assistantId, localRuntime: registered.localRuntime };
|
|
10548
10468
|
}
|
|
10549
10469
|
async function getLocalA2AStatus(request, reply) {
|
|
10550
|
-
const tenantId =
|
|
10470
|
+
const tenantId = getTenantId14(request);
|
|
10551
10471
|
const managed = await getLocalA2AAssistants(tenantId);
|
|
10552
10472
|
const states = await Promise.all(
|
|
10553
10473
|
managed.map(
|
|
@@ -11186,7 +11106,7 @@ function notifyProjectTaskAdmission(task) {
|
|
|
11186
11106
|
} catch {
|
|
11187
11107
|
}
|
|
11188
11108
|
}
|
|
11189
|
-
function
|
|
11109
|
+
function getTenantId15(request) {
|
|
11190
11110
|
const user = request.user;
|
|
11191
11111
|
const value = user?.tenantId ?? request.headers["x-tenant-id"] ?? "default";
|
|
11192
11112
|
if (typeof value !== "string" || !value) throw new HttpTaskError(400, "INVALID_TASK_INPUT");
|
|
@@ -11427,7 +11347,7 @@ async function validateReferences(store, task, parentId, dependencies) {
|
|
|
11427
11347
|
function createTaskController(deps) {
|
|
11428
11348
|
const mutationMutex = deps.projectMutationMutex ?? projectMutationMutex;
|
|
11429
11349
|
const authorize = async (request, projectId, capability2) => deps.access.requireProjectAccess({
|
|
11430
|
-
tenantId:
|
|
11350
|
+
tenantId: getTenantId15(request),
|
|
11431
11351
|
userId: getUserId4(request),
|
|
11432
11352
|
projectId,
|
|
11433
11353
|
capability: capability2
|
|
@@ -11444,7 +11364,7 @@ function createTaskController(deps) {
|
|
|
11444
11364
|
});
|
|
11445
11365
|
};
|
|
11446
11366
|
const list = withErrors(async (request) => {
|
|
11447
|
-
const tenantId =
|
|
11367
|
+
const tenantId = getTenantId15(request);
|
|
11448
11368
|
const userId = getUserId4(request);
|
|
11449
11369
|
const query = exactObject(request.query, ["projectId", "status", "priority", "limit", "offset", "ownerType", "ownerId", "parentId", "metadata"]);
|
|
11450
11370
|
const projectId = typeof query.projectId === "string" ? query.projectId : void 0;
|
|
@@ -11516,14 +11436,14 @@ function createTaskController(deps) {
|
|
|
11516
11436
|
});
|
|
11517
11437
|
const get = withErrors(async (request, reply) => {
|
|
11518
11438
|
await preauthorizeExplicitProject(request, authorize);
|
|
11519
|
-
const current = await deps.tasks.getById(
|
|
11439
|
+
const current = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11520
11440
|
if (!current) return sendNotFound(reply);
|
|
11521
11441
|
await authorizeRead(request, current, authorize);
|
|
11522
11442
|
return { success: true, data: current };
|
|
11523
11443
|
});
|
|
11524
11444
|
const create = withErrors(async (request, reply) => {
|
|
11525
11445
|
const body = snapshotCreate(request.body);
|
|
11526
|
-
const tenantId =
|
|
11446
|
+
const tenantId = getTenantId15(request);
|
|
11527
11447
|
const userId = getUserId4(request);
|
|
11528
11448
|
const governed = governedCreate(body);
|
|
11529
11449
|
if (governed) return reply.code(409).send({ success: false, code: governed });
|
|
@@ -11576,7 +11496,7 @@ function createTaskController(deps) {
|
|
|
11576
11496
|
const update = withErrors(async (request, reply) => {
|
|
11577
11497
|
const body = snapshotUpdate(request.body);
|
|
11578
11498
|
await preauthorizeExplicitProject(request, authorize);
|
|
11579
|
-
const current = await deps.tasks.getById(
|
|
11499
|
+
const current = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11580
11500
|
if (!current) return sendNotFound(reply);
|
|
11581
11501
|
await authorizeMutation(request, current, authorize);
|
|
11582
11502
|
return lockedTask(request, current, async (locked) => {
|
|
@@ -11594,7 +11514,7 @@ function createTaskController(deps) {
|
|
|
11594
11514
|
});
|
|
11595
11515
|
const remove = withErrors(async (request, reply) => {
|
|
11596
11516
|
await preauthorizeExplicitProject(request, authorize);
|
|
11597
|
-
const current = await deps.tasks.getById(
|
|
11517
|
+
const current = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11598
11518
|
if (!current) return sendNotFound(reply);
|
|
11599
11519
|
await authorizeMutation(request, current, authorize);
|
|
11600
11520
|
return lockedTask(request, current, async (locked) => {
|
|
@@ -11608,7 +11528,7 @@ function createTaskController(deps) {
|
|
|
11608
11528
|
const complete = withErrors(async (request, reply) => {
|
|
11609
11529
|
const body = snapshotComplete(request.body);
|
|
11610
11530
|
await preauthorizeExplicitProject(request, authorize);
|
|
11611
|
-
const current = await deps.tasks.getById(
|
|
11531
|
+
const current = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11612
11532
|
if (!current) return sendNotFound(reply);
|
|
11613
11533
|
await authorizeMutation(request, current, authorize);
|
|
11614
11534
|
return lockedTask(request, current, async (locked) => {
|
|
@@ -11625,7 +11545,7 @@ function createTaskController(deps) {
|
|
|
11625
11545
|
});
|
|
11626
11546
|
const workItems = withErrors(async (request, reply) => {
|
|
11627
11547
|
await preauthorizeExplicitProject(request, authorize);
|
|
11628
|
-
const current = await deps.tasks.getById(
|
|
11548
|
+
const current = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11629
11549
|
if (!current) return sendNotFound(reply);
|
|
11630
11550
|
await authorizeRead(request, current, authorize);
|
|
11631
11551
|
const query = exactObject(request.query, ["action", "limit", "offset"]);
|
|
@@ -11645,7 +11565,7 @@ function createTaskController(deps) {
|
|
|
11645
11565
|
const body = snapshotReassign(request.body);
|
|
11646
11566
|
const pathProject = request.params.projectId;
|
|
11647
11567
|
const access = await authorize(request, pathProject, "manage");
|
|
11648
|
-
const snapshot = await deps.tasks.getById(
|
|
11568
|
+
const snapshot = await deps.tasks.getById(getTenantId15(request), request.params.id);
|
|
11649
11569
|
if (!snapshot || snapshot.projectId !== access.project.id || snapshot.workspaceId !== access.project.workspaceId || snapshot.ownerType !== "agent") throw notFound();
|
|
11650
11570
|
const projectId = snapshot.projectId;
|
|
11651
11571
|
return deps.executionMutex.runExclusive({
|
|
@@ -12811,7 +12731,6 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
|
|
|
12811
12731
|
});
|
|
12812
12732
|
routes.get("/api/web-apps/:webAppId/runtime/files/viewfile", async (request, reply) => {
|
|
12813
12733
|
const { webAppId } = paramsSchema.parse(request.params);
|
|
12814
|
-
const identity = await resolveRuntimeIdentity(request, webAppId, identities);
|
|
12815
12734
|
const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
|
|
12816
12735
|
const query = { ...request.query, assistantId: scope.assistantId };
|
|
12817
12736
|
await workspace.viewFile(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
|
|
@@ -12819,7 +12738,6 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
|
|
|
12819
12738
|
});
|
|
12820
12739
|
routes.get("/api/web-apps/:webAppId/runtime/files/downloadfile", async (request, reply) => {
|
|
12821
12740
|
const { webAppId } = paramsSchema.parse(request.params);
|
|
12822
|
-
const identity = await resolveRuntimeIdentity(request, webAppId, identities);
|
|
12823
12741
|
const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
|
|
12824
12742
|
const query = { ...request.query, assistantId: scope.assistantId };
|
|
12825
12743
|
await workspace.downloadFile(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
|
|
@@ -12844,6 +12762,15 @@ function registerAgentWebAppRuntimeRoutes(app2, deps) {
|
|
|
12844
12762
|
};
|
|
12845
12763
|
routes.get("/api/web-apps/:webAppId/runtime/assistants/:assistantId/threads/:threadId/sandbox/downloadfile", delegateGenuiFile(workspace.downloadFile.bind(workspace)));
|
|
12846
12764
|
routes.get("/api/web-apps/:webAppId/runtime/assistants/:assistantId/threads/:threadId/sandbox/viewfile", delegateGenuiFile(workspace.viewFile.bind(workspace)));
|
|
12765
|
+
const delegateAnonGenuiFile = (method) => async (request, reply) => {
|
|
12766
|
+
const { webAppId } = genuiSandboxParams.parse(request.params);
|
|
12767
|
+
const scope = await fileScope(webAppId, fileQuerySchema.parse(request.query));
|
|
12768
|
+
const query = { ...request.query, assistantId: scope.assistantId };
|
|
12769
|
+
await method(scopedRequest(request, scope, { workspaceId: scope.workspaceId, projectId: scope.projectId }, query), reply);
|
|
12770
|
+
return reply;
|
|
12771
|
+
};
|
|
12772
|
+
routes.get("/api/web-apps/:webAppId/runtime/api/assistants/:assistantId/threads/:threadId/sandbox/downloadfile", delegateAnonGenuiFile(workspace.downloadFile.bind(workspace)));
|
|
12773
|
+
routes.get("/api/web-apps/:webAppId/runtime/api/assistants/:assistantId/threads/:threadId/sandbox/viewfile", delegateAnonGenuiFile(workspace.viewFile.bind(workspace)));
|
|
12847
12774
|
}
|
|
12848
12775
|
const mirrorThreadParams = z5.object({ webAppId: idSchema, assistantId: idSchema, threadId: idSchema }).strict();
|
|
12849
12776
|
const mirrorBody = z5.object({ metadata: z5.object({ label: z5.string().max(300).optional() }).strict().optional(), projectId: idSchema.optional(), modelKey: idSchema.optional() }).strict();
|
|
@@ -13034,6 +12961,105 @@ function isMultipartRequestError(error) {
|
|
|
13034
12961
|
return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && error.code.startsWith("FST_");
|
|
13035
12962
|
}
|
|
13036
12963
|
|
|
12964
|
+
// src/routes/agent-web-app-embed.ts
|
|
12965
|
+
import { existsSync as existsSync2 } from "fs";
|
|
12966
|
+
import { readFile, readdir as readdir2 } from "fs/promises";
|
|
12967
|
+
import path3 from "path";
|
|
12968
|
+
import { z as z6 } from "zod";
|
|
12969
|
+
var idSchema2 = z6.string().min(1).max(128).regex(/^[A-Za-z0-9._:@-]+$/);
|
|
12970
|
+
var JS_CONTENT_TYPE = "application/javascript; charset=utf-8";
|
|
12971
|
+
var CSS_CONTENT_TYPE = "text/css; charset=utf-8";
|
|
12972
|
+
var EXACT_ASSETS = {
|
|
12973
|
+
"agent-chat-loader.js": { contentType: JS_CONTENT_TYPE },
|
|
12974
|
+
"embed-page.js": { contentType: JS_CONTENT_TYPE },
|
|
12975
|
+
"embed-page.css": { contentType: CSS_CONTENT_TYPE }
|
|
12976
|
+
};
|
|
12977
|
+
var HASHED_CHUNK_PATTERN = /^embed-page-[A-Za-z0-9._-]+\.(js|css)$/;
|
|
12978
|
+
var CHUNK_CSS_PATTERN = /^embed-page-[A-Za-z0-9._-]+\.css$/;
|
|
12979
|
+
function resolveAsset(asset) {
|
|
12980
|
+
if (asset.includes("..")) return null;
|
|
12981
|
+
const exact2 = EXACT_ASSETS[asset];
|
|
12982
|
+
if (exact2 !== void 0) return { contentType: exact2.contentType, immutable: false };
|
|
12983
|
+
const hashed = HASHED_CHUNK_PATTERN.exec(asset);
|
|
12984
|
+
if (hashed) {
|
|
12985
|
+
return { contentType: hashed[1] === "css" ? CSS_CONTENT_TYPE : JS_CONTENT_TYPE, immutable: true };
|
|
12986
|
+
}
|
|
12987
|
+
return null;
|
|
12988
|
+
}
|
|
12989
|
+
async function listChunkCssFiles(assetsDir) {
|
|
12990
|
+
try {
|
|
12991
|
+
return (await readdir2(assetsDir)).filter((name) => CHUNK_CSS_PATTERN.test(name) && !name.includes("..")).sort();
|
|
12992
|
+
} catch {
|
|
12993
|
+
return [];
|
|
12994
|
+
}
|
|
12995
|
+
}
|
|
12996
|
+
var BUNDLED_MARKER = "agent-chat-loader.js";
|
|
12997
|
+
function resolveBundledEmbedDir() {
|
|
12998
|
+
if (typeof __dirname === "string") {
|
|
12999
|
+
const compiled = path3.resolve(__dirname, "embed");
|
|
13000
|
+
if (existsSync2(path3.join(compiled, BUNDLED_MARKER))) return compiled;
|
|
13001
|
+
}
|
|
13002
|
+
let dir = path3.dirname(path3.resolve(process.argv[1] ?? process.cwd()));
|
|
13003
|
+
for (let depth = 0; depth < 8; depth += 1) {
|
|
13004
|
+
const candidate = path3.join(dir, "packages", "gateway", "dist", "embed");
|
|
13005
|
+
if (existsSync2(path3.join(candidate, BUNDLED_MARKER))) return candidate;
|
|
13006
|
+
const parent = path3.dirname(dir);
|
|
13007
|
+
if (parent === dir) break;
|
|
13008
|
+
dir = parent;
|
|
13009
|
+
}
|
|
13010
|
+
return null;
|
|
13011
|
+
}
|
|
13012
|
+
function renderChatShell(chunkCssFiles) {
|
|
13013
|
+
const chunkCssLinks = chunkCssFiles.map(
|
|
13014
|
+
(name) => ` <link rel="stylesheet" href="/embed/${name}" />`
|
|
13015
|
+
);
|
|
13016
|
+
return [
|
|
13017
|
+
"<!doctype html>",
|
|
13018
|
+
'<html lang="en">',
|
|
13019
|
+
" <head>",
|
|
13020
|
+
' <meta charset="utf-8" />',
|
|
13021
|
+
' <meta name="viewport" content="width=device-width, initial-scale=1" />',
|
|
13022
|
+
" <title>Agent chat</title>",
|
|
13023
|
+
' <link rel="stylesheet" href="/embed/embed-page.css" />',
|
|
13024
|
+
...chunkCssLinks,
|
|
13025
|
+
" </head>",
|
|
13026
|
+
" <body>",
|
|
13027
|
+
' <div id="axiom-embed-root">',
|
|
13028
|
+
" <noscript>This chat requires JavaScript.</noscript>",
|
|
13029
|
+
' <p class="axiom-embed-loading">Loading chat\u2026</p>',
|
|
13030
|
+
" </div>",
|
|
13031
|
+
' <script type="module" src="/embed/embed-page.js"></script>',
|
|
13032
|
+
" </body>",
|
|
13033
|
+
"</html>"
|
|
13034
|
+
].join("\n");
|
|
13035
|
+
}
|
|
13036
|
+
function registerAgentWebAppEmbedRoutes(app2, deps = {}) {
|
|
13037
|
+
const bundledDir = resolveBundledEmbedDir();
|
|
13038
|
+
const assetsDir = deps.assetsDir ?? process.env.AXIOM_EMBED_ASSETS_DIR ?? bundledDir ?? path3.resolve(process.cwd(), "assets/embed");
|
|
13039
|
+
let chunkCssFiles = null;
|
|
13040
|
+
app2.get("/api/web-apps/:webAppId/chat", async (request, reply) => {
|
|
13041
|
+
const parsed = idSchema2.safeParse(request.params.webAppId);
|
|
13042
|
+
if (!parsed.success) {
|
|
13043
|
+
return reply.code(400).send({ success: false, error: { code: "INVALID_REQUEST", message: "Invalid web app id", retryable: false } });
|
|
13044
|
+
}
|
|
13045
|
+
chunkCssFiles ?? (chunkCssFiles = await listChunkCssFiles(assetsDir));
|
|
13046
|
+
return reply.header("content-type", "text/html; charset=utf-8").header("cache-control", "no-store").send(renderChatShell(chunkCssFiles));
|
|
13047
|
+
});
|
|
13048
|
+
app2.get("/embed/:asset", async (request, reply) => {
|
|
13049
|
+
const asset = request.params.asset ?? "";
|
|
13050
|
+
const resolved = resolveAsset(asset);
|
|
13051
|
+
if (resolved === null) {
|
|
13052
|
+
return reply.code(404).send({ success: false, error: { code: "INVALID_REQUEST", message: "Unknown embed asset", retryable: false } });
|
|
13053
|
+
}
|
|
13054
|
+
try {
|
|
13055
|
+
const body = await readFile(path3.join(assetsDir, asset));
|
|
13056
|
+
return reply.header("content-type", resolved.contentType).header("cache-control", resolved.immutable ? "public, max-age=31536000, immutable" : "public, max-age=300").send(body);
|
|
13057
|
+
} catch {
|
|
13058
|
+
return reply.code(404).send({ success: false, error: { code: "INVALID_REQUEST", message: "Embed asset not built", retryable: false } });
|
|
13059
|
+
}
|
|
13060
|
+
});
|
|
13061
|
+
}
|
|
13062
|
+
|
|
13037
13063
|
// src/services/agent-web-app/AgentWebAppAttachmentRef.ts
|
|
13038
13064
|
import { createCipheriv, createDecipheriv, createHash as createHash3, randomBytes as randomBytes2 } from "crypto";
|
|
13039
13065
|
var TTL_MS = 15 * 6e4;
|
|
@@ -13116,10 +13142,10 @@ function isAttachmentPayload(value) {
|
|
|
13116
13142
|
}
|
|
13117
13143
|
|
|
13118
13144
|
// src/controllers/capability-bundles.ts
|
|
13119
|
-
import { z as
|
|
13145
|
+
import { z as z8 } from "zod";
|
|
13120
13146
|
|
|
13121
13147
|
// src/services/capability/CapabilityBundleService.ts
|
|
13122
|
-
import { z as
|
|
13148
|
+
import { z as z7 } from "zod";
|
|
13123
13149
|
import { CapabilityBundleMergeError, CapabilityBundleValidationError, mergeCapabilityBundles, validateCapabilityBundleInput } from "@axiom-lattice/core";
|
|
13124
13150
|
var CapabilityBundleServiceError = class extends Error {
|
|
13125
13151
|
constructor(code, message, statusCode) {
|
|
@@ -13129,7 +13155,7 @@ var CapabilityBundleServiceError = class extends Error {
|
|
|
13129
13155
|
this.name = "CapabilityBundleServiceError";
|
|
13130
13156
|
}
|
|
13131
13157
|
};
|
|
13132
|
-
var uuid =
|
|
13158
|
+
var uuid = z7.string().uuid();
|
|
13133
13159
|
function ownRecord(value) {
|
|
13134
13160
|
if (value === void 0 || value === null) return {};
|
|
13135
13161
|
if (typeof value !== "object" || Array.isArray(value)) throw new CapabilityBundleServiceError("INVALID_BUNDLE_CONFIG", "Project config must be an object", 409);
|
|
@@ -13331,12 +13357,12 @@ var CapabilityBundleService = class {
|
|
|
13331
13357
|
|
|
13332
13358
|
// src/controllers/capability-bundles.ts
|
|
13333
13359
|
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 =
|
|
13360
|
+
var capability = z8.unknown();
|
|
13361
|
+
var createSchema = z8.object({ name: z8.string(), description: z8.string().optional(), capabilities: z8.array(capability) }).strict();
|
|
13362
|
+
var updateSchema = createSchema.partial().extend({ expectedUpdatedAt: z8.string().optional() });
|
|
13363
|
+
var bundleIdSchema = z8.string().uuid();
|
|
13364
|
+
var bundleParamsSchema = z8.object({ bundleId: bundleIdSchema });
|
|
13365
|
+
var projectSchema = z8.object({ bundleIds: z8.array(bundleIdSchema), expectedRevisions: z8.record(z8.string()).optional() }).strict();
|
|
13340
13366
|
function tenant(request, authRequired2) {
|
|
13341
13367
|
const authenticated = request.user?.tenantId;
|
|
13342
13368
|
const header2 = request.headers["x-tenant-id"];
|
|
@@ -13604,6 +13630,14 @@ var ProjectMembershipService = class {
|
|
|
13604
13630
|
const room = await this.deps.roomStore.getMainRoom(membership.tenantId, membership.projectId);
|
|
13605
13631
|
if (!room) throw new Error("Project main room not found");
|
|
13606
13632
|
this.deps.realtime.membershipChanged({ tenantId: membership.tenantId, roomId: room.id, membership, change, sourceKey });
|
|
13633
|
+
this.deps.realtime.membershipAffected({
|
|
13634
|
+
tenantId: membership.tenantId,
|
|
13635
|
+
userId: membership.userId,
|
|
13636
|
+
change,
|
|
13637
|
+
projectId: membership.projectId,
|
|
13638
|
+
roomId: room.id,
|
|
13639
|
+
sourceKey: `membership-affected:${sourceKey}`
|
|
13640
|
+
});
|
|
13607
13641
|
}).catch((error) => {
|
|
13608
13642
|
this.reportRealtimeFailure(membership.id);
|
|
13609
13643
|
});
|
|
@@ -14208,45 +14242,46 @@ function matchesNormalizedPayload(message, input) {
|
|
|
14208
14242
|
|
|
14209
14243
|
// src/routes/project-rooms.ts
|
|
14210
14244
|
import { ZodError as ZodError3 } from "zod";
|
|
14245
|
+
import { toProjectRoomPublicMessage } from "@axiom-lattice/protocols";
|
|
14211
14246
|
|
|
14212
14247
|
// 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:
|
|
14248
|
+
import { z as z9 } from "zod";
|
|
14249
|
+
var id2 = z9.string().trim().min(1).max(128);
|
|
14250
|
+
var isoDate = z9.string().datetime({ offset: true }).transform((value) => new Date(value));
|
|
14251
|
+
var expectedUpdatedAt = z9.object({ expectedUpdatedAt: isoDate }).strict();
|
|
14252
|
+
var projectRoomParamsSchema = z9.object({ projectId: id2 }).strict();
|
|
14253
|
+
var membershipParamsSchema = z9.object({ projectId: id2, membershipId: id2 }).strict();
|
|
14254
|
+
var roomMessagesQuerySchema = z9.object({
|
|
14255
|
+
beforeCreatedAt: z9.string().datetime({ offset: true }).transform((value) => new Date(value)).optional(),
|
|
14221
14256
|
beforeId: id2.optional(),
|
|
14222
|
-
limit:
|
|
14257
|
+
limit: z9.coerce.number().int().min(1).max(100).optional()
|
|
14223
14258
|
}).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
|
-
|
|
14259
|
+
var createRoomMessageSchema = z9.object({
|
|
14260
|
+
text: z9.string(),
|
|
14261
|
+
mentions: z9.array(z9.union([
|
|
14262
|
+
z9.object({ type: z9.literal("team") }).strict(),
|
|
14263
|
+
z9.object({ type: z9.literal("bot"), membershipId: id2 }).strict()
|
|
14229
14264
|
])).optional(),
|
|
14230
14265
|
replyToMessageId: id2.optional()
|
|
14231
14266
|
}).strict();
|
|
14232
|
-
var addProjectMemberSchema =
|
|
14233
|
-
var updateProjectMemberSchema =
|
|
14267
|
+
var addProjectMemberSchema = z9.object({ userId: id2, role: z9.enum(["owner", "admin", "member", "viewer"]) }).strict();
|
|
14268
|
+
var updateProjectMemberSchema = z9.object({ role: z9.enum(["owner", "admin", "member", "viewer"]), expectedUpdatedAt: isoDate }).strict();
|
|
14234
14269
|
var mutationExpectedUpdatedAtSchema = expectedUpdatedAt;
|
|
14235
|
-
var roomMessageRetryParamsSchema =
|
|
14236
|
-
var emptyObjectSchema =
|
|
14237
|
-
var idempotencyKeySchema =
|
|
14238
|
-
var addProjectBotSchema =
|
|
14270
|
+
var roomMessageRetryParamsSchema = z9.object({ projectId: id2, messageId: id2 }).strict();
|
|
14271
|
+
var emptyObjectSchema = z9.object({}).strict();
|
|
14272
|
+
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());
|
|
14273
|
+
var addProjectBotSchema = z9.object({
|
|
14239
14274
|
assistantId: id2,
|
|
14240
|
-
role:
|
|
14241
|
-
title:
|
|
14242
|
-
responsibility:
|
|
14243
|
-
mentionName:
|
|
14275
|
+
role: z9.enum(["coordinator", "specialist"]),
|
|
14276
|
+
title: z9.string(),
|
|
14277
|
+
responsibility: z9.string().optional(),
|
|
14278
|
+
mentionName: z9.string()
|
|
14244
14279
|
}).strict();
|
|
14245
|
-
var updateProjectBotSchema =
|
|
14246
|
-
role:
|
|
14247
|
-
title:
|
|
14248
|
-
responsibility:
|
|
14249
|
-
mentionName:
|
|
14280
|
+
var updateProjectBotSchema = z9.object({
|
|
14281
|
+
role: z9.enum(["coordinator", "specialist"]).optional(),
|
|
14282
|
+
title: z9.string().optional(),
|
|
14283
|
+
responsibility: z9.string().optional(),
|
|
14284
|
+
mentionName: z9.string().optional(),
|
|
14250
14285
|
expectedUpdatedAt: isoDate
|
|
14251
14286
|
}).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
14287
|
|
|
@@ -14264,7 +14299,8 @@ function registerProjectRoomRoutes(app2, deps) {
|
|
|
14264
14299
|
const params = projectRoomParamsSchema.parse(request.params);
|
|
14265
14300
|
const query = roomMessagesQuerySchema.parse(request.query);
|
|
14266
14301
|
const before = query.beforeCreatedAt === void 0 && query.beforeId === void 0 ? void 0 : { createdAt: query.beforeCreatedAt, id: query.beforeId };
|
|
14267
|
-
|
|
14302
|
+
const messages = await deps.messageService.list(actor(request, params.projectId), { ...before ? { before } : {}, ...query.limit === void 0 ? {} : { limit: query.limit } });
|
|
14303
|
+
return { data: messages.map(toProjectRoomMessage) };
|
|
14268
14304
|
}));
|
|
14269
14305
|
app2.post("/api/projects/:projectId/room/messages", async (request, reply) => run(reply, async () => {
|
|
14270
14306
|
const params = projectRoomParamsSchema.parse(request.params);
|
|
@@ -14275,7 +14311,7 @@ function registerProjectRoomRoutes(app2, deps) {
|
|
|
14275
14311
|
const idempotencyKey = rawIdempotencyKey === void 0 ? void 0 : idempotencyKeySchema.parse(rawIdempotencyKey);
|
|
14276
14312
|
const result = await deps.messageService.createAndDispatch(requestActor, { ...input, ...idempotencyKey === void 0 ? {} : { requestIdempotencyKey: idempotencyKey } });
|
|
14277
14313
|
const allSucceeded = result.dispatch.length > 0 && result.dispatch.every((entry) => entry.success);
|
|
14278
|
-
return { statusCode: allSucceeded ? result.replayed ? 200 : 201 : 202, data: result };
|
|
14314
|
+
return { statusCode: allSucceeded ? result.replayed ? 200 : 201 : 202, data: { message: toProjectRoomMessage(result.message), dispatch: result.dispatch, replayed: result.replayed } };
|
|
14279
14315
|
}));
|
|
14280
14316
|
app2.post("/api/projects/:projectId/room/messages/:messageId/retry", async (request, reply) => run(reply, async () => {
|
|
14281
14317
|
const params = roomMessageRetryParamsSchema.parse(request.params);
|
|
@@ -14284,7 +14320,20 @@ function registerProjectRoomRoutes(app2, deps) {
|
|
|
14284
14320
|
const dispatch = await deps.messageService.retry(actor(request, params.projectId), params.messageId);
|
|
14285
14321
|
return { statusCode: dispatch.length > 0 && dispatch.every((entry) => entry.success) ? 200 : 202, data: dispatch };
|
|
14286
14322
|
}));
|
|
14287
|
-
app2.
|
|
14323
|
+
app2.post("/api/projects/:projectId/room/read-state", async (request, reply) => run(reply, async () => {
|
|
14324
|
+
const params = projectRoomParamsSchema.parse(request.params);
|
|
14325
|
+
emptyObjectSchema.parse(request.body ?? {});
|
|
14326
|
+
await deps.readStateService.mark(actor(request, params.projectId));
|
|
14327
|
+
return { data: { marked: true } };
|
|
14328
|
+
}));
|
|
14329
|
+
app2.get("/api/projects/:projectId/members", async (request, reply) => run(reply, async () => {
|
|
14330
|
+
const memberships = await deps.membershipService.list(actor(request, projectRoomParamsSchema.parse(request.params).projectId));
|
|
14331
|
+
const enriched = await Promise.all(memberships.map(async (membership) => {
|
|
14332
|
+
const user = await deps.userDirectory.getUserById(membership.userId);
|
|
14333
|
+
return user === null ? membership : { ...membership, name: user.name };
|
|
14334
|
+
}));
|
|
14335
|
+
return { data: enriched };
|
|
14336
|
+
}));
|
|
14288
14337
|
app2.post("/api/projects/:projectId/members", async (request, reply) => run(reply, async () => {
|
|
14289
14338
|
const p = projectRoomParamsSchema.parse(request.params);
|
|
14290
14339
|
return { statusCode: 201, data: await deps.membershipService.add(actor(request, p.projectId), addProjectMemberSchema.parse(request.body)) };
|
|
@@ -14306,6 +14355,11 @@ function actor(request, projectId) {
|
|
|
14306
14355
|
projectRoomParamsSchema.parse({ projectId });
|
|
14307
14356
|
return { tenantId: user.tenantId, userId: user.id, projectId };
|
|
14308
14357
|
}
|
|
14358
|
+
function toProjectRoomMessage(message) {
|
|
14359
|
+
const publicMessage = toProjectRoomPublicMessage(message);
|
|
14360
|
+
if (publicMessage === void 0) throw new Error("Room message could not be mapped to its public DTO");
|
|
14361
|
+
return publicMessage;
|
|
14362
|
+
}
|
|
14309
14363
|
async function run(reply, operation) {
|
|
14310
14364
|
try {
|
|
14311
14365
|
const result = await operation();
|
|
@@ -14371,6 +14425,7 @@ import {
|
|
|
14371
14425
|
generateDirectHumanProjectId,
|
|
14372
14426
|
generateDirectBotProjectId
|
|
14373
14427
|
} from "@axiom-lattice/core";
|
|
14428
|
+
import { toProjectRoomPublicMessage as toProjectRoomPublicMessage2 } from "@axiom-lattice/protocols";
|
|
14374
14429
|
var CoSpaceAuthError = class extends Error {
|
|
14375
14430
|
constructor() {
|
|
14376
14431
|
super(...arguments);
|
|
@@ -14385,6 +14440,18 @@ function getActor2(request) {
|
|
|
14385
14440
|
}
|
|
14386
14441
|
return { tenantId: user.tenantId, userId: user.id };
|
|
14387
14442
|
}
|
|
14443
|
+
async function computeUnread(deps, tenantId, userId, roomId, lastMessage) {
|
|
14444
|
+
if (!lastMessage) return 0;
|
|
14445
|
+
const readState = await deps.readStateStore.get(tenantId, roomId, userId);
|
|
14446
|
+
const horizon = readState?.lastReadAt;
|
|
14447
|
+
if (horizon && lastMessage.createdAt.getTime() <= horizon.getTime()) return 0;
|
|
14448
|
+
return deps.messageStore.countAfter({
|
|
14449
|
+
tenantId,
|
|
14450
|
+
roomId,
|
|
14451
|
+
after: horizon ?? /* @__PURE__ */ new Date(0),
|
|
14452
|
+
excludeAuthorUserId: userId
|
|
14453
|
+
});
|
|
14454
|
+
}
|
|
14388
14455
|
function registerCoSpaceRoutes(app2, deps) {
|
|
14389
14456
|
const idFactory = deps.idFactory ?? (() => randomUUID16());
|
|
14390
14457
|
app2.get(
|
|
@@ -14435,67 +14502,91 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14435
14502
|
limit: 1
|
|
14436
14503
|
});
|
|
14437
14504
|
const lastMessage = messages[0];
|
|
14505
|
+
const publicLastMessage = lastMessage === void 0 ? void 0 : toProjectRoomPublicMessage2(lastMessage);
|
|
14438
14506
|
const memberships = await deps.membershipStore.list(
|
|
14439
14507
|
actor2.tenantId,
|
|
14440
14508
|
project.id
|
|
14441
14509
|
);
|
|
14442
14510
|
const participantNames = [];
|
|
14511
|
+
const otherHumanNames = [];
|
|
14443
14512
|
for (const m of memberships) {
|
|
14444
14513
|
if (m.status !== "active") continue;
|
|
14445
14514
|
const user = await deps.userStore.getUserById(m.userId);
|
|
14446
14515
|
if (user) {
|
|
14447
14516
|
participantNames.push(user.name);
|
|
14517
|
+
if (m.userId !== actor2.userId) otherHumanNames.push(user.name);
|
|
14448
14518
|
}
|
|
14449
14519
|
}
|
|
14520
|
+
const displayName = project.kind === "personal" && otherHumanNames.length === 1 ? otherHumanNames[0] : void 0;
|
|
14450
14521
|
rooms.push({
|
|
14451
14522
|
project,
|
|
14452
14523
|
room,
|
|
14453
|
-
lastMessage,
|
|
14524
|
+
lastMessage: publicLastMessage,
|
|
14454
14525
|
participantCount: memberships.filter(
|
|
14455
14526
|
(m) => m.status === "active"
|
|
14456
14527
|
).length,
|
|
14457
|
-
participantNames
|
|
14528
|
+
participantNames,
|
|
14529
|
+
...displayName === void 0 ? {} : { displayName },
|
|
14530
|
+
unreadCount: await computeUnread(
|
|
14531
|
+
deps,
|
|
14532
|
+
actor2.tenantId,
|
|
14533
|
+
actor2.userId,
|
|
14534
|
+
room.id,
|
|
14535
|
+
lastMessage
|
|
14536
|
+
)
|
|
14458
14537
|
});
|
|
14459
14538
|
} catch (e) {
|
|
14460
14539
|
console.error("[CoSpace] Failed to process room for project:", project.id, e);
|
|
14461
14540
|
}
|
|
14462
14541
|
}
|
|
14463
14542
|
rooms.sort((a, b) => {
|
|
14464
|
-
const aTime = a.lastMessage
|
|
14465
|
-
const bTime = b.lastMessage
|
|
14543
|
+
const aTime = a.lastMessage ? Date.parse(a.lastMessage.createdAt) : 0;
|
|
14544
|
+
const bTime = b.lastMessage ? Date.parse(b.lastMessage.createdAt) : 0;
|
|
14466
14545
|
return bTime - aTime;
|
|
14467
14546
|
});
|
|
14468
|
-
|
|
14469
|
-
|
|
14470
|
-
|
|
14471
|
-
|
|
14472
|
-
|
|
14473
|
-
|
|
14474
|
-
|
|
14475
|
-
|
|
14476
|
-
|
|
14477
|
-
|
|
14478
|
-
|
|
14479
|
-
|
|
14480
|
-
|
|
14481
|
-
|
|
14482
|
-
const
|
|
14483
|
-
|
|
14484
|
-
|
|
14485
|
-
|
|
14486
|
-
|
|
14487
|
-
|
|
14488
|
-
|
|
14489
|
-
|
|
14490
|
-
|
|
14491
|
-
|
|
14492
|
-
|
|
14493
|
-
|
|
14494
|
-
|
|
14495
|
-
|
|
14496
|
-
|
|
14497
|
-
|
|
14498
|
-
|
|
14547
|
+
try {
|
|
14548
|
+
const publicRoom = await deps.publicRoom.ensure(actor2.tenantId, params.workspaceId);
|
|
14549
|
+
if (publicRoom) {
|
|
14550
|
+
const publicMessages = await deps.messageStore.list({
|
|
14551
|
+
tenantId: actor2.tenantId,
|
|
14552
|
+
roomId: publicRoom.room.id,
|
|
14553
|
+
limit: 1
|
|
14554
|
+
});
|
|
14555
|
+
const publicLastMessage = publicMessages[0];
|
|
14556
|
+
const publicMemberships = await deps.membershipStore.list(
|
|
14557
|
+
actor2.tenantId,
|
|
14558
|
+
publicRoom.project.id
|
|
14559
|
+
);
|
|
14560
|
+
const publicParticipantNames = [];
|
|
14561
|
+
for (const m of publicMemberships) {
|
|
14562
|
+
if (m.status !== "active") continue;
|
|
14563
|
+
const user = await deps.userStore.getUserById(m.userId);
|
|
14564
|
+
if (user) {
|
|
14565
|
+
publicParticipantNames.push(user.name);
|
|
14566
|
+
}
|
|
14567
|
+
}
|
|
14568
|
+
rooms.unshift({
|
|
14569
|
+
project: publicRoom.project,
|
|
14570
|
+
room: publicRoom.room,
|
|
14571
|
+
lastMessage: publicLastMessage === void 0 ? void 0 : toProjectRoomPublicMessage2(publicLastMessage),
|
|
14572
|
+
participantCount: publicMemberships.filter((m) => m.status === "active").length,
|
|
14573
|
+
participantNames: publicParticipantNames,
|
|
14574
|
+
isPublic: true,
|
|
14575
|
+
unreadCount: await computeUnread(
|
|
14576
|
+
deps,
|
|
14577
|
+
actor2.tenantId,
|
|
14578
|
+
actor2.userId,
|
|
14579
|
+
publicRoom.room.id,
|
|
14580
|
+
publicLastMessage
|
|
14581
|
+
)
|
|
14582
|
+
});
|
|
14583
|
+
}
|
|
14584
|
+
} catch (e) {
|
|
14585
|
+
console.error("[CoSpace] Failed to assemble public room:", e);
|
|
14586
|
+
}
|
|
14587
|
+
return { data: { rooms } };
|
|
14588
|
+
});
|
|
14589
|
+
}
|
|
14499
14590
|
);
|
|
14500
14591
|
app2.post(
|
|
14501
14592
|
"/api/workspaces/:workspaceId/direct",
|
|
@@ -14516,7 +14607,6 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14516
14607
|
);
|
|
14517
14608
|
}
|
|
14518
14609
|
let projectId;
|
|
14519
|
-
let otherPartyId;
|
|
14520
14610
|
if (body.type === "human") {
|
|
14521
14611
|
projectId = generateDirectHumanProjectId(
|
|
14522
14612
|
actor2.tenantId,
|
|
@@ -14524,7 +14614,6 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14524
14614
|
actor2.userId,
|
|
14525
14615
|
body.targetUserId
|
|
14526
14616
|
);
|
|
14527
|
-
otherPartyId = body.targetUserId;
|
|
14528
14617
|
} else {
|
|
14529
14618
|
projectId = generateDirectBotProjectId(
|
|
14530
14619
|
actor2.tenantId,
|
|
@@ -14532,14 +14621,24 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14532
14621
|
actor2.userId,
|
|
14533
14622
|
body.assistantId
|
|
14534
14623
|
);
|
|
14535
|
-
otherPartyId = body.assistantId;
|
|
14536
14624
|
}
|
|
14537
14625
|
let project = await deps.projectStore.getProjectById(
|
|
14538
14626
|
actor2.tenantId,
|
|
14539
14627
|
projectId
|
|
14540
14628
|
);
|
|
14541
14629
|
if (!project) {
|
|
14542
|
-
|
|
14630
|
+
let displayName;
|
|
14631
|
+
if (body.type === "human") {
|
|
14632
|
+
const targetUser = await deps.userStore.getUserById(body.targetUserId);
|
|
14633
|
+
displayName = targetUser?.name ?? body.targetUserId;
|
|
14634
|
+
} else {
|
|
14635
|
+
const targetAssistant = await deps.assistantStore.getAssistantById(
|
|
14636
|
+
actor2.tenantId,
|
|
14637
|
+
body.assistantId
|
|
14638
|
+
);
|
|
14639
|
+
displayName = targetAssistant?.name ?? body.assistantId;
|
|
14640
|
+
}
|
|
14641
|
+
const name = body.type === "human" ? `Direct with ${displayName}` : `Chat with ${displayName}`;
|
|
14543
14642
|
project = await deps.projectStore.createProject(
|
|
14544
14643
|
actor2.tenantId,
|
|
14545
14644
|
params.workspaceId,
|
|
@@ -14732,12 +14831,28 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14732
14831
|
actor2.tenantId,
|
|
14733
14832
|
directProjectId
|
|
14734
14833
|
);
|
|
14735
|
-
|
|
14834
|
+
const bot = {
|
|
14736
14835
|
assistantId: assistant.id,
|
|
14737
14836
|
name: assistant.name,
|
|
14738
14837
|
description: assistant.description,
|
|
14739
14838
|
hasDirectRoom: existingProject !== null
|
|
14740
|
-
}
|
|
14839
|
+
};
|
|
14840
|
+
if (assistant.createdAt) bot.createdAt = assistant.createdAt.toISOString();
|
|
14841
|
+
if (existingProject) {
|
|
14842
|
+
const membership = await deps.botMembershipStore.findByAssistant(
|
|
14843
|
+
actor2.tenantId,
|
|
14844
|
+
directProjectId,
|
|
14845
|
+
assistant.id
|
|
14846
|
+
);
|
|
14847
|
+
if (membership) {
|
|
14848
|
+
if (membership.role) bot.role = membership.role;
|
|
14849
|
+
if (membership.mentionName) bot.mentionName = membership.mentionName;
|
|
14850
|
+
if (membership.responsibility) bot.responsibility = membership.responsibility;
|
|
14851
|
+
bot.status = membership.status;
|
|
14852
|
+
if (membership.joinedAt) bot.joinedAt = membership.joinedAt.toISOString();
|
|
14853
|
+
}
|
|
14854
|
+
}
|
|
14855
|
+
bots.push(bot);
|
|
14741
14856
|
}
|
|
14742
14857
|
return { data: { bots } };
|
|
14743
14858
|
});
|
|
@@ -14778,13 +14893,15 @@ function registerCoSpaceRoutes(app2, deps) {
|
|
|
14778
14893
|
actor2.tenantId,
|
|
14779
14894
|
directProjectId
|
|
14780
14895
|
);
|
|
14781
|
-
|
|
14896
|
+
const member = {
|
|
14782
14897
|
userId: link.userId,
|
|
14783
14898
|
name: user.name,
|
|
14784
14899
|
email: user.email,
|
|
14785
14900
|
role: link.role,
|
|
14786
14901
|
hasDirectRoom: existingProject !== null
|
|
14787
|
-
}
|
|
14902
|
+
};
|
|
14903
|
+
if (link.joinedAt) member.joinedAt = link.joinedAt.toISOString();
|
|
14904
|
+
members.push(member);
|
|
14788
14905
|
}
|
|
14789
14906
|
return { data: { members } };
|
|
14790
14907
|
});
|
|
@@ -17549,6 +17666,7 @@ function snapshotJson(value, ancestors = /* @__PURE__ */ new Set()) {
|
|
|
17549
17666
|
// src/services/collaboration/ProjectRoomRealtimePublisher.ts
|
|
17550
17667
|
import { createHash as createHash7 } from "crypto";
|
|
17551
17668
|
import {
|
|
17669
|
+
projectRoomUserEventScope,
|
|
17552
17670
|
snapshotExactRecord as snapshotExactRecord10,
|
|
17553
17671
|
snapshotProjectRoomBotMembershipRealtime,
|
|
17554
17672
|
snapshotProjectRoomMembershipRealtime,
|
|
@@ -17623,6 +17741,46 @@ var BrokerProjectRoomRealtimePublisher = class {
|
|
|
17623
17741
|
};
|
|
17624
17742
|
});
|
|
17625
17743
|
}
|
|
17744
|
+
/** Publishes a membership notice onto the affected user's channel scope. */
|
|
17745
|
+
membershipAffected(input) {
|
|
17746
|
+
this.publish("membership.affected", () => {
|
|
17747
|
+
const value = snapshotExactRecord10(input, ["tenantId", "userId", "change", "projectId", "roomId", "sourceKey"]);
|
|
17748
|
+
if (!value || !safeId2(value.tenantId) || !safeId2(value.userId) || !safeId2(value.projectId) || !safeId2(value.roomId) || !safeSourceKey(value.sourceKey) || !["added", "removed", "role_changed"].includes(value.change)) {
|
|
17749
|
+
throw new TypeError("Invalid membership input");
|
|
17750
|
+
}
|
|
17751
|
+
const scope = projectRoomUserEventScope(value.tenantId, value.userId);
|
|
17752
|
+
return {
|
|
17753
|
+
sourceKey: value.sourceKey,
|
|
17754
|
+
id: value.sourceKey,
|
|
17755
|
+
scope,
|
|
17756
|
+
draft: {
|
|
17757
|
+
type: "membership.affected",
|
|
17758
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17759
|
+
data: { change: value.change, projectId: value.projectId, roomId: value.roomId }
|
|
17760
|
+
}
|
|
17761
|
+
};
|
|
17762
|
+
});
|
|
17763
|
+
}
|
|
17764
|
+
/** Publishes a read-marker update onto the acting user's channel scope. */
|
|
17765
|
+
readChanged(input) {
|
|
17766
|
+
this.publish("read.changed", () => {
|
|
17767
|
+
const value = snapshotExactRecord10(input, ["tenantId", "userId", "projectId", "roomId", "lastReadAt", "sourceKey"]);
|
|
17768
|
+
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))) {
|
|
17769
|
+
throw new TypeError("Invalid read input");
|
|
17770
|
+
}
|
|
17771
|
+
const scope = projectRoomUserEventScope(value.tenantId, value.userId);
|
|
17772
|
+
return {
|
|
17773
|
+
sourceKey: value.sourceKey,
|
|
17774
|
+
id: value.sourceKey,
|
|
17775
|
+
scope,
|
|
17776
|
+
draft: {
|
|
17777
|
+
type: "read.changed",
|
|
17778
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17779
|
+
data: { projectId: value.projectId, roomId: value.roomId, lastReadAt: new Date(Date.parse(value.lastReadAt)).toISOString() }
|
|
17780
|
+
}
|
|
17781
|
+
};
|
|
17782
|
+
});
|
|
17783
|
+
}
|
|
17626
17784
|
publish(type, build) {
|
|
17627
17785
|
let event;
|
|
17628
17786
|
try {
|
|
@@ -17681,8 +17839,212 @@ function safeErrorCode(error) {
|
|
|
17681
17839
|
return error instanceof Error && error.name === "Error" ? "Error" : "UnknownError";
|
|
17682
17840
|
}
|
|
17683
17841
|
|
|
17684
|
-
// src/services/collaboration/
|
|
17685
|
-
import {
|
|
17842
|
+
// src/services/collaboration/ProjectRoomTaskEventSubscriber.ts
|
|
17843
|
+
import { isProjectLifecycleTask as isProjectLifecycleTask6 } from "@axiom-lattice/core";
|
|
17844
|
+
import { snapshotExactRecord as snapshotExactRecord11 } from "@axiom-lattice/protocols";
|
|
17845
|
+
var ProjectRoomTaskEventSubscriber = class {
|
|
17846
|
+
/** Creates a bounded Project task lifecycle observer. */
|
|
17847
|
+
constructor(deps) {
|
|
17848
|
+
this.deps = deps;
|
|
17849
|
+
this.queues = /* @__PURE__ */ new Map();
|
|
17850
|
+
this.pendingCount = 0;
|
|
17851
|
+
this.accepting = true;
|
|
17852
|
+
this.closed = false;
|
|
17853
|
+
this.accepted = /* @__PURE__ */ new Set();
|
|
17854
|
+
this.maxPending = deps.maxPending ?? 1024;
|
|
17855
|
+
if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1) throw new RangeError("maxPending must be a positive safe integer");
|
|
17856
|
+
}
|
|
17857
|
+
/** Admits one notification without awaiting any store operation. */
|
|
17858
|
+
handle(value) {
|
|
17859
|
+
const event = this.parse(value);
|
|
17860
|
+
if (!event) {
|
|
17861
|
+
this.warn("Project task realtime notification rejected", { code: "INVALID_TASK_REALTIME_EVENT" });
|
|
17862
|
+
return Promise.resolve();
|
|
17863
|
+
}
|
|
17864
|
+
if (!this.accepting || this.closed) return Promise.resolve();
|
|
17865
|
+
const scopeKey3 = JSON.stringify([event.tenantId, event.workspaceId, event.projectId, event.taskId]);
|
|
17866
|
+
const eventKey = event.eventKey;
|
|
17867
|
+
let queue = this.queues.get(scopeKey3);
|
|
17868
|
+
if (!queue) {
|
|
17869
|
+
if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
|
|
17870
|
+
queue = { events: [], keys: /* @__PURE__ */ new Set(), tail: Promise.resolve() };
|
|
17871
|
+
this.queues.set(scopeKey3, queue);
|
|
17872
|
+
}
|
|
17873
|
+
if (queue.keys.has(eventKey)) return queue.tail;
|
|
17874
|
+
if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
|
|
17875
|
+
queue.keys.add(eventKey);
|
|
17876
|
+
queue.events.push(event);
|
|
17877
|
+
this.pendingCount += 1;
|
|
17878
|
+
const previousTail = queue.tail;
|
|
17879
|
+
queue.tail = previousTail.then(() => this.processQueue(scopeKey3, queue)).catch((error) => {
|
|
17880
|
+
this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", error: error instanceof Error ? error.name : "UnknownError" });
|
|
17881
|
+
});
|
|
17882
|
+
const accepted = queue.tail;
|
|
17883
|
+
this.accepted.add(accepted);
|
|
17884
|
+
void accepted.finally(() => this.accepted.delete(accepted));
|
|
17885
|
+
return accepted;
|
|
17886
|
+
}
|
|
17887
|
+
/** Closes admission without interrupting accepted work. */
|
|
17888
|
+
closeAdmission() {
|
|
17889
|
+
this.accepting = false;
|
|
17890
|
+
}
|
|
17891
|
+
/** Drains accepted work, closing permanently if the bound expires. */
|
|
17892
|
+
async drain(timeoutMs = 5e3) {
|
|
17893
|
+
const work = Promise.allSettled([...this.accepted]).then(() => void 0);
|
|
17894
|
+
let timer;
|
|
17895
|
+
const timeout = new Promise((resolve3) => {
|
|
17896
|
+
timer = setTimeout(() => resolve3("timeout"), timeoutMs);
|
|
17897
|
+
timer.unref?.();
|
|
17898
|
+
});
|
|
17899
|
+
const outcome = await Promise.race([work.then(() => "drained"), timeout]);
|
|
17900
|
+
if (timer) clearTimeout(timer);
|
|
17901
|
+
this.closed = true;
|
|
17902
|
+
if (outcome === "timeout") this.queues.clear();
|
|
17903
|
+
}
|
|
17904
|
+
/** Closes admission and drains accepted work. */
|
|
17905
|
+
async dispose() {
|
|
17906
|
+
this.closeAdmission();
|
|
17907
|
+
await this.drain();
|
|
17908
|
+
this.closed = true;
|
|
17909
|
+
}
|
|
17910
|
+
async processQueue(scopeKey3, queue) {
|
|
17911
|
+
while (queue.events.length > 0) {
|
|
17912
|
+
const event = queue.events.shift();
|
|
17913
|
+
try {
|
|
17914
|
+
if (!this.closed) await this.publish(event);
|
|
17915
|
+
} finally {
|
|
17916
|
+
queue.keys.delete(event.eventKey);
|
|
17917
|
+
this.pendingCount -= 1;
|
|
17918
|
+
}
|
|
17919
|
+
}
|
|
17920
|
+
if (queue.events.length === 0 && this.queues.get(scopeKey3) === queue) this.queues.delete(scopeKey3);
|
|
17921
|
+
}
|
|
17922
|
+
async publish(event) {
|
|
17923
|
+
try {
|
|
17924
|
+
const taskValue = await this.deps.tasks.getById(event.tenantId, event.taskId);
|
|
17925
|
+
const task = taskValue === null ? void 0 : snapshotTaskItem(taskValue);
|
|
17926
|
+
if (this.closed) return;
|
|
17927
|
+
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) {
|
|
17928
|
+
this.warn("project-room:task-event-stale", { taskId: safeId3(event.taskId), eventKey: safeId3(event.eventKey) });
|
|
17929
|
+
return;
|
|
17930
|
+
}
|
|
17931
|
+
const roomValue = await this.deps.rooms.getMainRoom(event.tenantId, event.projectId);
|
|
17932
|
+
const room = snapshotProjectRoom(roomValue);
|
|
17933
|
+
if (this.closed) return;
|
|
17934
|
+
if (!room || room.tenantId !== event.tenantId || room.workspaceId !== event.workspaceId || room.projectId !== event.projectId) return;
|
|
17935
|
+
const membershipValue = await this.deps.memberships.findByAssistant(event.tenantId, event.projectId, task.ownerId);
|
|
17936
|
+
const membership = snapshotProjectBotMembership(membershipValue);
|
|
17937
|
+
if (this.closed) return;
|
|
17938
|
+
if (!membership || membership.tenantId !== event.tenantId || membership.workspaceId !== event.workspaceId || membership.projectId !== event.projectId || membership.roomId !== room.id || membership.assistantId !== task.ownerId) return;
|
|
17939
|
+
this.deps.realtime.taskChanged({
|
|
17940
|
+
tenantId: event.tenantId,
|
|
17941
|
+
roomId: room.id,
|
|
17942
|
+
projectId: event.projectId,
|
|
17943
|
+
taskId: task.id,
|
|
17944
|
+
status: task.status,
|
|
17945
|
+
ownerMembershipId: membership.id,
|
|
17946
|
+
updatedAt: task.updatedAt.toISOString(),
|
|
17947
|
+
sourceKey: `task:${task.id}:${event.eventKey}`
|
|
17948
|
+
});
|
|
17949
|
+
} catch (error) {
|
|
17950
|
+
this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", taskId: safeId3(event.taskId), error: error instanceof Error ? error.name : "UnknownError" });
|
|
17951
|
+
}
|
|
17952
|
+
}
|
|
17953
|
+
parse(value) {
|
|
17954
|
+
const row = snapshotExactRecord11(value, ["tenantId", "workspaceId", "projectId", "taskId", "status", "action", "eventKey", "updatedAt"], ["threadId"]);
|
|
17955
|
+
const actions = ["in_progress", "interrupted", "failed", "completed", "cancelled", "reassigned"];
|
|
17956
|
+
const statuses = ["pending", "in_progress", "review", "failed", "interrupted", "completed", "cancelled"];
|
|
17957
|
+
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;
|
|
17958
|
+
return row;
|
|
17959
|
+
}
|
|
17960
|
+
warn(message, context) {
|
|
17961
|
+
try {
|
|
17962
|
+
this.deps.log.warn(message, context);
|
|
17963
|
+
} catch {
|
|
17964
|
+
}
|
|
17965
|
+
}
|
|
17966
|
+
overflow(taskId) {
|
|
17967
|
+
this.warn("project-room:task-realtime-overflow", { code: "TASK_REALTIME_QUEUE_FULL", taskId });
|
|
17968
|
+
return Promise.resolve();
|
|
17969
|
+
}
|
|
17970
|
+
};
|
|
17971
|
+
function safeId3(value) {
|
|
17972
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
17973
|
+
}
|
|
17974
|
+
|
|
17975
|
+
// src/services/collaboration/ProjectRoomRealtimeRuntime.ts
|
|
17976
|
+
var ProjectRoomRealtimeRuntime = class {
|
|
17977
|
+
constructor(deps) {
|
|
17978
|
+
this.deps = deps;
|
|
17979
|
+
this.accepted = /* @__PURE__ */ new Set();
|
|
17980
|
+
this.broker = deps.broker;
|
|
17981
|
+
this.publisher = deps.publisher;
|
|
17982
|
+
this.shutdownTimeoutMs = deps.shutdownTimeoutMs ?? 5e3;
|
|
17983
|
+
this.unsubscribe = deps.subscribe(((event) => {
|
|
17984
|
+
let work;
|
|
17985
|
+
try {
|
|
17986
|
+
work = Promise.resolve(deps.subscriber.handle(event));
|
|
17987
|
+
} catch (error) {
|
|
17988
|
+
work = Promise.reject(error);
|
|
17989
|
+
}
|
|
17990
|
+
const accepted = work.catch((error) => {
|
|
17991
|
+
deps.log.warn("project-room:task-subscriber-failed", { error: error instanceof Error ? error.name : "UnknownError" });
|
|
17992
|
+
});
|
|
17993
|
+
this.accepted.add(accepted);
|
|
17994
|
+
void accepted.finally(() => this.accepted.delete(accepted));
|
|
17995
|
+
}));
|
|
17996
|
+
}
|
|
17997
|
+
/** Stops admission, drains accepted work, and closes transport resources exactly once. */
|
|
17998
|
+
close() {
|
|
17999
|
+
this.closing ?? (this.closing = this.dispose());
|
|
18000
|
+
return this.closing;
|
|
18001
|
+
}
|
|
18002
|
+
async dispose() {
|
|
18003
|
+
this.unsubscribe();
|
|
18004
|
+
this.deps.subscriber.closeAdmission();
|
|
18005
|
+
const accepted = [...this.accepted];
|
|
18006
|
+
const drained = await boundedAllSettled(accepted, this.shutdownTimeoutMs);
|
|
18007
|
+
if (!drained) this.deps.log.warn("project-room:runtime-drain-timeout", {
|
|
18008
|
+
timeoutMs: this.shutdownTimeoutMs,
|
|
18009
|
+
pending: accepted.length
|
|
18010
|
+
});
|
|
18011
|
+
await this.deps.subscriber.drain(drained ? this.shutdownTimeoutMs : 0);
|
|
18012
|
+
this.broker.close();
|
|
18013
|
+
}
|
|
18014
|
+
};
|
|
18015
|
+
function createProjectRoomRealtimeRuntime(deps) {
|
|
18016
|
+
const broker = new ProjectRoomEventBroker({ log: deps.log });
|
|
18017
|
+
const publisher = new BrokerProjectRoomRealtimePublisher({ broker, log: deps.log });
|
|
18018
|
+
const subscriber = new ProjectRoomTaskEventSubscriber({
|
|
18019
|
+
tasks: deps.tasks,
|
|
18020
|
+
rooms: deps.rooms,
|
|
18021
|
+
memberships: deps.memberships,
|
|
18022
|
+
realtime: publisher,
|
|
18023
|
+
log: deps.log
|
|
18024
|
+
});
|
|
18025
|
+
return new ProjectRoomRealtimeRuntime({
|
|
18026
|
+
broker,
|
|
18027
|
+
publisher,
|
|
18028
|
+
subscriber,
|
|
18029
|
+
subscribe: (listener) => taskLifecycleNotifier.subscribe(listener),
|
|
18030
|
+
log: deps.log,
|
|
18031
|
+
shutdownTimeoutMs: deps.shutdownTimeoutMs
|
|
18032
|
+
});
|
|
18033
|
+
}
|
|
18034
|
+
async function boundedAllSettled(promises, timeoutMs) {
|
|
18035
|
+
if (promises.length === 0) return true;
|
|
18036
|
+
let timer;
|
|
18037
|
+
const timeout = new Promise((resolve3) => {
|
|
18038
|
+
timer = setTimeout(() => resolve3(false), timeoutMs);
|
|
18039
|
+
timer.unref?.();
|
|
18040
|
+
});
|
|
18041
|
+
const result = await Promise.race([Promise.allSettled(promises).then(() => true), timeout]);
|
|
18042
|
+
if (timer) clearTimeout(timer);
|
|
18043
|
+
return result;
|
|
18044
|
+
}
|
|
18045
|
+
|
|
18046
|
+
// src/services/collaboration/WorkspaceRoomEventsService.ts
|
|
18047
|
+
import { PROJECT_ROOM_USER_CHANNEL_PROJECT, projectRoomUserEventScope as projectRoomUserEventScope2 } from "@axiom-lattice/protocols";
|
|
17686
18048
|
|
|
17687
18049
|
// src/services/collaboration/ProjectRoomSseWriter.ts
|
|
17688
18050
|
var DEFAULT_MAX_FRAMES = 256;
|
|
@@ -17735,6 +18097,10 @@ var ProjectRoomSseWriter = class {
|
|
|
17735
18097
|
enqueueControl(event) {
|
|
17736
18098
|
this.enqueue(serializeControl(event));
|
|
17737
18099
|
}
|
|
18100
|
+
/** Enqueues a pre-serialized SSE frame (used by scoped multi-room streams). */
|
|
18101
|
+
enqueueRaw(frame) {
|
|
18102
|
+
this.enqueue(frame);
|
|
18103
|
+
}
|
|
17738
18104
|
/** Writes a heartbeat comment when the socket is not currently blocked. */
|
|
17739
18105
|
heartbeat() {
|
|
17740
18106
|
if (!this.closed && !this.writing) this.writeFrame(": heartbeat\n\n");
|
|
@@ -17825,453 +18191,269 @@ var ProjectRoomSseWriter = class {
|
|
|
17825
18191
|
this.blockedBytes = 0;
|
|
17826
18192
|
(finish ?? (() => this.close()))();
|
|
17827
18193
|
}
|
|
17828
|
-
} catch {
|
|
17829
|
-
this.close();
|
|
17830
|
-
}
|
|
17831
|
-
}
|
|
17832
|
-
armTerminalDeadline(deadlineMs, finish) {
|
|
17833
|
-
this.terminalTimer = setTimeout(finish, deadlineMs);
|
|
17834
|
-
this.terminalTimer.unref?.();
|
|
17835
|
-
}
|
|
17836
|
-
writeFrame(frame) {
|
|
17837
|
-
if (this.closed) return;
|
|
17838
|
-
try {
|
|
17839
|
-
if (!this.raw.write(frame)) {
|
|
17840
|
-
this.writing = true;
|
|
17841
|
-
this.blockedBytes = Buffer.byteLength(frame, "utf8");
|
|
17842
|
-
this.drainTimer = setTimeout(() => {
|
|
17843
|
-
this.drainTimer = void 0;
|
|
17844
|
-
this.failSlowConsumer();
|
|
17845
|
-
}, this.drainTimeoutMs);
|
|
17846
|
-
this.drainTimer.unref?.();
|
|
17847
|
-
} else {
|
|
17848
|
-
this.writing = false;
|
|
17849
|
-
this.blockedBytes = 0;
|
|
17850
|
-
this.flush();
|
|
17851
|
-
}
|
|
17852
|
-
} catch {
|
|
17853
|
-
this.close();
|
|
17854
|
-
}
|
|
17855
|
-
}
|
|
17856
|
-
clearDrainTimer() {
|
|
17857
|
-
if (this.drainTimer !== void 0) clearTimeout(this.drainTimer);
|
|
17858
|
-
this.drainTimer = void 0;
|
|
17859
|
-
}
|
|
17860
|
-
failSlowConsumer() {
|
|
17861
|
-
if (this.closed) return;
|
|
17862
|
-
this.frames.length = 0;
|
|
17863
|
-
this.queuedBytes = 0;
|
|
17864
|
-
if (!this.slowConsumerAttempted) {
|
|
17865
|
-
this.slowConsumerAttempted = true;
|
|
17866
|
-
try {
|
|
17867
|
-
this.raw.write(serializeControl({ type: "resync", data: { reason: "SLOW_CONSUMER" } }));
|
|
17868
|
-
} catch {
|
|
17869
|
-
}
|
|
17870
|
-
}
|
|
17871
|
-
this.close();
|
|
17872
|
-
}
|
|
17873
|
-
};
|
|
17874
|
-
function positive(value, name) {
|
|
17875
|
-
if (!Number.isSafeInteger(value) || value <= 0) throw new RangeError(`${name} must be positive`);
|
|
17876
|
-
return value;
|
|
17877
|
-
}
|
|
17878
|
-
|
|
17879
|
-
// src/services/collaboration/ProjectRoomRealtimeService.ts
|
|
17880
|
-
var MAX_REPLAY_EVENTS = 1e4;
|
|
17881
|
-
var MAX_NODE_TIMER_DELAY = 2147e6;
|
|
17882
|
-
var ProjectRoomRealtimeService = class {
|
|
17883
|
-
/** Creates a service using one process-local broker and read-only authorizer. */
|
|
17884
|
-
constructor(deps) {
|
|
17885
|
-
this.deps = deps;
|
|
17886
|
-
this.connections = /* @__PURE__ */ new Set();
|
|
17887
|
-
this.closed = false;
|
|
17888
|
-
this.activeConnections = /* @__PURE__ */ new Map();
|
|
17889
|
-
this.now = deps.now ?? Date.now;
|
|
17890
|
-
this.authRecheckMs = deps.authRecheckMs ?? 15e3;
|
|
17891
|
-
this.heartbeatMs = deps.heartbeatMs ?? 15e3;
|
|
17892
|
-
}
|
|
17893
|
-
/** Returns whether the actor's tenant/user/project stream quota has capacity. */
|
|
17894
|
-
canConnect(actor2) {
|
|
17895
|
-
if (this.closed) return false;
|
|
17896
|
-
return (this.activeConnections.get(connectionKey(actor2)) ?? 0) < (this.deps.maxConnectionsPerUserProject ?? 5);
|
|
17897
|
-
}
|
|
17898
|
-
/** Starts a connection; authorization is assumed to have been performed by the route. */
|
|
17899
|
-
connect(input) {
|
|
17900
|
-
if (!this.canConnect(input.actor)) {
|
|
17901
|
-
input.raw.end();
|
|
17902
|
-
return;
|
|
17903
|
-
}
|
|
17904
|
-
const quotaKey = connectionKey(input.actor);
|
|
17905
|
-
this.activeConnections.set(quotaKey, (this.activeConnections.get(quotaKey) ?? 0) + 1);
|
|
17906
|
-
const writer = new ProjectRoomSseWriter(input.raw, { onClose: () => connection.close() });
|
|
17907
|
-
let phase = "initializing";
|
|
17908
|
-
let subscription;
|
|
17909
|
-
let accessTimer;
|
|
17910
|
-
let heartbeatTimer;
|
|
17911
|
-
let expiryTimer;
|
|
17912
|
-
const lifetimeAbort = new AbortController();
|
|
17913
|
-
let accessAbort;
|
|
17914
|
-
let closed = false;
|
|
17915
|
-
const buffered = [];
|
|
17916
|
-
const clearTimer = (timer) => {
|
|
17917
|
-
if (timer !== void 0) clearTimeout(timer);
|
|
17918
|
-
};
|
|
17919
|
-
const cleanup = () => {
|
|
17920
|
-
if (closed) return;
|
|
17921
|
-
closed = true;
|
|
17922
|
-
phase = "closed";
|
|
17923
|
-
clearTimer(accessTimer);
|
|
17924
|
-
clearTimer(heartbeatTimer);
|
|
17925
|
-
clearTimer(expiryTimer);
|
|
17926
|
-
lifetimeAbort.abort();
|
|
17927
|
-
accessAbort?.abort();
|
|
17928
|
-
subscription?.unsubscribe();
|
|
17929
|
-
writer.close();
|
|
17930
|
-
this.connections.delete(connection);
|
|
17931
|
-
const remainingConnections = (this.activeConnections.get(quotaKey) ?? 1) - 1;
|
|
17932
|
-
if (remainingConnections === 0) this.activeConnections.delete(quotaKey);
|
|
17933
|
-
else this.activeConnections.set(quotaKey, remainingConnections);
|
|
17934
|
-
};
|
|
17935
|
-
const revoke = (reason) => {
|
|
17936
|
-
if (closed) return;
|
|
17937
|
-
void writer.closeWithControl({ type: "access.revoked", data: { reason } }).then(cleanup, cleanup);
|
|
17938
|
-
};
|
|
17939
|
-
const scheduleAccessCheck = () => {
|
|
17940
|
-
if (closed) return;
|
|
17941
|
-
accessTimer = setTimeout(() => {
|
|
17942
|
-
accessTimer = void 0;
|
|
17943
|
-
if (closed) return;
|
|
17944
|
-
accessAbort = new AbortController();
|
|
17945
|
-
const combined = combineSignals2(lifetimeAbort.signal, accessAbort.signal);
|
|
17946
|
-
Promise.resolve().then(() => this.deps.requireReadAccess(input.actor, combined.signal)).then(() => {
|
|
17947
|
-
combined.cleanup();
|
|
17948
|
-
accessAbort = void 0;
|
|
17949
|
-
scheduleAccessCheck();
|
|
17950
|
-
}, (_error) => {
|
|
17951
|
-
combined.cleanup();
|
|
17952
|
-
accessAbort = void 0;
|
|
17953
|
-
if (!closed) revoke("PROJECT_ACCESS_REVOKED");
|
|
17954
|
-
});
|
|
17955
|
-
}, this.authRecheckMs);
|
|
17956
|
-
accessTimer.unref?.();
|
|
17957
|
-
};
|
|
17958
|
-
const connection = { close: cleanup };
|
|
17959
|
-
this.connections.add(connection);
|
|
17960
|
-
const scheduleHeartbeat = () => {
|
|
17961
|
-
if (closed) return;
|
|
17962
|
-
heartbeatTimer = setTimeout(() => {
|
|
17963
|
-
heartbeatTimer = void 0;
|
|
17964
|
-
if (closed) return;
|
|
17965
|
-
writer.heartbeat();
|
|
17966
|
-
scheduleHeartbeat();
|
|
17967
|
-
}, this.heartbeatMs);
|
|
17968
|
-
heartbeatTimer.unref?.();
|
|
17969
|
-
};
|
|
17970
|
-
scheduleHeartbeat();
|
|
17971
|
-
const remaining = input.actor.tokenExpiresAt - this.now();
|
|
17972
|
-
if (remaining <= 0) {
|
|
17973
|
-
revoke("TOKEN_EXPIRED");
|
|
17974
|
-
return;
|
|
17975
|
-
}
|
|
17976
|
-
const maxTimerDelay = this.deps.maxTimerDelay ?? MAX_NODE_TIMER_DELAY;
|
|
17977
|
-
const scheduleExpiry = () => {
|
|
17978
|
-
if (closed) return;
|
|
17979
|
-
const delay2 = input.actor.tokenExpiresAt - this.now();
|
|
17980
|
-
if (delay2 <= 0) {
|
|
17981
|
-
revoke("TOKEN_EXPIRED");
|
|
17982
|
-
return;
|
|
17983
|
-
}
|
|
17984
|
-
expiryTimer = setTimeout(() => {
|
|
17985
|
-
expiryTimer = void 0;
|
|
17986
|
-
scheduleExpiry();
|
|
17987
|
-
}, Math.min(delay2, maxTimerDelay));
|
|
17988
|
-
expiryTimer.unref?.();
|
|
17989
|
-
};
|
|
17990
|
-
scheduleExpiry();
|
|
17991
|
-
try {
|
|
17992
|
-
subscription = this.deps.broker.subscribe(
|
|
17993
|
-
{ tenantId: input.actor.tenantId, roomId: input.roomId, projectId: input.actor.projectId },
|
|
17994
|
-
input.lastEventId,
|
|
17995
|
-
(event) => {
|
|
17996
|
-
if (phase === "initializing") buffered.push(event);
|
|
17997
|
-
else if (phase === "direct") writer.enqueueBusiness(event);
|
|
17998
|
-
}
|
|
17999
|
-
);
|
|
18000
|
-
if (subscription.replay.length > MAX_REPLAY_EVENTS) {
|
|
18001
|
-
void writer.closeWithControl({ type: "resync", data: { reason: "CURSOR_EXPIRED" } }).then(cleanup, cleanup);
|
|
18002
|
-
return;
|
|
18003
|
-
}
|
|
18004
|
-
let lastSequence = sequence(subscription.headEventId);
|
|
18005
|
-
for (const event of subscription.replay) {
|
|
18006
|
-
writer.enqueueBusiness(event);
|
|
18007
|
-
lastSequence = sequence(event.id);
|
|
18008
|
-
}
|
|
18009
|
-
writer.enqueueControl({ type: "ready", data: { epoch: this.deps.broker.epoch, headEventId: subscription.headEventId } });
|
|
18010
|
-
while (buffered.length > 0) {
|
|
18011
|
-
for (const event of buffered.splice(0).sort((left, right) => sequence(left.id) - sequence(right.id))) {
|
|
18012
|
-
if (sequence(event.id) > lastSequence) {
|
|
18013
|
-
writer.enqueueBusiness(event);
|
|
18014
|
-
lastSequence = sequence(event.id);
|
|
18015
|
-
}
|
|
18016
|
-
}
|
|
18017
|
-
}
|
|
18018
|
-
phase = "direct";
|
|
18019
|
-
scheduleAccessCheck();
|
|
18020
|
-
} catch (error) {
|
|
18021
|
-
if (error instanceof ProjectRoomCursorError2) void writer.closeWithControl({ type: "resync", data: { reason: error.code } }).then(cleanup, cleanup);
|
|
18022
|
-
else cleanup();
|
|
18023
|
-
}
|
|
18024
|
-
}
|
|
18025
|
-
/** Closes every connection and prevents new connections. */
|
|
18026
|
-
close() {
|
|
18027
|
-
if (this.closed) return;
|
|
18028
|
-
this.closed = true;
|
|
18029
|
-
for (const connection of [...this.connections]) connection.close();
|
|
18030
|
-
}
|
|
18031
|
-
};
|
|
18032
|
-
function sequence(id3) {
|
|
18033
|
-
return id3 === null ? 0 : Number(id3.slice(id3.lastIndexOf(":") + 1));
|
|
18034
|
-
}
|
|
18035
|
-
function connectionKey(actor2) {
|
|
18036
|
-
return JSON.stringify([actor2.tenantId, actor2.userId, actor2.projectId]);
|
|
18037
|
-
}
|
|
18038
|
-
function combineSignals2(first, second) {
|
|
18039
|
-
const controller = new AbortController();
|
|
18040
|
-
const abort = () => controller.abort();
|
|
18041
|
-
if (first.aborted || second.aborted) abort();
|
|
18042
|
-
else {
|
|
18043
|
-
first.addEventListener("abort", abort, { once: true });
|
|
18044
|
-
second.addEventListener("abort", abort, { once: true });
|
|
18045
|
-
}
|
|
18046
|
-
return { signal: controller.signal, cleanup: () => {
|
|
18047
|
-
first.removeEventListener("abort", abort);
|
|
18048
|
-
second.removeEventListener("abort", abort);
|
|
18049
|
-
} };
|
|
18050
|
-
}
|
|
18051
|
-
|
|
18052
|
-
// src/services/collaboration/ProjectRoomTaskEventSubscriber.ts
|
|
18053
|
-
import { isProjectLifecycleTask as isProjectLifecycleTask6 } from "@axiom-lattice/core";
|
|
18054
|
-
import { snapshotExactRecord as snapshotExactRecord11 } from "@axiom-lattice/protocols";
|
|
18055
|
-
var ProjectRoomTaskEventSubscriber = class {
|
|
18056
|
-
/** Creates a bounded Project task lifecycle observer. */
|
|
18057
|
-
constructor(deps) {
|
|
18058
|
-
this.deps = deps;
|
|
18059
|
-
this.queues = /* @__PURE__ */ new Map();
|
|
18060
|
-
this.pendingCount = 0;
|
|
18061
|
-
this.accepting = true;
|
|
18062
|
-
this.closed = false;
|
|
18063
|
-
this.accepted = /* @__PURE__ */ new Set();
|
|
18064
|
-
this.maxPending = deps.maxPending ?? 1024;
|
|
18065
|
-
if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1) throw new RangeError("maxPending must be a positive safe integer");
|
|
18066
|
-
}
|
|
18067
|
-
/** Admits one notification without awaiting any store operation. */
|
|
18068
|
-
handle(value) {
|
|
18069
|
-
const event = this.parse(value);
|
|
18070
|
-
if (!event) {
|
|
18071
|
-
this.warn("Project task realtime notification rejected", { code: "INVALID_TASK_REALTIME_EVENT" });
|
|
18072
|
-
return Promise.resolve();
|
|
18073
|
-
}
|
|
18074
|
-
if (!this.accepting || this.closed) return Promise.resolve();
|
|
18075
|
-
const scopeKey3 = JSON.stringify([event.tenantId, event.workspaceId, event.projectId, event.taskId]);
|
|
18076
|
-
const eventKey = event.eventKey;
|
|
18077
|
-
let queue = this.queues.get(scopeKey3);
|
|
18078
|
-
if (!queue) {
|
|
18079
|
-
if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
|
|
18080
|
-
queue = { events: [], keys: /* @__PURE__ */ new Set(), tail: Promise.resolve() };
|
|
18081
|
-
this.queues.set(scopeKey3, queue);
|
|
18082
|
-
}
|
|
18083
|
-
if (queue.keys.has(eventKey)) return queue.tail;
|
|
18084
|
-
if (this.pendingCount >= this.maxPending) return this.overflow(event.taskId);
|
|
18085
|
-
queue.keys.add(eventKey);
|
|
18086
|
-
queue.events.push(event);
|
|
18087
|
-
this.pendingCount += 1;
|
|
18088
|
-
const previousTail = queue.tail;
|
|
18089
|
-
queue.tail = previousTail.then(() => this.processQueue(scopeKey3, queue)).catch((error) => {
|
|
18090
|
-
this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", error: error instanceof Error ? error.name : "UnknownError" });
|
|
18091
|
-
});
|
|
18092
|
-
const accepted = queue.tail;
|
|
18093
|
-
this.accepted.add(accepted);
|
|
18094
|
-
void accepted.finally(() => this.accepted.delete(accepted));
|
|
18095
|
-
return accepted;
|
|
18096
|
-
}
|
|
18097
|
-
/** Closes admission without interrupting accepted work. */
|
|
18098
|
-
closeAdmission() {
|
|
18099
|
-
this.accepting = false;
|
|
18100
|
-
}
|
|
18101
|
-
/** Drains accepted work, closing permanently if the bound expires. */
|
|
18102
|
-
async drain(timeoutMs = 5e3) {
|
|
18103
|
-
const work = Promise.allSettled([...this.accepted]).then(() => void 0);
|
|
18104
|
-
let timer;
|
|
18105
|
-
const timeout = new Promise((resolve3) => {
|
|
18106
|
-
timer = setTimeout(() => resolve3("timeout"), timeoutMs);
|
|
18107
|
-
timer.unref?.();
|
|
18108
|
-
});
|
|
18109
|
-
const outcome = await Promise.race([work.then(() => "drained"), timeout]);
|
|
18110
|
-
if (timer) clearTimeout(timer);
|
|
18111
|
-
this.closed = true;
|
|
18112
|
-
if (outcome === "timeout") this.queues.clear();
|
|
18113
|
-
}
|
|
18114
|
-
/** Closes admission and drains accepted work. */
|
|
18115
|
-
async dispose() {
|
|
18116
|
-
this.closeAdmission();
|
|
18117
|
-
await this.drain();
|
|
18118
|
-
this.closed = true;
|
|
18119
|
-
}
|
|
18120
|
-
async processQueue(scopeKey3, queue) {
|
|
18121
|
-
while (queue.events.length > 0) {
|
|
18122
|
-
const event = queue.events.shift();
|
|
18123
|
-
try {
|
|
18124
|
-
if (!this.closed) await this.publish(event);
|
|
18125
|
-
} finally {
|
|
18126
|
-
queue.keys.delete(event.eventKey);
|
|
18127
|
-
this.pendingCount -= 1;
|
|
18128
|
-
}
|
|
18129
|
-
}
|
|
18130
|
-
if (queue.events.length === 0 && this.queues.get(scopeKey3) === queue) this.queues.delete(scopeKey3);
|
|
18131
|
-
}
|
|
18132
|
-
async publish(event) {
|
|
18133
|
-
try {
|
|
18134
|
-
const taskValue = await this.deps.tasks.getById(event.tenantId, event.taskId);
|
|
18135
|
-
const task = taskValue === null ? void 0 : snapshotTaskItem(taskValue);
|
|
18136
|
-
if (this.closed) return;
|
|
18137
|
-
if (!task || !isProjectLifecycleTask6(task) || task.tenantId !== event.tenantId || task.workspaceId !== event.workspaceId || task.projectId !== event.projectId || task.status !== event.status || task.updatedAt.toISOString() !== event.updatedAt || event.threadId !== void 0 && task.context?.thread_id !== event.threadId) {
|
|
18138
|
-
this.warn("project-room:task-event-stale", { taskId: safeId3(event.taskId), eventKey: safeId3(event.eventKey) });
|
|
18139
|
-
return;
|
|
18140
|
-
}
|
|
18141
|
-
const roomValue = await this.deps.rooms.getMainRoom(event.tenantId, event.projectId);
|
|
18142
|
-
const room = snapshotProjectRoom(roomValue);
|
|
18143
|
-
if (this.closed) return;
|
|
18144
|
-
if (!room || room.tenantId !== event.tenantId || room.workspaceId !== event.workspaceId || room.projectId !== event.projectId) return;
|
|
18145
|
-
const membershipValue = await this.deps.memberships.findByAssistant(event.tenantId, event.projectId, task.ownerId);
|
|
18146
|
-
const membership = snapshotProjectBotMembership(membershipValue);
|
|
18147
|
-
if (this.closed) return;
|
|
18148
|
-
if (!membership || membership.tenantId !== event.tenantId || membership.workspaceId !== event.workspaceId || membership.projectId !== event.projectId || membership.roomId !== room.id || membership.assistantId !== task.ownerId) return;
|
|
18149
|
-
this.deps.realtime.taskChanged({
|
|
18150
|
-
tenantId: event.tenantId,
|
|
18151
|
-
roomId: room.id,
|
|
18152
|
-
projectId: event.projectId,
|
|
18153
|
-
taskId: task.id,
|
|
18154
|
-
status: task.status,
|
|
18155
|
-
ownerMembershipId: membership.id,
|
|
18156
|
-
updatedAt: task.updatedAt.toISOString(),
|
|
18157
|
-
sourceKey: `task:${task.id}:${event.eventKey}`
|
|
18158
|
-
});
|
|
18159
|
-
} catch (error) {
|
|
18160
|
-
this.warn("project-room:task-realtime-failed", { code: "TASK_REALTIME_NOTIFICATION_FAILED", taskId: safeId3(event.taskId), error: error instanceof Error ? error.name : "UnknownError" });
|
|
18194
|
+
} catch {
|
|
18195
|
+
this.close();
|
|
18161
18196
|
}
|
|
18162
18197
|
}
|
|
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;
|
|
18198
|
+
armTerminalDeadline(deadlineMs, finish) {
|
|
18199
|
+
this.terminalTimer = setTimeout(finish, deadlineMs);
|
|
18200
|
+
this.terminalTimer.unref?.();
|
|
18169
18201
|
}
|
|
18170
|
-
|
|
18202
|
+
writeFrame(frame) {
|
|
18203
|
+
if (this.closed) return;
|
|
18171
18204
|
try {
|
|
18172
|
-
this.
|
|
18205
|
+
if (!this.raw.write(frame)) {
|
|
18206
|
+
this.writing = true;
|
|
18207
|
+
this.blockedBytes = Buffer.byteLength(frame, "utf8");
|
|
18208
|
+
this.drainTimer = setTimeout(() => {
|
|
18209
|
+
this.drainTimer = void 0;
|
|
18210
|
+
this.failSlowConsumer();
|
|
18211
|
+
}, this.drainTimeoutMs);
|
|
18212
|
+
this.drainTimer.unref?.();
|
|
18213
|
+
} else {
|
|
18214
|
+
this.writing = false;
|
|
18215
|
+
this.blockedBytes = 0;
|
|
18216
|
+
this.flush();
|
|
18217
|
+
}
|
|
18173
18218
|
} catch {
|
|
18219
|
+
this.close();
|
|
18174
18220
|
}
|
|
18175
18221
|
}
|
|
18176
|
-
|
|
18177
|
-
this.
|
|
18178
|
-
|
|
18222
|
+
clearDrainTimer() {
|
|
18223
|
+
if (this.drainTimer !== void 0) clearTimeout(this.drainTimer);
|
|
18224
|
+
this.drainTimer = void 0;
|
|
18225
|
+
}
|
|
18226
|
+
failSlowConsumer() {
|
|
18227
|
+
if (this.closed) return;
|
|
18228
|
+
this.frames.length = 0;
|
|
18229
|
+
this.queuedBytes = 0;
|
|
18230
|
+
if (!this.slowConsumerAttempted) {
|
|
18231
|
+
this.slowConsumerAttempted = true;
|
|
18232
|
+
try {
|
|
18233
|
+
this.raw.write(serializeControl({ type: "resync", data: { reason: "SLOW_CONSUMER" } }));
|
|
18234
|
+
} catch {
|
|
18235
|
+
}
|
|
18236
|
+
}
|
|
18237
|
+
this.close();
|
|
18179
18238
|
}
|
|
18180
18239
|
};
|
|
18181
|
-
function
|
|
18182
|
-
|
|
18240
|
+
function positive(value, name) {
|
|
18241
|
+
if (!Number.isSafeInteger(value) || value <= 0) throw new RangeError(`${name} must be positive`);
|
|
18242
|
+
return value;
|
|
18183
18243
|
}
|
|
18184
18244
|
|
|
18185
|
-
// src/services/collaboration/
|
|
18186
|
-
var
|
|
18245
|
+
// src/services/collaboration/WorkspaceRoomEventsService.ts
|
|
18246
|
+
var MAX_NODE_TIMER_DELAY = 2147e6;
|
|
18247
|
+
var WorkspaceRoomEventsService = class {
|
|
18248
|
+
/** Creates a service over the shared process-local broker. */
|
|
18187
18249
|
constructor(deps) {
|
|
18188
18250
|
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
|
-
}));
|
|
18251
|
+
this.connections = /* @__PURE__ */ new Map();
|
|
18252
|
+
this.closed = false;
|
|
18253
|
+
this.now = deps.now ?? Date.now;
|
|
18254
|
+
this.heartbeatMs = deps.heartbeatMs ?? 15e3;
|
|
18255
|
+
this.authRecheckMs = deps.authRecheckMs ?? 15e3;
|
|
18256
|
+
this.maxConnectionsPerUser = deps.maxConnectionsPerUser ?? 2;
|
|
18257
|
+
this.maxTimerDelay = deps.maxTimerDelay ?? MAX_NODE_TIMER_DELAY;
|
|
18207
18258
|
}
|
|
18208
|
-
/**
|
|
18259
|
+
/** Starts a live-only connection; the route performs authentication beforehand. */
|
|
18260
|
+
connect(input) {
|
|
18261
|
+
if (this.closed) {
|
|
18262
|
+
input.raw.end();
|
|
18263
|
+
return;
|
|
18264
|
+
}
|
|
18265
|
+
const userKey = JSON.stringify([input.actor.tenantId, input.actor.userId]);
|
|
18266
|
+
const active = this.connections.get(userKey) ?? /* @__PURE__ */ new Set();
|
|
18267
|
+
if (active.size >= this.maxConnectionsPerUser) {
|
|
18268
|
+
const oldest = [...active].sort((left, right) => left.startedAt - right.startedAt)[0];
|
|
18269
|
+
oldest?.supersede();
|
|
18270
|
+
}
|
|
18271
|
+
const connection = this.buildConnection(input.actor, input.workspaceId, input.raw);
|
|
18272
|
+
active.add(connection);
|
|
18273
|
+
this.connections.set(userKey, active);
|
|
18274
|
+
}
|
|
18275
|
+
/** Closes every connection and stops admitting new ones. */
|
|
18209
18276
|
close() {
|
|
18210
|
-
|
|
18211
|
-
|
|
18277
|
+
if (this.closed) return;
|
|
18278
|
+
this.closed = true;
|
|
18279
|
+
for (const active of [...this.connections.values()]) for (const connection of [...active]) connection.close();
|
|
18280
|
+
this.connections.clear();
|
|
18212
18281
|
}
|
|
18213
|
-
|
|
18214
|
-
|
|
18215
|
-
|
|
18216
|
-
|
|
18217
|
-
|
|
18218
|
-
|
|
18219
|
-
|
|
18220
|
-
|
|
18282
|
+
buildConnection(actor2, workspaceId, raw) {
|
|
18283
|
+
let phase = "initializing";
|
|
18284
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
18285
|
+
let heartbeatTimer;
|
|
18286
|
+
let accessTimer;
|
|
18287
|
+
let expiryTimer;
|
|
18288
|
+
let closed = false;
|
|
18289
|
+
const recordRef = {};
|
|
18290
|
+
let rebuildTail = Promise.resolve(true);
|
|
18291
|
+
const lifetimeAbort = new AbortController();
|
|
18292
|
+
const clear = (timer) => {
|
|
18293
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
18294
|
+
};
|
|
18295
|
+
const userScope = projectRoomUserEventScope2(actor2.tenantId, actor2.userId);
|
|
18296
|
+
const userScopeKey = JSON.stringify([userScope.tenantId, userScope.roomId, userScope.projectId]);
|
|
18297
|
+
const roomScopeKey = (scope) => JSON.stringify([scope.tenantId, scope.roomId, scope.projectId]);
|
|
18298
|
+
const serializeScoped = (scope, event) => scope === null ? `id: ${event.id}
|
|
18299
|
+
event: ${event.type}
|
|
18300
|
+
data: ${JSON.stringify(event)}
|
|
18301
|
+
|
|
18302
|
+
` : `id: ${event.id}
|
|
18303
|
+
event: ${event.type}
|
|
18304
|
+
data: ${JSON.stringify({ ...event, scope })}
|
|
18305
|
+
|
|
18306
|
+
`;
|
|
18307
|
+
const writer = new ProjectRoomSseWriter(raw, { onClose: () => cleanup() });
|
|
18308
|
+
const cleanup = () => {
|
|
18309
|
+
if (closed) return;
|
|
18310
|
+
closed = true;
|
|
18311
|
+
phase = "closed";
|
|
18312
|
+
clear(heartbeatTimer);
|
|
18313
|
+
clear(accessTimer);
|
|
18314
|
+
clear(expiryTimer);
|
|
18315
|
+
lifetimeAbort.abort();
|
|
18316
|
+
for (const entry of subscriptions.values()) entry.unsubscribe();
|
|
18317
|
+
subscriptions.clear();
|
|
18318
|
+
writer.close();
|
|
18319
|
+
const userKey = JSON.stringify([actor2.tenantId, actor2.userId]);
|
|
18320
|
+
const active = this.connections.get(userKey);
|
|
18321
|
+
if (active && recordRef.current !== void 0) {
|
|
18322
|
+
active.delete(recordRef.current);
|
|
18323
|
+
if (active.size === 0) this.connections.delete(userKey);
|
|
18324
|
+
}
|
|
18325
|
+
};
|
|
18326
|
+
const revoke = (reason) => {
|
|
18327
|
+
if (closed) return;
|
|
18328
|
+
void writer.closeWithControl({ type: "access.revoked", data: { reason } }).then(cleanup, cleanup);
|
|
18329
|
+
};
|
|
18330
|
+
const record = {
|
|
18331
|
+
startedAt: this.now(),
|
|
18332
|
+
supersede: () => revoke("CONNECTION_SUPERSEDED"),
|
|
18333
|
+
close: cleanup
|
|
18334
|
+
};
|
|
18335
|
+
recordRef.current = record;
|
|
18336
|
+
const rebuildSubscriptions = async () => {
|
|
18337
|
+
try {
|
|
18338
|
+
const rooms = await this.deps.listMemberRooms({ tenantId: actor2.tenantId, userId: actor2.userId, workspaceId });
|
|
18339
|
+
if (closed) return true;
|
|
18340
|
+
const wanted = /* @__PURE__ */ new Map();
|
|
18341
|
+
for (const room of rooms) {
|
|
18342
|
+
const scope = { tenantId: actor2.tenantId, roomId: room.roomId, projectId: room.projectId };
|
|
18343
|
+
wanted.set(roomScopeKey(scope), scope);
|
|
18344
|
+
}
|
|
18345
|
+
for (const [key, entry] of [...subscriptions]) {
|
|
18346
|
+
if (key === userScopeKey || wanted.has(key)) continue;
|
|
18347
|
+
entry.unsubscribe();
|
|
18348
|
+
subscriptions.delete(key);
|
|
18349
|
+
}
|
|
18350
|
+
for (const [key, scope] of wanted) {
|
|
18351
|
+
if (subscriptions.has(key)) continue;
|
|
18352
|
+
const subscription = this.deps.broker.subscribe(scope, void 0, roomListener(scope));
|
|
18353
|
+
subscriptions.set(key, { scope, unsubscribe: subscription.unsubscribe });
|
|
18354
|
+
}
|
|
18355
|
+
if (!subscriptions.has(userScopeKey)) {
|
|
18356
|
+
const subscription = this.deps.broker.subscribe(userScope, void 0, userListener);
|
|
18357
|
+
subscriptions.set(userScopeKey, { scope: userScope, unsubscribe: subscription.unsubscribe });
|
|
18358
|
+
}
|
|
18359
|
+
return true;
|
|
18360
|
+
} catch (error) {
|
|
18361
|
+
this.deps.log.warn("workspace-room-events:resubscribe-failed", {
|
|
18362
|
+
error: error instanceof Error ? error.message : String(error)
|
|
18363
|
+
});
|
|
18364
|
+
return false;
|
|
18365
|
+
}
|
|
18366
|
+
};
|
|
18367
|
+
const enqueueRebuild = () => {
|
|
18368
|
+
rebuildTail = rebuildTail.then(rebuildSubscriptions, rebuildSubscriptions);
|
|
18369
|
+
};
|
|
18370
|
+
const userListener = (event) => {
|
|
18371
|
+
if (phase === "live") writer.enqueueRaw(serializeScoped(null, event));
|
|
18372
|
+
if (event.type === "membership.affected") enqueueRebuild();
|
|
18373
|
+
};
|
|
18374
|
+
const roomListener = (scope) => (event) => {
|
|
18375
|
+
if (phase === "live") writer.enqueueRaw(serializeScoped(scope, event));
|
|
18376
|
+
};
|
|
18377
|
+
const scheduleExpiry = () => {
|
|
18378
|
+
if (closed) return;
|
|
18379
|
+
const delay2 = actor2.tokenExpiresAt - this.now();
|
|
18380
|
+
if (delay2 <= 0) {
|
|
18381
|
+
revoke("TOKEN_EXPIRED");
|
|
18382
|
+
return;
|
|
18383
|
+
}
|
|
18384
|
+
expiryTimer = setTimeout(() => {
|
|
18385
|
+
expiryTimer = void 0;
|
|
18386
|
+
scheduleExpiry();
|
|
18387
|
+
}, Math.min(delay2, this.maxTimerDelay));
|
|
18388
|
+
expiryTimer.unref?.();
|
|
18389
|
+
};
|
|
18390
|
+
const scheduleHeartbeat = () => {
|
|
18391
|
+
if (closed) return;
|
|
18392
|
+
heartbeatTimer = setTimeout(() => {
|
|
18393
|
+
heartbeatTimer = void 0;
|
|
18394
|
+
if (closed) return;
|
|
18395
|
+
writer.heartbeat();
|
|
18396
|
+
scheduleHeartbeat();
|
|
18397
|
+
}, this.heartbeatMs);
|
|
18398
|
+
heartbeatTimer.unref?.();
|
|
18399
|
+
};
|
|
18400
|
+
const scheduleAccessCheck = () => {
|
|
18401
|
+
if (closed) return;
|
|
18402
|
+
accessTimer = setTimeout(() => {
|
|
18403
|
+
accessTimer = void 0;
|
|
18404
|
+
if (closed) return;
|
|
18405
|
+
const projectIds = [...subscriptions.values()].map((entry) => entry.scope.projectId).filter((projectId) => projectId !== PROJECT_ROOM_USER_CHANNEL_PROJECT);
|
|
18406
|
+
Promise.all(projectIds.map((projectId) => Promise.resolve().then(() => this.deps.requireReadAccess({ tenantId: actor2.tenantId, userId: actor2.userId, projectId })))).then(() => {
|
|
18407
|
+
if (!closed) scheduleAccessCheck();
|
|
18408
|
+
}, () => {
|
|
18409
|
+
if (!closed) revoke("PROJECT_ACCESS_REVOKED");
|
|
18410
|
+
});
|
|
18411
|
+
}, this.authRecheckMs);
|
|
18412
|
+
accessTimer.unref?.();
|
|
18413
|
+
};
|
|
18414
|
+
scheduleHeartbeat();
|
|
18415
|
+
enqueueRebuild();
|
|
18416
|
+
const initialRebuild = rebuildTail;
|
|
18417
|
+
void initialRebuild.then((ok) => {
|
|
18418
|
+
if (closed) return;
|
|
18419
|
+
if (!ok) {
|
|
18420
|
+
cleanup();
|
|
18421
|
+
return;
|
|
18422
|
+
}
|
|
18423
|
+
writer.enqueueControl({ type: "ready", data: { epoch: this.deps.broker.epoch, headEventId: null } });
|
|
18424
|
+
phase = "live";
|
|
18425
|
+
scheduleExpiry();
|
|
18426
|
+
scheduleAccessCheck();
|
|
18221
18427
|
});
|
|
18222
|
-
|
|
18223
|
-
this.service.close();
|
|
18224
|
-
this.broker.close();
|
|
18428
|
+
return record;
|
|
18225
18429
|
}
|
|
18226
18430
|
};
|
|
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;
|
|
18431
|
+
|
|
18432
|
+
// src/services/collaboration/WorkspaceMemberRoomLister.ts
|
|
18433
|
+
function createWorkspaceMemberRoomLister(deps) {
|
|
18434
|
+
return async (input) => {
|
|
18435
|
+
const projects = await deps.projects.getProjectsByWorkspace(input.tenantId, input.workspaceId);
|
|
18436
|
+
const memberRooms = [];
|
|
18437
|
+
for (const project of projects) {
|
|
18438
|
+
const membership = await deps.memberships.findByUser(input.tenantId, project.id, input.userId);
|
|
18439
|
+
if (!membership || membership.status !== "active") continue;
|
|
18440
|
+
const room = await deps.rooms.getMainRoom(input.tenantId, project.id);
|
|
18441
|
+
if (room) memberRooms.push({ projectId: project.id, roomId: room.id });
|
|
18442
|
+
}
|
|
18443
|
+
return memberRooms;
|
|
18444
|
+
};
|
|
18258
18445
|
}
|
|
18259
18446
|
|
|
18260
|
-
// src/routes/
|
|
18261
|
-
import {
|
|
18262
|
-
function
|
|
18263
|
-
app2.get("/api/
|
|
18447
|
+
// src/routes/workspace-room-events.ts
|
|
18448
|
+
import { snapshotExactRecord as snapshotExactRecord12 } from "@axiom-lattice/protocols";
|
|
18449
|
+
function registerWorkspaceRoomEventRoutes(app2, deps) {
|
|
18450
|
+
app2.get("/api/workspaces/:workspaceId/room-events", async (request, reply) => {
|
|
18264
18451
|
try {
|
|
18265
|
-
const
|
|
18266
|
-
const headers = strictHeaders(request
|
|
18452
|
+
const params = exactParams(request.params);
|
|
18453
|
+
const headers = strictHeaders(request);
|
|
18267
18454
|
if (request.body !== void 0 || Object.keys(request.query).length !== 0) return invalid(reply);
|
|
18268
18455
|
const session = verifyConsoleSessionAuthHeader(headers.authorization, deps.tokenSecret);
|
|
18269
18456
|
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
18457
|
reply.hijack();
|
|
18276
18458
|
reply.raw.writeHead(200, {
|
|
18277
18459
|
"Content-Type": "text/event-stream",
|
|
@@ -18280,53 +18462,35 @@ function registerProjectRoomEventRoutes(app2, deps) {
|
|
|
18280
18462
|
"X-Accel-Buffering": "no",
|
|
18281
18463
|
"Access-Control-Allow-Origin": "*"
|
|
18282
18464
|
});
|
|
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 } });
|
|
18465
|
+
deps.service.connect({
|
|
18466
|
+
actor: { tenantId: session.tenantId, userId: session.id, tokenExpiresAt: session.expiresAt },
|
|
18467
|
+
workspaceId: params.workspaceId,
|
|
18468
|
+
raw: reply.raw
|
|
18469
|
+
});
|
|
18297
18470
|
} catch (error) {
|
|
18298
18471
|
return routeError(reply, error);
|
|
18299
18472
|
}
|
|
18300
18473
|
});
|
|
18301
18474
|
}
|
|
18302
|
-
function
|
|
18475
|
+
function exactParams(params) {
|
|
18476
|
+
const value = snapshotExactRecord12(params, ["workspaceId"]);
|
|
18477
|
+
if (!value || typeof value.workspaceId !== "string" || !value.workspaceId.trim()) throw new InvalidRealtimeRequestError();
|
|
18478
|
+
return { workspaceId: value.workspaceId };
|
|
18479
|
+
}
|
|
18480
|
+
function strictHeaders(request) {
|
|
18303
18481
|
const raw = request.raw.rawHeaders;
|
|
18304
18482
|
const values = (name) => raw.flatMap((value, index) => index % 2 === 0 && value.toLowerCase() === name ? [raw[index + 1]] : []);
|
|
18305
18483
|
const authorization = values("authorization");
|
|
18306
18484
|
const accept = values("accept");
|
|
18307
18485
|
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 } : {} };
|
|
18486
|
+
if (authorization.length !== 1 || authorization[0].includes(",") || cursor.length > 0 || accept.length !== 1 || !isSseAccept(accept[0])) throw new InvalidRealtimeRequestError();
|
|
18487
|
+
return { authorization: authorization[0] };
|
|
18314
18488
|
}
|
|
18315
18489
|
function isSseAccept(value) {
|
|
18316
18490
|
if (value.includes(",")) return false;
|
|
18317
18491
|
const [mediaType, ...parameters] = value.split(";");
|
|
18318
18492
|
return mediaType.trim() === "text/event-stream" && parameters.every((parameter) => /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\s*=\s*(?:[!#$%&'*+.^_`|~0-9A-Za-z-]+|"[^"]*")$/.test(parameter.trim()));
|
|
18319
18493
|
}
|
|
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
18494
|
var InvalidRealtimeRequestError = class extends Error {
|
|
18331
18495
|
};
|
|
18332
18496
|
function invalid(reply) {
|
|
@@ -18337,7 +18501,6 @@ function unauthorized(reply) {
|
|
|
18337
18501
|
}
|
|
18338
18502
|
function routeError(reply, error) {
|
|
18339
18503
|
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
18504
|
return reply.code(500).send({ success: false, error: { code: "INTERNAL_ERROR", message: "Internal server error", retryable: false } });
|
|
18342
18505
|
}
|
|
18343
18506
|
|
|
@@ -18476,6 +18639,7 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
|
|
|
18476
18639
|
const projectRoomStore = getStoreLattice16("default", "projectRoom").store;
|
|
18477
18640
|
const projectBotMembershipStore = getStoreLattice16("default", "projectBotMembership").store;
|
|
18478
18641
|
const projectRoomMessageStore = getStoreLattice16("default", "projectRoomMessage").store;
|
|
18642
|
+
const projectRoomReadStateStore = getStoreLattice16("default", "projectRoomReadState").store;
|
|
18479
18643
|
const threadStore = getStoreLattice16("default", "thread").store;
|
|
18480
18644
|
const taskStore = getStoreLattice16("default", "task").store;
|
|
18481
18645
|
const taskWorkItemStore = getStoreLattice16("default", "taskWorkItem").store;
|
|
@@ -18487,23 +18651,30 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
|
|
|
18487
18651
|
tasks: taskStore,
|
|
18488
18652
|
rooms: projectRoomStore,
|
|
18489
18653
|
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
|
-
}
|
|
18654
|
+
log: realtimeLog
|
|
18499
18655
|
}) : void 0;
|
|
18500
18656
|
if (projectRoomRealtimeRuntime) {
|
|
18501
18657
|
app2.addHook("onClose", async () => projectRoomRealtimeRuntime?.close());
|
|
18502
|
-
|
|
18503
|
-
access: accessService,
|
|
18504
|
-
rooms: projectRoomStore,
|
|
18505
|
-
realtime: projectRoomRealtimeRuntime.service,
|
|
18658
|
+
const workspaceRoomEventsService = new WorkspaceRoomEventsService({
|
|
18506
18659
|
broker: projectRoomRealtimeRuntime.broker,
|
|
18660
|
+
listMemberRooms: createWorkspaceMemberRoomLister({
|
|
18661
|
+
projects: projectStore,
|
|
18662
|
+
memberships: projectMembershipStore,
|
|
18663
|
+
rooms: projectRoomStore
|
|
18664
|
+
}),
|
|
18665
|
+
requireReadAccess: async (input) => {
|
|
18666
|
+
await accessService.requireExistingProjectAccess({
|
|
18667
|
+
tenantId: input.tenantId,
|
|
18668
|
+
userId: input.userId,
|
|
18669
|
+
projectId: input.projectId,
|
|
18670
|
+
capability: "read"
|
|
18671
|
+
});
|
|
18672
|
+
},
|
|
18673
|
+
log: realtimeLog
|
|
18674
|
+
});
|
|
18675
|
+
app2.addHook("onClose", async () => workspaceRoomEventsService.close());
|
|
18676
|
+
registerWorkspaceRoomEventRoutes(app2, {
|
|
18677
|
+
service: workspaceRoomEventsService,
|
|
18507
18678
|
tokenSecret: resolveConsoleTokenSecret(process.env.AUTH_REQUIRED === "true")
|
|
18508
18679
|
});
|
|
18509
18680
|
}
|
|
@@ -18585,7 +18756,32 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
|
|
|
18585
18756
|
saveBot: projectBotMembershipStore.save.bind(projectBotMembershipStore),
|
|
18586
18757
|
ensureCoordinator: (tenantId) => coordinatorProvisioner.ensure(tenantId)
|
|
18587
18758
|
});
|
|
18588
|
-
|
|
18759
|
+
const readStateService = {
|
|
18760
|
+
mark: async (actorRef) => {
|
|
18761
|
+
await accessService.requireExistingProjectAccess({ ...actorRef, capability: "read" });
|
|
18762
|
+
const room = await projectRoomStore.getMainRoom(actorRef.tenantId, actorRef.projectId);
|
|
18763
|
+
if (!room) return;
|
|
18764
|
+
const lastReadAt = /* @__PURE__ */ new Date();
|
|
18765
|
+
await projectRoomReadStateStore.markRead({ tenantId: actorRef.tenantId, roomId: room.id, userId: actorRef.userId, lastReadAt });
|
|
18766
|
+
projectRoomRealtimeRuntime?.publisher.readChanged({
|
|
18767
|
+
tenantId: actorRef.tenantId,
|
|
18768
|
+
userId: actorRef.userId,
|
|
18769
|
+
projectId: actorRef.projectId,
|
|
18770
|
+
roomId: room.id,
|
|
18771
|
+
lastReadAt: lastReadAt.toISOString(),
|
|
18772
|
+
sourceKey: `read:${actorRef.userId}:${room.id}:${lastReadAt.getTime()}`
|
|
18773
|
+
});
|
|
18774
|
+
}
|
|
18775
|
+
};
|
|
18776
|
+
registerProjectRoomRoutes(app2, {
|
|
18777
|
+
roomService,
|
|
18778
|
+
membershipService,
|
|
18779
|
+
messageService,
|
|
18780
|
+
readStateService,
|
|
18781
|
+
userDirectory: {
|
|
18782
|
+
getUserById: (id3) => getStoreLattice16("default", "user").store.getUserById(id3).then((u) => u ? { name: u.name } : null)
|
|
18783
|
+
}
|
|
18784
|
+
});
|
|
18589
18785
|
registerProjectRosterRoutes(app2, { service: rosterService });
|
|
18590
18786
|
registerCoSpaceRoutes(app2, {
|
|
18591
18787
|
projectStore: {
|
|
@@ -18607,7 +18803,11 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
|
|
|
18607
18803
|
},
|
|
18608
18804
|
messageStore: {
|
|
18609
18805
|
list: projectRoomMessageStore.list.bind(projectRoomMessageStore),
|
|
18610
|
-
create: projectRoomMessageStore.create.bind(projectRoomMessageStore)
|
|
18806
|
+
create: projectRoomMessageStore.create.bind(projectRoomMessageStore),
|
|
18807
|
+
countAfter: projectRoomMessageStore.countAfter.bind(projectRoomMessageStore)
|
|
18808
|
+
},
|
|
18809
|
+
readStateStore: {
|
|
18810
|
+
get: projectRoomReadStateStore.get.bind(projectRoomReadStateStore)
|
|
18611
18811
|
},
|
|
18612
18812
|
userTenantLinkStore: {
|
|
18613
18813
|
getUsersByTenant: userTenantLinkStore.getUsersByTenant.bind(userTenantLinkStore)
|
|
@@ -18740,6 +18940,7 @@ var registerLatticeRoutes = (app2, channelDeps, options = {}) => {
|
|
|
18740
18940
|
}
|
|
18741
18941
|
})
|
|
18742
18942
|
});
|
|
18943
|
+
registerAgentWebAppEmbedRoutes(app2, {});
|
|
18743
18944
|
registerA2ABridgeRoutes(app2);
|
|
18744
18945
|
registerSTTRoutes(app2);
|
|
18745
18946
|
app2.get("/api/local-a2a", getLocalA2AStatus);
|
|
@@ -21461,9 +21662,9 @@ var MessageRouter = class {
|
|
|
21461
21662
|
};
|
|
21462
21663
|
|
|
21463
21664
|
// src/channels/room/RoomChannelAdapter.ts
|
|
21464
|
-
import { z as
|
|
21665
|
+
import { z as z10 } from "zod";
|
|
21465
21666
|
import { snapshotExactRecord as snapshotExactRecord15 } from "@axiom-lattice/protocols";
|
|
21466
|
-
var roomConfigSchema =
|
|
21667
|
+
var roomConfigSchema = z10.object({}).strict();
|
|
21467
21668
|
function createRoomChannelAdapter(writer) {
|
|
21468
21669
|
return {
|
|
21469
21670
|
channel: "room",
|
|
@@ -21643,7 +21844,7 @@ app.register(multipart, {
|
|
|
21643
21844
|
});
|
|
21644
21845
|
app.register(websocket);
|
|
21645
21846
|
app.register(staticPlugin, {
|
|
21646
|
-
root: typeof __dirname === "string" ?
|
|
21847
|
+
root: typeof __dirname === "string" ? path4.join(__dirname, "../public") : path4.resolve(process.cwd(), "public"),
|
|
21647
21848
|
prefix: "/"
|
|
21648
21849
|
});
|
|
21649
21850
|
app.setErrorHandler((error, request, reply) => {
|
|
@@ -21694,7 +21895,7 @@ async function restoreMcpConnections() {
|
|
|
21694
21895
|
const connectedConfigs = configs.filter((c2) => c2.status === "connected");
|
|
21695
21896
|
if (connectedConfigs.length === 0) return;
|
|
21696
21897
|
logger5.info(`Restoring ${connectedConfigs.length} MCP server connections...`);
|
|
21697
|
-
const { convertToConnection } = await import("./mcp-configs-
|
|
21898
|
+
const { convertToConnection } = await import("./mcp-configs-WCY5EXCW.mjs");
|
|
21698
21899
|
for (const config of connectedConfigs) {
|
|
21699
21900
|
try {
|
|
21700
21901
|
const connection = convertToConnection(config.config);
|
|
@@ -21733,32 +21934,17 @@ var start = async (config) => {
|
|
|
21733
21934
|
const projectRoomRealtimeMode = resolveProjectRoomRealtimeMode();
|
|
21734
21935
|
let projectRoomRealtimeRuntime;
|
|
21735
21936
|
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
21937
|
projectRoomRealtimeRuntime = createProjectRoomRealtimeRuntime({
|
|
21744
21938
|
tasks: getStoreLattice27("default", "task").store,
|
|
21745
21939
|
rooms: getStoreLattice27("default", "projectRoom").store,
|
|
21746
21940
|
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
|
-
}
|
|
21941
|
+
log: { warn: (message, context) => logger5.warn(message, context) }
|
|
21756
21942
|
});
|
|
21757
21943
|
}
|
|
21758
21944
|
let channelDeps;
|
|
21759
21945
|
const adapterRegistry = new ChannelAdapterRegistry();
|
|
21760
21946
|
adapterRegistry.register(larkChannelAdapter);
|
|
21761
|
-
const { wechatChannelAdapter } = await import("./WechatChannelAdapter-
|
|
21947
|
+
const { wechatChannelAdapter } = await import("./WechatChannelAdapter-7WHE5UGY.mjs");
|
|
21762
21948
|
adapterRegistry.register(wechatChannelAdapter);
|
|
21763
21949
|
try {
|
|
21764
21950
|
const { getStoreLattice: getStore11 } = await import("@axiom-lattice/core");
|
|
@@ -21809,9 +21995,9 @@ var start = async (config) => {
|
|
|
21809
21995
|
projectRoomRealtimeRuntime
|
|
21810
21996
|
});
|
|
21811
21997
|
try {
|
|
21812
|
-
const { A2AAuthService, parseEnvKeys } = await import("./A2AAuthService-
|
|
21813
|
-
const { registerA2AStandardRoutes } = await import("./a2a-standard-
|
|
21814
|
-
const a2a = await import("./a2a-
|
|
21998
|
+
const { A2AAuthService, parseEnvKeys } = await import("./A2AAuthService-7UGQ7GMW.mjs");
|
|
21999
|
+
const { registerA2AStandardRoutes } = await import("./a2a-standard-VEQBXBMM.mjs");
|
|
22000
|
+
const a2a = await import("./a2a-FGYX2HH3.mjs");
|
|
21815
22001
|
const a2aKeyStore = getStoreLattice27("default", "a2aApiKey").store;
|
|
21816
22002
|
const assistantStore = getStoreLattice27("default", "assistant").store;
|
|
21817
22003
|
const projectStore = getStoreLattice27("default", "project").store;
|
|
@@ -21839,12 +22025,51 @@ var start = async (config) => {
|
|
|
21839
22025
|
error: err instanceof Error ? err.message : String(err)
|
|
21840
22026
|
});
|
|
21841
22027
|
}
|
|
22028
|
+
try {
|
|
22029
|
+
const { registerOpenRoutes } = await import("./open-HH7RKGML.mjs");
|
|
22030
|
+
const { registerOpenSessionRoutes } = await import("./open-session-3VN65PRR.mjs");
|
|
22031
|
+
const { registerOpenCatalogRoutes } = await import("./open-catalog-WYS2AENM.mjs");
|
|
22032
|
+
const { registerOpenFilesRoutes } = await import("./open-files-GVRMK5PL.mjs");
|
|
22033
|
+
const { registerOpenAuditRoutes } = await import("./open-audit-UJ3NXCGW.mjs");
|
|
22034
|
+
const { registerOpenExposureRoutes } = await import("./open-exposure-FK4G6O6L.mjs");
|
|
22035
|
+
const { openLattice } = await import("./openLattice-GAAGQJST.mjs");
|
|
22036
|
+
const { createKbProvider } = await import("./kbProvider-2D6DZ34N.mjs");
|
|
22037
|
+
const { createOpenSandboxProvider } = await import("./sandboxProvider-I3P66VXT.mjs");
|
|
22038
|
+
const { createAgentProvider } = await import("./agentProvider-X4FVQPKW.mjs");
|
|
22039
|
+
const { registerExposedPluginTools } = await import("./registerExposedPlugins-63EUF4VS.mjs");
|
|
22040
|
+
const { CollectionService: CollectionService2 } = await import("./collection_service-RTRJEQFL.mjs");
|
|
22041
|
+
openLattice.register(createKbProvider(new CollectionService2()));
|
|
22042
|
+
openLattice.register(createOpenSandboxProvider());
|
|
22043
|
+
const threadStore = getStoreLattice27("default", "thread").store;
|
|
22044
|
+
const assistantStore = getStoreLattice27("default", "assistant").store;
|
|
22045
|
+
openLattice.register(
|
|
22046
|
+
createAgentProvider({
|
|
22047
|
+
threadStore,
|
|
22048
|
+
resolveAssistant: async (tenantId, assistantId) => {
|
|
22049
|
+
const assistant = await assistantStore.getAssistantById(tenantId, assistantId);
|
|
22050
|
+
return assistant ? { name: assistant.name, description: assistant.description } : null;
|
|
22051
|
+
}
|
|
22052
|
+
})
|
|
22053
|
+
);
|
|
22054
|
+
await registerExposedPluginTools();
|
|
22055
|
+
registerOpenRoutes(app);
|
|
22056
|
+
registerOpenSessionRoutes(app);
|
|
22057
|
+
registerOpenCatalogRoutes(app);
|
|
22058
|
+
registerOpenFilesRoutes(app);
|
|
22059
|
+
registerOpenAuditRoutes(app);
|
|
22060
|
+
registerOpenExposureRoutes(app);
|
|
22061
|
+
logger5.info("Open API routes registered (kb + sandbox providers, session exchange)");
|
|
22062
|
+
} catch (err) {
|
|
22063
|
+
logger5.warn("Open API routes unavailable", {
|
|
22064
|
+
error: err instanceof Error ? err.message : String(err)
|
|
22065
|
+
});
|
|
22066
|
+
}
|
|
21842
22067
|
if (!sandboxLatticeManager2.hasLattice("default")) {
|
|
21843
22068
|
sandboxLatticeManager2.registerLattice("default", getConfiguredSandboxProvider());
|
|
21844
22069
|
logger5.info("Registered sandbox manager from env configuration");
|
|
21845
22070
|
}
|
|
21846
22071
|
try {
|
|
21847
|
-
const { ResourceController } = await import("./resources-
|
|
22072
|
+
const { ResourceController } = await import("./resources-SRQRKW5G.mjs");
|
|
21848
22073
|
const sharedResourceStore = getStoreLattice27("default", "sharedResource").store;
|
|
21849
22074
|
const cache = new TokenCache();
|
|
21850
22075
|
const resourceController = new ResourceController({
|