{"version":3,"sources":["../src/server/handlers/workspace.ts"],"names":["__export","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"],"mappings":"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","file":"chunk-USU23GYD.cjs","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 {\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 {\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 `/.agents/skills/`.\n * For non-composite: returns `.agents/skills/` (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();\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: 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 = decodeURIComponent(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 = decodeURIComponent(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: decodeURIComponent(path),\n entries: [],\n error: 'No workspace filesystem configured',\n };\n }\n\n const decodedPath = decodeURIComponent(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 = decodeURIComponent(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 = decodeURIComponent(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 = decodeURIComponent(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 ? decodeURIComponent(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 ? decodeURIComponent(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 if (!skillName || !referencePath) {\n throw new HTTPException(400, { message: 'Skill name and reference path are required' });\n }\n\n // Use the optional ?path= query param for disambiguation, otherwise fall back to name\n const identifier = skillPath ? decodeURIComponent(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 // Decode the reference path (it may be URL encoded)\n let decodedPath: string;\n try {\n decodedPath = decodeURIComponent(referencePath);\n } catch {\n throw new HTTPException(400, { message: 'Malformed referencePath' });\n }\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 {\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"]}