@mastra/server 1.79.0 → 1.80.0-alpha.1
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/dist/_types/@internal_core/dist/storage/index.d.ts +243 -243
- package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/request-context/index.d.ts +13 -13
- package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/routes/index.d.ts +12 -12
- package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/types/index.d.ts +1 -2
- package/dist/{a2a-Uood_0DN.cjs → a2a-qQkFvE8f.cjs} +2 -2
- package/dist/{a2a-Uood_0DN.cjs.map → a2a-qQkFvE8f.cjs.map} +1 -1
- package/dist/{a2a-BqLB3McP.js → a2a-wv2WQ3IG.js} +2 -2
- package/dist/{a2a-BqLB3McP.js.map → a2a-wv2WQ3IG.js.map} +1 -1
- package/dist/{agent-builder-CuBD1tpv.cjs → agent-builder-C8F4tCwd.cjs} +4 -4
- package/dist/{agent-builder-CuBD1tpv.cjs.map → agent-builder-C8F4tCwd.cjs.map} +1 -1
- package/dist/{agent-builder-VhM8ADW-.js → agent-builder-DFZjeOkA.js} +4 -4
- package/dist/{agent-builder-VhM8ADW-.js.map → agent-builder-DFZjeOkA.js.map} +1 -1
- package/dist/{agents-BHLTMBff.js → agents-BjdJ-Tyf.js} +3 -2
- package/dist/agents-BjdJ-Tyf.js.map +1 -0
- package/dist/{agents-T-OIM9IK.cjs → agents-CPYFVJak.cjs} +8 -1
- package/dist/agents-CPYFVJak.cjs.map +1 -0
- package/dist/{agents-BOWEUKyV.cjs → agents-CcY0JTDF.cjs} +81 -9
- package/dist/agents-CcY0JTDF.cjs.map +1 -0
- package/dist/{agents-DRQ3ScbX.js → agents-DaLwtv9x.js} +76 -10
- package/dist/agents-DaLwtv9x.js.map +1 -0
- package/dist/{api-schema-manifest-CI90M4sX.js → api-schema-manifest-B1WyInlF.js} +2 -2
- package/dist/{api-schema-manifest-CI90M4sX.js.map → api-schema-manifest-B1WyInlF.js.map} +1 -1
- package/dist/{api-schema-manifest-DIlNfbyw.cjs → api-schema-manifest-CxrGchcx.cjs} +2 -2
- package/dist/{api-schema-manifest-DIlNfbyw.cjs.map → api-schema-manifest-CxrGchcx.cjs.map} +1 -1
- package/dist/{conversations-C5MkQBB8.cjs → conversations-B16oVu_1.cjs} +2 -2
- package/dist/{conversations-C5MkQBB8.cjs.map → conversations-B16oVu_1.cjs.map} +1 -1
- package/dist/{conversations-8BWryNlF.js → conversations-B5RJ2jcO.js} +2 -2
- package/dist/{conversations-8BWryNlF.js.map → conversations-B5RJ2jcO.js.map} +1 -1
- package/dist/{datasets-BUC5T-fd.cjs → datasets-Cgtczd13.cjs} +11 -1
- package/dist/datasets-Cgtczd13.cjs.map +1 -0
- package/dist/{datasets-CCWuznUu.js → datasets-FRp69Mwv.js} +11 -1
- package/dist/datasets-FRp69Mwv.js.map +1 -0
- package/dist/{dist-k77XQGUn.js → dist-6ZwWUUBQ.js} +40 -6
- package/dist/{dist-k77XQGUn.js.map → dist-6ZwWUUBQ.js.map} +1 -1
- package/dist/{dist-B-bEVWlJ.cjs → dist-U8ZBR8z5.cjs} +40 -6
- package/dist/{dist-B-bEVWlJ.cjs.map → dist-U8ZBR8z5.cjs.map} +1 -1
- package/dist/{dist-B3kC8Yd0.cjs → dist-bT2343kX.cjs} +1 -1
- package/dist/dist-qYC51DiT.js +1 -0
- package/dist/docs/SKILL.md +2 -2
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-connections-a2a.md +1 -1
- package/dist/docs/references/docs-guides-mcp-authentication-authorization.md +2 -2
- package/dist/docs/references/docs-server-middleware.md +1 -1
- package/dist/docs/references/reference-observability-tracing-advanced-queries.md +92 -11
- package/dist/{editor-builder-BDtiWw0f.cjs → editor-builder-Bt26tVKI.cjs} +2 -2
- package/dist/{editor-builder-BDtiWw0f.cjs.map → editor-builder-Bt26tVKI.cjs.map} +1 -1
- package/dist/{editor-builder-DnLCfqnY.js → editor-builder-DWMgkYK-.js} +2 -2
- package/dist/{editor-builder-DnLCfqnY.js.map → editor-builder-DWMgkYK-.js.map} +1 -1
- package/dist/{editor-builder-DtpP1FtW.cjs → editor-builder-D_OUA9P6.cjs} +3 -3
- package/dist/{editor-builder-DtpP1FtW.cjs.map → editor-builder-D_OUA9P6.cjs.map} +1 -1
- package/dist/{editor-builder-ClFlGXoX.js → editor-builder-DzGLnYcJ.js} +3 -3
- package/dist/{editor-builder-ClFlGXoX.js.map → editor-builder-DzGLnYcJ.js.map} +1 -1
- package/dist/{helpers-CAcEhq38.cjs → helpers-DvzrUzqY.cjs} +2 -2
- package/dist/{helpers-CAcEhq38.cjs.map → helpers-DvzrUzqY.cjs.map} +1 -1
- package/dist/{helpers-vrqddDd5.js → helpers-gCkmhB9x.js} +2 -2
- package/dist/{helpers-vrqddDd5.js.map → helpers-gCkmhB9x.js.map} +1 -1
- package/dist/{observability-BBMCMeT-.cjs → observability-C2BZQ2jU.cjs} +3 -2
- package/dist/{observability-BBMCMeT-.cjs.map → observability-C2BZQ2jU.cjs.map} +1 -1
- package/dist/{observability-ZRgRcvoX.js → observability-Dz9jvMJ3.js} +3 -2
- package/dist/{observability-ZRgRcvoX.js.map → observability-Dz9jvMJ3.js.map} +1 -1
- package/dist/{observability-new-endpoints-fjoZzEtk.js → observability-new-endpoints-3DlTYf34.js} +117 -4
- package/dist/observability-new-endpoints-3DlTYf34.js.map +1 -0
- package/dist/{observability-new-endpoints-tG3-odLa.cjs → observability-new-endpoints-Drr7q2Dj.cjs} +121 -2
- package/dist/observability-new-endpoints-Drr7q2Dj.cjs.map +1 -0
- package/dist/{plans-CiPgWBhO.cjs → plans-DVzqRj-i.cjs} +3 -3
- package/dist/{plans-CiPgWBhO.cjs.map → plans-DVzqRj-i.cjs.map} +1 -1
- package/dist/{plans-DCepEY7n.js → plans-TpICqvFU.js} +3 -3
- package/dist/{plans-DCepEY7n.js.map → plans-TpICqvFU.js.map} +1 -1
- package/dist/{probe-image-size-BdfbUHxx.js → probe-image-size-BYv_-JV7.js} +2 -2
- package/dist/{probe-image-size-BdfbUHxx.js.map → probe-image-size-BYv_-JV7.js.map} +1 -1
- package/dist/{probe-image-size-Alv3gwKl.cjs → probe-image-size-mZ2ldE98.cjs} +2 -2
- package/dist/{probe-image-size-Alv3gwKl.cjs.map → probe-image-size-mZ2ldE98.cjs.map} +1 -1
- package/dist/{responses-CCRijwDF.cjs → responses-CP2UYT8z.cjs} +2 -2
- package/dist/{responses-CCRijwDF.cjs.map → responses-CP2UYT8z.cjs.map} +1 -1
- package/dist/{responses-4FwMNxoJ.js → responses-CnQoSpBc.js} +2 -2
- package/dist/{responses-4FwMNxoJ.js.map → responses-CnQoSpBc.js.map} +1 -1
- package/dist/{routes-BC20mdNN.js → routes-DZ2QfTnF.js} +17 -15
- package/dist/routes-DZ2QfTnF.js.map +1 -0
- package/dist/{routes-DGLJyqjD.cjs → routes-OsQV338J.cjs} +17 -15
- package/dist/routes-OsQV338J.cjs.map +1 -0
- package/dist/{scores-D9UgETt_.js → scores-DFFS3Zxo.js} +2 -2
- package/dist/{scores-D9UgETt_.js.map → scores-DFFS3Zxo.js.map} +1 -1
- package/dist/{scores-DRdtS7NT.cjs → scores-DwiL1Nk8.cjs} +2 -2
- package/dist/{scores-DRdtS7NT.cjs.map → scores-DwiL1Nk8.cjs.map} +1 -1
- package/dist/server/auth/helpers.d.ts.map +1 -1
- package/dist/server/auth/index.cjs +1 -1
- package/dist/server/auth/index.js +1 -1
- package/dist/server/handlers/a2a.cjs +1 -1
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +1 -1
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agents.cjs +2 -1
- package/dist/server/handlers/agents.d.ts +31 -0
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/auth.cjs +15 -1
- package/dist/server/handlers/auth.cjs.map +1 -1
- package/dist/server/handlers/auth.d.ts.map +1 -1
- package/dist/server/handlers/auth.js +15 -1
- package/dist/server/handlers/auth.js.map +1 -1
- package/dist/server/handlers/conversations.cjs +1 -1
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/datasets.cjs +3 -2
- package/dist/server/handlers/datasets.cjs.map +1 -1
- package/dist/server/handlers/datasets.d.ts +8 -0
- package/dist/server/handlers/datasets.d.ts.map +1 -1
- package/dist/server/handlers/datasets.js +3 -2
- package/dist/server/handlers/datasets.js.map +1 -1
- package/dist/server/handlers/editor-builder.cjs +1 -1
- package/dist/server/handlers/editor-builder.js +1 -1
- package/dist/server/handlers/favorites-enrichment.cjs +1 -1
- package/dist/server/handlers/favorites-enrichment.js +1 -1
- package/dist/server/handlers/observability-new-endpoints.cjs +2 -1
- package/dist/server/handlers/observability-new-endpoints.d.ts +132 -0
- package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
- package/dist/server/handlers/observability-new-endpoints.js +1 -1
- package/dist/server/handlers/observability-shared.cjs +19 -0
- package/dist/server/handlers/observability-shared.cjs.map +1 -1
- package/dist/server/handlers/observability-shared.d.ts +10 -0
- package/dist/server/handlers/observability-shared.d.ts.map +1 -1
- package/dist/server/handlers/observability-shared.js +18 -1
- package/dist/server/handlers/observability-shared.js.map +1 -1
- package/dist/server/handlers/observability.cjs +3 -2
- package/dist/server/handlers/observability.js +3 -3
- package/dist/server/handlers/plans.cjs +1 -1
- package/dist/server/handlers/plans.js +1 -1
- package/dist/server/handlers/responses.cjs +1 -1
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/schedules-workflows-shim.cjs.map +1 -1
- package/dist/server/handlers/schedules-workflows-shim.js.map +1 -1
- package/dist/server/handlers/scores.cjs +1 -1
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/stored-agent-favorites.cjs +1 -1
- package/dist/server/handlers/stored-agent-favorites.js +1 -1
- package/dist/server/handlers/stored-agents.cjs +29 -11
- package/dist/server/handlers/stored-agents.cjs.map +1 -1
- package/dist/server/handlers/stored-agents.d.ts.map +1 -1
- package/dist/server/handlers/stored-agents.js +29 -11
- package/dist/server/handlers/stored-agents.js.map +1 -1
- package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
- package/dist/server/handlers/stored-skill-favorites.js +1 -1
- package/dist/server/handlers/stored-skills.cjs +1 -1
- package/dist/server/handlers/stored-skills.js +1 -1
- package/dist/server/handlers/system.cjs +2 -2
- package/dist/server/handlers/system.d.ts +2 -0
- package/dist/server/handlers/system.d.ts.map +1 -1
- package/dist/server/handlers/system.js +2 -2
- package/dist/server/handlers/tools.cjs +1 -1
- package/dist/server/handlers/tools.d.ts.map +1 -1
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/workflow-builder.cjs +1 -1
- package/dist/server/handlers/workflow-builder.js +1 -1
- package/dist/server/handlers/workflows.cjs +1 -1
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/handlers/workspace.cjs +1 -1
- package/dist/server/handlers/workspace.d.ts +23 -23
- package/dist/server/handlers/workspace.js +1 -1
- package/dist/server/handlers.cjs +11 -11
- package/dist/server/handlers.js +11 -11
- package/dist/server/schemas/agents.d.ts +4 -0
- package/dist/server/schemas/agents.d.ts.map +1 -1
- package/dist/server/schemas/datasets.d.ts +4 -0
- package/dist/server/schemas/datasets.d.ts.map +1 -1
- package/dist/server/schemas/index.cjs +5 -4
- package/dist/server/schemas/index.js +5 -5
- package/dist/server/schemas/system.d.ts +2 -0
- package/dist/server/schemas/system.d.ts.map +1 -1
- package/dist/server/server-adapter/index.cjs +95 -3
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.d.ts +28 -1
- package/dist/server/server-adapter/index.d.ts.map +1 -1
- package/dist/server/server-adapter/index.js +93 -4
- package/dist/server/server-adapter/index.js.map +1 -1
- package/dist/server/server-adapter/mcp-disconnect.d.ts +16 -0
- package/dist/server/server-adapter/mcp-disconnect.d.ts.map +1 -0
- package/dist/server/server-adapter/routes/agents.d.ts +2 -1
- package/dist/server/server-adapter/routes/agents.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/datasets.d.ts +8 -0
- package/dist/server/server-adapter/routes/datasets.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/observability.d.ts +129 -0
- package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/system.d.ts +2 -0
- package/dist/server/server-adapter/routes/system.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/workspace.d.ts +23 -23
- package/dist/{system-BvpFMIJB.cjs → system-B_Sod-Le.cjs} +2 -1
- package/dist/system-B_Sod-Le.cjs.map +1 -0
- package/dist/{system-CpzPxRRq.js → system-sSSmmt7I.js} +2 -1
- package/dist/system-sSSmmt7I.js.map +1 -0
- package/dist/{tools-SPJtxG9N.cjs → tools-B2fMQuwp.cjs} +3 -3
- package/dist/tools-B2fMQuwp.cjs.map +1 -0
- package/dist/{tools-CmFSfDMn.js → tools-BrO42c5i.js} +3 -3
- package/dist/tools-BrO42c5i.js.map +1 -0
- package/dist/{workflow-builder-CjlLoQvo.js → workflow-builder-D-YMkDHC.js} +3 -3
- package/dist/{workflow-builder-CjlLoQvo.js.map → workflow-builder-D-YMkDHC.js.map} +1 -1
- package/dist/{workflow-builder-C9-8ZOWF.cjs → workflow-builder-DtXcLQoG.cjs} +3 -3
- package/dist/{workflow-builder-C9-8ZOWF.cjs.map → workflow-builder-DtXcLQoG.cjs.map} +1 -1
- package/dist/{workflows-bb-otd2o.js → workflows-CF7e2ST9.js} +2 -2
- package/dist/{workflows-bb-otd2o.js.map → workflows-CF7e2ST9.js.map} +1 -1
- package/dist/{workflows-DjqeJcdJ.cjs → workflows-DN2axrmq.cjs} +2 -2
- package/dist/{workflows-DjqeJcdJ.cjs.map → workflows-DN2axrmq.cjs.map} +1 -1
- package/dist/{workspace-B6kzp-bo.js → workspace-BVHXoKmP.js} +2 -2
- package/dist/workspace-BVHXoKmP.js.map +1 -0
- package/dist/{workspace-COKR1SxH.cjs → workspace-d25MZ9dj.cjs} +2 -2
- package/dist/workspace-d25MZ9dj.cjs.map +1 -0
- package/package.json +10 -10
- package/dist/agents-BHLTMBff.js.map +0 -1
- package/dist/agents-BOWEUKyV.cjs.map +0 -1
- package/dist/agents-DRQ3ScbX.js.map +0 -1
- package/dist/agents-T-OIM9IK.cjs.map +0 -1
- package/dist/datasets-BUC5T-fd.cjs.map +0 -1
- package/dist/datasets-CCWuznUu.js.map +0 -1
- package/dist/dist-BM9J-PTK.js +0 -1
- package/dist/observability-new-endpoints-fjoZzEtk.js.map +0 -1
- package/dist/observability-new-endpoints-tG3-odLa.cjs.map +0 -1
- package/dist/routes-BC20mdNN.js.map +0 -1
- package/dist/routes-DGLJyqjD.cjs.map +0 -1
- package/dist/system-BvpFMIJB.cjs.map +0 -1
- package/dist/system-CpzPxRRq.js.map +0 -1
- package/dist/tools-CmFSfDMn.js.map +0 -1
- package/dist/tools-SPJtxG9N.cjs.map +0 -1
- package/dist/workspace-B6kzp-bo.js.map +0 -1
- package/dist/workspace-COKR1SxH.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-BVHXoKmP.js","names":[],"sources":["../src/server/handlers/workspace.ts"],"sourcesContent":["/**\n * Workspace Handlers\n *\n * Unified handlers for workspace operations including:\n * - Filesystem operations (read, write, list, delete, mkdir, stat)\n * - Search operations (search, index)\n * - Skills operations (list, get, search, references)\n */\n\nimport { coreFeatures } from '@mastra/core/features';\nimport type { Workspace, WorkspaceSkills, WorkspaceFilesystem, CompositeFilesystem } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n // Workspace info\n workspaceInfoResponseSchema,\n listWorkspacesResponseSchema,\n workspaceIdPathParams,\n // Filesystem schemas\n fsReadQuerySchema,\n fsListQuerySchema,\n fsStatQuerySchema,\n fsDeleteQuerySchema,\n fsWriteBodySchema,\n fsMkdirBodySchema,\n fsReadResponseSchema,\n fsWriteResponseSchema,\n fsListResponseSchema,\n fsDeleteResponseSchema,\n fsMkdirResponseSchema,\n fsStatResponseSchema,\n // Search schemas\n searchQuerySchema,\n searchResponseSchema,\n indexBodySchema,\n indexResponseSchema,\n // Skills schemas\n skillNamePathParams,\n skillDisambiguationQuerySchema,\n skillReferencePathParams,\n searchSkillsQuerySchema,\n listSkillsResponseSchema,\n getSkillResponseSchema,\n skillReferenceResponseSchema,\n listReferencesResponseSchema,\n searchSkillsResponseSchema,\n // skills.sh proxy schemas\n skillsShSearchQuerySchema,\n skillsShPopularQuerySchema,\n skillsShSearchResponseSchema,\n skillsShListResponseSchema,\n skillsShPreviewQuerySchema,\n skillsShInstallBodySchema,\n skillsShInstallResponseSchema,\n skillsShPreviewResponseSchema,\n skillsShRemoveBodySchema,\n skillsShRemoveResponseSchema,\n skillsShUpdateBodySchema,\n skillsShUpdateResponseSchema,\n} from '../schemas/workspace';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Directory path for skills installed via skills.sh */\nconst SKILLS_SH_DIR = '.agents/skills';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Runtime check for CompositeFilesystem using duck typing.\n * Uses a type-only import so older @mastra/core versions (< 1.3.0) work fine.\n */\nfunction isCompositeFilesystem(fs: unknown): fs is CompositeFilesystem {\n return !!fs && typeof fs === 'object' && 'mounts' in fs && fs.mounts instanceof Map;\n}\n\n/**\n * Check if an error is a workspace filesystem not-found error.\n * Handles Node.js ENOENT and workspace FileNotFoundError/DirectoryNotFoundError.\n */\nfunction isFilesystemNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for Node.js native ENOENT\n if ('code' in error && error.code === 'ENOENT') return true;\n\n // Check for workspace FileNotFoundError / DirectoryNotFoundError\n if ('name' in error) {\n const name = error.name;\n if (name === 'FileNotFoundError' || name === 'DirectoryNotFoundError') return true;\n }\n\n return false;\n}\n\n/**\n * Check if an error is a workspace filesystem permission error.\n * Handles Node.js EACCES and workspace PermissionError.\n */\nfunction isFilesystemPermissionError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('code' in error && error.code === 'EACCES') return true;\n\n if ('name' in error && error.name === 'PermissionError') return true;\n\n return false;\n}\n\n/**\n * Workspace-specific error handler.\n * Converts filesystem errors to appropriate HTTP status codes,\n * then falls back to generic handler.\n */\nfunction handleWorkspaceError(error: unknown, defaultMessage: string): never {\n if (isFilesystemNotFoundError(error)) {\n const message = error instanceof Error ? error.message : 'Not found';\n throw new HTTPException(404, { message });\n }\n if (isFilesystemPermissionError(error)) {\n const message = error instanceof Error ? error.message : 'Permission denied';\n throw new HTTPException(403, { message });\n }\n return handleError(error, defaultMessage);\n}\n\n/**\n * Throws if workspace v1 is not supported by the current version of @mastra/core.\n */\nfunction requireWorkspaceV1Support(): void {\n if (!coreFeatures.has('workspaces-v1')) {\n throw new HTTPException(501, {\n message: 'Workspace v1 not supported by this version of @mastra/core. Please upgrade to a newer version.',\n });\n }\n}\n\n/**\n * Get a workspace by ID from Mastra's workspace registry.\n *\n * Backwards compatible: Falls back to searching through agents if\n * mastra.getWorkspaceById() is not available (older @mastra/core versions).\n */\nasync function getWorkspaceById(mastra: any, workspaceId: string): Promise<Workspace | undefined> {\n requireWorkspaceV1Support();\n\n // Check if the global workspace matches\n const globalWorkspace = mastra.getWorkspace?.();\n if (globalWorkspace?.id === workspaceId) {\n return globalWorkspace;\n }\n\n // Try direct registry lookup if available (newer @mastra/core versions)\n if (typeof mastra.getWorkspaceById === 'function') {\n try {\n return mastra.getWorkspaceById(workspaceId);\n } catch {\n // Workspace not found in registry\n return undefined;\n }\n }\n\n // Fallback: Search through agents for the workspace (older @mastra/core versions)\n const agents = mastra.listAgents?.() ?? {};\n for (const agent of Object.values(agents)) {\n if ((agent as any).hasOwnWorkspace?.()) {\n const agentWorkspace = await (agent as any).getWorkspace?.();\n if (agentWorkspace?.id === workspaceId) {\n return agentWorkspace;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Get skills from a specific workspace by ID.\n * Note: getWorkspaceById already checks for workspace v1 support.\n */\nasync function getSkillsById(mastra: any, workspaceId: string): Promise<WorkspaceSkills | undefined> {\n const workspace = await getWorkspaceById(mastra, workspaceId);\n return workspace?.skills;\n}\n\n/**\n * Build the install path for a skill from skills.sh.\n *\n * For CompositeFilesystem: resolves the requested mount (or first writable),\n * validates it is writable, and returns `<mount>/.agents/skills/<skillId>`.\n * For non-composite: returns `.agents/skills/<skillId>` (unchanged behavior).\n */\n/** Strip a single trailing slash (leaves `/` alone). */\nfunction stripTrailingSlash(p: string): string {\n return p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p;\n}\n\nfunction buildSkillInstallPath(filesystem: WorkspaceFilesystem, safeSkillId: string, requestedMount?: string): string {\n if (isCompositeFilesystem(filesystem)) {\n if (requestedMount) {\n // Validate the requested mount exists\n const mountFs = filesystem.mounts.get(requestedMount);\n if (!mountFs) {\n throw new HTTPException(400, {\n message: `Mount \"${requestedMount}\" not found. Available mounts: ${filesystem.mountPaths.join(', ')}`,\n });\n }\n if (mountFs.readOnly) {\n throw new HTTPException(403, { message: `Mount \"${requestedMount}\" is read-only` });\n }\n return `${stripTrailingSlash(requestedMount)}/${SKILLS_SH_DIR}/${safeSkillId}`;\n }\n\n // Default: use first writable mount\n for (const [mountPath, mountFs] of filesystem.mounts) {\n if (!mountFs.readOnly) {\n return `${stripTrailingSlash(mountPath)}/${SKILLS_SH_DIR}/${safeSkillId}`;\n }\n }\n\n throw new HTTPException(403, { message: 'No writable mount available for skill installation' });\n }\n\n // Non-composite: standard path\n return `${SKILLS_SH_DIR}/${safeSkillId}`;\n}\n\n// =============================================================================\n// List All Workspaces Route\n// =============================================================================\n\nexport const LIST_WORKSPACES_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces',\n responseType: 'json',\n responseSchema: listWorkspacesResponseSchema,\n summary: 'List all workspaces',\n description: 'Returns all workspaces from both Mastra instance and agents',\n tags: ['Workspace'],\n handler: async ({ mastra }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspaces: Array<{\n id: string;\n name: string;\n status: string;\n source: 'mastra' | 'agent';\n agentId?: string;\n agentName?: string;\n capabilities: {\n hasFilesystem: boolean;\n hasSandbox: boolean;\n canBM25: boolean;\n canVector: boolean;\n canHybrid: boolean;\n hasSkills: boolean;\n };\n safety: {\n readOnly: boolean;\n };\n }> = [];\n\n // Prefer the workspace registry if available (duck-type check for newer @mastra/core).\n // This avoids calling dynamic workspace functions without proper request context.\n // Dynamic workspaces get lazily registered during agent execution (stream/generate).\n if (typeof mastra.listWorkspaces === 'function') {\n const registeredWorkspaces = mastra.listWorkspaces();\n\n for (const [, entry] of Object.entries(registeredWorkspaces)) {\n // Newer @mastra/core returns { workspace, source, agentId?, agentName? }.\n // Older versions return a bare Workspace object — detect via duck-typing.\n const ws: Workspace = (entry as any).workspace ?? entry;\n const source: 'mastra' | 'agent' = (entry as any).source ?? 'mastra';\n const agentId: string | undefined = (entry as any).agentId;\n const agentName: string | undefined = (entry as any).agentName;\n\n workspaces.push({\n id: ws.id,\n name: ws.name,\n status: ws.status,\n source,\n ...(source === 'agent' && agentId ? { agentId, ...(agentName != null ? { agentName } : {}) } : {}),\n capabilities: {\n hasFilesystem: !!ws.filesystem,\n hasSandbox: !!ws.sandbox,\n canBM25: ws.canBM25,\n canVector: ws.canVector,\n canHybrid: ws.canHybrid,\n hasSkills: !!ws.skills,\n },\n safety: {\n readOnly: ws.filesystem?.readOnly ?? false,\n },\n });\n }\n } else {\n // Fallback for older @mastra/core without workspace registry:\n // Check global workspace and loop through agents\n const seenIds = new Set<string>();\n const globalWorkspace = mastra.getWorkspace?.();\n if (globalWorkspace) {\n seenIds.add(globalWorkspace.id);\n workspaces.push({\n id: globalWorkspace.id,\n name: globalWorkspace.name,\n status: globalWorkspace.status,\n source: 'mastra',\n capabilities: {\n hasFilesystem: !!globalWorkspace.filesystem,\n hasSandbox: !!globalWorkspace.sandbox,\n canBM25: globalWorkspace.canBM25,\n canVector: globalWorkspace.canVector,\n canHybrid: globalWorkspace.canHybrid,\n hasSkills: !!globalWorkspace.skills,\n },\n safety: {\n readOnly: globalWorkspace.filesystem?.readOnly ?? false,\n },\n });\n }\n\n const agents = mastra.listAgents?.() ?? {};\n for (const [agentId, agent] of Object.entries(agents)) {\n if ((agent as any).hasOwnWorkspace?.()) {\n try {\n const agentWorkspace = await (agent as any).getWorkspace?.();\n if (agentWorkspace && !seenIds.has(agentWorkspace.id)) {\n seenIds.add(agentWorkspace.id);\n workspaces.push({\n id: agentWorkspace.id,\n name: agentWorkspace.name,\n status: agentWorkspace.status,\n source: 'agent',\n agentId,\n agentName: (agent as any).name,\n capabilities: {\n hasFilesystem: !!agentWorkspace.filesystem,\n hasSandbox: !!agentWorkspace.sandbox,\n canBM25: agentWorkspace.canBM25,\n canVector: agentWorkspace.canVector,\n canHybrid: agentWorkspace.canHybrid,\n hasSkills: !!agentWorkspace.skills,\n },\n safety: {\n readOnly: agentWorkspace.filesystem?.readOnly ?? false,\n },\n });\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n return { workspaces };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing workspaces');\n }\n },\n});\n\n// =============================================================================\n// Get Workspace Route\n// =============================================================================\n\nexport const GET_WORKSPACE_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n responseSchema: workspaceInfoResponseSchema,\n summary: 'Get workspace info',\n description: 'Returns information about a specific workspace and its capabilities',\n tags: ['Workspace'],\n handler: async ({ mastra, workspaceId }) => {\n try {\n const workspace = await getWorkspaceById(mastra, workspaceId);\n\n if (!workspace) {\n return {\n isWorkspaceConfigured: false,\n };\n }\n\n const fsInfo = await workspace.filesystem?.getInfo?.();\n\n // Build mounts array for CompositeFilesystem\n let mounts:\n | Array<{\n path: string;\n provider: string;\n readOnly: boolean;\n displayName?: string;\n icon?: string;\n name?: string;\n }>\n | undefined;\n\n if (isCompositeFilesystem(workspace.filesystem)) {\n mounts = [];\n for (const [mountPath, mountFs] of workspace.filesystem.mounts) {\n try {\n const info = await mountFs.getInfo?.();\n mounts.push({\n path: mountPath,\n provider: info?.provider ?? mountFs.provider ?? 'unknown',\n readOnly: mountFs.readOnly ?? false,\n displayName: mountFs.displayName ?? info?.name ?? mountFs.name,\n icon: info?.icon,\n name: mountFs.name,\n });\n } catch {\n mounts.push({\n path: mountPath,\n provider: mountFs.provider ?? 'unknown',\n readOnly: mountFs.readOnly ?? true,\n name: mountFs.name,\n });\n }\n }\n }\n\n return {\n isWorkspaceConfigured: true,\n id: workspace.id,\n name: workspace.name,\n status: workspace.status,\n capabilities: {\n hasFilesystem: !!workspace.filesystem,\n hasSandbox: !!workspace.sandbox,\n canBM25: workspace.canBM25,\n canVector: workspace.canVector,\n canHybrid: workspace.canHybrid,\n hasSkills: !!workspace.skills,\n },\n safety: {\n readOnly: workspace.filesystem?.readOnly ?? false,\n },\n filesystem: fsInfo\n ? {\n id: fsInfo.id,\n name: fsInfo.name,\n provider: fsInfo.provider,\n status: fsInfo.status,\n error: fsInfo.error,\n readOnly: fsInfo.readOnly,\n icon: fsInfo.icon,\n metadata: fsInfo.metadata,\n }\n : undefined,\n mounts,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting workspace info');\n }\n },\n});\n\n// =============================================================================\n// Filesystem Routes\n// =============================================================================\n\nexport const WORKSPACE_FS_READ_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/read',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsReadQuerySchema,\n responseSchema: fsReadResponseSchema,\n summary: 'Read file content',\n description: 'Returns the content of a file at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, encoding, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n // Read file content\n const content = await workspace.filesystem.readFile(decodedPath, {\n encoding: (encoding as BufferEncoding) || 'utf-8',\n });\n\n return {\n path: decodedPath,\n content: typeof content === 'string' ? content : content.toString('utf-8'),\n type: 'file' as const,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error reading file');\n }\n },\n});\n\nexport const WORKSPACE_FS_WRITE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/fs/write',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: fsWriteBodySchema,\n responseSchema: fsWriteResponseSchema,\n summary: 'Write file content',\n description: 'Writes content to a file at the specified path. Supports base64 encoding for binary files.',\n tags: ['Workspace'],\n handler: async ({ mastra, path, content, encoding, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path || content === undefined) {\n throw new HTTPException(400, { message: 'Path and content are required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n // Handle base64-encoded content for binary files\n let fileContent: string | Buffer = content;\n if (encoding === 'base64') {\n fileContent = Buffer.from(content, 'base64');\n }\n\n await workspace.filesystem.writeFile(decodedPath, fileContent, { recursive: recursive ?? true });\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error writing file');\n }\n },\n});\n\nexport const WORKSPACE_FS_LIST_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/list',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsListQuerySchema,\n responseSchema: fsListResponseSchema,\n summary: 'List directory contents',\n description: 'Returns a list of files and directories at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n return {\n path,\n entries: [],\n error: 'No workspace filesystem configured',\n };\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n const entries = await workspace.filesystem.readdir(decodedPath, { recursive });\n\n return {\n path: decodedPath,\n entries,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing directory');\n }\n },\n});\n\nexport const WORKSPACE_FS_DELETE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/workspaces/:workspaceId/fs/delete',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsDeleteQuerySchema,\n responseSchema: fsDeleteResponseSchema,\n summary: 'Delete file or directory',\n description: 'Deletes a file or directory at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, force, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n // Check if path exists (unless force is true)\n const exists = await workspace.filesystem.exists(decodedPath);\n if (!exists && !force) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n if (exists) {\n // Try to delete as file first, then as directory\n try {\n await workspace.filesystem.deleteFile(decodedPath, { force });\n } catch {\n await workspace.filesystem.rmdir(decodedPath, { recursive, force });\n }\n }\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error deleting path');\n }\n },\n});\n\nexport const WORKSPACE_FS_MKDIR_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/fs/mkdir',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: fsMkdirBodySchema,\n responseSchema: fsMkdirResponseSchema,\n summary: 'Create directory',\n description: 'Creates a directory at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n await workspace.filesystem.mkdir(decodedPath, { recursive: recursive ?? true });\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error creating directory');\n }\n },\n});\n\nexport const WORKSPACE_FS_STAT_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/stat',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsStatQuerySchema,\n responseSchema: fsStatResponseSchema,\n summary: 'Get file/directory info',\n description: 'Returns metadata about a file or directory',\n tags: ['Workspace'],\n handler: async ({ mastra, path, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n const stat = await workspace.filesystem.stat(decodedPath);\n\n return {\n path: stat.path,\n type: stat.type,\n size: stat.size,\n createdAt: stat.createdAt?.toISOString(),\n modifiedAt: stat.modifiedAt?.toISOString(),\n mimeType: stat.mimeType,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting file info');\n }\n },\n});\n\n// =============================================================================\n// Search Routes\n// =============================================================================\n\nexport const WORKSPACE_SEARCH_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: searchQuerySchema,\n responseSchema: searchResponseSchema,\n summary: 'Search workspace content',\n description: 'Searches across indexed workspace content using BM25, vector, or hybrid search',\n tags: ['Workspace'],\n handler: async ({ mastra, query, topK, mode, minScore, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!query) {\n throw new HTTPException(400, { message: 'Search query is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n return {\n results: [],\n query,\n mode: mode || 'bm25',\n };\n }\n\n // Check search capabilities\n const canSearch = workspace.canBM25 || workspace.canVector;\n if (!canSearch) {\n return {\n results: [],\n query,\n mode: mode || 'bm25',\n };\n }\n\n // Determine search mode based on capabilities\n let searchMode = mode;\n if (!searchMode) {\n if (workspace.canHybrid) {\n searchMode = 'hybrid';\n } else if (workspace.canVector) {\n searchMode = 'vector';\n } else {\n searchMode = 'bm25';\n }\n }\n\n const results = await workspace.search(query, {\n topK: topK || 5,\n mode: searchMode,\n minScore,\n });\n\n return {\n results: results.map(r => ({\n id: r.id,\n content: r.content,\n score: r.score,\n lineRange: r.lineRange,\n scoreDetails: r.scoreDetails,\n })),\n query,\n mode: searchMode,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error searching workspace');\n }\n },\n});\n\nexport const WORKSPACE_INDEX_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/index',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: indexBodySchema,\n responseSchema: indexResponseSchema,\n summary: 'Index content for search',\n description: 'Indexes content for later search operations',\n tags: ['Workspace'],\n handler: async ({ mastra, path, content, metadata, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path || content === undefined) {\n throw new HTTPException(400, { message: 'Path and content are required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'No workspace configured' });\n }\n\n const canSearch = workspace.canBM25 || workspace.canVector;\n if (!canSearch) {\n throw new HTTPException(400, { message: 'Workspace does not have search configured' });\n }\n\n await workspace.index(path, content, { metadata });\n\n return {\n success: true,\n path,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error indexing content');\n }\n },\n});\n\n// =============================================================================\n// Skills Routes (under /workspaces/:workspaceId/skills)\n// =============================================================================\n\n/** Path prefix for skills installed via skills.sh (with trailing slash for prefix matching) */\nconst SKILLS_SH_PATH_PREFIX = `${SKILLS_SH_DIR}/`;\n\nexport const WORKSPACE_LIST_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n responseSchema: listSkillsResponseSchema,\n summary: 'List all skills',\n description: 'Returns a list of all discovered skills with their metadata',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n const skills = workspace?.skills;\n if (!skills) {\n return { skills: [], isSkillsConfigured: false };\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skillsList = await skills.list();\n\n // Enrich skills with skills.sh source info where applicable\n const enrichedSkills = await Promise.all(\n skillsList.map(async skillMeta => {\n let skillsShSource: { owner: string; repo: string } | undefined;\n\n // For skills installed via skills.sh, read source info from .meta.json.\n // Uses includes() because glob-discovered paths may have a leading slash\n // or be nested (e.g., '/.agents/skills/foo', '/src/.agents/skills/foo').\n if (skillMeta.path.includes(SKILLS_SH_PATH_PREFIX) && workspace.filesystem) {\n try {\n const metaPath = `${skillMeta.path}/.meta.json`;\n const metaContent = await workspace.filesystem.readFile(metaPath);\n const metaText = typeof metaContent === 'string' ? metaContent : metaContent.toString('utf-8');\n const meta = JSON.parse(metaText) as { owner?: string; repo?: string };\n if (meta.owner && meta.repo) {\n skillsShSource = { owner: meta.owner, repo: meta.repo };\n }\n } catch {\n // .meta.json might not exist or be invalid - that's ok\n }\n }\n\n return {\n name: skillMeta.name,\n description: skillMeta.description,\n license: skillMeta.license,\n compatibility: skillMeta.compatibility,\n metadata: skillMeta.metadata,\n path: skillMeta.path,\n skillsShSource,\n };\n }),\n );\n\n return {\n skills: enrichedSkills,\n isSkillsConfigured: true,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing skills');\n }\n },\n});\n\nexport const WORKSPACE_GET_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName',\n responseType: 'json',\n pathParamSchema: skillNamePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: getSkillResponseSchema,\n summary: 'Get skill details',\n description: 'Returns the full details of a specific skill including instructions and file lists',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!skillName) {\n throw new HTTPException(400, { message: 'Skill name is required' });\n }\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = path ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n return {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n path: skill.path,\n instructions: skill.instructions,\n source: skill.source,\n references: skill.references,\n scripts: skill.scripts,\n assets: skill.assets,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting skill');\n }\n },\n});\n\nexport const WORKSPACE_LIST_SKILL_REFERENCES_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName/references',\n responseType: 'json',\n pathParamSchema: skillNamePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: listReferencesResponseSchema,\n summary: 'List skill references',\n description: 'Returns a list of all reference file paths for a skill',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!skillName) {\n throw new HTTPException(400, { message: 'Skill name is required' });\n }\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = path ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n const references = await skills.listReferences(identifier);\n\n return {\n skillName: skill.name,\n references,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing skill references');\n }\n },\n});\n\nexport const WORKSPACE_GET_SKILL_REFERENCE_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName/references/:referencePath',\n responseType: 'json',\n pathParamSchema: skillReferencePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: skillReferenceResponseSchema,\n summary: 'Get skill reference content',\n description: 'Returns the content of a specific reference file from a skill',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path: skillPath, referencePath, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = skillPath ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n // Resolve skill to get its name for the response\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n const decodedPath = referencePath;\n\n // Prevent path traversal via the reference path parameter\n assertSafeFilePath(decodedPath);\n\n // getReference expects a path relative to skill.path, so prepend 'references/'\n // since the URL path already contains the literal /references/ segment\n const content = await skills.getReference(identifier, `references/${decodedPath}`);\n if (content === null) {\n throw new HTTPException(404, {\n message: `Reference \"${decodedPath}\" not found in skill \"${identifier}\"`,\n });\n }\n\n return {\n skillName: skill.name,\n referencePath: decodedPath,\n content,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting skill reference');\n }\n },\n});\n\nexport const WORKSPACE_SEARCH_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: searchSkillsQuerySchema,\n responseSchema: searchSkillsResponseSchema,\n summary: 'Search skills',\n description: 'Searches across all skills content using BM25 keyword search',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, query, topK, minScore, skillNames, includeReferences, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!query) {\n throw new HTTPException(400, { message: 'Search query is required' });\n }\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n return {\n results: [],\n query,\n };\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n // Parse comma-separated skill names if provided\n const skillNamesList = skillNames ? skillNames.split(',').map((s: string) => s.trim()) : undefined;\n\n const results = await skills.search(query, {\n topK: topK || 5,\n minScore,\n skillNames: skillNamesList,\n includeReferences: includeReferences ?? true,\n });\n\n return {\n results: results.map(r => ({\n skillName: r.skillName,\n skillPath: r.skillPath,\n source: r.source,\n content: r.content,\n score: r.score,\n lineRange: r.lineRange,\n scoreDetails: r.scoreDetails,\n })),\n query,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error searching skills');\n }\n },\n});\n\n// =============================================================================\n// skills.sh Proxy Routes\n// =============================================================================\n\nconst SKILLS_SH_API_URL = 'https://skills-api-production.up.railway.app';\n\nexport const WORKSPACE_SKILLS_SH_SEARCH_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShSearchQuerySchema,\n responseSchema: skillsShSearchResponseSchema,\n summary: 'Search skills on skills.sh',\n description: 'Proxies search requests to skills.sh API to avoid CORS issues',\n tags: ['Workspace', 'Skills'],\n handler: async ({ q, limit }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const url = `${SKILLS_SH_API_URL}/api/skills?query=${encodeURIComponent(q)}&pageSize=${limit}`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n };\n return {\n query: q,\n searchType: 'query',\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error searching skills');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_POPULAR_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/popular',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShPopularQuerySchema,\n responseSchema: skillsShListResponseSchema,\n summary: 'Get popular skills from skills.sh',\n description: 'Proxies popular skills requests to skills.sh API to avoid CORS issues',\n tags: ['Workspace', 'Skills'],\n handler: async ({ limit, offset }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const page = offset > 0 ? Math.floor(offset / limit) + 1 : 1;\n const url = `${SKILLS_SH_API_URL}/api/skills/top?pageSize=${limit}&page=${page}`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n };\n return {\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n limit,\n offset,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error fetching popular skills');\n }\n },\n});\n\n// =============================================================================\n// Skills API helpers\n// =============================================================================\n\n/**\n * Validate skill name to prevent path traversal attacks.\n * Only allows alphanumeric characters, hyphens, and underscores.\n */\nconst SKILL_NAME_REGEX = /^[a-z0-9][a-z0-9-_]*$/i;\n\nfunction assertSafeSkillName(name: string): string {\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new HTTPException(400, {\n message: `Invalid skill name \"${name}\". Names must start with alphanumeric and contain only letters, numbers, hyphens, and underscores.`,\n });\n }\n return name;\n}\n\n/**\n * Validate that a file path is safe (no traversal, no absolute paths).\n * Prevents malicious API responses from writing files outside the skill directory.\n */\nfunction assertSafeFilePath(filePath: string): string {\n // Reject absolute paths\n if (filePath.startsWith('/') || /^[a-zA-Z]:/.test(filePath)) {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Absolute paths are not allowed.`,\n });\n }\n // Reject path traversal attempts\n const segments = filePath.split('/');\n for (const segment of segments) {\n if (segment === '..' || segment === '.') {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Path traversal is not allowed.`,\n });\n }\n }\n return filePath;\n}\n\ninterface SkillFileEntry {\n path: string;\n content: string;\n encoding: 'utf-8' | 'base64';\n}\n\ninterface SkillFilesResponse {\n skillId: string;\n owner: string;\n repo: string;\n branch: string;\n files: SkillFileEntry[];\n}\n\n/**\n * Fetch skill files from the Skills API.\n * Returns all files for a skill with their content.\n */\nasync function fetchSkillFiles(owner: string, repo: string, skillName: string): Promise<SkillFilesResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30s for file downloads\n\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/files`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`Skills API error: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json()) as SkillFilesResponse;\n}\n\n// =============================================================================\n// skills.sh Preview Route\n// =============================================================================\n\nexport const WORKSPACE_SKILLS_SH_PREVIEW_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/preview',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShPreviewQuerySchema,\n responseSchema: skillsShPreviewResponseSchema,\n summary: 'Preview skill content',\n description: 'Fetches the skill content from the Skills API.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ owner, repo, path: skillName }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/content`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" for ${owner}/${repo}`,\n });\n }\n\n const data = (await response.json()) as { instructions: string; raw: string };\n const content = data.instructions || data.raw || '';\n\n if (!content) {\n throw new HTTPException(404, {\n message: `No content available for skill \"${skillName}\"`,\n });\n }\n\n return { content };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error fetching skill preview');\n }\n },\n});\n\n// =============================================================================\n// skills.sh Install Route\n// =============================================================================\n\nexport const WORKSPACE_SKILLS_SH_INSTALL_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/install',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShInstallBodySchema,\n responseSchema: skillsShInstallResponseSchema,\n summary: 'Install skill from Skills API',\n description: 'Installs a skill by fetching files from the Skills API and writing to workspace filesystem.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, owner, repo, skillName, mount }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n // Fetch skill files from the Skills API\n const result = await fetchSkillFiles(owner, repo, skillName);\n if (!result || result.files.length === 0) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" in ${owner}/${repo}.`,\n });\n }\n\n // Validate skill name to prevent path traversal\n const safeSkillId = assertSafeSkillName(result.skillId);\n const installPath = buildSkillInstallPath(workspace.filesystem, safeSkillId, mount);\n\n // Ensure the skills directory exists\n try {\n await workspace.filesystem.mkdir(installPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Write all files to the workspace\n let filesWritten = 0;\n for (const file of result.files) {\n // Validate file path to prevent path traversal from API response\n const safePath = assertSafeFilePath(file.path);\n const filePath = `${installPath}/${safePath}`;\n\n // Create subdirectory if needed\n if (safePath.includes('/')) {\n const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));\n try {\n await workspace.filesystem.mkdir(dirPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n }\n\n const content = file.encoding === 'base64' ? Buffer.from(file.content, 'base64') : file.content;\n await workspace.filesystem.writeFile(filePath, content);\n filesWritten++;\n }\n\n // Write metadata file for update support\n const metadata = {\n skillName: result.skillId,\n owner: result.owner,\n repo: result.repo,\n branch: result.branch,\n installedAt: new Date().toISOString(),\n };\n await workspace.filesystem.writeFile(`${installPath}/.meta.json`, JSON.stringify(metadata, null, 2));\n filesWritten++;\n\n // Surgically update the skills cache for the newly installed skill\n if (workspace.skills?.addSkill) {\n try {\n await workspace.skills.addSkill(installPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after install: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n return {\n success: true,\n skillName: result.skillId,\n installedPath: installPath,\n filesWritten,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error installing skill');\n }\n },\n});\n\n/**\n * Interface for skill metadata stored in .meta.json\n */\ninterface SkillMetaFile {\n skillName: string;\n owner: string;\n repo: string;\n branch: string;\n installedAt: string;\n}\n\nexport const WORKSPACE_SKILLS_SH_REMOVE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/remove',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShRemoveBodySchema,\n responseSchema: skillsShRemoveResponseSchema,\n summary: 'Remove an installed skill',\n description: 'Removes an installed skill by deleting its directory. Does not require sandbox.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, skillName }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n // Validate skill name to prevent path traversal\n const safeSkillName = assertSafeSkillName(skillName);\n\n // Look up the skill's actual path from the cache (supports glob-discovered skills).\n // Only use the discovered path if it's under the skills.sh directory to avoid\n // accidentally deleting a locally-authored skill with the same name.\n const allSkills = await workspace.skills?.list();\n const matchingSkill = allSkills?.find(s => s.name === safeSkillName && s.path.includes(SKILLS_SH_PATH_PREFIX));\n const skillPath = matchingSkill?.path ?? buildSkillInstallPath(workspace.filesystem, safeSkillName);\n\n // Check if skill exists on filesystem\n try {\n await workspace.filesystem.stat(skillPath);\n } catch {\n throw new HTTPException(404, { message: `Skill \"${skillName}\" not found at ${skillPath}` });\n }\n\n // Delete the skill directory\n await workspace.filesystem.rmdir(skillPath, { recursive: true });\n\n // Surgically remove the skill from the cache\n if (workspace.skills?.removeSkill) {\n try {\n await workspace.skills.removeSkill(skillPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after remove: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n return {\n success: true,\n skillName,\n removedPath: skillPath,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error removing skill');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_UPDATE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/update',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShUpdateBodySchema,\n responseSchema: skillsShUpdateResponseSchema,\n summary: 'Update installed skills',\n description:\n 'Updates installed skills by re-fetching from GitHub. Specify skillName to update one, or omit to update all.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, skillName }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n const results: Array<{\n skillName: string;\n success: boolean;\n filesWritten?: number;\n error?: string;\n }> = [];\n\n // Build list of { skillName, basePath } entries to update.\n // basePath is the parent of the skill directory (e.g., `.agents/skills`).\n let skillsToUpdate: Array<{ name: string; basePath: string }>;\n\n if (skillName) {\n const safeName = assertSafeSkillName(skillName);\n\n // Try to find the installed path via discovery first\n const allSkills = await workspace.skills?.list();\n const discoveredSkill = allSkills?.find(s => s.name === safeName && s.path.includes(SKILLS_SH_PATH_PREFIX));\n let basePath: string;\n if (discoveredSkill?.path) {\n // Derive basePath by removing the skill name suffix from the discovered path\n basePath = discoveredSkill.path.substring(0, discoveredSkill.path.lastIndexOf('/'));\n } else {\n basePath = SKILLS_SH_DIR;\n }\n skillsToUpdate = [{ name: safeName, basePath }];\n } else {\n // Update all: scan `.agents/skills` under each writable mount (or just SKILLS_SH_DIR)\n skillsToUpdate = [];\n const dirsToScan: string[] = [];\n\n if (isCompositeFilesystem(workspace.filesystem)) {\n for (const [mountPath, mountFs] of workspace.filesystem.mounts) {\n if (!mountFs.readOnly) {\n dirsToScan.push(`${stripTrailingSlash(mountPath)}/${SKILLS_SH_DIR}`);\n }\n }\n } else {\n dirsToScan.push(SKILLS_SH_DIR);\n }\n\n for (const dir of dirsToScan) {\n try {\n const entries = await workspace.filesystem.readdir(dir);\n for (const e of entries) {\n if (e.type === 'directory') {\n skillsToUpdate.push({ name: e.name, basePath: dir });\n }\n }\n } catch {\n // Directory doesn't exist or isn't readable - skip\n }\n }\n\n if (skillsToUpdate.length === 0) {\n return { updated: [] };\n }\n }\n\n for (const { name: skill, basePath } of skillsToUpdate) {\n // Validate each skill name for safety\n try {\n assertSafeSkillName(skill);\n } catch {\n results.push({\n skillName: skill,\n success: false,\n error: 'Invalid skill name',\n });\n continue;\n }\n const installPath = `${basePath}/${skill}`;\n const metaPath = `${installPath}/.meta.json`;\n try {\n const metaContent = await workspace.filesystem.readFile(metaPath, { encoding: 'utf-8' });\n const meta: SkillMetaFile = JSON.parse(metaContent as string);\n\n // Re-fetch skill files from the Skills API\n const fetchResult = await fetchSkillFiles(meta.owner, meta.repo, meta.skillName);\n\n if (!fetchResult || fetchResult.files.length === 0) {\n results.push({\n skillName: skill,\n success: false,\n error: 'No files found in skill directory',\n });\n continue;\n }\n\n let filesWritten = 0;\n\n for (const file of fetchResult.files) {\n // Validate file path to prevent path traversal from API response\n const safePath = assertSafeFilePath(file.path);\n const filePath = `${installPath}/${safePath}`;\n\n if (safePath.includes('/')) {\n const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));\n try {\n await workspace.filesystem.mkdir(dirPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n }\n\n const content = file.encoding === 'base64' ? Buffer.from(file.content, 'base64') : file.content;\n await workspace.filesystem.writeFile(filePath, content);\n filesWritten++;\n }\n\n // Update metadata with new install time and branch\n const updatedMeta: SkillMetaFile = {\n ...meta,\n branch: fetchResult.branch,\n installedAt: new Date().toISOString(),\n };\n await workspace.filesystem.writeFile(metaPath, JSON.stringify(updatedMeta, null, 2));\n filesWritten++;\n\n // Surgically update the skills cache for the updated skill\n if (workspace.skills?.addSkill) {\n try {\n await workspace.skills.addSkill(installPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after update: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n results.push({\n skillName: skill,\n success: true,\n filesWritten,\n });\n } catch (error) {\n results.push({\n skillName: skill,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return { updated: results };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error updating skills');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_ROUTES = [\n WORKSPACE_SKILLS_SH_SEARCH_ROUTE,\n WORKSPACE_SKILLS_SH_POPULAR_ROUTE,\n WORKSPACE_SKILLS_SH_PREVIEW_ROUTE,\n WORKSPACE_SKILLS_SH_INSTALL_ROUTE,\n WORKSPACE_SKILLS_SH_REMOVE_ROUTE,\n WORKSPACE_SKILLS_SH_UPDATE_ROUTE,\n];\n\n// =============================================================================\n// Route Collections\n// =============================================================================\n\nexport const WORKSPACE_FS_ROUTES = [\n WORKSPACE_FS_READ_ROUTE,\n WORKSPACE_FS_WRITE_ROUTE,\n WORKSPACE_FS_LIST_ROUTE,\n WORKSPACE_FS_DELETE_ROUTE,\n WORKSPACE_FS_MKDIR_ROUTE,\n WORKSPACE_FS_STAT_ROUTE,\n];\n\nexport const WORKSPACE_SEARCH_ROUTES = [WORKSPACE_SEARCH_ROUTE, WORKSPACE_INDEX_ROUTE];\n\n// IMPORTANT: Search route must come before the parameterized routes\n// to avoid /api/workspace/skills/search being matched as /api/workspace/skills/:skillName\nexport const WORKSPACE_SKILLS_ROUTES = [\n WORKSPACE_SEARCH_SKILLS_ROUTE,\n WORKSPACE_LIST_SKILLS_ROUTE,\n WORKSPACE_GET_SKILL_ROUTE,\n WORKSPACE_LIST_SKILL_REFERENCES_ROUTE,\n WORKSPACE_GET_SKILL_REFERENCE_ROUTE,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,MAAM,gBAAgB;;;;;AAUtB,SAAS,sBAAsB,IAAwC;CACrE,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,YAAY,YAAY,MAAM,GAAG,kBAAkB;AAClF;;;;;AAMA,SAAS,0BAA0B,OAAyB;CAC1D,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAGhD,IAAI,UAAU,SAAS,MAAM,SAAS,UAAU,OAAO;CAGvD,IAAI,UAAU,OAAO;EACnB,MAAM,OAAO,MAAM;EACnB,IAAI,SAAS,uBAAuB,SAAS,0BAA0B,OAAO;CAChF;CAEA,OAAO;AACT;;;;;AAMA,SAAS,4BAA4B,OAAyB;CAC5D,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAEhD,IAAI,UAAU,SAAS,MAAM,SAAS,UAAU,OAAO;CAEvD,IAAI,UAAU,SAAS,MAAM,SAAS,mBAAmB,OAAO;CAEhE,OAAO;AACT;;;;;;AAOA,SAAS,qBAAqB,OAAgB,gBAA+B;CAC3E,IAAI,0BAA0B,KAAK,GAAG;EACpC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;EACzD,MAAM,IAAI,cAAc,KAAK,EAAE,QAAQ,CAAC;CAC1C;CACA,IAAI,4BAA4B,KAAK,GAAG;EACtC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;EACzD,MAAM,IAAI,cAAc,KAAK,EAAE,QAAQ,CAAC;CAC1C;CACA,OAAO,YAAY,OAAO,cAAc;AAC1C;;;;AAKA,SAAS,4BAAkC;CACzC,IAAI,CAAC,aAAa,IAAI,eAAe,GACnC,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,iGACX,CAAC;AAEL;;;;;;;AAQA,eAAe,iBAAiB,QAAa,aAAqD;CAChG,0BAA0B;CAG1B,MAAM,kBAAkB,OAAO,eAAe;CAC9C,IAAI,iBAAiB,OAAO,aAC1B,OAAO;CAIT,IAAI,OAAO,OAAO,qBAAqB,YACrC,IAAI;EACF,OAAO,OAAO,iBAAiB,WAAW;CAC5C,QAAQ;EAEN;CACF;CAIF,MAAM,SAAS,OAAO,aAAa,KAAK,CAAC;CACzC,KAAK,MAAM,SAAS,OAAO,OAAO,MAAM,GACtC,IAAK,MAAc,kBAAkB,GAAG;EACtC,MAAM,iBAAiB,MAAO,MAAc,eAAe;EAC3D,IAAI,gBAAgB,OAAO,aACzB,OAAO;CAEX;AAIJ;;;;;AAMA,eAAe,cAAc,QAAa,aAA2D;CAEnG,QAAO,MADiB,iBAAiB,QAAQ,WAAW,EAAA,EAC1C;AACpB;;;;;;;;;AAUA,SAAS,mBAAmB,GAAmB;CAC7C,OAAO,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAC5D;AAEA,SAAS,sBAAsB,YAAiC,aAAqB,gBAAiC;CACpH,IAAI,sBAAsB,UAAU,GAAG;EACrC,IAAI,gBAAgB;GAElB,MAAM,UAAU,WAAW,OAAO,IAAI,cAAc;GACpD,IAAI,CAAC,SACH,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,UAAU,eAAe,iCAAiC,WAAW,WAAW,KAAK,IAAI,IACpG,CAAC;GAEH,IAAI,QAAQ,UACV,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,UAAU,eAAe,gBAAgB,CAAC;GAEpF,OAAO,GAAG,mBAAmB,cAAc,EAAE,GAAG,cAAc,GAAG;EACnE;EAGA,KAAK,MAAM,CAAC,WAAW,YAAY,WAAW,QAC5C,IAAI,CAAC,QAAQ,UACX,OAAO,GAAG,mBAAmB,SAAS,EAAE,GAAG,cAAc,GAAG;EAIhE,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qDAAqD,CAAC;CAChG;CAGA,OAAO,GAAG,cAAc,GAAG;AAC7B;AAMA,MAAa,wBAAwB,YAAY;CAC/C,QAAQ;CACR,MAAM;CACN,cAAc;CACd,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,aAAa;EAC7B,IAAI;GACF,0BAA0B;GAE1B,MAAM,aAkBD,CAAC;GAKN,IAAI,OAAO,OAAO,mBAAmB,YAAY;IAC/C,MAAM,uBAAuB,OAAO,eAAe;IAEnD,KAAK,MAAM,GAAG,UAAU,OAAO,QAAQ,oBAAoB,GAAG;KAG5D,MAAM,KAAiB,MAAc,aAAa;KAClD,MAAM,SAA8B,MAAc,UAAU;KAC5D,MAAM,UAA+B,MAAc;KACnD,MAAM,YAAiC,MAAc;KAErD,WAAW,KAAK;MACd,IAAI,GAAG;MACP,MAAM,GAAG;MACT,QAAQ,GAAG;MACX;MACA,GAAI,WAAW,WAAW,UAAU;OAAE;OAAS,GAAI,aAAa,OAAO,EAAE,UAAU,IAAI,CAAC;MAAG,IAAI,CAAC;MAChG,cAAc;OACZ,eAAe,CAAC,CAAC,GAAG;OACpB,YAAY,CAAC,CAAC,GAAG;OACjB,SAAS,GAAG;OACZ,WAAW,GAAG;OACd,WAAW,GAAG;OACd,WAAW,CAAC,CAAC,GAAG;MAClB;MACA,QAAQ,EACN,UAAU,GAAG,YAAY,YAAY,MACvC;KACF,CAAC;IACH;GACF,OAAO;IAGL,MAAM,0BAAU,IAAI,IAAY;IAChC,MAAM,kBAAkB,OAAO,eAAe;IAC9C,IAAI,iBAAiB;KACnB,QAAQ,IAAI,gBAAgB,EAAE;KAC9B,WAAW,KAAK;MACd,IAAI,gBAAgB;MACpB,MAAM,gBAAgB;MACtB,QAAQ,gBAAgB;MACxB,QAAQ;MACR,cAAc;OACZ,eAAe,CAAC,CAAC,gBAAgB;OACjC,YAAY,CAAC,CAAC,gBAAgB;OAC9B,SAAS,gBAAgB;OACzB,WAAW,gBAAgB;OAC3B,WAAW,gBAAgB;OAC3B,WAAW,CAAC,CAAC,gBAAgB;MAC/B;MACA,QAAQ,EACN,UAAU,gBAAgB,YAAY,YAAY,MACpD;KACF,CAAC;IACH;IAEA,MAAM,SAAS,OAAO,aAAa,KAAK,CAAC;IACzC,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,MAAM,GAClD,IAAK,MAAc,kBAAkB,GACnC,IAAI;KACF,MAAM,iBAAiB,MAAO,MAAc,eAAe;KAC3D,IAAI,kBAAkB,CAAC,QAAQ,IAAI,eAAe,EAAE,GAAG;MACrD,QAAQ,IAAI,eAAe,EAAE;MAC7B,WAAW,KAAK;OACd,IAAI,eAAe;OACnB,MAAM,eAAe;OACrB,QAAQ,eAAe;OACvB,QAAQ;OACR;OACA,WAAY,MAAc;OAC1B,cAAc;QACZ,eAAe,CAAC,CAAC,eAAe;QAChC,YAAY,CAAC,CAAC,eAAe;QAC7B,SAAS,eAAe;QACxB,WAAW,eAAe;QAC1B,WAAW,eAAe;QAC1B,WAAW,CAAC,CAAC,eAAe;OAC9B;OACA,QAAQ,EACN,UAAU,eAAe,YAAY,YAAY,MACnD;MACF,CAAC;KACH;IACF,QAAQ;KACN;IACF;GAGN;GAEA,OAAO,EAAE,WAAW;EACtB,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,0BAA0B;EAC/D;CACF;AACF,CAAC;AAMD,MAAa,sBAAsB,YAAY;CAC7C,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,kBAAkB;EAC1C,IAAI;GACF,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAE5D,IAAI,CAAC,WACH,OAAO,EACL,uBAAuB,MACzB;GAGF,MAAM,SAAS,MAAM,UAAU,YAAY,UAAU;GAGrD,IAAI;GAWJ,IAAI,sBAAsB,UAAU,UAAU,GAAG;IAC/C,SAAS,CAAC;IACV,KAAK,MAAM,CAAC,WAAW,YAAY,UAAU,WAAW,QACtD,IAAI;KACF,MAAM,OAAO,MAAM,QAAQ,UAAU;KACrC,OAAO,KAAK;MACV,MAAM;MACN,UAAU,MAAM,YAAY,QAAQ,YAAY;MAChD,UAAU,QAAQ,YAAY;MAC9B,aAAa,QAAQ,eAAe,MAAM,QAAQ,QAAQ;MAC1D,MAAM,MAAM;MACZ,MAAM,QAAQ;KAChB,CAAC;IACH,QAAQ;KACN,OAAO,KAAK;MACV,MAAM;MACN,UAAU,QAAQ,YAAY;MAC9B,UAAU,QAAQ,YAAY;MAC9B,MAAM,QAAQ;KAChB,CAAC;IACH;GAEJ;GAEA,OAAO;IACL,uBAAuB;IACvB,IAAI,UAAU;IACd,MAAM,UAAU;IAChB,QAAQ,UAAU;IAClB,cAAc;KACZ,eAAe,CAAC,CAAC,UAAU;KAC3B,YAAY,CAAC,CAAC,UAAU;KACxB,SAAS,UAAU;KACnB,WAAW,UAAU;KACrB,WAAW,UAAU;KACrB,WAAW,CAAC,CAAC,UAAU;IACzB;IACA,QAAQ,EACN,UAAU,UAAU,YAAY,YAAY,MAC9C;IACA,YAAY,SACR;KACE,IAAI,OAAO;KACX,MAAM,OAAO;KACb,UAAU,OAAO;KACjB,QAAQ,OAAO;KACf,OAAO,OAAO;KACd,UAAU,OAAO;KACjB,MAAM,OAAO;KACb,UAAU,OAAO;IACnB,IACA,KAAA;IACJ;GACF;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,8BAA8B;EACnE;CACF;AACF,CAAC;AAMD,MAAa,0BAA0B,YAAY;CACjD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,UAAU,kBAAkB;EAC1D,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,MACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,mBAAmB,CAAC;GAG9D,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,MAAM,cAAc;GAGpB,IAAI,CAAE,MAAM,UAAU,WAAW,OAAO,WAAW,GACjD,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,SAAS,YAAY,aAAa,CAAC;GAI7E,MAAM,UAAU,MAAM,UAAU,WAAW,SAAS,aAAa,EAC/D,UAAW,YAA+B,QAC5C,CAAC;GAED,OAAO;IACL,MAAM;IACN,SAAS,OAAO,YAAY,WAAW,UAAU,QAAQ,SAAS,OAAO;IACzE,MAAM;GACR;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,oBAAoB;EACzD;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,YAAY;CAClD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,SAAS,UAAU,WAAW,kBAAkB;EAC9E,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,QAAQ,YAAY,KAAA,GACvB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,gCAAgC,CAAC;GAG3E,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,YAAY,UACxB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,iCAAiC,CAAC;GAG5E,MAAM,cAAc;GAGpB,IAAI,cAA+B;GACnC,IAAI,aAAa,UACf,cAAc,OAAO,KAAK,SAAS,QAAQ;GAG7C,MAAM,UAAU,WAAW,UAAU,aAAa,aAAa,EAAE,WAAW,aAAa,KAAK,CAAC;GAE/F,OAAO;IACL,SAAS;IACT,MAAM;GACR;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,oBAAoB;EACzD;CACF;AACF,CAAC;AAED,MAAa,0BAA0B,YAAY;CACjD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,WAAW,kBAAkB;EAC3D,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,MACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,mBAAmB,CAAC;GAG9D,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,OAAO;IACL;IACA,SAAS,CAAC;IACV,OAAO;GACT;GAGF,MAAM,cAAc;GAGpB,IAAI,CAAE,MAAM,UAAU,WAAW,OAAO,WAAW,GACjD,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,SAAS,YAAY,aAAa,CAAC;GAK7E,OAAO;IACL,MAAM;IACN,SAAA,MAJoB,UAAU,WAAW,QAAQ,aAAa,EAAE,UAAU,CAAC;GAK7E;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,yBAAyB;EAC9D;CACF;AACF,CAAC;AAED,MAAa,4BAA4B,YAAY;CACnD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,WAAW,OAAO,kBAAkB;EAClE,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,MACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,mBAAmB,CAAC;GAG9D,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,YAAY,UACxB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,iCAAiC,CAAC;GAG5E,MAAM,cAAc;GAGpB,MAAM,SAAS,MAAM,UAAU,WAAW,OAAO,WAAW;GAC5D,IAAI,CAAC,UAAU,CAAC,OACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,SAAS,YAAY,aAAa,CAAC;GAG7E,IAAI,QAEF,IAAI;IACF,MAAM,UAAU,WAAW,WAAW,aAAa,EAAE,MAAM,CAAC;GAC9D,QAAQ;IACN,MAAM,UAAU,WAAW,MAAM,aAAa;KAAE;KAAW;IAAM,CAAC;GACpE;GAGF,OAAO;IACL,SAAS;IACT,MAAM;GACR;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,qBAAqB;EAC1D;CACF;AACF,CAAC;AAED,MAAa,2BAA2B,YAAY;CAClD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,WAAW,kBAAkB;EAC3D,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,MACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,mBAAmB,CAAC;GAG9D,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,YAAY,UACxB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,iCAAiC,CAAC;GAG5E,MAAM,cAAc;GAEpB,MAAM,UAAU,WAAW,MAAM,aAAa,EAAE,WAAW,aAAa,KAAK,CAAC;GAE9E,OAAO;IACL,SAAS;IACT,MAAM;GACR;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,0BAA0B;EAC/D;CACF;AACF,CAAC;AAED,MAAa,0BAA0B,YAAY;CACjD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,kBAAkB;EAChD,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,MACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,mBAAmB,CAAC;GAG9D,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WAAW,YACd,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,MAAM,cAAc;GAGpB,IAAI,CAAE,MAAM,UAAU,WAAW,OAAO,WAAW,GACjD,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,SAAS,YAAY,aAAa,CAAC;GAG7E,MAAM,OAAO,MAAM,UAAU,WAAW,KAAK,WAAW;GAExD,OAAO;IACL,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX,WAAW,KAAK,WAAW,YAAY;IACvC,YAAY,KAAK,YAAY,YAAY;IACzC,UAAU,KAAK;GACjB;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,yBAAyB;EAC9D;CACF;AACF,CAAC;AAMD,MAAa,yBAAyB,YAAY;CAChD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,UAAU,kBAAkB;EACvE,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,OACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,2BAA2B,CAAC;GAGtE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WACH,OAAO;IACL,SAAS,CAAC;IACV;IACA,MAAM,QAAQ;GAChB;GAKF,IAAI,EADc,UAAU,WAAW,UAAU,YAE/C,OAAO;IACL,SAAS,CAAC;IACV;IACA,MAAM,QAAQ;GAChB;GAIF,IAAI,aAAa;GACjB,IAAI,CAAC,YAAY;IACf,IAAI,UAAU,WACZ,aAAa;SACR,IAAI,UAAU,WACnB,aAAa;SAEb,aAAa;GAEjB;GAQA,OAAO;IACL,UAAS,MAPW,UAAU,OAAO,OAAO;KAC5C,MAAM,QAAQ;KACd,MAAM;KACN;IACF,CAAC,EAAA,CAGkB,KAAI,OAAM;KACzB,IAAI,EAAE;KACN,SAAS,EAAE;KACX,OAAO,EAAE;KACT,WAAW,EAAE;KACb,cAAc,EAAE;IAClB,EAAE;IACF;IACA,MAAM;GACR;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,2BAA2B;EAChE;CACF;AACF,CAAC;AAED,MAAa,wBAAwB,YAAY;CAC/C,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,WAAW;CAClB,SAAS,OAAO,EAAE,QAAQ,MAAM,SAAS,UAAU,kBAAkB;EACnE,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,QAAQ,YAAY,KAAA,GACvB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,gCAAgC,CAAC;GAG3E,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,0BAA0B,CAAC;GAIrE,IAAI,EADc,UAAU,WAAW,UAAU,YAE/C,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,4CAA4C,CAAC;GAGvF,MAAM,UAAU,MAAM,MAAM,SAAS,EAAE,SAAS,CAAC;GAEjD,OAAO;IACL,SAAS;IACT;GACF;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,wBAAwB;EAC7D;CACF;AACF,CAAC;;AAOD,MAAM,wBAAwB,GAAG,cAAc;AAE/C,MAAa,8BAA8B,YAAY;CACrD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,aAAa,qBAAqB;EAC1D,IAAI;GACF,0BAA0B;GAE1B,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,MAAM,SAAS,WAAW;GAC1B,IAAI,CAAC,QACH,OAAO;IAAE,QAAQ,CAAC;IAAG,oBAAoB;GAAM;GAIjD,MAAM,OAAO,aAAa,EAAE,eAAe,CAAC;GAE5C,MAAM,aAAa,MAAM,OAAO,KAAK;GAoCrC,OAAO;IACL,QAAQ,MAlCmB,QAAQ,IACnC,WAAW,IAAI,OAAM,cAAa;KAChC,IAAI;KAKJ,IAAI,UAAU,KAAK,SAAS,qBAAqB,KAAK,UAAU,YAC9D,IAAI;MACF,MAAM,WAAW,GAAG,UAAU,KAAK;MACnC,MAAM,cAAc,MAAM,UAAU,WAAW,SAAS,QAAQ;MAChE,MAAM,WAAW,OAAO,gBAAgB,WAAW,cAAc,YAAY,SAAS,OAAO;MAC7F,MAAM,OAAO,KAAK,MAAM,QAAQ;MAChC,IAAI,KAAK,SAAS,KAAK,MACrB,iBAAiB;OAAE,OAAO,KAAK;OAAO,MAAM,KAAK;MAAK;KAE1D,QAAQ,CAER;KAGF,OAAO;MACL,MAAM,UAAU;MAChB,aAAa,UAAU;MACvB,SAAS,UAAU;MACnB,eAAe,UAAU;MACzB,UAAU,UAAU;MACpB,MAAM,UAAU;MAChB;KACF;IACF,CAAC,CACH;IAIE,oBAAoB;GACtB;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,sBAAsB;EAC3D;CACF;AACF,CAAC;AAED,MAAa,4BAA4B,YAAY;CACnD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,WAAW,MAAM,aAAa,qBAAqB;EAC3E,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,yBAAyB,CAAC;GAIpE,MAAM,aAAa,QAAQ;GAE3B,MAAM,SAAS,MAAM,cAAc,QAAQ,WAAW;GACtD,IAAI,CAAC,QACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sCAAsC,CAAC;GAIjF,MAAM,OAAO,aAAa,EAAE,eAAe,CAAC;GAE5C,MAAM,QAAQ,MAAM,OAAO,IAAI,UAAU;GACzC,IAAI,CAAC,OACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,UAAU,WAAW,aAAa,CAAC;GAG7E,OAAO;IACL,MAAM,MAAM;IACZ,aAAa,MAAM;IACnB,SAAS,MAAM;IACf,eAAe,MAAM;IACrB,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ,cAAc,MAAM;IACpB,QAAQ,MAAM;IACd,YAAY,MAAM;IAClB,SAAS,MAAM;IACf,QAAQ,MAAM;GAChB;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,qBAAqB;EAC1D;CACF;AACF,CAAC;AAED,MAAa,wCAAwC,YAAY;CAC/D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,WAAW,MAAM,aAAa,qBAAqB;EAC3E,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,yBAAyB,CAAC;GAIpE,MAAM,aAAa,QAAQ;GAE3B,MAAM,SAAS,MAAM,cAAc,QAAQ,WAAW;GACtD,IAAI,CAAC,QACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sCAAsC,CAAC;GAIjF,MAAM,OAAO,aAAa,EAAE,eAAe,CAAC;GAE5C,MAAM,QAAQ,MAAM,OAAO,IAAI,UAAU;GACzC,IAAI,CAAC,OACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,UAAU,WAAW,aAAa,CAAC;GAG7E,MAAM,aAAa,MAAM,OAAO,eAAe,UAAU;GAEzD,OAAO;IACL,WAAW,MAAM;IACjB;GACF;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,gCAAgC;EACrE;CACF;AACF,CAAC;AAED,MAAa,sCAAsC,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,WAAW,MAAM,WAAW,eAAe,aAAa,qBAAqB;EACrG,IAAI;GACF,0BAA0B;GAG1B,MAAM,aAAa,aAAa;GAEhC,MAAM,SAAS,MAAM,cAAc,QAAQ,WAAW;GACtD,IAAI,CAAC,QACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sCAAsC,CAAC;GAIjF,MAAM,OAAO,aAAa,EAAE,eAAe,CAAC;GAG5C,MAAM,QAAQ,MAAM,OAAO,IAAI,UAAU;GACzC,IAAI,CAAC,OACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,UAAU,WAAW,aAAa,CAAC;GAG7E,MAAM,cAAc;GAGpB,mBAAmB,WAAW;GAI9B,MAAM,UAAU,MAAM,OAAO,aAAa,YAAY,cAAc,aAAa;GACjF,IAAI,YAAY,MACd,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,cAAc,YAAY,wBAAwB,WAAW,GACxE,CAAC;GAGH,OAAO;IACL,WAAW,MAAM;IACjB,eAAe;IACf;GACF;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,+BAA+B;EACpE;CACF;AACF,CAAC;AAED,MAAa,gCAAgC,YAAY;CACvD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,OAAO,MAAM,UAAU,YAAY,mBAAmB,aAAa,qBAAqB;EAChH,IAAI;GACF,0BAA0B;GAE1B,IAAI,CAAC,OACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,2BAA2B,CAAC;GAGtE,MAAM,SAAS,MAAM,cAAc,QAAQ,WAAW;GACtD,IAAI,CAAC,QACH,OAAO;IACL,SAAS,CAAC;IACV;GACF;GAIF,MAAM,OAAO,aAAa,EAAE,eAAe,CAAC;GAG5C,MAAM,iBAAiB,aAAa,WAAW,MAAM,GAAG,CAAC,CAAC,KAAK,MAAc,EAAE,KAAK,CAAC,IAAI,KAAA;GASzF,OAAO;IACL,UAAS,MARW,OAAO,OAAO,OAAO;KACzC,MAAM,QAAQ;KACd;KACA,YAAY;KACZ,mBAAmB,qBAAqB;IAC1C,CAAC,EAAA,CAGkB,KAAI,OAAM;KACzB,WAAW,EAAE;KACb,WAAW,EAAE;KACb,QAAQ,EAAE;KACV,SAAS,EAAE;KACX,OAAO,EAAE;KACT,WAAW,EAAE;KACb,cAAc,EAAE;IAClB,EAAE;IACF;GACF;EACF,SAAS,OAAO;GACd,OAAO,qBAAqB,OAAO,wBAAwB;EAC7D;CACF;AACF,CAAC;AAMD,MAAM,oBAAoB;AAE1B,MAAa,mCAAmC,YAAY;CAC1D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,GAAG,YAAY;EAC/B,IAAI;GACF,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,YAAY,iBAAiB,WAAW,MAAM,GAAG,GAAK;GAE5D,MAAM,MAAM,GAAG,kBAAkB,oBAAoB,mBAAmB,CAAC,EAAE,YAAY;GACvF,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;GAC/D,aAAa,SAAS;GAEtB,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,qBAAqB,SAAS,OAAO,GAAG,SAAS,aAC5D,CAAC;GAGH,MAAM,OAAQ,MAAM,SAAS,KAAK;GAgBlC,OAAO;IACL,OAAO;IACP,YAAY;IACZ,QAAQ,KAAK,OAAO,KAAI,OAAM;KAAE,IAAI,EAAE;KAAS,MAAM,EAAE;KAAM,UAAU,EAAE;KAAU,WAAW,EAAE;IAAO,EAAE;IACzG,OAAO,KAAK;GACd;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,wBAAwB;EACpD;CACF;AACF,CAAC;AAED,MAAa,oCAAoC,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,OAAO,aAAa;EACpC,IAAI;GACF,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,YAAY,iBAAiB,WAAW,MAAM,GAAG,GAAK;GAE5D,MAAM,OAAO,SAAS,IAAI,KAAK,MAAM,SAAS,KAAK,IAAI,IAAI;GAC3D,MAAM,MAAM,GAAG,kBAAkB,2BAA2B,MAAM,QAAQ;GAC1E,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;GAC/D,aAAa,SAAS;GAEtB,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,qBAAqB,SAAS,OAAO,GAAG,SAAS,aAC5D,CAAC;GAGH,MAAM,OAAQ,MAAM,SAAS,KAAK;GAalC,OAAO;IACL,QAAQ,KAAK,OAAO,KAAI,OAAM;KAAE,IAAI,EAAE;KAAS,MAAM,EAAE;KAAM,UAAU,EAAE;KAAU,WAAW,EAAE;IAAO,EAAE;IACzG,OAAO,KAAK;IACZ;IACA;GACF;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,+BAA+B;EAC3D;CACF;AACF,CAAC;;;;;AAUD,MAAM,mBAAmB;AAEzB,SAAS,oBAAoB,MAAsB;CACjD,IAAI,CAAC,iBAAiB,KAAK,IAAI,GAC7B,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,uBAAuB,KAAK,oGACvC,CAAC;CAEH,OAAO;AACT;;;;;AAMA,SAAS,mBAAmB,UAA0B;CAEpD,IAAI,SAAS,WAAW,GAAG,KAAK,aAAa,KAAK,QAAQ,GACxD,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,sBAAsB,SAAS,oCAC1C,CAAC;CAGH,MAAM,WAAW,SAAS,MAAM,GAAG;CACnC,KAAK,MAAM,WAAW,UACpB,IAAI,YAAY,QAAQ,YAAY,KAClC,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,sBAAsB,SAAS,mCAC1C,CAAC;CAGL,OAAO;AACT;;;;;AAoBA,eAAe,gBAAgB,OAAe,MAAc,WAAuD;CACjH,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,YAAY,iBAAiB,WAAW,MAAM,GAAG,GAAK;CAE5D,MAAM,MAAM,GAAG,kBAAkB,cAAc,mBAAmB,KAAK,EAAE,GAAG,mBAAmB,IAAI,EAAE,GAAG,mBAAmB,SAAS,EAAE;CACtI,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;CAC/D,aAAa,SAAS;CAEtB,IAAI,CAAC,SAAS,IAAI;EAChB,IAAI,SAAS,WAAW,KACtB,OAAO;EAET,MAAM,IAAI,MAAM,qBAAqB,SAAS,OAAO,GAAG,SAAS,YAAY;CAC/E;CAEA,OAAQ,MAAM,SAAS,KAAK;AAC9B;AAMA,MAAa,oCAAoC,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,OAAO,MAAM,MAAM,gBAAgB;EACnD,IAAI;GACF,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,YAAY,iBAAiB,WAAW,MAAM,GAAG,GAAK;GAE5D,MAAM,MAAM,GAAG,kBAAkB,cAAc,mBAAmB,KAAK,EAAE,GAAG,mBAAmB,IAAI,EAAE,GAAG,mBAAmB,SAAS,EAAE;GACtI,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;GAC/D,aAAa,SAAS;GAEtB,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,yBAAyB,UAAU,QAAQ,MAAM,GAAG,OAC/D,CAAC;GAGH,MAAM,OAAQ,MAAM,SAAS,KAAK;GAClC,MAAM,UAAU,KAAK,gBAAgB,KAAK,OAAO;GAEjD,IAAI,CAAC,SACH,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,mCAAmC,UAAU,GACxD,CAAC;GAGH,OAAO,EAAE,QAAQ;EACnB,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,8BAA8B;EAC1D;CACF;AACF,CAAC;AAMD,MAAa,oCAAoC,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,aAAa,OAAO,MAAM,WAAW,YAAY;EACzE,IAAI;GACF,0BAA0B;GAE1B,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sBAAsB,CAAC;GAGjE,IAAI,CAAC,UAAU,YACb,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,WAAW,UACvB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,yBAAyB,CAAC;GAIpE,MAAM,SAAS,MAAM,gBAAgB,OAAO,MAAM,SAAS;GAC3D,IAAI,CAAC,UAAU,OAAO,MAAM,WAAW,GACrC,MAAM,IAAI,cAAc,KAAK,EAC3B,SAAS,yBAAyB,UAAU,OAAO,MAAM,GAAG,KAAK,GACnE,CAAC;GAIH,MAAM,cAAc,oBAAoB,OAAO,OAAO;GACtD,MAAM,cAAc,sBAAsB,UAAU,YAAY,aAAa,KAAK;GAGlF,IAAI;IACF,MAAM,UAAU,WAAW,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;GACnE,QAAQ,CAER;GAGA,IAAI,eAAe;GACnB,KAAK,MAAM,QAAQ,OAAO,OAAO;IAE/B,MAAM,WAAW,mBAAmB,KAAK,IAAI;IAC7C,MAAM,WAAW,GAAG,YAAY,GAAG;IAGnC,IAAI,SAAS,SAAS,GAAG,GAAG;KAC1B,MAAM,UAAU,SAAS,UAAU,GAAG,SAAS,YAAY,GAAG,CAAC;KAC/D,IAAI;MACF,MAAM,UAAU,WAAW,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;KAC/D,QAAQ,CAER;IACF;IAEA,MAAM,UAAU,KAAK,aAAa,WAAW,OAAO,KAAK,KAAK,SAAS,QAAQ,IAAI,KAAK;IACxF,MAAM,UAAU,WAAW,UAAU,UAAU,OAAO;IACtD;GACF;GAGA,MAAM,WAAW;IACf,WAAW,OAAO;IAClB,OAAO,OAAO;IACd,MAAM,OAAO;IACb,QAAQ,OAAO;IACf,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;GACtC;GACA,MAAM,UAAU,WAAW,UAAU,GAAG,YAAY,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;GACnG;GAGA,IAAI,UAAU,QAAQ,UACpB,IAAI;IACF,MAAM,UAAU,OAAO,SAAS,WAAW;GAC7C,SAAS,YAAY;IACnB,QAAQ,KACN,qDAAqD,sBAAsB,QAAQ,WAAW,UAAU,OAAO,UAAU,GAC3H;GACF;GAGF,OAAO;IACL,SAAS;IACT,WAAW,OAAO;IAClB,eAAe;IACf;GACF;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,wBAAwB;EACpD;CACF;AACF,CAAC;AAaD,MAAa,mCAAmC,YAAY;CAC1D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,aAAa,gBAAgB;EACrD,IAAI;GACF,0BAA0B;GAE1B,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sBAAsB,CAAC;GAGjE,IAAI,CAAC,UAAU,YACb,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,WAAW,UACvB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,yBAAyB,CAAC;GAIpE,MAAM,gBAAgB,oBAAoB,SAAS;GAOnD,MAAM,cADgB,MADE,UAAU,QAAQ,KAAK,EAAA,EACd,MAAK,MAAK,EAAE,SAAS,iBAAiB,EAAE,KAAK,SAAS,qBAAqB,CAAC,EAAA,EAC5E,QAAQ,sBAAsB,UAAU,YAAY,aAAa;GAGlG,IAAI;IACF,MAAM,UAAU,WAAW,KAAK,SAAS;GAC3C,QAAQ;IACN,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,UAAU,UAAU,iBAAiB,YAAY,CAAC;GAC5F;GAGA,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;GAG/D,IAAI,UAAU,QAAQ,aACpB,IAAI;IACF,MAAM,UAAU,OAAO,YAAY,SAAS;GAC9C,SAAS,YAAY;IACnB,QAAQ,KACN,oDAAoD,sBAAsB,QAAQ,WAAW,UAAU,OAAO,UAAU,GAC1H;GACF;GAGF,OAAO;IACL,SAAS;IACT;IACA,aAAa;GACf;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,sBAAsB;EAClD;CACF;AACF,CAAC;AAED,MAAa,mCAAmC,YAAY;CAC1D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,aAAa,QAAQ;CAC5B,SAAS,OAAO,EAAE,QAAQ,aAAa,gBAAgB;EACrD,IAAI;GACF,0BAA0B;GAE1B,MAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;GAC5D,IAAI,CAAC,WACH,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,sBAAsB,CAAC;GAGjE,IAAI,CAAC,UAAU,YACb,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,qCAAqC,CAAC;GAGhF,IAAI,UAAU,WAAW,UACvB,MAAM,IAAI,cAAc,KAAK,EAAE,SAAS,yBAAyB,CAAC;GAGpE,MAAM,UAKD,CAAC;GAIN,IAAI;GAEJ,IAAI,WAAW;IACb,MAAM,WAAW,oBAAoB,SAAS;IAI9C,MAAM,mBAAkB,MADA,UAAU,QAAQ,KAAK,EAAA,EACZ,MAAK,MAAK,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,qBAAqB,CAAC;IAC1G,IAAI;IACJ,IAAI,iBAAiB,MAEnB,WAAW,gBAAgB,KAAK,UAAU,GAAG,gBAAgB,KAAK,YAAY,GAAG,CAAC;SAElF,WAAW;IAEb,iBAAiB,CAAC;KAAE,MAAM;KAAU;IAAS,CAAC;GAChD,OAAO;IAEL,iBAAiB,CAAC;IAClB,MAAM,aAAuB,CAAC;IAE9B,IAAI,sBAAsB,UAAU,UAAU,GACvC;UAAA,MAAM,CAAC,WAAW,YAAY,UAAU,WAAW,QACtD,IAAI,CAAC,QAAQ,UACX,WAAW,KAAK,GAAG,mBAAmB,SAAS,EAAE,GAAG,eAAe;IAAA,OAIvE,WAAW,KAAK,aAAa;IAG/B,KAAK,MAAM,OAAO,YAChB,IAAI;KACF,MAAM,UAAU,MAAM,UAAU,WAAW,QAAQ,GAAG;KACtD,KAAK,MAAM,KAAK,SACd,IAAI,EAAE,SAAS,aACb,eAAe,KAAK;MAAE,MAAM,EAAE;MAAM,UAAU;KAAI,CAAC;IAGzD,QAAQ,CAER;IAGF,IAAI,eAAe,WAAW,GAC5B,OAAO,EAAE,SAAS,CAAC,EAAE;GAEzB;GAEA,KAAK,MAAM,EAAE,MAAM,OAAO,cAAc,gBAAgB;IAEtD,IAAI;KACF,oBAAoB,KAAK;IAC3B,QAAQ;KACN,QAAQ,KAAK;MACX,WAAW;MACX,SAAS;MACT,OAAO;KACT,CAAC;KACD;IACF;IACA,MAAM,cAAc,GAAG,SAAS,GAAG;IACnC,MAAM,WAAW,GAAG,YAAY;IAChC,IAAI;KACF,MAAM,cAAc,MAAM,UAAU,WAAW,SAAS,UAAU,EAAE,UAAU,QAAQ,CAAC;KACvF,MAAM,OAAsB,KAAK,MAAM,WAAqB;KAG5D,MAAM,cAAc,MAAM,gBAAgB,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS;KAE/E,IAAI,CAAC,eAAe,YAAY,MAAM,WAAW,GAAG;MAClD,QAAQ,KAAK;OACX,WAAW;OACX,SAAS;OACT,OAAO;MACT,CAAC;MACD;KACF;KAEA,IAAI,eAAe;KAEnB,KAAK,MAAM,QAAQ,YAAY,OAAO;MAEpC,MAAM,WAAW,mBAAmB,KAAK,IAAI;MAC7C,MAAM,WAAW,GAAG,YAAY,GAAG;MAEnC,IAAI,SAAS,SAAS,GAAG,GAAG;OAC1B,MAAM,UAAU,SAAS,UAAU,GAAG,SAAS,YAAY,GAAG,CAAC;OAC/D,IAAI;QACF,MAAM,UAAU,WAAW,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;OAC/D,QAAQ,CAER;MACF;MAEA,MAAM,UAAU,KAAK,aAAa,WAAW,OAAO,KAAK,KAAK,SAAS,QAAQ,IAAI,KAAK;MACxF,MAAM,UAAU,WAAW,UAAU,UAAU,OAAO;MACtD;KACF;KAGA,MAAM,cAA6B;MACjC,GAAG;MACH,QAAQ,YAAY;MACpB,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;KACtC;KACA,MAAM,UAAU,WAAW,UAAU,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;KACnF;KAGA,IAAI,UAAU,QAAQ,UACpB,IAAI;MACF,MAAM,UAAU,OAAO,SAAS,WAAW;KAC7C,SAAS,YAAY;MACnB,QAAQ,KACN,oDAAoD,sBAAsB,QAAQ,WAAW,UAAU,OAAO,UAAU,GAC1H;KACF;KAGF,QAAQ,KAAK;MACX,WAAW;MACX,SAAS;MACT;KACF,CAAC;IACH,SAAS,OAAO;KACd,QAAQ,KAAK;MACX,WAAW;MACX,SAAS;MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;KAClD,CAAC;IACH;GACF;GAEA,OAAO,EAAE,SAAS,QAAQ;EAC5B,SAAS,OAAO;GACd,IAAI,iBAAiB,eACnB,MAAM;GAER,OAAO,YAAY,OAAO,uBAAuB;EACnD;CACF;AACF,CAAC;AAED,MAAa,6BAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;AACF;AAMA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,0BAA0B,CAAC,wBAAwB,qBAAqB;AAIrF,MAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -262,7 +262,7 @@ const GET_WORKSPACE_ROUTE = require_route_builder.createRoute({
|
|
|
262
262
|
path: mountPath,
|
|
263
263
|
provider: info?.provider ?? mountFs.provider ?? "unknown",
|
|
264
264
|
readOnly: mountFs.readOnly ?? false,
|
|
265
|
-
displayName: info?.name ?? mountFs.name,
|
|
265
|
+
displayName: mountFs.displayName ?? info?.name ?? mountFs.name,
|
|
266
266
|
icon: info?.icon,
|
|
267
267
|
name: mountFs.name
|
|
268
268
|
});
|
|
@@ -1306,4 +1306,4 @@ Object.defineProperty(exports, "workspace_exports", {
|
|
|
1306
1306
|
}
|
|
1307
1307
|
});
|
|
1308
1308
|
|
|
1309
|
-
//# sourceMappingURL=workspace-
|
|
1309
|
+
//# sourceMappingURL=workspace-d25MZ9dj.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-d25MZ9dj.cjs","names":["HTTPException","handleError","coreFeatures","createRoute","listWorkspacesResponseSchema","workspaceIdPathParams","workspaceInfoResponseSchema","fsReadQuerySchema","fsReadResponseSchema","fsWriteBodySchema","fsWriteResponseSchema","fsListQuerySchema","fsListResponseSchema","fsDeleteQuerySchema","fsDeleteResponseSchema","fsMkdirBodySchema","fsMkdirResponseSchema","fsStatQuerySchema","fsStatResponseSchema","searchQuerySchema","searchResponseSchema","indexBodySchema","indexResponseSchema","listSkillsResponseSchema","skillNamePathParams","skillDisambiguationQuerySchema","getSkillResponseSchema","listReferencesResponseSchema","skillReferencePathParams","skillReferenceResponseSchema","searchSkillsQuerySchema","searchSkillsResponseSchema","skillsShSearchQuerySchema","skillsShSearchResponseSchema","skillsShPopularQuerySchema","skillsShListResponseSchema","skillsShPreviewQuerySchema","skillsShPreviewResponseSchema","skillsShInstallBodySchema","skillsShInstallResponseSchema","skillsShRemoveBodySchema","skillsShRemoveResponseSchema","skillsShUpdateBodySchema","skillsShUpdateResponseSchema"],"sources":["../src/server/handlers/workspace.ts"],"sourcesContent":["/**\n * Workspace Handlers\n *\n * Unified handlers for workspace operations including:\n * - Filesystem operations (read, write, list, delete, mkdir, stat)\n * - Search operations (search, index)\n * - Skills operations (list, get, search, references)\n */\n\nimport { coreFeatures } from '@mastra/core/features';\nimport type { Workspace, WorkspaceSkills, WorkspaceFilesystem, CompositeFilesystem } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n // Workspace info\n workspaceInfoResponseSchema,\n listWorkspacesResponseSchema,\n workspaceIdPathParams,\n // Filesystem schemas\n fsReadQuerySchema,\n fsListQuerySchema,\n fsStatQuerySchema,\n fsDeleteQuerySchema,\n fsWriteBodySchema,\n fsMkdirBodySchema,\n fsReadResponseSchema,\n fsWriteResponseSchema,\n fsListResponseSchema,\n fsDeleteResponseSchema,\n fsMkdirResponseSchema,\n fsStatResponseSchema,\n // Search schemas\n searchQuerySchema,\n searchResponseSchema,\n indexBodySchema,\n indexResponseSchema,\n // Skills schemas\n skillNamePathParams,\n skillDisambiguationQuerySchema,\n skillReferencePathParams,\n searchSkillsQuerySchema,\n listSkillsResponseSchema,\n getSkillResponseSchema,\n skillReferenceResponseSchema,\n listReferencesResponseSchema,\n searchSkillsResponseSchema,\n // skills.sh proxy schemas\n skillsShSearchQuerySchema,\n skillsShPopularQuerySchema,\n skillsShSearchResponseSchema,\n skillsShListResponseSchema,\n skillsShPreviewQuerySchema,\n skillsShInstallBodySchema,\n skillsShInstallResponseSchema,\n skillsShPreviewResponseSchema,\n skillsShRemoveBodySchema,\n skillsShRemoveResponseSchema,\n skillsShUpdateBodySchema,\n skillsShUpdateResponseSchema,\n} from '../schemas/workspace';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Directory path for skills installed via skills.sh */\nconst SKILLS_SH_DIR = '.agents/skills';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Runtime check for CompositeFilesystem using duck typing.\n * Uses a type-only import so older @mastra/core versions (< 1.3.0) work fine.\n */\nfunction isCompositeFilesystem(fs: unknown): fs is CompositeFilesystem {\n return !!fs && typeof fs === 'object' && 'mounts' in fs && fs.mounts instanceof Map;\n}\n\n/**\n * Check if an error is a workspace filesystem not-found error.\n * Handles Node.js ENOENT and workspace FileNotFoundError/DirectoryNotFoundError.\n */\nfunction isFilesystemNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for Node.js native ENOENT\n if ('code' in error && error.code === 'ENOENT') return true;\n\n // Check for workspace FileNotFoundError / DirectoryNotFoundError\n if ('name' in error) {\n const name = error.name;\n if (name === 'FileNotFoundError' || name === 'DirectoryNotFoundError') return true;\n }\n\n return false;\n}\n\n/**\n * Check if an error is a workspace filesystem permission error.\n * Handles Node.js EACCES and workspace PermissionError.\n */\nfunction isFilesystemPermissionError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('code' in error && error.code === 'EACCES') return true;\n\n if ('name' in error && error.name === 'PermissionError') return true;\n\n return false;\n}\n\n/**\n * Workspace-specific error handler.\n * Converts filesystem errors to appropriate HTTP status codes,\n * then falls back to generic handler.\n */\nfunction handleWorkspaceError(error: unknown, defaultMessage: string): never {\n if (isFilesystemNotFoundError(error)) {\n const message = error instanceof Error ? error.message : 'Not found';\n throw new HTTPException(404, { message });\n }\n if (isFilesystemPermissionError(error)) {\n const message = error instanceof Error ? error.message : 'Permission denied';\n throw new HTTPException(403, { message });\n }\n return handleError(error, defaultMessage);\n}\n\n/**\n * Throws if workspace v1 is not supported by the current version of @mastra/core.\n */\nfunction requireWorkspaceV1Support(): void {\n if (!coreFeatures.has('workspaces-v1')) {\n throw new HTTPException(501, {\n message: 'Workspace v1 not supported by this version of @mastra/core. Please upgrade to a newer version.',\n });\n }\n}\n\n/**\n * Get a workspace by ID from Mastra's workspace registry.\n *\n * Backwards compatible: Falls back to searching through agents if\n * mastra.getWorkspaceById() is not available (older @mastra/core versions).\n */\nasync function getWorkspaceById(mastra: any, workspaceId: string): Promise<Workspace | undefined> {\n requireWorkspaceV1Support();\n\n // Check if the global workspace matches\n const globalWorkspace = mastra.getWorkspace?.();\n if (globalWorkspace?.id === workspaceId) {\n return globalWorkspace;\n }\n\n // Try direct registry lookup if available (newer @mastra/core versions)\n if (typeof mastra.getWorkspaceById === 'function') {\n try {\n return mastra.getWorkspaceById(workspaceId);\n } catch {\n // Workspace not found in registry\n return undefined;\n }\n }\n\n // Fallback: Search through agents for the workspace (older @mastra/core versions)\n const agents = mastra.listAgents?.() ?? {};\n for (const agent of Object.values(agents)) {\n if ((agent as any).hasOwnWorkspace?.()) {\n const agentWorkspace = await (agent as any).getWorkspace?.();\n if (agentWorkspace?.id === workspaceId) {\n return agentWorkspace;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Get skills from a specific workspace by ID.\n * Note: getWorkspaceById already checks for workspace v1 support.\n */\nasync function getSkillsById(mastra: any, workspaceId: string): Promise<WorkspaceSkills | undefined> {\n const workspace = await getWorkspaceById(mastra, workspaceId);\n return workspace?.skills;\n}\n\n/**\n * Build the install path for a skill from skills.sh.\n *\n * For CompositeFilesystem: resolves the requested mount (or first writable),\n * validates it is writable, and returns `<mount>/.agents/skills/<skillId>`.\n * For non-composite: returns `.agents/skills/<skillId>` (unchanged behavior).\n */\n/** Strip a single trailing slash (leaves `/` alone). */\nfunction stripTrailingSlash(p: string): string {\n return p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p;\n}\n\nfunction buildSkillInstallPath(filesystem: WorkspaceFilesystem, safeSkillId: string, requestedMount?: string): string {\n if (isCompositeFilesystem(filesystem)) {\n if (requestedMount) {\n // Validate the requested mount exists\n const mountFs = filesystem.mounts.get(requestedMount);\n if (!mountFs) {\n throw new HTTPException(400, {\n message: `Mount \"${requestedMount}\" not found. Available mounts: ${filesystem.mountPaths.join(', ')}`,\n });\n }\n if (mountFs.readOnly) {\n throw new HTTPException(403, { message: `Mount \"${requestedMount}\" is read-only` });\n }\n return `${stripTrailingSlash(requestedMount)}/${SKILLS_SH_DIR}/${safeSkillId}`;\n }\n\n // Default: use first writable mount\n for (const [mountPath, mountFs] of filesystem.mounts) {\n if (!mountFs.readOnly) {\n return `${stripTrailingSlash(mountPath)}/${SKILLS_SH_DIR}/${safeSkillId}`;\n }\n }\n\n throw new HTTPException(403, { message: 'No writable mount available for skill installation' });\n }\n\n // Non-composite: standard path\n return `${SKILLS_SH_DIR}/${safeSkillId}`;\n}\n\n// =============================================================================\n// List All Workspaces Route\n// =============================================================================\n\nexport const LIST_WORKSPACES_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces',\n responseType: 'json',\n responseSchema: listWorkspacesResponseSchema,\n summary: 'List all workspaces',\n description: 'Returns all workspaces from both Mastra instance and agents',\n tags: ['Workspace'],\n handler: async ({ mastra }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspaces: Array<{\n id: string;\n name: string;\n status: string;\n source: 'mastra' | 'agent';\n agentId?: string;\n agentName?: string;\n capabilities: {\n hasFilesystem: boolean;\n hasSandbox: boolean;\n canBM25: boolean;\n canVector: boolean;\n canHybrid: boolean;\n hasSkills: boolean;\n };\n safety: {\n readOnly: boolean;\n };\n }> = [];\n\n // Prefer the workspace registry if available (duck-type check for newer @mastra/core).\n // This avoids calling dynamic workspace functions without proper request context.\n // Dynamic workspaces get lazily registered during agent execution (stream/generate).\n if (typeof mastra.listWorkspaces === 'function') {\n const registeredWorkspaces = mastra.listWorkspaces();\n\n for (const [, entry] of Object.entries(registeredWorkspaces)) {\n // Newer @mastra/core returns { workspace, source, agentId?, agentName? }.\n // Older versions return a bare Workspace object — detect via duck-typing.\n const ws: Workspace = (entry as any).workspace ?? entry;\n const source: 'mastra' | 'agent' = (entry as any).source ?? 'mastra';\n const agentId: string | undefined = (entry as any).agentId;\n const agentName: string | undefined = (entry as any).agentName;\n\n workspaces.push({\n id: ws.id,\n name: ws.name,\n status: ws.status,\n source,\n ...(source === 'agent' && agentId ? { agentId, ...(agentName != null ? { agentName } : {}) } : {}),\n capabilities: {\n hasFilesystem: !!ws.filesystem,\n hasSandbox: !!ws.sandbox,\n canBM25: ws.canBM25,\n canVector: ws.canVector,\n canHybrid: ws.canHybrid,\n hasSkills: !!ws.skills,\n },\n safety: {\n readOnly: ws.filesystem?.readOnly ?? false,\n },\n });\n }\n } else {\n // Fallback for older @mastra/core without workspace registry:\n // Check global workspace and loop through agents\n const seenIds = new Set<string>();\n const globalWorkspace = mastra.getWorkspace?.();\n if (globalWorkspace) {\n seenIds.add(globalWorkspace.id);\n workspaces.push({\n id: globalWorkspace.id,\n name: globalWorkspace.name,\n status: globalWorkspace.status,\n source: 'mastra',\n capabilities: {\n hasFilesystem: !!globalWorkspace.filesystem,\n hasSandbox: !!globalWorkspace.sandbox,\n canBM25: globalWorkspace.canBM25,\n canVector: globalWorkspace.canVector,\n canHybrid: globalWorkspace.canHybrid,\n hasSkills: !!globalWorkspace.skills,\n },\n safety: {\n readOnly: globalWorkspace.filesystem?.readOnly ?? false,\n },\n });\n }\n\n const agents = mastra.listAgents?.() ?? {};\n for (const [agentId, agent] of Object.entries(agents)) {\n if ((agent as any).hasOwnWorkspace?.()) {\n try {\n const agentWorkspace = await (agent as any).getWorkspace?.();\n if (agentWorkspace && !seenIds.has(agentWorkspace.id)) {\n seenIds.add(agentWorkspace.id);\n workspaces.push({\n id: agentWorkspace.id,\n name: agentWorkspace.name,\n status: agentWorkspace.status,\n source: 'agent',\n agentId,\n agentName: (agent as any).name,\n capabilities: {\n hasFilesystem: !!agentWorkspace.filesystem,\n hasSandbox: !!agentWorkspace.sandbox,\n canBM25: agentWorkspace.canBM25,\n canVector: agentWorkspace.canVector,\n canHybrid: agentWorkspace.canHybrid,\n hasSkills: !!agentWorkspace.skills,\n },\n safety: {\n readOnly: agentWorkspace.filesystem?.readOnly ?? false,\n },\n });\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n return { workspaces };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing workspaces');\n }\n },\n});\n\n// =============================================================================\n// Get Workspace Route\n// =============================================================================\n\nexport const GET_WORKSPACE_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n responseSchema: workspaceInfoResponseSchema,\n summary: 'Get workspace info',\n description: 'Returns information about a specific workspace and its capabilities',\n tags: ['Workspace'],\n handler: async ({ mastra, workspaceId }) => {\n try {\n const workspace = await getWorkspaceById(mastra, workspaceId);\n\n if (!workspace) {\n return {\n isWorkspaceConfigured: false,\n };\n }\n\n const fsInfo = await workspace.filesystem?.getInfo?.();\n\n // Build mounts array for CompositeFilesystem\n let mounts:\n | Array<{\n path: string;\n provider: string;\n readOnly: boolean;\n displayName?: string;\n icon?: string;\n name?: string;\n }>\n | undefined;\n\n if (isCompositeFilesystem(workspace.filesystem)) {\n mounts = [];\n for (const [mountPath, mountFs] of workspace.filesystem.mounts) {\n try {\n const info = await mountFs.getInfo?.();\n mounts.push({\n path: mountPath,\n provider: info?.provider ?? mountFs.provider ?? 'unknown',\n readOnly: mountFs.readOnly ?? false,\n displayName: mountFs.displayName ?? info?.name ?? mountFs.name,\n icon: info?.icon,\n name: mountFs.name,\n });\n } catch {\n mounts.push({\n path: mountPath,\n provider: mountFs.provider ?? 'unknown',\n readOnly: mountFs.readOnly ?? true,\n name: mountFs.name,\n });\n }\n }\n }\n\n return {\n isWorkspaceConfigured: true,\n id: workspace.id,\n name: workspace.name,\n status: workspace.status,\n capabilities: {\n hasFilesystem: !!workspace.filesystem,\n hasSandbox: !!workspace.sandbox,\n canBM25: workspace.canBM25,\n canVector: workspace.canVector,\n canHybrid: workspace.canHybrid,\n hasSkills: !!workspace.skills,\n },\n safety: {\n readOnly: workspace.filesystem?.readOnly ?? false,\n },\n filesystem: fsInfo\n ? {\n id: fsInfo.id,\n name: fsInfo.name,\n provider: fsInfo.provider,\n status: fsInfo.status,\n error: fsInfo.error,\n readOnly: fsInfo.readOnly,\n icon: fsInfo.icon,\n metadata: fsInfo.metadata,\n }\n : undefined,\n mounts,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting workspace info');\n }\n },\n});\n\n// =============================================================================\n// Filesystem Routes\n// =============================================================================\n\nexport const WORKSPACE_FS_READ_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/read',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsReadQuerySchema,\n responseSchema: fsReadResponseSchema,\n summary: 'Read file content',\n description: 'Returns the content of a file at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, encoding, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n // Read file content\n const content = await workspace.filesystem.readFile(decodedPath, {\n encoding: (encoding as BufferEncoding) || 'utf-8',\n });\n\n return {\n path: decodedPath,\n content: typeof content === 'string' ? content : content.toString('utf-8'),\n type: 'file' as const,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error reading file');\n }\n },\n});\n\nexport const WORKSPACE_FS_WRITE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/fs/write',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: fsWriteBodySchema,\n responseSchema: fsWriteResponseSchema,\n summary: 'Write file content',\n description: 'Writes content to a file at the specified path. Supports base64 encoding for binary files.',\n tags: ['Workspace'],\n handler: async ({ mastra, path, content, encoding, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path || content === undefined) {\n throw new HTTPException(400, { message: 'Path and content are required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n // Handle base64-encoded content for binary files\n let fileContent: string | Buffer = content;\n if (encoding === 'base64') {\n fileContent = Buffer.from(content, 'base64');\n }\n\n await workspace.filesystem.writeFile(decodedPath, fileContent, { recursive: recursive ?? true });\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error writing file');\n }\n },\n});\n\nexport const WORKSPACE_FS_LIST_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/list',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsListQuerySchema,\n responseSchema: fsListResponseSchema,\n summary: 'List directory contents',\n description: 'Returns a list of files and directories at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n return {\n path,\n entries: [],\n error: 'No workspace filesystem configured',\n };\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n const entries = await workspace.filesystem.readdir(decodedPath, { recursive });\n\n return {\n path: decodedPath,\n entries,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing directory');\n }\n },\n});\n\nexport const WORKSPACE_FS_DELETE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/workspaces/:workspaceId/fs/delete',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsDeleteQuerySchema,\n responseSchema: fsDeleteResponseSchema,\n summary: 'Delete file or directory',\n description: 'Deletes a file or directory at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, force, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n // Check if path exists (unless force is true)\n const exists = await workspace.filesystem.exists(decodedPath);\n if (!exists && !force) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n if (exists) {\n // Try to delete as file first, then as directory\n try {\n await workspace.filesystem.deleteFile(decodedPath, { force });\n } catch {\n await workspace.filesystem.rmdir(decodedPath, { recursive, force });\n }\n }\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error deleting path');\n }\n },\n});\n\nexport const WORKSPACE_FS_MKDIR_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/fs/mkdir',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: fsMkdirBodySchema,\n responseSchema: fsMkdirResponseSchema,\n summary: 'Create directory',\n description: 'Creates a directory at the specified path',\n tags: ['Workspace'],\n handler: async ({ mastra, path, recursive, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n if (workspace.filesystem?.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is in read-only mode' });\n }\n\n const decodedPath = path;\n\n await workspace.filesystem.mkdir(decodedPath, { recursive: recursive ?? true });\n\n return {\n success: true,\n path: decodedPath,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error creating directory');\n }\n },\n});\n\nexport const WORKSPACE_FS_STAT_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/fs/stat',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: fsStatQuerySchema,\n responseSchema: fsStatResponseSchema,\n summary: 'Get file/directory info',\n description: 'Returns metadata about a file or directory',\n tags: ['Workspace'],\n handler: async ({ mastra, path, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path) {\n throw new HTTPException(400, { message: 'Path is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace?.filesystem) {\n throw new HTTPException(404, { message: 'No workspace filesystem configured' });\n }\n\n const decodedPath = path;\n\n // Check if path exists\n if (!(await workspace.filesystem.exists(decodedPath))) {\n throw new HTTPException(404, { message: `Path \"${decodedPath}\" not found` });\n }\n\n const stat = await workspace.filesystem.stat(decodedPath);\n\n return {\n path: stat.path,\n type: stat.type,\n size: stat.size,\n createdAt: stat.createdAt?.toISOString(),\n modifiedAt: stat.modifiedAt?.toISOString(),\n mimeType: stat.mimeType,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting file info');\n }\n },\n});\n\n// =============================================================================\n// Search Routes\n// =============================================================================\n\nexport const WORKSPACE_SEARCH_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: searchQuerySchema,\n responseSchema: searchResponseSchema,\n summary: 'Search workspace content',\n description: 'Searches across indexed workspace content using BM25, vector, or hybrid search',\n tags: ['Workspace'],\n handler: async ({ mastra, query, topK, mode, minScore, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!query) {\n throw new HTTPException(400, { message: 'Search query is required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n return {\n results: [],\n query,\n mode: mode || 'bm25',\n };\n }\n\n // Check search capabilities\n const canSearch = workspace.canBM25 || workspace.canVector;\n if (!canSearch) {\n return {\n results: [],\n query,\n mode: mode || 'bm25',\n };\n }\n\n // Determine search mode based on capabilities\n let searchMode = mode;\n if (!searchMode) {\n if (workspace.canHybrid) {\n searchMode = 'hybrid';\n } else if (workspace.canVector) {\n searchMode = 'vector';\n } else {\n searchMode = 'bm25';\n }\n }\n\n const results = await workspace.search(query, {\n topK: topK || 5,\n mode: searchMode,\n minScore,\n });\n\n return {\n results: results.map(r => ({\n id: r.id,\n content: r.content,\n score: r.score,\n lineRange: r.lineRange,\n scoreDetails: r.scoreDetails,\n })),\n query,\n mode: searchMode,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error searching workspace');\n }\n },\n});\n\nexport const WORKSPACE_INDEX_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/index',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: indexBodySchema,\n responseSchema: indexResponseSchema,\n summary: 'Index content for search',\n description: 'Indexes content for later search operations',\n tags: ['Workspace'],\n handler: async ({ mastra, path, content, metadata, workspaceId }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!path || content === undefined) {\n throw new HTTPException(400, { message: 'Path and content are required' });\n }\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'No workspace configured' });\n }\n\n const canSearch = workspace.canBM25 || workspace.canVector;\n if (!canSearch) {\n throw new HTTPException(400, { message: 'Workspace does not have search configured' });\n }\n\n await workspace.index(path, content, { metadata });\n\n return {\n success: true,\n path,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error indexing content');\n }\n },\n});\n\n// =============================================================================\n// Skills Routes (under /workspaces/:workspaceId/skills)\n// =============================================================================\n\n/** Path prefix for skills installed via skills.sh (with trailing slash for prefix matching) */\nconst SKILLS_SH_PATH_PREFIX = `${SKILLS_SH_DIR}/`;\n\nexport const WORKSPACE_LIST_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n responseSchema: listSkillsResponseSchema,\n summary: 'List all skills',\n description: 'Returns a list of all discovered skills with their metadata',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n const skills = workspace?.skills;\n if (!skills) {\n return { skills: [], isSkillsConfigured: false };\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skillsList = await skills.list();\n\n // Enrich skills with skills.sh source info where applicable\n const enrichedSkills = await Promise.all(\n skillsList.map(async skillMeta => {\n let skillsShSource: { owner: string; repo: string } | undefined;\n\n // For skills installed via skills.sh, read source info from .meta.json.\n // Uses includes() because glob-discovered paths may have a leading slash\n // or be nested (e.g., '/.agents/skills/foo', '/src/.agents/skills/foo').\n if (skillMeta.path.includes(SKILLS_SH_PATH_PREFIX) && workspace.filesystem) {\n try {\n const metaPath = `${skillMeta.path}/.meta.json`;\n const metaContent = await workspace.filesystem.readFile(metaPath);\n const metaText = typeof metaContent === 'string' ? metaContent : metaContent.toString('utf-8');\n const meta = JSON.parse(metaText) as { owner?: string; repo?: string };\n if (meta.owner && meta.repo) {\n skillsShSource = { owner: meta.owner, repo: meta.repo };\n }\n } catch {\n // .meta.json might not exist or be invalid - that's ok\n }\n }\n\n return {\n name: skillMeta.name,\n description: skillMeta.description,\n license: skillMeta.license,\n compatibility: skillMeta.compatibility,\n metadata: skillMeta.metadata,\n path: skillMeta.path,\n skillsShSource,\n };\n }),\n );\n\n return {\n skills: enrichedSkills,\n isSkillsConfigured: true,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing skills');\n }\n },\n});\n\nexport const WORKSPACE_GET_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName',\n responseType: 'json',\n pathParamSchema: skillNamePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: getSkillResponseSchema,\n summary: 'Get skill details',\n description: 'Returns the full details of a specific skill including instructions and file lists',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!skillName) {\n throw new HTTPException(400, { message: 'Skill name is required' });\n }\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = path ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n return {\n name: skill.name,\n description: skill.description,\n license: skill.license,\n compatibility: skill.compatibility,\n metadata: skill.metadata,\n path: skill.path,\n instructions: skill.instructions,\n source: skill.source,\n references: skill.references,\n scripts: skill.scripts,\n assets: skill.assets,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting skill');\n }\n },\n});\n\nexport const WORKSPACE_LIST_SKILL_REFERENCES_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName/references',\n responseType: 'json',\n pathParamSchema: skillNamePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: listReferencesResponseSchema,\n summary: 'List skill references',\n description: 'Returns a list of all reference file paths for a skill',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!skillName) {\n throw new HTTPException(400, { message: 'Skill name is required' });\n }\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = path ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n const references = await skills.listReferences(identifier);\n\n return {\n skillName: skill.name,\n references,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error listing skill references');\n }\n },\n});\n\nexport const WORKSPACE_GET_SKILL_REFERENCE_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/:skillName/references/:referencePath',\n responseType: 'json',\n pathParamSchema: skillReferencePathParams,\n queryParamSchema: skillDisambiguationQuerySchema,\n responseSchema: skillReferenceResponseSchema,\n summary: 'Get skill reference content',\n description: 'Returns the content of a specific reference file from a skill',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, skillName, path: skillPath, referencePath, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = skillPath ?? skillName;\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n throw new HTTPException(404, { message: 'No workspace with skills configured' });\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n // Resolve skill to get its name for the response\n const skill = await skills.get(identifier);\n if (!skill) {\n throw new HTTPException(404, { message: `Skill \"${identifier}\" not found` });\n }\n\n const decodedPath = referencePath;\n\n // Prevent path traversal via the reference path parameter\n assertSafeFilePath(decodedPath);\n\n // getReference expects a path relative to skill.path, so prepend 'references/'\n // since the URL path already contains the literal /references/ segment\n const content = await skills.getReference(identifier, `references/${decodedPath}`);\n if (content === null) {\n throw new HTTPException(404, {\n message: `Reference \"${decodedPath}\" not found in skill \"${identifier}\"`,\n });\n }\n\n return {\n skillName: skill.name,\n referencePath: decodedPath,\n content,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error getting skill reference');\n }\n },\n});\n\nexport const WORKSPACE_SEARCH_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: searchSkillsQuerySchema,\n responseSchema: searchSkillsResponseSchema,\n summary: 'Search skills',\n description: 'Searches across all skills content using BM25 keyword search',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, query, topK, minScore, skillNames, includeReferences, workspaceId, requestContext }) => {\n try {\n requireWorkspaceV1Support();\n\n if (!query) {\n throw new HTTPException(400, { message: 'Search query is required' });\n }\n\n const skills = await getSkillsById(mastra, workspaceId);\n if (!skills) {\n return {\n results: [],\n query,\n };\n }\n\n // Refresh skills with request context (handles dynamic skill resolvers)\n await skills.maybeRefresh({ requestContext });\n\n // Parse comma-separated skill names if provided\n const skillNamesList = skillNames ? skillNames.split(',').map((s: string) => s.trim()) : undefined;\n\n const results = await skills.search(query, {\n topK: topK || 5,\n minScore,\n skillNames: skillNamesList,\n includeReferences: includeReferences ?? true,\n });\n\n return {\n results: results.map(r => ({\n skillName: r.skillName,\n skillPath: r.skillPath,\n source: r.source,\n content: r.content,\n score: r.score,\n lineRange: r.lineRange,\n scoreDetails: r.scoreDetails,\n })),\n query,\n };\n } catch (error) {\n return handleWorkspaceError(error, 'Error searching skills');\n }\n },\n});\n\n// =============================================================================\n// skills.sh Proxy Routes\n// =============================================================================\n\nconst SKILLS_SH_API_URL = 'https://skills-api-production.up.railway.app';\n\nexport const WORKSPACE_SKILLS_SH_SEARCH_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/search',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShSearchQuerySchema,\n responseSchema: skillsShSearchResponseSchema,\n summary: 'Search skills on skills.sh',\n description: 'Proxies search requests to skills.sh API to avoid CORS issues',\n tags: ['Workspace', 'Skills'],\n handler: async ({ q, limit }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const url = `${SKILLS_SH_API_URL}/api/skills?query=${encodeURIComponent(q)}&pageSize=${limit}`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n };\n return {\n query: q,\n searchType: 'query',\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error searching skills');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_POPULAR_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/popular',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShPopularQuerySchema,\n responseSchema: skillsShListResponseSchema,\n summary: 'Get popular skills from skills.sh',\n description: 'Proxies popular skills requests to skills.sh API to avoid CORS issues',\n tags: ['Workspace', 'Skills'],\n handler: async ({ limit, offset }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const page = offset > 0 ? Math.floor(offset / limit) + 1 : 1;\n const url = `${SKILLS_SH_API_URL}/api/skills/top?pageSize=${limit}&page=${page}`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(502, {\n message: `Skills API error: ${response.status} ${response.statusText}`,\n });\n }\n\n const data = (await response.json()) as {\n skills: Array<{\n skillId: string;\n name: string;\n installs: number;\n source: string;\n owner: string;\n repo: string;\n githubUrl: string;\n displayName: string;\n }>;\n total: number;\n };\n return {\n skills: data.skills.map(s => ({ id: s.skillId, name: s.name, installs: s.installs, topSource: s.source })),\n count: data.total,\n limit,\n offset,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error fetching popular skills');\n }\n },\n});\n\n// =============================================================================\n// Skills API helpers\n// =============================================================================\n\n/**\n * Validate skill name to prevent path traversal attacks.\n * Only allows alphanumeric characters, hyphens, and underscores.\n */\nconst SKILL_NAME_REGEX = /^[a-z0-9][a-z0-9-_]*$/i;\n\nfunction assertSafeSkillName(name: string): string {\n if (!SKILL_NAME_REGEX.test(name)) {\n throw new HTTPException(400, {\n message: `Invalid skill name \"${name}\". Names must start with alphanumeric and contain only letters, numbers, hyphens, and underscores.`,\n });\n }\n return name;\n}\n\n/**\n * Validate that a file path is safe (no traversal, no absolute paths).\n * Prevents malicious API responses from writing files outside the skill directory.\n */\nfunction assertSafeFilePath(filePath: string): string {\n // Reject absolute paths\n if (filePath.startsWith('/') || /^[a-zA-Z]:/.test(filePath)) {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Absolute paths are not allowed.`,\n });\n }\n // Reject path traversal attempts\n const segments = filePath.split('/');\n for (const segment of segments) {\n if (segment === '..' || segment === '.') {\n throw new HTTPException(400, {\n message: `Invalid file path \"${filePath}\". Path traversal is not allowed.`,\n });\n }\n }\n return filePath;\n}\n\ninterface SkillFileEntry {\n path: string;\n content: string;\n encoding: 'utf-8' | 'base64';\n}\n\ninterface SkillFilesResponse {\n skillId: string;\n owner: string;\n repo: string;\n branch: string;\n files: SkillFileEntry[];\n}\n\n/**\n * Fetch skill files from the Skills API.\n * Returns all files for a skill with their content.\n */\nasync function fetchSkillFiles(owner: string, repo: string, skillName: string): Promise<SkillFilesResponse | null> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30s for file downloads\n\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/files`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n throw new Error(`Skills API error: ${response.status} ${response.statusText}`);\n }\n\n return (await response.json()) as SkillFilesResponse;\n}\n\n// =============================================================================\n// skills.sh Preview Route\n// =============================================================================\n\nexport const WORKSPACE_SKILLS_SH_PREVIEW_ROUTE = createRoute({\n method: 'GET',\n path: '/workspaces/:workspaceId/skills-sh/preview',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n queryParamSchema: skillsShPreviewQuerySchema,\n responseSchema: skillsShPreviewResponseSchema,\n summary: 'Preview skill content',\n description: 'Fetches the skill content from the Skills API.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ owner, repo, path: skillName }) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n const url = `${SKILLS_SH_API_URL}/api/skills/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${encodeURIComponent(skillName)}/content`;\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" for ${owner}/${repo}`,\n });\n }\n\n const data = (await response.json()) as { instructions: string; raw: string };\n const content = data.instructions || data.raw || '';\n\n if (!content) {\n throw new HTTPException(404, {\n message: `No content available for skill \"${skillName}\"`,\n });\n }\n\n return { content };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error fetching skill preview');\n }\n },\n});\n\n// =============================================================================\n// skills.sh Install Route\n// =============================================================================\n\nexport const WORKSPACE_SKILLS_SH_INSTALL_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/install',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShInstallBodySchema,\n responseSchema: skillsShInstallResponseSchema,\n summary: 'Install skill from Skills API',\n description: 'Installs a skill by fetching files from the Skills API and writing to workspace filesystem.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, owner, repo, skillName, mount }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n // Fetch skill files from the Skills API\n const result = await fetchSkillFiles(owner, repo, skillName);\n if (!result || result.files.length === 0) {\n throw new HTTPException(404, {\n message: `Could not find skill \"${skillName}\" in ${owner}/${repo}.`,\n });\n }\n\n // Validate skill name to prevent path traversal\n const safeSkillId = assertSafeSkillName(result.skillId);\n const installPath = buildSkillInstallPath(workspace.filesystem, safeSkillId, mount);\n\n // Ensure the skills directory exists\n try {\n await workspace.filesystem.mkdir(installPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Write all files to the workspace\n let filesWritten = 0;\n for (const file of result.files) {\n // Validate file path to prevent path traversal from API response\n const safePath = assertSafeFilePath(file.path);\n const filePath = `${installPath}/${safePath}`;\n\n // Create subdirectory if needed\n if (safePath.includes('/')) {\n const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));\n try {\n await workspace.filesystem.mkdir(dirPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n }\n\n const content = file.encoding === 'base64' ? Buffer.from(file.content, 'base64') : file.content;\n await workspace.filesystem.writeFile(filePath, content);\n filesWritten++;\n }\n\n // Write metadata file for update support\n const metadata = {\n skillName: result.skillId,\n owner: result.owner,\n repo: result.repo,\n branch: result.branch,\n installedAt: new Date().toISOString(),\n };\n await workspace.filesystem.writeFile(`${installPath}/.meta.json`, JSON.stringify(metadata, null, 2));\n filesWritten++;\n\n // Surgically update the skills cache for the newly installed skill\n if (workspace.skills?.addSkill) {\n try {\n await workspace.skills.addSkill(installPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after install: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n return {\n success: true,\n skillName: result.skillId,\n installedPath: installPath,\n filesWritten,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error installing skill');\n }\n },\n});\n\n/**\n * Interface for skill metadata stored in .meta.json\n */\ninterface SkillMetaFile {\n skillName: string;\n owner: string;\n repo: string;\n branch: string;\n installedAt: string;\n}\n\nexport const WORKSPACE_SKILLS_SH_REMOVE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/remove',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShRemoveBodySchema,\n responseSchema: skillsShRemoveResponseSchema,\n summary: 'Remove an installed skill',\n description: 'Removes an installed skill by deleting its directory. Does not require sandbox.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, skillName }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n // Validate skill name to prevent path traversal\n const safeSkillName = assertSafeSkillName(skillName);\n\n // Look up the skill's actual path from the cache (supports glob-discovered skills).\n // Only use the discovered path if it's under the skills.sh directory to avoid\n // accidentally deleting a locally-authored skill with the same name.\n const allSkills = await workspace.skills?.list();\n const matchingSkill = allSkills?.find(s => s.name === safeSkillName && s.path.includes(SKILLS_SH_PATH_PREFIX));\n const skillPath = matchingSkill?.path ?? buildSkillInstallPath(workspace.filesystem, safeSkillName);\n\n // Check if skill exists on filesystem\n try {\n await workspace.filesystem.stat(skillPath);\n } catch {\n throw new HTTPException(404, { message: `Skill \"${skillName}\" not found at ${skillPath}` });\n }\n\n // Delete the skill directory\n await workspace.filesystem.rmdir(skillPath, { recursive: true });\n\n // Surgically remove the skill from the cache\n if (workspace.skills?.removeSkill) {\n try {\n await workspace.skills.removeSkill(skillPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after remove: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n return {\n success: true,\n skillName,\n removedPath: skillPath,\n };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error removing skill');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_UPDATE_ROUTE = createRoute({\n method: 'POST',\n path: '/workspaces/:workspaceId/skills-sh/update',\n responseType: 'json',\n pathParamSchema: workspaceIdPathParams,\n bodySchema: skillsShUpdateBodySchema,\n responseSchema: skillsShUpdateResponseSchema,\n summary: 'Update installed skills',\n description:\n 'Updates installed skills by re-fetching from GitHub. Specify skillName to update one, or omit to update all.',\n tags: ['Workspace', 'Skills'],\n handler: async ({ mastra, workspaceId, skillName }) => {\n try {\n requireWorkspaceV1Support();\n\n const workspace = await getWorkspaceById(mastra, workspaceId);\n if (!workspace) {\n throw new HTTPException(404, { message: 'Workspace not found' });\n }\n\n if (!workspace.filesystem) {\n throw new HTTPException(400, { message: 'Workspace filesystem not available' });\n }\n\n if (workspace.filesystem.readOnly) {\n throw new HTTPException(403, { message: 'Workspace is read-only' });\n }\n\n const results: Array<{\n skillName: string;\n success: boolean;\n filesWritten?: number;\n error?: string;\n }> = [];\n\n // Build list of { skillName, basePath } entries to update.\n // basePath is the parent of the skill directory (e.g., `.agents/skills`).\n let skillsToUpdate: Array<{ name: string; basePath: string }>;\n\n if (skillName) {\n const safeName = assertSafeSkillName(skillName);\n\n // Try to find the installed path via discovery first\n const allSkills = await workspace.skills?.list();\n const discoveredSkill = allSkills?.find(s => s.name === safeName && s.path.includes(SKILLS_SH_PATH_PREFIX));\n let basePath: string;\n if (discoveredSkill?.path) {\n // Derive basePath by removing the skill name suffix from the discovered path\n basePath = discoveredSkill.path.substring(0, discoveredSkill.path.lastIndexOf('/'));\n } else {\n basePath = SKILLS_SH_DIR;\n }\n skillsToUpdate = [{ name: safeName, basePath }];\n } else {\n // Update all: scan `.agents/skills` under each writable mount (or just SKILLS_SH_DIR)\n skillsToUpdate = [];\n const dirsToScan: string[] = [];\n\n if (isCompositeFilesystem(workspace.filesystem)) {\n for (const [mountPath, mountFs] of workspace.filesystem.mounts) {\n if (!mountFs.readOnly) {\n dirsToScan.push(`${stripTrailingSlash(mountPath)}/${SKILLS_SH_DIR}`);\n }\n }\n } else {\n dirsToScan.push(SKILLS_SH_DIR);\n }\n\n for (const dir of dirsToScan) {\n try {\n const entries = await workspace.filesystem.readdir(dir);\n for (const e of entries) {\n if (e.type === 'directory') {\n skillsToUpdate.push({ name: e.name, basePath: dir });\n }\n }\n } catch {\n // Directory doesn't exist or isn't readable - skip\n }\n }\n\n if (skillsToUpdate.length === 0) {\n return { updated: [] };\n }\n }\n\n for (const { name: skill, basePath } of skillsToUpdate) {\n // Validate each skill name for safety\n try {\n assertSafeSkillName(skill);\n } catch {\n results.push({\n skillName: skill,\n success: false,\n error: 'Invalid skill name',\n });\n continue;\n }\n const installPath = `${basePath}/${skill}`;\n const metaPath = `${installPath}/.meta.json`;\n try {\n const metaContent = await workspace.filesystem.readFile(metaPath, { encoding: 'utf-8' });\n const meta: SkillMetaFile = JSON.parse(metaContent as string);\n\n // Re-fetch skill files from the Skills API\n const fetchResult = await fetchSkillFiles(meta.owner, meta.repo, meta.skillName);\n\n if (!fetchResult || fetchResult.files.length === 0) {\n results.push({\n skillName: skill,\n success: false,\n error: 'No files found in skill directory',\n });\n continue;\n }\n\n let filesWritten = 0;\n\n for (const file of fetchResult.files) {\n // Validate file path to prevent path traversal from API response\n const safePath = assertSafeFilePath(file.path);\n const filePath = `${installPath}/${safePath}`;\n\n if (safePath.includes('/')) {\n const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));\n try {\n await workspace.filesystem.mkdir(dirPath, { recursive: true });\n } catch {\n // Directory might already exist\n }\n }\n\n const content = file.encoding === 'base64' ? Buffer.from(file.content, 'base64') : file.content;\n await workspace.filesystem.writeFile(filePath, content);\n filesWritten++;\n }\n\n // Update metadata with new install time and branch\n const updatedMeta: SkillMetaFile = {\n ...meta,\n branch: fetchResult.branch,\n installedAt: new Date().toISOString(),\n };\n await workspace.filesystem.writeFile(metaPath, JSON.stringify(updatedMeta, null, 2));\n filesWritten++;\n\n // Surgically update the skills cache for the updated skill\n if (workspace.skills?.addSkill) {\n try {\n await workspace.skills.addSkill(installPath);\n } catch (cacheError) {\n console.warn(\n `[skills-sh] Failed to update cache after update: ${cacheError instanceof Error ? cacheError.message : String(cacheError)}`,\n );\n }\n }\n\n results.push({\n skillName: skill,\n success: true,\n filesWritten,\n });\n } catch (error) {\n results.push({\n skillName: skill,\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return { updated: results };\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n return handleError(error, 'Error updating skills');\n }\n },\n});\n\nexport const WORKSPACE_SKILLS_SH_ROUTES = [\n WORKSPACE_SKILLS_SH_SEARCH_ROUTE,\n WORKSPACE_SKILLS_SH_POPULAR_ROUTE,\n WORKSPACE_SKILLS_SH_PREVIEW_ROUTE,\n WORKSPACE_SKILLS_SH_INSTALL_ROUTE,\n WORKSPACE_SKILLS_SH_REMOVE_ROUTE,\n WORKSPACE_SKILLS_SH_UPDATE_ROUTE,\n];\n\n// =============================================================================\n// Route Collections\n// =============================================================================\n\nexport const WORKSPACE_FS_ROUTES = [\n WORKSPACE_FS_READ_ROUTE,\n WORKSPACE_FS_WRITE_ROUTE,\n WORKSPACE_FS_LIST_ROUTE,\n WORKSPACE_FS_DELETE_ROUTE,\n WORKSPACE_FS_MKDIR_ROUTE,\n WORKSPACE_FS_STAT_ROUTE,\n];\n\nexport const WORKSPACE_SEARCH_ROUTES = [WORKSPACE_SEARCH_ROUTE, WORKSPACE_INDEX_ROUTE];\n\n// IMPORTANT: Search route must come before the parameterized routes\n// to avoid /api/workspace/skills/search being matched as /api/workspace/skills/:skillName\nexport const WORKSPACE_SKILLS_ROUTES = [\n WORKSPACE_SEARCH_SKILLS_ROUTE,\n WORKSPACE_LIST_SKILLS_ROUTE,\n WORKSPACE_GET_SKILL_ROUTE,\n WORKSPACE_LIST_SKILL_REFERENCES_ROUTE,\n WORKSPACE_GET_SKILL_REFERENCE_ROUTE,\n];\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.80.0-alpha.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -102,27 +102,27 @@
|
|
|
102
102
|
"devDependencies": {
|
|
103
103
|
"@ai-sdk/openai": "^1.3.24",
|
|
104
104
|
"@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.135",
|
|
105
|
-
"@types/node": "22.20.
|
|
106
|
-
"@vitest/coverage-v8": "4.1.
|
|
107
|
-
"@vitest/ui": "4.1.
|
|
105
|
+
"@types/node": "22.20.5",
|
|
106
|
+
"@vitest/coverage-v8": "4.1.12",
|
|
107
|
+
"@vitest/ui": "4.1.12",
|
|
108
108
|
"canonicalize": "^1.0.8",
|
|
109
109
|
"oxfmt": "0.59.0",
|
|
110
110
|
"superjson": "^2.2.6",
|
|
111
|
-
"tsdown": "0.
|
|
111
|
+
"tsdown": "0.23.1",
|
|
112
112
|
"tsx": "^4.23.1",
|
|
113
113
|
"typescript": "^7.0.2",
|
|
114
114
|
"typescript-classic": "npm:typescript@^6.0.3",
|
|
115
|
-
"vitest": "4.1.
|
|
115
|
+
"vitest": "4.1.12",
|
|
116
116
|
"zod": "^4.6.7",
|
|
117
117
|
"zod-to-ts": "^2.1.0",
|
|
118
|
-
"@internal/lint": "0.0.145",
|
|
119
|
-
"@internal/types-builder": "0.0.120",
|
|
120
118
|
"@internal/core": "0.1.3",
|
|
119
|
+
"@internal/lint": "0.0.145",
|
|
121
120
|
"@internal/storage-test-utils": "0.0.141",
|
|
121
|
+
"@internal/types-builder": "0.0.120",
|
|
122
|
+
"@mastra/agent-builder": "1.1.31-alpha.0",
|
|
122
123
|
"@internal/voice": "0.0.42",
|
|
123
|
-
"@mastra/
|
|
124
|
+
"@mastra/core": "1.80.0-alpha.1",
|
|
124
125
|
"@mastra/schema-compat": "1.3.16",
|
|
125
|
-
"@mastra/core": "1.79.0",
|
|
126
126
|
"@internal/test-utils": "0.0.81"
|
|
127
127
|
},
|
|
128
128
|
"homepage": "https://mastra.ai",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents-BHLTMBff.js","names":[],"sources":["../src/server/schemas/agents.ts"],"sourcesContent":["import type {\n AgentExecutionOptions,\n PublicStructuredOutputOptions,\n ToolsetsInput,\n ToolsInput,\n} from '@mastra/core/agent';\nimport type { CoreMessageV4 } from '@mastra/core/agent/message-list';\nimport type { ScoringSamplingConfig } from '@mastra/core/evals';\nimport type { OutputType, SystemMessage } from '@mastra/core/llm';\nimport type { ReasoningLevel } from '@mastra/core/loop';\nimport { z } from 'zod/v4';\n\n/**\n * Structural mirror of LoopOptions['modelSettings'] (ai-sdk CallSettings minus\n * abortSignal, plus reasoning). CallSettings is not publicly exported from\n * @mastra/core, so its fields are restated here to keep declaration emit portable.\n */\n/**\n * Structural mirror of LoopOptions['stopWhen'] entries. The ai-sdk StopCondition\n * type is not publicly exported from @mastra/core, so an assignable function\n * shape is used to keep declaration emit portable.\n */\ntype StopConditionArg = (event: unknown) => boolean | PromiseLike<boolean>;\n\ntype ModelSettings = {\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n topK?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n stopSequences?: string[];\n seed?: number;\n maxRetries?: number;\n headers?: Record<string, string | undefined>;\n reasoning?: ReasoningLevel;\n};\nimport { tracingOptionsSchema, coreMessageSchema, messageResponseSchema, typedPermissive } from './common';\nimport { defaultOptionsSchema } from './default-options';\n\nexport {\n generateSpeechBodySchema,\n getListenerResponseSchema,\n speakResponseSchema,\n transcribeSpeechBodySchema,\n transcribeSpeechResponseSchema,\n voiceSpeakersResponseSchema,\n} from '@internal/voice/routes';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\nconst jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(jsonValueSchema),\n z.record(z.string(), jsonValueSchema),\n ]),\n);\nconst jsonRecordSchema = z.record(z.string(), jsonValueSchema);\n\nconst signalAttributesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null(), z.undefined()]),\n);\n\nconst baseSignalSchema = z.object({\n id: z.string().optional(),\n createdAt: z.union([z.string(), z.date()]).optional(),\n metadata: jsonRecordSchema.optional(),\n attributes: signalAttributesSchema.optional(),\n});\n\nconst partProviderOptionsSchema = z.record(z.string(), z.record(z.string(), jsonValueSchema)).optional();\n\nconst signalTextPartSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n providerOptions: partProviderOptionsSchema,\n});\n\nconst signalFilePartSchema = z.object({\n type: z.literal('file'),\n data: z.string(),\n mediaType: z.string(),\n filename: z.string().optional(),\n providerOptions: partProviderOptionsSchema,\n});\n\nconst userMessageSignalContentsSchema = z.union([\n z.string(),\n z.array(z.union([signalTextPartSchema, signalFilePartSchema])),\n]);\n\nconst agentMessageInputObjectSchema = z.object({\n contents: userMessageSignalContentsSchema,\n attributes: signalAttributesSchema.optional(),\n metadata: jsonRecordSchema.optional(),\n providerOptions: z.record(z.string(), z.record(z.string(), jsonValueSchema)).optional(),\n});\n\nconst agentMessageInputSchema = z.union([userMessageSignalContentsSchema, agentMessageInputObjectSchema]);\n\nconst agentSignalBaseSchema = baseSignalSchema.extend({\n tagName: z.string().optional(),\n contents: userMessageSignalContentsSchema,\n providerOptions: z.record(z.string(), z.record(z.string(), jsonValueSchema)).optional(),\n});\n\nconst agentSignalSchema = z.discriminatedUnion('type', [\n agentSignalBaseSchema.extend({\n type: z.literal('state'),\n transient: z.never().optional(),\n }),\n agentSignalBaseSchema.extend({\n type: z.enum(['user', 'reactive', 'notification', 'user-message', 'system-reminder']),\n transient: z.boolean().optional(),\n }),\n]);\n\n// Path parameter schemas\nexport const agentIdPathParams = z.object({\n agentId: z.string().describe('Unique identifier for the agent'),\n});\n\n/**\n * Query params for GET /agents/:agentId — controls which stored config version is used for overrides.\n * When `status` and `versionId` are both provided, `versionId` takes precedence.\n * - `status` — 'draft' (latest version) or 'published' (active published version, default).\n * - `versionId` — Resolve with a specific version ID.\n */\nexport const agentVersionQuerySchema = z.object({\n status: z\n .enum(['draft', 'published'])\n .optional()\n .describe(\n 'Which stored config version to resolve: draft (latest version) or published (active version, default). When both status and versionId are provided, versionId takes precedence.',\n ),\n versionId: z\n .string()\n .optional()\n .describe('Specific version ID to resolve. Takes precedence over status when both are provided.'),\n});\n\nexport const agentPlanQuerySchema = agentVersionQuerySchema.extend({\n path: z.string().describe('Relative path to a markdown plan under .mastracode/plans/'),\n});\n\nexport const agentPlanResponseSchema = z.object({\n path: z.string(),\n content: z.string(),\n});\n\nexport const toolIdPathParams = z.object({\n toolId: z.string().describe('Unique identifier for the tool'),\n});\n\nexport const agentToolPathParams = agentIdPathParams.extend({\n toolId: z.string().describe('Unique identifier for the tool'),\n});\n\nexport const agentSkillPathParams = agentIdPathParams.extend({\n skillName: z.string().describe('Name of the skill'),\n});\n\nexport const modelConfigIdPathParams = agentIdPathParams.extend({\n modelConfigId: z.string().describe('Unique identifier for the model configuration'),\n});\n\n/**\n * Schema for serialized processor metadata\n */\nexport const serializedProcessorSchema = z.object({\n id: z.string(),\n name: z.string().optional(),\n});\n\n/**\n * Schema for serialized tool with JSON schemas\n */\nexport const serializedToolSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n description: z.string().optional(),\n inputSchema: z.string().optional(),\n outputSchema: z.string().optional(),\n requestContextSchema: z.string().optional(),\n requireApproval: z.boolean().optional(),\n});\n\n/**\n * Schema for serialized workflow with steps\n */\nexport const serializedWorkflowSchema = z.object({\n name: z.string(),\n steps: z\n .record(\n z.string(),\n z.object({\n id: z.string(),\n description: z.string().optional(),\n }),\n )\n .optional(),\n});\n\n/**\n * Schema for serialized agent definition (referenced by other agents)\n */\nexport const serializedAgentDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\n/**\n * Schema for SystemMessage type\n * Can be string, string[], or various message objects\n */\nconst systemMessageSchema = typedPermissive<SystemMessage>(\n z.union([\n z.string(),\n z.array(z.string()),\n z.unknown(), // CoreSystemMessage or SystemModelMessage\n z.array(z.unknown()),\n ]),\n);\n\n/**\n * Schema for model configuration in model list\n */\nconst modelConfigSchema = z.object({\n id: z.string(),\n enabled: z.boolean(),\n maxRetries: z.number(),\n model: z.object({\n modelId: z.string(),\n provider: z.string(),\n modelVersion: z.string(),\n }),\n});\n\nconst serializedSkillSchema = z.object({\n name: z.string(),\n description: z.string(),\n license: z.string().optional(),\n path: z.string(),\n});\n\nconst agentEditorConfigSchema = z.union([\n z.literal(false),\n z.object({\n instructions: z.boolean().optional(),\n tools: z.union([z.boolean(), z.object({ description: z.boolean().optional() })]).optional(),\n }),\n]);\n\n/**\n * Main schema for serialized agent representation\n */\nexport const serializedAgentSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n instructions: systemMessageSchema.optional(),\n tools: z.record(z.string(), serializedToolSchema),\n agents: z.record(z.string(), serializedAgentDefinitionSchema),\n workflows: z.record(z.string(), serializedWorkflowSchema),\n skills: z.array(serializedSkillSchema),\n workspaceTools: z.array(z.string()),\n browserTools: z.array(z.string()),\n hasBrowser: z.boolean(),\n workspaceId: z.string().optional(),\n inputProcessors: z.array(serializedProcessorSchema),\n outputProcessors: z.array(serializedProcessorSchema),\n provider: z.string().optional(),\n modelId: z.string().optional(),\n modelVersion: z.string().optional(),\n supportsMemory: z.boolean().optional(),\n modelList: z.array(modelConfigSchema).optional(),\n modelListEditable: z\n .boolean()\n .optional()\n .describe('False when the model list comes from a function and cannot be reordered or edited'),\n defaultOptions: defaultOptionsSchema.optional(),\n defaultGenerateOptionsLegacy: z.record(z.string(), z.unknown()).optional(),\n defaultStreamOptionsLegacy: z.record(z.string(), z.unknown()).optional(),\n requestContextSchema: z.string().optional(),\n source: z.enum(['code', 'stored', 'fs']).optional(),\n status: z.enum(['draft', 'published', 'archived']).optional(),\n activeVersionId: z.string().optional(),\n hasDraft: z.boolean().optional(),\n editor: agentEditorConfigSchema.optional(),\n});\n\n/**\n * Schema for agent with ID\n */\nexport const serializedAgentWithIdSchema = serializedAgentSchema.extend({\n id: z.string(),\n});\n\n/**\n * Schema for individual provider information\n */\nexport const providerSchema = z.object({\n id: z.string(),\n name: z.string(),\n label: z.string().optional(),\n description: z.string().optional(),\n envVar: z.union([z.string(), z.array(z.string())]),\n connected: z.boolean(),\n docUrl: z.string().optional(),\n models: z.array(z.string()),\n});\n\n/**\n * Schema for providers endpoint response\n */\nexport const providersResponseSchema = z.object({\n providers: z.array(providerSchema),\n});\n\nexport type ProviderListItem = z.infer<typeof providerSchema>;\n\n/**\n * Schema for list agents endpoint response\n * Returns a record of agent ID to serialized agent\n */\nexport const listAgentsResponseSchema = z.record(z.string(), serializedAgentSchema);\n\n/**\n * Schema for list tools endpoint response\n * Returns a record of tool ID to serialized tool\n */\nexport const listToolsResponseSchema = z.record(z.string(), serializedToolSchema);\n\n// ============================================================================\n// Agent Execution Body Schemas\n// ============================================================================\n\n/**\n * Schema for agent memory option\n */\nconst agentMemoryOptionSchema = z.object({\n thread: z.union([z.string(), z.object({ id: z.string() }).passthrough()]),\n /**\n * Optional so authenticated setups can rely on the server-derived resource ID\n * (`mapUserToResourceId` sets MASTRA_RESOURCE_ID_KEY in the request context, which\n * takes precedence over this value). Handlers return a 400 when neither the body\n * nor the request context provides a resource ID.\n */\n resource: z.string().optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n readOnly: z.boolean().optional(),\n});\n\n/**\n * Schema for tool choice configuration\n */\nconst toolChoiceSchema = z.union([\n z.enum(['auto', 'none', 'required']),\n z.object({ type: z.literal('tool'), toolName: z.string() }),\n]);\n\n/**\n * Comprehensive body schema for agent generate and stream endpoints\n * Validates common fields while using passthrough for complex nested objects\n *\n * EXCLUDED FIELDS (not serializable):\n * - Callbacks: onStepFinish, onFinish, onChunk, onError, onAbort, prepareStep\n * - Class instances: inputProcessors, outputProcessors\n * - Non-serializable: abortSignal, tracingContext\n */\nexport const agentExecutionBodySchema = z\n .object({\n // REQUIRED\n messages: z.union([\n z.array(coreMessageSchema), // Array of messages\n z.string(), // Single user message shorthand\n ]),\n\n // Message Configuration\n instructions: systemMessageSchema.optional(),\n system: systemMessageSchema.optional(),\n // ModelMessage[] at runtime; handlers cast since the AI SDK ModelMessage\n // type is not portable for declaration emit.\n context: z.array(coreMessageSchema).optional(),\n\n // Memory & Persistence\n memory: agentMemoryOptionSchema.optional(),\n runId: z.string().optional(),\n savePerStep: z.boolean().optional(),\n\n // Request Context (handler-specific field - merged with server's requestContext)\n requestContext: z.record(z.string(), z.unknown()).optional(),\n\n // Version overrides for sub-agents (and future primitives)\n versions: z\n .object({\n agents: z\n .record(\n z.string(),\n z.union([z.object({ versionId: z.string() }), z.object({ status: z.enum(['draft', 'published']) })]),\n )\n .optional(),\n defaultStatus: z.enum(['draft', 'published']).optional(),\n })\n .optional(),\n\n // Execution Control\n maxSteps: z.number().optional(),\n // Stop conditions are functions and cannot be validated by zod.\n stopWhen: typedPermissive<StopConditionArg | StopConditionArg[]>(z.unknown()).optional(),\n\n // Model Configuration\n model: z.string().optional(),\n providerOptions: z.record(z.string(), z.record(z.string(), jsonValueSchema)).optional(),\n modelSettings: typedPermissive<ModelSettings>(z.unknown()).optional(),\n\n // Tool Configuration\n activeTools: z.array(z.string()).optional(),\n // Tool entries contain execute functions and cannot be validated by zod.\n toolsets: typedPermissive<ToolsetsInput>(z.record(z.string(), z.unknown())).optional(),\n clientTools: typedPermissive<ToolsInput>(z.record(z.string(), z.unknown())).optional(),\n toolChoice: toolChoiceSchema.optional(),\n requireToolApproval: z.boolean().optional(),\n\n // Evaluation\n scorers: typedPermissive<Record<string, { scorer: string; sampling?: ScoringSamplingConfig }>>(\n z.union([\n z.record(z.string(), z.unknown()),\n z.record(\n z.string(),\n z.object({\n scorer: z.string(),\n sampling: z.unknown().optional(),\n }),\n ),\n ]),\n ).optional(),\n returnScorerData: z.boolean().optional(),\n\n // Observability\n tracingOptions: tracingOptionsSchema.optional(),\n\n // Structured Output\n // Zod schema, JSON schema, or structured output object — cannot be validated by zod.\n output: typedPermissive<OutputType>(z.unknown()).optional(),\n // The concrete options type cannot be expressed field-by-field because of\n // the fallback discriminated union.\n structuredOutput: typedPermissive<PublicStructuredOutputOptions<Record<string, unknown>>>(\n z.object({\n schema: z.object({}).passthrough(),\n model: z.union([z.string(), z.unknown()]).optional(),\n instructions: z.string().optional(),\n jsonPromptInjection: z.boolean().optional(),\n errorStrategy: z.enum(['strict', 'warn', 'fallback']).optional(),\n fallbackValue: z.unknown().optional(),\n }),\n ).optional(),\n\n // Idle-loop streaming (collapses streamUntilIdle into stream)\n untilIdle: z.union([z.boolean(), z.object({ maxIdleMs: z.number().int().positive().optional() })]).optional(),\n })\n .passthrough(); // Allow additional fields for forward compatibility\n\n/**\n * Legacy body schema for deprecated endpoints that still use threadId/resourceId\n * Used by /agents/:agentId/generate-legacy and /agents/:agentId/stream-legacy\n */\nexport const agentExecutionLegacyBodySchema = agentExecutionBodySchema.extend({\n resourceId: z.string().optional(),\n resourceid: z.string().optional(), // lowercase variant\n threadId: z.string().optional(),\n // Legacy generate/stream expect AI SDK v4 CoreMessage context and a string system message.\n context: typedPermissive<CoreMessageV4[]>(z.array(coreMessageSchema)).optional(),\n system: typedPermissive<string>(systemMessageSchema).optional(),\n});\n\nexport const streamUntilIdleBodySchema = agentExecutionBodySchema.extend({\n maxIdleMs: z.number().int().positive().optional(),\n untilIdle: z.union([z.boolean(), z.object({ maxIdleMs: z.number().int().positive().optional() })]).optional(),\n});\n\nexport const resumeStreamUntilIdleBodySchema = agentExecutionBodySchema.omit({ messages: true }).extend({\n runId: z.string(),\n resumeData: z.unknown().refine(x => x !== undefined, { message: 'resumeData is required' }),\n toolCallId: z.string().optional(),\n maxIdleMs: z.number().int().positive().optional(),\n});\n/**\n * Body schema for tool execute endpoint\n * Simple schema - tool validates its own input data\n * Note: The .refine() ensures data is required\n * (bare z.unknown() is treated as optional by Zod)\n */\nconst executeToolDataBodySchema = z.object({\n data: z.unknown().refine(x => x !== undefined, { message: 'data is required' }),\n});\n\nexport const executeToolBodySchema = executeToolDataBodySchema.extend({\n requestContext: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const executeToolContextBodySchema = executeToolDataBodySchema.extend({\n requestContext: z.record(z.string(), z.unknown()).optional(),\n});\n\n// ============================================================================\n// Tool Approval Schemas\n// ============================================================================\n\n/**\n * Base schema for tool approval/decline operations\n * Both approve and decline use the same parameters\n */\nconst toolCallActionBodySchema = z.object({\n runId: z.string(),\n model: z.string().optional(),\n requestContext: z.record(z.string(), z.unknown()).optional(),\n toolCallId: z.string(),\n format: z.string().optional(),\n providerOptions: z.record(z.string(), z.record(z.string(), jsonValueSchema)).optional(),\n modelSettings: typedPermissive<ModelSettings>(z.unknown()).optional(),\n // Client tools must be re-sent on resume so the model can call them after the approval decision.\n clientTools: typedPermissive<ToolsInput>(z.record(z.string(), z.unknown())).optional(),\n});\nconst networkToolCallActionBodySchema = z.object({\n runId: z.string(),\n model: z.string().optional(),\n requestContext: z.record(z.string(), z.unknown()).optional(),\n format: z.string().optional(),\n});\n\n/**\n * Body schema for approving tool call\n */\nexport const approveToolCallBodySchema = toolCallActionBodySchema;\n\n/**\n * Body schema for declining tool call\n */\nexport const declineToolCallBodySchema = toolCallActionBodySchema.extend({\n /** Optional explanation surfaced to the model in place of the default decline message. */\n reason: z.string().optional(),\n});\n\n/**\n * Body schema for approving network tool call\n */\nexport const approveNetworkToolCallBodySchema = networkToolCallActionBodySchema;\n\n/**\n * Body schema for declining network tool call\n */\nexport const declineNetworkToolCallBodySchema = networkToolCallActionBodySchema.extend({\n /** Optional explanation surfaced in place of the default decline message. */\n reason: z.string().optional(),\n});\n\n/**\n * Response schema for tool approval/decline\n */\nexport const toolCallResponseSchema = z.object({\n fullStream: z.unknown(), // ReadableStream\n});\n\nexport const sendToolApprovalResponseSchema = z.object({\n accepted: z.literal(true),\n runId: z.string(),\n toolCallId: z.string().optional(),\n});\n\n/**\n * Query schema for listing suspended agent runs\n */\nexport const listSuspendedRunsQuerySchema = z\n .object({\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n fromDate: z.coerce.date().optional(),\n toDate: z.coerce.date().optional(),\n perPage: z.coerce.number().int().positive().optional(),\n // page is zero-indexed, so 0 is valid\n page: z.coerce.number().int().nonnegative().optional(),\n })\n .refine(data => !data.fromDate || !data.toDate || data.fromDate <= data.toDate, {\n message: 'fromDate must be less than or equal to toDate',\n path: ['fromDate'],\n });\n\n/**\n * Response schema for listing suspended agent runs\n */\nexport const listSuspendedRunsResponseSchema = z.object({\n runs: z.array(\n z.object({\n runId: z.string(),\n status: z.literal('suspended'),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n suspendedAt: z.date(),\n toolCalls: z.array(\n z.object({\n toolCallId: z.string().optional(),\n toolName: z.string().optional(),\n args: z.unknown().optional(),\n requiresApproval: z.boolean(),\n suspendPayload: z.unknown().optional(),\n }),\n ),\n }),\n ),\n total: z.number().int().nonnegative(),\n});\n\n// ============================================================================\n// Resume Stream Schema\n// ============================================================================\n\n/**\n * Body schema for resuming a suspended agent stream with custom data.\n * Extends the agent execution body without messages, since resume\n * continues from a prior suspension point rather than starting fresh.\n */\nexport const resumeStreamBodySchema = agentExecutionBodySchema.omit({ messages: true }).extend({\n runId: z.string(),\n resumeData: z.unknown().refine(x => x !== undefined, { message: 'resumeData is required' }),\n toolCallId: z.string().optional(),\n});\n\n// ============================================================================\n// Recover Schema\n// ============================================================================\n\n/**\n * Body schema for recovering an orphaned RUNNING durable-agent run.\n * Thread and resource are read from the persisted snapshot, so we only accept\n * the runId plus request-context / version overrides needed for auth and\n * routing.\n */\nexport const recoverBodySchema = z.object({\n runId: z.string(),\n requestContext: z.record(z.string(), z.unknown()).optional(),\n versions: z\n .object({\n agents: z\n .record(\n z.string(),\n z.union([z.object({ versionId: z.string() }), z.object({ status: z.enum(['draft', 'published']) })]),\n )\n .optional(),\n defaultStatus: z.enum(['draft', 'published']).optional(),\n })\n .optional(),\n});\n\n// ============================================================================\n// Model Management Schemas\n// ============================================================================\n\n/**\n * Body schema for updating agent model\n */\nexport const updateAgentModelBodySchema = z.object({\n modelId: z.string(),\n provider: z.string(),\n});\n\n/**\n * Body schema for reordering agent model list\n */\nexport const reorderAgentModelListBodySchema = z.object({\n reorderedModelIds: z.array(z.string()),\n});\n\n/**\n * Body schema for updating model in model list\n */\nexport const updateAgentModelInModelListBodySchema = z.object({\n model: z\n .object({\n modelId: z.string(),\n provider: z.string(),\n })\n .optional(),\n maxRetries: z.number().optional(),\n enabled: z.boolean().optional(),\n});\n\n/**\n * Response schema for model management operations\n */\nexport const modelManagementResponseSchema = messageResponseSchema;\n\n// ============================================================================\n// Response schemas for agent generation endpoints\n// These return AI SDK types which have complex structures\n// ============================================================================\n\nexport const generateResponseSchema = z.unknown(); // AI SDK GenerateResult type\nexport const streamResponseSchema = z.unknown(); // AI SDK StreamResult type\nexport const executeToolResponseSchema = z.unknown(); // Tool execution result varies by tool\n\n// ============================================================================\n// Instruction Enhancement Schemas\n// ============================================================================\n\n/**\n * Body schema for enhancing agent instructions\n */\nexport const enhanceInstructionsBodySchema = z.object({\n instructions: z.string().describe('The current agent instructions to enhance'),\n comment: z.string().describe('User comment describing how to enhance the instructions'),\n});\n\n/**\n * Response schema for enhanced instructions\n */\nexport const enhanceInstructionsResponseSchema = z.object({\n explanation: z.string().describe('Explanation of the changes made'),\n new_prompt: z.string().describe('The enhanced instructions'),\n});\n\n// ============================================================================\n// Observe (Resumable Streams) Schemas\n// ============================================================================\n\n/**\n * Body schema for observing an agent stream\n * Used to reconnect to an existing stream and receive missed events\n */\nexport const observeAgentBodySchema = z.object({\n runId: z.string().describe('The run ID to observe/reconnect to'),\n offset: z.number().optional().describe('Resume from this event index (0-based). If omitted, replays all events.'),\n});\n\nconst signalActiveBehaviorSchema = z.enum(['deliver', 'persist', 'discard']);\nconst signalIdleBehaviorSchema = z.enum(['wake', 'persist', 'discard']);\n\nconst signalTargetBaseBodySchema = z.object({\n ifActive: z\n .object({\n behavior: signalActiveBehaviorSchema.optional(),\n attributes: signalAttributesSchema.optional(),\n })\n .optional(),\n});\n\nconst signalTargetBodySchema = z.union([\n signalTargetBaseBodySchema.extend({\n runId: z.string(),\n resourceId: z.string().optional(),\n threadId: z.string().optional(),\n ifIdle: z.undefined().optional(),\n }),\n signalTargetBaseBodySchema.extend({\n runId: z.undefined().optional(),\n resourceId: z.string(),\n threadId: z.string(),\n ifIdle: z\n .object({\n behavior: signalIdleBehaviorSchema.optional(),\n streamOptions: agentExecutionBodySchema.omit({ messages: true }).optional(),\n attributes: signalAttributesSchema.optional(),\n })\n .optional(),\n }),\n]);\n\nexport const sendAgentSignalBodySchema = z.union([\n signalTargetBodySchema.options[0].extend({ signal: agentSignalSchema }),\n signalTargetBodySchema.options[1].extend({ signal: agentSignalSchema }),\n]);\n\nexport const sendAgentMessageBodySchema = z.union([\n signalTargetBodySchema.options[0].extend({ message: agentMessageInputSchema }),\n signalTargetBodySchema.options[1].extend({ message: agentMessageInputSchema }),\n]);\n\nexport const queueAgentMessageBodySchema = sendAgentMessageBodySchema;\nexport const queueAgentSignalBodySchema = sendAgentSignalBodySchema;\n\nconst agentThreadBodySchema = z.object({\n resourceId: z.string().optional(),\n threadId: z.string(),\n});\n\nexport const subscribeAgentThreadBodySchema = agentThreadBodySchema.extend({\n withInitialHistory: z\n .union([z.boolean(), z.object({ perPage: z.number().int().positive().optional() })])\n .optional()\n .describe('Emit one thread-history chunk with stored messages before live parts'),\n});\n\nexport const abortAgentThreadBodySchema = agentThreadBodySchema.extend({\n threadId: z.string().min(1),\n clearPendingSignals: z.boolean().optional(),\n expectedRunId: z.string().optional(),\n});\n\nexport const cancelPendingAgentSignalsBodySchema = agentThreadBodySchema.extend({\n threadId: z.string().min(1),\n signalIds: z.array(z.string().min(1)).min(1).max(1000),\n});\n\nexport const cancelPendingAgentSignalsResponseSchema = z.object({\n cancelledSignalIds: z.array(z.string()),\n});\n\nexport const sendToolApprovalBodySchema = z.object({\n resourceId: z.string(),\n threadId: z.string(),\n requestContext: z.record(z.string(), z.unknown()).optional(),\n toolCallId: z.string(),\n approved: z.boolean(),\n resumeData: z.unknown().optional(),\n format: z.string().optional(),\n messages: z.array(coreMessageSchema).optional(),\n streamOptions: typedPermissive<AgentExecutionOptions<undefined>>(z.unknown()).optional(),\n});\n\nexport const abortAgentThreadResponseSchema = z.object({\n aborted: z.boolean(),\n});\n\n/**\n * Response schema for observe endpoint (streaming response)\n */\nexport const observeAgentResponseSchema = z.unknown(); // Streaming response\n"],"mappings":"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"}
|