{"version":3,"sources":["../src/workspace/errors.ts","../src/workspace/filesystem/fs-utils.ts","../src/workspace/skills/local-skill-source.ts","../src/workspace/glob.ts","../src/workspace/skills/schemas.ts","../src/skills/create-skill.ts","../src/skills/inline-skill-source.ts","../src/workspace/skills/workspace-skills.ts","../src/skills/agent-skills-resolver.ts"],"names":["path","os","fs","path2","fs2","picomatch","readdir","matter","stat"],"mappings":"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","file":"chunk-ZNDOO55R.cjs","sourcesContent":["/**\n * Workspace Errors\n *\n * Error classes for workspace operations.\n */\n\nimport type { WorkspaceStatus } from './types';\n\n// =============================================================================\n// Base Error\n// =============================================================================\n\nexport class WorkspaceError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly workspaceId?: string,\n  ) {\n    super(message);\n    this.name = 'WorkspaceError';\n  }\n}\n\n// =============================================================================\n// Availability Errors\n// =============================================================================\n\nexport class WorkspaceNotAvailableError extends WorkspaceError {\n  constructor() {\n    super('Workspace not available. Ensure the agent has a workspace configured.', 'NO_WORKSPACE');\n    this.name = 'WorkspaceNotAvailableError';\n  }\n}\n\nexport class FilesystemNotAvailableError extends WorkspaceError {\n  constructor() {\n    super('Workspace does not have a filesystem configured', 'NO_FILESYSTEM');\n    this.name = 'FilesystemNotAvailableError';\n  }\n}\n\nexport class SandboxNotAvailableError extends WorkspaceError {\n  constructor(message?: string) {\n    super(message ?? 'Workspace does not have a sandbox configured', 'NO_SANDBOX');\n    this.name = 'SandboxNotAvailableError';\n  }\n}\n\nexport class SandboxFeatureNotSupportedError extends WorkspaceError {\n  constructor(feature: 'executeCommand' | 'installPackage' | 'processes') {\n    super(`Sandbox does not support ${feature}`, 'FEATURE_NOT_SUPPORTED');\n    this.name = 'SandboxFeatureNotSupportedError';\n  }\n}\n\nexport class SearchNotAvailableError extends WorkspaceError {\n  constructor() {\n    super('Workspace does not have search configured (enable bm25 or provide vectorStore + embedder)', 'NO_SEARCH');\n    this.name = 'SearchNotAvailableError';\n  }\n}\n\n// =============================================================================\n// State Errors\n// =============================================================================\n\nexport class WorkspaceNotReadyError extends WorkspaceError {\n  constructor(workspaceId: string, status: WorkspaceStatus) {\n    super(`Workspace is not ready (status: ${status})`, 'NOT_READY', workspaceId);\n    this.name = 'WorkspaceNotReadyError';\n  }\n}\n\nexport class WorkspaceReadOnlyError extends WorkspaceError {\n  constructor(operation: string) {\n    super(`Workspace is in read-only mode. Cannot perform: ${operation}`, 'READ_ONLY');\n    this.name = 'WorkspaceReadOnlyError';\n  }\n}\n\n// =============================================================================\n// Filesystem Errors\n// =============================================================================\n\nexport class FilesystemError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly path: string,\n  ) {\n    super(message);\n    this.name = 'FilesystemError';\n  }\n}\n\nexport class FileNotFoundError extends FilesystemError {\n  constructor(path: string) {\n    super(`File not found: ${path}`, 'ENOENT', path);\n    this.name = 'FileNotFoundError';\n  }\n}\n\nexport class DirectoryNotFoundError extends FilesystemError {\n  constructor(path: string) {\n    super(`Directory not found: ${path}`, 'ENOENT', path);\n    this.name = 'DirectoryNotFoundError';\n  }\n}\n\nexport class FileExistsError extends FilesystemError {\n  constructor(path: string) {\n    super(`File already exists: ${path}`, 'EEXIST', path);\n    this.name = 'FileExistsError';\n  }\n}\n\nexport class IsDirectoryError extends FilesystemError {\n  constructor(path: string) {\n    super(`Path is a directory: ${path}`, 'EISDIR', path);\n    this.name = 'IsDirectoryError';\n  }\n}\n\nexport class NotDirectoryError extends FilesystemError {\n  constructor(path: string) {\n    super(`Path is not a directory: ${path}`, 'ENOTDIR', path);\n    this.name = 'NotDirectoryError';\n  }\n}\n\nexport class DirectoryNotEmptyError extends FilesystemError {\n  constructor(path: string) {\n    super(`Directory not empty: ${path}`, 'ENOTEMPTY', path);\n    this.name = 'DirectoryNotEmptyError';\n  }\n}\n\nexport class PermissionError extends FilesystemError {\n  constructor(\n    path: string,\n    public readonly operation: string,\n  ) {\n    super(`Permission denied: ${operation} on ${path}`, 'EACCES', path);\n    this.name = 'PermissionError';\n  }\n}\n\nexport class FileReadRequiredError extends FilesystemError {\n  constructor(path: string, reason: string) {\n    super(reason, 'EREAD_REQUIRED', path);\n    this.name = 'FileReadRequiredError';\n  }\n}\n\nexport class StaleFileError extends FilesystemError {\n  constructor(\n    path: string,\n    public readonly expectedMtime: Date,\n    public readonly actualMtime: Date,\n  ) {\n    super(\n      `File was modified externally: ${path} (expected mtime ${expectedMtime.toISOString()}, actual ${actualMtime.toISOString()})`,\n      'ESTALE',\n      path,\n    );\n    this.name = 'StaleFileError';\n  }\n}\n\n/**\n * Error thrown when a filesystem operation is attempted before initialization.\n */\nexport class FilesystemNotReadyError extends FilesystemError {\n  constructor(id: string) {\n    super(`Filesystem \"${id}\" is not ready. Call init() first or use ensureReady().`, 'ENOTREADY', id);\n    this.name = 'FilesystemNotReadyError';\n  }\n}\n","/**\n * Shared filesystem utilities for LocalFilesystem and LocalSkillSource.\n *\n * These utilities provide consistent implementations for common fs operations.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport { FileNotFoundError } from '../errors';\n\n// =============================================================================\n// Tilde Expansion\n// =============================================================================\n\n/**\n * Expand a leading `~` or `~/` to the user's home directory.\n * Shell commands handle this automatically, but Node.js path APIs do not.\n */\nexport function expandTilde(p: string): string {\n  if (p === '~') return os.homedir();\n  if (p.startsWith('~/') || p.startsWith('~\\\\')) {\n    return path.join(os.homedir(), p.slice(2));\n  }\n  return p;\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Full file stat information.\n * Used by both WorkspaceFilesystem and SkillSource.\n */\nexport interface FsStatResult {\n  /** File or directory name */\n  name: string;\n  /** 'file' or 'directory' */\n  type: 'file' | 'directory';\n  /** Size in bytes (0 for directories) */\n  size: number;\n  /** Creation time */\n  createdAt: Date;\n  /** Last modification time */\n  modifiedAt: Date;\n  /** MIME type (for files) */\n  mimeType?: string;\n}\n\n// =============================================================================\n// Error Utilities\n// =============================================================================\n\n/**\n * Check if an error is an ENOENT (file not found) error.\n */\nexport function isEnoentError(error: unknown): error is NodeJS.ErrnoException & { code: 'ENOENT' } {\n  return (\n    error !== null && typeof error === 'object' && 'code' in error && (error as NodeJS.ErrnoException).code === 'ENOENT'\n  );\n}\n\n/**\n * Check if an error is an EEXIST (file exists) error.\n */\nexport function isEexistError(error: unknown): error is NodeJS.ErrnoException & { code: 'EEXIST' } {\n  return (\n    error !== null && typeof error === 'object' && 'code' in error && (error as NodeJS.ErrnoException).code === 'EEXIST'\n  );\n}\n\n// =============================================================================\n// MIME Type Detection\n// =============================================================================\n\nconst MIME_TYPES: Record<string, string> = {\n  // Text\n  txt: 'text/plain',\n  html: 'text/html',\n  htm: 'text/html',\n  css: 'text/css',\n  csv: 'text/csv',\n  md: 'text/markdown',\n  // Code\n  js: 'application/javascript',\n  mjs: 'application/javascript',\n  ts: 'application/typescript',\n  tsx: 'application/typescript',\n  jsx: 'application/javascript',\n  json: 'application/json',\n  xml: 'application/xml',\n  yaml: 'text/yaml',\n  yml: 'text/yaml',\n  // Programming languages\n  py: 'text/x-python',\n  rb: 'text/x-ruby',\n  go: 'text/x-go',\n  rs: 'text/x-rust',\n  java: 'text/x-java',\n  c: 'text/x-c',\n  cpp: 'text/x-c++',\n  h: 'text/x-c',\n  hpp: 'text/x-c++',\n  sh: 'text/x-sh',\n  bash: 'text/x-sh',\n  zsh: 'text/x-sh',\n  // Config\n  toml: 'text/toml',\n  ini: 'text/plain',\n  env: 'text/plain',\n  // Database/Query\n  sql: 'text/x-sql',\n  graphql: 'application/graphql',\n  gql: 'application/graphql',\n  // Frameworks\n  vue: 'text/x-vue',\n  svelte: 'text/x-svelte',\n  // Web styles\n  scss: 'text/x-scss',\n  sass: 'text/x-sass',\n  less: 'text/x-less',\n  // Additional languages\n  php: 'application/x-php',\n  swift: 'text/x-swift',\n  kt: 'text/x-kotlin',\n  kts: 'text/x-kotlin',\n  dart: 'application/dart',\n  lua: 'text/x-lua',\n  r: 'text/x-r',\n  tf: 'text/x-terraform',\n  tfvars: 'text/x-terraform',\n  mdx: 'text/markdown',\n  // Images\n  png: 'image/png',\n  jpg: 'image/jpeg',\n  jpeg: 'image/jpeg',\n  gif: 'image/gif',\n  svg: 'image/svg+xml',\n  webp: 'image/webp',\n  ico: 'image/x-icon',\n  bmp: 'image/bmp',\n  tiff: 'image/tiff',\n  tif: 'image/tiff',\n  heic: 'image/heic',\n  heif: 'image/heif',\n  avif: 'image/avif',\n  // Documents\n  pdf: 'application/pdf',\n  // Audio\n  mp3: 'audio/mpeg',\n  wav: 'audio/wav',\n  ogg: 'audio/ogg',\n  flac: 'audio/flac',\n  m4a: 'audio/mp4',\n  aac: 'audio/aac',\n  // Video\n  mp4: 'video/mp4',\n  webm: 'video/webm',\n  mov: 'video/quicktime',\n  avi: 'video/x-msvideo',\n  mkv: 'video/x-matroska',\n  // Archives\n  zip: 'application/zip',\n  tar: 'application/x-tar',\n  gz: 'application/gzip',\n  tgz: 'application/gzip',\n  bz2: 'application/x-bzip2',\n  '7z': 'application/x-7z-compressed',\n  rar: 'application/vnd.rar',\n  // Executables / binaries\n  exe: 'application/vnd.microsoft.portable-executable',\n  dll: 'application/vnd.microsoft.portable-executable',\n  so: 'application/x-sharedlib',\n  dylib: 'application/x-sharedlib',\n  bin: 'application/x-binary',\n  dat: 'application/x-binary',\n  // Disk images / packages\n  dmg: 'application/x-apple-diskimage',\n  iso: 'application/x-iso9660-image',\n  deb: 'application/vnd.debian.binary-package',\n  rpm: 'application/x-rpm',\n  // Office documents\n  doc: 'application/msword',\n  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  xls: 'application/vnd.ms-excel',\n  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  ppt: 'application/vnd.ms-powerpoint',\n  pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n  // Fonts\n  ttf: 'font/ttf',\n  otf: 'font/otf',\n  woff: 'font/woff',\n  woff2: 'font/woff2',\n  // Compiled code\n  wasm: 'application/wasm',\n  class: 'application/java-vm',\n  pyc: 'application/x-python-code',\n};\n\n/**\n * Get MIME type for a filename based on extension.\n */\nexport function getMimeType(filename: string): string {\n  const ext = path.extname(filename).slice(1).toLowerCase();\n  return MIME_TYPES[ext] ?? 'application/octet-stream';\n}\n\n/**\n * Extensions that should be treated as text files.\n */\nconst TEXT_EXTENSIONS = new Set([\n  '.md',\n  '.txt',\n  '.json',\n  '.yaml',\n  '.yml',\n  '.js',\n  '.mjs',\n  '.ts',\n  '.tsx',\n  '.jsx',\n  '.py',\n  '.rb',\n  '.go',\n  '.rs',\n  '.java',\n  '.c',\n  '.cpp',\n  '.h',\n  '.hpp',\n  '.sh',\n  '.bash',\n  '.zsh',\n  '.html',\n  '.htm',\n  '.css',\n  '.xml',\n  '.toml',\n  '.ini',\n  '.env',\n  '.csv',\n  '.sql',\n  '.graphql',\n  '.gql',\n  '.vue',\n  '.svg',\n  '.mdx',\n  '.scss',\n  '.sass',\n  '.less',\n  '.svelte',\n  '.php',\n  '.swift',\n  '.kt',\n  '.kts',\n  '.dart',\n  '.lua',\n  '.r',\n  '.tf',\n  '.tfvars',\n]);\n\n/**\n * Check if a file should be treated as text based on extension.\n */\nexport function isTextFile(filename: string): boolean {\n  const ext = path.extname(filename).toLowerCase();\n  return TEXT_EXTENSIONS.has(ext);\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\n/**\n * Resolve a path against a base directory.\n *\n * - Tilde (`~`) is expanded to the user's home directory.\n * - Absolute paths are normalized and returned as-is.\n * - Relative paths (including `../`) are resolved against `basePath`.\n *\n * @param basePath - The absolute base path to resolve against\n * @param filePath - The path to resolve\n * @returns The absolute resolved path\n */\nexport function resolveToBasePath(basePath: string, filePath: string): string {\n  const expanded = expandTilde(filePath);\n  if (path.isAbsolute(expanded)) {\n    return path.normalize(expanded);\n  }\n  return path.resolve(basePath, expanded);\n}\n\n// =============================================================================\n// Filesystem Operations\n// =============================================================================\n\n/**\n * Check if a path exists.\n * Never throws - returns false on any error.\n *\n * @param absolutePath - The absolute path to check\n * @returns true if path exists and is accessible\n */\nexport async function fsExists(absolutePath: string): Promise<boolean> {\n  try {\n    await fs.access(absolutePath);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Get file/directory stats.\n * Throws FileNotFoundError if path doesn't exist.\n *\n * @param absolutePath - The absolute path to stat\n * @param userPath - The user-facing path for error messages\n * @returns File stat information\n * @throws {FileNotFoundError} if path doesn't exist\n */\nexport async function fsStat(absolutePath: string, userPath: string): Promise<FsStatResult> {\n  try {\n    const stats = await fs.stat(absolutePath);\n    return {\n      name: path.basename(absolutePath),\n      type: stats.isDirectory() ? 'directory' : 'file',\n      size: stats.size,\n      createdAt: stats.birthtime,\n      modifiedAt: stats.mtime,\n      mimeType: stats.isFile() ? getMimeType(absolutePath) : undefined,\n    };\n  } catch (error: unknown) {\n    if (isEnoentError(error)) {\n      throw new FileNotFoundError(userPath);\n    }\n    throw error;\n  }\n}\n","/**\n * LocalSkillSource - Read-only skill source backed by local filesystem.\n *\n * Uses Node.js fs/promises to read skills directly from disk.\n * This allows skills to be loaded without requiring a full WorkspaceFilesystem.\n *\n * @example\n * ```typescript\n * const source = new LocalSkillSource({\n *   basePath: process.cwd(),\n * });\n *\n * // skills paths are relative to basePath\n * const skillsImpl = new WorkspaceSkillsImpl({\n *   source,\n *   skills: ['./skills', './node_modules/@company/skills'],\n * });\n * ```\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport { fsExists, fsStat, isTextFile } from '../filesystem';\nimport type { SkillSource, SkillSourceEntry, SkillSourceStat } from './skill-source';\n\n/**\n * Configuration for LocalSkillSource.\n */\nexport interface LocalSkillSourceOptions {\n  /**\n   * Base path for resolving relative skill paths.\n   * Defaults to process.cwd().\n   */\n  basePath?: string;\n}\n\n/**\n * Read-only skill source that loads skills from the local filesystem.\n *\n * Unlike WorkspaceFilesystem, this doesn't provide write operations.\n * Skills loaded from this source are read-only.\n */\nexport class LocalSkillSource implements SkillSource {\n  readonly #basePath: string;\n\n  constructor(options: LocalSkillSourceOptions = {}) {\n    this.#basePath = options.basePath ?? process.cwd();\n  }\n\n  /**\n   * Resolve a path relative to the base path.\n   * Handles both absolute and relative paths.\n   */\n  #resolvePath(skillPath: string): string {\n    if (path.isAbsolute(skillPath)) {\n      return skillPath;\n    }\n    return path.resolve(this.#basePath, skillPath);\n  }\n\n  async exists(skillPath: string): Promise<boolean> {\n    return fsExists(this.#resolvePath(skillPath));\n  }\n\n  async stat(skillPath: string): Promise<SkillSourceStat> {\n    return fsStat(this.#resolvePath(skillPath), skillPath);\n  }\n\n  async readFile(skillPath: string): Promise<string | Buffer> {\n    const resolved = this.#resolvePath(skillPath);\n    const content = await fs.readFile(resolved);\n    // Convert to string for text files\n    if (isTextFile(skillPath)) {\n      return content.toString('utf-8');\n    }\n    return content;\n  }\n\n  async readdir(skillPath: string): Promise<SkillSourceEntry[]> {\n    const resolved = this.#resolvePath(skillPath);\n    const entries = await fs.readdir(resolved, { withFileTypes: true });\n    // Dirent.isDirectory() returns false for symlinks, even when they point to\n    // directories. Detect the target type so skill discovery can load symlinked\n    // skills while still letting higher layers decide whether to recurse.\n    return Promise.all(\n      entries.map(async entry => {\n        const entryPath = path.join(resolved, entry.name);\n        const isSymlink = entry.isSymbolicLink();\n        let type: SkillSourceEntry['type'] = entry.isDirectory() ? 'directory' : 'file';\n\n        if (isSymlink) {\n          try {\n            const targetStat = await fs.stat(entryPath);\n            type = targetStat.isDirectory() ? 'directory' : 'file';\n          } catch {\n            type = 'file';\n          }\n        }\n\n        return {\n          name: entry.name,\n          type,\n          isSymlink: isSymlink || undefined,\n        };\n      }),\n    );\n  }\n\n  async realpath(skillPath: string): Promise<string> {\n    return fs.realpath(this.#resolvePath(skillPath));\n  }\n}\n","/**\n * Glob Pattern Utilities\n *\n * Shared glob pattern matching for workspace operations.\n * Uses picomatch for battle-tested glob support including\n * brace expansion, character classes, negation, and `**`.\n */\n\nimport picomatch from 'picomatch';\n\n// =============================================================================\n// Glob Metacharacter Detection\n// =============================================================================\n\n/** Characters that indicate a glob pattern (not a plain path) */\nconst GLOB_CHARS = /[*?{}[\\]]/;\n\n/**\n * Check if a string contains glob metacharacters.\n *\n * @example\n * isGlobPattern('/docs')           // false\n * isGlobPattern('/docs/**\\/*.md')   // true\n * isGlobPattern('*.ts')            // true\n * isGlobPattern('/src/{a,b}')      // true\n */\nexport function isGlobPattern(input: string): boolean {\n  return GLOB_CHARS.test(input);\n}\n\n// =============================================================================\n// Glob Base Extraction\n// =============================================================================\n\n/**\n * Extract the static directory prefix before the first glob metacharacter.\n * Returns the deepest non-glob ancestor directory.\n *\n * @example\n * extractGlobBase('docs/**\\/*.md')   // 'docs'\n * extractGlobBase('**\\/*.md')        // '.'\n * extractGlobBase('src/*.ts')       // 'src'\n * extractGlobBase('exact/path')     // 'exact/path'\n */\nexport function extractGlobBase(pattern: string): string {\n  // Find position of first glob metacharacter\n  const firstMeta = pattern.search(GLOB_CHARS);\n\n  if (firstMeta === -1) {\n    // No glob chars — return the pattern as-is (it's a plain path)\n    return pattern;\n  }\n\n  // Get the portion before the first metacharacter\n  const prefix = pattern.slice(0, firstMeta);\n\n  // Walk back to the last directory separator\n  const lastSlash = prefix.lastIndexOf('/');\n\n  if (lastSlash <= 0) {\n    // No slash or only root slash — base is workspace root\n    return '.';\n  }\n\n  return prefix.slice(0, lastSlash);\n}\n\n// =============================================================================\n// Glob Matcher\n// =============================================================================\n\n/** A compiled matcher function: returns true if a path matches */\nexport type GlobMatcher = (path: string) => boolean;\n\nexport interface GlobMatcherOptions {\n  /** Match dotfiles (default: false) */\n  dot?: boolean;\n}\n\n/**\n * Strip leading './' or '/' from a path for picomatch matching.\n * picomatch does not match paths with these prefixes, so both\n * patterns and test paths must be normalized before matching.\n *\n * This only affects matching — filesystem paths should keep their\n * original form for correct resolution with contained/uncontained modes.\n */\nfunction normalizeForMatch(input: string): string {\n  if (input.startsWith('./')) return input.slice(2);\n  if (input.startsWith('/')) return input.slice(1);\n  return input;\n}\n\n/**\n * Compile glob pattern(s) into a reusable matcher function.\n * The matcher tests paths using workspace-style forward slashes.\n *\n * Automatically normalizes leading './' and '/' from both patterns\n * and test paths, since picomatch does not match these prefixes.\n *\n * @example\n * const match = createGlobMatcher('**\\/*.ts');\n * match('src/index.ts')     // true\n * match('src/style.css')    // false\n *\n * const multi = createGlobMatcher(['**\\/*.ts', '**\\/*.tsx']);\n * multi('App.tsx')           // true\n */\nexport function createGlobMatcher(patterns: string | string[], options?: GlobMatcherOptions): GlobMatcher {\n  const patternArray = (Array.isArray(patterns) ? patterns : [patterns]).map(normalizeForMatch);\n  const matcher = picomatch(patternArray, {\n    posix: true,\n    dot: options?.dot ?? false,\n  });\n  return (path: string) => matcher(normalizeForMatch(path));\n}\n\n/**\n * One-off convenience: test if a path matches a glob pattern.\n *\n * For repeated matching against the same pattern, prefer createGlobMatcher()\n * to compile once and reuse.\n *\n * @example\n * matchGlob('src/index.ts', '**\\/*.ts')  // true\n */\nexport function matchGlob(path: string, pattern: string | string[], options?: GlobMatcherOptions): boolean {\n  return createGlobMatcher(pattern, options)(path);\n}\n\n// =============================================================================\n// Path Pattern Resolution\n// =============================================================================\n\n/** A filesystem entry returned by resolvePathPattern */\nexport interface PathEntry {\n  path: string;\n  type: 'file' | 'directory';\n}\n\n/** Minimal readdir entry — compatible with both FileEntry and SkillSourceEntry */\nexport interface ReaddirEntry {\n  name: string;\n  type: 'file' | 'directory';\n  isSymlink?: boolean;\n}\n\nexport interface ResolvePathOptions {\n  /** Match dotfiles (default: false) */\n  dot?: boolean;\n  /** Maximum directory depth to walk (default: 10) */\n  maxDepth?: number;\n}\n\n/**\n * Walk a directory tree recursively, returning all entries (files and directories).\n * Skips symlinked directories to prevent infinite loops.\n */\nasync function walkAll(\n  readdir: (dir: string) => Promise<ReaddirEntry[]>,\n  dir: string,\n  depth: number,\n  maxDepth: number,\n): Promise<PathEntry[]> {\n  if (depth >= maxDepth) return [];\n  try {\n    const entries = await readdir(dir);\n    const results: PathEntry[] = [];\n    for (const entry of entries) {\n      if (entry.type === 'directory' && entry.isSymlink) continue;\n      const fullPath = dir === '.' || dir === '' ? entry.name : `${dir}/${entry.name}`;\n      results.push({ path: fullPath, type: entry.type });\n      if (entry.type === 'directory') {\n        results.push(...(await walkAll(readdir, fullPath, depth + 1, maxDepth)));\n      }\n    }\n    return results;\n  } catch {\n    return [];\n  }\n}\n\n/**\n * Resolve a path pattern to matching filesystem entries.\n *\n * Handles both plain paths and glob patterns consistently:\n * - Plain paths: determines file vs directory via readdir probe, returns single entry\n * - Glob patterns: walks from the glob base, matches both files and directories\n *\n * @example\n * // Plain paths\n * resolvePathPattern('/docs', readdir)            // [{ path: '/docs', type: 'directory' }]\n * resolvePathPattern('/docs/readme.md', readdir)  // [{ path: '/docs/readme.md', type: 'file' }]\n *\n * // Glob patterns — matches files and directories\n * resolvePathPattern('/docs/**\\/*.md', readdir)    // all .md files under /docs\n * resolvePathPattern('**\\/skills', readdir)         // all directories (and files) named 'skills'\n * resolvePathPattern('/skills/**', readdir)         // everything under /skills\n */\nexport async function resolvePathPattern(\n  pattern: string,\n  readdir: (dir: string) => Promise<ReaddirEntry[]>,\n  options?: ResolvePathOptions,\n): Promise<PathEntry[]> {\n  const maxDepth = options?.maxDepth ?? 10;\n\n  // Strip trailing slash for consistent path handling (e.g. '/skills/' → '/skills')\n  const normalized = pattern.length > 1 && pattern.endsWith('/') ? pattern.slice(0, -1) : pattern;\n\n  if (!isGlobPattern(normalized)) {\n    // Plain path — probe with readdir to determine if it's a directory or file\n    try {\n      await readdir(normalized);\n      return [{ path: normalized, type: 'directory' }];\n    } catch {\n      // readdir failed — treat as a file path (consumer handles non-existence)\n      return [{ path: normalized, type: 'file' }];\n    }\n  }\n\n  // Glob pattern — walk from base, match all entries (files and directories)\n  const walkRoot = extractGlobBase(normalized);\n  const matcher = createGlobMatcher(normalized, { dot: options?.dot ?? false });\n  const allEntries = await walkAll(readdir, walkRoot, 0, maxDepth);\n  return allEntries.filter(entry => matcher(entry.path));\n}\n","/**\n * Validation for Skills following the Agent Skills specification.\n * @see https://agentskills.io/specification\n *\n * This module uses plain validation functions instead of Zod to avoid\n * version compatibility issues between Zod 3 and Zod 4.\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Recommended limits from the Agent Skills spec\n */\nexport const SKILL_LIMITS = {\n  /** Recommended max tokens for instructions */\n  MAX_INSTRUCTION_TOKENS: 5000,\n  /** Recommended max lines for SKILL.md */\n  MAX_INSTRUCTION_LINES: 500,\n  /** Max characters for name field */\n  MAX_NAME_LENGTH: 64,\n  /** Max characters for description field */\n  MAX_DESCRIPTION_LENGTH: 1024,\n  /** Max characters for compatibility field */\n  MAX_COMPATIBILITY_LENGTH: 500,\n} as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Skill metadata input type (what users provide)\n */\nexport interface SkillMetadataInput {\n  /** Skill name (1-64 chars, lowercase letters/numbers/hyphens only, must match directory name) */\n  name: string;\n  /** Description of what the skill does and when to use it (1-1024 characters) */\n  description: string;\n  /** License for the skill (e.g., \"Apache-2.0\", \"MIT\") */\n  license?: string;\n  /** Environment requirements or compatibility notes (string or object for flexibility) */\n  compatibility?: unknown;\n  /** Whether this skill should be directly invokable by users. Defaults to true. */\n  'user-invocable'?: boolean;\n  /** Arbitrary key-value metadata - values can be strings, arrays, objects, etc. */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Skill metadata output type (after validation)\n */\nexport type SkillMetadataOutput = SkillMetadataInput;\n\n/**\n * Validation result with warnings\n */\nexport interface SkillValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n}\n\n// =============================================================================\n// Field Validators\n// =============================================================================\n\n/**\n * Validate skill name according to spec:\n * - 1-64 characters\n * - Lowercase letters, numbers, hyphens only\n * - Must not start or end with hyphen\n * - Must not contain consecutive hyphens\n *\n * @param name - The name to validate\n * @returns Array of error messages (empty if valid)\n */\nfunction validateSkillName(name: unknown): string[] {\n  const errors: string[] = [];\n  const fieldPath = 'name';\n\n  // Check type\n  if (typeof name !== 'string') {\n    errors.push(`${fieldPath}: Expected string, received ${typeof name}`);\n    return errors;\n  }\n\n  // Check not empty\n  if (name.length === 0) {\n    errors.push(`${fieldPath}: Skill name cannot be empty`);\n    return errors;\n  }\n\n  // Check max length\n  if (name.length > SKILL_LIMITS.MAX_NAME_LENGTH) {\n    errors.push(`${fieldPath}: Skill name must be ${SKILL_LIMITS.MAX_NAME_LENGTH} characters or less`);\n  }\n\n  // Check allowed characters (lowercase letters, numbers, hyphens only)\n  if (!/^[a-z0-9-]+$/.test(name)) {\n    errors.push(`${fieldPath}: Skill name must contain only lowercase letters, numbers, and hyphens`);\n  }\n\n  // Check not starting or ending with hyphen\n  if (name.startsWith('-') || name.endsWith('-')) {\n    errors.push(`${fieldPath}: Skill name must not start or end with a hyphen`);\n  }\n\n  // Check no consecutive hyphens\n  if (name.includes('--')) {\n    errors.push(`${fieldPath}: Skill name must not contain consecutive hyphens`);\n  }\n\n  return errors;\n}\n\n/**\n * Validate skill description according to spec:\n * - 1-1024 characters\n * - Cannot be empty or only whitespace\n *\n * @param description - The description to validate\n * @returns Array of error messages (empty if valid)\n */\nfunction validateSkillDescription(description: unknown): string[] {\n  const errors: string[] = [];\n  const fieldPath = 'description';\n\n  // Check type\n  if (typeof description !== 'string') {\n    errors.push(`${fieldPath}: Expected string, received ${typeof description}`);\n    return errors;\n  }\n\n  // Check not empty\n  if (description.length === 0) {\n    errors.push(`${fieldPath}: Skill description cannot be empty`);\n    return errors;\n  }\n\n  // Check max length\n  if (description.length > SKILL_LIMITS.MAX_DESCRIPTION_LENGTH) {\n    errors.push(`${fieldPath}: Skill description must be ${SKILL_LIMITS.MAX_DESCRIPTION_LENGTH} characters or less`);\n  }\n\n  // Check not only whitespace\n  if (description.trim().length === 0) {\n    errors.push(`${fieldPath}: Skill description cannot be only whitespace`);\n  }\n\n  return errors;\n}\n\n/**\n * Validate skill license (optional string).\n *\n * @param license - The license to validate\n * @returns Array of error messages (empty if valid)\n */\nfunction validateSkillLicense(license: unknown): string[] {\n  const errors: string[] = [];\n  const fieldPath = 'license';\n\n  // Optional field - undefined/null is valid\n  if (license === undefined || license === null) {\n    return errors;\n  }\n\n  // If provided, must be string\n  if (typeof license !== 'string') {\n    errors.push(`${fieldPath}: Expected string, received ${typeof license}`);\n  }\n\n  return errors;\n}\n\n/**\n * Validate skill compatibility notes (optional).\n * Accepts string or any JSON-serializable value for flexibility with external skills.\n *\n * @param compatibility - The compatibility value to validate\n * @returns Array of error messages (empty if valid)\n */\nfunction validateSkillCompatibility(_compatibility: unknown): string[] {\n  // Optional field - any value is allowed (string, object, array, etc.)\n  // External skills don't always follow the spec strictly\n  return [];\n}\n\n/**\n * Validate skill metadata field (optional Record<string, unknown>).\n * Accepts any values (not just strings) for flexibility with external skills.\n *\n * @param metadata - The metadata object to validate\n * @returns Array of error messages (empty if valid)\n */\nfunction validateSkillMetadataField(metadata: unknown): string[] {\n  const errors: string[] = [];\n  const fieldPath = 'metadata';\n\n  // Optional field - undefined/null is valid\n  if (metadata === undefined || metadata === null) {\n    return errors;\n  }\n\n  // If provided, must be object (but values can be anything)\n  if (typeof metadata !== 'object' || Array.isArray(metadata)) {\n    errors.push(`${fieldPath}: Expected object, received ${Array.isArray(metadata) ? 'array' : typeof metadata}`);\n    return errors;\n  }\n\n  // Allow any values - external skills use arrays, objects, etc.\n  return errors;\n}\n\nfunction validateUserInvocable(userInvocable: unknown): string[] {\n  if (userInvocable === undefined || typeof userInvocable === 'boolean') return [];\n  return [`user-invocable: Expected boolean, received ${typeof userInvocable}`];\n}\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\n/**\n * Rough token estimate (words * 1.3)\n * This is a simple heuristic; actual token counts vary by model\n */\nfunction estimateTokens(text: string): number {\n  const words = text.split(/\\s+/).filter(Boolean).length;\n  return Math.ceil(words * 1.3);\n}\n\n/**\n * Count lines in text\n */\nfunction countLines(text: string): number {\n  return text.split('\\n').length;\n}\n\n// =============================================================================\n// Main Validation Function\n// =============================================================================\n\n/**\n * Validate skill metadata with optional content warnings.\n *\n * @param metadata - The skill metadata to validate\n * @param dirName - The directory name (must match skill name)\n * @param instructions - Optional instructions content for token/line warnings\n * @returns Validation result with errors and warnings\n *\n * @example\n * ```typescript\n * const result = validateSkillMetadata(\n *   { name: 'my-skill', description: 'A helpful skill' },\n *   'my-skill',\n *   '# Instructions\\n...'\n * );\n *\n * if (!result.valid) {\n *   console.error('Validation errors:', result.errors);\n * }\n * if (result.warnings.length > 0) {\n *   console.warn('Warnings:', result.warnings);\n * }\n * ```\n */\nexport function validateSkillMetadata(\n  metadata: unknown,\n  dirName?: string,\n  instructions?: string,\n): SkillValidationResult {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  // Check that metadata is an object\n  if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata)) {\n    errors.push(\n      `Expected object, received ${metadata === null ? 'null' : Array.isArray(metadata) ? 'array' : typeof metadata}`,\n    );\n    return { valid: false, errors, warnings };\n  }\n\n  const data = metadata as Record<string, unknown>;\n\n  // Validate each field\n  errors.push(...validateSkillName(data.name));\n  errors.push(...validateSkillDescription(data.description));\n  errors.push(...validateSkillLicense(data.license));\n  errors.push(...validateSkillCompatibility(data.compatibility));\n  errors.push(...validateUserInvocable(data['user-invocable']));\n  errors.push(...validateSkillMetadataField(data.metadata));\n\n  // Check directory name match (only if no name errors and name is valid)\n  if (dirName && typeof data.name === 'string' && data.name !== dirName) {\n    errors.push(`Skill name \"${data.name}\" must match directory name \"${dirName}\"`);\n  }\n\n  // Check instruction limits (warnings only)\n  if (instructions) {\n    const lineCount = countLines(instructions);\n    const tokenEstimate = estimateTokens(instructions);\n\n    if (lineCount > SKILL_LIMITS.MAX_INSTRUCTION_LINES) {\n      warnings.push(\n        `Instructions have ${lineCount} lines (recommended: <${SKILL_LIMITS.MAX_INSTRUCTION_LINES}). Consider moving content to references/.`,\n      );\n    }\n\n    if (tokenEstimate > SKILL_LIMITS.MAX_INSTRUCTION_TOKENS) {\n      warnings.push(\n        `Instructions have ~${tokenEstimate} estimated tokens (recommended: <${SKILL_LIMITS.MAX_INSTRUCTION_TOKENS}). Consider moving content to references/.`,\n      );\n    }\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors,\n    warnings,\n  };\n}\n","/**\n * createSkill() — factory for creating inline skills in code.\n *\n * Creates a Skill object that can be passed to an Agent's `skills` config\n * without requiring a Workspace or filesystem.\n *\n * @example\n * ```typescript\n * import { createSkill } from '@mastra/core/skills';\n *\n * const reviewSkill = createSkill({\n *   name: 'code-review',\n *   description: 'Use when reviewing code changes.',\n *   instructions: `\n *     When reviewing code:\n *     1. Check for correctness\n *     2. Check for style consistency\n *     3. Look for potential bugs\n *   `,\n *   references: {\n *     'checklist.md': '# Review Checklist\\n...',\n *   },\n * });\n * ```\n */\n\nimport { validateSkillMetadata } from '../workspace/skills/schemas';\nimport type { InlineSkill, InlineSkillInput } from './types';\n\n/**\n * Create an inline skill from code — no filesystem needed.\n *\n * The returned object implements the `Skill` interface and can be passed\n * directly to an Agent's `skills` config or used anywhere a `Skill` is expected.\n *\n * @throws Error if the skill metadata fails validation\n */\nexport function createSkill(input: InlineSkillInput): InlineSkill {\n  const { name, description, instructions, license, compatibility, metadata, references } = input;\n\n  // Validate metadata (same checks as filesystem-discovered skills)\n  const validation = validateSkillMetadata(\n    { name, description, license, compatibility, 'user-invocable': input['user-invocable'], metadata },\n    undefined,\n    instructions,\n  );\n\n  if (!validation.valid) {\n    throw new Error(`Invalid skill \"${name}\": ${validation.errors.join('; ')}`);\n  }\n\n  const referenceKeys = references ? Object.keys(references) : [];\n\n  return {\n    __inline: true as const,\n    __referenceContents: references ?? {},\n    name,\n    description,\n    instructions,\n    license,\n    compatibility,\n    'user-invocable': input['user-invocable'],\n    metadata,\n    // Inline skills use a synthetic path: `inline/<name>`\n    path: `inline/${name}`,\n    source: { type: 'local', projectPath: `inline/${name}` },\n    references: referenceKeys,\n    scripts: [],\n    assets: [],\n  };\n}\n\n/**\n * Type guard: is this skill an inline skill (from createSkill)?\n */\nexport function isInlineSkill(skill: unknown): skill is InlineSkill {\n  return typeof skill === 'object' && skill !== null && '__inline' in skill && (skill as InlineSkill).__inline === true;\n}\n","/**\n * InlineSkillSource — in-memory SkillSource for code-defined skills.\n *\n * Serves skills created via `createSkill()` without any filesystem dependency.\n * Implements the SkillSource interface so it can be used with WorkspaceSkillsImpl.\n *\n * Directory layout emulation:\n * Each inline skill appears as a directory at `inline/<name>/` with:\n * - SKILL.md (generated from the skill's metadata + instructions)\n * - references/<file> (from the skill's `references` map)\n */\n\nimport matter from 'gray-matter';\n\nimport type { SkillSource, SkillSourceEntry, SkillSourceStat } from '../workspace/skills/skill-source';\nimport type { InlineSkill } from './types';\n\nexport class InlineSkillSource implements SkillSource {\n  readonly #skills: Map<string, InlineSkill>;\n  /** Pre-built SKILL.md content per skill name */\n  readonly #skillMdCache: Map<string, string>;\n\n  constructor(skills: InlineSkill[]) {\n    this.#skills = new Map(skills.map(s => [s.name, s]));\n    this.#skillMdCache = new Map();\n\n    for (const skill of skills) {\n      this.#skillMdCache.set(skill.name, this.#buildSkillMd(skill));\n    }\n  }\n\n  /**\n   * Build a synthetic SKILL.md from an inline skill's metadata and instructions.\n   */\n  #buildSkillMd(skill: InlineSkill): string {\n    const frontmatter: Record<string, unknown> = {\n      name: skill.name,\n      description: skill.description,\n    };\n    if (skill.license) frontmatter.license = skill.license;\n    if (skill.compatibility) frontmatter.compatibility = skill.compatibility;\n    if (skill['user-invocable'] !== undefined) frontmatter['user-invocable'] = skill['user-invocable'];\n    if (skill.metadata) frontmatter.metadata = skill.metadata;\n\n    return matter.stringify(skill.instructions, frontmatter);\n  }\n\n  /**\n   * Parse a path into skill name and relative sub-path.\n   * Paths look like `inline/<name>`, `inline/<name>/SKILL.md`, `inline/<name>/references/file.md`\n   */\n  #parsePath(inputPath: string): { skillName: string; subPath: string } | null {\n    const prefix = 'inline/';\n    if (!inputPath.startsWith(prefix)) return null;\n\n    const rest = inputPath.slice(prefix.length);\n    const slashIdx = rest.indexOf('/');\n    if (slashIdx === -1) {\n      return { skillName: rest, subPath: '' };\n    }\n    return { skillName: rest.slice(0, slashIdx), subPath: rest.slice(slashIdx + 1) };\n  }\n\n  #getSkill(inputPath: string): { skill: InlineSkill; subPath: string } | null {\n    const parsed = this.#parsePath(inputPath);\n    if (!parsed) return null;\n    const skill = this.#skills.get(parsed.skillName);\n    if (!skill) return null;\n    return { skill, subPath: parsed.subPath };\n  }\n\n  async exists(path: string): Promise<boolean> {\n    const result = this.#getSkill(path);\n    if (!result) return false;\n\n    const { skill, subPath } = result;\n\n    // Root skill directory\n    if (subPath === '') return true;\n    // SKILL.md\n    if (subPath === 'SKILL.md') return true;\n    // references/ directory\n    if (subPath === 'references') return (skill.references?.length ?? 0) > 0;\n    // references/<file>\n    if (subPath.startsWith('references/')) {\n      const refPath = subPath.slice('references/'.length);\n      return skill.references.includes(refPath);\n    }\n    return false;\n  }\n\n  async stat(path: string): Promise<SkillSourceStat> {\n    const result = this.#getSkill(path);\n    if (!result) {\n      throw new Error(`ENOENT: no such file or directory: ${path}`);\n    }\n\n    const { skill, subPath } = result;\n    const now = new Date();\n\n    // Root skill directory\n    if (subPath === '') {\n      return { name: skill.name, type: 'directory', size: 0, createdAt: now, modifiedAt: now };\n    }\n    // SKILL.md\n    if (subPath === 'SKILL.md') {\n      const content = this.#skillMdCache.get(skill.name) ?? '';\n      return {\n        name: 'SKILL.md',\n        type: 'file',\n        size: Buffer.byteLength(content, 'utf-8'),\n        createdAt: now,\n        modifiedAt: now,\n        mimeType: 'text/markdown',\n      };\n    }\n    // references/ directory\n    if (subPath === 'references') {\n      return { name: 'references', type: 'directory', size: 0, createdAt: now, modifiedAt: now };\n    }\n\n    throw new Error(`ENOENT: no such file or directory: ${path}`);\n  }\n\n  async readFile(path: string): Promise<string | Buffer> {\n    const result = this.#getSkill(path);\n    if (!result) {\n      throw new Error(`ENOENT: no such file or directory: ${path}`);\n    }\n\n    const { skill, subPath } = result;\n\n    // SKILL.md\n    if (subPath === 'SKILL.md') {\n      return this.#skillMdCache.get(skill.name) ?? '';\n    }\n\n    // references/<file> — look up in the inline skill's bundled reference contents\n    if (subPath.startsWith('references/')) {\n      const refPath = subPath.slice('references/'.length);\n      const content = skill.__referenceContents[refPath];\n      if (content !== undefined) return content;\n    }\n\n    throw new Error(`ENOENT: no such file or directory: ${path}`);\n  }\n\n  async readdir(path: string): Promise<SkillSourceEntry[]> {\n    const parsed = this.#parsePath(path);\n\n    // Listing the root of all inline skills (when path is just the prefix base)\n    // This shouldn't normally be called, but handle it gracefully\n    if (!parsed) return [];\n\n    const { skillName, subPath } = parsed;\n    const skill = this.#skills.get(skillName);\n    if (!skill) return [];\n\n    // Root skill directory\n    if (subPath === '') {\n      const entries: SkillSourceEntry[] = [{ name: 'SKILL.md', type: 'file' }];\n      if (skill.references.length > 0) {\n        entries.push({ name: 'references', type: 'directory' });\n      }\n      return entries;\n    }\n\n    // references/ directory\n    if (subPath === 'references') {\n      return skill.references.map(ref => ({ name: ref, type: 'file' as const }));\n    }\n\n    return [];\n  }\n}\n","/**\n * WorkspaceSkills - Skills implementation.\n *\n * Provides discovery and search operations for skills stored\n * in skills paths. All operations are async.\n */\n\nimport matter from 'gray-matter';\n\nimport { isGlobPattern, resolvePathPattern } from '../glob';\nimport type { ReaddirEntry } from '../glob';\nimport type { IndexDocument, SearchResult } from '../search';\nimport { validateSkillMetadata } from './schemas';\nimport type { SkillSource as SkillSourceInterface } from './skill-source';\nimport type {\n  ContentSource,\n  Skill,\n  SkillMetadata,\n  SkillSearchResult,\n  SkillSearchOptions,\n  WorkspaceSkills,\n  SkillsResolver,\n  SkillsContext,\n} from './types';\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\n/**\n * Minimal search engine interface - only the methods we actually use.\n * This allows both the real SearchEngine and test mocks to be used.\n */\ninterface SkillSearchEngine {\n  index(doc: IndexDocument): Promise<void>;\n  remove?(id: string): Promise<void>;\n  search(\n    query: string,\n    options?: { topK?: number; minScore?: number; mode?: 'bm25' | 'vector' | 'hybrid' },\n  ): Promise<SearchResult[]>;\n  clear(): void;\n}\n\ninterface InternalSkill extends Skill {\n  /** Content for BM25 indexing (instructions + all references) */\n  indexableContent: string;\n}\n\n// =============================================================================\n// WorkspaceSkillsImpl\n// =============================================================================\n\n/**\n * Configuration for WorkspaceSkillsImpl\n */\nexport interface WorkspaceSkillsImplConfig {\n  /**\n   * Source for loading skills.\n   */\n  source: SkillSourceInterface;\n  /**\n   * Paths to scan for skills.\n   * Can be a static array or a function that returns paths based on context.\n   */\n  skills: SkillsResolver;\n  /** Search engine for skill search (optional) */\n  searchEngine?: SkillSearchEngine;\n  /** Validate skills on load (default: true) */\n  validateOnLoad?: boolean;\n  /**\n   * Check SKILL.md file mtime in addition to directory mtime for staleness detection.\n   * Enables detection of in-place file edits (e.g., fixing validation errors).\n   * Increases stat calls - recommended for local development only.\n   * Default: false\n   */\n  checkSkillFileMtime?: boolean;\n}\n\n/**\n * Implementation of WorkspaceSkills interface.\n */\nexport class WorkspaceSkillsImpl implements WorkspaceSkills {\n  readonly #source: SkillSourceInterface;\n  readonly #skillsResolver: SkillsResolver;\n  readonly #searchEngine?: SkillSearchEngine;\n  readonly #validateOnLoad: boolean;\n  readonly #checkSkillFileMtime: boolean;\n\n  /** Map of skill name -> array of candidates (supports same-named skills from different sources) */\n  #skills: Map<string, InternalSkill[]> = new Map();\n\n  /** Whether skills have been discovered */\n  #initialized = false;\n\n  /** Promise for ongoing initialization (prevents concurrent discovery) */\n  #initPromise: Promise<void> | null = null;\n\n  /** Timestamp of last skills discovery (for staleness check) */\n  #lastDiscoveryTime = 0;\n\n  /** Currently resolved skills paths (used to detect changes) */\n  #resolvedPaths: string[] = [];\n\n  /** Cached glob-resolved directories and per-pattern resolve timestamps */\n  #globDirCache: Map<string, string[]> = new Map();\n  #globResolveTimes: Map<string, number> = new Map();\n  static readonly GLOB_RESOLVE_INTERVAL = 5_000; // Re-walk glob dirs every 5s\n  static readonly STALENESS_CHECK_COOLDOWN = 2_000; // Skip staleness check for 2s after discovery\n\n  constructor(config: WorkspaceSkillsImplConfig) {\n    this.#source = config.source;\n    this.#skillsResolver = config.skills;\n    this.#searchEngine = config.searchEngine;\n    this.#validateOnLoad = config.validateOnLoad ?? true;\n    this.#checkSkillFileMtime = config.checkSkillFileMtime ?? false;\n  }\n\n  // ===========================================================================\n  // Discovery\n  // ===========================================================================\n\n  async list(): Promise<SkillMetadata[]> {\n    await this.#ensureInitialized();\n\n    const results: SkillMetadata[] = [];\n    for (const candidates of this.#skills.values()) {\n      const canonicalCandidates = await this.#dedupeCanonicalCandidates(candidates);\n      for (const skill of canonicalCandidates) {\n        results.push({\n          name: skill.name,\n          path: skill.path,\n          description: skill.description,\n          license: skill.license,\n          compatibility: skill.compatibility,\n          'user-invocable': skill['user-invocable'],\n          metadata: skill.metadata,\n        });\n      }\n    }\n    return results;\n  }\n\n  async get(name: string): Promise<Skill | null> {\n    await this.#ensureInitialized();\n    // Try name-based lookup first, then fall back to path-based (escape hatch)\n    const skill = (await this.#resolveByName(name)) ?? this.#resolveByPath(name);\n    if (!skill) return null;\n\n    // Return without internal indexableContent field\n    const { indexableContent: _, ...skillData } = skill;\n    return skillData;\n  }\n\n  async has(name: string): Promise<boolean> {\n    await this.#ensureInitialized();\n    return ((await this.#resolveByName(name)) ?? this.#resolveByPath(name)) !== null;\n  }\n\n  // ===========================================================================\n  // Skill Resolution (Private)\n  // ===========================================================================\n\n  /**\n   * Resolve a skill by name with tie-breaking when multiple candidates exist.\n   * Priority: local > managed > external, then alphabetical path.\n   */\n  async #resolveByName(name: string): Promise<InternalSkill | null> {\n    const candidates = this.#skills.get(name);\n    if (!candidates || candidates.length === 0) return null;\n    return this.#tieBreak(candidates);\n  }\n\n  /**\n   * Resolve a skill by exact path (escape hatch for disambiguation).\n   * Searches across all candidate arrays.\n   * Accepts paths with or without a trailing `/SKILL.md` suffix, since\n   * SkillsProcessor.formatLocation() exposes `${path}/SKILL.md` to the LLM.\n   */\n  #resolveByPath(skillPath: string): InternalSkill | null {\n    const normalized = skillPath.replace(/\\/SKILL\\.md$/, '');\n    for (const candidates of this.#skills.values()) {\n      const match = candidates.find(s => s.path === normalized);\n      if (match) return match;\n    }\n    return null;\n  }\n\n  async #getCanonicalSkillPath(skillPath: string): Promise<string> {\n    if (!this.#source.realpath) return skillPath;\n\n    try {\n      return await this.#source.realpath(skillPath);\n    } catch {\n      return skillPath;\n    }\n  }\n\n  async #dedupeCanonicalCandidates(candidates: InternalSkill[]): Promise<InternalSkill[]> {\n    const canonicalGroups = new Map<string, InternalSkill[]>();\n    for (const candidate of candidates) {\n      const canonicalPath = await this.#getCanonicalSkillPath(candidate.path);\n      const group = canonicalGroups.get(canonicalPath) ?? [];\n      group.push(candidate);\n      canonicalGroups.set(canonicalPath, group);\n    }\n\n    const SOURCE_PRIORITY: Record<string, number> = { local: 0, managed: 1, external: 2 };\n    return [...canonicalGroups.values()].map(\n      group =>\n        [...group].sort((a, b) => {\n          const aPri = SOURCE_PRIORITY[a.source.type] ?? 99;\n          const bPri = SOURCE_PRIORITY[b.source.type] ?? 99;\n          if (aPri !== bPri) return aPri - bPri;\n          return a.path.localeCompare(b.path);\n        })[0]!,\n    );\n  }\n\n  /**\n   * Pick the winning skill from an array of same-named candidates.\n   * When there's only one candidate, returns it directly (no warning).\n   * When there are multiple, de-duplicates alias paths that point to the same\n   * canonical skill, then applies source-type priority and warns.\n   *\n   * Priority: local (0) > managed (1) > external (2).\n   * Throws if source-type priority can't resolve the tie (e.g., two distinct local skills with same name).\n   */\n  async #tieBreak(candidates: InternalSkill[]): Promise<InternalSkill | null> {\n    if (candidates.length === 0) return null;\n    if (candidates.length === 1) return candidates[0]!;\n\n    const deduped = await this.#dedupeCanonicalCandidates(candidates);\n\n    if (deduped.length === 1) return deduped[0]!;\n\n    const SOURCE_PRIORITY: Record<string, number> = { local: 0, managed: 1, external: 2 };\n    const sorted = [...deduped].sort((a, b) => {\n      const aPri = SOURCE_PRIORITY[a.source.type] ?? 99;\n      const bPri = SOURCE_PRIORITY[b.source.type] ?? 99;\n      if (aPri !== bPri) return aPri - bPri;\n      return a.path.localeCompare(b.path);\n    });\n\n    const winner = sorted[0]!;\n    const runnerUp = sorted[1]!;\n\n    // Error if source-type priority can't break the tie\n    if (winner.source.type === runnerUp.source.type) {\n      const paths = sorted\n        .filter(s => s.source.type === winner.source.type)\n        .map(s => `\"${s.path}\"`)\n        .join(', ');\n      throw new Error(\n        `[WorkspaceSkills] Cannot resolve skill \"${winner.name}\": multiple ${winner.source.type} skills found at ${paths}. ` +\n          `Rename one or move it to a different source type.`,\n      );\n    }\n\n    console.warn(\n      `[WorkspaceSkills] Multiple skills named \"${winner.name}\" found. ` +\n        `Using \"${winner.path}\" (source: ${winner.source.type}). ` +\n        `Other candidates: ${sorted\n          .slice(1)\n          .map(s => `\"${s.path}\" (${s.source.type})`)\n          .join(', ')}`,\n    );\n\n    return winner;\n  }\n\n  async refresh(): Promise<void> {\n    // Remove only skill entries from the shared search engine (not workspace content)\n    for (const candidates of this.#skills.values()) {\n      for (const skill of candidates) {\n        await this.#removeSkillFromIndex(skill);\n      }\n    }\n    this.#skills.clear();\n    this.#initialized = false;\n    this.#initPromise = null;\n    await this.#discoverSkills();\n    this.#initialized = true;\n  }\n\n  async maybeRefresh(context?: SkillsContext): Promise<void> {\n    // Ensure initial discovery is complete\n    await this.#ensureInitialized();\n\n    // Resolve current paths (may be dynamic based on context)\n    const currentPaths = await this.#resolvePaths(context);\n\n    // Check if paths have changed (for dynamic resolvers)\n    const pathsChanged = !this.#arePathsEqual(this.#resolvedPaths, currentPaths);\n    if (pathsChanged) {\n      // Paths changed - need full refresh with new paths\n      this.#resolvedPaths = currentPaths;\n      await this.refresh();\n      return;\n    }\n\n    // Check if any skills path has been modified since last discovery\n    const isStale = await this.#isSkillsPathStale();\n    if (isStale) {\n      await this.refresh();\n    }\n  }\n\n  async addSkill(skillPath: string): Promise<void> {\n    await this.#ensureInitialized();\n\n    // Determine SKILL.md path and dirName\n    let skillFilePath: string;\n    let dirName: string;\n    if (isSkillFilePath(skillPath)) {\n      skillFilePath = skillPath;\n      dirName = splitPathSegments(this.#getParentPath(skillPath)).pop() || 'unknown';\n    } else {\n      skillFilePath = this.#joinPath(skillPath, 'SKILL.md');\n      dirName = splitPathSegments(skillPath).pop() || 'unknown';\n    }\n\n    // Determine source from existing resolved paths\n    const source = this.#inferSource(skillPath);\n\n    // Parse and add to cache\n    const skill = await this.#parseSkillFile(skillFilePath, dirName, source);\n\n    // Remove old index entries if skill already exists at same path (for update case)\n    const candidates = this.#skills.get(skill.name) ?? [];\n    const existingIdx = candidates.findIndex(s => s.path === skill.path);\n    if (existingIdx >= 0) {\n      await this.#removeSkillFromIndex(candidates[existingIdx]!);\n      candidates[existingIdx] = skill;\n    } else {\n      candidates.push(skill);\n    }\n    this.#skills.set(skill.name, candidates);\n    await this.#indexSkill(skill);\n\n    // Update discovery time so maybeRefresh() doesn't trigger full scan\n    this.#lastDiscoveryTime = Date.now();\n  }\n\n  async removeSkill(skillName: string): Promise<void> {\n    await this.#ensureInitialized();\n\n    // Resolve by name (tie-break winner), then fall back to path-based lookup\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    if (!skill) return;\n\n    // Remove from search index\n    await this.#removeSkillFromIndex(skill);\n\n    // Remove from candidates array\n    const candidates = this.#skills.get(skill.name);\n    if (candidates) {\n      const idx = candidates.findIndex(s => s.path === skill.path);\n      if (idx >= 0) candidates.splice(idx, 1);\n      if (candidates.length === 0) {\n        this.#skills.delete(skill.name);\n      }\n    }\n\n    // Update discovery time so maybeRefresh() doesn't trigger full scan\n    this.#lastDiscoveryTime = Date.now();\n  }\n\n  /**\n   * Resolve skills paths from the resolver (static array or function).\n   */\n  async #resolvePaths(context?: SkillsContext): Promise<string[]> {\n    if (Array.isArray(this.#skillsResolver)) {\n      return this.#skillsResolver;\n    }\n    return this.#skillsResolver(context ?? {});\n  }\n\n  /**\n   * Compare two path arrays for equality (order-independent).\n   */\n  #arePathsEqual(a: string[], b: string[]): boolean {\n    if (a.length !== b.length) return false;\n    const sortedA = [...a].sort();\n    const sortedB = [...b].sort();\n    return sortedA.every((path, i) => path === sortedB[i]);\n  }\n\n  // ===========================================================================\n  // Search\n  // ===========================================================================\n\n  async search(query: string, options: SkillSearchOptions = {}): Promise<SkillSearchResult[]> {\n    await this.#ensureInitialized();\n\n    if (!this.#searchEngine) {\n      // Fall back to simple text matching if no search engine\n      return this.#simpleSearch(query, options);\n    }\n\n    const { topK = 5, minScore, skillNames, includeReferences = true, mode } = options;\n\n    // Ask the search engine for enough rows to survive post-search filtering and\n    // canonical alias de-duplication before applying the final topK.\n    const totalIndexedDocuments = [...this.#skills.values()].reduce(\n      (count, candidates) =>\n        count + candidates.reduce((skillCount, skill) => skillCount + 1 + skill.references.length, 0),\n      0,\n    );\n    const expandedTopK = Math.max(skillNames ? topK * 3 : topK, totalIndexedDocuments);\n\n    // Delegate to SearchEngine\n    const searchResults = await this.#searchEngine.search(query, {\n      topK: expandedTopK,\n      minScore,\n      mode,\n    });\n\n    const results: SkillSearchResult[] = [];\n    const seenCanonicalSources = new Set<string>();\n\n    for (const result of searchResults) {\n      const skillPath = result.metadata?.skillPath as string;\n      const source = result.metadata?.source as string;\n\n      if (!skillPath || !source) continue;\n\n      // Map path back to the canonical skill winner for filtering and results.\n      const matchedSkill = this.#resolveByPath(skillPath);\n      if (!matchedSkill) continue;\n\n      const skill = (await this.#resolveByName(matchedSkill.name)) ?? matchedSkill;\n\n      // Filter by skill names if specified\n      if (skillNames && !skillNames.includes(skill.name)) {\n        continue;\n      }\n\n      // Filter out references if not included\n      if (!includeReferences && source !== 'SKILL.md') {\n        continue;\n      }\n\n      const canonicalSourceKey = `${skill.path}:${source}`;\n      if (seenCanonicalSources.has(canonicalSourceKey)) {\n        continue;\n      }\n      seenCanonicalSources.add(canonicalSourceKey);\n\n      results.push({\n        skillName: skill.name,\n        skillPath: skill.path,\n        source,\n        content: result.content,\n        score: result.score,\n        lineRange: result.lineRange,\n        scoreDetails: result.scoreDetails,\n      });\n\n      if (results.length >= topK) break;\n    }\n\n    return results;\n  }\n\n  // ===========================================================================\n  // Single-item Accessors\n  // ===========================================================================\n\n  async getReference(skillName: string, referencePath: string): Promise<string | null> {\n    await this.#ensureInitialized();\n\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    if (!skill) return null;\n\n    const safeRefPath = this.#assertRelativePath(referencePath, 'reference');\n    const refFilePath = this.#joinPath(skill.path, safeRefPath);\n\n    if (!(await this.#source.exists(refFilePath))) {\n      return null;\n    }\n\n    try {\n      const content = await this.#source.readFile(refFilePath);\n      return typeof content === 'string' ? content : content.toString('utf-8');\n    } catch {\n      return null;\n    }\n  }\n\n  async getScript(skillName: string, scriptPath: string): Promise<string | null> {\n    await this.#ensureInitialized();\n\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    if (!skill) return null;\n\n    const safeScriptPath = this.#assertRelativePath(scriptPath, 'script');\n    const scriptFilePath = this.#joinPath(skill.path, safeScriptPath);\n\n    if (!(await this.#source.exists(scriptFilePath))) {\n      return null;\n    }\n\n    try {\n      const content = await this.#source.readFile(scriptFilePath);\n      return typeof content === 'string' ? content : content.toString('utf-8');\n    } catch {\n      return null;\n    }\n  }\n\n  async getAsset(skillName: string, assetPath: string): Promise<Buffer | null> {\n    await this.#ensureInitialized();\n\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    if (!skill) return null;\n\n    const safeAssetPath = this.#assertRelativePath(assetPath, 'asset');\n    const assetFilePath = this.#joinPath(skill.path, safeAssetPath);\n\n    if (!(await this.#source.exists(assetFilePath))) {\n      return null;\n    }\n\n    try {\n      const content = await this.#source.readFile(assetFilePath);\n      return typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;\n    } catch {\n      return null;\n    }\n  }\n\n  // ===========================================================================\n  // Listing Accessors\n  // ===========================================================================\n\n  async listReferences(skillName: string): Promise<string[]> {\n    await this.#ensureInitialized();\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    return skill?.references ?? [];\n  }\n\n  async listScripts(skillName: string): Promise<string[]> {\n    await this.#ensureInitialized();\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    return skill?.scripts ?? [];\n  }\n\n  async listAssets(skillName: string): Promise<string[]> {\n    await this.#ensureInitialized();\n    const skill = (await this.#resolveByName(skillName)) ?? this.#resolveByPath(skillName);\n    return skill?.assets ?? [];\n  }\n\n  // ===========================================================================\n  // Private Methods\n  // ===========================================================================\n\n  /**\n   * Ensure skills have been discovered.\n   * Uses a promise to prevent concurrent discovery.\n   */\n  async #ensureInitialized(): Promise<void> {\n    if (this.#initialized) {\n      return;\n    }\n\n    // If initialization is already in progress, wait for it\n    if (this.#initPromise) {\n      await this.#initPromise;\n      return;\n    }\n\n    // Start initialization and store the promise\n    this.#initPromise = (async () => {\n      try {\n        // Resolve paths on first initialization (uses empty context)\n        if (this.#resolvedPaths.length === 0) {\n          this.#resolvedPaths = await this.#resolvePaths();\n        }\n        await this.#discoverSkills();\n        this.#initialized = true;\n      } finally {\n        this.#initPromise = null;\n      }\n    })();\n\n    await this.#initPromise;\n  }\n\n  /**\n   * Add a skill to the candidates map, keyed by name.\n   * Replaces an existing entry at the same path (update case), otherwise appends.\n   */\n  #addToSkillsMap(skill: InternalSkill): void {\n    const candidates = this.#skills.get(skill.name) ?? [];\n    const idx = candidates.findIndex(s => s.path === skill.path);\n    if (idx >= 0) {\n      candidates[idx] = skill;\n    } else {\n      candidates.push(skill);\n    }\n    this.#skills.set(skill.name, candidates);\n  }\n\n  /**\n   * Discover skills from all skills paths.\n   * Uses currently resolved paths (must be set before calling).\n   *\n   * Paths can be plain directories, glob patterns, or direct\n   * skill references (e.g., '/skills/my-skill/SKILL.md').\n   *\n   * Uses resolvePathPattern for unified glob resolution. File matches\n   * pointing to SKILL.md are loaded directly; directory matches are\n   * tried as direct skills first, then scanned for subdirectories.\n   */\n  async #discoverSkills(): Promise<void> {\n    // Clear glob cache so discovery gets fresh results\n    this.#globDirCache.clear();\n    this.#globResolveTimes.clear();\n\n    // Adapt SkillSource.readdir to the ReaddirEntry interface used by resolvePathPattern\n    const readdir = async (dir: string): Promise<ReaddirEntry[]> => {\n      const entries = await this.#source.readdir(dir);\n      return entries.map(e => ({ name: e.name, type: e.type, isSymlink: e.isSymlink }));\n    };\n\n    for (const rawSkillsPath of this.#resolvedPaths) {\n      // Strip trailing slash for consistent path handling (e.g. '/skills/' → '/skills')\n      const skillsPath =\n        rawSkillsPath.length > 1 && rawSkillsPath.endsWith('/') ? rawSkillsPath.slice(0, -1) : rawSkillsPath;\n      const source = this.#determineSource(skillsPath);\n\n      if (isGlobPattern(skillsPath)) {\n        // Glob pattern: resolve to matching entries, then discover skills from each\n        const resolved = await resolvePathPattern(skillsPath, readdir, { dot: true, maxDepth: 4 });\n\n        // Cache directories for staleness checks: matched dirs directly,\n        // and parent dirs for matched files (e.g. **/SKILL.md → parent skill dir)\n        const dirs = new Set<string>();\n        for (const entry of resolved) {\n          if (entry.type === 'directory') {\n            dirs.add(entry.path);\n          } else {\n            dirs.add(this.#getParentPath(entry.path));\n          }\n        }\n        this.#globDirCache.set(skillsPath, [...dirs]);\n        this.#globResolveTimes.set(skillsPath, Date.now());\n\n        // Process glob-resolved entries in parallel (independent discoveries)\n        const results = await Promise.allSettled(\n          resolved.map(async entry => {\n            if (entry.type === 'file') {\n              // File match (e.g., **/SKILL.md) — load as direct skill\n              await this.#discoverDirectSkill(entry.path, source);\n            } else {\n              // Directory match — try as direct skill first, then scan subdirectories\n              const isDirect = await this.#discoverDirectSkill(entry.path, source);\n              if (!isDirect) {\n                await this.#discoverSkillsInPath(entry.path, source);\n              }\n            }\n          }),\n        );\n\n        for (const [index, result] of results.entries()) {\n          const entry = resolved[index];\n          if (entry && result.status === 'rejected') {\n            const error = result.reason;\n            if (error instanceof Error) {\n              console.error(`[WorkspaceSkills] Failed to load skill from ${entry.path}:`, error.message);\n            }\n          }\n        }\n      } else {\n        // Check if the path is a direct skill reference (directory with SKILL.md or SKILL.md file)\n        const isDirect = await this.#discoverDirectSkill(skillsPath, source);\n        if (!isDirect) {\n          // Plain path: scan subdirectories for skills\n          await this.#discoverSkillsInPath(skillsPath, source);\n        }\n      }\n    }\n    // Track when discovery completed for staleness check\n    this.#lastDiscoveryTime = Date.now();\n  }\n\n  /**\n   * Discover skills in a single path\n   */\n  async #discoverSkillsInPath(skillsPath: string, source: ContentSource): Promise<void> {\n    try {\n      if (!(await this.#source.exists(skillsPath))) {\n        return;\n      }\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : String(error);\n      let hint = '';\n\n      // If an absolute path like \"/skills\" fails, check if the relative equivalent exists\n      if (skillsPath.startsWith('/') && msg.includes('Permission denied')) {\n        const relativePath = skillsPath.slice(1);\n        try {\n          if (await this.#source.exists(relativePath)) {\n            hint = ` (did you mean to use the relative path \"${relativePath}\"?)`;\n          }\n        } catch {\n          // ignore — just skip the hint\n        }\n      }\n\n      console.warn(`[WorkspaceSkills] Cannot access skills path \"${skillsPath}\": ${msg}${hint}`);\n      return;\n    }\n\n    try {\n      const entries = await this.#source.readdir(skillsPath);\n\n      // Process all skill directories in parallel (each is independent)\n      const results = await Promise.allSettled(\n        entries\n          .filter(entry => entry.type === 'directory')\n          .map(async entry => {\n            const entryPath = this.#joinPath(skillsPath, entry.name);\n            const skillFilePath = this.#joinPath(entryPath, 'SKILL.md');\n\n            if (await this.#source.exists(skillFilePath)) {\n              const skill = await this.#parseSkillFile(skillFilePath, entry.name, source);\n              return skill;\n            }\n            return null;\n          }),\n      );\n\n      // Apply results sequentially to preserve overwrite semantics\n      for (const result of results) {\n        if (result.status === 'fulfilled' && result.value) {\n          this.#addToSkillsMap(result.value);\n          await this.#indexSkill(result.value);\n        } else if (result.status === 'rejected') {\n          const error = result.reason;\n          if (error instanceof Error) {\n            console.error(`[WorkspaceSkills] Failed to load skill from ${skillsPath}:`, error.message);\n          }\n        }\n      }\n    } catch (error) {\n      if (error instanceof Error) {\n        console.error(`[WorkspaceSkills] Failed to scan skills directory ${skillsPath}:`, error.message);\n      }\n    }\n  }\n\n  /**\n   * Attempt to discover a skill from a direct path reference.\n   *\n   * Handles two cases:\n   * - Path ends with `/SKILL.md` → parse directly, extract dirName from parent\n   * - Path is a directory containing `SKILL.md` → parse it as a single skill\n   *\n   * Returns `true` if the path was a direct skill reference (skip subdirectory scan),\n   * `false` to fall through to the normal subdirectory scan.\n   */\n  async #discoverDirectSkill(skillsPath: string, source: ContentSource): Promise<boolean> {\n    try {\n      // Case 1: Path points directly to a SKILL.md file\n      if (isSkillFilePath(skillsPath)) {\n        if (!(await this.#source.exists(skillsPath))) {\n          return true; // It was a direct reference, just doesn't exist — skip subdirectory scan\n        }\n\n        const skillDir = this.#getParentPath(skillsPath);\n        const dirName = splitPathSegments(skillDir).pop() || skillDir;\n\n        try {\n          const skill = await this.#parseSkillFile(skillsPath, dirName, source);\n          this.#addToSkillsMap(skill);\n          await this.#indexSkill(skill);\n        } catch (error) {\n          if (error instanceof Error) {\n            console.error(`[WorkspaceSkills] Failed to load skill from ${skillsPath}:`, error.message);\n          }\n        }\n        return true;\n      }\n\n      // Case 2: Path is a directory that directly contains SKILL.md\n      if (await this.#source.exists(skillsPath)) {\n        const skillFilePath = this.#joinPath(skillsPath, 'SKILL.md');\n        if (await this.#source.exists(skillFilePath)) {\n          const dirName = splitPathSegments(skillsPath).pop() || skillsPath;\n\n          try {\n            const skill = await this.#parseSkillFile(skillFilePath, dirName, source);\n            this.#addToSkillsMap(skill);\n            await this.#indexSkill(skill);\n          } catch (error) {\n            if (error instanceof Error) {\n              console.error(`[WorkspaceSkills] Failed to load skill from ${skillFilePath}:`, error.message);\n            }\n          }\n          return true;\n        }\n      }\n\n      return false;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Check if any skills path directory has been modified since last discovery.\n   * Compares directory mtime to lastDiscoveryTime.\n   * For glob patterns, checks the walk root and expanded directories.\n   */\n  async #isSkillsPathStale(): Promise<boolean> {\n    if (this.#lastDiscoveryTime === 0) {\n      // Never discovered, consider stale\n      return true;\n    }\n\n    // Skip the expensive stat calls if discovery happened very recently\n    // (e.g., right after a surgical addSkill/removeSkill). This avoids\n    // a timing race where the filesystem write updates directory mtime\n    // to the same second as #lastDiscoveryTime, and also avoids slow\n    // stat calls to external mounts immediately after a known-good update.\n    if (Date.now() - this.#lastDiscoveryTime < WorkspaceSkillsImpl.STALENESS_CHECK_COOLDOWN) {\n      return false;\n    }\n\n    for (const skillsPath of this.#resolvedPaths) {\n      let pathsToCheck: string[];\n\n      if (isGlobPattern(skillsPath)) {\n        // Use cached glob dirs, re-resolve periodically to discover new entries\n        const now = Date.now();\n        const lastResolved = this.#globResolveTimes.get(skillsPath) ?? 0;\n        if (now - lastResolved > WorkspaceSkillsImpl.GLOB_RESOLVE_INTERVAL || !this.#globDirCache.has(skillsPath)) {\n          const readdir = async (dir: string): Promise<ReaddirEntry[]> => {\n            const entries = await this.#source.readdir(dir);\n            return entries.map(e => ({ name: e.name, type: e.type, isSymlink: e.isSymlink }));\n          };\n          const resolved = await resolvePathPattern(skillsPath, readdir, { dot: true, maxDepth: 4 });\n          // For staleness checks we need directories: matched dirs directly,\n          // and parent dirs for matched files (e.g. **/SKILL.md → parent skill dir)\n          const dirs = new Set<string>();\n          for (const entry of resolved) {\n            if (entry.type === 'directory') {\n              dirs.add(entry.path);\n            } else {\n              dirs.add(this.#getParentPath(entry.path));\n            }\n          }\n          const dirList = [...dirs];\n          this.#globDirCache.set(skillsPath, dirList);\n          this.#globResolveTimes.set(skillsPath, now);\n        }\n        pathsToCheck = this.#globDirCache.get(skillsPath) ?? [];\n      } else {\n        pathsToCheck = [skillsPath];\n      }\n\n      for (const pathToCheck of pathsToCheck) {\n        try {\n          const stat = await this.#source.stat(pathToCheck);\n          const mtime = stat.modifiedAt.getTime();\n\n          if (mtime > this.#lastDiscoveryTime) {\n            return true;\n          }\n\n          // Skip subdirectory scan for non-directory paths (direct skill references)\n          if (stat.type !== 'directory') {\n            continue;\n          }\n\n          // If this directory is itself a skill root, check its SKILL.md mtime.\n          // This covers direct skill paths and file-level glob expansions (e.g., **/SKILL.md).\n          if (this.#checkSkillFileMtime) {\n            const directSkillFilePath = this.#joinPath(pathToCheck, 'SKILL.md');\n            try {\n              const directSkillFileStat = await this.#source.stat(directSkillFilePath);\n              if (\n                directSkillFileStat.type === 'file' &&\n                directSkillFileStat.modifiedAt.getTime() > this.#lastDiscoveryTime\n              ) {\n                return true;\n              }\n            } catch {\n              // Not a direct skill dir (or SKILL.md unavailable), continue to subdirectory scan.\n            }\n          }\n\n          // Also check subdirectories (skill directories) for changes — in parallel\n          const entries = await this.#source.readdir(pathToCheck);\n          const dirEntries = entries.filter(entry => entry.type === 'directory');\n\n          if (dirEntries.length > 0) {\n            const statResults = await Promise.all(\n              dirEntries.map(async entry => {\n                const entryPath = this.#joinPath(pathToCheck, entry.name);\n                try {\n                  const entryStat = await this.#source.stat(entryPath);\n                  if (entryStat.modifiedAt.getTime() > this.#lastDiscoveryTime) {\n                    return true;\n                  }\n\n                  // Optionally check SKILL.md file mtime - editing file content may not update directory mtime.\n                  // This doubles stat calls per skill, so it's opt-in for local development scenarios.\n                  if (this.#checkSkillFileMtime) {\n                    const skillFilePath = this.#joinPath(entryPath, 'SKILL.md');\n                    try {\n                      const skillFileStat = await this.#source.stat(skillFilePath);\n                      return (\n                        skillFileStat.type === 'file' && skillFileStat.modifiedAt.getTime() > this.#lastDiscoveryTime\n                      );\n                    } catch {\n                      // SKILL.md doesn't exist or can't be stat'd, skip\n                    }\n                  }\n                } catch {\n                  // Couldn't stat entry, skip it\n                }\n                return false;\n              }),\n            );\n            if (statResults.some(stale => stale)) {\n              return true;\n            }\n          }\n        } catch {\n          // Couldn't stat path (doesn't exist or error), skip to next\n          continue;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Parse a SKILL.md file\n   */\n  async #parseSkillFile(filePath: string, dirName: string, source: ContentSource): Promise<InternalSkill> {\n    const rawContent = await this.#source.readFile(filePath);\n    const content = typeof rawContent === 'string' ? rawContent : rawContent.toString('utf-8');\n\n    const parsed = matter(content);\n    const frontmatter = parsed.data;\n    const body = parsed.content.trim();\n\n    // Extract required fields\n    // Get skill directory path (parent of SKILL.md) - needed for SkillMetadata\n    const skillPath = this.#getParentPath(filePath);\n\n    const metadata: SkillMetadata = {\n      name: frontmatter.name,\n      path: skillPath,\n      description: frontmatter.description,\n      license: frontmatter.license,\n      compatibility: frontmatter.compatibility,\n      'user-invocable': frontmatter['user-invocable'],\n      metadata: frontmatter.metadata,\n    };\n\n    // Validate if enabled (includes token/line count warnings)\n    if (this.#validateOnLoad) {\n      const validation = this.#validateSkillMetadata(metadata, dirName, body);\n      if (!validation.valid) {\n        throw new Error(`Invalid skill metadata in ${filePath}:\\n${validation.errors.join('\\n')}`);\n      }\n    }\n\n    // Discover reference, script, and asset files (parallel — independent subdirs)\n    const [references, scripts, assets] = await Promise.all([\n      this.#discoverFilesInSubdir(skillPath, 'references'),\n      this.#discoverFilesInSubdir(skillPath, 'scripts'),\n      this.#discoverFilesInSubdir(skillPath, 'assets'),\n    ]);\n\n    // Build indexable content (instructions + references)\n    const indexableContent = await this.#buildIndexableContent(body, skillPath, references);\n\n    return {\n      ...metadata,\n      instructions: body,\n      source,\n      references,\n      scripts,\n      assets,\n      indexableContent,\n    };\n  }\n\n  /**\n   * Validate skill metadata (delegates to shared validation function)\n   */\n  #validateSkillMetadata(\n    metadata: SkillMetadata,\n    dirName: string,\n    instructions?: string,\n  ): { valid: boolean; errors: string[]; warnings: string[] } {\n    const result = validateSkillMetadata(metadata, dirName, instructions);\n\n    // Log warnings if any\n    if (result.warnings.length > 0) {\n      for (const warning of result.warnings) {\n        console.warn(`[WorkspaceSkills] ${metadata.name}: ${warning}`);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Discover files in a subdirectory of a skill (references/, scripts/, assets/)\n   */\n  async #discoverFilesInSubdir(skillPath: string, subdir: 'references' | 'scripts' | 'assets'): Promise<string[]> {\n    const subdirPath = this.#joinPath(skillPath, subdir);\n    const files: string[] = [];\n\n    if (!(await this.#source.exists(subdirPath))) {\n      return files;\n    }\n\n    try {\n      await this.#walkDirectory(subdirPath, subdirPath, (relativePath: string) => {\n        files.push(relativePath);\n      });\n    } catch {\n      // Failed to read subdirectory\n    }\n\n    return files;\n  }\n\n  /**\n   * Walk a directory recursively and call callback for each file.\n   * Limited to maxDepth (default 20) to prevent stack overflow on deep hierarchies.\n   */\n  async #walkDirectory(\n    basePath: string,\n    dirPath: string,\n    callback: (relativePath: string) => void,\n    depth: number = 0,\n    maxDepth: number = 20,\n  ): Promise<void> {\n    if (depth >= maxDepth) {\n      return;\n    }\n\n    const entries = await this.#source.readdir(dirPath);\n\n    for (const entry of entries) {\n      const entryPath = this.#joinPath(dirPath, entry.name);\n\n      if (entry.type === 'directory' && !entry.isSymlink) {\n        await this.#walkDirectory(basePath, entryPath, callback, depth + 1, maxDepth);\n      } else {\n        // Get relative path from base\n        const relativePath = entryPath.substring(basePath.length + 1);\n        callback(relativePath);\n      }\n    }\n  }\n\n  /**\n   * Build indexable content from instructions and references\n   */\n  async #buildIndexableContent(instructions: string, skillPath: string, references: string[]): Promise<string> {\n    const parts = [instructions];\n\n    // Read all reference files in parallel (independent reads, order preserved by map)\n    const refContents = await Promise.all(\n      references.map(async refPath => {\n        const fullPath = this.#joinPath(skillPath, 'references', refPath);\n        try {\n          const rawContent = await this.#source.readFile(fullPath);\n          return typeof rawContent === 'string' ? rawContent : rawContent.toString('utf-8');\n        } catch {\n          return null; // Skip files that can't be read\n        }\n      }),\n    );\n\n    for (const content of refContents) {\n      if (content !== null) parts.push(content);\n    }\n\n    return parts.join('\\n\\n');\n  }\n\n  /**\n   * Remove a skill's entries from the search index.\n   */\n  async #removeSkillFromIndex(skill: InternalSkill): Promise<void> {\n    if (!this.#searchEngine?.remove) return;\n\n    const ids = [`skill:${skill.path}:SKILL.md`, ...skill.references.map(r => `skill:${skill.path}:${r}`)];\n    for (const id of ids) {\n      try {\n        await this.#searchEngine.remove(id);\n      } catch {\n        // Best-effort removal; entry may already be gone\n      }\n    }\n  }\n\n  /**\n   * Infer the ContentSource for a skill path by matching against resolved paths.\n   */\n  #inferSource(skillPath: string): ContentSource {\n    for (const rp of this.#resolvedPaths) {\n      if (skillPath === rp || skillPath.startsWith(rp + '/')) {\n        return this.#determineSource(rp);\n      }\n    }\n    return this.#determineSource(skillPath);\n  }\n\n  /**\n   * Index a skill for search\n   */\n  async #indexSkill(skill: InternalSkill): Promise<void> {\n    if (!this.#searchEngine) return;\n\n    // Index the main skill instructions\n    await this.#searchEngine.index({\n      id: `skill:${skill.path}:SKILL.md`,\n      content: skill.instructions,\n      metadata: {\n        skillPath: skill.path,\n        source: 'SKILL.md',\n      },\n    });\n\n    // Index each reference file in parallel (independent reads + index calls)\n    await Promise.all(\n      skill.references.map(async refPath => {\n        const fullPath = this.#joinPath(skill.path, 'references', refPath);\n        try {\n          const rawContent = await this.#source.readFile(fullPath);\n          const content = typeof rawContent === 'string' ? rawContent : rawContent.toString('utf-8');\n          await this.#searchEngine!.index({\n            id: `skill:${skill.path}:${refPath}`,\n            content,\n            metadata: {\n              skillPath: skill.path,\n              source: `references/${refPath}`,\n            },\n          });\n        } catch {\n          // Skip files that can't be read\n        }\n      }),\n    );\n  }\n\n  /**\n   * Simple text search fallback when no search engine is configured\n   */\n  async #simpleSearch(query: string, options: SkillSearchOptions): Promise<SkillSearchResult[]> {\n    const { topK = 5, skillNames, includeReferences = true } = options;\n    const queryLower = query.toLowerCase();\n    const results: SkillSearchResult[] = [];\n\n    for (const candidates of this.#skills.values()) {\n      // Use tie-break winner for each name\n      const skill = await this.#tieBreak(candidates);\n      if (!skill) continue;\n\n      // Filter by skill names if specified\n      if (skillNames && !skillNames.includes(skill.name)) {\n        continue;\n      }\n\n      // Search in instructions\n      if (skill.instructions.toLowerCase().includes(queryLower)) {\n        results.push({\n          skillName: skill.name,\n          skillPath: skill.path,\n          source: 'SKILL.md',\n          content: skill.instructions.substring(0, 200),\n          score: 1,\n        });\n      }\n\n      // Search in references if included\n      if (includeReferences) {\n        for (const refPath of skill.references) {\n          if (results.length >= topK) break;\n          const content = await this.getReference(skill.name, `references/${refPath}`);\n          if (content && content.toLowerCase().includes(queryLower)) {\n            results.push({\n              skillName: skill.name,\n              skillPath: skill.path,\n              source: `references/${refPath}`,\n              content: content.substring(0, 200),\n              score: 0.8,\n            });\n          }\n        }\n      }\n\n      if (results.length >= topK) break;\n    }\n\n    return results.slice(0, topK);\n  }\n\n  /**\n   * Determine the source type based on the path\n   */\n  #determineSource(skillsPath: string): ContentSource {\n    // Use path segment matching to avoid false positives (e.g., my-node_modules).\n    // Consumer-supplied absolute paths may use either separator ('\\' on Windows).\n    const segments = splitPathSegments(skillsPath);\n    if (segments.includes('node_modules')) {\n      return { type: 'external', packagePath: skillsPath };\n    }\n    const normalized = skillsPath.replace(/\\\\/g, '/');\n    if (normalized.includes('/.mastra/skills') || normalized.startsWith('.mastra/skills')) {\n      return { type: 'managed', mastraPath: skillsPath };\n    }\n    return { type: 'local', projectPath: skillsPath };\n  }\n\n  /**\n   * Join path segments (workspace paths use forward slashes)\n   */\n  #joinPath(...segments: string[]): string {\n    return segments\n      .map((seg, i) => (i === 0 ? stripTrailingSlashes(seg) : stripLeadingAndTrailingSlashes(seg)))\n      .filter(Boolean)\n      .join('/');\n  }\n\n  /**\n   * Validate and normalize a relative path to prevent directory traversal.\n   * Throws if the path contains traversal segments (..) or is absolute.\n   */\n  #assertRelativePath(input: string, label: string): string {\n    const normalized = input.replace(/\\\\/g, '/');\n    const segments = normalized.split('/').filter(seg => Boolean(seg) && seg !== '.');\n    if (normalized.startsWith('/') || segments.some(seg => seg === '..')) {\n      throw new Error(`Invalid ${label} path: ${input}`);\n    }\n    return segments.join('/');\n  }\n\n  /**\n   * Get parent path\n   */\n  #getParentPath(path: string): string {\n    const lastSlash = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\\\'));\n    return lastSlash > 0 ? path.substring(0, lastSlash) : '/';\n  }\n}\n\n/**\n * Split a path into segments, tolerating both POSIX (`/`) and Windows (`\\`)\n * separators. Workspace-internal paths use forward slashes, but consumer-supplied\n * absolute paths (e.g. via `new Workspace({ skills: [...] })`) may use backslashes\n * on Windows.\n */\nfunction splitPathSegments(path: string): string[] {\n  return path.split(/[\\\\/]+/);\n}\n\n/**\n * Whether a path points directly at a `SKILL.md` file, tolerating both separators.\n */\nfunction isSkillFilePath(path: string): boolean {\n  return path === 'SKILL.md' || /[\\\\/]SKILL\\.md$/.test(path);\n}\n\nfunction stripTrailingSlashes(s: string): string {\n  let end = s.length;\n  while (end > 0 && s.charCodeAt(end - 1) === 47 /* \"/\" */) {\n    end--;\n  }\n  return end === s.length ? s : s.slice(0, end);\n}\n\nfunction stripLeadingAndTrailingSlashes(s: string): string {\n  let start = 0;\n  while (start < s.length && s.charCodeAt(start) === 47 /* \"/\" */) {\n    start++;\n  }\n  let end = s.length;\n  while (end > start && s.charCodeAt(end - 1) === 47 /* \"/\" */) {\n    end--;\n  }\n  return start === 0 && end === s.length ? s : s.slice(start, end);\n}\n","/**\n * AgentSkillsResolver — resolves agent-level skills config into a WorkspaceSkills.\n *\n * Handles the split between path-based skills (resolved via LocalSkillSource)\n * and inline skills (served from InlineSkillSource), producing a single\n * WorkspaceSkillsImpl that the Agent can use for processor injection and tool creation.\n */\n\nimport type { RequestContext } from '../request-context';\nimport { LocalSkillSource } from '../workspace/skills/local-skill-source';\nimport type { SkillSource, SkillSourceEntry, SkillSourceStat } from '../workspace/skills/skill-source';\nimport type { WorkspaceSkills } from '../workspace/skills/types';\nimport { WorkspaceSkillsImpl } from '../workspace/skills/workspace-skills';\nimport { isInlineSkill } from './create-skill';\nimport { InlineSkillSource } from './inline-skill-source';\nimport type { InlineSkill, SkillInput } from './types';\n\n// =============================================================================\n// CompositeSkillSource\n// =============================================================================\n\n/**\n * Combines multiple SkillSources, routing by path prefix.\n * Inline skills use `inline:<name>` paths; everything else goes to LocalSkillSource.\n */\nclass CompositeSkillSource implements SkillSource {\n  readonly #local: LocalSkillSource;\n  readonly #inline: InlineSkillSource;\n\n  constructor(local: LocalSkillSource, inline: InlineSkillSource) {\n    this.#local = local;\n    this.#inline = inline;\n  }\n\n  #route(path: string): SkillSource {\n    return path.startsWith('inline/') ? this.#inline : this.#local;\n  }\n\n  exists(path: string): Promise<boolean> {\n    return this.#route(path).exists(path);\n  }\n\n  stat(path: string): Promise<SkillSourceStat> {\n    return this.#route(path).stat(path);\n  }\n\n  readFile(path: string): Promise<string | Buffer> {\n    return this.#route(path).readFile(path);\n  }\n\n  readdir(path: string): Promise<SkillSourceEntry[]> {\n    return this.#route(path).readdir(path);\n  }\n\n  async realpath(path: string): Promise<string> {\n    const source = this.#route(path);\n    return source.realpath ? source.realpath(path) : path;\n  }\n}\n\n// =============================================================================\n// Resolver\n// =============================================================================\n\n/**\n * Resolve an array of SkillInput items into a WorkspaceSkills instance.\n *\n * @param skills - Array of path strings and/or inline skills\n * @returns A WorkspaceSkills implementation ready for use by the Agent\n */\nexport function resolveAgentSkills(skills: SkillInput[]): WorkspaceSkills {\n  // Partition into inline skills and path strings\n  const inlineSkills: InlineSkill[] = [];\n  const pathSkills: string[] = [];\n\n  for (const skill of skills) {\n    if (isInlineSkill(skill)) {\n      inlineSkills.push(skill);\n    } else {\n      pathSkills.push(skill);\n    }\n  }\n\n  // Build the skill source(s)\n  let source: SkillSource;\n\n  // All skill paths that WorkspaceSkillsImpl will scan\n  const skillPaths: string[] = [...pathSkills];\n\n  if (inlineSkills.length > 0 && pathSkills.length > 0) {\n    // Mixed: composite source\n    const local = new LocalSkillSource();\n    const inline = new InlineSkillSource(inlineSkills);\n    source = new CompositeSkillSource(local, inline);\n    // Add inline skill paths\n    for (const skill of inlineSkills) {\n      skillPaths.push(`inline/${skill.name}`);\n    }\n  } else if (inlineSkills.length > 0) {\n    // Only inline skills\n    const inline = new InlineSkillSource(inlineSkills);\n    source = inline;\n    for (const skill of inlineSkills) {\n      skillPaths.push(`inline/${skill.name}`);\n    }\n  } else {\n    // Only path-based skills\n    source = new LocalSkillSource();\n  }\n\n  return new WorkspaceSkillsImpl({\n    source,\n    skills: skillPaths,\n    validateOnLoad: true,\n  });\n}\n\n/**\n * Merge two WorkspaceSkills instances by combining their skill lists.\n * Agent-level skills take precedence on name conflicts (returned first in list).\n */\nexport async function mergeWorkspaceSkills(\n  agentSkills: WorkspaceSkills,\n  workspaceSkills: WorkspaceSkills,\n): Promise<{ merged: WorkspaceSkills; agentSkillNames: Set<string> }> {\n  // For now, we don't physically merge the implementations.\n  // Instead, we create a MergedWorkspaceSkills wrapper that delegates to both.\n  return {\n    merged: new MergedWorkspaceSkills(agentSkills, workspaceSkills),\n    agentSkillNames: new Set((await agentSkills.list()).map(s => s.name)),\n  };\n}\n\n/**\n * A WorkspaceSkills wrapper that merges two skill sets.\n * Agent skills take precedence on name conflicts.\n */\nclass MergedWorkspaceSkills implements WorkspaceSkills {\n  readonly #primary: WorkspaceSkills;\n  readonly #secondary: WorkspaceSkills;\n\n  constructor(primary: WorkspaceSkills, secondary: WorkspaceSkills) {\n    this.#primary = primary;\n    this.#secondary = secondary;\n  }\n\n  async list() {\n    const primaryList = await this.#primary.list();\n    const secondaryList = await this.#secondary.list();\n    const primaryNames = new Set(primaryList.map(s => s.name));\n    // Agent-level skills win on name conflicts\n    return [...primaryList, ...secondaryList.filter(s => !primaryNames.has(s.name))];\n  }\n\n  async get(name: string) {\n    const primary = await this.#primary.get(name);\n    if (primary) return primary;\n    return this.#secondary.get(name);\n  }\n\n  async has(name: string) {\n    return (await this.#primary.has(name)) || (await this.#secondary.has(name));\n  }\n\n  async refresh() {\n    await Promise.all([this.#primary.refresh(), this.#secondary.refresh()]);\n  }\n\n  async maybeRefresh(context?: { requestContext?: RequestContext }) {\n    await Promise.all([this.#primary.maybeRefresh(context), this.#secondary.maybeRefresh(context)]);\n  }\n\n  async search(query: string, options?: Parameters<WorkspaceSkills['search']>[1]) {\n    const [primaryResults, secondaryResults] = await Promise.all([\n      this.#primary.search(query, options),\n      this.#secondary.search(query, options),\n    ]);\n    // Combine and sort by score\n    return [...primaryResults, ...secondaryResults].sort((a, b) => b.score - a.score);\n  }\n\n  async getReference(skillName: string, referencePath: string) {\n    const primary = await this.#primary.getReference(skillName, referencePath);\n    if (primary !== null) return primary;\n    return this.#secondary.getReference(skillName, referencePath);\n  }\n\n  async getScript(skillName: string, scriptPath: string) {\n    const primary = await this.#primary.getScript(skillName, scriptPath);\n    if (primary !== null) return primary;\n    return this.#secondary.getScript(skillName, scriptPath);\n  }\n\n  async getAsset(skillName: string, assetPath: string) {\n    const primary = await this.#primary.getAsset(skillName, assetPath);\n    if (primary !== null) return primary;\n    return this.#secondary.getAsset(skillName, assetPath);\n  }\n\n  async listReferences(skillName: string) {\n    const primary = await this.#primary.listReferences(skillName);\n    if (primary.length > 0) return primary;\n    return this.#secondary.listReferences(skillName);\n  }\n\n  async listScripts(skillName: string) {\n    const primary = await this.#primary.listScripts(skillName);\n    if (primary.length > 0) return primary;\n    return this.#secondary.listScripts(skillName);\n  }\n\n  async listAssets(skillName: string) {\n    const primary = await this.#primary.listAssets(skillName);\n    if (primary.length > 0) return primary;\n    return this.#secondary.listAssets(skillName);\n  }\n}\n"]}