@mastra/server 1.60.0-alpha.1 → 1.60.0-alpha.11
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 +125 -0
- package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/request-context/index.d.ts +46 -1
- package/dist/{a2a-CUkzkdTZ.js → a2a-B2yosTel.js} +3 -3
- package/dist/{a2a-CUkzkdTZ.js.map → a2a-B2yosTel.js.map} +1 -1
- package/dist/{a2a-DzZHH3OH.cjs → a2a-C4JIRtLT.cjs} +4 -4
- package/dist/{a2a-DzZHH3OH.cjs.map → a2a-C4JIRtLT.cjs.map} +1 -1
- package/dist/{agent-versions-xeysPGel.cjs → agent-versions-MYjO6Wl1.cjs} +2 -2
- package/dist/{agent-versions-xeysPGel.cjs.map → agent-versions-MYjO6Wl1.cjs.map} +1 -1
- package/dist/{agent-versions-CWEnD62A.js → agent-versions-mFXaw5ma.js} +2 -2
- package/dist/{agent-versions-CWEnD62A.js.map → agent-versions-mFXaw5ma.js.map} +1 -1
- package/dist/{agents-uT8ZDE4k.js → agents-BetrUB_N.js} +7 -2
- package/dist/agents-BetrUB_N.js.map +1 -0
- package/dist/{agents-0Tw3kkD_.cjs → agents-CLv_RFQx.cjs} +18 -1
- package/dist/agents-CLv_RFQx.cjs.map +1 -0
- package/dist/{api-schema-manifest-B9exfVOY.js → api-schema-manifest-Cq7dyGz7.js} +2 -2
- package/dist/{api-schema-manifest-B9exfVOY.js.map → api-schema-manifest-Cq7dyGz7.js.map} +1 -1
- package/dist/{api-schema-manifest-C7J-8Hwe.cjs → api-schema-manifest-DBTuPeWn.cjs} +4 -3
- package/dist/{api-schema-manifest-C7J-8Hwe.cjs.map → api-schema-manifest-DBTuPeWn.cjs.map} +1 -1
- package/dist/{background-tasks-C5G2jJax.cjs → background-tasks-8M9W_27g.cjs} +2 -2
- package/dist/{background-tasks-C5G2jJax.cjs.map → background-tasks-8M9W_27g.cjs.map} +1 -1
- package/dist/{builder-registry-Dcou-kzd.cjs → builder-registry-C-NVj8w5.cjs} +3 -3
- package/dist/{builder-registry-Dcou-kzd.cjs.map → builder-registry-C-NVj8w5.cjs.map} +1 -1
- package/dist/{builder-registry-B8KyPAOP.js → builder-registry-CqLsr39q.js} +2 -2
- package/dist/{builder-registry-B8KyPAOP.js.map → builder-registry-CqLsr39q.js.map} +1 -1
- package/dist/{channels-BRoq3VKR.cjs → channels-Bn2aN-6o.cjs} +3 -3
- package/dist/{channels-BRoq3VKR.cjs.map → channels-Bn2aN-6o.cjs.map} +1 -1
- package/dist/{channels-B9yt3a2P.js → channels-BnFQESMf.js} +2 -2
- package/dist/{channels-B9yt3a2P.js.map → channels-BnFQESMf.js.map} +1 -1
- package/dist/{constants-ChBaIptn.cjs → constants-CXPpy-Ef.cjs} +7 -1
- package/dist/constants-CXPpy-Ef.cjs.map +1 -0
- package/dist/{constants-Cp1x-6sJ.js → constants-CutMu4A_.js} +7 -1
- package/dist/constants-CutMu4A_.js.map +1 -0
- package/dist/{conversations-CcFLCCeF.cjs → conversations-PF0eKhIu.cjs} +3 -3
- package/dist/{conversations-CcFLCCeF.cjs.map → conversations-PF0eKhIu.cjs.map} +1 -1
- package/dist/{dist-CAVC0nWG.cjs → dist-2zVeGGHi.cjs} +3 -2
- package/dist/{dist-CAVC0nWG.cjs.map → dist-2zVeGGHi.cjs.map} +1 -1
- package/dist/{dist-D7GkGue6.cjs → dist-8-Z5v77M.cjs} +3 -2
- package/dist/{dist-D7GkGue6.cjs.map → dist-8-Z5v77M.cjs.map} +1 -1
- package/dist/{dist-SKhVwZMV.cjs → dist-Be7Caz3Z.cjs} +3 -2
- package/dist/{dist-SKhVwZMV.cjs.map → dist-Be7Caz3Z.cjs.map} +1 -1
- package/dist/{dist-18h28zlO.cjs → dist-BfVTO0pC.cjs} +3 -2
- package/dist/{dist-18h28zlO.cjs.map → dist-BfVTO0pC.cjs.map} +1 -1
- package/dist/{dist-DhGJtn6J.cjs → dist-BrbvwbbJ.cjs} +243 -84
- package/dist/dist-BrbvwbbJ.cjs.map +1 -0
- package/dist/{dist-BD0I5lxM.js → dist-CHJcZQdS.js} +2 -2
- package/dist/{dist-BD0I5lxM.js.map → dist-CHJcZQdS.js.map} +1 -1
- package/dist/{dist-BpRGQqjE.cjs → dist-CJKQBH69.cjs} +2 -2
- package/dist/{dist-BpRGQqjE.cjs.map → dist-CJKQBH69.cjs.map} +1 -1
- package/dist/{dist-sUhxlnJz.js → dist-CRgxcDTg.js} +2 -2
- package/dist/{dist-sUhxlnJz.js.map → dist-CRgxcDTg.js.map} +1 -1
- package/dist/{dist-JdnTASYe.js → dist-CscF1cF8.js} +2 -2
- package/dist/{dist-JdnTASYe.js.map → dist-CscF1cF8.js.map} +1 -1
- package/dist/{dist-DBP9kw_8.cjs → dist-D4NzuG3G.cjs} +3 -2
- package/dist/{dist-DBP9kw_8.cjs.map → dist-D4NzuG3G.cjs.map} +1 -1
- package/dist/{dist-DKBns4r6.js → dist-DR_dRdv7.js} +241 -82
- package/dist/dist-DR_dRdv7.js.map +1 -0
- package/dist/{dist-mcwHCl2a.js → dist-F_Ql1co6.js} +2 -2
- package/dist/{dist-mcwHCl2a.js.map → dist-F_Ql1co6.js.map} +1 -1
- package/dist/{dist-C-9xUY65.js → dist-Jn3uXsoB.js} +2 -2
- package/dist/{dist-C-9xUY65.js.map → dist-Jn3uXsoB.js.map} +1 -1
- package/dist/{dist-DyBO3IVt.js → dist-bAFqx06T.js} +2 -2
- package/dist/{dist-DyBO3IVt.js.map → dist-bAFqx06T.js.map} +1 -1
- package/dist/docs/SKILL.md +2 -2
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/{docs-agents-a2a.md → docs-connections-a2a.md} +2 -2
- package/dist/docs/references/docs-server-custom-api-routes.md +2 -2
- package/dist/{dynamic-workflows-C-6vmau5.cjs → dynamic-workflows-BZ5ru36x.cjs} +3 -3
- package/dist/{dynamic-workflows-C-6vmau5.cjs.map → dynamic-workflows-BZ5ru36x.cjs.map} +1 -1
- package/dist/{dynamic-workflows-B0TE8mjA.js → dynamic-workflows-C6U0Rdoc.js} +2 -2
- package/dist/{dynamic-workflows-B0TE8mjA.js.map → dynamic-workflows-C6U0Rdoc.js.map} +1 -1
- package/dist/{editor-builder-DJUxdzC8.js → editor-builder-BDEm-gZe.js} +2 -2
- package/dist/{editor-builder-DJUxdzC8.js.map → editor-builder-BDEm-gZe.js.map} +1 -1
- package/dist/{editor-builder-DT7ypWfa.cjs → editor-builder-BmRQift0.cjs} +3 -3
- package/dist/{editor-builder-DT7ypWfa.cjs.map → editor-builder-BmRQift0.cjs.map} +1 -1
- package/dist/{editor-builder-C3ZvffGu.cjs → editor-builder-DNRVszU-.cjs} +2 -2
- package/dist/{editor-builder-C3ZvffGu.cjs.map → editor-builder-DNRVszU-.cjs.map} +1 -1
- package/dist/{editor-builder-Byg6wbi6.js → editor-builder-EP9FAtQm.js} +2 -2
- package/dist/{editor-builder-Byg6wbi6.js.map → editor-builder-EP9FAtQm.js.map} +1 -1
- package/dist/{helpers-TmTGZi8e.cjs → helpers-C54OMiDG.cjs} +2 -2
- package/dist/{helpers-TmTGZi8e.cjs.map → helpers-C54OMiDG.cjs.map} +1 -1
- package/dist/{helpers-GyeAi5YN.js → helpers-Da9nPOFL.js} +2 -2
- package/dist/{helpers-GyeAi5YN.js.map → helpers-Da9nPOFL.js.map} +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/{observability-new-endpoints-BC-dasRY.cjs → observability-new-endpoints-gRCFhnRr.cjs} +2 -2
- package/dist/{observability-new-endpoints-BC-dasRY.cjs.map → observability-new-endpoints-gRCFhnRr.cjs.map} +1 -1
- package/dist/{probe-image-size-C2F59z8Z.cjs → probe-image-size-CDCRrXNo.cjs} +140 -33
- package/dist/probe-image-size-CDCRrXNo.cjs.map +1 -0
- package/dist/{probe-image-size-mXCWYNrz.js → probe-image-size-Tf8sNZhU.js} +137 -33
- package/dist/probe-image-size-Tf8sNZhU.js.map +1 -0
- package/dist/{responses-BI25doe1.cjs → responses-CKNdSRkS.cjs} +2 -2
- package/dist/{responses-BI25doe1.cjs.map → responses-CKNdSRkS.cjs.map} +1 -1
- package/dist/{rolldown-runtime-CVvi-lCc.cjs → rolldown-runtime-Bd6kNlEP.cjs} +21 -0
- package/dist/{rolldown-runtime-DuvcJU0W.js → rolldown-runtime-maW3aOIk.js} +10 -1
- package/dist/{route-builder-BAAedfru.cjs → route-builder-CWsok5ci.cjs} +2 -2
- package/dist/{route-builder-BAAedfru.cjs.map → route-builder-CWsok5ci.cjs.map} +1 -1
- package/dist/{routes-BlSot4At.cjs → routes-DHRnM_bB.cjs} +16 -14
- package/dist/routes-DHRnM_bB.cjs.map +1 -0
- package/dist/{routes-B4p8XidO.js → routes-DMs0TJQw.js} +12 -10
- package/dist/routes-DMs0TJQw.js.map +1 -0
- package/dist/{schedules-DOK225ZZ.cjs → schedules-7YUg_TRM.cjs} +2 -2
- package/dist/{schedules-DOK225ZZ.cjs.map → schedules-7YUg_TRM.cjs.map} +1 -1
- package/dist/{schema-Bv9OdW1f-CHHI-NTr.cjs → schema-Bv9OdW1f-CxTiW8RD.cjs} +2 -2
- package/dist/{schema-Bv9OdW1f-CHHI-NTr.cjs.map → schema-Bv9OdW1f-CxTiW8RD.cjs.map} +1 -1
- package/dist/schema-CNKnRmv1.cjs +1 -0
- package/dist/{scorer-versions-CdVjOtQO.js → scorer-versions-D0_KP67E.js} +2 -2
- package/dist/{scorer-versions-CdVjOtQO.js.map → scorer-versions-D0_KP67E.js.map} +1 -1
- package/dist/{scorer-versions-CYXtxMTU.cjs → scorer-versions-mL--H4LL.cjs} +2 -2
- package/dist/{scorer-versions-CYXtxMTU.cjs.map → scorer-versions-mL--H4LL.cjs.map} +1 -1
- package/dist/server/a2a/store.cjs +1 -0
- package/dist/server/a2a/store.cjs.map +1 -1
- package/dist/server/auth/index.cjs +3 -2
- package/dist/server/auth/index.js +2 -2
- package/dist/server/browser-stream/index.cjs +1 -0
- package/dist/server/browser-stream/index.cjs.map +1 -1
- package/dist/server/constants.d.ts +5 -0
- package/dist/server/constants.d.ts.map +1 -1
- package/dist/server/handlers/a2a.cjs +2 -1
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +5 -5
- package/dist/server/handlers/agent-builder.js +4 -4
- package/dist/server/handlers/agent-controller.cjs +73 -29
- package/dist/server/handlers/agent-controller.cjs.map +1 -1
- package/dist/server/handlers/agent-controller.d.ts +42 -4
- package/dist/server/handlers/agent-controller.d.ts.map +1 -1
- package/dist/server/handlers/agent-controller.js +71 -28
- package/dist/server/handlers/agent-controller.js.map +1 -1
- package/dist/server/handlers/agent-versions.cjs +4 -3
- package/dist/server/handlers/agent-versions.cjs.map +1 -1
- package/dist/server/handlers/agent-versions.js +2 -2
- package/dist/server/handlers/agents.cjs +11 -10
- package/dist/server/handlers/agents.cjs.map +1 -1
- package/dist/server/handlers/agents.d.ts +8 -0
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +8 -7
- package/dist/server/handlers/agents.js.map +1 -1
- package/dist/server/handlers/auth.cjs +4 -3
- package/dist/server/handlers/auth.cjs.map +1 -1
- package/dist/server/handlers/auth.js +2 -2
- package/dist/server/handlers/author-enrichment.cjs +1 -0
- package/dist/server/handlers/author-enrichment.cjs.map +1 -1
- package/dist/server/handlers/authorship.cjs +2 -1
- package/dist/server/handlers/authorship.cjs.map +1 -1
- package/dist/server/handlers/authorship.js +1 -1
- package/dist/server/handlers/background-tasks.cjs +2 -1
- package/dist/server/handlers/builder-registry.cjs +2 -1
- package/dist/server/handlers/builder-registry.js +1 -1
- package/dist/server/handlers/channels.cjs +2 -1
- package/dist/server/handlers/channels.js +1 -1
- package/dist/server/handlers/conversations.cjs +4 -4
- package/dist/server/handlers/conversations.js +2 -2
- package/dist/server/handlers/datasets.cjs +3 -2
- package/dist/server/handlers/datasets.cjs.map +1 -1
- package/dist/server/handlers/datasets.js +1 -1
- package/dist/server/handlers/dynamic-workflows.cjs +2 -1
- package/dist/server/handlers/dynamic-workflows.js +1 -1
- package/dist/server/handlers/editor-builder.cjs +2 -1
- package/dist/server/handlers/editor-builder.js +1 -1
- package/dist/server/handlers/error.cjs +1 -0
- package/dist/server/handlers/error.cjs.map +1 -1
- package/dist/server/handlers/favorites-enrichment.cjs +2 -1
- package/dist/server/handlers/favorites-enrichment.cjs.map +1 -1
- package/dist/server/handlers/favorites-enrichment.js +1 -1
- package/dist/server/handlers/gateway-memory-client.cjs +1 -0
- package/dist/server/handlers/gateway-memory-client.cjs.map +1 -1
- package/dist/server/handlers/logs.cjs +3 -3
- package/dist/server/handlers/logs.js +2 -2
- package/dist/server/handlers/mcp-client-versions.cjs +4 -3
- package/dist/server/handlers/mcp-client-versions.cjs.map +1 -1
- package/dist/server/handlers/mcp-client-versions.js +2 -2
- package/dist/server/handlers/mcp.cjs +2 -2
- package/dist/server/handlers/mcp.cjs.map +1 -1
- package/dist/server/handlers/mcp.d.ts +6 -0
- package/dist/server/handlers/mcp.d.ts.map +1 -1
- package/dist/server/handlers/mcp.js +1 -1
- package/dist/server/handlers/mcp.js.map +1 -1
- package/dist/server/handlers/memory.cjs +3 -3
- package/dist/server/handlers/memory.js +2 -2
- package/dist/server/handlers/observability-list-query-schemas.cjs +1 -0
- package/dist/server/handlers/observability-list-query-schemas.cjs.map +1 -1
- package/dist/server/handlers/observability-new-endpoints.cjs +2 -1
- package/dist/server/handlers/observability-shared.cjs +2 -1
- package/dist/server/handlers/observability-shared.cjs.map +1 -1
- package/dist/server/handlers/observability-storage-schemas.cjs +1 -1
- package/dist/server/handlers/observability.cjs +3 -3
- package/dist/server/handlers/observability.js +1 -1
- package/dist/server/handlers/plans.cjs +64 -0
- package/dist/server/handlers/plans.cjs.map +1 -0
- package/dist/server/handlers/plans.d.ts +43 -0
- package/dist/server/handlers/plans.d.ts.map +1 -0
- package/dist/server/handlers/plans.js +57 -0
- package/dist/server/handlers/plans.js.map +1 -0
- package/dist/server/handlers/processor-providers.cjs +2 -1
- package/dist/server/handlers/processor-providers.cjs.map +1 -1
- package/dist/server/handlers/processors.cjs +2 -1
- package/dist/server/handlers/processors.cjs.map +1 -1
- package/dist/server/handlers/prompt-block-versions.cjs +4 -3
- package/dist/server/handlers/prompt-block-versions.cjs.map +1 -1
- package/dist/server/handlers/prompt-block-versions.js +2 -2
- package/dist/server/handlers/responses.adapter.cjs +2 -1
- package/dist/server/handlers/responses.adapter.cjs.map +1 -1
- package/dist/server/handlers/responses.adapter.js +1 -1
- package/dist/server/handlers/responses.cjs +4 -4
- package/dist/server/handlers/responses.js +2 -2
- package/dist/server/handlers/responses.storage.cjs +2 -1
- package/dist/server/handlers/responses.storage.cjs.map +1 -1
- package/dist/server/handlers/responses.storage.js +1 -1
- package/dist/server/handlers/schedules-workflows-shim.cjs +1 -1
- package/dist/server/handlers/schedules.cjs +2 -1
- package/dist/server/handlers/scorer-versions.cjs +4 -3
- package/dist/server/handlers/scorer-versions.cjs.map +1 -1
- package/dist/server/handlers/scorer-versions.js +2 -2
- package/dist/server/handlers/scores.cjs +2 -2
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/skills-sh-shared.cjs +1 -0
- package/dist/server/handlers/skills-sh-shared.cjs.map +1 -1
- package/dist/server/handlers/stored-agent-favorites.cjs +5 -4
- package/dist/server/handlers/stored-agent-favorites.cjs.map +1 -1
- package/dist/server/handlers/stored-agent-favorites.js +3 -3
- package/dist/server/handlers/stored-agents.cjs +8 -6
- package/dist/server/handlers/stored-agents.cjs.map +1 -1
- package/dist/server/handlers/stored-agents.d.ts +32 -0
- package/dist/server/handlers/stored-agents.d.ts.map +1 -1
- package/dist/server/handlers/stored-agents.js +6 -5
- package/dist/server/handlers/stored-agents.js.map +1 -1
- package/dist/server/handlers/stored-mcp-clients.cjs +4 -3
- package/dist/server/handlers/stored-mcp-clients.cjs.map +1 -1
- package/dist/server/handlers/stored-mcp-clients.js +2 -2
- package/dist/server/handlers/stored-prompt-blocks.cjs +4 -3
- package/dist/server/handlers/stored-prompt-blocks.cjs.map +1 -1
- package/dist/server/handlers/stored-prompt-blocks.js +2 -2
- package/dist/server/handlers/stored-scorers.cjs +4 -3
- package/dist/server/handlers/stored-scorers.cjs.map +1 -1
- package/dist/server/handlers/stored-scorers.js +2 -2
- package/dist/server/handlers/stored-skill-favorites.cjs +5 -4
- package/dist/server/handlers/stored-skill-favorites.cjs.map +1 -1
- package/dist/server/handlers/stored-skill-favorites.js +3 -3
- package/dist/server/handlers/stored-skills.cjs +5 -4
- package/dist/server/handlers/stored-skills.cjs.map +1 -1
- package/dist/server/handlers/stored-skills.js +3 -3
- package/dist/server/handlers/stored-workspaces.cjs +3 -2
- package/dist/server/handlers/stored-workspaces.cjs.map +1 -1
- package/dist/server/handlers/stored-workspaces.js +1 -1
- package/dist/server/handlers/system.cjs +3 -2
- package/dist/server/handlers/system.cjs.map +1 -1
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/test-utils.cjs +1 -0
- package/dist/server/handlers/test-utils.cjs.map +1 -1
- package/dist/server/handlers/tool-providers.cjs +3 -2
- package/dist/server/handlers/tool-providers.cjs.map +1 -1
- package/dist/server/handlers/tool-providers.js +1 -1
- package/dist/server/handlers/tool-schema-overrides.cjs +47 -0
- package/dist/server/handlers/tool-schema-overrides.cjs.map +1 -0
- package/dist/server/handlers/tool-schema-overrides.d.ts +13 -0
- package/dist/server/handlers/tool-schema-overrides.d.ts.map +1 -0
- package/dist/server/handlers/tool-schema-overrides.js +45 -0
- package/dist/server/handlers/tool-schema-overrides.js.map +1 -0
- package/dist/server/handlers/tools.cjs +11 -10
- package/dist/server/handlers/tools.cjs.map +1 -1
- package/dist/server/handlers/tools.d.ts.map +1 -1
- package/dist/server/handlers/tools.js +8 -7
- package/dist/server/handlers/tools.js.map +1 -1
- package/dist/server/handlers/utils.cjs +2 -1
- package/dist/server/handlers/utils.js +1 -1
- package/dist/server/handlers/validate-agent-instructions.cjs +2 -1
- package/dist/server/handlers/validate-agent-instructions.cjs.map +1 -1
- package/dist/server/handlers/validate-agent-instructions.js +1 -1
- package/dist/server/handlers/validate-avatar.cjs +1 -0
- package/dist/server/handlers/validate-avatar.cjs.map +1 -1
- package/dist/server/handlers/vector.cjs +2 -2
- package/dist/server/handlers/vector.js +1 -1
- package/dist/server/handlers/version-helpers.cjs +1 -0
- package/dist/server/handlers/version-helpers.cjs.map +1 -1
- package/dist/server/handlers/voice.cjs +1 -1
- package/dist/server/handlers/voice.js +1 -1
- package/dist/server/handlers/workflows.cjs +5 -5
- package/dist/server/handlers/workflows.js +4 -4
- package/dist/server/handlers/workspace.cjs +2 -2
- package/dist/server/handlers/workspace.js +1 -1
- package/dist/server/handlers.cjs +10 -2
- package/dist/server/handlers.d.ts +1 -0
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/handlers.js +4 -3
- package/dist/server/schemas/agents.d.ts +12 -0
- package/dist/server/schemas/agents.d.ts.map +1 -1
- package/dist/server/schemas/index.cjs +12 -9
- package/dist/server/schemas/index.js +8 -8
- package/dist/server/schemas/stored-agents.d.ts +40 -7
- package/dist/server/schemas/stored-agents.d.ts.map +1 -1
- package/dist/server/server-adapter/index.cjs +69 -6
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.d.ts +12 -0
- package/dist/server/server-adapter/index.d.ts.map +1 -1
- package/dist/server/server-adapter/index.js +66 -6
- package/dist/server/server-adapter/index.js.map +1 -1
- package/dist/server/server-adapter/mcp-auth.d.ts +43 -0
- package/dist/server/server-adapter/mcp-auth.d.ts.map +1 -0
- package/dist/server/server-adapter/routes/agents.d.ts +2 -0
- package/dist/server/server-adapter/routes/agents.d.ts.map +1 -1
- package/dist/{stored-agents-CPxfYRH9.cjs → stored-agents-D6JEb3zN.cjs} +15 -3
- package/dist/stored-agents-D6JEb3zN.cjs.map +1 -0
- package/dist/{stored-agents-BRBZM-Xl.js → stored-agents-DMW5wrF7.js} +15 -3
- package/dist/stored-agents-DMW5wrF7.js.map +1 -0
- package/dist/{stored-scorers-B__LF0Cy.js → stored-scorers-BA4suzgn.js} +2 -2
- package/dist/{stored-scorers-B__LF0Cy.js.map → stored-scorers-BA4suzgn.js.map} +1 -1
- package/dist/{stored-scorers-Cml7jPJv.cjs → stored-scorers-D8IwVM0S.cjs} +2 -2
- package/dist/{stored-scorers-Cml7jPJv.cjs.map → stored-scorers-D8IwVM0S.cjs.map} +1 -1
- package/dist/{sync-djJ8Lmds.js → sync-BG15Yae1.js} +22 -22
- package/dist/{sync-djJ8Lmds.js.map → sync-BG15Yae1.js.map} +1 -1
- package/dist/{sync-BHatXKfg.cjs → sync-C4LbbSKR.cjs} +22 -22
- package/dist/{sync-BHatXKfg.cjs.map → sync-C4LbbSKR.cjs.map} +1 -1
- package/dist/{utils-QXKhjIm6.js → utils-CljhO7OY.js} +2 -2
- package/dist/{utils-QXKhjIm6.js.map → utils-CljhO7OY.js.map} +1 -1
- package/dist/{utils-wTwyTjg3.cjs → utils-Xnn91QBW.cjs} +3 -3
- package/dist/{utils-wTwyTjg3.cjs.map → utils-Xnn91QBW.cjs.map} +1 -1
- package/dist/{utils-CmHd1Sgh.js → utils-qMLbyf2U.js} +2 -2
- package/dist/{utils-CmHd1Sgh.js.map → utils-qMLbyf2U.js.map} +1 -1
- package/dist/{utils-Bna_JCkb.cjs → utils-zkjmP1OK.cjs} +4 -4
- package/dist/{utils-Bna_JCkb.cjs.map → utils-zkjmP1OK.cjs.map} +1 -1
- package/package.json +4 -4
- package/dist/agents-0Tw3kkD_.cjs.map +0 -1
- package/dist/agents-uT8ZDE4k.js.map +0 -1
- package/dist/constants-ChBaIptn.cjs.map +0 -1
- package/dist/constants-Cp1x-6sJ.js.map +0 -1
- package/dist/dist-DKBns4r6.js.map +0 -1
- package/dist/dist-DhGJtn6J.cjs.map +0 -1
- package/dist/probe-image-size-C2F59z8Z.cjs.map +0 -1
- package/dist/probe-image-size-mXCWYNrz.js.map +0 -1
- package/dist/routes-B4p8XidO.js.map +0 -1
- package/dist/routes-BlSot4At.cjs.map +0 -1
- package/dist/schema-DkBbires.cjs +0 -1
- package/dist/stored-agents-BRBZM-Xl.js.map +0 -1
- package/dist/stored-agents-CPxfYRH9.cjs.map +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
3
|
-
const require_route_builder = require("../../route-builder-
|
|
4
|
-
const require_constants = require("../../constants-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
5
|
+
const require_constants = require("../../constants-CXPpy-Ef.cjs");
|
|
5
6
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
|
-
const require_helpers = require("../../helpers-
|
|
7
|
+
const require_helpers = require("../../helpers-C54OMiDG.cjs");
|
|
7
8
|
const require_auth = require("../../auth-B8fQdEg-.cjs");
|
|
8
9
|
let zod_v4 = require("zod/v4");
|
|
9
10
|
//#region src/server/handlers/auth.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.cjs","names":["isStudioClientTypeHeader","createPublicRoute","capabilitiesResponseSchema","supportsSessionRefresh","handleError","currentUserResponseSchema","ssoLoginQuerySchema","HTTPException","ssoCallbackQuerySchema","refreshResponseSchema","credentialsSignInBodySchema","credentialsSignUpBodySchema","z","createRoute","permissionPatternsResponseSchema"],"sources":["../../../src/server/handlers/auth.ts"],"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 { IMastraAuthProvider } 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): IMastraAuthProvider | 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 IMastraAuthProvider;\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 IMastraAuthProvider;\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.cjs","names":["isStudioClientTypeHeader","createPublicRoute","capabilitiesResponseSchema","supportsSessionRefresh","handleError","currentUserResponseSchema","ssoLoginQuerySchema","HTTPException","ssoCallbackQuerySchema","refreshResponseSchema","credentialsSignInBodySchema","credentialsSignUpBodySchema","z","createRoute","permissionPatternsResponseSchema"],"sources":["../../../src/server/handlers/auth.ts"],"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 { IMastraAuthProvider } 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): IMastraAuthProvider | 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 IMastraAuthProvider;\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 IMastraAuthProvider;\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"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
2
|
import { n as createRoute, t as createPublicRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
3
|
-
import { p as isStudioClientTypeHeader } from "../../constants-
|
|
3
|
+
import { p as isStudioClientTypeHeader } from "../../constants-CutMu4A_.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
|
-
import { p as supportsSessionRefresh } from "../../helpers-
|
|
5
|
+
import { p as supportsSessionRefresh } from "../../helpers-Da9nPOFL.js";
|
|
6
6
|
import { _ as ssoLoginQuerySchema, c as currentUserResponseSchema, d as permissionPatternsResponseSchema, m as ssoCallbackQuerySchema, o as credentialsSignInBodySchema, p as refreshResponseSchema, r as capabilitiesResponseSchema, s as credentialsSignUpBodySchema } from "../../auth-CZFXpwba.js";
|
|
7
7
|
import { z } from "zod/v4";
|
|
8
8
|
//#region src/server/handlers/auth.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"author-enrichment.cjs","names":[],"sources":["../../../src/server/handlers/author-enrichment.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { IUserProvider, User } from '@mastra/core/auth';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { IMastraAuthProvider } from '@mastra/core/server';\n\n/**\n * Public-safe resolved author shape — same fields exposed by `/auth/me`.\n * Provider-specific extras are intentionally stripped to avoid leaking\n * unexpected data through the stored-agent (and future stored-resource) APIs.\n */\nexport type ResolvedAuthor = {\n id: string;\n name?: string;\n email?: string;\n avatarUrl?: string;\n};\n\n/**\n * Locate the auth provider from a Mastra instance using the same\n * private helper pattern as `auth.ts`. Returns null when:\n * - no server config is registered;\n * - `server.auth` is a `MastraAuthConfig`, not a `MastraAuthProvider`.\n */\nfunction getAuthProvider(mastra: Mastra): IMastraAuthProvider | null {\n const serverConfig = (mastra as { getServer?: () => { auth?: unknown } }).getServer?.();\n if (!serverConfig?.auth) return null;\n if (typeof (serverConfig.auth as { authenticateToken?: unknown }).authenticateToken === 'function') {\n return serverConfig.auth as IMastraAuthProvider;\n }\n return null;\n}\n\nfunction isUserProvider(p: unknown): p is IUserProvider {\n return (\n p !== null &&\n typeof p === 'object' &&\n typeof (p as { getCurrentUser?: unknown }).getCurrentUser === 'function' &&\n typeof (p as { getUser?: unknown }).getUser === 'function'\n );\n}\n\nfunction dedupeIds(authorIds: ReadonlyArray<string | null | undefined>): string[] {\n const set = new Set<string>();\n for (const id of authorIds) {\n if (typeof id === 'string' && id.length > 0) set.add(id);\n }\n return Array.from(set);\n}\n\nfunction projectUser(user: User | null): Omit<ResolvedAuthor, 'id'> | null {\n if (!user) return null;\n const out: Omit<ResolvedAuthor, 'id'> = {};\n if (typeof user.name === 'string') out.name = user.name;\n if (typeof user.email === 'string') out.email = user.email;\n if (typeof user.avatarUrl === 'string') out.avatarUrl = user.avatarUrl;\n return out;\n}\n\n/**\n * Resolve a set of author IDs against the configured auth provider in one\n * shot. Soft-gated: returns `null` when there is no auth provider, the\n * provider does not implement `IUserProvider`, or the input has no valid\n * IDs to look up. Callers should treat `null` as \"do not attach an `author`\n * field\" so behavior matches setups without user awareness.\n *\n * When the provider exposes the optional `getUsers` batch method, the helper\n * calls it once with the deduped ID list. Otherwise it falls back to\n * `Promise.all(getUser(id))`, parallelized per unique ID. Provider errors\n * per ID are caught and treated as \"unresolved\" — they do not reject the\n * enrichment call.\n *\n * The returned map is keyed by the **requested** ID (not the user's `id`\n * field) to be robust against providers that normalize identifiers.\n */\nexport async function prepareAuthorEnrichment(\n mastra: Mastra,\n _requestContext: RequestContext,\n authorIds: ReadonlyArray<string | null | undefined>,\n): Promise<Map<string, ResolvedAuthor> | null> {\n const provider = getAuthProvider(mastra);\n if (!provider || !isUserProvider(provider)) return null;\n\n const uniqueIds = dedupeIds(authorIds);\n if (uniqueIds.length === 0) return new Map();\n\n let users: Array<User | null>;\n if (typeof provider.getUsers === 'function') {\n try {\n users = await provider.getUsers(uniqueIds);\n } catch {\n // Batch lookup failed entirely — degrade gracefully to \"no enrichment\"\n return new Map();\n }\n } else {\n users = await Promise.all(uniqueIds.map(id => provider.getUser(id).catch((): User | null => null)));\n }\n\n const map = new Map<string, ResolvedAuthor>();\n uniqueIds.forEach((id, index) => {\n const projected = projectUser(users[index] ?? null);\n if (projected !== null) {\n map.set(id, { id, ...projected });\n }\n });\n return map;\n}\n\n/**\n * Attach a resolved `author` to a record by looking it up in the map by\n * `record.authorId`. When `authors` is `null` (feature off) or the id is\n * missing from the map, the record passes through unchanged.\n */\nexport function attachAuthor<T extends { authorId?: string | null }>(\n record: T,\n authors: Map<string, ResolvedAuthor> | null,\n): T & { author?: ResolvedAuthor } {\n if (!authors) return record;\n const id = record.authorId;\n if (typeof id !== 'string' || id.length === 0) return record;\n const author = authors.get(id);\n if (!author) return record;\n return { ...record, author };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"author-enrichment.cjs","names":[],"sources":["../../../src/server/handlers/author-enrichment.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { IUserProvider, User } from '@mastra/core/auth';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { IMastraAuthProvider } from '@mastra/core/server';\n\n/**\n * Public-safe resolved author shape — same fields exposed by `/auth/me`.\n * Provider-specific extras are intentionally stripped to avoid leaking\n * unexpected data through the stored-agent (and future stored-resource) APIs.\n */\nexport type ResolvedAuthor = {\n id: string;\n name?: string;\n email?: string;\n avatarUrl?: string;\n};\n\n/**\n * Locate the auth provider from a Mastra instance using the same\n * private helper pattern as `auth.ts`. Returns null when:\n * - no server config is registered;\n * - `server.auth` is a `MastraAuthConfig`, not a `MastraAuthProvider`.\n */\nfunction getAuthProvider(mastra: Mastra): IMastraAuthProvider | null {\n const serverConfig = (mastra as { getServer?: () => { auth?: unknown } }).getServer?.();\n if (!serverConfig?.auth) return null;\n if (typeof (serverConfig.auth as { authenticateToken?: unknown }).authenticateToken === 'function') {\n return serverConfig.auth as IMastraAuthProvider;\n }\n return null;\n}\n\nfunction isUserProvider(p: unknown): p is IUserProvider {\n return (\n p !== null &&\n typeof p === 'object' &&\n typeof (p as { getCurrentUser?: unknown }).getCurrentUser === 'function' &&\n typeof (p as { getUser?: unknown }).getUser === 'function'\n );\n}\n\nfunction dedupeIds(authorIds: ReadonlyArray<string | null | undefined>): string[] {\n const set = new Set<string>();\n for (const id of authorIds) {\n if (typeof id === 'string' && id.length > 0) set.add(id);\n }\n return Array.from(set);\n}\n\nfunction projectUser(user: User | null): Omit<ResolvedAuthor, 'id'> | null {\n if (!user) return null;\n const out: Omit<ResolvedAuthor, 'id'> = {};\n if (typeof user.name === 'string') out.name = user.name;\n if (typeof user.email === 'string') out.email = user.email;\n if (typeof user.avatarUrl === 'string') out.avatarUrl = user.avatarUrl;\n return out;\n}\n\n/**\n * Resolve a set of author IDs against the configured auth provider in one\n * shot. Soft-gated: returns `null` when there is no auth provider, the\n * provider does not implement `IUserProvider`, or the input has no valid\n * IDs to look up. Callers should treat `null` as \"do not attach an `author`\n * field\" so behavior matches setups without user awareness.\n *\n * When the provider exposes the optional `getUsers` batch method, the helper\n * calls it once with the deduped ID list. Otherwise it falls back to\n * `Promise.all(getUser(id))`, parallelized per unique ID. Provider errors\n * per ID are caught and treated as \"unresolved\" — they do not reject the\n * enrichment call.\n *\n * The returned map is keyed by the **requested** ID (not the user's `id`\n * field) to be robust against providers that normalize identifiers.\n */\nexport async function prepareAuthorEnrichment(\n mastra: Mastra,\n _requestContext: RequestContext,\n authorIds: ReadonlyArray<string | null | undefined>,\n): Promise<Map<string, ResolvedAuthor> | null> {\n const provider = getAuthProvider(mastra);\n if (!provider || !isUserProvider(provider)) return null;\n\n const uniqueIds = dedupeIds(authorIds);\n if (uniqueIds.length === 0) return new Map();\n\n let users: Array<User | null>;\n if (typeof provider.getUsers === 'function') {\n try {\n users = await provider.getUsers(uniqueIds);\n } catch {\n // Batch lookup failed entirely — degrade gracefully to \"no enrichment\"\n return new Map();\n }\n } else {\n users = await Promise.all(uniqueIds.map(id => provider.getUser(id).catch((): User | null => null)));\n }\n\n const map = new Map<string, ResolvedAuthor>();\n uniqueIds.forEach((id, index) => {\n const projected = projectUser(users[index] ?? null);\n if (projected !== null) {\n map.set(id, { id, ...projected });\n }\n });\n return map;\n}\n\n/**\n * Attach a resolved `author` to a record by looking it up in the map by\n * `record.authorId`. When `authors` is `null` (feature off) or the id is\n * missing from the map, the record passes through unchanged.\n */\nexport function attachAuthor<T extends { authorId?: string | null }>(\n record: T,\n authors: Map<string, ResolvedAuthor> | null,\n): T & { author?: ResolvedAuthor } {\n if (!authors) return record;\n const id = record.authorId;\n if (typeof id !== 'string' || id.length === 0) return record;\n const author = authors.get(id);\n if (!author) return record;\n return { ...record, author };\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAS,gBAAgB,QAA4C;CACnE,MAAM,eAAgB,OAAoD,YAAY;CACtF,IAAI,CAAC,cAAc,MAAM,OAAO;CAChC,IAAI,OAAQ,aAAa,KAAyC,sBAAsB,YACtF,OAAO,aAAa;CAEtB,OAAO;AACT;AAEA,SAAS,eAAe,GAAgC;CACtD,OACE,MAAM,QACN,OAAO,MAAM,YACb,OAAQ,EAAmC,mBAAmB,cAC9D,OAAQ,EAA4B,YAAY;AAEpD;AAEA,SAAS,UAAU,WAA+D;CAChF,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,MAAM,WACf,IAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GAAG,IAAI,IAAI,EAAE;CAEzD,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,YAAY,MAAsD;CACzE,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,MAAkC,CAAC;CACzC,IAAI,OAAO,KAAK,SAAS,UAAU,IAAI,OAAO,KAAK;CACnD,IAAI,OAAO,KAAK,UAAU,UAAU,IAAI,QAAQ,KAAK;CACrD,IAAI,OAAO,KAAK,cAAc,UAAU,IAAI,YAAY,KAAK;CAC7D,OAAO;AACT;;;;;;;;;;;;;;;;;AAkBA,eAAsB,wBACpB,QACA,iBACA,WAC6C;CAC7C,MAAM,WAAW,gBAAgB,MAAM;CACvC,IAAI,CAAC,YAAY,CAAC,eAAe,QAAQ,GAAG,OAAO;CAEnD,MAAM,YAAY,UAAU,SAAS;CACrC,IAAI,UAAU,WAAW,GAAG,uBAAO,IAAI,IAAI;CAE3C,IAAI;CACJ,IAAI,OAAO,SAAS,aAAa,YAC/B,IAAI;EACF,QAAQ,MAAM,SAAS,SAAS,SAAS;CAC3C,QAAQ;EAEN,uBAAO,IAAI,IAAI;CACjB;MAEA,QAAQ,MAAM,QAAQ,IAAI,UAAU,KAAI,OAAM,SAAS,QAAQ,EAAE,CAAC,CAAC,YAAyB,IAAI,CAAC,CAAC;CAGpG,MAAM,sBAAM,IAAI,IAA4B;CAC5C,UAAU,SAAS,IAAI,UAAU;EAC/B,MAAM,YAAY,YAAY,MAAM,UAAU,IAAI;EAClD,IAAI,cAAc,MAChB,IAAI,IAAI,IAAI;GAAE;GAAI,GAAG;EAAU,CAAC;CAEpC,CAAC;CACD,OAAO;AACT;;;;;;AAOA,SAAgB,aACd,QACA,SACiC;CACjC,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,KAAK,OAAO;CAClB,IAAI,OAAO,OAAO,YAAY,GAAG,WAAW,GAAG,OAAO;CACtD,MAAM,SAAS,QAAQ,IAAI,EAAE;CAC7B,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO;EAAE,GAAG;EAAQ;CAAO;AAC7B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
3
|
-
const require_constants = require("../../constants-
|
|
4
|
+
const require_constants = require("../../constants-CXPpy-Ef.cjs");
|
|
4
5
|
let _mastra_core_auth_ee = require("@mastra/core/auth/ee");
|
|
5
6
|
//#region src/server/handlers/authorship.ts
|
|
6
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorship.cjs","names":["MASTRA_RESOURCE_ID_KEY","MASTRA_USER_KEY","MASTRA_USER_PERMISSIONS_KEY","HTTPException"],"sources":["../../../src/server/handlers/authorship.ts"],"sourcesContent":["import { matchesPermission } from '@mastra/core/auth/ee';\nimport type { RequestContext } from '@mastra/core/di';\n\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_USER_KEY, MASTRA_USER_PERMISSIONS_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\n\n/**\n * Shape of a stored record that carries ownership + visibility metadata.\n * Used by `matchesAuthorFilter` and the access-assertion helpers.\n */\nexport type OwnedRecord = {\n authorId?: string | null;\n visibility?: 'private' | 'public';\n};\n\n/**\n * Returns the author id associated with the authenticated caller, or `null`\n * if auth is not configured / the caller cannot be resolved.\n *\n * Prefers `MASTRA_RESOURCE_ID_KEY` (set by `authConfig.mapUserToResourceId`)\n * and falls back to `user.id` on the authenticated user object.\n */\nexport function getCallerAuthorId(requestContext: RequestContext): string | null {\n const resourceId = requestContext.get(MASTRA_RESOURCE_ID_KEY);\n if (typeof resourceId === 'string' && resourceId.length > 0) {\n return resourceId;\n }\n\n const user = requestContext.get(MASTRA_USER_KEY);\n if (user && typeof user === 'object' && 'id' in user) {\n const id = (user as { id: unknown }).id;\n if (typeof id === 'string' && id.length > 0) {\n return id;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the list of permission strings currently attached to the caller by\n * the RBAC provider. Returns an empty array when RBAC isn't configured.\n */\nexport function getCallerPermissions(requestContext: RequestContext): string[] {\n const raw = requestContext.get(MASTRA_USER_PERMISSIONS_KEY);\n if (Array.isArray(raw)) {\n return raw.filter((p): p is string => typeof p === 'string');\n }\n return [];\n}\n\n/**\n * True if the caller holds a wildcard permission that lets them manage a\n * resource they don't own (e.g. admins listing agents across tenants).\n *\n * Recognizes `*`, `<resource>:*`, and `<resource>:admin`.\n */\nexport function hasAdminBypass(requestContext: RequestContext, resource: string): boolean {\n const permissions = getCallerPermissions(requestContext);\n if (permissions.length === 0) return false;\n const wildcardAll = '*';\n const resourceWildcard = `${resource}:*`;\n const resourceAdmin = `${resource}:admin`;\n return permissions.some(p => p === wildcardAll || p === resourceWildcard || p === resourceAdmin);\n}\n\n/**\n * True if the caller holds a permission explicitly scoped to a specific\n * resource id — e.g. `agents:read:agent-123` or `agents:*:agent-123`.\n *\n * Broad grants without a resource-id segment (e.g. the role-default\n * `agents:execute`) are intentionally NOT treated as satisfying ownership\n * overrides. Those broad grants already gate route access at the\n * `requiresPermission` layer; giving them a second life as per-record\n * overrides would defeat the owner/visibility model.\n *\n * When called without `resourceId` (the legacy shape), falls back to the\n * original \"any matching permission\" behavior.\n */\nexport function hasScopedPermission(args: {\n requestContext: RequestContext;\n resource: string;\n action: string;\n resourceId?: string;\n}): boolean {\n const { requestContext, resource, action, resourceId } = args;\n const permissions = getCallerPermissions(requestContext);\n if (permissions.length === 0) return false;\n\n if (!resourceId) {\n const required = `${resource}:${action}`;\n return permissions.some(p => matchesPermission(p, required));\n }\n\n const required = `${resource}:${action}:${resourceId}`;\n return permissions.some(p => {\n // Only honor grants that explicitly name a resource id. A granted\n // permission with just `<resource>:<action>` (no id segment) is\n // considered a broad role grant, not a per-record override.\n const parts = p.split(':');\n if (parts.length < 3) return false;\n return matchesPermission(p, required);\n });\n}\n\nexport type AuthorFilter =\n | { kind: 'unrestricted' }\n | { kind: 'exact'; authorId: string }\n | { kind: 'ownedOrPublic'; callerAuthorId: string }\n | { kind: 'publicOnly' }\n | { kind: 'ownedOrPublicOthers'; callerAuthorId: string; queryAuthorId: string };\n\n/**\n * Resolves the filter to apply when listing owner-scoped records.\n *\n * Behavior matrix:\n * - Admin bypass + no query overrides → `unrestricted`.\n * - Admin bypass + `authorId=X` → `exact` (all of X's rows).\n * - `visibility=public` (any caller) → `publicOnly` (aggregate public rows across owners).\n * - `authorId=X`, caller === X → `exact` (all of caller's rows).\n * - `authorId=X`, caller !== X (non-admin) → `ownedOrPublicOthers` (only X's public rows).\n * - No caller (auth off) → `unrestricted` (or `exact` if query supplied).\n * - Default → `ownedOrPublic` (caller's rows + legacy unowned + any public rows).\n */\nexport function resolveAuthorFilter(args: {\n requestContext: RequestContext;\n resource: string;\n queryAuthorId?: string;\n queryVisibility?: 'public';\n}): AuthorFilter {\n const { requestContext, resource, queryAuthorId, queryVisibility } = args;\n const callerAuthorId = getCallerAuthorId(requestContext);\n const bypass = hasAdminBypass(requestContext, resource);\n\n if (queryVisibility === 'public' && !queryAuthorId) {\n return { kind: 'publicOnly' };\n }\n\n if (bypass) {\n return queryAuthorId ? { kind: 'exact', authorId: queryAuthorId } : { kind: 'unrestricted' };\n }\n\n // Auth isn't configured (no caller) → treat as unrestricted. The route's\n // `requiresAuth`/`requiresPermission` is what gates access in that mode.\n if (!callerAuthorId) {\n return queryAuthorId ? { kind: 'exact', authorId: queryAuthorId } : { kind: 'unrestricted' };\n }\n\n if (queryAuthorId) {\n if (queryAuthorId === callerAuthorId) {\n return { kind: 'exact', authorId: callerAuthorId };\n }\n // Non-owner asking about another user: only that user's public rows are visible.\n return { kind: 'ownedOrPublicOthers', callerAuthorId, queryAuthorId };\n }\n\n return { kind: 'ownedOrPublic', callerAuthorId };\n}\n\n/**\n * Returns `true` if the record is visible to the caller given the resolved\n * filter. See `resolveAuthorFilter` for the filter semantics.\n *\n * Legacy rows with `authorId == null` are treated as public (visible to all).\n */\nexport function matchesAuthorFilter(record: OwnedRecord, filter: AuthorFilter): boolean {\n const owner = record.authorId ?? null;\n const isPublic = record.visibility === 'public';\n\n switch (filter.kind) {\n case 'unrestricted':\n return true;\n case 'exact':\n return owner === filter.authorId;\n case 'ownedOrPublic':\n return owner === null || owner === filter.callerAuthorId || isPublic;\n case 'publicOnly':\n return owner === null || isPublic;\n case 'ownedOrPublicOthers':\n // Filtering by another author's rows: only expose their public ones.\n // Legacy unowned rows match if the query is for `null`; here the query\n // is always for a concrete id, so unowned rows don't match.\n return owner === filter.queryAuthorId && isPublic;\n }\n}\n\n/**\n * Asserts the caller has read access to the record. Throws 404 if not.\n *\n * Read access is granted when:\n * - The record has no owner (legacy/public), OR\n * - The record is marked `visibility: 'public'`, OR\n * - The caller owns the record, OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:read` or `<resource>:read:<resourceId>`.\n */\nexport function assertReadAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (record.visibility === 'public') return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n // No authenticated user on the request context means auth is not configured\n // (single-user/dev mode). When auth IS configured, coreAuthMiddleware\n // rejects unauthenticated requests with 401 before they reach handlers,\n // so an absent user here genuinely means no auth provider.\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return;\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'read', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has execute access to the record. Throws 404 if not.\n *\n * Execute access is granted when:\n * - The record has no owner (legacy/public), OR\n * - The record is marked `visibility: 'public'`, OR\n * - The caller owns the record, OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:execute` / `<resource>:execute:<resourceId>`, OR\n * - The caller holds `<resource>:read` / `<resource>:read:<resourceId>`\n * (read implies the ability to consume/chat with the resource).\n */\nexport function assertExecuteAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (record.visibility === 'public') return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'execute', resourceId })) {\n return;\n }\n if (hasScopedPermission({ requestContext, resource, action: 'read', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has write access (edit or delete) to the record.\n * Throws 404 if not.\n *\n * Write access is granted when:\n * - The record has no owner (legacy), OR\n * - The caller owns the record, OR\n * - The caller has admin bypass, OR\n * - The caller holds `<resource>:<action>` or `<resource>:<action>:<resourceId>`.\n *\n * `visibility: 'public'` alone does NOT grant write access.\n */\nexport function assertWriteAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n action: 'edit' | 'delete' | 'write';\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, action, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action, resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has share access to the record. Throws 404 if not.\n *\n * Share access controls who can change a record's audience/visibility\n * (e.g. flipping `private` ↔ `public`). It is intentionally separate from\n * `write`: a caller with only `<resource>:write` MUST NOT be able to flip\n * visibility — that would let any editor expose private records.\n *\n * Share access is granted when:\n * - The record has no owner (legacy), OR\n * - The caller owns the record (creators can share their own records), OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:share` / `<resource>:share:<resourceId>`\n * (or any pattern that matches it, e.g. `*:share`).\n *\n * `visibility: 'public'` does NOT grant share access — being readable doesn't\n * imply the right to change who else can read.\n */\nexport function assertShareAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'share', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Alias for `assertWriteAccess` with `action: 'edit'`. Prefer `assertWriteAccess`\n * in new code so the action is explicit.\n */\nexport function assertOwnership(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n assertWriteAccess({ ...args, action: 'edit' });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"authorship.cjs","names":["MASTRA_RESOURCE_ID_KEY","MASTRA_USER_KEY","MASTRA_USER_PERMISSIONS_KEY","HTTPException"],"sources":["../../../src/server/handlers/authorship.ts"],"sourcesContent":["import { matchesPermission } from '@mastra/core/auth/ee';\nimport type { RequestContext } from '@mastra/core/di';\n\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_USER_KEY, MASTRA_USER_PERMISSIONS_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\n\n/**\n * Shape of a stored record that carries ownership + visibility metadata.\n * Used by `matchesAuthorFilter` and the access-assertion helpers.\n */\nexport type OwnedRecord = {\n authorId?: string | null;\n visibility?: 'private' | 'public';\n};\n\n/**\n * Returns the author id associated with the authenticated caller, or `null`\n * if auth is not configured / the caller cannot be resolved.\n *\n * Prefers `MASTRA_RESOURCE_ID_KEY` (set by `authConfig.mapUserToResourceId`)\n * and falls back to `user.id` on the authenticated user object.\n */\nexport function getCallerAuthorId(requestContext: RequestContext): string | null {\n const resourceId = requestContext.get(MASTRA_RESOURCE_ID_KEY);\n if (typeof resourceId === 'string' && resourceId.length > 0) {\n return resourceId;\n }\n\n const user = requestContext.get(MASTRA_USER_KEY);\n if (user && typeof user === 'object' && 'id' in user) {\n const id = (user as { id: unknown }).id;\n if (typeof id === 'string' && id.length > 0) {\n return id;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the list of permission strings currently attached to the caller by\n * the RBAC provider. Returns an empty array when RBAC isn't configured.\n */\nexport function getCallerPermissions(requestContext: RequestContext): string[] {\n const raw = requestContext.get(MASTRA_USER_PERMISSIONS_KEY);\n if (Array.isArray(raw)) {\n return raw.filter((p): p is string => typeof p === 'string');\n }\n return [];\n}\n\n/**\n * True if the caller holds a wildcard permission that lets them manage a\n * resource they don't own (e.g. admins listing agents across tenants).\n *\n * Recognizes `*`, `<resource>:*`, and `<resource>:admin`.\n */\nexport function hasAdminBypass(requestContext: RequestContext, resource: string): boolean {\n const permissions = getCallerPermissions(requestContext);\n if (permissions.length === 0) return false;\n const wildcardAll = '*';\n const resourceWildcard = `${resource}:*`;\n const resourceAdmin = `${resource}:admin`;\n return permissions.some(p => p === wildcardAll || p === resourceWildcard || p === resourceAdmin);\n}\n\n/**\n * True if the caller holds a permission explicitly scoped to a specific\n * resource id — e.g. `agents:read:agent-123` or `agents:*:agent-123`.\n *\n * Broad grants without a resource-id segment (e.g. the role-default\n * `agents:execute`) are intentionally NOT treated as satisfying ownership\n * overrides. Those broad grants already gate route access at the\n * `requiresPermission` layer; giving them a second life as per-record\n * overrides would defeat the owner/visibility model.\n *\n * When called without `resourceId` (the legacy shape), falls back to the\n * original \"any matching permission\" behavior.\n */\nexport function hasScopedPermission(args: {\n requestContext: RequestContext;\n resource: string;\n action: string;\n resourceId?: string;\n}): boolean {\n const { requestContext, resource, action, resourceId } = args;\n const permissions = getCallerPermissions(requestContext);\n if (permissions.length === 0) return false;\n\n if (!resourceId) {\n const required = `${resource}:${action}`;\n return permissions.some(p => matchesPermission(p, required));\n }\n\n const required = `${resource}:${action}:${resourceId}`;\n return permissions.some(p => {\n // Only honor grants that explicitly name a resource id. A granted\n // permission with just `<resource>:<action>` (no id segment) is\n // considered a broad role grant, not a per-record override.\n const parts = p.split(':');\n if (parts.length < 3) return false;\n return matchesPermission(p, required);\n });\n}\n\nexport type AuthorFilter =\n | { kind: 'unrestricted' }\n | { kind: 'exact'; authorId: string }\n | { kind: 'ownedOrPublic'; callerAuthorId: string }\n | { kind: 'publicOnly' }\n | { kind: 'ownedOrPublicOthers'; callerAuthorId: string; queryAuthorId: string };\n\n/**\n * Resolves the filter to apply when listing owner-scoped records.\n *\n * Behavior matrix:\n * - Admin bypass + no query overrides → `unrestricted`.\n * - Admin bypass + `authorId=X` → `exact` (all of X's rows).\n * - `visibility=public` (any caller) → `publicOnly` (aggregate public rows across owners).\n * - `authorId=X`, caller === X → `exact` (all of caller's rows).\n * - `authorId=X`, caller !== X (non-admin) → `ownedOrPublicOthers` (only X's public rows).\n * - No caller (auth off) → `unrestricted` (or `exact` if query supplied).\n * - Default → `ownedOrPublic` (caller's rows + legacy unowned + any public rows).\n */\nexport function resolveAuthorFilter(args: {\n requestContext: RequestContext;\n resource: string;\n queryAuthorId?: string;\n queryVisibility?: 'public';\n}): AuthorFilter {\n const { requestContext, resource, queryAuthorId, queryVisibility } = args;\n const callerAuthorId = getCallerAuthorId(requestContext);\n const bypass = hasAdminBypass(requestContext, resource);\n\n if (queryVisibility === 'public' && !queryAuthorId) {\n return { kind: 'publicOnly' };\n }\n\n if (bypass) {\n return queryAuthorId ? { kind: 'exact', authorId: queryAuthorId } : { kind: 'unrestricted' };\n }\n\n // Auth isn't configured (no caller) → treat as unrestricted. The route's\n // `requiresAuth`/`requiresPermission` is what gates access in that mode.\n if (!callerAuthorId) {\n return queryAuthorId ? { kind: 'exact', authorId: queryAuthorId } : { kind: 'unrestricted' };\n }\n\n if (queryAuthorId) {\n if (queryAuthorId === callerAuthorId) {\n return { kind: 'exact', authorId: callerAuthorId };\n }\n // Non-owner asking about another user: only that user's public rows are visible.\n return { kind: 'ownedOrPublicOthers', callerAuthorId, queryAuthorId };\n }\n\n return { kind: 'ownedOrPublic', callerAuthorId };\n}\n\n/**\n * Returns `true` if the record is visible to the caller given the resolved\n * filter. See `resolveAuthorFilter` for the filter semantics.\n *\n * Legacy rows with `authorId == null` are treated as public (visible to all).\n */\nexport function matchesAuthorFilter(record: OwnedRecord, filter: AuthorFilter): boolean {\n const owner = record.authorId ?? null;\n const isPublic = record.visibility === 'public';\n\n switch (filter.kind) {\n case 'unrestricted':\n return true;\n case 'exact':\n return owner === filter.authorId;\n case 'ownedOrPublic':\n return owner === null || owner === filter.callerAuthorId || isPublic;\n case 'publicOnly':\n return owner === null || isPublic;\n case 'ownedOrPublicOthers':\n // Filtering by another author's rows: only expose their public ones.\n // Legacy unowned rows match if the query is for `null`; here the query\n // is always for a concrete id, so unowned rows don't match.\n return owner === filter.queryAuthorId && isPublic;\n }\n}\n\n/**\n * Asserts the caller has read access to the record. Throws 404 if not.\n *\n * Read access is granted when:\n * - The record has no owner (legacy/public), OR\n * - The record is marked `visibility: 'public'`, OR\n * - The caller owns the record, OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:read` or `<resource>:read:<resourceId>`.\n */\nexport function assertReadAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (record.visibility === 'public') return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n // No authenticated user on the request context means auth is not configured\n // (single-user/dev mode). When auth IS configured, coreAuthMiddleware\n // rejects unauthenticated requests with 401 before they reach handlers,\n // so an absent user here genuinely means no auth provider.\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return;\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'read', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has execute access to the record. Throws 404 if not.\n *\n * Execute access is granted when:\n * - The record has no owner (legacy/public), OR\n * - The record is marked `visibility: 'public'`, OR\n * - The caller owns the record, OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:execute` / `<resource>:execute:<resourceId>`, OR\n * - The caller holds `<resource>:read` / `<resource>:read:<resourceId>`\n * (read implies the ability to consume/chat with the resource).\n */\nexport function assertExecuteAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (record.visibility === 'public') return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'execute', resourceId })) {\n return;\n }\n if (hasScopedPermission({ requestContext, resource, action: 'read', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has write access (edit or delete) to the record.\n * Throws 404 if not.\n *\n * Write access is granted when:\n * - The record has no owner (legacy), OR\n * - The caller owns the record, OR\n * - The caller has admin bypass, OR\n * - The caller holds `<resource>:<action>` or `<resource>:<action>:<resourceId>`.\n *\n * `visibility: 'public'` alone does NOT grant write access.\n */\nexport function assertWriteAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n action: 'edit' | 'delete' | 'write';\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, action, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action, resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Asserts the caller has share access to the record. Throws 404 if not.\n *\n * Share access controls who can change a record's audience/visibility\n * (e.g. flipping `private` ↔ `public`). It is intentionally separate from\n * `write`: a caller with only `<resource>:write` MUST NOT be able to flip\n * visibility — that would let any editor expose private records.\n *\n * Share access is granted when:\n * - The record has no owner (legacy), OR\n * - The caller owns the record (creators can share their own records), OR\n * - The caller has admin bypass (`*`, `<resource>:*`, `<resource>:admin`), OR\n * - The caller holds `<resource>:share` / `<resource>:share:<resourceId>`\n * (or any pattern that matches it, e.g. `*:share`).\n *\n * `visibility: 'public'` does NOT grant share access — being readable doesn't\n * imply the right to change who else can read.\n */\nexport function assertShareAccess(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n const { requestContext, resource, resourceId, record } = args;\n const owner = record.authorId ?? null;\n\n if (owner === null) return;\n if (hasAdminBypass(requestContext, resource)) return;\n\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return; // No auth configured (see assertReadAccess)\n if (callerAuthorId === owner) return;\n\n if (hasScopedPermission({ requestContext, resource, action: 'share', resourceId })) {\n return;\n }\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n/**\n * Alias for `assertWriteAccess` with `action: 'edit'`. Prefer `assertWriteAccess`\n * in new code so the action is explicit.\n */\nexport function assertOwnership(args: {\n requestContext: RequestContext;\n resource: string;\n resourceId?: string;\n record: OwnedRecord;\n}): void {\n assertWriteAccess({ ...args, action: 'edit' });\n}\n"],"mappings":";;;;;;;;;;;;;AAsBA,SAAgB,kBAAkB,gBAA+C;CAC/E,MAAM,aAAa,eAAe,IAAIA,kBAAAA,sBAAsB;CAC5D,IAAI,OAAO,eAAe,YAAY,WAAW,SAAS,GACxD,OAAO;CAGT,MAAM,OAAO,eAAe,IAAIC,kBAAAA,eAAe;CAC/C,IAAI,QAAQ,OAAO,SAAS,YAAY,QAAQ,MAAM;EACpD,MAAM,KAAM,KAAyB;EACrC,IAAI,OAAO,OAAO,YAAY,GAAG,SAAS,GACxC,OAAO;CAEX;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,qBAAqB,gBAA0C;CAC7E,MAAM,MAAM,eAAe,IAAIC,kBAAAA,2BAA2B;CAC1D,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,QAAQ,MAAmB,OAAO,MAAM,QAAQ;CAE7D,OAAO,CAAC;AACV;;;;;;;AAQA,SAAgB,eAAe,gBAAgC,UAA2B;CACxF,MAAM,cAAc,qBAAqB,cAAc;CACvD,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,MAAM,cAAc;CACpB,MAAM,mBAAmB,GAAG,SAAS;CACrC,MAAM,gBAAgB,GAAG,SAAS;CAClC,OAAO,YAAY,MAAK,MAAK,MAAM,eAAe,MAAM,oBAAoB,MAAM,aAAa;AACjG;;;;;;;;;;;;;;AAeA,SAAgB,oBAAoB,MAKxB;CACV,MAAM,EAAE,gBAAgB,UAAU,QAAQ,eAAe;CACzD,MAAM,cAAc,qBAAqB,cAAc;CACvD,IAAI,YAAY,WAAW,GAAG,OAAO;CAErC,IAAI,CAAC,YAAY;EACf,MAAM,WAAW,GAAG,SAAS,GAAG;EAChC,OAAO,YAAY,MAAK,OAAA,GAAA,qBAAA,kBAAA,CAAuB,GAAG,QAAQ,CAAC;CAC7D;CAEA,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG;CAC1C,OAAO,YAAY,MAAK,MAAK;EAK3B,IADc,EAAE,MAAM,GACd,CAAC,CAAC,SAAS,GAAG,OAAO;EAC7B,QAAA,GAAA,qBAAA,kBAAA,CAAyB,GAAG,QAAQ;CACtC,CAAC;AACH;;;;;;;;;;;;;AAqBA,SAAgB,oBAAoB,MAKnB;CACf,MAAM,EAAE,gBAAgB,UAAU,eAAe,oBAAoB;CACrE,MAAM,iBAAiB,kBAAkB,cAAc;CACvD,MAAM,SAAS,eAAe,gBAAgB,QAAQ;CAEtD,IAAI,oBAAoB,YAAY,CAAC,eACnC,OAAO,EAAE,MAAM,aAAa;CAG9B,IAAI,QACF,OAAO,gBAAgB;EAAE,MAAM;EAAS,UAAU;CAAc,IAAI,EAAE,MAAM,eAAe;CAK7F,IAAI,CAAC,gBACH,OAAO,gBAAgB;EAAE,MAAM;EAAS,UAAU;CAAc,IAAI,EAAE,MAAM,eAAe;CAG7F,IAAI,eAAe;EACjB,IAAI,kBAAkB,gBACpB,OAAO;GAAE,MAAM;GAAS,UAAU;EAAe;EAGnD,OAAO;GAAE,MAAM;GAAuB;GAAgB;EAAc;CACtE;CAEA,OAAO;EAAE,MAAM;EAAiB;CAAe;AACjD;;;;;;;AAQA,SAAgB,oBAAoB,QAAqB,QAA+B;CACtF,MAAM,QAAQ,OAAO,YAAY;CACjC,MAAM,WAAW,OAAO,eAAe;CAEvC,QAAQ,OAAO,MAAf;EACE,KAAK,gBACH,OAAO;EACT,KAAK,SACH,OAAO,UAAU,OAAO;EAC1B,KAAK,iBACH,OAAO,UAAU,QAAQ,UAAU,OAAO,kBAAkB;EAC9D,KAAK,cACH,OAAO,UAAU,QAAQ;EAC3B,KAAK,uBAIH,OAAO,UAAU,OAAO,iBAAiB;CAC7C;AACF;;;;;;;;;;;AAYA,SAAgB,iBAAiB,MAKxB;CACP,MAAM,EAAE,gBAAgB,UAAU,YAAY,WAAW;CACzD,MAAM,QAAQ,OAAO,YAAY;CAEjC,IAAI,UAAU,MAAM;CACpB,IAAI,OAAO,eAAe,UAAU;CACpC,IAAI,eAAe,gBAAgB,QAAQ,GAAG;CAE9C,MAAM,iBAAiB,kBAAkB,cAAc;CAKvD,IAAI,CAAC,kBAAkB,CAAC,eAAe,IAAA,cAAmB,GAAG;CAC7D,IAAI,mBAAmB,OAAO;CAE9B,IAAI,oBAAoB;EAAE;EAAgB;EAAU,QAAQ;EAAQ;CAAW,CAAC,GAC9E;CAGF,MAAM,IAAIC,uBAAAA,cAAc,KAAK,EAAE,SAAS,YAAY,CAAC;AACvD;;;;;;;;;;;;;AAcA,SAAgB,oBAAoB,MAK3B;CACP,MAAM,EAAE,gBAAgB,UAAU,YAAY,WAAW;CACzD,MAAM,QAAQ,OAAO,YAAY;CAEjC,IAAI,UAAU,MAAM;CACpB,IAAI,OAAO,eAAe,UAAU;CACpC,IAAI,eAAe,gBAAgB,QAAQ,GAAG;CAE9C,MAAM,iBAAiB,kBAAkB,cAAc;CACvD,IAAI,CAAC,kBAAkB,CAAC,eAAe,IAAA,cAAmB,GAAG;CAC7D,IAAI,mBAAmB,OAAO;CAE9B,IAAI,oBAAoB;EAAE;EAAgB;EAAU,QAAQ;EAAW;CAAW,CAAC,GACjF;CAEF,IAAI,oBAAoB;EAAE;EAAgB;EAAU,QAAQ;EAAQ;CAAW,CAAC,GAC9E;CAGF,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,YAAY,CAAC;AACvD;;;;;;;;;;;;;AAcA,SAAgB,kBAAkB,MAMzB;CACP,MAAM,EAAE,gBAAgB,UAAU,YAAY,QAAQ,WAAW;CACjE,MAAM,QAAQ,OAAO,YAAY;CAEjC,IAAI,UAAU,MAAM;CACpB,IAAI,eAAe,gBAAgB,QAAQ,GAAG;CAE9C,MAAM,iBAAiB,kBAAkB,cAAc;CACvD,IAAI,CAAC,kBAAkB,CAAC,eAAe,IAAA,cAAmB,GAAG;CAC7D,IAAI,mBAAmB,OAAO;CAE9B,IAAI,oBAAoB;EAAE;EAAgB;EAAU;EAAQ;CAAW,CAAC,GACtE;CAGF,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,YAAY,CAAC;AACvD;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,kBAAkB,MAKzB;CACP,MAAM,EAAE,gBAAgB,UAAU,YAAY,WAAW;CACzD,MAAM,QAAQ,OAAO,YAAY;CAEjC,IAAI,UAAU,MAAM;CACpB,IAAI,eAAe,gBAAgB,QAAQ,GAAG;CAE9C,MAAM,iBAAiB,kBAAkB,cAAc;CACvD,IAAI,CAAC,kBAAkB,CAAC,eAAe,IAAA,cAAmB,GAAG;CAC7D,IAAI,mBAAmB,OAAO;CAE9B,IAAI,oBAAoB;EAAE;EAAgB;EAAU,QAAQ;EAAS;CAAW,CAAC,GAC/E;CAGF,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,YAAY,CAAC;AACvD;;;;;AAMA,SAAgB,gBAAgB,MAKvB;CACP,kBAAkB;EAAE,GAAG;EAAM,QAAQ;CAAO,CAAC;AAC/C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
|
-
import { a as MASTRA_RESOURCE_ID_KEY, c as MASTRA_USER_KEY, l as MASTRA_USER_PERMISSIONS_KEY } from "../../constants-
|
|
2
|
+
import { a as MASTRA_RESOURCE_ID_KEY, c as MASTRA_USER_KEY, l as MASTRA_USER_PERMISSIONS_KEY } from "../../constants-CutMu4A_.js";
|
|
3
3
|
import { matchesPermission } from "@mastra/core/auth/ee";
|
|
4
4
|
//#region src/server/handlers/authorship.ts
|
|
5
5
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_background_tasks = require("../../background-tasks-8M9W_27g.cjs");
|
|
3
4
|
exports.BACKGROUND_TASK_STREAM_ROUTE = require_background_tasks.BACKGROUND_TASK_STREAM_ROUTE;
|
|
4
5
|
exports.GET_BACKGROUND_TASK_ROUTE = require_background_tasks.GET_BACKGROUND_TASK_ROUTE;
|
|
5
6
|
exports.LIST_BACKGROUND_TASKS_ROUTE = require_background_tasks.LIST_BACKGROUND_TASKS_ROUTE;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_builder_registry = require("../../builder-registry-C-NVj8w5.cjs");
|
|
3
4
|
exports.BUILDER_REGISTRY_INSTALL_ROUTE = require_builder_registry.BUILDER_REGISTRY_INSTALL_ROUTE;
|
|
4
5
|
exports.BUILDER_REGISTRY_POPULAR_ROUTE = require_builder_registry.BUILDER_REGISTRY_POPULAR_ROUTE;
|
|
5
6
|
exports.BUILDER_REGISTRY_PREVIEW_ROUTE = require_builder_registry.BUILDER_REGISTRY_PREVIEW_ROUTE;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as LIST_BUILDER_REGISTRIES_ROUTE, i as BUILDER_REGISTRY_SEARCH_ROUTE, n as BUILDER_REGISTRY_POPULAR_ROUTE, r as BUILDER_REGISTRY_PREVIEW_ROUTE, t as BUILDER_REGISTRY_INSTALL_ROUTE } from "../../builder-registry-
|
|
1
|
+
import { a as LIST_BUILDER_REGISTRIES_ROUTE, i as BUILDER_REGISTRY_SEARCH_ROUTE, n as BUILDER_REGISTRY_POPULAR_ROUTE, r as BUILDER_REGISTRY_PREVIEW_ROUTE, t as BUILDER_REGISTRY_INSTALL_ROUTE } from "../../builder-registry-CqLsr39q.js";
|
|
2
2
|
export { BUILDER_REGISTRY_INSTALL_ROUTE, BUILDER_REGISTRY_POPULAR_ROUTE, BUILDER_REGISTRY_PREVIEW_ROUTE, BUILDER_REGISTRY_SEARCH_ROUTE, LIST_BUILDER_REGISTRIES_ROUTE };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_channels = require("../../channels-Bn2aN-6o.cjs");
|
|
3
4
|
exports.CONNECT_CHANNEL_ROUTE = require_channels.CONNECT_CHANNEL_ROUTE;
|
|
4
5
|
exports.DISCONNECT_CHANNEL_ROUTE = require_channels.DISCONNECT_CHANNEL_ROUTE;
|
|
5
6
|
exports.LIST_CHANNEL_INSTALLATIONS_ROUTE = require_channels.LIST_CHANNEL_INSTALLATIONS_ROUTE;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as LIST_CHANNEL_PLATFORMS_ROUTE, n as DISCONNECT_CHANNEL_ROUTE, r as LIST_CHANNEL_INSTALLATIONS_ROUTE, t as CONNECT_CHANNEL_ROUTE } from "../../channels-
|
|
1
|
+
import { i as LIST_CHANNEL_PLATFORMS_ROUTE, n as DISCONNECT_CHANNEL_ROUTE, r as LIST_CHANNEL_INSTALLATIONS_ROUTE, t as CONNECT_CHANNEL_ROUTE } from "../../channels-BnFQESMf.js";
|
|
2
2
|
export { CONNECT_CHANNEL_ROUTE, DISCONNECT_CHANNEL_ROUTE, LIST_CHANNEL_INSTALLATIONS_ROUTE, LIST_CHANNEL_PLATFORMS_ROUTE };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_rolldown_runtime = require("../../rolldown-runtime-
|
|
2
|
+
const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
4
|
-
const require_route_builder = require("../../route-builder-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
5
5
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
|
-
const require_utils = require("../../utils-
|
|
6
|
+
const require_utils = require("../../utils-Xnn91QBW.cjs");
|
|
7
7
|
const require_server_handlers_agents = require("./agents.cjs");
|
|
8
|
-
const require_conversations = require("../../conversations-
|
|
8
|
+
const require_conversations = require("../../conversations-PF0eKhIu.cjs");
|
|
9
9
|
const require_server_handlers_responses_adapter = require("./responses.adapter.cjs");
|
|
10
10
|
const require_server_handlers_responses_storage = require("./responses.storage.cjs");
|
|
11
11
|
let crypto = require("crypto");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
|
|
2
2
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
3
3
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
|
-
import { d as MastraFGAPermissions, n as getEffectiveResourceId } from "../../utils-
|
|
5
|
+
import { d as MastraFGAPermissions, n as getEffectiveResourceId } from "../../utils-qMLbyf2U.js";
|
|
6
6
|
import { getAgentFromSystem } from "./agents.js";
|
|
7
7
|
import { a as createConversationBodySchema, i as conversationObjectSchema, n as conversationIdPathParams, r as conversationItemsListSchema, t as conversationDeletedSchema } from "../../conversations-DtnawNGm.js";
|
|
8
8
|
import { mapMastraMessagesToConversationItems } from "./responses.adapter.js";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
3
4
|
const require_common = require("../../common-DQn8jX5T.cjs");
|
|
4
|
-
const require_route_builder = require("../../route-builder-
|
|
5
|
-
const require_constants = require("../../constants-
|
|
5
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
6
|
+
const require_constants = require("../../constants-CXPpy-Ef.cjs");
|
|
6
7
|
const require_server_handlers_error = require("./error.cjs");
|
|
7
8
|
const require_datasets = require("../../datasets-D2JdQI44.cjs");
|
|
8
9
|
let zod = require("zod");
|