@mastra/server 1.60.0-alpha.9 → 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +133 -0
- package/dist/{a2a-Eeib3vfP.cjs → a2a-BtXFFv-0.cjs} +4 -4
- package/dist/{a2a-Eeib3vfP.cjs.map → a2a-BtXFFv-0.cjs.map} +1 -1
- package/dist/{a2a-B5m54dOP.js → a2a-DZhtQeFL.js} +3 -3
- package/dist/{a2a-B5m54dOP.js.map → a2a-DZhtQeFL.js.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/{api-schema-manifest-BKTXRheC.js → api-schema-manifest-Bx_zU5qw.js} +2 -2
- package/dist/{api-schema-manifest-BKTXRheC.js.map → api-schema-manifest-Bx_zU5qw.js.map} +1 -1
- package/dist/{api-schema-manifest-BbNdh5Ck.cjs → api-schema-manifest-DPgfugJT.cjs} +4 -3
- package/dist/{api-schema-manifest-BbNdh5Ck.cjs.map → api-schema-manifest-DPgfugJT.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-CyaUg_iP.cjs → builder-registry-Dcd_ApmT.cjs} +3 -3
- package/dist/{builder-registry-CyaUg_iP.cjs.map → builder-registry-Dcd_ApmT.cjs.map} +1 -1
- package/dist/{builder-registry-CqLsr39q.js → builder-registry-DnEa4qnF.js} +2 -2
- package/dist/{builder-registry-CqLsr39q.js.map → builder-registry-DnEa4qnF.js.map} +1 -1
- package/dist/{channels-BnFQESMf.js → channels-BO3Zd38V.js} +2 -2
- package/dist/{channels-BnFQESMf.js.map → channels-BO3Zd38V.js.map} +1 -1
- package/dist/{channels-Dzy6VM3w.cjs → channels-D9WRnKzU.cjs} +3 -3
- package/dist/{channels-Dzy6VM3w.cjs.map → channels-D9WRnKzU.cjs.map} +1 -1
- package/dist/{constants-CutMu4A_.js → constants-0jFCWoex.js} +13 -2
- package/dist/constants-0jFCWoex.js.map +1 -0
- package/dist/{constants-CXPpy-Ef.cjs → constants-4IJp_uzj.cjs} +18 -1
- package/dist/constants-4IJp_uzj.cjs.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-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-DNaReo7-.js → dist-Cw-T1gX6.js} +2754 -304
- package/dist/dist-Cw-T1gX6.js.map +1 -0
- 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-C2O8fRb-.cjs → dist-DERatX43.cjs} +2755 -305
- package/dist/dist-DERatX43.cjs.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 +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- 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-1L3OIY4K.cjs → editor-builder-BmRQift0.cjs} +2 -2
- package/dist/{editor-builder-1L3OIY4K.cjs.map → editor-builder-BmRQift0.cjs.map} +1 -1
- package/dist/{helpers-C54OMiDG.cjs → helpers-BWxRRShz.cjs} +2 -2
- package/dist/{helpers-C54OMiDG.cjs.map → helpers-BWxRRShz.cjs.map} +1 -1
- package/dist/{helpers-Da9nPOFL.js → helpers-DBAYsA50.js} +2 -2
- package/dist/{helpers-Da9nPOFL.js.map → helpers-DBAYsA50.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-iUe0w9eL.js → routes-Bh2p-WqG.js} +5 -5
- package/dist/{routes-iUe0w9eL.js.map → routes-Bh2p-WqG.js.map} +1 -1
- package/dist/{routes-mK_LlDMo.cjs → routes-CdbboDwv.cjs} +10 -10
- package/dist/{routes-mK_LlDMo.cjs.map → routes-CdbboDwv.cjs.map} +1 -1
- 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 +11 -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 +4 -4
- package/dist/server/handlers/agent-builder.js +3 -3
- package/dist/server/handlers/agent-controller.cjs +53 -36
- package/dist/server/handlers/agent-controller.cjs.map +1 -1
- package/dist/server/handlers/agent-controller.d.ts +22 -2
- package/dist/server/handlers/agent-controller.d.ts.map +1 -1
- package/dist/server/handlers/agent-controller.js +51 -35
- 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 +8 -8
- 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 +5 -5
- package/dist/server/handlers/auth.cjs +16 -7
- package/dist/server/handlers/auth.cjs.map +1 -1
- package/dist/server/handlers/auth.d.ts +10 -4
- package/dist/server/handlers/auth.d.ts.map +1 -1
- package/dist/server/handlers/auth.js +14 -6
- package/dist/server/handlers/auth.js.map +1 -1
- 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.d.ts +6 -6
- 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/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/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 +3 -2
- package/dist/server/handlers/mcp-client-versions.cjs.map +1 -1
- package/dist/server/handlers/mcp-client-versions.js +1 -1
- package/dist/server/handlers/mcp.cjs +2 -2
- package/dist/server/handlers/mcp.js +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 +8 -5
- package/dist/server/handlers/observability.cjs.map +1 -1
- package/dist/server/handlers/observability.d.ts.map +1 -1
- package/dist/server/handlers/observability.js +7 -4
- package/dist/server/handlers/observability.js.map +1 -1
- package/dist/server/handlers/plans.cjs +3 -3
- package/dist/server/handlers/plans.js +2 -2
- 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 +3 -2
- package/dist/server/handlers/prompt-block-versions.cjs.map +1 -1
- package/dist/server/handlers/prompt-block-versions.js +1 -1
- package/dist/server/handlers/responses.adapter.cjs +1 -0
- package/dist/server/handlers/responses.adapter.cjs.map +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 +2 -2
- package/dist/server/handlers/stored-agents.cjs +7 -5
- 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 +4 -3
- package/dist/server/handlers/stored-agents.js.map +1 -1
- package/dist/server/handlers/stored-mcp-clients.cjs +3 -2
- package/dist/server/handlers/stored-mcp-clients.cjs.map +1 -1
- package/dist/server/handlers/stored-mcp-clients.js +1 -1
- package/dist/server/handlers/stored-prompt-blocks.cjs +3 -2
- package/dist/server/handlers/stored-prompt-blocks.cjs.map +1 -1
- package/dist/server/handlers/stored-prompt-blocks.js +1 -1
- 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 +4 -3
- package/dist/server/handlers/stored-skill-favorites.cjs.map +1 -1
- package/dist/server/handlers/stored-skill-favorites.js +1 -1
- package/dist/server/handlers/stored-skills.cjs +4 -3
- package/dist/server/handlers/stored-skills.cjs.map +1 -1
- package/dist/server/handlers/stored-skills.js +1 -1
- 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 +1 -0
- package/dist/server/handlers/tool-schema-overrides.cjs.map +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +3 -3
- 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 +4 -4
- package/dist/server/handlers/workflows.js +3 -3
- package/dist/server/handlers/workspace.cjs +2 -2
- package/dist/server/handlers/workspace.js +1 -1
- package/dist/server/handlers.cjs +3 -2
- package/dist/server/handlers.js +2 -2
- package/dist/server/schemas/datasets.d.ts +3 -3
- package/dist/server/schemas/index.cjs +7 -6
- package/dist/server/schemas/index.js +4 -4
- 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 +6 -5
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.js +4 -4
- package/dist/server/server-adapter/routes/datasets.d.ts +6 -6
- 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-CljhO7OY.js → utils-B2vd77Fi.js} +2 -2
- package/dist/{utils-CljhO7OY.js.map → utils-B2vd77Fi.js.map} +1 -1
- package/dist/{utils-BkPZAGxS.cjs → utils-CmYnjLcY.cjs} +4 -4
- package/dist/{utils-BkPZAGxS.cjs.map → utils-CmYnjLcY.cjs.map} +1 -1
- package/dist/{utils-CXbhpYYv.cjs → utils-DJMUhfvY.cjs} +3 -3
- package/dist/{utils-CXbhpYYv.cjs.map → utils-DJMUhfvY.cjs.map} +1 -1
- package/dist/{utils-qMLbyf2U.js → utils-Hz8Hc2cd.js} +2 -2
- package/dist/{utils-qMLbyf2U.js.map → utils-Hz8Hc2cd.js.map} +1 -1
- package/package.json +9 -9
- package/dist/constants-CXPpy-Ef.cjs.map +0 -1
- package/dist/constants-CutMu4A_.js.map +0 -1
- package/dist/dist-C2O8fRb-.cjs.map +0 -1
- package/dist/dist-DNaReo7-.js.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/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-scorers.cjs","names":["createRoute","listStoredScorersQuerySchema","listStoredScorersResponseSchema","HTTPException","getStoredResourceScope","scopeStoredResourceMetadata","handleError","storedScorerIdPathParams","statusQuerySchema","getStoredScorerResponseSchema","createStoredScorerBodySchema","createStoredScorerResponseSchema","toSlug","updateStoredScorerBodySchema","updateStoredScorerResponseSchema","handleAutoVersioning","deleteStoredScorerResponseSchema"],"sources":["../../../src/server/handlers/stored-scorers.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n storedScorerIdPathParams,\n statusQuerySchema,\n listStoredScorersQuerySchema,\n createStoredScorerBodySchema,\n updateStoredScorerBodySchema,\n listStoredScorersResponseSchema,\n getStoredScorerResponseSchema,\n createStoredScorerResponseSchema,\n updateStoredScorerResponseSchema,\n deleteStoredScorerResponseSchema,\n} from '../schemas/stored-scorers';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata, toSlug } from '../utils';\n\nimport { handleError } from './error';\nimport { handleAutoVersioning } from './version-helpers';\nimport type { VersionedStoreInterface } from './version-helpers';\n\nconst SCORER_SNAPSHOT_CONFIG_FIELDS = [\n 'name',\n 'description',\n 'type',\n 'model',\n 'instructions',\n 'scoreRange',\n 'presetConfig',\n 'defaultSampling',\n] as const;\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/scorers - List all stored scorer definitions\n */\nexport const LIST_STORED_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers',\n responseType: 'json',\n queryParamSchema: listStoredScorersQuerySchema,\n responseSchema: listStoredScorersResponseSchema,\n summary: 'List stored scorer definitions',\n description: 'Returns a paginated list of all scorer definitions stored in the database',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, page, perPage, orderBy, status, authorId, metadata, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const result = await scorerStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, scope),\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error listing stored scorer definitions');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:storedScorerId - Get a stored scorer definition by ID\n */\nexport const GET_STORED_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n queryParamSchema: statusQuerySchema,\n responseSchema: getStoredScorerResponseSchema,\n summary: 'Get stored scorer definition by ID',\n description:\n 'Returns a specific scorer definition from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, storedScorerId, status, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n const scorer = await scorerStore.getByIdResolved(storedScorerId, { status });\n\n if (!scorer) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n return scorer;\n } catch (error) {\n return handleError(error, 'Error getting stored scorer definition');\n }\n },\n});\n\n/**\n * POST /stored/scorers - Create a new stored scorer definition\n */\nexport const CREATE_STORED_SCORER_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers',\n responseType: 'json',\n bodySchema: createStoredScorerBodySchema,\n responseSchema: createStoredScorerResponseSchema,\n summary: 'Create stored scorer definition',\n description: 'Creates a new scorer definition in storage with the provided configuration',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n id: providedId,\n authorId,\n metadata,\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive scorer definition ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if scorer definition with this ID already exists\n const existing = await scorerStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Scorer definition with id ${id} already exists` });\n }\n\n await scorerStore.create({\n scorerDefinition: {\n id,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n },\n });\n\n // Return the resolved scorer definition (thin record + version config)\n // Use draft status since newly created entities start as drafts\n const resolved = await scorerStore.getByIdResolved(id, { status: 'draft' });\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created scorer definition' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error creating stored scorer definition');\n }\n },\n});\n\n/**\n * PATCH /stored/scorers/:storedScorerId - Update a stored scorer definition\n */\nexport const UPDATE_STORED_SCORER_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n bodySchema: updateStoredScorerBodySchema,\n responseSchema: updateStoredScorerResponseSchema,\n summary: 'Update stored scorer definition',\n description: 'Updates an existing scorer definition in storage with the provided fields',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n storedScorerId,\n // Metadata-level fields\n authorId,\n metadata,\n // Config fields (snapshot-level)\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Check if scorer definition exists\n const existing = await scorerStore.getById(storedScorerId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n const scopedMetadata =\n metadata !== undefined\n ? scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope)\n : undefined;\n\n // Update the scorer definition with both metadata-level and config-level fields\n const updatedScorer = await scorerStore.update({\n id: storedScorerId,\n authorId,\n ...(scopedMetadata !== undefined ? { metadata: scopedMetadata } : {}),\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n });\n\n // Build the snapshot config for auto-versioning comparison\n const configFields = {\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n };\n\n // Filter out undefined values to get only the config fields that were provided\n const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== undefined));\n\n // Handle auto-versioning with retry logic for race conditions\n // This creates a new version if there are meaningful config changes.\n // It does NOT update activeVersionId — the version stays as a draft until explicitly published.\n await handleAutoVersioning(\n scorerStore as unknown as VersionedStoreInterface,\n storedScorerId,\n 'scorerDefinitionId',\n SCORER_SNAPSHOT_CONFIG_FIELDS,\n existing,\n updatedScorer,\n providedConfigFields,\n );\n\n // Clear the cached scorer instance so the next request gets the updated config\n const editor = mastra.getEditor();\n if (editor) {\n editor.scorer.clearCache(storedScorerId);\n }\n\n // Return the resolved scorer definition with the latest (draft) version so the UI sees its edits\n const resolved = await scorerStore.getByIdResolved(storedScorerId, { status: 'draft' });\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated scorer definition' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error updating stored scorer definition');\n }\n },\n});\n\n/**\n * DELETE /stored/scorers/:storedScorerId - Delete a stored scorer definition\n */\nexport const DELETE_STORED_SCORER_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n responseSchema: deleteStoredScorerResponseSchema,\n summary: 'Delete stored scorer definition',\n description: 'Deletes a scorer definition from storage by its unique identifier',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, storedScorerId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Check if scorer definition exists\n const existing = await scorerStore.getById(storedScorerId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n await scorerStore.delete(storedScorerId);\n\n // Clear the cached scorer instance\n mastra.getEditor()?.scorer.clearCache(storedScorerId);\n\n return { success: true, message: `Scorer definition ${storedScorerId} deleted successfully` };\n } catch (error) {\n return handleError(error, 'Error deleting stored scorer definition');\n }\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stored-scorers.cjs","names":["createRoute","listStoredScorersQuerySchema","listStoredScorersResponseSchema","HTTPException","getStoredResourceScope","scopeStoredResourceMetadata","handleError","storedScorerIdPathParams","statusQuerySchema","getStoredScorerResponseSchema","createStoredScorerBodySchema","createStoredScorerResponseSchema","toSlug","updateStoredScorerBodySchema","updateStoredScorerResponseSchema","handleAutoVersioning","deleteStoredScorerResponseSchema"],"sources":["../../../src/server/handlers/stored-scorers.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n storedScorerIdPathParams,\n statusQuerySchema,\n listStoredScorersQuerySchema,\n createStoredScorerBodySchema,\n updateStoredScorerBodySchema,\n listStoredScorersResponseSchema,\n getStoredScorerResponseSchema,\n createStoredScorerResponseSchema,\n updateStoredScorerResponseSchema,\n deleteStoredScorerResponseSchema,\n} from '../schemas/stored-scorers';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata, toSlug } from '../utils';\n\nimport { handleError } from './error';\nimport { handleAutoVersioning } from './version-helpers';\nimport type { VersionedStoreInterface } from './version-helpers';\n\nconst SCORER_SNAPSHOT_CONFIG_FIELDS = [\n 'name',\n 'description',\n 'type',\n 'model',\n 'instructions',\n 'scoreRange',\n 'presetConfig',\n 'defaultSampling',\n] as const;\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/scorers - List all stored scorer definitions\n */\nexport const LIST_STORED_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers',\n responseType: 'json',\n queryParamSchema: listStoredScorersQuerySchema,\n responseSchema: listStoredScorersResponseSchema,\n summary: 'List stored scorer definitions',\n description: 'Returns a paginated list of all scorer definitions stored in the database',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, page, perPage, orderBy, status, authorId, metadata, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const result = await scorerStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, scope),\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error listing stored scorer definitions');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:storedScorerId - Get a stored scorer definition by ID\n */\nexport const GET_STORED_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n queryParamSchema: statusQuerySchema,\n responseSchema: getStoredScorerResponseSchema,\n summary: 'Get stored scorer definition by ID',\n description:\n 'Returns a specific scorer definition from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, storedScorerId, status, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n const scorer = await scorerStore.getByIdResolved(storedScorerId, { status });\n\n if (!scorer) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n return scorer;\n } catch (error) {\n return handleError(error, 'Error getting stored scorer definition');\n }\n },\n});\n\n/**\n * POST /stored/scorers - Create a new stored scorer definition\n */\nexport const CREATE_STORED_SCORER_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers',\n responseType: 'json',\n bodySchema: createStoredScorerBodySchema,\n responseSchema: createStoredScorerResponseSchema,\n summary: 'Create stored scorer definition',\n description: 'Creates a new scorer definition in storage with the provided configuration',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n id: providedId,\n authorId,\n metadata,\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive scorer definition ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if scorer definition with this ID already exists\n const existing = await scorerStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Scorer definition with id ${id} already exists` });\n }\n\n await scorerStore.create({\n scorerDefinition: {\n id,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n },\n });\n\n // Return the resolved scorer definition (thin record + version config)\n // Use draft status since newly created entities start as drafts\n const resolved = await scorerStore.getByIdResolved(id, { status: 'draft' });\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created scorer definition' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error creating stored scorer definition');\n }\n },\n});\n\n/**\n * PATCH /stored/scorers/:storedScorerId - Update a stored scorer definition\n */\nexport const UPDATE_STORED_SCORER_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n bodySchema: updateStoredScorerBodySchema,\n responseSchema: updateStoredScorerResponseSchema,\n summary: 'Update stored scorer definition',\n description: 'Updates an existing scorer definition in storage with the provided fields',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({\n mastra,\n storedScorerId,\n // Metadata-level fields\n authorId,\n metadata,\n // Config fields (snapshot-level)\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Check if scorer definition exists\n const existing = await scorerStore.getById(storedScorerId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n const scopedMetadata =\n metadata !== undefined\n ? scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope)\n : undefined;\n\n // Update the scorer definition with both metadata-level and config-level fields\n const updatedScorer = await scorerStore.update({\n id: storedScorerId,\n authorId,\n ...(scopedMetadata !== undefined ? { metadata: scopedMetadata } : {}),\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n });\n\n // Build the snapshot config for auto-versioning comparison\n const configFields = {\n name,\n description,\n type,\n model,\n instructions,\n scoreRange,\n presetConfig,\n defaultSampling,\n };\n\n // Filter out undefined values to get only the config fields that were provided\n const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== undefined));\n\n // Handle auto-versioning with retry logic for race conditions\n // This creates a new version if there are meaningful config changes.\n // It does NOT update activeVersionId — the version stays as a draft until explicitly published.\n await handleAutoVersioning(\n scorerStore as unknown as VersionedStoreInterface,\n storedScorerId,\n 'scorerDefinitionId',\n SCORER_SNAPSHOT_CONFIG_FIELDS,\n existing,\n updatedScorer,\n providedConfigFields,\n );\n\n // Clear the cached scorer instance so the next request gets the updated config\n const editor = mastra.getEditor();\n if (editor) {\n editor.scorer.clearCache(storedScorerId);\n }\n\n // Return the resolved scorer definition with the latest (draft) version so the UI sees its edits\n const resolved = await scorerStore.getByIdResolved(storedScorerId, { status: 'draft' });\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated scorer definition' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error updating stored scorer definition');\n }\n },\n});\n\n/**\n * DELETE /stored/scorers/:storedScorerId - Delete a stored scorer definition\n */\nexport const DELETE_STORED_SCORER_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/scorers/:storedScorerId',\n responseType: 'json',\n pathParamSchema: storedScorerIdPathParams,\n responseSchema: deleteStoredScorerResponseSchema,\n summary: 'Delete stored scorer definition',\n description: 'Deletes a scorer definition from storage by its unique identifier',\n tags: ['Stored Scorers'],\n requiresAuth: true,\n handler: async ({ mastra, storedScorerId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const scorerStore = await storage.getStore('scorerDefinitions');\n if (!scorerStore) {\n throw new HTTPException(500, { message: 'Scorer definitions storage domain is not available' });\n }\n\n // Check if scorer definition exists\n const existing = await scorerStore.getById(storedScorerId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored scorer definition with id ${storedScorerId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n await scorerStore.delete(storedScorerId);\n\n // Clear the cached scorer instance\n mastra.getEditor()?.scorer.clearCache(storedScorerId);\n\n return { success: true, message: `Scorer definition ${storedScorerId} deleted successfully` };\n } catch (error) {\n return handleError(error, 'Error deleting stored scorer definition');\n }\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
2
|
import { u as statusQuerySchema } from "../../common-5ZZuR6wj.js";
|
|
3
3
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
4
|
-
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-
|
|
4
|
+
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-B2vd77Fi.js";
|
|
5
5
|
import { handleError } from "./error.js";
|
|
6
6
|
import { handleAutoVersioning } from "./version-helpers.js";
|
|
7
|
-
import { a as listStoredScorersQuerySchema, i as getStoredScorerResponseSchema, l as updateStoredScorerBodySchema, n as createStoredScorerResponseSchema, o as listStoredScorersResponseSchema, r as deleteStoredScorerResponseSchema, s as storedScorerIdPathParams, t as createStoredScorerBodySchema, u as updateStoredScorerResponseSchema } from "../../stored-scorers-
|
|
7
|
+
import { a as listStoredScorersQuerySchema, i as getStoredScorerResponseSchema, l as updateStoredScorerBodySchema, n as createStoredScorerResponseSchema, o as listStoredScorersResponseSchema, r as deleteStoredScorerResponseSchema, s as storedScorerIdPathParams, t as createStoredScorerBodySchema, u as updateStoredScorerResponseSchema } from "../../stored-scorers-BA4suzgn.js";
|
|
8
8
|
//#region src/server/handlers/stored-scorers.ts
|
|
9
9
|
const SCORER_SNAPSHOT_CONFIG_FIELDS = [
|
|
10
10
|
"name",
|
|
@@ -1,10 +1,11 @@
|
|
|
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_utils = require("../../utils-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
5
|
+
const require_utils = require("../../utils-CmYnjLcY.cjs");
|
|
5
6
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
7
|
const require_server_handlers_authorship = require("./authorship.cjs");
|
|
7
|
-
const require_editor_builder = require("../../editor-builder-
|
|
8
|
+
const require_editor_builder = require("../../editor-builder-BmRQift0.cjs");
|
|
8
9
|
const require_favorites = require("../../favorites-D1-AzGsK.cjs");
|
|
9
10
|
const require_stored_skills = require("../../stored-skills-BqNK0ssS.cjs");
|
|
10
11
|
//#region src/server/handlers/stored-skill-favorites.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-skill-favorites.cjs","names":["HTTPException","createRoute","storedSkillIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","getStoredResourceScope","handleError"],"sources":["../../../src/server/handlers/stored-skill-favorites.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"stored-skill-favorites.cjs","names":["HTTPException","createRoute","storedSkillIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","getStoredResourceScope","handleError"],"sources":["../../../src/server/handlers/stored-skill-favorites.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAaA,eAAe,oBAAoB,QAAqD;CACtF,MAAM,UAAU,OAAO,WAAW;CAClC,IAAI,CAAC,SACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,4BAA4B,CAAC;CAEvE,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ;CAClD,IAAI,CAAC,YACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,yCAAyC,CAAC;CAEpF,MAAM,iBAAiB,MAAM,QAAQ,SAAS,WAAW;CACzD,IAAI,CAAC,gBACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,4CAA4C,CAAC;CAEvF,OAAO;EAAE;EAAY;CAAe;AACtC;;;;AAKA,MAAa,8BAA8BC,sBAAAA,YAAY;CACrD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBC,sBAAAA;CACjB,gBAAgBC,kBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,eAAe;CACtB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,gBAAgB,oBAAoB;EAC5D,IAAI;GACF,MAAMC,uBAAAA,sBAAsB,QAAQ,WAAW;GAE/C,MAAM,WAAWC,mCAAAA,kBAAkB,cAAc;GACjD,IAAI,CAAC,UACH,MAAM,IAAIL,uBAAAA,cAAc,KAAK,EAAE,SAAS,0BAA0B,CAAC;GAGrE,MAAM,EAAE,YAAY,mBAAmB,MAAM,oBAAoB,MAAM;GAEvE,MAAM,QAAQ,MAAM,WAAW,gBAAgB,aAAa;GAC5D,IAAI,CAAC,OACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,wBAAwB,cAAc,YAAY,CAAC;GAE7F,cAAA,0BAA0B,OAAO,MAAMM,cAAAA,uBAAuB,QAAQ,cAAc,CAAC;GAGrF,mCAAA,iBAAiB;IAAE;IAAgB,UAAU;IAAiB,YAAY;IAAe,QAAQ;GAAM,CAAC;GAOxG,OAAO,MALc,eAAe,SAAS;IAC3C,QAAQ;IACR,YAAY;IACZ,UAAU;GACZ,CAAC;EAEH,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,+BAA+B;EAC3D;CACF;AACF,CAAC;;;;AAKD,MAAa,gCAAgCN,sBAAAA,YAAY;CACvD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiBC,sBAAAA;CACjB,gBAAgBC,kBAAAA;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,eAAe;CACtB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,gBAAgB,oBAAoB;EAC5D,IAAI;GACF,MAAMC,uBAAAA,sBAAsB,QAAQ,WAAW;GAE/C,MAAM,WAAWC,mCAAAA,kBAAkB,cAAc;GACjD,IAAI,CAAC,UACH,MAAM,IAAIL,uBAAAA,cAAc,KAAK,EAAE,SAAS,0BAA0B,CAAC;GAGrE,MAAM,EAAE,YAAY,mBAAmB,MAAM,oBAAoB,MAAM;GAEvE,MAAM,QAAQ,MAAM,WAAW,gBAAgB,aAAa;GAC5D,IAAI,CAAC,OACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,wBAAwB,cAAc,YAAY,CAAC;GAE7F,cAAA,0BAA0B,OAAO,MAAMM,cAAAA,uBAAuB,QAAQ,cAAc,CAAC;GAErF,mCAAA,iBAAiB;IAAE;IAAgB,UAAU;IAAiB,YAAY;IAAe,QAAQ;GAAM,CAAC;GAOxG,OAAO,MALc,eAAe,WAAW;IAC7C,QAAQ;IACR,YAAY;IACZ,UAAU;GACZ,CAAC;EAEH,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
2
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
3
|
-
import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-
|
|
3
|
+
import { i as getStoredResourceScope, n as assertStoredResourceScope } from "../../utils-B2vd77Fi.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
5
|
import { assertReadAccess, getCallerAuthorId } from "./authorship.js";
|
|
6
6
|
import { a as requireBuilderFeature } from "../../editor-builder-EP9FAtQm.js";
|
|
@@ -1,10 +1,11 @@
|
|
|
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_utils = require("../../utils-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
5
|
+
const require_utils = require("../../utils-CmYnjLcY.cjs");
|
|
5
6
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
7
|
const require_server_handlers_authorship = require("./authorship.cjs");
|
|
7
|
-
const require_editor_builder = require("../../editor-builder-
|
|
8
|
+
const require_editor_builder = require("../../editor-builder-BmRQift0.cjs");
|
|
8
9
|
const require_server_handlers_favorites_enrichment = require("./favorites-enrichment.cjs");
|
|
9
10
|
const require_stored_skills = require("../../stored-skills-BqNK0ssS.cjs");
|
|
10
11
|
let _mastra_core_workspace = require("@mastra/core/workspace");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-skills.cjs","names":["createRoute","listStoredSkillsQuerySchema","listStoredSkillsResponseSchema","HTTPException","resolveAuthorFilter","scopeStoredResourceMetadata","getStoredResourceScope","getCallerAuthorId","isBuilderFeatureEnabled","matchesAuthorFilter","stripFavoriteFields","prepareFavoritesEnrichment","handleError","storedSkillIdPathParams","getStoredSkillResponseSchema","enrichOrStripFavorites","createStoredSkillBodySchema","createStoredSkillResponseSchema","toSlug","updateStoredSkillBodySchema","updateStoredSkillResponseSchema","deleteStoredSkillResponseSchema","publishStoredSkillBodySchema","publishStoredSkillResponseSchema","LocalSkillSource"],"sources":["../../../src/server/handlers/stored-skills.ts"],"sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\n const snapshotUpdate: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(snapshot)) {\n if (value !== undefined) snapshotUpdate[key] = value;\n }\n\n // Update the skill with new version data + tree + UI-facing file tree.\n // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\n ...snapshotUpdate,\n tree,\n files,\n status: 'published',\n });\n\n // Point activeVersionId to the newly created version\n const latestVersion = await skillStore.getLatestVersion(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stored-skills.cjs","names":["createRoute","listStoredSkillsQuerySchema","listStoredSkillsResponseSchema","HTTPException","resolveAuthorFilter","scopeStoredResourceMetadata","getStoredResourceScope","getCallerAuthorId","isBuilderFeatureEnabled","matchesAuthorFilter","stripFavoriteFields","prepareFavoritesEnrichment","handleError","storedSkillIdPathParams","getStoredSkillResponseSchema","enrichOrStripFavorites","createStoredSkillBodySchema","createStoredSkillResponseSchema","toSlug","updateStoredSkillBodySchema","updateStoredSkillResponseSchema","deleteStoredSkillResponseSchema","publishStoredSkillBodySchema","publishStoredSkillResponseSchema","LocalSkillSource"],"sources":["../../../src/server/handlers/stored-skills.ts"],"sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\n const snapshotUpdate: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(snapshot)) {\n if (value !== undefined) snapshotUpdate[key] = value;\n }\n\n // Update the skill with new version data + tree + UI-facing file tree.\n // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\n ...snapshotUpdate,\n tree,\n files,\n status: 'published',\n });\n\n // Point activeVersionId to the newly created version\n const latestVersion = await skillStore.getLatestVersion(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
2
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
3
|
-
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-
|
|
3
|
+
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-B2vd77Fi.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
5
|
import { assertReadAccess, assertWriteAccess, getCallerAuthorId, matchesAuthorFilter, resolveAuthorFilter } from "./authorship.js";
|
|
6
6
|
import { i as isBuilderFeatureEnabled } from "../../editor-builder-EP9FAtQm.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
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_utils = require("../../utils-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
5
|
+
const require_utils = require("../../utils-CmYnjLcY.cjs");
|
|
5
6
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
7
|
const require_stored_workspaces = require("../../stored-workspaces-Dl8B20LD.cjs");
|
|
7
8
|
const require_server_handlers_authorship = require("./authorship.cjs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-workspaces.cjs","names":["createRoute","listStoredWorkspacesQuerySchema","listStoredWorkspacesResponseSchema","HTTPException","resolveAuthorFilter","getStoredResourceScope","scopeStoredResourceMetadata","matchesAuthorFilter","handleError","storedWorkspaceIdPathParams","getStoredWorkspaceResponseSchema","createStoredWorkspaceBodySchema","createStoredWorkspaceResponseSchema","toSlug","getCallerAuthorId","updateStoredWorkspaceBodySchema","updateStoredWorkspaceResponseSchema","deleteStoredWorkspaceResponseSchema"],"sources":["../../../src/server/handlers/stored-workspaces.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n storedWorkspaceIdPathParams,\n listStoredWorkspacesQuerySchema,\n createStoredWorkspaceBodySchema,\n updateStoredWorkspaceBodySchema,\n listStoredWorkspacesResponseSchema,\n getStoredWorkspaceResponseSchema,\n createStoredWorkspaceResponseSchema,\n updateStoredWorkspaceResponseSchema,\n deleteStoredWorkspaceResponseSchema,\n} from '../schemas/stored-workspaces';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata, toSlug } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { handleError } from './error';\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/workspaces - List all stored workspaces\n */\nexport const LIST_STORED_WORKSPACES_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workspaces',\n responseType: 'json',\n queryParamSchema: listStoredWorkspacesQuerySchema,\n responseSchema: listStoredWorkspacesResponseSchema,\n summary: 'List stored workspaces',\n description: 'Returns a paginated list of all workspace configurations stored in the database',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, page, perPage, orderBy, authorId, metadata, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Resolve the visibility scope for this caller. Non-owner queries for\n // another author return nothing (workspaces have no `public` visibility\n // yet); default lists return the caller's rows plus legacy unowned\n // records.\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-workspaces',\n queryAuthorId: authorId,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const result = await workspaceStore.listResolved({\n page,\n perPage,\n orderBy,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopeStoredResourceMetadata(metadata, scope),\n });\n\n // Post-filter to enforce ownership rules across all backends. Storage\n // adapters can only do an equality filter on authorId, so we apply the\n // ownedOrPublic / ownedOrPublicOthers logic here. `total` is left as the\n // storage-reported count to keep pagination math working.\n const visibleWorkspaces = result.workspaces.filter(record => matchesAuthorFilter(record, filter));\n\n // Annotate each workspace with whether it's registered at runtime\n const runtimeWorkspaces = mastra.listWorkspaces();\n const workspaces = visibleWorkspaces.map(ws => ({\n ...ws,\n runtimeRegistered: ws.id in runtimeWorkspaces,\n }));\n\n return { ...result, workspaces };\n } catch (error) {\n return handleError(error, 'Error listing stored workspaces');\n }\n },\n});\n\n/**\n * GET /stored/workspaces/:storedWorkspaceId - Get a stored workspace by ID\n */\nexport const GET_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n responseSchema: getStoredWorkspaceResponseSchema,\n summary: 'Get stored workspace by ID',\n description:\n 'Returns a specific workspace from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, storedWorkspaceId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n const workspace = await workspaceStore.getByIdResolved(storedWorkspaceId);\n\n if (!workspace) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n assertStoredResourceScope(workspace, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:read[:<id>]` holder.\n assertReadAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n record: workspace,\n });\n\n return workspace;\n } catch (error) {\n return handleError(error, 'Error getting stored workspace');\n }\n },\n});\n\n/**\n * POST /stored/workspaces - Create a new stored workspace\n */\nexport const CREATE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/workspaces',\n responseType: 'json',\n bodySchema: createStoredWorkspaceBodySchema,\n responseSchema: createStoredWorkspaceResponseSchema,\n summary: 'Create stored workspace',\n description: 'Creates a new workspace configuration in storage with the provided settings',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({\n mastra,\n id: providedId,\n metadata,\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive workspace ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if workspace with this ID already exists\n const existing = await workspaceStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Workspace with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No caller (auth not configured) leaves authorId undefined so legacy\n // single-user setups continue to behave as today.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n\n await workspaceStore.create({\n workspace: {\n id,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n },\n });\n\n // Return the resolved workspace (thin record + version config)\n const resolved = await workspaceStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created workspace' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error creating stored workspace');\n }\n },\n});\n\n/**\n * PATCH /stored/workspaces/:storedWorkspaceId - Update a stored workspace\n */\nexport const UPDATE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n bodySchema: updateStoredWorkspaceBodySchema,\n responseSchema: updateStoredWorkspaceResponseSchema,\n summary: 'Update stored workspace',\n description: 'Updates an existing workspace in storage with the provided fields',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({\n mastra,\n storedWorkspaceId,\n // Metadata-level fields\n metadata,\n // Config fields (snapshot-level)\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Check if workspace exists\n const existing = await workspaceStore.getById(storedWorkspaceId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:edit[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n action: 'edit',\n record: existing,\n });\n\n const scopedMetadata =\n metadata !== undefined\n ? scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope)\n : undefined;\n\n // Update the workspace with both metadata-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation. Strip undefined keys so omitted fields don't\n // overwrite persisted values (same pattern as stored-skills PATCH).\n // Note: authorId is intentionally not accepted here. Ownership cannot be\n // transferred via PATCH; admins must use a dedicated flow if that is ever\n // needed.\n const updateInput: Record<string, unknown> = { id: storedWorkspaceId };\n const candidate: Record<string, unknown> = {\n ...(scopedMetadata !== undefined ? { metadata: scopedMetadata } : {}),\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n };\n for (const [key, value] of Object.entries(candidate)) {\n if (value !== undefined) updateInput[key] = value;\n }\n await workspaceStore.update(updateInput as Parameters<typeof workspaceStore.update>[0]);\n\n // Return the resolved workspace with the updated config\n const resolved = await workspaceStore.getByIdResolved(storedWorkspaceId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated workspace' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error updating stored workspace');\n }\n },\n});\n\n/**\n * DELETE /stored/workspaces/:storedWorkspaceId - Delete a stored workspace\n */\nexport const DELETE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n responseSchema: deleteStoredWorkspaceResponseSchema,\n summary: 'Delete stored workspace',\n description: 'Deletes a workspace from storage by its unique identifier',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, storedWorkspaceId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Check if workspace exists\n const existing = await workspaceStore.getById(storedWorkspaceId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n action: 'delete',\n record: existing,\n });\n\n await workspaceStore.delete(storedWorkspaceId);\n\n return {\n success: true,\n message: `Workspace ${storedWorkspaceId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored workspace');\n }\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stored-workspaces.cjs","names":["createRoute","listStoredWorkspacesQuerySchema","listStoredWorkspacesResponseSchema","HTTPException","resolveAuthorFilter","getStoredResourceScope","scopeStoredResourceMetadata","matchesAuthorFilter","handleError","storedWorkspaceIdPathParams","getStoredWorkspaceResponseSchema","createStoredWorkspaceBodySchema","createStoredWorkspaceResponseSchema","toSlug","getCallerAuthorId","updateStoredWorkspaceBodySchema","updateStoredWorkspaceResponseSchema","deleteStoredWorkspaceResponseSchema"],"sources":["../../../src/server/handlers/stored-workspaces.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n storedWorkspaceIdPathParams,\n listStoredWorkspacesQuerySchema,\n createStoredWorkspaceBodySchema,\n updateStoredWorkspaceBodySchema,\n listStoredWorkspacesResponseSchema,\n getStoredWorkspaceResponseSchema,\n createStoredWorkspaceResponseSchema,\n updateStoredWorkspaceResponseSchema,\n deleteStoredWorkspaceResponseSchema,\n} from '../schemas/stored-workspaces';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata, toSlug } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { handleError } from './error';\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/workspaces - List all stored workspaces\n */\nexport const LIST_STORED_WORKSPACES_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workspaces',\n responseType: 'json',\n queryParamSchema: listStoredWorkspacesQuerySchema,\n responseSchema: listStoredWorkspacesResponseSchema,\n summary: 'List stored workspaces',\n description: 'Returns a paginated list of all workspace configurations stored in the database',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, page, perPage, orderBy, authorId, metadata, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Resolve the visibility scope for this caller. Non-owner queries for\n // another author return nothing (workspaces have no `public` visibility\n // yet); default lists return the caller's rows plus legacy unowned\n // records.\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-workspaces',\n queryAuthorId: authorId,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const result = await workspaceStore.listResolved({\n page,\n perPage,\n orderBy,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopeStoredResourceMetadata(metadata, scope),\n });\n\n // Post-filter to enforce ownership rules across all backends. Storage\n // adapters can only do an equality filter on authorId, so we apply the\n // ownedOrPublic / ownedOrPublicOthers logic here. `total` is left as the\n // storage-reported count to keep pagination math working.\n const visibleWorkspaces = result.workspaces.filter(record => matchesAuthorFilter(record, filter));\n\n // Annotate each workspace with whether it's registered at runtime\n const runtimeWorkspaces = mastra.listWorkspaces();\n const workspaces = visibleWorkspaces.map(ws => ({\n ...ws,\n runtimeRegistered: ws.id in runtimeWorkspaces,\n }));\n\n return { ...result, workspaces };\n } catch (error) {\n return handleError(error, 'Error listing stored workspaces');\n }\n },\n});\n\n/**\n * GET /stored/workspaces/:storedWorkspaceId - Get a stored workspace by ID\n */\nexport const GET_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n responseSchema: getStoredWorkspaceResponseSchema,\n summary: 'Get stored workspace by ID',\n description:\n 'Returns a specific workspace from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, storedWorkspaceId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n const workspace = await workspaceStore.getByIdResolved(storedWorkspaceId);\n\n if (!workspace) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n assertStoredResourceScope(workspace, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:read[:<id>]` holder.\n assertReadAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n record: workspace,\n });\n\n return workspace;\n } catch (error) {\n return handleError(error, 'Error getting stored workspace');\n }\n },\n});\n\n/**\n * POST /stored/workspaces - Create a new stored workspace\n */\nexport const CREATE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/workspaces',\n responseType: 'json',\n bodySchema: createStoredWorkspaceBodySchema,\n responseSchema: createStoredWorkspaceResponseSchema,\n summary: 'Create stored workspace',\n description: 'Creates a new workspace configuration in storage with the provided settings',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({\n mastra,\n id: providedId,\n metadata,\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive workspace ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if workspace with this ID already exists\n const existing = await workspaceStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Workspace with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No caller (auth not configured) leaves authorId undefined so legacy\n // single-user setups continue to behave as today.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n\n await workspaceStore.create({\n workspace: {\n id,\n authorId,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n },\n });\n\n // Return the resolved workspace (thin record + version config)\n const resolved = await workspaceStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created workspace' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error creating stored workspace');\n }\n },\n});\n\n/**\n * PATCH /stored/workspaces/:storedWorkspaceId - Update a stored workspace\n */\nexport const UPDATE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n bodySchema: updateStoredWorkspaceBodySchema,\n responseSchema: updateStoredWorkspaceResponseSchema,\n summary: 'Update stored workspace',\n description: 'Updates an existing workspace in storage with the provided fields',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({\n mastra,\n storedWorkspaceId,\n // Metadata-level fields\n metadata,\n // Config fields (snapshot-level)\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n requestContext,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Check if workspace exists\n const existing = await workspaceStore.getById(storedWorkspaceId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:edit[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n action: 'edit',\n record: existing,\n });\n\n const scopedMetadata =\n metadata !== undefined\n ? scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope)\n : undefined;\n\n // Update the workspace with both metadata-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation. Strip undefined keys so omitted fields don't\n // overwrite persisted values (same pattern as stored-skills PATCH).\n // Note: authorId is intentionally not accepted here. Ownership cannot be\n // transferred via PATCH; admins must use a dedicated flow if that is ever\n // needed.\n const updateInput: Record<string, unknown> = { id: storedWorkspaceId };\n const candidate: Record<string, unknown> = {\n ...(scopedMetadata !== undefined ? { metadata: scopedMetadata } : {}),\n name,\n description,\n filesystem,\n sandbox,\n mounts,\n search,\n skills,\n tools,\n autoSync,\n operationTimeout,\n };\n for (const [key, value] of Object.entries(candidate)) {\n if (value !== undefined) updateInput[key] = value;\n }\n await workspaceStore.update(updateInput as Parameters<typeof workspaceStore.update>[0]);\n\n // Return the resolved workspace with the updated config\n const resolved = await workspaceStore.getByIdResolved(storedWorkspaceId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated workspace' });\n }\n\n return resolved;\n } catch (error) {\n return handleError(error, 'Error updating stored workspace');\n }\n },\n});\n\n/**\n * DELETE /stored/workspaces/:storedWorkspaceId - Delete a stored workspace\n */\nexport const DELETE_STORED_WORKSPACE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/workspaces/:storedWorkspaceId',\n responseType: 'json',\n pathParamSchema: storedWorkspaceIdPathParams,\n responseSchema: deleteStoredWorkspaceResponseSchema,\n summary: 'Delete stored workspace',\n description: 'Deletes a workspace from storage by its unique identifier',\n tags: ['Stored Workspaces'],\n requiresAuth: true,\n handler: async ({ mastra, storedWorkspaceId, requestContext }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const workspaceStore = await storage.getStore('workspaces');\n if (!workspaceStore) {\n throw new HTTPException(500, { message: 'Workspaces storage domain is not available' });\n }\n\n // Check if workspace exists\n const existing = await workspaceStore.getById(storedWorkspaceId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored workspace with id ${storedWorkspaceId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-workspaces:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-workspaces',\n resourceId: storedWorkspaceId,\n action: 'delete',\n record: existing,\n });\n\n await workspaceStore.delete(storedWorkspaceId);\n\n return {\n success: true,\n message: `Workspace ${storedWorkspaceId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored workspace');\n }\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
2
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
3
|
-
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-
|
|
3
|
+
import { c as toSlug, i as getStoredResourceScope, n as assertStoredResourceScope, s as scopeStoredResourceMetadata } from "../../utils-B2vd77Fi.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
5
|
import { a as listStoredWorkspacesQuerySchema, c as storedWorkspaceIdPathParams, d as updateStoredWorkspaceResponseSchema, i as getStoredWorkspaceResponseSchema, n as createStoredWorkspaceResponseSchema, o as listStoredWorkspacesResponseSchema, r as deleteStoredWorkspaceResponseSchema, t as createStoredWorkspaceBodySchema, u as updateStoredWorkspaceBodySchema } from "../../stored-workspaces-6PYE4Y3m.js";
|
|
6
6
|
import { assertReadAccess, assertWriteAccess, getCallerAuthorId, matchesAuthorFilter, resolveAuthorFilter } from "./authorship.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
3
4
|
const require_server_handlers_error = require("./error.cjs");
|
|
4
5
|
const require_system = require("../../system-wl_uZdyz.cjs");
|
|
5
6
|
let fs = require("fs");
|
|
@@ -86,7 +87,7 @@ const GET_API_SCHEMA_ROUTE = require_route_builder.createRoute({
|
|
|
86
87
|
tags: ["System"],
|
|
87
88
|
requiresAuth: true,
|
|
88
89
|
handler: async () => {
|
|
89
|
-
const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-
|
|
90
|
+
const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-DPgfugJT.cjs"));
|
|
90
91
|
return buildApiSchemaManifest();
|
|
91
92
|
}
|
|
92
93
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.cjs","names":["createRoute","apiSchemaManifestResponseSchema","systemPackagesResponseSchema","handleError"],"sources":["../../../src/server/handlers/system.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityStorageFeatures = observabilityStorage?.getFeatures?.();\n const observabilityStorageCapabilities = observabilityStorageFeatures?.some(\n feature => feature === 'metrics' || feature === 'logs',\n )\n ? {\n metrics: observabilityStorageFeatures.includes('metrics'),\n logs: observabilityStorageFeatures.includes('logs'),\n }\n : undefined;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n ...(observabilityStorageCapabilities ? { observabilityStorageCapabilities } : {}),\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"system.cjs","names":["createRoute","apiSchemaManifestResponseSchema","systemPackagesResponseSchema","handleError"],"sources":["../../../src/server/handlers/system.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityStorageFeatures = observabilityStorage?.getFeatures?.();\n const observabilityStorageCapabilities = observabilityStorageFeatures?.some(\n feature => feature === 'metrics' || feature === 'logs',\n )\n ? {\n metrics: observabilityStorageFeatures.includes('metrics'),\n logs: observabilityStorageFeatures.includes('logs'),\n }\n : undefined;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n ...(observabilityStorageCapabilities ? { observabilityStorageCapabilities } : {}),\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"],"mappings":"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"}
|
|
@@ -85,7 +85,7 @@ const GET_API_SCHEMA_ROUTE = createRoute({
|
|
|
85
85
|
tags: ["System"],
|
|
86
86
|
requiresAuth: true,
|
|
87
87
|
handler: async () => {
|
|
88
|
-
const { buildApiSchemaManifest } = await import("../../api-schema-manifest-
|
|
88
|
+
const { buildApiSchemaManifest } = await import("../../api-schema-manifest-Bx_zU5qw.js");
|
|
89
89
|
return buildApiSchemaManifest();
|
|
90
90
|
}
|
|
91
91
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
let _mastra_core_request_context = require("@mastra/core/request-context");
|
|
3
4
|
//#region src/server/handlers/test-utils.ts
|
|
4
5
|
function createTestServerContext({ mastra }) {
|