@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require("./schema-Bv9OdW1f-CxTiW8RD.cjs");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as modelConfigSchema } from "./stored-agents-
|
|
1
|
+
import { f as modelConfigSchema } from "./stored-agents-DMW5wrF7.js";
|
|
2
2
|
import { a as createVersionBodySchema, i as createListVersionsResponseSchema, n as compareVersionsQuerySchema, o as deleteVersionResponseSchema, r as createCompareVersionsResponseSchema, s as listVersionsQuerySchema, t as activateVersionResponseSchema } from "./version-common-CudZ_WuW.js";
|
|
3
3
|
import { z } from "zod/v4";
|
|
4
4
|
//#region src/server/schemas/scorer-versions.ts
|
|
@@ -62,4 +62,4 @@ const compareScorerVersionsResponseSchema = createCompareVersionsResponseSchema(
|
|
|
62
62
|
//#endregion
|
|
63
63
|
export { createScorerVersionResponseSchema as a, listScorerVersionsQuerySchema as c, scorerVersionIdPathParams as d, scorerVersionPathParams as f, createScorerVersionBodySchema as i, listScorerVersionsResponseSchema as l, compareScorerVersionsQuerySchema as n, deleteScorerVersionResponseSchema as o, scorerVersionSchema as p, compareScorerVersionsResponseSchema as r, getScorerVersionResponseSchema as s, activateScorerVersionResponseSchema as t, restoreScorerVersionResponseSchema as u };
|
|
64
64
|
|
|
65
|
-
//# sourceMappingURL=scorer-versions-
|
|
65
|
+
//# sourceMappingURL=scorer-versions-D0_KP67E.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer-versions-
|
|
1
|
+
{"version":3,"file":"scorer-versions-D0_KP67E.js","names":[],"sources":["../src/server/schemas/scorer-versions.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { modelConfigSchema } from './stored-agents';\nimport {\n listVersionsQuerySchema,\n compareVersionsQuerySchema,\n createVersionBodySchema,\n activateVersionResponseSchema,\n deleteVersionResponseSchema,\n versionDiffEntrySchema,\n createListVersionsResponseSchema,\n createCompareVersionsResponseSchema,\n} from './version-common';\n\n// Re-export shared schemas under domain-specific names\nexport const listScorerVersionsQuerySchema = listVersionsQuerySchema;\nexport const compareScorerVersionsQuerySchema = compareVersionsQuerySchema;\nexport const createScorerVersionBodySchema = createVersionBodySchema;\n\n// ============================================================================\n// Path Parameter Schemas\n// ============================================================================\n\nexport const scorerVersionPathParams = z.object({\n scorerId: z.string().describe('Unique identifier for the stored scorer definition'),\n});\n\nexport const scorerVersionIdPathParams = z.object({\n scorerId: z.string().describe('Unique identifier for the stored scorer definition'),\n versionId: z.string().describe('Unique identifier for the version (UUID)'),\n});\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst samplingConfigSchema = z.union([\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('ratio'), rate: z.number().min(0).max(1) }),\n]);\n\nconst scorerTypeEnum = z.enum([\n 'llm-judge',\n 'answer-relevancy',\n 'answer-similarity',\n 'bias',\n 'context-precision',\n 'context-relevance',\n 'faithfulness',\n 'hallucination',\n 'noise-sensitivity',\n 'prompt-alignment',\n 'tool-call-accuracy',\n 'toxicity',\n]);\n\nexport const scorerVersionSchema = z.object({\n id: z.string().describe('Unique identifier for the version (UUID)'),\n scorerDefinitionId: z.string().describe('ID of the scorer this version belongs to'),\n versionNumber: z.number().describe('Sequential version number (1, 2, 3, ...)'),\n // Snapshot config fields\n name: z.string().describe('Name of the scorer'),\n description: z.string().optional().describe('Description of the scorer'),\n type: scorerTypeEnum,\n model: modelConfigSchema.optional(),\n instructions: z.string().optional(),\n scoreRange: z\n .object({\n min: z.number().optional(),\n max: z.number().optional(),\n })\n .optional(),\n presetConfig: z.record(z.string(), z.unknown()).optional(),\n defaultSampling: samplingConfigSchema.optional(),\n // Version metadata\n changedFields: z.array(z.string()).optional().describe('Array of field names that changed from the previous version'),\n changeMessage: z.string().optional().describe('Optional message describing the changes'),\n createdAt: z.coerce.date().describe('When this version was created'),\n});\n\nexport const listScorerVersionsResponseSchema = createListVersionsResponseSchema(scorerVersionSchema);\n\nexport const getScorerVersionResponseSchema = scorerVersionSchema;\n\nexport const createScorerVersionResponseSchema = scorerVersionSchema.partial().merge(\n z.object({\n id: z.string(),\n scorerDefinitionId: z.string(),\n versionNumber: z.number(),\n createdAt: z.coerce.date(),\n }),\n);\n\nexport const activateScorerVersionResponseSchema = activateVersionResponseSchema;\n\nexport const restoreScorerVersionResponseSchema = scorerVersionSchema;\n\nexport const deleteScorerVersionResponseSchema = deleteVersionResponseSchema;\n\nexport const compareScorerVersionsResponseSchema = createCompareVersionsResponseSchema(scorerVersionSchema);\n\nexport { versionDiffEntrySchema };\n"],"mappings":";;;;AAcA,MAAa,gCAAgC;AAC7C,MAAa,mCAAmC;AAChD,MAAa,gCAAgC;AAM7C,MAAa,0BAA0B,EAAE,OAAO,EAC9C,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,oDAAoD,EACpF,CAAC;AAED,MAAa,4BAA4B,EAAE,OAAO;CAChD,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS,oDAAoD;CAClF,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;AAC3E,CAAC;AAMD,MAAM,uBAAuB,EAAE,MAAM,CACnC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,CAAC,GACpC,EAAE,OAAO;CAAE,MAAM,EAAE,QAAQ,OAAO;CAAG,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAAE,CAAC,CACvE,CAAC;AAED,MAAM,iBAAiB,EAAE,KAAK;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,sBAAsB,EAAE,OAAO;CAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAClE,oBAAoB,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAClF,eAAe,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAE7E,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,oBAAoB;CAC9C,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2BAA2B;CACvE,MAAM;CACN,OAAO,kBAAkB,SAAS;CAClC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,YAAY,EACT,OAAO;EACN,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;EACzB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,CAAC,CAAC,CACD,SAAS;CACZ,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACzD,iBAAiB,qBAAqB,SAAS;CAE/C,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6DAA6D;CACpH,eAAe,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,yCAAyC;CACvF,WAAW,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS,+BAA+B;AACrE,CAAC;AAED,MAAa,mCAAmC,iCAAiC,mBAAmB;AAEpG,MAAa,iCAAiC;AAE9C,MAAa,oCAAoC,oBAAoB,QAAQ,CAAC,CAAC,MAC7E,EAAE,OAAO;CACP,IAAI,EAAE,OAAO;CACb,oBAAoB,EAAE,OAAO;CAC7B,eAAe,EAAE,OAAO;CACxB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CACH;AAEA,MAAa,sCAAsC;AAEnD,MAAa,qCAAqC;AAElD,MAAa,oCAAoC;AAEjD,MAAa,sCAAsC,oCAAoC,mBAAmB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_stored_agents = require("./stored-agents-
|
|
1
|
+
const require_stored_agents = require("./stored-agents-D6JEb3zN.cjs");
|
|
2
2
|
const require_version_common = require("./version-common-AtNRQ5xH.cjs");
|
|
3
3
|
let zod_v4 = require("zod/v4");
|
|
4
4
|
//#region src/server/schemas/scorer-versions.ts
|
|
@@ -139,4 +139,4 @@ Object.defineProperty(exports, "scorerVersionSchema", {
|
|
|
139
139
|
}
|
|
140
140
|
});
|
|
141
141
|
|
|
142
|
-
//# sourceMappingURL=scorer-versions-
|
|
142
|
+
//# sourceMappingURL=scorer-versions-mL--H4LL.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer-versions-
|
|
1
|
+
{"version":3,"file":"scorer-versions-mL--H4LL.cjs","names":["listVersionsQuerySchema","compareVersionsQuerySchema","createVersionBodySchema","z","modelConfigSchema","createListVersionsResponseSchema","activateVersionResponseSchema","deleteVersionResponseSchema","createCompareVersionsResponseSchema"],"sources":["../src/server/schemas/scorer-versions.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { modelConfigSchema } from './stored-agents';\nimport {\n listVersionsQuerySchema,\n compareVersionsQuerySchema,\n createVersionBodySchema,\n activateVersionResponseSchema,\n deleteVersionResponseSchema,\n versionDiffEntrySchema,\n createListVersionsResponseSchema,\n createCompareVersionsResponseSchema,\n} from './version-common';\n\n// Re-export shared schemas under domain-specific names\nexport const listScorerVersionsQuerySchema = listVersionsQuerySchema;\nexport const compareScorerVersionsQuerySchema = compareVersionsQuerySchema;\nexport const createScorerVersionBodySchema = createVersionBodySchema;\n\n// ============================================================================\n// Path Parameter Schemas\n// ============================================================================\n\nexport const scorerVersionPathParams = z.object({\n scorerId: z.string().describe('Unique identifier for the stored scorer definition'),\n});\n\nexport const scorerVersionIdPathParams = z.object({\n scorerId: z.string().describe('Unique identifier for the stored scorer definition'),\n versionId: z.string().describe('Unique identifier for the version (UUID)'),\n});\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst samplingConfigSchema = z.union([\n z.object({ type: z.literal('none') }),\n z.object({ type: z.literal('ratio'), rate: z.number().min(0).max(1) }),\n]);\n\nconst scorerTypeEnum = z.enum([\n 'llm-judge',\n 'answer-relevancy',\n 'answer-similarity',\n 'bias',\n 'context-precision',\n 'context-relevance',\n 'faithfulness',\n 'hallucination',\n 'noise-sensitivity',\n 'prompt-alignment',\n 'tool-call-accuracy',\n 'toxicity',\n]);\n\nexport const scorerVersionSchema = z.object({\n id: z.string().describe('Unique identifier for the version (UUID)'),\n scorerDefinitionId: z.string().describe('ID of the scorer this version belongs to'),\n versionNumber: z.number().describe('Sequential version number (1, 2, 3, ...)'),\n // Snapshot config fields\n name: z.string().describe('Name of the scorer'),\n description: z.string().optional().describe('Description of the scorer'),\n type: scorerTypeEnum,\n model: modelConfigSchema.optional(),\n instructions: z.string().optional(),\n scoreRange: z\n .object({\n min: z.number().optional(),\n max: z.number().optional(),\n })\n .optional(),\n presetConfig: z.record(z.string(), z.unknown()).optional(),\n defaultSampling: samplingConfigSchema.optional(),\n // Version metadata\n changedFields: z.array(z.string()).optional().describe('Array of field names that changed from the previous version'),\n changeMessage: z.string().optional().describe('Optional message describing the changes'),\n createdAt: z.coerce.date().describe('When this version was created'),\n});\n\nexport const listScorerVersionsResponseSchema = createListVersionsResponseSchema(scorerVersionSchema);\n\nexport const getScorerVersionResponseSchema = scorerVersionSchema;\n\nexport const createScorerVersionResponseSchema = scorerVersionSchema.partial().merge(\n z.object({\n id: z.string(),\n scorerDefinitionId: z.string(),\n versionNumber: z.number(),\n createdAt: z.coerce.date(),\n }),\n);\n\nexport const activateScorerVersionResponseSchema = activateVersionResponseSchema;\n\nexport const restoreScorerVersionResponseSchema = scorerVersionSchema;\n\nexport const deleteScorerVersionResponseSchema = deleteVersionResponseSchema;\n\nexport const compareScorerVersionsResponseSchema = createCompareVersionsResponseSchema(scorerVersionSchema);\n\nexport { versionDiffEntrySchema };\n"],"mappings":";;;;AAcA,MAAa,gCAAgCA,uBAAAA;AAC7C,MAAa,mCAAmCC,uBAAAA;AAChD,MAAa,gCAAgCC,uBAAAA;AAM7C,MAAa,0BAA0BC,OAAAA,EAAE,OAAO,EAC9C,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,oDAAoD,EACpF,CAAC;AAED,MAAa,4BAA4BA,OAAAA,EAAE,OAAO;CAChD,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,oDAAoD;CAClF,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;AAC3E,CAAC;AAMD,MAAM,uBAAuBA,OAAAA,EAAE,MAAM,CACnCA,OAAAA,EAAE,OAAO,EAAE,MAAMA,OAAAA,EAAE,QAAQ,MAAM,EAAE,CAAC,GACpCA,OAAAA,EAAE,OAAO;CAAE,MAAMA,OAAAA,EAAE,QAAQ,OAAO;CAAG,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAAE,CAAC,CACvE,CAAC;AAED,MAAM,iBAAiBA,OAAAA,EAAE,KAAK;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,sBAAsBA,OAAAA,EAAE,OAAO;CAC1C,IAAIA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAClE,oBAAoBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAClF,eAAeA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,0CAA0C;CAE7E,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,oBAAoB;CAC9C,aAAaA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2BAA2B;CACvE,MAAM;CACN,OAAOC,sBAAAA,kBAAkB,SAAS;CAClC,cAAcD,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,YAAYA,OAAAA,EACT,OAAO;EACN,KAAKA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACzB,KAAKA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,CAAC,CAAC,CACD,SAAS;CACZ,cAAcA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACzD,iBAAiB,qBAAqB,SAAS;CAE/C,eAAeA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6DAA6D;CACpH,eAAeA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,yCAAyC;CACvF,WAAWA,OAAAA,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS,+BAA+B;AACrE,CAAC;AAED,MAAa,mCAAmCE,uBAAAA,iCAAiC,mBAAmB;AAEpG,MAAa,iCAAiC;AAE9C,MAAa,oCAAoC,oBAAoB,QAAQ,CAAC,CAAC,MAC7EF,OAAAA,EAAE,OAAO;CACP,IAAIA,OAAAA,EAAE,OAAO;CACb,oBAAoBA,OAAAA,EAAE,OAAO;CAC7B,eAAeA,OAAAA,EAAE,OAAO;CACxB,WAAWA,OAAAA,EAAE,OAAO,KAAK;AAC3B,CAAC,CACH;AAEA,MAAa,sCAAsCG,uBAAAA;AAEnD,MAAa,qCAAqC;AAElD,MAAa,oCAAoCC,uBAAAA;AAEjD,MAAa,sCAAsCC,uBAAAA,oCAAoC,mBAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.cjs","names":[],"sources":["../../../src/server/a2a/store.ts"],"sourcesContent":["import type { Task } from '@mastra/core/a2a';\n\nfunction createAbortError() {\n return new DOMException('The operation was aborted.', 'AbortError');\n}\n\nexport class TaskStoreVersionConflictError extends Error {\n constructor(expectedVersion: number, currentVersion: number) {\n super(`Task version conflict: expected ${expectedVersion}, received ${currentVersion}`);\n this.name = 'TaskStoreVersionConflictError';\n }\n}\n\nexport class InMemoryTaskStore {\n private store: Map<string, Task> = new Map();\n private versions: Map<string, number> = new Map();\n private listeners: Map<string, Set<(update: { task: Task; version: number }) => void>> = new Map();\n private abortControllers: Map<string, AbortController> = new Map();\n public activeCancellations = new Set<string>();\n\n private getKey(agentId: string, taskId: string) {\n return `${agentId}-${taskId}`;\n }\n\n async load({ agentId, taskId }: { agentId: string; taskId: string }): Promise<Task | null> {\n const snapshot = this.loadWithVersion({ agentId, taskId });\n\n if (!snapshot) {\n return null;\n }\n\n return snapshot.task;\n }\n\n loadWithVersion({ agentId, taskId }: { agentId: string; taskId: string }): { task: Task; version: number } | null {\n const key = this.getKey(agentId, taskId);\n const entry = this.store.get(key);\n\n if (!entry) {\n return null;\n }\n\n return {\n task: { ...entry },\n version: this.versions.get(key) ?? 0,\n };\n }\n\n async save({\n agentId,\n data,\n expectedVersion,\n skipIfCanceled = false,\n }: {\n agentId: string;\n data: Task;\n expectedVersion?: number;\n skipIfCanceled?: boolean;\n }): Promise<Task> {\n // Store copies to prevent internal mutation if caller reuses objects\n const key = this.getKey(agentId, data.id);\n if (!data.id) {\n throw new Error('Task ID is required');\n }\n\n const existingTask = this.store.get(key);\n\n if (skipIfCanceled && existingTask?.status.state === 'canceled' && data.status.state !== 'canceled') {\n return { ...existingTask };\n }\n\n const currentVersion = this.versions.get(key) ?? 0;\n if (expectedVersion !== undefined && currentVersion !== expectedVersion) {\n throw new TaskStoreVersionConflictError(expectedVersion, currentVersion);\n }\n\n const storedTask = { ...data };\n const nextVersion = currentVersion + 1;\n\n this.store.set(key, storedTask);\n this.versions.set(key, nextVersion);\n\n const listeners = this.listeners.get(key);\n if (listeners) {\n for (const listener of listeners) {\n listener({ task: { ...storedTask }, version: nextVersion });\n }\n }\n\n return { ...storedTask };\n }\n\n getVersion({ agentId, taskId }: { agentId: string; taskId: string }): number {\n return this.versions.get(this.getKey(agentId, taskId)) ?? 0;\n }\n\n list({ agentId }: { agentId: string }): Task[] {\n const prefix = `${agentId}-`;\n\n return [...this.store.entries()].filter(([key]) => key.startsWith(prefix)).map(([, task]) => ({ ...task }));\n }\n\n registerAbortController({\n agentId,\n taskId,\n controller,\n }: {\n agentId: string;\n taskId: string;\n controller: AbortController;\n }): () => void {\n const key = this.getKey(agentId, taskId);\n this.abortControllers.set(key, controller);\n\n return () => {\n if (this.abortControllers.get(key) === controller) {\n this.abortControllers.delete(key);\n }\n };\n }\n\n abortTask({ agentId, taskId, reason }: { agentId: string; taskId: string; reason?: unknown }): void {\n const controller = this.abortControllers.get(this.getKey(agentId, taskId));\n\n if (controller && !controller.signal.aborted) {\n controller.abort(reason);\n }\n }\n\n async waitForNextUpdate({\n agentId,\n taskId,\n afterVersion,\n signal,\n }: {\n agentId: string;\n taskId: string;\n afterVersion: number;\n signal?: AbortSignal;\n }): Promise<{ task: Task; version: number }> {\n const key = this.getKey(agentId, taskId);\n const snapshot = this.loadWithVersion({ agentId, taskId });\n\n if (snapshot && snapshot.version > afterVersion) {\n return snapshot;\n }\n\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n return new Promise((resolve, reject) => {\n const listeners = this.listeners.get(key) ?? new Set<(update: { task: Task; version: number }) => void>();\n let settled = false;\n\n const cleanup = () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(key);\n }\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n reject(createAbortError());\n };\n\n const listener = (update: { task: Task; version: number }) => {\n if (settled || signal?.aborted) {\n return;\n }\n\n if (update.version <= afterVersion) {\n return;\n }\n\n settled = true;\n cleanup();\n\n resolve({ task: { ...update.task }, version: update.version });\n };\n\n listeners.add(listener);\n this.listeners.set(key, listeners);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.cjs","names":[],"sources":["../../../src/server/a2a/store.ts"],"sourcesContent":["import type { Task } from '@mastra/core/a2a';\n\nfunction createAbortError() {\n return new DOMException('The operation was aborted.', 'AbortError');\n}\n\nexport class TaskStoreVersionConflictError extends Error {\n constructor(expectedVersion: number, currentVersion: number) {\n super(`Task version conflict: expected ${expectedVersion}, received ${currentVersion}`);\n this.name = 'TaskStoreVersionConflictError';\n }\n}\n\nexport class InMemoryTaskStore {\n private store: Map<string, Task> = new Map();\n private versions: Map<string, number> = new Map();\n private listeners: Map<string, Set<(update: { task: Task; version: number }) => void>> = new Map();\n private abortControllers: Map<string, AbortController> = new Map();\n public activeCancellations = new Set<string>();\n\n private getKey(agentId: string, taskId: string) {\n return `${agentId}-${taskId}`;\n }\n\n async load({ agentId, taskId }: { agentId: string; taskId: string }): Promise<Task | null> {\n const snapshot = this.loadWithVersion({ agentId, taskId });\n\n if (!snapshot) {\n return null;\n }\n\n return snapshot.task;\n }\n\n loadWithVersion({ agentId, taskId }: { agentId: string; taskId: string }): { task: Task; version: number } | null {\n const key = this.getKey(agentId, taskId);\n const entry = this.store.get(key);\n\n if (!entry) {\n return null;\n }\n\n return {\n task: { ...entry },\n version: this.versions.get(key) ?? 0,\n };\n }\n\n async save({\n agentId,\n data,\n expectedVersion,\n skipIfCanceled = false,\n }: {\n agentId: string;\n data: Task;\n expectedVersion?: number;\n skipIfCanceled?: boolean;\n }): Promise<Task> {\n // Store copies to prevent internal mutation if caller reuses objects\n const key = this.getKey(agentId, data.id);\n if (!data.id) {\n throw new Error('Task ID is required');\n }\n\n const existingTask = this.store.get(key);\n\n if (skipIfCanceled && existingTask?.status.state === 'canceled' && data.status.state !== 'canceled') {\n return { ...existingTask };\n }\n\n const currentVersion = this.versions.get(key) ?? 0;\n if (expectedVersion !== undefined && currentVersion !== expectedVersion) {\n throw new TaskStoreVersionConflictError(expectedVersion, currentVersion);\n }\n\n const storedTask = { ...data };\n const nextVersion = currentVersion + 1;\n\n this.store.set(key, storedTask);\n this.versions.set(key, nextVersion);\n\n const listeners = this.listeners.get(key);\n if (listeners) {\n for (const listener of listeners) {\n listener({ task: { ...storedTask }, version: nextVersion });\n }\n }\n\n return { ...storedTask };\n }\n\n getVersion({ agentId, taskId }: { agentId: string; taskId: string }): number {\n return this.versions.get(this.getKey(agentId, taskId)) ?? 0;\n }\n\n list({ agentId }: { agentId: string }): Task[] {\n const prefix = `${agentId}-`;\n\n return [...this.store.entries()].filter(([key]) => key.startsWith(prefix)).map(([, task]) => ({ ...task }));\n }\n\n registerAbortController({\n agentId,\n taskId,\n controller,\n }: {\n agentId: string;\n taskId: string;\n controller: AbortController;\n }): () => void {\n const key = this.getKey(agentId, taskId);\n this.abortControllers.set(key, controller);\n\n return () => {\n if (this.abortControllers.get(key) === controller) {\n this.abortControllers.delete(key);\n }\n };\n }\n\n abortTask({ agentId, taskId, reason }: { agentId: string; taskId: string; reason?: unknown }): void {\n const controller = this.abortControllers.get(this.getKey(agentId, taskId));\n\n if (controller && !controller.signal.aborted) {\n controller.abort(reason);\n }\n }\n\n async waitForNextUpdate({\n agentId,\n taskId,\n afterVersion,\n signal,\n }: {\n agentId: string;\n taskId: string;\n afterVersion: number;\n signal?: AbortSignal;\n }): Promise<{ task: Task; version: number }> {\n const key = this.getKey(agentId, taskId);\n const snapshot = this.loadWithVersion({ agentId, taskId });\n\n if (snapshot && snapshot.version > afterVersion) {\n return snapshot;\n }\n\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n return new Promise((resolve, reject) => {\n const listeners = this.listeners.get(key) ?? new Set<(update: { task: Task; version: number }) => void>();\n let settled = false;\n\n const cleanup = () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(key);\n }\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n reject(createAbortError());\n };\n\n const listener = (update: { task: Task; version: number }) => {\n if (settled || signal?.aborted) {\n return;\n }\n\n if (update.version <= afterVersion) {\n return;\n }\n\n settled = true;\n cleanup();\n\n resolve({ task: { ...update.task }, version: update.version });\n };\n\n listeners.add(listener);\n this.listeners.set(key, listeners);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n}\n"],"mappings":";;;AAEA,SAAS,mBAAmB;CAC1B,OAAO,IAAI,aAAa,8BAA8B,YAAY;AACpE;AAEA,IAAa,gCAAb,cAAmD,MAAM;CACvD,YAAY,iBAAyB,gBAAwB;EAC3D,MAAM,mCAAmC,gBAAgB,aAAa,gBAAgB;EACtF,KAAK,OAAO;CACd;AACF;AAEA,IAAa,oBAAb,MAA+B;CAC7B,wBAAmC,IAAI,IAAI;CAC3C,2BAAwC,IAAI,IAAI;CAChD,4BAAyF,IAAI,IAAI;CACjG,mCAAyD,IAAI,IAAI;CACjE,sCAA6B,IAAI,IAAY;CAE7C,OAAe,SAAiB,QAAgB;EAC9C,OAAO,GAAG,QAAQ,GAAG;CACvB;CAEA,MAAM,KAAK,EAAE,SAAS,UAAqE;EACzF,MAAM,WAAW,KAAK,gBAAgB;GAAE;GAAS;EAAO,CAAC;EAEzD,IAAI,CAAC,UACH,OAAO;EAGT,OAAO,SAAS;CAClB;CAEA,gBAAgB,EAAE,SAAS,UAAuF;EAChH,MAAM,MAAM,KAAK,OAAO,SAAS,MAAM;EACvC,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;EAEhC,IAAI,CAAC,OACH,OAAO;EAGT,OAAO;GACL,MAAM,EAAE,GAAG,MAAM;GACjB,SAAS,KAAK,SAAS,IAAI,GAAG,KAAK;EACrC;CACF;CAEA,MAAM,KAAK,EACT,SACA,MACA,iBACA,iBAAiB,SAMD;EAEhB,MAAM,MAAM,KAAK,OAAO,SAAS,KAAK,EAAE;EACxC,IAAI,CAAC,KAAK,IACR,MAAM,IAAI,MAAM,qBAAqB;EAGvC,MAAM,eAAe,KAAK,MAAM,IAAI,GAAG;EAEvC,IAAI,kBAAkB,cAAc,OAAO,UAAU,cAAc,KAAK,OAAO,UAAU,YACvF,OAAO,EAAE,GAAG,aAAa;EAG3B,MAAM,iBAAiB,KAAK,SAAS,IAAI,GAAG,KAAK;EACjD,IAAI,oBAAoB,KAAA,KAAa,mBAAmB,iBACtD,MAAM,IAAI,8BAA8B,iBAAiB,cAAc;EAGzE,MAAM,aAAa,EAAE,GAAG,KAAK;EAC7B,MAAM,cAAc,iBAAiB;EAErC,KAAK,MAAM,IAAI,KAAK,UAAU;EAC9B,KAAK,SAAS,IAAI,KAAK,WAAW;EAElC,MAAM,YAAY,KAAK,UAAU,IAAI,GAAG;EACxC,IAAI,WACF,KAAK,MAAM,YAAY,WACrB,SAAS;GAAE,MAAM,EAAE,GAAG,WAAW;GAAG,SAAS;EAAY,CAAC;EAI9D,OAAO,EAAE,GAAG,WAAW;CACzB;CAEA,WAAW,EAAE,SAAS,UAAuD;EAC3E,OAAO,KAAK,SAAS,IAAI,KAAK,OAAO,SAAS,MAAM,CAAC,KAAK;CAC5D;CAEA,KAAK,EAAE,WAAwC;EAC7C,MAAM,SAAS,GAAG,QAAQ;EAE1B,OAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE;CAC5G;CAEA,wBAAwB,EACtB,SACA,QACA,cAKa;EACb,MAAM,MAAM,KAAK,OAAO,SAAS,MAAM;EACvC,KAAK,iBAAiB,IAAI,KAAK,UAAU;EAEzC,aAAa;GACX,IAAI,KAAK,iBAAiB,IAAI,GAAG,MAAM,YACrC,KAAK,iBAAiB,OAAO,GAAG;EAEpC;CACF;CAEA,UAAU,EAAE,SAAS,QAAQ,UAAuE;EAClG,MAAM,aAAa,KAAK,iBAAiB,IAAI,KAAK,OAAO,SAAS,MAAM,CAAC;EAEzE,IAAI,cAAc,CAAC,WAAW,OAAO,SACnC,WAAW,MAAM,MAAM;CAE3B;CAEA,MAAM,kBAAkB,EACtB,SACA,QACA,cACA,UAM2C;EAC3C,MAAM,MAAM,KAAK,OAAO,SAAS,MAAM;EACvC,MAAM,WAAW,KAAK,gBAAgB;GAAE;GAAS;EAAO,CAAC;EAEzD,IAAI,YAAY,SAAS,UAAU,cACjC,OAAO;EAGT,IAAI,QAAQ,SACV,OAAO,QAAQ,OAAO,iBAAiB,CAAC;EAG1C,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,YAAY,KAAK,UAAU,IAAI,GAAG,qBAAK,IAAI,IAAuD;GACxG,IAAI,UAAU;GAEd,MAAM,gBAAgB;IACpB,UAAU,OAAO,QAAQ;IACzB,IAAI,UAAU,SAAS,GACrB,KAAK,UAAU,OAAO,GAAG;IAE3B,QAAQ,oBAAoB,SAAS,OAAO;GAC9C;GAEA,MAAM,gBAAgB;IACpB,IAAI,SACF;IAGF,UAAU;IACV,QAAQ;IACR,OAAO,iBAAiB,CAAC;GAC3B;GAEA,MAAM,YAAY,WAA4C;IAC5D,IAAI,WAAW,QAAQ,SACrB;IAGF,IAAI,OAAO,WAAW,cACpB;IAGF,UAAU;IACV,QAAQ;IAER,QAAQ;KAAE,MAAM,EAAE,GAAG,OAAO,KAAK;KAAG,SAAS,OAAO;IAAQ,CAAC;GAC/D;GAEA,UAAU,IAAI,QAAQ;GACtB,KAAK,UAAU,IAAI,KAAK,SAAS;GACjC,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EAC3D,CAAC;CACH;AACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
3
|
-
const
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_constants = require("../../constants-4IJp_uzj.cjs");
|
|
4
|
+
const require_helpers = require("../../helpers-BWxRRShz.cjs");
|
|
4
5
|
exports.MASTRA_USER_KEY = require_constants.MASTRA_USER_KEY;
|
|
5
6
|
exports.MASTRA_USER_PERMISSIONS_KEY = require_constants.MASTRA_USER_PERMISSIONS_KEY;
|
|
6
7
|
exports.MASTRA_USER_ROLES_KEY = require_constants.MASTRA_USER_ROLES_KEY;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as getAuthenticatedUser, c as isProtectedCustomRoute, d as pathMatchesPattern, f as pathMatchesRule, i as findMatchingCustomRoute, l as isProtectedPath, m as defaultAuthConfig, n as checkRules, o as isCustomRoutePublic, p as supportsSessionRefresh, r as coreAuthMiddleware, s as isDevPlaygroundRequest, t as canAccessPublicly, u as matchesOrIncludes } from "../../helpers-
|
|
1
|
+
import { d as MASTRA_USER_ROLES_KEY, l as MASTRA_USER_KEY, u as MASTRA_USER_PERMISSIONS_KEY } from "../../constants-0jFCWoex.js";
|
|
2
|
+
import { a as getAuthenticatedUser, c as isProtectedCustomRoute, d as pathMatchesPattern, f as pathMatchesRule, i as findMatchingCustomRoute, l as isProtectedPath, m as defaultAuthConfig, n as checkRules, o as isCustomRoutePublic, p as supportsSessionRefresh, r as coreAuthMiddleware, s as isDevPlaygroundRequest, t as canAccessPublicly, u as matchesOrIncludes } from "../../helpers-DBAYsA50.js";
|
|
3
3
|
export { MASTRA_USER_KEY, MASTRA_USER_PERMISSIONS_KEY, MASTRA_USER_ROLES_KEY, canAccessPublicly, checkRules, coreAuthMiddleware, defaultAuthConfig, findMatchingCustomRoute, getAuthenticatedUser, isCustomRoutePublic, isDevPlaygroundRequest, isProtectedCustomRoute, isProtectedPath, matchesOrIncludes, pathMatchesPattern, pathMatchesRule, supportsSessionRefresh };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
2
3
|
//#region src/server/browser-stream/viewer-registry.ts
|
|
3
4
|
/**
|
|
4
5
|
* ViewerRegistry manages WebSocket connections per agent and controls screencast lifecycle.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/server/browser-stream/viewer-registry.ts","../../../src/server/browser-stream/input-handler.ts"],"sourcesContent":["import type { MastraBrowser } from '@mastra/core/browser';\nimport type {\n StatusMessage,\n BrowserStreamConfig,\n ViewportMessage,\n BrowserStreamWebSocket,\n ViewerRegistryLike,\n} from './types.js';\n\n/** Minimal screencast stream interface matching BrowserToolsetLike.startScreencast return type */\ninterface ScreencastStreamLike {\n on(event: 'frame', handler: (frame: { data: string; viewport: { width: number; height: number } }) => void): void;\n on(event: 'stop', handler: (reason: string) => void): void;\n on(event: 'error', handler: (error: Error) => void): void;\n on(event: 'url', handler: (url: string) => void): void;\n stop(): Promise<void>;\n}\n\n/**\n * ViewerRegistry manages WebSocket connections per agent and controls screencast lifecycle.\n *\n * Key responsibilities:\n * - Track connected viewers per agentId\n * - Start screencast when browser becomes active (not on viewer connect)\n * - Stop screencast when last viewer disconnects\n * - Broadcast frames to all viewers for an agent\n *\n * The browser is NOT launched when viewers connect - it only starts streaming\n * when the browser is already running from agent tool usage.\n *\n * @example\n * ```typescript\n * const registry = new ViewerRegistry();\n *\n * // When a viewer connects\n * registry.addViewer('agent-123', ws, getToolset);\n *\n * // When a viewer disconnects\n * registry.removeViewer('agent-123', ws);\n * ```\n */\nexport class ViewerRegistry implements ViewerRegistryLike {\n /** Map of agentId to set of connected WebSocket contexts */\n private viewers = new Map<string, Set<BrowserStreamWebSocket>>();\n\n /** Map of agentId to active screencast stream */\n private screencasts = new Map<string, ScreencastStreamLike>();\n\n /** Set of viewerKeys currently starting a screencast (to prevent race conditions) */\n private startingScreencasts = new Set<string>();\n\n /** Map of agentId to cleanup function for onBrowserReady callback */\n private browserReadyCleanups = new Map<string, () => void>();\n\n /** Map of agentId to cleanup function for onBrowserClosed callback */\n private browserClosedCleanups = new Map<string, () => void>();\n\n /** Map of agentId to last known URL (for dedup) */\n private lastUrls = new Map<string, string>();\n\n /** Map of agentId to last known viewport dimensions (for change detection) */\n private lastViewports = new Map<string, { width: number; height: number }>();\n\n /** Map of viewerKey to last broadcast status (for replay to new viewers) */\n private lastStatuses = new Map<string, string>();\n\n /**\n * Add a viewer for an agent. Starts screencast if this is the first viewer.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param ws - The WebSocket context for this viewer\n * @param getToolset - Function to retrieve the BrowserToolset for this agent\n * @param agentId - The actual agent ID for toolset lookup (optional, defaults to viewerKey)\n * @param threadId - The thread ID for thread-scoped screencasts (optional)\n */\n async addViewer(\n viewerKey: string,\n ws: BrowserStreamWebSocket,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId?: string,\n threadId?: string,\n ): Promise<void> {\n // Get or create the viewer set for this viewer key\n let viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n viewerSet = new Set();\n this.viewers.set(viewerKey, viewerSet);\n }\n\n const wasEmpty = viewerSet.size === 0;\n viewerSet.add(ws);\n\n // Start screencast if this is the first viewer\n // Use agentId for toolset lookup, viewerKey for registry keying\n if (wasEmpty) {\n await this.startScreencast(viewerKey, getToolset, agentId ?? viewerKey, threadId);\n } else {\n // Send current state to new viewer (screencast already running)\n this.sendCurrentState(viewerKey, ws);\n }\n }\n\n /**\n * Send current state (URL, viewport) to a newly connected viewer.\n */\n private sendCurrentState(viewerKey: string, ws: BrowserStreamWebSocket): void {\n try {\n // Send last known URL\n const lastUrl = this.lastUrls.get(viewerKey);\n if (lastUrl) {\n ws.send(JSON.stringify({ url: lastUrl }));\n }\n\n // Send last known viewport\n const lastViewport = this.lastViewports.get(viewerKey);\n if (lastViewport) {\n ws.send(JSON.stringify({ viewport: lastViewport }));\n }\n\n // Send actual current status (not always 'streaming')\n const lastStatus = this.lastStatuses.get(viewerKey);\n if (lastStatus) {\n ws.send(JSON.stringify({ status: lastStatus }));\n }\n } catch (error) {\n console.warn('[ViewerRegistry] Error sending current state to new viewer:', error);\n }\n }\n\n /**\n * Remove a viewer. Stops screencast if this was the last viewer.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param ws - The WebSocket context to remove\n */\n async removeViewer(viewerKey: string, ws: BrowserStreamWebSocket): Promise<void> {\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n viewerSet.delete(ws);\n\n // Clean up if no more viewers\n if (viewerSet.size === 0) {\n this.viewers.delete(viewerKey);\n this.lastUrls.delete(viewerKey);\n this.lastViewports.delete(viewerKey);\n\n // Clean up browser callbacks if pending\n const readyCleanup = this.browserReadyCleanups.get(viewerKey);\n if (readyCleanup) {\n readyCleanup();\n this.browserReadyCleanups.delete(viewerKey);\n }\n const closedCleanup = this.browserClosedCleanups.get(viewerKey);\n if (closedCleanup) {\n closedCleanup();\n this.browserClosedCleanups.delete(viewerKey);\n }\n\n await this.stopScreencast(viewerKey);\n }\n }\n\n /**\n * Broadcast a binary frame to all viewers.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param data - The binary frame data (base64 encoded)\n */\n broadcastFrame(viewerKey: string, data: string): void {\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n // Send as binary (base64 string)\n for (const ws of viewerSet) {\n try {\n ws.send(data);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting frame:', error);\n }\n }\n }\n\n /**\n * Broadcast a status message to all viewers.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param status - The status message to send\n */\n broadcastStatus(viewerKey: string, status: StatusMessage): void {\n // Track last status for replay to new viewers\n if (status.status) {\n this.lastStatuses.set(viewerKey, status.status);\n }\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n const message = JSON.stringify(status);\n for (const ws of viewerSet) {\n try {\n ws.send(message);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting status:', error);\n }\n }\n }\n\n /**\n * Broadcast a URL update to all viewers (only if changed).\n */\n private broadcastUrlIfChanged(viewerKey: string, url: string | null): void {\n if (!url) return;\n if (this.lastUrls.get(viewerKey) === url) return;\n\n this.lastUrls.set(viewerKey, url);\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) return;\n\n const message = JSON.stringify({ url });\n for (const ws of viewerSet) {\n try {\n ws.send(message);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting URL:', error);\n }\n }\n }\n\n /**\n * Broadcast viewport metadata to all viewers.\n * Only sends if dimensions have changed from last broadcast.\n * Called on stream start and on each frame to detect dimension changes.\n */\n private broadcastViewportIfChanged(viewerKey: string, viewport: { width: number; height: number }): void {\n const last = this.lastViewports.get(viewerKey);\n if (last && last.width === viewport.width && last.height === viewport.height) {\n return;\n }\n\n this.lastViewports.set(viewerKey, { width: viewport.width, height: viewport.height });\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) return;\n\n const message: ViewportMessage = { viewport: { width: viewport.width, height: viewport.height } };\n const json = JSON.stringify(message);\n for (const ws of viewerSet) {\n try {\n ws.send(json);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting viewport:', error);\n }\n }\n }\n\n /**\n * Start screencast for a viewer. Only starts if browser is already running.\n * If browser not running, registers a callback to start when browser becomes ready.\n *\n * @param viewerKey - The viewer key (for registry keying)\n * @param getToolset - Function to retrieve the BrowserToolset\n * @param agentId - The actual agent ID for toolset lookup\n * @param threadId - The thread ID for thread-scoped page selection (optional)\n */\n private async startScreencast(\n viewerKey: string,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId: string,\n threadId?: string,\n ): Promise<void> {\n const toolset = await getToolset(agentId);\n // Viewer may have disconnected while awaiting async toolset lookup.\n // Bail out so we don't register callbacks or start a screencast for a stale viewer.\n if (!this.viewers.has(viewerKey)) {\n return;\n }\n if (!toolset) {\n // No browser available for this agent - just keep connection open.\n // The screencast will start when the agent hydrates and the browser launches\n // (via the generation flow calling getAgentFromSystem → createAgentFromStoredConfig).\n console.info(`[ViewerRegistry] No toolset for ${viewerKey}, waiting...`);\n return;\n }\n\n // Register callback for browser restarts (external close + re-launch)\n // This ensures screencast reconnects after browser is externally closed\n // Pass threadId so callback only fires when that specific thread's browser is ready\n if (!this.browserReadyCleanups.has(viewerKey)) {\n const cleanup = toolset.onBrowserReady(() => {\n // Only start if we still have viewers\n if (!this.viewers.has(viewerKey)) {\n return;\n }\n\n // Stop any existing (likely dead) screencast before starting new one\n const existingStream = this.screencasts.get(viewerKey);\n if (existingStream) {\n console.info(`[ViewerRegistry] Stopping old screencast for ${viewerKey} before reconnecting...`);\n this.screencasts.delete(viewerKey);\n // Stop async, don't wait - the old CDP session is probably dead anyway\n existingStream.stop().catch(() => {});\n }\n\n console.info(`[ViewerRegistry] Browser ready for ${viewerKey}, starting screencast...`);\n this.doStartScreencast(viewerKey, toolset, threadId).catch(error => {\n console.error(`[ViewerRegistry] Failed to start screencast on browser ready for ${viewerKey}:`, error);\n });\n }, threadId);\n this.browserReadyCleanups.set(viewerKey, cleanup);\n }\n\n // Register callback for browser closed (external close detection)\n // This ensures UI shows \"browser closed\" overlay immediately\n // Pass threadId so callback only fires when that specific thread's browser closes\n if (!this.browserClosedCleanups.has(viewerKey)) {\n const cleanup = toolset.onBrowserClosed(() => {\n console.info(`[ViewerRegistry] Browser closed for ${viewerKey}, notifying viewers...`);\n // Clean up screencast reference (CDP session is dead)\n this.screencasts.delete(viewerKey);\n // Broadcast browser_closed status to UI\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }, threadId);\n this.browserClosedCleanups.set(viewerKey, cleanup);\n }\n\n // Check if browser is already running\n if (toolset.isBrowserRunning()) {\n // Browser is running, start screencast immediately\n await this.doStartScreencast(viewerKey, toolset, threadId);\n } else {\n // Browser not running - callback will fire when it becomes ready\n console.info(`[ViewerRegistry] Browser not running for ${viewerKey}, waiting for browser to start...`);\n }\n }\n\n /**\n * Internal method to actually start the screencast stream.\n *\n * @param viewerKey - The viewer key (for registry keying and logging)\n * @param toolset - The browser toolset\n * @param threadId - The thread ID for thread-scoped page selection (optional)\n */\n private async doStartScreencast(viewerKey: string, toolset: MastraBrowser, threadId?: string): Promise<void> {\n // Skip if already streaming or currently starting (prevents race conditions)\n if (this.screencasts.has(viewerKey) || this.startingScreencasts.has(viewerKey)) {\n return;\n }\n\n // Mark as starting to prevent concurrent starts\n this.startingScreencasts.add(viewerKey);\n\n try {\n this.broadcastStatus(viewerKey, { status: 'browser_starting' });\n\n // Use startScreencastIfBrowserActive to avoid launching browser\n // Pass threadId for thread-scoped page selection\n const stream = await toolset.startScreencastIfBrowserActive(threadId ? { threadId } : undefined);\n if (!stream) {\n console.warn(`[ViewerRegistry] No browser session for ${viewerKey}`);\n // Tell the UI this thread has no browser session yet\n // Using 'browser_closed' to indicate no active browser for this thread\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n return;\n }\n\n this.screencasts.set(viewerKey, stream);\n\n // Capture reference to guard against stale callbacks from superseded streams\n const currentStream = stream;\n\n // Wire up frame events + viewport tracking\n stream.on('frame', frame => {\n // Ignore frames from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n this.broadcastFrame(viewerKey, frame.data);\n this.broadcastViewportIfChanged(viewerKey, frame.viewport);\n });\n\n // Wire up URL change events (emitted by browser providers on navigation)\n stream.on('url', (url: string) => {\n // Ignore URL updates from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n this.broadcastUrlIfChanged(viewerKey, url);\n });\n\n // Wire up stop events\n stream.on('stop', reason => {\n // Ignore stop events from superseded streams (e.g., old stream stopping after reconnect)\n if (this.screencasts.get(viewerKey) !== currentStream) {\n console.info(`[ViewerRegistry] Ignoring stop from superseded stream for ${viewerKey}`);\n return;\n }\n console.info(`[ViewerRegistry] Screencast stopped for ${viewerKey}: ${reason}`);\n this.screencasts.delete(viewerKey);\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n });\n\n // Wire up error events - treat errors as browser closed since screencast can't continue\n stream.on('error', error => {\n // Ignore errors from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n console.error(`[ViewerRegistry] Screencast error for ${viewerKey}:`, error);\n this.screencasts.delete(viewerKey);\n // Explicitly stop the stream to clean up CDP resources\n currentStream.stop().catch(stopError => {\n console.warn(`[ViewerRegistry] Error stopping errored screencast for ${viewerKey}:`, stopError);\n });\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n });\n\n this.broadcastStatus(viewerKey, { status: 'streaming' });\n\n // Send initial URL - pass threadId to get URL from correct browser session\n const initialUrl = await toolset.getCurrentUrl(threadId);\n this.broadcastUrlIfChanged(viewerKey, initialUrl);\n } catch (error) {\n console.error(`[ViewerRegistry] Failed to start screencast for ${viewerKey}:`, error);\n // Connection stays open - user can see error status\n } finally {\n // Clear starting flag\n this.startingScreencasts.delete(viewerKey);\n }\n }\n\n /**\n * Stop screencast for an agent. Called when last viewer disconnects.\n */\n private async stopScreencast(agentId: string): Promise<void> {\n const stream = this.screencasts.get(agentId);\n if (!stream) {\n return;\n }\n\n try {\n await stream.stop();\n } catch (error) {\n console.warn(`[ViewerRegistry] Error stopping screencast for ${agentId}:`, error);\n } finally {\n this.screencasts.delete(agentId);\n }\n }\n\n /**\n * Get the number of viewers for an agent.\n *\n * @param agentId - The agent ID\n * @returns The number of connected viewers\n */\n getViewerCount(agentId: string): number {\n return this.viewers.get(agentId)?.size ?? 0;\n }\n\n /**\n * Check if an agent has an active screencast.\n *\n * @param agentId - The agent ID\n * @returns True if screencast is active\n */\n hasActiveScreencast(agentId: string): boolean {\n return this.screencasts.has(agentId);\n }\n\n /**\n * Close the browser session for an agent.\n * Stops screencast and broadcasts browser_closed status.\n * Call this before calling toolset.close() to ensure UI is notified.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n */\n async closeBrowserSession(viewerKey: string): Promise<void> {\n // NOTE: Do NOT clean up the onBrowserReady callback here.\n // Viewers are still connected (WebSocket stays open), so we need\n // the callback to fire when the browser relaunches from a subsequent\n // tool call. Callback cleanup only happens in removeViewer() when\n // the last viewer disconnects.\n\n // Clear URL, viewport, and status tracking so next session sends fresh data\n this.lastUrls.delete(viewerKey);\n this.lastViewports.delete(viewerKey);\n this.lastStatuses.delete(viewerKey);\n\n // Stop screencast if active\n const stream = this.screencasts.get(viewerKey);\n if (stream) {\n try {\n await stream.stop();\n // Note: stream.stop() emits 'stop' event which triggers broadcastStatus\n } catch (error) {\n console.warn(`[ViewerRegistry] Error stopping screencast for ${viewerKey}:`, error);\n // Still broadcast browser_closed even if stop fails\n this.screencasts.delete(viewerKey);\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }\n } else {\n // No active screencast, but still broadcast browser_closed\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }\n }\n}\n","import type { MastraBrowser } from '@mastra/core/browser';\nimport type { BrowserStreamConfig, ClientInputMessage, MouseInputMessage, KeyboardInputMessage } from './types.js';\n\n// Valid CDP mouse event types\nconst VALID_MOUSE_EVENTS = new Set(['mousePressed', 'mouseReleased', 'mouseMoved', 'mouseWheel']);\n\n// Valid CDP keyboard event types\nconst VALID_KEYBOARD_EVENTS = new Set(['keyDown', 'keyUp', 'char']);\n\n// Input dispatch queue per agent+thread to serialize input events\nconst inputQueues = new Map<string, Promise<void>>();\n\n/**\n * Serialize input dispatch to maintain event ordering.\n * Input events must be processed in order to avoid race conditions.\n */\nfunction enqueueInput(key: string, fn: () => Promise<void>): void {\n const current = inputQueues.get(key) ?? Promise.resolve();\n const next = current.then(fn).catch(() => {\n // Errors are handled inside fn, just ensure chain continues\n });\n inputQueues.set(key, next);\n}\n\n/**\n * Map of key names to Windows virtual key codes.\n * Required for non-printable keys (Enter, Tab, Arrow keys, etc.)\n * See: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\nconst VIRTUAL_KEY_CODES: Record<string, number> = {\n // Control keys\n Backspace: 8,\n Tab: 9,\n Enter: 13,\n Shift: 16,\n Control: 17,\n Alt: 18,\n Pause: 19,\n CapsLock: 20,\n Escape: 27,\n Space: 32,\n ' ': 32,\n PageUp: 33,\n PageDown: 34,\n End: 35,\n Home: 36,\n // Arrow keys\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n // Editing keys\n Insert: 45,\n Delete: 46,\n // Function keys\n F1: 112,\n F2: 113,\n F3: 114,\n F4: 115,\n F5: 116,\n F6: 117,\n F7: 118,\n F8: 119,\n F9: 120,\n F10: 121,\n F11: 122,\n F12: 123,\n};\n\n/**\n * Get the Windows virtual key code for a key.\n * For printable characters, uses the character code.\n * For special keys, looks up in the mapping.\n */\nfunction getVirtualKeyCode(key: string | undefined): number | undefined {\n if (!key) return undefined;\n\n // Check special keys first\n if (VIRTUAL_KEY_CODES[key] !== undefined) {\n return VIRTUAL_KEY_CODES[key];\n }\n\n // For single printable characters, use the uppercase char code\n if (key.length === 1) {\n return key.toUpperCase().charCodeAt(0);\n }\n\n return undefined;\n}\n\n/**\n * Handle an incoming WebSocket message by parsing, validating,\n * and routing to the appropriate toolset injection method.\n *\n * Fire-and-forget: no acknowledgment sent back to client.\n * Silently ignores malformed or unrecognized messages.\n *\n * @param data - Raw string data from WebSocket message\n * @param getToolset - Function to retrieve MastraBrowser for an agent\n * @param agentId - The agent ID this WebSocket connection is for\n * @param threadId - The thread ID for thread-scoped operations (optional)\n */\nexport async function handleInputMessage(\n data: string,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId: string,\n threadId?: string,\n): Promise<void> {\n let message: unknown;\n try {\n message = JSON.parse(data);\n } catch {\n return;\n }\n\n if (!isValidInputMessage(message)) {\n return;\n }\n\n const toolset = await getToolset(agentId);\n if (!toolset) {\n return;\n }\n\n // Serialize input dispatch per agent+thread to maintain event ordering\n const queueKey = `${agentId}:${threadId ?? 'default'}`;\n\n switch (message.type) {\n case 'mouse':\n enqueueInput(queueKey, async () => {\n try {\n await injectMouse(toolset, message, threadId);\n } catch (err) {\n if (isDisconnectionError(err)) {\n notifyBrowserClosed(toolset, threadId);\n } else if (!isExpectedInjectionError(err)) {\n console.warn('[InputHandler] Mouse injection error:', err);\n }\n }\n });\n break;\n case 'keyboard':\n enqueueInput(queueKey, async () => {\n try {\n await injectKeyboard(toolset, message, threadId);\n } catch (err) {\n if (isDisconnectionError(err)) {\n notifyBrowserClosed(toolset, threadId);\n } else if (!isExpectedInjectionError(err)) {\n console.warn('[InputHandler] Keyboard injection error:', err);\n }\n }\n });\n break;\n }\n}\n\n// --- Error handling ---\n\n/**\n * Check if an error indicates browser disconnection (target closed).\n * These errors mean the browser was externally closed.\n */\nfunction isDisconnectionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n // Note: 'no cdp session' is handled by isExpectedInjectionError (startup race)\n // and should not trigger browser closed state\n return (\n msg.includes('target closed') ||\n msg.includes('browser has been closed') ||\n msg.includes('page has been closed') ||\n msg.includes('session closed') ||\n msg.includes('browser has disconnected')\n );\n}\n\n/**\n * Check if an injection error is expected (browser not ready yet).\n * These are silently ignored to avoid log spam.\n */\nfunction isExpectedInjectionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('no cdp session') ||\n msg.includes('browser not launched') ||\n msg.includes('not connected to browser') ||\n msg.includes('no active target') ||\n (msg.includes('target') && msg.includes('not attached'))\n );\n}\n\n/**\n * Notify the browser that it was closed externally.\n * This triggers the onBrowserClosed callbacks to update the UI.\n * If threadId is provided and the browser supports thread-specific closing,\n * only that thread's session is closed.\n */\nfunction notifyBrowserClosed(toolset: MastraBrowser, threadId?: string): void {\n const browser = toolset as unknown as {\n closeThreadSession?: (threadId: string) => Promise<void>;\n handleBrowserDisconnected?: () => void;\n };\n\n // For thread-scoped browsers, close only the specific thread's session\n if (threadId && typeof browser.closeThreadSession === 'function') {\n void browser.closeThreadSession(threadId).catch(() => {\n // Fall back to global disconnect if thread-specific close fails\n browser.handleBrowserDisconnected?.();\n });\n return;\n }\n\n // Fall back to global disconnect handling\n browser.handleBrowserDisconnected?.();\n}\n\n// --- Input injection ---\n\n/**\n * Inject a mouse event into the browser.\n */\nasync function injectMouse(toolset: MastraBrowser, msg: MouseInputMessage, threadId?: string): Promise<void> {\n await toolset.injectMouseEvent(\n {\n type: msg.eventType,\n x: msg.x,\n y: msg.y,\n button: msg.button,\n clickCount: msg.clickCount,\n deltaX: msg.deltaX,\n deltaY: msg.deltaY,\n modifiers: msg.modifiers,\n },\n threadId,\n );\n}\n\n/**\n * Inject a keyboard event into the browser.\n */\nasync function injectKeyboard(toolset: MastraBrowser, msg: KeyboardInputMessage, threadId?: string): Promise<void> {\n const windowsVirtualKeyCode = getVirtualKeyCode(msg.key);\n\n await toolset.injectKeyboardEvent(\n {\n type: msg.eventType,\n key: msg.key,\n code: msg.code,\n text: msg.text,\n modifiers: msg.modifiers,\n windowsVirtualKeyCode,\n },\n threadId,\n );\n}\n\n// --- Validation ---\n\n/**\n * Type guard to validate incoming messages.\n * Validates structure and rejects invalid event types at the boundary.\n */\nfunction isValidInputMessage(msg: unknown): msg is ClientInputMessage {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const typed = msg as Record<string, unknown>;\n\n if (typed.type === 'mouse') {\n // Validate mouse message structure\n if (typeof typed.eventType !== 'string' || !VALID_MOUSE_EVENTS.has(typed.eventType)) {\n return false;\n }\n if (typeof typed.x !== 'number' || typeof typed.y !== 'number') {\n return false;\n }\n // Optional fields validation\n if (typed.button !== undefined && typeof typed.button !== 'string') {\n return false;\n }\n if (typed.deltaX !== undefined && typeof typed.deltaX !== 'number') {\n return false;\n }\n if (typed.deltaY !== undefined && typeof typed.deltaY !== 'number') {\n return false;\n }\n return true;\n }\n\n if (typed.type === 'keyboard') {\n // Validate keyboard message structure\n if (typeof typed.eventType !== 'string' || !VALID_KEYBOARD_EVENTS.has(typed.eventType)) {\n return false;\n }\n // At least one of key, code, or text should be present for meaningful input\n const hasKey = typeof typed.key === 'string';\n const hasCode = typeof typed.code === 'string';\n const hasText = typeof typed.text === 'string';\n if (!hasKey && !hasCode && !hasText) {\n return false;\n }\n // Optional modifiers validation\n if (typed.modifiers !== undefined && typeof typed.modifiers !== 'number') {\n return false;\n }\n return true;\n }\n\n return false;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/server/browser-stream/viewer-registry.ts","../../../src/server/browser-stream/input-handler.ts"],"sourcesContent":["import type { MastraBrowser } from '@mastra/core/browser';\nimport type {\n StatusMessage,\n BrowserStreamConfig,\n ViewportMessage,\n BrowserStreamWebSocket,\n ViewerRegistryLike,\n} from './types.js';\n\n/** Minimal screencast stream interface matching BrowserToolsetLike.startScreencast return type */\ninterface ScreencastStreamLike {\n on(event: 'frame', handler: (frame: { data: string; viewport: { width: number; height: number } }) => void): void;\n on(event: 'stop', handler: (reason: string) => void): void;\n on(event: 'error', handler: (error: Error) => void): void;\n on(event: 'url', handler: (url: string) => void): void;\n stop(): Promise<void>;\n}\n\n/**\n * ViewerRegistry manages WebSocket connections per agent and controls screencast lifecycle.\n *\n * Key responsibilities:\n * - Track connected viewers per agentId\n * - Start screencast when browser becomes active (not on viewer connect)\n * - Stop screencast when last viewer disconnects\n * - Broadcast frames to all viewers for an agent\n *\n * The browser is NOT launched when viewers connect - it only starts streaming\n * when the browser is already running from agent tool usage.\n *\n * @example\n * ```typescript\n * const registry = new ViewerRegistry();\n *\n * // When a viewer connects\n * registry.addViewer('agent-123', ws, getToolset);\n *\n * // When a viewer disconnects\n * registry.removeViewer('agent-123', ws);\n * ```\n */\nexport class ViewerRegistry implements ViewerRegistryLike {\n /** Map of agentId to set of connected WebSocket contexts */\n private viewers = new Map<string, Set<BrowserStreamWebSocket>>();\n\n /** Map of agentId to active screencast stream */\n private screencasts = new Map<string, ScreencastStreamLike>();\n\n /** Set of viewerKeys currently starting a screencast (to prevent race conditions) */\n private startingScreencasts = new Set<string>();\n\n /** Map of agentId to cleanup function for onBrowserReady callback */\n private browserReadyCleanups = new Map<string, () => void>();\n\n /** Map of agentId to cleanup function for onBrowserClosed callback */\n private browserClosedCleanups = new Map<string, () => void>();\n\n /** Map of agentId to last known URL (for dedup) */\n private lastUrls = new Map<string, string>();\n\n /** Map of agentId to last known viewport dimensions (for change detection) */\n private lastViewports = new Map<string, { width: number; height: number }>();\n\n /** Map of viewerKey to last broadcast status (for replay to new viewers) */\n private lastStatuses = new Map<string, string>();\n\n /**\n * Add a viewer for an agent. Starts screencast if this is the first viewer.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param ws - The WebSocket context for this viewer\n * @param getToolset - Function to retrieve the BrowserToolset for this agent\n * @param agentId - The actual agent ID for toolset lookup (optional, defaults to viewerKey)\n * @param threadId - The thread ID for thread-scoped screencasts (optional)\n */\n async addViewer(\n viewerKey: string,\n ws: BrowserStreamWebSocket,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId?: string,\n threadId?: string,\n ): Promise<void> {\n // Get or create the viewer set for this viewer key\n let viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n viewerSet = new Set();\n this.viewers.set(viewerKey, viewerSet);\n }\n\n const wasEmpty = viewerSet.size === 0;\n viewerSet.add(ws);\n\n // Start screencast if this is the first viewer\n // Use agentId for toolset lookup, viewerKey for registry keying\n if (wasEmpty) {\n await this.startScreencast(viewerKey, getToolset, agentId ?? viewerKey, threadId);\n } else {\n // Send current state to new viewer (screencast already running)\n this.sendCurrentState(viewerKey, ws);\n }\n }\n\n /**\n * Send current state (URL, viewport) to a newly connected viewer.\n */\n private sendCurrentState(viewerKey: string, ws: BrowserStreamWebSocket): void {\n try {\n // Send last known URL\n const lastUrl = this.lastUrls.get(viewerKey);\n if (lastUrl) {\n ws.send(JSON.stringify({ url: lastUrl }));\n }\n\n // Send last known viewport\n const lastViewport = this.lastViewports.get(viewerKey);\n if (lastViewport) {\n ws.send(JSON.stringify({ viewport: lastViewport }));\n }\n\n // Send actual current status (not always 'streaming')\n const lastStatus = this.lastStatuses.get(viewerKey);\n if (lastStatus) {\n ws.send(JSON.stringify({ status: lastStatus }));\n }\n } catch (error) {\n console.warn('[ViewerRegistry] Error sending current state to new viewer:', error);\n }\n }\n\n /**\n * Remove a viewer. Stops screencast if this was the last viewer.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param ws - The WebSocket context to remove\n */\n async removeViewer(viewerKey: string, ws: BrowserStreamWebSocket): Promise<void> {\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n viewerSet.delete(ws);\n\n // Clean up if no more viewers\n if (viewerSet.size === 0) {\n this.viewers.delete(viewerKey);\n this.lastUrls.delete(viewerKey);\n this.lastViewports.delete(viewerKey);\n\n // Clean up browser callbacks if pending\n const readyCleanup = this.browserReadyCleanups.get(viewerKey);\n if (readyCleanup) {\n readyCleanup();\n this.browserReadyCleanups.delete(viewerKey);\n }\n const closedCleanup = this.browserClosedCleanups.get(viewerKey);\n if (closedCleanup) {\n closedCleanup();\n this.browserClosedCleanups.delete(viewerKey);\n }\n\n await this.stopScreencast(viewerKey);\n }\n }\n\n /**\n * Broadcast a binary frame to all viewers.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param data - The binary frame data (base64 encoded)\n */\n broadcastFrame(viewerKey: string, data: string): void {\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n // Send as binary (base64 string)\n for (const ws of viewerSet) {\n try {\n ws.send(data);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting frame:', error);\n }\n }\n }\n\n /**\n * Broadcast a status message to all viewers.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n * @param status - The status message to send\n */\n broadcastStatus(viewerKey: string, status: StatusMessage): void {\n // Track last status for replay to new viewers\n if (status.status) {\n this.lastStatuses.set(viewerKey, status.status);\n }\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) {\n return;\n }\n\n const message = JSON.stringify(status);\n for (const ws of viewerSet) {\n try {\n ws.send(message);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting status:', error);\n }\n }\n }\n\n /**\n * Broadcast a URL update to all viewers (only if changed).\n */\n private broadcastUrlIfChanged(viewerKey: string, url: string | null): void {\n if (!url) return;\n if (this.lastUrls.get(viewerKey) === url) return;\n\n this.lastUrls.set(viewerKey, url);\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) return;\n\n const message = JSON.stringify({ url });\n for (const ws of viewerSet) {\n try {\n ws.send(message);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting URL:', error);\n }\n }\n }\n\n /**\n * Broadcast viewport metadata to all viewers.\n * Only sends if dimensions have changed from last broadcast.\n * Called on stream start and on each frame to detect dimension changes.\n */\n private broadcastViewportIfChanged(viewerKey: string, viewport: { width: number; height: number }): void {\n const last = this.lastViewports.get(viewerKey);\n if (last && last.width === viewport.width && last.height === viewport.height) {\n return;\n }\n\n this.lastViewports.set(viewerKey, { width: viewport.width, height: viewport.height });\n\n const viewerSet = this.viewers.get(viewerKey);\n if (!viewerSet) return;\n\n const message: ViewportMessage = { viewport: { width: viewport.width, height: viewport.height } };\n const json = JSON.stringify(message);\n for (const ws of viewerSet) {\n try {\n ws.send(json);\n } catch (error) {\n console.warn('[ViewerRegistry] Error broadcasting viewport:', error);\n }\n }\n }\n\n /**\n * Start screencast for a viewer. Only starts if browser is already running.\n * If browser not running, registers a callback to start when browser becomes ready.\n *\n * @param viewerKey - The viewer key (for registry keying)\n * @param getToolset - Function to retrieve the BrowserToolset\n * @param agentId - The actual agent ID for toolset lookup\n * @param threadId - The thread ID for thread-scoped page selection (optional)\n */\n private async startScreencast(\n viewerKey: string,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId: string,\n threadId?: string,\n ): Promise<void> {\n const toolset = await getToolset(agentId);\n // Viewer may have disconnected while awaiting async toolset lookup.\n // Bail out so we don't register callbacks or start a screencast for a stale viewer.\n if (!this.viewers.has(viewerKey)) {\n return;\n }\n if (!toolset) {\n // No browser available for this agent - just keep connection open.\n // The screencast will start when the agent hydrates and the browser launches\n // (via the generation flow calling getAgentFromSystem → createAgentFromStoredConfig).\n console.info(`[ViewerRegistry] No toolset for ${viewerKey}, waiting...`);\n return;\n }\n\n // Register callback for browser restarts (external close + re-launch)\n // This ensures screencast reconnects after browser is externally closed\n // Pass threadId so callback only fires when that specific thread's browser is ready\n if (!this.browserReadyCleanups.has(viewerKey)) {\n const cleanup = toolset.onBrowserReady(() => {\n // Only start if we still have viewers\n if (!this.viewers.has(viewerKey)) {\n return;\n }\n\n // Stop any existing (likely dead) screencast before starting new one\n const existingStream = this.screencasts.get(viewerKey);\n if (existingStream) {\n console.info(`[ViewerRegistry] Stopping old screencast for ${viewerKey} before reconnecting...`);\n this.screencasts.delete(viewerKey);\n // Stop async, don't wait - the old CDP session is probably dead anyway\n existingStream.stop().catch(() => {});\n }\n\n console.info(`[ViewerRegistry] Browser ready for ${viewerKey}, starting screencast...`);\n this.doStartScreencast(viewerKey, toolset, threadId).catch(error => {\n console.error(`[ViewerRegistry] Failed to start screencast on browser ready for ${viewerKey}:`, error);\n });\n }, threadId);\n this.browserReadyCleanups.set(viewerKey, cleanup);\n }\n\n // Register callback for browser closed (external close detection)\n // This ensures UI shows \"browser closed\" overlay immediately\n // Pass threadId so callback only fires when that specific thread's browser closes\n if (!this.browserClosedCleanups.has(viewerKey)) {\n const cleanup = toolset.onBrowserClosed(() => {\n console.info(`[ViewerRegistry] Browser closed for ${viewerKey}, notifying viewers...`);\n // Clean up screencast reference (CDP session is dead)\n this.screencasts.delete(viewerKey);\n // Broadcast browser_closed status to UI\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }, threadId);\n this.browserClosedCleanups.set(viewerKey, cleanup);\n }\n\n // Check if browser is already running\n if (toolset.isBrowserRunning()) {\n // Browser is running, start screencast immediately\n await this.doStartScreencast(viewerKey, toolset, threadId);\n } else {\n // Browser not running - callback will fire when it becomes ready\n console.info(`[ViewerRegistry] Browser not running for ${viewerKey}, waiting for browser to start...`);\n }\n }\n\n /**\n * Internal method to actually start the screencast stream.\n *\n * @param viewerKey - The viewer key (for registry keying and logging)\n * @param toolset - The browser toolset\n * @param threadId - The thread ID for thread-scoped page selection (optional)\n */\n private async doStartScreencast(viewerKey: string, toolset: MastraBrowser, threadId?: string): Promise<void> {\n // Skip if already streaming or currently starting (prevents race conditions)\n if (this.screencasts.has(viewerKey) || this.startingScreencasts.has(viewerKey)) {\n return;\n }\n\n // Mark as starting to prevent concurrent starts\n this.startingScreencasts.add(viewerKey);\n\n try {\n this.broadcastStatus(viewerKey, { status: 'browser_starting' });\n\n // Use startScreencastIfBrowserActive to avoid launching browser\n // Pass threadId for thread-scoped page selection\n const stream = await toolset.startScreencastIfBrowserActive(threadId ? { threadId } : undefined);\n if (!stream) {\n console.warn(`[ViewerRegistry] No browser session for ${viewerKey}`);\n // Tell the UI this thread has no browser session yet\n // Using 'browser_closed' to indicate no active browser for this thread\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n return;\n }\n\n this.screencasts.set(viewerKey, stream);\n\n // Capture reference to guard against stale callbacks from superseded streams\n const currentStream = stream;\n\n // Wire up frame events + viewport tracking\n stream.on('frame', frame => {\n // Ignore frames from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n this.broadcastFrame(viewerKey, frame.data);\n this.broadcastViewportIfChanged(viewerKey, frame.viewport);\n });\n\n // Wire up URL change events (emitted by browser providers on navigation)\n stream.on('url', (url: string) => {\n // Ignore URL updates from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n this.broadcastUrlIfChanged(viewerKey, url);\n });\n\n // Wire up stop events\n stream.on('stop', reason => {\n // Ignore stop events from superseded streams (e.g., old stream stopping after reconnect)\n if (this.screencasts.get(viewerKey) !== currentStream) {\n console.info(`[ViewerRegistry] Ignoring stop from superseded stream for ${viewerKey}`);\n return;\n }\n console.info(`[ViewerRegistry] Screencast stopped for ${viewerKey}: ${reason}`);\n this.screencasts.delete(viewerKey);\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n });\n\n // Wire up error events - treat errors as browser closed since screencast can't continue\n stream.on('error', error => {\n // Ignore errors from superseded streams\n if (this.screencasts.get(viewerKey) !== currentStream) return;\n console.error(`[ViewerRegistry] Screencast error for ${viewerKey}:`, error);\n this.screencasts.delete(viewerKey);\n // Explicitly stop the stream to clean up CDP resources\n currentStream.stop().catch(stopError => {\n console.warn(`[ViewerRegistry] Error stopping errored screencast for ${viewerKey}:`, stopError);\n });\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n });\n\n this.broadcastStatus(viewerKey, { status: 'streaming' });\n\n // Send initial URL - pass threadId to get URL from correct browser session\n const initialUrl = await toolset.getCurrentUrl(threadId);\n this.broadcastUrlIfChanged(viewerKey, initialUrl);\n } catch (error) {\n console.error(`[ViewerRegistry] Failed to start screencast for ${viewerKey}:`, error);\n // Connection stays open - user can see error status\n } finally {\n // Clear starting flag\n this.startingScreencasts.delete(viewerKey);\n }\n }\n\n /**\n * Stop screencast for an agent. Called when last viewer disconnects.\n */\n private async stopScreencast(agentId: string): Promise<void> {\n const stream = this.screencasts.get(agentId);\n if (!stream) {\n return;\n }\n\n try {\n await stream.stop();\n } catch (error) {\n console.warn(`[ViewerRegistry] Error stopping screencast for ${agentId}:`, error);\n } finally {\n this.screencasts.delete(agentId);\n }\n }\n\n /**\n * Get the number of viewers for an agent.\n *\n * @param agentId - The agent ID\n * @returns The number of connected viewers\n */\n getViewerCount(agentId: string): number {\n return this.viewers.get(agentId)?.size ?? 0;\n }\n\n /**\n * Check if an agent has an active screencast.\n *\n * @param agentId - The agent ID\n * @returns True if screencast is active\n */\n hasActiveScreencast(agentId: string): boolean {\n return this.screencasts.has(agentId);\n }\n\n /**\n * Close the browser session for an agent.\n * Stops screencast and broadcasts browser_closed status.\n * Call this before calling toolset.close() to ensure UI is notified.\n *\n * @param viewerKey - The viewer key (agentId or agentId:threadId for thread-scoped)\n */\n async closeBrowserSession(viewerKey: string): Promise<void> {\n // NOTE: Do NOT clean up the onBrowserReady callback here.\n // Viewers are still connected (WebSocket stays open), so we need\n // the callback to fire when the browser relaunches from a subsequent\n // tool call. Callback cleanup only happens in removeViewer() when\n // the last viewer disconnects.\n\n // Clear URL, viewport, and status tracking so next session sends fresh data\n this.lastUrls.delete(viewerKey);\n this.lastViewports.delete(viewerKey);\n this.lastStatuses.delete(viewerKey);\n\n // Stop screencast if active\n const stream = this.screencasts.get(viewerKey);\n if (stream) {\n try {\n await stream.stop();\n // Note: stream.stop() emits 'stop' event which triggers broadcastStatus\n } catch (error) {\n console.warn(`[ViewerRegistry] Error stopping screencast for ${viewerKey}:`, error);\n // Still broadcast browser_closed even if stop fails\n this.screencasts.delete(viewerKey);\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }\n } else {\n // No active screencast, but still broadcast browser_closed\n this.broadcastStatus(viewerKey, { status: 'browser_closed' });\n }\n }\n}\n","import type { MastraBrowser } from '@mastra/core/browser';\nimport type { BrowserStreamConfig, ClientInputMessage, MouseInputMessage, KeyboardInputMessage } from './types.js';\n\n// Valid CDP mouse event types\nconst VALID_MOUSE_EVENTS = new Set(['mousePressed', 'mouseReleased', 'mouseMoved', 'mouseWheel']);\n\n// Valid CDP keyboard event types\nconst VALID_KEYBOARD_EVENTS = new Set(['keyDown', 'keyUp', 'char']);\n\n// Input dispatch queue per agent+thread to serialize input events\nconst inputQueues = new Map<string, Promise<void>>();\n\n/**\n * Serialize input dispatch to maintain event ordering.\n * Input events must be processed in order to avoid race conditions.\n */\nfunction enqueueInput(key: string, fn: () => Promise<void>): void {\n const current = inputQueues.get(key) ?? Promise.resolve();\n const next = current.then(fn).catch(() => {\n // Errors are handled inside fn, just ensure chain continues\n });\n inputQueues.set(key, next);\n}\n\n/**\n * Map of key names to Windows virtual key codes.\n * Required for non-printable keys (Enter, Tab, Arrow keys, etc.)\n * See: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\nconst VIRTUAL_KEY_CODES: Record<string, number> = {\n // Control keys\n Backspace: 8,\n Tab: 9,\n Enter: 13,\n Shift: 16,\n Control: 17,\n Alt: 18,\n Pause: 19,\n CapsLock: 20,\n Escape: 27,\n Space: 32,\n ' ': 32,\n PageUp: 33,\n PageDown: 34,\n End: 35,\n Home: 36,\n // Arrow keys\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n // Editing keys\n Insert: 45,\n Delete: 46,\n // Function keys\n F1: 112,\n F2: 113,\n F3: 114,\n F4: 115,\n F5: 116,\n F6: 117,\n F7: 118,\n F8: 119,\n F9: 120,\n F10: 121,\n F11: 122,\n F12: 123,\n};\n\n/**\n * Get the Windows virtual key code for a key.\n * For printable characters, uses the character code.\n * For special keys, looks up in the mapping.\n */\nfunction getVirtualKeyCode(key: string | undefined): number | undefined {\n if (!key) return undefined;\n\n // Check special keys first\n if (VIRTUAL_KEY_CODES[key] !== undefined) {\n return VIRTUAL_KEY_CODES[key];\n }\n\n // For single printable characters, use the uppercase char code\n if (key.length === 1) {\n return key.toUpperCase().charCodeAt(0);\n }\n\n return undefined;\n}\n\n/**\n * Handle an incoming WebSocket message by parsing, validating,\n * and routing to the appropriate toolset injection method.\n *\n * Fire-and-forget: no acknowledgment sent back to client.\n * Silently ignores malformed or unrecognized messages.\n *\n * @param data - Raw string data from WebSocket message\n * @param getToolset - Function to retrieve MastraBrowser for an agent\n * @param agentId - The agent ID this WebSocket connection is for\n * @param threadId - The thread ID for thread-scoped operations (optional)\n */\nexport async function handleInputMessage(\n data: string,\n getToolset: BrowserStreamConfig['getToolset'],\n agentId: string,\n threadId?: string,\n): Promise<void> {\n let message: unknown;\n try {\n message = JSON.parse(data);\n } catch {\n return;\n }\n\n if (!isValidInputMessage(message)) {\n return;\n }\n\n const toolset = await getToolset(agentId);\n if (!toolset) {\n return;\n }\n\n // Serialize input dispatch per agent+thread to maintain event ordering\n const queueKey = `${agentId}:${threadId ?? 'default'}`;\n\n switch (message.type) {\n case 'mouse':\n enqueueInput(queueKey, async () => {\n try {\n await injectMouse(toolset, message, threadId);\n } catch (err) {\n if (isDisconnectionError(err)) {\n notifyBrowserClosed(toolset, threadId);\n } else if (!isExpectedInjectionError(err)) {\n console.warn('[InputHandler] Mouse injection error:', err);\n }\n }\n });\n break;\n case 'keyboard':\n enqueueInput(queueKey, async () => {\n try {\n await injectKeyboard(toolset, message, threadId);\n } catch (err) {\n if (isDisconnectionError(err)) {\n notifyBrowserClosed(toolset, threadId);\n } else if (!isExpectedInjectionError(err)) {\n console.warn('[InputHandler] Keyboard injection error:', err);\n }\n }\n });\n break;\n }\n}\n\n// --- Error handling ---\n\n/**\n * Check if an error indicates browser disconnection (target closed).\n * These errors mean the browser was externally closed.\n */\nfunction isDisconnectionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n // Note: 'no cdp session' is handled by isExpectedInjectionError (startup race)\n // and should not trigger browser closed state\n return (\n msg.includes('target closed') ||\n msg.includes('browser has been closed') ||\n msg.includes('page has been closed') ||\n msg.includes('session closed') ||\n msg.includes('browser has disconnected')\n );\n}\n\n/**\n * Check if an injection error is expected (browser not ready yet).\n * These are silently ignored to avoid log spam.\n */\nfunction isExpectedInjectionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('no cdp session') ||\n msg.includes('browser not launched') ||\n msg.includes('not connected to browser') ||\n msg.includes('no active target') ||\n (msg.includes('target') && msg.includes('not attached'))\n );\n}\n\n/**\n * Notify the browser that it was closed externally.\n * This triggers the onBrowserClosed callbacks to update the UI.\n * If threadId is provided and the browser supports thread-specific closing,\n * only that thread's session is closed.\n */\nfunction notifyBrowserClosed(toolset: MastraBrowser, threadId?: string): void {\n const browser = toolset as unknown as {\n closeThreadSession?: (threadId: string) => Promise<void>;\n handleBrowserDisconnected?: () => void;\n };\n\n // For thread-scoped browsers, close only the specific thread's session\n if (threadId && typeof browser.closeThreadSession === 'function') {\n void browser.closeThreadSession(threadId).catch(() => {\n // Fall back to global disconnect if thread-specific close fails\n browser.handleBrowserDisconnected?.();\n });\n return;\n }\n\n // Fall back to global disconnect handling\n browser.handleBrowserDisconnected?.();\n}\n\n// --- Input injection ---\n\n/**\n * Inject a mouse event into the browser.\n */\nasync function injectMouse(toolset: MastraBrowser, msg: MouseInputMessage, threadId?: string): Promise<void> {\n await toolset.injectMouseEvent(\n {\n type: msg.eventType,\n x: msg.x,\n y: msg.y,\n button: msg.button,\n clickCount: msg.clickCount,\n deltaX: msg.deltaX,\n deltaY: msg.deltaY,\n modifiers: msg.modifiers,\n },\n threadId,\n );\n}\n\n/**\n * Inject a keyboard event into the browser.\n */\nasync function injectKeyboard(toolset: MastraBrowser, msg: KeyboardInputMessage, threadId?: string): Promise<void> {\n const windowsVirtualKeyCode = getVirtualKeyCode(msg.key);\n\n await toolset.injectKeyboardEvent(\n {\n type: msg.eventType,\n key: msg.key,\n code: msg.code,\n text: msg.text,\n modifiers: msg.modifiers,\n windowsVirtualKeyCode,\n },\n threadId,\n );\n}\n\n// --- Validation ---\n\n/**\n * Type guard to validate incoming messages.\n * Validates structure and rejects invalid event types at the boundary.\n */\nfunction isValidInputMessage(msg: unknown): msg is ClientInputMessage {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const typed = msg as Record<string, unknown>;\n\n if (typed.type === 'mouse') {\n // Validate mouse message structure\n if (typeof typed.eventType !== 'string' || !VALID_MOUSE_EVENTS.has(typed.eventType)) {\n return false;\n }\n if (typeof typed.x !== 'number' || typeof typed.y !== 'number') {\n return false;\n }\n // Optional fields validation\n if (typed.button !== undefined && typeof typed.button !== 'string') {\n return false;\n }\n if (typed.deltaX !== undefined && typeof typed.deltaX !== 'number') {\n return false;\n }\n if (typed.deltaY !== undefined && typeof typed.deltaY !== 'number') {\n return false;\n }\n return true;\n }\n\n if (typed.type === 'keyboard') {\n // Validate keyboard message structure\n if (typeof typed.eventType !== 'string' || !VALID_KEYBOARD_EVENTS.has(typed.eventType)) {\n return false;\n }\n // At least one of key, code, or text should be present for meaningful input\n const hasKey = typeof typed.key === 'string';\n const hasCode = typeof typed.code === 'string';\n const hasText = typeof typed.text === 'string';\n if (!hasKey && !hasCode && !hasText) {\n return false;\n }\n // Optional modifiers validation\n if (typed.modifiers !== undefined && typeof typed.modifiers !== 'number') {\n return false;\n }\n return true;\n }\n\n return false;\n}\n"],"mappings":"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"}
|
|
@@ -25,6 +25,17 @@ export declare const MASTRA_INHERITED_MEMORY_KEY = "mastra__inheritedMemory";
|
|
|
25
25
|
export declare const MASTRA_AUTH_MODE_KEY = "mastra__authMode";
|
|
26
26
|
export type MastraAuthMode = 'studio' | 'server';
|
|
27
27
|
export declare const MASTRA_CLIENT_TYPE_HEADER = "x-mastra-client-type";
|
|
28
|
+
/**
|
|
29
|
+
* Browser-facing host, set by a trusted proxy whose own `X-Forwarded-Host` does
|
|
30
|
+
* not survive the hop to the app. Railway's gateway, for example, overwrites
|
|
31
|
+
* `X-Forwarded-Host` with its internal domain, so an edge in front of it has no
|
|
32
|
+
* other way to tell the app which hostname the user actually typed.
|
|
33
|
+
*
|
|
34
|
+
* Read by `getPublicOrigin()` ahead of `X-Forwarded-Host`. Carries the same
|
|
35
|
+
* trust assumption as the other forwarded headers: meaningful only behind a
|
|
36
|
+
* proxy that sets it, and it must be stripped from untrusted client requests.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MASTRA_PUBLIC_HOST_HEADER = "x-mastra-public-host";
|
|
28
39
|
export declare const MASTRA_STUDIO_CLIENT_TYPE = "studio";
|
|
29
40
|
export declare function isReservedRequestContextKey(key: string): boolean;
|
|
30
41
|
export declare function isStudioClientTypeHeader(value: string | undefined): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/server/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAoBlD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;CAkBlB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GACzB,CAAC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,UAAU,CAAC,GAC5E,CAAC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,MAAM,CAAC,GACpE,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAE3E;;;;;;;GAOG;AAEH,KAAK,sBAAsB,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAsB5D;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,oBAAoB,GAAG,SAAS,EAC7C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACvE,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAmC3F"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/server/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAoBlD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;CAkBlB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GACzB,CAAC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,UAAU,CAAC,GAC5E,CAAC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,MAAM,CAAC,GACpE,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAE3E;;;;;;;GAOG;AAEH,KAAK,sBAAsB,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAsB5D;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,oBAAoB,GAAG,SAAS,EAC7C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACvE,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAmC3F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
|
|
2
|
+
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
+
const require_a2a = require("../../a2a-BtXFFv-0.cjs");
|
|
3
4
|
exports.AGENT_EXECUTION_ROUTE = require_a2a.AGENT_EXECUTION_ROUTE;
|
|
4
5
|
exports.GET_AGENT_CARD_ROUTE = require_a2a.GET_AGENT_CARD_ROUTE;
|
|
5
6
|
exports.getAgentCardByIdHandler = require_a2a.getAgentCardByIdHandler;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as getAgentExecutionHandler, c as handleListTaskPushNotificationConfig, d as handleSetTaskPushNotificationConfig, f as handleTaskCancel, g as resolveA2AProtocolVersion, h as handleTaskResubscribe, i as getAgentCardByIdHandler, l as handleMessageSend, m as handleTaskList, n as GET_AGENT_CARD_ROUTE, o as handleDeleteTaskPushNotificationConfig, p as handleTaskGet, s as handleGetTaskPushNotificationConfig, t as AGENT_EXECUTION_ROUTE, u as handleMessageStream } from "../../a2a-
|
|
1
|
+
import { a as getAgentExecutionHandler, c as handleListTaskPushNotificationConfig, d as handleSetTaskPushNotificationConfig, f as handleTaskCancel, g as resolveA2AProtocolVersion, h as handleTaskResubscribe, i as getAgentCardByIdHandler, l as handleMessageSend, m as handleTaskList, n as GET_AGENT_CARD_ROUTE, o as handleDeleteTaskPushNotificationConfig, p as handleTaskGet, s as handleGetTaskPushNotificationConfig, t as AGENT_EXECUTION_ROUTE, u as handleMessageStream } from "../../a2a-DZhtQeFL.js";
|
|
2
2
|
export { AGENT_EXECUTION_ROUTE, GET_AGENT_CARD_ROUTE, getAgentCardByIdHandler, getAgentExecutionHandler, handleDeleteTaskPushNotificationConfig, handleGetTaskPushNotificationConfig, handleListTaskPushNotificationConfig, handleMessageSend, handleMessageStream, handleSetTaskPushNotificationConfig, handleTaskCancel, handleTaskGet, handleTaskList, handleTaskResubscribe, resolveA2AProtocolVersion };
|
|
@@ -1,12 +1,12 @@
|
|
|
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
5
|
const require_workflows = require("../../workflows--79xhOOb.cjs");
|
|
6
6
|
const require_agent_builder = require("../../agent-builder-D8JyDQ5J.cjs");
|
|
7
7
|
const require_agents = require("../../agents-CLv_RFQx.cjs");
|
|
8
|
-
const require_route_builder = require("../../route-builder-
|
|
9
|
-
const require_utils = require("../../utils-
|
|
8
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
9
|
+
const require_utils = require("../../utils-CmYnjLcY.cjs");
|
|
10
10
|
const require_server_handlers_error = require("./error.cjs");
|
|
11
11
|
const require_server_handlers_workflows = require("./workflows.cjs");
|
|
12
12
|
//#region src/server/handlers/agent-builder.ts
|
|
@@ -30,7 +30,7 @@ var agent_builder_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll
|
|
|
30
30
|
});
|
|
31
31
|
let agentBuilderWorkflowsPromise;
|
|
32
32
|
async function loadAgentBuilderWorkflows() {
|
|
33
|
-
agentBuilderWorkflowsPromise ??= Promise.resolve().then(() => require("../../dist-
|
|
33
|
+
agentBuilderWorkflowsPromise ??= Promise.resolve().then(() => require("../../dist-DERatX43.cjs")).then((mod) => mod.agentBuilderWorkflows);
|
|
34
34
|
return agentBuilderWorkflowsPromise;
|
|
35
35
|
}
|
|
36
36
|
async function registerAgentBuilderWorkflows(mastra) {
|
|
@@ -1,11 +1,11 @@
|
|
|
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, o as optionalRunIdSchema } from "../../common-5ZZuR6wj.js";
|
|
4
4
|
import { b as workflowRunResultSchema, g as workflowInfoSchema, i as listWorkflowsResponseSchema, m as workflowExecutionResultSchema, n as createWorkflowRunResponseSchema, p as workflowControlResponseSchema, r as listWorkflowRunsQuerySchema, x as workflowRunsResponseSchema, y as workflowRunResultQuerySchema } from "../../workflows-B2ooCiwN.js";
|
|
5
5
|
import { a as streamAgentBuilderBodySchema, i as startAsyncAgentBuilderBodySchema, n as actionRunPathParams, o as streamLegacyAgentBuilderBodySchema, r as resumeAgentBuilderBodySchema, t as actionIdPathParams } from "../../agent-builder-DNTFty1u.js";
|
|
6
6
|
import { K as streamResponseSchema } from "../../agents-BetrUB_N.js";
|
|
7
7
|
import { n as createRoute } from "../../route-builder-YQ_gLIvW.js";
|
|
8
|
-
import { t as WorkflowRegistry } from "../../utils-
|
|
8
|
+
import { t as WorkflowRegistry } from "../../utils-B2vd77Fi.js";
|
|
9
9
|
import { handleError } from "./error.js";
|
|
10
10
|
import { CANCEL_WORKFLOW_RUN_ROUTE, CREATE_WORKFLOW_RUN_ROUTE, GET_WORKFLOW_BY_ID_ROUTE, GET_WORKFLOW_RUN_BY_ID_ROUTE, LIST_WORKFLOWS_ROUTE, LIST_WORKFLOW_RUNS_ROUTE, OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE, OBSERVE_STREAM_WORKFLOW_ROUTE, RESUME_ASYNC_WORKFLOW_ROUTE, RESUME_NO_WAIT_WORKFLOW_ROUTE, RESUME_STREAM_WORKFLOW_ROUTE, RESUME_WORKFLOW_ROUTE, START_ASYNC_WORKFLOW_ROUTE, START_WORKFLOW_RUN_ROUTE, STREAM_LEGACY_WORKFLOW_ROUTE, STREAM_WORKFLOW_ROUTE } from "./workflows.js";
|
|
11
11
|
//#region src/server/handlers/agent-builder.ts
|
|
@@ -29,7 +29,7 @@ var agent_builder_exports = /* @__PURE__ */ __exportAll({
|
|
|
29
29
|
});
|
|
30
30
|
let agentBuilderWorkflowsPromise;
|
|
31
31
|
async function loadAgentBuilderWorkflows() {
|
|
32
|
-
agentBuilderWorkflowsPromise ??= import("../../dist-
|
|
32
|
+
agentBuilderWorkflowsPromise ??= import("../../dist-Cw-T1gX6.js").then((mod) => mod.agentBuilderWorkflows);
|
|
33
33
|
return agentBuilderWorkflowsPromise;
|
|
34
34
|
}
|
|
35
35
|
async function registerAgentBuilderWorkflows(mastra) {
|
|
@@ -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_route_builder = require("../../route-builder-
|
|
4
|
+
const require_route_builder = require("../../route-builder-CWsok5ci.cjs");
|
|
4
5
|
const require_server_handlers_error = require("./error.cjs");
|
|
5
6
|
let zod_v4 = require("zod/v4");
|
|
6
7
|
//#region src/server/handlers/agent-controller.ts
|
|
@@ -21,11 +22,22 @@ let zod_v4 = require("zod/v4");
|
|
|
21
22
|
* usage). They share the flat thread `metadata` bag with user-provided session
|
|
22
23
|
* scoping tags, so they must never be treated as tags here.
|
|
23
24
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
25
|
+
* Importing core's list as a value would exceed this package's peer-dependency
|
|
26
|
+
* floor, so it is mirrored under `satisfies`: tsc rejects a missing or extra key.
|
|
26
27
|
*/
|
|
28
|
+
const RESERVED_THREAD_METADATA_KEYS = {
|
|
29
|
+
currentModelId: true,
|
|
30
|
+
currentModeId: true,
|
|
31
|
+
observerModelId: true,
|
|
32
|
+
reflectorModelId: true,
|
|
33
|
+
observationThreshold: true,
|
|
34
|
+
reflectionThreshold: true,
|
|
35
|
+
tokenUsage: true,
|
|
36
|
+
thinkingLevel: true,
|
|
37
|
+
notifications: true
|
|
38
|
+
};
|
|
27
39
|
function isReservedThreadMetadataKey(key) {
|
|
28
|
-
return
|
|
40
|
+
return Object.hasOwn(RESERVED_THREAD_METADATA_KEYS, key) || key.startsWith("modeModelId_");
|
|
29
41
|
}
|
|
30
42
|
/**
|
|
31
43
|
* Resolves a controller by id via the canonical `mastra.getAgentController`
|
|
@@ -220,6 +232,17 @@ const omProgressSummarySchema = zod_v4.z.object({
|
|
|
220
232
|
/** Tokens the next reflection is projected to save. */
|
|
221
233
|
projectedReflectionSavings: zod_v4.z.number()
|
|
222
234
|
});
|
|
235
|
+
const tokenUsageSchema = zod_v4.z.object({
|
|
236
|
+
promptTokens: zod_v4.z.number(),
|
|
237
|
+
completionTokens: zod_v4.z.number(),
|
|
238
|
+
totalTokens: zod_v4.z.number(),
|
|
239
|
+
reasoningTokens: zod_v4.z.number().optional(),
|
|
240
|
+
cachedInputTokens: zod_v4.z.number().optional(),
|
|
241
|
+
cacheCreationInputTokens: zod_v4.z.number().optional(),
|
|
242
|
+
cacheCreationInputTokens5m: zod_v4.z.number().optional(),
|
|
243
|
+
cacheCreationInputTokens1h: zod_v4.z.number().optional(),
|
|
244
|
+
raw: zod_v4.z.unknown().optional()
|
|
245
|
+
});
|
|
223
246
|
const sessionSettingsSchema = zod_v4.z.object({
|
|
224
247
|
yolo: zod_v4.z.boolean(),
|
|
225
248
|
/** Session override only — absent when the session inherits a configured default. */
|
|
@@ -259,7 +282,7 @@ const sessionStateResponseSchema = zod_v4.z.object({
|
|
|
259
282
|
running: zod_v4.z.boolean().optional(),
|
|
260
283
|
tasks: zod_v4.z.array(taskSnapshotSchema).optional(),
|
|
261
284
|
omProgress: omProgressSummarySchema.optional(),
|
|
262
|
-
tokenUsage:
|
|
285
|
+
tokenUsage: tokenUsageSchema.optional(),
|
|
263
286
|
settings: sessionSettingsSchema.optional()
|
|
264
287
|
});
|
|
265
288
|
const listModesResponseSchema = zod_v4.z.object({ modes: zod_v4.z.array(zod_v4.z.object({
|
|
@@ -386,38 +409,32 @@ const CREATE_AGENT_CONTROLLER_SESSION_ROUTE = require_route_builder.createRoute(
|
|
|
386
409
|
}
|
|
387
410
|
}
|
|
388
411
|
});
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
412
|
+
function toWireDisplayState(displayState) {
|
|
413
|
+
return {
|
|
414
|
+
...displayState,
|
|
415
|
+
activeTools: Object.fromEntries(displayState.activeTools),
|
|
416
|
+
toolInputBuffers: Object.fromEntries(displayState.toolInputBuffers),
|
|
417
|
+
pendingSuspensions: Object.fromEntries(displayState.pendingSuspensions),
|
|
418
|
+
activeSubagents: Object.fromEntries(displayState.activeSubagents),
|
|
419
|
+
modifiedFiles: Object.fromEntries(displayState.modifiedFiles)
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
function carriesError(event) {
|
|
423
|
+
return "error" in event && event.error instanceof Error;
|
|
424
|
+
}
|
|
425
|
+
/** JSON drops an `Error` and a `Map` to `{}`; reshape both into what {@link JsonReadyAgentControllerEvent} promises. */
|
|
398
426
|
function toWireEvent(event) {
|
|
399
|
-
if (
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
if (type === "display_state_changed") {
|
|
412
|
-
const { displayState } = event;
|
|
413
|
-
if (typeof displayState !== "object" || displayState === null) return event;
|
|
414
|
-
const wireDisplayState = { ...displayState };
|
|
415
|
-
for (const [key, value] of Object.entries(wireDisplayState)) if (value instanceof Map) wireDisplayState[key] = Object.fromEntries(value);
|
|
416
|
-
return {
|
|
417
|
-
...event,
|
|
418
|
-
displayState: wireDisplayState
|
|
419
|
-
};
|
|
420
|
-
}
|
|
427
|
+
if ("displayState" in event) return {
|
|
428
|
+
...event,
|
|
429
|
+
displayState: toWireDisplayState(event.displayState)
|
|
430
|
+
};
|
|
431
|
+
if (carriesError(event)) return {
|
|
432
|
+
...event,
|
|
433
|
+
error: {
|
|
434
|
+
name: event.error.name,
|
|
435
|
+
message: event.error.message
|
|
436
|
+
}
|
|
437
|
+
};
|
|
421
438
|
return event;
|
|
422
439
|
}
|
|
423
440
|
const STREAM_AGENT_CONTROLLER_SESSION_ROUTE = require_route_builder.createRoute({
|