@mastra/server 1.46.0-alpha.3 → 1.46.0-alpha.5
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/CHANGELOG.md +29 -0
- package/dist/{api-schema-manifest-C5OU3K53.cjs → api-schema-manifest-3PMRQVN5.cjs} +4 -4
- package/dist/{api-schema-manifest-C5OU3K53.cjs.map → api-schema-manifest-3PMRQVN5.cjs.map} +1 -1
- package/dist/{api-schema-manifest-24KFXICH.js → api-schema-manifest-Z45VRZSJ.js} +3 -3
- package/dist/{api-schema-manifest-24KFXICH.js.map → api-schema-manifest-Z45VRZSJ.js.map} +1 -1
- package/dist/{chunk-6HRGFBAF.cjs → chunk-27RDIRLQ.cjs} +3 -3
- package/dist/{chunk-6HRGFBAF.cjs.map → chunk-27RDIRLQ.cjs.map} +1 -1
- package/dist/{chunk-5GSQ6FIO.cjs → chunk-2BGZ3WEG.cjs} +238 -238
- package/dist/{chunk-5GSQ6FIO.cjs.map → chunk-2BGZ3WEG.cjs.map} +1 -1
- package/dist/{chunk-DPKG24KJ.js → chunk-46Y4Y2RB.js} +3 -3
- package/dist/{chunk-DPKG24KJ.js.map → chunk-46Y4Y2RB.js.map} +1 -1
- package/dist/{chunk-T6DNAIYV.cjs → chunk-4ZHHKMDQ.cjs} +3 -3
- package/dist/{chunk-T6DNAIYV.cjs.map → chunk-4ZHHKMDQ.cjs.map} +1 -1
- package/dist/{chunk-HZBASZCD.js → chunk-56TEDJND.js} +3 -3
- package/dist/{chunk-HZBASZCD.js.map → chunk-56TEDJND.js.map} +1 -1
- package/dist/{chunk-HV64O7BN.js → chunk-5LOPQPIH.js} +4 -4
- package/dist/{chunk-HV64O7BN.js.map → chunk-5LOPQPIH.js.map} +1 -1
- package/dist/{chunk-RO755CGB.cjs → chunk-6TFOQW4W.cjs} +12 -12
- package/dist/{chunk-RO755CGB.cjs.map → chunk-6TFOQW4W.cjs.map} +1 -1
- package/dist/{chunk-3D4XT5RX.js → chunk-BB6RVOJY.js} +3 -3
- package/dist/{chunk-3D4XT5RX.js.map → chunk-BB6RVOJY.js.map} +1 -1
- package/dist/{chunk-4GRES47M.js → chunk-BJPP22F6.js} +4 -4
- package/dist/{chunk-4GRES47M.js.map → chunk-BJPP22F6.js.map} +1 -1
- package/dist/{chunk-YR4HTQHN.js → chunk-BSUXHFFY.js} +4 -4
- package/dist/{chunk-YR4HTQHN.js.map → chunk-BSUXHFFY.js.map} +1 -1
- package/dist/{chunk-LLXZPATO.cjs → chunk-BTMYAVRX.cjs} +4 -4
- package/dist/{chunk-LLXZPATO.cjs.map → chunk-BTMYAVRX.cjs.map} +1 -1
- package/dist/{chunk-UZWRNDJY.js → chunk-CGXMRNFE.js} +4 -4
- package/dist/{chunk-UZWRNDJY.js.map → chunk-CGXMRNFE.js.map} +1 -1
- package/dist/{chunk-HZWJL5Y4.js → chunk-CQHYURGT.js} +3 -3
- package/dist/{chunk-HZWJL5Y4.js.map → chunk-CQHYURGT.js.map} +1 -1
- package/dist/{chunk-IIISD6NP.cjs → chunk-DW6LIDTI.cjs} +5 -5
- package/dist/{chunk-IIISD6NP.cjs.map → chunk-DW6LIDTI.cjs.map} +1 -1
- package/dist/{chunk-PKP37L3H.js → chunk-E2JNW3QM.js} +4 -4
- package/dist/{chunk-PKP37L3H.js.map → chunk-E2JNW3QM.js.map} +1 -1
- package/dist/{chunk-QNECOADU.cjs → chunk-EMRTFZVU.cjs} +5 -5
- package/dist/{chunk-QNECOADU.cjs.map → chunk-EMRTFZVU.cjs.map} +1 -1
- package/dist/{chunk-UA2RGHTI.cjs → chunk-FUEIM3CA.cjs} +4 -4
- package/dist/{chunk-UA2RGHTI.cjs.map → chunk-FUEIM3CA.cjs.map} +1 -1
- package/dist/{chunk-MHYN6XMP.js → chunk-GADWAAGI.js} +16 -8
- package/dist/chunk-GADWAAGI.js.map +1 -0
- package/dist/{chunk-YGUQ5EQN.cjs → chunk-GU4AEOGA.cjs} +3 -3
- package/dist/{chunk-YGUQ5EQN.cjs.map → chunk-GU4AEOGA.cjs.map} +1 -1
- package/dist/{chunk-DJYRYDAF.cjs → chunk-H2WXUVWU.cjs} +5 -5
- package/dist/{chunk-DJYRYDAF.cjs.map → chunk-H2WXUVWU.cjs.map} +1 -1
- package/dist/{chunk-OQIQ7O3I.js → chunk-ILVGJFCT.js} +5 -5
- package/dist/{chunk-OQIQ7O3I.js.map → chunk-ILVGJFCT.js.map} +1 -1
- package/dist/{chunk-ZTE226KZ.cjs → chunk-IRJJ2JJG.cjs} +4 -4
- package/dist/{chunk-ZTE226KZ.cjs.map → chunk-IRJJ2JJG.cjs.map} +1 -1
- package/dist/{chunk-QDKNDZMW.cjs → chunk-JZJ3PP2H.cjs} +3 -3
- package/dist/{chunk-QDKNDZMW.cjs.map → chunk-JZJ3PP2H.cjs.map} +1 -1
- package/dist/{chunk-QTWC3NAN.js → chunk-KBOC52HT.js} +4 -4
- package/dist/{chunk-QTWC3NAN.js.map → chunk-KBOC52HT.js.map} +1 -1
- package/dist/{chunk-ZKHIUO3M.js → chunk-KXYFKA7K.js} +5 -5
- package/dist/{chunk-ZKHIUO3M.js.map → chunk-KXYFKA7K.js.map} +1 -1
- package/dist/{chunk-VC4I57RM.cjs → chunk-L4V4FQDA.cjs} +21 -21
- package/dist/{chunk-VC4I57RM.cjs.map → chunk-L4V4FQDA.cjs.map} +1 -1
- package/dist/{chunk-EVIEMZPA.cjs → chunk-L5D33443.cjs} +27 -3
- package/dist/chunk-L5D33443.cjs.map +1 -0
- package/dist/{chunk-26FMCYZK.js → chunk-L5JZZ7PX.js} +4 -4
- package/dist/{chunk-26FMCYZK.js.map → chunk-L5JZZ7PX.js.map} +1 -1
- package/dist/{chunk-YNMRF4NL.js → chunk-L6FOTAND.js} +3 -3
- package/dist/{chunk-YNMRF4NL.js.map → chunk-L6FOTAND.js.map} +1 -1
- package/dist/{chunk-UAE5VRI2.cjs → chunk-MIAMR6TW.cjs} +13 -13
- package/dist/{chunk-UAE5VRI2.cjs.map → chunk-MIAMR6TW.cjs.map} +1 -1
- package/dist/{chunk-XXRCIVFY.js → chunk-MMY24AC4.js} +3 -3
- package/dist/{chunk-XXRCIVFY.js.map → chunk-MMY24AC4.js.map} +1 -1
- package/dist/{chunk-ZDPZ3AGZ.js → chunk-N3D3A56J.js} +3 -3
- package/dist/{chunk-ZDPZ3AGZ.js.map → chunk-N3D3A56J.js.map} +1 -1
- package/dist/{chunk-3ZAH6OQU.js → chunk-OHWAEEZJ.js} +3 -3
- package/dist/{chunk-3ZAH6OQU.js.map → chunk-OHWAEEZJ.js.map} +1 -1
- package/dist/{chunk-DVHRHL5N.cjs → chunk-ONBABU5V.cjs} +3 -3
- package/dist/{chunk-DVHRHL5N.cjs.map → chunk-ONBABU5V.cjs.map} +1 -1
- package/dist/{chunk-X6VNCWUE.js → chunk-PC73QIVI.js} +5 -5
- package/dist/{chunk-X6VNCWUE.js.map → chunk-PC73QIVI.js.map} +1 -1
- package/dist/{chunk-DY353SJU.cjs → chunk-PJLW25AQ.cjs} +76 -68
- package/dist/chunk-PJLW25AQ.cjs.map +1 -0
- package/dist/{chunk-E6UDV3F5.js → chunk-Q5RXMLH2.js} +3 -3
- package/dist/{chunk-E6UDV3F5.js.map → chunk-Q5RXMLH2.js.map} +1 -1
- package/dist/{chunk-OG3RHAT5.js → chunk-QWTUGYUI.js} +3 -3
- package/dist/{chunk-OG3RHAT5.js.map → chunk-QWTUGYUI.js.map} +1 -1
- package/dist/{chunk-AI75K5XV.js → chunk-R4O5HVDI.js} +3 -3
- package/dist/{chunk-AI75K5XV.js.map → chunk-R4O5HVDI.js.map} +1 -1
- package/dist/{chunk-GB67HE2R.js → chunk-R7624SPL.js} +4 -4
- package/dist/{chunk-GB67HE2R.js.map → chunk-R7624SPL.js.map} +1 -1
- package/dist/{chunk-2YCWZHBH.cjs → chunk-RHRIAUUE.cjs} +7 -7
- package/dist/{chunk-2YCWZHBH.cjs.map → chunk-RHRIAUUE.cjs.map} +1 -1
- package/dist/{chunk-3P3R4Z5I.cjs → chunk-RM4ITWAQ.cjs} +3 -3
- package/dist/{chunk-3P3R4Z5I.cjs.map → chunk-RM4ITWAQ.cjs.map} +1 -1
- package/dist/{chunk-HT6CWICR.cjs → chunk-RWW6SPX2.cjs} +7 -7
- package/dist/{chunk-HT6CWICR.cjs.map → chunk-RWW6SPX2.cjs.map} +1 -1
- package/dist/{chunk-U4TOYQTL.cjs → chunk-SBAFNGQD.cjs} +6 -6
- package/dist/{chunk-U4TOYQTL.cjs.map → chunk-SBAFNGQD.cjs.map} +1 -1
- package/dist/{chunk-RABO3TJ4.js → chunk-SJPWXUKZ.js} +4 -4
- package/dist/{chunk-RABO3TJ4.js.map → chunk-SJPWXUKZ.js.map} +1 -1
- package/dist/{chunk-7HW3DUN5.cjs → chunk-SPHAWZ5H.cjs} +5 -5
- package/dist/{chunk-7HW3DUN5.cjs.map → chunk-SPHAWZ5H.cjs.map} +1 -1
- package/dist/{chunk-VLTKVNN7.cjs → chunk-T32FQPWH.cjs} +3 -3
- package/dist/{chunk-VLTKVNN7.cjs.map → chunk-T32FQPWH.cjs.map} +1 -1
- package/dist/{chunk-QPC3COIK.js → chunk-T3T23PHF.js} +5 -5
- package/dist/{chunk-QPC3COIK.js.map → chunk-T3T23PHF.js.map} +1 -1
- package/dist/{chunk-C3QMOBYA.cjs → chunk-TDMX66RN.cjs} +4 -4
- package/dist/{chunk-C3QMOBYA.cjs.map → chunk-TDMX66RN.cjs.map} +1 -1
- package/dist/{chunk-CELYVWOU.cjs → chunk-U72IZ5BP.cjs} +4 -4
- package/dist/{chunk-CELYVWOU.cjs.map → chunk-U72IZ5BP.cjs.map} +1 -1
- package/dist/{chunk-H7YXAKEQ.cjs → chunk-UNXPZBTJ.cjs} +3 -3
- package/dist/{chunk-H7YXAKEQ.cjs.map → chunk-UNXPZBTJ.cjs.map} +1 -1
- package/dist/{chunk-TFWCZYHH.cjs → chunk-UZ43QCIA.cjs} +4 -4
- package/dist/{chunk-TFWCZYHH.cjs.map → chunk-UZ43QCIA.cjs.map} +1 -1
- package/dist/{chunk-N624P3VO.js → chunk-X7KQ23MW.js} +27 -3
- package/dist/chunk-X7KQ23MW.js.map +1 -0
- package/dist/{chunk-ABROKC5A.js → chunk-XCTWO6W3.js} +3 -3
- package/dist/{chunk-ABROKC5A.js.map → chunk-XCTWO6W3.js.map} +1 -1
- package/dist/{chunk-CWPHUHVE.cjs → chunk-XLQY5MPS.cjs} +3 -3
- package/dist/{chunk-CWPHUHVE.cjs.map → chunk-XLQY5MPS.cjs.map} +1 -1
- package/dist/{chunk-OTOG57OS.js → chunk-YI5CKY7A.js} +27 -27
- package/dist/{chunk-OTOG57OS.js.map → chunk-YI5CKY7A.js.map} +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/server/handlers/a2a.cjs +14 -14
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +17 -17
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agent-versions.cjs +8 -8
- package/dist/server/handlers/agent-versions.js +1 -1
- package/dist/server/handlers/agents.cjs +46 -46
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/auth.cjs +13 -13
- package/dist/server/handlers/auth.js +1 -1
- package/dist/server/handlers/conversations.cjs +5 -5
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/datasets.cjs +26 -26
- package/dist/server/handlers/datasets.d.ts +312 -6
- package/dist/server/handlers/datasets.d.ts.map +1 -1
- package/dist/server/handlers/datasets.js +1 -1
- package/dist/server/handlers/editor-builder.cjs +6 -6
- package/dist/server/handlers/editor-builder.js +1 -1
- package/dist/server/handlers/favorites-enrichment.cjs +4 -4
- package/dist/server/handlers/favorites-enrichment.js +1 -1
- package/dist/server/handlers/logs.cjs +4 -4
- package/dist/server/handlers/logs.js +1 -1
- package/dist/server/handlers/mcp-client-versions.cjs +8 -8
- package/dist/server/handlers/mcp-client-versions.js +1 -1
- package/dist/server/handlers/memory.cjs +27 -27
- package/dist/server/handlers/memory.js +1 -1
- package/dist/server/handlers/prompt-block-versions.cjs +8 -8
- package/dist/server/handlers/prompt-block-versions.js +1 -1
- package/dist/server/handlers/responses.cjs +4 -4
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/scorer-versions.cjs +8 -8
- package/dist/server/handlers/scorer-versions.js +1 -1
- package/dist/server/handlers/scores.cjs +7 -7
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/stored-agent-favorites.cjs +3 -3
- package/dist/server/handlers/stored-agent-favorites.js +1 -1
- package/dist/server/handlers/stored-agents.cjs +10 -10
- package/dist/server/handlers/stored-agents.js +1 -1
- package/dist/server/handlers/stored-mcp-clients.cjs +6 -6
- package/dist/server/handlers/stored-mcp-clients.js +1 -1
- package/dist/server/handlers/stored-prompt-blocks.cjs +6 -6
- package/dist/server/handlers/stored-prompt-blocks.js +1 -1
- package/dist/server/handlers/stored-scorers.cjs +6 -6
- package/dist/server/handlers/stored-scorers.js +1 -1
- package/dist/server/handlers/stored-skill-favorites.cjs +3 -3
- package/dist/server/handlers/stored-skill-favorites.js +1 -1
- package/dist/server/handlers/stored-skills.cjs +7 -7
- package/dist/server/handlers/stored-skills.js +1 -1
- package/dist/server/handlers/system.cjs +3 -3
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/workflows.cjs +27 -27
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/handlers.cjs +20 -20
- package/dist/server/handlers.js +10 -10
- package/dist/server/schemas/datasets.d.ts +150 -0
- package/dist/server/schemas/datasets.d.ts.map +1 -1
- package/dist/server/schemas/index.cjs +42 -42
- package/dist/server/schemas/index.js +1 -1
- package/dist/server/server-adapter/index.cjs +13 -13
- package/dist/server/server-adapter/index.js +2 -2
- package/dist/server/server-adapter/routes/datasets.d.ts +312 -6
- package/dist/server/server-adapter/routes/datasets.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/chunk-DY353SJU.cjs.map +0 -1
- package/dist/chunk-EVIEMZPA.cjs.map +0 -1
- package/dist/chunk-MHYN6XMP.js.map +0 -1
- package/dist/chunk-N624P3VO.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/datasets.ts"],"names":["coreFeatures","HTTPException","createRoute","paginationQuerySchema","listDatasetsResponseSchema","error","MastraError","handleError","createDatasetBodySchema","datasetResponseSchema","datasetIdPathParams","updateDatasetBodySchema","successResponseSchema","listItemsQuerySchema","listItemsResponseSchema","addItemBodySchema","datasetItemResponseSchema","datasetAndItemIdPathParams","updateItemBodySchema","listExperimentsResponseSchema","reviewSummaryResponseSchema","triggerExperimentBodySchema","experimentSummaryResponseSchema","requestContext","RequestContext","datasetAndExperimentIdPathParams","experimentResponseSchema","listExperimentResultsResponseSchema","experimentResultIdPathParams","updateExperimentResultBodySchema","experimentResultResponseSchema","compareExperimentsBodySchema","comparisonResponseSchema","listDatasetVersionsResponseSchema","listItemVersionsResponseSchema","datasetItemVersionPathParams","batchInsertItemsBodySchema","batchInsertItemsResponseSchema","batchDeleteItemsBodySchema","batchDeleteItemsResponseSchema","generateItemsBodySchema","generateItemsResponseSchema","resolveModelConfig","Agent","z","clusterFailuresBodySchema","clusterFailuresResponseSchema"],"mappings":";;;;;;;;;;;;;;AAsDA,SAAS,uBAAA,GAAgC;AACvC,EAAA,IAAI,CAACA,qBAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAAG;AACjC,IAAA,MAAM,IAAIC,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0CAA0C,CAAA;AAAA,EACpF;AACF;AAgBA,SAAS,wBAAwB,KAAA,EAA+C;AAC9E,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,uBAAA;AAClD;AAEA,SAAS,8BAA8B,KAAA,EAAqD;AAC1F,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,6BAAA;AAClD;AAMA,SAAS,4BAA4B,OAAA,EAAyB;AAC5D,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,mBAAA;AAAA,IACL,KAAK,sBAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT,KAAK,qBAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT;AACE,MAAA,OAAO,GAAA;AAAA;AAEb;AAMO,IAAM,sBAAsBC,6BAAA,CAAY;AAAA,EAC7C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkBC,uCAAA;AAAA,EAClB,cAAA,EAAgBC,4CAAA;AAAA,EAChB,OAAA,EAAS,mBAAA;AAAA,EACT,WAAA,EAAa,0CAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,GAAG,QAAO,KAAM;AACxC,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,EAAG,OAAA,EAAS,OAAA,IAAW,EAAA,EAAI,CAAA;AACrF,MAAA,OAAO;AAAA,QACL,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,SAASC,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,uBAAuBH,6BAAA,CAAY;AAAA,EAC9C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAYM,yCAAA;AAAA,EACZ,cAAA,EAAgBC,uCAAA;AAAA,EAChB,OAAA,EAAS,sBAAA;AAAA,EACT,WAAA,EAAa,qEAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,GAAG,QAAO,KAAM;AACxC,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM;AAAA,QACJ,IAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF,GAAI,MAAA;AAWJ,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,QACtC,IAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,UAAA,EAAW;AACpC,MAAA,OAAO,OAAA;AAAA,IACT,SAASJ,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,oBAAoBH,6BAAA,CAAY;AAAA,EAC3C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,sBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,cAAA,EAAgBD,wCAAsB,QAAA,EAAS;AAAA,EAC/C,OAAA,EAAS,mBAAA;AAAA,EACT,WAAA,EAAa,wCAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,WAAU,KAAM;AACxC,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,OAAQ,MAAM,GAAG,UAAA,EAAW;AAAA,IAC9B,SAASJ,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,uBAAuB,CAAA;AAAA,IACnD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,uBAAuBH,6BAAA,CAAY;AAAA,EAC9C,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,sBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAYC,yCAAA;AAAA,EACZ,cAAA,EAAgBF,uCAAA;AAAA,EAChB,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,6CAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM;AAAA,QACJ,IAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF,GAAI,MAAA;AAYJ,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO;AAAA,QAC7B,IAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAASJ,OAAA,EAAO;AACd,MAAA,IAAI,6BAAA,CAA8BA,OAAK,CAAA,EAAG;AACxC,QAAA,MAAM,IAAIJ,gCAAc,GAAA,EAAK;AAAA,UAC3B,SAASI,OAAA,CAAM,OAAA;AAAA,UACf,KAAA,EAAO,EAAE,YAAA,EAAcA,OAAA,CAAM,YAAA;AAAa,SAC3C,CAAA;AAAA,MACH;AACA,MAAA,IAAI,uBAAA,CAAwBA,OAAK,CAAA,EAAG;AAClC,QAAA,MAAM,IAAIJ,gCAAc,GAAA,EAAK;AAAA,UAC3B,SAASI,OAAA,CAAM,OAAA;AAAA,UACf,OAAO,EAAE,KAAA,EAAOA,QAAM,KAAA,EAAO,MAAA,EAAQA,QAAM,MAAA;AAAO,SACnD,CAAA;AAAA,MACH;AACA,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,uBAAuBH,6BAAA,CAAY;AAAA,EAC9C,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,sBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,cAAA,EAAgBE,uCAAA;AAAA,EAChB,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,qCAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,WAAU,KAAM;AACxC,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AAC3C,MAAA,MAAM,OAAO,QAAA,CAAS,MAAA,CAAO,EAAE,EAAA,EAAI,WAAW,CAAA;AAC9C,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAASP,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAMM,IAAM,mBAAmBH,6BAAA,CAAY;AAAA,EAC1C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,4BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,gBAAA,EAAkBG,sCAAA;AAAA,EAClB,cAAA,EAAgBC,yCAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa,kDAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAO,GAAI,MAAA;AAC3C,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,SAAA,CAAU;AAAA,QAChC,MAAM,IAAA,IAAQ,CAAA;AAAA,QACd,SAAS,OAAA,IAAW,EAAA;AAAA,QACpB,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,GAAG,OAAA,EAAS,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,OAAM,EAAE;AAAA,MAChH;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAC9D,SAAST,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiBH,6BAAA,CAAY;AAAA,EACxC,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,4BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAYK,mCAAA;AAAA,EACZ,cAAA,EAAgBC,2CAAA;AAAA,EAChB,OAAA,EAAS,qBAAA;AAAA,EACT,WAAA,EAAa,kEAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAO,WAAA,EAAa,cAAA,EAAgB,UAAU,MAAA,EAAQ,kBAAA,EAAoB,WAAU,GAAI,MAAA;AAShG,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,OAAO,MAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,KAAA,EAAO,WAAA,EAAa,cAAA,EAAgB,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,CAAA;AAAA,IACjH,SAASX,OAAA,EAAO;AACd,MAAA,IAAI,uBAAA,CAAwBA,OAAK,CAAA,EAAG;AAClC,QAAA,MAAM,IAAIJ,gCAAc,GAAA,EAAK;AAAA,UAC3B,SAASI,OAAA,CAAM,OAAA;AAAA,UACf,OAAO,EAAE,KAAA,EAAOA,QAAM,KAAA,EAAO,MAAA,EAAQA,QAAM,MAAA;AAAO,SACnD,CAAA;AAAA,MACH;AACA,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,8BAA8B,CAAA;AAAA,IAC1D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiBH,6BAAA,CAAY;AAAA,EACxC,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,oCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBe,4CAAA;AAAA,EACjB,cAAA,EAAgBD,4CAA0B,QAAA,EAAS;AAAA,EACnD,OAAA,EAAS,wBAAA;AAAA,EACT,WAAA,EAAa,6CAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAO,KAAM;AAChD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,OAAO,MAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,QAAQ,CAAA;AACxC,MAAA,IAAI,CAAC,IAAA,IAAS,IAAA,CAAa,SAAA,KAAc,SAAA,EAAW;AAClD,QAAA,MAAM,IAAIf,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,gBAAA,EAAmB,MAAM,IAAI,CAAA;AAAA,MACvE;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,4BAA4B,CAAA;AAAA,IACxD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,oBAAoBH,6BAAA,CAAY;AAAA,EAC3C,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,oCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBe,4CAAA;AAAA,EACjB,UAAA,EAAYC,sCAAA;AAAA,EACZ,cAAA,EAAgBF,2CAAA;AAAA,EAChB,OAAA,EAAS,qBAAA;AAAA,EACT,WAAA,EAAa,0DAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,WAAW,MAAA,EAAQ,GAAG,QAAO,KAAM;AAC3D,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,gBAAgB,QAAA,EAAU,kBAAA,EAAoB,WAAU,GAAI,MAAA;AAQxF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AAEtD,MAAA,MAAM,WAAW,MAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,QAAQ,CAAA;AAC5C,MAAA,IAAI,CAAC,QAAA,IAAa,QAAA,CAAiB,SAAA,KAAc,SAAA,EAAW;AAC1D,QAAA,MAAM,IAAIf,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,gBAAA,EAAmB,MAAM,IAAI,CAAA;AAAA,MACvE;AACA,MAAA,OAAO,MAAM,GAAG,UAAA,CAAW;AAAA,QACzB,MAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAA;AAAA,QACA,kBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAASI,OAAA,EAAO;AACd,MAAA,IAAI,uBAAA,CAAwBA,OAAK,CAAA,EAAG;AAClC,QAAA,MAAM,IAAIJ,gCAAc,GAAA,EAAK;AAAA,UAC3B,SAASI,OAAA,CAAM,OAAA;AAAA,UACf,OAAO,EAAE,KAAA,EAAOA,QAAM,KAAA,EAAO,MAAA,EAAQA,QAAM,MAAA;AAAO,SACnD,CAAA;AAAA,MACH;AACA,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,oBAAoBH,6BAAA,CAAY;AAAA,EAC3C,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,oCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBe,4CAAA;AAAA,EACjB,cAAA,EAAgBL,uCAAA;AAAA,EAChB,OAAA,EAAS,qBAAA;AAAA,EACT,WAAA,EAAa,wBAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAO,KAAM;AAChD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,WAAW,MAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,QAAQ,CAAA;AAC5C,MAAA,IAAI,CAAC,QAAA,IAAa,QAAA,CAAiB,SAAA,KAAc,SAAA,EAAW;AAC1D,QAAA,MAAM,IAAIX,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,gBAAA,EAAmB,MAAM,IAAI,CAAA;AAAA,MACvE;AACA,MAAA,MAAM,EAAA,CAAG,UAAA,CAAW,EAAE,MAAA,EAAQ,CAAA;AAC9B,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAMM,IAAM,6BAA6BH,6BAAA,CAAY;AAAA,EACpD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkBC,uCAAA;AAAA,EAClB,cAAA,EAAgBgB,+CAAA;AAAA,EAChB,OAAA,EAAS,sBAAA;AAAA,EACT,WAAA,EAAa,iEAAA;AAAA,EACb,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,EACpB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,GAAG,QAAO,KAAM;AACxC,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAIlB,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0BAA0B,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAC7D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAIA,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,qCAAqC,CAAA;AAAA,MAC/E;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,eAAA,CAAgB;AAAA,QACpD,YAAY,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,OAAA,EAAS,WAAW,EAAA;AAAG,OACvD,CAAA;AACD,MAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAC1E,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kCAAkCH,6BAAA,CAAY;AAAA,EACzD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,6BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,cAAA,EAAgBkB,6CAAA;AAAA,EAChB,OAAA,EAAS,wCAAA;AAAA,EACT,WAAA,EAAa,2FAAA;AAAA,EACb,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,EACpB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAO,KAAM;AAC7B,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAInB,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0BAA0B,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAC7D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAIA,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,qCAAqC,CAAA;AAAA,MAC/E;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,gBAAA,EAAiB;AACvD,MAAA,OAAO,EAAE,MAAA,EAAO;AAAA,IAClB,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,8BAA8B,CAAA;AAAA,IAC1D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,yBAAyBH,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,gBAAA,EAAkBP,uCAAA;AAAA,EAClB,cAAA,EAAgBgB,+CAAA;AAAA,EAChB,OAAA,EAAS,8BAAA;AAAA,EACT,WAAA,EAAa,yDAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,eAAA,CAAgB,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,EAAG,OAAA,EAAS,OAAA,IAAW,EAAA,EAAI,CAAA;AACnF,MAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAC1E,SAASd,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,2BAA2BH,6BAAA,CAAY;AAAA,EAClD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAYW,6CAAA;AAAA,EACZ,cAAA,EAAgBC,iDAAA;AAAA,EAChB,OAAA,EAAS,0BAAA;AAAA,EACT,WAAA,EACE,kJAAA;AAAA,EACF,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM;AAAA,QACJ,UAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,EAAgB,iBAAA;AAAA,QAChB;AAAA,OACF,GAAI,MAAA;AAYJ,MAAA,MAAMC,gBAAA,GAAiB,iBAAA,YAA6BC,6BAAA,GAAiB,iBAAA,CAAkB,GAAA,GAAM,iBAAA;AAC7F,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,oBAAA,CAAqB;AAAA,QAC3C,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,OAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,wBACAD,gBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,QACjC,cAAA,EAAgB,CAAA;AAAA,QAChB,WAAA,EAAa,CAAA;AAAA,QACb,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,WAAA,EAAa,IAAA;AAAA,QACb,SAAS;AAAC,OACZ;AAAA,IACF,SAASlB,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,uBAAuBH,6BAAA,CAAY;AAAA,EAC9C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,gDAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBuB,kDAAA;AAAA,EACjB,cAAA,EAAgBC,2CAAyB,QAAA,EAAS;AAAA,EAClD,OAAA,EAAS,sBAAA;AAAA,EACT,WAAA,EAAa,2CAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,cAAa,KAAM;AACtD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAM,MAAM,EAAA,CAAG,aAAA,CAAc,EAAE,cAAc,CAAA;AACnD,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,SAAA,KAAc,SAAA,EAAW;AACvC,QAAA,MAAM,IAAIzB,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,sBAAA,EAAyB,YAAY,IAAI,CAAA;AAAA,MACnF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,0BAA0B,CAAA;AAAA,IACtD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gCAAgCH,6BAAA,CAAY;AAAA,EACvD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,wDAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBuB,kDAAA;AAAA,EACjB,gBAAA,EAAkBtB,uCAAA;AAAA,EAClB,cAAA,EAAgBwB,qDAAA;AAAA,EAChB,OAAA,EAAS,yBAAA;AAAA,EACT,WAAA,EAAa,wDAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,WAAW,YAAA,EAAc,GAAG,QAAO,KAAM;AACjE,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AAEtD,MAAA,MAAM,MAAM,MAAM,EAAA,CAAG,aAAA,CAAc,EAAE,cAAc,CAAA;AACnD,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,SAAA,KAAc,SAAA,EAAW;AACvC,QAAA,MAAM,IAAI1B,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,sBAAA,EAAyB,YAAY,IAAI,CAAA;AAAA,MACnF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,qBAAA,CAAsB,EAAE,YAAA,EAAc,IAAA,EAAM,IAAA,IAAQ,CAAA,EAAG,OAAA,EAAS,OAAA,IAAW,EAAA,EAAI,CAAA;AACvG,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,YAAA,EAAc,IAAA,EAAM,GAAG,MAAK,MAAO,EAAE,YAAA,EAAc,GAAG,MAAK,CAAE,CAAA;AAAA,QAC5F,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,kCAAkC,CAAA;AAAA,IAC9D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iCAAiCH,6BAAA,CAAY;AAAA,EACxD,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,kEAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB0B,8CAAA;AAAA,EACjB,UAAA,EAAYC,kDAAA;AAAA,EACZ,cAAA,EAAgBC,gDAAA;AAAA,EAChB,OAAA,EAAS,6BAAA;AAAA,EACT,WAAA,EAAa,wDAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,UAAU,YAAA,EAAc,GAAG,QAAO,KAAM;AAChE,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI7B,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0BAA0B,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAC7D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAIA,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,qCAAqC,CAAA;AAAA,MAC/E;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,sBAAA,CAAuB;AAAA,QAC3D,EAAA,EAAI,QAAA;AAAA,QACJ,YAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO;AAAA,OACd,CAAA;AAED,MAAA,OAAO,MAAA;AAAA,IACT,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,kCAAkC,CAAA;AAAA,IAC9D;AAAA,EACF;AACF,CAAC;AAMM,IAAM,4BAA4BH,6BAAA,CAAY;AAAA,EACnD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,8BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAYqB,8CAAA;AAAA,EACZ,cAAA,EAAgBC,0CAAA;AAAA,EAChB,OAAA,EAAS,yBAAA;AAAA,EACT,WAAA,EAAa,sDAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAe,aAAA,EAAc,GAAI,MAAA;AAKzC,MAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,kBAAA,CAAmB;AAAA,QACtD,aAAA,EAAe,CAAC,aAAA,EAAe,aAAa,CAAA;AAAA,QAC5C,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS3B,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAMM,IAAM,8BAA8BH,6BAAA,CAAY;AAAA,EACrD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,+BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,gBAAA,EAAkBP,uCAAA;AAAA,EAClB,cAAA,EAAgB8B,mDAAA;AAAA,EAChB,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,0DAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,EAAG,OAAA,EAAS,OAAA,IAAW,EAAA,EAAI,CAAA;AAChF,MAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IACpE,SAAS5B,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,gCAAgC,CAAA;AAAA,IAC5D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,2BAA2BH,6BAAA,CAAY;AAAA,EAClD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,4CAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBe,4CAAA;AAAA,EACjB,cAAA,EAAgBiB,gDAAA;AAAA,EAChB,OAAA,EAAS,kBAAA;AAAA,EACT,WAAA,EAAa,wEAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAO,KAAM;AAChD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,OAAO,MAAM,EAAA,CAAG,cAAA,CAAe,EAAE,QAAQ,CAAA;AAE/C,MAAA,IAAI,KAAK,MAAA,GAAS,CAAA,IAAK,KAAK,CAAC,CAAA,EAAG,cAAc,SAAA,EAAW;AACvD,QAAA,MAAM,IAAIjC,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA;AAAA,MAClF;AACA,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,4BAA4B,CAAA;AAAA,IACxD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,yBAAyBH,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,6DAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBiC,8CAAA;AAAA,EACjB,cAAA,EAAgBnB,4CAA0B,QAAA,EAAS;AAAA,EACnD,OAAA,EAAS,sCAAA;AAAA,EACT,WAAA,EAAa,8DAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,MAAA,EAAQ,gBAAe,KAAM;AAChE,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,gBAAgB,CAAA;AACjE,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAIf,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,QAAQ,MAAM,CAAA,sBAAA,EAAyB,cAAc,CAAA,CAAA,EAAI,CAAA;AAAA,MACnG;AACA,MAAA,IAAK,IAAA,CAAa,cAAc,SAAA,EAAW;AACzC,QAAA,MAAM,IAAIA,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA;AAAA,MAClF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAASI,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,4BAA4B,CAAA;AAAA,IACxD;AAAA,EACF;AACF,CAAC;AAMM,IAAM,2BAA2BH,6BAAA,CAAY;AAAA,EAClD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAY0B,4CAAA;AAAA,EACZ,cAAA,EAAgBC,gDAAA;AAAA,EAChB,OAAA,EAAS,+BAAA;AAAA,EACT,WAAA,EAAa,iFAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAUlB,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,aAAa,MAAM,EAAA,CAAG,QAAA,CAAS,EAAE,OAAO,CAAA;AAC9C,MAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAW,MAAA,EAAO;AAAA,IACvD,SAAShC,OAAA,EAAO;AACd,MAAA,IAAI,uBAAA,CAAwBA,OAAK,CAAA,EAAG;AAClC,QAAA,MAAM,IAAIJ,gCAAc,GAAA,EAAK;AAAA,UAC3B,SAASI,OAAA,CAAM,OAAA;AAAA,UACf,OAAO,EAAE,KAAA,EAAOA,QAAM,KAAA,EAAO,MAAA,EAAQA,QAAM,MAAA;AAAO,SACnD,CAAA;AAAA,MACH;AACA,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,2BAA2BH,6BAAA,CAAY;AAAA,EAClD,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAY4B,4CAAA;AAAA,EACZ,cAAA,EAAgBC,gDAAA;AAAA,EAChB,OAAA,EAAS,iCAAA;AAAA,EACT,WAAA,EAAa,sFAAA;AAAA,EACb,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,SAAA,EAAW,GAAG,QAAO,KAAM;AACnD,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,EAAA,CAAG,WAAA,CAAY,EAAE,OAAA,EAAS,CAAA;AAChC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,QAAQ,MAAA,EAAO;AAAA,IACvD,SAASlC,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC;AAMD,IAAM,4BAAA,GAA+B,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,iCAAA,CAAA;AAc9B,IAAM,uBAAuBH,6BAAA,CAAY;AAAA,EAC9C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,qCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiBQ,qCAAA;AAAA,EACjB,UAAA,EAAY8B,yCAAA;AAAA,EACZ,cAAA,EAAgBC,6CAAA;AAAA,EAChB,OAAA,EAAS,iCAAA;AAAA,EACT,WAAA,EACE,2LAAA;AAAA,EACF,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,WAAW,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAa,KAAM;AAC9E,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,EAAE,EAAA,EAAI,WAAW,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,UAAA,EAAW;AAGpC,MAAA,MAAM,KAAA,GAAQ,MAAMC,sBAAA,CAAmB,OAAA,EAAS,QAAW,MAAM,CAAA;AAGjE,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,QAAQ,WAAA,GAAc,CAAA;AAAA,EAAkB,KAAK,SAAA,CAAU,OAAA,CAAQ,aAAa,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA,GAAK,IAAA;AAAA,QACzF,QAAQ,iBAAA,GACJ,CAAA;AAAA,EAAyB,KAAK,SAAA,CAAU,OAAA,CAAQ,mBAAmB,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA,GAC3E;AAAA,OACN,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,MAAM,CAAA;AAEd,MAAA,MAAM,cAAA,GAAiB,IAAIC,WAAA,CAAM;AAAA,QAC/B,EAAA,EAAI,wBAAA;AAAA,QACJ,IAAA,EAAM,wBAAA;AAAA,QACN,YAAA,EAAc,4BAAA;AAAA,QACd;AAAA,OACD,CAAA;AAKD,MAAA,MAAM,UAAA,GAAaC,MAAE,MAAA,CAAO;AAAA,QAC1B,KAAA,EAAOA,KAAA,CACJ,MAAA,EAAO,CACP,SAAS,gGAAgG,CAAA;AAAA,QAC5G,aAAaA,KAAA,CACV,MAAA,GACA,QAAA,EAAS,CACT,SAAS,uEAAuE;AAAA,OACpF,CAAA;AACD,MAAA,MAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA,QAC5B,KAAA,EAAOA,MAAE,KAAA,CAAM,UAAU,EAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,KAAK;AAAA,OAC5C,CAAA;AAGD,MAAA,MAAM,oBAAoB,EAAC;AAC3B,MAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,QAAA,iBAAA,CAAkB,IAAA,CAAK,CAAA,mBAAA,EAAsB,YAAA,CAAa,WAAW,CAAA,CAAE,CAAA;AAAA,MACzE;AACA,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,iBAAA,CAAkB,IAAA,CAAK,CAAA;AAAA,EAAyB,YAAA,CAAa,YAAY,CAAA,CAAE,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,YAAA,EAAc,OAAO,MAAA,EAAQ;AAC/B,QAAA,iBAAA,CAAkB,KAAK,CAAA,aAAA,EAAgB,YAAA,CAAa,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACxE;AACA,MAAA,MAAM,sBAAsB,iBAAA,CAAkB,MAAA,GAAS,IAAI,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAE5F,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,CAAA,iBAAA,EAAoB,KAAK,CAAA,iCAAA,EAAoC,OAAA,CAAQ,IAAI,CAAA,EAAA,CAAA;AAAA,QACzE,OAAA,CAAQ,WAAA,GAAc,CAAA,qBAAA,EAAwB,OAAA,CAAQ,WAAW,CAAA,CAAA,GAAK,IAAA;AAAA,QACtE,mBAAA,GAAsB,CAAA;AAAA,EAA0B,mBAAmB,CAAA,CAAA,GAAK,IAAA;AAAA,QACxE,aAAA,IAAiB,IAAA;AAAA,QACjB,mBAAmB,MAAM,CAAA,CAAA;AAAA,QACzB,kBAAkB,KAAK,CAAA,OAAA;AAAA,OACzB,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,MAAM,CAAA;AAEd,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAA,CAAS,WAAA,EAAa;AAAA,QACxD,gBAAA,EAAkB,EAAE,MAAA,EAAQ,YAAA;AAAa,OAC1C,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA;AAG/B,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AACxC,QAAA,IAAI,QAAiB,IAAA,CAAK,KAAA;AAC1B,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,IAAI,cAAuB,IAAA,CAAK,WAAA;AAChC,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,IAAI;AACF,YAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,UAC3C,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAO,EAAE,OAAO,WAAA,EAAY;AAAA,MAC9B,CAAC,CAAA;AAED,MAAA,OAAO,EAAE,KAAA,EAAM;AAAA,IACjB,SAASvC,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,gCAAgC,CAAA;AAAA,IAC5D;AAAA,EACF;AACF,CAAC;AAMD,IAAM,8BAAA,GAAiC,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sGAAA,CAAA;AAmBhC,IAAM,yBAAyBH,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,4BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY2C,2CAAA;AAAA,EACZ,cAAA,EAAgBC,+CAAA;AAAA,EAChB,OAAA,EAAS,sCAAA;AAAA,EACT,WAAA,EACE,kHAAA;AAAA,EACF,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,EACjB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAO,aAAA,EAAe,QAAO,KAAM;AACpE,IAAA,uBAAA,EAAwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAMJ,sBAAA,CAAmB,OAAA,EAAS,QAAW,MAAM,CAAA;AAEjE,MAAA,MAAM,YAAA,GAAe,IAAIC,WAAA,CAAM;AAAA,QAC7B,EAAA,EAAI,0BAAA;AAAA,QACJ,IAAA,EAAM,0BAAA;AAAA,QACN,YAAA,EAAc,8BAAA;AAAA,QACd;AAAA,OACD,CAAA;AAED,MAAA,MAAM,YAAA,GAAeC,MAAE,MAAA,CAAO;AAAA,QAC5B,UAAUA,KAAA,CAAE,KAAA;AAAA,UACVA,MAAE,MAAA,CAAO;AAAA,YACP,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,YACb,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,YAChB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,YACtB,OAAA,EAASA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ;AAAA,WAC5B;AAAA,SACH;AAAA,QACA,cAAcA,KAAA,CAAE,KAAA;AAAA,UACdA,MAAE,MAAA,CAAO;AAAA,YACP,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,YACjB,IAAA,EAAMA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA;AAAA,YACxB,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mDAAmD;AAAA,WAChF;AAAA;AACH,OACD,CAAA;AAED,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AAC3C,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAChD,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AACxG,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,IAAA,CAAK,WAAW,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAC5G,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM;AACnD,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,QACnG;AACA,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,IAAA,CAAK,WAAW,IAAA,EAAM;AACrD,UAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,UAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACrD,UAAA,KAAA,CAAM,KAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QAC/D;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,IAAI,WAAA,GAAc,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,CAAA;;AAAA,EAA8E,aAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAEvJ,MAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAC7C,QAAA,WAAA,IAAe;;AAAA,gDAAA,EAAuD,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAChG;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,WAAA,IAAe;;AAAA,2CAAA,EAAkD,MAAM,CAAA,CAAA;AAAA,MACzE;AAEA,MAAA,WAAA,IAAe;;AAAA,mQAAA,CAAA;AAEf,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,QAAA,CAAS,WAAA,EAAa;AAAA,QACtD,gBAAA,EAAkB,EAAE,MAAA,EAAQ,YAAA;AAAa,OAC1C,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA;AAC/B,MAAA,OAAO,EAAE,UAAU,SAAA,CAAU,QAAA,EAAU,cAAc,SAAA,CAAU,YAAA,IAAgB,EAAC,EAAE;AAAA,IACpF,SAASvC,OAAA,EAAO;AACd,MAAA,IAAIA,mBAAiBC,iBAAA,EAAa;AAChC,QAAA,MAAM,IAAIL,+BAAA,CAAc,2BAAA,CAA4BI,OAAA,CAAM,EAAE,GAAiB,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACzG;AACA,MAAA,OAAOE,6BAAA,CAAYF,SAAO,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC","file":"chunk-PJLW25AQ.cjs","sourcesContent":["import { Agent } from '@mastra/core/agent';\nimport { MastraError } from '@mastra/core/error';\nimport { coreFeatures } from '@mastra/core/features';\nimport { resolveModelConfig } from '@mastra/core/llm';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { DatasetItemSource, DatasetItemToolMock, TargetType } from '@mastra/core/storage';\nimport { z } from 'zod';\nimport { HTTPException } from '../http-exception';\nimport type { StatusCode } from '../http-exception';\nimport { successResponseSchema } from '../schemas/common';\nimport {\n datasetIdPathParams,\n datasetAndExperimentIdPathParams,\n experimentResultIdPathParams,\n datasetAndItemIdPathParams,\n datasetItemVersionPathParams,\n paginationQuerySchema,\n listItemsQuerySchema,\n createDatasetBodySchema,\n updateDatasetBodySchema,\n addItemBodySchema,\n updateItemBodySchema,\n triggerExperimentBodySchema,\n compareExperimentsBodySchema,\n batchInsertItemsBodySchema,\n batchDeleteItemsBodySchema,\n generateItemsBodySchema,\n generateItemsResponseSchema,\n clusterFailuresBodySchema,\n clusterFailuresResponseSchema,\n datasetResponseSchema,\n datasetItemResponseSchema,\n experimentResponseSchema,\n experimentResultResponseSchema,\n experimentSummaryResponseSchema,\n comparisonResponseSchema,\n listDatasetsResponseSchema,\n listItemsResponseSchema,\n listExperimentsResponseSchema,\n listExperimentResultsResponseSchema,\n listDatasetVersionsResponseSchema,\n listItemVersionsResponseSchema,\n batchInsertItemsResponseSchema,\n batchDeleteItemsResponseSchema,\n updateExperimentResultBodySchema,\n reviewSummaryResponseSchema,\n} from '../schemas/datasets';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n// ============================================================================\n// Feature gate + local type guards\n// ============================================================================\n\nfunction assertDatasetsAvailable(): void {\n if (!coreFeatures.has('datasets')) {\n throw new HTTPException(501, { message: 'Datasets require @mastra/core >= 1.4.0' });\n }\n}\n\ninterface SchemaValidationLike extends Error {\n field: 'input' | 'groundTruth';\n errors: Array<{ path: string; code: string; message: string }>;\n}\n\ninterface SchemaUpdateValidationLike extends Error {\n failingItems: Array<{\n index: number;\n data: unknown;\n field: 'input' | 'groundTruth';\n errors: Array<{ path: string; code: string; message: string }>;\n }>;\n}\n\nfunction isSchemaValidationError(error: unknown): error is SchemaValidationLike {\n return error instanceof Error && error.name === 'SchemaValidationError';\n}\n\nfunction isSchemaUpdateValidationError(error: unknown): error is SchemaUpdateValidationLike {\n return error instanceof Error && error.name === 'SchemaUpdateValidationError';\n}\n\n// ============================================================================\n// Helper: Map MastraError IDs to HTTP status codes\n// ============================================================================\n\nfunction getHttpStatusForMastraError(errorId: string): number {\n switch (errorId) {\n case 'DATASET_NOT_FOUND':\n case 'EXPERIMENT_NOT_FOUND':\n return 404;\n case 'EXPERIMENT_NO_ITEMS':\n return 400;\n default:\n return 500;\n }\n}\n\n// ============================================================================\n// Dataset CRUD Routes\n// ============================================================================\n\nexport const LIST_DATASETS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets',\n responseType: 'json',\n queryParamSchema: paginationQuerySchema,\n responseSchema: listDatasetsResponseSchema,\n summary: 'List all datasets',\n description: 'Returns a paginated list of all datasets',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage } = params;\n const result = await mastra.datasets.list({ page: page ?? 0, perPage: perPage ?? 10 });\n return {\n datasets: result.datasets as any,\n pagination: result.pagination,\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing datasets');\n }\n },\n});\n\nexport const CREATE_DATASET_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets',\n responseType: 'json',\n bodySchema: createDatasetBodySchema,\n responseSchema: datasetResponseSchema,\n summary: 'Create a new dataset',\n description: 'Creates a new dataset with the specified name and optional metadata',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n assertDatasetsAvailable();\n try {\n const {\n name,\n description,\n metadata,\n inputSchema,\n groundTruthSchema,\n requestContextSchema,\n targetType,\n targetIds,\n scorerIds,\n } = params as {\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n inputSchema?: Record<string, unknown> | null;\n groundTruthSchema?: Record<string, unknown> | null;\n requestContextSchema?: Record<string, unknown> | null;\n targetType?: TargetType;\n targetIds?: string[];\n scorerIds?: string[];\n };\n const ds = await mastra.datasets.create({\n name,\n description,\n metadata,\n inputSchema,\n groundTruthSchema,\n requestContextSchema,\n targetType,\n targetIds,\n scorerIds,\n });\n const details = await ds.getDetails();\n return details as any;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error creating dataset');\n }\n },\n});\n\nexport const GET_DATASET_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n responseSchema: datasetResponseSchema.nullable(),\n summary: 'Get dataset by ID',\n description: 'Returns details for a specific dataset',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n return (await ds.getDetails()) as any;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error getting dataset');\n }\n },\n});\n\nexport const UPDATE_DATASET_ROUTE = createRoute({\n method: 'PATCH',\n path: '/datasets/:datasetId',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: updateDatasetBodySchema,\n responseSchema: datasetResponseSchema,\n summary: 'Update dataset',\n description: 'Updates a dataset with the specified fields',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const {\n name,\n description,\n metadata,\n inputSchema,\n groundTruthSchema,\n requestContextSchema,\n tags,\n targetType,\n targetIds,\n scorerIds,\n } = params as {\n name?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n inputSchema?: Record<string, unknown> | null;\n groundTruthSchema?: Record<string, unknown> | null;\n requestContextSchema?: Record<string, unknown> | null;\n tags?: string[];\n targetType?: TargetType;\n targetIds?: string[];\n scorerIds?: string[] | null;\n };\n const ds = await mastra.datasets.get({ id: datasetId });\n const result = await ds.update({\n name,\n description,\n metadata,\n inputSchema,\n groundTruthSchema,\n requestContextSchema,\n tags,\n targetType,\n targetIds,\n scorerIds,\n });\n return result as any;\n } catch (error) {\n if (isSchemaUpdateValidationError(error)) {\n throw new HTTPException(400, {\n message: error.message,\n cause: { failingItems: error.failingItems },\n });\n }\n if (isSchemaValidationError(error)) {\n throw new HTTPException(400, {\n message: error.message,\n cause: { field: error.field, errors: error.errors },\n });\n }\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error updating dataset');\n }\n },\n});\n\nexport const DELETE_DATASET_ROUTE = createRoute({\n method: 'DELETE',\n path: '/datasets/:datasetId',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n responseSchema: successResponseSchema,\n summary: 'Delete dataset',\n description: 'Deletes a dataset and all its items',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId }) => {\n assertDatasetsAvailable();\n try {\n await mastra.datasets.get({ id: datasetId }); // validates existence\n await mastra.datasets.delete({ id: datasetId });\n return { success: true };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error deleting dataset');\n }\n },\n});\n\n// ============================================================================\n// Item CRUD Routes\n// ============================================================================\n\nexport const LIST_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/items',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n queryParamSchema: listItemsQuerySchema,\n responseSchema: listItemsResponseSchema,\n summary: 'List dataset items',\n description: 'Returns a paginated list of items in the dataset',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage, version, search } = params;\n const ds = await mastra.datasets.get({ id: datasetId });\n const result = await ds.listItems({\n page: page ?? 0,\n perPage: perPage ?? 10,\n version,\n search,\n });\n // When version is specified, result is DatasetItem[] (flat). Otherwise paginated.\n if (Array.isArray(result)) {\n return { items: result, pagination: { total: result.length, page: 0, perPage: result.length, hasMore: false } };\n }\n return { items: result.items, pagination: result.pagination };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing dataset items');\n }\n },\n});\n\nexport const ADD_ITEM_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/:datasetId/items',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: addItemBodySchema,\n responseSchema: datasetItemResponseSchema,\n summary: 'Add item to dataset',\n description: 'Adds a new item to the dataset (auto-increments dataset version)',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { input, groundTruth, requestContext, metadata, source, expectedTrajectory, toolMocks } = params as {\n input: unknown;\n groundTruth?: unknown;\n requestContext?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n source?: DatasetItemSource;\n expectedTrajectory?: unknown;\n toolMocks?: DatasetItemToolMock[];\n };\n const ds = await mastra.datasets.get({ id: datasetId });\n return await ds.addItem({ input, groundTruth, requestContext, metadata, source, expectedTrajectory, toolMocks });\n } catch (error) {\n if (isSchemaValidationError(error)) {\n throw new HTTPException(400, {\n message: error.message,\n cause: { field: error.field, errors: error.errors },\n });\n }\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error adding item to dataset');\n }\n },\n});\n\nexport const GET_ITEM_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/items/:itemId',\n responseType: 'json',\n pathParamSchema: datasetAndItemIdPathParams,\n responseSchema: datasetItemResponseSchema.nullable(),\n summary: 'Get dataset item by ID',\n description: 'Returns details for a specific dataset item',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, itemId }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const item = await ds.getItem({ itemId });\n if (!item || (item as any).datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Item not found: ${itemId}` });\n }\n return item as any;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error getting dataset item');\n }\n },\n});\n\nexport const UPDATE_ITEM_ROUTE = createRoute({\n method: 'PATCH',\n path: '/datasets/:datasetId/items/:itemId',\n responseType: 'json',\n pathParamSchema: datasetAndItemIdPathParams,\n bodySchema: updateItemBodySchema,\n responseSchema: datasetItemResponseSchema,\n summary: 'Update dataset item',\n description: 'Updates a dataset item (auto-increments dataset version)',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, itemId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { input, groundTruth, requestContext, metadata, expectedTrajectory, toolMocks } = params as {\n input?: unknown;\n groundTruth?: unknown;\n requestContext?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n expectedTrajectory?: unknown;\n toolMocks?: DatasetItemToolMock[];\n };\n const ds = await mastra.datasets.get({ id: datasetId });\n // Check if item exists and belongs to dataset\n const existing = await ds.getItem({ itemId });\n if (!existing || (existing as any).datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Item not found: ${itemId}` });\n }\n return await ds.updateItem({\n itemId,\n input,\n groundTruth,\n requestContext,\n metadata,\n expectedTrajectory,\n toolMocks,\n });\n } catch (error) {\n if (isSchemaValidationError(error)) {\n throw new HTTPException(400, {\n message: error.message,\n cause: { field: error.field, errors: error.errors },\n });\n }\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error updating dataset item');\n }\n },\n});\n\nexport const DELETE_ITEM_ROUTE = createRoute({\n method: 'DELETE',\n path: '/datasets/:datasetId/items/:itemId',\n responseType: 'json',\n pathParamSchema: datasetAndItemIdPathParams,\n responseSchema: successResponseSchema,\n summary: 'Delete dataset item',\n description: 'Deletes a dataset item',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, itemId }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const existing = await ds.getItem({ itemId });\n if (!existing || (existing as any).datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Item not found: ${itemId}` });\n }\n await ds.deleteItem({ itemId });\n return { success: true };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error deleting dataset item');\n }\n },\n});\n\n// ============================================================================\n// Experiment Operations Routes\n// ============================================================================\n\nexport const LIST_ALL_EXPERIMENTS_ROUTE = createRoute({\n method: 'GET',\n path: '/experiments',\n responseType: 'json',\n queryParamSchema: paginationQuerySchema,\n responseSchema: listExperimentsResponseSchema,\n summary: 'List all experiments',\n description: 'Returns a paginated list of all experiments across all datasets',\n tags: ['Experiments'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage } = params;\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n const experimentsStore = await storage.getStore('experiments');\n if (!experimentsStore) {\n throw new HTTPException(500, { message: 'Experiments storage not available' });\n }\n const result = await experimentsStore.listExperiments({\n pagination: { page: page ?? 0, perPage: perPage ?? 20 },\n });\n return { experiments: result.experiments, pagination: result.pagination };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing experiments');\n }\n },\n});\n\nexport const EXPERIMENT_REVIEW_SUMMARY_ROUTE = createRoute({\n method: 'GET',\n path: '/experiments/review-summary',\n responseType: 'json',\n responseSchema: reviewSummaryResponseSchema,\n summary: 'Get review summary for all experiments',\n description: 'Returns review status counts (needs-review, reviewed, complete) aggregated per experiment',\n tags: ['Experiments'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n assertDatasetsAvailable();\n try {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n const experimentsStore = await storage.getStore('experiments');\n if (!experimentsStore) {\n throw new HTTPException(500, { message: 'Experiments storage not available' });\n }\n const counts = await experimentsStore.getReviewSummary();\n return { counts };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error getting review summary');\n }\n },\n});\n\nexport const LIST_EXPERIMENTS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/experiments',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n queryParamSchema: paginationQuerySchema,\n responseSchema: listExperimentsResponseSchema,\n summary: 'List experiments for dataset',\n description: 'Returns a paginated list of experiments for the dataset',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage } = params;\n const ds = await mastra.datasets.get({ id: datasetId });\n const result = await ds.listExperiments({ page: page ?? 0, perPage: perPage ?? 10 });\n return { experiments: result.experiments, pagination: result.pagination };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing experiments');\n }\n },\n});\n\nexport const TRIGGER_EXPERIMENT_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/:datasetId/experiments',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: triggerExperimentBodySchema,\n responseSchema: experimentSummaryResponseSchema,\n summary: 'Trigger a new experiment',\n description:\n 'Triggers a new experiment on the dataset against the specified target. Returns immediately with pending status; execution happens in background.',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const {\n targetType,\n targetId,\n scorerIds,\n version,\n agentVersion,\n maxConcurrency,\n requestContext: rawRequestContext,\n versions,\n } = params as {\n targetType: 'agent' | 'workflow' | 'scorer';\n targetId: string;\n scorerIds?: string[];\n version?: number;\n agentVersion?: string;\n maxConcurrency?: number;\n requestContext?: Record<string, unknown> | RequestContext;\n versions?: { agents?: Record<string, { versionId: string } | { status: 'draft' | 'published' }> };\n };\n // The adapter middleware merges body + query requestContext into a RequestContext instance.\n // startExperimentAsync expects a plain Record, so convert it.\n const requestContext = rawRequestContext instanceof RequestContext ? rawRequestContext.all : rawRequestContext;\n const ds = await mastra.datasets.get({ id: datasetId });\n const result = await ds.startExperimentAsync({\n targetType,\n targetId,\n scorers: scorerIds,\n version,\n agentVersion,\n maxConcurrency,\n requestContext,\n versions,\n });\n // Return shape matching experimentSummaryResponseSchema\n return {\n experimentId: result.experimentId,\n status: result.status,\n totalItems: result.totalItems ?? 0,\n succeededCount: 0,\n failedCount: 0,\n startedAt: new Date(),\n completedAt: null,\n results: [],\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error triggering experiment');\n }\n },\n});\n\nexport const GET_EXPERIMENT_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/experiments/:experimentId',\n responseType: 'json',\n pathParamSchema: datasetAndExperimentIdPathParams,\n responseSchema: experimentResponseSchema.nullable(),\n summary: 'Get experiment by ID',\n description: 'Returns details for a specific experiment',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, experimentId }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const run = await ds.getExperiment({ experimentId });\n if (!run || run.datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Experiment not found: ${experimentId}` });\n }\n return run;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error getting experiment');\n }\n },\n});\n\nexport const LIST_EXPERIMENT_RESULTS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/experiments/:experimentId/results',\n responseType: 'json',\n pathParamSchema: datasetAndExperimentIdPathParams,\n queryParamSchema: paginationQuerySchema,\n responseSchema: listExperimentResultsResponseSchema,\n summary: 'List experiment results',\n description: 'Returns a paginated list of results for the experiment',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, experimentId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage } = params;\n const ds = await mastra.datasets.get({ id: datasetId });\n // Validate experiment belongs to dataset\n const run = await ds.getExperiment({ experimentId });\n if (!run || run.datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Experiment not found: ${experimentId}` });\n }\n const result = await ds.listExperimentResults({ experimentId, page: page ?? 0, perPage: perPage ?? 10 });\n return {\n results: result.results.map(({ experimentId: _eid, ...rest }) => ({ experimentId, ...rest })),\n pagination: result.pagination,\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing experiment results');\n }\n },\n});\n\nexport const UPDATE_EXPERIMENT_RESULT_ROUTE = createRoute({\n method: 'PATCH',\n path: '/datasets/:datasetId/experiments/:experimentId/results/:resultId',\n responseType: 'json',\n pathParamSchema: experimentResultIdPathParams,\n bodySchema: updateExperimentResultBodySchema,\n responseSchema: experimentResultResponseSchema,\n summary: 'Update an experiment result',\n description: 'Updates the status and/or tags on an experiment result',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, resultId, experimentId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n const experimentsStore = await storage.getStore('experiments');\n if (!experimentsStore) {\n throw new HTTPException(500, { message: 'Experiments storage not available' });\n }\n\n const result = await experimentsStore.updateExperimentResult({\n id: resultId,\n experimentId,\n status: params.status,\n tags: params.tags,\n });\n\n return result;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error updating experiment result');\n }\n },\n});\n\n// ============================================================================\n// Analytics Routes (nested under datasets)\n// ============================================================================\n\nexport const COMPARE_EXPERIMENTS_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/:datasetId/compare',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: compareExperimentsBodySchema,\n responseSchema: comparisonResponseSchema,\n summary: 'Compare two experiments',\n description: 'Compares two experiments to detect score regressions',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { experimentIdA, experimentIdB } = params as {\n experimentIdA: string;\n experimentIdB: string;\n };\n // Validate dataset exists\n await mastra.datasets.get({ id: datasetId });\n const result = await mastra.datasets.compareExperiments({\n experimentIds: [experimentIdA, experimentIdB],\n baselineId: experimentIdA,\n });\n return result;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error comparing experiments');\n }\n },\n});\n\n// ============================================================================\n// Version Routes\n// ============================================================================\n\nexport const LIST_DATASET_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/versions',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n queryParamSchema: paginationQuerySchema,\n responseSchema: listDatasetVersionsResponseSchema,\n summary: 'List dataset versions',\n description: 'Returns a paginated list of all versions for the dataset',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { page, perPage } = params;\n const ds = await mastra.datasets.get({ id: datasetId });\n const result = await ds.listVersions({ page: page ?? 0, perPage: perPage ?? 10 });\n return { versions: result.versions, pagination: result.pagination };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing dataset versions');\n }\n },\n});\n\nexport const LIST_ITEM_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/items/:itemId/history',\n responseType: 'json',\n pathParamSchema: datasetAndItemIdPathParams,\n responseSchema: listItemVersionsResponseSchema,\n summary: 'Get item history',\n description: 'Returns the full SCD-2 history of the item across all dataset versions',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, itemId }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const rows = await ds.getItemHistory({ itemId });\n // Check rows belong to this dataset\n if (rows.length > 0 && rows[0]?.datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Item not found in dataset: ${itemId}` });\n }\n return { history: rows };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error listing item history');\n }\n },\n});\n\nexport const GET_ITEM_VERSION_ROUTE = createRoute({\n method: 'GET',\n path: '/datasets/:datasetId/items/:itemId/versions/:datasetVersion',\n responseType: 'json',\n pathParamSchema: datasetItemVersionPathParams,\n responseSchema: datasetItemResponseSchema.nullable(),\n summary: 'Get item at specific dataset version',\n description: 'Returns the item as it existed at a specific dataset version',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, itemId, datasetVersion }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const item = await ds.getItem({ itemId, version: datasetVersion });\n if (!item) {\n throw new HTTPException(404, { message: `Item ${itemId} not found at version ${datasetVersion}` });\n }\n if ((item as any).datasetId !== datasetId) {\n throw new HTTPException(404, { message: `Item not found in dataset: ${itemId}` });\n }\n return item as any;\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error getting item version');\n }\n },\n});\n\n// ============================================================================\n// Batch Operations Routes\n// ============================================================================\n\nexport const BATCH_INSERT_ITEMS_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/:datasetId/items/batch',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: batchInsertItemsBodySchema,\n responseSchema: batchInsertItemsResponseSchema,\n summary: 'Batch insert items to dataset',\n description: 'Adds multiple items to the dataset in a single operation (single version entry)',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { items } = params as {\n items: Array<{\n input: unknown;\n groundTruth?: unknown;\n expectedTrajectory?: unknown;\n toolMocks?: DatasetItemToolMock[];\n metadata?: Record<string, unknown>;\n source?: DatasetItemSource;\n }>;\n };\n const ds = await mastra.datasets.get({ id: datasetId });\n const addedItems = await ds.addItems({ items });\n return { items: addedItems, count: addedItems.length };\n } catch (error) {\n if (isSchemaValidationError(error)) {\n throw new HTTPException(400, {\n message: error.message,\n cause: { field: error.field, errors: error.errors },\n });\n }\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error batch inserting items');\n }\n },\n});\n\nexport const BATCH_DELETE_ITEMS_ROUTE = createRoute({\n method: 'DELETE',\n path: '/datasets/:datasetId/items/batch',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: batchDeleteItemsBodySchema,\n responseSchema: batchDeleteItemsResponseSchema,\n summary: 'Batch delete items from dataset',\n description: 'Deletes multiple items from the dataset in a single operation (single version entry)',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, ...params }) => {\n assertDatasetsAvailable();\n try {\n const { itemIds } = params as { itemIds: string[] };\n const ds = await mastra.datasets.get({ id: datasetId });\n await ds.deleteItems({ itemIds });\n return { success: true, deletedCount: itemIds.length };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error bulk deleting items');\n }\n },\n});\n\n// ============================================================================\n// AI Generation\n// ============================================================================\n\nconst GENERATE_ITEMS_SYSTEM_PROMPT = `You are a test data generation expert. Your job is to generate realistic, diverse test data items for an AI agent evaluation dataset.\n\nYou will be given context about the agent being tested — its purpose, system prompt, and available tools. Use this to generate inputs that thoroughly exercise the agent's capabilities.\n\nGenerate test items that:\n1. Are realistic and diverse — cover edge cases, different complexities, and various scenarios\n2. Match the provided schemas exactly\n3. Include ground truth values when a ground truth schema is provided\n4. Vary in difficulty (easy, medium, hard cases)\n5. Include potential edge cases and tricky inputs\n6. Test different aspects of the agent's capabilities based on its tools and instructions\n\nReturn the items as a JSON array.`;\n\nexport const GENERATE_ITEMS_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/:datasetId/generate-items',\n responseType: 'json',\n pathParamSchema: datasetIdPathParams,\n bodySchema: generateItemsBodySchema,\n responseSchema: generateItemsResponseSchema,\n summary: 'Generate dataset items using AI',\n description:\n 'Uses an LLM to generate synthetic dataset items based on the dataset schema and a user prompt. Returns generated items for review — they are NOT automatically added to the dataset.',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, datasetId, modelId, prompt, count, agentContext }) => {\n assertDatasetsAvailable();\n try {\n const ds = await mastra.datasets.get({ id: datasetId });\n const dataset = await ds.getDetails();\n\n // Resolve the model from the \"provider/model\" string\n const model = await resolveModelConfig(modelId, undefined, mastra);\n\n // Build context about the dataset schema for the generator\n const schemaContext = [\n dataset.inputSchema ? `Input schema:\\n${JSON.stringify(dataset.inputSchema, null, 2)}` : null,\n dataset.groundTruthSchema\n ? `Ground truth schema:\\n${JSON.stringify(dataset.groundTruthSchema, null, 2)}`\n : null,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n const generatorAgent = new Agent({\n id: 'dataset-item-generator',\n name: 'dataset-item-generator',\n instructions: GENERATE_ITEMS_SYSTEM_PROMPT,\n model,\n });\n\n // Build the structured output schema dynamically based on count\n // Use z.string() for input/groundTruth since OpenAI structured output requires concrete types.\n // The generator will produce JSON strings that we parse back into objects if needed.\n const itemSchema = z.object({\n input: z\n .string()\n .describe('The input data as a JSON string matching the input schema, or a plain text string if no schema'),\n groundTruth: z\n .string()\n .optional()\n .describe('The expected output as a JSON string matching the ground truth schema'),\n });\n const outputSchema = z.object({\n items: z.array(itemSchema).min(1).max(count),\n });\n\n // Build agent context section\n const agentContextParts = [];\n if (agentContext?.description) {\n agentContextParts.push(`Agent description: ${agentContext.description}`);\n }\n if (agentContext?.instructions) {\n agentContextParts.push(`Agent system prompt:\\n${agentContext.instructions}`);\n }\n if (agentContext?.tools?.length) {\n agentContextParts.push(`Agent tools: ${agentContext.tools.join(', ')}`);\n }\n const agentContextSection = agentContextParts.length > 0 ? agentContextParts.join('\\n\\n') : null;\n\n const userMessage = [\n `Generate exactly ${count} test items for a dataset named \"${dataset.name}\".`,\n dataset.description ? `Dataset description: ${dataset.description}` : null,\n agentContextSection ? `--- AGENT CONTEXT ---\\n${agentContextSection}` : null,\n schemaContext || null,\n `User's request: ${prompt}`,\n `Return exactly ${count} items.`,\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n const result = await generatorAgent.generate(userMessage, {\n structuredOutput: { schema: outputSchema },\n });\n\n const generated = await result.object;\n\n // Parse JSON strings back to objects where possible\n const items = generated.items.map(item => {\n let input: unknown = item.input;\n try {\n input = JSON.parse(item.input);\n } catch {\n // Keep as string if not valid JSON\n }\n let groundTruth: unknown = item.groundTruth;\n if (item.groundTruth) {\n try {\n groundTruth = JSON.parse(item.groundTruth);\n } catch {\n // Keep as string if not valid JSON\n }\n }\n return { input, groundTruth };\n });\n\n return { items };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error generating dataset items');\n }\n },\n});\n\n// ============================================================================\n// Failure Clustering\n// ============================================================================\n\nconst CLUSTER_FAILURES_SYSTEM_PROMPT = `You are an AI evaluation expert specializing in failure analysis. Given a set of failure items from an AI agent experiment, identify common failure patterns and assign descriptive tags to each item.\n\nFor each cluster you identify, provide:\n- A short, descriptive tag label (2-5 words, lowercase, hyphenated, e.g., \"no-tool-usage\", \"hallucination\")\n- A description explaining the common failure pattern\n- The IDs of items that belong to this cluster\n\nAlso return a \"proposedTags\" array mapping each item ID to the tags you recommend, along with a brief \"reason\" explaining WHY those tags apply to that specific item. The reason should reference concrete evidence from the item's input/output/error.\n\nGuidelines:\n- Create between 1 and 8 clusters depending on the diversity of failures\n- Every item must be assigned to at least one cluster unless there is no clear pattern of failure\n- Focus on the root cause of failures, not surface-level symptoms\n- If items have scores, use low scores as signals for the failure type\n- Be specific about what went wrong\n- IMPORTANT: If existing tags are provided, PREFER reusing them over creating new ones. Only create new tags when no existing tag fits.\n- Items may already have tags — consider those when assigning new ones and avoid duplicating existing tags on an item.\n- The \"reason\" field should be 1-2 sentences explaining the specific evidence for each tag assignment.`;\n\nexport const CLUSTER_FAILURES_ROUTE = createRoute({\n method: 'POST',\n path: '/datasets/cluster-failures',\n responseType: 'json',\n bodySchema: clusterFailuresBodySchema,\n responseSchema: clusterFailuresResponseSchema,\n summary: 'Cluster experiment failures using AI',\n description:\n 'Uses an LLM to analyze failure items from an experiment and group them into meaningful failure pattern clusters.',\n tags: ['Datasets'],\n requiresAuth: true,\n handler: async ({ mastra, modelId, items, availableTags, prompt }) => {\n assertDatasetsAvailable();\n try {\n const model = await resolveModelConfig(modelId, undefined, mastra);\n\n const clusterAgent = new Agent({\n id: 'failure-cluster-analyzer',\n name: 'failure-cluster-analyzer',\n instructions: CLUSTER_FAILURES_SYSTEM_PROMPT,\n model,\n });\n\n const outputSchema = z.object({\n clusters: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string(),\n itemIds: z.array(z.string()),\n }),\n ),\n proposedTags: z.array(\n z.object({\n itemId: z.string(),\n tags: z.array(z.string()),\n reason: z.string().describe('Brief explanation of why these tags were assigned'),\n }),\n ),\n });\n\n const itemSummaries = items.map((item, i) => {\n const parts = [`Item ${i + 1} (id: ${item.id}):`];\n if (item.input !== undefined && item.input !== null) parts.push(` Input: ${JSON.stringify(item.input)}`);\n if (item.output !== undefined && item.output !== null) parts.push(` Output: ${JSON.stringify(item.output)}`);\n if (item.error !== undefined && item.error !== null) {\n parts.push(` Error: ${typeof item.error === 'string' ? item.error : JSON.stringify(item.error)}`);\n }\n if (item.scores !== undefined && item.scores !== null) {\n parts.push(` Scores: ${JSON.stringify(item.scores)}`);\n }\n if (item.existingTags && item.existingTags.length > 0) {\n parts.push(` Existing tags: ${item.existingTags.join(', ')}`);\n }\n return parts.join('\\n');\n });\n\n let userMessage = `Analyze these ${items.length} failure items and group them into clusters of common failure patterns:\\n\\n${itemSummaries.join('\\n\\n')}`;\n\n if (availableTags && availableTags.length > 0) {\n userMessage += `\\n\\nExisting tag vocabulary (prefer reusing these): ${availableTags.join(', ')}`;\n }\n\n if (prompt) {\n userMessage += `\\n\\nAdditional instructions from the reviewer: ${prompt}`;\n }\n\n userMessage += `\\n\\nReturn both \"clusters\" (grouping items by pattern) and \"proposedTags\" (a list mapping each item ID to the tag labels you recommend, with a \"reason\" explaining why). For proposedTags, only include NEW tags to add — do not repeat tags the item already has.`;\n\n const result = await clusterAgent.generate(userMessage, {\n structuredOutput: { schema: outputSchema },\n });\n\n const generated = await result.object;\n return { clusters: generated.clusters, proposedTags: generated.proposedTags ?? [] };\n } catch (error) {\n if (error instanceof MastraError) {\n throw new HTTPException(getHttpStatusForMastraError(error.id) as StatusCode, { message: error.message });\n }\n return handleError(error, 'Error clustering failures');\n }\n },\n});\n"]}
|
|
@@ -98,7 +98,7 @@ var GET_API_SCHEMA_ROUTE = createRoute({
|
|
|
98
98
|
tags: ["System"],
|
|
99
99
|
requiresAuth: true,
|
|
100
100
|
handler: async () => {
|
|
101
|
-
const { buildApiSchemaManifest } = await import('./api-schema-manifest-
|
|
101
|
+
const { buildApiSchemaManifest } = await import('./api-schema-manifest-Z45VRZSJ.js');
|
|
102
102
|
return buildApiSchemaManifest();
|
|
103
103
|
}
|
|
104
104
|
});
|
|
@@ -150,5 +150,5 @@ var GET_SYSTEM_PACKAGES_ROUTE = createRoute({
|
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
export { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE };
|
|
153
|
-
//# sourceMappingURL=chunk-
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
153
|
+
//# sourceMappingURL=chunk-Q5RXMLH2.js.map
|
|
154
|
+
//# sourceMappingURL=chunk-Q5RXMLH2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":[],"mappings":"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","file":"chunk-E6UDV3F5.js","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":[],"mappings":"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","file":"chunk-Q5RXMLH2.js","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isBuilderFeatureEnabled } from './chunk-
|
|
1
|
+
import { isBuilderFeatureEnabled } from './chunk-N3D3A56J.js';
|
|
2
2
|
import { getCallerAuthorId } from './chunk-56AYHXOU.js';
|
|
3
3
|
|
|
4
4
|
// src/server/handlers/favorites-enrichment.ts
|
|
@@ -31,5 +31,5 @@ async function enrichOrStripFavorites(mastra, requestContext, entityType, record
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields };
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-QWTUGYUI.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-QWTUGYUI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":[],"mappings":";;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAM,uBAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAAS,kBAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":[],"mappings":";;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAM,uBAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAAS,kBAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-QWTUGYUI.js","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { FavoritesStorage, StorageFavoriteEntityType } from '@mastra/core/storage';\n\nimport { getCallerAuthorId } from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\n\n/**\n * Result of `prepareFavoritesEnrichment` — `null` when the `favorites` EE feature is off.\n * When non-null the caller may use `starredIds` to set `isFavorited` on records\n * and may pass `userId` along to storage list paths for pin-favorited-first\n * sorting (`pinFavoritedFor`).\n */\nexport type FavoritesEnrichmentContext = {\n userId: string;\n starredIds: Set<string>;\n favoritesStore: FavoritesStorage;\n} | null;\n\n/**\n * Resolve the EE feature flag plus the caller's favorited set for a list of\n * candidate entity IDs in one shot. Soft-gated: returns `null` if the feature\n * is off or there's no caller — handlers should drop `isFavorited` / `favoriteCount`\n * fields and ignore `?favoritedOnly=true` in that case.\n */\nexport async function prepareFavoritesEnrichment(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n entityIds: string[],\n): Promise<FavoritesEnrichmentContext> {\n if (!(await isBuilderFeatureEnabled(mastra, 'favorites'))) return null;\n\n const userId = getCallerAuthorId(requestContext);\n if (!userId) return null;\n\n const storage = mastra.getStorage();\n if (!storage) return null;\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) return null;\n\n const starredIds =\n entityIds.length === 0\n ? new Set<string>()\n : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });\n return { userId, starredIds, favoritesStore };\n}\n\n/**\n * Strip the favorites EE fields from a record. Used when the feature is off so\n * stale values from storage do not leak through the API.\n */\nexport function stripFavoriteFields<T extends object>(record: T): T {\n if ('isFavorited' in record || 'favoriteCount' in record) {\n const copy = { ...record } as Record<string, unknown>;\n delete copy.isFavorited;\n delete copy.favoriteCount;\n return copy as T;\n }\n return record;\n}\n\n/**\n * Convenience for single-entity handlers (GET / POST / PATCH): annotate\n * `isFavorited` from the caller's favorites set when enrichment is available,\n * otherwise strip both favorite fields. `favoriteCount` is the canonical\n * mirrored counter and is left in place so callers can render share-count UI\n * (it's identical across viewers).\n */\nexport async function enrichOrStripFavorites<T extends { id: string }>(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n record: T,\n): Promise<T> {\n const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);\n if (enrichment) {\n return { ...record, isFavorited: enrichment.starredIds.has(record.id) };\n }\n return stripFavoriteFields(record);\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { supportsSessionRefresh } from './chunk-HATXNJ4V.js';
|
|
2
1
|
import { capabilitiesResponseSchema, currentUserResponseSchema, ssoLoginQuerySchema, ssoCallbackQuerySchema, refreshResponseSchema, credentialsSignInBodySchema, credentialsSignUpBodySchema, permissionPatternsResponseSchema } from './chunk-LWA65ME7.js';
|
|
2
|
+
import { supportsSessionRefresh } from './chunk-HATXNJ4V.js';
|
|
3
3
|
import { handleError } from './chunk-7ZWJX3AN.js';
|
|
4
4
|
import { createPublicRoute, createRoute } from './chunk-BRC4XSFG.js';
|
|
5
5
|
import { HTTPException } from './chunk-6QWQZI4Q.js';
|
|
@@ -558,5 +558,5 @@ var AUTH_ROUTES = [
|
|
|
558
558
|
];
|
|
559
559
|
|
|
560
560
|
export { AUTH_ROUTES, GET_AUTH_CAPABILITIES_ROUTE, GET_CURRENT_USER_ROUTE, GET_PERMISSION_PATTERNS_ROUTE, GET_ROLE_PERMISSIONS_ROUTE, GET_SSO_CALLBACK_ROUTE, GET_SSO_LOGIN_ROUTE, POST_CREDENTIALS_SIGN_IN_ROUTE, POST_CREDENTIALS_SIGN_UP_ROUTE, POST_LOGOUT_ROUTE, POST_REFRESH_ROUTE, getPublicOrigin };
|
|
561
|
-
//# sourceMappingURL=chunk-
|
|
562
|
-
//# sourceMappingURL=chunk-
|
|
561
|
+
//# sourceMappingURL=chunk-R4O5HVDI.js.map
|
|
562
|
+
//# sourceMappingURL=chunk-R4O5HVDI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/handlers/auth.ts"],"names":["mastra"],"mappings":"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","file":"chunk-AI75K5XV.js","sourcesContent":["/**\n * Auth handlers for EE authentication capabilities.\n *\n * These routes enable Studio to:\n * - Detect available auth capabilities\n * - Initiate SSO login flows\n * - Handle OAuth callbacks\n * - Logout users\n */\n\nimport type {\n IUserProvider,\n ISessionProvider,\n ISSOProvider,\n ICredentialsProvider,\n SSOCallbackResult,\n} from '@mastra/core/auth';\nimport type { IRBACProvider, IFGAProvider, EEUser } from '@mastra/core/auth/ee';\nimport type { MastraAuthProvider } from '@mastra/core/server';\n\nimport { z } from 'zod/v4';\nimport { supportsSessionRefresh } from '../auth/helpers';\nimport { MASTRA_USER_PERMISSIONS_KEY, MASTRA_CLIENT_TYPE_HEADER, isStudioClientTypeHeader } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n capabilitiesResponseSchema,\n ssoLoginQuerySchema,\n ssoCallbackQuerySchema,\n currentUserResponseSchema,\n credentialsSignInBodySchema,\n credentialsSignUpBodySchema,\n refreshResponseSchema,\n permissionPatternsResponseSchema,\n} from '../schemas/auth';\nimport { createPublicRoute, createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\ntype BuildCapabilitiesFn = (\n auth: any,\n request: Request,\n options?: { rbac?: any; fga?: any; apiPrefix?: string },\n) => Promise<any>;\nlet _buildCapabilitiesPromise: Promise<BuildCapabilitiesFn | undefined> | undefined;\nfunction loadBuildCapabilities(): Promise<BuildCapabilitiesFn | undefined> {\n if (!_buildCapabilitiesPromise) {\n _buildCapabilitiesPromise = import('@mastra/core/auth/ee')\n .then(m => m.buildCapabilities as BuildCapabilitiesFn)\n .catch(() => {\n console.error(\n '[@mastra/server] EE auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _buildCapabilitiesPromise;\n}\n\nlet _permissionPatternsPromise: Promise<Record<string, unknown> | undefined> | undefined;\nfunction loadPermissionPatterns(): Promise<Record<string, unknown> | undefined> {\n if (!_permissionPatternsPromise) {\n _permissionPatternsPromise = import('@mastra/core/auth/ee')\n .then(m => m.PERMISSION_PATTERNS as Record<string, unknown>)\n .catch(() => {\n console.error(\n '[@mastra/server] EE auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _permissionPatternsPromise;\n}\n\n/**\n * Helper to get auth provider from Mastra instance.\n *\n * Dual auth is OPT-IN: if studio.auth is explicitly configured, Studio requests\n * use it exclusively. Otherwise, Studio requests fall back to server.auth for\n * backward compatibility.\n */\nfunction getAuthProvider(mastra: any, isStudio?: boolean): MastraAuthProvider | null {\n // Check if studio.auth is explicitly configured\n const studioConfig = mastra.getStudio?.();\n const hasStudioAuth = studioConfig?.auth && typeof studioConfig.auth.authenticateToken === 'function';\n\n // If this is a Studio request AND studio.auth is configured, use it exclusively\n if (isStudio && hasStudioAuth) {\n return studioConfig.auth as MastraAuthProvider;\n }\n\n // Otherwise (non-studio request, OR studio request without studio.auth configured),\n // fall back to server.auth for backward compatibility\n const serverConfig = mastra.getServer?.();\n if (!serverConfig?.auth) return null;\n\n // Auth can be either MastraAuthConfig or MastraAuthProvider\n // If it has authenticateToken method, it's a provider\n if (typeof serverConfig.auth.authenticateToken === 'function') {\n return serverConfig.auth as MastraAuthProvider;\n }\n\n return null;\n}\n\n/**\n * Check if the request is from Studio (via x-mastra-client-type header).\n */\nfunction isStudioRequest(request: Request): boolean {\n return isStudioClientTypeHeader(request.headers.get(MASTRA_CLIENT_TYPE_HEADER) ?? undefined);\n}\n\n/**\n * Get the public-facing origin from a request, respecting reverse proxy headers.\n * Behind a proxy (e.g. edge router), request.url contains the internal hostname,\n * so we rely on forwarded headers to reconstruct the real public origin.\n *\n * Assumes the server is behind a trusted proxy (or running locally). When\n * exposed directly to untrusted clients, the Host header is attacker-controlled\n * and must be validated upstream.\n *\n * Priority:\n * 1. X-Forwarded-Host (traditional reverse proxy) → always HTTPS. Knative's\n * queue-proxy overwrites X-Forwarded-Proto based on the internal HTTP\n * connection, so X-Forwarded-Proto is ignored here.\n * 2. Host header with X-Forwarded-Proto (AWS ALB, some proxies) → respect proto.\n * 3. Host header alone → use the scheme from request.url (covers both direct\n * HTTP access and proxies that preserve Host but don't set a proto header).\n * 4. No Host header → fall back to request.url.origin (local dev / direct access).\n */\nexport function getPublicOrigin(request: Request): string {\n const forwardedHost = request.headers.get('x-forwarded-host')?.split(',')[0]?.trim();\n if (forwardedHost) {\n return `https://${forwardedHost}`;\n }\n\n const host = request.headers.get('host');\n if (host) {\n const forwardedProto = request.headers.get('x-forwarded-proto')?.split(',')[0]?.trim();\n const proto = forwardedProto || new URL(request.url).protocol.replace(':', '');\n return `${proto}://${host}`;\n }\n\n return new URL(request.url).origin;\n}\n\n/**\n * Helper to get RBAC provider from Mastra config.\n * Checks studio config first when isStudio is true.\n */\nfunction getRBACProvider(mastra: any, isStudio?: boolean): IRBACProvider<EEUser> | undefined {\n if (isStudio) {\n const studioConfig = mastra.getStudio?.();\n if (studioConfig?.rbac) {\n return studioConfig.rbac as IRBACProvider<EEUser>;\n }\n }\n const serverConfig = mastra.getServer?.();\n return serverConfig?.rbac as IRBACProvider<EEUser> | undefined;\n}\n\n/**\n * Helper to get FGA provider from Mastra config.\n * Checks studio config first when isStudio is true.\n */\nfunction getFGAProvider(mastra: any, isStudio?: boolean): IFGAProvider<EEUser> | undefined {\n if (isStudio) {\n const studioConfig = mastra.getStudio?.();\n if (studioConfig?.fga) {\n return studioConfig.fga as IFGAProvider<EEUser>;\n }\n }\n const serverConfig = mastra.getServer?.();\n return serverConfig?.fga as IFGAProvider<EEUser> | undefined;\n}\n\n/**\n * Type guard to check if auth provider implements an interface.\n */\nfunction implementsInterface<T>(auth: unknown, method: keyof T): auth is T {\n return auth !== null && typeof auth === 'object' && typeof (auth as any)[method] === 'function';\n}\n\n// ============================================================================\n// GET /auth/capabilities\n// ============================================================================\n\nexport const GET_AUTH_CAPABILITIES_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/capabilities',\n responseType: 'json',\n responseSchema: capabilitiesResponseSchema,\n summary: 'Get auth capabilities',\n description:\n 'Returns authentication capabilities and current user info. Used by Studio to determine available features and user state.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, request, routePrefix } = ctx as any;\n\n // Check if this is a Studio request (via x-mastra-client-type header)\n const isStudio = isStudioRequest(request);\n\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth) {\n return { enabled: false, login: null };\n }\n\n const rbac = getRBACProvider(mastra, isStudio);\n const fga = getFGAProvider(mastra, isStudio);\n\n const buildCapabilities = await loadBuildCapabilities();\n if (!buildCapabilities) {\n return { enabled: false, login: null };\n }\n const capabilities = await buildCapabilities(auth, request, { rbac, fga, apiPrefix: routePrefix });\n\n // If capabilities came back without a user, the session may have expired.\n // Attempt a transparent refresh (same logic as coreAuthMiddleware) and retry.\n if (!('user' in capabilities) && supportsSessionRefresh(auth)) {\n try {\n const sessionId = await auth.getSessionIdFromRequest(request);\n if (sessionId) {\n const refreshedSession = await auth.refreshSession(sessionId);\n if (refreshedSession) {\n const sessionHeaders = await auth.getSessionHeaders(refreshedSession);\n const cookieValue = extractCookieFromHeaders(sessionHeaders);\n if (cookieValue) {\n // Rebuild capabilities with the refreshed cookie\n const refreshedRequest = new Request(request.url, {\n method: request.method,\n headers: new Headers(request.headers),\n });\n refreshedRequest.headers.set('Cookie', cookieValue);\n const refreshedCapabilities = await buildCapabilities(auth, refreshedRequest, {\n rbac,\n apiPrefix: routePrefix,\n });\n\n // Attach refresh headers so the adapter can set the new cookie\n if ('user' in refreshedCapabilities) {\n (refreshedCapabilities as any).__refreshHeaders = sessionHeaders;\n }\n return refreshedCapabilities;\n }\n }\n }\n } catch {\n // Refresh failed — return original unauthenticated capabilities\n }\n }\n\n return capabilities;\n } catch (error) {\n return handleError(error, 'Error getting auth capabilities');\n }\n },\n});\n\n/**\n * Extract a full cookie string from session headers (e.g. Set-Cookie → Cookie).\n */\nfunction extractCookieFromHeaders(headers: Record<string, string>): string | null {\n const setCookie = headers['Set-Cookie'] || headers['set-cookie'];\n if (!setCookie) return null;\n // Set-Cookie value is \"name=value; Path=/; ...\" — extract \"name=value\"\n const match = setCookie.match(/^([^;]+)/);\n return match ? (match[1] ?? null) : null;\n}\n\n// ============================================================================\n// GET /auth/me\n// ============================================================================\n\nexport const GET_CURRENT_USER_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/me',\n responseType: 'json',\n responseSchema: currentUserResponseSchema,\n summary: 'Get current user',\n description: 'Returns the currently authenticated user, or null if not authenticated.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n const auth = getAuthProvider(mastra, isStudio);\n const rbac = getRBACProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<IUserProvider>(auth, 'getCurrentUser')) {\n return null;\n }\n\n const user = await auth.getCurrentUser(request);\n if (!user) return null;\n\n // Get roles/permissions from RBAC provider if available\n let roles: string[] | undefined;\n let permissions: string[] | undefined;\n\n if (rbac) {\n try {\n roles = await rbac.getRoles(user);\n permissions = await rbac.getPermissions(user);\n } catch {\n // RBAC not available or failed\n }\n }\n\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n roles,\n permissions,\n };\n } catch (error) {\n return handleError(error, 'Error getting current user');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/sso/login\n// ============================================================================\n\nexport const GET_SSO_LOGIN_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/sso/login',\n responseType: 'datastream-response',\n queryParamSchema: ssoLoginQuerySchema,\n summary: 'Initiate SSO login',\n description: 'Returns the SSO login URL and sets PKCE cookies if needed.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, redirect_uri, request, routePrefix } = ctx as any;\n const isStudio = isStudioRequest(request);\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'getLoginUrl')) {\n throw new HTTPException(404, { message: 'SSO not configured' });\n }\n\n // Build OAuth callback URI using the configured route prefix\n const origin = getPublicOrigin(request);\n const raw = ((routePrefix as string) || '/api').trim();\n const withSlash = raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = withSlash.endsWith('/') ? withSlash.slice(0, -1) : withSlash;\n const oauthCallbackUri = `${origin}${prefix}/auth/sso/callback`;\n\n // Encode the post-login redirect in state (where user goes after auth completes)\n // State format: uuid|postLoginRedirect\n // Validate redirect_uri to prevent open-redirect attacks: allow relative paths,\n // same-origin URLs, and localhost URLs (for dev setups where Studio runs on a\n // different port).\n let postLoginRedirect = '/';\n if (redirect_uri) {\n if (!redirect_uri.startsWith('http')) {\n // Relative path — always safe\n postLoginRedirect = redirect_uri;\n } else {\n try {\n const redirectUrl = new URL(redirect_uri);\n const requestOrigin = new URL(origin);\n const isHttps = redirectUrl.protocol === 'http:' || redirectUrl.protocol === 'https:';\n const isSameOrigin = redirectUrl.origin === requestOrigin.origin;\n const isLocalhost =\n redirectUrl.hostname === 'localhost' ||\n redirectUrl.hostname === '127.0.0.1' ||\n redirectUrl.hostname === '[::1]';\n if (isHttps && (isSameOrigin || isLocalhost)) {\n postLoginRedirect = redirect_uri;\n }\n } catch {\n // Malformed URL — fall back to /\n }\n }\n }\n const stateId = crypto.randomUUID();\n const state = `${stateId}|${encodeURIComponent(postLoginRedirect)}`;\n\n const loginUrl = await Promise.resolve(auth.getLoginUrl(oauthCallbackUri, state));\n\n // Build response with optional PKCE cookies\n const headers = new Headers({ 'Content-Type': 'application/json' });\n\n // Check for PKCE cookies (e.g., MastraCloudAuthProvider)\n if (implementsInterface<ISSOProvider>(auth, 'getLoginCookies') && auth.getLoginCookies) {\n const cookies = auth.getLoginCookies(oauthCallbackUri, state);\n if (cookies?.length) {\n // PKCE cookies set for SSO state management\n for (const cookie of cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n }\n\n return new Response(JSON.stringify({ url: loginUrl }), { status: 200, headers });\n } catch (error) {\n return handleError(error, 'Error initiating SSO login');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/sso/callback\n// ============================================================================\n\nexport const GET_SSO_CALLBACK_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/sso/callback',\n responseType: 'datastream-response',\n queryParamSchema: ssoCallbackQuerySchema,\n summary: 'Handle SSO callback',\n description: 'Handles the OAuth callback, exchanges code for session, and redirects to the app.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, code, state, request } = ctx as any;\n const _isStudio = isStudioRequest(request); // Kept for potential future use; currently we prefer studio auth for SSO\n\n // Build base URL for redirects (Response.redirect requires absolute URL)\n const baseUrl = getPublicOrigin(request);\n\n // Extract post-login redirect from state (format: uuid|encodedRedirect)\n let redirectTo = '/';\n let stateId = state || '';\n if (state && state.includes('|')) {\n const [id, encodedRedirect] = state.split('|', 2);\n stateId = id;\n try {\n redirectTo = decodeURIComponent(encodedRedirect);\n } catch {\n redirectTo = '/';\n }\n }\n\n // Build absolute redirect URL.\n // The redirect_uri was validated at the login endpoint (same-origin or localhost\n // only), so the state should only contain safe URLs. We still apply defense-in-depth\n // checks here: allow http(s) same-origin or localhost, reject everything else.\n let absoluteRedirect: string;\n if (redirectTo.startsWith('http')) {\n try {\n const parsed = new URL(redirectTo);\n const baseOrigin = new URL(baseUrl);\n const isHttps = parsed.protocol === 'http:' || parsed.protocol === 'https:';\n const isSameOrigin = parsed.origin === baseOrigin.origin;\n const isLocalhost =\n parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';\n absoluteRedirect = isHttps && (isSameOrigin || isLocalhost) ? redirectTo : `${baseUrl}/`;\n } catch {\n absoluteRedirect = `${baseUrl}/`;\n }\n } else {\n absoluteRedirect = `${baseUrl}${redirectTo}`;\n }\n\n try {\n // For SSO callback, the redirect from the identity provider won't include\n // the x-mastra-client-type header. Prefer studio auth for SSO (it's the\n // typical SSO use case), fall back to server auth only if studio doesn't exist.\n let auth = getAuthProvider(mastra, true); // Try studio first\n\n // If studio doesn't have SSO, fall back to server\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'handleCallback')) {\n auth = getAuthProvider(mastra, false);\n }\n\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'handleCallback')) {\n return Response.redirect(`${absoluteRedirect}?error=sso_not_configured`, 302);\n }\n\n // Pass cookie header to provider for PKCE validation (if supported)\n const reqCookieHeader = request.headers.get('cookie');\n if (typeof (auth as any).setCallbackCookieHeader === 'function') {\n (auth as any).setCallbackCookieHeader(reqCookieHeader);\n }\n\n const result = (await auth.handleCallback(code, stateId)) as SSOCallbackResult<EEUser>;\n const user = result.user as EEUser;\n\n // Build response headers (session cookies, etc.)\n const headers = new Headers();\n headers.set('Location', absoluteRedirect);\n\n // Set session cookies from the SSO result\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n } else if (implementsInterface<ISessionProvider>(auth, 'createSession') && result.tokens) {\n // Fallback: Create session manually for providers without cookie support\n const session = await auth.createSession(user.id, {\n accessToken: result.tokens.accessToken,\n refreshToken: result.tokens.refreshToken,\n expiresAt: result.tokens.expiresAt,\n organizationId: (user as any).organizationId,\n });\n const sessionHeaders = auth.getSessionHeaders(session);\n for (const [key, value] of Object.entries(sessionHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(null, {\n status: 302,\n headers,\n });\n } catch (error) {\n // Redirect with error (use absolute URL)\n const errorMessage = encodeURIComponent(error instanceof Error ? error.message : 'Unknown error');\n return Response.redirect(`${absoluteRedirect}?error=${errorMessage}`, 302);\n }\n },\n});\n\n// ============================================================================\n// POST /auth/logout\n// ============================================================================\n\nexport const POST_LOGOUT_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/logout',\n responseType: 'datastream-response',\n summary: 'Logout',\n description: 'Destroys the current session and returns logout redirect URL if available.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth) {\n return new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Get session ID and destroy it\n if (implementsInterface<ISessionProvider>(auth, 'getSessionIdFromRequest')) {\n const sessionId = auth.getSessionIdFromRequest(request);\n if (sessionId && implementsInterface<ISessionProvider>(auth, 'destroySession')) {\n await auth.destroySession(sessionId);\n }\n }\n\n // Get logout URL if available\n let redirectTo: string | undefined;\n if (implementsInterface<ISSOProvider>(auth, 'getLogoutUrl') && auth.getLogoutUrl) {\n // Use public origin (respects X-Forwarded-Host behind reverse proxy)\n const origin = getPublicOrigin(request);\n const logoutUrl = await auth.getLogoutUrl(origin, request);\n redirectTo = logoutUrl ?? undefined;\n }\n\n // Build response with session clearing headers\n const headers = new Headers({ 'Content-Type': 'application/json' });\n\n // Clear session cookie\n if (implementsInterface<ISessionProvider>(auth, 'getClearSessionHeaders')) {\n const clearHeaders = auth.getClearSessionHeaders();\n for (const [key, value] of Object.entries(clearHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(JSON.stringify({ success: true, redirectTo }), {\n status: 200,\n headers,\n });\n } catch (error) {\n return handleError(error, 'Error logging out');\n }\n },\n});\n\n// ============================================================================\n// POST /auth/refresh\n// ============================================================================\n\nexport const POST_REFRESH_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/refresh',\n responseType: 'datastream-response',\n responseSchema: refreshResponseSchema,\n summary: 'Refresh session',\n description: 'Refreshes the current session, extending its expiry. Sets a new session cookie on success.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (\n !auth ||\n !implementsInterface<ISessionProvider>(auth, 'refreshSession') ||\n !implementsInterface<ISessionProvider>(auth, 'getSessionIdFromRequest')\n ) {\n throw new HTTPException(404, { message: 'Session refresh not configured' });\n }\n\n // Get session ID from request\n const sessionId = auth.getSessionIdFromRequest(request);\n if (!sessionId) {\n throw new HTTPException(401, { message: 'No session' });\n }\n\n // Refresh the session\n const newSession = await auth.refreshSession(sessionId);\n if (!newSession) {\n throw new HTTPException(401, { message: 'Session expired' });\n }\n\n // Build response with new session headers\n const headers = new Headers({ 'Content-Type': 'application/json' });\n if (implementsInterface<ISessionProvider>(auth, 'getSessionHeaders')) {\n const sessionHeaders = auth.getSessionHeaders(newSession);\n for (const [key, value] of Object.entries(sessionHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers,\n });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n return handleError(error, 'Error refreshing session');\n }\n },\n});\n\n// ============================================================================\n// POST /auth/credentials/sign-in\n// ============================================================================\n\nexport const POST_CREDENTIALS_SIGN_IN_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/credentials/sign-in',\n responseType: 'datastream-response',\n bodySchema: credentialsSignInBodySchema,\n summary: 'Sign in with credentials',\n description: 'Authenticates a user with email and password.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request, email, password } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ICredentialsProvider>(auth, 'signIn')) {\n throw new HTTPException(404, { message: 'Credentials authentication not configured' });\n }\n\n const result = await auth.signIn(email, password, request);\n const user = result.user as EEUser;\n\n const responseBody = JSON.stringify({\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n },\n token: result.token,\n });\n\n // Build response headers, including cookies from the auth provider\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n // Forward session cookies from the auth provider\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n\n return new Response(responseBody, { status: 200, headers });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n // Return a generic error for auth failures to avoid leaking info\n throw new HTTPException(401, { message: 'Invalid email or password' });\n }\n },\n});\n\n// ============================================================================\n// POST /auth/credentials/sign-up\n// ============================================================================\n\nexport const POST_CREDENTIALS_SIGN_UP_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/credentials/sign-up',\n responseType: 'datastream-response',\n bodySchema: credentialsSignUpBodySchema,\n summary: 'Sign up with credentials',\n description: 'Creates a new user account with email and password.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request, email, password, name } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ICredentialsProvider>(auth, 'signUp')) {\n throw new HTTPException(404, { message: 'Credentials authentication not configured' });\n }\n\n const result = await auth.signUp(email, password, name, request);\n const user = result.user as EEUser;\n\n const responseBody = JSON.stringify({\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n },\n token: result.token,\n });\n\n // Build response headers, including cookies from the auth provider\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n // Forward session cookies from the auth provider\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n\n return new Response(responseBody, { status: 200, headers });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n const mastra = (ctx as any).mastra;\n mastra?.getLogger?.()?.error('Sign-up error', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n throw new HTTPException(400, { message: 'Failed to create account' });\n }\n },\n});\n\n// ============================================================================\n// GET /auth/roles/:roleId/permissions\n// ============================================================================\n\nconst rolePermissionsPathSchema = z.object({ roleId: z.string() });\nconst rolePermissionsResponseSchema = z.object({ roleId: z.string(), permissions: z.array(z.string()) });\n\nexport const GET_ROLE_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/auth/roles/:roleId/permissions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: rolePermissionsPathSchema,\n responseSchema: rolePermissionsResponseSchema,\n summary: 'Get permissions for a role',\n description:\n 'Returns the resolved permissions for a specific role. Only accessible by admin users. Used by the \"View as role\" feature.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, requestContext, roleId } = ctx as any;\n\n // Check that the caller is an admin\n const callerPermissions: string[] = requestContext?.get(MASTRA_USER_PERMISSIONS_KEY) ?? [];\n const isAdmin = callerPermissions.some((p: string) => p === '*' || p === '*:*');\n if (!isAdmin) {\n throw new HTTPException(403, { message: 'Admin access required' });\n }\n\n const rbac = getRBACProvider(mastra);\n if (!rbac?.getPermissionsForRole) {\n throw new HTTPException(404, { message: 'RBAC provider does not support role permission resolution' });\n }\n\n const permissions = await rbac.getPermissionsForRole(roleId);\n return { roleId, permissions };\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n return handleError(error, 'Error getting role permissions');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/permission-patterns\n// ============================================================================\n\nexport const GET_PERMISSION_PATTERNS_ROUTE = createRoute({\n method: 'GET',\n path: '/auth/permission-patterns',\n requiresAuth: true,\n responseType: 'json',\n responseSchema: permissionPatternsResponseSchema,\n summary: 'List valid permission patterns',\n description:\n 'Returns the authoritative list of valid permission-pattern strings. Used by Studio to validate the route→permission literals it ships and to gate the sidebar.',\n tags: ['Auth'],\n handler: async () => {\n const patterns = await loadPermissionPatterns();\n return { patterns: Object.keys(patterns ?? {}) };\n },\n});\n\n// ============================================================================\n// Export all auth routes\n// ============================================================================\n\nexport const AUTH_ROUTES = [\n GET_AUTH_CAPABILITIES_ROUTE,\n GET_CURRENT_USER_ROUTE,\n GET_SSO_LOGIN_ROUTE,\n GET_SSO_CALLBACK_ROUTE,\n POST_LOGOUT_ROUTE,\n POST_REFRESH_ROUTE,\n POST_CREDENTIALS_SIGN_IN_ROUTE,\n POST_CREDENTIALS_SIGN_UP_ROUTE,\n GET_ROLE_PERMISSIONS_ROUTE,\n GET_PERMISSION_PATTERNS_ROUTE,\n] as const;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/server/handlers/auth.ts"],"names":["mastra"],"mappings":"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","file":"chunk-R4O5HVDI.js","sourcesContent":["/**\n * Auth handlers for EE authentication capabilities.\n *\n * These routes enable Studio to:\n * - Detect available auth capabilities\n * - Initiate SSO login flows\n * - Handle OAuth callbacks\n * - Logout users\n */\n\nimport type {\n IUserProvider,\n ISessionProvider,\n ISSOProvider,\n ICredentialsProvider,\n SSOCallbackResult,\n} from '@mastra/core/auth';\nimport type { IRBACProvider, IFGAProvider, EEUser } from '@mastra/core/auth/ee';\nimport type { MastraAuthProvider } from '@mastra/core/server';\n\nimport { z } from 'zod/v4';\nimport { supportsSessionRefresh } from '../auth/helpers';\nimport { MASTRA_USER_PERMISSIONS_KEY, MASTRA_CLIENT_TYPE_HEADER, isStudioClientTypeHeader } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n capabilitiesResponseSchema,\n ssoLoginQuerySchema,\n ssoCallbackQuerySchema,\n currentUserResponseSchema,\n credentialsSignInBodySchema,\n credentialsSignUpBodySchema,\n refreshResponseSchema,\n permissionPatternsResponseSchema,\n} from '../schemas/auth';\nimport { createPublicRoute, createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\ntype BuildCapabilitiesFn = (\n auth: any,\n request: Request,\n options?: { rbac?: any; fga?: any; apiPrefix?: string },\n) => Promise<any>;\nlet _buildCapabilitiesPromise: Promise<BuildCapabilitiesFn | undefined> | undefined;\nfunction loadBuildCapabilities(): Promise<BuildCapabilitiesFn | undefined> {\n if (!_buildCapabilitiesPromise) {\n _buildCapabilitiesPromise = import('@mastra/core/auth/ee')\n .then(m => m.buildCapabilities as BuildCapabilitiesFn)\n .catch(() => {\n console.error(\n '[@mastra/server] EE auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _buildCapabilitiesPromise;\n}\n\nlet _permissionPatternsPromise: Promise<Record<string, unknown> | undefined> | undefined;\nfunction loadPermissionPatterns(): Promise<Record<string, unknown> | undefined> {\n if (!_permissionPatternsPromise) {\n _permissionPatternsPromise = import('@mastra/core/auth/ee')\n .then(m => m.PERMISSION_PATTERNS as Record<string, unknown>)\n .catch(() => {\n console.error(\n '[@mastra/server] EE auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _permissionPatternsPromise;\n}\n\n/**\n * Helper to get auth provider from Mastra instance.\n *\n * Dual auth is OPT-IN: if studio.auth is explicitly configured, Studio requests\n * use it exclusively. Otherwise, Studio requests fall back to server.auth for\n * backward compatibility.\n */\nfunction getAuthProvider(mastra: any, isStudio?: boolean): MastraAuthProvider | null {\n // Check if studio.auth is explicitly configured\n const studioConfig = mastra.getStudio?.();\n const hasStudioAuth = studioConfig?.auth && typeof studioConfig.auth.authenticateToken === 'function';\n\n // If this is a Studio request AND studio.auth is configured, use it exclusively\n if (isStudio && hasStudioAuth) {\n return studioConfig.auth as MastraAuthProvider;\n }\n\n // Otherwise (non-studio request, OR studio request without studio.auth configured),\n // fall back to server.auth for backward compatibility\n const serverConfig = mastra.getServer?.();\n if (!serverConfig?.auth) return null;\n\n // Auth can be either MastraAuthConfig or MastraAuthProvider\n // If it has authenticateToken method, it's a provider\n if (typeof serverConfig.auth.authenticateToken === 'function') {\n return serverConfig.auth as MastraAuthProvider;\n }\n\n return null;\n}\n\n/**\n * Check if the request is from Studio (via x-mastra-client-type header).\n */\nfunction isStudioRequest(request: Request): boolean {\n return isStudioClientTypeHeader(request.headers.get(MASTRA_CLIENT_TYPE_HEADER) ?? undefined);\n}\n\n/**\n * Get the public-facing origin from a request, respecting reverse proxy headers.\n * Behind a proxy (e.g. edge router), request.url contains the internal hostname,\n * so we rely on forwarded headers to reconstruct the real public origin.\n *\n * Assumes the server is behind a trusted proxy (or running locally). When\n * exposed directly to untrusted clients, the Host header is attacker-controlled\n * and must be validated upstream.\n *\n * Priority:\n * 1. X-Forwarded-Host (traditional reverse proxy) → always HTTPS. Knative's\n * queue-proxy overwrites X-Forwarded-Proto based on the internal HTTP\n * connection, so X-Forwarded-Proto is ignored here.\n * 2. Host header with X-Forwarded-Proto (AWS ALB, some proxies) → respect proto.\n * 3. Host header alone → use the scheme from request.url (covers both direct\n * HTTP access and proxies that preserve Host but don't set a proto header).\n * 4. No Host header → fall back to request.url.origin (local dev / direct access).\n */\nexport function getPublicOrigin(request: Request): string {\n const forwardedHost = request.headers.get('x-forwarded-host')?.split(',')[0]?.trim();\n if (forwardedHost) {\n return `https://${forwardedHost}`;\n }\n\n const host = request.headers.get('host');\n if (host) {\n const forwardedProto = request.headers.get('x-forwarded-proto')?.split(',')[0]?.trim();\n const proto = forwardedProto || new URL(request.url).protocol.replace(':', '');\n return `${proto}://${host}`;\n }\n\n return new URL(request.url).origin;\n}\n\n/**\n * Helper to get RBAC provider from Mastra config.\n * Checks studio config first when isStudio is true.\n */\nfunction getRBACProvider(mastra: any, isStudio?: boolean): IRBACProvider<EEUser> | undefined {\n if (isStudio) {\n const studioConfig = mastra.getStudio?.();\n if (studioConfig?.rbac) {\n return studioConfig.rbac as IRBACProvider<EEUser>;\n }\n }\n const serverConfig = mastra.getServer?.();\n return serverConfig?.rbac as IRBACProvider<EEUser> | undefined;\n}\n\n/**\n * Helper to get FGA provider from Mastra config.\n * Checks studio config first when isStudio is true.\n */\nfunction getFGAProvider(mastra: any, isStudio?: boolean): IFGAProvider<EEUser> | undefined {\n if (isStudio) {\n const studioConfig = mastra.getStudio?.();\n if (studioConfig?.fga) {\n return studioConfig.fga as IFGAProvider<EEUser>;\n }\n }\n const serverConfig = mastra.getServer?.();\n return serverConfig?.fga as IFGAProvider<EEUser> | undefined;\n}\n\n/**\n * Type guard to check if auth provider implements an interface.\n */\nfunction implementsInterface<T>(auth: unknown, method: keyof T): auth is T {\n return auth !== null && typeof auth === 'object' && typeof (auth as any)[method] === 'function';\n}\n\n// ============================================================================\n// GET /auth/capabilities\n// ============================================================================\n\nexport const GET_AUTH_CAPABILITIES_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/capabilities',\n responseType: 'json',\n responseSchema: capabilitiesResponseSchema,\n summary: 'Get auth capabilities',\n description:\n 'Returns authentication capabilities and current user info. Used by Studio to determine available features and user state.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, request, routePrefix } = ctx as any;\n\n // Check if this is a Studio request (via x-mastra-client-type header)\n const isStudio = isStudioRequest(request);\n\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth) {\n return { enabled: false, login: null };\n }\n\n const rbac = getRBACProvider(mastra, isStudio);\n const fga = getFGAProvider(mastra, isStudio);\n\n const buildCapabilities = await loadBuildCapabilities();\n if (!buildCapabilities) {\n return { enabled: false, login: null };\n }\n const capabilities = await buildCapabilities(auth, request, { rbac, fga, apiPrefix: routePrefix });\n\n // If capabilities came back without a user, the session may have expired.\n // Attempt a transparent refresh (same logic as coreAuthMiddleware) and retry.\n if (!('user' in capabilities) && supportsSessionRefresh(auth)) {\n try {\n const sessionId = await auth.getSessionIdFromRequest(request);\n if (sessionId) {\n const refreshedSession = await auth.refreshSession(sessionId);\n if (refreshedSession) {\n const sessionHeaders = await auth.getSessionHeaders(refreshedSession);\n const cookieValue = extractCookieFromHeaders(sessionHeaders);\n if (cookieValue) {\n // Rebuild capabilities with the refreshed cookie\n const refreshedRequest = new Request(request.url, {\n method: request.method,\n headers: new Headers(request.headers),\n });\n refreshedRequest.headers.set('Cookie', cookieValue);\n const refreshedCapabilities = await buildCapabilities(auth, refreshedRequest, {\n rbac,\n apiPrefix: routePrefix,\n });\n\n // Attach refresh headers so the adapter can set the new cookie\n if ('user' in refreshedCapabilities) {\n (refreshedCapabilities as any).__refreshHeaders = sessionHeaders;\n }\n return refreshedCapabilities;\n }\n }\n }\n } catch {\n // Refresh failed — return original unauthenticated capabilities\n }\n }\n\n return capabilities;\n } catch (error) {\n return handleError(error, 'Error getting auth capabilities');\n }\n },\n});\n\n/**\n * Extract a full cookie string from session headers (e.g. Set-Cookie → Cookie).\n */\nfunction extractCookieFromHeaders(headers: Record<string, string>): string | null {\n const setCookie = headers['Set-Cookie'] || headers['set-cookie'];\n if (!setCookie) return null;\n // Set-Cookie value is \"name=value; Path=/; ...\" — extract \"name=value\"\n const match = setCookie.match(/^([^;]+)/);\n return match ? (match[1] ?? null) : null;\n}\n\n// ============================================================================\n// GET /auth/me\n// ============================================================================\n\nexport const GET_CURRENT_USER_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/me',\n responseType: 'json',\n responseSchema: currentUserResponseSchema,\n summary: 'Get current user',\n description: 'Returns the currently authenticated user, or null if not authenticated.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n const auth = getAuthProvider(mastra, isStudio);\n const rbac = getRBACProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<IUserProvider>(auth, 'getCurrentUser')) {\n return null;\n }\n\n const user = await auth.getCurrentUser(request);\n if (!user) return null;\n\n // Get roles/permissions from RBAC provider if available\n let roles: string[] | undefined;\n let permissions: string[] | undefined;\n\n if (rbac) {\n try {\n roles = await rbac.getRoles(user);\n permissions = await rbac.getPermissions(user);\n } catch {\n // RBAC not available or failed\n }\n }\n\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n roles,\n permissions,\n };\n } catch (error) {\n return handleError(error, 'Error getting current user');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/sso/login\n// ============================================================================\n\nexport const GET_SSO_LOGIN_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/sso/login',\n responseType: 'datastream-response',\n queryParamSchema: ssoLoginQuerySchema,\n summary: 'Initiate SSO login',\n description: 'Returns the SSO login URL and sets PKCE cookies if needed.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, redirect_uri, request, routePrefix } = ctx as any;\n const isStudio = isStudioRequest(request);\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'getLoginUrl')) {\n throw new HTTPException(404, { message: 'SSO not configured' });\n }\n\n // Build OAuth callback URI using the configured route prefix\n const origin = getPublicOrigin(request);\n const raw = ((routePrefix as string) || '/api').trim();\n const withSlash = raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = withSlash.endsWith('/') ? withSlash.slice(0, -1) : withSlash;\n const oauthCallbackUri = `${origin}${prefix}/auth/sso/callback`;\n\n // Encode the post-login redirect in state (where user goes after auth completes)\n // State format: uuid|postLoginRedirect\n // Validate redirect_uri to prevent open-redirect attacks: allow relative paths,\n // same-origin URLs, and localhost URLs (for dev setups where Studio runs on a\n // different port).\n let postLoginRedirect = '/';\n if (redirect_uri) {\n if (!redirect_uri.startsWith('http')) {\n // Relative path — always safe\n postLoginRedirect = redirect_uri;\n } else {\n try {\n const redirectUrl = new URL(redirect_uri);\n const requestOrigin = new URL(origin);\n const isHttps = redirectUrl.protocol === 'http:' || redirectUrl.protocol === 'https:';\n const isSameOrigin = redirectUrl.origin === requestOrigin.origin;\n const isLocalhost =\n redirectUrl.hostname === 'localhost' ||\n redirectUrl.hostname === '127.0.0.1' ||\n redirectUrl.hostname === '[::1]';\n if (isHttps && (isSameOrigin || isLocalhost)) {\n postLoginRedirect = redirect_uri;\n }\n } catch {\n // Malformed URL — fall back to /\n }\n }\n }\n const stateId = crypto.randomUUID();\n const state = `${stateId}|${encodeURIComponent(postLoginRedirect)}`;\n\n const loginUrl = await Promise.resolve(auth.getLoginUrl(oauthCallbackUri, state));\n\n // Build response with optional PKCE cookies\n const headers = new Headers({ 'Content-Type': 'application/json' });\n\n // Check for PKCE cookies (e.g., MastraCloudAuthProvider)\n if (implementsInterface<ISSOProvider>(auth, 'getLoginCookies') && auth.getLoginCookies) {\n const cookies = auth.getLoginCookies(oauthCallbackUri, state);\n if (cookies?.length) {\n // PKCE cookies set for SSO state management\n for (const cookie of cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n }\n\n return new Response(JSON.stringify({ url: loginUrl }), { status: 200, headers });\n } catch (error) {\n return handleError(error, 'Error initiating SSO login');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/sso/callback\n// ============================================================================\n\nexport const GET_SSO_CALLBACK_ROUTE = createPublicRoute({\n method: 'GET',\n path: '/auth/sso/callback',\n responseType: 'datastream-response',\n queryParamSchema: ssoCallbackQuerySchema,\n summary: 'Handle SSO callback',\n description: 'Handles the OAuth callback, exchanges code for session, and redirects to the app.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, code, state, request } = ctx as any;\n const _isStudio = isStudioRequest(request); // Kept for potential future use; currently we prefer studio auth for SSO\n\n // Build base URL for redirects (Response.redirect requires absolute URL)\n const baseUrl = getPublicOrigin(request);\n\n // Extract post-login redirect from state (format: uuid|encodedRedirect)\n let redirectTo = '/';\n let stateId = state || '';\n if (state && state.includes('|')) {\n const [id, encodedRedirect] = state.split('|', 2);\n stateId = id;\n try {\n redirectTo = decodeURIComponent(encodedRedirect);\n } catch {\n redirectTo = '/';\n }\n }\n\n // Build absolute redirect URL.\n // The redirect_uri was validated at the login endpoint (same-origin or localhost\n // only), so the state should only contain safe URLs. We still apply defense-in-depth\n // checks here: allow http(s) same-origin or localhost, reject everything else.\n let absoluteRedirect: string;\n if (redirectTo.startsWith('http')) {\n try {\n const parsed = new URL(redirectTo);\n const baseOrigin = new URL(baseUrl);\n const isHttps = parsed.protocol === 'http:' || parsed.protocol === 'https:';\n const isSameOrigin = parsed.origin === baseOrigin.origin;\n const isLocalhost =\n parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';\n absoluteRedirect = isHttps && (isSameOrigin || isLocalhost) ? redirectTo : `${baseUrl}/`;\n } catch {\n absoluteRedirect = `${baseUrl}/`;\n }\n } else {\n absoluteRedirect = `${baseUrl}${redirectTo}`;\n }\n\n try {\n // For SSO callback, the redirect from the identity provider won't include\n // the x-mastra-client-type header. Prefer studio auth for SSO (it's the\n // typical SSO use case), fall back to server auth only if studio doesn't exist.\n let auth = getAuthProvider(mastra, true); // Try studio first\n\n // If studio doesn't have SSO, fall back to server\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'handleCallback')) {\n auth = getAuthProvider(mastra, false);\n }\n\n if (!auth || !implementsInterface<ISSOProvider>(auth, 'handleCallback')) {\n return Response.redirect(`${absoluteRedirect}?error=sso_not_configured`, 302);\n }\n\n // Pass cookie header to provider for PKCE validation (if supported)\n const reqCookieHeader = request.headers.get('cookie');\n if (typeof (auth as any).setCallbackCookieHeader === 'function') {\n (auth as any).setCallbackCookieHeader(reqCookieHeader);\n }\n\n const result = (await auth.handleCallback(code, stateId)) as SSOCallbackResult<EEUser>;\n const user = result.user as EEUser;\n\n // Build response headers (session cookies, etc.)\n const headers = new Headers();\n headers.set('Location', absoluteRedirect);\n\n // Set session cookies from the SSO result\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n } else if (implementsInterface<ISessionProvider>(auth, 'createSession') && result.tokens) {\n // Fallback: Create session manually for providers without cookie support\n const session = await auth.createSession(user.id, {\n accessToken: result.tokens.accessToken,\n refreshToken: result.tokens.refreshToken,\n expiresAt: result.tokens.expiresAt,\n organizationId: (user as any).organizationId,\n });\n const sessionHeaders = auth.getSessionHeaders(session);\n for (const [key, value] of Object.entries(sessionHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(null, {\n status: 302,\n headers,\n });\n } catch (error) {\n // Redirect with error (use absolute URL)\n const errorMessage = encodeURIComponent(error instanceof Error ? error.message : 'Unknown error');\n return Response.redirect(`${absoluteRedirect}?error=${errorMessage}`, 302);\n }\n },\n});\n\n// ============================================================================\n// POST /auth/logout\n// ============================================================================\n\nexport const POST_LOGOUT_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/logout',\n responseType: 'datastream-response',\n summary: 'Logout',\n description: 'Destroys the current session and returns logout redirect URL if available.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth) {\n return new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Get session ID and destroy it\n if (implementsInterface<ISessionProvider>(auth, 'getSessionIdFromRequest')) {\n const sessionId = auth.getSessionIdFromRequest(request);\n if (sessionId && implementsInterface<ISessionProvider>(auth, 'destroySession')) {\n await auth.destroySession(sessionId);\n }\n }\n\n // Get logout URL if available\n let redirectTo: string | undefined;\n if (implementsInterface<ISSOProvider>(auth, 'getLogoutUrl') && auth.getLogoutUrl) {\n // Use public origin (respects X-Forwarded-Host behind reverse proxy)\n const origin = getPublicOrigin(request);\n const logoutUrl = await auth.getLogoutUrl(origin, request);\n redirectTo = logoutUrl ?? undefined;\n }\n\n // Build response with session clearing headers\n const headers = new Headers({ 'Content-Type': 'application/json' });\n\n // Clear session cookie\n if (implementsInterface<ISessionProvider>(auth, 'getClearSessionHeaders')) {\n const clearHeaders = auth.getClearSessionHeaders();\n for (const [key, value] of Object.entries(clearHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(JSON.stringify({ success: true, redirectTo }), {\n status: 200,\n headers,\n });\n } catch (error) {\n return handleError(error, 'Error logging out');\n }\n },\n});\n\n// ============================================================================\n// POST /auth/refresh\n// ============================================================================\n\nexport const POST_REFRESH_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/refresh',\n responseType: 'datastream-response',\n responseSchema: refreshResponseSchema,\n summary: 'Refresh session',\n description: 'Refreshes the current session, extending its expiry. Sets a new session cookie on success.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (\n !auth ||\n !implementsInterface<ISessionProvider>(auth, 'refreshSession') ||\n !implementsInterface<ISessionProvider>(auth, 'getSessionIdFromRequest')\n ) {\n throw new HTTPException(404, { message: 'Session refresh not configured' });\n }\n\n // Get session ID from request\n const sessionId = auth.getSessionIdFromRequest(request);\n if (!sessionId) {\n throw new HTTPException(401, { message: 'No session' });\n }\n\n // Refresh the session\n const newSession = await auth.refreshSession(sessionId);\n if (!newSession) {\n throw new HTTPException(401, { message: 'Session expired' });\n }\n\n // Build response with new session headers\n const headers = new Headers({ 'Content-Type': 'application/json' });\n if (implementsInterface<ISessionProvider>(auth, 'getSessionHeaders')) {\n const sessionHeaders = auth.getSessionHeaders(newSession);\n for (const [key, value] of Object.entries(sessionHeaders)) {\n headers.append(key, value);\n }\n }\n\n return new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers,\n });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n return handleError(error, 'Error refreshing session');\n }\n },\n});\n\n// ============================================================================\n// POST /auth/credentials/sign-in\n// ============================================================================\n\nexport const POST_CREDENTIALS_SIGN_IN_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/credentials/sign-in',\n responseType: 'datastream-response',\n bodySchema: credentialsSignInBodySchema,\n summary: 'Sign in with credentials',\n description: 'Authenticates a user with email and password.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request, email, password } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ICredentialsProvider>(auth, 'signIn')) {\n throw new HTTPException(404, { message: 'Credentials authentication not configured' });\n }\n\n const result = await auth.signIn(email, password, request);\n const user = result.user as EEUser;\n\n const responseBody = JSON.stringify({\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n },\n token: result.token,\n });\n\n // Build response headers, including cookies from the auth provider\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n // Forward session cookies from the auth provider\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n\n return new Response(responseBody, { status: 200, headers });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n // Return a generic error for auth failures to avoid leaking info\n throw new HTTPException(401, { message: 'Invalid email or password' });\n }\n },\n});\n\n// ============================================================================\n// POST /auth/credentials/sign-up\n// ============================================================================\n\nexport const POST_CREDENTIALS_SIGN_UP_ROUTE = createPublicRoute({\n method: 'POST',\n path: '/auth/credentials/sign-up',\n responseType: 'datastream-response',\n bodySchema: credentialsSignUpBodySchema,\n summary: 'Sign up with credentials',\n description: 'Creates a new user account with email and password.',\n tags: ['Auth'],\n handler: async ctx => {\n const { mastra, request, email, password, name } = ctx as any;\n const isStudio = isStudioRequest(request);\n\n try {\n const auth = getAuthProvider(mastra, isStudio);\n\n if (!auth || !implementsInterface<ICredentialsProvider>(auth, 'signUp')) {\n throw new HTTPException(404, { message: 'Credentials authentication not configured' });\n }\n\n const result = await auth.signUp(email, password, name, request);\n const user = result.user as EEUser;\n\n const responseBody = JSON.stringify({\n user: {\n id: user.id,\n email: user.email,\n name: user.name,\n avatarUrl: user.avatarUrl,\n },\n token: result.token,\n });\n\n // Build response headers, including cookies from the auth provider\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n // Forward session cookies from the auth provider\n if (result.cookies?.length) {\n for (const cookie of result.cookies) {\n headers.append('Set-Cookie', cookie);\n }\n }\n\n return new Response(responseBody, { status: 200, headers });\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n const mastra = (ctx as any).mastra;\n mastra?.getLogger?.()?.error('Sign-up error', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n throw new HTTPException(400, { message: 'Failed to create account' });\n }\n },\n});\n\n// ============================================================================\n// GET /auth/roles/:roleId/permissions\n// ============================================================================\n\nconst rolePermissionsPathSchema = z.object({ roleId: z.string() });\nconst rolePermissionsResponseSchema = z.object({ roleId: z.string(), permissions: z.array(z.string()) });\n\nexport const GET_ROLE_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/auth/roles/:roleId/permissions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: rolePermissionsPathSchema,\n responseSchema: rolePermissionsResponseSchema,\n summary: 'Get permissions for a role',\n description:\n 'Returns the resolved permissions for a specific role. Only accessible by admin users. Used by the \"View as role\" feature.',\n tags: ['Auth'],\n handler: async ctx => {\n try {\n const { mastra, requestContext, roleId } = ctx as any;\n\n // Check that the caller is an admin\n const callerPermissions: string[] = requestContext?.get(MASTRA_USER_PERMISSIONS_KEY) ?? [];\n const isAdmin = callerPermissions.some((p: string) => p === '*' || p === '*:*');\n if (!isAdmin) {\n throw new HTTPException(403, { message: 'Admin access required' });\n }\n\n const rbac = getRBACProvider(mastra);\n if (!rbac?.getPermissionsForRole) {\n throw new HTTPException(404, { message: 'RBAC provider does not support role permission resolution' });\n }\n\n const permissions = await rbac.getPermissionsForRole(roleId);\n return { roleId, permissions };\n } catch (error) {\n if (error instanceof HTTPException) throw error;\n return handleError(error, 'Error getting role permissions');\n }\n },\n});\n\n// ============================================================================\n// GET /auth/permission-patterns\n// ============================================================================\n\nexport const GET_PERMISSION_PATTERNS_ROUTE = createRoute({\n method: 'GET',\n path: '/auth/permission-patterns',\n requiresAuth: true,\n responseType: 'json',\n responseSchema: permissionPatternsResponseSchema,\n summary: 'List valid permission patterns',\n description:\n 'Returns the authoritative list of valid permission-pattern strings. Used by Studio to validate the route→permission literals it ships and to gate the sidebar.',\n tags: ['Auth'],\n handler: async () => {\n const patterns = await loadPermissionPatterns();\n return { patterns: Object.keys(patterns ?? {}) };\n },\n});\n\n// ============================================================================\n// Export all auth routes\n// ============================================================================\n\nexport const AUTH_ROUTES = [\n GET_AUTH_CAPABILITIES_ROUTE,\n GET_CURRENT_USER_ROUTE,\n GET_SSO_LOGIN_ROUTE,\n GET_SSO_CALLBACK_ROUTE,\n POST_LOGOUT_ROUTE,\n POST_REFRESH_ROUTE,\n POST_CREDENTIALS_SIGN_IN_ROUTE,\n POST_CREDENTIALS_SIGN_UP_ROUTE,\n GET_ROLE_PERMISSIONS_ROUTE,\n GET_PERMISSION_PATTERNS_ROUTE,\n] as const;\n"]}
|