@mastra/server 1.60.0-alpha.8 → 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 +140 -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-CpxQhZED.js → dist-Cw-T1gX6.js} +2818 -309
- 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-CpaK1qK1.cjs → dist-DERatX43.cjs} +2819 -310
- 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 +8 -8
- package/dist/constants-CXPpy-Ef.cjs.map +0 -1
- package/dist/constants-CutMu4A_.js.map +0 -1
- package/dist/dist-CpaK1qK1.cjs.map +0 -1
- package/dist/dist-CpxQhZED.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,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
|
|
2
2
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
3
3
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
|
-
import { d as MastraFGAPermissions, n as getEffectiveResourceId, r as getEffectiveThreadId, t as enforceThreadAccess } from "../../utils-
|
|
5
|
+
import { d as MastraFGAPermissions, n as getEffectiveResourceId, r as getEffectiveThreadId, t as enforceThreadAccess } from "../../utils-Hz8Hc2cd.js";
|
|
6
6
|
import { getAgentFromSystem } from "./agents.js";
|
|
7
7
|
import { a as deleteResponseSchema, i as createResponseBodySchema, o as responseIdPathParams, u as responseObjectSchema } from "../../responses-DJNJgCTg.js";
|
|
8
8
|
import { buildCompletedResponse, buildInProgressResponse, createMessageId, createOutputTextPart, createResponseStreamEventTranslator, formatSseEvent, mapMastraToolsToResponseTools, mapResponseInputToExecutionMessages, mapResponseTurnRecordToResponse, toResponseStatus, toResponseUsage } from "./responses.adapter.js";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
3
|
-
const require_utils = require("../../utils-
|
|
4
|
+
const require_utils = require("../../utils-DJMUhfvY.cjs");
|
|
4
5
|
//#region src/server/handlers/responses.storage.ts
|
|
5
6
|
function isPlainObject(value) {
|
|
6
7
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.storage.cjs","names":["getEffectiveResourceId","validateThreadOwnership","HTTPException"],"sources":["../../../src/server/handlers/responses.storage.ts"],"sourcesContent":["import type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport type {\n ResponseObject,\n ResponseOutputItem,\n ResponseTextConfig,\n ResponseTool,\n ResponseUsage,\n} from '../schemas/responses';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nexport type ThreadExecutionContext = {\n threadId: string;\n resourceId: string;\n};\n\nexport type UsageLike = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n} | null;\n\nexport type ProviderMetadataLike = Record<string, Record<string, unknown> | undefined> | undefined;\n\nexport type ResponseTurnRecordMetadata = {\n agentId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n usage: ResponseUsage | null;\n instructions?: string;\n text?: ResponseTextConfig;\n previousResponseId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messageIds: string[];\n outputItems?: ResponseOutputItem[];\n};\n\nexport type ResponseTurnRecord = {\n metadata: ResponseTurnRecordMetadata;\n message: MastraDBMessage;\n messages: MastraDBMessage[];\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\ntype ResponseResultLike = {\n response?:\n | Promise<{\n dbMessages?: MastraDBMessage[];\n }>\n | {\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype SyntheticToolResultMessage = Omit<MastraDBMessage, 'role'> & { role: 'tool' };\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Resolves the backing memory store for a specific agent.\n *\n * This follows the normal agent-memory path. `agent.getMemory()` injects Mastra\n * root storage when the memory has no own storage, so this naturally prefers\n * agent storage first and falls back to Mastra storage through the same codepath.\n */\nexport async function getAgentMemoryStore({\n agent,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n}): Promise<MemoryStorage | null> {\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n return null;\n }\n\n try {\n return (await memory.storage.getStore('memory')) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Reads the response-turn record metadata attached to a stored assistant message.\n */\nfunction readResponseTurnRecordMetadata(message: MastraDBMessage): ResponseTurnRecordMetadata | null {\n const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;\n const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;\n\n if (\n !responseMetadata ||\n typeof responseMetadata.agentId !== 'string' ||\n typeof responseMetadata.model !== 'string' ||\n typeof responseMetadata.createdAt !== 'number' ||\n (responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== 'number') ||\n (responseMetadata.instructions !== undefined && typeof responseMetadata.instructions !== 'string') ||\n (responseMetadata.text !== undefined &&\n (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format))) ||\n (responseMetadata.previousResponseId !== undefined && typeof responseMetadata.previousResponseId !== 'string') ||\n !Array.isArray(responseMetadata.tools) ||\n typeof responseMetadata.store !== 'boolean' ||\n !Array.isArray(responseMetadata.messageIds) ||\n (responseMetadata.outputItems !== undefined && !Array.isArray(responseMetadata.outputItems))\n ) {\n return null;\n }\n\n return {\n agentId: responseMetadata.agentId,\n model: responseMetadata.model,\n createdAt: responseMetadata.createdAt,\n completedAt: responseMetadata.completedAt,\n status: responseMetadata.status === 'completed' ? 'completed' : 'incomplete',\n usage: responseMetadata.usage as ResponseUsage | null,\n instructions: responseMetadata.instructions,\n text: responseMetadata.text as ResponseTextConfig | undefined,\n previousResponseId: responseMetadata.previousResponseId,\n providerOptions: responseMetadata.providerOptions as ProviderMetadataLike,\n tools: responseMetadata.tools as ResponseTool[],\n store: responseMetadata.store,\n messageIds: responseMetadata.messageIds.filter((value): value is string => typeof value === 'string'),\n outputItems: responseMetadata.outputItems as ResponseOutputItem[] | undefined,\n };\n}\n\n/**\n * Writes response-turn record metadata onto a persisted assistant message.\n */\nfunction writeResponseTurnRecordMetadata(\n message: MastraDBMessage,\n metadata: ResponseTurnRecordMetadata,\n): MastraDBMessage {\n const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};\n const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};\n\n return {\n ...message,\n content: {\n ...message.content,\n metadata: {\n ...contentMetadata,\n mastra: {\n ...mastraMetadata,\n response: metadata,\n },\n },\n },\n };\n}\n\n/**\n * Looks up a stored response-turn record by response id.\n *\n * Response ids are assistant message ids, so this reconstructs the record by\n * loading that persisted assistant message, reading its response metadata, then\n * reloading the full set of stored turn messages referenced by the metadata.\n */\nexport async function findResponseTurnRecord({\n agent,\n responseId,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n const memoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!memoryStore) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });\n const message = matchedMessages[0];\n if (!message || message.role !== 'assistant') {\n return null;\n }\n\n const metadata = readResponseTurnRecordMetadata(message);\n if (!metadata || metadata.agentId !== agent.id) {\n return null;\n }\n\n const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;\n if (!thread) {\n return null;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];\n const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });\n const messagesById = new Map(responseMessages.map(storedMessage => [storedMessage.id, storedMessage] as const));\n const orderedMessages = messageIds\n .map(messageId => messagesById.get(messageId))\n .filter((storedMessage): storedMessage is MastraDBMessage => Boolean(storedMessage));\n\n return { metadata, message, messages: orderedMessages, thread, memoryStore };\n}\n\nexport async function findResponseTurnRecordAcrossAgents({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n if (!mastra) {\n return null;\n }\n\n const agents = Object.values(mastra.listAgents()) as Agent<any, any, any, any>[];\n for (const agent of agents) {\n const match = await findResponseTurnRecord({ agent, responseId, requestContext });\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nexport type ConversationThreadRecord = {\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\nexport async function findConversationThreadAcrossAgents({\n mastra,\n conversationId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n conversationId: string;\n requestContext: RequestContext;\n}): Promise<ConversationThreadRecord | null> {\n if (!mastra) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const agents = Object.values(mastra.listAgents()) as Agent<any, any, any, any>[];\n\n for (const agent of agents) {\n const memoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!memoryStore) {\n continue;\n }\n\n const thread = await memoryStore.getThreadById({ threadId: conversationId });\n if (!thread) {\n continue;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n return { thread, memoryStore };\n }\n\n return null;\n}\n\n/**\n * Creates a synthetic assistant message for responses that did not emit any\n * persisted DB messages but still need a durable response-turn record.\n */\nfunction createSyntheticResponseMessage({\n createdAt,\n responseId,\n text,\n threadContext,\n}: {\n createdAt?: Date;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage {\n return {\n id: responseId,\n role: 'assistant',\n type: 'text',\n createdAt: createdAt ?? new Date(),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: text ? [{ type: 'text', text }] : [],\n },\n };\n}\n\nfunction hasTextPart(message: MastraDBMessage): boolean {\n return Boolean(\n message.content?.parts?.some(\n part => isPlainObject(part) && part.type === 'text' && typeof part.text === 'string' && part.text.length > 0,\n ),\n );\n}\n\nfunction isEmptyAssistantMessage(message: MastraDBMessage): boolean {\n return message.role === 'assistant' && Array.isArray(message.content?.parts) && message.content.parts.length === 0;\n}\n\nfunction hasToolInvocationPart(message: MastraDBMessage): boolean {\n return Boolean(\n message.content?.parts?.some(\n part => isPlainObject(part) && part.type === 'tool-invocation' && isPlainObject(part.toolInvocation),\n ),\n );\n}\n\nfunction getMessageText(message: MastraDBMessage): string {\n return (\n message.content?.parts\n ?.flatMap(part =>\n isPlainObject(part) && part.type === 'text' && typeof part.text === 'string' ? [part.text] : [],\n )\n .join('') ?? ''\n );\n}\n\nfunction getOutputMessageText(item: Extract<ResponseOutputItem, { type: 'message' }>): string {\n return item.content.map(part => part.text).join('');\n}\n\nfunction normalizeFallbackComparisonText(text: string): string {\n return text.trim();\n}\n\nfunction matchesFallbackText(messageText: string, fallbackText: string): boolean {\n return (\n messageText === fallbackText ||\n normalizeFallbackComparisonText(messageText) === normalizeFallbackComparisonText(fallbackText)\n );\n}\n\nfunction hasMatchingAssistantText(\n messages: MastraDBMessage[],\n item: Extract<ResponseOutputItem, { type: 'message' }>,\n): boolean {\n const fallbackText = getOutputMessageText(item);\n\n return messages.some(\n message =>\n message.role === 'assistant' &&\n hasTextPart(message) &&\n matchesFallbackText(getMessageText(message), fallbackText),\n );\n}\n\nfunction shouldReplaceAssistantText(messageText: string, fallbackText: string): boolean {\n const normalizedMessageText = normalizeFallbackComparisonText(messageText);\n const normalizedFallbackText = normalizeFallbackComparisonText(fallbackText);\n\n return (\n normalizedFallbackText !== normalizedMessageText &&\n (fallbackText.startsWith(messageText) || normalizedFallbackText.startsWith(normalizedMessageText))\n );\n}\n\nfunction getAssistantMessageTexts(messages: MastraDBMessage[]): string[] {\n return messages.flatMap(message =>\n message.role === 'assistant' && hasTextPart(message) ? [getMessageText(message)] : [],\n );\n}\n\nfunction shouldAddFallbackMessageText(\n messages: MastraDBMessage[],\n item: Extract<ResponseOutputItem, { type: 'message' }>,\n): boolean {\n const assistantTexts = getAssistantMessageTexts(messages);\n if (assistantTexts.length === 0) {\n return true;\n }\n\n const fallbackText = getOutputMessageText(item);\n return assistantTexts.every(messageText => shouldReplaceAssistantText(messageText, fallbackText));\n}\n\nfunction shouldReplaceAssistantTextWithFallback({\n fallbackMessageTexts,\n message,\n textOnlyFallbackMessageTexts,\n}: {\n fallbackMessageTexts: Set<string>;\n message: MastraDBMessage;\n textOnlyFallbackMessageTexts: Set<string>;\n}): boolean {\n if (message.role !== 'assistant' || !hasTextPart(message)) {\n return false;\n }\n\n const messageText = getMessageText(message);\n if (!messageText) {\n return false;\n }\n\n const comparisonTexts = hasToolInvocationPart(message) ? fallbackMessageTexts : textOnlyFallbackMessageTexts;\n\n return [...comparisonTexts].some(fallbackText => shouldReplaceAssistantText(messageText, fallbackText));\n}\n\nfunction replaceAssistantTextWithFallback({\n fallbackMessageTexts,\n message,\n textOnlyFallbackMessageTexts,\n}: {\n fallbackMessageTexts: Set<string>;\n message: MastraDBMessage;\n textOnlyFallbackMessageTexts: Set<string>;\n}): MastraDBMessage {\n if (!shouldReplaceAssistantTextWithFallback({ fallbackMessageTexts, message, textOnlyFallbackMessageTexts })) {\n return message;\n }\n\n const parts = message.content?.parts ?? [];\n const remainingParts = parts.filter(part => !(isPlainObject(part) && part.type === 'text'));\n\n return {\n ...message,\n content: {\n ...message.content,\n parts: remainingParts,\n },\n };\n}\n\nfunction parseFunctionCallArguments(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return { __raw: value };\n }\n}\n\nfunction createSyntheticToolResultMessage({\n baseMessage,\n item,\n responseId,\n toolCall,\n}: {\n baseMessage: Pick<MastraDBMessage, 'createdAt' | 'threadId' | 'resourceId'>;\n item: Extract<ResponseOutputItem, { type: 'function_call_output' }>;\n responseId: string;\n toolCall?: { args: unknown; toolName: string };\n}): SyntheticToolResultMessage {\n return {\n ...baseMessage,\n id: `${responseId}:tool-result:${item.call_id}`,\n role: 'tool',\n type: 'tool-result',\n content: {\n format: 2 as const,\n parts: [\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'result',\n toolCallId: item.call_id,\n toolName: toolCall?.toolName ?? 'unknown',\n args: toolCall?.args ?? {},\n result: item.output,\n },\n },\n ],\n },\n };\n}\n\nfunction toMastraDBMessage(message: SyntheticToolResultMessage): MastraDBMessage {\n // MastraDBMessage does not yet type persisted v2 tool-role messages, but\n // storage and response mapping already handle them at runtime.\n return message as unknown as MastraDBMessage;\n}\n\nfunction createSyntheticMessagesFromOutputItems({\n contextOutputItems,\n outputItems,\n responseId,\n threadContext,\n}: {\n contextOutputItems?: ResponseOutputItem[];\n outputItems: ResponseOutputItem[];\n responseId: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage[] {\n const toolContextItems = contextOutputItems ?? outputItems;\n const toolCallsById = new Map(\n toolContextItems.flatMap(item =>\n item.type === 'function_call'\n ? [[item.call_id, { args: parseFunctionCallArguments(item.arguments), toolName: item.name }] as const]\n : [],\n ),\n );\n\n const baseCreatedAt = Date.now();\n\n return outputItems.map((item, index): MastraDBMessage => {\n const baseMessage = {\n createdAt: new Date(baseCreatedAt + index),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n };\n\n if (item.type === 'function_call') {\n return {\n ...baseMessage,\n id: `${responseId}:tool-call:${item.call_id}`,\n role: 'assistant',\n type: 'tool-call',\n content: {\n format: 2 as const,\n parts: [\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'call',\n toolCallId: item.call_id,\n toolName: item.name,\n args: parseFunctionCallArguments(item.arguments),\n },\n },\n ],\n },\n };\n }\n\n if (item.type === 'function_call_output') {\n const toolCall = toolCallsById.get(item.call_id);\n\n return toMastraDBMessage(createSyntheticToolResultMessage({ baseMessage, item, responseId, toolCall }));\n }\n\n return {\n ...baseMessage,\n id: item.id,\n role: 'assistant',\n type: 'text',\n content: {\n format: 2 as const,\n parts: item.content.map(part => ({ type: 'text' as const, text: part.text })),\n },\n };\n });\n}\n\nfunction getToolInvocationParts(message: MastraDBMessage): Array<Record<string, unknown>> {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n\n return parts.flatMap(part =>\n isPlainObject(part) && part.type === 'tool-invocation' && isPlainObject(part.toolInvocation)\n ? [part.toolInvocation]\n : [],\n );\n}\n\nfunction getMissingFallbackOutputItems({\n fallbackOutputItems = [],\n messages,\n}: {\n fallbackOutputItems?: ResponseObject['output'];\n messages: MastraDBMessage[];\n}): ResponseOutputItem[] {\n if (!fallbackOutputItems.length) {\n return [];\n }\n\n const existingCallIds = new Set<string>();\n const existingResultCallIds = new Set<string>();\n\n for (const message of messages) {\n for (const toolInvocation of getToolInvocationParts(message)) {\n const toolCallId = typeof toolInvocation.toolCallId === 'string' ? toolInvocation.toolCallId : null;\n if (!toolCallId) {\n continue;\n }\n\n if (message.role === 'assistant' && (toolInvocation.args !== undefined || toolInvocation.result === undefined)) {\n existingCallIds.add(toolCallId);\n }\n if (toolInvocation.result !== undefined) {\n existingResultCallIds.add(toolCallId);\n }\n }\n }\n\n return fallbackOutputItems.filter(item => {\n if (item.type === 'function_call') {\n return !existingCallIds.has(item.call_id);\n }\n\n if (item.type === 'function_call_output') {\n return !existingResultCallIds.has(item.call_id);\n }\n\n if (item.type === 'message') {\n if (!item.content.some(part => part.text.length > 0) || hasMatchingAssistantText(messages, item)) {\n return false;\n }\n\n return shouldAddFallbackMessageText(messages, item);\n }\n\n return false;\n });\n}\n\nfunction getFallbackOutputIdForMessage(\n message: MastraDBMessage,\n responseId: string,\n fallbackOutputIds: Set<string>,\n): string | null {\n for (const toolInvocation of getToolInvocationParts(message)) {\n const toolCallId = typeof toolInvocation.toolCallId === 'string' ? toolInvocation.toolCallId : null;\n if (!toolCallId) {\n continue;\n }\n\n if (message.role === 'assistant' && toolInvocation.args !== undefined) {\n return toolCallId;\n }\n\n if (toolInvocation.result !== undefined) {\n return `${toolCallId}:output`;\n }\n }\n\n if (message.role === 'assistant' && hasTextPart(message)) {\n return fallbackOutputIds.has(message.id) ? message.id : responseId;\n }\n\n return null;\n}\n\nfunction sortMessagesByFallbackOutputOrder({\n fallbackOutputItems = [],\n messages,\n responseId,\n}: {\n fallbackOutputItems?: ResponseObject['output'];\n messages: MastraDBMessage[];\n responseId: string;\n}): MastraDBMessage[] {\n if (!fallbackOutputItems.length) {\n return messages;\n }\n\n const outputOrder = new Map(fallbackOutputItems.map((item, index) => [item.id, index]));\n const fallbackOutputIds = new Set(outputOrder.keys());\n\n return messages\n .map((message, index) => ({\n index,\n message,\n outputIndex:\n outputOrder.get(getFallbackOutputIdForMessage(message, responseId, fallbackOutputIds) ?? '') ??\n Number.MAX_SAFE_INTEGER,\n }))\n .sort((left, right) => left.outputIndex - right.outputIndex || left.index - right.index)\n .map(({ message }) => message);\n}\n\n/**\n * Resolves the Mastra messages that belong to the response turn being stored.\n */\nexport async function resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text,\n threadContext,\n fallbackOutputItems,\n}: {\n result: ResponseResultLike;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext | null;\n fallbackOutputItems?: ResponseObject['output'];\n}): Promise<MastraDBMessage[]> {\n const response = await result.response;\n const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];\n\n if (!threadContext) {\n return responseMessages;\n }\n\n if (responseMessages.length === 0) {\n if (fallbackOutputItems?.length) {\n const syntheticMessages = createSyntheticMessagesFromOutputItems({\n outputItems: fallbackOutputItems,\n responseId,\n threadContext,\n });\n\n return text && !syntheticMessages.some(message => message.role === 'assistant' && hasTextPart(message))\n ? [\n ...syntheticMessages,\n createSyntheticResponseMessage({\n createdAt: new Date(new Date(syntheticMessages.at(-1)?.createdAt ?? Date.now()).getTime() + 1),\n responseId,\n text,\n threadContext,\n }),\n ]\n : syntheticMessages;\n }\n\n return [createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n const missingFallbackItems = getMissingFallbackOutputItems({ fallbackOutputItems, messages: responseMessages });\n const missingFallbackMessageIds = new Set(\n missingFallbackItems\n .filter((item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message')\n .map(item => item.id),\n );\n const fallbackItemsWithMatchingAssistantText = (fallbackOutputItems ?? []).filter(\n (item): item is Extract<ResponseOutputItem, { type: 'message' }> =>\n item.type === 'message' && hasMatchingAssistantText(responseMessages, item),\n );\n const textOnlyFallbackMessageTexts = new Set(\n fallbackItemsWithMatchingAssistantText.map(getOutputMessageText).filter(Boolean),\n );\n const fallbackMessageTexts = new Set(\n (fallbackOutputItems ?? [])\n .filter((item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message')\n .filter(item => missingFallbackMessageIds.has(item.id) || fallbackItemsWithMatchingAssistantText.includes(item))\n .map(getOutputMessageText)\n .filter(Boolean),\n );\n const baseMessages = fallbackMessageTexts.size\n ? responseMessages.map(message =>\n replaceAssistantTextWithFallback({ fallbackMessageTexts, message, textOnlyFallbackMessageTexts }),\n )\n : responseMessages;\n const syntheticFallbackMessages = createSyntheticMessagesFromOutputItems({\n contextOutputItems: fallbackOutputItems ?? [],\n outputItems: missingFallbackItems,\n responseId,\n threadContext,\n });\n const resolvedMessages = sortMessagesByFallbackOutputOrder({\n fallbackOutputItems,\n messages: [...baseMessages, ...syntheticFallbackMessages],\n responseId,\n });\n\n if (text && !resolvedMessages.some(message => message.role === 'assistant' && hasTextPart(message))) {\n return [...resolvedMessages, createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n return resolvedMessages;\n}\n\n/**\n * Persists a response-turn record by anchoring it on the final assistant\n * message in the stored turn.\n *\n * The response id becomes that assistant message id, and the response-specific\n * metadata is written onto the assistant message so later retrieval can rebuild\n * the Responses object from thread-backed storage.\n */\nexport async function persistResponseTurnRecord({\n memoryStore,\n responseId,\n metadata,\n threadContext,\n messages,\n}: {\n memoryStore: MemoryStorage | null;\n responseId: string;\n metadata: ResponseTurnRecordMetadata;\n threadContext: ThreadExecutionContext;\n messages: MastraDBMessage[];\n}): Promise<void> {\n if (!memoryStore) {\n throw new HTTPException(500, { message: 'Memory storage was not available while storing the response' });\n }\n\n const normalizedMessages: MastraDBMessage[] = messages.map(message => ({\n ...message,\n threadId: message.threadId ?? threadContext.threadId,\n resourceId: message.resourceId ?? threadContext.resourceId,\n }));\n\n const lastAssistantIndex = [...normalizedMessages].map(message => message.role).lastIndexOf('assistant');\n const responseAnchorIndex =\n [...normalizedMessages]\n .map((message, index) => ({ index, message }))\n .reverse()\n .find(({ message }) => message.role === 'assistant' && hasTextPart(message))?.index ?? lastAssistantIndex;\n const lastAssistantMessage =\n responseAnchorIndex >= 0\n ? {\n ...normalizedMessages[responseAnchorIndex]!,\n id: responseId,\n }\n : ({\n id: responseId,\n role: 'assistant' as const,\n type: 'text' as const,\n createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1000 : Date.now()),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: [],\n },\n } satisfies MastraDBMessage);\n\n if (responseAnchorIndex >= 0) {\n normalizedMessages[responseAnchorIndex] = lastAssistantMessage;\n } else {\n normalizedMessages.push(lastAssistantMessage);\n }\n const storedMessageIndex = responseAnchorIndex >= 0 ? responseAnchorIndex : normalizedMessages.length - 1;\n\n const droppedSupersededMessageIds = normalizedMessages.flatMap((message, index) =>\n index !== storedMessageIndex && isEmptyAssistantMessage(message) && messages[index]?.id\n ? [messages[index]!.id]\n : [],\n );\n const staleMessageIds =\n responseAnchorIndex >= 0 && messages[responseAnchorIndex]?.id && messages[responseAnchorIndex]?.id !== responseId\n ? [messages[responseAnchorIndex]!.id]\n : [];\n const messagesToSave = normalizedMessages.filter(\n (message, index) => index === storedMessageIndex || !isEmptyAssistantMessage(message),\n );\n\n const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {\n ...metadata,\n messageIds: messagesToSave.map(message => message.id),\n });\n\n if (responseAnchorIndex >= 0) {\n normalizedMessages[responseAnchorIndex] = storedMessage;\n } else {\n normalizedMessages[normalizedMessages.length - 1] = storedMessage;\n }\n\n const savedMessages = normalizedMessages.filter(\n (message, index) => index === storedMessageIndex || !isEmptyAssistantMessage(message),\n );\n\n await memoryStore.saveMessages({ messages: savedMessages });\n\n const deleteMessageIds = [...new Set([...staleMessageIds, ...droppedSupersededMessageIds])];\n if (deleteMessageIds.length > 0) {\n await memoryStore.deleteMessages(deleteMessageIds);\n }\n}\n\n/**\n * Removes all persisted messages for a stored response-turn record.\n */\nexport async function deleteResponseTurnRecord({\n responseTurnRecord,\n}: {\n responseTurnRecord: ResponseTurnRecord;\n}): Promise<void> {\n const messageIds =\n responseTurnRecord.messages.length > 0\n ? responseTurnRecord.messages.map(message => message.id)\n : [responseTurnRecord.message.id];\n\n await responseTurnRecord.memoryStore.deleteMessages(messageIds);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"responses.storage.cjs","names":["getEffectiveResourceId","validateThreadOwnership","HTTPException"],"sources":["../../../src/server/handlers/responses.storage.ts"],"sourcesContent":["import type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport type {\n ResponseObject,\n ResponseOutputItem,\n ResponseTextConfig,\n ResponseTool,\n ResponseUsage,\n} from '../schemas/responses';\nimport { getEffectiveResourceId, validateThreadOwnership } from './utils';\n\nexport type ThreadExecutionContext = {\n threadId: string;\n resourceId: string;\n};\n\nexport type UsageLike = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n} | null;\n\nexport type ProviderMetadataLike = Record<string, Record<string, unknown> | undefined> | undefined;\n\nexport type ResponseTurnRecordMetadata = {\n agentId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n usage: ResponseUsage | null;\n instructions?: string;\n text?: ResponseTextConfig;\n previousResponseId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messageIds: string[];\n outputItems?: ResponseOutputItem[];\n};\n\nexport type ResponseTurnRecord = {\n metadata: ResponseTurnRecordMetadata;\n message: MastraDBMessage;\n messages: MastraDBMessage[];\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\ntype ResponseResultLike = {\n response?:\n | Promise<{\n dbMessages?: MastraDBMessage[];\n }>\n | {\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype SyntheticToolResultMessage = Omit<MastraDBMessage, 'role'> & { role: 'tool' };\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Resolves the backing memory store for a specific agent.\n *\n * This follows the normal agent-memory path. `agent.getMemory()` injects Mastra\n * root storage when the memory has no own storage, so this naturally prefers\n * agent storage first and falls back to Mastra storage through the same codepath.\n */\nexport async function getAgentMemoryStore({\n agent,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n}): Promise<MemoryStorage | null> {\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n return null;\n }\n\n try {\n return (await memory.storage.getStore('memory')) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Reads the response-turn record metadata attached to a stored assistant message.\n */\nfunction readResponseTurnRecordMetadata(message: MastraDBMessage): ResponseTurnRecordMetadata | null {\n const mastraMetadata = isPlainObject(message.content?.metadata?.mastra) ? message.content.metadata.mastra : null;\n const responseMetadata = mastraMetadata && isPlainObject(mastraMetadata.response) ? mastraMetadata.response : null;\n\n if (\n !responseMetadata ||\n typeof responseMetadata.agentId !== 'string' ||\n typeof responseMetadata.model !== 'string' ||\n typeof responseMetadata.createdAt !== 'number' ||\n (responseMetadata.completedAt !== null && typeof responseMetadata.completedAt !== 'number') ||\n (responseMetadata.instructions !== undefined && typeof responseMetadata.instructions !== 'string') ||\n (responseMetadata.text !== undefined &&\n (!isPlainObject(responseMetadata.text) || !isPlainObject(responseMetadata.text.format))) ||\n (responseMetadata.previousResponseId !== undefined && typeof responseMetadata.previousResponseId !== 'string') ||\n !Array.isArray(responseMetadata.tools) ||\n typeof responseMetadata.store !== 'boolean' ||\n !Array.isArray(responseMetadata.messageIds) ||\n (responseMetadata.outputItems !== undefined && !Array.isArray(responseMetadata.outputItems))\n ) {\n return null;\n }\n\n return {\n agentId: responseMetadata.agentId,\n model: responseMetadata.model,\n createdAt: responseMetadata.createdAt,\n completedAt: responseMetadata.completedAt,\n status: responseMetadata.status === 'completed' ? 'completed' : 'incomplete',\n usage: responseMetadata.usage as ResponseUsage | null,\n instructions: responseMetadata.instructions,\n text: responseMetadata.text as ResponseTextConfig | undefined,\n previousResponseId: responseMetadata.previousResponseId,\n providerOptions: responseMetadata.providerOptions as ProviderMetadataLike,\n tools: responseMetadata.tools as ResponseTool[],\n store: responseMetadata.store,\n messageIds: responseMetadata.messageIds.filter((value): value is string => typeof value === 'string'),\n outputItems: responseMetadata.outputItems as ResponseOutputItem[] | undefined,\n };\n}\n\n/**\n * Writes response-turn record metadata onto a persisted assistant message.\n */\nfunction writeResponseTurnRecordMetadata(\n message: MastraDBMessage,\n metadata: ResponseTurnRecordMetadata,\n): MastraDBMessage {\n const contentMetadata = isPlainObject(message.content?.metadata) ? message.content.metadata : {};\n const mastraMetadata = isPlainObject(contentMetadata.mastra) ? contentMetadata.mastra : {};\n\n return {\n ...message,\n content: {\n ...message.content,\n metadata: {\n ...contentMetadata,\n mastra: {\n ...mastraMetadata,\n response: metadata,\n },\n },\n },\n };\n}\n\n/**\n * Looks up a stored response-turn record by response id.\n *\n * Response ids are assistant message ids, so this reconstructs the record by\n * loading that persisted assistant message, reading its response metadata, then\n * reloading the full set of stored turn messages referenced by the metadata.\n */\nexport async function findResponseTurnRecord({\n agent,\n responseId,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n const memoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!memoryStore) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const { messages: matchedMessages } = await memoryStore.listMessagesById({ messageIds: [responseId] });\n const message = matchedMessages[0];\n if (!message || message.role !== 'assistant') {\n return null;\n }\n\n const metadata = readResponseTurnRecordMetadata(message);\n if (!metadata || metadata.agentId !== agent.id) {\n return null;\n }\n\n const thread = message.threadId ? await memoryStore.getThreadById({ threadId: message.threadId }) : null;\n if (!thread) {\n return null;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n const messageIds = metadata.messageIds.length > 0 ? metadata.messageIds : [message.id];\n const { messages: responseMessages } = await memoryStore.listMessagesById({ messageIds });\n const messagesById = new Map(responseMessages.map(storedMessage => [storedMessage.id, storedMessage] as const));\n const orderedMessages = messageIds\n .map(messageId => messagesById.get(messageId))\n .filter((storedMessage): storedMessage is MastraDBMessage => Boolean(storedMessage));\n\n return { metadata, message, messages: orderedMessages, thread, memoryStore };\n}\n\nexport async function findResponseTurnRecordAcrossAgents({\n mastra,\n responseId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n responseId: string;\n requestContext: RequestContext;\n}): Promise<ResponseTurnRecord | null> {\n if (!mastra) {\n return null;\n }\n\n const agents = Object.values(mastra.listAgents()) as Agent<any, any, any, any>[];\n for (const agent of agents) {\n const match = await findResponseTurnRecord({ agent, responseId, requestContext });\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nexport type ConversationThreadRecord = {\n thread: StorageThreadType;\n memoryStore: MemoryStorage;\n};\n\nexport async function findConversationThreadAcrossAgents({\n mastra,\n conversationId,\n requestContext,\n}: {\n mastra: Mastra | undefined;\n conversationId: string;\n requestContext: RequestContext;\n}): Promise<ConversationThreadRecord | null> {\n if (!mastra) {\n return null;\n }\n\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n const agents = Object.values(mastra.listAgents()) as Agent<any, any, any, any>[];\n\n for (const agent of agents) {\n const memoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!memoryStore) {\n continue;\n }\n\n const thread = await memoryStore.getThreadById({ threadId: conversationId });\n if (!thread) {\n continue;\n }\n\n await validateThreadOwnership(thread, effectiveResourceId);\n return { thread, memoryStore };\n }\n\n return null;\n}\n\n/**\n * Creates a synthetic assistant message for responses that did not emit any\n * persisted DB messages but still need a durable response-turn record.\n */\nfunction createSyntheticResponseMessage({\n createdAt,\n responseId,\n text,\n threadContext,\n}: {\n createdAt?: Date;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage {\n return {\n id: responseId,\n role: 'assistant',\n type: 'text',\n createdAt: createdAt ?? new Date(),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: text ? [{ type: 'text', text }] : [],\n },\n };\n}\n\nfunction hasTextPart(message: MastraDBMessage): boolean {\n return Boolean(\n message.content?.parts?.some(\n part => isPlainObject(part) && part.type === 'text' && typeof part.text === 'string' && part.text.length > 0,\n ),\n );\n}\n\nfunction isEmptyAssistantMessage(message: MastraDBMessage): boolean {\n return message.role === 'assistant' && Array.isArray(message.content?.parts) && message.content.parts.length === 0;\n}\n\nfunction hasToolInvocationPart(message: MastraDBMessage): boolean {\n return Boolean(\n message.content?.parts?.some(\n part => isPlainObject(part) && part.type === 'tool-invocation' && isPlainObject(part.toolInvocation),\n ),\n );\n}\n\nfunction getMessageText(message: MastraDBMessage): string {\n return (\n message.content?.parts\n ?.flatMap(part =>\n isPlainObject(part) && part.type === 'text' && typeof part.text === 'string' ? [part.text] : [],\n )\n .join('') ?? ''\n );\n}\n\nfunction getOutputMessageText(item: Extract<ResponseOutputItem, { type: 'message' }>): string {\n return item.content.map(part => part.text).join('');\n}\n\nfunction normalizeFallbackComparisonText(text: string): string {\n return text.trim();\n}\n\nfunction matchesFallbackText(messageText: string, fallbackText: string): boolean {\n return (\n messageText === fallbackText ||\n normalizeFallbackComparisonText(messageText) === normalizeFallbackComparisonText(fallbackText)\n );\n}\n\nfunction hasMatchingAssistantText(\n messages: MastraDBMessage[],\n item: Extract<ResponseOutputItem, { type: 'message' }>,\n): boolean {\n const fallbackText = getOutputMessageText(item);\n\n return messages.some(\n message =>\n message.role === 'assistant' &&\n hasTextPart(message) &&\n matchesFallbackText(getMessageText(message), fallbackText),\n );\n}\n\nfunction shouldReplaceAssistantText(messageText: string, fallbackText: string): boolean {\n const normalizedMessageText = normalizeFallbackComparisonText(messageText);\n const normalizedFallbackText = normalizeFallbackComparisonText(fallbackText);\n\n return (\n normalizedFallbackText !== normalizedMessageText &&\n (fallbackText.startsWith(messageText) || normalizedFallbackText.startsWith(normalizedMessageText))\n );\n}\n\nfunction getAssistantMessageTexts(messages: MastraDBMessage[]): string[] {\n return messages.flatMap(message =>\n message.role === 'assistant' && hasTextPart(message) ? [getMessageText(message)] : [],\n );\n}\n\nfunction shouldAddFallbackMessageText(\n messages: MastraDBMessage[],\n item: Extract<ResponseOutputItem, { type: 'message' }>,\n): boolean {\n const assistantTexts = getAssistantMessageTexts(messages);\n if (assistantTexts.length === 0) {\n return true;\n }\n\n const fallbackText = getOutputMessageText(item);\n return assistantTexts.every(messageText => shouldReplaceAssistantText(messageText, fallbackText));\n}\n\nfunction shouldReplaceAssistantTextWithFallback({\n fallbackMessageTexts,\n message,\n textOnlyFallbackMessageTexts,\n}: {\n fallbackMessageTexts: Set<string>;\n message: MastraDBMessage;\n textOnlyFallbackMessageTexts: Set<string>;\n}): boolean {\n if (message.role !== 'assistant' || !hasTextPart(message)) {\n return false;\n }\n\n const messageText = getMessageText(message);\n if (!messageText) {\n return false;\n }\n\n const comparisonTexts = hasToolInvocationPart(message) ? fallbackMessageTexts : textOnlyFallbackMessageTexts;\n\n return [...comparisonTexts].some(fallbackText => shouldReplaceAssistantText(messageText, fallbackText));\n}\n\nfunction replaceAssistantTextWithFallback({\n fallbackMessageTexts,\n message,\n textOnlyFallbackMessageTexts,\n}: {\n fallbackMessageTexts: Set<string>;\n message: MastraDBMessage;\n textOnlyFallbackMessageTexts: Set<string>;\n}): MastraDBMessage {\n if (!shouldReplaceAssistantTextWithFallback({ fallbackMessageTexts, message, textOnlyFallbackMessageTexts })) {\n return message;\n }\n\n const parts = message.content?.parts ?? [];\n const remainingParts = parts.filter(part => !(isPlainObject(part) && part.type === 'text'));\n\n return {\n ...message,\n content: {\n ...message.content,\n parts: remainingParts,\n },\n };\n}\n\nfunction parseFunctionCallArguments(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return { __raw: value };\n }\n}\n\nfunction createSyntheticToolResultMessage({\n baseMessage,\n item,\n responseId,\n toolCall,\n}: {\n baseMessage: Pick<MastraDBMessage, 'createdAt' | 'threadId' | 'resourceId'>;\n item: Extract<ResponseOutputItem, { type: 'function_call_output' }>;\n responseId: string;\n toolCall?: { args: unknown; toolName: string };\n}): SyntheticToolResultMessage {\n return {\n ...baseMessage,\n id: `${responseId}:tool-result:${item.call_id}`,\n role: 'tool',\n type: 'tool-result',\n content: {\n format: 2 as const,\n parts: [\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'result',\n toolCallId: item.call_id,\n toolName: toolCall?.toolName ?? 'unknown',\n args: toolCall?.args ?? {},\n result: item.output,\n },\n },\n ],\n },\n };\n}\n\nfunction toMastraDBMessage(message: SyntheticToolResultMessage): MastraDBMessage {\n // MastraDBMessage does not yet type persisted v2 tool-role messages, but\n // storage and response mapping already handle them at runtime.\n return message as unknown as MastraDBMessage;\n}\n\nfunction createSyntheticMessagesFromOutputItems({\n contextOutputItems,\n outputItems,\n responseId,\n threadContext,\n}: {\n contextOutputItems?: ResponseOutputItem[];\n outputItems: ResponseOutputItem[];\n responseId: string;\n threadContext: ThreadExecutionContext;\n}): MastraDBMessage[] {\n const toolContextItems = contextOutputItems ?? outputItems;\n const toolCallsById = new Map(\n toolContextItems.flatMap(item =>\n item.type === 'function_call'\n ? [[item.call_id, { args: parseFunctionCallArguments(item.arguments), toolName: item.name }] as const]\n : [],\n ),\n );\n\n const baseCreatedAt = Date.now();\n\n return outputItems.map((item, index): MastraDBMessage => {\n const baseMessage = {\n createdAt: new Date(baseCreatedAt + index),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n };\n\n if (item.type === 'function_call') {\n return {\n ...baseMessage,\n id: `${responseId}:tool-call:${item.call_id}`,\n role: 'assistant',\n type: 'tool-call',\n content: {\n format: 2 as const,\n parts: [\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'call',\n toolCallId: item.call_id,\n toolName: item.name,\n args: parseFunctionCallArguments(item.arguments),\n },\n },\n ],\n },\n };\n }\n\n if (item.type === 'function_call_output') {\n const toolCall = toolCallsById.get(item.call_id);\n\n return toMastraDBMessage(createSyntheticToolResultMessage({ baseMessage, item, responseId, toolCall }));\n }\n\n return {\n ...baseMessage,\n id: item.id,\n role: 'assistant',\n type: 'text',\n content: {\n format: 2 as const,\n parts: item.content.map(part => ({ type: 'text' as const, text: part.text })),\n },\n };\n });\n}\n\nfunction getToolInvocationParts(message: MastraDBMessage): Array<Record<string, unknown>> {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n\n return parts.flatMap(part =>\n isPlainObject(part) && part.type === 'tool-invocation' && isPlainObject(part.toolInvocation)\n ? [part.toolInvocation]\n : [],\n );\n}\n\nfunction getMissingFallbackOutputItems({\n fallbackOutputItems = [],\n messages,\n}: {\n fallbackOutputItems?: ResponseObject['output'];\n messages: MastraDBMessage[];\n}): ResponseOutputItem[] {\n if (!fallbackOutputItems.length) {\n return [];\n }\n\n const existingCallIds = new Set<string>();\n const existingResultCallIds = new Set<string>();\n\n for (const message of messages) {\n for (const toolInvocation of getToolInvocationParts(message)) {\n const toolCallId = typeof toolInvocation.toolCallId === 'string' ? toolInvocation.toolCallId : null;\n if (!toolCallId) {\n continue;\n }\n\n if (message.role === 'assistant' && (toolInvocation.args !== undefined || toolInvocation.result === undefined)) {\n existingCallIds.add(toolCallId);\n }\n if (toolInvocation.result !== undefined) {\n existingResultCallIds.add(toolCallId);\n }\n }\n }\n\n return fallbackOutputItems.filter(item => {\n if (item.type === 'function_call') {\n return !existingCallIds.has(item.call_id);\n }\n\n if (item.type === 'function_call_output') {\n return !existingResultCallIds.has(item.call_id);\n }\n\n if (item.type === 'message') {\n if (!item.content.some(part => part.text.length > 0) || hasMatchingAssistantText(messages, item)) {\n return false;\n }\n\n return shouldAddFallbackMessageText(messages, item);\n }\n\n return false;\n });\n}\n\nfunction getFallbackOutputIdForMessage(\n message: MastraDBMessage,\n responseId: string,\n fallbackOutputIds: Set<string>,\n): string | null {\n for (const toolInvocation of getToolInvocationParts(message)) {\n const toolCallId = typeof toolInvocation.toolCallId === 'string' ? toolInvocation.toolCallId : null;\n if (!toolCallId) {\n continue;\n }\n\n if (message.role === 'assistant' && toolInvocation.args !== undefined) {\n return toolCallId;\n }\n\n if (toolInvocation.result !== undefined) {\n return `${toolCallId}:output`;\n }\n }\n\n if (message.role === 'assistant' && hasTextPart(message)) {\n return fallbackOutputIds.has(message.id) ? message.id : responseId;\n }\n\n return null;\n}\n\nfunction sortMessagesByFallbackOutputOrder({\n fallbackOutputItems = [],\n messages,\n responseId,\n}: {\n fallbackOutputItems?: ResponseObject['output'];\n messages: MastraDBMessage[];\n responseId: string;\n}): MastraDBMessage[] {\n if (!fallbackOutputItems.length) {\n return messages;\n }\n\n const outputOrder = new Map(fallbackOutputItems.map((item, index) => [item.id, index]));\n const fallbackOutputIds = new Set(outputOrder.keys());\n\n return messages\n .map((message, index) => ({\n index,\n message,\n outputIndex:\n outputOrder.get(getFallbackOutputIdForMessage(message, responseId, fallbackOutputIds) ?? '') ??\n Number.MAX_SAFE_INTEGER,\n }))\n .sort((left, right) => left.outputIndex - right.outputIndex || left.index - right.index)\n .map(({ message }) => message);\n}\n\n/**\n * Resolves the Mastra messages that belong to the response turn being stored.\n */\nexport async function resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text,\n threadContext,\n fallbackOutputItems,\n}: {\n result: ResponseResultLike;\n responseId: string;\n text: string;\n threadContext: ThreadExecutionContext | null;\n fallbackOutputItems?: ResponseObject['output'];\n}): Promise<MastraDBMessage[]> {\n const response = await result.response;\n const responseMessages = response?.dbMessages?.length ? response.dbMessages : [];\n\n if (!threadContext) {\n return responseMessages;\n }\n\n if (responseMessages.length === 0) {\n if (fallbackOutputItems?.length) {\n const syntheticMessages = createSyntheticMessagesFromOutputItems({\n outputItems: fallbackOutputItems,\n responseId,\n threadContext,\n });\n\n return text && !syntheticMessages.some(message => message.role === 'assistant' && hasTextPart(message))\n ? [\n ...syntheticMessages,\n createSyntheticResponseMessage({\n createdAt: new Date(new Date(syntheticMessages.at(-1)?.createdAt ?? Date.now()).getTime() + 1),\n responseId,\n text,\n threadContext,\n }),\n ]\n : syntheticMessages;\n }\n\n return [createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n const missingFallbackItems = getMissingFallbackOutputItems({ fallbackOutputItems, messages: responseMessages });\n const missingFallbackMessageIds = new Set(\n missingFallbackItems\n .filter((item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message')\n .map(item => item.id),\n );\n const fallbackItemsWithMatchingAssistantText = (fallbackOutputItems ?? []).filter(\n (item): item is Extract<ResponseOutputItem, { type: 'message' }> =>\n item.type === 'message' && hasMatchingAssistantText(responseMessages, item),\n );\n const textOnlyFallbackMessageTexts = new Set(\n fallbackItemsWithMatchingAssistantText.map(getOutputMessageText).filter(Boolean),\n );\n const fallbackMessageTexts = new Set(\n (fallbackOutputItems ?? [])\n .filter((item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message')\n .filter(item => missingFallbackMessageIds.has(item.id) || fallbackItemsWithMatchingAssistantText.includes(item))\n .map(getOutputMessageText)\n .filter(Boolean),\n );\n const baseMessages = fallbackMessageTexts.size\n ? responseMessages.map(message =>\n replaceAssistantTextWithFallback({ fallbackMessageTexts, message, textOnlyFallbackMessageTexts }),\n )\n : responseMessages;\n const syntheticFallbackMessages = createSyntheticMessagesFromOutputItems({\n contextOutputItems: fallbackOutputItems ?? [],\n outputItems: missingFallbackItems,\n responseId,\n threadContext,\n });\n const resolvedMessages = sortMessagesByFallbackOutputOrder({\n fallbackOutputItems,\n messages: [...baseMessages, ...syntheticFallbackMessages],\n responseId,\n });\n\n if (text && !resolvedMessages.some(message => message.role === 'assistant' && hasTextPart(message))) {\n return [...resolvedMessages, createSyntheticResponseMessage({ responseId, text, threadContext })];\n }\n\n return resolvedMessages;\n}\n\n/**\n * Persists a response-turn record by anchoring it on the final assistant\n * message in the stored turn.\n *\n * The response id becomes that assistant message id, and the response-specific\n * metadata is written onto the assistant message so later retrieval can rebuild\n * the Responses object from thread-backed storage.\n */\nexport async function persistResponseTurnRecord({\n memoryStore,\n responseId,\n metadata,\n threadContext,\n messages,\n}: {\n memoryStore: MemoryStorage | null;\n responseId: string;\n metadata: ResponseTurnRecordMetadata;\n threadContext: ThreadExecutionContext;\n messages: MastraDBMessage[];\n}): Promise<void> {\n if (!memoryStore) {\n throw new HTTPException(500, { message: 'Memory storage was not available while storing the response' });\n }\n\n const normalizedMessages: MastraDBMessage[] = messages.map(message => ({\n ...message,\n threadId: message.threadId ?? threadContext.threadId,\n resourceId: message.resourceId ?? threadContext.resourceId,\n }));\n\n const lastAssistantIndex = [...normalizedMessages].map(message => message.role).lastIndexOf('assistant');\n const responseAnchorIndex =\n [...normalizedMessages]\n .map((message, index) => ({ index, message }))\n .reverse()\n .find(({ message }) => message.role === 'assistant' && hasTextPart(message))?.index ?? lastAssistantIndex;\n const lastAssistantMessage =\n responseAnchorIndex >= 0\n ? {\n ...normalizedMessages[responseAnchorIndex]!,\n id: responseId,\n }\n : ({\n id: responseId,\n role: 'assistant' as const,\n type: 'text' as const,\n createdAt: new Date(metadata.completedAt ? metadata.completedAt * 1000 : Date.now()),\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n content: {\n format: 2 as const,\n parts: [],\n },\n } satisfies MastraDBMessage);\n\n if (responseAnchorIndex >= 0) {\n normalizedMessages[responseAnchorIndex] = lastAssistantMessage;\n } else {\n normalizedMessages.push(lastAssistantMessage);\n }\n const storedMessageIndex = responseAnchorIndex >= 0 ? responseAnchorIndex : normalizedMessages.length - 1;\n\n const droppedSupersededMessageIds = normalizedMessages.flatMap((message, index) =>\n index !== storedMessageIndex && isEmptyAssistantMessage(message) && messages[index]?.id\n ? [messages[index]!.id]\n : [],\n );\n const staleMessageIds =\n responseAnchorIndex >= 0 && messages[responseAnchorIndex]?.id && messages[responseAnchorIndex]?.id !== responseId\n ? [messages[responseAnchorIndex]!.id]\n : [];\n const messagesToSave = normalizedMessages.filter(\n (message, index) => index === storedMessageIndex || !isEmptyAssistantMessage(message),\n );\n\n const storedMessage = writeResponseTurnRecordMetadata(lastAssistantMessage, {\n ...metadata,\n messageIds: messagesToSave.map(message => message.id),\n });\n\n if (responseAnchorIndex >= 0) {\n normalizedMessages[responseAnchorIndex] = storedMessage;\n } else {\n normalizedMessages[normalizedMessages.length - 1] = storedMessage;\n }\n\n const savedMessages = normalizedMessages.filter(\n (message, index) => index === storedMessageIndex || !isEmptyAssistantMessage(message),\n );\n\n await memoryStore.saveMessages({ messages: savedMessages });\n\n const deleteMessageIds = [...new Set([...staleMessageIds, ...droppedSupersededMessageIds])];\n if (deleteMessageIds.length > 0) {\n await memoryStore.deleteMessages(deleteMessageIds);\n }\n}\n\n/**\n * Removes all persisted messages for a stored response-turn record.\n */\nexport async function deleteResponseTurnRecord({\n responseTurnRecord,\n}: {\n responseTurnRecord: ResponseTurnRecord;\n}): Promise<void> {\n const messageIds =\n responseTurnRecord.messages.length > 0\n ? responseTurnRecord.messages.map(message => message.id)\n : [responseTurnRecord.message.id];\n\n await responseTurnRecord.memoryStore.deleteMessages(messageIds);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
|
-
import { n as getEffectiveResourceId, u as validateThreadOwnership } from "../../utils-
|
|
2
|
+
import { n as getEffectiveResourceId, u as validateThreadOwnership } from "../../utils-Hz8Hc2cd.js";
|
|
3
3
|
//#region src/server/handlers/responses.storage.ts
|
|
4
4
|
function isPlainObject(value) {
|
|
5
5
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_rolldown_runtime = require("../../rolldown-runtime-
|
|
2
|
+
const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
3
|
let _mastra_core_workflows = require("@mastra/core/workflows");
|
|
4
4
|
_mastra_core_workflows = require_rolldown_runtime.__toESM(_mastra_core_workflows, 1);
|
|
5
5
|
//#region src/server/handlers/schedules-workflows-shim.ts
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_schedules = require("../../schedules-7YUg_TRM.cjs");
|
|
3
4
|
exports.CREATE_SCHEDULE_ROUTE = require_schedules.CREATE_SCHEDULE_ROUTE;
|
|
4
5
|
exports.DELETE_SCHEDULE_ROUTE = require_schedules.DELETE_SCHEDULE_ROUTE;
|
|
5
6
|
exports.GET_SCHEDULE_ROUTE = require_schedules.GET_SCHEDULE_ROUTE;
|
|
@@ -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_version_helpers = require("./version-helpers.cjs");
|
|
7
|
-
const require_scorer_versions = require("../../scorer-versions-
|
|
8
|
+
const require_scorer_versions = require("../../scorer-versions-mL--H4LL.cjs");
|
|
8
9
|
//#region src/server/handlers/scorer-versions.ts
|
|
9
10
|
const SNAPSHOT_CONFIG_FIELDS = [
|
|
10
11
|
"name",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer-versions.cjs","names":["createRoute","scorerVersionPathParams","listScorerVersionsQuerySchema","listScorerVersionsResponseSchema","HTTPException","getStoredResourceScope","handleError","createScorerVersionBodySchema","createScorerVersionResponseSchema","extractConfigFromVersion","calculateChangedFields","createVersionWithRetry","enforceRetentionLimit","scorerVersionIdPathParams","getScorerVersionResponseSchema","activateScorerVersionResponseSchema","restoreScorerVersionResponseSchema","deleteScorerVersionResponseSchema","compareScorerVersionsQuerySchema","compareScorerVersionsResponseSchema","computeVersionDiffs"],"sources":["../../../src/server/handlers/scorer-versions.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n scorerVersionPathParams,\n scorerVersionIdPathParams,\n listScorerVersionsQuerySchema,\n createScorerVersionBodySchema,\n compareScorerVersionsQuerySchema,\n listScorerVersionsResponseSchema,\n getScorerVersionResponseSchema,\n createScorerVersionResponseSchema,\n activateScorerVersionResponseSchema,\n restoreScorerVersionResponseSchema,\n deleteScorerVersionResponseSchema,\n compareScorerVersionsResponseSchema,\n} from '../schemas/scorer-versions';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { handleError } from './error';\nimport {\n extractConfigFromVersion,\n calculateChangedFields,\n computeVersionDiffs,\n createVersionWithRetry,\n enforceRetentionLimit,\n} from './version-helpers';\nimport type { VersionedStoreInterface } from './version-helpers';\n\nconst 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 * GET /stored/scorers/:scorerId/versions - List all versions for a scorer\n */\nexport const LIST_SCORER_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n queryParamSchema: listScorerVersionsQuerySchema,\n responseSchema: listScorerVersionsResponseSchema,\n summary: 'List scorer versions',\n description: 'Returns a paginated list of all versions for a stored scorer',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, page, perPage, orderBy, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const result = await scorerStore.listVersions({\n scorerDefinitionId: scorerId,\n page,\n perPage,\n orderBy,\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error listing scorer versions');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions - Create a new version snapshot\n */\nexport const CREATE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n bodySchema: createScorerVersionBodySchema,\n responseSchema: createScorerVersionResponseSchema,\n summary: 'Create scorer version',\n description: 'Creates a new version snapshot of the current scorer configuration',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, changeMessage, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n let currentConfig: Record<string, unknown> = {};\n if (scorer.activeVersionId) {\n const activeVersion = await scorerStore.getVersion(scorer.activeVersionId);\n if (activeVersion) {\n currentConfig = extractConfigFromVersion(\n activeVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n }\n }\n\n const latestVersion = await scorerStore.getLatestVersion(scorerId);\n\n // If no activeVersionId, fall back to latest version config\n if (!scorer.activeVersionId && latestVersion) {\n currentConfig = extractConfigFromVersion(\n latestVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n }\n const previousConfig = latestVersion\n ? extractConfigFromVersion(latestVersion as unknown as Record<string, unknown>, SNAPSHOT_CONFIG_FIELDS)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, currentConfig);\n\n const { versionId } = await createVersionWithRetry(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n currentConfig,\n changedFields,\n { changeMessage },\n );\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(500, { message: 'Failed to retrieve created version' });\n }\n\n await enforceRetentionLimit(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n scorer.activeVersionId,\n );\n\n return version;\n } catch (error) {\n return handleError(error, 'Error creating scorer version');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:scorerId/versions/:versionId - Get a specific version\n */\nexport const GET_SCORER_VERSION_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions/:versionId',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: getScorerVersionResponseSchema,\n summary: 'Get scorer version',\n description: 'Returns a specific version of a scorer by its version ID',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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 version = await scorerStore.getVersion(versionId);\n\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n const scorer = await scorerStore.getById(scorerId);\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n return version;\n } catch (error) {\n return handleError(error, 'Error getting scorer version');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions/:versionId/activate - Set a version as active\n */\nexport const ACTIVATE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions/:versionId/activate',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: activateScorerVersionResponseSchema,\n summary: 'Activate scorer version',\n description: 'Sets a specific version as the active version for the scorer',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n await scorerStore.update({\n id: scorerId,\n activeVersionId: versionId,\n status: 'published',\n });\n\n // Clear the editor cache so subsequent requests see the new active version\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return {\n success: true,\n message: `Version ${version.versionNumber} is now active`,\n activeVersionId: versionId,\n };\n } catch (error) {\n return handleError(error, 'Error activating scorer version');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions/:versionId/restore - Restore scorer to a version\n */\nexport const RESTORE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions/:versionId/restore',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: restoreScorerVersionResponseSchema,\n summary: 'Restore scorer version',\n description: 'Restores the scorer configuration from a version, creating a new version',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const versionToRestore = await scorerStore.getVersion(versionId);\n if (!versionToRestore) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (versionToRestore.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n const restoredConfig = extractConfigFromVersion(\n versionToRestore as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n\n await scorerStore.update({\n id: scorerId,\n ...restoredConfig,\n });\n\n const latestVersion = await scorerStore.getLatestVersion(scorerId);\n const previousConfig = latestVersion\n ? extractConfigFromVersion(latestVersion as unknown as Record<string, unknown>, SNAPSHOT_CONFIG_FIELDS)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, restoredConfig);\n\n const { versionId: newVersionId } = await createVersionWithRetry(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n restoredConfig,\n changedFields,\n {\n changeMessage: `Restored from version ${versionToRestore.versionNumber}`,\n },\n );\n\n const newVersion = await scorerStore.getVersion(newVersionId);\n if (!newVersion) {\n throw new HTTPException(500, { message: 'Failed to retrieve created version' });\n }\n\n await enforceRetentionLimit(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n scorer.activeVersionId,\n );\n\n // Clear the editor cache so subsequent requests see the updated config\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return newVersion;\n } catch (error) {\n return handleError(error, 'Error restoring scorer version');\n }\n },\n});\n\n/**\n * DELETE /stored/scorers/:scorerId/versions/:versionId - Delete a version\n */\nexport const DELETE_SCORER_VERSION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/scorers/:scorerId/versions/:versionId',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: deleteScorerVersionResponseSchema,\n summary: 'Delete scorer version',\n description: 'Deletes a specific version (cannot delete the active version)',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n if (scorer.activeVersionId === versionId) {\n throw new HTTPException(400, {\n message: 'Cannot delete the active version. Activate a different version first.',\n });\n }\n\n await scorerStore.deleteVersion(versionId);\n\n // Clear the editor cache so subsequent requests see the updated config\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return {\n success: true,\n message: `Version ${version.versionNumber} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting scorer version');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:scorerId/versions/compare - Compare two versions\n */\nexport const COMPARE_SCORER_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions/compare',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n queryParamSchema: compareScorerVersionsQuerySchema,\n responseSchema: compareScorerVersionsResponseSchema,\n summary: 'Compare scorer versions',\n description: 'Compares two versions and returns the differences between them',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, from, to, 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 const scorer = await scorerStore.getById(scorerId);\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const fromVersion = await scorerStore.getVersion(from);\n if (!fromVersion) {\n throw new HTTPException(404, { message: `Version with id ${from} not found` });\n }\n if (fromVersion.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${from} not found for scorer ${scorerId}`,\n });\n }\n\n const toVersion = await scorerStore.getVersion(to);\n if (!toVersion) {\n throw new HTTPException(404, { message: `Version with id ${to} not found` });\n }\n if (toVersion.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${to} not found for scorer ${scorerId}`,\n });\n }\n\n const fromConfig = extractConfigFromVersion(\n fromVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n const toConfig = extractConfigFromVersion(\n toVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n\n const diffs = computeVersionDiffs(fromConfig, toConfig);\n\n return {\n diffs,\n fromVersion,\n toVersion,\n };\n } catch (error) {\n return handleError(error, 'Error comparing scorer versions');\n }\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scorer-versions.cjs","names":["createRoute","scorerVersionPathParams","listScorerVersionsQuerySchema","listScorerVersionsResponseSchema","HTTPException","getStoredResourceScope","handleError","createScorerVersionBodySchema","createScorerVersionResponseSchema","extractConfigFromVersion","calculateChangedFields","createVersionWithRetry","enforceRetentionLimit","scorerVersionIdPathParams","getScorerVersionResponseSchema","activateScorerVersionResponseSchema","restoreScorerVersionResponseSchema","deleteScorerVersionResponseSchema","compareScorerVersionsQuerySchema","compareScorerVersionsResponseSchema","computeVersionDiffs"],"sources":["../../../src/server/handlers/scorer-versions.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport {\n scorerVersionPathParams,\n scorerVersionIdPathParams,\n listScorerVersionsQuerySchema,\n createScorerVersionBodySchema,\n compareScorerVersionsQuerySchema,\n listScorerVersionsResponseSchema,\n getScorerVersionResponseSchema,\n createScorerVersionResponseSchema,\n activateScorerVersionResponseSchema,\n restoreScorerVersionResponseSchema,\n deleteScorerVersionResponseSchema,\n compareScorerVersionsResponseSchema,\n} from '../schemas/scorer-versions';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { handleError } from './error';\nimport {\n extractConfigFromVersion,\n calculateChangedFields,\n computeVersionDiffs,\n createVersionWithRetry,\n enforceRetentionLimit,\n} from './version-helpers';\nimport type { VersionedStoreInterface } from './version-helpers';\n\nconst 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 * GET /stored/scorers/:scorerId/versions - List all versions for a scorer\n */\nexport const LIST_SCORER_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n queryParamSchema: listScorerVersionsQuerySchema,\n responseSchema: listScorerVersionsResponseSchema,\n summary: 'List scorer versions',\n description: 'Returns a paginated list of all versions for a stored scorer',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, page, perPage, orderBy, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const result = await scorerStore.listVersions({\n scorerDefinitionId: scorerId,\n page,\n perPage,\n orderBy,\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error listing scorer versions');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions - Create a new version snapshot\n */\nexport const CREATE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n bodySchema: createScorerVersionBodySchema,\n responseSchema: createScorerVersionResponseSchema,\n summary: 'Create scorer version',\n description: 'Creates a new version snapshot of the current scorer configuration',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, changeMessage, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n let currentConfig: Record<string, unknown> = {};\n if (scorer.activeVersionId) {\n const activeVersion = await scorerStore.getVersion(scorer.activeVersionId);\n if (activeVersion) {\n currentConfig = extractConfigFromVersion(\n activeVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n }\n }\n\n const latestVersion = await scorerStore.getLatestVersion(scorerId);\n\n // If no activeVersionId, fall back to latest version config\n if (!scorer.activeVersionId && latestVersion) {\n currentConfig = extractConfigFromVersion(\n latestVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n }\n const previousConfig = latestVersion\n ? extractConfigFromVersion(latestVersion as unknown as Record<string, unknown>, SNAPSHOT_CONFIG_FIELDS)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, currentConfig);\n\n const { versionId } = await createVersionWithRetry(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n currentConfig,\n changedFields,\n { changeMessage },\n );\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(500, { message: 'Failed to retrieve created version' });\n }\n\n await enforceRetentionLimit(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n scorer.activeVersionId,\n );\n\n return version;\n } catch (error) {\n return handleError(error, 'Error creating scorer version');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:scorerId/versions/:versionId - Get a specific version\n */\nexport const GET_SCORER_VERSION_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions/:versionId',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: getScorerVersionResponseSchema,\n summary: 'Get scorer version',\n description: 'Returns a specific version of a scorer by its version ID',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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 version = await scorerStore.getVersion(versionId);\n\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n const scorer = await scorerStore.getById(scorerId);\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n return version;\n } catch (error) {\n return handleError(error, 'Error getting scorer version');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions/:versionId/activate - Set a version as active\n */\nexport const ACTIVATE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions/:versionId/activate',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: activateScorerVersionResponseSchema,\n summary: 'Activate scorer version',\n description: 'Sets a specific version as the active version for the scorer',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n await scorerStore.update({\n id: scorerId,\n activeVersionId: versionId,\n status: 'published',\n });\n\n // Clear the editor cache so subsequent requests see the new active version\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return {\n success: true,\n message: `Version ${version.versionNumber} is now active`,\n activeVersionId: versionId,\n };\n } catch (error) {\n return handleError(error, 'Error activating scorer version');\n }\n },\n});\n\n/**\n * POST /stored/scorers/:scorerId/versions/:versionId/restore - Restore scorer to a version\n */\nexport const RESTORE_SCORER_VERSION_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/scorers/:scorerId/versions/:versionId/restore',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: restoreScorerVersionResponseSchema,\n summary: 'Restore scorer version',\n description: 'Restores the scorer configuration from a version, creating a new version',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const versionToRestore = await scorerStore.getVersion(versionId);\n if (!versionToRestore) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (versionToRestore.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n const restoredConfig = extractConfigFromVersion(\n versionToRestore as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n\n await scorerStore.update({\n id: scorerId,\n ...restoredConfig,\n });\n\n const latestVersion = await scorerStore.getLatestVersion(scorerId);\n const previousConfig = latestVersion\n ? extractConfigFromVersion(latestVersion as unknown as Record<string, unknown>, SNAPSHOT_CONFIG_FIELDS)\n : null;\n\n const changedFields = calculateChangedFields(previousConfig, restoredConfig);\n\n const { versionId: newVersionId } = await createVersionWithRetry(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n restoredConfig,\n changedFields,\n {\n changeMessage: `Restored from version ${versionToRestore.versionNumber}`,\n },\n );\n\n const newVersion = await scorerStore.getVersion(newVersionId);\n if (!newVersion) {\n throw new HTTPException(500, { message: 'Failed to retrieve created version' });\n }\n\n await enforceRetentionLimit(\n scorerStore as unknown as VersionedStoreInterface,\n scorerId,\n 'scorerDefinitionId',\n scorer.activeVersionId,\n );\n\n // Clear the editor cache so subsequent requests see the updated config\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return newVersion;\n } catch (error) {\n return handleError(error, 'Error restoring scorer version');\n }\n },\n});\n\n/**\n * DELETE /stored/scorers/:scorerId/versions/:versionId - Delete a version\n */\nexport const DELETE_SCORER_VERSION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/scorers/:scorerId/versions/:versionId',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionIdPathParams,\n responseSchema: deleteScorerVersionResponseSchema,\n summary: 'Delete scorer version',\n description: 'Deletes a specific version (cannot delete the active version)',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, versionId, 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.getById(scorerId);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer with id ${scorerId} not found` });\n }\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const version = await scorerStore.getVersion(versionId);\n if (!version) {\n throw new HTTPException(404, { message: `Version with id ${versionId} not found` });\n }\n if (version.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${versionId} not found for scorer ${scorerId}`,\n });\n }\n\n if (scorer.activeVersionId === versionId) {\n throw new HTTPException(400, {\n message: 'Cannot delete the active version. Activate a different version first.',\n });\n }\n\n await scorerStore.deleteVersion(versionId);\n\n // Clear the editor cache so subsequent requests see the updated config\n mastra.getEditor()?.scorer.clearCache(scorerId);\n\n return {\n success: true,\n message: `Version ${version.versionNumber} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting scorer version');\n }\n },\n});\n\n/**\n * GET /stored/scorers/:scorerId/versions/compare - Compare two versions\n */\nexport const COMPARE_SCORER_VERSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/scorers/:scorerId/versions/compare',\n requiresAuth: true,\n responseType: 'json',\n pathParamSchema: scorerVersionPathParams,\n queryParamSchema: compareScorerVersionsQuerySchema,\n responseSchema: compareScorerVersionsResponseSchema,\n summary: 'Compare scorer versions',\n description: 'Compares two versions and returns the differences between them',\n tags: ['Scorer Versions'],\n handler: async ({ mastra, scorerId, from, to, 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 const scorer = await scorerStore.getById(scorerId);\n assertStoredResourceScope(scorer, await getStoredResourceScope(mastra, requestContext));\n\n const fromVersion = await scorerStore.getVersion(from);\n if (!fromVersion) {\n throw new HTTPException(404, { message: `Version with id ${from} not found` });\n }\n if (fromVersion.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${from} not found for scorer ${scorerId}`,\n });\n }\n\n const toVersion = await scorerStore.getVersion(to);\n if (!toVersion) {\n throw new HTTPException(404, { message: `Version with id ${to} not found` });\n }\n if (toVersion.scorerDefinitionId !== scorerId) {\n throw new HTTPException(404, {\n message: `Version with id ${to} not found for scorer ${scorerId}`,\n });\n }\n\n const fromConfig = extractConfigFromVersion(\n fromVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n const toConfig = extractConfigFromVersion(\n toVersion as unknown as Record<string, unknown>,\n SNAPSHOT_CONFIG_FIELDS,\n );\n\n const diffs = computeVersionDiffs(fromConfig, toConfig);\n\n return {\n diffs,\n fromVersion,\n toVersion,\n };\n } catch (error) {\n return handleError(error, 'Error comparing scorer versions');\n }\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
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 { calculateChangedFields, computeVersionDiffs, createVersionWithRetry, enforceRetentionLimit, extractConfigFromVersion } from "./version-helpers.js";
|
|
6
|
-
import { a as createScorerVersionResponseSchema, c as listScorerVersionsQuerySchema, d as scorerVersionIdPathParams, f as scorerVersionPathParams, i as createScorerVersionBodySchema, l as listScorerVersionsResponseSchema, n as compareScorerVersionsQuerySchema, o as deleteScorerVersionResponseSchema, r as compareScorerVersionsResponseSchema, s as getScorerVersionResponseSchema, t as activateScorerVersionResponseSchema, u as restoreScorerVersionResponseSchema } from "../../scorer-versions-
|
|
6
|
+
import { a as createScorerVersionResponseSchema, c as listScorerVersionsQuerySchema, d as scorerVersionIdPathParams, f as scorerVersionPathParams, i as createScorerVersionBodySchema, l as listScorerVersionsResponseSchema, n as compareScorerVersionsQuerySchema, o as deleteScorerVersionResponseSchema, r as compareScorerVersionsResponseSchema, s as getScorerVersionResponseSchema, t as activateScorerVersionResponseSchema, u as restoreScorerVersionResponseSchema } from "../../scorer-versions-D0_KP67E.js";
|
|
7
7
|
//#region src/server/handlers/scorer-versions.ts
|
|
8
8
|
const SNAPSHOT_CONFIG_FIELDS = [
|
|
9
9
|
"name",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_rolldown_runtime = require("../../rolldown-runtime-
|
|
2
|
+
const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
4
4
|
const require_common = require("../../common-DQn8jX5T.cjs");
|
|
5
|
-
const require_route_builder = require("../../route-builder-
|
|
5
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
6
6
|
const require_server_handlers_error = require("./error.cjs");
|
|
7
7
|
const require_server_handlers_agents = require("./agents.cjs");
|
|
8
8
|
const require_scores = require("../../scores-C_Au9jSw.cjs");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
|
|
2
2
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
3
3
|
import { l as runIdSchema } from "../../common-5ZZuR6wj.js";
|
|
4
4
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-sh-shared.cjs","names":["HTTPException"],"sources":["../../../src/server/handlers/skills-sh-shared.ts"],"sourcesContent":["/**\n * Shared skills.sh helpers\n *\n * Pure proxy + safety logic for talking to the skills.sh API. Used by:\n * - Workspace skills.sh routes (filesystem-only install).\n * - Builder registry routes (stored-skill install with optional workspace\n * materialization).\n *\n * No workspace or stored-skill concepts leak into this module. Path resolution,\n * filesystem writes, and DB writes happen in the callers.\n */\n\nimport { HTTPException } from '../http-exception';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Upstream skills.sh API base URL. */\nexport const SKILLS_SH_API_URL = 'https://skills-api-production.up.railway.app';\n\n/**\n * Directory path for skills installed via skills.sh, relative to the workspace\n * filesystem root (or to a CompositeFilesystem mount). Matches the convention\n * shared with Claude Code and other agent runtimes.\n */\nexport const SKILLS_SH_DIR = '.agents/skills';\n\nconst SEARCH_TIMEOUT_MS = 10_000;\nconst PREVIEW_TIMEOUT_MS = 10_000;\nconst FILE_FETCH_TIMEOUT_MS = 30_000;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Single skill summary returned by search/popular endpoints. */\nexport interface SkillsShSkillSummary {\n id: string;\n name: string;\n installs: number;\n topSource: string;\n}\n\nexport interface SkillsShSearchResult {\n query: string;\n searchType: 'query';\n skills: SkillsShSkillSummary[];\n count: number;\n}\n\nexport interface SkillsShPopularResult {\n skills: SkillsShSkillSummary[];\n count: number;\n limit: number;\n offset: number;\n}\n\n/** A single file from the skills.sh files endpoint. */\nexport interface SkillFileEntry {\n path: string;\n content: string;\n encoding: 'utf-8' | 'base64';\n}\n\n/** Response from the skills.sh files endpoint. */\nexport interface SkillFilesResponse {\n skillId: string;\n owner: string;\n repo: string;\n branch: string;\n files: SkillFileEntry[];\n}\n\n// =============================================================================\n// Safety validators\n// =============================================================================\n\n/**\n * Validate skill name to prevent path traversal attacks. Only allows\n * alphanumeric characters, hyphens, and underscores; must start with an\n * alphanumeric character.\n *\n * Throws an HTTP 400 on invalid input. Returns the validated name on success\n * so it can be used inline.\n */\nconst SKILL_NAME_REGEX = /^[a-z0-9][a-z0-9-_]*$/i;\n\nexport function assertSafeSkillName(name: string): string {\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new HTTPException(400, {\n message: `Invalid skill name \"${name}\". Names must start with alphanumeric and contain only letters, numbers, hyphens, and underscores.`,\n });\n }\n return name;\n}\n\n/**\n * Validate that a file path is safe (no traversal, no absolute paths).\n * Prevents malicious API responses from writing files outside the skill\n * directory.\n */\nexport function assertSafeFilePath(filePath: string): string {\n if (filePath.startsWith('/') || filePath.startsWith('\\\\') || /^[a-zA-Z]:[\\\\/]/.test(filePath)) {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Absolute paths are not allowed.`,\n });\n }\n // Normalize backslashes to forward slashes so Windows-style traversal\n // (e.g. \"..\\\\..\\\\etc\\\\passwd\") cannot bypass the segment check below.\n const segments = filePath.split(/[\\\\/]/);\n for (const segment of segments) {\n if (segment === '..' || segment === '.') {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Path traversal is not allowed.`,\n });\n }\n }\n return filePath;\n}\n\n// =============================================================================\n// API calls\n// =============================================================================\n\ninterface UpstreamSkillsList {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n page?: number;\n pageSize?: number;\n totalPages?: number;\n}\n\n/** Search skills.sh by query string. Throws HTTPException on upstream failure. */\nexport async function searchSkillsSh({ q, limit }: { q: string; limit: number }): Promise<SkillsShSearchResult> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), SEARCH_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills?query=${encodeURIComponent(q)}&pageSize=${limit}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as UpstreamSkillsList;\n return {\n query: q,\n searchType: 'query',\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/** Fetch the popular skills list from skills.sh. */\nexport async function getPopularSkillsSh({\n limit,\n offset,\n}: {\n limit: number;\n offset: number;\n}): Promise<SkillsShPopularResult> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), SEARCH_TIMEOUT_MS);\n\n try {\n const page = offset > 0 ? Math.floor(offset / limit) + 1 : 1;\n const url = `${SKILLS_SH_API_URL}/api/skills/top?pageSize=${limit}&page=${page}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as UpstreamSkillsList;\n return {\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n limit,\n offset,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Fetch the rendered SKILL.md / instructions content for a single skill.\n * Returns the content string, or throws HTTPException(404) when the skill\n * doesn't exist or has no content.\n */\nexport async function previewSkillsSh({\n owner,\n repo,\n skillName,\n}: {\n owner: string;\n repo: string;\n skillName: string;\n}): Promise<{ content: string }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), PREVIEW_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/content`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" for ${owner}/${repo}`,\n });\n }\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as { instructions?: string; raw?: string };\n const content = data.instructions || data.raw || '';\n\n if (!content) {\n throw new HTTPException(404, {\n message: `No content available for skill \"${skillName}\"`,\n });\n }\n\n return { content };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Fetch the full file tree for a skill from the skills.sh files endpoint.\n * Returns null when the skill doesn't exist (404). Throws on other upstream\n * errors. Caller is responsible for validating each returned file path with\n * `assertSafeFilePath` before writing to disk.\n */\nexport async function fetchSkillFiles(\n owner: string,\n repo: string,\n skillName: string,\n): Promise<SkillFilesResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), FILE_FETCH_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/files`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`Skills API error: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json()) as SkillFilesResponse;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skills-sh-shared.cjs","names":["HTTPException"],"sources":["../../../src/server/handlers/skills-sh-shared.ts"],"sourcesContent":["/**\n * Shared skills.sh helpers\n *\n * Pure proxy + safety logic for talking to the skills.sh API. Used by:\n * - Workspace skills.sh routes (filesystem-only install).\n * - Builder registry routes (stored-skill install with optional workspace\n * materialization).\n *\n * No workspace or stored-skill concepts leak into this module. Path resolution,\n * filesystem writes, and DB writes happen in the callers.\n */\n\nimport { HTTPException } from '../http-exception';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Upstream skills.sh API base URL. */\nexport const SKILLS_SH_API_URL = 'https://skills-api-production.up.railway.app';\n\n/**\n * Directory path for skills installed via skills.sh, relative to the workspace\n * filesystem root (or to a CompositeFilesystem mount). Matches the convention\n * shared with Claude Code and other agent runtimes.\n */\nexport const SKILLS_SH_DIR = '.agents/skills';\n\nconst SEARCH_TIMEOUT_MS = 10_000;\nconst PREVIEW_TIMEOUT_MS = 10_000;\nconst FILE_FETCH_TIMEOUT_MS = 30_000;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Single skill summary returned by search/popular endpoints. */\nexport interface SkillsShSkillSummary {\n id: string;\n name: string;\n installs: number;\n topSource: string;\n}\n\nexport interface SkillsShSearchResult {\n query: string;\n searchType: 'query';\n skills: SkillsShSkillSummary[];\n count: number;\n}\n\nexport interface SkillsShPopularResult {\n skills: SkillsShSkillSummary[];\n count: number;\n limit: number;\n offset: number;\n}\n\n/** A single file from the skills.sh files endpoint. */\nexport interface SkillFileEntry {\n path: string;\n content: string;\n encoding: 'utf-8' | 'base64';\n}\n\n/** Response from the skills.sh files endpoint. */\nexport interface SkillFilesResponse {\n skillId: string;\n owner: string;\n repo: string;\n branch: string;\n files: SkillFileEntry[];\n}\n\n// =============================================================================\n// Safety validators\n// =============================================================================\n\n/**\n * Validate skill name to prevent path traversal attacks. Only allows\n * alphanumeric characters, hyphens, and underscores; must start with an\n * alphanumeric character.\n *\n * Throws an HTTP 400 on invalid input. Returns the validated name on success\n * so it can be used inline.\n */\nconst SKILL_NAME_REGEX = /^[a-z0-9][a-z0-9-_]*$/i;\n\nexport function assertSafeSkillName(name: string): string {\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new HTTPException(400, {\n message: `Invalid skill name \"${name}\". Names must start with alphanumeric and contain only letters, numbers, hyphens, and underscores.`,\n });\n }\n return name;\n}\n\n/**\n * Validate that a file path is safe (no traversal, no absolute paths).\n * Prevents malicious API responses from writing files outside the skill\n * directory.\n */\nexport function assertSafeFilePath(filePath: string): string {\n if (filePath.startsWith('/') || filePath.startsWith('\\\\') || /^[a-zA-Z]:[\\\\/]/.test(filePath)) {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Absolute paths are not allowed.`,\n });\n }\n // Normalize backslashes to forward slashes so Windows-style traversal\n // (e.g. \"..\\\\..\\\\etc\\\\passwd\") cannot bypass the segment check below.\n const segments = filePath.split(/[\\\\/]/);\n for (const segment of segments) {\n if (segment === '..' || segment === '.') {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Path traversal is not allowed.`,\n });\n }\n }\n return filePath;\n}\n\n// =============================================================================\n// API calls\n// =============================================================================\n\ninterface UpstreamSkillsList {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n page?: number;\n pageSize?: number;\n totalPages?: number;\n}\n\n/** Search skills.sh by query string. Throws HTTPException on upstream failure. */\nexport async function searchSkillsSh({ q, limit }: { q: string; limit: number }): Promise<SkillsShSearchResult> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), SEARCH_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills?query=${encodeURIComponent(q)}&pageSize=${limit}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as UpstreamSkillsList;\n return {\n query: q,\n searchType: 'query',\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/** Fetch the popular skills list from skills.sh. */\nexport async function getPopularSkillsSh({\n limit,\n offset,\n}: {\n limit: number;\n offset: number;\n}): Promise<SkillsShPopularResult> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), SEARCH_TIMEOUT_MS);\n\n try {\n const page = offset > 0 ? Math.floor(offset / limit) + 1 : 1;\n const url = `${SKILLS_SH_API_URL}/api/skills/top?pageSize=${limit}&page=${page}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as UpstreamSkillsList;\n return {\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n limit,\n offset,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Fetch the rendered SKILL.md / instructions content for a single skill.\n * Returns the content string, or throws HTTPException(404) when the skill\n * doesn't exist or has no content.\n */\nexport async function previewSkillsSh({\n owner,\n repo,\n skillName,\n}: {\n owner: string;\n repo: string;\n skillName: string;\n}): Promise<{ content: string }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), PREVIEW_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/content`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" for ${owner}/${repo}`,\n });\n }\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as { instructions?: string; raw?: string };\n const content = data.instructions || data.raw || '';\n\n if (!content) {\n throw new HTTPException(404, {\n message: `No content available for skill \"${skillName}\"`,\n });\n }\n\n return { content };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Fetch the full file tree for a skill from the skills.sh files endpoint.\n * Returns null when the skill doesn't exist (404). Throws on other upstream\n * errors. Caller is responsible for validating each returned file path with\n * `assertSafeFilePath` before writing to disk.\n */\nexport async function fetchSkillFiles(\n owner: string,\n repo: string,\n skillName: string,\n): Promise<SkillFilesResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), FILE_FETCH_TIMEOUT_MS);\n\n try {\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/files`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`Skills API error: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json()) as SkillFilesResponse;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
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
|
-
const require_stored_agents = require("../../stored-agents-
|
|
7
|
+
const require_stored_agents = require("../../stored-agents-D6JEb3zN.cjs");
|
|
7
8
|
const require_server_handlers_authorship = require("./authorship.cjs");
|
|
8
|
-
const require_editor_builder = require("../../editor-builder-
|
|
9
|
+
const require_editor_builder = require("../../editor-builder-BmRQift0.cjs");
|
|
9
10
|
const require_favorites = require("../../favorites-D1-AzGsK.cjs");
|
|
10
11
|
//#region src/server/handlers/stored-agent-favorites.ts
|
|
11
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-agent-favorites.cjs","names":["HTTPException","createRoute","storedAgentIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","getStoredResourceScope","handleError"],"sources":["../../../src/server/handlers/stored-agent-favorites.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\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 agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents 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 { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\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 { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\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 { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"stored-agent-favorites.cjs","names":["HTTPException","createRoute","storedAgentIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","getStoredResourceScope","handleError"],"sources":["../../../src/server/handlers/stored-agent-favorites.ts"],"sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\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 agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents 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 { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\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 { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\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 { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\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,QAAQ,aAAa;GACpD,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,QAAQ,aAAa;GACpD,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,8 +1,8 @@
|
|
|
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
|
-
import { C as storedAgentIdPathParams } from "../../stored-agents-
|
|
5
|
+
import { C as storedAgentIdPathParams } from "../../stored-agents-DMW5wrF7.js";
|
|
6
6
|
import { assertReadAccess, getCallerAuthorId } from "./authorship.js";
|
|
7
7
|
import { a as requireBuilderFeature } from "../../editor-builder-EP9FAtQm.js";
|
|
8
8
|
import { t as favoriteToggleResponseSchema } from "../../favorites-DWDyKxts.js";
|