@skillkit/core 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/dist/index.d.ts +3247 -2
- package/dist/index.js +6766 -107
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/skills.ts","../src/config.ts","../src/providers/github.ts","../src/providers/base.ts","../src/providers/gitlab.ts","../src/providers/bitbucket.ts","../src/providers/local.ts","../src/providers/index.ts","../src/translator/types.ts","../src/translator/formats/skill-md.ts","../src/translator/formats/cursor.ts","../src/translator/formats/windsurf.ts","../src/translator/formats/copilot.ts","../src/translator/registry.ts","../src/translator/index.ts","../src/context/types.ts","../src/context/detector.ts","../src/context/manager.ts","../src/context/sync.ts","../src/context/loader.ts","../src/recommend/types.ts","../src/recommend/engine.ts","../src/recommend/fetcher.ts","../src/session/types.ts","../src/session/manager.ts","../src/workflow/types.ts","../src/workflow/parser.ts","../src/workflow/orchestrator.ts","../src/executor/engine.ts","../src/executor/agents.ts","../src/testing/runner.ts","../src/marketplace/types.ts","../src/marketplace/aggregator.ts","../src/cicd/templates.ts","../src/memory/types.ts","../src/memory/observation-store.ts","../src/memory/learning-store.ts","../src/memory/memory-index.ts","../src/memory/initializer.ts","../src/memory/observer.ts","../src/memory/engine-integration.ts","../src/memory/compressor.ts","../src/memory/injector.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AgentType = z.enum([\n 'claude-code',\n 'codex',\n 'cursor',\n 'antigravity',\n 'opencode',\n 'gemini-cli',\n 'amp',\n 'clawdbot',\n 'droid',\n 'github-copilot',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'windsurf',\n 'universal',\n]);\nexport type AgentType = z.infer<typeof AgentType>;\n\nexport const GitProvider = z.enum(['github', 'gitlab', 'bitbucket', 'local']);\nexport type GitProvider = z.infer<typeof GitProvider>;\n\nexport const SkillFrontmatter = z.object({\n name: z.string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'Skill name must be lowercase alphanumeric with hyphens, no leading/trailing/consecutive hyphens'),\n description: z.string().min(1).max(1024),\n license: z.string().optional(),\n compatibility: z.string().max(500).optional(),\n metadata: z.record(z.string()).optional(),\n 'allowed-tools': z.string().optional(),\n version: z.string().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n agents: z.array(AgentType).optional(),\n});\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatter>;\n\nexport const SkillMetadata = z.object({\n name: z.string(),\n description: z.string(),\n source: z.string(),\n sourceType: GitProvider,\n subpath: z.string().optional(),\n installedAt: z.string().datetime(),\n updatedAt: z.string().datetime().optional(),\n enabled: z.boolean().default(true),\n version: z.string().optional(),\n checksum: z.string().optional(),\n});\nexport type SkillMetadata = z.infer<typeof SkillMetadata>;\n\nexport const SkillLocation = z.enum(['project', 'global']);\nexport type SkillLocation = z.infer<typeof SkillLocation>;\n\nexport const Skill = z.object({\n name: z.string(),\n description: z.string(),\n path: z.string(),\n location: SkillLocation,\n metadata: SkillMetadata.optional(),\n enabled: z.boolean().default(true),\n});\nexport type Skill = z.infer<typeof Skill>;\n\nexport const SkillkitConfig = z.object({\n version: z.literal(1),\n agent: AgentType.default('universal'),\n skillsDir: z.string().optional(),\n enabledSkills: z.array(z.string()).optional(),\n disabledSkills: z.array(z.string()).optional(),\n autoSync: z.boolean().default(true),\n});\nexport type SkillkitConfig = z.infer<typeof SkillkitConfig>;\n\nexport interface InstallOptions {\n global?: boolean;\n skills?: string[];\n provider?: GitProvider;\n yes?: boolean;\n force?: boolean;\n}\n\nexport interface SyncOptions {\n output?: string;\n agent?: AgentType;\n yes?: boolean;\n enabledOnly?: boolean;\n}\n\nexport interface UpdateOptions {\n skills?: string[];\n all?: boolean;\n force?: boolean;\n}\n\nexport interface RegistrySkill {\n name: string;\n description: string;\n source: string;\n provider: GitProvider;\n downloads?: number;\n stars?: number;\n tags?: string[];\n}\n\nexport interface DiscoveredSkill {\n name: string;\n dirName: string;\n path: string;\n}\n\nexport interface CloneResult {\n success: boolean;\n path?: string;\n tempRoot?: string;\n error?: string;\n skills?: string[];\n discoveredSkills?: DiscoveredSkill[];\n}\n\nexport interface CommandResult {\n success: boolean;\n message: string;\n data?: unknown;\n}\n\n// Agent adapter interface (used by agents package)\nexport interface AgentAdapterInfo {\n type: AgentType;\n name: string;\n skillsDir: string;\n configFile: string;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { SkillFrontmatter, SkillMetadata, type Skill, type SkillLocation } from './types.js';\n\nexport const SKILL_DISCOVERY_PATHS = [\n 'skills',\n 'skills/.curated',\n 'skills/.experimental',\n 'skills/.system',\n '.agents/skills',\n '.agent/skills',\n '.claude/skills',\n '.codex/skills',\n '.cursor/skills',\n '.factory/skills',\n '.gemini/skills',\n '.github/skills',\n '.goose/skills',\n '.kilocode/skills',\n '.kiro/skills',\n '.opencode/skills',\n '.roo/skills',\n '.trae/skills',\n '.windsurf/skills',\n '.clawdbot/skills',\n '.antigravity/skills',\n '.copilot/skills',\n];\n\nfunction discoverSkillsInDir(dir: string): Skill[] {\n const skills: Skill[] = [];\n\n if (!existsSync(dir)) {\n return skills;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(dir, entry.name);\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(skillPath);\n if (skill) {\n skills.push(skill);\n }\n }\n }\n\n return skills;\n}\n\n/**\n * Recursively search for skills in all subdirectories\n */\nfunction discoverSkillsRecursive(\n dir: string,\n seen: Set<string>,\n maxDepth: number = 5,\n currentDepth: number = 0\n): Skill[] {\n const skills: Skill[] = [];\n\n if (currentDepth >= maxDepth || !existsSync(dir)) {\n return skills;\n }\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === '.git') {\n continue;\n }\n\n if (!entry.isDirectory()) continue;\n\n const entryPath = join(dir, entry.name);\n const skillMdPath = join(entryPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(entryPath);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n } else {\n const subSkills = discoverSkillsRecursive(entryPath, seen, maxDepth, currentDepth + 1);\n skills.push(...subSkills);\n }\n }\n } catch {}\n\n return skills;\n}\n\nexport function discoverSkills(rootDir: string): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n const rootSkillMd = join(rootDir, 'SKILL.md');\n if (existsSync(rootSkillMd)) {\n const skill = parseSkill(rootDir);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Search all standard paths\n for (const searchPath of SKILL_DISCOVERY_PATHS) {\n const fullPath = join(rootDir, searchPath);\n if (existsSync(fullPath)) {\n for (const skill of discoverSkillsInDir(fullPath)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n }\n }\n\n // Try direct discovery in root (for flat structures)\n for (const skill of discoverSkillsInDir(rootDir)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Fallback: recursive search if nothing found\n if (skills.length === 0) {\n skills.push(...discoverSkillsRecursive(rootDir, seen));\n }\n\n return skills;\n}\n\nexport function parseSkill(skillPath: string, location: SkillLocation = 'project'): Skill | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n const name = basename(skillPath);\n return {\n name,\n description: 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n\n if (!parsed.success) {\n return {\n name: (frontmatter.name as string) || basename(skillPath),\n description: (frontmatter.description as string) || 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const metadata = loadMetadata(skillPath);\n\n return {\n name: parsed.data.name,\n description: parsed.data.description,\n path: skillPath,\n location,\n metadata: metadata ?? undefined,\n enabled: metadata?.enabled ?? true,\n };\n } catch {\n return null;\n }\n}\n\nexport function extractFrontmatter(content: string): Record<string, unknown> | null {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!match) {\n return null;\n }\n\n try {\n return parseYaml(match[1]) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function extractField(content: string, field: string): string | null {\n const frontmatter = extractFrontmatter(content);\n if (!frontmatter || !(field in frontmatter)) {\n return null;\n }\n\n const value = frontmatter[field];\n return typeof value === 'string' ? value : null;\n}\n\nexport function loadMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, '.skillkit.json');\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n const data = JSON.parse(content);\n const parsed = SkillMetadata.safeParse(data);\n\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n}\n\nexport function readSkillContent(skillPath: string): string | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n return readFileSync(skillMdPath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport function findSkill(name: string, searchDirs: string[]): Skill | null {\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const skillPath = join(dir, name);\n if (existsSync(skillPath)) {\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n return parseSkill(skillPath, location);\n }\n }\n\n return null;\n}\n\nexport function findAllSkills(searchDirs: string[]): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n const discovered = discoverSkills(dir);\n\n for (const skill of discovered) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push({ ...skill, location });\n }\n }\n }\n\n return skills;\n}\n\nexport function validateSkill(skillPath: string): { valid: boolean; errors: string[]; warnings?: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n const dirName = basename(skillPath);\n\n const skillMdPath = join(skillPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n errors.push('Missing SKILL.md file');\n return { valid: false, errors };\n }\n\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n errors.push('Missing YAML frontmatter in SKILL.md');\n return { valid: false, errors };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n errors.push(`${issue.path.join('.') || 'frontmatter'}: ${issue.message}`);\n }\n }\n\n if (parsed.success) {\n const data = parsed.data;\n\n if (data.name !== dirName) {\n warnings.push(`name \"${data.name}\" does not match directory name \"${dirName}\"`);\n }\n\n if (data.description && data.description.length < 50) {\n warnings.push('description is short; consider describing what the skill does AND when to use it');\n }\n }\n\n const bodyContent = content.replace(/^---[\\s\\S]*?---\\s*/, '');\n const lineCount = bodyContent.split('\\n').length;\n if (lineCount > 500) {\n warnings.push(`SKILL.md has ${lineCount} lines; consider moving detailed content to references/`);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nexport function isPathInside(child: string, parent: string): boolean {\n const relative = child.replace(parent, '');\n return !relative.startsWith('..') && !relative.includes('/..');\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { SkillkitConfig, type AgentType, type SkillMetadata, type AgentAdapterInfo } from './types.js';\n\nconst CONFIG_FILE = 'skillkit.yaml';\nconst METADATA_FILE = '.skillkit.json';\n\nexport function getProjectConfigPath(): string {\n return join(process.cwd(), CONFIG_FILE);\n}\n\nexport function getGlobalConfigPath(): string {\n return join(homedir(), '.config', 'skillkit', CONFIG_FILE);\n}\n\nexport function loadConfig(): SkillkitConfig {\n const projectPath = getProjectConfigPath();\n const globalPath = getGlobalConfigPath();\n\n if (existsSync(projectPath)) {\n try {\n const content = readFileSync(projectPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n if (existsSync(globalPath)) {\n try {\n const content = readFileSync(globalPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return {\n version: 1,\n agent: 'universal',\n autoSync: true,\n };\n}\n\nexport function saveConfig(config: SkillkitConfig, global = false): void {\n const configPath = global ? getGlobalConfigPath() : getProjectConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\nexport function getSearchDirs(adapter: AgentAdapterInfo): string[] {\n const dirs: string[] = [];\n\n dirs.push(join(process.cwd(), adapter.skillsDir));\n dirs.push(join(process.cwd(), '.agent', 'skills'));\n dirs.push(join(homedir(), adapter.skillsDir));\n dirs.push(join(homedir(), '.agent', 'skills'));\n\n return dirs;\n}\n\nexport function getInstallDir(adapter: AgentAdapterInfo, global = false): string {\n if (global) {\n return join(homedir(), adapter.skillsDir);\n }\n\n return join(process.cwd(), adapter.skillsDir);\n}\n\nexport function getAgentConfigPath(adapter: AgentAdapterInfo): string {\n return join(process.cwd(), adapter.configFile);\n}\n\nexport function saveSkillMetadata(skillPath: string, metadata: SkillMetadata): void {\n const metadataPath = join(skillPath, METADATA_FILE);\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');\n}\n\nexport function loadSkillMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, METADATA_FILE);\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n return JSON.parse(content) as SkillMetadata;\n } catch {\n return null;\n }\n}\n\nexport function setSkillEnabled(skillPath: string, enabled: boolean): boolean {\n const metadata = loadSkillMetadata(skillPath);\n\n if (!metadata) {\n return false;\n }\n\n metadata.enabled = enabled;\n metadata.updatedAt = new Date().toISOString();\n saveSkillMetadata(skillPath, metadata);\n\n return true;\n}\n\nexport async function initProject(\n type: AgentType,\n adapter: AgentAdapterInfo\n): Promise<void> {\n const skillsDir = join(process.cwd(), adapter.skillsDir);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const config: SkillkitConfig = {\n version: 1,\n agent: type,\n autoSync: true,\n };\n saveConfig(config);\n\n const agentConfigPath = join(process.cwd(), adapter.configFile);\n if (!existsSync(agentConfigPath)) {\n writeFileSync(agentConfigPath, `# ${adapter.name} Configuration\\n\\n`, 'utf-8');\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand, isGitUrl } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitHubProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'github';\n readonly name = 'GitHub';\n readonly baseUrl = 'https://github.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://github.com/')) {\n const path = source.replace('https://github.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@github.com:')) {\n const path = source.replace('git@github.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (!isGitUrl(source) && !source.includes(':')) {\n return parseShorthand(source);\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://github.com/') ||\n source.startsWith('git@github.com:') ||\n (!isGitUrl(source) && !source.includes(':') && source.includes('/'))\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://github.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@github.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitHub source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import type { GitProvider, CloneResult } from '../types.js';\n\nexport interface GitProviderAdapter {\n readonly type: GitProvider;\n readonly name: string;\n readonly baseUrl: string;\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null;\n matches(source: string): boolean;\n getCloneUrl(owner: string, repo: string): string;\n getSshUrl(owner: string, repo: string): string;\n clone(source: string, targetDir: string, options?: CloneOptions): Promise<CloneResult>;\n}\n\nexport interface CloneOptions {\n depth?: number;\n branch?: string;\n ssh?: boolean;\n}\n\nexport function parseShorthand(source: string): { owner: string; repo: string; subpath?: string } | null {\n const cleaned = source.replace(/^\\/+|\\/+$/g, '');\n const parts = cleaned.split('/');\n\n if (parts.length < 2) {\n return null;\n }\n\n const owner = parts[0];\n const repo = parts[1];\n const subpath = parts.length > 2 ? parts.slice(2).join('/') : undefined;\n\n return { owner, repo, subpath };\n}\n\nexport function isLocalPath(source: string): boolean {\n return (\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n source.startsWith('~/') ||\n source.startsWith('.')\n );\n}\n\nexport function isGitUrl(source: string): boolean {\n return (\n source.startsWith('git@') ||\n source.startsWith('https://') ||\n source.startsWith('http://') ||\n source.startsWith('ssh://')\n );\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitLabProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'gitlab';\n readonly name = 'GitLab';\n readonly baseUrl = 'https://gitlab.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://gitlab.com/')) {\n const path = source.replace('https://gitlab.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@gitlab.com:')) {\n const path = source.replace('git@gitlab.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('gitlab:')) {\n return parseShorthand(source.replace('gitlab:', ''));\n }\n\n if (source.startsWith('gitlab.com/')) {\n return parseShorthand(source.replace('gitlab.com/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://gitlab.com/') ||\n source.startsWith('git@gitlab.com:') ||\n source.startsWith('gitlab:') ||\n source.startsWith('gitlab.com/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://gitlab.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@gitlab.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitLab source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class BitbucketProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'bitbucket';\n readonly name = 'Bitbucket';\n readonly baseUrl = 'https://bitbucket.org';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://bitbucket.org/')) {\n const path = source.replace('https://bitbucket.org/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@bitbucket.org:')) {\n const path = source.replace('git@bitbucket.org:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('bitbucket:')) {\n return parseShorthand(source.replace('bitbucket:', ''));\n }\n\n if (source.startsWith('bitbucket.org/')) {\n return parseShorthand(source.replace('bitbucket.org/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://bitbucket.org/') ||\n source.startsWith('git@bitbucket.org:') ||\n source.startsWith('bitbucket:') ||\n source.startsWith('bitbucket.org/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://bitbucket.org/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@bitbucket.org:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid Bitbucket source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { existsSync, statSync, realpathSync } from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { isLocalPath } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class LocalProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'local';\n readonly name = 'Local Filesystem';\n readonly baseUrl = '';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (!isLocalPath(source)) {\n return null;\n }\n\n let expandedPath = source;\n if (source.startsWith('~/')) {\n expandedPath = join(homedir(), source.slice(2));\n }\n\n const absolutePath = resolve(expandedPath);\n const dirName = basename(absolutePath);\n\n return {\n owner: 'local',\n repo: dirName,\n subpath: absolutePath,\n };\n }\n\n matches(source: string): boolean {\n return isLocalPath(source);\n }\n\n getCloneUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n getSshUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n async clone(source: string, _targetDir: string, _options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed || !parsed.subpath) {\n return { success: false, error: `Invalid local path: ${source}` };\n }\n\n const sourcePath = parsed.subpath;\n\n if (!existsSync(sourcePath)) {\n return { success: false, error: `Path does not exist: ${sourcePath}` };\n }\n\n const stats = statSync(sourcePath);\n if (!stats.isDirectory()) {\n return { success: false, error: `Path is not a directory: ${sourcePath}` };\n }\n\n try {\n let actualPath = sourcePath;\n try {\n actualPath = realpathSync(sourcePath);\n } catch {\n // Ignore realpath errors\n }\n\n const skills = discoverSkills(actualPath);\n\n return {\n success: true,\n path: actualPath,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to process local path: ${message}` };\n }\n }\n}\n","import type { GitProviderAdapter } from './base.js';\nimport type { GitProvider } from '../types.js';\nimport { GitHubProvider } from './github.js';\nimport { GitLabProvider } from './gitlab.js';\nimport { BitbucketProvider } from './bitbucket.js';\nimport { LocalProvider } from './local.js';\n\nexport * from './base.js';\nexport * from './github.js';\nexport * from './gitlab.js';\nexport * from './bitbucket.js';\nexport * from './local.js';\n\nconst providers: GitProviderAdapter[] = [\n new LocalProvider(),\n new GitLabProvider(),\n new BitbucketProvider(),\n new GitHubProvider(),\n];\n\nexport function getProvider(type: GitProvider): GitProviderAdapter | undefined {\n return providers.find(p => p.type === type);\n}\n\nexport function getAllProviders(): GitProviderAdapter[] {\n return providers;\n}\n\nexport function detectProvider(source: string): GitProviderAdapter | undefined {\n return providers.find(p => p.matches(source));\n}\n\nexport function parseSource(source: string): {\n provider: GitProviderAdapter;\n owner: string;\n repo: string;\n subpath?: string;\n} | null {\n for (const provider of providers) {\n if (provider.matches(source)) {\n const parsed = provider.parseSource(source);\n if (parsed) {\n return { provider, ...parsed };\n }\n }\n }\n return null;\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Format categories for skill translation\n */\nexport type FormatCategory =\n | 'skill-md' // Category A: Standard SKILL.md (13 agents)\n | 'cursor-mdc' // Category B: Cursor MDC format\n | 'markdown-rules' // Category C: Windsurf, GitHub Copilot\n | 'external'; // Category D: External systems (Devin, etc.)\n\n/**\n * Mapping of agents to their format categories\n */\nexport const AGENT_FORMAT_MAP: Record<AgentType, FormatCategory> = {\n 'claude-code': 'skill-md',\n 'codex': 'skill-md',\n 'gemini-cli': 'skill-md',\n 'opencode': 'skill-md',\n 'antigravity': 'skill-md',\n 'amp': 'skill-md',\n 'clawdbot': 'skill-md',\n 'droid': 'skill-md',\n 'goose': 'skill-md',\n 'kilo': 'skill-md',\n 'kiro-cli': 'skill-md',\n 'roo': 'skill-md',\n 'trae': 'skill-md',\n 'universal': 'skill-md',\n 'cursor': 'cursor-mdc',\n 'windsurf': 'markdown-rules',\n 'github-copilot': 'markdown-rules',\n};\n\n/**\n * Extended skill frontmatter for translation\n */\nexport const TranslatableSkillFrontmatter = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string().optional(),\n author: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n 'allowed-tools': z.string().optional(),\n metadata: z.record(z.string()).optional(),\n // Cursor-specific fields\n globs: z.array(z.string()).optional(),\n alwaysApply: z.boolean().optional(),\n // Agent optimization hints\n agents: z.object({\n optimized: z.array(z.string()).optional(),\n compatible: z.array(z.string()).optional(),\n }).optional(),\n});\nexport type TranslatableSkillFrontmatter = z.infer<typeof TranslatableSkillFrontmatter>;\n\n/**\n * Canonical skill representation for translation\n */\nexport interface CanonicalSkill {\n /** Skill name (kebab-case) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Version string */\n version?: string;\n /** Author name or handle */\n author?: string;\n /** License identifier */\n license?: string;\n /** Categorization tags */\n tags?: string[];\n /** Compatibility description */\n compatibility?: string;\n /** Allowed tools list */\n allowedTools?: string;\n /** Additional metadata */\n metadata?: Record<string, string>;\n /** Main content (markdown) */\n content: string;\n /** Original format this was parsed from */\n sourceFormat: FormatCategory;\n /** Source agent type */\n sourceAgent?: AgentType;\n /** Cursor-specific: glob patterns */\n globs?: string[];\n /** Cursor-specific: always apply flag */\n alwaysApply?: boolean;\n /** Agent optimization hints */\n agentHints?: {\n optimized?: string[];\n compatible?: string[];\n };\n}\n\n/**\n * Result of a translation operation\n */\nexport interface TranslationResult {\n /** Whether translation succeeded */\n success: boolean;\n /** Translated content */\n content: string;\n /** Output filename */\n filename: string;\n /** Warnings during translation */\n warnings: string[];\n /** Features that couldn't be translated */\n incompatible: string[];\n /** Target format */\n targetFormat: FormatCategory;\n /** Target agent */\n targetAgent: AgentType;\n}\n\n/**\n * Options for translation\n */\nexport interface TranslationOptions {\n /** Preserve original comments */\n preserveComments?: boolean;\n /** Add translation metadata */\n addMetadata?: boolean;\n /** Custom output filename */\n outputFilename?: string;\n /** For Cursor: glob patterns to include */\n globs?: string[];\n /** For Cursor: always apply setting */\n alwaysApply?: boolean;\n}\n\n/**\n * Interface for format-specific translators\n */\nexport interface FormatTranslator {\n /** Format this translator handles */\n readonly format: FormatCategory;\n /** Agents this translator is optimized for */\n readonly agents: AgentType[];\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null;\n\n /**\n * Check if content matches this format\n */\n detect(content: string, filename?: string): boolean;\n\n /**\n * Generate content for target agent\n */\n generate(skill: CanonicalSkill, targetAgent: AgentType, options?: TranslationOptions): TranslationResult;\n\n /**\n * Get the expected filename for this format\n */\n getFilename(skillName: string, targetAgent: AgentType): string;\n}\n\n/**\n * Translation path between formats\n */\nexport interface TranslationPath {\n from: FormatCategory;\n to: FormatCategory;\n steps: FormatCategory[];\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Agents that use the standard SKILL.md format\n */\nconst SKILL_MD_AGENTS: AgentType[] = [\n 'claude-code',\n 'codex',\n 'gemini-cli',\n 'opencode',\n 'antigravity',\n 'amp',\n 'clawdbot',\n 'droid',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'universal',\n];\n\n/**\n * Extract YAML frontmatter from markdown content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * SKILL.md Format Translator\n *\n * This is the canonical format used by most AI coding agents.\n * Format:\n * ```\n * ---\n * name: skill-name\n * description: What it does\n * version: 1.0.0\n * tags: [tag1, tag2]\n * ---\n * # Instructions\n * Markdown content here...\n * ```\n */\nexport class SkillMdTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'skill-md';\n readonly agents: AgentType[] = SKILL_MD_AGENTS;\n\n /**\n * Parse SKILL.md content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n if (!frontmatter) {\n // Try to infer from content if no frontmatter\n const nameMatch = content.match(/^#\\s+(.+)$/m);\n const name = nameMatch\n ? nameMatch[1].toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '')\n : filename?.replace(/\\.md$/i, '').replace(/^SKILL$/i, 'unnamed-skill') || 'unnamed-skill';\n\n return {\n name,\n description: 'Skill without frontmatter',\n content: body.trim(),\n sourceFormat: 'skill-md',\n };\n }\n\n const name = (frontmatter.name as string) || 'unnamed-skill';\n const description = (frontmatter.description as string) || 'No description';\n\n return {\n name,\n description,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n license: frontmatter.license as string | undefined,\n tags: frontmatter.tags as string[] | undefined,\n compatibility: frontmatter.compatibility as string | undefined,\n allowedTools: frontmatter['allowed-tools'] as string | undefined,\n metadata: frontmatter.metadata as Record<string, string> | undefined,\n content: body.trim(),\n sourceFormat: 'skill-md',\n sourceAgent: frontmatter.sourceAgent as AgentType | undefined,\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n agentHints: frontmatter.agents as { optimized?: string[]; compatible?: string[] } | undefined,\n };\n }\n\n /**\n * Check if content is SKILL.md format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename && /SKILL\\.md$/i.test(filename)) {\n return true;\n }\n\n // Check for YAML frontmatter with expected fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter && ('name' in frontmatter || 'description' in frontmatter)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate SKILL.md content for target agent\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter object\n const frontmatter: Record<string, unknown> = {\n name: skill.name,\n description: skill.description,\n };\n\n // Add optional fields\n if (skill.version) frontmatter.version = skill.version;\n if (skill.author) frontmatter.author = skill.author;\n if (skill.license) frontmatter.license = skill.license;\n if (skill.tags?.length) frontmatter.tags = skill.tags;\n if (skill.compatibility) frontmatter.compatibility = skill.compatibility;\n if (skill.allowedTools) frontmatter['allowed-tools'] = skill.allowedTools;\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n frontmatter.metadata = skill.metadata;\n }\n\n // Handle Cursor-specific fields (store for reverse translation)\n if (skill.globs?.length) {\n frontmatter.globs = skill.globs;\n warnings.push('Cursor globs preserved but may not be used by target agent');\n }\n if (skill.alwaysApply !== undefined) {\n frontmatter.alwaysApply = skill.alwaysApply;\n warnings.push('Cursor alwaysApply preserved but may not be used by target agent');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.translatedAt = new Date().toISOString();\n frontmatter.targetAgent = targetAgent;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n defaultStringType: 'QUOTE_DOUBLE',\n }).trim();\n\n // Combine frontmatter and content\n const content = `---\\n${yamlContent}\\n---\\n\\n${skill.content}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'skill-md',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for SKILL.md format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'SKILL.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const skillMdTranslator = new SkillMdTranslator();\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Extract YAML frontmatter from MDC content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * Infer glob patterns from skill content and tags\n */\nfunction inferGlobs(skill: CanonicalSkill): string[] {\n const globs: string[] = [];\n const content = skill.content.toLowerCase();\n const tags = skill.tags || [];\n\n // Infer from tags\n const tagExtensions: Record<string, string[]> = {\n 'react': ['**/*.tsx', '**/*.jsx'],\n 'typescript': ['**/*.ts', '**/*.tsx'],\n 'javascript': ['**/*.js', '**/*.jsx'],\n 'python': ['**/*.py'],\n 'rust': ['**/*.rs'],\n 'go': ['**/*.go'],\n 'css': ['**/*.css', '**/*.scss', '**/*.sass'],\n 'html': ['**/*.html', '**/*.htm'],\n 'vue': ['**/*.vue'],\n 'svelte': ['**/*.svelte'],\n 'angular': ['**/*.ts', '**/*.html'],\n 'nextjs': ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n 'testing': ['**/*.test.*', '**/*.spec.*'],\n 'api': ['**/api/**/*', '**/routes/**/*'],\n };\n\n for (const tag of tags) {\n const normalized = tag.toLowerCase();\n if (tagExtensions[normalized]) {\n globs.push(...tagExtensions[normalized]);\n }\n }\n\n // Infer from content mentions\n if (content.includes('component') || content.includes('jsx') || content.includes('tsx')) {\n if (!globs.includes('**/*.tsx')) globs.push('**/*.tsx');\n if (!globs.includes('**/*.jsx')) globs.push('**/*.jsx');\n }\n\n if (content.includes('.py') || content.includes('python')) {\n if (!globs.includes('**/*.py')) globs.push('**/*.py');\n }\n\n // Remove duplicates\n return [...new Set(globs)];\n}\n\n/**\n * Cursor MDC Format Translator\n *\n * Cursor uses two formats:\n * 1. .cursorrules - Global rules file in project root\n * 2. .cursor/rules/*.mdc - Individual rule files with frontmatter\n *\n * MDC Format:\n * ```\n * ---\n * description: What this rule does\n * globs: [\"**\\/*.tsx\", \"**\\/*.jsx\"]\n * alwaysApply: false\n * ---\n * Instructions here...\n * ```\n */\nexport class CursorTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'cursor-mdc';\n readonly agents: AgentType[] = ['cursor'];\n\n /**\n * Parse Cursor MDC content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n // Extract name from filename\n let name = 'unnamed-skill';\n if (filename) {\n name = filename\n .replace(/\\.(mdc|md|cursorrules)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n\n if (!frontmatter) {\n // Plain .cursorrules file without frontmatter\n return {\n name,\n description: 'Cursor rules',\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n };\n }\n\n const description = (frontmatter.description as string) || 'Cursor rule';\n\n return {\n name: (frontmatter.name as string) || name,\n description,\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n tags: frontmatter.tags as string[] | undefined,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n };\n }\n\n /**\n * Check if content is Cursor MDC format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.mdc$/i.test(filename)) return true;\n if (/\\.cursorrules$/i.test(filename)) return true;\n if (/cursorrules/i.test(filename)) return true;\n }\n\n // Check for MDC-specific frontmatter fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter) {\n if ('globs' in frontmatter || 'alwaysApply' in frontmatter) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Cursor MDC content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter\n const frontmatter: Record<string, unknown> = {\n description: skill.description,\n };\n\n // Handle globs\n let globs = options.globs || skill.globs;\n if (!globs?.length) {\n // Try to infer globs from skill metadata\n globs = inferGlobs(skill);\n if (globs.length > 0) {\n warnings.push(`Inferred glob patterns: ${globs.join(', ')}`);\n }\n }\n if (globs?.length) {\n frontmatter.globs = globs;\n }\n\n // Handle alwaysApply\n const alwaysApply = options.alwaysApply ?? skill.alwaysApply;\n if (alwaysApply !== undefined) {\n frontmatter.alwaysApply = alwaysApply;\n }\n\n // Note features that don't translate well\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Cursor does not support tool restrictions');\n }\n if (skill.compatibility) {\n // Add as comment in content\n warnings.push('compatibility info added as comment');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.originalName = skill.name;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n }).trim();\n\n // Build content with optional compatibility note\n let body = skill.content;\n if (skill.compatibility && options.preserveComments !== false) {\n body = `<!-- Compatibility: ${skill.compatibility} -->\\n\\n${body}`;\n }\n\n const content = `---\\n${yamlContent}\\n---\\n\\n${body}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'cursor-mdc',\n targetAgent,\n };\n }\n\n /**\n * Generate .cursorrules content (alternative format)\n */\n generateCursorrules(skill: CanonicalSkill): string {\n // .cursorrules is just plain markdown without frontmatter\n let content = '';\n\n // Add header comment\n content += `# ${skill.name}\\n`;\n content += `# ${skill.description}\\n\\n`;\n\n // Add main content\n content += skill.content;\n\n return content;\n }\n\n /**\n * Get the expected filename for Cursor format\n */\n getFilename(skillName: string, _targetAgent: AgentType): string {\n // Convert to valid MDC filename\n const safeName = skillName\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n return `${safeName}.mdc`;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const cursorTranslator = new CursorTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n // Stop parsing metadata on first non-comment, non-empty line\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * Windsurf Rules Format Translator\n *\n * Windsurf uses plain markdown files (.windsurfrules) without YAML frontmatter.\n * Metadata can be embedded in HTML comments at the top.\n *\n * Format:\n * ```\n * <!-- name: skill-name -->\n * <!-- description: What it does -->\n *\n * # Guidelines\n *\n * Instructions here...\n * ```\n */\nexport class WindsurfTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['windsurf'];\n\n /**\n * Parse Windsurf rules content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from first heading if not in metadata\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(windsurfrules|md)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'unnamed-skill';\n }\n }\n\n // Try to extract description from metadata or first paragraph\n let description = metadata.description;\n if (!description) {\n // Get first non-heading paragraph\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'Windsurf rules';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'windsurf',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is Windsurf format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.windsurfrules$/i.test(filename)) return true;\n if (/windsurfrules/i.test(filename)) return true;\n }\n\n // Check for metadata comments\n if (content.startsWith('<!--') && content.includes('-->')) {\n const { metadata } = parseMetadataComments(content);\n if (Object.keys(metadata).length > 0) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Windsurf rules content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add metadata as HTML comments\n if (options.addMetadata !== false) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n if (skill.tags?.length) lines.push(`<!-- tags: ${skill.tags.join(', ')} -->`);\n if (options.addMetadata) {\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n }\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: Windsurf does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: Windsurf does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Windsurf does not support tool restrictions');\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for Windsurf format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return '.windsurfrules';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const windsurfTranslator = new WindsurfTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments (same as Windsurf)\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * GitHub Copilot Instructions Format Translator\n *\n * GitHub Copilot uses a markdown file at `.github/copilot-instructions.md`\n * for custom instructions. It's plain markdown with optional metadata comments.\n *\n * Format:\n * ```\n * <!-- This file provides custom instructions for GitHub Copilot -->\n *\n * # Coding Guidelines\n *\n * ## React Components\n * - Use functional components with hooks\n * - Prefer TypeScript\n * ```\n */\nexport class CopilotTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['github-copilot'];\n\n /**\n * Parse Copilot instructions into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from metadata or first heading\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(md)$/i, '')\n .replace(/copilot-instructions/i, 'copilot-rules')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'copilot-instructions';\n }\n }\n\n // Extract description\n let description = metadata.description;\n if (!description) {\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'GitHub Copilot instructions';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'github-copilot',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is GitHub Copilot format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/copilot-instructions\\.md$/i.test(filename)) return true;\n if (/copilot.*instructions/i.test(filename)) return true;\n }\n\n // Check for Copilot-specific comments\n if (content.toLowerCase().includes('github copilot')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate GitHub Copilot instructions content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add header comment\n lines.push('<!-- This file provides custom instructions for GitHub Copilot -->');\n lines.push('<!-- Generated by SkillKit - https://github.com/rohitg00/skillkit -->');\n lines.push('');\n\n // Add metadata as comments if requested\n if (options.addMetadata) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: GitHub Copilot does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: GitHub Copilot does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: GitHub Copilot does not support tool restrictions');\n }\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n warnings.push('Custom metadata fields not supported by GitHub Copilot');\n }\n\n // Add title if content doesn't start with one\n if (!skill.content.trim().startsWith('#')) {\n lines.push(`# ${skill.name.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}`);\n lines.push('');\n if (skill.description) {\n lines.push(skill.description);\n lines.push('');\n }\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for GitHub Copilot format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'copilot-instructions.md';\n }\n\n /**\n * Get the expected path for the instructions file\n */\n getPath(_skillName: string): string {\n return '.github/copilot-instructions.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const copilotTranslator = new CopilotTranslator();\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, basename } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport {\n type FormatTranslator,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatCategory,\n AGENT_FORMAT_MAP,\n} from './types.js';\nimport { skillMdTranslator } from './formats/skill-md.js';\nimport { cursorTranslator } from './formats/cursor.js';\nimport { windsurfTranslator } from './formats/windsurf.js';\nimport { copilotTranslator } from './formats/copilot.js';\n\n/**\n * Translator Registry\n *\n * Central registry for all format translators. Handles:\n * - Format detection\n * - Translation between any supported formats\n * - Finding the optimal translation path\n */\nexport class TranslatorRegistry {\n private translators: Map<FormatCategory, FormatTranslator> = new Map();\n private agentTranslators: Map<AgentType, FormatTranslator> = new Map();\n\n constructor() {\n // Register built-in translators\n this.register(skillMdTranslator);\n this.register(cursorTranslator);\n this.register(windsurfTranslator);\n this.register(copilotTranslator);\n }\n\n /**\n * Register a format translator\n */\n register(translator: FormatTranslator): void {\n this.translators.set(translator.format, translator);\n\n // Map agents to their translators\n for (const agent of translator.agents) {\n this.agentTranslators.set(agent, translator);\n }\n }\n\n /**\n * Get translator for a specific format\n */\n getTranslator(format: FormatCategory): FormatTranslator | undefined {\n return this.translators.get(format);\n }\n\n /**\n * Get translator for a specific agent\n */\n getTranslatorForAgent(agent: AgentType): FormatTranslator {\n // Check if we have a specific translator for this agent\n const specific = this.agentTranslators.get(agent);\n if (specific) {\n return specific;\n }\n\n // Fall back to SKILL.md translator (works for most agents)\n return skillMdTranslator;\n }\n\n /**\n * Get the format category for an agent\n */\n getFormatForAgent(agent: AgentType): FormatCategory {\n return AGENT_FORMAT_MAP[agent] || 'skill-md';\n }\n\n /**\n * Detect the format of content\n */\n detectFormat(content: string, filename?: string): FormatCategory | null {\n // Try each translator's detect method\n for (const [format, translator] of this.translators) {\n if (translator.detect(content, filename)) {\n return format;\n }\n }\n\n // Default to skill-md if content has YAML frontmatter\n if (content.startsWith('---')) {\n return 'skill-md';\n }\n\n return null;\n }\n\n /**\n * Detect the source agent from content\n */\n detectSourceAgent(content: string, filename?: string): AgentType | null {\n const format = this.detectFormat(content, filename);\n if (!format) return null;\n\n // Check filename for agent hints\n if (filename) {\n const lower = filename.toLowerCase();\n if (lower.includes('cursor') || lower.endsWith('.mdc')) return 'cursor';\n if (lower.includes('windsurf')) return 'windsurf';\n if (lower.includes('copilot')) return 'github-copilot';\n }\n\n // Return first agent that uses this format\n for (const [agent, agentFormat] of Object.entries(AGENT_FORMAT_MAP)) {\n if (agentFormat === format) {\n return agent as AgentType;\n }\n }\n\n return null;\n }\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const format = this.detectFormat(content, filename);\n if (!format) {\n // Try skill-md as fallback\n return skillMdTranslator.parse(content, filename);\n }\n\n const translator = this.translators.get(format);\n if (!translator) {\n return null;\n }\n\n return translator.parse(content, filename);\n }\n\n /**\n * Translate skill to target agent format\n */\n translate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const translator = this.getTranslatorForAgent(targetAgent);\n return translator.generate(skill, targetAgent, options);\n }\n\n /**\n * Translate content directly from one agent to another\n */\n translateContent(\n content: string,\n targetAgent: AgentType,\n options: TranslationOptions & { sourceFilename?: string } = {}\n ): TranslationResult {\n // Parse source content\n const skill = this.parse(content, options.sourceFilename);\n if (!skill) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: ['Failed to parse source content'],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n // Translate to target format\n return this.translate(skill, targetAgent, options);\n }\n\n /**\n * Translate a skill file to target agent format\n */\n translateFile(\n sourcePath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n if (!existsSync(sourcePath)) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: [`Source file not found: ${sourcePath}`],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n const content = readFileSync(sourcePath, 'utf-8');\n const filename = basename(sourcePath);\n\n return this.translateContent(content, targetAgent, {\n ...options,\n sourceFilename: filename,\n });\n }\n\n /**\n * Translate and write to target path\n */\n translateAndWrite(\n sourcePath: string,\n targetPath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const result = this.translateFile(sourcePath, targetAgent, options);\n\n if (result.success) {\n // Ensure target directory exists\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Write translated content\n writeFileSync(targetPath, result.content, 'utf-8');\n }\n\n return result;\n }\n\n /**\n * Get all supported agents\n */\n getSupportedAgents(): AgentType[] {\n return Object.keys(AGENT_FORMAT_MAP) as AgentType[];\n }\n\n /**\n * Get all registered formats\n */\n getRegisteredFormats(): FormatCategory[] {\n return Array.from(this.translators.keys());\n }\n\n /**\n * Check if translation is supported between two agents\n */\n canTranslate(from: AgentType, to: AgentType): boolean {\n // All agents can translate to/from each other via the canonical format\n return this.getSupportedAgents().includes(from) && this.getSupportedAgents().includes(to);\n }\n\n /**\n * Get translation compatibility info\n */\n getCompatibilityInfo(from: AgentType, to: AgentType): {\n supported: boolean;\n warnings: string[];\n lossyFields: string[];\n } {\n const fromFormat = this.getFormatForAgent(from);\n const toFormat = this.getFormatForAgent(to);\n const warnings: string[] = [];\n const lossyFields: string[] = [];\n\n // Cursor-specific features\n if (fromFormat === 'cursor-mdc' && toFormat !== 'cursor-mdc') {\n lossyFields.push('globs', 'alwaysApply');\n warnings.push('Cursor-specific features (globs, alwaysApply) will be preserved but not used');\n }\n\n // SKILL.md features going to markdown-rules\n if (fromFormat === 'skill-md' && toFormat === 'markdown-rules') {\n lossyFields.push('allowed-tools', 'metadata');\n warnings.push('Advanced SKILL.md features will be stored as comments');\n }\n\n return {\n supported: this.canTranslate(from, to),\n warnings,\n lossyFields,\n };\n }\n}\n\n/**\n * Default registry instance\n */\nexport const translatorRegistry = new TranslatorRegistry();\n","// Types\nexport {\n type FormatCategory,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatTranslator,\n type TranslationPath,\n type TranslatableSkillFrontmatter,\n AGENT_FORMAT_MAP,\n} from './types.js';\n\n// Format translators\nexport {\n SkillMdTranslator,\n skillMdTranslator,\n CursorTranslator,\n cursorTranslator,\n WindsurfTranslator,\n windsurfTranslator,\n CopilotTranslator,\n copilotTranslator,\n} from './formats/index.js';\n\n// Registry\nexport { TranslatorRegistry, translatorRegistry } from './registry.js';\n\n// Convenience functions\nimport { translatorRegistry } from './registry.js';\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill, TranslationResult, TranslationOptions } from './types.js';\n\n/**\n * Translate skill content from one agent format to another\n *\n * @example\n * ```ts\n * import { translateSkill } from '@skillkit/core';\n *\n * const result = translateSkill(skillMdContent, 'cursor');\n * console.log(result.content); // Cursor MDC format\n * ```\n */\nexport function translateSkill(\n content: string,\n targetAgent: AgentType,\n options?: TranslationOptions & { sourceFilename?: string }\n): TranslationResult {\n return translatorRegistry.translateContent(content, targetAgent, options);\n}\n\n/**\n * Translate a skill file to target agent format\n *\n * @example\n * ```ts\n * import { translateSkillFile } from '@skillkit/core';\n *\n * const result = translateSkillFile('./skills/my-skill/SKILL.md', 'cursor');\n * console.log(result.filename); // 'my-skill.mdc'\n * ```\n */\nexport function translateSkillFile(\n sourcePath: string,\n targetAgent: AgentType,\n options?: TranslationOptions\n): TranslationResult {\n return translatorRegistry.translateFile(sourcePath, targetAgent, options);\n}\n\n/**\n * Parse skill content into canonical format\n *\n * @example\n * ```ts\n * import { parseSkillContent } from '@skillkit/core';\n *\n * const skill = parseSkillContent(cursorMdcContent, 'my-rule.mdc');\n * console.log(skill.name); // 'my-rule'\n * ```\n */\nexport function parseSkillContent(content: string, filename?: string): CanonicalSkill | null {\n return translatorRegistry.parse(content, filename);\n}\n\n/**\n * Detect the format of skill content\n *\n * @example\n * ```ts\n * import { detectSkillFormat } from '@skillkit/core';\n *\n * const format = detectSkillFormat(content, 'SKILL.md');\n * console.log(format); // 'skill-md'\n * ```\n */\nexport function detectSkillFormat(content: string, filename?: string): string | null {\n return translatorRegistry.detectFormat(content, filename);\n}\n\n/**\n * Get all supported agent types for translation\n */\nexport function getSupportedTranslationAgents(): AgentType[] {\n return translatorRegistry.getSupportedAgents();\n}\n\n/**\n * Check if translation is possible between two agents\n */\nexport function canTranslate(from: AgentType, to: AgentType): boolean {\n return translatorRegistry.canTranslate(from, to);\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Detected dependency with version\n */\nexport const DependencyInfo = z.object({\n name: z.string(),\n version: z.string().optional(),\n dev: z.boolean().default(false),\n});\nexport type DependencyInfo = z.infer<typeof DependencyInfo>;\n\n/**\n * Detection result with confidence\n */\nexport const Detection = z.object({\n name: z.string(),\n version: z.string().optional(),\n confidence: z.number().min(0).max(100).default(100),\n source: z.string().optional(), // Where it was detected from\n});\nexport type Detection = z.infer<typeof Detection>;\n\n/**\n * Project stack detection results\n */\nexport const ProjectStack = z.object({\n languages: z.array(Detection).default([]),\n frameworks: z.array(Detection).default([]),\n libraries: z.array(Detection).default([]),\n styling: z.array(Detection).default([]),\n testing: z.array(Detection).default([]),\n databases: z.array(Detection).default([]),\n tools: z.array(Detection).default([]),\n runtime: z.array(Detection).default([]),\n});\nexport type ProjectStack = z.infer<typeof ProjectStack>;\n\n/**\n * Project patterns and conventions\n */\nexport const ProjectPatterns = z.object({\n components: z.string().optional(), // 'functional', 'class', 'mixed'\n stateManagement: z.string().optional(), // 'redux', 'zustand', 'context', etc.\n apiStyle: z.string().optional(), // 'rest', 'graphql', 'trpc', 'server-actions'\n styling: z.string().optional(), // 'css-modules', 'tailwind', 'styled-components'\n testing: z.string().optional(), // 'jest', 'vitest', 'playwright'\n linting: z.string().optional(), // 'eslint', 'biome'\n formatting: z.string().optional(), // 'prettier', 'biome'\n});\nexport type ProjectPatterns = z.infer<typeof ProjectPatterns>;\n\n/**\n * Skill preferences for the project\n */\nexport const SkillPreferences = z.object({\n installed: z.array(z.string()).default([]),\n recommended: z.array(z.string()).default([]),\n excluded: z.array(z.string()).default([]),\n autoSync: z.boolean().default(true),\n securityLevel: z.enum(['low', 'medium', 'high']).default('medium'),\n testingRequired: z.boolean().default(false),\n});\nexport type SkillPreferences = z.infer<typeof SkillPreferences>;\n\n/**\n * Agent configuration for the project\n */\nexport const AgentConfig = z.object({\n primary: z.string().optional(), // Primary agent\n detected: z.array(z.string()).default([]), // Auto-detected agents\n synced: z.array(z.string()).default([]), // Agents to sync skills to\n disabled: z.array(z.string()).default([]), // Agents to skip\n});\nexport type AgentConfig = z.infer<typeof AgentConfig>;\n\n/**\n * Full project context\n */\nexport const ProjectContext = z.object({\n version: z.literal(1),\n project: z.object({\n name: z.string(),\n description: z.string().optional(),\n type: z.string().optional(), // 'web-app', 'cli', 'library', 'api', etc.\n path: z.string().optional(),\n }),\n stack: ProjectStack,\n patterns: ProjectPatterns.optional(),\n skills: SkillPreferences.optional(),\n agents: AgentConfig.optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\nexport type ProjectContext = z.infer<typeof ProjectContext>;\n\n/**\n * Context file location\n */\nexport const CONTEXT_FILE = '.skillkit/context.yaml';\nexport const CONTEXT_DIR = '.skillkit';\n\n/**\n * Detection source types\n */\nexport type DetectionSource =\n | 'package.json'\n | 'tsconfig.json'\n | 'pyproject.toml'\n | 'Cargo.toml'\n | 'go.mod'\n | 'pubspec.yaml'\n | 'folder-structure'\n | 'config-file'\n | 'manual';\n\n/**\n * Project type hints based on detection\n */\nexport const PROJECT_TYPE_HINTS: Record<string, string[]> = {\n 'web-app': ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'remix'],\n 'api': ['express', 'fastify', 'koa', 'hono', 'fastapi', 'flask', 'django'],\n 'cli': ['commander', 'yargs', 'clipanion', 'clap', 'cobra'],\n 'library': ['rollup', 'esbuild', 'tsup', 'unbuild'],\n 'mobile': ['react-native', 'expo', 'flutter', 'ionic'],\n 'desktop': ['electron', 'tauri'],\n};\n\n/**\n * Framework detection patterns\n */\nexport interface FrameworkPattern {\n name: string;\n indicators: {\n dependencies?: string[];\n devDependencies?: string[];\n files?: string[];\n configFiles?: string[];\n };\n category: keyof ProjectStack;\n relatedTags?: string[];\n}\n\n/**\n * Context sync options\n */\nexport interface ContextSyncOptions {\n agents?: AgentType[];\n force?: boolean;\n dryRun?: boolean;\n skillsOnly?: boolean;\n}\n\n/**\n * Context export options\n */\nexport interface ContextExportOptions {\n output?: string;\n format?: 'yaml' | 'json';\n includeSkills?: boolean;\n includeAgents?: boolean;\n}\n\n/**\n * Context import options\n */\nexport interface ContextImportOptions {\n merge?: boolean;\n overwrite?: boolean;\n skipDetection?: boolean;\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { ProjectStack, Detection, ProjectPatterns } from './types.js';\n\n/**\n * Framework detection patterns\n */\nconst FRAMEWORK_PATTERNS = {\n // Frontend frameworks\n react: {\n dependencies: ['react', 'react-dom'],\n files: [],\n category: 'frameworks' as const,\n tags: ['react', 'frontend', 'ui'],\n },\n nextjs: {\n dependencies: ['next'],\n files: ['next.config.js', 'next.config.mjs', 'next.config.ts'],\n category: 'frameworks' as const,\n tags: ['nextjs', 'react', 'ssr', 'frontend'],\n },\n vue: {\n dependencies: ['vue'],\n files: [],\n category: 'frameworks' as const,\n tags: ['vue', 'frontend', 'ui'],\n },\n nuxt: {\n dependencies: ['nuxt'],\n files: ['nuxt.config.js', 'nuxt.config.ts'],\n category: 'frameworks' as const,\n tags: ['nuxt', 'vue', 'ssr', 'frontend'],\n },\n angular: {\n dependencies: ['@angular/core'],\n files: ['angular.json'],\n category: 'frameworks' as const,\n tags: ['angular', 'frontend', 'ui'],\n },\n svelte: {\n dependencies: ['svelte'],\n files: ['svelte.config.js'],\n category: 'frameworks' as const,\n tags: ['svelte', 'frontend', 'ui'],\n },\n remix: {\n dependencies: ['@remix-run/react'],\n files: ['remix.config.js'],\n category: 'frameworks' as const,\n tags: ['remix', 'react', 'ssr', 'frontend'],\n },\n astro: {\n dependencies: ['astro'],\n files: ['astro.config.mjs', 'astro.config.ts'],\n category: 'frameworks' as const,\n tags: ['astro', 'static', 'frontend'],\n },\n solid: {\n dependencies: ['solid-js'],\n files: [],\n category: 'frameworks' as const,\n tags: ['solid', 'frontend', 'ui'],\n },\n\n // Backend frameworks\n express: {\n dependencies: ['express'],\n files: [],\n category: 'frameworks' as const,\n tags: ['express', 'nodejs', 'api', 'backend'],\n },\n fastify: {\n dependencies: ['fastify'],\n files: [],\n category: 'frameworks' as const,\n tags: ['fastify', 'nodejs', 'api', 'backend'],\n },\n hono: {\n dependencies: ['hono'],\n files: [],\n category: 'frameworks' as const,\n tags: ['hono', 'edge', 'api', 'backend'],\n },\n koa: {\n dependencies: ['koa'],\n files: [],\n category: 'frameworks' as const,\n tags: ['koa', 'nodejs', 'api', 'backend'],\n },\n nestjs: {\n dependencies: ['@nestjs/core'],\n files: ['nest-cli.json'],\n category: 'frameworks' as const,\n tags: ['nestjs', 'nodejs', 'api', 'backend'],\n },\n\n // Mobile\n 'react-native': {\n dependencies: ['react-native'],\n files: ['metro.config.js', 'app.json'],\n category: 'frameworks' as const,\n tags: ['react-native', 'mobile', 'ios', 'android'],\n },\n expo: {\n dependencies: ['expo'],\n files: ['app.json', 'expo.json'],\n category: 'frameworks' as const,\n tags: ['expo', 'react-native', 'mobile'],\n },\n\n // Desktop\n electron: {\n dependencies: ['electron'],\n files: ['electron.js', 'electron-builder.json'],\n category: 'frameworks' as const,\n tags: ['electron', 'desktop'],\n },\n tauri: {\n dependencies: ['@tauri-apps/api'],\n files: ['tauri.conf.json', 'src-tauri'],\n category: 'frameworks' as const,\n tags: ['tauri', 'desktop', 'rust'],\n },\n};\n\n/**\n * Library detection patterns\n */\nconst LIBRARY_PATTERNS = {\n // State management\n redux: {\n dependencies: ['redux', '@reduxjs/toolkit'],\n category: 'libraries' as const,\n tags: ['redux', 'state-management'],\n },\n zustand: {\n dependencies: ['zustand'],\n category: 'libraries' as const,\n tags: ['zustand', 'state-management'],\n },\n jotai: {\n dependencies: ['jotai'],\n category: 'libraries' as const,\n tags: ['jotai', 'state-management'],\n },\n recoil: {\n dependencies: ['recoil'],\n category: 'libraries' as const,\n tags: ['recoil', 'state-management'],\n },\n mobx: {\n dependencies: ['mobx'],\n category: 'libraries' as const,\n tags: ['mobx', 'state-management'],\n },\n\n // Data fetching\n tanstack: {\n dependencies: ['@tanstack/react-query', '@tanstack/query-core'],\n category: 'libraries' as const,\n tags: ['tanstack', 'data-fetching', 'caching'],\n },\n swr: {\n dependencies: ['swr'],\n category: 'libraries' as const,\n tags: ['swr', 'data-fetching'],\n },\n trpc: {\n dependencies: ['@trpc/client', '@trpc/server'],\n category: 'libraries' as const,\n tags: ['trpc', 'api', 'typescript'],\n },\n graphql: {\n dependencies: ['graphql', '@apollo/client', 'urql'],\n category: 'libraries' as const,\n tags: ['graphql', 'api'],\n },\n\n // UI Components\n 'shadcn-ui': {\n dependencies: ['@radix-ui/react-slot'],\n files: ['components.json'],\n category: 'libraries' as const,\n tags: ['shadcn', 'ui', 'components'],\n },\n 'material-ui': {\n dependencies: ['@mui/material'],\n category: 'libraries' as const,\n tags: ['mui', 'material', 'ui', 'components'],\n },\n 'chakra-ui': {\n dependencies: ['@chakra-ui/react'],\n category: 'libraries' as const,\n tags: ['chakra', 'ui', 'components'],\n },\n 'ant-design': {\n dependencies: ['antd'],\n category: 'libraries' as const,\n tags: ['antd', 'ui', 'components'],\n },\n\n // Form handling\n 'react-hook-form': {\n dependencies: ['react-hook-form'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n formik: {\n dependencies: ['formik'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n zod: {\n dependencies: ['zod'],\n category: 'libraries' as const,\n tags: ['validation', 'schema', 'typescript'],\n },\n\n // Animation\n 'framer-motion': {\n dependencies: ['framer-motion'],\n category: 'libraries' as const,\n tags: ['animation', 'motion'],\n },\n};\n\n/**\n * Styling detection patterns\n */\nconst STYLING_PATTERNS = {\n tailwindcss: {\n dependencies: ['tailwindcss'],\n files: ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.cjs'],\n category: 'styling' as const,\n tags: ['tailwind', 'css', 'utility-first'],\n },\n 'styled-components': {\n dependencies: ['styled-components'],\n category: 'styling' as const,\n tags: ['styled-components', 'css-in-js'],\n },\n emotion: {\n dependencies: ['@emotion/react', '@emotion/styled'],\n category: 'styling' as const,\n tags: ['emotion', 'css-in-js'],\n },\n sass: {\n dependencies: ['sass', 'node-sass'],\n category: 'styling' as const,\n tags: ['sass', 'scss', 'css'],\n },\n less: {\n dependencies: ['less'],\n category: 'styling' as const,\n tags: ['less', 'css'],\n },\n 'css-modules': {\n files: ['*.module.css', '*.module.scss'],\n category: 'styling' as const,\n tags: ['css-modules', 'css'],\n },\n};\n\n/**\n * Testing detection patterns\n */\nconst TESTING_PATTERNS = {\n jest: {\n dependencies: ['jest'],\n files: ['jest.config.js', 'jest.config.ts'],\n category: 'testing' as const,\n tags: ['jest', 'testing', 'unit-testing'],\n },\n vitest: {\n dependencies: ['vitest'],\n files: ['vitest.config.ts', 'vitest.config.js'],\n category: 'testing' as const,\n tags: ['vitest', 'testing', 'unit-testing'],\n },\n playwright: {\n dependencies: ['@playwright/test'],\n files: ['playwright.config.ts', 'playwright.config.js'],\n category: 'testing' as const,\n tags: ['playwright', 'e2e', 'testing'],\n },\n cypress: {\n dependencies: ['cypress'],\n files: ['cypress.config.ts', 'cypress.config.js', 'cypress.json'],\n category: 'testing' as const,\n tags: ['cypress', 'e2e', 'testing'],\n },\n mocha: {\n dependencies: ['mocha'],\n category: 'testing' as const,\n tags: ['mocha', 'testing'],\n },\n 'testing-library': {\n dependencies: ['@testing-library/react', '@testing-library/vue'],\n category: 'testing' as const,\n tags: ['testing-library', 'testing'],\n },\n};\n\n/**\n * Database detection patterns\n */\nconst DATABASE_PATTERNS = {\n prisma: {\n dependencies: ['@prisma/client', 'prisma'],\n files: ['prisma/schema.prisma'],\n category: 'databases' as const,\n tags: ['prisma', 'orm', 'database'],\n },\n drizzle: {\n dependencies: ['drizzle-orm'],\n files: ['drizzle.config.ts'],\n category: 'databases' as const,\n tags: ['drizzle', 'orm', 'database'],\n },\n typeorm: {\n dependencies: ['typeorm'],\n category: 'databases' as const,\n tags: ['typeorm', 'orm', 'database'],\n },\n mongoose: {\n dependencies: ['mongoose'],\n category: 'databases' as const,\n tags: ['mongoose', 'mongodb', 'database'],\n },\n supabase: {\n dependencies: ['@supabase/supabase-js'],\n category: 'databases' as const,\n tags: ['supabase', 'postgres', 'database', 'auth'],\n },\n firebase: {\n dependencies: ['firebase', 'firebase-admin'],\n category: 'databases' as const,\n tags: ['firebase', 'database', 'auth'],\n },\n};\n\n/**\n * Tool detection patterns\n */\nconst TOOL_PATTERNS = {\n eslint: {\n dependencies: ['eslint'],\n files: ['.eslintrc', '.eslintrc.js', '.eslintrc.json', 'eslint.config.js'],\n category: 'tools' as const,\n tags: ['eslint', 'linting'],\n },\n prettier: {\n dependencies: ['prettier'],\n files: ['.prettierrc', '.prettierrc.js', 'prettier.config.js'],\n category: 'tools' as const,\n tags: ['prettier', 'formatting'],\n },\n biome: {\n dependencies: ['@biomejs/biome'],\n files: ['biome.json'],\n category: 'tools' as const,\n tags: ['biome', 'linting', 'formatting'],\n },\n husky: {\n dependencies: ['husky'],\n files: ['.husky'],\n category: 'tools' as const,\n tags: ['husky', 'git-hooks'],\n },\n 'lint-staged': {\n dependencies: ['lint-staged'],\n category: 'tools' as const,\n tags: ['lint-staged', 'git-hooks'],\n },\n turbo: {\n dependencies: ['turbo'],\n files: ['turbo.json'],\n category: 'tools' as const,\n tags: ['turbo', 'monorepo', 'build'],\n },\n nx: {\n dependencies: ['nx'],\n files: ['nx.json'],\n category: 'tools' as const,\n tags: ['nx', 'monorepo', 'build'],\n },\n docker: {\n files: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],\n category: 'tools' as const,\n tags: ['docker', 'containers'],\n },\n};\n\n/**\n * Project Detector\n *\n * Analyzes a project directory to detect the technology stack,\n * frameworks, libraries, and patterns used.\n */\nexport class ProjectDetector {\n private projectPath: string;\n private packageJson: Record<string, unknown> | null = null;\n private files: Set<string> = new Set();\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n /**\n * Analyze the project and return detected stack\n */\n analyze(): ProjectStack {\n // Load package.json if exists\n this.loadPackageJson();\n\n // Scan root files\n this.scanFiles();\n\n // Detect everything\n const stack: ProjectStack = {\n languages: this.detectLanguages(),\n frameworks: this.detectFromPatterns(FRAMEWORK_PATTERNS),\n libraries: this.detectFromPatterns(LIBRARY_PATTERNS),\n styling: this.detectFromPatterns(STYLING_PATTERNS),\n testing: this.detectFromPatterns(TESTING_PATTERNS),\n databases: this.detectFromPatterns(DATABASE_PATTERNS),\n tools: this.detectFromPatterns(TOOL_PATTERNS),\n runtime: this.detectRuntime(),\n };\n\n return stack;\n }\n\n /**\n * Detect project patterns and conventions\n */\n detectPatterns(): ProjectPatterns {\n const patterns: ProjectPatterns = {};\n\n // Detect component style\n if (this.hasFile('*.tsx') || this.hasFile('*.jsx')) {\n // Check for class components vs functional\n patterns.components = 'functional'; // Modern default\n }\n\n // Detect state management\n const deps = this.getDependencies();\n if (deps.has('zustand')) patterns.stateManagement = 'zustand';\n else if (deps.has('@reduxjs/toolkit') || deps.has('redux')) patterns.stateManagement = 'redux';\n else if (deps.has('jotai')) patterns.stateManagement = 'jotai';\n else if (deps.has('recoil')) patterns.stateManagement = 'recoil';\n else if (deps.has('mobx')) patterns.stateManagement = 'mobx';\n\n // Detect API style\n if (deps.has('@trpc/client')) patterns.apiStyle = 'trpc';\n else if (deps.has('graphql') || deps.has('@apollo/client')) patterns.apiStyle = 'graphql';\n else if (deps.has('next') && this.hasFile('app/**/actions.ts')) patterns.apiStyle = 'server-actions';\n else patterns.apiStyle = 'rest';\n\n // Detect styling\n if (deps.has('tailwindcss')) patterns.styling = 'tailwind';\n else if (deps.has('styled-components')) patterns.styling = 'styled-components';\n else if (deps.has('@emotion/react')) patterns.styling = 'emotion';\n else if (this.hasFile('*.module.css')) patterns.styling = 'css-modules';\n\n // Detect testing\n if (deps.has('vitest')) patterns.testing = 'vitest';\n else if (deps.has('jest')) patterns.testing = 'jest';\n else if (deps.has('@playwright/test')) patterns.testing = 'playwright';\n else if (deps.has('cypress')) patterns.testing = 'cypress';\n\n // Detect linting\n if (deps.has('@biomejs/biome')) patterns.linting = 'biome';\n else if (deps.has('eslint')) patterns.linting = 'eslint';\n\n // Detect formatting\n if (deps.has('@biomejs/biome')) patterns.formatting = 'biome';\n else if (deps.has('prettier')) patterns.formatting = 'prettier';\n\n return patterns;\n }\n\n /**\n * Detect project type\n */\n detectProjectType(): string {\n const deps = this.getDependencies();\n\n // Check for specific project types\n if (deps.has('react-native') || deps.has('expo')) return 'mobile';\n if (deps.has('electron') || deps.has('@tauri-apps/api')) return 'desktop';\n if (deps.has('next') || deps.has('nuxt') || deps.has('remix')) return 'web-app';\n if (deps.has('express') || deps.has('fastify') || deps.has('hono')) return 'api';\n if (deps.has('commander') || deps.has('clipanion') || deps.has('yargs')) return 'cli';\n\n // Check for library indicators\n if (this.hasFile('rollup.config.js') || this.hasFile('tsup.config.ts')) return 'library';\n\n // Default\n if (deps.has('react') || deps.has('vue') || deps.has('svelte')) return 'web-app';\n\n return 'unknown';\n }\n\n /**\n * Get project name\n */\n getProjectName(): string {\n if (this.packageJson && typeof this.packageJson.name === 'string') {\n return this.packageJson.name;\n }\n return basename(this.projectPath);\n }\n\n /**\n * Get project description\n */\n getProjectDescription(): string | undefined {\n if (this.packageJson && typeof this.packageJson.description === 'string') {\n return this.packageJson.description;\n }\n return undefined;\n }\n\n // Private helpers\n\n private loadPackageJson(): void {\n const packageJsonPath = join(this.projectPath, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n this.packageJson = JSON.parse(content);\n } catch {\n this.packageJson = null;\n }\n }\n }\n\n private scanFiles(): void {\n try {\n const entries = readdirSync(this.projectPath, { withFileTypes: true });\n for (const entry of entries) {\n this.files.add(entry.name);\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n // Scan one level deep for common config locations\n try {\n const subEntries = readdirSync(join(this.projectPath, entry.name));\n for (const subEntry of subEntries) {\n this.files.add(`${entry.name}/${subEntry}`);\n }\n } catch {\n // Ignore permission errors\n }\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n private getDependencies(): Set<string> {\n const deps = new Set<string>();\n if (!this.packageJson) return deps;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n if (dependencies) {\n for (const dep of Object.keys(dependencies)) {\n deps.add(dep);\n }\n }\n if (devDependencies) {\n for (const dep of Object.keys(devDependencies)) {\n deps.add(dep);\n }\n }\n\n return deps;\n }\n\n private getVersion(depName: string): string | undefined {\n if (!this.packageJson) return undefined;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n const version = dependencies?.[depName] || devDependencies?.[depName];\n if (version) {\n // Clean version string (remove ^, ~, etc.)\n return version.replace(/^[\\^~>=<]+/, '');\n }\n return undefined;\n }\n\n private hasFile(pattern: string): boolean {\n if (pattern.includes('*')) {\n // Simple glob matching\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\n for (const file of this.files) {\n if (regex.test(file)) return true;\n }\n return false;\n }\n return this.files.has(pattern);\n }\n\n private detectLanguages(): Detection[] {\n const languages: Detection[] = [];\n\n // TypeScript\n if (this.hasFile('tsconfig.json') || this.files.has('*.ts')) {\n const tsVersion = this.getVersion('typescript');\n languages.push({\n name: 'typescript',\n version: tsVersion,\n confidence: 100,\n source: 'tsconfig.json',\n });\n }\n\n // JavaScript (if no TypeScript, or alongside)\n if (this.hasFile('jsconfig.json') || (this.packageJson && !this.hasFile('tsconfig.json'))) {\n languages.push({\n name: 'javascript',\n confidence: 90,\n source: 'package.json',\n });\n }\n\n // Python\n if (this.hasFile('pyproject.toml') || this.hasFile('requirements.txt')) {\n languages.push({\n name: 'python',\n confidence: 100,\n source: 'pyproject.toml',\n });\n }\n\n // Rust\n if (this.hasFile('Cargo.toml')) {\n languages.push({\n name: 'rust',\n confidence: 100,\n source: 'Cargo.toml',\n });\n }\n\n // Go\n if (this.hasFile('go.mod')) {\n languages.push({\n name: 'go',\n confidence: 100,\n source: 'go.mod',\n });\n }\n\n return languages;\n }\n\n private detectRuntime(): Detection[] {\n const runtime: Detection[] = [];\n\n // Node.js\n if (this.packageJson) {\n const engines = this.packageJson.engines as Record<string, string> | undefined;\n const nodeVersion = engines?.node;\n runtime.push({\n name: 'nodejs',\n version: nodeVersion?.replace(/[>=<^~]+/g, ''),\n confidence: 100,\n source: 'package.json',\n });\n }\n\n // Bun\n if (this.hasFile('bun.lockb') || this.hasFile('bunfig.toml')) {\n runtime.push({\n name: 'bun',\n confidence: 100,\n source: 'bun.lockb',\n });\n }\n\n // Deno\n if (this.hasFile('deno.json') || this.hasFile('deno.jsonc')) {\n runtime.push({\n name: 'deno',\n confidence: 100,\n source: 'deno.json',\n });\n }\n\n return runtime;\n }\n\n private detectFromPatterns(\n patterns: Record<string, { dependencies?: string[]; files?: string[]; category: keyof ProjectStack; tags?: string[] }>\n ): Detection[] {\n const detected: Detection[] = [];\n const deps = this.getDependencies();\n\n for (const [name, pattern] of Object.entries(patterns)) {\n let found = false;\n let source: string | undefined;\n\n // Check dependencies\n if (pattern.dependencies) {\n for (const dep of pattern.dependencies) {\n if (deps.has(dep)) {\n found = true;\n source = 'package.json';\n break;\n }\n }\n }\n\n // Check files\n if (!found && pattern.files) {\n for (const file of pattern.files) {\n if (this.hasFile(file)) {\n found = true;\n source = file;\n break;\n }\n }\n }\n\n if (found) {\n const version = pattern.dependencies ? this.getVersion(pattern.dependencies[0]) : undefined;\n detected.push({\n name,\n version,\n confidence: 100,\n source,\n });\n }\n }\n\n return detected;\n }\n}\n\n/**\n * Analyze a project and return the detected stack\n */\nexport function analyzeProject(projectPath: string): ProjectStack {\n const detector = new ProjectDetector(projectPath);\n return detector.analyze();\n}\n\n/**\n * Get all relevant tags from a project stack\n */\nexport function getStackTags(stack: ProjectStack): string[] {\n const tags = new Set<string>();\n\n const addTags = (detections: Detection[], patterns: Record<string, { tags?: string[] }>) => {\n for (const detection of detections) {\n const pattern = patterns[detection.name];\n if (pattern?.tags) {\n for (const tag of pattern.tags) {\n tags.add(tag);\n }\n } else {\n tags.add(detection.name);\n }\n }\n };\n\n // Add language tags\n for (const lang of stack.languages) {\n tags.add(lang.name);\n }\n\n // Add framework tags\n addTags(stack.frameworks, FRAMEWORK_PATTERNS);\n addTags(stack.libraries, LIBRARY_PATTERNS);\n addTags(stack.styling, STYLING_PATTERNS);\n addTags(stack.testing, TESTING_PATTERNS);\n addTags(stack.databases, DATABASE_PATTERNS);\n\n return Array.from(tags);\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport {\n type ProjectContext,\n type ProjectStack,\n type SkillPreferences,\n type AgentConfig,\n type ContextExportOptions,\n type ContextImportOptions,\n type Detection,\n ProjectContext as ProjectContextSchema,\n CONTEXT_FILE,\n CONTEXT_DIR,\n} from './types.js';\nimport { ProjectDetector, getStackTags } from './detector.js';\nimport type { AgentType } from '../types.js';\n\n/**\n * Context Manager\n *\n * Handles loading, saving, and managing project contexts.\n * The context is stored in .skillkit/context.yaml\n */\nexport class ContextManager {\n private projectPath: string;\n private context: ProjectContext | null = null;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Get the context file path\n */\n getContextPath(): string {\n return join(this.projectPath, CONTEXT_FILE);\n }\n\n /**\n * Check if context exists\n */\n exists(): boolean {\n return existsSync(this.getContextPath());\n }\n\n /**\n * Load context from file\n */\n load(): ProjectContext | null {\n const contextPath = this.getContextPath();\n\n if (!existsSync(contextPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(contextPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = ProjectContextSchema.safeParse(data);\n\n if (parsed.success) {\n this.context = parsed.data;\n return this.context;\n }\n\n // Return raw data if schema validation fails but file exists\n console.warn('Context file exists but failed schema validation');\n return null;\n } catch (error) {\n console.warn('Failed to load context:', error);\n return null;\n }\n }\n\n /**\n * Save context to file\n */\n save(context: ProjectContext): void {\n const contextPath = this.getContextPath();\n const contextDir = join(this.projectPath, CONTEXT_DIR);\n\n // Ensure directory exists\n if (!existsSync(contextDir)) {\n mkdirSync(contextDir, { recursive: true });\n }\n\n // Update timestamp\n context.updatedAt = new Date().toISOString();\n\n // Stringify with nice formatting\n const content = stringifyYaml(context, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n\n writeFileSync(contextPath, content, 'utf-8');\n this.context = context;\n }\n\n /**\n * Initialize a new context from project detection\n */\n init(options: { force?: boolean; skipDetection?: boolean } = {}): ProjectContext {\n // Check if context already exists\n if (this.exists() && !options.force) {\n const existing = this.load();\n if (existing) {\n return existing;\n }\n }\n\n // Detect project\n const detector = new ProjectDetector(this.projectPath);\n const stack = options.skipDetection ? this.getEmptyStack() : detector.analyze();\n const patterns = options.skipDetection ? {} : detector.detectPatterns();\n const projectType = options.skipDetection ? 'unknown' : detector.detectProjectType();\n const projectName = detector.getProjectName();\n const projectDescription = detector.getProjectDescription();\n\n // Create new context\n const context: ProjectContext = {\n version: 1,\n project: {\n name: projectName,\n description: projectDescription,\n type: projectType,\n path: this.projectPath,\n },\n stack,\n patterns,\n skills: {\n installed: [],\n recommended: [],\n excluded: [],\n autoSync: true,\n securityLevel: 'medium',\n testingRequired: false,\n },\n agents: {\n primary: undefined,\n detected: [],\n synced: [],\n disabled: [],\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Save and return\n this.save(context);\n return context;\n }\n\n /**\n * Update context with new detection\n */\n refresh(): ProjectContext {\n const existing = this.load();\n const detector = new ProjectDetector(this.projectPath);\n const stack = detector.analyze();\n const patterns = detector.detectPatterns();\n const projectType = detector.detectProjectType();\n\n if (existing) {\n // Merge with existing\n const merged: ProjectContext = {\n ...existing,\n stack,\n patterns,\n project: {\n ...existing.project,\n type: projectType,\n },\n updatedAt: new Date().toISOString(),\n };\n\n this.save(merged);\n return merged;\n }\n\n // No existing context, initialize new\n return this.init();\n }\n\n /**\n * Get current context (load if not loaded)\n */\n get(): ProjectContext | null {\n if (this.context) {\n return this.context;\n }\n return this.load();\n }\n\n /**\n * Update skills in context\n */\n updateSkills(skills: Partial<SkillPreferences>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.skills = {\n ...context.skills,\n ...skills,\n } as SkillPreferences;\n\n this.save(context);\n }\n\n /**\n * Update agents in context\n */\n updateAgents(agents: Partial<AgentConfig>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.agents = {\n ...context.agents,\n ...agents,\n } as AgentConfig;\n\n this.save(context);\n }\n\n /**\n * Set primary agent\n */\n setPrimaryAgent(agent: AgentType): void {\n this.updateAgents({ primary: agent });\n }\n\n /**\n * Add agent to synced list\n */\n addSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.add(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Remove agent from synced list\n */\n removeSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.delete(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Add installed skill\n */\n addInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.add(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Remove installed skill\n */\n removeInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.delete(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Export context to file\n */\n export(options: ContextExportOptions = {}): string {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n // Clone and optionally filter\n const exported = { ...context };\n\n if (!options.includeSkills) {\n delete (exported as Record<string, unknown>).skills;\n }\n if (!options.includeAgents) {\n delete (exported as Record<string, unknown>).agents;\n }\n\n // Format\n if (options.format === 'json') {\n return JSON.stringify(exported, null, 2);\n }\n\n return stringifyYaml(exported, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n }\n\n /**\n * Import context from content\n */\n import(content: string, options: ContextImportOptions = {}): ProjectContext {\n // Parse content\n let data: unknown;\n try {\n // Try JSON first\n data = JSON.parse(content);\n } catch {\n // Try YAML\n data = parseYaml(content);\n }\n\n const parsed = ProjectContextSchema.safeParse(data);\n if (!parsed.success) {\n throw new Error(`Invalid context format: ${parsed.error.message}`);\n }\n\n const imported = parsed.data;\n\n if (options.merge && this.exists()) {\n const existing = this.load()!;\n const merged = this.mergeContexts(existing, imported);\n this.save(merged);\n return merged;\n }\n\n if (!options.overwrite && this.exists()) {\n throw new Error('Context already exists. Use --merge or --overwrite.');\n }\n\n this.save(imported);\n return imported;\n }\n\n /**\n * Merge two contexts\n */\n private mergeContexts(existing: ProjectContext, imported: ProjectContext): ProjectContext {\n return {\n version: 1,\n project: {\n ...existing.project,\n ...imported.project,\n },\n stack: this.mergeStacks(existing.stack, imported.stack),\n patterns: {\n ...existing.patterns,\n ...imported.patterns,\n },\n skills: {\n installed: [...new Set([...(existing.skills?.installed || []), ...(imported.skills?.installed || [])])],\n recommended: [...new Set([...(existing.skills?.recommended || []), ...(imported.skills?.recommended || [])])],\n excluded: [...new Set([...(existing.skills?.excluded || []), ...(imported.skills?.excluded || [])])],\n autoSync: imported.skills?.autoSync ?? existing.skills?.autoSync ?? true,\n securityLevel: imported.skills?.securityLevel ?? existing.skills?.securityLevel ?? 'medium',\n testingRequired: imported.skills?.testingRequired ?? existing.skills?.testingRequired ?? false,\n },\n agents: {\n primary: imported.agents?.primary ?? existing.agents?.primary,\n detected: [...new Set([...(existing.agents?.detected || []), ...(imported.agents?.detected || [])])],\n synced: [...new Set([...(existing.agents?.synced || []), ...(imported.agents?.synced || [])])],\n disabled: [...new Set([...(existing.agents?.disabled || []), ...(imported.agents?.disabled || [])])],\n },\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Merge two stacks\n */\n private mergeStacks(existing: ProjectStack, imported: ProjectStack): ProjectStack {\n const mergeArrays = (a: Detection[], b: Detection[]): Detection[] => {\n const names = new Set(a.map((item) => item.name));\n const result: Detection[] = [...a];\n for (const item of b) {\n if (!names.has(item.name)) {\n result.push(item);\n }\n }\n return result;\n };\n\n return {\n languages: mergeArrays(existing.languages, imported.languages),\n frameworks: mergeArrays(existing.frameworks, imported.frameworks),\n libraries: mergeArrays(existing.libraries, imported.libraries),\n styling: mergeArrays(existing.styling, imported.styling),\n testing: mergeArrays(existing.testing, imported.testing),\n databases: mergeArrays(existing.databases, imported.databases),\n tools: mergeArrays(existing.tools, imported.tools),\n runtime: mergeArrays(existing.runtime, imported.runtime),\n };\n }\n\n /**\n * Get empty stack\n */\n private getEmptyStack(): ProjectStack {\n return {\n languages: [],\n frameworks: [],\n libraries: [],\n styling: [],\n testing: [],\n databases: [],\n tools: [],\n runtime: [],\n };\n }\n\n /**\n * Get recommended skill tags based on stack\n */\n getRecommendedTags(): string[] {\n const context = this.get();\n if (!context) return [];\n\n return getStackTags(context.stack);\n }\n}\n\n/**\n * Create a context manager for the current directory\n */\nexport function createContextManager(projectPath?: string): ContextManager {\n return new ContextManager(projectPath);\n}\n\n/**\n * Load context from the current directory\n */\nexport function loadContext(projectPath?: string): ProjectContext | null {\n const manager = new ContextManager(projectPath);\n return manager.load();\n}\n\n/**\n * Initialize context in the current directory\n */\nexport function initContext(projectPath?: string, options?: { force?: boolean }): ProjectContext {\n const manager = new ContextManager(projectPath);\n return manager.init(options);\n}\n","import { existsSync, writeFileSync, mkdirSync, copyFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport type { ContextSyncOptions } from './types.js';\nimport { ContextManager } from './manager.js';\nimport { translateSkillFile } from '../translator/index.js';\nimport { findAllSkills } from '../skills.js';\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n agent: AgentType;\n skillsSynced: number;\n skillsSkipped: number;\n errors: string[];\n warnings: string[];\n files: string[];\n}\n\n/**\n * Overall sync report\n */\nexport interface SyncReport {\n totalAgents: number;\n successfulAgents: number;\n totalSkills: number;\n results: SyncResult[];\n}\n\n/**\n * Agent directory configuration\n */\nconst AGENT_DIRS: Record<AgentType, { skillsDir: string; configFile: string }> = {\n 'claude-code': { skillsDir: '.claude/skills', configFile: 'AGENTS.md' },\n 'cursor': { skillsDir: '.cursor/skills', configFile: '.cursorrules' },\n 'codex': { skillsDir: '.codex/skills', configFile: 'AGENTS.md' },\n 'gemini-cli': { skillsDir: '.gemini/skills', configFile: 'GEMINI.md' },\n 'opencode': { skillsDir: '.opencode/skills', configFile: 'AGENTS.md' },\n 'antigravity': { skillsDir: '.antigravity/skills', configFile: 'AGENTS.md' },\n 'amp': { skillsDir: '.agents/skills', configFile: 'AGENTS.md' },\n 'clawdbot': { skillsDir: 'skills', configFile: 'AGENTS.md' },\n 'droid': { skillsDir: '.factory/skills', configFile: 'AGENTS.md' },\n 'github-copilot': { skillsDir: '.github/skills', configFile: 'AGENTS.md' },\n 'goose': { skillsDir: '.goose/skills', configFile: 'AGENTS.md' },\n 'kilo': { skillsDir: '.kilocode/skills', configFile: 'AGENTS.md' },\n 'kiro-cli': { skillsDir: '.kiro/skills', configFile: 'AGENTS.md' },\n 'roo': { skillsDir: '.roo/skills', configFile: 'AGENTS.md' },\n 'trae': { skillsDir: '.trae/skills', configFile: 'AGENTS.md' },\n 'windsurf': { skillsDir: '.windsurf/skills', configFile: 'AGENTS.md' },\n 'universal': { skillsDir: '.agent/skills', configFile: 'AGENTS.md' },\n};\n\n/**\n * Context Sync\n *\n * Handles syncing skills across multiple AI agents.\n * Skills are translated to the appropriate format for each agent.\n */\nexport class ContextSync {\n private projectPath: string;\n private contextManager: ContextManager;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.contextManager = new ContextManager(projectPath);\n }\n\n /**\n * Detect which agents are installed/configured on the system\n */\n detectAgents(): AgentType[] {\n const detected: AgentType[] = [];\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const configPath = join(this.projectPath, config.configFile);\n\n // Check if either skills directory or config file exists\n if (existsSync(skillsPath) || existsSync(configPath)) {\n detected.push(agent as AgentType);\n }\n }\n\n // Also check for global indicators\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (homeDir) {\n // Check for Claude Code\n if (existsSync(join(homeDir, '.claude'))) {\n if (!detected.includes('claude-code')) detected.push('claude-code');\n }\n // Check for Cursor\n if (existsSync(join(homeDir, '.cursor'))) {\n if (!detected.includes('cursor')) detected.push('cursor');\n }\n }\n\n return detected;\n }\n\n /**\n * Get agents to sync to based on context\n */\n getTargetAgents(options: ContextSyncOptions = {}): AgentType[] {\n // If specific agents provided, use those\n if (options.agents?.length) {\n return options.agents;\n }\n\n // Load context\n const context = this.contextManager.get();\n if (context?.agents?.synced?.length) {\n return context.agents.synced as AgentType[];\n }\n\n // Auto-detect\n return this.detectAgents();\n }\n\n /**\n * Sync all skills to all target agents\n */\n async syncAll(options: ContextSyncOptions = {}): Promise<SyncReport> {\n const targetAgents = this.getTargetAgents(options);\n const results: SyncResult[] = [];\n\n // Get all installed skills from primary agent or first available\n const skills = this.getSourceSkills();\n\n for (const agent of targetAgents) {\n const result = await this.syncToAgent(agent, skills, options);\n results.push(result);\n }\n\n // Update context with synced agents\n if (!options.dryRun) {\n this.contextManager.updateAgents({\n detected: this.detectAgents(),\n synced: targetAgents,\n });\n }\n\n return {\n totalAgents: targetAgents.length,\n successfulAgents: results.filter((r) => r.success).length,\n totalSkills: skills.length,\n results,\n };\n }\n\n /**\n * Sync skills to a specific agent\n */\n async syncToAgent(\n agent: AgentType,\n skills?: Array<{ name: string; path: string }>,\n options: ContextSyncOptions = {}\n ): Promise<SyncResult> {\n const result: SyncResult = {\n success: true,\n agent,\n skillsSynced: 0,\n skillsSkipped: 0,\n errors: [],\n warnings: [],\n files: [],\n };\n\n // Get skills if not provided\n const sourceSkills = skills || this.getSourceSkills();\n\n // Get target directory\n const agentConfig = AGENT_DIRS[agent];\n if (!agentConfig) {\n result.success = false;\n result.errors.push(`Unknown agent: ${agent}`);\n return result;\n }\n\n const targetDir = join(this.projectPath, agentConfig.skillsDir);\n\n // Create target directory if not dry run\n if (!options.dryRun && !existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Sync each skill\n for (const skill of sourceSkills) {\n try {\n const skillResult = await this.syncSkill(skill, agent, targetDir, options);\n if (skillResult.synced) {\n result.skillsSynced++;\n result.files.push(skillResult.file!);\n } else {\n result.skillsSkipped++;\n if (skillResult.warning) {\n result.warnings.push(skillResult.warning);\n }\n }\n } catch (error) {\n result.errors.push(`Failed to sync ${skill.name}: ${error}`);\n result.skillsSkipped++;\n }\n }\n\n if (result.errors.length > 0) {\n result.success = false;\n }\n\n return result;\n }\n\n /**\n * Sync a single skill to an agent\n */\n private async syncSkill(\n skill: { name: string; path: string },\n agent: AgentType,\n targetDir: string,\n options: ContextSyncOptions\n ): Promise<{ synced: boolean; file?: string; warning?: string }> {\n const skillMdPath = join(skill.path, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return { synced: false, warning: `No SKILL.md found for ${skill.name}` };\n }\n\n // Translate skill to target format\n const translation = translateSkillFile(skillMdPath, agent, {\n addMetadata: true,\n });\n\n if (!translation.success) {\n return { synced: false, warning: `Translation failed for ${skill.name}` };\n }\n\n // Determine output path\n const targetSkillDir = join(targetDir, skill.name);\n const outputPath = join(targetSkillDir, translation.filename);\n\n // Check if file exists and skip if not forcing\n if (existsSync(outputPath) && !options.force) {\n return { synced: false, warning: `${skill.name} already exists (use --force to overwrite)` };\n }\n\n // Write file (unless dry run)\n if (!options.dryRun) {\n if (!existsSync(targetSkillDir)) {\n mkdirSync(targetSkillDir, { recursive: true });\n }\n writeFileSync(outputPath, translation.content, 'utf-8');\n\n // Copy additional skill assets if they exist\n await this.copySkillAssets(skill.path, targetSkillDir);\n }\n\n return { synced: true, file: outputPath };\n }\n\n /**\n * Copy additional skill assets (references, scripts, etc.)\n */\n private async copySkillAssets(sourcePath: string, targetPath: string): Promise<void> {\n const assetDirs = ['references', 'scripts', 'assets', 'templates'];\n\n for (const assetDir of assetDirs) {\n const sourceAssetDir = join(sourcePath, assetDir);\n if (existsSync(sourceAssetDir)) {\n const targetAssetDir = join(targetPath, assetDir);\n if (!existsSync(targetAssetDir)) {\n mkdirSync(targetAssetDir, { recursive: true });\n }\n\n // Copy files\n try {\n const files = readdirSync(sourceAssetDir);\n for (const file of files) {\n const sourcefile = join(sourceAssetDir, file);\n const targetFile = join(targetAssetDir, file);\n copyFileSync(sourcefile, targetFile);\n }\n } catch {\n // Ignore copy errors\n }\n }\n }\n }\n\n /**\n * Get source skills to sync\n */\n private getSourceSkills(): Array<{ name: string; path: string }> {\n const context = this.contextManager.get();\n const primaryAgent = context?.agents?.primary as AgentType | undefined;\n\n // Search directories based on primary agent or common locations\n const searchDirs: string[] = [];\n\n if (primaryAgent && AGENT_DIRS[primaryAgent]) {\n searchDirs.push(join(this.projectPath, AGENT_DIRS[primaryAgent].skillsDir));\n }\n\n // Add common skill locations\n const commonDirs = [\n '.claude/skills',\n '.cursor/skills',\n '.agent/skills',\n 'skills',\n ];\n\n for (const dir of commonDirs) {\n const fullPath = join(this.projectPath, dir);\n if (!searchDirs.includes(fullPath) && existsSync(fullPath)) {\n searchDirs.push(fullPath);\n }\n }\n\n // Find all skills\n const skills = findAllSkills(searchDirs);\n return skills.map((s) => ({ name: s.name, path: s.path }));\n }\n\n /**\n * Check sync status - which agents have which skills\n */\n checkStatus(): Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }> {\n const status: Record<string, { hasSkills: boolean; skillCount: number; skills: string[] }> = {};\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const skills: string[] = [];\n\n if (existsSync(skillsPath)) {\n try {\n const entries = readdirSync(skillsPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n skills.push(entry.name);\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n status[agent] = {\n hasSkills: skills.length > 0,\n skillCount: skills.length,\n skills,\n };\n }\n\n return status as Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }>;\n }\n}\n\n/**\n * Create a context sync instance\n */\nexport function createContextSync(projectPath?: string): ContextSync {\n return new ContextSync(projectPath);\n}\n\n/**\n * Sync skills to all detected agents\n */\nexport async function syncToAllAgents(\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncReport> {\n const sync = new ContextSync(projectPath);\n return sync.syncAll(options);\n}\n\n/**\n * Sync skills to a specific agent\n */\nexport async function syncToAgent(\n agent: AgentType,\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncResult> {\n const sync = new ContextSync(projectPath);\n return sync.syncToAgent(agent, undefined, options);\n}\n","/**\n * Context Loader\n *\n * Smart context loading with token budgets and category-based loading.\n */\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Context category with size limits\n */\nexport interface ContextCategory {\n /** Category name */\n name: string;\n /** Maximum tokens for this category */\n maxTokens: number;\n /** Whether to always load this category */\n alwaysLoad: boolean;\n /** File path (relative to project) */\n file?: string;\n /** Inline content */\n content?: string;\n}\n\n/**\n * Context loading options\n */\nexport interface ContextLoadOptions {\n /** Total token budget */\n totalBudget?: number;\n /** Categories to load (load all if not specified) */\n categories?: string[];\n /** Whether to warn when approaching budget limits */\n warnOnBudgetLimit?: boolean;\n}\n\n/**\n * Loaded context result\n */\nexport interface LoadedContext {\n /** All loaded content combined */\n content: string;\n /** Total tokens used */\n totalTokens: number;\n /** Budget remaining */\n budgetRemaining: number;\n /** Categories loaded */\n categoriesLoaded: string[];\n /** Categories skipped (due to budget or not found) */\n categoriesSkipped: string[];\n /** Warnings generated */\n warnings: string[];\n /** Whether budget is near limit (>50% used) */\n nearBudgetLimit: boolean;\n /** Whether context is degraded (>70% used) */\n contextDegraded: boolean;\n}\n\n/**\n * Default context categories\n */\nexport const DEFAULT_CONTEXT_CATEGORIES: ContextCategory[] = [\n {\n name: 'project',\n maxTokens: 2000,\n alwaysLoad: true,\n file: '.skillkit/context.yaml',\n },\n {\n name: 'requirements',\n maxTokens: 5000,\n alwaysLoad: false,\n file: 'REQUIREMENTS.md',\n },\n {\n name: 'decisions',\n maxTokens: 1000,\n alwaysLoad: false,\n file: '.skillkit/decisions.yaml',\n },\n {\n name: 'readme',\n maxTokens: 3000,\n alwaysLoad: false,\n file: 'README.md',\n },\n];\n\n/**\n * Rough estimate of tokens from text\n * (approximation: ~4 characters per token for English text)\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Context Loader class\n */\nexport class ContextLoader {\n private projectPath: string;\n private categories: ContextCategory[];\n private defaultBudget: number;\n\n constructor(projectPath: string, options?: { categories?: ContextCategory[]; defaultBudget?: number }) {\n this.projectPath = projectPath;\n this.categories = options?.categories || DEFAULT_CONTEXT_CATEGORIES;\n this.defaultBudget = options?.defaultBudget || 32000; // Default ~32k tokens\n }\n\n /**\n * Load context based on options\n */\n load(options: ContextLoadOptions = {}): LoadedContext {\n const totalBudget = options.totalBudget || this.defaultBudget;\n const requestedCategories = options.categories;\n\n const result: LoadedContext = {\n content: '',\n totalTokens: 0,\n budgetRemaining: totalBudget,\n categoriesLoaded: [],\n categoriesSkipped: [],\n warnings: [],\n nearBudgetLimit: false,\n contextDegraded: false,\n };\n\n const contentParts: string[] = [];\n\n // First pass: load alwaysLoad categories\n for (const category of this.categories) {\n if (!category.alwaysLoad) continue;\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Second pass: load requested categories\n for (const category of this.categories) {\n if (category.alwaysLoad) continue; // Already loaded\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Combine content\n result.content = contentParts.join('\\n\\n---\\n\\n');\n\n // Check budget status\n const usagePercent = (result.totalTokens / totalBudget) * 100;\n result.nearBudgetLimit = usagePercent >= 50;\n result.contextDegraded = usagePercent >= 70;\n\n // Add warnings for budget limits\n if (result.contextDegraded && options.warnOnBudgetLimit !== false) {\n result.warnings.push(\n `Context usage at ${Math.round(usagePercent)}% - quality may degrade. Consider spawning a fresh agent.`\n );\n } else if (result.nearBudgetLimit && options.warnOnBudgetLimit !== false) {\n result.warnings.push(`Context usage at ${Math.round(usagePercent)}% - approaching limit.`);\n }\n\n return result;\n }\n\n /**\n * Load a single category\n */\n private loadCategory(\n category: ContextCategory,\n result: LoadedContext,\n contentParts: string[],\n totalBudget: number\n ): void {\n let content: string | null = null;\n\n // Load from file\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n result.categoriesSkipped.push(category.name);\n return;\n }\n }\n }\n\n // Use inline content if no file\n if (!content && category.content) {\n content = category.content;\n }\n\n if (!content) {\n result.categoriesSkipped.push(category.name);\n return;\n }\n\n // Estimate tokens\n const tokens = estimateTokens(content);\n\n // Check category limit\n if (tokens > category.maxTokens) {\n // Truncate to category limit\n const truncateChars = category.maxTokens * 4;\n content = content.slice(0, truncateChars) + '\\n\\n[... content truncated ...]';\n result.warnings.push(\n `Category \"${category.name}\" truncated to ${category.maxTokens} tokens`\n );\n }\n\n // Check total budget\n const truncatedTokens = estimateTokens(content);\n if (result.totalTokens + truncatedTokens > totalBudget) {\n // Skip if would exceed budget\n result.categoriesSkipped.push(category.name);\n result.warnings.push(\n `Category \"${category.name}\" skipped - would exceed budget`\n );\n return;\n }\n\n // Add to result\n contentParts.push(`# ${category.name.toUpperCase()}\\n\\n${content}`);\n result.totalTokens += truncatedTokens;\n result.budgetRemaining = totalBudget - result.totalTokens;\n result.categoriesLoaded.push(category.name);\n }\n\n /**\n * Get category by name\n */\n getCategory(name: string): ContextCategory | undefined {\n return this.categories.find((c) => c.name === name);\n }\n\n /**\n * Add a custom category\n */\n addCategory(category: ContextCategory): void {\n const existing = this.categories.findIndex((c) => c.name === category.name);\n if (existing >= 0) {\n this.categories[existing] = category;\n } else {\n this.categories.push(category);\n }\n }\n\n /**\n * Remove a category\n */\n removeCategory(name: string): void {\n this.categories = this.categories.filter((c) => c.name !== name);\n }\n\n /**\n * Get estimated context size for categories\n */\n estimateSize(categoryNames?: string[]): { category: string; tokens: number; available: boolean }[] {\n const estimates: { category: string; tokens: number; available: boolean }[] = [];\n\n for (const category of this.categories) {\n if (categoryNames && !categoryNames.includes(category.name)) continue;\n\n let tokens = 0;\n let available = false;\n\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n const stat = statSync(filePath);\n tokens = Math.ceil(stat.size / 4); // Rough estimate\n available = true;\n } catch {\n // File not accessible\n }\n }\n } else if (category.content) {\n tokens = estimateTokens(category.content);\n available = true;\n }\n\n estimates.push({\n category: category.name,\n tokens: Math.min(tokens, category.maxTokens),\n available,\n });\n }\n\n return estimates;\n }\n\n /**\n * Check if context would exceed budget threshold\n */\n wouldExceedThreshold(additionalTokens: number, threshold: number = 0.7): boolean {\n const currentTokens = this.load().totalTokens;\n const newTotal = currentTokens + additionalTokens;\n return newTotal / this.defaultBudget > threshold;\n }\n\n /**\n * Suggest spawning fresh agent if context is degraded\n */\n shouldSpawnFreshAgent(): { should: boolean; reason?: string } {\n const context = this.load();\n\n if (context.contextDegraded) {\n return {\n should: true,\n reason: `Context at ${Math.round((context.totalTokens / this.defaultBudget) * 100)}% capacity`,\n };\n }\n\n return { should: false };\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(\n projectPath: string,\n options?: { categories?: ContextCategory[]; defaultBudget?: number }\n): ContextLoader {\n return new ContextLoader(projectPath, options);\n}\n","import { z } from 'zod';\nimport type { ProjectStack } from '../context/types.js';\n\n/**\n * Skill summary for recommendation matching\n */\nexport const SkillSummary = z.object({\n name: z.string(),\n description: z.string().optional(),\n source: z.string().optional(), // Repository source\n tags: z.array(z.string()).default([]),\n compatibility: z\n .object({\n frameworks: z.array(z.string()).default([]),\n languages: z.array(z.string()).default([]),\n libraries: z.array(z.string()).default([]),\n minVersion: z.record(z.string()).optional(), // { \"react\": \"18.0.0\" }\n })\n .optional(),\n popularity: z.number().default(0), // Downloads/stars\n quality: z.number().min(0).max(100).default(50), // Quality score\n lastUpdated: z.string().datetime().optional(),\n verified: z.boolean().default(false),\n});\nexport type SkillSummary = z.infer<typeof SkillSummary>;\n\n/**\n * Scored skill with match explanation\n */\nexport interface ScoredSkill {\n skill: SkillSummary;\n score: number; // 0-100\n reasons: MatchReason[];\n warnings: string[];\n}\n\n/**\n * Match reason with category and weight\n */\nexport interface MatchReason {\n category: MatchCategory;\n description: string;\n weight: number; // Points contributed\n matched: string[]; // What matched\n}\n\n/**\n * Categories of matching\n */\nexport type MatchCategory =\n | 'framework'\n | 'language'\n | 'library'\n | 'tag'\n | 'pattern'\n | 'popularity'\n | 'quality'\n | 'freshness';\n\n/**\n * Weight configuration for scoring\n */\nexport interface ScoringWeights {\n framework: number; // Default: 40\n language: number; // Default: 20\n library: number; // Default: 15\n tag: number; // Default: 10\n popularity: number; // Default: 5\n quality: number; // Default: 5\n freshness: number; // Default: 5\n}\n\nexport const DEFAULT_SCORING_WEIGHTS: ScoringWeights = {\n framework: 40,\n language: 20,\n library: 15,\n tag: 10,\n popularity: 5,\n quality: 5,\n freshness: 5,\n};\n\n/**\n * Project profile for matching (derived from ProjectContext)\n */\nexport interface ProjectProfile {\n name: string;\n type?: string;\n stack: ProjectStack;\n patterns?: {\n components?: string;\n stateManagement?: string;\n apiStyle?: string;\n styling?: string;\n testing?: string;\n };\n installedSkills: string[];\n excludedSkills: string[];\n}\n\n/**\n * Skill index for efficient lookup\n */\nexport interface SkillIndex {\n version: number;\n lastUpdated: string;\n skills: SkillSummary[];\n sources: IndexSource[];\n}\n\n/**\n * Source repository in the index\n */\nexport interface IndexSource {\n name: string;\n url: string;\n lastFetched: string;\n skillCount: number;\n}\n\n/**\n * Recommendation options\n */\nexport interface RecommendOptions {\n limit?: number; // Max recommendations (default: 10)\n minScore?: number; // Minimum score threshold (default: 30)\n categories?: string[]; // Filter by categories\n excludeInstalled?: boolean; // Skip already installed (default: true)\n weights?: Partial<ScoringWeights>;\n includeReasons?: boolean; // Include detailed reasons (default: true)\n}\n\n/**\n * Recommendation result\n */\nexport interface RecommendationResult {\n recommendations: ScoredSkill[];\n profile: ProjectProfile;\n totalSkillsScanned: number;\n timestamp: string;\n}\n\n/**\n * Search options for task-based search\n */\nexport interface SearchOptions {\n query: string;\n limit?: number;\n semantic?: boolean; // Use semantic matching (default: true)\n filters?: {\n tags?: string[];\n minScore?: number;\n verified?: boolean;\n };\n}\n\n/**\n * Search result\n */\nexport interface SearchResult {\n skill: SkillSummary;\n relevance: number; // 0-100\n matchedTerms: string[];\n snippet?: string; // Relevant excerpt\n}\n\n/**\n * Freshness check result\n */\nexport interface FreshnessResult {\n skill: string;\n status: 'current' | 'outdated' | 'unknown';\n details?: {\n skillVersion?: string;\n projectVersion?: string;\n message: string;\n };\n}\n\n/**\n * Tag to technology mapping for smart inference\n */\nexport const TAG_TO_TECH: Record<string, string[]> = {\n // Frontend frameworks\n react: ['react', 'react-dom', '@types/react'],\n vue: ['vue', '@vue/core'],\n angular: ['@angular/core'],\n svelte: ['svelte'],\n solid: ['solid-js'],\n qwik: ['@builder.io/qwik'],\n\n // Meta-frameworks\n nextjs: ['next'],\n nuxt: ['nuxt'],\n remix: ['@remix-run/react'],\n astro: ['astro'],\n gatsby: ['gatsby'],\n sveltekit: ['@sveltejs/kit'],\n\n // Backend\n express: ['express'],\n fastify: ['fastify'],\n koa: ['koa'],\n hono: ['hono'],\n nestjs: ['@nestjs/core'],\n fastapi: ['fastapi'],\n django: ['django'],\n flask: ['flask'],\n\n // Languages\n typescript: ['typescript', '@types/node'],\n javascript: [], // Inferred from lack of typescript\n python: [],\n rust: [],\n go: [],\n\n // Styling\n tailwind: ['tailwindcss'],\n 'styled-components': ['styled-components'],\n emotion: ['@emotion/react'],\n 'css-modules': [],\n sass: ['sass', 'node-sass'],\n\n // State management\n redux: ['@reduxjs/toolkit', 'redux'],\n zustand: ['zustand'],\n mobx: ['mobx'],\n jotai: ['jotai'],\n recoil: ['recoil'],\n\n // Testing\n jest: ['jest'],\n vitest: ['vitest'],\n playwright: ['@playwright/test'],\n cypress: ['cypress'],\n testing: ['@testing-library/react'],\n\n // Databases\n postgres: ['pg', '@prisma/client'],\n mongodb: ['mongoose', 'mongodb'],\n supabase: ['@supabase/supabase-js'],\n firebase: ['firebase'],\n prisma: ['@prisma/client'],\n drizzle: ['drizzle-orm'],\n\n // Tools\n eslint: ['eslint'],\n prettier: ['prettier'],\n biome: ['@biomejs/biome'],\n turborepo: ['turbo'],\n monorepo: ['lerna', 'nx'],\n\n // API\n graphql: ['graphql', '@apollo/client'],\n trpc: ['@trpc/server'],\n rest: [],\n\n // Auth\n auth: ['next-auth', '@auth/core', 'passport'],\n 'better-auth': ['better-auth'],\n\n // Deployment\n vercel: ['vercel'],\n docker: [],\n kubernetes: [],\n\n // Other\n ai: ['openai', '@anthropic-ai/sdk', 'ai'],\n shadcn: [],\n security: [],\n performance: [],\n accessibility: [],\n};\n\n/**\n * Reverse mapping: tech to tags\n */\nexport function getTechTags(techName: string): string[] {\n const tags: string[] = [];\n for (const [tag, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName)) {\n tags.push(tag);\n }\n }\n return tags;\n}\n","import type { ProjectStack } from '../context/types.js';\nimport type {\n SkillSummary,\n ScoredSkill,\n MatchReason,\n ScoringWeights,\n ProjectProfile,\n SkillIndex,\n RecommendOptions,\n RecommendationResult,\n SearchOptions,\n SearchResult,\n FreshnessResult,\n} from './types.js';\nimport { DEFAULT_SCORING_WEIGHTS, TAG_TO_TECH, getTechTags } from './types.js';\n\n/**\n * Recommendation engine for matching skills to project profiles\n */\nexport class RecommendationEngine {\n private weights: ScoringWeights;\n private index: SkillIndex | null = null;\n\n constructor(weights?: Partial<ScoringWeights>) {\n this.weights = { ...DEFAULT_SCORING_WEIGHTS, ...weights };\n }\n\n /**\n * Load skill index from cache or generate from local skills\n */\n loadIndex(index: SkillIndex): void {\n this.index = index;\n }\n\n /**\n * Get loaded index\n */\n getIndex(): SkillIndex | null {\n return this.index;\n }\n\n /**\n * Score a single skill against a project profile\n */\n scoreSkill(profile: ProjectProfile, skill: SkillSummary): ScoredSkill {\n const reasons: MatchReason[] = [];\n const warnings: string[] = [];\n let totalScore = 0;\n\n // Framework matching (40 points max)\n const frameworkMatch = this.matchFrameworks(profile.stack, skill);\n reasons.push(frameworkMatch);\n totalScore += frameworkMatch.weight;\n\n // Language matching (20 points max)\n const languageMatch = this.matchLanguages(profile.stack, skill);\n reasons.push(languageMatch);\n totalScore += languageMatch.weight;\n\n // Library matching (15 points max)\n const libraryMatch = this.matchLibraries(profile.stack, skill);\n reasons.push(libraryMatch);\n totalScore += libraryMatch.weight;\n\n // Tag relevance (10 points max)\n const tagMatch = this.matchTags(profile, skill);\n reasons.push(tagMatch);\n totalScore += tagMatch.weight;\n\n // Popularity bonus (5 points max)\n const popularityScore = this.scorePopularity(skill);\n reasons.push(popularityScore);\n totalScore += popularityScore.weight;\n\n // Quality bonus (5 points max)\n const qualityScore = this.scoreQuality(skill);\n reasons.push(qualityScore);\n totalScore += qualityScore.weight;\n\n // Freshness bonus (5 points max)\n const freshnessScore = this.scoreFreshness(skill);\n reasons.push(freshnessScore);\n totalScore += freshnessScore.weight;\n\n // Add warnings for potential issues\n if (skill.compatibility?.minVersion) {\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected && this.isVersionLower(detected, minVer)) {\n warnings.push(`Requires ${tech} ${minVer}+, you have ${detected}`);\n }\n }\n }\n\n // Check if skill is already installed\n if (profile.installedSkills.includes(skill.name)) {\n warnings.push('Already installed');\n }\n\n return {\n skill,\n score: Math.min(100, Math.round(totalScore)),\n reasons,\n warnings,\n };\n }\n\n /**\n * Match frameworks in project stack against skill\n */\n private matchFrameworks(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillFrameworks = skill.compatibility?.frameworks || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.frameworks) {\n const techName = detection.name.toLowerCase();\n\n // Direct framework match\n if (skillFrameworks.some((f) => f.toLowerCase() === techName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(techName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === techName) {\n matched.push(detection.name);\n break;\n }\n }\n\n // Check if skill tags match framework-related tags\n for (const [tagName, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName) && skillTags.includes(tagName)) {\n if (!matched.includes(detection.name)) {\n matched.push(detection.name);\n }\n }\n }\n }\n\n const ratio = matched.length / Math.max(stack.frameworks.length, 1);\n const weight = Math.round(this.weights.framework * ratio);\n\n return {\n category: 'framework',\n description:\n matched.length > 0\n ? `Matches frameworks: ${matched.join(', ')}`\n : 'No framework match',\n weight,\n matched,\n };\n }\n\n /**\n * Match languages in project stack against skill\n */\n private matchLanguages(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLanguages = skill.compatibility?.languages || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.languages) {\n const langName = detection.name.toLowerCase();\n\n // Direct language match\n if (skillLanguages.some((l) => l.toLowerCase() === langName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n if (skillTags.some((t) => t.toLowerCase() === langName)) {\n matched.push(detection.name);\n }\n }\n\n const ratio = matched.length / Math.max(stack.languages.length, 1);\n const weight = Math.round(this.weights.language * ratio);\n\n return {\n category: 'language',\n description:\n matched.length > 0 ? `Matches languages: ${matched.join(', ')}` : 'No language match',\n weight,\n matched,\n };\n }\n\n /**\n * Match libraries in project stack against skill\n */\n private matchLibraries(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLibraries = skill.compatibility?.libraries || [];\n const skillTags = skill.tags || [];\n\n const allLibraries = [...stack.libraries, ...stack.styling, ...stack.testing, ...stack.databases];\n\n for (const detection of allLibraries) {\n const libName = detection.name.toLowerCase();\n\n // Direct library match\n if (skillLibraries.some((l) => l.toLowerCase() === libName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(libName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === libName) {\n matched.push(detection.name);\n break;\n }\n }\n }\n\n const ratio = matched.length / Math.max(allLibraries.length, 1);\n const weight = Math.round(this.weights.library * ratio);\n\n return {\n category: 'library',\n description:\n matched.length > 0 ? `Matches libraries: ${matched.join(', ')}` : 'No library match',\n weight,\n matched,\n };\n }\n\n /**\n * Match tags based on project patterns and type\n */\n private matchTags(profile: ProjectProfile, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillTags = skill.tags || [];\n\n // Extract relevant tags from project\n const projectTags = this.extractProjectTags(profile);\n\n for (const tag of skillTags) {\n if (projectTags.includes(tag.toLowerCase())) {\n matched.push(tag);\n }\n }\n\n const ratio = matched.length / Math.max(skillTags.length, 1);\n const weight = Math.round(this.weights.tag * ratio);\n\n return {\n category: 'tag',\n description: matched.length > 0 ? `Matches tags: ${matched.join(', ')}` : 'No tag match',\n weight,\n matched,\n };\n }\n\n /**\n * Extract relevant tags from project profile\n */\n private extractProjectTags(profile: ProjectProfile): string[] {\n const tags: string[] = [];\n\n // Add project type as tag\n if (profile.type) {\n tags.push(profile.type.toLowerCase());\n }\n\n // Add patterns as tags\n if (profile.patterns) {\n if (profile.patterns.components) tags.push(profile.patterns.components);\n if (profile.patterns.stateManagement) tags.push(profile.patterns.stateManagement);\n if (profile.patterns.apiStyle) tags.push(profile.patterns.apiStyle);\n if (profile.patterns.styling) tags.push(profile.patterns.styling);\n if (profile.patterns.testing) tags.push(profile.patterns.testing);\n }\n\n // Derive tags from stack\n const allDetections = [\n ...profile.stack.frameworks,\n ...profile.stack.languages,\n ...profile.stack.libraries,\n ...profile.stack.styling,\n ...profile.stack.testing,\n ...profile.stack.databases,\n ...profile.stack.tools,\n ];\n\n for (const detection of allDetections) {\n tags.push(detection.name.toLowerCase());\n // Add related tags\n const related = getTechTags(detection.name.toLowerCase());\n tags.push(...related);\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score based on popularity (downloads/stars)\n */\n private scorePopularity(skill: SkillSummary): MatchReason {\n // Normalize popularity to 0-5 range\n // Assume 1000+ is high popularity\n const popularity = skill.popularity ?? 0;\n const normalized = Math.min(popularity / 1000, 1);\n const weight = Math.round(this.weights.popularity * normalized);\n\n return {\n category: 'popularity',\n description:\n popularity > 0 ? `${popularity} downloads/stars` : 'No popularity data',\n weight,\n matched: popularity > 0 ? [popularity.toString()] : [],\n };\n }\n\n /**\n * Score based on quality metrics\n */\n private scoreQuality(skill: SkillSummary): MatchReason {\n const quality = skill.quality ?? 50; // Default to 50 if not specified\n const normalized = quality / 100;\n const weight = Math.round(this.weights.quality * normalized);\n\n return {\n category: 'quality',\n description: `Quality score: ${skill.quality}/100`,\n weight,\n matched: skill.verified ? ['verified'] : [],\n };\n }\n\n /**\n * Score based on freshness (last update)\n */\n private scoreFreshness(skill: SkillSummary): MatchReason {\n if (!skill.lastUpdated) {\n return {\n category: 'freshness',\n description: 'No update date available',\n weight: 0,\n matched: [],\n };\n }\n\n const lastUpdate = new Date(skill.lastUpdated);\n const now = new Date();\n const daysSinceUpdate = (now.getTime() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24);\n\n // Full points if updated within 30 days, decreasing linearly to 0 at 365 days\n let normalized = Math.max(0, 1 - daysSinceUpdate / 365);\n if (daysSinceUpdate <= 30) normalized = 1;\n\n const weight = Math.round(this.weights.freshness * normalized);\n\n return {\n category: 'freshness',\n description:\n daysSinceUpdate <= 30\n ? 'Recently updated'\n : `Updated ${Math.round(daysSinceUpdate)} days ago`,\n weight,\n matched: [skill.lastUpdated],\n };\n }\n\n /**\n * Find detected version for a technology\n */\n private findDetectedVersion(stack: ProjectStack, tech: string): string | null {\n const techLower = tech.toLowerCase();\n const allDetections = [\n ...stack.frameworks,\n ...stack.languages,\n ...stack.libraries,\n ...stack.styling,\n ...stack.testing,\n ...stack.databases,\n ...stack.tools,\n ...stack.runtime,\n ];\n\n const found = allDetections.find((d) => d.name.toLowerCase() === techLower);\n return found?.version || null;\n }\n\n /**\n * Compare semantic versions (basic implementation)\n */\n private isVersionLower(current: string, required: string): boolean {\n const parseVersion = (v: string): number[] =>\n v\n .replace(/[^0-9.]/g, '')\n .split('.')\n .map(Number);\n\n const currentParts = parseVersion(current);\n const requiredParts = parseVersion(required);\n\n for (let i = 0; i < Math.max(currentParts.length, requiredParts.length); i++) {\n const c = currentParts[i] || 0;\n const r = requiredParts[i] || 0;\n if (c < r) return true;\n if (c > r) return false;\n }\n\n return false;\n }\n\n /**\n * Get top recommendations for a project profile\n */\n recommend(profile: ProjectProfile, options: RecommendOptions = {}): RecommendationResult {\n const {\n limit = 10,\n minScore = 30,\n categories,\n excludeInstalled = true,\n includeReasons = true,\n } = options;\n\n if (!this.index) {\n return {\n recommendations: [],\n profile,\n totalSkillsScanned: 0,\n timestamp: new Date().toISOString(),\n };\n }\n\n let skills = this.index.skills;\n\n // Filter by categories if specified\n if (categories && categories.length > 0) {\n skills = skills.filter((s) => s.tags?.some((t) => categories.includes(t)));\n }\n\n // Score all skills\n const scored = skills.map((skill) => this.scoreSkill(profile, skill));\n\n // Filter by minimum score\n let filtered = scored.filter((s) => s.score >= minScore);\n\n // Exclude installed skills\n if (excludeInstalled) {\n filtered = filtered.filter((s) => !profile.installedSkills.includes(s.skill.name));\n }\n\n // Exclude explicitly excluded skills\n filtered = filtered.filter((s) => !profile.excludedSkills.includes(s.skill.name));\n\n // Sort by score descending\n filtered.sort((a, b) => b.score - a.score);\n\n // Limit results\n const recommendations = filtered.slice(0, limit);\n\n // Optionally strip reasons for minimal output\n if (!includeReasons) {\n recommendations.forEach((r) => {\n r.reasons = [];\n });\n }\n\n return {\n recommendations,\n profile,\n totalSkillsScanned: skills.length,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Search skills by query (task-based search)\n */\n search(options: SearchOptions): SearchResult[] {\n const { query, limit = 10, semantic = true, filters } = options;\n\n if (!this.index) {\n return [];\n }\n\n // Handle empty or whitespace-only queries\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n return [];\n }\n\n const queryTerms = trimmedQuery.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n if (queryTerms.length === 0) {\n return [];\n }\n\n const results: SearchResult[] = [];\n\n for (const skill of this.index.skills) {\n // Apply filters\n if (filters?.tags && filters.tags.length > 0) {\n if (!skill.tags?.some((t) => filters.tags!.includes(t))) continue;\n }\n if (filters?.verified && !skill.verified) continue;\n\n // Calculate relevance\n const { relevance, matchedTerms, snippet } = this.calculateRelevance(\n skill,\n queryTerms,\n semantic\n );\n\n if (relevance > 0 && (!filters?.minScore || relevance >= filters.minScore)) {\n results.push({ skill, relevance, matchedTerms, snippet });\n }\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n return results.slice(0, limit);\n }\n\n /**\n * Calculate search relevance for a skill\n */\n private calculateRelevance(\n skill: SkillSummary,\n queryTerms: string[],\n semantic: boolean\n ): { relevance: number; matchedTerms: string[]; snippet?: string } {\n const matchedTerms: string[] = [];\n let relevance = 0;\n\n // Search in name (high weight)\n const nameLower = skill.name.toLowerCase();\n for (const term of queryTerms) {\n if (nameLower.includes(term)) {\n relevance += 40;\n matchedTerms.push(term);\n }\n }\n\n // Search in description (medium weight)\n const descLower = (skill.description || '').toLowerCase();\n for (const term of queryTerms) {\n if (descLower.includes(term) && !matchedTerms.includes(term)) {\n relevance += 20;\n matchedTerms.push(term);\n }\n }\n\n // Search in tags (medium weight)\n const tagsLower = (skill.tags || []).map((t) => t.toLowerCase());\n for (const term of queryTerms) {\n if (tagsLower.some((t) => t.includes(term)) && !matchedTerms.includes(term)) {\n relevance += 25;\n matchedTerms.push(term);\n }\n }\n\n // Semantic matching: expand terms using TAG_TO_TECH\n if (semantic) {\n for (const term of queryTerms) {\n const relatedTags = getTechTags(term);\n for (const relatedTag of relatedTags) {\n if (\n tagsLower.includes(relatedTag) ||\n nameLower.includes(relatedTag) ||\n descLower.includes(relatedTag)\n ) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n\n // Also check if term is a tag that maps to skill tags\n const tagTechs = TAG_TO_TECH[term] || [];\n for (const tech of tagTechs) {\n if (skill.compatibility?.libraries?.includes(tech)) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n }\n }\n\n // Generate snippet if description matches\n let snippet: string | undefined;\n if (skill.description && matchedTerms.length > 0) {\n snippet = skill.description.slice(0, 150);\n if (skill.description.length > 150) snippet += '...';\n }\n\n // Normalize to 0-100\n relevance = Math.min(100, relevance);\n\n return { relevance, matchedTerms, snippet };\n }\n\n /**\n * Check freshness of installed skills against project dependencies\n *\n * A skill is considered:\n * - 'current': skill's minVersion is <= project version (compatible and up to date)\n * - 'outdated': skill targets a significantly older major version\n * - 'unknown': no version requirements specified\n */\n checkFreshness(\n profile: ProjectProfile,\n installedSkills: SkillSummary[]\n ): FreshnessResult[] {\n const results: FreshnessResult[] = [];\n\n for (const skill of installedSkills) {\n if (!skill.compatibility?.minVersion) {\n results.push({\n skill: skill.name,\n status: 'unknown',\n details: { message: 'No version requirements specified' },\n });\n continue;\n }\n\n let status: 'current' | 'outdated' = 'current';\n const messages: string[] = [];\n\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected) {\n const majorSkill = parseInt(minVer.split('.')[0]) || 0;\n const majorProject = parseInt(detected.split('.')[0]) || 0;\n\n // Skill is outdated if it targets a version that is 2+ major versions behind\n // e.g., skill targets React 16 but project uses React 19\n if (majorProject - majorSkill >= 2) {\n status = 'outdated';\n messages.push(`Skill targets ${tech} ${minVer}, you have ${detected}`);\n }\n }\n }\n\n results.push({\n skill: skill.name,\n status,\n details:\n messages.length > 0 ? { message: messages.join('; ') } : { message: 'Up to date' },\n });\n }\n\n return results;\n }\n}\n\n/**\n * Create a recommendation engine with default settings\n */\nexport function createRecommendationEngine(\n weights?: Partial<ScoringWeights>\n): RecommendationEngine {\n return new RecommendationEngine(weights);\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir, homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { SkillIndex, SkillSummary, IndexSource } from './types.js';\nimport { discoverSkills, extractFrontmatter } from '../skills.js';\n\n/**\n * Known skill repositories to index\n */\nexport const KNOWN_SKILL_REPOS = [\n { owner: 'anthropics', repo: 'courses', description: 'Anthropic official courses and skills' },\n { owner: 'vercel-labs', repo: 'ai-sdk-preview-internal-knowledge-base', description: 'Vercel AI SDK skills' },\n { owner: 'composioHQ', repo: 'awesome-claude-code-skills', description: 'Curated Claude Code skills' },\n] as const;\n\n/**\n * Index file path\n */\nexport const INDEX_PATH = join(homedir(), '.skillkit', 'index.json');\nexport const INDEX_CACHE_HOURS = 24;\n\n/**\n * Fetch skills from a GitHub repository\n */\nexport async function fetchSkillsFromRepo(\n owner: string,\n repo: string\n): Promise<{ skills: SkillSummary[]; error?: string }> {\n const cloneUrl = `https://github.com/${owner}/${repo}.git`;\n const tempDir = join(tmpdir(), `skillkit-fetch-${randomUUID()}`);\n\n try {\n // Shallow clone for speed\n execSync(`git clone --depth 1 ${cloneUrl} ${tempDir}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n timeout: 60000, // 60 second timeout\n });\n\n // Discover skills in the cloned repo\n const discoveredSkills = discoverSkills(tempDir);\n const skills: SkillSummary[] = [];\n\n for (const skill of discoveredSkills) {\n const skillMdPath = join(skill.path, 'SKILL.md');\n if (!existsSync(skillMdPath)) continue;\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n const summary: SkillSummary = {\n name: skill.name,\n description: skill.description || frontmatter?.description as string || 'No description',\n source: `${owner}/${repo}`,\n tags: (frontmatter?.tags as string[]) || [],\n compatibility: {\n frameworks: (frontmatter?.compatibility as Record<string, unknown>)?.frameworks as string[] || [],\n languages: (frontmatter?.compatibility as Record<string, unknown>)?.languages as string[] || [],\n libraries: (frontmatter?.compatibility as Record<string, unknown>)?.libraries as string[] || [],\n },\n popularity: 0,\n quality: 50,\n lastUpdated: new Date().toISOString(),\n verified: owner === 'anthropics' || owner === 'vercel-labs',\n };\n\n skills.push(summary);\n } catch {\n // Skip skills that fail to parse\n }\n }\n\n return { skills };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { skills: [], error: `Failed to fetch ${owner}/${repo}: ${message}` };\n } finally {\n // Clean up temp directory\n if (existsSync(tempDir)) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Fetch skills from all known repositories and build index\n */\nexport async function buildSkillIndex(\n repos: typeof KNOWN_SKILL_REPOS = KNOWN_SKILL_REPOS,\n onProgress?: (message: string) => void\n): Promise<{ index: SkillIndex; errors: string[] }> {\n const allSkills: SkillSummary[] = [];\n const sources: IndexSource[] = [];\n const errors: string[] = [];\n\n for (const { owner, repo } of repos) {\n onProgress?.(`Fetching ${owner}/${repo}...`);\n\n const result = await fetchSkillsFromRepo(owner, repo);\n\n if (result.error) {\n errors.push(result.error);\n }\n\n if (result.skills.length > 0) {\n allSkills.push(...result.skills);\n sources.push({\n name: `${owner}/${repo}`,\n url: `https://github.com/${owner}/${repo}`,\n lastFetched: new Date().toISOString(),\n skillCount: result.skills.length,\n });\n onProgress?.(` Found ${result.skills.length} skills`);\n } else if (!result.error) {\n onProgress?.(` No skills found`);\n }\n }\n\n // Add fallback sample skills if no repos could be fetched\n if (allSkills.length === 0) {\n onProgress?.('No skills fetched, using sample index...');\n allSkills.push(...getSampleSkills());\n sources.push({\n name: 'skillkit-samples',\n url: 'https://github.com/skillkit/samples',\n lastFetched: new Date().toISOString(),\n skillCount: allSkills.length,\n });\n }\n\n const index: SkillIndex = {\n version: 1,\n lastUpdated: new Date().toISOString(),\n skills: allSkills,\n sources,\n };\n\n return { index, errors };\n}\n\n/**\n * Save skill index to cache\n */\nexport function saveIndex(index: SkillIndex): void {\n const indexDir = join(homedir(), '.skillkit');\n if (!existsSync(indexDir)) {\n mkdirSync(indexDir, { recursive: true });\n }\n writeFileSync(INDEX_PATH, JSON.stringify(index, null, 2));\n}\n\n/**\n * Load skill index from cache\n */\nexport function loadIndex(): SkillIndex | null {\n if (!existsSync(INDEX_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(INDEX_PATH, 'utf-8');\n return JSON.parse(content) as SkillIndex;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if index is stale\n */\nexport function isIndexStale(index: SkillIndex): boolean {\n const lastUpdated = new Date(index.lastUpdated);\n const hoursSinceUpdate = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60);\n return hoursSinceUpdate > INDEX_CACHE_HOURS;\n}\n\n/**\n * Get index status\n */\nexport function getIndexStatus(): 'missing' | 'stale' | 'fresh' {\n const index = loadIndex();\n if (!index) return 'missing';\n return isIndexStale(index) ? 'stale' : 'fresh';\n}\n\n/**\n * Sample skills fallback (when repos can't be fetched)\n */\nfunction getSampleSkills(): SkillSummary[] {\n return [\n {\n name: 'react-best-practices',\n description: 'Modern React patterns including Server Components, hooks best practices, and performance optimization',\n source: 'skillkit/samples',\n tags: ['react', 'frontend', 'typescript', 'nextjs', 'performance'],\n compatibility: {\n frameworks: ['react', 'nextjs'],\n languages: ['typescript', 'javascript'],\n libraries: [],\n },\n popularity: 1500,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'tailwind-patterns',\n description: 'Tailwind CSS utility patterns, responsive design, and component styling best practices',\n source: 'skillkit/samples',\n tags: ['tailwind', 'css', 'styling', 'frontend', 'responsive'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['tailwindcss'],\n },\n popularity: 1200,\n quality: 92,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'typescript-strict-patterns',\n description: 'TypeScript strict mode patterns, type safety, and advanced type utilities',\n source: 'skillkit/samples',\n tags: ['typescript', 'types', 'safety', 'patterns'],\n compatibility: {\n frameworks: [],\n languages: ['typescript'],\n libraries: [],\n },\n popularity: 900,\n quality: 90,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'security-best-practices',\n description: 'Security patterns for web applications including XSS prevention, CSRF, and secure headers',\n source: 'skillkit/samples',\n tags: ['security', 'xss', 'csrf', 'headers', 'owasp'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript', 'python'],\n libraries: [],\n },\n popularity: 600,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'testing-patterns',\n description: 'Testing patterns with Vitest/Jest including mocking, assertions, and test organization',\n source: 'skillkit/samples',\n tags: ['vitest', 'jest', 'testing', 'typescript', 'mocking', 'tdd'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['vitest', 'jest'],\n },\n popularity: 700,\n quality: 86,\n lastUpdated: new Date().toISOString(),\n verified: false,\n },\n ];\n}\n","/**\n * Session State Types\n *\n * Types for managing skill execution sessions with pause/resume support.\n */\n\n/**\n * Status of a task in execution\n */\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'paused';\n\n/**\n * A single task within a skill execution\n */\nexport interface SessionTask {\n /** Task identifier */\n id: string;\n /** Task name/description */\n name: string;\n /** Task type (auto, checkpoint:human-verify, checkpoint:decision, checkpoint:human-action) */\n type: 'auto' | 'checkpoint:human-verify' | 'checkpoint:decision' | 'checkpoint:human-action';\n /** Current status */\n status: TaskStatus;\n /** Start time */\n startedAt?: string;\n /** Completion time */\n completedAt?: string;\n /** Error message if failed */\n error?: string;\n /** Output/result of the task */\n output?: string;\n /** Files modified by this task */\n filesModified?: string[];\n /** Git commit SHA if committed */\n commitSha?: string;\n}\n\n/**\n * Current skill execution state\n */\nexport interface CurrentExecution {\n /** Skill being executed */\n skillName: string;\n /** Skill source (repo) */\n skillSource: string;\n /** Current step/task index */\n currentStep: number;\n /** Total steps */\n totalSteps: number;\n /** Execution status */\n status: 'running' | 'paused' | 'completed' | 'failed';\n /** When execution started */\n startedAt: string;\n /** When execution was paused (if paused) */\n pausedAt?: string;\n /** Tasks in this execution */\n tasks: SessionTask[];\n}\n\n/**\n * Historical execution record\n */\nexport interface ExecutionHistory {\n /** Skill name */\n skillName: string;\n /** Skill source */\n skillSource: string;\n /** When execution completed */\n completedAt: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Final status */\n status: 'completed' | 'failed' | 'cancelled';\n /** Git commits created */\n commits: string[];\n /** Files modified */\n filesModified: string[];\n /** Error if failed */\n error?: string;\n}\n\n/**\n * User decisions made during skill execution\n */\nexport interface SessionDecision {\n /** Decision key/identifier */\n key: string;\n /** Decision value */\n value: string;\n /** When decision was made */\n madeAt: string;\n /** Skill that prompted the decision */\n skillName?: string;\n}\n\n/**\n * Full session state\n */\nexport interface SessionState {\n /** Schema version */\n version: 1;\n /** Last activity timestamp */\n lastActivity: string;\n /** Project path this session is for */\n projectPath: string;\n /** Current execution (if any) */\n currentExecution?: CurrentExecution;\n /** Execution history */\n history: ExecutionHistory[];\n /** User decisions */\n decisions: SessionDecision[];\n}\n\n/**\n * Session state file path within .skillkit directory\n */\nexport const SESSION_FILE = 'session.yaml';\n","/**\n * Session Manager\n *\n * Manages session state for skill execution with pause/resume support.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type {\n SessionState,\n CurrentExecution,\n ExecutionHistory,\n SessionTask,\n TaskStatus,\n} from './types.js';\nimport { SESSION_FILE } from './types.js';\n\n/**\n * Session Manager for tracking skill execution state\n */\nexport class SessionManager {\n private projectPath: string;\n private sessionPath: string;\n private state: SessionState | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.sessionPath = join(projectPath, '.skillkit', SESSION_FILE);\n }\n\n /**\n * Get session file path\n */\n getSessionPath(): string {\n return this.sessionPath;\n }\n\n /**\n * Load session state from disk\n */\n load(): SessionState | null {\n if (!existsSync(this.sessionPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.sessionPath, 'utf-8');\n this.state = parse(content) as SessionState;\n return this.state;\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n\n /**\n * Save session state to disk\n */\n save(): void {\n if (!this.state) {\n return;\n }\n\n const dir = join(this.projectPath, '.skillkit');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.state.lastActivity = new Date().toISOString();\n writeFileSync(this.sessionPath, stringify(this.state));\n }\n\n /**\n * Initialize a new session\n */\n init(): SessionState {\n this.state = {\n version: 1,\n lastActivity: new Date().toISOString(),\n projectPath: this.projectPath,\n history: [],\n decisions: [],\n };\n this.save();\n return this.state;\n }\n\n /**\n * Get current session state (load if needed)\n */\n get(): SessionState | null {\n if (!this.state) {\n this.state = this.load();\n }\n return this.state;\n }\n\n /**\n * Get or create session\n */\n getOrCreate(): SessionState {\n const state = this.get();\n if (state) {\n return state;\n }\n return this.init();\n }\n\n /**\n * Start a new skill execution\n */\n startExecution(skillName: string, skillSource: string, tasks: Omit<SessionTask, 'status'>[]): CurrentExecution {\n const state = this.getOrCreate();\n\n const execution: CurrentExecution = {\n skillName,\n skillSource,\n currentStep: 0,\n totalSteps: tasks.length,\n status: 'running',\n startedAt: new Date().toISOString(),\n tasks: tasks.map((t) => ({\n ...t,\n status: 'pending' as TaskStatus,\n })),\n };\n\n state.currentExecution = execution;\n this.save();\n return execution;\n }\n\n /**\n * Update task status\n */\n updateTask(\n taskId: string,\n updates: Partial<Pick<SessionTask, 'status' | 'output' | 'error' | 'filesModified' | 'commitSha'>>\n ): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const task = state.currentExecution.tasks.find((t) => t.id === taskId);\n if (!task) {\n return;\n }\n\n Object.assign(task, updates);\n\n if (updates.status === 'in_progress' && !task.startedAt) {\n task.startedAt = new Date().toISOString();\n }\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n task.completedAt = new Date().toISOString();\n }\n\n // Update current step\n const completedCount = state.currentExecution.tasks.filter(\n (t) => t.status === 'completed' || t.status === 'failed'\n ).length;\n state.currentExecution.currentStep = completedCount;\n\n this.save();\n }\n\n /**\n * Advance to next task\n */\n advanceToNextTask(): SessionTask | null {\n const state = this.get();\n if (!state?.currentExecution) {\n return null;\n }\n\n const nextTask = state.currentExecution.tasks.find((t) => t.status === 'pending');\n if (nextTask) {\n nextTask.status = 'in_progress';\n nextTask.startedAt = new Date().toISOString();\n this.save();\n }\n\n return nextTask || null;\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'running') {\n return false;\n }\n\n state.currentExecution.status = 'paused';\n state.currentExecution.pausedAt = new Date().toISOString();\n\n // Mark any in-progress tasks as paused\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'in_progress') {\n task.status = 'paused';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Resume paused execution\n */\n resume(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'paused') {\n return false;\n }\n\n state.currentExecution.status = 'running';\n delete state.currentExecution.pausedAt;\n\n // Resume paused tasks\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'paused') {\n task.status = 'in_progress';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Complete current execution\n */\n completeExecution(status: 'completed' | 'failed' | 'cancelled', error?: string): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const execution = state.currentExecution;\n const startTime = new Date(execution.startedAt).getTime();\n const endTime = Date.now();\n\n const historyEntry: ExecutionHistory = {\n skillName: execution.skillName,\n skillSource: execution.skillSource,\n completedAt: new Date().toISOString(),\n durationMs: endTime - startTime,\n status,\n commits: execution.tasks\n .map((t) => t.commitSha)\n .filter((sha): sha is string => !!sha),\n filesModified: Array.from(\n new Set(execution.tasks.flatMap((t) => t.filesModified || []))\n ),\n error,\n };\n\n state.history.unshift(historyEntry);\n delete state.currentExecution;\n\n // Keep only last 50 history entries\n if (state.history.length > 50) {\n state.history = state.history.slice(0, 50);\n }\n\n this.save();\n }\n\n /**\n * Record a user decision\n */\n recordDecision(key: string, value: string, skillName?: string): void {\n const state = this.getOrCreate();\n\n // Update existing decision or add new one\n const existing = state.decisions.find((d) => d.key === key);\n if (existing) {\n existing.value = value;\n existing.madeAt = new Date().toISOString();\n existing.skillName = skillName;\n } else {\n state.decisions.push({\n key,\n value,\n madeAt: new Date().toISOString(),\n skillName,\n });\n }\n\n this.save();\n }\n\n /**\n * Get a decision value\n */\n getDecision(key: string): string | undefined {\n const state = this.get();\n return state?.decisions.find((d) => d.key === key)?.value;\n }\n\n /**\n * Get execution history\n */\n getHistory(limit?: number): ExecutionHistory[] {\n const state = this.get();\n if (!state) {\n return [];\n }\n return limit ? state.history.slice(0, limit) : state.history;\n }\n\n /**\n * Check if there's an active execution\n */\n hasActiveExecution(): boolean {\n const state = this.get();\n return !!state?.currentExecution;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n const state = this.get();\n return state?.currentExecution?.status === 'paused';\n }\n\n /**\n * Clear session (delete file)\n */\n clear(): void {\n if (existsSync(this.sessionPath)) {\n unlinkSync(this.sessionPath);\n }\n this.state = null;\n }\n}\n\n/**\n * Create a new session manager\n */\nexport function createSessionManager(projectPath: string): SessionManager {\n return new SessionManager(projectPath);\n}\n","/**\n * Workflow Types\n *\n * Types for skill composition and workflow orchestration.\n */\n\n/**\n * A skill reference within a workflow\n */\nexport interface WorkflowSkill {\n /** Skill name or source (e.g., \"typescript-strict-mode\" or \"owner/repo/skill\") */\n skill: string;\n /** Optional configuration overrides */\n config?: Record<string, unknown>;\n /** Optional condition to run this skill */\n condition?: string;\n}\n\n/**\n * A wave of skills to execute (parallel or sequential)\n */\nexport interface WorkflowWave {\n /** Wave name/description */\n name?: string;\n /** Whether skills in this wave run in parallel */\n parallel: boolean;\n /** Skills to execute in this wave */\n skills: (string | WorkflowSkill)[];\n /** Continue to next wave even if this wave has failures */\n continueOnError?: boolean;\n}\n\n/**\n * Workflow definition\n */\nexport interface Workflow {\n /** Workflow name (used as identifier) */\n name: string;\n /** Human-readable description */\n description?: string;\n /** Workflow version */\n version?: string;\n /** Author information */\n author?: string;\n /** Tags for discovery */\n tags?: string[];\n /** Waves of skills to execute */\n waves: WorkflowWave[];\n /** Environment variables to set */\n env?: Record<string, string>;\n /** Pre-execution hooks */\n preHooks?: string[];\n /** Post-execution hooks */\n postHooks?: string[];\n}\n\n/**\n * Workflow execution status\n */\nexport type WorkflowExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Status of a wave execution\n */\nexport interface WaveExecutionStatus {\n /** Wave index */\n waveIndex: number;\n /** Wave name */\n waveName?: string;\n /** Status */\n status: WorkflowExecutionStatus;\n /** Skills statuses */\n skills: {\n skill: string;\n status: WorkflowExecutionStatus;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n }[];\n /** When wave started */\n startedAt?: string;\n /** When wave completed */\n completedAt?: string;\n}\n\n/**\n * Workflow execution state\n */\nexport interface WorkflowExecution {\n /** Workflow being executed */\n workflow: Workflow;\n /** Execution ID */\n executionId: string;\n /** Overall status */\n status: WorkflowExecutionStatus;\n /** Current wave index */\n currentWave: number;\n /** Wave statuses */\n waves: WaveExecutionStatus[];\n /** When execution started */\n startedAt: string;\n /** When execution completed */\n completedAt?: string;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Workflow file location\n */\nexport const WORKFLOWS_DIR = 'workflows';\nexport const WORKFLOW_EXTENSION = '.yaml';\n","/**\n * Workflow Parser\n *\n * Parses workflow YAML files into Workflow objects.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type { Workflow, WorkflowWave, WorkflowSkill } from './types.js';\nimport { WORKFLOWS_DIR, WORKFLOW_EXTENSION } from './types.js';\n\n/**\n * Parse a workflow from YAML content\n */\nexport function parseWorkflow(content: string): Workflow {\n const data = parse(content) as Record<string, unknown>;\n\n if (!data.name || typeof data.name !== 'string') {\n throw new Error('Workflow must have a name');\n }\n\n if (!data.waves || !Array.isArray(data.waves)) {\n throw new Error('Workflow must have waves array');\n }\n\n const waves: WorkflowWave[] = data.waves.map((wave: unknown, index: number) => {\n if (typeof wave !== 'object' || wave === null) {\n throw new Error(`Wave ${index} must be an object`);\n }\n\n const waveObj = wave as Record<string, unknown>;\n const skills = waveObj.skills;\n\n if (!skills || !Array.isArray(skills)) {\n throw new Error(`Wave ${index} must have skills array`);\n }\n\n return {\n name: waveObj.name as string | undefined,\n parallel: waveObj.parallel === true,\n skills: skills.map((s: unknown) => {\n if (typeof s === 'string') {\n return s;\n }\n if (typeof s === 'object' && s !== null) {\n const skillObj = s as Record<string, unknown>;\n return {\n skill: skillObj.skill as string,\n config: skillObj.config as Record<string, unknown> | undefined,\n condition: skillObj.condition as string | undefined,\n } as WorkflowSkill;\n }\n throw new Error(`Invalid skill in wave ${index}`);\n }),\n continueOnError: waveObj.continueOnError === true,\n };\n });\n\n return {\n name: data.name as string,\n description: data.description as string | undefined,\n version: data.version as string | undefined,\n author: data.author as string | undefined,\n tags: data.tags as string[] | undefined,\n waves,\n env: data.env as Record<string, string> | undefined,\n preHooks: data.preHooks as string[] | undefined,\n postHooks: data.postHooks as string[] | undefined,\n };\n}\n\n/**\n * Load a workflow from a file\n */\nexport function loadWorkflow(filePath: string): Workflow {\n if (!existsSync(filePath)) {\n throw new Error(`Workflow file not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return parseWorkflow(content);\n}\n\n/**\n * Load a workflow by name from the project's workflows directory\n */\nexport function loadWorkflowByName(projectPath: string, name: string): Workflow | null {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return null;\n }\n\n // Try exact name match first\n const exactPath = join(workflowsDir, `${name}${WORKFLOW_EXTENSION}`);\n if (existsSync(exactPath)) {\n return loadWorkflow(exactPath);\n }\n\n // Try finding by workflow name property\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n if (workflow.name === name) {\n return workflow;\n }\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return null;\n}\n\n/**\n * List all workflows in a project\n */\nexport function listWorkflows(projectPath: string): Workflow[] {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return [];\n }\n\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n const workflows: Workflow[] = [];\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n workflows.push(workflow);\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return workflows;\n}\n\n/**\n * Save a workflow to a file\n */\nexport function saveWorkflow(projectPath: string, workflow: Workflow): string {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true });\n }\n\n const fileName = `${workflow.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}${WORKFLOW_EXTENSION}`;\n const filePath = join(workflowsDir, fileName);\n\n writeFileSync(filePath, stringify(workflow));\n\n return filePath;\n}\n\n/**\n * Serialize a workflow to YAML\n */\nexport function serializeWorkflow(workflow: Workflow): string {\n return stringify(workflow);\n}\n\n/**\n * Validate a workflow\n */\nexport function validateWorkflow(workflow: Workflow): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!workflow.name) {\n errors.push('Workflow must have a name');\n }\n\n if (!workflow.waves || workflow.waves.length === 0) {\n errors.push('Workflow must have at least one wave');\n }\n\n for (let i = 0; i < workflow.waves.length; i++) {\n const wave = workflow.waves[i];\n\n if (!wave.skills || wave.skills.length === 0) {\n errors.push(`Wave ${i + 1} must have at least one skill`);\n }\n\n for (let j = 0; j < wave.skills.length; j++) {\n const skill = wave.skills[j];\n const skillName = typeof skill === 'string' ? skill : skill.skill;\n\n if (!skillName) {\n errors.push(`Wave ${i + 1}, skill ${j + 1} must have a name`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Create a new workflow from a template\n */\nexport function createWorkflowTemplate(name: string, description?: string): Workflow {\n return {\n name,\n description: description || `Workflow: ${name}`,\n version: '1.0.0',\n waves: [\n {\n name: 'Setup',\n parallel: true,\n skills: [],\n },\n {\n name: 'Main',\n parallel: false,\n skills: [],\n },\n ],\n };\n}\n","/**\n * Workflow Orchestrator\n *\n * Executes workflows with wave-based orchestration.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n Workflow,\n WorkflowWave,\n WorkflowSkill,\n WorkflowExecution,\n WorkflowExecutionStatus,\n} from './types.js';\n\n/**\n * Skill executor function type\n */\nexport type SkillExecutor = (\n skillName: string,\n config?: Record<string, unknown>\n) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Progress callback for workflow execution\n */\nexport type WorkflowProgressCallback = (event: {\n type: 'wave_start' | 'wave_complete' | 'skill_start' | 'skill_complete' | 'workflow_complete';\n waveIndex?: number;\n waveName?: string;\n skillName?: string;\n status?: WorkflowExecutionStatus;\n error?: string;\n}) => void;\n\n/**\n * Workflow Orchestrator\n *\n * Manages the execution of workflows with parallel/sequential waves.\n */\nexport class WorkflowOrchestrator {\n private execution: WorkflowExecution | null = null;\n private executor: SkillExecutor;\n private onProgress?: WorkflowProgressCallback;\n\n constructor(executor: SkillExecutor, onProgress?: WorkflowProgressCallback) {\n this.executor = executor;\n this.onProgress = onProgress;\n }\n\n /**\n * Get current execution state\n */\n getExecution(): WorkflowExecution | null {\n return this.execution;\n }\n\n /**\n * Execute a workflow\n */\n async execute(workflow: Workflow): Promise<WorkflowExecution> {\n // Initialize execution state\n this.execution = {\n workflow,\n executionId: randomUUID(),\n status: 'running',\n currentWave: 0,\n waves: workflow.waves.map((wave, index) => ({\n waveIndex: index,\n waveName: wave.name,\n status: 'pending',\n skills: wave.skills.map((s) => ({\n skill: typeof s === 'string' ? s : s.skill,\n status: 'pending' as WorkflowExecutionStatus,\n })),\n })),\n startedAt: new Date().toISOString(),\n };\n\n try {\n // Execute each wave\n for (let i = 0; i < workflow.waves.length; i++) {\n if (this.execution.status === 'cancelled' || this.execution.status === 'paused') {\n break;\n }\n\n this.execution.currentWave = i;\n await this.executeWave(workflow.waves[i], i);\n\n // Check if wave failed and should stop\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n // Mark as completed if not already failed/cancelled/paused\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'workflow_complete',\n status: this.execution.status,\n error: this.execution.error,\n });\n\n return this.execution;\n } catch (error) {\n this.execution.status = 'failed';\n this.execution.error = error instanceof Error ? error.message : String(error);\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n }\n\n /**\n * Execute a single wave\n */\n private async executeWave(wave: WorkflowWave, waveIndex: number): Promise<void> {\n const waveStatus = this.execution!.waves[waveIndex];\n waveStatus.status = 'running';\n waveStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_start',\n waveIndex,\n waveName: wave.name,\n });\n\n const skills = wave.skills.map((s) => ({\n name: typeof s === 'string' ? s : s.skill,\n config: typeof s === 'string' ? undefined : (s as WorkflowSkill).config,\n }));\n\n if (wave.parallel) {\n // Execute skills in parallel\n await Promise.all(\n skills.map((skill, skillIndex) =>\n this.executeSkill(skill.name, skill.config, waveIndex, skillIndex)\n )\n );\n } else {\n // Execute skills sequentially\n for (let i = 0; i < skills.length; i++) {\n if (this.execution!.status === 'cancelled' || this.execution!.status === 'paused') {\n break;\n }\n\n await this.executeSkill(skills[i].name, skills[i].config, waveIndex, i);\n\n // Stop on first failure in sequential mode\n const skillStatus = waveStatus.skills[i];\n if (skillStatus.status === 'failed' && !wave.continueOnError) {\n break;\n }\n }\n }\n\n // Determine wave status based on skill statuses\n const hasFailures = waveStatus.skills.some((s) => s.status === 'failed');\n const allCompleted = waveStatus.skills.every(\n (s) => s.status === 'completed' || s.status === 'failed'\n );\n\n if (allCompleted) {\n waveStatus.status = hasFailures ? 'failed' : 'completed';\n }\n\n waveStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_complete',\n waveIndex,\n waveName: wave.name,\n status: waveStatus.status,\n });\n }\n\n /**\n * Execute a single skill\n */\n private async executeSkill(\n skillName: string,\n config: Record<string, unknown> | undefined,\n waveIndex: number,\n skillIndex: number\n ): Promise<void> {\n const skillStatus = this.execution!.waves[waveIndex].skills[skillIndex];\n skillStatus.status = 'running';\n skillStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_start',\n waveIndex,\n skillName,\n });\n\n try {\n const result = await this.executor(skillName, config);\n\n if (result.success) {\n skillStatus.status = 'completed';\n } else {\n skillStatus.status = 'failed';\n skillStatus.error = result.error;\n }\n } catch (error) {\n skillStatus.status = 'failed';\n skillStatus.error = error instanceof Error ? error.message : String(error);\n }\n\n skillStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_complete',\n waveIndex,\n skillName,\n status: skillStatus.status,\n error: skillStatus.error,\n });\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n if (!this.execution || this.execution.status !== 'running') {\n return false;\n }\n\n this.execution.status = 'paused';\n return true;\n }\n\n /**\n * Check if execution should continue\n */\n private shouldContinue(): boolean {\n if (!this.execution) return false;\n return this.execution.status === 'running';\n }\n\n /**\n * Resume execution\n */\n async resume(): Promise<WorkflowExecution | null> {\n if (!this.execution || this.execution.status !== 'paused') {\n return null;\n }\n\n this.execution.status = 'running';\n\n // Continue from current wave\n const workflow = this.execution.workflow;\n for (let i = this.execution.currentWave; i < workflow.waves.length; i++) {\n if (!this.shouldContinue()) {\n break;\n }\n\n this.execution.currentWave = i;\n\n // Skip already completed waves\n if (this.execution.waves[i].status === 'completed') {\n continue;\n }\n\n await this.executeWave(workflow.waves[i], i);\n\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n\n /**\n * Cancel execution\n */\n cancel(): boolean {\n if (!this.execution || this.execution.status === 'completed' || this.execution.status === 'failed') {\n return false;\n }\n\n this.execution.status = 'cancelled';\n this.execution.completedAt = new Date().toISOString();\n return true;\n }\n}\n\n/**\n * Create a new workflow orchestrator\n */\nexport function createWorkflowOrchestrator(\n executor: SkillExecutor,\n onProgress?: WorkflowProgressCallback\n): WorkflowOrchestrator {\n return new WorkflowOrchestrator(executor, onProgress);\n}\n","/**\n * Skill Execution Engine\n *\n * Executes skills with task-based orchestration, verification, and state management.\n */\n\nimport { execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type {\n ExecutableSkill,\n ExecutableTask,\n ExecutionOptions,\n TaskExecutionResult,\n SkillExecutionResult,\n CheckpointHandler,\n CheckpointResponse,\n ExecutionTaskStatus,\n} from './types.js';\nimport { SessionManager } from '../session/manager.js';\nimport type { SessionTask } from '../session/types.js';\n\n/**\n * Progress event for execution\n */\nexport interface ExecutionProgressEvent {\n type: 'task_start' | 'task_complete' | 'checkpoint' | 'verification' | 'complete';\n taskId?: string;\n taskName?: string;\n taskIndex?: number;\n totalTasks?: number;\n status?: ExecutionTaskStatus | 'paused' | 'cancelled';\n message?: string;\n error?: string;\n}\n\n/**\n * Progress callback type\n */\nexport type ExecutionProgressCallback = (event: ExecutionProgressEvent) => void;\n\n/**\n * Skill Execution Engine\n */\nexport class SkillExecutionEngine {\n private projectPath: string;\n private sessionManager: SessionManager;\n private checkpointHandler?: CheckpointHandler;\n private onProgress?: ExecutionProgressCallback;\n\n constructor(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n ) {\n this.projectPath = projectPath;\n this.sessionManager = new SessionManager(projectPath);\n this.checkpointHandler = options?.checkpointHandler;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Execute a skill\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): Promise<SkillExecutionResult> {\n const startTime = new Date();\n const tasks = skill.tasks || [];\n\n // Handle dry run\n if (options.dryRun) {\n return this.createDryRunResult(skill);\n }\n\n // Check if there's an existing paused execution for this skill\n const existingState = this.sessionManager.get();\n if (existingState?.currentExecution?.skillName === skill.name) {\n if (existingState.currentExecution.status === 'paused') {\n // Resume from paused state\n return this.resumeExecution(skill, options);\n }\n }\n\n // Start new execution\n const sessionTasks: Omit<SessionTask, 'status'>[] = tasks.map((task, index) => ({\n id: task.id || `task-${index}`,\n name: task.name,\n type: task.type === 'auto' ? 'auto' : task.type,\n }));\n\n this.sessionManager.startExecution(skill.name, skill.source, sessionTasks);\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Execute tasks\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n // Execute the task\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n const endTime = new Date();\n\n // Complete the execution\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n const result: SkillExecutionResult = {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n\n const statusMessages: Record<'completed' | 'failed' | 'cancelled' | 'paused', string> = {\n completed: 'Skill execution completed',\n paused: 'Skill execution paused',\n failed: overallError || 'Skill execution failed',\n cancelled: 'Skill execution cancelled',\n };\n\n this.onProgress?.({\n type: 'complete',\n status: overallStatus,\n message: statusMessages[overallStatus],\n });\n\n return result;\n }\n\n /**\n * Resume a paused execution\n */\n private async resumeExecution(\n skill: ExecutableSkill,\n options: ExecutionOptions\n ): Promise<SkillExecutionResult> {\n const state = this.sessionManager.get();\n if (!state?.currentExecution) {\n throw new Error('No execution to resume');\n }\n\n this.sessionManager.resume();\n const execution = state.currentExecution;\n const tasks = skill.tasks || [];\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Find where to resume from\n const startIndex = execution.currentStep;\n\n for (let i = startIndex; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints (same as in execute)\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n // Emit task_complete progress event (matching execute behavior)\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled (matching execute behavior)\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n // Only complete execution if not paused\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: execution.startedAt,\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - new Date(execution.startedAt).getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ExecutableTask,\n _skill: ExecutableSkill,\n _options: ExecutionOptions\n ): Promise<TaskExecutionResult> {\n const startTime = new Date();\n const taskId = task.id || randomUUID();\n\n try {\n // For now, we simulate task execution\n // In a real implementation, this would integrate with the AI agent\n // to execute the task action based on the skill content\n\n // Simulate some work\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'completed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n output: `Task \"${task.name}\" completed successfully`,\n filesModified: task.files,\n };\n } catch (error) {\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'failed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle a checkpoint\n */\n private async handleCheckpoint(\n task: ExecutableTask,\n context: { skillName: string; taskIndex: number; totalTasks: number }\n ): Promise<CheckpointResponse> {\n this.onProgress?.({\n type: 'checkpoint',\n taskId: task.id,\n taskName: task.name,\n taskIndex: context.taskIndex,\n totalTasks: context.totalTasks,\n message: `Checkpoint: ${task.type}`,\n });\n\n if (this.checkpointHandler) {\n return this.checkpointHandler(task, context);\n }\n\n // Default: auto-continue for non-decision checkpoints\n if (task.type === 'checkpoint:decision') {\n // Use first option if no handler\n return {\n continue: true,\n selectedOption: task.options?.[0],\n };\n }\n\n return { continue: true };\n }\n\n /**\n * Check if a regex pattern is potentially dangerous (ReDoS-vulnerable)\n * Rejects patterns with nested quantifiers and other known problematic constructs\n */\n private isUnsafeRegexPattern(pattern: string): boolean {\n // Detect nested quantifiers like (a+)+, (a*)+, (a+)*, (a*)*\n // These are the primary cause of catastrophic backtracking\n const nestedQuantifierPattern = /\\([^)]*[+*][^)]*\\)[+*?]/;\n if (nestedQuantifierPattern.test(pattern)) {\n return true;\n }\n\n // Detect overlapping alternations with quantifiers like (a|a)+\n const overlappingAlternation = /\\([^|)]*\\|[^|)]*\\)[+*]/;\n if (overlappingAlternation.test(pattern)) {\n return true;\n }\n\n // Detect excessive quantifiers (more than 3 quantifiers in a row-ish)\n const quantifierCount = (pattern.match(/[+*?]|\\{\\d+/g) || []).length;\n if (quantifierCount > 10) {\n return true;\n }\n\n // Detect very long character classes which can be slow\n const longCharClass = /\\[[^\\]]{50,}\\]/;\n if (longCharClass.test(pattern)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Safely test a regex pattern with ReDoS prevention\n *\n * This method validates patterns before execution to prevent catastrophic backtracking.\n * Note: This cannot guarantee protection against all ReDoS patterns, but catches common ones.\n */\n private safeRegexTest(pattern: string, input: string, _timeoutMs = 1000): boolean {\n // Strict length limits to prevent excessive processing\n if (pattern.length > 200 || input.length > 50000) {\n console.warn(`Regex test skipped: pattern or input too long`);\n return false;\n }\n\n // Reject patterns known to cause ReDoS\n if (this.isUnsafeRegexPattern(pattern)) {\n console.warn(`Regex pattern rejected as potentially unsafe: ${pattern.slice(0, 50)}...`);\n return false;\n }\n\n try {\n const regex = new RegExp(pattern);\n return regex.test(input);\n } catch {\n // Invalid regex pattern\n return false;\n }\n }\n\n /**\n * Run verification for a task\n *\n * SECURITY NOTE: Verification commands are executed from skill configuration.\n * Only run skills from trusted sources. Commands run with the same privileges\n * as the skillkit process.\n */\n private async runVerification(\n task: ExecutableTask,\n result: TaskExecutionResult\n ): Promise<boolean> {\n if (!task.verify) {\n return true;\n }\n\n const verificationResults = {\n automated: [] as { rule: string; passed: boolean; output?: string }[],\n human: [] as { description: string; passed: boolean }[],\n };\n\n // Run automated verification\n if (task.verify.automated) {\n for (const rule of task.verify.automated) {\n if (rule.command) {\n try {\n // SECURITY: Commands are from skill config - only run trusted skills\n const output = execSync(rule.command, {\n cwd: this.projectPath,\n encoding: 'utf-8',\n timeout: 30000,\n });\n\n let passed = true;\n if (rule.expect) {\n if (rule.expect === 'success') {\n passed = true;\n } else if (rule.expect.startsWith('contains:')) {\n const expected = rule.expect.slice(9);\n passed = output.includes(expected);\n } else if (rule.expect.startsWith('matches:')) {\n const pattern = rule.expect.slice(8);\n // Use safe regex test to prevent ReDoS\n passed = this.safeRegexTest(pattern, output);\n }\n }\n\n verificationResults.automated.push({\n rule: rule.command,\n passed,\n output,\n });\n\n this.onProgress?.({\n type: 'verification',\n taskId: task.id,\n taskName: task.name,\n message: `Verification ${passed ? 'passed' : 'failed'}: ${rule.command}`,\n });\n\n if (!passed) {\n return false;\n }\n } catch (error) {\n verificationResults.automated.push({\n rule: rule.command,\n passed: false,\n output: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n }\n }\n\n // Human verification would be handled by checkpoint handler\n result.verificationResults = verificationResults;\n return true;\n }\n\n /**\n * Create a dry run result\n */\n private createDryRunResult(skill: ExecutableSkill): SkillExecutionResult {\n const tasks = skill.tasks || [];\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: 'completed',\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n tasks: tasks.map((task) => ({\n taskId: task.id || randomUUID(),\n taskName: task.name,\n status: 'skipped' as ExecutionTaskStatus,\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n output: '[Dry run - not executed]',\n })),\n filesModified: [],\n commits: [],\n };\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n return this.sessionManager.pause();\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.sessionManager.isPaused();\n }\n\n /**\n * Get session manager\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n}\n\n/**\n * Create a new skill execution engine\n */\nexport function createExecutionEngine(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n): SkillExecutionEngine {\n return new SkillExecutionEngine(projectPath, options);\n}\n","/**\n * Agent Execution Module\n *\n * Handles real execution of skills through various AI agent CLIs.\n */\n\nimport { spawn, type SpawnOptions } from 'node:child_process';\nimport type { AgentType } from '../types.js';\n\n/**\n * Agent CLI configuration\n */\nexport interface AgentCLIConfig {\n /** Agent type */\n type: AgentType;\n /** CLI command name */\n command: string;\n /** Whether the agent supports CLI execution */\n supportsCLI: boolean;\n /** Arguments to pass the prompt/skill content */\n promptArgs?: string[];\n /** Arguments for non-interactive mode */\n nonInteractiveArgs?: string[];\n /** Environment variables needed */\n envVars?: Record<string, string>;\n /** How to check if agent is installed */\n checkCommand?: string;\n}\n\n/**\n * Execution result from an agent\n */\nexport interface AgentExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n exitCode: number;\n duration: number;\n}\n\n/**\n * Agent CLI configurations\n */\nexport const AGENT_CLI_CONFIGS: AgentCLIConfig[] = [\n {\n type: 'claude-code',\n command: 'claude',\n supportsCLI: true,\n promptArgs: ['--print', '-p'],\n nonInteractiveArgs: ['--no-input'],\n checkCommand: 'claude --version',\n },\n {\n type: 'codex',\n command: 'codex',\n supportsCLI: true,\n promptArgs: ['-p'],\n checkCommand: 'codex --version',\n },\n {\n type: 'gemini-cli',\n command: 'gemini',\n supportsCLI: true,\n promptArgs: [],\n checkCommand: 'gemini --version',\n },\n {\n type: 'opencode',\n command: 'opencode',\n supportsCLI: true,\n promptArgs: ['--prompt'],\n checkCommand: 'opencode --version',\n },\n {\n type: 'goose',\n command: 'goose',\n supportsCLI: true,\n promptArgs: ['run'],\n checkCommand: 'goose --version',\n },\n // IDE-based agents (no CLI execution)\n {\n type: 'cursor',\n command: 'cursor',\n supportsCLI: false,\n },\n {\n type: 'windsurf',\n command: 'windsurf',\n supportsCLI: false,\n },\n {\n type: 'github-copilot',\n command: 'gh copilot',\n supportsCLI: false,\n },\n];\n\n/**\n * Get CLI config for an agent\n */\nexport function getAgentCLIConfig(agentType: AgentType): AgentCLIConfig | undefined {\n return AGENT_CLI_CONFIGS.find((c) => c.type === agentType);\n}\n\n/**\n * Check if an agent CLI is available\n */\nexport async function isAgentCLIAvailable(agentType: AgentType): Promise<boolean> {\n const config = getAgentCLIConfig(agentType);\n if (!config || !config.supportsCLI) return false;\n\n try {\n // Check if command exists\n const checkCmd = config.checkCommand || `which ${config.command}`;\n const result = await executeCommand(checkCmd.split(' ')[0], checkCmd.split(' ').slice(1), {\n timeout: 5000,\n });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get all available CLI agents\n */\nexport async function getAvailableCLIAgents(): Promise<AgentType[]> {\n const available: AgentType[] = [];\n\n for (const config of AGENT_CLI_CONFIGS) {\n if (config.supportsCLI && (await isAgentCLIAvailable(config.type))) {\n available.push(config.type);\n }\n }\n\n return available;\n}\n\n/**\n * Execute a skill using an agent CLI\n */\nexport async function executeWithAgent(\n agentType: AgentType,\n prompt: string,\n options: {\n cwd?: string;\n timeout?: number;\n env?: Record<string, string>;\n } = {}\n): Promise<AgentExecutionResult> {\n const config = getAgentCLIConfig(agentType);\n\n if (!config) {\n return {\n success: false,\n output: '',\n error: `Unknown agent type: ${agentType}`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n if (!config.supportsCLI) {\n return {\n success: false,\n output: '',\n error: `Agent ${agentType} does not support CLI execution. Please use IDE integration.`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n const isAvailable = await isAgentCLIAvailable(agentType);\n if (!isAvailable) {\n return {\n success: false,\n output: '',\n error: `Agent CLI '${config.command}' is not installed or not in PATH`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n // Build command arguments\n const args: string[] = [...(config.promptArgs || [])];\n\n // For Claude Code, use --print mode with the prompt\n if (agentType === 'claude-code') {\n args.push(prompt);\n } else {\n // For other agents, pass prompt as argument\n args.push(prompt);\n }\n\n // Add non-interactive flags if available\n if (config.nonInteractiveArgs) {\n args.push(...config.nonInteractiveArgs);\n }\n\n return executeCommand(config.command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 300000, // 5 minutes default\n env: {\n ...process.env,\n ...config.envVars,\n ...options.env,\n },\n });\n}\n\n/**\n * Execute a command and capture output\n */\nasync function executeCommand(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n timeout?: number;\n env?: NodeJS.ProcessEnv;\n } = {}\n): Promise<AgentExecutionResult> {\n return new Promise((resolve) => {\n const startTime = Date.now();\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n env: options.env as NodeJS.ProcessEnv,\n // shell: false (default) - prevents shell injection when passing untrusted input\n };\n\n const child = spawn(command, args, spawnOptions);\n\n // Set up timeout\n const timeoutId = options.timeout\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeout)\n : null;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: false,\n output: stdout,\n error: error.message,\n exitCode: 1,\n duration: Date.now() - startTime,\n });\n });\n\n child.on('close', (code) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: code === 0 && !timedOut,\n output: stdout,\n error: timedOut ? 'Execution timed out' : stderr || undefined,\n exitCode: code ?? 1,\n duration: Date.now() - startTime,\n });\n });\n });\n}\n\n/**\n * Format skill content as a prompt for an agent\n */\nexport function formatSkillAsPrompt(\n skillName: string,\n skillContent: string,\n taskDescription?: string\n): string {\n let prompt = `Execute the following skill: ${skillName}\\n\\n`;\n\n if (taskDescription) {\n prompt += `Task: ${taskDescription}\\n\\n`;\n }\n\n prompt += `Skill Content:\\n${skillContent}`;\n\n return prompt;\n}\n\n/**\n * Agent execution strategy\n */\nexport type ExecutionStrategy = 'cli' | 'ide' | 'api' | 'manual';\n\n/**\n * Get recommended execution strategy for an agent\n */\nexport function getExecutionStrategy(agentType: AgentType): ExecutionStrategy {\n const config = getAgentCLIConfig(agentType);\n\n if (config?.supportsCLI) {\n return 'cli';\n }\n\n // IDE-based agents\n if (['cursor', 'windsurf', 'github-copilot', 'kilo'].includes(agentType)) {\n return 'ide';\n }\n\n return 'manual';\n}\n\n/**\n * Get instructions for manual/IDE execution\n */\nexport function getManualExecutionInstructions(\n agentType: AgentType,\n skillPath: string\n): string {\n const strategy = getExecutionStrategy(agentType);\n\n if (strategy === 'ide') {\n return `\nTo execute this skill with ${agentType}:\n1. Open your project in ${agentType}\n2. The skill has been synced to the agent's skills directory\n3. Open the AI assistant/chat\n4. Reference the skill or ask the assistant to follow the instructions\n\nSkill location: ${skillPath}\n`;\n }\n\n return `\nTo execute this skill manually:\n1. Open the skill file: ${skillPath}\n2. Copy the skill content\n3. Paste it into your AI coding assistant\n4. Follow the instructions in the skill\n`;\n}\n","/**\n * Skill Test Runner\n *\n * Executes test suites and assertions for skill verification.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { createServer } from 'node:net';\nimport { promisify } from 'node:util';\nimport { parse as parseYaml } from 'yaml';\nimport type {\n TestAssertion,\n AssertionResult,\n SkillTestCase,\n TestCaseResult,\n SkillTestSuite,\n TestSuiteResult,\n TestRunnerOptions,\n} from './types.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Default timeout for assertions (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Run a single assertion\n */\nasync function runAssertion(\n assertion: TestAssertion,\n cwd: string,\n timeout: number\n): Promise<AssertionResult> {\n const startTime = Date.now();\n\n try {\n switch (assertion.type) {\n case 'file_exists':\n return assertFileExists(assertion, cwd, startTime);\n\n case 'file_not_exists':\n return assertFileNotExists(assertion, cwd, startTime);\n\n case 'file_contains':\n return assertFileContains(assertion, cwd, startTime);\n\n case 'file_not_contains':\n return assertFileNotContains(assertion, cwd, startTime);\n\n case 'file_matches':\n return assertFileMatches(assertion, cwd, startTime);\n\n case 'command_succeeds':\n return assertCommandSucceeds(assertion, cwd, timeout, startTime);\n\n case 'command_fails':\n return assertCommandFails(assertion, cwd, timeout, startTime);\n\n case 'command_output_contains':\n return assertCommandOutputContains(assertion, cwd, timeout, startTime);\n\n case 'json_valid':\n return assertJsonValid(assertion, cwd, startTime);\n\n case 'json_has_key':\n return assertJsonHasKey(assertion, cwd, startTime);\n\n case 'yaml_valid':\n return assertYamlValid(assertion, cwd, startTime);\n\n case 'type_check':\n return assertTypeCheck(cwd, timeout, startTime);\n\n case 'lint_passes':\n return assertLintPasses(cwd, timeout, startTime);\n\n case 'test_passes':\n return assertTestPasses(cwd, timeout, startTime);\n\n case 'env_var_set':\n return assertEnvVarSet(assertion, startTime);\n\n case 'port_available':\n return assertPortAvailable(assertion, startTime);\n\n case 'url_responds':\n return assertUrlResponds(assertion, timeout, startTime);\n\n case 'custom':\n return assertCustom(assertion, cwd, timeout, startTime);\n\n default:\n return {\n assertion,\n passed: false,\n error: `Unknown assertion type: ${assertion.type}`,\n duration: Date.now() - startTime,\n };\n }\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n// Assertion implementations\n\nfunction assertFileExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'exists',\n error: exists ? undefined : `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: !exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'not found',\n error: !exists ? undefined : `File should not exist: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'contains' : 'not found in file',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `File does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: true, // File doesn't exist, so it doesn't contain the text\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: !contains,\n actual: contains ? 'found in file' : 'not found',\n expected: `does not contain \"${expected}\"`,\n error: !contains ? undefined : `File should not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileMatches(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const pattern = new RegExp(String(assertion.expected || ''));\n const matches = pattern.test(content);\n\n return {\n assertion,\n passed: matches,\n actual: matches ? 'matches' : 'no match',\n expected: `matches /${assertion.expected}/`,\n error: matches ? undefined : `File does not match pattern: ${assertion.expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertCommandSucceeds(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'exit code 0',\n expected: 'exit code 0',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'non-zero exit code',\n expected: 'exit code 0',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandFails(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: false,\n actual: 'exit code 0',\n expected: 'non-zero exit code',\n error: 'Command should have failed but succeeded',\n duration: Date.now() - startTime,\n };\n } catch {\n return {\n assertion,\n passed: true,\n actual: 'non-zero exit code',\n expected: 'non-zero exit code',\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandOutputContains(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n const { stdout, stderr } = await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n const output = stdout + stderr;\n const expected = String(assertion.expected || '');\n const contains = output.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'found in output' : 'not found',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `Command output does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n JSON.parse(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid JSON',\n expected: 'valid JSON',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid JSON',\n expected: 'valid JSON',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonHasKey(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const key = String(assertion.expected || '');\n const keys = key.split('.');\n\n let value = json;\n for (const k of keys) {\n if (value === undefined || value === null || !(k in value)) {\n return {\n assertion,\n passed: false,\n actual: 'key not found',\n expected: `has key \"${key}\"`,\n error: `JSON does not have key: ${key}`,\n duration: Date.now() - startTime,\n };\n }\n value = value[k];\n }\n\n return {\n assertion,\n passed: true,\n actual: 'key found',\n expected: `has key \"${key}\"`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertYamlValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseYaml(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid YAML',\n expected: 'valid YAML',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid YAML',\n expected: 'valid YAML',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertTypeCheck(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'type_check' };\n\n // Try various type check commands\n const commands = [\n 'npx tsc --noEmit',\n 'pnpm tsc --noEmit',\n 'yarn tsc --noEmit',\n 'npm run type-check',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'types valid',\n expected: 'types valid',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'type errors',\n expected: 'types valid',\n error: 'Type check failed or TypeScript not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertLintPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'lint_passes' };\n\n // Try various lint commands\n const commands = [\n 'npx eslint . --max-warnings=0',\n 'pnpm eslint . --max-warnings=0',\n 'npm run lint',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'lint passes',\n expected: 'lint passes',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'lint errors',\n expected: 'lint passes',\n error: 'Lint check failed or ESLint not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertTestPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'test_passes' };\n\n // Try various test commands\n const commands = [\n 'npm test',\n 'pnpm test',\n 'yarn test',\n 'npx vitest run',\n 'npx jest',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'tests pass',\n expected: 'tests pass',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'tests fail',\n expected: 'tests pass',\n error: 'Tests failed or test framework not configured',\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertEnvVarSet(\n assertion: TestAssertion,\n startTime: number\n): AssertionResult {\n const varName = assertion.target || '';\n const isSet = process.env[varName] !== undefined;\n\n return {\n assertion,\n passed: isSet,\n actual: isSet ? 'set' : 'not set',\n expected: 'set',\n error: isSet ? undefined : `Environment variable not set: ${varName}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nasync function assertPortAvailable(\n assertion: TestAssertion,\n startTime: number\n): Promise<AssertionResult> {\n const port = parseInt(assertion.target || '0', 10);\n\n if (port <= 0 || port > 65535) {\n return {\n assertion,\n passed: false,\n actual: `invalid port ${port}`,\n expected: 'valid port number (1-65535)',\n error: 'Invalid port number',\n duration: Date.now() - startTime,\n };\n }\n\n const isAvailable = await checkPortAvailable(port);\n\n return {\n assertion,\n passed: isAvailable,\n actual: isAvailable ? 'available' : 'in use',\n expected: 'available',\n error: isAvailable ? undefined : `Port ${port} is already in use`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertUrlResponds(\n assertion: TestAssertion,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const url = assertion.target || '';\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), assertion.timeout || timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n const responds = response.ok;\n\n return {\n assertion,\n passed: responds,\n actual: `status ${response.status}`,\n expected: 'status 2xx',\n error: responds ? undefined : `URL returned status ${response.status}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCustom(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n if (!assertion.command) {\n return {\n assertion,\n passed: false,\n error: 'Custom assertion requires a command',\n duration: Date.now() - startTime,\n };\n }\n\n try {\n await execAsync(assertion.command, {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'command succeeded',\n expected: 'command succeeds',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'command failed',\n expected: 'command succeeds',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(\n testCase: SkillTestCase,\n cwd: string,\n options: TestRunnerOptions\n): Promise<TestCaseResult> {\n const startTime = Date.now();\n const timeout = testCase.assertions[0]?.timeout || options.timeout || DEFAULT_TIMEOUT;\n\n // Check if test should be skipped\n if (testCase.skip) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n\n // Check tag filters - if tags are specified, only run tests with matching tags\n if (options.tags && options.tags.length > 0) {\n // Tests without tags should be skipped when tag filter is active\n if (!testCase.tags || testCase.tags.length === 0) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n const hasRequiredTag = options.tags.some((t) => testCase.tags?.includes(t));\n if (!hasRequiredTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n if (options.skipTags && testCase.tags) {\n const hasSkipTag = options.skipTags.some((t) => testCase.tags?.includes(t));\n if (hasSkipTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n // Run setup commands\n let setupError: string | undefined;\n if (testCase.setup) {\n for (const cmd of testCase.setup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n setupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (setupError) {\n return {\n testCase,\n passed: false,\n assertions: [],\n setupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n }\n\n // Run assertions\n const assertionResults: AssertionResult[] = [];\n let allPassed = true;\n\n for (const assertion of testCase.assertions) {\n options.onProgress?.({\n type: 'assertion_start',\n testName: testCase.name,\n assertionType: assertion.type,\n });\n\n const result = await runAssertion(assertion, cwd, timeout);\n assertionResults.push(result);\n\n options.onProgress?.({\n type: 'assertion_end',\n testName: testCase.name,\n assertionType: assertion.type,\n passed: result.passed,\n error: result.error,\n });\n\n if (!result.passed) {\n allPassed = false;\n if (options.bail) {\n break;\n }\n }\n }\n\n // Run cleanup commands\n let cleanupError: string | undefined;\n if (testCase.cleanup) {\n for (const cmd of testCase.cleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n cleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n return {\n testCase,\n passed: allPassed,\n assertions: assertionResults,\n cleanupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n}\n\n/**\n * Run a test suite\n */\nexport async function runTestSuite(\n suite: SkillTestSuite,\n options: TestRunnerOptions = {}\n): Promise<TestSuiteResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const timeout = suite.defaultTimeout || options.timeout || DEFAULT_TIMEOUT;\n\n options.onProgress?.({\n type: 'suite_start',\n skillName: suite.skillName,\n });\n\n // Run global setup\n let globalSetupError: string | undefined;\n if (suite.globalSetup) {\n for (const cmd of suite.globalSetup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalSetupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (globalSetupError) {\n return {\n skillName: suite.skillName,\n passed: false,\n tests: [],\n passedCount: 0,\n failedCount: 0,\n skippedCount: 0,\n duration: Date.now() - startTime,\n globalSetupError,\n };\n }\n\n // Check for 'only' tests\n const hasOnly = suite.tests.some((t) => t.only);\n const testsToRun = hasOnly ? suite.tests.filter((t) => t.only) : suite.tests;\n\n // Run tests\n const testResults: TestCaseResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const testCase of testsToRun) {\n options.onProgress?.({\n type: 'test_start',\n skillName: suite.skillName,\n testName: testCase.name,\n });\n\n const result = await runTestCase(testCase, cwd, { ...options, timeout });\n testResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n }\n\n options.onProgress?.({\n type: 'test_end',\n skillName: suite.skillName,\n testName: testCase.name,\n passed: result.passed,\n error: result.assertions.find((a) => !a.passed)?.error,\n });\n\n if (!result.passed && options.bail) {\n break;\n }\n }\n\n // Run global cleanup\n let globalCleanupError: string | undefined;\n if (suite.globalCleanup) {\n for (const cmd of suite.globalCleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalCleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n const result: TestSuiteResult = {\n skillName: suite.skillName,\n passed: failedCount === 0,\n tests: testResults,\n passedCount,\n failedCount,\n skippedCount,\n duration: Date.now() - startTime,\n globalCleanupError,\n };\n\n options.onProgress?.({\n type: 'suite_end',\n skillName: suite.skillName,\n passed: result.passed,\n });\n\n return result;\n}\n\n/**\n * Create a test suite from skill frontmatter\n */\nexport function createTestSuiteFromFrontmatter(\n skillName: string,\n frontmatter: Record<string, unknown>\n): SkillTestSuite | null {\n const tests = frontmatter.tests;\n\n if (!tests || !Array.isArray(tests)) {\n return null;\n }\n\n const testCases: SkillTestCase[] = tests.map((t: Record<string, unknown>) => ({\n name: String(t.name || 'Unnamed test'),\n description: t.description as string | undefined,\n assertions: parseAssertions(t.assertions || t.assert),\n setup: t.setup as string[] | undefined,\n cleanup: t.cleanup as string[] | undefined,\n skip: t.skip === true,\n only: t.only === true,\n tags: t.tags as string[] | undefined,\n }));\n\n return {\n skillName,\n tests: testCases,\n globalSetup: frontmatter.globalSetup as string[] | undefined,\n globalCleanup: frontmatter.globalCleanup as string[] | undefined,\n defaultTimeout: frontmatter.testTimeout as number | undefined,\n };\n}\n\n/**\n * Parse assertions from various formats\n */\nfunction parseAssertions(assertions: unknown): TestAssertion[] {\n if (!assertions) return [];\n\n if (typeof assertions === 'string') {\n // Simple string assertion like \"file_exists: config.json\"\n return [parseAssertionString(assertions)];\n }\n\n if (Array.isArray(assertions)) {\n return assertions.map((a) => {\n if (typeof a === 'string') {\n return parseAssertionString(a);\n }\n return a as TestAssertion;\n });\n }\n\n return [assertions as TestAssertion];\n}\n\n/**\n * Parse a string assertion\n */\nfunction parseAssertionString(str: string): TestAssertion {\n // Format: \"type: target\" or \"type: target = expected\"\n const match = str.match(/^(\\w+):\\s*(.+?)(?:\\s*=\\s*(.+))?$/);\n\n if (match) {\n return {\n type: match[1] as TestAssertion['type'],\n target: match[2].trim(),\n expected: match[3]?.trim(),\n };\n }\n\n // Fallback: treat as command\n return {\n type: 'command_succeeds',\n target: str,\n };\n}\n","/**\n * Skill Marketplace Types\n *\n * Types for the aggregated skill marketplace.\n */\n\n/**\n * Skill source repository\n */\nexport interface SkillSource {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Whether this is an official source */\n official?: boolean;\n /** Branch to fetch from */\n branch?: string;\n /** Path to skills index file */\n indexPath?: string;\n}\n\n/**\n * Skill entry in the marketplace\n */\nexport interface MarketplaceSkill {\n /** Unique identifier (owner/repo/path) */\n id: string;\n /** Skill name */\n name: string;\n /** Description */\n description: string;\n /** Source repository */\n source: SkillSource;\n /** Path within the repository */\n path: string;\n /** Version if available */\n version?: string;\n /** Author */\n author?: string;\n /** Tags for categorization */\n tags: string[];\n /** Supported agents */\n agents?: string[];\n /** GitHub stars (if available) */\n stars?: number;\n /** Last updated date */\n updatedAt?: string;\n /** Download/install count */\n downloads?: number;\n /** Raw content URL */\n rawUrl?: string;\n}\n\n/**\n * Marketplace index (cached locally)\n */\nexport interface MarketplaceIndex {\n /** Index version */\n version: number;\n /** When the index was last updated */\n updatedAt: string;\n /** Sources included in this index */\n sources: SkillSource[];\n /** All skills in the index */\n skills: MarketplaceSkill[];\n /** Total skill count */\n totalCount: number;\n}\n\n/**\n * Search options for the marketplace\n */\nexport interface MarketplaceSearchOptions {\n /** Search query */\n query?: string;\n /** Filter by tags */\n tags?: string[];\n /** Filter by source */\n source?: string;\n /** Filter by agent compatibility */\n agent?: string;\n /** Sort by field */\n sortBy?: 'name' | 'stars' | 'downloads' | 'updatedAt';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Limit results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n/**\n * Search result\n */\nexport interface MarketplaceSearchResult {\n /** Matching skills */\n skills: MarketplaceSkill[];\n /** Total matches (before limit) */\n total: number;\n /** Query that was searched */\n query?: string;\n}\n\n/**\n * Marketplace configuration\n */\nexport interface MarketplaceConfig {\n /** Custom sources to include */\n sources?: SkillSource[];\n /** Cache directory */\n cacheDir?: string;\n /** Cache TTL in milliseconds */\n cacheTTL?: number;\n /** GitHub token for API access */\n githubToken?: string;\n}\n\n/**\n * Default skill sources\n */\nexport const DEFAULT_SKILL_SOURCES: SkillSource[] = [\n {\n owner: 'composioHQ',\n repo: 'awesome-claude-code-skills',\n name: 'Composio Curated',\n description: 'Curated collection of Claude Code skills',\n official: false,\n branch: 'main',\n },\n {\n owner: 'anthropics',\n repo: 'courses',\n name: 'Anthropic Official',\n description: 'Official Anthropic courses and skills',\n official: true,\n branch: 'master',\n },\n];\n\n/**\n * Cache file name\n */\nexport const MARKETPLACE_CACHE_FILE = 'marketplace-index.json';\n\n/**\n * Default cache TTL (1 hour)\n */\nexport const DEFAULT_CACHE_TTL = 60 * 60 * 1000;\n","/**\n * Marketplace Aggregator\n *\n * Fetches and indexes skills from multiple GitHub repositories.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type {\n SkillSource,\n MarketplaceSkill,\n MarketplaceIndex,\n MarketplaceSearchOptions,\n MarketplaceSearchResult,\n MarketplaceConfig,\n} from './types.js';\nimport {\n DEFAULT_SKILL_SOURCES,\n MARKETPLACE_CACHE_FILE,\n DEFAULT_CACHE_TTL,\n} from './types.js';\n\n/**\n * Marketplace Aggregator\n */\nexport class MarketplaceAggregator {\n private config: MarketplaceConfig;\n private cacheDir: string;\n private cachePath: string;\n private index: MarketplaceIndex | null = null;\n\n constructor(config: MarketplaceConfig = {}) {\n this.config = config;\n this.cacheDir = config.cacheDir || join(homedir(), '.skillkit', 'marketplace');\n this.cachePath = join(this.cacheDir, MARKETPLACE_CACHE_FILE);\n\n // Ensure cache directory exists\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n /**\n * Get all sources (default + custom)\n */\n getSources(): SkillSource[] {\n return [...DEFAULT_SKILL_SOURCES, ...(this.config.sources || [])];\n }\n\n /**\n * Load cached index\n */\n loadCache(): MarketplaceIndex | null {\n if (!existsSync(this.cachePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.cachePath, 'utf-8');\n const index = JSON.parse(content) as MarketplaceIndex;\n\n // Check if cache is expired\n const cacheAge = Date.now() - new Date(index.updatedAt).getTime();\n const ttl = this.config.cacheTTL || DEFAULT_CACHE_TTL;\n\n if (cacheAge > ttl) {\n return null; // Cache expired\n }\n\n this.index = index;\n return index;\n } catch {\n return null;\n }\n }\n\n /**\n * Save index to cache\n */\n saveCache(index: MarketplaceIndex): void {\n writeFileSync(this.cachePath, JSON.stringify(index, null, 2));\n this.index = index;\n }\n\n /**\n * Fetch skills from a single source\n */\n async fetchSource(source: SkillSource): Promise<MarketplaceSkill[]> {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n try {\n // Try to fetch skills index file\n const indexPaths = [\n source.indexPath,\n 'skills.json',\n 'index.json',\n '.skillkit/skills.json',\n ].filter(Boolean) as string[];\n\n for (const indexPath of indexPaths) {\n try {\n const url = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${indexPath}`;\n const response = await fetch(url);\n\n if (response.ok) {\n const data = (await response.json()) as unknown;\n\n if (Array.isArray(data)) {\n for (const item of data) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n\n const dataObj = data as Record<string, unknown>;\n if (dataObj.skills && Array.isArray(dataObj.skills)) {\n for (const item of dataObj.skills) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n }\n } catch {\n // Try next path\n }\n }\n\n // Fallback: Try to parse README for skill links\n const readmeUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/README.md`;\n const readmeResponse = await fetch(readmeUrl);\n\n if (readmeResponse.ok) {\n const readme = await readmeResponse.text();\n const parsedSkills = this.parseReadmeForSkills(readme, source);\n skills.push(...parsedSkills);\n }\n\n // If still no skills, add the repo itself as a skill source\n if (skills.length === 0) {\n skills.push({\n id: `${source.owner}/${source.repo}`,\n name: source.repo,\n description: source.description || `Skills from ${source.name}`,\n source,\n path: '/',\n tags: ['repository'],\n rawUrl: `https://github.com/${source.owner}/${source.repo}`,\n });\n }\n } catch (error) {\n console.error(`Failed to fetch skills from ${source.owner}/${source.repo}:`, error);\n }\n\n return skills;\n }\n\n /**\n * Check if a path is an absolute URL\n */\n private isAbsoluteUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n }\n\n /**\n * Convert a GitHub URL to raw content URL\n */\n private toRawUrl(url: string): string {\n return url\n .replace('://github.com/', '://raw.githubusercontent.com/')\n .replace('/blob/', '/');\n }\n\n /**\n * Parse a skill entry from JSON\n */\n private parseSkillEntry(\n item: Record<string, unknown>,\n source: SkillSource\n ): MarketplaceSkill {\n const name = String(item.name || item.title || 'Unknown');\n const path = String(item.path || item.file || item.url || '/');\n\n // Handle absolute URLs - use them directly instead of building from source\n const rawUrl = this.isAbsoluteUrl(path)\n ? this.toRawUrl(path)\n : this.buildRawUrl(source, path);\n\n return {\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description: String(item.description || item.desc || ''),\n source,\n path,\n version: item.version as string | undefined,\n author: item.author as string | undefined,\n tags: Array.isArray(item.tags) ? item.tags : [],\n agents: Array.isArray(item.agents) ? item.agents : undefined,\n stars: typeof item.stars === 'number' ? item.stars : undefined,\n updatedAt: item.updatedAt as string | undefined,\n downloads: typeof item.downloads === 'number' ? item.downloads : undefined,\n rawUrl,\n };\n }\n\n /**\n * Parse README for skill links\n */\n private parseReadmeForSkills(\n readme: string,\n source: SkillSource\n ): MarketplaceSkill[] {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n // Look for markdown links to skill files\n const linkPattern = /\\[([^\\]]+)\\]\\(([^)]+\\.md)\\)/g;\n let match;\n\n while ((match = linkPattern.exec(readme)) !== null) {\n const name = match[1];\n const path = match[2];\n\n // Skip external links and non-skill files\n if (path.startsWith('http') && !path.includes(source.repo)) {\n continue;\n }\n\n // Extract description from surrounding text\n const contextStart = Math.max(0, match.index - 200);\n const contextEnd = Math.min(readme.length, match.index + 200);\n const context = readme.slice(contextStart, contextEnd);\n\n // Try to find description in list item or paragraph\n const descMatch = context.match(/[-*]\\s*\\[.*?\\]\\(.*?\\)\\s*[-:]\\s*(.+?)(?:\\n|$)/);\n const description = descMatch ? descMatch[1].trim() : '';\n\n // Handle absolute URLs in README links\n const isAbsolute = this.isAbsoluteUrl(path);\n const normalizedPath = isAbsolute ? path : (path.startsWith('/') ? path : `/${path}`);\n const rawUrl = isAbsolute\n ? this.toRawUrl(path)\n : `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${path}`;\n\n skills.push({\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description,\n source,\n path: normalizedPath,\n tags: this.inferTags(name, description),\n rawUrl,\n });\n }\n\n return skills;\n }\n\n /**\n * Build raw URL for a skill\n */\n private buildRawUrl(source: SkillSource, path: string): string {\n const branch = source.branch || 'main';\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${cleanPath}`;\n }\n\n /**\n * Infer tags from name and description\n */\n private inferTags(name: string, description: string): string[] {\n const tags: string[] = [];\n const text = `${name} ${description}`.toLowerCase();\n\n const tagKeywords: Record<string, string[]> = {\n typescript: ['typescript', 'ts', 'tsc'],\n javascript: ['javascript', 'js', 'node'],\n react: ['react', 'jsx', 'tsx'],\n nextjs: ['next', 'nextjs', 'next.js'],\n testing: ['test', 'jest', 'vitest', 'mocha'],\n linting: ['lint', 'eslint', 'prettier'],\n auth: ['auth', 'authentication', 'login', 'oauth'],\n database: ['database', 'db', 'postgres', 'mysql', 'mongo'],\n api: ['api', 'rest', 'graphql'],\n devops: ['ci', 'cd', 'docker', 'kubernetes'],\n git: ['git', 'github', 'commit'],\n };\n\n for (const [tag, keywords] of Object.entries(tagKeywords)) {\n if (keywords.some((k) => text.includes(k))) {\n tags.push(tag);\n }\n }\n\n return tags;\n }\n\n /**\n * Refresh the marketplace index\n */\n async refresh(): Promise<MarketplaceIndex> {\n const sources = this.getSources();\n const allSkills: MarketplaceSkill[] = [];\n\n // Fetch from all sources in parallel\n const results = await Promise.all(\n sources.map((source) => this.fetchSource(source))\n );\n\n for (const skills of results) {\n allSkills.push(...skills);\n }\n\n // Create index\n const index: MarketplaceIndex = {\n version: 1,\n updatedAt: new Date().toISOString(),\n sources,\n skills: allSkills,\n totalCount: allSkills.length,\n };\n\n // Save to cache\n this.saveCache(index);\n\n return index;\n }\n\n /**\n * Get the marketplace index (from cache or refresh)\n */\n async getIndex(forceRefresh = false): Promise<MarketplaceIndex> {\n // Check in-memory cache first\n if (!forceRefresh && this.index) {\n return this.index;\n }\n\n // Check file cache\n if (!forceRefresh) {\n const cached = this.loadCache();\n if (cached) {\n return cached;\n }\n }\n\n return this.refresh();\n }\n\n /**\n * Search the marketplace\n */\n async search(options: MarketplaceSearchOptions = {}): Promise<MarketplaceSearchResult> {\n const index = await this.getIndex();\n let skills = [...index.skills];\n\n // Filter by query\n if (options.query) {\n const query = options.query.toLowerCase();\n skills = skills.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description.toLowerCase().includes(query) ||\n s.tags.some((t) => t.toLowerCase().includes(query))\n );\n }\n\n // Filter by tags\n if (options.tags && options.tags.length > 0) {\n skills = skills.filter((s) =>\n options.tags!.some((t) => s.tags.includes(t))\n );\n }\n\n // Filter by source\n if (options.source) {\n skills = skills.filter(\n (s) =>\n s.source.name === options.source ||\n `${s.source.owner}/${s.source.repo}` === options.source\n );\n }\n\n // Filter by agent\n if (options.agent) {\n skills = skills.filter(\n (s) => !s.agents || s.agents.includes(options.agent!)\n );\n }\n\n // Sort\n const sortBy = options.sortBy || 'name';\n const sortOrder = options.sortOrder || 'asc';\n\n skills.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'stars':\n comparison = (a.stars || 0) - (b.stars || 0);\n break;\n case 'downloads':\n comparison = (a.downloads || 0) - (b.downloads || 0);\n break;\n case 'updatedAt':\n comparison =\n new Date(a.updatedAt || 0).getTime() -\n new Date(b.updatedAt || 0).getTime();\n break;\n }\n\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n\n const total = skills.length;\n\n // Apply pagination\n if (options.offset) {\n skills = skills.slice(options.offset);\n }\n\n if (options.limit) {\n skills = skills.slice(0, options.limit);\n }\n\n return {\n skills,\n total,\n query: options.query,\n };\n }\n\n /**\n * Get a skill by ID\n */\n async getSkill(id: string): Promise<MarketplaceSkill | null> {\n const index = await this.getIndex();\n return index.skills.find((s) => s.id === id) || null;\n }\n\n /**\n * Get skill content\n */\n async getSkillContent(skill: MarketplaceSkill): Promise<string | null> {\n if (!skill.rawUrl) {\n return null;\n }\n\n try {\n const response = await fetch(skill.rawUrl);\n if (response.ok) {\n return response.text();\n }\n } catch {\n // Fetch failed\n }\n\n return null;\n }\n\n /**\n * Get popular tags\n */\n async getPopularTags(limit = 20): Promise<{ tag: string; count: number }[]> {\n const index = await this.getIndex();\n const tagCounts = new Map<string, number>();\n\n for (const skill of index.skills) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n\n const tags = Array.from(tagCounts.entries())\n .map(([tag, count]) => ({ tag, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n\n return tags;\n }\n\n /**\n * Add a custom source\n */\n addSource(source: SkillSource): void {\n if (!this.config.sources) {\n this.config.sources = [];\n }\n this.config.sources.push(source);\n this.clearCache();\n }\n\n /**\n * Remove a custom source\n */\n removeSource(owner: string, repo: string): void {\n if (this.config.sources) {\n this.config.sources = this.config.sources.filter(\n (s) => s.owner !== owner || s.repo !== repo\n );\n }\n this.clearCache();\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n if (existsSync(this.cachePath)) {\n unlinkSync(this.cachePath);\n }\n this.index = null;\n }\n}\n\n/**\n * Create a marketplace aggregator\n */\nexport function createMarketplaceAggregator(\n config?: MarketplaceConfig\n): MarketplaceAggregator {\n return new MarketplaceAggregator(config);\n}\n","/**\n * CI/CD Templates\n *\n * Provides templates for GitHub Actions, pre-commit hooks, and other CI/CD integrations.\n */\n\n/**\n * GitHub Action workflow for skill validation\n */\nexport const GITHUB_ACTION_TEMPLATE = `# Skill Validation Workflow\n# This workflow validates skills in your repository\n\nname: Validate Skills\n\non:\n push:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n\njobs:\n validate:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install SkillKit\n run: npm install -g skillkit\n\n - name: Validate Skills\n run: skillkit validate\n\n - name: Run Skill Tests\n run: skillkit test --json > test-results.json\n continue-on-error: true\n\n - name: Upload Test Results\n uses: actions/upload-artifact@v4\n with:\n name: skill-test-results\n path: test-results.json\n retention-days: 30\n\n - name: Check Test Results\n run: |\n if [ -f test-results.json ]; then\n passed=$(cat test-results.json | jq -r '.passed')\n if [ \"$passed\" = \"false\" ]; then\n echo \"Some skill tests failed\"\n exit 1\n fi\n fi\n`;\n\n/**\n * Pre-commit hook script for skill validation\n */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/bash\n# SkillKit Pre-commit Hook\n# Validates skills before commit\n\n# Colors for output\nRED='\\\\033[0;31m'\nGREEN='\\\\033[0;32m'\nYELLOW='\\\\033[0;33m'\nNC='\\\\033[0m' # No Color\n\necho -e \"\\${YELLOW}Running SkillKit validation...\\${NC}\"\n\n# Check if skillkit is installed\nif ! command -v skillkit &> /dev/null; then\n echo -e \"\\${RED}SkillKit not found. Install with: npm install -g skillkit\\${NC}\"\n exit 1\nfi\n\n# Get list of staged skill files\nSKILL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\\\.(md|mdc)$' | grep -E '(skills|.claude|.cursor)')\n\nif [ -z \"$SKILL_FILES\" ]; then\n echo -e \"\\${GREEN}No skill files staged, skipping validation.\\${NC}\"\n exit 0\nfi\n\necho \"Validating skill files:\"\necho \"$SKILL_FILES\"\n\n# Run validation\nif ! skillkit validate; then\n echo -e \"\\${RED}Skill validation failed. Please fix the errors and try again.\\${NC}\"\n exit 1\nfi\n\n# Run tests if any\nif skillkit test --json 2>/dev/null | jq -e '.passed == false' > /dev/null 2>&1; then\n echo -e \"\\${RED}Skill tests failed. Please fix the failing tests.\\${NC}\"\n exit 1\nfi\n\necho -e \"\\${GREEN}All skills validated successfully!\\${NC}\"\nexit 0\n`;\n\n/**\n * Pre-commit config for .pre-commit-config.yaml\n */\nexport const PRE_COMMIT_CONFIG_TEMPLATE = `# SkillKit Pre-commit Configuration\n# Add this to your .pre-commit-config.yaml\n\nrepos:\n - repo: local\n hooks:\n - id: skillkit-validate\n name: SkillKit Validate\n entry: skillkit validate\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n\n - id: skillkit-test\n name: SkillKit Test\n entry: skillkit test\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n`;\n\n/**\n * GitLab CI template\n */\nexport const GITLAB_CI_TEMPLATE = `# SkillKit GitLab CI Configuration\n# Add this to your .gitlab-ci.yml\n\nskill-validation:\n image: node:20\n stage: test\n before_script:\n - npm install -g skillkit\n script:\n - skillkit validate\n - skillkit test --json > test-results.json\n artifacts:\n # Note: test-results.json is JSON format, not JUnit XML\n paths:\n - test-results.json\n expire_in: 30 days\n rules:\n - changes:\n - \".claude/skills/**\"\n - \".cursor/skills/**\"\n - \"skills/**\"\n`;\n\n/**\n * CircleCI config template\n */\nexport const CIRCLECI_CONFIG_TEMPLATE = `# SkillKit CircleCI Configuration\n# Add this to your .circleci/config.yml\n\nversion: 2.1\n\njobs:\n validate-skills:\n docker:\n - image: cimg/node:20.0\n steps:\n - checkout\n - run:\n name: Install SkillKit\n command: npm install -g skillkit\n - run:\n name: Validate Skills\n command: skillkit validate\n - run:\n name: Run Skill Tests\n command: skillkit test --json > test-results.json\n - store_artifacts:\n path: test-results.json\n destination: skill-tests\n\nworkflows:\n skill-validation:\n jobs:\n - validate-skills:\n filters:\n branches:\n only: /.*/\n`;\n\n/**\n * Get a CI/CD template by name\n */\nexport function getCICDTemplate(name: string): string | null {\n switch (name.toLowerCase()) {\n case 'github':\n case 'github-action':\n case 'github-actions':\n return GITHUB_ACTION_TEMPLATE;\n case 'pre-commit':\n case 'pre-commit-hook':\n return PRE_COMMIT_HOOK_TEMPLATE;\n case 'pre-commit-config':\n return PRE_COMMIT_CONFIG_TEMPLATE;\n case 'gitlab':\n case 'gitlab-ci':\n return GITLAB_CI_TEMPLATE;\n case 'circleci':\n case 'circle-ci':\n return CIRCLECI_CONFIG_TEMPLATE;\n default:\n return null;\n }\n}\n\n/**\n * List available CI/CD templates\n */\nexport function listCICDTemplates(): { name: string; description: string }[] {\n return [\n { name: 'github-action', description: 'GitHub Actions workflow for skill validation' },\n { name: 'pre-commit-hook', description: 'Git pre-commit hook script' },\n { name: 'pre-commit-config', description: 'pre-commit framework configuration' },\n { name: 'gitlab-ci', description: 'GitLab CI configuration' },\n { name: 'circleci', description: 'CircleCI configuration' },\n ];\n}\n","import type { AgentType } from '../types.js';\n\nexport type ObservationType =\n | 'tool_use'\n | 'decision'\n | 'error'\n | 'solution'\n | 'pattern'\n | 'file_change'\n | 'checkpoint';\n\nexport interface ObservationContent {\n action: string;\n context: string;\n result?: string;\n files?: string[];\n tags?: string[];\n error?: string;\n solution?: string;\n}\n\nexport interface Observation {\n id: string;\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n type: ObservationType;\n content: ObservationContent;\n relevance: number;\n}\n\nexport interface Learning {\n id: string;\n createdAt: string;\n updatedAt: string;\n source: 'session' | 'manual' | 'imported';\n sourceObservations?: string[];\n\n title: string;\n content: string;\n\n scope: 'project' | 'global';\n project?: string;\n\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n\n useCount: number;\n lastUsed?: string;\n effectiveness?: number;\n}\n\nexport interface MemoryIndex {\n version: 1;\n lastUpdated: string;\n entries: Record<string, string[]>;\n tags: Record<string, string[]>;\n}\n\nexport interface MemorySummary {\n id: string;\n title: string;\n tags: string[];\n relevance: number;\n}\n\nexport interface MemoryPreview extends MemorySummary {\n excerpt: string;\n lastUsed?: string;\n}\n\nexport interface MemoryFull extends MemoryPreview {\n content: string;\n sourceObservations?: Observation[];\n}\n\nexport interface ObservationStoreData {\n version: 1;\n sessionId: string;\n observations: Observation[];\n}\n\nexport interface LearningStoreData {\n version: 1;\n learnings: Learning[];\n}\n\nexport interface MemoryConfig {\n autoCompress: boolean;\n compressionThreshold: number;\n compressionModel?: string;\n maxObservations: number;\n maxLearnings: number;\n}\n\nexport const DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n autoCompress: true,\n compressionThreshold: 50,\n maxObservations: 1000,\n maxLearnings: 500,\n};\n\nexport interface MemorySearchOptions {\n query?: string;\n tags?: string[];\n scope?: 'project' | 'global' | 'all';\n limit?: number;\n minRelevance?: number;\n}\n\nexport interface MemorySearchResult {\n learning: Learning;\n score: number;\n matchedKeywords: string[];\n matchedTags: string[];\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type {\n Observation,\n ObservationContent,\n ObservationStoreData,\n ObservationType,\n} from './types.js';\nimport type { AgentType } from '../types.js';\n\nexport class ObservationStore {\n private readonly filePath: string;\n private data: ObservationStoreData | null = null;\n private sessionId: string;\n\n constructor(projectPath: string, sessionId?: string) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'observations.yaml');\n this.sessionId = sessionId || randomUUID();\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): ObservationStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as ObservationStoreData;\n if (this.data.sessionId !== this.sessionId) {\n this.data.sessionId = this.sessionId;\n this.data.observations = [];\n }\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): ObservationStoreData {\n return {\n version: 1,\n sessionId: this.sessionId,\n observations: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(\n type: ObservationType,\n content: ObservationContent,\n agent: AgentType,\n relevance = 50\n ): Observation {\n const data = this.load();\n\n const observation: Observation = {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n agent,\n type,\n content,\n relevance,\n };\n\n data.observations.push(observation);\n this.save();\n\n return observation;\n }\n\n getAll(): Observation[] {\n return this.load().observations;\n }\n\n getByType(type: ObservationType): Observation[] {\n return this.load().observations.filter((o) => o.type === type);\n }\n\n getByRelevance(minRelevance: number): Observation[] {\n return this.load().observations.filter((o) => o.relevance >= minRelevance);\n }\n\n getRecent(count: number): Observation[] {\n const observations = this.load().observations;\n return observations.slice(-count);\n }\n\n getUncompressed(compressedIds: string[]): Observation[] {\n const compressedSet = new Set(compressedIds);\n return this.load().observations.filter((o) => !compressedSet.has(o.id));\n }\n\n count(): number {\n return this.load().observations.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n getById(id: string): Observation | undefined {\n return this.load().observations.find((o) => o.id === id);\n }\n\n getByIds(ids: string[]): Observation[] {\n const idSet = new Set(ids);\n return this.load().observations.filter((o) => idSet.has(o.id));\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n if (this.data) {\n this.data.sessionId = sessionId;\n }\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.observations.findIndex((o) => o.id === id);\n\n if (index === -1) return false;\n\n data.observations.splice(index, 1);\n this.save();\n return true;\n }\n\n deleteMany(ids: string[]): number {\n const idSet = new Set(ids);\n const data = this.load();\n const initialLength = data.observations.length;\n\n data.observations = data.observations.filter((o) => !idSet.has(o.id));\n\n if (data.observations.length !== initialLength) {\n this.save();\n }\n\n return initialLength - data.observations.length;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type { Learning, LearningStoreData } from './types.js';\n\nexport class LearningStore {\n private readonly filePath: string;\n private readonly scope: 'project' | 'global';\n private readonly projectName?: string;\n private data: LearningStoreData | null = null;\n\n constructor(\n scope: 'project' | 'global',\n projectPath?: string,\n projectName?: string\n ) {\n this.scope = scope;\n this.projectName = projectName;\n\n if (scope === 'project' && projectPath) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'learnings.yaml');\n } else {\n this.filePath = join(homedir(), '.skillkit', 'memory', 'global.yaml');\n }\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): LearningStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as LearningStoreData;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): LearningStoreData {\n return {\n version: 1,\n learnings: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(learning: Omit<Learning, 'id' | 'createdAt' | 'updatedAt' | 'useCount' | 'scope' | 'project'>): Learning {\n const data = this.load();\n const now = new Date().toISOString();\n\n const newLearning: Learning = {\n ...learning,\n id: randomUUID(),\n createdAt: now,\n updatedAt: now,\n useCount: 0,\n scope: this.scope,\n project: this.projectName,\n };\n\n data.learnings.push(newLearning);\n this.save();\n\n return newLearning;\n }\n\n update(id: string, updates: Partial<Omit<Learning, 'id' | 'createdAt'>>): Learning | null {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return null;\n\n data.learnings[index] = {\n ...data.learnings[index],\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.save();\n return data.learnings[index];\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return false;\n\n data.learnings.splice(index, 1);\n this.save();\n return true;\n }\n\n getAll(): Learning[] {\n return this.load().learnings;\n }\n\n getById(id: string): Learning | undefined {\n return this.load().learnings.find((l) => l.id === id);\n }\n\n getByTags(tags: string[]): Learning[] {\n const tagSet = new Set(tags.map((t) => t.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.tags.some((t) => tagSet.has(t.toLowerCase()))\n );\n }\n\n getByFrameworks(frameworks: string[]): Learning[] {\n const fwSet = new Set(frameworks.map((f) => f.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.frameworks?.some((f) => fwSet.has(f.toLowerCase()))\n );\n }\n\n getRecent(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings]\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, count);\n }\n\n getMostUsed(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings].sort((a, b) => b.useCount - a.useCount).slice(0, count);\n }\n\n getMostEffective(count: number): Learning[] {\n const learnings = this.load().learnings.filter((l) => l.effectiveness !== undefined);\n return [...learnings]\n .sort((a, b) => (b.effectiveness || 0) - (a.effectiveness || 0))\n .slice(0, count);\n }\n\n incrementUseCount(id: string): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.useCount += 1;\n learning.lastUsed = new Date().toISOString();\n this.save();\n }\n }\n\n setEffectiveness(id: string, effectiveness: number): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.effectiveness = Math.max(0, Math.min(100, effectiveness));\n learning.updatedAt = new Date().toISOString();\n this.save();\n }\n }\n\n search(query: string): Learning[] {\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter((w) => w.length > 2);\n\n return this.load().learnings.filter((l) => {\n const titleMatch = l.title.toLowerCase().includes(queryLower);\n const contentMatch = l.content.toLowerCase().includes(queryLower);\n const tagMatch = l.tags.some((t) => t.toLowerCase().includes(queryLower));\n const wordMatch = queryWords.some(\n (word) =>\n l.title.toLowerCase().includes(word) ||\n l.content.toLowerCase().includes(word)\n );\n\n return titleMatch || contentMatch || tagMatch || wordMatch;\n });\n }\n\n count(): number {\n return this.load().learnings.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getScope(): 'project' | 'global' {\n return this.scope;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { Learning, MemoryIndex } from './types.js';\n\nexport class MemoryIndexStore {\n private readonly filePath: string;\n private data: MemoryIndex | null = null;\n\n constructor(basePath: string, _isGlobal = false) {\n // Both global and project use .skillkit subdirectory\n // Global: ~/.skillkit/memory/index.yaml (basePath = homedir())\n // Project: <projectPath>/.skillkit/memory/index.yaml (basePath = projectPath)\n // Note: _isGlobal kept for API compatibility but basePath determines the actual path\n this.filePath = join(basePath, '.skillkit', 'memory', 'index.yaml');\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): MemoryIndex {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as MemoryIndex;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): MemoryIndex {\n return {\n version: 1,\n lastUpdated: new Date().toISOString(),\n entries: {},\n tags: {},\n };\n }\n\n private save(): void {\n this.ensureDir();\n if (this.data) {\n this.data.lastUpdated = new Date().toISOString();\n }\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n private extractKeywords(text: string): string[] {\n // Extract meaningful keywords from text\n const stopWords = new Set([\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'i', 'you', 'we', 'they', 'he', 'she',\n ]);\n\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n\n return [...new Set(words)];\n }\n\n indexLearning(learning: Learning): void {\n const data = this.load();\n\n // Extract keywords from title and content\n const titleKeywords = this.extractKeywords(learning.title);\n const contentKeywords = this.extractKeywords(learning.content);\n const allKeywords = [...new Set([...titleKeywords, ...contentKeywords])];\n\n // Index by keywords\n for (const keyword of allKeywords) {\n if (!data.entries[keyword]) {\n data.entries[keyword] = [];\n }\n if (!data.entries[keyword].includes(learning.id)) {\n data.entries[keyword].push(learning.id);\n }\n }\n\n // Index by tags\n for (const tag of learning.tags) {\n const normalizedTag = tag.toLowerCase();\n if (!data.tags[normalizedTag]) {\n data.tags[normalizedTag] = [];\n }\n if (!data.tags[normalizedTag].includes(learning.id)) {\n data.tags[normalizedTag].push(learning.id);\n }\n }\n\n // Index by frameworks if present\n if (learning.frameworks) {\n for (const framework of learning.frameworks) {\n const normalizedFw = framework.toLowerCase();\n if (!data.tags[normalizedFw]) {\n data.tags[normalizedFw] = [];\n }\n if (!data.tags[normalizedFw].includes(learning.id)) {\n data.tags[normalizedFw].push(learning.id);\n }\n }\n }\n\n this.save();\n }\n\n removeLearning(learningId: string): void {\n const data = this.load();\n\n // Remove from keyword entries\n for (const keyword of Object.keys(data.entries)) {\n data.entries[keyword] = data.entries[keyword].filter((id) => id !== learningId);\n if (data.entries[keyword].length === 0) {\n delete data.entries[keyword];\n }\n }\n\n // Remove from tags\n for (const tag of Object.keys(data.tags)) {\n data.tags[tag] = data.tags[tag].filter((id) => id !== learningId);\n if (data.tags[tag].length === 0) {\n delete data.tags[tag];\n }\n }\n\n this.save();\n }\n\n searchByKeywords(query: string): string[] {\n const data = this.load();\n const keywords = this.extractKeywords(query);\n\n if (keywords.length === 0) return [];\n\n // Find IDs that match any keyword\n const matchCounts = new Map<string, number>();\n\n for (const keyword of keywords) {\n // Exact match\n if (data.entries[keyword]) {\n for (const id of data.entries[keyword]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 2);\n }\n }\n\n // Partial match (keyword is substring of indexed word, but not exact match)\n for (const [indexed, ids] of Object.entries(data.entries)) {\n // Skip exact matches - they're already counted above with higher weight\n if (indexed === keyword) continue;\n if (indexed.includes(keyword) || keyword.includes(indexed)) {\n for (const id of ids) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n }\n\n // Sort by match count (most matches first)\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n searchByTags(tags: string[]): string[] {\n const data = this.load();\n const normalizedTags = tags.map((t) => t.toLowerCase());\n\n const matchCounts = new Map<string, number>();\n\n for (const tag of normalizedTags) {\n if (data.tags[tag]) {\n for (const id of data.tags[tag]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n\n // Sort by match count\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n search(query: string, tags?: string[]): string[] {\n const keywordResults = this.searchByKeywords(query);\n const tagResults = tags ? this.searchByTags(tags) : [];\n\n if (!tags || tags.length === 0) {\n return keywordResults;\n }\n\n if (!query || query.trim().length === 0) {\n return tagResults;\n }\n\n // Combine results, prioritizing items that match both\n const keywordSet = new Set(keywordResults);\n const tagSet = new Set(tagResults);\n\n const both: string[] = [];\n const keywordOnly: string[] = [];\n const tagOnly: string[] = [];\n\n for (const id of keywordResults) {\n if (tagSet.has(id)) {\n both.push(id);\n } else {\n keywordOnly.push(id);\n }\n }\n\n for (const id of tagResults) {\n if (!keywordSet.has(id)) {\n tagOnly.push(id);\n }\n }\n\n return [...both, ...keywordOnly, ...tagOnly];\n }\n\n getAllTags(): string[] {\n const data = this.load();\n return Object.keys(data.tags).sort();\n }\n\n getTagCounts(): Record<string, number> {\n const data = this.load();\n const counts: Record<string, number> = {};\n for (const [tag, ids] of Object.entries(data.tags)) {\n counts[tag] = ids.length;\n }\n return counts;\n }\n\n rebuildIndex(learnings: Learning[]): void {\n // Clear existing index\n this.data = this.createEmpty();\n\n // Re-index all learnings\n for (const learning of learnings) {\n this.indexLearning(learning);\n }\n\n this.save();\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getStats(): { keywords: number; tags: number; lastUpdated: string } {\n const data = this.load();\n return {\n keywords: Object.keys(data.entries).length,\n tags: Object.keys(data.tags).length,\n lastUpdated: data.lastUpdated,\n };\n }\n}\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MemoryPaths {\n projectMemoryDir: string;\n globalMemoryDir: string;\n observationsFile: string;\n learningsFile: string;\n indexFile: string;\n globalLearningsFile: string;\n globalIndexFile: string;\n}\n\nexport function getMemoryPaths(projectPath: string): MemoryPaths {\n const projectMemoryDir = join(projectPath, '.skillkit', 'memory');\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n\n return {\n projectMemoryDir,\n globalMemoryDir,\n observationsFile: join(projectMemoryDir, 'observations.yaml'),\n learningsFile: join(projectMemoryDir, 'learnings.yaml'),\n indexFile: join(projectMemoryDir, 'index.yaml'),\n globalLearningsFile: join(globalMemoryDir, 'global.yaml'),\n globalIndexFile: join(globalMemoryDir, 'index.yaml'),\n };\n}\n\nexport function initializeMemoryDirectory(projectPath: string): MemoryPaths {\n const paths = getMemoryPaths(projectPath);\n\n // Create project memory directory\n if (!existsSync(paths.projectMemoryDir)) {\n mkdirSync(paths.projectMemoryDir, { recursive: true });\n }\n\n // Create global memory directory\n if (!existsSync(paths.globalMemoryDir)) {\n mkdirSync(paths.globalMemoryDir, { recursive: true });\n }\n\n return paths;\n}\n\nexport function memoryDirectoryExists(projectPath: string): boolean {\n const paths = getMemoryPaths(projectPath);\n return existsSync(paths.projectMemoryDir);\n}\n\nexport function globalMemoryDirectoryExists(): boolean {\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n return existsSync(globalMemoryDir);\n}\n\nexport interface MemoryStatus {\n projectMemoryExists: boolean;\n globalMemoryExists: boolean;\n hasObservations: boolean;\n hasLearnings: boolean;\n hasGlobalLearnings: boolean;\n hasIndex: boolean;\n hasGlobalIndex: boolean;\n}\n\nexport function getMemoryStatus(projectPath: string): MemoryStatus {\n const paths = getMemoryPaths(projectPath);\n\n return {\n projectMemoryExists: existsSync(paths.projectMemoryDir),\n globalMemoryExists: existsSync(paths.globalMemoryDir),\n hasObservations: existsSync(paths.observationsFile),\n hasLearnings: existsSync(paths.learningsFile),\n hasGlobalLearnings: existsSync(paths.globalLearningsFile),\n hasIndex: existsSync(paths.indexFile),\n hasGlobalIndex: existsSync(paths.globalIndexFile),\n };\n}\n","/**\n * Memory Observer\n *\n * Captures observations during skill execution and stores them in the ObservationStore.\n * Provides intelligent filtering to capture only significant events.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ExecutionProgressEvent } from '../executor/engine.js';\nimport type { ObservationType, ObservationContent, Observation } from './types.js';\nimport { ObservationStore } from './observation-store.js';\n\n/**\n * Event types that can be observed\n */\nexport type ObservableEventType =\n | 'task_start'\n | 'task_complete'\n | 'task_failed'\n | 'checkpoint_reached'\n | 'checkpoint_decision'\n | 'verification_passed'\n | 'verification_failed'\n | 'file_modified'\n | 'error_encountered'\n | 'solution_applied'\n | 'execution_start'\n | 'execution_complete'\n | 'execution_paused';\n\n/**\n * Observable event structure\n */\nexport interface ObservableEvent {\n type: ObservableEventType;\n timestamp: string;\n skillName?: string;\n taskId?: string;\n taskName?: string;\n taskAction?: string;\n files?: string[];\n error?: string;\n output?: string;\n decision?: string;\n context?: string;\n}\n\n/**\n * Observer configuration\n */\nexport interface MemoryObserverConfig {\n /** Minimum relevance score to store (0-100) */\n minRelevance?: number;\n /** Whether to capture task starts */\n captureTaskStarts?: boolean;\n /** Whether to capture checkpoints */\n captureCheckpoints?: boolean;\n /** Whether to capture file modifications */\n captureFileModifications?: boolean;\n /** Whether to capture errors */\n captureErrors?: boolean;\n /** Whether to capture solutions */\n captureSolutions?: boolean;\n /** Custom relevance scorer */\n relevanceScorer?: (event: ObservableEvent) => number;\n}\n\nconst DEFAULT_CONFIG: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> = {\n minRelevance: 30,\n captureTaskStarts: false, // Task starts are usually low-value\n captureCheckpoints: true,\n captureFileModifications: true,\n captureErrors: true,\n captureSolutions: true,\n};\n\n/**\n * Memory Observer\n *\n * Captures and filters observations during skill execution.\n */\nexport class MemoryObserver {\n private store: ObservationStore;\n private config: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> & {\n relevanceScorer?: (event: ObservableEvent) => number;\n };\n private currentAgent: AgentType = 'claude-code';\n private currentSkillName?: string;\n private pendingErrors: Map<string, ObservableEvent> = new Map();\n\n constructor(projectPath: string, sessionId?: string, config?: MemoryObserverConfig) {\n this.store = new ObservationStore(projectPath, sessionId);\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Set the current agent being used\n */\n setAgent(agent: AgentType): void {\n this.currentAgent = agent;\n }\n\n /**\n * Set the current skill being executed\n */\n setSkillName(skillName: string): void {\n this.currentSkillName = skillName;\n }\n\n /**\n * Get the underlying observation store\n */\n getStore(): ObservationStore {\n return this.store;\n }\n\n /**\n * Observe an event and potentially store it\n */\n observe(event: ObservableEvent): Observation | null {\n // Check if we should capture this event type\n if (!this.shouldCapture(event)) {\n return null;\n }\n\n // Classify the event into an observation type\n const observationType = this.classifyEvent(event);\n\n // Extract content from the event\n const content = this.extractContent(event);\n\n // Score relevance\n const relevance = this.scoreRelevance(event);\n\n // Check minimum relevance threshold\n if (relevance < this.config.minRelevance) {\n return null;\n }\n\n // Store the observation\n return this.store.add(observationType, content, this.currentAgent, relevance);\n }\n\n /**\n * Create an observation callback for the SkillExecutionEngine\n */\n createProgressCallback(): (event: ExecutionProgressEvent) => void {\n return (progressEvent: ExecutionProgressEvent) => {\n const observableEvent = this.convertProgressEvent(progressEvent);\n if (observableEvent) {\n this.observe(observableEvent);\n }\n };\n }\n\n /**\n * Convert ExecutionProgressEvent to ObservableEvent\n */\n private convertProgressEvent(event: ExecutionProgressEvent): ObservableEvent | null {\n const baseEvent = {\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId: event.taskId,\n taskName: event.taskName,\n };\n\n switch (event.type) {\n case 'task_start':\n return {\n ...baseEvent,\n type: 'task_start',\n context: `Starting task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'task_complete':\n if (event.status === 'failed') {\n return {\n ...baseEvent,\n type: 'task_failed',\n error: event.error,\n context: event.message,\n };\n }\n return {\n ...baseEvent,\n type: 'task_complete',\n output: event.message,\n context: `Completed task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'checkpoint':\n return {\n ...baseEvent,\n type: 'checkpoint_reached',\n context: event.message,\n };\n\n case 'verification':\n const passed = event.message?.includes('passed');\n return {\n ...baseEvent,\n type: passed ? 'verification_passed' : 'verification_failed',\n context: event.message,\n error: passed ? undefined : event.message,\n };\n\n case 'complete':\n return {\n ...baseEvent,\n type: 'execution_complete',\n context: event.message,\n error: event.status === 'failed' ? event.message : undefined,\n };\n\n default:\n return null;\n }\n }\n\n /**\n * Record a file modification event\n */\n recordFileModification(files: string[], context: string): Observation | null {\n return this.observe({\n type: 'file_modified',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n files,\n context,\n });\n }\n\n /**\n * Record an error event\n */\n recordError(error: string, context: string, taskId?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'error_encountered',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId,\n error,\n context,\n };\n\n // Store pending error for potential solution matching\n const errorKey = this.generateErrorKey(error);\n this.pendingErrors.set(errorKey, event);\n\n return this.observe(event);\n }\n\n /**\n * Record a solution event (potentially matching a previous error)\n */\n recordSolution(solution: string, context: string, relatedError?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'solution_applied',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n output: solution,\n context,\n error: relatedError,\n };\n\n // If we can match this to a pending error, increase relevance\n if (relatedError) {\n const errorKey = this.generateErrorKey(relatedError);\n this.pendingErrors.delete(errorKey);\n }\n\n return this.observe(event);\n }\n\n /**\n * Record a decision event\n */\n recordDecision(decision: string, options: string[], context: string): Observation | null {\n return this.observe({\n type: 'checkpoint_decision',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n decision,\n context: `Decision: ${decision} (options: ${options.join(', ')}). Context: ${context}`,\n });\n }\n\n /**\n * Record execution start\n */\n recordExecutionStart(skillName: string, agent: AgentType): Observation | null {\n this.currentSkillName = skillName;\n this.currentAgent = agent;\n\n return this.observe({\n type: 'execution_start',\n timestamp: new Date().toISOString(),\n skillName,\n context: `Started execution of skill \"${skillName}\" with agent \"${agent}\"`,\n });\n }\n\n /**\n * Record execution pause\n */\n recordExecutionPause(reason?: string): Observation | null {\n return this.observe({\n type: 'execution_paused',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n context: reason || 'Execution paused',\n });\n }\n\n /**\n * Check if we should capture this event type\n */\n private shouldCapture(event: ObservableEvent): boolean {\n switch (event.type) {\n case 'task_start':\n return this.config.captureTaskStarts;\n case 'checkpoint_reached':\n case 'checkpoint_decision':\n return this.config.captureCheckpoints;\n case 'file_modified':\n return this.config.captureFileModifications;\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return this.config.captureErrors;\n case 'solution_applied':\n return this.config.captureSolutions;\n default:\n return true;\n }\n }\n\n /**\n * Classify event into observation type\n */\n private classifyEvent(event: ObservableEvent): ObservationType {\n switch (event.type) {\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return 'error';\n\n case 'solution_applied':\n return 'solution';\n\n case 'checkpoint_decision':\n return 'decision';\n\n case 'file_modified':\n return 'file_change';\n\n case 'execution_paused':\n case 'checkpoint_reached':\n return 'checkpoint';\n\n case 'task_start':\n case 'task_complete':\n case 'verification_passed':\n case 'execution_start':\n case 'execution_complete':\n default:\n return 'tool_use';\n }\n }\n\n /**\n * Extract content from event\n */\n private extractContent(event: ObservableEvent): ObservationContent {\n const content: ObservationContent = {\n action: this.getActionDescription(event),\n context: event.context || this.generateContext(event),\n };\n\n if (event.output) {\n content.result = event.output;\n }\n\n if (event.files && event.files.length > 0) {\n content.files = event.files;\n }\n\n if (event.error) {\n content.error = event.error;\n }\n\n if (event.type === 'solution_applied' && event.output) {\n content.solution = event.output;\n }\n\n // Generate tags based on event\n content.tags = this.generateTags(event);\n\n return content;\n }\n\n /**\n * Get action description from event\n */\n private getActionDescription(event: ObservableEvent): string {\n switch (event.type) {\n case 'task_start':\n return `Started task: ${event.taskName || 'unknown'}`;\n case 'task_complete':\n return `Completed task: ${event.taskName || 'unknown'}`;\n case 'task_failed':\n return `Task failed: ${event.taskName || 'unknown'}`;\n case 'checkpoint_reached':\n return `Checkpoint: ${event.taskName || 'unknown'}`;\n case 'checkpoint_decision':\n return `Decision made: ${event.decision || 'unknown'}`;\n case 'verification_passed':\n return `Verification passed: ${event.taskName || 'unknown'}`;\n case 'verification_failed':\n return `Verification failed: ${event.taskName || 'unknown'}`;\n case 'file_modified':\n return `Modified files: ${event.files?.join(', ') || 'unknown'}`;\n case 'error_encountered':\n return `Error: ${event.error?.slice(0, 100) || 'unknown'}`;\n case 'solution_applied':\n return `Solution applied: ${event.output?.slice(0, 100) || 'unknown'}`;\n case 'execution_start':\n return `Started skill: ${event.skillName || 'unknown'}`;\n case 'execution_complete':\n return `Completed skill: ${event.skillName || 'unknown'}`;\n case 'execution_paused':\n return `Paused skill: ${event.skillName || 'unknown'}`;\n default:\n return 'Unknown action';\n }\n }\n\n /**\n * Generate context if not provided\n */\n private generateContext(event: ObservableEvent): string {\n const parts: string[] = [];\n\n if (event.skillName) {\n parts.push(`Skill: ${event.skillName}`);\n }\n\n if (event.taskName) {\n parts.push(`Task: ${event.taskName}`);\n }\n\n if (event.taskAction) {\n parts.push(`Action: ${event.taskAction}`);\n }\n\n return parts.join(' | ') || 'No context available';\n }\n\n /**\n * Generate tags for event\n */\n private generateTags(event: ObservableEvent): string[] {\n const tags: string[] = [];\n\n // Add event type as tag\n tags.push(event.type.replace(/_/g, '-'));\n\n // Add skill name if present\n if (event.skillName) {\n tags.push(event.skillName.toLowerCase().replace(/[^a-z0-9-]/g, '-'));\n }\n\n // Add error-related tags\n if (event.error) {\n if (event.error.toLowerCase().includes('type')) tags.push('typescript');\n if (event.error.toLowerCase().includes('import')) tags.push('imports');\n if (event.error.toLowerCase().includes('null') || event.error.toLowerCase().includes('undefined'))\n tags.push('null-check');\n if (event.error.toLowerCase().includes('async') || event.error.toLowerCase().includes('await'))\n tags.push('async');\n }\n\n // Add file-related tags\n if (event.files) {\n for (const file of event.files) {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) tags.push('typescript');\n if (file.endsWith('.js') || file.endsWith('.jsx')) tags.push('javascript');\n if (file.endsWith('.css') || file.endsWith('.scss')) tags.push('styles');\n if (file.includes('test') || file.includes('spec')) tags.push('testing');\n if (file.includes('component')) tags.push('components');\n }\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score relevance of event\n */\n private scoreRelevance(event: ObservableEvent): number {\n // Use custom scorer if provided\n if (this.config.relevanceScorer) {\n return this.config.relevanceScorer(event);\n }\n\n // Default relevance scoring\n let score = 50; // Base score\n\n switch (event.type) {\n // High relevance events\n case 'error_encountered':\n case 'task_failed':\n score = 85;\n break;\n\n case 'solution_applied':\n score = 90;\n // Bonus if it matches a pending error\n if (event.error) {\n const errorKey = this.generateErrorKey(event.error);\n if (this.pendingErrors.has(errorKey)) {\n score = 95;\n }\n }\n break;\n\n case 'checkpoint_decision':\n score = 75;\n break;\n\n case 'verification_failed':\n score = 80;\n break;\n\n // Medium relevance events\n case 'file_modified':\n score = 60;\n // More files = higher relevance\n if (event.files && event.files.length > 3) {\n score = 70;\n }\n break;\n\n case 'checkpoint_reached':\n score = 55;\n break;\n\n case 'task_complete':\n case 'verification_passed':\n score = 50;\n break;\n\n // Lower relevance events\n case 'task_start':\n score = 30;\n break;\n\n case 'execution_start':\n case 'execution_complete':\n score = 40;\n break;\n\n case 'execution_paused':\n score = 60;\n break;\n\n default:\n score = 50;\n }\n\n // Adjust based on content richness\n if (event.context && event.context.length > 100) {\n score += 5;\n }\n\n if (event.files && event.files.length > 0) {\n score += 5;\n }\n\n // Cap at 100\n return Math.min(score, 100);\n }\n\n /**\n * Generate a key for matching errors to solutions\n */\n private generateErrorKey(error: string): string {\n // Normalize error string for matching\n return error\n .toLowerCase()\n .replace(/[0-9]+/g, 'N') // Replace numbers\n .replace(/['\"`]/g, '') // Remove quotes\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .slice(0, 100); // Limit length\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string {\n return this.store.getSessionId();\n }\n\n /**\n * Get all observations\n */\n getObservations(): Observation[] {\n return this.store.getAll();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.store.count();\n }\n\n /**\n * Clear all observations\n */\n clear(): void {\n this.store.clear();\n this.pendingErrors.clear();\n }\n}\n\n/**\n * Create a MemoryObserver instance\n */\nexport function createMemoryObserver(\n projectPath: string,\n sessionId?: string,\n config?: MemoryObserverConfig\n): MemoryObserver {\n return new MemoryObserver(projectPath, sessionId, config);\n}\n","/**\n * Memory-Enabled Execution Engine Integration\n *\n * Provides utilities to integrate MemoryObserver with SkillExecutionEngine.\n */\n\nimport type { AgentType } from '../types.js';\nimport {\n SkillExecutionEngine,\n createExecutionEngine,\n type ExecutionProgressCallback,\n type ExecutionProgressEvent,\n} from '../executor/engine.js';\nimport type { CheckpointHandler, ExecutionOptions, ExecutableSkill } from '../executor/types.js';\nimport { MemoryObserver, type MemoryObserverConfig } from './observer.js';\n\n/**\n * Options for creating a memory-enabled execution engine\n */\nexport interface MemoryEnabledEngineOptions {\n /** Checkpoint handler for interactive checkpoints */\n checkpointHandler?: CheckpointHandler;\n /** Additional progress callback (called alongside memory observer) */\n onProgress?: ExecutionProgressCallback;\n /** Memory observer configuration */\n memoryConfig?: MemoryObserverConfig;\n /** Session ID for the memory observer */\n sessionId?: string;\n /** Default agent type */\n defaultAgent?: AgentType;\n}\n\n/**\n * Memory-enabled execution engine wrapper\n */\nexport class MemoryEnabledEngine {\n private engine: SkillExecutionEngine;\n private observer: MemoryObserver;\n private userProgressCallback?: ExecutionProgressCallback;\n\n constructor(projectPath: string, options: MemoryEnabledEngineOptions = {}) {\n // Create memory observer\n this.observer = new MemoryObserver(projectPath, options.sessionId, options.memoryConfig);\n\n // Set default agent if provided\n if (options.defaultAgent) {\n this.observer.setAgent(options.defaultAgent);\n }\n\n // Store user's progress callback\n this.userProgressCallback = options.onProgress;\n\n // Create the combined progress callback\n const combinedProgressCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n // Forward to memory observer\n const observerCallback = this.observer.createProgressCallback();\n observerCallback(event);\n\n // Forward to user's callback if provided\n if (this.userProgressCallback) {\n this.userProgressCallback(event);\n }\n };\n\n // Create the underlying engine with the combined callback\n this.engine = createExecutionEngine(projectPath, {\n checkpointHandler: options.checkpointHandler,\n onProgress: combinedProgressCallback,\n });\n }\n\n /**\n * Execute a skill with memory observation\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): ReturnType<SkillExecutionEngine['execute']> {\n // Set skill name in observer\n this.observer.setSkillName(skill.name);\n\n // Set agent if provided in options\n if (options.agent) {\n this.observer.setAgent(options.agent);\n }\n\n // Record execution start\n this.observer.recordExecutionStart(skill.name, options.agent || 'claude-code');\n\n try {\n // Execute the skill\n const result = await this.engine.execute(skill, options);\n\n // Record file modifications from result\n if (result.filesModified.length > 0) {\n this.observer.recordFileModification(\n result.filesModified,\n `Files modified during skill \"${skill.name}\" execution`\n );\n }\n\n // Record any errors\n if (result.error) {\n this.observer.recordError(result.error, `Skill \"${skill.name}\" failed`);\n }\n\n return result;\n } catch (error) {\n // Record unexpected errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.observer.recordError(errorMessage, `Unexpected error during skill \"${skill.name}\" execution`);\n throw error;\n }\n }\n\n /**\n * Record a manual error observation\n */\n recordError(error: string, context: string, taskId?: string): void {\n this.observer.recordError(error, context, taskId);\n }\n\n /**\n * Record a manual solution observation\n */\n recordSolution(solution: string, context: string, relatedError?: string): void {\n this.observer.recordSolution(solution, context, relatedError);\n }\n\n /**\n * Record a file modification observation\n */\n recordFileModification(files: string[], context: string): void {\n this.observer.recordFileModification(files, context);\n }\n\n /**\n * Record a decision observation\n */\n recordDecision(decision: string, options: string[], context: string): void {\n this.observer.recordDecision(decision, options, context);\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n const paused = this.engine.pause();\n if (paused) {\n this.observer.recordExecutionPause();\n }\n return paused;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.engine.isPaused();\n }\n\n /**\n * Get the memory observer\n */\n getObserver(): MemoryObserver {\n return this.observer;\n }\n\n /**\n * Get the underlying execution engine\n */\n getEngine(): SkillExecutionEngine {\n return this.engine;\n }\n\n /**\n * Get the session manager\n */\n getSessionManager(): ReturnType<SkillExecutionEngine['getSessionManager']> {\n return this.engine.getSessionManager();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.observer.getObservationCount();\n }\n\n /**\n * Get all observations\n */\n getObservations(): ReturnType<MemoryObserver['getObservations']> {\n return this.observer.getObservations();\n }\n\n /**\n * Clear observations\n */\n clearObservations(): void {\n this.observer.clear();\n }\n}\n\n/**\n * Create a memory-enabled execution engine\n */\nexport function createMemoryEnabledEngine(\n projectPath: string,\n options?: MemoryEnabledEngineOptions\n): MemoryEnabledEngine {\n return new MemoryEnabledEngine(projectPath, options);\n}\n\n/**\n * Wrap an existing progress callback with memory observation\n */\nexport function wrapProgressCallbackWithMemory(\n projectPath: string,\n existingCallback?: ExecutionProgressCallback,\n memoryConfig?: MemoryObserverConfig,\n sessionId?: string\n): { callback: ExecutionProgressCallback; observer: MemoryObserver } {\n const observer = new MemoryObserver(projectPath, sessionId, memoryConfig);\n const observerCallback = observer.createProgressCallback();\n\n const wrappedCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n observerCallback(event);\n if (existingCallback) {\n existingCallback(event);\n }\n };\n\n return { callback: wrappedCallback, observer };\n}\n","/**\n * Memory Compression Engine\n *\n * Compresses raw observations into learnings using either rule-based\n * extraction or AI-powered compression.\n */\n\nimport { homedir } from 'node:os';\nimport type { Observation, Learning, ObservationType } from './types.js';\nimport { LearningStore } from './learning-store.js';\nimport { MemoryIndexStore } from './memory-index.js';\n\n/**\n * Compression result for a single learning\n */\nexport interface CompressedLearning {\n title: string;\n content: string;\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n importance: number; // 1-10\n sourceObservationIds: string[];\n}\n\n/**\n * Compression result\n */\nexport interface CompressionResult {\n learnings: CompressedLearning[];\n processedObservationIds: string[];\n skippedObservationIds: string[];\n stats: {\n inputCount: number;\n outputCount: number;\n compressionRatio: number;\n };\n}\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum observations to trigger compression */\n minObservations?: number;\n /** Maximum learnings to generate per compression */\n maxLearnings?: number;\n /** Minimum importance score (1-10) to keep a learning */\n minImportance?: number;\n /** Whether to include low-relevance observations */\n includeLowRelevance?: boolean;\n /** Custom tags to add to all learnings */\n additionalTags?: string[];\n /** Project name for context */\n projectName?: string;\n}\n\nconst DEFAULT_COMPRESSION_OPTIONS: Required<CompressionOptions> = {\n minObservations: 3,\n maxLearnings: 10,\n minImportance: 4,\n includeLowRelevance: false,\n additionalTags: [],\n projectName: '',\n};\n\n/**\n * Compression engine interface\n */\nexport interface CompressionEngine {\n /**\n * Compress observations into learnings\n */\n compress(observations: Observation[], options?: CompressionOptions): Promise<CompressionResult>;\n\n /**\n * Get the engine type\n */\n getType(): 'rule-based' | 'api';\n}\n\n/**\n * Rule-based compression engine\n *\n * Uses heuristics and patterns to extract learnings without AI.\n */\nexport class RuleBasedCompressor implements CompressionEngine {\n getType(): 'rule-based' | 'api' {\n return 'rule-based';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group observations by type\n const byType = this.groupByType(filtered);\n\n // Extract error-solution pairs\n const errorSolutionLearnings = this.extractErrorSolutionPairs(byType, opts);\n learnings.push(...errorSolutionLearnings.learnings);\n processedIds.push(...errorSolutionLearnings.processedIds);\n\n // Extract decision patterns\n const decisionLearnings = this.extractDecisionPatterns(byType, opts);\n learnings.push(...decisionLearnings.learnings);\n processedIds.push(...decisionLearnings.processedIds);\n\n // Extract file change patterns\n const fileChangeLearnings = this.extractFileChangePatterns(byType, opts);\n learnings.push(...fileChangeLearnings.learnings);\n processedIds.push(...fileChangeLearnings.processedIds);\n\n // Extract tool usage patterns\n const toolUsageLearnings = this.extractToolUsagePatterns(byType, opts);\n learnings.push(...toolUsageLearnings.learnings);\n processedIds.push(...toolUsageLearnings.processedIds);\n\n // Filter by importance and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio: observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n }\n\n private groupByType(observations: Observation[]): Map<ObservationType, Observation[]> {\n const groups = new Map<ObservationType, Observation[]>();\n for (const obs of observations) {\n const existing = groups.get(obs.type) || [];\n existing.push(obs);\n groups.set(obs.type, existing);\n }\n return groups;\n }\n\n private extractErrorSolutionPairs(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const errors = byType.get('error') || [];\n const solutions = byType.get('solution') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Match errors with solutions\n for (const error of errors) {\n const errorText = error.content.error || error.content.action;\n const matchingSolution = solutions.find((s) => {\n const solutionContext = s.content.context?.toLowerCase() || '';\n const solutionAction = s.content.action?.toLowerCase() || '';\n const errorLower = errorText.toLowerCase();\n\n // Require keyword similarity between error and solution\n const hasKeywordMatch = this.hasSimilarKeywords(errorLower, solutionContext) ||\n this.hasSimilarKeywords(errorLower, solutionAction);\n if (!hasKeywordMatch) {\n return false;\n }\n\n // Solution should indicate it's a fix/resolution, or have strong keyword overlap\n const isSolutionIndicator = solutionContext.includes('fix') ||\n solutionContext.includes('resolve') ||\n solutionContext.includes('solution') ||\n solutionAction.includes('fix') ||\n solutionAction.includes('resolve');\n\n // Require both keyword match AND solution indicator\n return isSolutionIndicator || this.hasStrongKeywordOverlap(errorLower, solutionContext);\n });\n\n if (matchingSolution) {\n const title = this.generateTitle('Error Resolution', errorText);\n const content = this.formatErrorSolutionContent(error, matchingSolution);\n const tags = this.extractTags([error, matchingSolution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling', 'debugging'],\n importance: 8,\n sourceObservationIds: [error.id, matchingSolution.id],\n });\n\n processedIds.push(error.id, matchingSolution.id);\n } else if (error.content.error) {\n // Standalone error learning\n const title = this.generateTitle('Error Pattern', errorText);\n const content = this.formatStandaloneErrorContent(error);\n const tags = this.extractTags([error]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling'],\n importance: 6,\n sourceObservationIds: [error.id],\n });\n\n processedIds.push(error.id);\n }\n }\n\n // Process remaining solutions\n for (const solution of solutions) {\n if (!processedIds.includes(solution.id)) {\n const title = this.generateTitle('Solution', solution.content.action);\n const content = this.formatSolutionContent(solution);\n const tags = this.extractTags([solution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['solution-pattern'],\n importance: 7,\n sourceObservationIds: [solution.id],\n });\n\n processedIds.push(solution.id);\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractDecisionPatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const decisions = byType.get('decision') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n for (const decision of decisions) {\n const title = this.generateTitle('Decision', decision.content.action);\n const content = this.formatDecisionContent(decision);\n const tags = this.extractTags([decision]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['decision-making', 'architecture'],\n importance: 7,\n sourceObservationIds: [decision.id],\n });\n\n processedIds.push(decision.id);\n }\n\n return { learnings, processedIds };\n }\n\n private extractFileChangePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const fileChanges = byType.get('file_change') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group file changes by pattern (same files modified together)\n const filePatterns = new Map<string, Observation[]>();\n for (const change of fileChanges) {\n const files = change.content.files || [];\n const pattern = this.getFilePattern(files);\n const existing = filePatterns.get(pattern) || [];\n existing.push(change);\n filePatterns.set(pattern, existing);\n }\n\n // Create learnings for significant patterns (2+ occurrences)\n for (const [pattern, changes] of filePatterns) {\n if (changes.length >= 2 || changes.some((c) => (c.content.files?.length || 0) > 3)) {\n const title = `File Modification Pattern: ${pattern}`;\n const content = this.formatFileChangeContent(changes);\n const tags = this.extractTags(changes);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['file-organization', 'code-structure'],\n importance: 5,\n sourceObservationIds: changes.map((c) => c.id),\n });\n\n processedIds.push(...changes.map((c) => c.id));\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractToolUsagePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const toolUses = byType.get('tool_use') || [];\n const checkpoints = byType.get('checkpoint') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Only extract if there are significant patterns\n const allObs = [...toolUses, ...checkpoints];\n if (allObs.length >= 5) {\n // Group by common action patterns\n const actionPatterns = new Map<string, Observation[]>();\n for (const obs of allObs) {\n const actionType = this.getActionType(obs.content.action);\n const existing = actionPatterns.get(actionType) || [];\n existing.push(obs);\n actionPatterns.set(actionType, existing);\n }\n\n for (const [actionType, observations] of actionPatterns) {\n if (observations.length >= 3) {\n const title = `Workflow Pattern: ${actionType}`;\n const content = this.formatToolUsageContent(observations);\n const tags = this.extractTags(observations);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['workflow', 'automation'],\n importance: 4,\n sourceObservationIds: observations.map((o) => o.id),\n });\n\n processedIds.push(...observations.map((o) => o.id));\n }\n }\n }\n\n return { learnings, processedIds };\n }\n\n private generateTitle(prefix: string, text: string): string {\n // Extract key words from text\n const cleaned = text\n .replace(/[^a-zA-Z0-9\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const words = cleaned.split(' ').slice(0, 5).join(' ');\n return `${prefix}: ${words}`.slice(0, 80);\n }\n\n private formatErrorSolutionContent(error: Observation, solution: Observation): string {\n return `## Problem\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Solution\n${solution.content.solution || solution.content.action}\n\n**How it was applied:** ${solution.content.context}\n\n## Files Involved\n${[...(error.content.files || []), ...(solution.content.files || [])].join(', ') || 'N/A'}\n`;\n }\n\n private formatStandaloneErrorContent(error: Observation): string {\n return `## Error\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Files Involved\n${error.content.files?.join(', ') || 'N/A'}\n\n## Notes\nThis error was encountered but no direct solution was recorded. Consider investigating similar patterns.\n`;\n }\n\n private formatSolutionContent(solution: Observation): string {\n return `## Solution\n${solution.content.solution || solution.content.action}\n\n**Context:** ${solution.content.context}\n\n## Result\n${solution.content.result || 'Solution applied successfully'}\n\n## Files Involved\n${solution.content.files?.join(', ') || 'N/A'}\n`;\n }\n\n private formatDecisionContent(decision: Observation): string {\n return `## Decision\n${decision.content.action}\n\n**Context:** ${decision.content.context}\n\n## Reasoning\nThis decision was made during skill execution. The context above explains why this approach was chosen.\n\n## Result\n${decision.content.result || 'Decision implemented'}\n`;\n }\n\n private formatFileChangeContent(changes: Observation[]): string {\n const allFiles = new Set<string>();\n const contexts: string[] = [];\n\n for (const change of changes) {\n for (const file of change.content.files || []) {\n allFiles.add(file);\n }\n if (change.content.context) {\n contexts.push(`- ${change.content.context}`);\n }\n }\n\n return `## Files Modified\n${Array.from(allFiles).join('\\n')}\n\n## Contexts\n${contexts.join('\\n') || 'Various modifications'}\n\n## Pattern\nThese files were frequently modified together, suggesting a common pattern or component boundary.\n`;\n }\n\n private formatToolUsageContent(observations: Observation[]): string {\n const actions = observations\n .map((o) => `- ${o.content.action}`)\n .slice(0, 10)\n .join('\\n');\n\n return `## Workflow Steps\n${actions}\n\n## Pattern\nThis sequence of actions was repeated during execution, indicating a common workflow pattern.\n\n## Recommendation\nConsider automating or documenting this workflow for future reference.\n`;\n }\n\n private extractTags(observations: Observation[]): string[] {\n const tags = new Set<string>();\n for (const obs of observations) {\n for (const tag of obs.content.tags || []) {\n tags.add(tag.toLowerCase());\n }\n }\n return Array.from(tags);\n }\n\n private extractFrameworks(tags: string[]): string[] {\n const frameworks = [\n 'react',\n 'nextjs',\n 'vue',\n 'angular',\n 'svelte',\n 'express',\n 'nestjs',\n 'fastify',\n 'django',\n 'flask',\n 'rails',\n 'spring',\n 'typescript',\n 'javascript',\n 'python',\n 'rust',\n 'go',\n ];\n return tags.filter((t) => frameworks.includes(t.toLowerCase()));\n }\n\n private getFilePattern(files: string[]): string {\n if (files.length === 0) return 'unknown';\n\n // Extract common directory\n const dirs = files.map((f) => {\n const parts = f.split('/');\n return parts.slice(0, -1).join('/') || 'root';\n });\n\n const uniqueDirs = [...new Set(dirs)];\n if (uniqueDirs.length === 1) {\n return uniqueDirs[0];\n }\n\n // Extract file types\n const extensions = files.map((f) => {\n const ext = f.split('.').pop() || 'unknown';\n return ext;\n });\n const uniqueExts = [...new Set(extensions)];\n\n return `${uniqueDirs[0]} (${uniqueExts.join(', ')})`;\n }\n\n private getActionType(action: string): string {\n const actionLower = action.toLowerCase();\n if (actionLower.includes('read') || actionLower.includes('view')) return 'read';\n if (actionLower.includes('write') || actionLower.includes('create')) return 'write';\n if (actionLower.includes('edit') || actionLower.includes('modify')) return 'edit';\n if (actionLower.includes('delete') || actionLower.includes('remove')) return 'delete';\n if (actionLower.includes('test') || actionLower.includes('verify')) return 'test';\n if (actionLower.includes('build') || actionLower.includes('compile')) return 'build';\n if (actionLower.includes('start') || actionLower.includes('run')) return 'run';\n return 'other';\n }\n\n private hasSimilarKeywords(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n return words1.some((w) => words2.has(w));\n }\n\n /**\n * Check for strong keyword overlap (multiple matching words)\n * More strict than hasSimilarKeywords - requires at least 2 matching words\n */\n private hasStrongKeywordOverlap(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n const matchCount = words1.filter((w) => words2.has(w)).length;\n return matchCount >= 2;\n }\n}\n\n/**\n * API-based compression engine configuration\n */\nexport interface APICompressionConfig {\n /** API provider */\n provider: 'anthropic' | 'openai';\n /** API key */\n apiKey: string;\n /** Model to use */\n model?: string;\n /** Maximum tokens for response */\n maxTokens?: number;\n}\n\n/**\n * API-based compression engine\n *\n * Uses Claude or OpenAI to extract learnings from observations.\n */\nexport class APIBasedCompressor implements CompressionEngine {\n private config: APICompressionConfig;\n\n constructor(config: APICompressionConfig) {\n this.config = config;\n }\n\n getType(): 'rule-based' | 'api' {\n return 'api';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n // Format observations for the prompt\n const observationsText = this.formatObservationsForPrompt(filtered);\n\n // Build the prompt\n const prompt = this.buildCompressionPrompt(observationsText, opts);\n\n try {\n // Call the API\n const response = await this.callAPI(prompt);\n\n // Parse the response\n const learnings = this.parseAPIResponse(response, filtered);\n\n // Filter and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const processedIds = finalLearnings.flatMap((l) => l.sourceObservationIds);\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio:\n observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n } catch (error) {\n // Fall back to rule-based compression on API failure\n console.warn('API compression failed, falling back to rule-based:', error);\n const fallback = new RuleBasedCompressor();\n return fallback.compress(observations, options);\n }\n }\n\n private formatObservationsForPrompt(observations: Observation[]): string {\n return observations\n .map(\n (o, i) => `\n[Observation ${i + 1}] ID: ${o.id}\nType: ${o.type}\nTimestamp: ${o.timestamp}\nAction: ${o.content.action}\nContext: ${o.content.context}\n${o.content.error ? `Error: ${o.content.error}` : ''}\n${o.content.solution ? `Solution: ${o.content.solution}` : ''}\n${o.content.result ? `Result: ${o.content.result}` : ''}\n${o.content.files?.length ? `Files: ${o.content.files.join(', ')}` : ''}\n${o.content.tags?.length ? `Tags: ${o.content.tags.join(', ')}` : ''}\nRelevance: ${o.relevance}/100\n`\n )\n .join('\\n---\\n');\n }\n\n private buildCompressionPrompt(observationsText: string, opts: Required<CompressionOptions>): string {\n return `Analyze these session observations and extract key learnings that would be valuable for future development sessions.\n\n## Observations\n${observationsText}\n\n## Instructions\nExtract meaningful learnings from these observations. For each learning:\n1. Create a concise, actionable title (max 80 characters)\n2. Write content that explains:\n - What was learned\n - When/why this is useful\n - How to apply it\n3. Add relevant tags (lowercase, hyphenated)\n4. Rate importance (1-10, where 10 is critical)\n\nFocus on:\n- Error patterns and their solutions\n- Decisions made and their reasoning\n- Workflow patterns that emerged\n- Best practices discovered\n- Gotchas and edge cases\n\n${opts.projectName ? `Project context: ${opts.projectName}` : ''}\n\n## Output Format\nRespond with valid JSON array:\n[\n {\n \"title\": \"...\",\n \"content\": \"...\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"frameworks\": [\"react\", \"typescript\"],\n \"patterns\": [\"error-handling\", \"debugging\"],\n \"importance\": 8,\n \"sourceObservationIds\": [\"obs-id-1\", \"obs-id-2\"]\n }\n]\n\nGenerate up to ${opts.maxLearnings} learnings. Only include learnings with importance >= ${opts.minImportance}.`;\n }\n\n private async callAPI(prompt: string): Promise<string> {\n if (this.config.provider === 'anthropic') {\n return this.callAnthropic(prompt);\n } else {\n return this.callOpenAI(prompt);\n }\n }\n\n private async callAnthropic(prompt: string): Promise<string> {\n const model = this.config.model || 'claude-3-haiku-20240307';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as { content: Array<{ text: string }> };\n return data.content[0]?.text || '';\n }\n\n private async callOpenAI(prompt: string): Promise<string> {\n const model = this.config.model || 'gpt-4o-mini';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content || '';\n }\n\n private parseAPIResponse(response: string, observations: Observation[]): CompressedLearning[] {\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response;\n const jsonMatch = response.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1];\n }\n\n const parsed = JSON.parse(jsonStr.trim());\n\n if (!Array.isArray(parsed)) {\n throw new Error('Response is not an array');\n }\n\n // Validate and clean up each learning\n const observationIds = new Set(observations.map((o) => o.id));\n return parsed\n .filter((item): item is CompressedLearning => {\n return (\n typeof item === 'object' &&\n typeof item.title === 'string' &&\n typeof item.content === 'string' &&\n Array.isArray(item.tags) &&\n typeof item.importance === 'number'\n );\n })\n .map((item) => ({\n ...item,\n // Validate source observation IDs\n sourceObservationIds: (item.sourceObservationIds || []).filter((id: string) =>\n observationIds.has(id)\n ),\n frameworks: item.frameworks || [],\n patterns: item.patterns || [],\n }));\n } catch (error) {\n console.warn('Failed to parse API response:', error);\n return [];\n }\n }\n}\n\n/**\n * Memory compressor that manages compression and stores results\n */\nexport class MemoryCompressor {\n private engine: CompressionEngine;\n private learningStore: LearningStore;\n private indexStore: MemoryIndexStore;\n private projectName?: string;\n\n constructor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n ) {\n this.engine = options?.engine || new RuleBasedCompressor();\n this.learningStore = new LearningStore(\n options?.scope || 'project',\n projectPath,\n options?.projectName\n );\n // For global scope, use home directory; for project scope, use project path\n const indexBasePath = options?.scope === 'global' ? homedir() : projectPath;\n this.indexStore = new MemoryIndexStore(indexBasePath, options?.scope === 'global');\n this.projectName = options?.projectName;\n }\n\n /**\n * Set the compression engine\n */\n setEngine(engine: CompressionEngine): void {\n this.engine = engine;\n }\n\n /**\n * Compress observations without storing (for dry-run/preview)\n */\n async compress(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<CompressionResult> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n return this.engine.compress(observations, compressionOptions);\n }\n\n /**\n * Compress observations and store as learnings\n */\n async compressAndStore(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<{\n learnings: Learning[];\n result: CompressionResult;\n }> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n\n // Compress observations\n const result = await this.engine.compress(observations, compressionOptions);\n\n // Store each learning\n const storedLearnings: Learning[] = [];\n for (const compressed of result.learnings) {\n const learning = this.learningStore.add({\n source: 'session',\n sourceObservations: compressed.sourceObservationIds,\n title: compressed.title,\n content: compressed.content,\n tags: compressed.tags,\n frameworks: compressed.frameworks,\n patterns: compressed.patterns,\n });\n\n // Index the learning\n this.indexStore.indexLearning(learning);\n\n storedLearnings.push(learning);\n }\n\n return {\n learnings: storedLearnings,\n result,\n };\n }\n\n /**\n * Get the learning store\n */\n getLearningStore(): LearningStore {\n return this.learningStore;\n }\n\n /**\n * Get the index store\n */\n getIndexStore(): MemoryIndexStore {\n return this.indexStore;\n }\n\n /**\n * Get compression engine type\n */\n getEngineType(): 'rule-based' | 'api' {\n return this.engine.getType();\n }\n}\n\n/**\n * Learning consolidator\n *\n * Merges similar learnings to reduce redundancy.\n */\nexport class LearningConsolidator {\n /**\n * Find similar learnings\n */\n findSimilar(learnings: Learning[], similarity = 0.7): Array<[Learning, Learning]> {\n const pairs: Array<[Learning, Learning]> = [];\n\n for (let i = 0; i < learnings.length; i++) {\n for (let j = i + 1; j < learnings.length; j++) {\n const score = this.calculateSimilarity(learnings[i], learnings[j]);\n if (score >= similarity) {\n pairs.push([learnings[i], learnings[j]]);\n }\n }\n }\n\n return pairs;\n }\n\n /**\n * Merge two similar learnings\n */\n merge(learning1: Learning, learning2: Learning): Omit<Learning, 'id' | 'createdAt' | 'updatedAt'> {\n // Keep the more effective/used one as base\n const base = this.getBetterLearning(learning1, learning2);\n const other = base === learning1 ? learning2 : learning1;\n\n return {\n // Preserve the source from the base learning instead of hard-coding 'session'\n source: base.source,\n sourceObservations: [\n ...(base.sourceObservations || []),\n ...(other.sourceObservations || []),\n ],\n title: base.title,\n content: this.mergeContent(base.content, other.content),\n scope: base.scope,\n project: base.project,\n tags: [...new Set([...base.tags, ...other.tags])],\n frameworks: [...new Set([...(base.frameworks || []), ...(other.frameworks || [])])],\n patterns: [...new Set([...(base.patterns || []), ...(other.patterns || [])])],\n useCount: base.useCount + other.useCount,\n lastUsed: base.lastUsed || other.lastUsed,\n effectiveness: base.effectiveness ?? other.effectiveness,\n };\n }\n\n /**\n * Consolidate a list of learnings\n */\n consolidate(\n learnings: Learning[],\n store: LearningStore,\n index: MemoryIndexStore,\n similarity = 0.7\n ): { merged: number; remaining: number } {\n const pairs = this.findSimilar(learnings, similarity);\n const mergedIds = new Set<string>();\n let mergedCount = 0;\n\n for (const [l1, l2] of pairs) {\n if (mergedIds.has(l1.id) || mergedIds.has(l2.id)) {\n continue;\n }\n\n // Merge the learnings\n const merged = this.merge(l1, l2);\n\n // Add the merged learning\n const newLearning = store.add(merged);\n index.indexLearning(newLearning);\n\n // Remove the old learnings\n store.delete(l1.id);\n store.delete(l2.id);\n index.removeLearning(l1.id);\n index.removeLearning(l2.id);\n\n mergedIds.add(l1.id);\n mergedIds.add(l2.id);\n mergedCount++;\n }\n\n return {\n merged: mergedCount,\n remaining: learnings.length - mergedCount * 2 + mergedCount,\n };\n }\n\n private calculateSimilarity(l1: Learning, l2: Learning): number {\n let score = 0;\n\n // Title similarity (Jaccard)\n const title1Words = new Set(l1.title.toLowerCase().split(/\\s+/));\n const title2Words = new Set(l2.title.toLowerCase().split(/\\s+/));\n const titleIntersection = [...title1Words].filter((w) => title2Words.has(w)).length;\n const titleUnion = new Set([...title1Words, ...title2Words]).size;\n score += (titleIntersection / titleUnion) * 0.3;\n\n // Tag overlap\n const tags1 = new Set(l1.tags);\n const tags2 = new Set(l2.tags);\n const tagIntersection = [...tags1].filter((t) => tags2.has(t)).length;\n const tagUnion = new Set([...tags1, ...tags2]).size;\n if (tagUnion > 0) {\n score += (tagIntersection / tagUnion) * 0.3;\n }\n\n // Pattern overlap\n const patterns1 = new Set(l1.patterns || []);\n const patterns2 = new Set(l2.patterns || []);\n const patternIntersection = [...patterns1].filter((p) => patterns2.has(p)).length;\n const patternUnion = new Set([...patterns1, ...patterns2]).size;\n if (patternUnion > 0) {\n score += (patternIntersection / patternUnion) * 0.2;\n }\n\n // Content similarity (simple word overlap)\n const content1Words = new Set(\n l1.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const content2Words = new Set(\n l2.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const contentIntersection = [...content1Words].filter((w) => content2Words.has(w)).length;\n const contentUnion = new Set([...content1Words, ...content2Words]).size;\n if (contentUnion > 0) {\n score += (contentIntersection / contentUnion) * 0.2;\n }\n\n return score;\n }\n\n private getBetterLearning(l1: Learning, l2: Learning): Learning {\n // Prefer higher effectiveness\n if (l1.effectiveness !== l2.effectiveness) {\n return (l1.effectiveness || 0) > (l2.effectiveness || 0) ? l1 : l2;\n }\n // Prefer higher use count\n if (l1.useCount !== l2.useCount) {\n return l1.useCount > l2.useCount ? l1 : l2;\n }\n // Prefer more recent\n return new Date(l1.updatedAt) > new Date(l2.updatedAt) ? l1 : l2;\n }\n\n private mergeContent(content1: string, content2: string): string {\n // Simple merge: keep the longer one and add a note\n if (content1.length >= content2.length) {\n return content1;\n }\n return content2;\n }\n}\n\n/**\n * Create a rule-based compressor\n */\nexport function createRuleBasedCompressor(): RuleBasedCompressor {\n return new RuleBasedCompressor();\n}\n\n/**\n * Create an API-based compressor\n */\nexport function createAPIBasedCompressor(config: APICompressionConfig): APIBasedCompressor {\n return new APIBasedCompressor(config);\n}\n\n/**\n * Create a memory compressor\n */\nexport function createMemoryCompressor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n): MemoryCompressor {\n return new MemoryCompressor(projectPath, options);\n}\n","/**\n * Memory Injector\n *\n * Injects relevant memories into agent context with relevance matching,\n * agent-specific formatting, and token budgeting.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ProjectContext } from '../context/types.js';\nimport type { Learning, MemorySummary, MemoryPreview, MemoryFull } from './types.js';\nimport { LearningStore } from './learning-store.js';\n\n/**\n * Injection options\n */\nexport interface InjectionOptions {\n /** Maximum tokens to use for injected memories */\n maxTokens?: number;\n /** Minimum relevance score to include (0-100) */\n minRelevance?: number;\n /** Maximum number of learnings to inject */\n maxLearnings?: number;\n /** Include global memories */\n includeGlobal?: boolean;\n /** Specific tags to match */\n tags?: string[];\n /** Current task description for relevance matching */\n currentTask?: string;\n /** Progressive disclosure level */\n disclosureLevel?: 'summary' | 'preview' | 'full';\n}\n\n/**\n * Injected memory with relevance score\n */\nexport interface InjectedMemory {\n learning: Learning;\n relevanceScore: number;\n matchedBy: {\n frameworks: string[];\n tags: string[];\n keywords: string[];\n patterns: string[];\n };\n tokenEstimate: number;\n}\n\n/**\n * Injection result\n */\nexport interface InjectionResult {\n memories: InjectedMemory[];\n formattedContent: string;\n totalTokens: number;\n stats: {\n considered: number;\n matched: number;\n injected: number;\n truncated: number;\n };\n}\n\n/**\n * Default injection options\n */\nconst DEFAULT_OPTIONS: Required<Omit<InjectionOptions, 'tags' | 'currentTask'>> = {\n maxTokens: 2000,\n minRelevance: 30,\n maxLearnings: 10,\n includeGlobal: true,\n disclosureLevel: 'preview',\n};\n\n/**\n * Approximate tokens per character (conservative estimate)\n */\nconst TOKENS_PER_CHAR = 0.25;\n\n/**\n * Memory Injector\n *\n * Retrieves and formats relevant memories for injection into agent context.\n */\nexport class MemoryInjector {\n private projectStore: LearningStore;\n private globalStore: LearningStore;\n private projectContext?: ProjectContext;\n\n constructor(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n ) {\n this.projectStore = new LearningStore('project', projectPath, projectName);\n this.globalStore = new LearningStore('global');\n this.projectContext = projectContext;\n }\n\n /**\n * Set project context for better relevance matching\n */\n setProjectContext(context: ProjectContext): void {\n this.projectContext = context;\n }\n\n /**\n * Get relevant memories for injection\n */\n async getRelevantMemories(options: InjectionOptions = {}): Promise<InjectedMemory[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Collect all learnings\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n // Score each learning for relevance\n const scored = allLearnings.map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }));\n\n // Filter by minimum relevance\n const filtered = scored.filter((s) => s.relevanceScore >= opts.minRelevance);\n\n // Sort by relevance (descending)\n filtered.sort((a, b) => b.relevanceScore - a.relevanceScore);\n\n // Limit to max learnings\n return filtered.slice(0, opts.maxLearnings);\n }\n\n /**\n * Score a learning for relevance to current context\n */\n private scoreLearning(\n learning: Learning,\n options: InjectionOptions\n ): Omit<InjectedMemory, 'learning'> {\n let score = 0;\n const matchedBy = {\n frameworks: [] as string[],\n tags: [] as string[],\n keywords: [] as string[],\n patterns: [] as string[],\n };\n\n // Match by frameworks from project context\n if (this.projectContext?.stack) {\n const projectFrameworks = this.extractFrameworkNames();\n const learningFrameworks = learning.frameworks || [];\n\n for (const fw of learningFrameworks) {\n if (projectFrameworks.has(fw.toLowerCase())) {\n score += 15;\n matchedBy.frameworks.push(fw);\n }\n }\n }\n\n // Match by explicitly requested tags\n if (options.tags && options.tags.length > 0) {\n const requestedTags = new Set(options.tags.map((t) => t.toLowerCase()));\n for (const tag of learning.tags) {\n if (requestedTags.has(tag.toLowerCase())) {\n score += 20;\n matchedBy.tags.push(tag);\n }\n }\n }\n\n // Match by current task keywords\n if (options.currentTask) {\n const taskKeywords = this.extractKeywords(options.currentTask);\n const learningKeywords = [\n ...this.extractKeywords(learning.title),\n ...this.extractKeywords(learning.content),\n ...learning.tags,\n ];\n\n const learningKeywordSet = new Set(learningKeywords.map((k) => k.toLowerCase()));\n for (const kw of taskKeywords) {\n if (learningKeywordSet.has(kw.toLowerCase())) {\n score += 10;\n if (!matchedBy.keywords.includes(kw)) {\n matchedBy.keywords.push(kw);\n }\n }\n }\n }\n\n // Match by patterns\n if (learning.patterns && learning.patterns.length > 0) {\n // Patterns are valuable - boost score\n score += learning.patterns.length * 5;\n matchedBy.patterns.push(...learning.patterns);\n }\n\n // Boost by effectiveness if known\n if (learning.effectiveness !== undefined) {\n score += (learning.effectiveness / 100) * 20;\n }\n\n // Boost by use count (popular learnings are likely valuable)\n score += Math.min(learning.useCount * 2, 15);\n\n // Boost recent learnings\n const daysSinceUpdate = this.daysSince(learning.updatedAt);\n if (daysSinceUpdate < 7) {\n score += 10;\n } else if (daysSinceUpdate < 30) {\n score += 5;\n }\n\n // Cap score at 100\n score = Math.min(score, 100);\n\n // Estimate token count\n const tokenEstimate = this.estimateTokens(learning, options.disclosureLevel || 'preview');\n\n return {\n relevanceScore: score,\n matchedBy,\n tokenEstimate,\n };\n }\n\n /**\n * Extract framework names from project context\n */\n private extractFrameworkNames(): Set<string> {\n const names = new Set<string>();\n\n if (!this.projectContext?.stack) return names;\n\n const stack = this.projectContext.stack;\n const categories = [\n stack.languages,\n stack.frameworks,\n stack.libraries,\n stack.styling,\n stack.testing,\n stack.databases,\n stack.tools,\n stack.runtime,\n ];\n\n for (const category of categories) {\n for (const detection of category) {\n names.add(detection.name.toLowerCase());\n }\n }\n\n return names;\n }\n\n /**\n * Extract keywords from text\n */\n private extractKeywords(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[\\s\\-_.,;:!?()[\\]{}'\"]+/)\n .filter((word) => word.length > 2 && !STOP_WORDS.has(word));\n }\n\n /**\n * Calculate days since a date\n */\n private daysSince(dateStr: string): number {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n }\n\n /**\n * Estimate tokens for a learning\n */\n private estimateTokens(\n learning: Learning,\n level: 'summary' | 'preview' | 'full'\n ): number {\n switch (level) {\n case 'summary':\n return Math.ceil((learning.title.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR);\n case 'preview':\n const excerpt = learning.content.slice(0, 200);\n return Math.ceil(\n (learning.title.length + excerpt.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR\n );\n case 'full':\n return Math.ceil(\n (learning.title.length + learning.content.length + learning.tags.join(' ').length) *\n TOKENS_PER_CHAR\n );\n }\n }\n\n /**\n * Inject memories and return formatted content\n */\n async inject(options: InjectionOptions = {}): Promise<InjectionResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const allMemories = await this.getRelevantMemories(opts);\n\n // Select memories within token budget\n const selected: InjectedMemory[] = [];\n let totalTokens = 0;\n let truncated = 0;\n\n for (const memory of allMemories) {\n if (totalTokens + memory.tokenEstimate <= opts.maxTokens) {\n selected.push(memory);\n totalTokens += memory.tokenEstimate;\n\n // Increment use count\n if (memory.learning.scope === 'project') {\n this.projectStore.incrementUseCount(memory.learning.id);\n } else {\n this.globalStore.incrementUseCount(memory.learning.id);\n }\n } else {\n truncated++;\n }\n }\n\n // Format the content\n const formattedContent = this.formatMemories(selected, opts.disclosureLevel || 'preview');\n\n return {\n memories: selected,\n formattedContent,\n totalTokens,\n stats: {\n considered: this.projectStore.count() + (opts.includeGlobal ? this.globalStore.count() : 0),\n matched: allMemories.length,\n injected: selected.length,\n truncated,\n },\n };\n }\n\n /**\n * Inject memories formatted for a specific agent\n */\n async injectForAgent(\n agent: AgentType,\n options: InjectionOptions = {}\n ): Promise<InjectionResult> {\n const result = await this.inject(options);\n\n // Reformat for specific agent\n result.formattedContent = this.formatForAgent(result.memories, agent, options.disclosureLevel);\n\n return result;\n }\n\n /**\n * Format memories for display\n */\n private formatMemories(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n const lines: string[] = ['# Relevant Memories', ''];\n\n for (const { learning, relevanceScore, matchedBy } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push(`*Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}*`);\n\n if (matchedBy.frameworks.length > 0) {\n lines.push(`*Matched frameworks: ${matchedBy.frameworks.join(', ')}*`);\n }\n\n lines.push('');\n\n switch (level) {\n case 'summary':\n // Just title and tags (already shown above)\n break;\n case 'preview':\n lines.push(learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : ''));\n break;\n case 'full':\n lines.push(learning.content);\n break;\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for a specific agent\n */\n formatForAgent(\n memories: InjectedMemory[],\n agent: AgentType,\n level: 'summary' | 'preview' | 'full' = 'preview'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n switch (agent) {\n case 'claude-code':\n return this.formatForClaude(memories, level);\n case 'cursor':\n return this.formatForCursor(memories, level);\n case 'codex':\n case 'github-copilot':\n return this.formatForCopilot(memories, level);\n default:\n return this.formatMemories(memories, level);\n }\n }\n\n /**\n * Format memories for Claude (XML tags)\n */\n private formatForClaude(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<memories>'];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(` <memory relevance=\"${relevanceScore}\" scope=\"${learning.scope}\">`);\n lines.push(` <title>${this.escapeXml(learning.title)}</title>`);\n lines.push(` <tags>${learning.tags.join(', ')}</tags>`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 200) : learning.content;\n lines.push(` <content>${this.escapeXml(content)}</content>`);\n }\n\n if (learning.frameworks && learning.frameworks.length > 0) {\n lines.push(` <frameworks>${learning.frameworks.join(', ')}</frameworks>`);\n }\n\n lines.push(' </memory>');\n }\n\n lines.push('</memories>');\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Cursor (.mdc format)\n */\n private formatForCursor(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = [\n '---',\n 'description: Relevant memories from previous sessions',\n 'globs:',\n ' - \"**/*\"',\n '---',\n '',\n '# Session Memories',\n '',\n ];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push('');\n lines.push(`> Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}`);\n lines.push('');\n\n if (level !== 'summary') {\n const content =\n level === 'preview'\n ? learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : '')\n : learning.content;\n lines.push(content);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Copilot/Codex (concise markdown)\n */\n private formatForCopilot(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<!-- Session Memories -->'];\n\n for (const { learning } of memories) {\n lines.push(`### ${learning.title}`);\n lines.push(`Tags: ${learning.tags.join(', ')}`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 150) : learning.content;\n lines.push(content);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Get memory summaries (for progressive disclosure)\n */\n getSummaries(options: InjectionOptions = {}): MemorySummary[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n return allLearnings.map((learning) => ({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n }));\n }\n\n /**\n * Get memory previews (for progressive disclosure)\n */\n getPreviews(ids: string[], options: InjectionOptions = {}): MemoryPreview[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const previews: MemoryPreview[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n previews.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n });\n }\n }\n\n return previews;\n }\n\n /**\n * Get full memories (for progressive disclosure)\n */\n getFullMemories(ids: string[], options: InjectionOptions = {}): MemoryFull[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const fullMemories: MemoryFull[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n fullMemories.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n content: learning.content,\n });\n }\n }\n\n return fullMemories;\n }\n\n /**\n * Search memories by query\n */\n search(query: string, options: InjectionOptions = {}): InjectedMemory[] {\n const opts = { ...DEFAULT_OPTIONS, ...options, currentTask: query };\n const projectResults = this.projectStore.search(query);\n const globalResults = opts.includeGlobal ? this.globalStore.search(query) : [];\n const allResults = [...projectResults, ...globalResults];\n\n return allResults\n .map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }))\n .filter((m) => m.relevanceScore >= opts.minRelevance)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, opts.maxLearnings);\n }\n}\n\n/**\n * Common stop words to ignore in keyword extraction\n */\nconst STOP_WORDS = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'in',\n 'on',\n 'at',\n 'to',\n 'for',\n 'of',\n 'with',\n 'by',\n 'from',\n 'as',\n 'is',\n 'was',\n 'are',\n 'were',\n 'been',\n 'be',\n 'have',\n 'has',\n 'had',\n 'do',\n 'does',\n 'did',\n 'will',\n 'would',\n 'could',\n 'should',\n 'may',\n 'might',\n 'must',\n 'can',\n 'this',\n 'that',\n 'these',\n 'those',\n 'i',\n 'you',\n 'he',\n 'she',\n 'it',\n 'we',\n 'they',\n 'what',\n 'which',\n 'who',\n 'when',\n 'where',\n 'why',\n 'how',\n 'all',\n 'each',\n 'every',\n 'both',\n 'few',\n 'more',\n 'most',\n 'other',\n 'some',\n 'such',\n 'no',\n 'nor',\n 'not',\n 'only',\n 'own',\n 'same',\n 'so',\n 'than',\n 'too',\n 'very',\n 'just',\n 'also',\n]);\n\n/**\n * Create a MemoryInjector instance\n */\nexport function createMemoryInjector(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n): MemoryInjector {\n return new MemoryInjector(projectPath, projectName, projectContext);\n}\n"],"mappings":"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","names":["existsSync","readFileSync","join","parseYaml","join","existsSync","readFileSync","parseYaml","existsSync","join","basename","join","basename","existsSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","existsSync","join","basename","homedir","join","homedir","basename","existsSync","z","parseYaml","stringifyYaml","extractFrontmatter","name","parseYaml","stringifyYaml","extractFrontmatter","parseMetadataComments","existsSync","readFileSync","writeFileSync","mkdirSync","dirname","basename","existsSync","readFileSync","basename","dirname","mkdirSync","writeFileSync","z","existsSync","readFileSync","readdirSync","join","basename","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","existsSync","readFileSync","parseYaml","mkdirSync","stringifyYaml","writeFileSync","existsSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","mkdirSync","writeFileSync","readdirSync","existsSync","readFileSync","statSync","join","z","execSync","existsSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","tmpdir","homedir","randomUUID","join","homedir","tmpdir","randomUUID","execSync","existsSync","readFileSync","rmSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","readdirSync","writeFileSync","mkdirSync","join","parse","stringify","parse","existsSync","readFileSync","join","readdirSync","mkdirSync","writeFileSync","stringify","randomUUID","execSync","randomUUID","randomUUID","resolve","execSync","resolve","existsSync","readFileSync","join","parseYaml","resolve","result","existsSync","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","homedir","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","existsSync","mkdirSync","join","homedir","homedir","homedir"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/skills.ts","../src/config.ts","../src/providers/github.ts","../src/providers/base.ts","../src/providers/gitlab.ts","../src/providers/bitbucket.ts","../src/providers/local.ts","../src/providers/index.ts","../src/translator/types.ts","../src/translator/formats/skill-md.ts","../src/translator/formats/cursor.ts","../src/translator/formats/windsurf.ts","../src/translator/formats/copilot.ts","../src/translator/registry.ts","../src/translator/index.ts","../src/context/types.ts","../src/context/detector.ts","../src/context/manager.ts","../src/context/sync.ts","../src/context/loader.ts","../src/recommend/types.ts","../src/recommend/engine.ts","../src/recommend/fetcher.ts","../src/session/types.ts","../src/session/manager.ts","../src/workflow/types.ts","../src/workflow/parser.ts","../src/workflow/orchestrator.ts","../src/executor/engine.ts","../src/executor/agents.ts","../src/executor/skill-executor.ts","../src/testing/runner.ts","../src/marketplace/types.ts","../src/marketplace/aggregator.ts","../src/cicd/templates.ts","../src/memory/types.ts","../src/memory/observation-store.ts","../src/memory/learning-store.ts","../src/memory/memory-index.ts","../src/memory/initializer.ts","../src/memory/observer.ts","../src/memory/engine-integration.ts","../src/memory/compressor.ts","../src/memory/injector.ts","../src/team/manager.ts","../src/team/bundle.ts","../src/plugins/manager.ts","../src/plugins/loader.ts","../src/methodology/manager.ts","../src/methodology/loader.ts","../src/methodology/validator.ts","../src/hooks/manager.ts","../src/hooks/triggers.ts","../src/orchestrator/team.ts","../src/orchestrator/task.ts","../src/orchestrator/messages.ts","../src/plan/parser.ts","../src/plan/validator.ts","../src/plan/generator.ts","../src/plan/executor.ts","../src/commands/registry.ts","../src/commands/generator.ts","../src/ai/search.ts","../src/ai/generator.ts","../src/ai/providers/base.ts","../src/ai/providers/mock.ts","../src/ai/manager.ts","../src/audit/logger.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AgentType = z.enum([\n 'claude-code',\n 'codex',\n 'cursor',\n 'antigravity',\n 'opencode',\n 'gemini-cli',\n 'amp',\n 'clawdbot',\n 'droid',\n 'github-copilot',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'windsurf',\n 'universal',\n]);\nexport type AgentType = z.infer<typeof AgentType>;\n\nexport const GitProvider = z.enum(['github', 'gitlab', 'bitbucket', 'local']);\nexport type GitProvider = z.infer<typeof GitProvider>;\n\nexport const SkillFrontmatter = z.object({\n name: z.string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'Skill name must be lowercase alphanumeric with hyphens, no leading/trailing/consecutive hyphens'),\n description: z.string().min(1).max(1024),\n license: z.string().optional(),\n compatibility: z.string().max(500).optional(),\n metadata: z.record(z.string()).optional(),\n 'allowed-tools': z.string().optional(),\n version: z.string().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n agents: z.array(AgentType).optional(),\n});\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatter>;\n\nexport const SkillMetadata = z.object({\n name: z.string(),\n description: z.string(),\n source: z.string(),\n sourceType: GitProvider,\n subpath: z.string().optional(),\n installedAt: z.string().datetime(),\n updatedAt: z.string().datetime().optional(),\n enabled: z.boolean().default(true),\n version: z.string().optional(),\n checksum: z.string().optional(),\n});\nexport type SkillMetadata = z.infer<typeof SkillMetadata>;\n\nexport const SkillLocation = z.enum(['project', 'global']);\nexport type SkillLocation = z.infer<typeof SkillLocation>;\n\nexport const Skill = z.object({\n name: z.string(),\n description: z.string(),\n path: z.string(),\n location: SkillLocation,\n metadata: SkillMetadata.optional(),\n enabled: z.boolean().default(true),\n});\nexport type Skill = z.infer<typeof Skill>;\n\nexport const SkillkitConfig = z.object({\n version: z.literal(1),\n agent: AgentType.default('universal'),\n skillsDir: z.string().optional(),\n enabledSkills: z.array(z.string()).optional(),\n disabledSkills: z.array(z.string()).optional(),\n autoSync: z.boolean().default(true),\n cacheDir: z.string().optional(),\n marketplaceSources: z.array(z.string()).optional(),\n defaultTimeout: z.number().optional(),\n});\nexport type SkillkitConfig = z.infer<typeof SkillkitConfig>;\n\nexport interface InstallOptions {\n global?: boolean;\n skills?: string[];\n provider?: GitProvider;\n yes?: boolean;\n force?: boolean;\n}\n\nexport interface SyncOptions {\n output?: string;\n agent?: AgentType;\n yes?: boolean;\n enabledOnly?: boolean;\n}\n\nexport interface UpdateOptions {\n skills?: string[];\n all?: boolean;\n force?: boolean;\n}\n\nexport interface RegistrySkill {\n name: string;\n description: string;\n source: string;\n provider: GitProvider;\n downloads?: number;\n stars?: number;\n tags?: string[];\n}\n\nexport interface DiscoveredSkill {\n name: string;\n dirName: string;\n path: string;\n}\n\nexport interface CloneResult {\n success: boolean;\n path?: string;\n tempRoot?: string;\n error?: string;\n skills?: string[];\n discoveredSkills?: DiscoveredSkill[];\n}\n\nexport interface CommandResult {\n success: boolean;\n message: string;\n data?: unknown;\n}\n\n// Agent adapter interface (used by agents package)\nexport interface AgentAdapterInfo {\n type: AgentType;\n name: string;\n skillsDir: string;\n configFile: string;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { SkillFrontmatter, SkillMetadata, type Skill, type SkillLocation } from './types.js';\n\nexport const SKILL_DISCOVERY_PATHS = [\n 'skills',\n 'skills/.curated',\n 'skills/.experimental',\n 'skills/.system',\n '.agents/skills',\n '.agent/skills',\n '.claude/skills',\n '.codex/skills',\n '.cursor/skills',\n '.factory/skills',\n '.gemini/skills',\n '.github/skills',\n '.goose/skills',\n '.kilocode/skills',\n '.kiro/skills',\n '.opencode/skills',\n '.roo/skills',\n '.trae/skills',\n '.windsurf/skills',\n '.clawdbot/skills',\n '.antigravity/skills',\n '.copilot/skills',\n];\n\nfunction discoverSkillsInDir(dir: string): Skill[] {\n const skills: Skill[] = [];\n\n if (!existsSync(dir)) {\n return skills;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(dir, entry.name);\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(skillPath);\n if (skill) {\n skills.push(skill);\n }\n }\n }\n\n return skills;\n}\n\n/**\n * Recursively search for skills in all subdirectories\n */\nfunction discoverSkillsRecursive(\n dir: string,\n seen: Set<string>,\n maxDepth: number = 5,\n currentDepth: number = 0\n): Skill[] {\n const skills: Skill[] = [];\n\n if (currentDepth >= maxDepth || !existsSync(dir)) {\n return skills;\n }\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === '.git') {\n continue;\n }\n\n if (!entry.isDirectory()) continue;\n\n const entryPath = join(dir, entry.name);\n const skillMdPath = join(entryPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(entryPath);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n } else {\n const subSkills = discoverSkillsRecursive(entryPath, seen, maxDepth, currentDepth + 1);\n skills.push(...subSkills);\n }\n }\n } catch {}\n\n return skills;\n}\n\nexport function discoverSkills(rootDir: string): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n const rootSkillMd = join(rootDir, 'SKILL.md');\n if (existsSync(rootSkillMd)) {\n const skill = parseSkill(rootDir);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Search all standard paths\n for (const searchPath of SKILL_DISCOVERY_PATHS) {\n const fullPath = join(rootDir, searchPath);\n if (existsSync(fullPath)) {\n for (const skill of discoverSkillsInDir(fullPath)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n }\n }\n\n // Try direct discovery in root (for flat structures)\n for (const skill of discoverSkillsInDir(rootDir)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Fallback: recursive search if nothing found\n if (skills.length === 0) {\n skills.push(...discoverSkillsRecursive(rootDir, seen));\n }\n\n return skills;\n}\n\nexport function parseSkill(skillPath: string, location: SkillLocation = 'project'): Skill | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n const name = basename(skillPath);\n return {\n name,\n description: 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n\n if (!parsed.success) {\n return {\n name: (frontmatter.name as string) || basename(skillPath),\n description: (frontmatter.description as string) || 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const metadata = loadMetadata(skillPath);\n\n return {\n name: parsed.data.name,\n description: parsed.data.description,\n path: skillPath,\n location,\n metadata: metadata ?? undefined,\n enabled: metadata?.enabled ?? true,\n };\n } catch {\n return null;\n }\n}\n\nexport function extractFrontmatter(content: string): Record<string, unknown> | null {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!match) {\n return null;\n }\n\n try {\n return parseYaml(match[1]) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function extractField(content: string, field: string): string | null {\n const frontmatter = extractFrontmatter(content);\n if (!frontmatter || !(field in frontmatter)) {\n return null;\n }\n\n const value = frontmatter[field];\n return typeof value === 'string' ? value : null;\n}\n\nexport function loadMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, '.skillkit.json');\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n const data = JSON.parse(content);\n const parsed = SkillMetadata.safeParse(data);\n\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n}\n\nexport function readSkillContent(skillPath: string): string | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n return readFileSync(skillMdPath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport function findSkill(name: string, searchDirs: string[]): Skill | null {\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const skillPath = join(dir, name);\n if (existsSync(skillPath)) {\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n return parseSkill(skillPath, location);\n }\n }\n\n return null;\n}\n\nexport function findAllSkills(searchDirs: string[]): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n const discovered = discoverSkills(dir);\n\n for (const skill of discovered) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push({ ...skill, location });\n }\n }\n }\n\n return skills;\n}\n\nexport function validateSkill(skillPath: string): { valid: boolean; errors: string[]; warnings?: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n const dirName = basename(skillPath);\n\n const skillMdPath = join(skillPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n errors.push('Missing SKILL.md file');\n return { valid: false, errors };\n }\n\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n errors.push('Missing YAML frontmatter in SKILL.md');\n return { valid: false, errors };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n errors.push(`${issue.path.join('.') || 'frontmatter'}: ${issue.message}`);\n }\n }\n\n if (parsed.success) {\n const data = parsed.data;\n\n if (data.name !== dirName) {\n warnings.push(`name \"${data.name}\" does not match directory name \"${dirName}\"`);\n }\n\n if (data.description && data.description.length < 50) {\n warnings.push('description is short; consider describing what the skill does AND when to use it');\n }\n }\n\n const bodyContent = content.replace(/^---[\\s\\S]*?---\\s*/, '');\n const lineCount = bodyContent.split('\\n').length;\n if (lineCount > 500) {\n warnings.push(`SKILL.md has ${lineCount} lines; consider moving detailed content to references/`);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nexport function isPathInside(child: string, parent: string): boolean {\n const relative = child.replace(parent, '');\n return !relative.startsWith('..') && !relative.includes('/..');\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { SkillkitConfig, type AgentType, type SkillMetadata, type AgentAdapterInfo } from './types.js';\n\nconst CONFIG_FILE = 'skillkit.yaml';\nconst METADATA_FILE = '.skillkit.json';\n\nexport function getProjectConfigPath(): string {\n return join(process.cwd(), CONFIG_FILE);\n}\n\nexport function getGlobalConfigPath(): string {\n return join(homedir(), '.config', 'skillkit', CONFIG_FILE);\n}\n\nexport function loadConfig(global = false): SkillkitConfig {\n const projectPath = getProjectConfigPath();\n const globalPath = getGlobalConfigPath();\n\n // If global is explicitly requested, only load from global path\n if (global) {\n if (existsSync(globalPath)) {\n try {\n const content = readFileSync(globalPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n return {\n version: 1,\n agent: 'universal',\n autoSync: true,\n };\n }\n\n // Default behavior: project config takes precedence over global\n if (existsSync(projectPath)) {\n try {\n const content = readFileSync(projectPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n if (existsSync(globalPath)) {\n try {\n const content = readFileSync(globalPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return {\n version: 1,\n agent: 'universal',\n autoSync: true,\n };\n}\n\nexport function saveConfig(config: SkillkitConfig, global = false): void {\n const configPath = global ? getGlobalConfigPath() : getProjectConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\nexport function getSearchDirs(adapter: AgentAdapterInfo): string[] {\n const dirs: string[] = [];\n\n dirs.push(join(process.cwd(), adapter.skillsDir));\n dirs.push(join(process.cwd(), '.agent', 'skills'));\n dirs.push(join(homedir(), adapter.skillsDir));\n dirs.push(join(homedir(), '.agent', 'skills'));\n\n return dirs;\n}\n\nexport function getInstallDir(adapter: AgentAdapterInfo, global = false): string {\n if (global) {\n return join(homedir(), adapter.skillsDir);\n }\n\n return join(process.cwd(), adapter.skillsDir);\n}\n\nexport function getAgentConfigPath(adapter: AgentAdapterInfo): string {\n return join(process.cwd(), adapter.configFile);\n}\n\nexport function saveSkillMetadata(skillPath: string, metadata: SkillMetadata): void {\n const metadataPath = join(skillPath, METADATA_FILE);\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');\n}\n\nexport function loadSkillMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, METADATA_FILE);\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n return JSON.parse(content) as SkillMetadata;\n } catch {\n return null;\n }\n}\n\nexport function setSkillEnabled(skillPath: string, enabled: boolean): boolean {\n const metadata = loadSkillMetadata(skillPath);\n\n if (!metadata) {\n return false;\n }\n\n metadata.enabled = enabled;\n metadata.updatedAt = new Date().toISOString();\n saveSkillMetadata(skillPath, metadata);\n\n return true;\n}\n\nexport async function initProject(\n type: AgentType,\n adapter: AgentAdapterInfo\n): Promise<void> {\n const skillsDir = join(process.cwd(), adapter.skillsDir);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const config: SkillkitConfig = {\n version: 1,\n agent: type,\n autoSync: true,\n };\n saveConfig(config);\n\n const agentConfigPath = join(process.cwd(), adapter.configFile);\n if (!existsSync(agentConfigPath)) {\n writeFileSync(agentConfigPath, `# ${adapter.name} Configuration\\n\\n`, 'utf-8');\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand, isGitUrl } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitHubProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'github';\n readonly name = 'GitHub';\n readonly baseUrl = 'https://github.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://github.com/')) {\n const path = source.replace('https://github.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@github.com:')) {\n const path = source.replace('git@github.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (!isGitUrl(source) && !source.includes(':')) {\n return parseShorthand(source);\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://github.com/') ||\n source.startsWith('git@github.com:') ||\n (!isGitUrl(source) && !source.includes(':') && source.includes('/'))\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://github.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@github.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitHub source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import type { GitProvider, CloneResult } from '../types.js';\n\nexport interface GitProviderAdapter {\n readonly type: GitProvider;\n readonly name: string;\n readonly baseUrl: string;\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null;\n matches(source: string): boolean;\n getCloneUrl(owner: string, repo: string): string;\n getSshUrl(owner: string, repo: string): string;\n clone(source: string, targetDir: string, options?: CloneOptions): Promise<CloneResult>;\n}\n\nexport interface CloneOptions {\n depth?: number;\n branch?: string;\n ssh?: boolean;\n}\n\nexport function parseShorthand(source: string): { owner: string; repo: string; subpath?: string } | null {\n const cleaned = source.replace(/^\\/+|\\/+$/g, '');\n const parts = cleaned.split('/');\n\n if (parts.length < 2) {\n return null;\n }\n\n const owner = parts[0];\n const repo = parts[1];\n const subpath = parts.length > 2 ? parts.slice(2).join('/') : undefined;\n\n return { owner, repo, subpath };\n}\n\nexport function isLocalPath(source: string): boolean {\n return (\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n source.startsWith('~/') ||\n source.startsWith('.')\n );\n}\n\nexport function isGitUrl(source: string): boolean {\n return (\n source.startsWith('git@') ||\n source.startsWith('https://') ||\n source.startsWith('http://') ||\n source.startsWith('ssh://')\n );\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitLabProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'gitlab';\n readonly name = 'GitLab';\n readonly baseUrl = 'https://gitlab.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://gitlab.com/')) {\n const path = source.replace('https://gitlab.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@gitlab.com:')) {\n const path = source.replace('git@gitlab.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('gitlab:')) {\n return parseShorthand(source.replace('gitlab:', ''));\n }\n\n if (source.startsWith('gitlab.com/')) {\n return parseShorthand(source.replace('gitlab.com/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://gitlab.com/') ||\n source.startsWith('git@gitlab.com:') ||\n source.startsWith('gitlab:') ||\n source.startsWith('gitlab.com/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://gitlab.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@gitlab.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitLab source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class BitbucketProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'bitbucket';\n readonly name = 'Bitbucket';\n readonly baseUrl = 'https://bitbucket.org';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://bitbucket.org/')) {\n const path = source.replace('https://bitbucket.org/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@bitbucket.org:')) {\n const path = source.replace('git@bitbucket.org:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('bitbucket:')) {\n return parseShorthand(source.replace('bitbucket:', ''));\n }\n\n if (source.startsWith('bitbucket.org/')) {\n return parseShorthand(source.replace('bitbucket.org/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://bitbucket.org/') ||\n source.startsWith('git@bitbucket.org:') ||\n source.startsWith('bitbucket:') ||\n source.startsWith('bitbucket.org/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://bitbucket.org/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@bitbucket.org:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid Bitbucket source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { existsSync, statSync, realpathSync } from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { isLocalPath } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class LocalProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'local';\n readonly name = 'Local Filesystem';\n readonly baseUrl = '';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (!isLocalPath(source)) {\n return null;\n }\n\n let expandedPath = source;\n if (source.startsWith('~/')) {\n expandedPath = join(homedir(), source.slice(2));\n }\n\n const absolutePath = resolve(expandedPath);\n const dirName = basename(absolutePath);\n\n return {\n owner: 'local',\n repo: dirName,\n subpath: absolutePath,\n };\n }\n\n matches(source: string): boolean {\n return isLocalPath(source);\n }\n\n getCloneUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n getSshUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n async clone(source: string, _targetDir: string, _options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed || !parsed.subpath) {\n return { success: false, error: `Invalid local path: ${source}` };\n }\n\n const sourcePath = parsed.subpath;\n\n if (!existsSync(sourcePath)) {\n return { success: false, error: `Path does not exist: ${sourcePath}` };\n }\n\n const stats = statSync(sourcePath);\n if (!stats.isDirectory()) {\n return { success: false, error: `Path is not a directory: ${sourcePath}` };\n }\n\n try {\n let actualPath = sourcePath;\n try {\n actualPath = realpathSync(sourcePath);\n } catch {\n // Ignore realpath errors\n }\n\n const skills = discoverSkills(actualPath);\n\n return {\n success: true,\n path: actualPath,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to process local path: ${message}` };\n }\n }\n}\n","import type { GitProviderAdapter } from './base.js';\nimport type { GitProvider } from '../types.js';\nimport { GitHubProvider } from './github.js';\nimport { GitLabProvider } from './gitlab.js';\nimport { BitbucketProvider } from './bitbucket.js';\nimport { LocalProvider } from './local.js';\n\nexport * from './base.js';\nexport * from './github.js';\nexport * from './gitlab.js';\nexport * from './bitbucket.js';\nexport * from './local.js';\n\nconst providers: GitProviderAdapter[] = [\n new LocalProvider(),\n new GitLabProvider(),\n new BitbucketProvider(),\n new GitHubProvider(),\n];\n\nexport function getProvider(type: GitProvider): GitProviderAdapter | undefined {\n return providers.find(p => p.type === type);\n}\n\nexport function getAllProviders(): GitProviderAdapter[] {\n return providers;\n}\n\nexport function detectProvider(source: string): GitProviderAdapter | undefined {\n return providers.find(p => p.matches(source));\n}\n\nexport function parseSource(source: string): {\n provider: GitProviderAdapter;\n owner: string;\n repo: string;\n subpath?: string;\n} | null {\n for (const provider of providers) {\n if (provider.matches(source)) {\n const parsed = provider.parseSource(source);\n if (parsed) {\n return { provider, ...parsed };\n }\n }\n }\n return null;\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Format categories for skill translation\n */\nexport type FormatCategory =\n | 'skill-md' // Category A: Standard SKILL.md (13 agents)\n | 'cursor-mdc' // Category B: Cursor MDC format\n | 'markdown-rules' // Category C: Windsurf, GitHub Copilot\n | 'external'; // Category D: External systems (Devin, etc.)\n\n/**\n * Mapping of agents to their format categories\n */\nexport const AGENT_FORMAT_MAP: Record<AgentType, FormatCategory> = {\n 'claude-code': 'skill-md',\n 'codex': 'skill-md',\n 'gemini-cli': 'skill-md',\n 'opencode': 'skill-md',\n 'antigravity': 'skill-md',\n 'amp': 'skill-md',\n 'clawdbot': 'skill-md',\n 'droid': 'skill-md',\n 'goose': 'skill-md',\n 'kilo': 'skill-md',\n 'kiro-cli': 'skill-md',\n 'roo': 'skill-md',\n 'trae': 'skill-md',\n 'universal': 'skill-md',\n 'cursor': 'cursor-mdc',\n 'windsurf': 'markdown-rules',\n 'github-copilot': 'markdown-rules',\n};\n\n/**\n * Extended skill frontmatter for translation\n */\nexport const TranslatableSkillFrontmatter = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string().optional(),\n author: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n 'allowed-tools': z.string().optional(),\n metadata: z.record(z.string()).optional(),\n // Cursor-specific fields\n globs: z.array(z.string()).optional(),\n alwaysApply: z.boolean().optional(),\n // Agent optimization hints\n agents: z.object({\n optimized: z.array(z.string()).optional(),\n compatible: z.array(z.string()).optional(),\n }).optional(),\n});\nexport type TranslatableSkillFrontmatter = z.infer<typeof TranslatableSkillFrontmatter>;\n\n/**\n * Canonical skill representation for translation\n */\nexport interface CanonicalSkill {\n /** Skill name (kebab-case) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Version string */\n version?: string;\n /** Author name or handle */\n author?: string;\n /** License identifier */\n license?: string;\n /** Categorization tags */\n tags?: string[];\n /** Compatibility description */\n compatibility?: string;\n /** Allowed tools list */\n allowedTools?: string;\n /** Additional metadata */\n metadata?: Record<string, string>;\n /** Main content (markdown) */\n content: string;\n /** Original format this was parsed from */\n sourceFormat: FormatCategory;\n /** Source agent type */\n sourceAgent?: AgentType;\n /** Cursor-specific: glob patterns */\n globs?: string[];\n /** Cursor-specific: always apply flag */\n alwaysApply?: boolean;\n /** Agent optimization hints */\n agentHints?: {\n optimized?: string[];\n compatible?: string[];\n };\n}\n\n/**\n * Result of a translation operation\n */\nexport interface TranslationResult {\n /** Whether translation succeeded */\n success: boolean;\n /** Translated content */\n content: string;\n /** Output filename */\n filename: string;\n /** Warnings during translation */\n warnings: string[];\n /** Features that couldn't be translated */\n incompatible: string[];\n /** Target format */\n targetFormat: FormatCategory;\n /** Target agent */\n targetAgent: AgentType;\n}\n\n/**\n * Options for translation\n */\nexport interface TranslationOptions {\n /** Preserve original comments */\n preserveComments?: boolean;\n /** Add translation metadata */\n addMetadata?: boolean;\n /** Custom output filename */\n outputFilename?: string;\n /** For Cursor: glob patterns to include */\n globs?: string[];\n /** For Cursor: always apply setting */\n alwaysApply?: boolean;\n}\n\n/**\n * Interface for format-specific translators\n */\nexport interface FormatTranslator {\n /** Format this translator handles */\n readonly format: FormatCategory;\n /** Agents this translator is optimized for */\n readonly agents: AgentType[];\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null;\n\n /**\n * Check if content matches this format\n */\n detect(content: string, filename?: string): boolean;\n\n /**\n * Generate content for target agent\n */\n generate(skill: CanonicalSkill, targetAgent: AgentType, options?: TranslationOptions): TranslationResult;\n\n /**\n * Get the expected filename for this format\n */\n getFilename(skillName: string, targetAgent: AgentType): string;\n}\n\n/**\n * Translation path between formats\n */\nexport interface TranslationPath {\n from: FormatCategory;\n to: FormatCategory;\n steps: FormatCategory[];\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Agents that use the standard SKILL.md format\n */\nconst SKILL_MD_AGENTS: AgentType[] = [\n 'claude-code',\n 'codex',\n 'gemini-cli',\n 'opencode',\n 'antigravity',\n 'amp',\n 'clawdbot',\n 'droid',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'universal',\n];\n\n/**\n * Extract YAML frontmatter from markdown content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * SKILL.md Format Translator\n *\n * This is the canonical format used by most AI coding agents.\n * Format:\n * ```\n * ---\n * name: skill-name\n * description: What it does\n * version: 1.0.0\n * tags: [tag1, tag2]\n * ---\n * # Instructions\n * Markdown content here...\n * ```\n */\nexport class SkillMdTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'skill-md';\n readonly agents: AgentType[] = SKILL_MD_AGENTS;\n\n /**\n * Parse SKILL.md content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n if (!frontmatter) {\n // Try to infer from content if no frontmatter\n const nameMatch = content.match(/^#\\s+(.+)$/m);\n const name = nameMatch\n ? nameMatch[1].toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '')\n : filename?.replace(/\\.md$/i, '').replace(/^SKILL$/i, 'unnamed-skill') || 'unnamed-skill';\n\n return {\n name,\n description: 'Skill without frontmatter',\n content: body.trim(),\n sourceFormat: 'skill-md',\n };\n }\n\n const name = (frontmatter.name as string) || 'unnamed-skill';\n const description = (frontmatter.description as string) || 'No description';\n\n return {\n name,\n description,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n license: frontmatter.license as string | undefined,\n tags: frontmatter.tags as string[] | undefined,\n compatibility: frontmatter.compatibility as string | undefined,\n allowedTools: frontmatter['allowed-tools'] as string | undefined,\n metadata: frontmatter.metadata as Record<string, string> | undefined,\n content: body.trim(),\n sourceFormat: 'skill-md',\n sourceAgent: frontmatter.sourceAgent as AgentType | undefined,\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n agentHints: frontmatter.agents as { optimized?: string[]; compatible?: string[] } | undefined,\n };\n }\n\n /**\n * Check if content is SKILL.md format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename && /SKILL\\.md$/i.test(filename)) {\n return true;\n }\n\n // Check for YAML frontmatter with expected fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter && ('name' in frontmatter || 'description' in frontmatter)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate SKILL.md content for target agent\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter object\n const frontmatter: Record<string, unknown> = {\n name: skill.name,\n description: skill.description,\n };\n\n // Add optional fields\n if (skill.version) frontmatter.version = skill.version;\n if (skill.author) frontmatter.author = skill.author;\n if (skill.license) frontmatter.license = skill.license;\n if (skill.tags?.length) frontmatter.tags = skill.tags;\n if (skill.compatibility) frontmatter.compatibility = skill.compatibility;\n if (skill.allowedTools) frontmatter['allowed-tools'] = skill.allowedTools;\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n frontmatter.metadata = skill.metadata;\n }\n\n // Handle Cursor-specific fields (store for reverse translation)\n if (skill.globs?.length) {\n frontmatter.globs = skill.globs;\n warnings.push('Cursor globs preserved but may not be used by target agent');\n }\n if (skill.alwaysApply !== undefined) {\n frontmatter.alwaysApply = skill.alwaysApply;\n warnings.push('Cursor alwaysApply preserved but may not be used by target agent');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.translatedAt = new Date().toISOString();\n frontmatter.targetAgent = targetAgent;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n defaultStringType: 'QUOTE_DOUBLE',\n }).trim();\n\n // Combine frontmatter and content\n const content = `---\\n${yamlContent}\\n---\\n\\n${skill.content}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'skill-md',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for SKILL.md format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'SKILL.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const skillMdTranslator = new SkillMdTranslator();\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Extract YAML frontmatter from MDC content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * Infer glob patterns from skill content and tags\n */\nfunction inferGlobs(skill: CanonicalSkill): string[] {\n const globs: string[] = [];\n const content = skill.content.toLowerCase();\n const tags = skill.tags || [];\n\n // Infer from tags\n const tagExtensions: Record<string, string[]> = {\n 'react': ['**/*.tsx', '**/*.jsx'],\n 'typescript': ['**/*.ts', '**/*.tsx'],\n 'javascript': ['**/*.js', '**/*.jsx'],\n 'python': ['**/*.py'],\n 'rust': ['**/*.rs'],\n 'go': ['**/*.go'],\n 'css': ['**/*.css', '**/*.scss', '**/*.sass'],\n 'html': ['**/*.html', '**/*.htm'],\n 'vue': ['**/*.vue'],\n 'svelte': ['**/*.svelte'],\n 'angular': ['**/*.ts', '**/*.html'],\n 'nextjs': ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n 'testing': ['**/*.test.*', '**/*.spec.*'],\n 'api': ['**/api/**/*', '**/routes/**/*'],\n };\n\n for (const tag of tags) {\n const normalized = tag.toLowerCase();\n if (tagExtensions[normalized]) {\n globs.push(...tagExtensions[normalized]);\n }\n }\n\n // Infer from content mentions\n if (content.includes('component') || content.includes('jsx') || content.includes('tsx')) {\n if (!globs.includes('**/*.tsx')) globs.push('**/*.tsx');\n if (!globs.includes('**/*.jsx')) globs.push('**/*.jsx');\n }\n\n if (content.includes('.py') || content.includes('python')) {\n if (!globs.includes('**/*.py')) globs.push('**/*.py');\n }\n\n // Remove duplicates\n return [...new Set(globs)];\n}\n\n/**\n * Cursor MDC Format Translator\n *\n * Cursor uses two formats:\n * 1. .cursorrules - Global rules file in project root\n * 2. .cursor/rules/*.mdc - Individual rule files with frontmatter\n *\n * MDC Format:\n * ```\n * ---\n * description: What this rule does\n * globs: [\"**\\/*.tsx\", \"**\\/*.jsx\"]\n * alwaysApply: false\n * ---\n * Instructions here...\n * ```\n */\nexport class CursorTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'cursor-mdc';\n readonly agents: AgentType[] = ['cursor'];\n\n /**\n * Parse Cursor MDC content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n // Extract name from filename\n let name = 'unnamed-skill';\n if (filename) {\n name = filename\n .replace(/\\.(mdc|md|cursorrules)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n\n if (!frontmatter) {\n // Plain .cursorrules file without frontmatter\n return {\n name,\n description: 'Cursor rules',\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n };\n }\n\n const description = (frontmatter.description as string) || 'Cursor rule';\n\n return {\n name: (frontmatter.name as string) || name,\n description,\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n tags: frontmatter.tags as string[] | undefined,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n };\n }\n\n /**\n * Check if content is Cursor MDC format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.mdc$/i.test(filename)) return true;\n if (/\\.cursorrules$/i.test(filename)) return true;\n if (/cursorrules/i.test(filename)) return true;\n }\n\n // Check for MDC-specific frontmatter fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter) {\n if ('globs' in frontmatter || 'alwaysApply' in frontmatter) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Cursor MDC content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter\n const frontmatter: Record<string, unknown> = {\n description: skill.description,\n };\n\n // Handle globs\n let globs = options.globs || skill.globs;\n if (!globs?.length) {\n // Try to infer globs from skill metadata\n globs = inferGlobs(skill);\n if (globs.length > 0) {\n warnings.push(`Inferred glob patterns: ${globs.join(', ')}`);\n }\n }\n if (globs?.length) {\n frontmatter.globs = globs;\n }\n\n // Handle alwaysApply\n const alwaysApply = options.alwaysApply ?? skill.alwaysApply;\n if (alwaysApply !== undefined) {\n frontmatter.alwaysApply = alwaysApply;\n }\n\n // Note features that don't translate well\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Cursor does not support tool restrictions');\n }\n if (skill.compatibility) {\n // Add as comment in content\n warnings.push('compatibility info added as comment');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.originalName = skill.name;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n }).trim();\n\n // Build content with optional compatibility note\n let body = skill.content;\n if (skill.compatibility && options.preserveComments !== false) {\n body = `<!-- Compatibility: ${skill.compatibility} -->\\n\\n${body}`;\n }\n\n const content = `---\\n${yamlContent}\\n---\\n\\n${body}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'cursor-mdc',\n targetAgent,\n };\n }\n\n /**\n * Generate .cursorrules content (alternative format)\n */\n generateCursorrules(skill: CanonicalSkill): string {\n // .cursorrules is just plain markdown without frontmatter\n let content = '';\n\n // Add header comment\n content += `# ${skill.name}\\n`;\n content += `# ${skill.description}\\n\\n`;\n\n // Add main content\n content += skill.content;\n\n return content;\n }\n\n /**\n * Get the expected filename for Cursor format\n */\n getFilename(skillName: string, _targetAgent: AgentType): string {\n // Convert to valid MDC filename\n const safeName = skillName\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n return `${safeName}.mdc`;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const cursorTranslator = new CursorTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n // Stop parsing metadata on first non-comment, non-empty line\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * Windsurf Rules Format Translator\n *\n * Windsurf uses plain markdown files (.windsurfrules) without YAML frontmatter.\n * Metadata can be embedded in HTML comments at the top.\n *\n * Format:\n * ```\n * <!-- name: skill-name -->\n * <!-- description: What it does -->\n *\n * # Guidelines\n *\n * Instructions here...\n * ```\n */\nexport class WindsurfTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['windsurf'];\n\n /**\n * Parse Windsurf rules content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from first heading if not in metadata\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(windsurfrules|md)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'unnamed-skill';\n }\n }\n\n // Try to extract description from metadata or first paragraph\n let description = metadata.description;\n if (!description) {\n // Get first non-heading paragraph\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'Windsurf rules';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'windsurf',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is Windsurf format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.windsurfrules$/i.test(filename)) return true;\n if (/windsurfrules/i.test(filename)) return true;\n }\n\n // Check for metadata comments\n if (content.startsWith('<!--') && content.includes('-->')) {\n const { metadata } = parseMetadataComments(content);\n if (Object.keys(metadata).length > 0) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Windsurf rules content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add metadata as HTML comments\n if (options.addMetadata !== false) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n if (skill.tags?.length) lines.push(`<!-- tags: ${skill.tags.join(', ')} -->`);\n if (options.addMetadata) {\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n }\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: Windsurf does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: Windsurf does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Windsurf does not support tool restrictions');\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for Windsurf format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return '.windsurfrules';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const windsurfTranslator = new WindsurfTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments (same as Windsurf)\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * GitHub Copilot Instructions Format Translator\n *\n * GitHub Copilot uses a markdown file at `.github/copilot-instructions.md`\n * for custom instructions. It's plain markdown with optional metadata comments.\n *\n * Format:\n * ```\n * <!-- This file provides custom instructions for GitHub Copilot -->\n *\n * # Coding Guidelines\n *\n * ## React Components\n * - Use functional components with hooks\n * - Prefer TypeScript\n * ```\n */\nexport class CopilotTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['github-copilot'];\n\n /**\n * Parse Copilot instructions into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from metadata or first heading\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(md)$/i, '')\n .replace(/copilot-instructions/i, 'copilot-rules')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'copilot-instructions';\n }\n }\n\n // Extract description\n let description = metadata.description;\n if (!description) {\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'GitHub Copilot instructions';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'github-copilot',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is GitHub Copilot format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/copilot-instructions\\.md$/i.test(filename)) return true;\n if (/copilot.*instructions/i.test(filename)) return true;\n }\n\n // Check for Copilot-specific comments\n if (content.toLowerCase().includes('github copilot')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate GitHub Copilot instructions content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add header comment\n lines.push('<!-- This file provides custom instructions for GitHub Copilot -->');\n lines.push('<!-- Generated by SkillKit - https://github.com/rohitg00/skillkit -->');\n lines.push('');\n\n // Add metadata as comments if requested\n if (options.addMetadata) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: GitHub Copilot does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: GitHub Copilot does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: GitHub Copilot does not support tool restrictions');\n }\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n warnings.push('Custom metadata fields not supported by GitHub Copilot');\n }\n\n // Add title if content doesn't start with one\n if (!skill.content.trim().startsWith('#')) {\n lines.push(`# ${skill.name.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}`);\n lines.push('');\n if (skill.description) {\n lines.push(skill.description);\n lines.push('');\n }\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for GitHub Copilot format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'copilot-instructions.md';\n }\n\n /**\n * Get the expected path for the instructions file\n */\n getPath(_skillName: string): string {\n return '.github/copilot-instructions.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const copilotTranslator = new CopilotTranslator();\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, basename } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport {\n type FormatTranslator,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatCategory,\n AGENT_FORMAT_MAP,\n} from './types.js';\nimport { skillMdTranslator } from './formats/skill-md.js';\nimport { cursorTranslator } from './formats/cursor.js';\nimport { windsurfTranslator } from './formats/windsurf.js';\nimport { copilotTranslator } from './formats/copilot.js';\n\n/**\n * Translator Registry\n *\n * Central registry for all format translators. Handles:\n * - Format detection\n * - Translation between any supported formats\n * - Finding the optimal translation path\n */\nexport class TranslatorRegistry {\n private translators: Map<FormatCategory, FormatTranslator> = new Map();\n private agentTranslators: Map<AgentType, FormatTranslator> = new Map();\n\n constructor() {\n // Register built-in translators\n this.register(skillMdTranslator);\n this.register(cursorTranslator);\n this.register(windsurfTranslator);\n this.register(copilotTranslator);\n }\n\n /**\n * Register a format translator\n */\n register(translator: FormatTranslator): void {\n this.translators.set(translator.format, translator);\n\n // Map agents to their translators\n for (const agent of translator.agents) {\n this.agentTranslators.set(agent, translator);\n }\n }\n\n /**\n * Get translator for a specific format\n */\n getTranslator(format: FormatCategory): FormatTranslator | undefined {\n return this.translators.get(format);\n }\n\n /**\n * Get translator for a specific agent\n */\n getTranslatorForAgent(agent: AgentType): FormatTranslator {\n // Check if we have a specific translator for this agent\n const specific = this.agentTranslators.get(agent);\n if (specific) {\n return specific;\n }\n\n // Fall back to SKILL.md translator (works for most agents)\n return skillMdTranslator;\n }\n\n /**\n * Get the format category for an agent\n */\n getFormatForAgent(agent: AgentType): FormatCategory {\n return AGENT_FORMAT_MAP[agent] || 'skill-md';\n }\n\n /**\n * Detect the format of content\n */\n detectFormat(content: string, filename?: string): FormatCategory | null {\n // Try each translator's detect method\n for (const [format, translator] of this.translators) {\n if (translator.detect(content, filename)) {\n return format;\n }\n }\n\n // Default to skill-md if content has YAML frontmatter\n if (content.startsWith('---')) {\n return 'skill-md';\n }\n\n return null;\n }\n\n /**\n * Detect the source agent from content\n */\n detectSourceAgent(content: string, filename?: string): AgentType | null {\n const format = this.detectFormat(content, filename);\n if (!format) return null;\n\n // Check filename for agent hints\n if (filename) {\n const lower = filename.toLowerCase();\n if (lower.includes('cursor') || lower.endsWith('.mdc')) return 'cursor';\n if (lower.includes('windsurf')) return 'windsurf';\n if (lower.includes('copilot')) return 'github-copilot';\n }\n\n // Return first agent that uses this format\n for (const [agent, agentFormat] of Object.entries(AGENT_FORMAT_MAP)) {\n if (agentFormat === format) {\n return agent as AgentType;\n }\n }\n\n return null;\n }\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const format = this.detectFormat(content, filename);\n if (!format) {\n // Try skill-md as fallback\n return skillMdTranslator.parse(content, filename);\n }\n\n const translator = this.translators.get(format);\n if (!translator) {\n return null;\n }\n\n return translator.parse(content, filename);\n }\n\n /**\n * Translate skill to target agent format\n */\n translate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const translator = this.getTranslatorForAgent(targetAgent);\n return translator.generate(skill, targetAgent, options);\n }\n\n /**\n * Translate content directly from one agent to another\n */\n translateContent(\n content: string,\n targetAgent: AgentType,\n options: TranslationOptions & { sourceFilename?: string } = {}\n ): TranslationResult {\n // Parse source content\n const skill = this.parse(content, options.sourceFilename);\n if (!skill) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: ['Failed to parse source content'],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n // Translate to target format\n return this.translate(skill, targetAgent, options);\n }\n\n /**\n * Translate a skill file to target agent format\n */\n translateFile(\n sourcePath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n if (!existsSync(sourcePath)) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: [`Source file not found: ${sourcePath}`],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n const content = readFileSync(sourcePath, 'utf-8');\n const filename = basename(sourcePath);\n\n return this.translateContent(content, targetAgent, {\n ...options,\n sourceFilename: filename,\n });\n }\n\n /**\n * Translate and write to target path\n */\n translateAndWrite(\n sourcePath: string,\n targetPath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const result = this.translateFile(sourcePath, targetAgent, options);\n\n if (result.success) {\n // Ensure target directory exists\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Write translated content\n writeFileSync(targetPath, result.content, 'utf-8');\n }\n\n return result;\n }\n\n /**\n * Get all supported agents\n */\n getSupportedAgents(): AgentType[] {\n return Object.keys(AGENT_FORMAT_MAP) as AgentType[];\n }\n\n /**\n * Get all registered formats\n */\n getRegisteredFormats(): FormatCategory[] {\n return Array.from(this.translators.keys());\n }\n\n /**\n * Check if translation is supported between two agents\n */\n canTranslate(from: AgentType, to: AgentType): boolean {\n // All agents can translate to/from each other via the canonical format\n return this.getSupportedAgents().includes(from) && this.getSupportedAgents().includes(to);\n }\n\n /**\n * Get translation compatibility info\n */\n getCompatibilityInfo(from: AgentType, to: AgentType): {\n supported: boolean;\n warnings: string[];\n lossyFields: string[];\n } {\n const fromFormat = this.getFormatForAgent(from);\n const toFormat = this.getFormatForAgent(to);\n const warnings: string[] = [];\n const lossyFields: string[] = [];\n\n // Cursor-specific features\n if (fromFormat === 'cursor-mdc' && toFormat !== 'cursor-mdc') {\n lossyFields.push('globs', 'alwaysApply');\n warnings.push('Cursor-specific features (globs, alwaysApply) will be preserved but not used');\n }\n\n // SKILL.md features going to markdown-rules\n if (fromFormat === 'skill-md' && toFormat === 'markdown-rules') {\n lossyFields.push('allowed-tools', 'metadata');\n warnings.push('Advanced SKILL.md features will be stored as comments');\n }\n\n return {\n supported: this.canTranslate(from, to),\n warnings,\n lossyFields,\n };\n }\n}\n\n/**\n * Default registry instance\n */\nexport const translatorRegistry = new TranslatorRegistry();\n","// Types\nexport {\n type FormatCategory,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatTranslator,\n type TranslationPath,\n type TranslatableSkillFrontmatter,\n AGENT_FORMAT_MAP,\n} from './types.js';\n\n// Format translators\nexport {\n SkillMdTranslator,\n skillMdTranslator,\n CursorTranslator,\n cursorTranslator,\n WindsurfTranslator,\n windsurfTranslator,\n CopilotTranslator,\n copilotTranslator,\n} from './formats/index.js';\n\n// Registry\nexport { TranslatorRegistry, translatorRegistry } from './registry.js';\n\n// Convenience functions\nimport { translatorRegistry } from './registry.js';\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill, TranslationResult, TranslationOptions } from './types.js';\n\n/**\n * Translate skill content from one agent format to another\n *\n * @example\n * ```ts\n * import { translateSkill } from '@skillkit/core';\n *\n * const result = translateSkill(skillMdContent, 'cursor');\n * console.log(result.content); // Cursor MDC format\n * ```\n */\nexport function translateSkill(\n content: string,\n targetAgent: AgentType,\n options?: TranslationOptions & { sourceFilename?: string }\n): TranslationResult {\n return translatorRegistry.translateContent(content, targetAgent, options);\n}\n\n/**\n * Translate a skill file to target agent format\n *\n * @example\n * ```ts\n * import { translateSkillFile } from '@skillkit/core';\n *\n * const result = translateSkillFile('./skills/my-skill/SKILL.md', 'cursor');\n * console.log(result.filename); // 'my-skill.mdc'\n * ```\n */\nexport function translateSkillFile(\n sourcePath: string,\n targetAgent: AgentType,\n options?: TranslationOptions\n): TranslationResult {\n return translatorRegistry.translateFile(sourcePath, targetAgent, options);\n}\n\n/**\n * Parse skill content into canonical format\n *\n * @example\n * ```ts\n * import { parseSkillContent } from '@skillkit/core';\n *\n * const skill = parseSkillContent(cursorMdcContent, 'my-rule.mdc');\n * console.log(skill.name); // 'my-rule'\n * ```\n */\nexport function parseSkillContent(content: string, filename?: string): CanonicalSkill | null {\n return translatorRegistry.parse(content, filename);\n}\n\n/**\n * Detect the format of skill content\n *\n * @example\n * ```ts\n * import { detectSkillFormat } from '@skillkit/core';\n *\n * const format = detectSkillFormat(content, 'SKILL.md');\n * console.log(format); // 'skill-md'\n * ```\n */\nexport function detectSkillFormat(content: string, filename?: string): string | null {\n return translatorRegistry.detectFormat(content, filename);\n}\n\n/**\n * Get all supported agent types for translation\n */\nexport function getSupportedTranslationAgents(): AgentType[] {\n return translatorRegistry.getSupportedAgents();\n}\n\n/**\n * Check if translation is possible between two agents\n */\nexport function canTranslate(from: AgentType, to: AgentType): boolean {\n return translatorRegistry.canTranslate(from, to);\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Detected dependency with version\n */\nexport const DependencyInfo = z.object({\n name: z.string(),\n version: z.string().optional(),\n dev: z.boolean().default(false),\n});\nexport type DependencyInfo = z.infer<typeof DependencyInfo>;\n\n/**\n * Detection result with confidence\n */\nexport const Detection = z.object({\n name: z.string(),\n version: z.string().optional(),\n confidence: z.number().min(0).max(100).default(100),\n source: z.string().optional(), // Where it was detected from\n});\nexport type Detection = z.infer<typeof Detection>;\n\n/**\n * Project stack detection results\n */\nexport const ProjectStack = z.object({\n languages: z.array(Detection).default([]),\n frameworks: z.array(Detection).default([]),\n libraries: z.array(Detection).default([]),\n styling: z.array(Detection).default([]),\n testing: z.array(Detection).default([]),\n databases: z.array(Detection).default([]),\n tools: z.array(Detection).default([]),\n runtime: z.array(Detection).default([]),\n});\nexport type ProjectStack = z.infer<typeof ProjectStack>;\n\n/**\n * Project patterns and conventions\n */\nexport const ProjectPatterns = z.object({\n components: z.string().optional(), // 'functional', 'class', 'mixed'\n stateManagement: z.string().optional(), // 'redux', 'zustand', 'context', etc.\n apiStyle: z.string().optional(), // 'rest', 'graphql', 'trpc', 'server-actions'\n styling: z.string().optional(), // 'css-modules', 'tailwind', 'styled-components'\n testing: z.string().optional(), // 'jest', 'vitest', 'playwright'\n linting: z.string().optional(), // 'eslint', 'biome'\n formatting: z.string().optional(), // 'prettier', 'biome'\n});\nexport type ProjectPatterns = z.infer<typeof ProjectPatterns>;\n\n/**\n * Skill preferences for the project\n */\nexport const SkillPreferences = z.object({\n installed: z.array(z.string()).default([]),\n recommended: z.array(z.string()).default([]),\n excluded: z.array(z.string()).default([]),\n autoSync: z.boolean().default(true),\n securityLevel: z.enum(['low', 'medium', 'high']).default('medium'),\n testingRequired: z.boolean().default(false),\n});\nexport type SkillPreferences = z.infer<typeof SkillPreferences>;\n\n/**\n * Agent configuration for the project\n */\nexport const AgentConfig = z.object({\n primary: z.string().optional(), // Primary agent\n detected: z.array(z.string()).default([]), // Auto-detected agents\n synced: z.array(z.string()).default([]), // Agents to sync skills to\n disabled: z.array(z.string()).default([]), // Agents to skip\n});\nexport type AgentConfig = z.infer<typeof AgentConfig>;\n\n/**\n * Full project context\n */\nexport const ProjectContext = z.object({\n version: z.literal(1),\n project: z.object({\n name: z.string(),\n description: z.string().optional(),\n type: z.string().optional(), // 'web-app', 'cli', 'library', 'api', etc.\n path: z.string().optional(),\n }),\n stack: ProjectStack,\n patterns: ProjectPatterns.optional(),\n skills: SkillPreferences.optional(),\n agents: AgentConfig.optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\nexport type ProjectContext = z.infer<typeof ProjectContext>;\n\n/**\n * Context file location\n */\nexport const CONTEXT_FILE = '.skillkit/context.yaml';\nexport const CONTEXT_DIR = '.skillkit';\n\n/**\n * Detection source types\n */\nexport type DetectionSource =\n | 'package.json'\n | 'tsconfig.json'\n | 'pyproject.toml'\n | 'Cargo.toml'\n | 'go.mod'\n | 'pubspec.yaml'\n | 'folder-structure'\n | 'config-file'\n | 'manual';\n\n/**\n * Project type hints based on detection\n */\nexport const PROJECT_TYPE_HINTS: Record<string, string[]> = {\n 'web-app': ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'remix'],\n 'api': ['express', 'fastify', 'koa', 'hono', 'fastapi', 'flask', 'django'],\n 'cli': ['commander', 'yargs', 'clipanion', 'clap', 'cobra'],\n 'library': ['rollup', 'esbuild', 'tsup', 'unbuild'],\n 'mobile': ['react-native', 'expo', 'flutter', 'ionic'],\n 'desktop': ['electron', 'tauri'],\n};\n\n/**\n * Framework detection patterns\n */\nexport interface FrameworkPattern {\n name: string;\n indicators: {\n dependencies?: string[];\n devDependencies?: string[];\n files?: string[];\n configFiles?: string[];\n };\n category: keyof ProjectStack;\n relatedTags?: string[];\n}\n\n/**\n * Context sync options\n */\nexport interface ContextSyncOptions {\n agents?: AgentType[];\n force?: boolean;\n dryRun?: boolean;\n skillsOnly?: boolean;\n}\n\n/**\n * Context export options\n */\nexport interface ContextExportOptions {\n output?: string;\n format?: 'yaml' | 'json';\n includeSkills?: boolean;\n includeAgents?: boolean;\n}\n\n/**\n * Context import options\n */\nexport interface ContextImportOptions {\n merge?: boolean;\n overwrite?: boolean;\n skipDetection?: boolean;\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { ProjectStack, Detection, ProjectPatterns } from './types.js';\n\n/**\n * Framework detection patterns\n */\nconst FRAMEWORK_PATTERNS = {\n // Frontend frameworks\n react: {\n dependencies: ['react', 'react-dom'],\n files: [],\n category: 'frameworks' as const,\n tags: ['react', 'frontend', 'ui'],\n },\n nextjs: {\n dependencies: ['next'],\n files: ['next.config.js', 'next.config.mjs', 'next.config.ts'],\n category: 'frameworks' as const,\n tags: ['nextjs', 'react', 'ssr', 'frontend'],\n },\n vue: {\n dependencies: ['vue'],\n files: [],\n category: 'frameworks' as const,\n tags: ['vue', 'frontend', 'ui'],\n },\n nuxt: {\n dependencies: ['nuxt'],\n files: ['nuxt.config.js', 'nuxt.config.ts'],\n category: 'frameworks' as const,\n tags: ['nuxt', 'vue', 'ssr', 'frontend'],\n },\n angular: {\n dependencies: ['@angular/core'],\n files: ['angular.json'],\n category: 'frameworks' as const,\n tags: ['angular', 'frontend', 'ui'],\n },\n svelte: {\n dependencies: ['svelte'],\n files: ['svelte.config.js'],\n category: 'frameworks' as const,\n tags: ['svelte', 'frontend', 'ui'],\n },\n remix: {\n dependencies: ['@remix-run/react'],\n files: ['remix.config.js'],\n category: 'frameworks' as const,\n tags: ['remix', 'react', 'ssr', 'frontend'],\n },\n astro: {\n dependencies: ['astro'],\n files: ['astro.config.mjs', 'astro.config.ts'],\n category: 'frameworks' as const,\n tags: ['astro', 'static', 'frontend'],\n },\n solid: {\n dependencies: ['solid-js'],\n files: [],\n category: 'frameworks' as const,\n tags: ['solid', 'frontend', 'ui'],\n },\n\n // Backend frameworks\n express: {\n dependencies: ['express'],\n files: [],\n category: 'frameworks' as const,\n tags: ['express', 'nodejs', 'api', 'backend'],\n },\n fastify: {\n dependencies: ['fastify'],\n files: [],\n category: 'frameworks' as const,\n tags: ['fastify', 'nodejs', 'api', 'backend'],\n },\n hono: {\n dependencies: ['hono'],\n files: [],\n category: 'frameworks' as const,\n tags: ['hono', 'edge', 'api', 'backend'],\n },\n koa: {\n dependencies: ['koa'],\n files: [],\n category: 'frameworks' as const,\n tags: ['koa', 'nodejs', 'api', 'backend'],\n },\n nestjs: {\n dependencies: ['@nestjs/core'],\n files: ['nest-cli.json'],\n category: 'frameworks' as const,\n tags: ['nestjs', 'nodejs', 'api', 'backend'],\n },\n\n // Mobile\n 'react-native': {\n dependencies: ['react-native'],\n files: ['metro.config.js', 'app.json'],\n category: 'frameworks' as const,\n tags: ['react-native', 'mobile', 'ios', 'android'],\n },\n expo: {\n dependencies: ['expo'],\n files: ['app.json', 'expo.json'],\n category: 'frameworks' as const,\n tags: ['expo', 'react-native', 'mobile'],\n },\n\n // Desktop\n electron: {\n dependencies: ['electron'],\n files: ['electron.js', 'electron-builder.json'],\n category: 'frameworks' as const,\n tags: ['electron', 'desktop'],\n },\n tauri: {\n dependencies: ['@tauri-apps/api'],\n files: ['tauri.conf.json', 'src-tauri'],\n category: 'frameworks' as const,\n tags: ['tauri', 'desktop', 'rust'],\n },\n};\n\n/**\n * Library detection patterns\n */\nconst LIBRARY_PATTERNS = {\n // State management\n redux: {\n dependencies: ['redux', '@reduxjs/toolkit'],\n category: 'libraries' as const,\n tags: ['redux', 'state-management'],\n },\n zustand: {\n dependencies: ['zustand'],\n category: 'libraries' as const,\n tags: ['zustand', 'state-management'],\n },\n jotai: {\n dependencies: ['jotai'],\n category: 'libraries' as const,\n tags: ['jotai', 'state-management'],\n },\n recoil: {\n dependencies: ['recoil'],\n category: 'libraries' as const,\n tags: ['recoil', 'state-management'],\n },\n mobx: {\n dependencies: ['mobx'],\n category: 'libraries' as const,\n tags: ['mobx', 'state-management'],\n },\n\n // Data fetching\n tanstack: {\n dependencies: ['@tanstack/react-query', '@tanstack/query-core'],\n category: 'libraries' as const,\n tags: ['tanstack', 'data-fetching', 'caching'],\n },\n swr: {\n dependencies: ['swr'],\n category: 'libraries' as const,\n tags: ['swr', 'data-fetching'],\n },\n trpc: {\n dependencies: ['@trpc/client', '@trpc/server'],\n category: 'libraries' as const,\n tags: ['trpc', 'api', 'typescript'],\n },\n graphql: {\n dependencies: ['graphql', '@apollo/client', 'urql'],\n category: 'libraries' as const,\n tags: ['graphql', 'api'],\n },\n\n // UI Components\n 'shadcn-ui': {\n dependencies: ['@radix-ui/react-slot'],\n files: ['components.json'],\n category: 'libraries' as const,\n tags: ['shadcn', 'ui', 'components'],\n },\n 'material-ui': {\n dependencies: ['@mui/material'],\n category: 'libraries' as const,\n tags: ['mui', 'material', 'ui', 'components'],\n },\n 'chakra-ui': {\n dependencies: ['@chakra-ui/react'],\n category: 'libraries' as const,\n tags: ['chakra', 'ui', 'components'],\n },\n 'ant-design': {\n dependencies: ['antd'],\n category: 'libraries' as const,\n tags: ['antd', 'ui', 'components'],\n },\n\n // Form handling\n 'react-hook-form': {\n dependencies: ['react-hook-form'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n formik: {\n dependencies: ['formik'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n zod: {\n dependencies: ['zod'],\n category: 'libraries' as const,\n tags: ['validation', 'schema', 'typescript'],\n },\n\n // Animation\n 'framer-motion': {\n dependencies: ['framer-motion'],\n category: 'libraries' as const,\n tags: ['animation', 'motion'],\n },\n};\n\n/**\n * Styling detection patterns\n */\nconst STYLING_PATTERNS = {\n tailwindcss: {\n dependencies: ['tailwindcss'],\n files: ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.cjs'],\n category: 'styling' as const,\n tags: ['tailwind', 'css', 'utility-first'],\n },\n 'styled-components': {\n dependencies: ['styled-components'],\n category: 'styling' as const,\n tags: ['styled-components', 'css-in-js'],\n },\n emotion: {\n dependencies: ['@emotion/react', '@emotion/styled'],\n category: 'styling' as const,\n tags: ['emotion', 'css-in-js'],\n },\n sass: {\n dependencies: ['sass', 'node-sass'],\n category: 'styling' as const,\n tags: ['sass', 'scss', 'css'],\n },\n less: {\n dependencies: ['less'],\n category: 'styling' as const,\n tags: ['less', 'css'],\n },\n 'css-modules': {\n files: ['*.module.css', '*.module.scss'],\n category: 'styling' as const,\n tags: ['css-modules', 'css'],\n },\n};\n\n/**\n * Testing detection patterns\n */\nconst TESTING_PATTERNS = {\n jest: {\n dependencies: ['jest'],\n files: ['jest.config.js', 'jest.config.ts'],\n category: 'testing' as const,\n tags: ['jest', 'testing', 'unit-testing'],\n },\n vitest: {\n dependencies: ['vitest'],\n files: ['vitest.config.ts', 'vitest.config.js'],\n category: 'testing' as const,\n tags: ['vitest', 'testing', 'unit-testing'],\n },\n playwright: {\n dependencies: ['@playwright/test'],\n files: ['playwright.config.ts', 'playwright.config.js'],\n category: 'testing' as const,\n tags: ['playwright', 'e2e', 'testing'],\n },\n cypress: {\n dependencies: ['cypress'],\n files: ['cypress.config.ts', 'cypress.config.js', 'cypress.json'],\n category: 'testing' as const,\n tags: ['cypress', 'e2e', 'testing'],\n },\n mocha: {\n dependencies: ['mocha'],\n category: 'testing' as const,\n tags: ['mocha', 'testing'],\n },\n 'testing-library': {\n dependencies: ['@testing-library/react', '@testing-library/vue'],\n category: 'testing' as const,\n tags: ['testing-library', 'testing'],\n },\n};\n\n/**\n * Database detection patterns\n */\nconst DATABASE_PATTERNS = {\n prisma: {\n dependencies: ['@prisma/client', 'prisma'],\n files: ['prisma/schema.prisma'],\n category: 'databases' as const,\n tags: ['prisma', 'orm', 'database'],\n },\n drizzle: {\n dependencies: ['drizzle-orm'],\n files: ['drizzle.config.ts'],\n category: 'databases' as const,\n tags: ['drizzle', 'orm', 'database'],\n },\n typeorm: {\n dependencies: ['typeorm'],\n category: 'databases' as const,\n tags: ['typeorm', 'orm', 'database'],\n },\n mongoose: {\n dependencies: ['mongoose'],\n category: 'databases' as const,\n tags: ['mongoose', 'mongodb', 'database'],\n },\n supabase: {\n dependencies: ['@supabase/supabase-js'],\n category: 'databases' as const,\n tags: ['supabase', 'postgres', 'database', 'auth'],\n },\n firebase: {\n dependencies: ['firebase', 'firebase-admin'],\n category: 'databases' as const,\n tags: ['firebase', 'database', 'auth'],\n },\n};\n\n/**\n * Tool detection patterns\n */\nconst TOOL_PATTERNS = {\n eslint: {\n dependencies: ['eslint'],\n files: ['.eslintrc', '.eslintrc.js', '.eslintrc.json', 'eslint.config.js'],\n category: 'tools' as const,\n tags: ['eslint', 'linting'],\n },\n prettier: {\n dependencies: ['prettier'],\n files: ['.prettierrc', '.prettierrc.js', 'prettier.config.js'],\n category: 'tools' as const,\n tags: ['prettier', 'formatting'],\n },\n biome: {\n dependencies: ['@biomejs/biome'],\n files: ['biome.json'],\n category: 'tools' as const,\n tags: ['biome', 'linting', 'formatting'],\n },\n husky: {\n dependencies: ['husky'],\n files: ['.husky'],\n category: 'tools' as const,\n tags: ['husky', 'git-hooks'],\n },\n 'lint-staged': {\n dependencies: ['lint-staged'],\n category: 'tools' as const,\n tags: ['lint-staged', 'git-hooks'],\n },\n turbo: {\n dependencies: ['turbo'],\n files: ['turbo.json'],\n category: 'tools' as const,\n tags: ['turbo', 'monorepo', 'build'],\n },\n nx: {\n dependencies: ['nx'],\n files: ['nx.json'],\n category: 'tools' as const,\n tags: ['nx', 'monorepo', 'build'],\n },\n docker: {\n files: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],\n category: 'tools' as const,\n tags: ['docker', 'containers'],\n },\n};\n\n/**\n * Project Detector\n *\n * Analyzes a project directory to detect the technology stack,\n * frameworks, libraries, and patterns used.\n */\nexport class ProjectDetector {\n private projectPath: string;\n private packageJson: Record<string, unknown> | null = null;\n private files: Set<string> = new Set();\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n /**\n * Analyze the project and return detected stack\n */\n analyze(): ProjectStack {\n // Load package.json if exists\n this.loadPackageJson();\n\n // Scan root files\n this.scanFiles();\n\n // Detect everything\n const stack: ProjectStack = {\n languages: this.detectLanguages(),\n frameworks: this.detectFromPatterns(FRAMEWORK_PATTERNS),\n libraries: this.detectFromPatterns(LIBRARY_PATTERNS),\n styling: this.detectFromPatterns(STYLING_PATTERNS),\n testing: this.detectFromPatterns(TESTING_PATTERNS),\n databases: this.detectFromPatterns(DATABASE_PATTERNS),\n tools: this.detectFromPatterns(TOOL_PATTERNS),\n runtime: this.detectRuntime(),\n };\n\n return stack;\n }\n\n /**\n * Detect project patterns and conventions\n */\n detectPatterns(): ProjectPatterns {\n const patterns: ProjectPatterns = {};\n\n // Detect component style\n if (this.hasFile('*.tsx') || this.hasFile('*.jsx')) {\n // Check for class components vs functional\n patterns.components = 'functional'; // Modern default\n }\n\n // Detect state management\n const deps = this.getDependencies();\n if (deps.has('zustand')) patterns.stateManagement = 'zustand';\n else if (deps.has('@reduxjs/toolkit') || deps.has('redux')) patterns.stateManagement = 'redux';\n else if (deps.has('jotai')) patterns.stateManagement = 'jotai';\n else if (deps.has('recoil')) patterns.stateManagement = 'recoil';\n else if (deps.has('mobx')) patterns.stateManagement = 'mobx';\n\n // Detect API style\n if (deps.has('@trpc/client')) patterns.apiStyle = 'trpc';\n else if (deps.has('graphql') || deps.has('@apollo/client')) patterns.apiStyle = 'graphql';\n else if (deps.has('next') && this.hasFile('app/**/actions.ts')) patterns.apiStyle = 'server-actions';\n else patterns.apiStyle = 'rest';\n\n // Detect styling\n if (deps.has('tailwindcss')) patterns.styling = 'tailwind';\n else if (deps.has('styled-components')) patterns.styling = 'styled-components';\n else if (deps.has('@emotion/react')) patterns.styling = 'emotion';\n else if (this.hasFile('*.module.css')) patterns.styling = 'css-modules';\n\n // Detect testing\n if (deps.has('vitest')) patterns.testing = 'vitest';\n else if (deps.has('jest')) patterns.testing = 'jest';\n else if (deps.has('@playwright/test')) patterns.testing = 'playwright';\n else if (deps.has('cypress')) patterns.testing = 'cypress';\n\n // Detect linting\n if (deps.has('@biomejs/biome')) patterns.linting = 'biome';\n else if (deps.has('eslint')) patterns.linting = 'eslint';\n\n // Detect formatting\n if (deps.has('@biomejs/biome')) patterns.formatting = 'biome';\n else if (deps.has('prettier')) patterns.formatting = 'prettier';\n\n return patterns;\n }\n\n /**\n * Detect project type\n */\n detectProjectType(): string {\n const deps = this.getDependencies();\n\n // Check for specific project types\n if (deps.has('react-native') || deps.has('expo')) return 'mobile';\n if (deps.has('electron') || deps.has('@tauri-apps/api')) return 'desktop';\n if (deps.has('next') || deps.has('nuxt') || deps.has('remix')) return 'web-app';\n if (deps.has('express') || deps.has('fastify') || deps.has('hono')) return 'api';\n if (deps.has('commander') || deps.has('clipanion') || deps.has('yargs')) return 'cli';\n\n // Check for library indicators\n if (this.hasFile('rollup.config.js') || this.hasFile('tsup.config.ts')) return 'library';\n\n // Default\n if (deps.has('react') || deps.has('vue') || deps.has('svelte')) return 'web-app';\n\n return 'unknown';\n }\n\n /**\n * Get project name\n */\n getProjectName(): string {\n if (this.packageJson && typeof this.packageJson.name === 'string') {\n return this.packageJson.name;\n }\n return basename(this.projectPath);\n }\n\n /**\n * Get project description\n */\n getProjectDescription(): string | undefined {\n if (this.packageJson && typeof this.packageJson.description === 'string') {\n return this.packageJson.description;\n }\n return undefined;\n }\n\n // Private helpers\n\n private loadPackageJson(): void {\n const packageJsonPath = join(this.projectPath, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n this.packageJson = JSON.parse(content);\n } catch {\n this.packageJson = null;\n }\n }\n }\n\n private scanFiles(): void {\n try {\n const entries = readdirSync(this.projectPath, { withFileTypes: true });\n for (const entry of entries) {\n this.files.add(entry.name);\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n // Scan one level deep for common config locations\n try {\n const subEntries = readdirSync(join(this.projectPath, entry.name));\n for (const subEntry of subEntries) {\n this.files.add(`${entry.name}/${subEntry}`);\n }\n } catch {\n // Ignore permission errors\n }\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n private getDependencies(): Set<string> {\n const deps = new Set<string>();\n if (!this.packageJson) return deps;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n if (dependencies) {\n for (const dep of Object.keys(dependencies)) {\n deps.add(dep);\n }\n }\n if (devDependencies) {\n for (const dep of Object.keys(devDependencies)) {\n deps.add(dep);\n }\n }\n\n return deps;\n }\n\n private getVersion(depName: string): string | undefined {\n if (!this.packageJson) return undefined;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n const version = dependencies?.[depName] || devDependencies?.[depName];\n if (version) {\n // Clean version string (remove ^, ~, etc.)\n return version.replace(/^[\\^~>=<]+/, '');\n }\n return undefined;\n }\n\n private hasFile(pattern: string): boolean {\n if (pattern.includes('*')) {\n // Simple glob matching\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\n for (const file of this.files) {\n if (regex.test(file)) return true;\n }\n return false;\n }\n return this.files.has(pattern);\n }\n\n private detectLanguages(): Detection[] {\n const languages: Detection[] = [];\n\n // TypeScript\n if (this.hasFile('tsconfig.json') || this.files.has('*.ts')) {\n const tsVersion = this.getVersion('typescript');\n languages.push({\n name: 'typescript',\n version: tsVersion,\n confidence: 100,\n source: 'tsconfig.json',\n });\n }\n\n // JavaScript (if no TypeScript, or alongside)\n if (this.hasFile('jsconfig.json') || (this.packageJson && !this.hasFile('tsconfig.json'))) {\n languages.push({\n name: 'javascript',\n confidence: 90,\n source: 'package.json',\n });\n }\n\n // Python\n if (this.hasFile('pyproject.toml') || this.hasFile('requirements.txt')) {\n languages.push({\n name: 'python',\n confidence: 100,\n source: 'pyproject.toml',\n });\n }\n\n // Rust\n if (this.hasFile('Cargo.toml')) {\n languages.push({\n name: 'rust',\n confidence: 100,\n source: 'Cargo.toml',\n });\n }\n\n // Go\n if (this.hasFile('go.mod')) {\n languages.push({\n name: 'go',\n confidence: 100,\n source: 'go.mod',\n });\n }\n\n return languages;\n }\n\n private detectRuntime(): Detection[] {\n const runtime: Detection[] = [];\n\n // Node.js\n if (this.packageJson) {\n const engines = this.packageJson.engines as Record<string, string> | undefined;\n const nodeVersion = engines?.node;\n runtime.push({\n name: 'nodejs',\n version: nodeVersion?.replace(/[>=<^~]+/g, ''),\n confidence: 100,\n source: 'package.json',\n });\n }\n\n // Bun\n if (this.hasFile('bun.lockb') || this.hasFile('bunfig.toml')) {\n runtime.push({\n name: 'bun',\n confidence: 100,\n source: 'bun.lockb',\n });\n }\n\n // Deno\n if (this.hasFile('deno.json') || this.hasFile('deno.jsonc')) {\n runtime.push({\n name: 'deno',\n confidence: 100,\n source: 'deno.json',\n });\n }\n\n return runtime;\n }\n\n private detectFromPatterns(\n patterns: Record<string, { dependencies?: string[]; files?: string[]; category: keyof ProjectStack; tags?: string[] }>\n ): Detection[] {\n const detected: Detection[] = [];\n const deps = this.getDependencies();\n\n for (const [name, pattern] of Object.entries(patterns)) {\n let found = false;\n let source: string | undefined;\n\n // Check dependencies\n if (pattern.dependencies) {\n for (const dep of pattern.dependencies) {\n if (deps.has(dep)) {\n found = true;\n source = 'package.json';\n break;\n }\n }\n }\n\n // Check files\n if (!found && pattern.files) {\n for (const file of pattern.files) {\n if (this.hasFile(file)) {\n found = true;\n source = file;\n break;\n }\n }\n }\n\n if (found) {\n const version = pattern.dependencies ? this.getVersion(pattern.dependencies[0]) : undefined;\n detected.push({\n name,\n version,\n confidence: 100,\n source,\n });\n }\n }\n\n return detected;\n }\n}\n\n/**\n * Analyze a project and return the detected stack\n */\nexport function analyzeProject(projectPath: string): ProjectStack {\n const detector = new ProjectDetector(projectPath);\n return detector.analyze();\n}\n\n/**\n * Get all relevant tags from a project stack\n */\nexport function getStackTags(stack: ProjectStack): string[] {\n const tags = new Set<string>();\n\n const addTags = (detections: Detection[], patterns: Record<string, { tags?: string[] }>) => {\n for (const detection of detections) {\n const pattern = patterns[detection.name];\n if (pattern?.tags) {\n for (const tag of pattern.tags) {\n tags.add(tag);\n }\n } else {\n tags.add(detection.name);\n }\n }\n };\n\n // Add language tags\n for (const lang of stack.languages) {\n tags.add(lang.name);\n }\n\n // Add framework tags\n addTags(stack.frameworks, FRAMEWORK_PATTERNS);\n addTags(stack.libraries, LIBRARY_PATTERNS);\n addTags(stack.styling, STYLING_PATTERNS);\n addTags(stack.testing, TESTING_PATTERNS);\n addTags(stack.databases, DATABASE_PATTERNS);\n\n return Array.from(tags);\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport {\n type ProjectContext,\n type ProjectStack,\n type SkillPreferences,\n type AgentConfig,\n type ContextExportOptions,\n type ContextImportOptions,\n type Detection,\n ProjectContext as ProjectContextSchema,\n CONTEXT_FILE,\n CONTEXT_DIR,\n} from './types.js';\nimport { ProjectDetector, getStackTags } from './detector.js';\nimport type { AgentType } from '../types.js';\n\n/**\n * Context Manager\n *\n * Handles loading, saving, and managing project contexts.\n * The context is stored in .skillkit/context.yaml\n */\nexport class ContextManager {\n private projectPath: string;\n private context: ProjectContext | null = null;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Get the context file path\n */\n getContextPath(): string {\n return join(this.projectPath, CONTEXT_FILE);\n }\n\n /**\n * Check if context exists\n */\n exists(): boolean {\n return existsSync(this.getContextPath());\n }\n\n /**\n * Load context from file\n */\n load(): ProjectContext | null {\n const contextPath = this.getContextPath();\n\n if (!existsSync(contextPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(contextPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = ProjectContextSchema.safeParse(data);\n\n if (parsed.success) {\n this.context = parsed.data;\n return this.context;\n }\n\n // Return raw data if schema validation fails but file exists\n console.warn('Context file exists but failed schema validation');\n return null;\n } catch (error) {\n console.warn('Failed to load context:', error);\n return null;\n }\n }\n\n /**\n * Save context to file\n */\n save(context: ProjectContext): void {\n const contextPath = this.getContextPath();\n const contextDir = join(this.projectPath, CONTEXT_DIR);\n\n // Ensure directory exists\n if (!existsSync(contextDir)) {\n mkdirSync(contextDir, { recursive: true });\n }\n\n // Update timestamp\n context.updatedAt = new Date().toISOString();\n\n // Stringify with nice formatting\n const content = stringifyYaml(context, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n\n writeFileSync(contextPath, content, 'utf-8');\n this.context = context;\n }\n\n /**\n * Initialize a new context from project detection\n */\n init(options: { force?: boolean; skipDetection?: boolean } = {}): ProjectContext {\n // Check if context already exists\n if (this.exists() && !options.force) {\n const existing = this.load();\n if (existing) {\n return existing;\n }\n }\n\n // Detect project\n const detector = new ProjectDetector(this.projectPath);\n const stack = options.skipDetection ? this.getEmptyStack() : detector.analyze();\n const patterns = options.skipDetection ? {} : detector.detectPatterns();\n const projectType = options.skipDetection ? 'unknown' : detector.detectProjectType();\n const projectName = detector.getProjectName();\n const projectDescription = detector.getProjectDescription();\n\n // Create new context\n const context: ProjectContext = {\n version: 1,\n project: {\n name: projectName,\n description: projectDescription,\n type: projectType,\n path: this.projectPath,\n },\n stack,\n patterns,\n skills: {\n installed: [],\n recommended: [],\n excluded: [],\n autoSync: true,\n securityLevel: 'medium',\n testingRequired: false,\n },\n agents: {\n primary: undefined,\n detected: [],\n synced: [],\n disabled: [],\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Save and return\n this.save(context);\n return context;\n }\n\n /**\n * Update context with new detection\n */\n refresh(): ProjectContext {\n const existing = this.load();\n const detector = new ProjectDetector(this.projectPath);\n const stack = detector.analyze();\n const patterns = detector.detectPatterns();\n const projectType = detector.detectProjectType();\n\n if (existing) {\n // Merge with existing\n const merged: ProjectContext = {\n ...existing,\n stack,\n patterns,\n project: {\n ...existing.project,\n type: projectType,\n },\n updatedAt: new Date().toISOString(),\n };\n\n this.save(merged);\n return merged;\n }\n\n // No existing context, initialize new\n return this.init();\n }\n\n /**\n * Get current context (load if not loaded)\n */\n get(): ProjectContext | null {\n if (this.context) {\n return this.context;\n }\n return this.load();\n }\n\n /**\n * Update skills in context\n */\n updateSkills(skills: Partial<SkillPreferences>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.skills = {\n ...context.skills,\n ...skills,\n } as SkillPreferences;\n\n this.save(context);\n }\n\n /**\n * Update agents in context\n */\n updateAgents(agents: Partial<AgentConfig>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.agents = {\n ...context.agents,\n ...agents,\n } as AgentConfig;\n\n this.save(context);\n }\n\n /**\n * Set primary agent\n */\n setPrimaryAgent(agent: AgentType): void {\n this.updateAgents({ primary: agent });\n }\n\n /**\n * Add agent to synced list\n */\n addSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.add(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Remove agent from synced list\n */\n removeSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.delete(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Add installed skill\n */\n addInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.add(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Remove installed skill\n */\n removeInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.delete(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Export context to file\n */\n export(options: ContextExportOptions = {}): string {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n // Clone and optionally filter\n const exported = { ...context };\n\n if (!options.includeSkills) {\n delete (exported as Record<string, unknown>).skills;\n }\n if (!options.includeAgents) {\n delete (exported as Record<string, unknown>).agents;\n }\n\n // Format\n if (options.format === 'json') {\n return JSON.stringify(exported, null, 2);\n }\n\n return stringifyYaml(exported, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n }\n\n /**\n * Import context from content\n */\n import(content: string, options: ContextImportOptions = {}): ProjectContext {\n // Parse content\n let data: unknown;\n try {\n // Try JSON first\n data = JSON.parse(content);\n } catch {\n // Try YAML\n data = parseYaml(content);\n }\n\n const parsed = ProjectContextSchema.safeParse(data);\n if (!parsed.success) {\n throw new Error(`Invalid context format: ${parsed.error.message}`);\n }\n\n const imported = parsed.data;\n\n if (options.merge && this.exists()) {\n const existing = this.load()!;\n const merged = this.mergeContexts(existing, imported);\n this.save(merged);\n return merged;\n }\n\n if (!options.overwrite && this.exists()) {\n throw new Error('Context already exists. Use --merge or --overwrite.');\n }\n\n this.save(imported);\n return imported;\n }\n\n /**\n * Merge two contexts\n */\n private mergeContexts(existing: ProjectContext, imported: ProjectContext): ProjectContext {\n return {\n version: 1,\n project: {\n ...existing.project,\n ...imported.project,\n },\n stack: this.mergeStacks(existing.stack, imported.stack),\n patterns: {\n ...existing.patterns,\n ...imported.patterns,\n },\n skills: {\n installed: [...new Set([...(existing.skills?.installed || []), ...(imported.skills?.installed || [])])],\n recommended: [...new Set([...(existing.skills?.recommended || []), ...(imported.skills?.recommended || [])])],\n excluded: [...new Set([...(existing.skills?.excluded || []), ...(imported.skills?.excluded || [])])],\n autoSync: imported.skills?.autoSync ?? existing.skills?.autoSync ?? true,\n securityLevel: imported.skills?.securityLevel ?? existing.skills?.securityLevel ?? 'medium',\n testingRequired: imported.skills?.testingRequired ?? existing.skills?.testingRequired ?? false,\n },\n agents: {\n primary: imported.agents?.primary ?? existing.agents?.primary,\n detected: [...new Set([...(existing.agents?.detected || []), ...(imported.agents?.detected || [])])],\n synced: [...new Set([...(existing.agents?.synced || []), ...(imported.agents?.synced || [])])],\n disabled: [...new Set([...(existing.agents?.disabled || []), ...(imported.agents?.disabled || [])])],\n },\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Merge two stacks\n */\n private mergeStacks(existing: ProjectStack, imported: ProjectStack): ProjectStack {\n const mergeArrays = (a: Detection[], b: Detection[]): Detection[] => {\n const names = new Set(a.map((item) => item.name));\n const result: Detection[] = [...a];\n for (const item of b) {\n if (!names.has(item.name)) {\n result.push(item);\n }\n }\n return result;\n };\n\n return {\n languages: mergeArrays(existing.languages, imported.languages),\n frameworks: mergeArrays(existing.frameworks, imported.frameworks),\n libraries: mergeArrays(existing.libraries, imported.libraries),\n styling: mergeArrays(existing.styling, imported.styling),\n testing: mergeArrays(existing.testing, imported.testing),\n databases: mergeArrays(existing.databases, imported.databases),\n tools: mergeArrays(existing.tools, imported.tools),\n runtime: mergeArrays(existing.runtime, imported.runtime),\n };\n }\n\n /**\n * Get empty stack\n */\n private getEmptyStack(): ProjectStack {\n return {\n languages: [],\n frameworks: [],\n libraries: [],\n styling: [],\n testing: [],\n databases: [],\n tools: [],\n runtime: [],\n };\n }\n\n /**\n * Get recommended skill tags based on stack\n */\n getRecommendedTags(): string[] {\n const context = this.get();\n if (!context) return [];\n\n return getStackTags(context.stack);\n }\n}\n\n/**\n * Create a context manager for the current directory\n */\nexport function createContextManager(projectPath?: string): ContextManager {\n return new ContextManager(projectPath);\n}\n\n/**\n * Load context from the current directory\n */\nexport function loadContext(projectPath?: string): ProjectContext | null {\n const manager = new ContextManager(projectPath);\n return manager.load();\n}\n\n/**\n * Initialize context in the current directory\n */\nexport function initContext(projectPath?: string, options?: { force?: boolean }): ProjectContext {\n const manager = new ContextManager(projectPath);\n return manager.init(options);\n}\n","import { existsSync, writeFileSync, mkdirSync, copyFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport type { ContextSyncOptions } from './types.js';\nimport { ContextManager } from './manager.js';\nimport { translateSkillFile } from '../translator/index.js';\nimport { findAllSkills } from '../skills.js';\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n agent: AgentType;\n skillsSynced: number;\n skillsSkipped: number;\n errors: string[];\n warnings: string[];\n files: string[];\n}\n\n/**\n * Overall sync report\n */\nexport interface SyncReport {\n totalAgents: number;\n successfulAgents: number;\n totalSkills: number;\n results: SyncResult[];\n}\n\n/**\n * Agent directory configuration\n */\nconst AGENT_DIRS: Record<AgentType, { skillsDir: string; configFile: string }> = {\n 'claude-code': { skillsDir: '.claude/skills', configFile: 'AGENTS.md' },\n 'cursor': { skillsDir: '.cursor/skills', configFile: '.cursorrules' },\n 'codex': { skillsDir: '.codex/skills', configFile: 'AGENTS.md' },\n 'gemini-cli': { skillsDir: '.gemini/skills', configFile: 'GEMINI.md' },\n 'opencode': { skillsDir: '.opencode/skills', configFile: 'AGENTS.md' },\n 'antigravity': { skillsDir: '.antigravity/skills', configFile: 'AGENTS.md' },\n 'amp': { skillsDir: '.agents/skills', configFile: 'AGENTS.md' },\n 'clawdbot': { skillsDir: 'skills', configFile: 'AGENTS.md' },\n 'droid': { skillsDir: '.factory/skills', configFile: 'AGENTS.md' },\n 'github-copilot': { skillsDir: '.github/skills', configFile: 'AGENTS.md' },\n 'goose': { skillsDir: '.goose/skills', configFile: 'AGENTS.md' },\n 'kilo': { skillsDir: '.kilocode/skills', configFile: 'AGENTS.md' },\n 'kiro-cli': { skillsDir: '.kiro/skills', configFile: 'AGENTS.md' },\n 'roo': { skillsDir: '.roo/skills', configFile: 'AGENTS.md' },\n 'trae': { skillsDir: '.trae/skills', configFile: 'AGENTS.md' },\n 'windsurf': { skillsDir: '.windsurf/skills', configFile: 'AGENTS.md' },\n 'universal': { skillsDir: '.agent/skills', configFile: 'AGENTS.md' },\n};\n\n/**\n * Context Sync\n *\n * Handles syncing skills across multiple AI agents.\n * Skills are translated to the appropriate format for each agent.\n */\nexport class ContextSync {\n private projectPath: string;\n private contextManager: ContextManager;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.contextManager = new ContextManager(projectPath);\n }\n\n /**\n * Detect which agents are installed/configured on the system\n */\n detectAgents(): AgentType[] {\n const detected: AgentType[] = [];\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const configPath = join(this.projectPath, config.configFile);\n\n // Check if either skills directory or config file exists\n if (existsSync(skillsPath) || existsSync(configPath)) {\n detected.push(agent as AgentType);\n }\n }\n\n // Also check for global indicators\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (homeDir) {\n // Check for Claude Code\n if (existsSync(join(homeDir, '.claude'))) {\n if (!detected.includes('claude-code')) detected.push('claude-code');\n }\n // Check for Cursor\n if (existsSync(join(homeDir, '.cursor'))) {\n if (!detected.includes('cursor')) detected.push('cursor');\n }\n }\n\n return detected;\n }\n\n /**\n * Get agents to sync to based on context\n */\n getTargetAgents(options: ContextSyncOptions = {}): AgentType[] {\n // If specific agents provided, use those\n if (options.agents?.length) {\n return options.agents;\n }\n\n // Load context\n const context = this.contextManager.get();\n if (context?.agents?.synced?.length) {\n return context.agents.synced as AgentType[];\n }\n\n // Auto-detect\n return this.detectAgents();\n }\n\n /**\n * Sync all skills to all target agents\n */\n async syncAll(options: ContextSyncOptions = {}): Promise<SyncReport> {\n const targetAgents = this.getTargetAgents(options);\n const results: SyncResult[] = [];\n\n // Get all installed skills from primary agent or first available\n const skills = this.getSourceSkills();\n\n for (const agent of targetAgents) {\n const result = await this.syncToAgent(agent, skills, options);\n results.push(result);\n }\n\n // Update context with synced agents\n if (!options.dryRun) {\n this.contextManager.updateAgents({\n detected: this.detectAgents(),\n synced: targetAgents,\n });\n }\n\n return {\n totalAgents: targetAgents.length,\n successfulAgents: results.filter((r) => r.success).length,\n totalSkills: skills.length,\n results,\n };\n }\n\n /**\n * Sync skills to a specific agent\n */\n async syncToAgent(\n agent: AgentType,\n skills?: Array<{ name: string; path: string }>,\n options: ContextSyncOptions = {}\n ): Promise<SyncResult> {\n const result: SyncResult = {\n success: true,\n agent,\n skillsSynced: 0,\n skillsSkipped: 0,\n errors: [],\n warnings: [],\n files: [],\n };\n\n // Get skills if not provided\n const sourceSkills = skills || this.getSourceSkills();\n\n // Get target directory\n const agentConfig = AGENT_DIRS[agent];\n if (!agentConfig) {\n result.success = false;\n result.errors.push(`Unknown agent: ${agent}`);\n return result;\n }\n\n const targetDir = join(this.projectPath, agentConfig.skillsDir);\n\n // Create target directory if not dry run\n if (!options.dryRun && !existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Sync each skill\n for (const skill of sourceSkills) {\n try {\n const skillResult = await this.syncSkill(skill, agent, targetDir, options);\n if (skillResult.synced) {\n result.skillsSynced++;\n result.files.push(skillResult.file!);\n } else {\n result.skillsSkipped++;\n if (skillResult.warning) {\n result.warnings.push(skillResult.warning);\n }\n }\n } catch (error) {\n result.errors.push(`Failed to sync ${skill.name}: ${error}`);\n result.skillsSkipped++;\n }\n }\n\n if (result.errors.length > 0) {\n result.success = false;\n }\n\n return result;\n }\n\n /**\n * Sync a single skill to an agent\n */\n private async syncSkill(\n skill: { name: string; path: string },\n agent: AgentType,\n targetDir: string,\n options: ContextSyncOptions\n ): Promise<{ synced: boolean; file?: string; warning?: string }> {\n const skillMdPath = join(skill.path, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return { synced: false, warning: `No SKILL.md found for ${skill.name}` };\n }\n\n // Translate skill to target format\n const translation = translateSkillFile(skillMdPath, agent, {\n addMetadata: true,\n });\n\n if (!translation.success) {\n return { synced: false, warning: `Translation failed for ${skill.name}` };\n }\n\n // Determine output path\n const targetSkillDir = join(targetDir, skill.name);\n const outputPath = join(targetSkillDir, translation.filename);\n\n // Check if file exists and skip if not forcing\n if (existsSync(outputPath) && !options.force) {\n return { synced: false, warning: `${skill.name} already exists (use --force to overwrite)` };\n }\n\n // Write file (unless dry run)\n if (!options.dryRun) {\n if (!existsSync(targetSkillDir)) {\n mkdirSync(targetSkillDir, { recursive: true });\n }\n writeFileSync(outputPath, translation.content, 'utf-8');\n\n // Copy additional skill assets if they exist\n await this.copySkillAssets(skill.path, targetSkillDir);\n }\n\n return { synced: true, file: outputPath };\n }\n\n /**\n * Copy additional skill assets (references, scripts, etc.)\n */\n private async copySkillAssets(sourcePath: string, targetPath: string): Promise<void> {\n const assetDirs = ['references', 'scripts', 'assets', 'templates'];\n\n for (const assetDir of assetDirs) {\n const sourceAssetDir = join(sourcePath, assetDir);\n if (existsSync(sourceAssetDir)) {\n const targetAssetDir = join(targetPath, assetDir);\n if (!existsSync(targetAssetDir)) {\n mkdirSync(targetAssetDir, { recursive: true });\n }\n\n // Copy files\n try {\n const files = readdirSync(sourceAssetDir);\n for (const file of files) {\n const sourcefile = join(sourceAssetDir, file);\n const targetFile = join(targetAssetDir, file);\n copyFileSync(sourcefile, targetFile);\n }\n } catch {\n // Ignore copy errors\n }\n }\n }\n }\n\n /**\n * Get source skills to sync\n */\n private getSourceSkills(): Array<{ name: string; path: string }> {\n const context = this.contextManager.get();\n const primaryAgent = context?.agents?.primary as AgentType | undefined;\n\n // Search directories based on primary agent or common locations\n const searchDirs: string[] = [];\n\n if (primaryAgent && AGENT_DIRS[primaryAgent]) {\n searchDirs.push(join(this.projectPath, AGENT_DIRS[primaryAgent].skillsDir));\n }\n\n // Add common skill locations\n const commonDirs = [\n '.claude/skills',\n '.cursor/skills',\n '.agent/skills',\n 'skills',\n ];\n\n for (const dir of commonDirs) {\n const fullPath = join(this.projectPath, dir);\n if (!searchDirs.includes(fullPath) && existsSync(fullPath)) {\n searchDirs.push(fullPath);\n }\n }\n\n // Find all skills\n const skills = findAllSkills(searchDirs);\n return skills.map((s) => ({ name: s.name, path: s.path }));\n }\n\n /**\n * Check sync status - which agents have which skills\n */\n checkStatus(): Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }> {\n const status: Record<string, { hasSkills: boolean; skillCount: number; skills: string[] }> = {};\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const skills: string[] = [];\n\n if (existsSync(skillsPath)) {\n try {\n const entries = readdirSync(skillsPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n skills.push(entry.name);\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n status[agent] = {\n hasSkills: skills.length > 0,\n skillCount: skills.length,\n skills,\n };\n }\n\n return status as Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }>;\n }\n}\n\n/**\n * Create a context sync instance\n */\nexport function createContextSync(projectPath?: string): ContextSync {\n return new ContextSync(projectPath);\n}\n\n/**\n * Sync skills to all detected agents\n */\nexport async function syncToAllAgents(\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncReport> {\n const sync = new ContextSync(projectPath);\n return sync.syncAll(options);\n}\n\n/**\n * Sync skills to a specific agent\n */\nexport async function syncToAgent(\n agent: AgentType,\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncResult> {\n const sync = new ContextSync(projectPath);\n return sync.syncToAgent(agent, undefined, options);\n}\n","/**\n * Context Loader\n *\n * Smart context loading with token budgets and category-based loading.\n */\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Context category with size limits\n */\nexport interface ContextCategory {\n /** Category name */\n name: string;\n /** Maximum tokens for this category */\n maxTokens: number;\n /** Whether to always load this category */\n alwaysLoad: boolean;\n /** File path (relative to project) */\n file?: string;\n /** Inline content */\n content?: string;\n}\n\n/**\n * Context loading options\n */\nexport interface ContextLoadOptions {\n /** Total token budget */\n totalBudget?: number;\n /** Categories to load (load all if not specified) */\n categories?: string[];\n /** Whether to warn when approaching budget limits */\n warnOnBudgetLimit?: boolean;\n}\n\n/**\n * Loaded context result\n */\nexport interface LoadedContext {\n /** All loaded content combined */\n content: string;\n /** Total tokens used */\n totalTokens: number;\n /** Budget remaining */\n budgetRemaining: number;\n /** Categories loaded */\n categoriesLoaded: string[];\n /** Categories skipped (due to budget or not found) */\n categoriesSkipped: string[];\n /** Warnings generated */\n warnings: string[];\n /** Whether budget is near limit (>50% used) */\n nearBudgetLimit: boolean;\n /** Whether context is degraded (>70% used) */\n contextDegraded: boolean;\n}\n\n/**\n * Default context categories\n */\nexport const DEFAULT_CONTEXT_CATEGORIES: ContextCategory[] = [\n {\n name: 'project',\n maxTokens: 2000,\n alwaysLoad: true,\n file: '.skillkit/context.yaml',\n },\n {\n name: 'requirements',\n maxTokens: 5000,\n alwaysLoad: false,\n file: 'REQUIREMENTS.md',\n },\n {\n name: 'decisions',\n maxTokens: 1000,\n alwaysLoad: false,\n file: '.skillkit/decisions.yaml',\n },\n {\n name: 'readme',\n maxTokens: 3000,\n alwaysLoad: false,\n file: 'README.md',\n },\n];\n\n/**\n * Rough estimate of tokens from text\n * (approximation: ~4 characters per token for English text)\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Context Loader class\n */\nexport class ContextLoader {\n private projectPath: string;\n private categories: ContextCategory[];\n private defaultBudget: number;\n\n constructor(projectPath: string, options?: { categories?: ContextCategory[]; defaultBudget?: number }) {\n this.projectPath = projectPath;\n this.categories = options?.categories || DEFAULT_CONTEXT_CATEGORIES;\n this.defaultBudget = options?.defaultBudget || 32000; // Default ~32k tokens\n }\n\n /**\n * Load context based on options\n */\n load(options: ContextLoadOptions = {}): LoadedContext {\n const totalBudget = options.totalBudget || this.defaultBudget;\n const requestedCategories = options.categories;\n\n const result: LoadedContext = {\n content: '',\n totalTokens: 0,\n budgetRemaining: totalBudget,\n categoriesLoaded: [],\n categoriesSkipped: [],\n warnings: [],\n nearBudgetLimit: false,\n contextDegraded: false,\n };\n\n const contentParts: string[] = [];\n\n // First pass: load alwaysLoad categories\n for (const category of this.categories) {\n if (!category.alwaysLoad) continue;\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Second pass: load requested categories\n for (const category of this.categories) {\n if (category.alwaysLoad) continue; // Already loaded\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Combine content\n result.content = contentParts.join('\\n\\n---\\n\\n');\n\n // Check budget status\n const usagePercent = (result.totalTokens / totalBudget) * 100;\n result.nearBudgetLimit = usagePercent >= 50;\n result.contextDegraded = usagePercent >= 70;\n\n // Add warnings for budget limits\n if (result.contextDegraded && options.warnOnBudgetLimit !== false) {\n result.warnings.push(\n `Context usage at ${Math.round(usagePercent)}% - quality may degrade. Consider spawning a fresh agent.`\n );\n } else if (result.nearBudgetLimit && options.warnOnBudgetLimit !== false) {\n result.warnings.push(`Context usage at ${Math.round(usagePercent)}% - approaching limit.`);\n }\n\n return result;\n }\n\n /**\n * Load a single category\n */\n private loadCategory(\n category: ContextCategory,\n result: LoadedContext,\n contentParts: string[],\n totalBudget: number\n ): void {\n let content: string | null = null;\n\n // Load from file\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n result.categoriesSkipped.push(category.name);\n return;\n }\n }\n }\n\n // Use inline content if no file\n if (!content && category.content) {\n content = category.content;\n }\n\n if (!content) {\n result.categoriesSkipped.push(category.name);\n return;\n }\n\n // Estimate tokens\n const tokens = estimateTokens(content);\n\n // Check category limit\n if (tokens > category.maxTokens) {\n // Truncate to category limit\n const truncateChars = category.maxTokens * 4;\n content = content.slice(0, truncateChars) + '\\n\\n[... content truncated ...]';\n result.warnings.push(\n `Category \"${category.name}\" truncated to ${category.maxTokens} tokens`\n );\n }\n\n // Check total budget\n const truncatedTokens = estimateTokens(content);\n if (result.totalTokens + truncatedTokens > totalBudget) {\n // Skip if would exceed budget\n result.categoriesSkipped.push(category.name);\n result.warnings.push(\n `Category \"${category.name}\" skipped - would exceed budget`\n );\n return;\n }\n\n // Add to result\n contentParts.push(`# ${category.name.toUpperCase()}\\n\\n${content}`);\n result.totalTokens += truncatedTokens;\n result.budgetRemaining = totalBudget - result.totalTokens;\n result.categoriesLoaded.push(category.name);\n }\n\n /**\n * Get category by name\n */\n getCategory(name: string): ContextCategory | undefined {\n return this.categories.find((c) => c.name === name);\n }\n\n /**\n * Add a custom category\n */\n addCategory(category: ContextCategory): void {\n const existing = this.categories.findIndex((c) => c.name === category.name);\n if (existing >= 0) {\n this.categories[existing] = category;\n } else {\n this.categories.push(category);\n }\n }\n\n /**\n * Remove a category\n */\n removeCategory(name: string): void {\n this.categories = this.categories.filter((c) => c.name !== name);\n }\n\n /**\n * Get estimated context size for categories\n */\n estimateSize(categoryNames?: string[]): { category: string; tokens: number; available: boolean }[] {\n const estimates: { category: string; tokens: number; available: boolean }[] = [];\n\n for (const category of this.categories) {\n if (categoryNames && !categoryNames.includes(category.name)) continue;\n\n let tokens = 0;\n let available = false;\n\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n const stat = statSync(filePath);\n tokens = Math.ceil(stat.size / 4); // Rough estimate\n available = true;\n } catch {\n // File not accessible\n }\n }\n } else if (category.content) {\n tokens = estimateTokens(category.content);\n available = true;\n }\n\n estimates.push({\n category: category.name,\n tokens: Math.min(tokens, category.maxTokens),\n available,\n });\n }\n\n return estimates;\n }\n\n /**\n * Check if context would exceed budget threshold\n */\n wouldExceedThreshold(additionalTokens: number, threshold: number = 0.7): boolean {\n const currentTokens = this.load().totalTokens;\n const newTotal = currentTokens + additionalTokens;\n return newTotal / this.defaultBudget > threshold;\n }\n\n /**\n * Suggest spawning fresh agent if context is degraded\n */\n shouldSpawnFreshAgent(): { should: boolean; reason?: string } {\n const context = this.load();\n\n if (context.contextDegraded) {\n return {\n should: true,\n reason: `Context at ${Math.round((context.totalTokens / this.defaultBudget) * 100)}% capacity`,\n };\n }\n\n return { should: false };\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(\n projectPath: string,\n options?: { categories?: ContextCategory[]; defaultBudget?: number }\n): ContextLoader {\n return new ContextLoader(projectPath, options);\n}\n","import { z } from 'zod';\nimport type { ProjectStack } from '../context/types.js';\n\n/**\n * Skill summary for recommendation matching\n */\nexport const SkillSummary = z.object({\n name: z.string(),\n description: z.string().optional(),\n source: z.string().optional(), // Repository source\n tags: z.array(z.string()).default([]),\n compatibility: z\n .object({\n frameworks: z.array(z.string()).default([]),\n languages: z.array(z.string()).default([]),\n libraries: z.array(z.string()).default([]),\n minVersion: z.record(z.string()).optional(), // { \"react\": \"18.0.0\" }\n })\n .optional(),\n popularity: z.number().default(0), // Downloads/stars\n quality: z.number().min(0).max(100).default(50), // Quality score\n lastUpdated: z.string().datetime().optional(),\n verified: z.boolean().default(false),\n});\nexport type SkillSummary = z.infer<typeof SkillSummary>;\n\n/**\n * Scored skill with match explanation\n */\nexport interface ScoredSkill {\n skill: SkillSummary;\n score: number; // 0-100\n reasons: MatchReason[];\n warnings: string[];\n}\n\n/**\n * Match reason with category and weight\n */\nexport interface MatchReason {\n category: MatchCategory;\n description: string;\n weight: number; // Points contributed\n matched: string[]; // What matched\n}\n\n/**\n * Categories of matching\n */\nexport type MatchCategory =\n | 'framework'\n | 'language'\n | 'library'\n | 'tag'\n | 'pattern'\n | 'popularity'\n | 'quality'\n | 'freshness';\n\n/**\n * Weight configuration for scoring\n */\nexport interface ScoringWeights {\n framework: number; // Default: 40\n language: number; // Default: 20\n library: number; // Default: 15\n tag: number; // Default: 10\n popularity: number; // Default: 5\n quality: number; // Default: 5\n freshness: number; // Default: 5\n}\n\nexport const DEFAULT_SCORING_WEIGHTS: ScoringWeights = {\n framework: 40,\n language: 20,\n library: 15,\n tag: 10,\n popularity: 5,\n quality: 5,\n freshness: 5,\n};\n\n/**\n * Project profile for matching (derived from ProjectContext)\n */\nexport interface ProjectProfile {\n name: string;\n type?: string;\n stack: ProjectStack;\n patterns?: {\n components?: string;\n stateManagement?: string;\n apiStyle?: string;\n styling?: string;\n testing?: string;\n };\n installedSkills: string[];\n excludedSkills: string[];\n}\n\n/**\n * Skill index for efficient lookup\n */\nexport interface SkillIndex {\n version: number;\n lastUpdated: string;\n skills: SkillSummary[];\n sources: IndexSource[];\n}\n\n/**\n * Source repository in the index\n */\nexport interface IndexSource {\n name: string;\n url: string;\n lastFetched: string;\n skillCount: number;\n}\n\n/**\n * Recommendation options\n */\nexport interface RecommendOptions {\n limit?: number; // Max recommendations (default: 10)\n minScore?: number; // Minimum score threshold (default: 30)\n categories?: string[]; // Filter by categories\n excludeInstalled?: boolean; // Skip already installed (default: true)\n weights?: Partial<ScoringWeights>;\n includeReasons?: boolean; // Include detailed reasons (default: true)\n}\n\n/**\n * Recommendation result\n */\nexport interface RecommendationResult {\n recommendations: ScoredSkill[];\n profile: ProjectProfile;\n totalSkillsScanned: number;\n timestamp: string;\n}\n\n/**\n * Search options for task-based search\n */\nexport interface SearchOptions {\n query: string;\n limit?: number;\n semantic?: boolean; // Use semantic matching (default: true)\n filters?: {\n tags?: string[];\n minScore?: number;\n verified?: boolean;\n };\n}\n\n/**\n * Search result\n */\nexport interface SearchResult {\n skill: SkillSummary;\n relevance: number; // 0-100\n matchedTerms: string[];\n snippet?: string; // Relevant excerpt\n}\n\n/**\n * Freshness check result\n */\nexport interface FreshnessResult {\n skill: string;\n status: 'current' | 'outdated' | 'unknown';\n details?: {\n skillVersion?: string;\n projectVersion?: string;\n message: string;\n };\n}\n\n/**\n * Tag to technology mapping for smart inference\n */\nexport const TAG_TO_TECH: Record<string, string[]> = {\n // Frontend frameworks\n react: ['react', 'react-dom', '@types/react'],\n vue: ['vue', '@vue/core'],\n angular: ['@angular/core'],\n svelte: ['svelte'],\n solid: ['solid-js'],\n qwik: ['@builder.io/qwik'],\n\n // Meta-frameworks\n nextjs: ['next'],\n nuxt: ['nuxt'],\n remix: ['@remix-run/react'],\n astro: ['astro'],\n gatsby: ['gatsby'],\n sveltekit: ['@sveltejs/kit'],\n\n // Backend\n express: ['express'],\n fastify: ['fastify'],\n koa: ['koa'],\n hono: ['hono'],\n nestjs: ['@nestjs/core'],\n fastapi: ['fastapi'],\n django: ['django'],\n flask: ['flask'],\n\n // Languages\n typescript: ['typescript', '@types/node'],\n javascript: [], // Inferred from lack of typescript\n python: [],\n rust: [],\n go: [],\n\n // Styling\n tailwind: ['tailwindcss'],\n 'styled-components': ['styled-components'],\n emotion: ['@emotion/react'],\n 'css-modules': [],\n sass: ['sass', 'node-sass'],\n\n // State management\n redux: ['@reduxjs/toolkit', 'redux'],\n zustand: ['zustand'],\n mobx: ['mobx'],\n jotai: ['jotai'],\n recoil: ['recoil'],\n\n // Testing\n jest: ['jest'],\n vitest: ['vitest'],\n playwright: ['@playwright/test'],\n cypress: ['cypress'],\n testing: ['@testing-library/react'],\n\n // Databases\n postgres: ['pg', '@prisma/client'],\n mongodb: ['mongoose', 'mongodb'],\n supabase: ['@supabase/supabase-js'],\n firebase: ['firebase'],\n prisma: ['@prisma/client'],\n drizzle: ['drizzle-orm'],\n\n // Tools\n eslint: ['eslint'],\n prettier: ['prettier'],\n biome: ['@biomejs/biome'],\n turborepo: ['turbo'],\n monorepo: ['lerna', 'nx'],\n\n // API\n graphql: ['graphql', '@apollo/client'],\n trpc: ['@trpc/server'],\n rest: [],\n\n // Auth\n auth: ['next-auth', '@auth/core', 'passport'],\n 'better-auth': ['better-auth'],\n\n // Deployment\n vercel: ['vercel'],\n docker: [],\n kubernetes: [],\n\n // Other\n ai: ['openai', '@anthropic-ai/sdk', 'ai'],\n shadcn: [],\n security: [],\n performance: [],\n accessibility: [],\n};\n\n/**\n * Reverse mapping: tech to tags\n */\nexport function getTechTags(techName: string): string[] {\n const tags: string[] = [];\n for (const [tag, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName)) {\n tags.push(tag);\n }\n }\n return tags;\n}\n","import type { ProjectStack } from '../context/types.js';\nimport type {\n SkillSummary,\n ScoredSkill,\n MatchReason,\n ScoringWeights,\n ProjectProfile,\n SkillIndex,\n RecommendOptions,\n RecommendationResult,\n SearchOptions,\n SearchResult,\n FreshnessResult,\n} from './types.js';\nimport { DEFAULT_SCORING_WEIGHTS, TAG_TO_TECH, getTechTags } from './types.js';\n\n/**\n * Recommendation engine for matching skills to project profiles\n */\nexport class RecommendationEngine {\n private weights: ScoringWeights;\n private index: SkillIndex | null = null;\n\n constructor(weights?: Partial<ScoringWeights>) {\n this.weights = { ...DEFAULT_SCORING_WEIGHTS, ...weights };\n }\n\n /**\n * Load skill index from cache or generate from local skills\n */\n loadIndex(index: SkillIndex): void {\n this.index = index;\n }\n\n /**\n * Get loaded index\n */\n getIndex(): SkillIndex | null {\n return this.index;\n }\n\n /**\n * Score a single skill against a project profile\n */\n scoreSkill(profile: ProjectProfile, skill: SkillSummary): ScoredSkill {\n const reasons: MatchReason[] = [];\n const warnings: string[] = [];\n let totalScore = 0;\n\n // Framework matching (40 points max)\n const frameworkMatch = this.matchFrameworks(profile.stack, skill);\n reasons.push(frameworkMatch);\n totalScore += frameworkMatch.weight;\n\n // Language matching (20 points max)\n const languageMatch = this.matchLanguages(profile.stack, skill);\n reasons.push(languageMatch);\n totalScore += languageMatch.weight;\n\n // Library matching (15 points max)\n const libraryMatch = this.matchLibraries(profile.stack, skill);\n reasons.push(libraryMatch);\n totalScore += libraryMatch.weight;\n\n // Tag relevance (10 points max)\n const tagMatch = this.matchTags(profile, skill);\n reasons.push(tagMatch);\n totalScore += tagMatch.weight;\n\n // Popularity bonus (5 points max)\n const popularityScore = this.scorePopularity(skill);\n reasons.push(popularityScore);\n totalScore += popularityScore.weight;\n\n // Quality bonus (5 points max)\n const qualityScore = this.scoreQuality(skill);\n reasons.push(qualityScore);\n totalScore += qualityScore.weight;\n\n // Freshness bonus (5 points max)\n const freshnessScore = this.scoreFreshness(skill);\n reasons.push(freshnessScore);\n totalScore += freshnessScore.weight;\n\n // Add warnings for potential issues\n if (skill.compatibility?.minVersion) {\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected && this.isVersionLower(detected, minVer)) {\n warnings.push(`Requires ${tech} ${minVer}+, you have ${detected}`);\n }\n }\n }\n\n // Check if skill is already installed\n if (profile.installedSkills.includes(skill.name)) {\n warnings.push('Already installed');\n }\n\n return {\n skill,\n score: Math.min(100, Math.round(totalScore)),\n reasons,\n warnings,\n };\n }\n\n /**\n * Match frameworks in project stack against skill\n */\n private matchFrameworks(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillFrameworks = skill.compatibility?.frameworks || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.frameworks) {\n const techName = detection.name.toLowerCase();\n\n // Direct framework match\n if (skillFrameworks.some((f) => f.toLowerCase() === techName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(techName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === techName) {\n matched.push(detection.name);\n break;\n }\n }\n\n // Check if skill tags match framework-related tags\n for (const [tagName, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName) && skillTags.includes(tagName)) {\n if (!matched.includes(detection.name)) {\n matched.push(detection.name);\n }\n }\n }\n }\n\n const ratio = matched.length / Math.max(stack.frameworks.length, 1);\n const weight = Math.round(this.weights.framework * ratio);\n\n return {\n category: 'framework',\n description:\n matched.length > 0\n ? `Matches frameworks: ${matched.join(', ')}`\n : 'No framework match',\n weight,\n matched,\n };\n }\n\n /**\n * Match languages in project stack against skill\n */\n private matchLanguages(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLanguages = skill.compatibility?.languages || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.languages) {\n const langName = detection.name.toLowerCase();\n\n // Direct language match\n if (skillLanguages.some((l) => l.toLowerCase() === langName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n if (skillTags.some((t) => t.toLowerCase() === langName)) {\n matched.push(detection.name);\n }\n }\n\n const ratio = matched.length / Math.max(stack.languages.length, 1);\n const weight = Math.round(this.weights.language * ratio);\n\n return {\n category: 'language',\n description:\n matched.length > 0 ? `Matches languages: ${matched.join(', ')}` : 'No language match',\n weight,\n matched,\n };\n }\n\n /**\n * Match libraries in project stack against skill\n */\n private matchLibraries(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLibraries = skill.compatibility?.libraries || [];\n const skillTags = skill.tags || [];\n\n const allLibraries = [...stack.libraries, ...stack.styling, ...stack.testing, ...stack.databases];\n\n for (const detection of allLibraries) {\n const libName = detection.name.toLowerCase();\n\n // Direct library match\n if (skillLibraries.some((l) => l.toLowerCase() === libName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(libName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === libName) {\n matched.push(detection.name);\n break;\n }\n }\n }\n\n const ratio = matched.length / Math.max(allLibraries.length, 1);\n const weight = Math.round(this.weights.library * ratio);\n\n return {\n category: 'library',\n description:\n matched.length > 0 ? `Matches libraries: ${matched.join(', ')}` : 'No library match',\n weight,\n matched,\n };\n }\n\n /**\n * Match tags based on project patterns and type\n */\n private matchTags(profile: ProjectProfile, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillTags = skill.tags || [];\n\n // Extract relevant tags from project\n const projectTags = this.extractProjectTags(profile);\n\n for (const tag of skillTags) {\n if (projectTags.includes(tag.toLowerCase())) {\n matched.push(tag);\n }\n }\n\n const ratio = matched.length / Math.max(skillTags.length, 1);\n const weight = Math.round(this.weights.tag * ratio);\n\n return {\n category: 'tag',\n description: matched.length > 0 ? `Matches tags: ${matched.join(', ')}` : 'No tag match',\n weight,\n matched,\n };\n }\n\n /**\n * Extract relevant tags from project profile\n */\n private extractProjectTags(profile: ProjectProfile): string[] {\n const tags: string[] = [];\n\n // Add project type as tag\n if (profile.type) {\n tags.push(profile.type.toLowerCase());\n }\n\n // Add patterns as tags\n if (profile.patterns) {\n if (profile.patterns.components) tags.push(profile.patterns.components);\n if (profile.patterns.stateManagement) tags.push(profile.patterns.stateManagement);\n if (profile.patterns.apiStyle) tags.push(profile.patterns.apiStyle);\n if (profile.patterns.styling) tags.push(profile.patterns.styling);\n if (profile.patterns.testing) tags.push(profile.patterns.testing);\n }\n\n // Derive tags from stack\n const allDetections = [\n ...profile.stack.frameworks,\n ...profile.stack.languages,\n ...profile.stack.libraries,\n ...profile.stack.styling,\n ...profile.stack.testing,\n ...profile.stack.databases,\n ...profile.stack.tools,\n ];\n\n for (const detection of allDetections) {\n tags.push(detection.name.toLowerCase());\n // Add related tags\n const related = getTechTags(detection.name.toLowerCase());\n tags.push(...related);\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score based on popularity (downloads/stars)\n */\n private scorePopularity(skill: SkillSummary): MatchReason {\n // Normalize popularity to 0-5 range\n // Assume 1000+ is high popularity\n const popularity = skill.popularity ?? 0;\n const normalized = Math.min(popularity / 1000, 1);\n const weight = Math.round(this.weights.popularity * normalized);\n\n return {\n category: 'popularity',\n description:\n popularity > 0 ? `${popularity} downloads/stars` : 'No popularity data',\n weight,\n matched: popularity > 0 ? [popularity.toString()] : [],\n };\n }\n\n /**\n * Score based on quality metrics\n */\n private scoreQuality(skill: SkillSummary): MatchReason {\n const quality = skill.quality ?? 50; // Default to 50 if not specified\n const normalized = quality / 100;\n const weight = Math.round(this.weights.quality * normalized);\n\n return {\n category: 'quality',\n description: `Quality score: ${skill.quality}/100`,\n weight,\n matched: skill.verified ? ['verified'] : [],\n };\n }\n\n /**\n * Score based on freshness (last update)\n */\n private scoreFreshness(skill: SkillSummary): MatchReason {\n if (!skill.lastUpdated) {\n return {\n category: 'freshness',\n description: 'No update date available',\n weight: 0,\n matched: [],\n };\n }\n\n const lastUpdate = new Date(skill.lastUpdated);\n const now = new Date();\n const daysSinceUpdate = (now.getTime() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24);\n\n // Full points if updated within 30 days, decreasing linearly to 0 at 365 days\n let normalized = Math.max(0, 1 - daysSinceUpdate / 365);\n if (daysSinceUpdate <= 30) normalized = 1;\n\n const weight = Math.round(this.weights.freshness * normalized);\n\n return {\n category: 'freshness',\n description:\n daysSinceUpdate <= 30\n ? 'Recently updated'\n : `Updated ${Math.round(daysSinceUpdate)} days ago`,\n weight,\n matched: [skill.lastUpdated],\n };\n }\n\n /**\n * Find detected version for a technology\n */\n private findDetectedVersion(stack: ProjectStack, tech: string): string | null {\n const techLower = tech.toLowerCase();\n const allDetections = [\n ...stack.frameworks,\n ...stack.languages,\n ...stack.libraries,\n ...stack.styling,\n ...stack.testing,\n ...stack.databases,\n ...stack.tools,\n ...stack.runtime,\n ];\n\n const found = allDetections.find((d) => d.name.toLowerCase() === techLower);\n return found?.version || null;\n }\n\n /**\n * Compare semantic versions (basic implementation)\n */\n private isVersionLower(current: string, required: string): boolean {\n const parseVersion = (v: string): number[] =>\n v\n .replace(/[^0-9.]/g, '')\n .split('.')\n .map(Number);\n\n const currentParts = parseVersion(current);\n const requiredParts = parseVersion(required);\n\n for (let i = 0; i < Math.max(currentParts.length, requiredParts.length); i++) {\n const c = currentParts[i] || 0;\n const r = requiredParts[i] || 0;\n if (c < r) return true;\n if (c > r) return false;\n }\n\n return false;\n }\n\n /**\n * Get top recommendations for a project profile\n */\n recommend(profile: ProjectProfile, options: RecommendOptions = {}): RecommendationResult {\n const {\n limit = 10,\n minScore = 30,\n categories,\n excludeInstalled = true,\n includeReasons = true,\n } = options;\n\n if (!this.index) {\n return {\n recommendations: [],\n profile,\n totalSkillsScanned: 0,\n timestamp: new Date().toISOString(),\n };\n }\n\n let skills = this.index.skills;\n\n // Filter by categories if specified\n if (categories && categories.length > 0) {\n skills = skills.filter((s) => s.tags?.some((t) => categories.includes(t)));\n }\n\n // Score all skills\n const scored = skills.map((skill) => this.scoreSkill(profile, skill));\n\n // Filter by minimum score\n let filtered = scored.filter((s) => s.score >= minScore);\n\n // Exclude installed skills\n if (excludeInstalled) {\n filtered = filtered.filter((s) => !profile.installedSkills.includes(s.skill.name));\n }\n\n // Exclude explicitly excluded skills\n filtered = filtered.filter((s) => !profile.excludedSkills.includes(s.skill.name));\n\n // Sort by score descending\n filtered.sort((a, b) => b.score - a.score);\n\n // Limit results\n const recommendations = filtered.slice(0, limit);\n\n // Optionally strip reasons for minimal output\n if (!includeReasons) {\n recommendations.forEach((r) => {\n r.reasons = [];\n });\n }\n\n return {\n recommendations,\n profile,\n totalSkillsScanned: skills.length,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Search skills by query (task-based search)\n */\n search(options: SearchOptions): SearchResult[] {\n const { query, limit = 10, semantic = true, filters } = options;\n\n if (!this.index) {\n return [];\n }\n\n // Handle empty or whitespace-only queries\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n return [];\n }\n\n const queryTerms = trimmedQuery.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n if (queryTerms.length === 0) {\n return [];\n }\n\n const results: SearchResult[] = [];\n\n for (const skill of this.index.skills) {\n // Apply filters\n if (filters?.tags && filters.tags.length > 0) {\n if (!skill.tags?.some((t) => filters.tags!.includes(t))) continue;\n }\n if (filters?.verified && !skill.verified) continue;\n\n // Calculate relevance\n const { relevance, matchedTerms, snippet } = this.calculateRelevance(\n skill,\n queryTerms,\n semantic\n );\n\n if (relevance > 0 && (!filters?.minScore || relevance >= filters.minScore)) {\n results.push({ skill, relevance, matchedTerms, snippet });\n }\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n return results.slice(0, limit);\n }\n\n /**\n * Calculate search relevance for a skill\n */\n private calculateRelevance(\n skill: SkillSummary,\n queryTerms: string[],\n semantic: boolean\n ): { relevance: number; matchedTerms: string[]; snippet?: string } {\n const matchedTerms: string[] = [];\n let relevance = 0;\n\n // Search in name (high weight)\n const nameLower = skill.name.toLowerCase();\n for (const term of queryTerms) {\n if (nameLower.includes(term)) {\n relevance += 40;\n matchedTerms.push(term);\n }\n }\n\n // Search in description (medium weight)\n const descLower = (skill.description || '').toLowerCase();\n for (const term of queryTerms) {\n if (descLower.includes(term) && !matchedTerms.includes(term)) {\n relevance += 20;\n matchedTerms.push(term);\n }\n }\n\n // Search in tags (medium weight)\n const tagsLower = (skill.tags || []).map((t) => t.toLowerCase());\n for (const term of queryTerms) {\n if (tagsLower.some((t) => t.includes(term)) && !matchedTerms.includes(term)) {\n relevance += 25;\n matchedTerms.push(term);\n }\n }\n\n // Semantic matching: expand terms using TAG_TO_TECH\n if (semantic) {\n for (const term of queryTerms) {\n const relatedTags = getTechTags(term);\n for (const relatedTag of relatedTags) {\n if (\n tagsLower.includes(relatedTag) ||\n nameLower.includes(relatedTag) ||\n descLower.includes(relatedTag)\n ) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n\n // Also check if term is a tag that maps to skill tags\n const tagTechs = TAG_TO_TECH[term] || [];\n for (const tech of tagTechs) {\n if (skill.compatibility?.libraries?.includes(tech)) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n }\n }\n\n // Generate snippet if description matches\n let snippet: string | undefined;\n if (skill.description && matchedTerms.length > 0) {\n snippet = skill.description.slice(0, 150);\n if (skill.description.length > 150) snippet += '...';\n }\n\n // Normalize to 0-100\n relevance = Math.min(100, relevance);\n\n return { relevance, matchedTerms, snippet };\n }\n\n /**\n * Check freshness of installed skills against project dependencies\n *\n * A skill is considered:\n * - 'current': skill's minVersion is <= project version (compatible and up to date)\n * - 'outdated': skill targets a significantly older major version\n * - 'unknown': no version requirements specified\n */\n checkFreshness(\n profile: ProjectProfile,\n installedSkills: SkillSummary[]\n ): FreshnessResult[] {\n const results: FreshnessResult[] = [];\n\n for (const skill of installedSkills) {\n if (!skill.compatibility?.minVersion) {\n results.push({\n skill: skill.name,\n status: 'unknown',\n details: { message: 'No version requirements specified' },\n });\n continue;\n }\n\n let status: 'current' | 'outdated' = 'current';\n const messages: string[] = [];\n\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected) {\n const majorSkill = parseInt(minVer.split('.')[0]) || 0;\n const majorProject = parseInt(detected.split('.')[0]) || 0;\n\n // Skill is outdated if it targets a version that is 2+ major versions behind\n // e.g., skill targets React 16 but project uses React 19\n if (majorProject - majorSkill >= 2) {\n status = 'outdated';\n messages.push(`Skill targets ${tech} ${minVer}, you have ${detected}`);\n }\n }\n }\n\n results.push({\n skill: skill.name,\n status,\n details:\n messages.length > 0 ? { message: messages.join('; ') } : { message: 'Up to date' },\n });\n }\n\n return results;\n }\n}\n\n/**\n * Create a recommendation engine with default settings\n */\nexport function createRecommendationEngine(\n weights?: Partial<ScoringWeights>\n): RecommendationEngine {\n return new RecommendationEngine(weights);\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir, homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { SkillIndex, SkillSummary, IndexSource } from './types.js';\nimport { discoverSkills, extractFrontmatter } from '../skills.js';\n\n/**\n * Known skill repositories to index\n */\nexport const KNOWN_SKILL_REPOS = [\n { owner: 'anthropics', repo: 'courses', description: 'Anthropic official courses and skills' },\n { owner: 'vercel-labs', repo: 'ai-sdk-preview-internal-knowledge-base', description: 'Vercel AI SDK skills' },\n { owner: 'composioHQ', repo: 'awesome-claude-code-skills', description: 'Curated Claude Code skills' },\n] as const;\n\n/**\n * Index file path\n */\nexport const INDEX_PATH = join(homedir(), '.skillkit', 'index.json');\nexport const INDEX_CACHE_HOURS = 24;\n\n/**\n * Fetch skills from a GitHub repository\n */\nexport async function fetchSkillsFromRepo(\n owner: string,\n repo: string\n): Promise<{ skills: SkillSummary[]; error?: string }> {\n const cloneUrl = `https://github.com/${owner}/${repo}.git`;\n const tempDir = join(tmpdir(), `skillkit-fetch-${randomUUID()}`);\n\n try {\n // Shallow clone for speed\n execSync(`git clone --depth 1 ${cloneUrl} ${tempDir}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n timeout: 60000, // 60 second timeout\n });\n\n // Discover skills in the cloned repo\n const discoveredSkills = discoverSkills(tempDir);\n const skills: SkillSummary[] = [];\n\n for (const skill of discoveredSkills) {\n const skillMdPath = join(skill.path, 'SKILL.md');\n if (!existsSync(skillMdPath)) continue;\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n const summary: SkillSummary = {\n name: skill.name,\n description: skill.description || frontmatter?.description as string || 'No description',\n source: `${owner}/${repo}`,\n tags: (frontmatter?.tags as string[]) || [],\n compatibility: {\n frameworks: (frontmatter?.compatibility as Record<string, unknown>)?.frameworks as string[] || [],\n languages: (frontmatter?.compatibility as Record<string, unknown>)?.languages as string[] || [],\n libraries: (frontmatter?.compatibility as Record<string, unknown>)?.libraries as string[] || [],\n },\n popularity: 0,\n quality: 50,\n lastUpdated: new Date().toISOString(),\n verified: owner === 'anthropics' || owner === 'vercel-labs',\n };\n\n skills.push(summary);\n } catch {\n // Skip skills that fail to parse\n }\n }\n\n return { skills };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { skills: [], error: `Failed to fetch ${owner}/${repo}: ${message}` };\n } finally {\n // Clean up temp directory\n if (existsSync(tempDir)) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Fetch skills from all known repositories and build index\n */\nexport async function buildSkillIndex(\n repos: typeof KNOWN_SKILL_REPOS = KNOWN_SKILL_REPOS,\n onProgress?: (message: string) => void\n): Promise<{ index: SkillIndex; errors: string[] }> {\n const allSkills: SkillSummary[] = [];\n const sources: IndexSource[] = [];\n const errors: string[] = [];\n\n for (const { owner, repo } of repos) {\n onProgress?.(`Fetching ${owner}/${repo}...`);\n\n const result = await fetchSkillsFromRepo(owner, repo);\n\n if (result.error) {\n errors.push(result.error);\n }\n\n if (result.skills.length > 0) {\n allSkills.push(...result.skills);\n sources.push({\n name: `${owner}/${repo}`,\n url: `https://github.com/${owner}/${repo}`,\n lastFetched: new Date().toISOString(),\n skillCount: result.skills.length,\n });\n onProgress?.(` Found ${result.skills.length} skills`);\n } else if (!result.error) {\n onProgress?.(` No skills found`);\n }\n }\n\n // Add fallback sample skills if no repos could be fetched\n if (allSkills.length === 0) {\n onProgress?.('No skills fetched, using sample index...');\n allSkills.push(...getSampleSkills());\n sources.push({\n name: 'skillkit-samples',\n url: 'https://github.com/skillkit/samples',\n lastFetched: new Date().toISOString(),\n skillCount: allSkills.length,\n });\n }\n\n const index: SkillIndex = {\n version: 1,\n lastUpdated: new Date().toISOString(),\n skills: allSkills,\n sources,\n };\n\n return { index, errors };\n}\n\n/**\n * Save skill index to cache\n */\nexport function saveIndex(index: SkillIndex): void {\n const indexDir = join(homedir(), '.skillkit');\n if (!existsSync(indexDir)) {\n mkdirSync(indexDir, { recursive: true });\n }\n writeFileSync(INDEX_PATH, JSON.stringify(index, null, 2));\n}\n\n/**\n * Load skill index from cache\n */\nexport function loadIndex(): SkillIndex | null {\n if (!existsSync(INDEX_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(INDEX_PATH, 'utf-8');\n return JSON.parse(content) as SkillIndex;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if index is stale\n */\nexport function isIndexStale(index: SkillIndex): boolean {\n const lastUpdated = new Date(index.lastUpdated);\n const hoursSinceUpdate = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60);\n return hoursSinceUpdate > INDEX_CACHE_HOURS;\n}\n\n/**\n * Get index status\n */\nexport function getIndexStatus(): 'missing' | 'stale' | 'fresh' {\n const index = loadIndex();\n if (!index) return 'missing';\n return isIndexStale(index) ? 'stale' : 'fresh';\n}\n\n/**\n * Sample skills fallback (when repos can't be fetched)\n */\nfunction getSampleSkills(): SkillSummary[] {\n return [\n {\n name: 'react-best-practices',\n description: 'Modern React patterns including Server Components, hooks best practices, and performance optimization',\n source: 'skillkit/samples',\n tags: ['react', 'frontend', 'typescript', 'nextjs', 'performance'],\n compatibility: {\n frameworks: ['react', 'nextjs'],\n languages: ['typescript', 'javascript'],\n libraries: [],\n },\n popularity: 1500,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'tailwind-patterns',\n description: 'Tailwind CSS utility patterns, responsive design, and component styling best practices',\n source: 'skillkit/samples',\n tags: ['tailwind', 'css', 'styling', 'frontend', 'responsive'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['tailwindcss'],\n },\n popularity: 1200,\n quality: 92,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'typescript-strict-patterns',\n description: 'TypeScript strict mode patterns, type safety, and advanced type utilities',\n source: 'skillkit/samples',\n tags: ['typescript', 'types', 'safety', 'patterns'],\n compatibility: {\n frameworks: [],\n languages: ['typescript'],\n libraries: [],\n },\n popularity: 900,\n quality: 90,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'security-best-practices',\n description: 'Security patterns for web applications including XSS prevention, CSRF, and secure headers',\n source: 'skillkit/samples',\n tags: ['security', 'xss', 'csrf', 'headers', 'owasp'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript', 'python'],\n libraries: [],\n },\n popularity: 600,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'testing-patterns',\n description: 'Testing patterns with Vitest/Jest including mocking, assertions, and test organization',\n source: 'skillkit/samples',\n tags: ['vitest', 'jest', 'testing', 'typescript', 'mocking', 'tdd'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['vitest', 'jest'],\n },\n popularity: 700,\n quality: 86,\n lastUpdated: new Date().toISOString(),\n verified: false,\n },\n ];\n}\n","/**\n * Session State Types\n *\n * Types for managing skill execution sessions with pause/resume support.\n */\n\n/**\n * Status of a task in execution\n */\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'paused';\n\n/**\n * A single task within a skill execution\n */\nexport interface SessionTask {\n /** Task identifier */\n id: string;\n /** Task name/description */\n name: string;\n /** Task type (auto, checkpoint:human-verify, checkpoint:decision, checkpoint:human-action) */\n type: 'auto' | 'checkpoint:human-verify' | 'checkpoint:decision' | 'checkpoint:human-action';\n /** Current status */\n status: TaskStatus;\n /** Start time */\n startedAt?: string;\n /** Completion time */\n completedAt?: string;\n /** Error message if failed */\n error?: string;\n /** Output/result of the task */\n output?: string;\n /** Files modified by this task */\n filesModified?: string[];\n /** Git commit SHA if committed */\n commitSha?: string;\n}\n\n/**\n * Current skill execution state\n */\nexport interface CurrentExecution {\n /** Skill being executed */\n skillName: string;\n /** Skill source (repo) */\n skillSource: string;\n /** Current step/task index */\n currentStep: number;\n /** Total steps */\n totalSteps: number;\n /** Execution status */\n status: 'running' | 'paused' | 'completed' | 'failed';\n /** When execution started */\n startedAt: string;\n /** When execution was paused (if paused) */\n pausedAt?: string;\n /** Tasks in this execution */\n tasks: SessionTask[];\n}\n\n/**\n * Historical execution record\n */\nexport interface ExecutionHistory {\n /** Skill name */\n skillName: string;\n /** Skill source */\n skillSource: string;\n /** When execution completed */\n completedAt: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Final status */\n status: 'completed' | 'failed' | 'cancelled';\n /** Git commits created */\n commits: string[];\n /** Files modified */\n filesModified: string[];\n /** Error if failed */\n error?: string;\n}\n\n/**\n * User decisions made during skill execution\n */\nexport interface SessionDecision {\n /** Decision key/identifier */\n key: string;\n /** Decision value */\n value: string;\n /** When decision was made */\n madeAt: string;\n /** Skill that prompted the decision */\n skillName?: string;\n}\n\n/**\n * Full session state\n */\nexport interface SessionState {\n /** Schema version */\n version: 1;\n /** Last activity timestamp */\n lastActivity: string;\n /** Project path this session is for */\n projectPath: string;\n /** Current execution (if any) */\n currentExecution?: CurrentExecution;\n /** Execution history */\n history: ExecutionHistory[];\n /** User decisions */\n decisions: SessionDecision[];\n}\n\n/**\n * Session state file path within .skillkit directory\n */\nexport const SESSION_FILE = 'session.yaml';\n","/**\n * Session Manager\n *\n * Manages session state for skill execution with pause/resume support.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type {\n SessionState,\n CurrentExecution,\n ExecutionHistory,\n SessionTask,\n TaskStatus,\n} from './types.js';\nimport { SESSION_FILE } from './types.js';\n\n/**\n * Session Manager for tracking skill execution state\n */\nexport class SessionManager {\n private projectPath: string;\n private sessionPath: string;\n private state: SessionState | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.sessionPath = join(projectPath, '.skillkit', SESSION_FILE);\n }\n\n /**\n * Get session file path\n */\n getSessionPath(): string {\n return this.sessionPath;\n }\n\n /**\n * Load session state from disk\n */\n load(): SessionState | null {\n if (!existsSync(this.sessionPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.sessionPath, 'utf-8');\n this.state = parse(content) as SessionState;\n return this.state;\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n\n /**\n * Save session state to disk\n */\n save(): void {\n if (!this.state) {\n return;\n }\n\n const dir = join(this.projectPath, '.skillkit');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.state.lastActivity = new Date().toISOString();\n writeFileSync(this.sessionPath, stringify(this.state));\n }\n\n /**\n * Initialize a new session\n */\n init(): SessionState {\n this.state = {\n version: 1,\n lastActivity: new Date().toISOString(),\n projectPath: this.projectPath,\n history: [],\n decisions: [],\n };\n this.save();\n return this.state;\n }\n\n /**\n * Get current session state (load if needed)\n */\n get(): SessionState | null {\n if (!this.state) {\n this.state = this.load();\n }\n return this.state;\n }\n\n /**\n * Get or create session\n */\n getOrCreate(): SessionState {\n const state = this.get();\n if (state) {\n return state;\n }\n return this.init();\n }\n\n /**\n * Start a new skill execution\n */\n startExecution(skillName: string, skillSource: string, tasks: Omit<SessionTask, 'status'>[]): CurrentExecution {\n const state = this.getOrCreate();\n\n const execution: CurrentExecution = {\n skillName,\n skillSource,\n currentStep: 0,\n totalSteps: tasks.length,\n status: 'running',\n startedAt: new Date().toISOString(),\n tasks: tasks.map((t) => ({\n ...t,\n status: 'pending' as TaskStatus,\n })),\n };\n\n state.currentExecution = execution;\n this.save();\n return execution;\n }\n\n /**\n * Update task status\n */\n updateTask(\n taskId: string,\n updates: Partial<Pick<SessionTask, 'status' | 'output' | 'error' | 'filesModified' | 'commitSha'>>\n ): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const task = state.currentExecution.tasks.find((t) => t.id === taskId);\n if (!task) {\n return;\n }\n\n Object.assign(task, updates);\n\n if (updates.status === 'in_progress' && !task.startedAt) {\n task.startedAt = new Date().toISOString();\n }\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n task.completedAt = new Date().toISOString();\n }\n\n // Update current step\n const completedCount = state.currentExecution.tasks.filter(\n (t) => t.status === 'completed' || t.status === 'failed'\n ).length;\n state.currentExecution.currentStep = completedCount;\n\n this.save();\n }\n\n /**\n * Advance to next task\n */\n advanceToNextTask(): SessionTask | null {\n const state = this.get();\n if (!state?.currentExecution) {\n return null;\n }\n\n const nextTask = state.currentExecution.tasks.find((t) => t.status === 'pending');\n if (nextTask) {\n nextTask.status = 'in_progress';\n nextTask.startedAt = new Date().toISOString();\n this.save();\n }\n\n return nextTask || null;\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'running') {\n return false;\n }\n\n state.currentExecution.status = 'paused';\n state.currentExecution.pausedAt = new Date().toISOString();\n\n // Mark any in-progress tasks as paused\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'in_progress') {\n task.status = 'paused';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Resume paused execution\n */\n resume(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'paused') {\n return false;\n }\n\n state.currentExecution.status = 'running';\n delete state.currentExecution.pausedAt;\n\n // Resume paused tasks\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'paused') {\n task.status = 'in_progress';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Complete current execution\n */\n completeExecution(status: 'completed' | 'failed' | 'cancelled', error?: string): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const execution = state.currentExecution;\n const startTime = new Date(execution.startedAt).getTime();\n const endTime = Date.now();\n\n const historyEntry: ExecutionHistory = {\n skillName: execution.skillName,\n skillSource: execution.skillSource,\n completedAt: new Date().toISOString(),\n durationMs: endTime - startTime,\n status,\n commits: execution.tasks\n .map((t) => t.commitSha)\n .filter((sha): sha is string => !!sha),\n filesModified: Array.from(\n new Set(execution.tasks.flatMap((t) => t.filesModified || []))\n ),\n error,\n };\n\n state.history.unshift(historyEntry);\n delete state.currentExecution;\n\n // Keep only last 50 history entries\n if (state.history.length > 50) {\n state.history = state.history.slice(0, 50);\n }\n\n this.save();\n }\n\n /**\n * Record a user decision\n */\n recordDecision(key: string, value: string, skillName?: string): void {\n const state = this.getOrCreate();\n\n // Update existing decision or add new one\n const existing = state.decisions.find((d) => d.key === key);\n if (existing) {\n existing.value = value;\n existing.madeAt = new Date().toISOString();\n existing.skillName = skillName;\n } else {\n state.decisions.push({\n key,\n value,\n madeAt: new Date().toISOString(),\n skillName,\n });\n }\n\n this.save();\n }\n\n /**\n * Get a decision value\n */\n getDecision(key: string): string | undefined {\n const state = this.get();\n return state?.decisions.find((d) => d.key === key)?.value;\n }\n\n /**\n * Get execution history\n */\n getHistory(limit?: number): ExecutionHistory[] {\n const state = this.get();\n if (!state) {\n return [];\n }\n return limit ? state.history.slice(0, limit) : state.history;\n }\n\n /**\n * Check if there's an active execution\n */\n hasActiveExecution(): boolean {\n const state = this.get();\n return !!state?.currentExecution;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n const state = this.get();\n return state?.currentExecution?.status === 'paused';\n }\n\n /**\n * Clear session (delete file)\n */\n clear(): void {\n if (existsSync(this.sessionPath)) {\n unlinkSync(this.sessionPath);\n }\n this.state = null;\n }\n}\n\n/**\n * Create a new session manager\n */\nexport function createSessionManager(projectPath: string): SessionManager {\n return new SessionManager(projectPath);\n}\n","/**\n * Workflow Types\n *\n * Types for skill composition and workflow orchestration.\n */\n\n/**\n * A skill reference within a workflow\n */\nexport interface WorkflowSkill {\n /** Skill name or source (e.g., \"typescript-strict-mode\" or \"owner/repo/skill\") */\n skill: string;\n /** Optional configuration overrides */\n config?: Record<string, unknown>;\n /** Optional condition to run this skill */\n condition?: string;\n}\n\n/**\n * A wave of skills to execute (parallel or sequential)\n */\nexport interface WorkflowWave {\n /** Wave name/description */\n name?: string;\n /** Whether skills in this wave run in parallel */\n parallel: boolean;\n /** Skills to execute in this wave */\n skills: (string | WorkflowSkill)[];\n /** Continue to next wave even if this wave has failures */\n continueOnError?: boolean;\n}\n\n/**\n * Workflow definition\n */\nexport interface Workflow {\n /** Workflow name (used as identifier) */\n name: string;\n /** Human-readable description */\n description?: string;\n /** Workflow version */\n version?: string;\n /** Author information */\n author?: string;\n /** Tags for discovery */\n tags?: string[];\n /** Waves of skills to execute */\n waves: WorkflowWave[];\n /** Environment variables to set */\n env?: Record<string, string>;\n /** Pre-execution hooks */\n preHooks?: string[];\n /** Post-execution hooks */\n postHooks?: string[];\n}\n\n/**\n * Workflow execution status\n */\nexport type WorkflowExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Status of a wave execution\n */\nexport interface WaveExecutionStatus {\n /** Wave index */\n waveIndex: number;\n /** Wave name */\n waveName?: string;\n /** Status */\n status: WorkflowExecutionStatus;\n /** Skills statuses */\n skills: {\n skill: string;\n status: WorkflowExecutionStatus;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n }[];\n /** When wave started */\n startedAt?: string;\n /** When wave completed */\n completedAt?: string;\n}\n\n/**\n * Workflow execution state\n */\nexport interface WorkflowExecution {\n /** Workflow being executed */\n workflow: Workflow;\n /** Execution ID */\n executionId: string;\n /** Overall status */\n status: WorkflowExecutionStatus;\n /** Current wave index */\n currentWave: number;\n /** Wave statuses */\n waves: WaveExecutionStatus[];\n /** When execution started */\n startedAt: string;\n /** When execution completed */\n completedAt?: string;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Workflow file location\n */\nexport const WORKFLOWS_DIR = 'workflows';\nexport const WORKFLOW_EXTENSION = '.yaml';\n","/**\n * Workflow Parser\n *\n * Parses workflow YAML files into Workflow objects.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type { Workflow, WorkflowWave, WorkflowSkill } from './types.js';\nimport { WORKFLOWS_DIR, WORKFLOW_EXTENSION } from './types.js';\n\n/**\n * Parse a workflow from YAML content\n */\nexport function parseWorkflow(content: string): Workflow {\n const data = parse(content) as Record<string, unknown>;\n\n if (!data.name || typeof data.name !== 'string') {\n throw new Error('Workflow must have a name');\n }\n\n if (!data.waves || !Array.isArray(data.waves)) {\n throw new Error('Workflow must have waves array');\n }\n\n const waves: WorkflowWave[] = data.waves.map((wave: unknown, index: number) => {\n if (typeof wave !== 'object' || wave === null) {\n throw new Error(`Wave ${index} must be an object`);\n }\n\n const waveObj = wave as Record<string, unknown>;\n const skills = waveObj.skills;\n\n if (!skills || !Array.isArray(skills)) {\n throw new Error(`Wave ${index} must have skills array`);\n }\n\n return {\n name: waveObj.name as string | undefined,\n parallel: waveObj.parallel === true,\n skills: skills.map((s: unknown) => {\n if (typeof s === 'string') {\n return s;\n }\n if (typeof s === 'object' && s !== null) {\n const skillObj = s as Record<string, unknown>;\n return {\n skill: skillObj.skill as string,\n config: skillObj.config as Record<string, unknown> | undefined,\n condition: skillObj.condition as string | undefined,\n } as WorkflowSkill;\n }\n throw new Error(`Invalid skill in wave ${index}`);\n }),\n continueOnError: waveObj.continueOnError === true,\n };\n });\n\n return {\n name: data.name as string,\n description: data.description as string | undefined,\n version: data.version as string | undefined,\n author: data.author as string | undefined,\n tags: data.tags as string[] | undefined,\n waves,\n env: data.env as Record<string, string> | undefined,\n preHooks: data.preHooks as string[] | undefined,\n postHooks: data.postHooks as string[] | undefined,\n };\n}\n\n/**\n * Load a workflow from a file\n */\nexport function loadWorkflow(filePath: string): Workflow {\n if (!existsSync(filePath)) {\n throw new Error(`Workflow file not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return parseWorkflow(content);\n}\n\n/**\n * Load a workflow by name from the project's workflows directory\n */\nexport function loadWorkflowByName(projectPath: string, name: string): Workflow | null {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return null;\n }\n\n // Try exact name match first\n const exactPath = join(workflowsDir, `${name}${WORKFLOW_EXTENSION}`);\n if (existsSync(exactPath)) {\n return loadWorkflow(exactPath);\n }\n\n // Try finding by workflow name property\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n if (workflow.name === name) {\n return workflow;\n }\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return null;\n}\n\n/**\n * List all workflows in a project\n */\nexport function listWorkflows(projectPath: string): Workflow[] {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return [];\n }\n\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n const workflows: Workflow[] = [];\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n workflows.push(workflow);\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return workflows;\n}\n\n/**\n * Save a workflow to a file\n */\nexport function saveWorkflow(projectPath: string, workflow: Workflow): string {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true });\n }\n\n const fileName = `${workflow.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}${WORKFLOW_EXTENSION}`;\n const filePath = join(workflowsDir, fileName);\n\n writeFileSync(filePath, stringify(workflow));\n\n return filePath;\n}\n\n/**\n * Serialize a workflow to YAML\n */\nexport function serializeWorkflow(workflow: Workflow): string {\n return stringify(workflow);\n}\n\n/**\n * Validate a workflow\n */\nexport function validateWorkflow(workflow: Workflow): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!workflow.name) {\n errors.push('Workflow must have a name');\n }\n\n if (!workflow.waves || workflow.waves.length === 0) {\n errors.push('Workflow must have at least one wave');\n }\n\n for (let i = 0; i < workflow.waves.length; i++) {\n const wave = workflow.waves[i];\n\n if (!wave.skills || wave.skills.length === 0) {\n errors.push(`Wave ${i + 1} must have at least one skill`);\n }\n\n for (let j = 0; j < wave.skills.length; j++) {\n const skill = wave.skills[j];\n const skillName = typeof skill === 'string' ? skill : skill.skill;\n\n if (!skillName) {\n errors.push(`Wave ${i + 1}, skill ${j + 1} must have a name`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Create a new workflow from a template\n */\nexport function createWorkflowTemplate(name: string, description?: string): Workflow {\n return {\n name,\n description: description || `Workflow: ${name}`,\n version: '1.0.0',\n waves: [\n {\n name: 'Setup',\n parallel: true,\n skills: [],\n },\n {\n name: 'Main',\n parallel: false,\n skills: [],\n },\n ],\n };\n}\n","/**\n * Workflow Orchestrator\n *\n * Executes workflows with wave-based orchestration.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n Workflow,\n WorkflowWave,\n WorkflowSkill,\n WorkflowExecution,\n WorkflowExecutionStatus,\n} from './types.js';\n\n/**\n * Skill executor function type\n */\nexport type SkillExecutor = (\n skillName: string,\n config?: Record<string, unknown>\n) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Progress callback for workflow execution\n */\nexport type WorkflowProgressCallback = (event: {\n type: 'wave_start' | 'wave_complete' | 'skill_start' | 'skill_complete' | 'workflow_complete';\n waveIndex?: number;\n waveName?: string;\n skillName?: string;\n status?: WorkflowExecutionStatus;\n error?: string;\n}) => void;\n\n/**\n * Workflow Orchestrator\n *\n * Manages the execution of workflows with parallel/sequential waves.\n */\nexport class WorkflowOrchestrator {\n private execution: WorkflowExecution | null = null;\n private executor: SkillExecutor;\n private onProgress?: WorkflowProgressCallback;\n\n constructor(executor: SkillExecutor, onProgress?: WorkflowProgressCallback) {\n this.executor = executor;\n this.onProgress = onProgress;\n }\n\n /**\n * Get current execution state\n */\n getExecution(): WorkflowExecution | null {\n return this.execution;\n }\n\n /**\n * Execute a workflow\n */\n async execute(workflow: Workflow): Promise<WorkflowExecution> {\n // Initialize execution state\n this.execution = {\n workflow,\n executionId: randomUUID(),\n status: 'running',\n currentWave: 0,\n waves: workflow.waves.map((wave, index) => ({\n waveIndex: index,\n waveName: wave.name,\n status: 'pending',\n skills: wave.skills.map((s) => ({\n skill: typeof s === 'string' ? s : s.skill,\n status: 'pending' as WorkflowExecutionStatus,\n })),\n })),\n startedAt: new Date().toISOString(),\n };\n\n try {\n // Execute each wave\n for (let i = 0; i < workflow.waves.length; i++) {\n if (this.execution.status === 'cancelled' || this.execution.status === 'paused') {\n break;\n }\n\n this.execution.currentWave = i;\n await this.executeWave(workflow.waves[i], i);\n\n // Check if wave failed and should stop\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n // Mark as completed if not already failed/cancelled/paused\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'workflow_complete',\n status: this.execution.status,\n error: this.execution.error,\n });\n\n return this.execution;\n } catch (error) {\n this.execution.status = 'failed';\n this.execution.error = error instanceof Error ? error.message : String(error);\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n }\n\n /**\n * Execute a single wave\n */\n private async executeWave(wave: WorkflowWave, waveIndex: number): Promise<void> {\n const waveStatus = this.execution!.waves[waveIndex];\n waveStatus.status = 'running';\n waveStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_start',\n waveIndex,\n waveName: wave.name,\n });\n\n const skills = wave.skills.map((s) => ({\n name: typeof s === 'string' ? s : s.skill,\n config: typeof s === 'string' ? undefined : (s as WorkflowSkill).config,\n }));\n\n if (wave.parallel) {\n // Execute skills in parallel\n await Promise.all(\n skills.map((skill, skillIndex) =>\n this.executeSkill(skill.name, skill.config, waveIndex, skillIndex)\n )\n );\n } else {\n // Execute skills sequentially\n for (let i = 0; i < skills.length; i++) {\n if (this.execution!.status === 'cancelled' || this.execution!.status === 'paused') {\n break;\n }\n\n await this.executeSkill(skills[i].name, skills[i].config, waveIndex, i);\n\n // Stop on first failure in sequential mode\n const skillStatus = waveStatus.skills[i];\n if (skillStatus.status === 'failed' && !wave.continueOnError) {\n break;\n }\n }\n }\n\n // Determine wave status based on skill statuses\n const hasFailures = waveStatus.skills.some((s) => s.status === 'failed');\n const allCompleted = waveStatus.skills.every(\n (s) => s.status === 'completed' || s.status === 'failed'\n );\n\n if (allCompleted) {\n waveStatus.status = hasFailures ? 'failed' : 'completed';\n }\n\n waveStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_complete',\n waveIndex,\n waveName: wave.name,\n status: waveStatus.status,\n });\n }\n\n /**\n * Execute a single skill\n */\n private async executeSkill(\n skillName: string,\n config: Record<string, unknown> | undefined,\n waveIndex: number,\n skillIndex: number\n ): Promise<void> {\n const skillStatus = this.execution!.waves[waveIndex].skills[skillIndex];\n skillStatus.status = 'running';\n skillStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_start',\n waveIndex,\n skillName,\n });\n\n try {\n const result = await this.executor(skillName, config);\n\n if (result.success) {\n skillStatus.status = 'completed';\n } else {\n skillStatus.status = 'failed';\n skillStatus.error = result.error;\n }\n } catch (error) {\n skillStatus.status = 'failed';\n skillStatus.error = error instanceof Error ? error.message : String(error);\n }\n\n skillStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_complete',\n waveIndex,\n skillName,\n status: skillStatus.status,\n error: skillStatus.error,\n });\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n if (!this.execution || this.execution.status !== 'running') {\n return false;\n }\n\n this.execution.status = 'paused';\n return true;\n }\n\n /**\n * Check if execution should continue\n */\n private shouldContinue(): boolean {\n if (!this.execution) return false;\n return this.execution.status === 'running';\n }\n\n /**\n * Resume execution\n */\n async resume(): Promise<WorkflowExecution | null> {\n if (!this.execution || this.execution.status !== 'paused') {\n return null;\n }\n\n this.execution.status = 'running';\n\n // Continue from current wave\n const workflow = this.execution.workflow;\n for (let i = this.execution.currentWave; i < workflow.waves.length; i++) {\n if (!this.shouldContinue()) {\n break;\n }\n\n this.execution.currentWave = i;\n\n // Skip already completed waves\n if (this.execution.waves[i].status === 'completed') {\n continue;\n }\n\n await this.executeWave(workflow.waves[i], i);\n\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n\n /**\n * Cancel execution\n */\n cancel(): boolean {\n if (!this.execution || this.execution.status === 'completed' || this.execution.status === 'failed') {\n return false;\n }\n\n this.execution.status = 'cancelled';\n this.execution.completedAt = new Date().toISOString();\n return true;\n }\n}\n\n/**\n * Create a new workflow orchestrator\n */\nexport function createWorkflowOrchestrator(\n executor: SkillExecutor,\n onProgress?: WorkflowProgressCallback\n): WorkflowOrchestrator {\n return new WorkflowOrchestrator(executor, onProgress);\n}\n","/**\n * Skill Execution Engine\n *\n * Executes skills with task-based orchestration, verification, and state management.\n */\n\nimport { execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type {\n ExecutableSkill,\n ExecutableTask,\n ExecutionOptions,\n TaskExecutionResult,\n SkillExecutionResult,\n CheckpointHandler,\n CheckpointResponse,\n ExecutionTaskStatus,\n} from './types.js';\nimport { SessionManager } from '../session/manager.js';\nimport type { SessionTask } from '../session/types.js';\n\n/**\n * Progress event for execution\n */\nexport interface ExecutionProgressEvent {\n type: 'task_start' | 'task_complete' | 'checkpoint' | 'verification' | 'complete';\n taskId?: string;\n taskName?: string;\n taskIndex?: number;\n totalTasks?: number;\n status?: ExecutionTaskStatus | 'paused' | 'cancelled';\n message?: string;\n error?: string;\n}\n\n/**\n * Progress callback type\n */\nexport type ExecutionProgressCallback = (event: ExecutionProgressEvent) => void;\n\n/**\n * Skill Execution Engine\n */\nexport class SkillExecutionEngine {\n private projectPath: string;\n private sessionManager: SessionManager;\n private checkpointHandler?: CheckpointHandler;\n private onProgress?: ExecutionProgressCallback;\n\n constructor(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n ) {\n this.projectPath = projectPath;\n this.sessionManager = new SessionManager(projectPath);\n this.checkpointHandler = options?.checkpointHandler;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Execute a skill\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): Promise<SkillExecutionResult> {\n const startTime = new Date();\n const tasks = skill.tasks || [];\n\n // Handle dry run\n if (options.dryRun) {\n return this.createDryRunResult(skill);\n }\n\n // Check if there's an existing paused execution for this skill\n const existingState = this.sessionManager.get();\n if (existingState?.currentExecution?.skillName === skill.name) {\n if (existingState.currentExecution.status === 'paused') {\n // Resume from paused state\n return this.resumeExecution(skill, options);\n }\n }\n\n // Start new execution\n const sessionTasks: Omit<SessionTask, 'status'>[] = tasks.map((task, index) => ({\n id: task.id || `task-${index}`,\n name: task.name,\n type: task.type === 'auto' ? 'auto' : task.type,\n }));\n\n this.sessionManager.startExecution(skill.name, skill.source, sessionTasks);\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Execute tasks\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n // Execute the task\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n const endTime = new Date();\n\n // Complete the execution\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n const result: SkillExecutionResult = {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n\n const statusMessages: Record<'completed' | 'failed' | 'cancelled' | 'paused', string> = {\n completed: 'Skill execution completed',\n paused: 'Skill execution paused',\n failed: overallError || 'Skill execution failed',\n cancelled: 'Skill execution cancelled',\n };\n\n this.onProgress?.({\n type: 'complete',\n status: overallStatus,\n message: statusMessages[overallStatus],\n });\n\n return result;\n }\n\n /**\n * Resume a paused execution\n */\n private async resumeExecution(\n skill: ExecutableSkill,\n options: ExecutionOptions\n ): Promise<SkillExecutionResult> {\n const state = this.sessionManager.get();\n if (!state?.currentExecution) {\n throw new Error('No execution to resume');\n }\n\n this.sessionManager.resume();\n const execution = state.currentExecution;\n const tasks = skill.tasks || [];\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Find where to resume from\n const startIndex = execution.currentStep;\n\n for (let i = startIndex; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints (same as in execute)\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n // Emit task_complete progress event (matching execute behavior)\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled (matching execute behavior)\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n // Only complete execution if not paused\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: execution.startedAt,\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - new Date(execution.startedAt).getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ExecutableTask,\n _skill: ExecutableSkill,\n _options: ExecutionOptions\n ): Promise<TaskExecutionResult> {\n const startTime = new Date();\n const taskId = task.id || randomUUID();\n\n try {\n // For now, we simulate task execution\n // In a real implementation, this would integrate with the AI agent\n // to execute the task action based on the skill content\n\n // Simulate some work\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'completed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n output: `Task \"${task.name}\" completed successfully`,\n filesModified: task.files,\n };\n } catch (error) {\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'failed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle a checkpoint\n */\n private async handleCheckpoint(\n task: ExecutableTask,\n context: { skillName: string; taskIndex: number; totalTasks: number }\n ): Promise<CheckpointResponse> {\n this.onProgress?.({\n type: 'checkpoint',\n taskId: task.id,\n taskName: task.name,\n taskIndex: context.taskIndex,\n totalTasks: context.totalTasks,\n message: `Checkpoint: ${task.type}`,\n });\n\n if (this.checkpointHandler) {\n return this.checkpointHandler(task, context);\n }\n\n // Default: auto-continue for non-decision checkpoints\n if (task.type === 'checkpoint:decision') {\n // Use first option if no handler\n return {\n continue: true,\n selectedOption: task.options?.[0],\n };\n }\n\n return { continue: true };\n }\n\n /**\n * Check if a regex pattern is potentially dangerous (ReDoS-vulnerable)\n * Rejects patterns with nested quantifiers and other known problematic constructs\n */\n private isUnsafeRegexPattern(pattern: string): boolean {\n // Detect nested quantifiers like (a+)+, (a*)+, (a+)*, (a*)*\n // These are the primary cause of catastrophic backtracking\n const nestedQuantifierPattern = /\\([^)]*[+*][^)]*\\)[+*?]/;\n if (nestedQuantifierPattern.test(pattern)) {\n return true;\n }\n\n // Detect overlapping alternations with quantifiers like (a|a)+\n const overlappingAlternation = /\\([^|)]*\\|[^|)]*\\)[+*]/;\n if (overlappingAlternation.test(pattern)) {\n return true;\n }\n\n // Detect excessive quantifiers (more than 3 quantifiers in a row-ish)\n const quantifierCount = (pattern.match(/[+*?]|\\{\\d+/g) || []).length;\n if (quantifierCount > 10) {\n return true;\n }\n\n // Detect very long character classes which can be slow\n const longCharClass = /\\[[^\\]]{50,}\\]/;\n if (longCharClass.test(pattern)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Safely test a regex pattern with ReDoS prevention\n *\n * This method validates patterns before execution to prevent catastrophic backtracking.\n * Note: This cannot guarantee protection against all ReDoS patterns, but catches common ones.\n */\n private safeRegexTest(pattern: string, input: string, _timeoutMs = 1000): boolean {\n // Strict length limits to prevent excessive processing\n if (pattern.length > 200 || input.length > 50000) {\n console.warn(`Regex test skipped: pattern or input too long`);\n return false;\n }\n\n // Reject patterns known to cause ReDoS\n if (this.isUnsafeRegexPattern(pattern)) {\n console.warn(`Regex pattern rejected as potentially unsafe: ${pattern.slice(0, 50)}...`);\n return false;\n }\n\n try {\n const regex = new RegExp(pattern);\n return regex.test(input);\n } catch {\n // Invalid regex pattern\n return false;\n }\n }\n\n /**\n * Run verification for a task\n *\n * SECURITY NOTE: Verification commands are executed from skill configuration.\n * Only run skills from trusted sources. Commands run with the same privileges\n * as the skillkit process.\n */\n private async runVerification(\n task: ExecutableTask,\n result: TaskExecutionResult\n ): Promise<boolean> {\n if (!task.verify) {\n return true;\n }\n\n const verificationResults = {\n automated: [] as { rule: string; passed: boolean; output?: string }[],\n human: [] as { description: string; passed: boolean }[],\n };\n\n // Run automated verification\n if (task.verify.automated) {\n for (const rule of task.verify.automated) {\n if (rule.command) {\n try {\n // SECURITY: Commands are from skill config - only run trusted skills\n const output = execSync(rule.command, {\n cwd: this.projectPath,\n encoding: 'utf-8',\n timeout: 30000,\n });\n\n let passed = true;\n if (rule.expect) {\n if (rule.expect === 'success') {\n passed = true;\n } else if (rule.expect.startsWith('contains:')) {\n const expected = rule.expect.slice(9);\n passed = output.includes(expected);\n } else if (rule.expect.startsWith('matches:')) {\n const pattern = rule.expect.slice(8);\n // Use safe regex test to prevent ReDoS\n passed = this.safeRegexTest(pattern, output);\n }\n }\n\n verificationResults.automated.push({\n rule: rule.command,\n passed,\n output,\n });\n\n this.onProgress?.({\n type: 'verification',\n taskId: task.id,\n taskName: task.name,\n message: `Verification ${passed ? 'passed' : 'failed'}: ${rule.command}`,\n });\n\n if (!passed) {\n return false;\n }\n } catch (error) {\n verificationResults.automated.push({\n rule: rule.command,\n passed: false,\n output: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n }\n }\n\n // Human verification would be handled by checkpoint handler\n result.verificationResults = verificationResults;\n return true;\n }\n\n /**\n * Create a dry run result\n */\n private createDryRunResult(skill: ExecutableSkill): SkillExecutionResult {\n const tasks = skill.tasks || [];\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: 'completed',\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n tasks: tasks.map((task) => ({\n taskId: task.id || randomUUID(),\n taskName: task.name,\n status: 'skipped' as ExecutionTaskStatus,\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n output: '[Dry run - not executed]',\n })),\n filesModified: [],\n commits: [],\n };\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n return this.sessionManager.pause();\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.sessionManager.isPaused();\n }\n\n /**\n * Get session manager\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n}\n\n/**\n * Create a new skill execution engine\n */\nexport function createExecutionEngine(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n): SkillExecutionEngine {\n return new SkillExecutionEngine(projectPath, options);\n}\n","/**\n * Agent Execution Module\n *\n * Handles real execution of skills through various AI agent CLIs.\n */\n\nimport { spawn, type SpawnOptions } from 'node:child_process';\nimport type { AgentType } from '../types.js';\n\n/**\n * Agent CLI configuration\n */\nexport interface AgentCLIConfig {\n /** Agent type */\n type: AgentType;\n /** CLI command name */\n command: string;\n /** Whether the agent supports CLI execution */\n supportsCLI: boolean;\n /** Arguments to pass the prompt/skill content */\n promptArgs?: string[];\n /** Arguments for non-interactive mode */\n nonInteractiveArgs?: string[];\n /** Environment variables needed */\n envVars?: Record<string, string>;\n /** How to check if agent is installed */\n checkCommand?: string;\n}\n\n/**\n * Execution result from an agent\n */\nexport interface AgentExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n exitCode: number;\n duration: number;\n}\n\n/**\n * Agent CLI configurations\n */\nexport const AGENT_CLI_CONFIGS: AgentCLIConfig[] = [\n {\n type: 'claude-code',\n command: 'claude',\n supportsCLI: true,\n promptArgs: ['--print', '-p'],\n nonInteractiveArgs: ['--no-input'],\n checkCommand: 'claude --version',\n },\n {\n type: 'codex',\n command: 'codex',\n supportsCLI: true,\n promptArgs: ['-p'],\n checkCommand: 'codex --version',\n },\n {\n type: 'gemini-cli',\n command: 'gemini',\n supportsCLI: true,\n promptArgs: [],\n checkCommand: 'gemini --version',\n },\n {\n type: 'opencode',\n command: 'opencode',\n supportsCLI: true,\n promptArgs: ['--prompt'],\n checkCommand: 'opencode --version',\n },\n {\n type: 'goose',\n command: 'goose',\n supportsCLI: true,\n promptArgs: ['run'],\n checkCommand: 'goose --version',\n },\n // IDE-based agents (no CLI execution)\n {\n type: 'cursor',\n command: 'cursor',\n supportsCLI: false,\n },\n {\n type: 'windsurf',\n command: 'windsurf',\n supportsCLI: false,\n },\n {\n type: 'github-copilot',\n command: 'gh copilot',\n supportsCLI: false,\n },\n];\n\n/**\n * Get CLI config for an agent\n */\nexport function getAgentCLIConfig(agentType: AgentType): AgentCLIConfig | undefined {\n return AGENT_CLI_CONFIGS.find((c) => c.type === agentType);\n}\n\n/**\n * Check if an agent CLI is available\n */\nexport async function isAgentCLIAvailable(agentType: AgentType): Promise<boolean> {\n const config = getAgentCLIConfig(agentType);\n if (!config || !config.supportsCLI) return false;\n\n try {\n // Check if command exists\n const checkCmd = config.checkCommand || `which ${config.command}`;\n const result = await executeCommand(checkCmd.split(' ')[0], checkCmd.split(' ').slice(1), {\n timeout: 5000,\n });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get all available CLI agents\n */\nexport async function getAvailableCLIAgents(): Promise<AgentType[]> {\n const available: AgentType[] = [];\n\n for (const config of AGENT_CLI_CONFIGS) {\n if (config.supportsCLI && (await isAgentCLIAvailable(config.type))) {\n available.push(config.type);\n }\n }\n\n return available;\n}\n\n/**\n * Execute a skill using an agent CLI\n */\nexport async function executeWithAgent(\n agentType: AgentType,\n prompt: string,\n options: {\n cwd?: string;\n timeout?: number;\n env?: Record<string, string>;\n } = {}\n): Promise<AgentExecutionResult> {\n const config = getAgentCLIConfig(agentType);\n\n if (!config) {\n return {\n success: false,\n output: '',\n error: `Unknown agent type: ${agentType}`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n if (!config.supportsCLI) {\n return {\n success: false,\n output: '',\n error: `Agent ${agentType} does not support CLI execution. Please use IDE integration.`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n const isAvailable = await isAgentCLIAvailable(agentType);\n if (!isAvailable) {\n return {\n success: false,\n output: '',\n error: `Agent CLI '${config.command}' is not installed or not in PATH`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n // Build command arguments\n const args: string[] = [...(config.promptArgs || [])];\n\n // For Claude Code, use --print mode with the prompt\n if (agentType === 'claude-code') {\n args.push(prompt);\n } else {\n // For other agents, pass prompt as argument\n args.push(prompt);\n }\n\n // Add non-interactive flags if available\n if (config.nonInteractiveArgs) {\n args.push(...config.nonInteractiveArgs);\n }\n\n return executeCommand(config.command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 300000, // 5 minutes default\n env: {\n ...process.env,\n ...config.envVars,\n ...options.env,\n },\n });\n}\n\n/**\n * Execute a command and capture output\n */\nasync function executeCommand(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n timeout?: number;\n env?: NodeJS.ProcessEnv;\n } = {}\n): Promise<AgentExecutionResult> {\n return new Promise((resolve) => {\n const startTime = Date.now();\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n env: options.env as NodeJS.ProcessEnv,\n // shell: false (default) - prevents shell injection when passing untrusted input\n };\n\n const child = spawn(command, args, spawnOptions);\n\n // Set up timeout\n const timeoutId = options.timeout\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeout)\n : null;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: false,\n output: stdout,\n error: error.message,\n exitCode: 1,\n duration: Date.now() - startTime,\n });\n });\n\n child.on('close', (code) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: code === 0 && !timedOut,\n output: stdout,\n error: timedOut ? 'Execution timed out' : stderr || undefined,\n exitCode: code ?? 1,\n duration: Date.now() - startTime,\n });\n });\n });\n}\n\n/**\n * Format skill content as a prompt for an agent\n */\nexport function formatSkillAsPrompt(\n skillName: string,\n skillContent: string,\n taskDescription?: string\n): string {\n let prompt = `Execute the following skill: ${skillName}\\n\\n`;\n\n if (taskDescription) {\n prompt += `Task: ${taskDescription}\\n\\n`;\n }\n\n prompt += `Skill Content:\\n${skillContent}`;\n\n return prompt;\n}\n\n/**\n * Agent execution strategy\n */\nexport type ExecutionStrategy = 'cli' | 'ide' | 'api' | 'manual';\n\n/**\n * Get recommended execution strategy for an agent\n */\nexport function getExecutionStrategy(agentType: AgentType): ExecutionStrategy {\n const config = getAgentCLIConfig(agentType);\n\n if (config?.supportsCLI) {\n return 'cli';\n }\n\n // IDE-based agents\n if (['cursor', 'windsurf', 'github-copilot', 'kilo'].includes(agentType)) {\n return 'ide';\n }\n\n return 'manual';\n}\n\n/**\n * Get instructions for manual/IDE execution\n */\nexport function getManualExecutionInstructions(\n agentType: AgentType,\n skillPath: string\n): string {\n const strategy = getExecutionStrategy(agentType);\n\n if (strategy === 'ide') {\n return `\nTo execute this skill with ${agentType}:\n1. Open your project in ${agentType}\n2. The skill has been synced to the agent's skills directory\n3. Open the AI assistant/chat\n4. Reference the skill or ask the assistant to follow the instructions\n\nSkill location: ${skillPath}\n`;\n }\n\n return `\nTo execute this skill manually:\n1. Open the skill file: ${skillPath}\n2. Copy the skill content\n3. Paste it into your AI coding assistant\n4. Follow the instructions in the skill\n`;\n}\n","/**\n * Skill Executor for Workflows\n *\n * Provides a real skill executor that finds skills by name\n * and executes them using available agent CLIs.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { findSkill, readSkillContent, SKILL_DISCOVERY_PATHS } from '../skills.js';\nimport type { AgentType } from '../types.js';\nimport {\n executeWithAgent,\n getAvailableCLIAgents,\n formatSkillAsPrompt,\n getExecutionStrategy,\n getManualExecutionInstructions,\n} from './agents.js';\nimport type { SkillExecutor } from '../workflow/orchestrator.js';\n\n/**\n * Options for creating a skill executor\n */\nexport interface SkillExecutorOptions {\n /** Project path to search for skills */\n projectPath?: string;\n /** Preferred agent to use for execution */\n preferredAgent?: AgentType;\n /** Timeout for skill execution (ms) */\n timeout?: number;\n /** Whether to fall back to other agents if preferred is unavailable */\n fallbackToAvailable?: boolean;\n /** Callback for execution events */\n onExecutionEvent?: (event: SkillExecutionEvent) => void;\n}\n\n/**\n * Skill execution event\n */\nexport interface SkillExecutionEvent {\n type: 'skill_found' | 'skill_not_found' | 'agent_selected' | 'execution_start' | 'execution_complete';\n skillName: string;\n agent?: AgentType;\n message?: string;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Get search directories for skills\n */\nfunction getSearchDirs(projectPath: string): string[] {\n const dirs: string[] = [];\n\n // Project-local paths\n for (const searchPath of SKILL_DISCOVERY_PATHS) {\n const fullPath = join(projectPath, searchPath);\n if (existsSync(fullPath)) {\n dirs.push(fullPath);\n }\n }\n\n // Global paths\n const home = homedir();\n const globalPaths = [\n join(home, '.claude', 'skills'),\n join(home, '.cursor', 'skills'),\n join(home, '.codex', 'skills'),\n join(home, '.skillkit', 'skills'),\n ];\n\n for (const globalPath of globalPaths) {\n if (existsSync(globalPath)) {\n dirs.push(globalPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Create a skill executor for workflow orchestration\n *\n * This returns a function compatible with the WorkflowOrchestrator's SkillExecutor type.\n */\nexport function createSkillExecutor(options: SkillExecutorOptions = {}): SkillExecutor {\n const {\n projectPath = process.cwd(),\n preferredAgent,\n timeout = 300000, // 5 minutes\n fallbackToAvailable = true,\n onExecutionEvent,\n } = options;\n\n return async (skillName: string, config?: Record<string, unknown>): Promise<{ success: boolean; error?: string }> => {\n // Find the skill\n const searchDirs = getSearchDirs(projectPath);\n const skill = findSkill(skillName, searchDirs);\n\n if (!skill) {\n onExecutionEvent?.({\n type: 'skill_not_found',\n skillName,\n message: `Skill \"${skillName}\" not found in any search directory`,\n });\n\n return {\n success: false,\n error: `Skill \"${skillName}\" not found. Search paths: ${searchDirs.join(', ')}`,\n };\n }\n\n onExecutionEvent?.({\n type: 'skill_found',\n skillName,\n message: `Found skill at: ${skill.path}`,\n });\n\n // Read skill content\n const content = readSkillContent(skill.path);\n if (!content) {\n return {\n success: false,\n error: `Could not read skill content from: ${skill.path}`,\n };\n }\n\n // Determine which agent to use\n let agentToUse: AgentType | undefined = preferredAgent;\n\n if (!agentToUse || fallbackToAvailable) {\n const availableAgents = await getAvailableCLIAgents();\n\n if (preferredAgent && availableAgents.includes(preferredAgent)) {\n agentToUse = preferredAgent;\n } else if (availableAgents.length > 0) {\n // Prefer claude-code if available, otherwise use first available\n agentToUse = availableAgents.includes('claude-code') ? 'claude-code' : availableAgents[0];\n }\n }\n\n // If no CLI agent available, provide manual instructions or error\n if (!agentToUse) {\n const strategy = getExecutionStrategy(preferredAgent || 'universal');\n const instructions = getManualExecutionInstructions(preferredAgent || 'universal', skill.path);\n\n if (strategy === 'ide' || strategy === 'manual') {\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n success: false,\n message: 'No CLI agent available',\n error: `No CLI agent available for execution.\\n${instructions}`,\n });\n\n return {\n success: false,\n error: `No CLI agent available for automated execution. ${instructions}`,\n };\n }\n\n // strategy is 'cli' but the preferred agent's CLI is not installed\n const errorMsg = preferredAgent\n ? `The preferred agent \"${preferredAgent}\" supports CLI execution but its CLI is not installed.`\n : 'No CLI agent is available for execution.';\n\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n success: false,\n message: 'CLI not installed',\n error: `${errorMsg}\\n${instructions}`,\n });\n\n return {\n success: false,\n error: `${errorMsg} ${instructions}`,\n };\n }\n\n onExecutionEvent?.({\n type: 'agent_selected',\n skillName,\n agent: agentToUse,\n message: `Using agent: ${agentToUse}`,\n });\n\n // Format the prompt with skill content and any config\n let taskDescription: string | undefined;\n if (config?.task) {\n taskDescription = String(config.task);\n }\n\n const prompt = formatSkillAsPrompt(skillName, content, taskDescription);\n\n onExecutionEvent?.({\n type: 'execution_start',\n skillName,\n agent: agentToUse,\n message: `Starting execution with ${agentToUse}`,\n });\n\n // Execute with the agent\n const result = await executeWithAgent(agentToUse!, prompt, {\n cwd: projectPath,\n timeout,\n });\n\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n agent: agentToUse,\n success: result.success,\n error: result.error,\n message: result.success ? 'Execution completed successfully' : `Execution failed: ${result.error}`,\n });\n\n return {\n success: result.success,\n error: result.error,\n };\n };\n}\n\n/**\n * Create a simulated skill executor for testing/dry-run\n *\n * This executor doesn't actually run skills but simulates execution.\n */\nexport function createSimulatedSkillExecutor(options: {\n delay?: number;\n shouldFail?: (skillName: string) => boolean;\n onExecute?: (skillName: string) => void;\n} = {}): SkillExecutor {\n const { delay = 100, shouldFail, onExecute } = options;\n\n return async (skillName: string, _config?: Record<string, unknown>): Promise<{ success: boolean; error?: string }> => {\n onExecute?.(skillName);\n\n // Simulate execution time\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n const failed = shouldFail?.(skillName) ?? false;\n\n return {\n success: !failed,\n error: failed ? `Simulated failure for skill: ${skillName}` : undefined,\n };\n };\n}\n","/**\n * Skill Test Runner\n *\n * Executes test suites and assertions for skill verification.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { createServer } from 'node:net';\nimport { promisify } from 'node:util';\nimport { parse as parseYaml } from 'yaml';\nimport type {\n TestAssertion,\n AssertionResult,\n SkillTestCase,\n TestCaseResult,\n SkillTestSuite,\n TestSuiteResult,\n TestRunnerOptions,\n} from './types.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Default timeout for assertions (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Run a single assertion\n */\nasync function runAssertion(\n assertion: TestAssertion,\n cwd: string,\n timeout: number\n): Promise<AssertionResult> {\n const startTime = Date.now();\n\n try {\n switch (assertion.type) {\n case 'file_exists':\n return assertFileExists(assertion, cwd, startTime);\n\n case 'file_not_exists':\n return assertFileNotExists(assertion, cwd, startTime);\n\n case 'file_contains':\n return assertFileContains(assertion, cwd, startTime);\n\n case 'file_not_contains':\n return assertFileNotContains(assertion, cwd, startTime);\n\n case 'file_matches':\n return assertFileMatches(assertion, cwd, startTime);\n\n case 'command_succeeds':\n return assertCommandSucceeds(assertion, cwd, timeout, startTime);\n\n case 'command_fails':\n return assertCommandFails(assertion, cwd, timeout, startTime);\n\n case 'command_output_contains':\n return assertCommandOutputContains(assertion, cwd, timeout, startTime);\n\n case 'json_valid':\n return assertJsonValid(assertion, cwd, startTime);\n\n case 'json_has_key':\n return assertJsonHasKey(assertion, cwd, startTime);\n\n case 'yaml_valid':\n return assertYamlValid(assertion, cwd, startTime);\n\n case 'type_check':\n return assertTypeCheck(cwd, timeout, startTime);\n\n case 'lint_passes':\n return assertLintPasses(cwd, timeout, startTime);\n\n case 'test_passes':\n return assertTestPasses(cwd, timeout, startTime);\n\n case 'env_var_set':\n return assertEnvVarSet(assertion, startTime);\n\n case 'port_available':\n return assertPortAvailable(assertion, startTime);\n\n case 'url_responds':\n return assertUrlResponds(assertion, timeout, startTime);\n\n case 'custom':\n return assertCustom(assertion, cwd, timeout, startTime);\n\n default:\n return {\n assertion,\n passed: false,\n error: `Unknown assertion type: ${assertion.type}`,\n duration: Date.now() - startTime,\n };\n }\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n// Assertion implementations\n\nfunction assertFileExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'exists',\n error: exists ? undefined : `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: !exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'not found',\n error: !exists ? undefined : `File should not exist: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'contains' : 'not found in file',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `File does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: true, // File doesn't exist, so it doesn't contain the text\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: !contains,\n actual: contains ? 'found in file' : 'not found',\n expected: `does not contain \"${expected}\"`,\n error: !contains ? undefined : `File should not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileMatches(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const pattern = new RegExp(String(assertion.expected || ''));\n const matches = pattern.test(content);\n\n return {\n assertion,\n passed: matches,\n actual: matches ? 'matches' : 'no match',\n expected: `matches /${assertion.expected}/`,\n error: matches ? undefined : `File does not match pattern: ${assertion.expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertCommandSucceeds(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'exit code 0',\n expected: 'exit code 0',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'non-zero exit code',\n expected: 'exit code 0',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandFails(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: false,\n actual: 'exit code 0',\n expected: 'non-zero exit code',\n error: 'Command should have failed but succeeded',\n duration: Date.now() - startTime,\n };\n } catch {\n return {\n assertion,\n passed: true,\n actual: 'non-zero exit code',\n expected: 'non-zero exit code',\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandOutputContains(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n const { stdout, stderr } = await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n const output = stdout + stderr;\n const expected = String(assertion.expected || '');\n const contains = output.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'found in output' : 'not found',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `Command output does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n JSON.parse(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid JSON',\n expected: 'valid JSON',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid JSON',\n expected: 'valid JSON',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonHasKey(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const key = String(assertion.expected || '');\n const keys = key.split('.');\n\n let value = json;\n for (const k of keys) {\n if (value === undefined || value === null || !(k in value)) {\n return {\n assertion,\n passed: false,\n actual: 'key not found',\n expected: `has key \"${key}\"`,\n error: `JSON does not have key: ${key}`,\n duration: Date.now() - startTime,\n };\n }\n value = value[k];\n }\n\n return {\n assertion,\n passed: true,\n actual: 'key found',\n expected: `has key \"${key}\"`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertYamlValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseYaml(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid YAML',\n expected: 'valid YAML',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid YAML',\n expected: 'valid YAML',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertTypeCheck(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'type_check' };\n\n // Try various type check commands\n const commands = [\n 'npx tsc --noEmit',\n 'pnpm tsc --noEmit',\n 'yarn tsc --noEmit',\n 'npm run type-check',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'types valid',\n expected: 'types valid',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'type errors',\n expected: 'types valid',\n error: 'Type check failed or TypeScript not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertLintPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'lint_passes' };\n\n // Try various lint commands\n const commands = [\n 'npx eslint . --max-warnings=0',\n 'pnpm eslint . --max-warnings=0',\n 'npm run lint',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'lint passes',\n expected: 'lint passes',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'lint errors',\n expected: 'lint passes',\n error: 'Lint check failed or ESLint not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertTestPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'test_passes' };\n\n // Try various test commands\n const commands = [\n 'npm test',\n 'pnpm test',\n 'yarn test',\n 'npx vitest run',\n 'npx jest',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'tests pass',\n expected: 'tests pass',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'tests fail',\n expected: 'tests pass',\n error: 'Tests failed or test framework not configured',\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertEnvVarSet(\n assertion: TestAssertion,\n startTime: number\n): AssertionResult {\n const varName = assertion.target || '';\n const isSet = process.env[varName] !== undefined;\n\n return {\n assertion,\n passed: isSet,\n actual: isSet ? 'set' : 'not set',\n expected: 'set',\n error: isSet ? undefined : `Environment variable not set: ${varName}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nasync function assertPortAvailable(\n assertion: TestAssertion,\n startTime: number\n): Promise<AssertionResult> {\n const port = parseInt(assertion.target || '0', 10);\n\n if (port <= 0 || port > 65535) {\n return {\n assertion,\n passed: false,\n actual: `invalid port ${port}`,\n expected: 'valid port number (1-65535)',\n error: 'Invalid port number',\n duration: Date.now() - startTime,\n };\n }\n\n const isAvailable = await checkPortAvailable(port);\n\n return {\n assertion,\n passed: isAvailable,\n actual: isAvailable ? 'available' : 'in use',\n expected: 'available',\n error: isAvailable ? undefined : `Port ${port} is already in use`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertUrlResponds(\n assertion: TestAssertion,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const url = assertion.target || '';\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), assertion.timeout || timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n const responds = response.ok;\n\n return {\n assertion,\n passed: responds,\n actual: `status ${response.status}`,\n expected: 'status 2xx',\n error: responds ? undefined : `URL returned status ${response.status}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCustom(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n if (!assertion.command) {\n return {\n assertion,\n passed: false,\n error: 'Custom assertion requires a command',\n duration: Date.now() - startTime,\n };\n }\n\n try {\n await execAsync(assertion.command, {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'command succeeded',\n expected: 'command succeeds',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'command failed',\n expected: 'command succeeds',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(\n testCase: SkillTestCase,\n cwd: string,\n options: TestRunnerOptions\n): Promise<TestCaseResult> {\n const startTime = Date.now();\n const timeout = testCase.assertions[0]?.timeout || options.timeout || DEFAULT_TIMEOUT;\n\n // Check if test should be skipped\n if (testCase.skip) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n\n // Check tag filters - if tags are specified, only run tests with matching tags\n if (options.tags && options.tags.length > 0) {\n // Tests without tags should be skipped when tag filter is active\n if (!testCase.tags || testCase.tags.length === 0) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n const hasRequiredTag = options.tags.some((t) => testCase.tags?.includes(t));\n if (!hasRequiredTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n if (options.skipTags && testCase.tags) {\n const hasSkipTag = options.skipTags.some((t) => testCase.tags?.includes(t));\n if (hasSkipTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n // Run setup commands\n let setupError: string | undefined;\n if (testCase.setup) {\n for (const cmd of testCase.setup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n setupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (setupError) {\n return {\n testCase,\n passed: false,\n assertions: [],\n setupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n }\n\n // Run assertions\n const assertionResults: AssertionResult[] = [];\n let allPassed = true;\n\n for (const assertion of testCase.assertions) {\n options.onProgress?.({\n type: 'assertion_start',\n testName: testCase.name,\n assertionType: assertion.type,\n });\n\n const result = await runAssertion(assertion, cwd, timeout);\n assertionResults.push(result);\n\n options.onProgress?.({\n type: 'assertion_end',\n testName: testCase.name,\n assertionType: assertion.type,\n passed: result.passed,\n error: result.error,\n });\n\n if (!result.passed) {\n allPassed = false;\n if (options.bail) {\n break;\n }\n }\n }\n\n // Run cleanup commands\n let cleanupError: string | undefined;\n if (testCase.cleanup) {\n for (const cmd of testCase.cleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n cleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n return {\n testCase,\n passed: allPassed,\n assertions: assertionResults,\n cleanupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n}\n\n/**\n * Run a test suite\n */\nexport async function runTestSuite(\n suite: SkillTestSuite,\n options: TestRunnerOptions = {}\n): Promise<TestSuiteResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const timeout = suite.defaultTimeout || options.timeout || DEFAULT_TIMEOUT;\n\n options.onProgress?.({\n type: 'suite_start',\n skillName: suite.skillName,\n });\n\n // Run global setup\n let globalSetupError: string | undefined;\n if (suite.globalSetup) {\n for (const cmd of suite.globalSetup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalSetupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (globalSetupError) {\n return {\n skillName: suite.skillName,\n passed: false,\n tests: [],\n passedCount: 0,\n failedCount: 0,\n skippedCount: 0,\n duration: Date.now() - startTime,\n globalSetupError,\n };\n }\n\n // Check for 'only' tests\n const hasOnly = suite.tests.some((t) => t.only);\n const testsToRun = hasOnly ? suite.tests.filter((t) => t.only) : suite.tests;\n\n // Run tests\n const testResults: TestCaseResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const testCase of testsToRun) {\n options.onProgress?.({\n type: 'test_start',\n skillName: suite.skillName,\n testName: testCase.name,\n });\n\n const result = await runTestCase(testCase, cwd, { ...options, timeout });\n testResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n }\n\n options.onProgress?.({\n type: 'test_end',\n skillName: suite.skillName,\n testName: testCase.name,\n passed: result.passed,\n error: result.assertions.find((a) => !a.passed)?.error,\n });\n\n if (!result.passed && options.bail) {\n break;\n }\n }\n\n // Run global cleanup\n let globalCleanupError: string | undefined;\n if (suite.globalCleanup) {\n for (const cmd of suite.globalCleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalCleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n const result: TestSuiteResult = {\n skillName: suite.skillName,\n passed: failedCount === 0,\n tests: testResults,\n passedCount,\n failedCount,\n skippedCount,\n duration: Date.now() - startTime,\n globalCleanupError,\n };\n\n options.onProgress?.({\n type: 'suite_end',\n skillName: suite.skillName,\n passed: result.passed,\n });\n\n return result;\n}\n\n/**\n * Create a test suite from skill frontmatter\n */\nexport function createTestSuiteFromFrontmatter(\n skillName: string,\n frontmatter: Record<string, unknown>\n): SkillTestSuite | null {\n const tests = frontmatter.tests;\n\n if (!tests || !Array.isArray(tests)) {\n return null;\n }\n\n const testCases: SkillTestCase[] = tests.map((t: Record<string, unknown>) => ({\n name: String(t.name || 'Unnamed test'),\n description: t.description as string | undefined,\n assertions: parseAssertions(t.assertions || t.assert),\n setup: t.setup as string[] | undefined,\n cleanup: t.cleanup as string[] | undefined,\n skip: t.skip === true,\n only: t.only === true,\n tags: t.tags as string[] | undefined,\n }));\n\n return {\n skillName,\n tests: testCases,\n globalSetup: frontmatter.globalSetup as string[] | undefined,\n globalCleanup: frontmatter.globalCleanup as string[] | undefined,\n defaultTimeout: frontmatter.testTimeout as number | undefined,\n };\n}\n\n/**\n * Parse assertions from various formats\n */\nfunction parseAssertions(assertions: unknown): TestAssertion[] {\n if (!assertions) return [];\n\n if (typeof assertions === 'string') {\n // Simple string assertion like \"file_exists: config.json\"\n return [parseAssertionString(assertions)];\n }\n\n if (Array.isArray(assertions)) {\n return assertions.map((a) => {\n if (typeof a === 'string') {\n return parseAssertionString(a);\n }\n return a as TestAssertion;\n });\n }\n\n return [assertions as TestAssertion];\n}\n\n/**\n * Parse a string assertion\n */\nfunction parseAssertionString(str: string): TestAssertion {\n // Format: \"type: target\" or \"type: target = expected\"\n const match = str.match(/^(\\w+):\\s*(.+?)(?:\\s*=\\s*(.+))?$/);\n\n if (match) {\n return {\n type: match[1] as TestAssertion['type'],\n target: match[2].trim(),\n expected: match[3]?.trim(),\n };\n }\n\n // Fallback: treat as command\n return {\n type: 'command_succeeds',\n target: str,\n };\n}\n","/**\n * Skill Marketplace Types\n *\n * Types for the aggregated skill marketplace.\n */\n\n/**\n * Skill source repository\n */\nexport interface SkillSource {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Whether this is an official source */\n official?: boolean;\n /** Branch to fetch from */\n branch?: string;\n /** Path to skills index file */\n indexPath?: string;\n}\n\n/**\n * Skill entry in the marketplace\n */\nexport interface MarketplaceSkill {\n /** Unique identifier (owner/repo/path) */\n id: string;\n /** Skill name */\n name: string;\n /** Description */\n description: string;\n /** Source repository */\n source: SkillSource;\n /** Path within the repository */\n path: string;\n /** Version if available */\n version?: string;\n /** Author */\n author?: string;\n /** Tags for categorization */\n tags: string[];\n /** Supported agents */\n agents?: string[];\n /** GitHub stars (if available) */\n stars?: number;\n /** Last updated date */\n updatedAt?: string;\n /** Download/install count */\n downloads?: number;\n /** Raw content URL */\n rawUrl?: string;\n}\n\n/**\n * Marketplace index (cached locally)\n */\nexport interface MarketplaceIndex {\n /** Index version */\n version: number;\n /** When the index was last updated */\n updatedAt: string;\n /** Sources included in this index */\n sources: SkillSource[];\n /** All skills in the index */\n skills: MarketplaceSkill[];\n /** Total skill count */\n totalCount: number;\n}\n\n/**\n * Search options for the marketplace\n */\nexport interface MarketplaceSearchOptions {\n /** Search query */\n query?: string;\n /** Filter by tags */\n tags?: string[];\n /** Filter by source */\n source?: string;\n /** Filter by agent compatibility */\n agent?: string;\n /** Sort by field */\n sortBy?: 'name' | 'stars' | 'downloads' | 'updatedAt';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Limit results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n/**\n * Search result\n */\nexport interface MarketplaceSearchResult {\n /** Matching skills */\n skills: MarketplaceSkill[];\n /** Total matches (before limit) */\n total: number;\n /** Query that was searched */\n query?: string;\n}\n\n/**\n * Marketplace configuration\n */\nexport interface MarketplaceConfig {\n /** Custom sources to include */\n sources?: SkillSource[];\n /** Cache directory */\n cacheDir?: string;\n /** Cache TTL in milliseconds */\n cacheTTL?: number;\n /** GitHub token for API access */\n githubToken?: string;\n}\n\n/**\n * Default skill sources\n */\nexport const DEFAULT_SKILL_SOURCES: SkillSource[] = [\n {\n owner: 'composioHQ',\n repo: 'awesome-claude-code-skills',\n name: 'Composio Curated',\n description: 'Curated collection of Claude Code skills',\n official: false,\n branch: 'main',\n },\n {\n owner: 'anthropics',\n repo: 'courses',\n name: 'Anthropic Official',\n description: 'Official Anthropic courses and skills',\n official: true,\n branch: 'master',\n },\n];\n\n/**\n * Cache file name\n */\nexport const MARKETPLACE_CACHE_FILE = 'marketplace-index.json';\n\n/**\n * Default cache TTL (1 hour)\n */\nexport const DEFAULT_CACHE_TTL = 60 * 60 * 1000;\n","/**\n * Marketplace Aggregator\n *\n * Fetches and indexes skills from multiple GitHub repositories.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type {\n SkillSource,\n MarketplaceSkill,\n MarketplaceIndex,\n MarketplaceSearchOptions,\n MarketplaceSearchResult,\n MarketplaceConfig,\n} from './types.js';\nimport {\n DEFAULT_SKILL_SOURCES,\n MARKETPLACE_CACHE_FILE,\n DEFAULT_CACHE_TTL,\n} from './types.js';\n\n/**\n * Marketplace Aggregator\n */\nexport class MarketplaceAggregator {\n private config: MarketplaceConfig;\n private cacheDir: string;\n private cachePath: string;\n private index: MarketplaceIndex | null = null;\n\n constructor(config: MarketplaceConfig = {}) {\n this.config = config;\n this.cacheDir = config.cacheDir || join(homedir(), '.skillkit', 'marketplace');\n this.cachePath = join(this.cacheDir, MARKETPLACE_CACHE_FILE);\n\n // Ensure cache directory exists\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n /**\n * Get all sources (default + custom)\n */\n getSources(): SkillSource[] {\n return [...DEFAULT_SKILL_SOURCES, ...(this.config.sources || [])];\n }\n\n /**\n * Load cached index\n */\n loadCache(): MarketplaceIndex | null {\n if (!existsSync(this.cachePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.cachePath, 'utf-8');\n const index = JSON.parse(content) as MarketplaceIndex;\n\n // Check if cache is expired\n const cacheAge = Date.now() - new Date(index.updatedAt).getTime();\n const ttl = this.config.cacheTTL || DEFAULT_CACHE_TTL;\n\n if (cacheAge > ttl) {\n return null; // Cache expired\n }\n\n this.index = index;\n return index;\n } catch {\n return null;\n }\n }\n\n /**\n * Save index to cache\n */\n saveCache(index: MarketplaceIndex): void {\n writeFileSync(this.cachePath, JSON.stringify(index, null, 2));\n this.index = index;\n }\n\n /**\n * Fetch skills from a single source\n */\n async fetchSource(source: SkillSource): Promise<MarketplaceSkill[]> {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n try {\n // Try to fetch skills index file\n const indexPaths = [\n source.indexPath,\n 'skills.json',\n 'index.json',\n '.skillkit/skills.json',\n ].filter(Boolean) as string[];\n\n for (const indexPath of indexPaths) {\n try {\n const url = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${indexPath}`;\n const response = await fetch(url);\n\n if (response.ok) {\n const data = (await response.json()) as unknown;\n\n if (Array.isArray(data)) {\n for (const item of data) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n\n const dataObj = data as Record<string, unknown>;\n if (dataObj.skills && Array.isArray(dataObj.skills)) {\n for (const item of dataObj.skills) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n }\n } catch {\n // Try next path\n }\n }\n\n // Fallback: Try to parse README for skill links\n const readmeUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/README.md`;\n const readmeResponse = await fetch(readmeUrl);\n\n if (readmeResponse.ok) {\n const readme = await readmeResponse.text();\n const parsedSkills = this.parseReadmeForSkills(readme, source);\n skills.push(...parsedSkills);\n }\n\n // If still no skills, add the repo itself as a skill source\n if (skills.length === 0) {\n skills.push({\n id: `${source.owner}/${source.repo}`,\n name: source.repo,\n description: source.description || `Skills from ${source.name}`,\n source,\n path: '/',\n tags: ['repository'],\n rawUrl: `https://github.com/${source.owner}/${source.repo}`,\n });\n }\n } catch (error) {\n console.error(`Failed to fetch skills from ${source.owner}/${source.repo}:`, error);\n }\n\n return skills;\n }\n\n /**\n * Check if a path is an absolute URL\n */\n private isAbsoluteUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n }\n\n /**\n * Convert a GitHub URL to raw content URL\n */\n private toRawUrl(url: string): string {\n return url\n .replace('://github.com/', '://raw.githubusercontent.com/')\n .replace('/blob/', '/');\n }\n\n /**\n * Parse a skill entry from JSON\n */\n private parseSkillEntry(\n item: Record<string, unknown>,\n source: SkillSource\n ): MarketplaceSkill {\n const name = String(item.name || item.title || 'Unknown');\n const path = String(item.path || item.file || item.url || '/');\n\n // Handle absolute URLs - use them directly instead of building from source\n const rawUrl = this.isAbsoluteUrl(path)\n ? this.toRawUrl(path)\n : this.buildRawUrl(source, path);\n\n return {\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description: String(item.description || item.desc || ''),\n source,\n path,\n version: item.version as string | undefined,\n author: item.author as string | undefined,\n tags: Array.isArray(item.tags) ? item.tags : [],\n agents: Array.isArray(item.agents) ? item.agents : undefined,\n stars: typeof item.stars === 'number' ? item.stars : undefined,\n updatedAt: item.updatedAt as string | undefined,\n downloads: typeof item.downloads === 'number' ? item.downloads : undefined,\n rawUrl,\n };\n }\n\n /**\n * Parse README for skill links\n */\n private parseReadmeForSkills(\n readme: string,\n source: SkillSource\n ): MarketplaceSkill[] {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n // Look for markdown links to skill files\n const linkPattern = /\\[([^\\]]+)\\]\\(([^)]+\\.md)\\)/g;\n let match;\n\n while ((match = linkPattern.exec(readme)) !== null) {\n const name = match[1];\n const path = match[2];\n\n // Skip external links and non-skill files\n if (path.startsWith('http') && !path.includes(source.repo)) {\n continue;\n }\n\n // Extract description from surrounding text\n const contextStart = Math.max(0, match.index - 200);\n const contextEnd = Math.min(readme.length, match.index + 200);\n const context = readme.slice(contextStart, contextEnd);\n\n // Try to find description in list item or paragraph\n const descMatch = context.match(/[-*]\\s*\\[.*?\\]\\(.*?\\)\\s*[-:]\\s*(.+?)(?:\\n|$)/);\n const description = descMatch ? descMatch[1].trim() : '';\n\n // Handle absolute URLs in README links\n const isAbsolute = this.isAbsoluteUrl(path);\n const normalizedPath = isAbsolute ? path : (path.startsWith('/') ? path : `/${path}`);\n const rawUrl = isAbsolute\n ? this.toRawUrl(path)\n : `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${path}`;\n\n skills.push({\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description,\n source,\n path: normalizedPath,\n tags: this.inferTags(name, description),\n rawUrl,\n });\n }\n\n return skills;\n }\n\n /**\n * Build raw URL for a skill\n */\n private buildRawUrl(source: SkillSource, path: string): string {\n const branch = source.branch || 'main';\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${cleanPath}`;\n }\n\n /**\n * Infer tags from name and description\n */\n private inferTags(name: string, description: string): string[] {\n const tags: string[] = [];\n const text = `${name} ${description}`.toLowerCase();\n\n const tagKeywords: Record<string, string[]> = {\n typescript: ['typescript', 'ts', 'tsc'],\n javascript: ['javascript', 'js', 'node'],\n react: ['react', 'jsx', 'tsx'],\n nextjs: ['next', 'nextjs', 'next.js'],\n testing: ['test', 'jest', 'vitest', 'mocha'],\n linting: ['lint', 'eslint', 'prettier'],\n auth: ['auth', 'authentication', 'login', 'oauth'],\n database: ['database', 'db', 'postgres', 'mysql', 'mongo'],\n api: ['api', 'rest', 'graphql'],\n devops: ['ci', 'cd', 'docker', 'kubernetes'],\n git: ['git', 'github', 'commit'],\n };\n\n for (const [tag, keywords] of Object.entries(tagKeywords)) {\n if (keywords.some((k) => text.includes(k))) {\n tags.push(tag);\n }\n }\n\n return tags;\n }\n\n /**\n * Refresh the marketplace index\n */\n async refresh(): Promise<MarketplaceIndex> {\n const sources = this.getSources();\n const allSkills: MarketplaceSkill[] = [];\n\n // Fetch from all sources in parallel\n const results = await Promise.all(\n sources.map((source) => this.fetchSource(source))\n );\n\n for (const skills of results) {\n allSkills.push(...skills);\n }\n\n // Create index\n const index: MarketplaceIndex = {\n version: 1,\n updatedAt: new Date().toISOString(),\n sources,\n skills: allSkills,\n totalCount: allSkills.length,\n };\n\n // Save to cache\n this.saveCache(index);\n\n return index;\n }\n\n /**\n * Get the marketplace index (from cache or refresh)\n */\n async getIndex(forceRefresh = false): Promise<MarketplaceIndex> {\n // Check in-memory cache first\n if (!forceRefresh && this.index) {\n return this.index;\n }\n\n // Check file cache\n if (!forceRefresh) {\n const cached = this.loadCache();\n if (cached) {\n return cached;\n }\n }\n\n return this.refresh();\n }\n\n /**\n * Search the marketplace\n */\n async search(options: MarketplaceSearchOptions = {}): Promise<MarketplaceSearchResult> {\n const index = await this.getIndex();\n let skills = [...index.skills];\n\n // Filter by query\n if (options.query) {\n const query = options.query.toLowerCase();\n skills = skills.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description.toLowerCase().includes(query) ||\n s.tags.some((t) => t.toLowerCase().includes(query))\n );\n }\n\n // Filter by tags\n if (options.tags && options.tags.length > 0) {\n skills = skills.filter((s) =>\n options.tags!.some((t) => s.tags.includes(t))\n );\n }\n\n // Filter by source\n if (options.source) {\n skills = skills.filter(\n (s) =>\n s.source.name === options.source ||\n `${s.source.owner}/${s.source.repo}` === options.source\n );\n }\n\n // Filter by agent\n if (options.agent) {\n skills = skills.filter(\n (s) => !s.agents || s.agents.includes(options.agent!)\n );\n }\n\n // Sort\n const sortBy = options.sortBy || 'name';\n const sortOrder = options.sortOrder || 'asc';\n\n skills.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'stars':\n comparison = (a.stars || 0) - (b.stars || 0);\n break;\n case 'downloads':\n comparison = (a.downloads || 0) - (b.downloads || 0);\n break;\n case 'updatedAt':\n comparison =\n new Date(a.updatedAt || 0).getTime() -\n new Date(b.updatedAt || 0).getTime();\n break;\n }\n\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n\n const total = skills.length;\n\n // Apply pagination\n if (options.offset) {\n skills = skills.slice(options.offset);\n }\n\n if (options.limit) {\n skills = skills.slice(0, options.limit);\n }\n\n return {\n skills,\n total,\n query: options.query,\n };\n }\n\n /**\n * Get a skill by ID\n */\n async getSkill(id: string): Promise<MarketplaceSkill | null> {\n const index = await this.getIndex();\n return index.skills.find((s) => s.id === id) || null;\n }\n\n /**\n * Get skill content\n */\n async getSkillContent(skill: MarketplaceSkill): Promise<string | null> {\n if (!skill.rawUrl) {\n return null;\n }\n\n try {\n const response = await fetch(skill.rawUrl);\n if (response.ok) {\n return response.text();\n }\n } catch {\n // Fetch failed\n }\n\n return null;\n }\n\n /**\n * Get popular tags\n */\n async getPopularTags(limit = 20): Promise<{ tag: string; count: number }[]> {\n const index = await this.getIndex();\n const tagCounts = new Map<string, number>();\n\n for (const skill of index.skills) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n\n const tags = Array.from(tagCounts.entries())\n .map(([tag, count]) => ({ tag, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n\n return tags;\n }\n\n /**\n * Add a custom source\n */\n addSource(source: SkillSource): void {\n if (!this.config.sources) {\n this.config.sources = [];\n }\n this.config.sources.push(source);\n this.clearCache();\n }\n\n /**\n * Remove a custom source\n */\n removeSource(owner: string, repo: string): void {\n if (this.config.sources) {\n this.config.sources = this.config.sources.filter(\n (s) => s.owner !== owner || s.repo !== repo\n );\n }\n this.clearCache();\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n if (existsSync(this.cachePath)) {\n unlinkSync(this.cachePath);\n }\n this.index = null;\n }\n}\n\n/**\n * Create a marketplace aggregator\n */\nexport function createMarketplaceAggregator(\n config?: MarketplaceConfig\n): MarketplaceAggregator {\n return new MarketplaceAggregator(config);\n}\n","/**\n * CI/CD Templates\n *\n * Provides templates for GitHub Actions, pre-commit hooks, and other CI/CD integrations.\n */\n\n/**\n * GitHub Action workflow for skill validation\n */\nexport const GITHUB_ACTION_TEMPLATE = `# Skill Validation Workflow\n# This workflow validates skills in your repository\n\nname: Validate Skills\n\non:\n push:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n\njobs:\n validate:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install SkillKit\n run: npm install -g skillkit\n\n - name: Validate Skills\n run: skillkit validate\n\n - name: Run Skill Tests\n run: skillkit test --json > test-results.json\n continue-on-error: true\n\n - name: Upload Test Results\n uses: actions/upload-artifact@v4\n with:\n name: skill-test-results\n path: test-results.json\n retention-days: 30\n\n - name: Check Test Results\n run: |\n if [ -f test-results.json ]; then\n passed=$(cat test-results.json | jq -r '.passed')\n if [ \"$passed\" = \"false\" ]; then\n echo \"Some skill tests failed\"\n exit 1\n fi\n fi\n`;\n\n/**\n * Pre-commit hook script for skill validation\n */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/bash\n# SkillKit Pre-commit Hook\n# Validates skills before commit\n\n# Colors for output\nRED='\\\\033[0;31m'\nGREEN='\\\\033[0;32m'\nYELLOW='\\\\033[0;33m'\nNC='\\\\033[0m' # No Color\n\necho -e \"\\${YELLOW}Running SkillKit validation...\\${NC}\"\n\n# Check if skillkit is installed\nif ! command -v skillkit &> /dev/null; then\n echo -e \"\\${RED}SkillKit not found. Install with: npm install -g skillkit\\${NC}\"\n exit 1\nfi\n\n# Get list of staged skill files\nSKILL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\\\.(md|mdc)$' | grep -E '(skills|.claude|.cursor)')\n\nif [ -z \"$SKILL_FILES\" ]; then\n echo -e \"\\${GREEN}No skill files staged, skipping validation.\\${NC}\"\n exit 0\nfi\n\necho \"Validating skill files:\"\necho \"$SKILL_FILES\"\n\n# Run validation\nif ! skillkit validate; then\n echo -e \"\\${RED}Skill validation failed. Please fix the errors and try again.\\${NC}\"\n exit 1\nfi\n\n# Run tests if any\nif skillkit test --json 2>/dev/null | jq -e '.passed == false' > /dev/null 2>&1; then\n echo -e \"\\${RED}Skill tests failed. Please fix the failing tests.\\${NC}\"\n exit 1\nfi\n\necho -e \"\\${GREEN}All skills validated successfully!\\${NC}\"\nexit 0\n`;\n\n/**\n * Pre-commit config for .pre-commit-config.yaml\n */\nexport const PRE_COMMIT_CONFIG_TEMPLATE = `# SkillKit Pre-commit Configuration\n# Add this to your .pre-commit-config.yaml\n\nrepos:\n - repo: local\n hooks:\n - id: skillkit-validate\n name: SkillKit Validate\n entry: skillkit validate\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n\n - id: skillkit-test\n name: SkillKit Test\n entry: skillkit test\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n`;\n\n/**\n * GitLab CI template\n */\nexport const GITLAB_CI_TEMPLATE = `# SkillKit GitLab CI Configuration\n# Add this to your .gitlab-ci.yml\n\nskill-validation:\n image: node:20\n stage: test\n before_script:\n - npm install -g skillkit\n script:\n - skillkit validate\n - skillkit test --json > test-results.json\n artifacts:\n # Note: test-results.json is JSON format, not JUnit XML\n paths:\n - test-results.json\n expire_in: 30 days\n rules:\n - changes:\n - \".claude/skills/**\"\n - \".cursor/skills/**\"\n - \"skills/**\"\n`;\n\n/**\n * CircleCI config template\n */\nexport const CIRCLECI_CONFIG_TEMPLATE = `# SkillKit CircleCI Configuration\n# Add this to your .circleci/config.yml\n\nversion: 2.1\n\njobs:\n validate-skills:\n docker:\n - image: cimg/node:20.0\n steps:\n - checkout\n - run:\n name: Install SkillKit\n command: npm install -g skillkit\n - run:\n name: Validate Skills\n command: skillkit validate\n - run:\n name: Run Skill Tests\n command: skillkit test --json > test-results.json\n - store_artifacts:\n path: test-results.json\n destination: skill-tests\n\nworkflows:\n skill-validation:\n jobs:\n - validate-skills:\n filters:\n branches:\n only: /.*/\n`;\n\n/**\n * Get a CI/CD template by name\n */\nexport function getCICDTemplate(name: string): string | null {\n switch (name.toLowerCase()) {\n case 'github':\n case 'github-action':\n case 'github-actions':\n return GITHUB_ACTION_TEMPLATE;\n case 'pre-commit':\n case 'pre-commit-hook':\n return PRE_COMMIT_HOOK_TEMPLATE;\n case 'pre-commit-config':\n return PRE_COMMIT_CONFIG_TEMPLATE;\n case 'gitlab':\n case 'gitlab-ci':\n return GITLAB_CI_TEMPLATE;\n case 'circleci':\n case 'circle-ci':\n return CIRCLECI_CONFIG_TEMPLATE;\n default:\n return null;\n }\n}\n\n/**\n * List available CI/CD templates\n */\nexport function listCICDTemplates(): { name: string; description: string }[] {\n return [\n { name: 'github-action', description: 'GitHub Actions workflow for skill validation' },\n { name: 'pre-commit-hook', description: 'Git pre-commit hook script' },\n { name: 'pre-commit-config', description: 'pre-commit framework configuration' },\n { name: 'gitlab-ci', description: 'GitLab CI configuration' },\n { name: 'circleci', description: 'CircleCI configuration' },\n ];\n}\n","import type { AgentType } from '../types.js';\n\nexport type ObservationType =\n | 'tool_use'\n | 'decision'\n | 'error'\n | 'solution'\n | 'pattern'\n | 'file_change'\n | 'checkpoint';\n\nexport interface ObservationContent {\n action: string;\n context: string;\n result?: string;\n files?: string[];\n tags?: string[];\n error?: string;\n solution?: string;\n}\n\nexport interface Observation {\n id: string;\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n type: ObservationType;\n content: ObservationContent;\n relevance: number;\n}\n\nexport interface Learning {\n id: string;\n createdAt: string;\n updatedAt: string;\n source: 'session' | 'manual' | 'imported';\n sourceObservations?: string[];\n\n title: string;\n content: string;\n\n scope: 'project' | 'global';\n project?: string;\n\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n\n useCount: number;\n lastUsed?: string;\n effectiveness?: number;\n}\n\nexport interface MemoryIndex {\n version: 1;\n lastUpdated: string;\n entries: Record<string, string[]>;\n tags: Record<string, string[]>;\n}\n\nexport interface MemorySummary {\n id: string;\n title: string;\n tags: string[];\n relevance: number;\n}\n\nexport interface MemoryPreview extends MemorySummary {\n excerpt: string;\n lastUsed?: string;\n}\n\nexport interface MemoryFull extends MemoryPreview {\n content: string;\n sourceObservations?: Observation[];\n}\n\nexport interface ObservationStoreData {\n version: 1;\n sessionId: string;\n observations: Observation[];\n}\n\nexport interface LearningStoreData {\n version: 1;\n learnings: Learning[];\n}\n\nexport interface MemoryConfig {\n autoCompress: boolean;\n compressionThreshold: number;\n compressionModel?: string;\n maxObservations: number;\n maxLearnings: number;\n}\n\nexport const DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n autoCompress: true,\n compressionThreshold: 50,\n maxObservations: 1000,\n maxLearnings: 500,\n};\n\nexport interface MemorySearchOptions {\n query?: string;\n tags?: string[];\n scope?: 'project' | 'global' | 'all';\n limit?: number;\n minRelevance?: number;\n}\n\nexport interface MemorySearchResult {\n learning: Learning;\n score: number;\n matchedKeywords: string[];\n matchedTags: string[];\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type {\n Observation,\n ObservationContent,\n ObservationStoreData,\n ObservationType,\n} from './types.js';\nimport type { AgentType } from '../types.js';\n\nexport class ObservationStore {\n private readonly filePath: string;\n private data: ObservationStoreData | null = null;\n private sessionId: string;\n\n constructor(projectPath: string, sessionId?: string) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'observations.yaml');\n this.sessionId = sessionId || randomUUID();\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): ObservationStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as ObservationStoreData;\n if (this.data.sessionId !== this.sessionId) {\n this.data.sessionId = this.sessionId;\n this.data.observations = [];\n }\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): ObservationStoreData {\n return {\n version: 1,\n sessionId: this.sessionId,\n observations: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(\n type: ObservationType,\n content: ObservationContent,\n agent: AgentType,\n relevance = 50\n ): Observation {\n const data = this.load();\n\n const observation: Observation = {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n agent,\n type,\n content,\n relevance,\n };\n\n data.observations.push(observation);\n this.save();\n\n return observation;\n }\n\n getAll(): Observation[] {\n return this.load().observations;\n }\n\n getByType(type: ObservationType): Observation[] {\n return this.load().observations.filter((o) => o.type === type);\n }\n\n getByRelevance(minRelevance: number): Observation[] {\n return this.load().observations.filter((o) => o.relevance >= minRelevance);\n }\n\n getRecent(count: number): Observation[] {\n const observations = this.load().observations;\n return observations.slice(-count);\n }\n\n getUncompressed(compressedIds: string[]): Observation[] {\n const compressedSet = new Set(compressedIds);\n return this.load().observations.filter((o) => !compressedSet.has(o.id));\n }\n\n count(): number {\n return this.load().observations.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n getById(id: string): Observation | undefined {\n return this.load().observations.find((o) => o.id === id);\n }\n\n getByIds(ids: string[]): Observation[] {\n const idSet = new Set(ids);\n return this.load().observations.filter((o) => idSet.has(o.id));\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n if (this.data) {\n this.data.sessionId = sessionId;\n }\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.observations.findIndex((o) => o.id === id);\n\n if (index === -1) return false;\n\n data.observations.splice(index, 1);\n this.save();\n return true;\n }\n\n deleteMany(ids: string[]): number {\n const idSet = new Set(ids);\n const data = this.load();\n const initialLength = data.observations.length;\n\n data.observations = data.observations.filter((o) => !idSet.has(o.id));\n\n if (data.observations.length !== initialLength) {\n this.save();\n }\n\n return initialLength - data.observations.length;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type { Learning, LearningStoreData } from './types.js';\n\nexport class LearningStore {\n private readonly filePath: string;\n private readonly scope: 'project' | 'global';\n private readonly projectName?: string;\n private data: LearningStoreData | null = null;\n\n constructor(\n scope: 'project' | 'global',\n projectPath?: string,\n projectName?: string\n ) {\n this.scope = scope;\n this.projectName = projectName;\n\n if (scope === 'project' && projectPath) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'learnings.yaml');\n } else {\n this.filePath = join(homedir(), '.skillkit', 'memory', 'global.yaml');\n }\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): LearningStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as LearningStoreData;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): LearningStoreData {\n return {\n version: 1,\n learnings: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(learning: Omit<Learning, 'id' | 'createdAt' | 'updatedAt' | 'useCount' | 'scope' | 'project'>): Learning {\n const data = this.load();\n const now = new Date().toISOString();\n\n const newLearning: Learning = {\n ...learning,\n id: randomUUID(),\n createdAt: now,\n updatedAt: now,\n useCount: 0,\n scope: this.scope,\n project: this.projectName,\n };\n\n data.learnings.push(newLearning);\n this.save();\n\n return newLearning;\n }\n\n update(id: string, updates: Partial<Omit<Learning, 'id' | 'createdAt'>>): Learning | null {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return null;\n\n data.learnings[index] = {\n ...data.learnings[index],\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.save();\n return data.learnings[index];\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return false;\n\n data.learnings.splice(index, 1);\n this.save();\n return true;\n }\n\n getAll(): Learning[] {\n return this.load().learnings;\n }\n\n getById(id: string): Learning | undefined {\n return this.load().learnings.find((l) => l.id === id);\n }\n\n getByTags(tags: string[]): Learning[] {\n const tagSet = new Set(tags.map((t) => t.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.tags.some((t) => tagSet.has(t.toLowerCase()))\n );\n }\n\n getByFrameworks(frameworks: string[]): Learning[] {\n const fwSet = new Set(frameworks.map((f) => f.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.frameworks?.some((f) => fwSet.has(f.toLowerCase()))\n );\n }\n\n getRecent(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings]\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, count);\n }\n\n getMostUsed(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings].sort((a, b) => b.useCount - a.useCount).slice(0, count);\n }\n\n getMostEffective(count: number): Learning[] {\n const learnings = this.load().learnings.filter((l) => l.effectiveness !== undefined);\n return [...learnings]\n .sort((a, b) => (b.effectiveness || 0) - (a.effectiveness || 0))\n .slice(0, count);\n }\n\n incrementUseCount(id: string): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.useCount += 1;\n learning.lastUsed = new Date().toISOString();\n this.save();\n }\n }\n\n setEffectiveness(id: string, effectiveness: number): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.effectiveness = Math.max(0, Math.min(100, effectiveness));\n learning.updatedAt = new Date().toISOString();\n this.save();\n }\n }\n\n search(query: string): Learning[] {\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter((w) => w.length > 2);\n\n return this.load().learnings.filter((l) => {\n const titleMatch = l.title.toLowerCase().includes(queryLower);\n const contentMatch = l.content.toLowerCase().includes(queryLower);\n const tagMatch = l.tags.some((t) => t.toLowerCase().includes(queryLower));\n const wordMatch = queryWords.some(\n (word) =>\n l.title.toLowerCase().includes(word) ||\n l.content.toLowerCase().includes(word)\n );\n\n return titleMatch || contentMatch || tagMatch || wordMatch;\n });\n }\n\n count(): number {\n return this.load().learnings.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getScope(): 'project' | 'global' {\n return this.scope;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { Learning, MemoryIndex } from './types.js';\n\nexport class MemoryIndexStore {\n private readonly filePath: string;\n private data: MemoryIndex | null = null;\n\n constructor(basePath: string, _isGlobal = false) {\n // Both global and project use .skillkit subdirectory\n // Global: ~/.skillkit/memory/index.yaml (basePath = homedir())\n // Project: <projectPath>/.skillkit/memory/index.yaml (basePath = projectPath)\n // Note: _isGlobal kept for API compatibility but basePath determines the actual path\n this.filePath = join(basePath, '.skillkit', 'memory', 'index.yaml');\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): MemoryIndex {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as MemoryIndex;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): MemoryIndex {\n return {\n version: 1,\n lastUpdated: new Date().toISOString(),\n entries: {},\n tags: {},\n };\n }\n\n private save(): void {\n this.ensureDir();\n if (this.data) {\n this.data.lastUpdated = new Date().toISOString();\n }\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n private extractKeywords(text: string): string[] {\n // Extract meaningful keywords from text\n const stopWords = new Set([\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'i', 'you', 'we', 'they', 'he', 'she',\n ]);\n\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n\n return [...new Set(words)];\n }\n\n indexLearning(learning: Learning): void {\n const data = this.load();\n\n // Extract keywords from title and content\n const titleKeywords = this.extractKeywords(learning.title);\n const contentKeywords = this.extractKeywords(learning.content);\n const allKeywords = [...new Set([...titleKeywords, ...contentKeywords])];\n\n // Index by keywords\n for (const keyword of allKeywords) {\n if (!data.entries[keyword]) {\n data.entries[keyword] = [];\n }\n if (!data.entries[keyword].includes(learning.id)) {\n data.entries[keyword].push(learning.id);\n }\n }\n\n // Index by tags\n for (const tag of learning.tags) {\n const normalizedTag = tag.toLowerCase();\n if (!data.tags[normalizedTag]) {\n data.tags[normalizedTag] = [];\n }\n if (!data.tags[normalizedTag].includes(learning.id)) {\n data.tags[normalizedTag].push(learning.id);\n }\n }\n\n // Index by frameworks if present\n if (learning.frameworks) {\n for (const framework of learning.frameworks) {\n const normalizedFw = framework.toLowerCase();\n if (!data.tags[normalizedFw]) {\n data.tags[normalizedFw] = [];\n }\n if (!data.tags[normalizedFw].includes(learning.id)) {\n data.tags[normalizedFw].push(learning.id);\n }\n }\n }\n\n this.save();\n }\n\n removeLearning(learningId: string): void {\n const data = this.load();\n\n // Remove from keyword entries\n for (const keyword of Object.keys(data.entries)) {\n data.entries[keyword] = data.entries[keyword].filter((id) => id !== learningId);\n if (data.entries[keyword].length === 0) {\n delete data.entries[keyword];\n }\n }\n\n // Remove from tags\n for (const tag of Object.keys(data.tags)) {\n data.tags[tag] = data.tags[tag].filter((id) => id !== learningId);\n if (data.tags[tag].length === 0) {\n delete data.tags[tag];\n }\n }\n\n this.save();\n }\n\n searchByKeywords(query: string): string[] {\n const data = this.load();\n const keywords = this.extractKeywords(query);\n\n if (keywords.length === 0) return [];\n\n // Find IDs that match any keyword\n const matchCounts = new Map<string, number>();\n\n for (const keyword of keywords) {\n // Exact match\n if (data.entries[keyword]) {\n for (const id of data.entries[keyword]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 2);\n }\n }\n\n // Partial match (keyword is substring of indexed word, but not exact match)\n for (const [indexed, ids] of Object.entries(data.entries)) {\n // Skip exact matches - they're already counted above with higher weight\n if (indexed === keyword) continue;\n if (indexed.includes(keyword) || keyword.includes(indexed)) {\n for (const id of ids) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n }\n\n // Sort by match count (most matches first)\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n searchByTags(tags: string[]): string[] {\n const data = this.load();\n const normalizedTags = tags.map((t) => t.toLowerCase());\n\n const matchCounts = new Map<string, number>();\n\n for (const tag of normalizedTags) {\n if (data.tags[tag]) {\n for (const id of data.tags[tag]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n\n // Sort by match count\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n search(query: string, tags?: string[]): string[] {\n const keywordResults = this.searchByKeywords(query);\n const tagResults = tags ? this.searchByTags(tags) : [];\n\n if (!tags || tags.length === 0) {\n return keywordResults;\n }\n\n if (!query || query.trim().length === 0) {\n return tagResults;\n }\n\n // Combine results, prioritizing items that match both\n const keywordSet = new Set(keywordResults);\n const tagSet = new Set(tagResults);\n\n const both: string[] = [];\n const keywordOnly: string[] = [];\n const tagOnly: string[] = [];\n\n for (const id of keywordResults) {\n if (tagSet.has(id)) {\n both.push(id);\n } else {\n keywordOnly.push(id);\n }\n }\n\n for (const id of tagResults) {\n if (!keywordSet.has(id)) {\n tagOnly.push(id);\n }\n }\n\n return [...both, ...keywordOnly, ...tagOnly];\n }\n\n getAllTags(): string[] {\n const data = this.load();\n return Object.keys(data.tags).sort();\n }\n\n getTagCounts(): Record<string, number> {\n const data = this.load();\n const counts: Record<string, number> = {};\n for (const [tag, ids] of Object.entries(data.tags)) {\n counts[tag] = ids.length;\n }\n return counts;\n }\n\n rebuildIndex(learnings: Learning[]): void {\n // Clear existing index\n this.data = this.createEmpty();\n\n // Re-index all learnings\n for (const learning of learnings) {\n this.indexLearning(learning);\n }\n\n this.save();\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getStats(): { keywords: number; tags: number; lastUpdated: string } {\n const data = this.load();\n return {\n keywords: Object.keys(data.entries).length,\n tags: Object.keys(data.tags).length,\n lastUpdated: data.lastUpdated,\n };\n }\n}\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MemoryPaths {\n projectMemoryDir: string;\n globalMemoryDir: string;\n observationsFile: string;\n learningsFile: string;\n indexFile: string;\n globalLearningsFile: string;\n globalIndexFile: string;\n}\n\nexport function getMemoryPaths(projectPath: string): MemoryPaths {\n const projectMemoryDir = join(projectPath, '.skillkit', 'memory');\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n\n return {\n projectMemoryDir,\n globalMemoryDir,\n observationsFile: join(projectMemoryDir, 'observations.yaml'),\n learningsFile: join(projectMemoryDir, 'learnings.yaml'),\n indexFile: join(projectMemoryDir, 'index.yaml'),\n globalLearningsFile: join(globalMemoryDir, 'global.yaml'),\n globalIndexFile: join(globalMemoryDir, 'index.yaml'),\n };\n}\n\nexport function initializeMemoryDirectory(projectPath: string): MemoryPaths {\n const paths = getMemoryPaths(projectPath);\n\n // Create project memory directory\n if (!existsSync(paths.projectMemoryDir)) {\n mkdirSync(paths.projectMemoryDir, { recursive: true });\n }\n\n // Create global memory directory\n if (!existsSync(paths.globalMemoryDir)) {\n mkdirSync(paths.globalMemoryDir, { recursive: true });\n }\n\n return paths;\n}\n\nexport function memoryDirectoryExists(projectPath: string): boolean {\n const paths = getMemoryPaths(projectPath);\n return existsSync(paths.projectMemoryDir);\n}\n\nexport function globalMemoryDirectoryExists(): boolean {\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n return existsSync(globalMemoryDir);\n}\n\nexport interface MemoryStatus {\n projectMemoryExists: boolean;\n globalMemoryExists: boolean;\n hasObservations: boolean;\n hasLearnings: boolean;\n hasGlobalLearnings: boolean;\n hasIndex: boolean;\n hasGlobalIndex: boolean;\n}\n\nexport function getMemoryStatus(projectPath: string): MemoryStatus {\n const paths = getMemoryPaths(projectPath);\n\n return {\n projectMemoryExists: existsSync(paths.projectMemoryDir),\n globalMemoryExists: existsSync(paths.globalMemoryDir),\n hasObservations: existsSync(paths.observationsFile),\n hasLearnings: existsSync(paths.learningsFile),\n hasGlobalLearnings: existsSync(paths.globalLearningsFile),\n hasIndex: existsSync(paths.indexFile),\n hasGlobalIndex: existsSync(paths.globalIndexFile),\n };\n}\n","/**\n * Memory Observer\n *\n * Captures observations during skill execution and stores them in the ObservationStore.\n * Provides intelligent filtering to capture only significant events.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ExecutionProgressEvent } from '../executor/engine.js';\nimport type { ObservationType, ObservationContent, Observation } from './types.js';\nimport { ObservationStore } from './observation-store.js';\n\n/**\n * Event types that can be observed\n */\nexport type ObservableEventType =\n | 'task_start'\n | 'task_complete'\n | 'task_failed'\n | 'checkpoint_reached'\n | 'checkpoint_decision'\n | 'verification_passed'\n | 'verification_failed'\n | 'file_modified'\n | 'error_encountered'\n | 'solution_applied'\n | 'execution_start'\n | 'execution_complete'\n | 'execution_paused';\n\n/**\n * Observable event structure\n */\nexport interface ObservableEvent {\n type: ObservableEventType;\n timestamp: string;\n skillName?: string;\n taskId?: string;\n taskName?: string;\n taskAction?: string;\n files?: string[];\n error?: string;\n output?: string;\n decision?: string;\n context?: string;\n}\n\n/**\n * Observer configuration\n */\nexport interface MemoryObserverConfig {\n /** Minimum relevance score to store (0-100) */\n minRelevance?: number;\n /** Whether to capture task starts */\n captureTaskStarts?: boolean;\n /** Whether to capture checkpoints */\n captureCheckpoints?: boolean;\n /** Whether to capture file modifications */\n captureFileModifications?: boolean;\n /** Whether to capture errors */\n captureErrors?: boolean;\n /** Whether to capture solutions */\n captureSolutions?: boolean;\n /** Custom relevance scorer */\n relevanceScorer?: (event: ObservableEvent) => number;\n}\n\nconst DEFAULT_CONFIG: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> = {\n minRelevance: 30,\n captureTaskStarts: false, // Task starts are usually low-value\n captureCheckpoints: true,\n captureFileModifications: true,\n captureErrors: true,\n captureSolutions: true,\n};\n\n/**\n * Memory Observer\n *\n * Captures and filters observations during skill execution.\n */\nexport class MemoryObserver {\n private store: ObservationStore;\n private config: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> & {\n relevanceScorer?: (event: ObservableEvent) => number;\n };\n private currentAgent: AgentType = 'claude-code';\n private currentSkillName?: string;\n private pendingErrors: Map<string, ObservableEvent> = new Map();\n\n constructor(projectPath: string, sessionId?: string, config?: MemoryObserverConfig) {\n this.store = new ObservationStore(projectPath, sessionId);\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Set the current agent being used\n */\n setAgent(agent: AgentType): void {\n this.currentAgent = agent;\n }\n\n /**\n * Set the current skill being executed\n */\n setSkillName(skillName: string): void {\n this.currentSkillName = skillName;\n }\n\n /**\n * Get the underlying observation store\n */\n getStore(): ObservationStore {\n return this.store;\n }\n\n /**\n * Observe an event and potentially store it\n */\n observe(event: ObservableEvent): Observation | null {\n // Check if we should capture this event type\n if (!this.shouldCapture(event)) {\n return null;\n }\n\n // Classify the event into an observation type\n const observationType = this.classifyEvent(event);\n\n // Extract content from the event\n const content = this.extractContent(event);\n\n // Score relevance\n const relevance = this.scoreRelevance(event);\n\n // Check minimum relevance threshold\n if (relevance < this.config.minRelevance) {\n return null;\n }\n\n // Store the observation\n return this.store.add(observationType, content, this.currentAgent, relevance);\n }\n\n /**\n * Create an observation callback for the SkillExecutionEngine\n */\n createProgressCallback(): (event: ExecutionProgressEvent) => void {\n return (progressEvent: ExecutionProgressEvent) => {\n const observableEvent = this.convertProgressEvent(progressEvent);\n if (observableEvent) {\n this.observe(observableEvent);\n }\n };\n }\n\n /**\n * Convert ExecutionProgressEvent to ObservableEvent\n */\n private convertProgressEvent(event: ExecutionProgressEvent): ObservableEvent | null {\n const baseEvent = {\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId: event.taskId,\n taskName: event.taskName,\n };\n\n switch (event.type) {\n case 'task_start':\n return {\n ...baseEvent,\n type: 'task_start',\n context: `Starting task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'task_complete':\n if (event.status === 'failed') {\n return {\n ...baseEvent,\n type: 'task_failed',\n error: event.error,\n context: event.message,\n };\n }\n return {\n ...baseEvent,\n type: 'task_complete',\n output: event.message,\n context: `Completed task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'checkpoint':\n return {\n ...baseEvent,\n type: 'checkpoint_reached',\n context: event.message,\n };\n\n case 'verification':\n const passed = event.message?.includes('passed');\n return {\n ...baseEvent,\n type: passed ? 'verification_passed' : 'verification_failed',\n context: event.message,\n error: passed ? undefined : event.message,\n };\n\n case 'complete':\n return {\n ...baseEvent,\n type: 'execution_complete',\n context: event.message,\n error: event.status === 'failed' ? event.message : undefined,\n };\n\n default:\n return null;\n }\n }\n\n /**\n * Record a file modification event\n */\n recordFileModification(files: string[], context: string): Observation | null {\n return this.observe({\n type: 'file_modified',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n files,\n context,\n });\n }\n\n /**\n * Record an error event\n */\n recordError(error: string, context: string, taskId?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'error_encountered',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId,\n error,\n context,\n };\n\n // Store pending error for potential solution matching\n const errorKey = this.generateErrorKey(error);\n this.pendingErrors.set(errorKey, event);\n\n return this.observe(event);\n }\n\n /**\n * Record a solution event (potentially matching a previous error)\n */\n recordSolution(solution: string, context: string, relatedError?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'solution_applied',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n output: solution,\n context,\n error: relatedError,\n };\n\n // If we can match this to a pending error, increase relevance\n if (relatedError) {\n const errorKey = this.generateErrorKey(relatedError);\n this.pendingErrors.delete(errorKey);\n }\n\n return this.observe(event);\n }\n\n /**\n * Record a decision event\n */\n recordDecision(decision: string, options: string[], context: string): Observation | null {\n return this.observe({\n type: 'checkpoint_decision',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n decision,\n context: `Decision: ${decision} (options: ${options.join(', ')}). Context: ${context}`,\n });\n }\n\n /**\n * Record execution start\n */\n recordExecutionStart(skillName: string, agent: AgentType): Observation | null {\n this.currentSkillName = skillName;\n this.currentAgent = agent;\n\n return this.observe({\n type: 'execution_start',\n timestamp: new Date().toISOString(),\n skillName,\n context: `Started execution of skill \"${skillName}\" with agent \"${agent}\"`,\n });\n }\n\n /**\n * Record execution pause\n */\n recordExecutionPause(reason?: string): Observation | null {\n return this.observe({\n type: 'execution_paused',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n context: reason || 'Execution paused',\n });\n }\n\n /**\n * Check if we should capture this event type\n */\n private shouldCapture(event: ObservableEvent): boolean {\n switch (event.type) {\n case 'task_start':\n return this.config.captureTaskStarts;\n case 'checkpoint_reached':\n case 'checkpoint_decision':\n return this.config.captureCheckpoints;\n case 'file_modified':\n return this.config.captureFileModifications;\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return this.config.captureErrors;\n case 'solution_applied':\n return this.config.captureSolutions;\n default:\n return true;\n }\n }\n\n /**\n * Classify event into observation type\n */\n private classifyEvent(event: ObservableEvent): ObservationType {\n switch (event.type) {\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return 'error';\n\n case 'solution_applied':\n return 'solution';\n\n case 'checkpoint_decision':\n return 'decision';\n\n case 'file_modified':\n return 'file_change';\n\n case 'execution_paused':\n case 'checkpoint_reached':\n return 'checkpoint';\n\n case 'task_start':\n case 'task_complete':\n case 'verification_passed':\n case 'execution_start':\n case 'execution_complete':\n default:\n return 'tool_use';\n }\n }\n\n /**\n * Extract content from event\n */\n private extractContent(event: ObservableEvent): ObservationContent {\n const content: ObservationContent = {\n action: this.getActionDescription(event),\n context: event.context || this.generateContext(event),\n };\n\n if (event.output) {\n content.result = event.output;\n }\n\n if (event.files && event.files.length > 0) {\n content.files = event.files;\n }\n\n if (event.error) {\n content.error = event.error;\n }\n\n if (event.type === 'solution_applied' && event.output) {\n content.solution = event.output;\n }\n\n // Generate tags based on event\n content.tags = this.generateTags(event);\n\n return content;\n }\n\n /**\n * Get action description from event\n */\n private getActionDescription(event: ObservableEvent): string {\n switch (event.type) {\n case 'task_start':\n return `Started task: ${event.taskName || 'unknown'}`;\n case 'task_complete':\n return `Completed task: ${event.taskName || 'unknown'}`;\n case 'task_failed':\n return `Task failed: ${event.taskName || 'unknown'}`;\n case 'checkpoint_reached':\n return `Checkpoint: ${event.taskName || 'unknown'}`;\n case 'checkpoint_decision':\n return `Decision made: ${event.decision || 'unknown'}`;\n case 'verification_passed':\n return `Verification passed: ${event.taskName || 'unknown'}`;\n case 'verification_failed':\n return `Verification failed: ${event.taskName || 'unknown'}`;\n case 'file_modified':\n return `Modified files: ${event.files?.join(', ') || 'unknown'}`;\n case 'error_encountered':\n return `Error: ${event.error?.slice(0, 100) || 'unknown'}`;\n case 'solution_applied':\n return `Solution applied: ${event.output?.slice(0, 100) || 'unknown'}`;\n case 'execution_start':\n return `Started skill: ${event.skillName || 'unknown'}`;\n case 'execution_complete':\n return `Completed skill: ${event.skillName || 'unknown'}`;\n case 'execution_paused':\n return `Paused skill: ${event.skillName || 'unknown'}`;\n default:\n return 'Unknown action';\n }\n }\n\n /**\n * Generate context if not provided\n */\n private generateContext(event: ObservableEvent): string {\n const parts: string[] = [];\n\n if (event.skillName) {\n parts.push(`Skill: ${event.skillName}`);\n }\n\n if (event.taskName) {\n parts.push(`Task: ${event.taskName}`);\n }\n\n if (event.taskAction) {\n parts.push(`Action: ${event.taskAction}`);\n }\n\n return parts.join(' | ') || 'No context available';\n }\n\n /**\n * Generate tags for event\n */\n private generateTags(event: ObservableEvent): string[] {\n const tags: string[] = [];\n\n // Add event type as tag\n tags.push(event.type.replace(/_/g, '-'));\n\n // Add skill name if present\n if (event.skillName) {\n tags.push(event.skillName.toLowerCase().replace(/[^a-z0-9-]/g, '-'));\n }\n\n // Add error-related tags\n if (event.error) {\n if (event.error.toLowerCase().includes('type')) tags.push('typescript');\n if (event.error.toLowerCase().includes('import')) tags.push('imports');\n if (event.error.toLowerCase().includes('null') || event.error.toLowerCase().includes('undefined'))\n tags.push('null-check');\n if (event.error.toLowerCase().includes('async') || event.error.toLowerCase().includes('await'))\n tags.push('async');\n }\n\n // Add file-related tags\n if (event.files) {\n for (const file of event.files) {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) tags.push('typescript');\n if (file.endsWith('.js') || file.endsWith('.jsx')) tags.push('javascript');\n if (file.endsWith('.css') || file.endsWith('.scss')) tags.push('styles');\n if (file.includes('test') || file.includes('spec')) tags.push('testing');\n if (file.includes('component')) tags.push('components');\n }\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score relevance of event\n */\n private scoreRelevance(event: ObservableEvent): number {\n // Use custom scorer if provided\n if (this.config.relevanceScorer) {\n return this.config.relevanceScorer(event);\n }\n\n // Default relevance scoring\n let score = 50; // Base score\n\n switch (event.type) {\n // High relevance events\n case 'error_encountered':\n case 'task_failed':\n score = 85;\n break;\n\n case 'solution_applied':\n score = 90;\n // Bonus if it matches a pending error\n if (event.error) {\n const errorKey = this.generateErrorKey(event.error);\n if (this.pendingErrors.has(errorKey)) {\n score = 95;\n }\n }\n break;\n\n case 'checkpoint_decision':\n score = 75;\n break;\n\n case 'verification_failed':\n score = 80;\n break;\n\n // Medium relevance events\n case 'file_modified':\n score = 60;\n // More files = higher relevance\n if (event.files && event.files.length > 3) {\n score = 70;\n }\n break;\n\n case 'checkpoint_reached':\n score = 55;\n break;\n\n case 'task_complete':\n case 'verification_passed':\n score = 50;\n break;\n\n // Lower relevance events\n case 'task_start':\n score = 30;\n break;\n\n case 'execution_start':\n case 'execution_complete':\n score = 40;\n break;\n\n case 'execution_paused':\n score = 60;\n break;\n\n default:\n score = 50;\n }\n\n // Adjust based on content richness\n if (event.context && event.context.length > 100) {\n score += 5;\n }\n\n if (event.files && event.files.length > 0) {\n score += 5;\n }\n\n // Cap at 100\n return Math.min(score, 100);\n }\n\n /**\n * Generate a key for matching errors to solutions\n */\n private generateErrorKey(error: string): string {\n // Normalize error string for matching\n return error\n .toLowerCase()\n .replace(/[0-9]+/g, 'N') // Replace numbers\n .replace(/['\"`]/g, '') // Remove quotes\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .slice(0, 100); // Limit length\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string {\n return this.store.getSessionId();\n }\n\n /**\n * Get all observations\n */\n getObservations(): Observation[] {\n return this.store.getAll();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.store.count();\n }\n\n /**\n * Clear all observations\n */\n clear(): void {\n this.store.clear();\n this.pendingErrors.clear();\n }\n}\n\n/**\n * Create a MemoryObserver instance\n */\nexport function createMemoryObserver(\n projectPath: string,\n sessionId?: string,\n config?: MemoryObserverConfig\n): MemoryObserver {\n return new MemoryObserver(projectPath, sessionId, config);\n}\n","/**\n * Memory-Enabled Execution Engine Integration\n *\n * Provides utilities to integrate MemoryObserver with SkillExecutionEngine.\n */\n\nimport type { AgentType } from '../types.js';\nimport {\n SkillExecutionEngine,\n createExecutionEngine,\n type ExecutionProgressCallback,\n type ExecutionProgressEvent,\n} from '../executor/engine.js';\nimport type { CheckpointHandler, ExecutionOptions, ExecutableSkill } from '../executor/types.js';\nimport { MemoryObserver, type MemoryObserverConfig } from './observer.js';\n\n/**\n * Options for creating a memory-enabled execution engine\n */\nexport interface MemoryEnabledEngineOptions {\n /** Checkpoint handler for interactive checkpoints */\n checkpointHandler?: CheckpointHandler;\n /** Additional progress callback (called alongside memory observer) */\n onProgress?: ExecutionProgressCallback;\n /** Memory observer configuration */\n memoryConfig?: MemoryObserverConfig;\n /** Session ID for the memory observer */\n sessionId?: string;\n /** Default agent type */\n defaultAgent?: AgentType;\n}\n\n/**\n * Memory-enabled execution engine wrapper\n */\nexport class MemoryEnabledEngine {\n private engine: SkillExecutionEngine;\n private observer: MemoryObserver;\n private userProgressCallback?: ExecutionProgressCallback;\n\n constructor(projectPath: string, options: MemoryEnabledEngineOptions = {}) {\n // Create memory observer\n this.observer = new MemoryObserver(projectPath, options.sessionId, options.memoryConfig);\n\n // Set default agent if provided\n if (options.defaultAgent) {\n this.observer.setAgent(options.defaultAgent);\n }\n\n // Store user's progress callback\n this.userProgressCallback = options.onProgress;\n\n // Create the combined progress callback\n const combinedProgressCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n // Forward to memory observer\n const observerCallback = this.observer.createProgressCallback();\n observerCallback(event);\n\n // Forward to user's callback if provided\n if (this.userProgressCallback) {\n this.userProgressCallback(event);\n }\n };\n\n // Create the underlying engine with the combined callback\n this.engine = createExecutionEngine(projectPath, {\n checkpointHandler: options.checkpointHandler,\n onProgress: combinedProgressCallback,\n });\n }\n\n /**\n * Execute a skill with memory observation\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): ReturnType<SkillExecutionEngine['execute']> {\n // Set skill name in observer\n this.observer.setSkillName(skill.name);\n\n // Set agent if provided in options\n if (options.agent) {\n this.observer.setAgent(options.agent);\n }\n\n // Record execution start\n this.observer.recordExecutionStart(skill.name, options.agent || 'claude-code');\n\n try {\n // Execute the skill\n const result = await this.engine.execute(skill, options);\n\n // Record file modifications from result\n if (result.filesModified.length > 0) {\n this.observer.recordFileModification(\n result.filesModified,\n `Files modified during skill \"${skill.name}\" execution`\n );\n }\n\n // Record any errors\n if (result.error) {\n this.observer.recordError(result.error, `Skill \"${skill.name}\" failed`);\n }\n\n return result;\n } catch (error) {\n // Record unexpected errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.observer.recordError(errorMessage, `Unexpected error during skill \"${skill.name}\" execution`);\n throw error;\n }\n }\n\n /**\n * Record a manual error observation\n */\n recordError(error: string, context: string, taskId?: string): void {\n this.observer.recordError(error, context, taskId);\n }\n\n /**\n * Record a manual solution observation\n */\n recordSolution(solution: string, context: string, relatedError?: string): void {\n this.observer.recordSolution(solution, context, relatedError);\n }\n\n /**\n * Record a file modification observation\n */\n recordFileModification(files: string[], context: string): void {\n this.observer.recordFileModification(files, context);\n }\n\n /**\n * Record a decision observation\n */\n recordDecision(decision: string, options: string[], context: string): void {\n this.observer.recordDecision(decision, options, context);\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n const paused = this.engine.pause();\n if (paused) {\n this.observer.recordExecutionPause();\n }\n return paused;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.engine.isPaused();\n }\n\n /**\n * Get the memory observer\n */\n getObserver(): MemoryObserver {\n return this.observer;\n }\n\n /**\n * Get the underlying execution engine\n */\n getEngine(): SkillExecutionEngine {\n return this.engine;\n }\n\n /**\n * Get the session manager\n */\n getSessionManager(): ReturnType<SkillExecutionEngine['getSessionManager']> {\n return this.engine.getSessionManager();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.observer.getObservationCount();\n }\n\n /**\n * Get all observations\n */\n getObservations(): ReturnType<MemoryObserver['getObservations']> {\n return this.observer.getObservations();\n }\n\n /**\n * Clear observations\n */\n clearObservations(): void {\n this.observer.clear();\n }\n}\n\n/**\n * Create a memory-enabled execution engine\n */\nexport function createMemoryEnabledEngine(\n projectPath: string,\n options?: MemoryEnabledEngineOptions\n): MemoryEnabledEngine {\n return new MemoryEnabledEngine(projectPath, options);\n}\n\n/**\n * Wrap an existing progress callback with memory observation\n */\nexport function wrapProgressCallbackWithMemory(\n projectPath: string,\n existingCallback?: ExecutionProgressCallback,\n memoryConfig?: MemoryObserverConfig,\n sessionId?: string\n): { callback: ExecutionProgressCallback; observer: MemoryObserver } {\n const observer = new MemoryObserver(projectPath, sessionId, memoryConfig);\n const observerCallback = observer.createProgressCallback();\n\n const wrappedCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n observerCallback(event);\n if (existingCallback) {\n existingCallback(event);\n }\n };\n\n return { callback: wrappedCallback, observer };\n}\n","/**\n * Memory Compression Engine\n *\n * Compresses raw observations into learnings using either rule-based\n * extraction or AI-powered compression.\n */\n\nimport { homedir } from 'node:os';\nimport type { Observation, Learning, ObservationType } from './types.js';\nimport { LearningStore } from './learning-store.js';\nimport { MemoryIndexStore } from './memory-index.js';\n\n/**\n * Compression result for a single learning\n */\nexport interface CompressedLearning {\n title: string;\n content: string;\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n importance: number; // 1-10\n sourceObservationIds: string[];\n}\n\n/**\n * Compression result\n */\nexport interface CompressionResult {\n learnings: CompressedLearning[];\n processedObservationIds: string[];\n skippedObservationIds: string[];\n stats: {\n inputCount: number;\n outputCount: number;\n compressionRatio: number;\n };\n}\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum observations to trigger compression */\n minObservations?: number;\n /** Maximum learnings to generate per compression */\n maxLearnings?: number;\n /** Minimum importance score (1-10) to keep a learning */\n minImportance?: number;\n /** Whether to include low-relevance observations */\n includeLowRelevance?: boolean;\n /** Custom tags to add to all learnings */\n additionalTags?: string[];\n /** Project name for context */\n projectName?: string;\n}\n\nconst DEFAULT_COMPRESSION_OPTIONS: Required<CompressionOptions> = {\n minObservations: 3,\n maxLearnings: 10,\n minImportance: 4,\n includeLowRelevance: false,\n additionalTags: [],\n projectName: '',\n};\n\n/**\n * Compression engine interface\n */\nexport interface CompressionEngine {\n /**\n * Compress observations into learnings\n */\n compress(observations: Observation[], options?: CompressionOptions): Promise<CompressionResult>;\n\n /**\n * Get the engine type\n */\n getType(): 'rule-based' | 'api';\n}\n\n/**\n * Rule-based compression engine\n *\n * Uses heuristics and patterns to extract learnings without AI.\n */\nexport class RuleBasedCompressor implements CompressionEngine {\n getType(): 'rule-based' | 'api' {\n return 'rule-based';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group observations by type\n const byType = this.groupByType(filtered);\n\n // Extract error-solution pairs\n const errorSolutionLearnings = this.extractErrorSolutionPairs(byType, opts);\n learnings.push(...errorSolutionLearnings.learnings);\n processedIds.push(...errorSolutionLearnings.processedIds);\n\n // Extract decision patterns\n const decisionLearnings = this.extractDecisionPatterns(byType, opts);\n learnings.push(...decisionLearnings.learnings);\n processedIds.push(...decisionLearnings.processedIds);\n\n // Extract file change patterns\n const fileChangeLearnings = this.extractFileChangePatterns(byType, opts);\n learnings.push(...fileChangeLearnings.learnings);\n processedIds.push(...fileChangeLearnings.processedIds);\n\n // Extract tool usage patterns\n const toolUsageLearnings = this.extractToolUsagePatterns(byType, opts);\n learnings.push(...toolUsageLearnings.learnings);\n processedIds.push(...toolUsageLearnings.processedIds);\n\n // Filter by importance and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio: observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n }\n\n private groupByType(observations: Observation[]): Map<ObservationType, Observation[]> {\n const groups = new Map<ObservationType, Observation[]>();\n for (const obs of observations) {\n const existing = groups.get(obs.type) || [];\n existing.push(obs);\n groups.set(obs.type, existing);\n }\n return groups;\n }\n\n private extractErrorSolutionPairs(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const errors = byType.get('error') || [];\n const solutions = byType.get('solution') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Match errors with solutions\n for (const error of errors) {\n const errorText = error.content.error || error.content.action;\n const matchingSolution = solutions.find((s) => {\n const solutionContext = s.content.context?.toLowerCase() || '';\n const solutionAction = s.content.action?.toLowerCase() || '';\n const errorLower = errorText.toLowerCase();\n\n // Require keyword similarity between error and solution\n const hasKeywordMatch = this.hasSimilarKeywords(errorLower, solutionContext) ||\n this.hasSimilarKeywords(errorLower, solutionAction);\n if (!hasKeywordMatch) {\n return false;\n }\n\n // Solution should indicate it's a fix/resolution, or have strong keyword overlap\n const isSolutionIndicator = solutionContext.includes('fix') ||\n solutionContext.includes('resolve') ||\n solutionContext.includes('solution') ||\n solutionAction.includes('fix') ||\n solutionAction.includes('resolve');\n\n // Require both keyword match AND solution indicator\n return isSolutionIndicator || this.hasStrongKeywordOverlap(errorLower, solutionContext);\n });\n\n if (matchingSolution) {\n const title = this.generateTitle('Error Resolution', errorText);\n const content = this.formatErrorSolutionContent(error, matchingSolution);\n const tags = this.extractTags([error, matchingSolution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling', 'debugging'],\n importance: 8,\n sourceObservationIds: [error.id, matchingSolution.id],\n });\n\n processedIds.push(error.id, matchingSolution.id);\n } else if (error.content.error) {\n // Standalone error learning\n const title = this.generateTitle('Error Pattern', errorText);\n const content = this.formatStandaloneErrorContent(error);\n const tags = this.extractTags([error]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling'],\n importance: 6,\n sourceObservationIds: [error.id],\n });\n\n processedIds.push(error.id);\n }\n }\n\n // Process remaining solutions\n for (const solution of solutions) {\n if (!processedIds.includes(solution.id)) {\n const title = this.generateTitle('Solution', solution.content.action);\n const content = this.formatSolutionContent(solution);\n const tags = this.extractTags([solution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['solution-pattern'],\n importance: 7,\n sourceObservationIds: [solution.id],\n });\n\n processedIds.push(solution.id);\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractDecisionPatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const decisions = byType.get('decision') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n for (const decision of decisions) {\n const title = this.generateTitle('Decision', decision.content.action);\n const content = this.formatDecisionContent(decision);\n const tags = this.extractTags([decision]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['decision-making', 'architecture'],\n importance: 7,\n sourceObservationIds: [decision.id],\n });\n\n processedIds.push(decision.id);\n }\n\n return { learnings, processedIds };\n }\n\n private extractFileChangePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const fileChanges = byType.get('file_change') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group file changes by pattern (same files modified together)\n const filePatterns = new Map<string, Observation[]>();\n for (const change of fileChanges) {\n const files = change.content.files || [];\n const pattern = this.getFilePattern(files);\n const existing = filePatterns.get(pattern) || [];\n existing.push(change);\n filePatterns.set(pattern, existing);\n }\n\n // Create learnings for significant patterns (2+ occurrences)\n for (const [pattern, changes] of filePatterns) {\n if (changes.length >= 2 || changes.some((c) => (c.content.files?.length || 0) > 3)) {\n const title = `File Modification Pattern: ${pattern}`;\n const content = this.formatFileChangeContent(changes);\n const tags = this.extractTags(changes);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['file-organization', 'code-structure'],\n importance: 5,\n sourceObservationIds: changes.map((c) => c.id),\n });\n\n processedIds.push(...changes.map((c) => c.id));\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractToolUsagePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const toolUses = byType.get('tool_use') || [];\n const checkpoints = byType.get('checkpoint') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Only extract if there are significant patterns\n const allObs = [...toolUses, ...checkpoints];\n if (allObs.length >= 5) {\n // Group by common action patterns\n const actionPatterns = new Map<string, Observation[]>();\n for (const obs of allObs) {\n const actionType = this.getActionType(obs.content.action);\n const existing = actionPatterns.get(actionType) || [];\n existing.push(obs);\n actionPatterns.set(actionType, existing);\n }\n\n for (const [actionType, observations] of actionPatterns) {\n if (observations.length >= 3) {\n const title = `Workflow Pattern: ${actionType}`;\n const content = this.formatToolUsageContent(observations);\n const tags = this.extractTags(observations);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['workflow', 'automation'],\n importance: 4,\n sourceObservationIds: observations.map((o) => o.id),\n });\n\n processedIds.push(...observations.map((o) => o.id));\n }\n }\n }\n\n return { learnings, processedIds };\n }\n\n private generateTitle(prefix: string, text: string): string {\n // Extract key words from text\n const cleaned = text\n .replace(/[^a-zA-Z0-9\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const words = cleaned.split(' ').slice(0, 5).join(' ');\n return `${prefix}: ${words}`.slice(0, 80);\n }\n\n private formatErrorSolutionContent(error: Observation, solution: Observation): string {\n return `## Problem\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Solution\n${solution.content.solution || solution.content.action}\n\n**How it was applied:** ${solution.content.context}\n\n## Files Involved\n${[...(error.content.files || []), ...(solution.content.files || [])].join(', ') || 'N/A'}\n`;\n }\n\n private formatStandaloneErrorContent(error: Observation): string {\n return `## Error\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Files Involved\n${error.content.files?.join(', ') || 'N/A'}\n\n## Notes\nThis error was encountered but no direct solution was recorded. Consider investigating similar patterns.\n`;\n }\n\n private formatSolutionContent(solution: Observation): string {\n return `## Solution\n${solution.content.solution || solution.content.action}\n\n**Context:** ${solution.content.context}\n\n## Result\n${solution.content.result || 'Solution applied successfully'}\n\n## Files Involved\n${solution.content.files?.join(', ') || 'N/A'}\n`;\n }\n\n private formatDecisionContent(decision: Observation): string {\n return `## Decision\n${decision.content.action}\n\n**Context:** ${decision.content.context}\n\n## Reasoning\nThis decision was made during skill execution. The context above explains why this approach was chosen.\n\n## Result\n${decision.content.result || 'Decision implemented'}\n`;\n }\n\n private formatFileChangeContent(changes: Observation[]): string {\n const allFiles = new Set<string>();\n const contexts: string[] = [];\n\n for (const change of changes) {\n for (const file of change.content.files || []) {\n allFiles.add(file);\n }\n if (change.content.context) {\n contexts.push(`- ${change.content.context}`);\n }\n }\n\n return `## Files Modified\n${Array.from(allFiles).join('\\n')}\n\n## Contexts\n${contexts.join('\\n') || 'Various modifications'}\n\n## Pattern\nThese files were frequently modified together, suggesting a common pattern or component boundary.\n`;\n }\n\n private formatToolUsageContent(observations: Observation[]): string {\n const actions = observations\n .map((o) => `- ${o.content.action}`)\n .slice(0, 10)\n .join('\\n');\n\n return `## Workflow Steps\n${actions}\n\n## Pattern\nThis sequence of actions was repeated during execution, indicating a common workflow pattern.\n\n## Recommendation\nConsider automating or documenting this workflow for future reference.\n`;\n }\n\n private extractTags(observations: Observation[]): string[] {\n const tags = new Set<string>();\n for (const obs of observations) {\n for (const tag of obs.content.tags || []) {\n tags.add(tag.toLowerCase());\n }\n }\n return Array.from(tags);\n }\n\n private extractFrameworks(tags: string[]): string[] {\n const frameworks = [\n 'react',\n 'nextjs',\n 'vue',\n 'angular',\n 'svelte',\n 'express',\n 'nestjs',\n 'fastify',\n 'django',\n 'flask',\n 'rails',\n 'spring',\n 'typescript',\n 'javascript',\n 'python',\n 'rust',\n 'go',\n ];\n return tags.filter((t) => frameworks.includes(t.toLowerCase()));\n }\n\n private getFilePattern(files: string[]): string {\n if (files.length === 0) return 'unknown';\n\n // Extract common directory\n const dirs = files.map((f) => {\n const parts = f.split('/');\n return parts.slice(0, -1).join('/') || 'root';\n });\n\n const uniqueDirs = [...new Set(dirs)];\n if (uniqueDirs.length === 1) {\n return uniqueDirs[0];\n }\n\n // Extract file types\n const extensions = files.map((f) => {\n const ext = f.split('.').pop() || 'unknown';\n return ext;\n });\n const uniqueExts = [...new Set(extensions)];\n\n return `${uniqueDirs[0]} (${uniqueExts.join(', ')})`;\n }\n\n private getActionType(action: string): string {\n const actionLower = action.toLowerCase();\n if (actionLower.includes('read') || actionLower.includes('view')) return 'read';\n if (actionLower.includes('write') || actionLower.includes('create')) return 'write';\n if (actionLower.includes('edit') || actionLower.includes('modify')) return 'edit';\n if (actionLower.includes('delete') || actionLower.includes('remove')) return 'delete';\n if (actionLower.includes('test') || actionLower.includes('verify')) return 'test';\n if (actionLower.includes('build') || actionLower.includes('compile')) return 'build';\n if (actionLower.includes('start') || actionLower.includes('run')) return 'run';\n return 'other';\n }\n\n private hasSimilarKeywords(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n return words1.some((w) => words2.has(w));\n }\n\n /**\n * Check for strong keyword overlap (multiple matching words)\n * More strict than hasSimilarKeywords - requires at least 2 matching words\n */\n private hasStrongKeywordOverlap(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n const matchCount = words1.filter((w) => words2.has(w)).length;\n return matchCount >= 2;\n }\n}\n\n/**\n * API-based compression engine configuration\n */\nexport interface APICompressionConfig {\n /** API provider */\n provider: 'anthropic' | 'openai';\n /** API key */\n apiKey: string;\n /** Model to use */\n model?: string;\n /** Maximum tokens for response */\n maxTokens?: number;\n}\n\n/**\n * API-based compression engine\n *\n * Uses Claude or OpenAI to extract learnings from observations.\n */\nexport class APIBasedCompressor implements CompressionEngine {\n private config: APICompressionConfig;\n\n constructor(config: APICompressionConfig) {\n this.config = config;\n }\n\n getType(): 'rule-based' | 'api' {\n return 'api';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n // Format observations for the prompt\n const observationsText = this.formatObservationsForPrompt(filtered);\n\n // Build the prompt\n const prompt = this.buildCompressionPrompt(observationsText, opts);\n\n try {\n // Call the API\n const response = await this.callAPI(prompt);\n\n // Parse the response\n const learnings = this.parseAPIResponse(response, filtered);\n\n // Filter and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const processedIds = finalLearnings.flatMap((l) => l.sourceObservationIds);\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio:\n observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n } catch (error) {\n // Fall back to rule-based compression on API failure\n console.warn('API compression failed, falling back to rule-based:', error);\n const fallback = new RuleBasedCompressor();\n return fallback.compress(observations, options);\n }\n }\n\n private formatObservationsForPrompt(observations: Observation[]): string {\n return observations\n .map(\n (o, i) => `\n[Observation ${i + 1}] ID: ${o.id}\nType: ${o.type}\nTimestamp: ${o.timestamp}\nAction: ${o.content.action}\nContext: ${o.content.context}\n${o.content.error ? `Error: ${o.content.error}` : ''}\n${o.content.solution ? `Solution: ${o.content.solution}` : ''}\n${o.content.result ? `Result: ${o.content.result}` : ''}\n${o.content.files?.length ? `Files: ${o.content.files.join(', ')}` : ''}\n${o.content.tags?.length ? `Tags: ${o.content.tags.join(', ')}` : ''}\nRelevance: ${o.relevance}/100\n`\n )\n .join('\\n---\\n');\n }\n\n private buildCompressionPrompt(observationsText: string, opts: Required<CompressionOptions>): string {\n return `Analyze these session observations and extract key learnings that would be valuable for future development sessions.\n\n## Observations\n${observationsText}\n\n## Instructions\nExtract meaningful learnings from these observations. For each learning:\n1. Create a concise, actionable title (max 80 characters)\n2. Write content that explains:\n - What was learned\n - When/why this is useful\n - How to apply it\n3. Add relevant tags (lowercase, hyphenated)\n4. Rate importance (1-10, where 10 is critical)\n\nFocus on:\n- Error patterns and their solutions\n- Decisions made and their reasoning\n- Workflow patterns that emerged\n- Best practices discovered\n- Gotchas and edge cases\n\n${opts.projectName ? `Project context: ${opts.projectName}` : ''}\n\n## Output Format\nRespond with valid JSON array:\n[\n {\n \"title\": \"...\",\n \"content\": \"...\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"frameworks\": [\"react\", \"typescript\"],\n \"patterns\": [\"error-handling\", \"debugging\"],\n \"importance\": 8,\n \"sourceObservationIds\": [\"obs-id-1\", \"obs-id-2\"]\n }\n]\n\nGenerate up to ${opts.maxLearnings} learnings. Only include learnings with importance >= ${opts.minImportance}.`;\n }\n\n private async callAPI(prompt: string): Promise<string> {\n if (this.config.provider === 'anthropic') {\n return this.callAnthropic(prompt);\n } else {\n return this.callOpenAI(prompt);\n }\n }\n\n private async callAnthropic(prompt: string): Promise<string> {\n const model = this.config.model || 'claude-3-haiku-20240307';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as { content: Array<{ text: string }> };\n return data.content[0]?.text || '';\n }\n\n private async callOpenAI(prompt: string): Promise<string> {\n const model = this.config.model || 'gpt-4o-mini';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content || '';\n }\n\n private parseAPIResponse(response: string, observations: Observation[]): CompressedLearning[] {\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response;\n const jsonMatch = response.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1];\n }\n\n const parsed = JSON.parse(jsonStr.trim());\n\n if (!Array.isArray(parsed)) {\n throw new Error('Response is not an array');\n }\n\n // Validate and clean up each learning\n const observationIds = new Set(observations.map((o) => o.id));\n return parsed\n .filter((item): item is CompressedLearning => {\n return (\n typeof item === 'object' &&\n typeof item.title === 'string' &&\n typeof item.content === 'string' &&\n Array.isArray(item.tags) &&\n typeof item.importance === 'number'\n );\n })\n .map((item) => ({\n ...item,\n // Validate source observation IDs\n sourceObservationIds: (item.sourceObservationIds || []).filter((id: string) =>\n observationIds.has(id)\n ),\n frameworks: item.frameworks || [],\n patterns: item.patterns || [],\n }));\n } catch (error) {\n console.warn('Failed to parse API response:', error);\n return [];\n }\n }\n}\n\n/**\n * Memory compressor that manages compression and stores results\n */\nexport class MemoryCompressor {\n private engine: CompressionEngine;\n private learningStore: LearningStore;\n private indexStore: MemoryIndexStore;\n private projectName?: string;\n\n constructor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n ) {\n this.engine = options?.engine || new RuleBasedCompressor();\n this.learningStore = new LearningStore(\n options?.scope || 'project',\n projectPath,\n options?.projectName\n );\n // For global scope, use home directory; for project scope, use project path\n const indexBasePath = options?.scope === 'global' ? homedir() : projectPath;\n this.indexStore = new MemoryIndexStore(indexBasePath, options?.scope === 'global');\n this.projectName = options?.projectName;\n }\n\n /**\n * Set the compression engine\n */\n setEngine(engine: CompressionEngine): void {\n this.engine = engine;\n }\n\n /**\n * Compress observations without storing (for dry-run/preview)\n */\n async compress(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<CompressionResult> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n return this.engine.compress(observations, compressionOptions);\n }\n\n /**\n * Compress observations and store as learnings\n */\n async compressAndStore(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<{\n learnings: Learning[];\n result: CompressionResult;\n }> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n\n // Compress observations\n const result = await this.engine.compress(observations, compressionOptions);\n\n // Store each learning\n const storedLearnings: Learning[] = [];\n for (const compressed of result.learnings) {\n const learning = this.learningStore.add({\n source: 'session',\n sourceObservations: compressed.sourceObservationIds,\n title: compressed.title,\n content: compressed.content,\n tags: compressed.tags,\n frameworks: compressed.frameworks,\n patterns: compressed.patterns,\n });\n\n // Index the learning\n this.indexStore.indexLearning(learning);\n\n storedLearnings.push(learning);\n }\n\n return {\n learnings: storedLearnings,\n result,\n };\n }\n\n /**\n * Get the learning store\n */\n getLearningStore(): LearningStore {\n return this.learningStore;\n }\n\n /**\n * Get the index store\n */\n getIndexStore(): MemoryIndexStore {\n return this.indexStore;\n }\n\n /**\n * Get compression engine type\n */\n getEngineType(): 'rule-based' | 'api' {\n return this.engine.getType();\n }\n}\n\n/**\n * Learning consolidator\n *\n * Merges similar learnings to reduce redundancy.\n */\nexport class LearningConsolidator {\n /**\n * Find similar learnings\n */\n findSimilar(learnings: Learning[], similarity = 0.7): Array<[Learning, Learning]> {\n const pairs: Array<[Learning, Learning]> = [];\n\n for (let i = 0; i < learnings.length; i++) {\n for (let j = i + 1; j < learnings.length; j++) {\n const score = this.calculateSimilarity(learnings[i], learnings[j]);\n if (score >= similarity) {\n pairs.push([learnings[i], learnings[j]]);\n }\n }\n }\n\n return pairs;\n }\n\n /**\n * Merge two similar learnings\n */\n merge(learning1: Learning, learning2: Learning): Omit<Learning, 'id' | 'createdAt' | 'updatedAt'> {\n // Keep the more effective/used one as base\n const base = this.getBetterLearning(learning1, learning2);\n const other = base === learning1 ? learning2 : learning1;\n\n return {\n // Preserve the source from the base learning instead of hard-coding 'session'\n source: base.source,\n sourceObservations: [\n ...(base.sourceObservations || []),\n ...(other.sourceObservations || []),\n ],\n title: base.title,\n content: this.mergeContent(base.content, other.content),\n scope: base.scope,\n project: base.project,\n tags: [...new Set([...base.tags, ...other.tags])],\n frameworks: [...new Set([...(base.frameworks || []), ...(other.frameworks || [])])],\n patterns: [...new Set([...(base.patterns || []), ...(other.patterns || [])])],\n useCount: base.useCount + other.useCount,\n lastUsed: base.lastUsed || other.lastUsed,\n effectiveness: base.effectiveness ?? other.effectiveness,\n };\n }\n\n /**\n * Consolidate a list of learnings\n */\n consolidate(\n learnings: Learning[],\n store: LearningStore,\n index: MemoryIndexStore,\n similarity = 0.7\n ): { merged: number; remaining: number } {\n const pairs = this.findSimilar(learnings, similarity);\n const mergedIds = new Set<string>();\n let mergedCount = 0;\n\n for (const [l1, l2] of pairs) {\n if (mergedIds.has(l1.id) || mergedIds.has(l2.id)) {\n continue;\n }\n\n // Merge the learnings\n const merged = this.merge(l1, l2);\n\n // Add the merged learning\n const newLearning = store.add(merged);\n index.indexLearning(newLearning);\n\n // Remove the old learnings\n store.delete(l1.id);\n store.delete(l2.id);\n index.removeLearning(l1.id);\n index.removeLearning(l2.id);\n\n mergedIds.add(l1.id);\n mergedIds.add(l2.id);\n mergedCount++;\n }\n\n return {\n merged: mergedCount,\n remaining: learnings.length - mergedCount * 2 + mergedCount,\n };\n }\n\n private calculateSimilarity(l1: Learning, l2: Learning): number {\n let score = 0;\n\n // Title similarity (Jaccard)\n const title1Words = new Set(l1.title.toLowerCase().split(/\\s+/));\n const title2Words = new Set(l2.title.toLowerCase().split(/\\s+/));\n const titleIntersection = [...title1Words].filter((w) => title2Words.has(w)).length;\n const titleUnion = new Set([...title1Words, ...title2Words]).size;\n score += (titleIntersection / titleUnion) * 0.3;\n\n // Tag overlap\n const tags1 = new Set(l1.tags);\n const tags2 = new Set(l2.tags);\n const tagIntersection = [...tags1].filter((t) => tags2.has(t)).length;\n const tagUnion = new Set([...tags1, ...tags2]).size;\n if (tagUnion > 0) {\n score += (tagIntersection / tagUnion) * 0.3;\n }\n\n // Pattern overlap\n const patterns1 = new Set(l1.patterns || []);\n const patterns2 = new Set(l2.patterns || []);\n const patternIntersection = [...patterns1].filter((p) => patterns2.has(p)).length;\n const patternUnion = new Set([...patterns1, ...patterns2]).size;\n if (patternUnion > 0) {\n score += (patternIntersection / patternUnion) * 0.2;\n }\n\n // Content similarity (simple word overlap)\n const content1Words = new Set(\n l1.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const content2Words = new Set(\n l2.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const contentIntersection = [...content1Words].filter((w) => content2Words.has(w)).length;\n const contentUnion = new Set([...content1Words, ...content2Words]).size;\n if (contentUnion > 0) {\n score += (contentIntersection / contentUnion) * 0.2;\n }\n\n return score;\n }\n\n private getBetterLearning(l1: Learning, l2: Learning): Learning {\n // Prefer higher effectiveness\n if (l1.effectiveness !== l2.effectiveness) {\n return (l1.effectiveness || 0) > (l2.effectiveness || 0) ? l1 : l2;\n }\n // Prefer higher use count\n if (l1.useCount !== l2.useCount) {\n return l1.useCount > l2.useCount ? l1 : l2;\n }\n // Prefer more recent\n return new Date(l1.updatedAt) > new Date(l2.updatedAt) ? l1 : l2;\n }\n\n private mergeContent(content1: string, content2: string): string {\n // Simple merge: keep the longer one and add a note\n if (content1.length >= content2.length) {\n return content1;\n }\n return content2;\n }\n}\n\n/**\n * Create a rule-based compressor\n */\nexport function createRuleBasedCompressor(): RuleBasedCompressor {\n return new RuleBasedCompressor();\n}\n\n/**\n * Create an API-based compressor\n */\nexport function createAPIBasedCompressor(config: APICompressionConfig): APIBasedCompressor {\n return new APIBasedCompressor(config);\n}\n\n/**\n * Create a memory compressor\n */\nexport function createMemoryCompressor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n): MemoryCompressor {\n return new MemoryCompressor(projectPath, options);\n}\n","/**\n * Memory Injector\n *\n * Injects relevant memories into agent context with relevance matching,\n * agent-specific formatting, and token budgeting.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ProjectContext } from '../context/types.js';\nimport type { Learning, MemorySummary, MemoryPreview, MemoryFull } from './types.js';\nimport { LearningStore } from './learning-store.js';\n\n/**\n * Injection options\n */\nexport interface InjectionOptions {\n /** Maximum tokens to use for injected memories */\n maxTokens?: number;\n /** Minimum relevance score to include (0-100) */\n minRelevance?: number;\n /** Maximum number of learnings to inject */\n maxLearnings?: number;\n /** Include global memories */\n includeGlobal?: boolean;\n /** Specific tags to match */\n tags?: string[];\n /** Current task description for relevance matching */\n currentTask?: string;\n /** Progressive disclosure level */\n disclosureLevel?: 'summary' | 'preview' | 'full';\n}\n\n/**\n * Injected memory with relevance score\n */\nexport interface InjectedMemory {\n learning: Learning;\n relevanceScore: number;\n matchedBy: {\n frameworks: string[];\n tags: string[];\n keywords: string[];\n patterns: string[];\n };\n tokenEstimate: number;\n}\n\n/**\n * Injection result\n */\nexport interface InjectionResult {\n memories: InjectedMemory[];\n formattedContent: string;\n totalTokens: number;\n stats: {\n considered: number;\n matched: number;\n injected: number;\n truncated: number;\n };\n}\n\n/**\n * Default injection options\n */\nconst DEFAULT_OPTIONS: Required<Omit<InjectionOptions, 'tags' | 'currentTask'>> = {\n maxTokens: 2000,\n minRelevance: 30,\n maxLearnings: 10,\n includeGlobal: true,\n disclosureLevel: 'preview',\n};\n\n/**\n * Approximate tokens per character (conservative estimate)\n */\nconst TOKENS_PER_CHAR = 0.25;\n\n/**\n * Memory Injector\n *\n * Retrieves and formats relevant memories for injection into agent context.\n */\nexport class MemoryInjector {\n private projectStore: LearningStore;\n private globalStore: LearningStore;\n private projectContext?: ProjectContext;\n\n constructor(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n ) {\n this.projectStore = new LearningStore('project', projectPath, projectName);\n this.globalStore = new LearningStore('global');\n this.projectContext = projectContext;\n }\n\n /**\n * Set project context for better relevance matching\n */\n setProjectContext(context: ProjectContext): void {\n this.projectContext = context;\n }\n\n /**\n * Get relevant memories for injection\n */\n async getRelevantMemories(options: InjectionOptions = {}): Promise<InjectedMemory[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Collect all learnings\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n // Score each learning for relevance\n const scored = allLearnings.map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }));\n\n // Filter by minimum relevance\n const filtered = scored.filter((s) => s.relevanceScore >= opts.minRelevance);\n\n // Sort by relevance (descending)\n filtered.sort((a, b) => b.relevanceScore - a.relevanceScore);\n\n // Limit to max learnings\n return filtered.slice(0, opts.maxLearnings);\n }\n\n /**\n * Score a learning for relevance to current context\n */\n private scoreLearning(\n learning: Learning,\n options: InjectionOptions\n ): Omit<InjectedMemory, 'learning'> {\n let score = 0;\n const matchedBy = {\n frameworks: [] as string[],\n tags: [] as string[],\n keywords: [] as string[],\n patterns: [] as string[],\n };\n\n // Match by frameworks from project context\n if (this.projectContext?.stack) {\n const projectFrameworks = this.extractFrameworkNames();\n const learningFrameworks = learning.frameworks || [];\n\n for (const fw of learningFrameworks) {\n if (projectFrameworks.has(fw.toLowerCase())) {\n score += 15;\n matchedBy.frameworks.push(fw);\n }\n }\n }\n\n // Match by explicitly requested tags\n if (options.tags && options.tags.length > 0) {\n const requestedTags = new Set(options.tags.map((t) => t.toLowerCase()));\n for (const tag of learning.tags) {\n if (requestedTags.has(tag.toLowerCase())) {\n score += 20;\n matchedBy.tags.push(tag);\n }\n }\n }\n\n // Match by current task keywords\n if (options.currentTask) {\n const taskKeywords = this.extractKeywords(options.currentTask);\n const learningKeywords = [\n ...this.extractKeywords(learning.title),\n ...this.extractKeywords(learning.content),\n ...learning.tags,\n ];\n\n const learningKeywordSet = new Set(learningKeywords.map((k) => k.toLowerCase()));\n for (const kw of taskKeywords) {\n if (learningKeywordSet.has(kw.toLowerCase())) {\n score += 10;\n if (!matchedBy.keywords.includes(kw)) {\n matchedBy.keywords.push(kw);\n }\n }\n }\n }\n\n // Match by patterns\n if (learning.patterns && learning.patterns.length > 0) {\n // Patterns are valuable - boost score\n score += learning.patterns.length * 5;\n matchedBy.patterns.push(...learning.patterns);\n }\n\n // Boost by effectiveness if known\n if (learning.effectiveness !== undefined) {\n score += (learning.effectiveness / 100) * 20;\n }\n\n // Boost by use count (popular learnings are likely valuable)\n score += Math.min(learning.useCount * 2, 15);\n\n // Boost recent learnings\n const daysSinceUpdate = this.daysSince(learning.updatedAt);\n if (daysSinceUpdate < 7) {\n score += 10;\n } else if (daysSinceUpdate < 30) {\n score += 5;\n }\n\n // Cap score at 100\n score = Math.min(score, 100);\n\n // Estimate token count\n const tokenEstimate = this.estimateTokens(learning, options.disclosureLevel || 'preview');\n\n return {\n relevanceScore: score,\n matchedBy,\n tokenEstimate,\n };\n }\n\n /**\n * Extract framework names from project context\n */\n private extractFrameworkNames(): Set<string> {\n const names = new Set<string>();\n\n if (!this.projectContext?.stack) return names;\n\n const stack = this.projectContext.stack;\n const categories = [\n stack.languages,\n stack.frameworks,\n stack.libraries,\n stack.styling,\n stack.testing,\n stack.databases,\n stack.tools,\n stack.runtime,\n ];\n\n for (const category of categories) {\n for (const detection of category) {\n names.add(detection.name.toLowerCase());\n }\n }\n\n return names;\n }\n\n /**\n * Extract keywords from text\n */\n private extractKeywords(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[\\s\\-_.,;:!?()[\\]{}'\"]+/)\n .filter((word) => word.length > 2 && !STOP_WORDS.has(word));\n }\n\n /**\n * Calculate days since a date\n */\n private daysSince(dateStr: string): number {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n }\n\n /**\n * Estimate tokens for a learning\n */\n private estimateTokens(\n learning: Learning,\n level: 'summary' | 'preview' | 'full'\n ): number {\n switch (level) {\n case 'summary':\n return Math.ceil((learning.title.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR);\n case 'preview':\n const excerpt = learning.content.slice(0, 200);\n return Math.ceil(\n (learning.title.length + excerpt.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR\n );\n case 'full':\n return Math.ceil(\n (learning.title.length + learning.content.length + learning.tags.join(' ').length) *\n TOKENS_PER_CHAR\n );\n }\n }\n\n /**\n * Inject memories and return formatted content\n */\n async inject(options: InjectionOptions = {}): Promise<InjectionResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const allMemories = await this.getRelevantMemories(opts);\n\n // Select memories within token budget\n const selected: InjectedMemory[] = [];\n let totalTokens = 0;\n let truncated = 0;\n\n for (const memory of allMemories) {\n if (totalTokens + memory.tokenEstimate <= opts.maxTokens) {\n selected.push(memory);\n totalTokens += memory.tokenEstimate;\n\n // Increment use count\n if (memory.learning.scope === 'project') {\n this.projectStore.incrementUseCount(memory.learning.id);\n } else {\n this.globalStore.incrementUseCount(memory.learning.id);\n }\n } else {\n truncated++;\n }\n }\n\n // Format the content\n const formattedContent = this.formatMemories(selected, opts.disclosureLevel || 'preview');\n\n return {\n memories: selected,\n formattedContent,\n totalTokens,\n stats: {\n considered: this.projectStore.count() + (opts.includeGlobal ? this.globalStore.count() : 0),\n matched: allMemories.length,\n injected: selected.length,\n truncated,\n },\n };\n }\n\n /**\n * Inject memories formatted for a specific agent\n */\n async injectForAgent(\n agent: AgentType,\n options: InjectionOptions = {}\n ): Promise<InjectionResult> {\n const result = await this.inject(options);\n\n // Reformat for specific agent\n result.formattedContent = this.formatForAgent(result.memories, agent, options.disclosureLevel);\n\n return result;\n }\n\n /**\n * Format memories for display\n */\n private formatMemories(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n const lines: string[] = ['# Relevant Memories', ''];\n\n for (const { learning, relevanceScore, matchedBy } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push(`*Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}*`);\n\n if (matchedBy.frameworks.length > 0) {\n lines.push(`*Matched frameworks: ${matchedBy.frameworks.join(', ')}*`);\n }\n\n lines.push('');\n\n switch (level) {\n case 'summary':\n // Just title and tags (already shown above)\n break;\n case 'preview':\n lines.push(learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : ''));\n break;\n case 'full':\n lines.push(learning.content);\n break;\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for a specific agent\n */\n formatForAgent(\n memories: InjectedMemory[],\n agent: AgentType,\n level: 'summary' | 'preview' | 'full' = 'preview'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n switch (agent) {\n case 'claude-code':\n return this.formatForClaude(memories, level);\n case 'cursor':\n return this.formatForCursor(memories, level);\n case 'codex':\n case 'github-copilot':\n return this.formatForCopilot(memories, level);\n default:\n return this.formatMemories(memories, level);\n }\n }\n\n /**\n * Format memories for Claude (XML tags)\n */\n private formatForClaude(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<memories>'];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(` <memory relevance=\"${relevanceScore}\" scope=\"${learning.scope}\">`);\n lines.push(` <title>${this.escapeXml(learning.title)}</title>`);\n lines.push(` <tags>${learning.tags.join(', ')}</tags>`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 200) : learning.content;\n lines.push(` <content>${this.escapeXml(content)}</content>`);\n }\n\n if (learning.frameworks && learning.frameworks.length > 0) {\n lines.push(` <frameworks>${learning.frameworks.join(', ')}</frameworks>`);\n }\n\n lines.push(' </memory>');\n }\n\n lines.push('</memories>');\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Cursor (.mdc format)\n */\n private formatForCursor(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = [\n '---',\n 'description: Relevant memories from previous sessions',\n 'globs:',\n ' - \"**/*\"',\n '---',\n '',\n '# Session Memories',\n '',\n ];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push('');\n lines.push(`> Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}`);\n lines.push('');\n\n if (level !== 'summary') {\n const content =\n level === 'preview'\n ? learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : '')\n : learning.content;\n lines.push(content);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Copilot/Codex (concise markdown)\n */\n private formatForCopilot(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<!-- Session Memories -->'];\n\n for (const { learning } of memories) {\n lines.push(`### ${learning.title}`);\n lines.push(`Tags: ${learning.tags.join(', ')}`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 150) : learning.content;\n lines.push(content);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Get memory summaries (for progressive disclosure)\n */\n getSummaries(options: InjectionOptions = {}): MemorySummary[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n return allLearnings.map((learning) => ({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n }));\n }\n\n /**\n * Get memory previews (for progressive disclosure)\n */\n getPreviews(ids: string[], options: InjectionOptions = {}): MemoryPreview[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const previews: MemoryPreview[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n previews.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n });\n }\n }\n\n return previews;\n }\n\n /**\n * Get full memories (for progressive disclosure)\n */\n getFullMemories(ids: string[], options: InjectionOptions = {}): MemoryFull[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const fullMemories: MemoryFull[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n fullMemories.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n content: learning.content,\n });\n }\n }\n\n return fullMemories;\n }\n\n /**\n * Search memories by query\n */\n search(query: string, options: InjectionOptions = {}): InjectedMemory[] {\n const opts = { ...DEFAULT_OPTIONS, ...options, currentTask: query };\n const projectResults = this.projectStore.search(query);\n const globalResults = opts.includeGlobal ? this.globalStore.search(query) : [];\n const allResults = [...projectResults, ...globalResults];\n\n return allResults\n .map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }))\n .filter((m) => m.relevanceScore >= opts.minRelevance)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, opts.maxLearnings);\n }\n}\n\n/**\n * Common stop words to ignore in keyword extraction\n */\nconst STOP_WORDS = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'in',\n 'on',\n 'at',\n 'to',\n 'for',\n 'of',\n 'with',\n 'by',\n 'from',\n 'as',\n 'is',\n 'was',\n 'are',\n 'were',\n 'been',\n 'be',\n 'have',\n 'has',\n 'had',\n 'do',\n 'does',\n 'did',\n 'will',\n 'would',\n 'could',\n 'should',\n 'may',\n 'might',\n 'must',\n 'can',\n 'this',\n 'that',\n 'these',\n 'those',\n 'i',\n 'you',\n 'he',\n 'she',\n 'it',\n 'we',\n 'they',\n 'what',\n 'which',\n 'who',\n 'when',\n 'where',\n 'why',\n 'how',\n 'all',\n 'each',\n 'every',\n 'both',\n 'few',\n 'more',\n 'most',\n 'other',\n 'some',\n 'such',\n 'no',\n 'nor',\n 'not',\n 'only',\n 'own',\n 'same',\n 'so',\n 'than',\n 'too',\n 'very',\n 'just',\n 'also',\n]);\n\n/**\n * Create a MemoryInjector instance\n */\nexport function createMemoryInjector(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n): MemoryInjector {\n return new MemoryInjector(projectPath, projectName, projectContext);\n}\n","/**\n * Team Manager\n *\n * Manages team skill sharing and collaboration\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { parse as yamlParse, stringify as yamlStringify } from 'yaml';\nimport type {\n TeamConfig,\n TeamRegistry,\n SharedSkill,\n ShareOptions,\n ImportOptions,\n} from './types.js';\nimport type { AgentType } from '../types.js';\nimport { detectProvider } from '../providers/index.js';\n\nconst TEAM_CONFIG_FILE = 'team.yaml';\nconst TEAM_DIR = '.skillkit/team';\n\n/**\n * Team Manager for collaboration features\n */\nexport class TeamManager {\n private projectPath: string;\n private config: TeamConfig | null = null;\n private registry: TeamRegistry | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n /**\n * Initialize team configuration\n */\n async init(config: Omit<TeamConfig, 'teamId'>): Promise<TeamConfig> {\n const teamId = this.generateTeamId();\n const fullConfig: TeamConfig = {\n ...config,\n teamId,\n };\n\n // Create team directory\n const teamDir = join(this.projectPath, TEAM_DIR);\n if (!existsSync(teamDir)) {\n mkdirSync(teamDir, { recursive: true });\n }\n\n // Save config\n this.saveConfig(fullConfig);\n this.config = fullConfig;\n\n // Initialize empty registry\n const registry: TeamRegistry = {\n version: 1,\n teamId,\n teamName: config.teamName,\n skills: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.saveRegistry(registry);\n this.registry = registry;\n\n return fullConfig;\n }\n\n /**\n * Load existing team configuration\n */\n load(): TeamConfig | null {\n const configPath = join(this.projectPath, TEAM_DIR, TEAM_CONFIG_FILE);\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n this.config = this.parseYaml(content) as TeamConfig;\n this.loadRegistry();\n return this.config;\n } catch {\n return null;\n }\n }\n\n /**\n * Get current config\n */\n getConfig(): TeamConfig | null {\n return this.config;\n }\n\n /**\n * Get current registry\n */\n getRegistry(): TeamRegistry | null {\n return this.registry;\n }\n\n /**\n * Share a skill to the team registry\n */\n async shareSkill(options: ShareOptions): Promise<SharedSkill> {\n if (!this.config || !this.registry) {\n throw new Error('Team not initialized. Run `skillkit team init` first.');\n }\n\n // Find the skill in local skills directory\n const skillPath = this.findLocalSkill(options.skillName);\n if (!skillPath) {\n throw new Error(`Skill \"${options.skillName}\" not found locally.`);\n }\n\n // Read skill content and metadata\n const skillMdPath = join(skillPath, 'SKILL.md');\n const skillContent = existsSync(skillMdPath)\n ? readFileSync(skillMdPath, 'utf-8')\n : '';\n\n // Parse frontmatter for metadata\n const metadata = this.extractFrontmatter(skillContent);\n\n // Create shared skill entry\n const shared: SharedSkill = {\n name: options.skillName,\n version: (metadata.version as string) || '1.0.0',\n description: options.description || (metadata.description as string) || '',\n author: this.getAuthor(),\n sharedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n source: `${this.config.registryUrl}#${options.skillName}`,\n tags: options.tags || (metadata.tags as string[]) || [],\n agents: options.agents || this.detectCompatibleAgents(skillPath),\n downloads: 0,\n };\n\n // Check if skill already exists\n const existingIndex = this.registry.skills.findIndex(\n (s) => s.name === options.skillName\n );\n\n if (existingIndex >= 0) {\n // Update existing\n shared.sharedAt = this.registry.skills[existingIndex].sharedAt;\n shared.downloads = this.registry.skills[existingIndex].downloads;\n this.registry.skills[existingIndex] = shared;\n } else {\n // Add new\n this.registry.skills.push(shared);\n }\n\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n\n return shared;\n }\n\n /**\n * List all shared skills in the team registry\n */\n listSharedSkills(): SharedSkill[] {\n return this.registry?.skills || [];\n }\n\n /**\n * Search shared skills\n */\n searchSkills(query: string): SharedSkill[] {\n if (!this.registry) return [];\n\n const lowerQuery = query.toLowerCase();\n return this.registry.skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery) ||\n s.tags?.some((t) => t.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Import a shared skill from the team registry\n */\n async importSkill(\n skillName: string,\n options: ImportOptions = {}\n ): Promise<{ success: boolean; path?: string; error?: string }> {\n if (!this.config || !this.registry) {\n return { success: false, error: 'Team not initialized' };\n }\n\n const sharedSkill = this.registry.skills.find((s) => s.name === skillName);\n if (!sharedSkill) {\n return { success: false, error: `Skill \"${skillName}\" not found in team registry` };\n }\n\n // Check if skill exists locally\n const localPath = this.findLocalSkill(skillName);\n if (localPath && !options.overwrite) {\n return {\n success: false,\n error: `Skill \"${skillName}\" already exists. Use --overwrite to replace.`,\n };\n }\n\n if (options.dryRun) {\n return {\n success: true,\n path: join(this.projectPath, '.skillkit', 'skills', skillName),\n };\n }\n\n // Clone from registry source\n try {\n const provider = detectProvider(this.config.registryUrl);\n if (!provider) {\n return { success: false, error: 'Cannot detect provider for registry URL' };\n }\n\n // Build clone options with auth if available\n const cloneOptions: { depth?: number; ssh?: boolean } = { depth: 1 };\n if (this.config.auth?.type === 'ssh') {\n cloneOptions.ssh = true;\n }\n\n const result = await provider.clone(this.config.registryUrl, skillName, cloneOptions);\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n // Update download count\n sharedSkill.downloads = (sharedSkill.downloads || 0) + 1;\n this.saveRegistry(this.registry);\n\n return { success: true, path: result.path };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Sync with remote registry\n */\n async sync(): Promise<{\n added: string[];\n updated: string[];\n removed: string[];\n }> {\n if (!this.config) {\n throw new Error('Team not initialized');\n }\n\n if (!this.registry) {\n throw new Error('Team registry not loaded. Call load() first.');\n }\n\n const result = { added: [] as string[], updated: [] as string[], removed: [] as string[] };\n\n try {\n const provider = detectProvider(this.config.registryUrl);\n if (!provider) {\n throw new Error('Cannot detect provider for registry URL');\n }\n\n // Build clone options with auth if available\n const cloneOptions: { depth?: number; ssh?: boolean } = { depth: 1 };\n if (this.config.auth?.type === 'ssh') {\n cloneOptions.ssh = true;\n }\n\n // Fetch remote registry\n const fetchResult = await provider.clone(this.config.registryUrl, '', cloneOptions);\n\n if (!fetchResult.success || !fetchResult.path) {\n throw new Error(fetchResult.error || 'Failed to fetch remote registry');\n }\n\n // Read remote registry\n const remoteRegistryPath = join(fetchResult.path, TEAM_DIR, 'registry.yaml');\n if (existsSync(remoteRegistryPath)) {\n const remoteContent = readFileSync(remoteRegistryPath, 'utf-8');\n const remoteRegistry = this.parseYaml(remoteContent) as TeamRegistry;\n\n // Merge registries\n const localSkillNames = new Set(this.registry?.skills.map((s) => s.name) || []);\n\n // Find added skills\n for (const skill of remoteRegistry.skills) {\n if (!localSkillNames.has(skill.name)) {\n result.added.push(skill.name);\n this.registry?.skills.push(skill);\n } else {\n // Check if updated\n const local = this.registry?.skills.find((s) => s.name === skill.name);\n if (local && new Date(skill.updatedAt) > new Date(local.updatedAt)) {\n result.updated.push(skill.name);\n Object.assign(local, skill);\n }\n }\n }\n\n // Find removed skills (optional - keep local for now)\n // for (const skill of this.registry?.skills || []) {\n // if (!remoteSkillNames.has(skill.name)) {\n // result.removed.push(skill.name);\n // }\n // }\n\n if (this.registry) {\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n }\n }\n\n // Clean up temp directory\n if (fetchResult.tempRoot) {\n const { rmSync } = await import('node:fs');\n rmSync(fetchResult.tempRoot, { recursive: true, force: true });\n }\n } catch (err) {\n throw new Error(`Sync failed: ${err instanceof Error ? err.message : 'Unknown error'}`);\n }\n\n return result;\n }\n\n /**\n * Remove a skill from the team registry\n */\n removeSkill(skillName: string): boolean {\n if (!this.registry) return false;\n\n const index = this.registry.skills.findIndex((s) => s.name === skillName);\n if (index === -1) return false;\n\n this.registry.skills.splice(index, 1);\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n\n return true;\n }\n\n // Private helpers\n\n private generateTeamId(): string {\n return `team-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private saveConfig(config: TeamConfig): void {\n const configPath = join(this.projectPath, TEAM_DIR, TEAM_CONFIG_FILE);\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, this.toYaml(config), 'utf-8');\n }\n\n private loadRegistry(): void {\n const registryPath = join(this.projectPath, TEAM_DIR, 'registry.yaml');\n if (existsSync(registryPath)) {\n const content = readFileSync(registryPath, 'utf-8');\n this.registry = this.parseYaml(content) as TeamRegistry;\n }\n }\n\n private saveRegistry(registry: TeamRegistry): void {\n const registryPath = join(this.projectPath, TEAM_DIR, 'registry.yaml');\n writeFileSync(registryPath, this.toYaml(registry), 'utf-8');\n }\n\n private findLocalSkill(skillName: string): string | null {\n const possiblePaths = [\n join(this.projectPath, '.skillkit', 'skills', skillName),\n join(this.projectPath, 'skills', skillName),\n join(this.projectPath, '.claude', 'skills', skillName),\n ];\n\n for (const p of possiblePaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n return null;\n }\n\n private getAuthor(): string {\n // Try to get from git config\n try {\n const name = execSync('git config user.name', { encoding: 'utf-8' }).trim();\n const email = execSync('git config user.email', { encoding: 'utf-8' }).trim();\n return email ? `${name} <${email}>` : name;\n } catch {\n return 'Unknown';\n }\n }\n\n private detectCompatibleAgents(skillPath: string): AgentType[] {\n const agents: AgentType[] = [];\n\n // Check for format-specific files\n if (existsSync(join(skillPath, 'SKILL.md'))) {\n agents.push('claude-code', 'codex', 'gemini-cli', 'universal');\n }\n if (existsSync(join(skillPath, 'skill.mdc'))) {\n agents.push('cursor');\n }\n if (existsSync(join(skillPath, 'rules.md'))) {\n agents.push('windsurf');\n }\n\n return agents.length > 0 ? agents : ['universal'];\n }\n\n private extractFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n try {\n return this.parseYaml(match[1]) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n private parseYaml(content: string): unknown {\n return yamlParse(content);\n }\n\n private toYaml(obj: unknown): string {\n return yamlStringify(obj, { indent: 2 });\n }\n}\n\n/**\n * Create a team manager instance\n */\nexport function createTeamManager(projectPath: string): TeamManager {\n return new TeamManager(projectPath);\n}\n","/**\n * Skill Bundle\n *\n * Package multiple skills into a shareable bundle\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, basename, resolve, relative, dirname, sep } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { BundleManifest } from './types.js';\nimport type { AgentType } from '../types.js';\n\nconst BUNDLE_VERSION = 1;\n\n/**\n * Skill Bundle class for creating and managing skill bundles\n */\nexport class SkillBundle {\n private manifest: BundleManifest;\n private skills: Map<string, string> = new Map(); // skillName -> content\n\n constructor(name: string, author: string, description?: string) {\n this.manifest = {\n version: BUNDLE_VERSION,\n name,\n description,\n author,\n createdAt: new Date().toISOString(),\n skills: [],\n totalSize: 0,\n };\n }\n\n /**\n * Add a skill to the bundle\n */\n addSkill(skillPath: string, agents?: AgentType[]): void {\n const skillName = basename(skillPath);\n\n // Check for duplicate skill names\n if (this.skills.has(skillName)) {\n throw new Error(`Skill \"${skillName}\" already exists in bundle`);\n }\n\n const content = this.readSkillContent(skillPath);\n\n this.skills.set(skillName, content);\n this.manifest.skills.push({\n name: skillName,\n path: skillName, // Store only the skill name, not the full path\n agents: agents || this.detectAgents(skillPath),\n });\n\n this.manifest.totalSize += Buffer.byteLength(content, 'utf-8');\n }\n\n /**\n * Remove a skill from the bundle\n */\n removeSkill(skillName: string): boolean {\n const skill = this.manifest.skills.find((s) => s.name === skillName);\n if (!skill) return false;\n\n const content = this.skills.get(skillName);\n if (content) {\n this.manifest.totalSize -= Buffer.byteLength(content, 'utf-8');\n }\n\n this.skills.delete(skillName);\n this.manifest.skills = this.manifest.skills.filter((s) => s.name !== skillName);\n\n return true;\n }\n\n /**\n * Get bundle manifest\n */\n getManifest(): BundleManifest {\n return { ...this.manifest };\n }\n\n /**\n * Get all skill names in bundle\n */\n getSkillNames(): string[] {\n return this.manifest.skills.map((s) => s.name);\n }\n\n /**\n * Get skill content by name\n */\n getSkillContent(skillName: string): string | undefined {\n return this.skills.get(skillName);\n }\n\n /**\n * Calculate bundle checksum\n */\n getChecksum(): string {\n const contents: string[] = [];\n for (const [name, content] of this.skills.entries()) {\n contents.push(`${name}:${content}`);\n }\n contents.sort();\n return createHash('sha256').update(contents.join('\\n')).digest('hex').slice(0, 12);\n }\n\n private readSkillContent(skillPath: string): string {\n const contents: string[] = [];\n\n const readDir = (dir: string, prefix = ''): void => {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = prefix ? `${prefix}/${entry}` : entry;\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n readDir(fullPath, relativePath);\n } else if (stat.isFile()) {\n const content = readFileSync(fullPath, 'utf-8');\n contents.push(`--- ${relativePath} ---\\n${content}`);\n }\n }\n };\n\n if (statSync(skillPath).isDirectory()) {\n readDir(skillPath);\n } else {\n contents.push(readFileSync(skillPath, 'utf-8'));\n }\n\n return contents.join('\\n\\n');\n }\n\n private detectAgents(skillPath: string): AgentType[] {\n const agents: AgentType[] = [];\n\n // Handle single-file skills - check if skillPath is a file\n if (existsSync(skillPath) && statSync(skillPath).isFile()) {\n const fileName = basename(skillPath).toLowerCase();\n if (fileName === 'skill.md') {\n return ['claude-code', 'codex', 'gemini-cli', 'universal'];\n }\n if (fileName === 'skill.mdc') {\n return ['cursor'];\n }\n if (fileName === 'rules.md') {\n return ['windsurf'];\n }\n return ['universal'];\n }\n\n // Directory-based skill detection\n if (existsSync(join(skillPath, 'SKILL.md'))) {\n agents.push('claude-code', 'codex', 'gemini-cli', 'universal');\n }\n if (existsSync(join(skillPath, 'skill.mdc'))) {\n agents.push('cursor');\n }\n if (existsSync(join(skillPath, 'rules.md'))) {\n agents.push('windsurf');\n }\n\n return agents.length > 0 ? agents : ['universal'];\n }\n}\n\n/**\n * Create a new skill bundle\n */\nexport function createSkillBundle(\n name: string,\n author: string,\n description?: string\n): SkillBundle {\n return new SkillBundle(name, author, description);\n}\n\n/**\n * Export a bundle to a file\n */\nexport function exportBundle(\n bundle: SkillBundle,\n outputPath: string\n): { success: boolean; path?: string; error?: string } {\n try {\n const manifest = bundle.getManifest();\n const exportData = {\n manifest,\n skills: {} as Record<string, string>,\n };\n\n for (const skill of manifest.skills) {\n const content = bundle.getSkillContent(skill.name);\n if (content) {\n exportData.skills[skill.name] = content;\n }\n }\n\n const dir = dirname(outputPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Export as JSON (could be changed to tarball for better compression)\n writeFileSync(outputPath, JSON.stringify(exportData, null, 2), 'utf-8');\n\n return { success: true, path: outputPath };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Import a bundle from a file\n */\nexport function importBundle(\n bundlePath: string,\n targetDir: string,\n options: { overwrite?: boolean } = {}\n): { success: boolean; imported: string[]; errors: string[] } {\n const imported: string[] = [];\n const errors: string[] = [];\n\n try {\n const content = readFileSync(bundlePath, 'utf-8');\n const data = JSON.parse(content) as {\n manifest: BundleManifest;\n skills: Record<string, string>;\n };\n\n // Resolve targetDir to absolute path for consistent path containment checks\n const absoluteTargetDir = resolve(targetDir);\n\n for (const skill of data.manifest.skills) {\n // Validate skill name to prevent path traversal attacks\n if (!skill.name || skill.name.includes('/') || skill.name.includes('\\\\') ||\n skill.name === '..' || skill.name === '.' || skill.name.startsWith('.')) {\n errors.push(`Skill has invalid name: ${skill.name}`);\n continue;\n }\n\n const skillContent = data.skills[skill.name];\n if (!skillContent) {\n errors.push(`Skill \"${skill.name}\" has no content in bundle`);\n continue;\n }\n\n const skillDir = join(absoluteTargetDir, skill.name);\n\n // Double-check the resolved path is within target directory (cross-platform)\n const resolvedSkillDir = resolve(skillDir);\n const relativeToTarget = relative(absoluteTargetDir, resolvedSkillDir);\n if (relativeToTarget.startsWith('..') || relativeToTarget.startsWith(sep)) {\n errors.push(`Skill \"${skill.name}\" would escape target directory`);\n continue;\n }\n\n // Check if exists\n if (existsSync(skillDir) && !options.overwrite) {\n errors.push(`Skill \"${skill.name}\" already exists (use --overwrite)`);\n continue;\n }\n\n // Create skill directory\n if (!existsSync(skillDir)) {\n mkdirSync(skillDir, { recursive: true });\n }\n\n // Parse and write skill files\n const files = parseSkillContent(skillContent);\n for (const [filePath, fileContent] of Object.entries(files)) {\n // Validate path to prevent path traversal attacks\n const fullPath = resolve(skillDir, filePath);\n const relativeToSkill = relative(skillDir, fullPath);\n\n // Check for path traversal (cross-platform)\n if (relativeToSkill.startsWith('..') || relativeToSkill.startsWith(sep)) {\n errors.push(`Skill \"${skill.name}\" contains invalid file path: ${filePath}`);\n continue;\n }\n\n const fileDir = dirname(fullPath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n writeFileSync(fullPath, fileContent, 'utf-8');\n }\n\n imported.push(skill.name);\n }\n\n return { success: errors.length === 0, imported, errors };\n } catch (err) {\n errors.push(err instanceof Error ? err.message : 'Unknown error');\n return { success: false, imported, errors };\n }\n}\n\n/**\n * Parse skill content back into individual files\n */\nfunction parseSkillContent(content: string): Record<string, string> {\n const files: Record<string, string> = {};\n\n // Match file headers at start of string OR after newline\n // This ensures the first file isn't dropped when content starts with \"--- file ---\"\n const sections = content.split(/(?:^|\\n)--- ([^\\n]+) ---\\n/);\n\n // sections[0] is content before first header (empty if content starts with header)\n // Then alternating: filePath, fileContent, filePath, fileContent, ...\n let i = 1;\n while (i < sections.length) {\n const filePath = sections[i];\n const fileContent = sections[i + 1] || '';\n if (filePath && !filePath.startsWith('---')) {\n files[filePath.trim()] = fileContent;\n }\n i += 2;\n }\n\n // If no file markers found, assume it's a single SKILL.md\n if (Object.keys(files).length === 0 && content.trim()) {\n files['SKILL.md'] = content;\n }\n\n return files;\n}\n","/**\n * Plugin Manager\n *\n * Manages plugin registration, lifecycle, and execution\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type {\n Plugin,\n PluginMetadata,\n PluginHooks,\n PluginContext,\n PluginConfig,\n CommandPlugin,\n} from './types.js';\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill, FormatTranslator } from '../translator/types.js';\nimport type { GitProviderAdapter } from '../providers/base.js';\n\nconst PLUGINS_DIR = '.skillkit/plugins';\nconst PLUGINS_CONFIG_FILE = 'plugins.json';\n\ninterface PluginsState {\n version: number;\n plugins: Record<string, {\n enabled: boolean;\n config: PluginConfig;\n loadedAt?: string;\n }>;\n}\n\n/**\n * Plugin Manager class\n */\nexport class PluginManager {\n private projectPath: string;\n private plugins: Map<string, Plugin> = new Map();\n private translators: Map<string, FormatTranslator> = new Map();\n private providers: Map<string, GitProviderAdapter> = new Map();\n private commands: Map<string, CommandPlugin> = new Map();\n private hooks: Map<string, PluginHooks> = new Map();\n private state: PluginsState;\n private context: PluginContext;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.state = this.loadState();\n this.context = this.createContext();\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise<void> {\n const name = plugin.metadata.name;\n\n // Check if already registered\n if (this.plugins.has(name)) {\n throw new Error(`Plugin \"${name}\" is already registered`);\n }\n\n // Check dependencies\n if (plugin.metadata.dependencies) {\n for (const dep of plugin.metadata.dependencies) {\n if (!this.plugins.has(dep)) {\n throw new Error(`Plugin \"${name}\" requires \"${dep}\" which is not loaded`);\n }\n }\n }\n\n // Initialize plugin\n if (plugin.init) {\n await plugin.init(this.context);\n }\n\n // Register translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n this.translators.set(t.agentType, t.translator);\n }\n }\n\n // Register providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n this.providers.set(p.providerName, p.provider);\n }\n }\n\n // Register commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n this.commands.set(c.name, c);\n if (c.aliases) {\n for (const alias of c.aliases) {\n this.commands.set(alias, c);\n }\n }\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n this.hooks.set(name, plugin.hooks);\n\n // Call onLoad hook\n if (plugin.hooks.onLoad) {\n await plugin.hooks.onLoad(this.context);\n }\n }\n\n // Store plugin\n this.plugins.set(name, plugin);\n\n // Update state\n this.state.plugins[name] = {\n enabled: true,\n config: {},\n loadedAt: new Date().toISOString(),\n };\n this.saveState();\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" is not registered`);\n }\n\n // Call onUnload hook\n const hooks = this.hooks.get(name);\n if (hooks?.onUnload) {\n await hooks.onUnload();\n }\n\n // Cleanup\n if (plugin.destroy) {\n await plugin.destroy();\n }\n\n // Remove translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n this.translators.delete(t.agentType);\n }\n }\n\n // Remove providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n this.providers.delete(p.providerName);\n }\n }\n\n // Remove commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n this.commands.delete(c.name);\n if (c.aliases) {\n for (const alias of c.aliases) {\n this.commands.delete(alias);\n }\n }\n }\n }\n\n // Remove hooks\n this.hooks.delete(name);\n\n // Remove plugin\n this.plugins.delete(name);\n\n // Update state\n delete this.state.plugins[name];\n this.saveState();\n }\n\n /**\n * Get a registered plugin\n */\n getPlugin(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get plugin metadata for all plugins\n */\n listPlugins(): PluginMetadata[] {\n return this.getAllPlugins().map((p) => p.metadata);\n }\n\n /**\n * Get a translator by agent type\n */\n getTranslator(agentType: AgentType | string): FormatTranslator | undefined {\n return this.translators.get(agentType);\n }\n\n /**\n * Get all registered translators\n */\n getAllTranslators(): Map<string, FormatTranslator> {\n return new Map(this.translators);\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): GitProviderAdapter | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get all registered providers\n */\n getAllProviders(): Map<string, GitProviderAdapter> {\n return new Map(this.providers);\n }\n\n /**\n * Get a command by name\n */\n getCommand(name: string): CommandPlugin | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Get all registered commands\n */\n getAllCommands(): CommandPlugin[] {\n return Array.from(new Set(this.commands.values()));\n }\n\n /**\n * Execute hooks for an event\n */\n async executeHook<K extends keyof PluginHooks>(\n hookName: K,\n ...args: Parameters<NonNullable<PluginHooks[K]>>\n ): Promise<void> {\n for (const [, hooks] of this.hooks) {\n const hook = hooks[hookName];\n if (hook) {\n await (hook as (...args: unknown[]) => Promise<void>)(...args);\n }\n }\n }\n\n /**\n * Execute beforeTranslate hooks (returns transformed skill)\n */\n async executeBeforeTranslate(\n skill: CanonicalSkill,\n targetAgent: AgentType\n ): Promise<CanonicalSkill> {\n let result = skill;\n for (const [, hooks] of this.hooks) {\n if (hooks.beforeTranslate) {\n result = await hooks.beforeTranslate(result, targetAgent);\n }\n }\n return result;\n }\n\n /**\n * Execute afterTranslate hooks (returns transformed content)\n */\n async executeAfterTranslate(\n content: string,\n targetAgent: AgentType\n ): Promise<string> {\n let result = content;\n for (const [, hooks] of this.hooks) {\n if (hooks.afterTranslate) {\n result = await hooks.afterTranslate(result, targetAgent);\n }\n }\n return result;\n }\n\n /**\n * Set plugin configuration\n */\n setPluginConfig(name: string, config: PluginConfig): void {\n if (!this.state.plugins[name]) {\n this.state.plugins[name] = { enabled: true, config };\n } else {\n this.state.plugins[name].config = config;\n }\n this.saveState();\n }\n\n /**\n * Get plugin configuration\n */\n getPluginConfig(name: string): PluginConfig | undefined {\n return this.state.plugins[name]?.config;\n }\n\n /**\n * Enable a plugin\n */\n enablePlugin(name: string): void {\n if (this.state.plugins[name]) {\n this.state.plugins[name].enabled = true;\n this.saveState();\n }\n }\n\n /**\n * Disable a plugin\n */\n disablePlugin(name: string): void {\n if (this.state.plugins[name]) {\n this.state.plugins[name].enabled = false;\n this.saveState();\n }\n }\n\n /**\n * Check if plugin is enabled\n */\n isPluginEnabled(name: string): boolean {\n return this.state.plugins[name]?.enabled ?? true;\n }\n\n // Private helpers\n\n private loadState(): PluginsState {\n const statePath = join(this.projectPath, PLUGINS_DIR, PLUGINS_CONFIG_FILE);\n if (existsSync(statePath)) {\n try {\n return JSON.parse(readFileSync(statePath, 'utf-8'));\n } catch {\n // Return default state on error\n }\n }\n return { version: 1, plugins: {} };\n }\n\n private saveState(): void {\n const pluginsDir = join(this.projectPath, PLUGINS_DIR);\n if (!existsSync(pluginsDir)) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n const statePath = join(pluginsDir, PLUGINS_CONFIG_FILE);\n writeFileSync(statePath, JSON.stringify(this.state, null, 2), 'utf-8');\n }\n\n private createContext(): PluginContext {\n return {\n projectPath: this.projectPath,\n skillkitVersion: '1.4.0',\n config: {},\n log: {\n info: (msg) => console.log(`[plugin] ${msg}`),\n warn: (msg) => console.warn(`[plugin] ${msg}`),\n error: (msg) => console.error(`[plugin] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) console.log(`[plugin:debug] ${msg}`);\n },\n },\n getTranslator: (agentType) => this.translators.get(agentType),\n getProvider: (name) => this.providers.get(name),\n };\n }\n}\n\n/**\n * Create a plugin manager instance\n */\nexport function createPluginManager(projectPath: string): PluginManager {\n return new PluginManager(projectPath);\n}\n","/**\n * Plugin Loader\n *\n * Loads plugins from various sources:\n * - Local files\n * - npm packages\n * - Git repositories\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname, basename, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { Plugin, PluginMetadata } from './types.js';\n\n/**\n * Plugin Loader class\n */\nexport class PluginLoader {\n /**\n * Load a plugin from a file path\n */\n async loadFromFile(filePath: string): Promise<Plugin> {\n if (!existsSync(filePath)) {\n throw new Error(`Plugin file not found: ${filePath}`);\n }\n\n const ext = extname(filePath);\n if (ext !== '.js' && ext !== '.mjs') {\n throw new Error(`Unsupported plugin file type: ${ext}. Only .js and .mjs files are supported.`);\n }\n\n try {\n // Use dynamic import for ES modules\n const fileUrl = pathToFileURL(filePath).href;\n const module = await import(fileUrl);\n\n // Plugin can be default export or named export\n const plugin = module.default || module.plugin;\n\n if (!plugin || !plugin.metadata) {\n throw new Error('Invalid plugin: missing metadata');\n }\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from ${filePath}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Load a plugin from an npm package\n */\n async loadFromPackage(packageName: string): Promise<Plugin> {\n try {\n // Try to resolve the package\n const module = await import(packageName);\n const plugin = module.default || module.plugin;\n\n if (!plugin || !plugin.metadata) {\n throw new Error('Invalid plugin: missing metadata');\n }\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from package ${packageName}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Load a plugin from a JSON definition (for simple plugins)\n */\n loadFromJson(jsonPath: string): Plugin {\n if (!existsSync(jsonPath)) {\n throw new Error(`Plugin JSON not found: ${jsonPath}`);\n }\n\n try {\n const content = readFileSync(jsonPath, 'utf-8');\n const data = JSON.parse(content);\n\n if (!data.metadata) {\n throw new Error('Invalid plugin JSON: missing metadata');\n }\n\n // JSON plugins can only define metadata, hooks need code\n const plugin: Plugin = {\n metadata: data.metadata,\n };\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from ${jsonPath}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Scan a directory for plugins\n */\n async scanDirectory(dirPath: string): Promise<PluginMetadata[]> {\n if (!existsSync(dirPath)) {\n return [];\n }\n\n const plugins: PluginMetadata[] = [];\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n\n // Guard against unreadable entries (permission denied, broken symlinks)\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n // Skip unreadable entries\n continue;\n }\n\n if (stat.isDirectory()) {\n // Check for package.json or plugin.json\n const pkgPath = join(fullPath, 'package.json');\n const pluginPath = join(fullPath, 'plugin.json');\n\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n // Validate required fields before pushing\n if ((pkg.skillkitPlugin || pkg.keywords?.includes('skillkit-plugin')) &&\n pkg.name && typeof pkg.name === 'string' &&\n pkg.version && typeof pkg.version === 'string') {\n plugins.push({\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n author: pkg.author,\n homepage: pkg.homepage,\n });\n }\n } catch {\n // Skip invalid packages\n }\n } else if (existsSync(pluginPath)) {\n try {\n const data = JSON.parse(readFileSync(pluginPath, 'utf-8'));\n // Validate metadata has required fields\n if (data.metadata &&\n data.metadata.name && typeof data.metadata.name === 'string' &&\n data.metadata.version && typeof data.metadata.version === 'string') {\n plugins.push(data.metadata);\n }\n } catch {\n // Skip invalid plugins\n }\n }\n } else if (stat.isFile()) {\n // Check for plugin files\n const ext = extname(entry);\n if (ext === '.js' || ext === '.mjs') {\n const name = basename(entry, ext);\n if (name.includes('plugin') || name.startsWith('skillkit-')) {\n plugins.push({\n name,\n version: '0.0.0', // Unknown until loaded\n description: `Plugin file: ${entry}`,\n });\n }\n }\n }\n }\n\n return plugins;\n }\n\n /**\n * Validate a plugin structure\n */\n private validatePlugin(plugin: Plugin): Plugin {\n const { metadata } = plugin;\n\n // Validate required metadata\n if (!metadata.name) {\n throw new Error('Plugin metadata must include a name');\n }\n if (!metadata.version) {\n throw new Error('Plugin metadata must include a version');\n }\n\n // Validate name format (allow scoped npm names like @scope/name)\n if (!/^(?:@[a-z0-9-]+\\/)?[a-z0-9-]+$/.test(metadata.name)) {\n throw new Error(\n 'Plugin name must be lowercase alphanumeric with hyphens only (scoped names like @scope/name are allowed)'\n );\n }\n\n // Validate version format (loose semver check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(metadata.version)) {\n throw new Error('Plugin version must be semver format (e.g., 1.0.0)');\n }\n\n // Validate translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n if (!t.agentType || !t.translator) {\n throw new Error('Translator plugin must include agentType and translator');\n }\n }\n }\n\n // Validate providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n if (!p.providerName || !p.provider) {\n throw new Error('Provider plugin must include providerName and provider');\n }\n }\n }\n\n // Validate commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n if (!c.name || !c.handler) {\n throw new Error('Command plugin must include name and handler');\n }\n }\n }\n\n return plugin;\n }\n}\n\n/**\n * Load a plugin from a file\n */\nexport async function loadPlugin(source: string): Promise<Plugin> {\n const loader = new PluginLoader();\n\n // Determine source type\n // Check for local file paths: absolute, relative (./, .., paths with /), Windows paths, or tilde\n const isLocalPath =\n source.startsWith('.') || // ./, ../, .hidden\n isAbsolute(source) || // /abs/path or C:\\path\n (source.includes('/') && !source.startsWith('@')) || // plugins/x.js (but not @scope/pkg)\n source.includes('\\\\') || // Windows backslash\n source.startsWith('~'); // ~/path\n\n if (isLocalPath) {\n // File path\n if (source.endsWith('.json')) {\n return loader.loadFromJson(source);\n }\n return loader.loadFromFile(source);\n } else if (source.startsWith('@') || /^[a-z0-9-]+$/.test(source)) {\n // npm package\n return loader.loadFromPackage(source);\n } else {\n throw new Error(`Cannot determine plugin source type: ${source}`);\n }\n}\n\n/**\n * Load all plugins from a directory\n */\nexport async function loadPluginsFromDirectory(dirPath: string): Promise<Plugin[]> {\n const loader = new PluginLoader();\n const plugins: Plugin[] = [];\n\n if (!existsSync(dirPath)) {\n return plugins;\n }\n\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n\n // Guard against unreadable entries (permission denied, broken symlinks)\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n // Skip unreadable entries\n continue;\n }\n\n try {\n if (stat.isDirectory()) {\n // Try to load from directory (check ESM .mjs files first, then .js)\n const indexMjsPath = join(fullPath, 'index.mjs');\n const indexPath = join(fullPath, 'index.js');\n const mainMjsPath = join(fullPath, 'plugin.mjs');\n const mainPath = join(fullPath, 'plugin.js');\n const jsonPath = join(fullPath, 'plugin.json');\n\n if (existsSync(indexMjsPath)) {\n plugins.push(await loader.loadFromFile(indexMjsPath));\n } else if (existsSync(indexPath)) {\n plugins.push(await loader.loadFromFile(indexPath));\n } else if (existsSync(mainMjsPath)) {\n plugins.push(await loader.loadFromFile(mainMjsPath));\n } else if (existsSync(mainPath)) {\n plugins.push(await loader.loadFromFile(mainPath));\n } else if (existsSync(jsonPath)) {\n plugins.push(loader.loadFromJson(jsonPath));\n }\n } else if (stat.isFile()) {\n const ext = extname(entry);\n if (ext === '.js' || ext === '.mjs') {\n plugins.push(await loader.loadFromFile(fullPath));\n } else if (ext === '.json' && entry.includes('plugin')) {\n plugins.push(loader.loadFromJson(fullPath));\n }\n }\n } catch (err) {\n // Log but continue loading other plugins\n console.warn(`Failed to load plugin from ${fullPath}: ${err}`);\n }\n }\n\n return plugins;\n}\n","/**\n * Methodology Manager\n *\n * Manages methodology pack installation, syncing, and lifecycle.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport type {\n MethodologyPack,\n MethodologySkill,\n MethodologyState,\n MethodologyManagerOptions,\n InstallResult,\n MethodologySyncResult,\n MethodologySearchQuery,\n MethodologySearchResult,\n} from './types.js';\nimport { MethodologyLoader, createMethodologyLoader } from './loader.js';\nimport { TranslatorRegistry } from '../translator/registry.js';\n\nconst METHODOLOGY_STATE_FILE = '.skillkit/methodology.json';\n\n/**\n * Methodology Manager class\n */\nexport class MethodologyManager {\n private projectPath: string;\n private loader: MethodologyLoader;\n private state: MethodologyState;\n private autoSync: boolean;\n\n constructor(options: MethodologyManagerOptions) {\n this.projectPath = options.projectPath;\n this.loader = createMethodologyLoader(options.packsDir);\n this.autoSync = options.autoSync ?? true;\n this.state = this.loadState();\n }\n\n /**\n * Install a methodology pack\n */\n async installPack(packName: string): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n // Load pack\n const pack = await this.loader.loadPack(packName);\n if (!pack) {\n result.success = false;\n result.failed.push({\n name: packName,\n error: `Pack not found: ${packName}`,\n });\n return result;\n }\n\n // Check if already installed\n if (this.state.installedPacks[packName]) {\n const installedVersion = this.state.installedPacks[packName].version;\n if (installedVersion === pack.version) {\n result.skipped.push(packName);\n return result;\n }\n }\n\n // Install each skill\n const skills = await this.loader.loadPackSkills(packName);\n const installedSkillNames: string[] = [];\n\n for (const skill of skills) {\n try {\n await this.installSkillLocally(skill);\n installedSkillNames.push(skill.id);\n result.installed.push(skill.id);\n } catch (e) {\n result.failed.push({\n name: skill.id,\n error: e instanceof Error ? e.message : 'Unknown error',\n });\n }\n }\n\n // Update state\n this.state.installedPacks[packName] = {\n version: pack.version,\n installedAt: new Date().toISOString(),\n skills: installedSkillNames,\n autoSync: this.autoSync,\n };\n this.saveState();\n\n // Auto-sync if enabled\n if (this.autoSync) {\n await this.syncPack(packName);\n }\n\n result.success = result.failed.length === 0;\n return result;\n }\n\n /**\n * Install all available packs\n */\n async installAllPacks(): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const packs = await this.loader.loadAllPacks();\n\n for (const pack of packs) {\n const packResult = await this.installPack(pack.name);\n result.installed.push(...packResult.installed);\n result.skipped.push(...packResult.skipped);\n result.failed.push(...packResult.failed);\n }\n\n result.success = result.failed.length === 0;\n return result;\n }\n\n /**\n * Install a single skill by ID\n */\n async installSkill(skillId: string): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const skill = await this.loader.getSkillById(skillId);\n if (!skill) {\n result.success = false;\n result.failed.push({\n name: skillId,\n error: `Skill not found: ${skillId}`,\n });\n return result;\n }\n\n // Check if already installed\n if (this.state.installedSkills[skillId]) {\n const installedVersion = this.state.installedSkills[skillId].version;\n if (installedVersion === skill.version) {\n result.skipped.push(skillId);\n return result;\n }\n }\n\n try {\n await this.installSkillLocally(skill);\n result.installed.push(skillId);\n\n // Update state\n this.state.installedSkills[skillId] = {\n version: skill.version,\n pack: skill.pack,\n installedAt: new Date().toISOString(),\n syncedAgents: [],\n };\n this.saveState();\n\n // Auto-sync if enabled\n if (this.autoSync) {\n await this.syncSkill(skillId);\n }\n } catch (e) {\n result.success = false;\n result.failed.push({\n name: skillId,\n error: e instanceof Error ? e.message : 'Unknown error',\n });\n }\n\n return result;\n }\n\n /**\n * Uninstall a pack\n */\n async uninstallPack(packName: string): Promise<void> {\n const packInfo = this.state.installedPacks[packName];\n if (!packInfo) {\n throw new Error(`Pack not installed: ${packName}`);\n }\n\n // Remove all skills from the pack\n for (const skillId of packInfo.skills) {\n await this.removeSkillLocally(skillId);\n delete this.state.installedSkills[skillId];\n }\n\n // Remove pack from state\n delete this.state.installedPacks[packName];\n this.saveState();\n }\n\n /**\n * Uninstall a skill\n */\n async uninstallSkill(skillId: string): Promise<void> {\n const skillInfo = this.state.installedSkills[skillId];\n if (!skillInfo) {\n throw new Error(`Skill not installed: ${skillId}`);\n }\n\n await this.removeSkillLocally(skillId);\n delete this.state.installedSkills[skillId];\n this.saveState();\n }\n\n /**\n * Sync a pack to all detected agents\n */\n async syncPack(packName: string, agents?: AgentType[]): Promise<MethodologySyncResult> {\n const result: MethodologySyncResult = {\n success: true,\n synced: [],\n failed: [],\n };\n\n const packInfo = this.state.installedPacks[packName];\n if (!packInfo) {\n throw new Error(`Pack not installed: ${packName}`);\n }\n\n for (const skillId of packInfo.skills) {\n const skillResult = await this.syncSkill(skillId, agents);\n result.synced.push(...skillResult.synced);\n result.failed.push(...skillResult.failed);\n }\n\n result.success = result.failed.length === 0;\n return result;\n }\n\n /**\n * Sync a skill to all detected agents\n */\n async syncSkill(skillId: string, agents?: AgentType[]): Promise<MethodologySyncResult> {\n const result: MethodologySyncResult = {\n success: true,\n synced: [],\n failed: [],\n };\n\n const skill = await this.loader.getSkillById(skillId);\n if (!skill) {\n throw new Error(`Skill not found: ${skillId}`);\n }\n\n const targetAgents = agents || this.detectAgents();\n const registry = new TranslatorRegistry();\n const syncedAgents: AgentType[] = [];\n\n for (const agent of targetAgents) {\n try {\n // Translate skill to target agent format\n const translationResult = registry.translateContent(skill.content, agent, {\n sourceFilename: 'SKILL.md',\n });\n\n if (!translationResult.success) {\n result.failed.push({\n skill: skillId,\n agent,\n error: translationResult.incompatible?.join(', ') || 'Translation failed',\n });\n continue;\n }\n\n // Write to agent's skills directory\n await this.writeSkillToAgent(skillId, translationResult.content, agent);\n\n syncedAgents.push(agent);\n result.synced.push({ skill: skillId, agents: [agent] });\n } catch (e) {\n result.failed.push({\n skill: skillId,\n agent,\n error: e instanceof Error ? e.message : 'Unknown error',\n });\n }\n }\n\n // Update synced agents in state\n if (this.state.installedSkills[skillId]) {\n this.state.installedSkills[skillId].syncedAgents = syncedAgents;\n }\n this.state.lastSync = new Date().toISOString();\n this.saveState();\n\n result.success = result.failed.length === 0;\n return result;\n }\n\n /**\n * Sync all installed skills\n */\n async syncAll(agents?: AgentType[]): Promise<MethodologySyncResult> {\n const result: MethodologySyncResult = {\n success: true,\n synced: [],\n failed: [],\n };\n\n const allSkillIds = [\n ...Object.keys(this.state.installedSkills),\n ...Object.values(this.state.installedPacks).flatMap((p) => p.skills),\n ];\n\n const uniqueSkillIds = [...new Set(allSkillIds)];\n\n for (const skillId of uniqueSkillIds) {\n const skillResult = await this.syncSkill(skillId, agents);\n result.synced.push(...skillResult.synced);\n result.failed.push(...skillResult.failed);\n }\n\n result.success = result.failed.length === 0;\n return result;\n }\n\n /**\n * List installed packs\n */\n listInstalledPacks(): Array<{ name: string; version: string; skills: string[] }> {\n return Object.entries(this.state.installedPacks).map(([name, info]) => ({\n name,\n version: info.version,\n skills: info.skills,\n }));\n }\n\n /**\n * List installed skills\n */\n listInstalledSkills(): Array<{\n id: string;\n version: string;\n pack?: string;\n syncedAgents: AgentType[];\n }> {\n const skillsFromPacks = Object.values(this.state.installedPacks).flatMap(\n (pack) =>\n pack.skills.map((skillId) => ({\n id: skillId,\n version: this.state.installedSkills[skillId]?.version || pack.version,\n pack: skillId.split('/')[0],\n syncedAgents: this.state.installedSkills[skillId]?.syncedAgents || [],\n }))\n );\n\n const individualSkills = Object.entries(this.state.installedSkills)\n .filter(([id]) => !skillsFromPacks.some((s) => s.id === id))\n .map(([id, info]) => ({\n id,\n version: info.version,\n pack: info.pack,\n syncedAgents: info.syncedAgents,\n }));\n\n return [...skillsFromPacks, ...individualSkills];\n }\n\n /**\n * List available packs (not yet installed)\n */\n async listAvailablePacks(): Promise<MethodologyPack[]> {\n const allPacks = await this.loader.loadAllPacks();\n return allPacks.filter((pack) => !this.state.installedPacks[pack.name]);\n }\n\n /**\n * Search methodology skills\n */\n async search(query: MethodologySearchQuery): Promise<MethodologySearchResult> {\n const packs = await this.loader.loadAllPacks();\n const allSkills: MethodologySkill[] = [];\n\n for (const pack of packs) {\n const skills = await this.loader.loadPackSkills(pack.name);\n allSkills.push(...skills);\n }\n\n let matchingSkills = allSkills;\n let matchingPacks = packs;\n\n // Filter by query string\n if (query.query) {\n const lowerQuery = query.query.toLowerCase();\n matchingSkills = matchingSkills.filter(\n (skill) =>\n skill.name.toLowerCase().includes(lowerQuery) ||\n skill.description.toLowerCase().includes(lowerQuery) ||\n skill.tags.some((t) => t.toLowerCase().includes(lowerQuery))\n );\n matchingPacks = matchingPacks.filter(\n (pack) =>\n pack.name.toLowerCase().includes(lowerQuery) ||\n pack.description.toLowerCase().includes(lowerQuery) ||\n pack.tags.some((t) => t.toLowerCase().includes(lowerQuery))\n );\n }\n\n // Filter by tags\n if (query.tags && query.tags.length > 0) {\n const lowerTags = query.tags.map((t) => t.toLowerCase());\n matchingSkills = matchingSkills.filter((skill) =>\n lowerTags.some((tag) =>\n skill.tags.some((t) => t.toLowerCase() === tag)\n )\n );\n matchingPacks = matchingPacks.filter((pack) =>\n lowerTags.some((tag) => pack.tags.some((t) => t.toLowerCase() === tag))\n );\n }\n\n // Filter by pack\n if (query.pack) {\n matchingSkills = matchingSkills.filter(\n (skill) => skill.pack === query.pack\n );\n matchingPacks = matchingPacks.filter((pack) => pack.name === query.pack);\n }\n\n // Filter by difficulty\n if (query.difficulty) {\n matchingSkills = matchingSkills.filter(\n (skill) => skill.metadata.difficulty === query.difficulty\n );\n }\n\n return {\n skills: matchingSkills,\n packs: matchingPacks,\n total: matchingSkills.length + matchingPacks.length,\n };\n }\n\n /**\n * Get the loader instance\n */\n getLoader(): MethodologyLoader {\n return this.loader;\n }\n\n // Private helpers\n\n private loadState(): MethodologyState {\n const statePath = join(this.projectPath, METHODOLOGY_STATE_FILE);\n if (existsSync(statePath)) {\n try {\n return JSON.parse(readFileSync(statePath, 'utf-8'));\n } catch {\n // Return default state on error\n }\n }\n return {\n version: 1,\n installedPacks: {},\n installedSkills: {},\n };\n }\n\n private saveState(): void {\n const statePath = join(this.projectPath, METHODOLOGY_STATE_FILE);\n const dir = dirname(statePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(statePath, JSON.stringify(this.state, null, 2), 'utf-8');\n }\n\n private async installSkillLocally(skill: MethodologySkill): Promise<void> {\n // Copy skill to local .skillkit/methodology/skills directory\n const skillsDir = join(this.projectPath, '.skillkit', 'methodology', 'skills');\n const skillDir = join(skillsDir, skill.pack, skill.id.split('/')[1]);\n\n if (!existsSync(skillDir)) {\n mkdirSync(skillDir, { recursive: true });\n }\n\n const targetPath = join(skillDir, 'SKILL.md');\n writeFileSync(targetPath, skill.content, 'utf-8');\n }\n\n private async removeSkillLocally(_skillId: string): Promise<void> {\n // Note: We don't delete the skill directory to avoid accidental data loss\n // The skill is just marked as uninstalled in state\n // Future enhancement: add optional force delete flag\n }\n\n private async writeSkillToAgent(\n skillId: string,\n content: string,\n agent: AgentType\n ): Promise<void> {\n const agentDirs: Record<string, string> = {\n 'claude-code': '.claude/skills',\n cursor: '.cursor/skills',\n codex: '.codex/skills',\n 'gemini-cli': '.gemini/skills',\n opencode: '.opencode/skills',\n antigravity: '.antigravity/skills',\n amp: '.amp/skills',\n clawdbot: '.clawdbot/skills',\n droid: '.factory/skills',\n 'github-copilot': '.github/skills',\n goose: '.goose/skills',\n kilo: '.kilocode/skills',\n 'kiro-cli': '.kiro/skills',\n roo: '.roo/skills',\n trae: '.trae/skills',\n windsurf: '.windsurf/skills',\n universal: 'skills',\n };\n\n const agentDir = agentDirs[agent];\n if (!agentDir) {\n throw new Error(`Unknown agent: ${agent}`);\n }\n\n const skillsDir = join(this.projectPath, agentDir);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n // Determine filename based on agent format\n const skillName = skillId.split('/')[1];\n let filename: string;\n\n if (agent === 'cursor') {\n filename = `${skillName}.mdc`;\n } else if (agent === 'github-copilot' || agent === 'windsurf') {\n filename = `${skillName}.md`;\n } else {\n filename = `${skillName}.md`;\n }\n\n const targetPath = join(skillsDir, filename);\n writeFileSync(targetPath, content, 'utf-8');\n }\n\n private detectAgents(): AgentType[] {\n const agents: AgentType[] = [];\n const agentDirs: [AgentType, string][] = [\n ['claude-code', '.claude'],\n ['cursor', '.cursor'],\n ['codex', '.codex'],\n ['gemini-cli', '.gemini'],\n ['opencode', '.opencode'],\n ['antigravity', '.antigravity'],\n ['amp', '.amp'],\n ['clawdbot', '.clawdbot'],\n ['droid', '.factory'],\n ['github-copilot', '.github'],\n ['goose', '.goose'],\n ['kilo', '.kilocode'],\n ['kiro-cli', '.kiro'],\n ['roo', '.roo'],\n ['trae', '.trae'],\n ['windsurf', '.windsurf'],\n ];\n\n for (const [agent, dir] of agentDirs) {\n if (existsSync(join(this.projectPath, dir))) {\n agents.push(agent);\n }\n }\n\n // Always include universal\n agents.push('universal');\n\n return agents;\n }\n}\n\n/**\n * Create a methodology manager instance\n */\nexport function createMethodologyManager(\n options: MethodologyManagerOptions\n): MethodologyManager {\n return new MethodologyManager(options);\n}\n","/**\n * Methodology Loader\n *\n * Loads methodology packs and skills from the built-in packs directory\n * and custom locations.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type {\n MethodologyPack,\n MethodologySkill,\n MethodologySkillMetadata,\n} from './types.js';\nimport { validatePackDirectory, extractSkillMetadata } from './validator.js';\n\n// Get the directory of this module\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Built-in packs directory (relative to this file in dist)\nconst BUILTIN_PACKS_DIR = join(__dirname, 'packs');\n\n/**\n * Methodology Loader class\n */\nexport class MethodologyLoader {\n private packsDir: string;\n private loadedPacks: Map<string, MethodologyPack> = new Map();\n private loadedSkills: Map<string, MethodologySkill> = new Map();\n\n constructor(customPacksDir?: string) {\n this.packsDir = customPacksDir || BUILTIN_PACKS_DIR;\n }\n\n /**\n * Load all available packs\n */\n async loadAllPacks(): Promise<MethodologyPack[]> {\n const packs: MethodologyPack[] = [];\n\n if (!existsSync(this.packsDir)) {\n return packs;\n }\n\n const packDirs = readdirSync(this.packsDir).filter((name) => {\n const packPath = join(this.packsDir, name);\n return statSync(packPath).isDirectory();\n });\n\n for (const packName of packDirs) {\n try {\n const pack = await this.loadPack(packName);\n if (pack) {\n packs.push(pack);\n }\n } catch {\n // Skip invalid packs\n }\n }\n\n return packs;\n }\n\n /**\n * Load a specific pack by name\n */\n async loadPack(packName: string): Promise<MethodologyPack | null> {\n // Check cache\n if (this.loadedPacks.has(packName)) {\n return this.loadedPacks.get(packName)!;\n }\n\n const packPath = join(this.packsDir, packName);\n const manifestPath = join(packPath, 'pack.json');\n\n if (!existsSync(manifestPath)) {\n return null;\n }\n\n // Validate pack\n const validation = validatePackDirectory(packPath);\n if (!validation.valid) {\n throw new Error(\n `Invalid pack \"${packName}\": ${validation.errors.map((e) => e.message).join(', ')}`\n );\n }\n\n // Load manifest\n const manifest = JSON.parse(\n readFileSync(manifestPath, 'utf-8')\n ) as MethodologyPack;\n\n // Cache and return\n this.loadedPacks.set(packName, manifest);\n return manifest;\n }\n\n /**\n * Load all skills from a pack\n */\n async loadPackSkills(packName: string): Promise<MethodologySkill[]> {\n const pack = await this.loadPack(packName);\n if (!pack) {\n throw new Error(`Pack not found: ${packName}`);\n }\n\n const skills: MethodologySkill[] = [];\n\n for (const skillName of pack.skills) {\n const skill = await this.loadSkill(packName, skillName);\n if (skill) {\n skills.push(skill);\n }\n }\n\n return skills;\n }\n\n /**\n * Load a specific skill\n */\n async loadSkill(\n packName: string,\n skillName: string\n ): Promise<MethodologySkill | null> {\n const skillId = `${packName}/${skillName}`;\n\n // Check cache\n if (this.loadedSkills.has(skillId)) {\n return this.loadedSkills.get(skillId)!;\n }\n\n const skillPath = join(this.packsDir, packName, skillName, 'SKILL.md');\n\n if (!existsSync(skillPath)) {\n return null;\n }\n\n const content = readFileSync(skillPath, 'utf-8');\n const rawMetadata = extractSkillMetadata(content);\n\n // Parse metadata with defaults\n const metadata: MethodologySkillMetadata = {\n triggers: rawMetadata.triggers as string[] | undefined,\n relatedSkills: rawMetadata.relatedSkills as string[] | undefined,\n difficulty: rawMetadata.difficulty as MethodologySkillMetadata['difficulty'],\n estimatedTime: rawMetadata.estimatedTime as number | undefined,\n prerequisites: rawMetadata.prerequisites as string[] | undefined,\n ...rawMetadata,\n };\n\n const skill: MethodologySkill = {\n id: skillId,\n name: (rawMetadata.name as string) || formatSkillName(skillName),\n description: (rawMetadata.description as string) || '',\n version: (rawMetadata.version as string) || '1.0.0',\n pack: packName,\n tags: (rawMetadata.tags as string[]) || [],\n path: skillPath,\n content,\n metadata,\n };\n\n // Cache and return\n this.loadedSkills.set(skillId, skill);\n return skill;\n }\n\n /**\n * Get skill by full ID (pack/skill)\n */\n async getSkillById(skillId: string): Promise<MethodologySkill | null> {\n const [packName, skillName] = skillId.split('/');\n if (!packName || !skillName) {\n return null;\n }\n return this.loadSkill(packName, skillName);\n }\n\n /**\n * Search skills by query\n */\n async searchSkills(query: string): Promise<MethodologySkill[]> {\n const allSkills: MethodologySkill[] = [];\n const packs = await this.loadAllPacks();\n\n for (const pack of packs) {\n const skills = await this.loadPackSkills(pack.name);\n allSkills.push(...skills);\n }\n\n if (!query) {\n return allSkills;\n }\n\n const lowerQuery = query.toLowerCase();\n return allSkills.filter((skill) => {\n return (\n skill.name.toLowerCase().includes(lowerQuery) ||\n skill.description.toLowerCase().includes(lowerQuery) ||\n skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery)) ||\n skill.metadata.triggers?.some((t) =>\n t.toLowerCase().includes(lowerQuery)\n )\n );\n });\n }\n\n /**\n * Get skills by tag\n */\n async getSkillsByTag(tag: string): Promise<MethodologySkill[]> {\n const allSkills: MethodologySkill[] = [];\n const packs = await this.loadAllPacks();\n\n for (const pack of packs) {\n const skills = await this.loadPackSkills(pack.name);\n allSkills.push(...skills);\n }\n\n const lowerTag = tag.toLowerCase();\n return allSkills.filter((skill) =>\n skill.tags.some((t) => t.toLowerCase() === lowerTag)\n );\n }\n\n /**\n * Get built-in packs directory path\n */\n getPacksDir(): string {\n return this.packsDir;\n }\n\n /**\n * Check if a pack exists\n */\n packExists(packName: string): boolean {\n const packPath = join(this.packsDir, packName);\n const manifestPath = join(packPath, 'pack.json');\n return existsSync(manifestPath);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.loadedPacks.clear();\n this.loadedSkills.clear();\n }\n}\n\n/**\n * Format skill directory name to display name\n */\nfunction formatSkillName(dirName: string): string {\n return dirName\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Create a methodology loader instance\n */\nexport function createMethodologyLoader(\n customPacksDir?: string\n): MethodologyLoader {\n return new MethodologyLoader(customPacksDir);\n}\n\n/**\n * Get the built-in packs directory\n */\nexport function getBuiltinPacksDir(): string {\n return BUILTIN_PACKS_DIR;\n}\n","/**\n * Methodology Validator\n *\n * Validates methodology packs and skills for correctness and completeness.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type {\n MethodologyPack,\n ValidationResult,\n ValidationError,\n ValidationWarning,\n} from './types.js';\n\n/**\n * Validates a methodology pack manifest\n */\nexport function validatePackManifest(pack: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Type check\n if (!pack || typeof pack !== 'object') {\n errors.push({\n code: 'INVALID_TYPE',\n message: 'Pack manifest must be an object',\n });\n return { valid: false, errors, warnings };\n }\n\n const p = pack as Record<string, unknown>;\n\n // Required fields\n if (!p.name || typeof p.name !== 'string') {\n errors.push({\n code: 'MISSING_NAME',\n message: 'Pack must have a \"name\" field (string)',\n });\n } else if (!/^[a-z][a-z0-9-]*$/.test(p.name)) {\n errors.push({\n code: 'INVALID_NAME',\n message: 'Pack name must be lowercase, start with a letter, and contain only a-z, 0-9, and hyphens',\n });\n }\n\n if (!p.version || typeof p.version !== 'string') {\n errors.push({\n code: 'MISSING_VERSION',\n message: 'Pack must have a \"version\" field (string)',\n });\n } else if (!/^\\d+\\.\\d+\\.\\d+/.test(p.version)) {\n errors.push({\n code: 'INVALID_VERSION',\n message: 'Pack version must follow semver (e.g., \"1.0.0\")',\n });\n }\n\n if (!p.description || typeof p.description !== 'string') {\n errors.push({\n code: 'MISSING_DESCRIPTION',\n message: 'Pack must have a \"description\" field (string)',\n });\n } else if (p.description.length < 10) {\n warnings.push({\n code: 'SHORT_DESCRIPTION',\n message: 'Pack description should be at least 10 characters',\n recommendation: 'Add a more detailed description to help users understand the pack',\n });\n }\n\n if (!p.skills || !Array.isArray(p.skills)) {\n errors.push({\n code: 'MISSING_SKILLS',\n message: 'Pack must have a \"skills\" array',\n });\n } else if (p.skills.length === 0) {\n errors.push({\n code: 'EMPTY_SKILLS',\n message: 'Pack must contain at least one skill',\n });\n } else {\n for (const skill of p.skills) {\n if (typeof skill !== 'string') {\n errors.push({\n code: 'INVALID_SKILL_ENTRY',\n message: `Skill entries must be strings, found: ${typeof skill}`,\n });\n }\n }\n }\n\n if (!p.tags || !Array.isArray(p.tags)) {\n warnings.push({\n code: 'MISSING_TAGS',\n message: 'Pack should have a \"tags\" array for better discoverability',\n recommendation: 'Add relevant tags like \"tdd\", \"testing\", \"debugging\"',\n });\n }\n\n if (!p.compatibility || !Array.isArray(p.compatibility)) {\n warnings.push({\n code: 'MISSING_COMPATIBILITY',\n message: 'Pack should specify agent compatibility',\n recommendation: 'Add \"compatibility\": [\"all\"] for universal support',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validates SKILL.md content\n */\nexport function validateSkillContent(content: string): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n if (!content || content.trim().length === 0) {\n errors.push({\n code: 'EMPTY_CONTENT',\n message: 'Skill content cannot be empty',\n });\n return { valid: false, errors, warnings };\n }\n\n const lines = content.split('\\n');\n\n // Check for frontmatter\n const hasFrontmatter = lines[0] === '---';\n if (hasFrontmatter) {\n const frontmatterEnd = lines.slice(1).findIndex((l) => l === '---');\n if (frontmatterEnd === -1) {\n errors.push({\n code: 'UNCLOSED_FRONTMATTER',\n message: 'Frontmatter opened but not closed',\n line: 1,\n });\n }\n } else {\n warnings.push({\n code: 'NO_FRONTMATTER',\n message: 'Skill should have YAML frontmatter with metadata',\n recommendation: 'Add frontmatter with triggers, tags, and description',\n });\n }\n\n // Check for required sections\n const hasDescription = /^#+\\s*(Description|Overview)/im.test(content);\n const hasInstructions = /^#+\\s*(Instructions|Workflow|Steps|Process)/im.test(content);\n\n if (!hasDescription && !hasInstructions) {\n warnings.push({\n code: 'MISSING_STRUCTURE',\n message: 'Skill should have clear sections (Description, Instructions)',\n recommendation: 'Structure skill with ## Description and ## Instructions sections',\n });\n }\n\n // Check minimum content length\n const contentWithoutFrontmatter = content\n .replace(/^---[\\s\\S]*?---/, '')\n .trim();\n if (contentWithoutFrontmatter.length < 100) {\n warnings.push({\n code: 'SHORT_CONTENT',\n message: 'Skill content seems brief',\n recommendation: 'Provide detailed instructions for AI agents to follow',\n });\n }\n\n // Check for actionable instructions\n const hasActionableContent =\n /\\b(must|should|always|never|do not|ensure|verify|check|create|implement)\\b/i.test(\n content\n );\n if (!hasActionableContent) {\n warnings.push({\n code: 'NO_ACTIONABLE_CONTENT',\n message: 'Skill may lack clear actionable instructions',\n recommendation: 'Include directive language (must, should, always, never) for AI agents',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validates a pack directory structure\n */\nexport function validatePackDirectory(packPath: string): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check directory exists\n if (!existsSync(packPath)) {\n errors.push({\n code: 'DIR_NOT_FOUND',\n message: `Pack directory not found: ${packPath}`,\n });\n return { valid: false, errors, warnings };\n }\n\n // Check pack.json exists\n const manifestPath = join(packPath, 'pack.json');\n if (!existsSync(manifestPath)) {\n errors.push({\n code: 'MANIFEST_NOT_FOUND',\n message: 'Pack must have a pack.json manifest',\n path: manifestPath,\n });\n return { valid: false, errors, warnings };\n }\n\n // Validate manifest\n let manifest: MethodologyPack;\n try {\n const raw = readFileSync(manifestPath, 'utf-8');\n manifest = JSON.parse(raw);\n const manifestResult = validatePackManifest(manifest);\n errors.push(...manifestResult.errors);\n warnings.push(...manifestResult.warnings);\n } catch (e) {\n errors.push({\n code: 'INVALID_MANIFEST',\n message: `Failed to parse pack.json: ${e instanceof Error ? e.message : 'Unknown error'}`,\n path: manifestPath,\n });\n return { valid: false, errors, warnings };\n }\n\n // Check skill directories\n if (manifest.skills) {\n for (const skillName of manifest.skills) {\n const skillDir = join(packPath, skillName);\n\n if (!existsSync(skillDir)) {\n errors.push({\n code: 'SKILL_DIR_NOT_FOUND',\n message: `Skill directory not found: ${skillName}`,\n path: skillDir,\n });\n continue;\n }\n\n if (!statSync(skillDir).isDirectory()) {\n errors.push({\n code: 'SKILL_NOT_DIRECTORY',\n message: `Skill must be a directory: ${skillName}`,\n path: skillDir,\n });\n continue;\n }\n\n // Check SKILL.md exists\n const skillFile = join(skillDir, 'SKILL.md');\n if (!existsSync(skillFile)) {\n errors.push({\n code: 'SKILL_FILE_NOT_FOUND',\n message: `Skill must have a SKILL.md file: ${skillName}`,\n path: skillFile,\n });\n continue;\n }\n\n // Validate skill content\n const skillContent = readFileSync(skillFile, 'utf-8');\n const skillResult = validateSkillContent(skillContent);\n for (const err of skillResult.errors) {\n errors.push({\n ...err,\n path: skillFile,\n });\n }\n for (const warn of skillResult.warnings) {\n warnings.push({\n ...warn,\n code: `${skillName}:${warn.code}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validates all built-in packs\n */\nexport function validateBuiltinPacks(packsDir: string): Map<string, ValidationResult> {\n const results = new Map<string, ValidationResult>();\n\n if (!existsSync(packsDir)) {\n return results;\n }\n\n const packDirs = readdirSync(packsDir).filter((name) => {\n const packPath = join(packsDir, name);\n return statSync(packPath).isDirectory();\n });\n\n for (const packName of packDirs) {\n const packPath = join(packsDir, packName);\n results.set(packName, validatePackDirectory(packPath));\n }\n\n return results;\n}\n\n/**\n * Extract skill metadata from SKILL.md frontmatter\n */\nexport function extractSkillMetadata(content: string): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n const lines = content.split('\\n');\n if (lines[0] !== '---') {\n return metadata;\n }\n\n const frontmatterEnd = lines.slice(1).findIndex((l) => l === '---');\n if (frontmatterEnd === -1) {\n return metadata;\n }\n\n const frontmatterLines = lines.slice(1, frontmatterEnd + 1);\n let currentKey: string | null = null;\n let currentArrayValues: string[] = [];\n let inArray = false;\n\n for (const line of frontmatterLines) {\n // Handle array items\n if (inArray && line.startsWith(' - ')) {\n currentArrayValues.push(line.slice(4).trim());\n continue;\n }\n\n // Close array\n if (inArray && !line.startsWith(' - ')) {\n if (currentKey) {\n metadata[currentKey] = currentArrayValues;\n }\n inArray = false;\n currentArrayValues = [];\n currentKey = null;\n }\n\n // Key: value pairs\n const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*(.*)$/);\n if (match) {\n const [, key, value] = match;\n if (value.trim() === '') {\n // Start of array\n currentKey = key;\n inArray = true;\n currentArrayValues = [];\n } else if (value.startsWith('[') && value.endsWith(']')) {\n // Inline array\n metadata[key] = value\n .slice(1, -1)\n .split(',')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''));\n } else if (value === 'true' || value === 'false') {\n metadata[key] = value === 'true';\n } else if (/^\\d+$/.test(value)) {\n metadata[key] = parseInt(value, 10);\n } else {\n metadata[key] = value.replace(/^['\"]|['\"]$/g, '');\n }\n }\n }\n\n // Handle final array\n if (inArray && currentKey) {\n metadata[currentKey] = currentArrayValues;\n }\n\n return metadata;\n}\n","/**\n * Hook Manager\n *\n * Manages skill hooks for automatic triggering across all supported agents.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { minimatch } from 'minimatch';\nimport type { AgentType } from '../types.js';\nimport type {\n SkillHook,\n HookEvent,\n HookContext,\n HookConfig,\n HookManagerOptions,\n ActivatedSkill,\n HookTriggerResult,\n HookError,\n HookEventListener,\n} from './types.js';\n\nconst DEFAULT_CONFIG_PATH = '.skillkit/hooks.json';\n\n/**\n * HookManager - Manages skill hooks for automatic triggering\n */\nexport class HookManager {\n private hooks: Map<string, SkillHook> = new Map();\n private listeners: Set<HookEventListener> = new Set();\n private options: Required<HookManagerOptions>;\n\n constructor(options: HookManagerOptions) {\n this.options = {\n projectPath: options.projectPath,\n configPath: options.configPath || join(options.projectPath, DEFAULT_CONFIG_PATH),\n autoLoad: options.autoLoad ?? true,\n defaultInjectionMode: options.defaultInjectionMode || 'reference',\n };\n\n if (this.options.autoLoad) {\n this.load();\n }\n }\n\n /**\n * Register a new hook\n */\n registerHook(hook: Omit<SkillHook, 'id'> & { id?: string }): SkillHook {\n const fullHook: SkillHook = {\n ...hook,\n id: hook.id || randomUUID(),\n inject: hook.inject || this.options.defaultInjectionMode,\n enabled: hook.enabled ?? true,\n priority: hook.priority ?? 0,\n };\n\n this.hooks.set(fullHook.id, fullHook);\n return fullHook;\n }\n\n /**\n * Unregister a hook by ID\n */\n unregisterHook(id: string): boolean {\n return this.hooks.delete(id);\n }\n\n /**\n * Get a hook by ID\n */\n getHook(id: string): SkillHook | undefined {\n return this.hooks.get(id);\n }\n\n /**\n * Get all hooks\n */\n getAllHooks(): SkillHook[] {\n return Array.from(this.hooks.values());\n }\n\n /**\n * Get hooks for a specific event\n */\n getHooksForEvent(event: HookEvent): SkillHook[] {\n return this.getAllHooks()\n .filter((hook) => hook.event === event && hook.enabled)\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n /**\n * Update a hook\n */\n updateHook(id: string, updates: Partial<SkillHook>): SkillHook | undefined {\n const existing = this.hooks.get(id);\n if (!existing) return undefined;\n\n const updated = { ...existing, ...updates, id };\n this.hooks.set(id, updated);\n return updated;\n }\n\n /**\n * Enable a hook\n */\n enableHook(id: string): boolean {\n const hook = this.hooks.get(id);\n if (!hook) return false;\n hook.enabled = true;\n return true;\n }\n\n /**\n * Disable a hook\n */\n disableHook(id: string): boolean {\n const hook = this.hooks.get(id);\n if (!hook) return false;\n hook.enabled = false;\n return true;\n }\n\n /**\n * Trigger hooks for an event\n */\n async trigger(event: HookEvent, context: HookContext): Promise<HookTriggerResult> {\n const startTime = Date.now();\n const matchedHooks: SkillHook[] = [];\n const activatedSkills: ActivatedSkill[] = [];\n const errors: HookError[] = [];\n\n const hooks = this.getHooksForEvent(event);\n\n for (const hook of hooks) {\n try {\n // Check if matcher matches\n if (hook.matcher && !this.matchesTrigger(hook.matcher, context.trigger)) {\n continue;\n }\n\n // Check condition if present\n if (hook.condition && !this.evaluateCondition(hook.condition, context)) {\n continue;\n }\n\n matchedHooks.push(hook);\n\n // Apply agent-specific overrides\n const effectiveHook = this.applyAgentOverrides(hook, context.agent);\n\n // Activate each skill\n for (const skillId of effectiveHook.skills) {\n try {\n const activated = await this.activateSkill(skillId, effectiveHook, context);\n activatedSkills.push(activated);\n } catch (err) {\n errors.push({\n hookId: hook.id,\n skillId,\n message: err instanceof Error ? err.message : 'Unknown error',\n stack: err instanceof Error ? err.stack : undefined,\n });\n }\n }\n } catch (err) {\n errors.push({\n hookId: hook.id,\n message: err instanceof Error ? err.message : 'Unknown error',\n stack: err instanceof Error ? err.stack : undefined,\n });\n }\n }\n\n const result: HookTriggerResult = {\n event,\n matchedHooks,\n activatedSkills,\n errors,\n executionTimeMs: Date.now() - startTime,\n };\n\n // Notify listeners\n await this.notifyListeners(event, context, result);\n\n return result;\n }\n\n /**\n * Add event listener\n */\n addListener(listener: HookEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: HookEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Load hooks from config file\n */\n load(): void {\n if (!existsSync(this.options.configPath)) {\n return;\n }\n\n try {\n const content = readFileSync(this.options.configPath, 'utf-8');\n const config: HookConfig = JSON.parse(content);\n\n this.hooks.clear();\n for (const hook of config.hooks) {\n this.hooks.set(hook.id, {\n ...hook,\n inject: hook.inject || config.defaults?.inject || this.options.defaultInjectionMode,\n priority: hook.priority ?? config.defaults?.priority ?? 0,\n enabled: hook.enabled ?? config.defaults?.enabled ?? true,\n });\n }\n } catch {\n // Ignore parse errors, start with empty hooks\n }\n }\n\n /**\n * Save hooks to config file\n */\n save(): void {\n const config: HookConfig = {\n version: 1,\n hooks: this.getAllHooks(),\n defaults: {\n inject: this.options.defaultInjectionMode,\n priority: 0,\n enabled: true,\n },\n };\n\n const dir = dirname(this.options.configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(this.options.configPath, JSON.stringify(config, null, 2));\n }\n\n /**\n * Generate agent-specific hook configuration\n */\n generateAgentHooks(agent: AgentType): string | Record<string, unknown> {\n const hooks = this.getAllHooks().filter((h) => h.enabled);\n\n switch (agent) {\n case 'claude-code':\n return this.generateClaudeCodeHooks(hooks);\n case 'cursor':\n return this.generateCursorHooks(hooks);\n case 'opencode':\n return this.generateOpenCodeHooks(hooks);\n default:\n return this.generateGenericHooks(hooks);\n }\n }\n\n /**\n * Generate Claude Code hooks.json format\n */\n private generateClaudeCodeHooks(hooks: SkillHook[]): Record<string, unknown> {\n const hookEntries: Record<string, unknown>[] = [];\n\n for (const hook of hooks) {\n // Map our events to Claude Code hook events\n const claudeEvent = this.mapToClaudeCodeEvent(hook.event);\n if (!claudeEvent) continue;\n\n hookEntries.push({\n event: claudeEvent,\n command: this.generateClaudeCommand(hook),\n matcher: hook.matcher ? String(hook.matcher) : undefined,\n });\n }\n\n return { hooks: hookEntries };\n }\n\n /**\n * Map SkillKit events to Claude Code events\n */\n private mapToClaudeCodeEvent(event: HookEvent): string | null {\n const mapping: Record<HookEvent, string | null> = {\n 'session:start': 'SessionStart',\n 'session:resume': 'SessionResume',\n 'session:end': 'SessionEnd',\n 'file:open': null,\n 'file:save': 'PreToolUse',\n 'file:create': 'PostToolUse',\n 'file:delete': 'PostToolUse',\n 'task:start': null,\n 'task:complete': null,\n 'commit:pre': 'PreToolUse',\n 'commit:post': 'PostToolUse',\n 'error:occur': null,\n 'test:fail': 'PostToolUse',\n 'test:pass': 'PostToolUse',\n 'build:start': 'PreToolUse',\n 'build:fail': 'PostToolUse',\n 'build:success': 'PostToolUse',\n };\n return mapping[event];\n }\n\n /**\n * Generate Claude Code command for a hook\n */\n private generateClaudeCommand(hook: SkillHook): string {\n const skillRefs = hook.skills.map((s) => `@${s}`).join(' ');\n return `echo \"Activating skills: ${skillRefs}\"`;\n }\n\n /**\n * Generate Cursor rules with hooks\n */\n private generateCursorHooks(hooks: SkillHook[]): string {\n const lines: string[] = ['# Auto-generated skill activation rules', ''];\n\n for (const hook of hooks) {\n lines.push(`## ${hook.event} Hook`);\n lines.push(`When ${hook.event.replace(':', ' ')} occurs:`);\n for (const skill of hook.skills) {\n lines.push(`- Apply skill: ${skill}`);\n }\n if (hook.matcher) {\n lines.push(`- Pattern: ${hook.matcher}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Generate OpenCode hooks\n */\n private generateOpenCodeHooks(hooks: SkillHook[]): Record<string, unknown> {\n return {\n triggers: hooks.map((hook) => ({\n event: hook.event,\n skills: hook.skills,\n matcher: hook.matcher ? String(hook.matcher) : undefined,\n enabled: hook.enabled,\n })),\n };\n }\n\n /**\n * Generate generic AGENTS.md injection for unsupported agents\n */\n private generateGenericHooks(hooks: SkillHook[]): string {\n const lines: string[] = [\n '# Skill Activation Triggers',\n '',\n 'The following skills should be activated based on events:',\n '',\n ];\n\n const eventGroups = new Map<HookEvent, SkillHook[]>();\n for (const hook of hooks) {\n const group = eventGroups.get(hook.event) || [];\n group.push(hook);\n eventGroups.set(hook.event, group);\n }\n\n for (const [event, eventHooks] of eventGroups) {\n lines.push(`## On ${event.replace(':', ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())}`);\n for (const hook of eventHooks) {\n lines.push(`- Activate: ${hook.skills.join(', ')}`);\n if (hook.matcher) {\n lines.push(` - When matching: ${hook.matcher}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Check if trigger matches the pattern\n */\n private matchesTrigger(matcher: string | RegExp, trigger: string): boolean {\n if (matcher instanceof RegExp) {\n return matcher.test(trigger);\n }\n // Use minimatch for glob patterns\n return minimatch(trigger, matcher);\n }\n\n /**\n * Evaluate condition expression\n */\n private evaluateCondition(condition: string, context: HookContext): boolean {\n // Simple condition evaluation\n // Supports: event == 'x', trigger.includes('y'), metadata.key == 'value'\n try {\n const safeContext = {\n event: context.event,\n trigger: context.trigger,\n agent: context.agent,\n metadata: context.metadata || {},\n };\n\n // Very basic expression evaluation\n if (condition.includes('==')) {\n const [left, right] = condition.split('==').map((s) => s.trim());\n const leftVal = this.resolveValue(left, safeContext);\n const rightVal = right.replace(/['\"]/g, '');\n return leftVal === rightVal;\n }\n\n if (condition.includes('.includes(')) {\n const match = condition.match(/(\\w+)\\.includes\\(['\"](.+)['\"]\\)/);\n if (match) {\n const [, prop, search] = match;\n const val = this.resolveValue(prop, safeContext);\n return typeof val === 'string' && val.includes(search);\n }\n }\n\n return true;\n } catch {\n return true;\n }\n }\n\n /**\n * Resolve a value from context\n */\n private resolveValue(path: string, context: Record<string, unknown>): unknown {\n const parts = path.split('.');\n let current: unknown = context;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n }\n\n /**\n * Apply agent-specific overrides to a hook\n */\n private applyAgentOverrides(hook: SkillHook, agent: AgentType): SkillHook {\n if (!hook.agentOverrides || !hook.agentOverrides[agent]) {\n return hook;\n }\n\n return {\n ...hook,\n ...hook.agentOverrides[agent],\n id: hook.id,\n event: hook.event,\n };\n }\n\n /**\n * Activate a skill from a hook\n */\n private async activateSkill(\n skillId: string,\n hook: SkillHook,\n context: HookContext\n ): Promise<ActivatedSkill> {\n const activated: ActivatedSkill = {\n skillId,\n hookId: hook.id,\n injectionMode: hook.inject,\n activatedAt: new Date(),\n };\n\n switch (hook.inject) {\n case 'content':\n // Load skill content\n activated.content = await this.loadSkillContent(skillId, context);\n break;\n case 'reference':\n // Create reference\n activated.reference = `@${skillId}`;\n break;\n case 'prompt':\n // Create prompt injection\n activated.content = `Please apply the \"${skillId}\" skill to this task.`;\n break;\n }\n\n return activated;\n }\n\n /**\n * Load skill content (placeholder - integrates with skill loader)\n */\n private async loadSkillContent(skillId: string, _context: HookContext): Promise<string> {\n // This would integrate with the methodology loader or skill manager\n // For now, return a placeholder\n return `# Skill: ${skillId}\\n\\nThis skill was auto-activated by a hook.`;\n }\n\n /**\n * Notify all listeners of a trigger event\n */\n private async notifyListeners(\n event: HookEvent,\n context: HookContext,\n result: HookTriggerResult\n ): Promise<void> {\n for (const listener of this.listeners) {\n try {\n await listener(event, context, result);\n } catch {\n // Ignore listener errors\n }\n }\n }\n}\n\n/**\n * Create a HookManager instance\n */\nexport function createHookManager(options: HookManagerOptions): HookManager {\n return new HookManager(options);\n}\n","/**\n * Skill Trigger Engine\n *\n * Monitors events and triggers skill activation based on configured hooks.\n */\n\nimport { watch, type FSWatcher } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport type {\n HookEvent,\n HookContext,\n HookTriggerResult,\n TriggerEngineOptions,\n HookEventListener,\n} from './types.js';\nimport { HookManager } from './manager.js';\n\n/**\n * Debounce helper\n */\nfunction debounce<T extends (...args: string[]) => void>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n return (...args: Parameters<T>) => {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * SkillTriggerEngine - Monitors events and triggers skill activation\n */\nexport class SkillTriggerEngine {\n private hookManager: HookManager;\n private options: Required<TriggerEngineOptions>;\n private watchers: Map<string, FSWatcher> = new Map();\n private listeners: Set<HookEventListener> = new Set();\n private isRunning = false;\n private currentAgent: AgentType = 'universal';\n\n constructor(hookManager: HookManager, options: TriggerEngineOptions) {\n this.hookManager = hookManager;\n this.options = {\n projectPath: options.projectPath,\n watchFiles: options.watchFiles ?? false,\n debounceMs: options.debounceMs ?? 100,\n };\n }\n\n /**\n * Start the trigger engine\n */\n start(agent?: AgentType): void {\n if (this.isRunning) return;\n\n this.isRunning = true;\n this.currentAgent = agent || 'universal';\n\n if (this.options.watchFiles) {\n this.startFileWatcher();\n }\n\n // Trigger session:start\n this.triggerEvent('session:start', 'engine_start');\n }\n\n /**\n * Stop the trigger engine\n */\n stop(): void {\n if (!this.isRunning) return;\n\n // Trigger session:end\n this.triggerEvent('session:end', 'engine_stop');\n\n this.stopFileWatcher();\n this.isRunning = false;\n }\n\n /**\n * Set the current agent\n */\n setAgent(agent: AgentType): void {\n this.currentAgent = agent;\n }\n\n /**\n * Manually trigger an event\n */\n async triggerEvent(\n event: HookEvent,\n trigger: string,\n metadata?: Record<string, unknown>\n ): Promise<HookTriggerResult> {\n const context: HookContext = {\n event,\n trigger,\n projectPath: this.options.projectPath,\n agent: this.currentAgent,\n metadata,\n timestamp: new Date(),\n };\n\n const result = await this.hookManager.trigger(event, context);\n\n // Notify local listeners\n for (const listener of this.listeners) {\n try {\n await listener(event, context, result);\n } catch {\n // Ignore listener errors\n }\n }\n\n return result;\n }\n\n /**\n * Trigger file:open event\n */\n async triggerFileOpen(filePath: string): Promise<HookTriggerResult> {\n return this.triggerEvent('file:open', filePath, { filePath });\n }\n\n /**\n * Trigger file:save event\n */\n async triggerFileSave(filePath: string): Promise<HookTriggerResult> {\n return this.triggerEvent('file:save', filePath, { filePath });\n }\n\n /**\n * Trigger file:create event\n */\n async triggerFileCreate(filePath: string): Promise<HookTriggerResult> {\n return this.triggerEvent('file:create', filePath, { filePath });\n }\n\n /**\n * Trigger file:delete event\n */\n async triggerFileDelete(filePath: string): Promise<HookTriggerResult> {\n return this.triggerEvent('file:delete', filePath, { filePath });\n }\n\n /**\n * Trigger task:start event\n */\n async triggerTaskStart(taskName: string, taskId?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('task:start', taskName, { taskName, taskId });\n }\n\n /**\n * Trigger task:complete event\n */\n async triggerTaskComplete(\n taskName: string,\n taskId?: string,\n success?: boolean\n ): Promise<HookTriggerResult> {\n return this.triggerEvent('task:complete', taskName, { taskName, taskId, success });\n }\n\n /**\n * Trigger commit:pre event\n */\n async triggerPreCommit(message?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('commit:pre', 'git_commit', { message });\n }\n\n /**\n * Trigger commit:post event\n */\n async triggerPostCommit(commitHash?: string, message?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('commit:post', 'git_commit', { commitHash, message });\n }\n\n /**\n * Trigger error:occur event\n */\n async triggerError(error: Error | string, context?: string): Promise<HookTriggerResult> {\n const errorMessage = error instanceof Error ? error.message : error;\n const errorStack = error instanceof Error ? error.stack : undefined;\n return this.triggerEvent('error:occur', errorMessage, { error: errorMessage, stack: errorStack, context });\n }\n\n /**\n * Trigger test:fail event\n */\n async triggerTestFail(testName: string, error?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('test:fail', testName, { testName, error });\n }\n\n /**\n * Trigger test:pass event\n */\n async triggerTestPass(testName: string): Promise<HookTriggerResult> {\n return this.triggerEvent('test:pass', testName, { testName });\n }\n\n /**\n * Trigger build:start event\n */\n async triggerBuildStart(command?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('build:start', 'build', { command });\n }\n\n /**\n * Trigger build:fail event\n */\n async triggerBuildFail(error?: string): Promise<HookTriggerResult> {\n return this.triggerEvent('build:fail', 'build', { error });\n }\n\n /**\n * Trigger build:success event\n */\n async triggerBuildSuccess(): Promise<HookTriggerResult> {\n return this.triggerEvent('build:success', 'build', {});\n }\n\n /**\n * Add event listener\n */\n addListener(listener: HookEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: HookEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Check if engine is running\n */\n isActive(): boolean {\n return this.isRunning;\n }\n\n /**\n * Start file watcher\n */\n private startFileWatcher(): void {\n try {\n const watcher = watch(\n this.options.projectPath,\n { recursive: true },\n debounce((eventType: string, filename: string | null) => {\n if (!filename) return;\n\n const relativePath = relative(this.options.projectPath, join(this.options.projectPath, filename));\n\n // Skip node_modules, .git, etc.\n if (this.shouldIgnore(relativePath)) return;\n\n if (eventType === 'rename') {\n // Could be create or delete\n this.triggerFileCreate(relativePath);\n } else if (eventType === 'change') {\n this.triggerFileSave(relativePath);\n }\n }, this.options.debounceMs)\n );\n\n this.watchers.set('main', watcher);\n } catch {\n // File watching not available\n }\n }\n\n /**\n * Stop file watcher\n */\n private stopFileWatcher(): void {\n for (const watcher of this.watchers.values()) {\n watcher.close();\n }\n this.watchers.clear();\n }\n\n /**\n * Check if a path should be ignored\n */\n private shouldIgnore(filePath: string): boolean {\n const ignorePaths = [\n 'node_modules',\n '.git',\n '.skillkit',\n 'dist',\n 'build',\n 'coverage',\n '.next',\n '.nuxt',\n ];\n\n return ignorePaths.some((ignore) => filePath.includes(ignore));\n }\n}\n\n/**\n * Create a SkillTriggerEngine instance\n */\nexport function createTriggerEngine(\n hookManager: HookManager,\n options: TriggerEngineOptions\n): SkillTriggerEngine {\n return new SkillTriggerEngine(hookManager, options);\n}\n","/**\n * Team Orchestrator\n *\n * Coordinates multi-agent teams with task assignment, plan approval, and review workflows.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { AgentType } from '../types.js';\nimport type {\n Team,\n OrchestratorTeamConfig,\n AgentInstance,\n Task,\n TaskPlan,\n TaskFilter,\n ReviewStage,\n ReviewResult,\n PlanResult,\n OrchestratorOptions,\n TeamEvent,\n TeamEventListener,\n} from './types.js';\nimport { TaskManager, createTaskManager } from './task.js';\nimport { TeamMessageBus, createMessageBus } from './messages.js';\n\n/**\n * Default review stages\n */\nconst DEFAULT_REVIEW_STAGES: ReviewStage[] = [\n {\n name: 'spec-compliance',\n prompt: 'Review the implementation for specification compliance. Verify all requirements are met.',\n required: true,\n reviewer: 'leader',\n },\n {\n name: 'code-quality',\n prompt: 'Review the code quality, style, and best practices. Check for maintainability.',\n required: true,\n reviewer: 'leader',\n },\n];\n\n/**\n * TeamOrchestrator - Coordinates multi-agent teams\n */\nexport class TeamOrchestrator {\n private teams: Map<string, Team> = new Map();\n private taskManagers: Map<string, TaskManager> = new Map();\n private messageBuses: Map<string, TeamMessageBus> = new Map();\n private listeners: Set<TeamEventListener> = new Set();\n private options: Required<OrchestratorOptions>;\n\n constructor(options: OrchestratorOptions) {\n this.options = {\n projectPath: options.projectPath,\n defaultReviewStages: options.defaultReviewStages || DEFAULT_REVIEW_STAGES,\n requirePlanApproval: options.requirePlanApproval ?? true,\n taskTimeout: options.taskTimeout ?? 300000, // 5 minutes\n enableMethodology: options.enableMethodology ?? true,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Spawn a new team\n */\n async spawnTeam(config: OrchestratorTeamConfig): Promise<Team> {\n const teamId = randomUUID();\n const now = new Date();\n\n // Create leader agent\n const leader: AgentInstance = {\n id: randomUUID(),\n role: 'leader',\n agentType: config.leaderAgent,\n status: 'idle',\n spawnedAt: now,\n lastActivityAt: now,\n };\n\n // Create team\n const team: Team = {\n id: teamId,\n name: config.name,\n leader,\n teammates: [],\n tasks: [],\n status: 'forming',\n createdAt: now,\n config: {\n ...config,\n requirePlanApproval: config.requirePlanApproval ?? this.options.requirePlanApproval,\n reviewStages: config.reviewStages || this.options.defaultReviewStages.map((s) => s.name),\n },\n metadata: config.metadata,\n };\n\n // Create task manager and message bus for this team\n this.taskManagers.set(teamId, createTaskManager());\n this.messageBuses.set(teamId, createMessageBus());\n\n this.teams.set(teamId, team);\n\n // Auto-spawn teammates if configured\n if (config.autoSpawn && config.teammateAgents) {\n for (const agentType of config.teammateAgents) {\n await this.spawnTeammate(teamId, agentType);\n }\n }\n\n team.status = 'working';\n this.emit('team:created', team);\n\n return team;\n }\n\n /**\n * Spawn a teammate agent\n */\n async spawnTeammate(teamId: string, agentType: AgentType): Promise<AgentInstance> {\n const team = this.teams.get(teamId);\n if (!team) throw new Error(`Team not found: ${teamId}`);\n\n const now = new Date();\n const teammate: AgentInstance = {\n id: randomUUID(),\n role: 'teammate',\n agentType,\n status: 'idle',\n spawnedAt: now,\n lastActivityAt: now,\n };\n\n team.teammates.push(teammate);\n this.emit('team:teammate_spawned', team, teammate);\n\n return teammate;\n }\n\n /**\n * Get a team by ID\n */\n getTeam(teamId: string): Team | undefined {\n return this.teams.get(teamId);\n }\n\n /**\n * Get all teams\n */\n getAllTeams(): Team[] {\n return Array.from(this.teams.values());\n }\n\n /**\n * Get task manager for a team\n */\n getTaskManager(teamId: string): TaskManager | undefined {\n return this.taskManagers.get(teamId);\n }\n\n /**\n * Get message bus for a team\n */\n getMessageBus(teamId: string): TeamMessageBus | undefined {\n return this.messageBuses.get(teamId);\n }\n\n /**\n * Create a task in a team\n */\n async createTask(\n teamId: string,\n name: string,\n description: string,\n spec: string,\n options?: Parameters<TaskManager['createTask']>[3]\n ): Promise<Task> {\n const taskManager = this.taskManagers.get(teamId);\n if (!taskManager) throw new Error(`Team not found: ${teamId}`);\n\n const task = taskManager.createTask(name, description, spec, options);\n\n // Update team's task list\n const team = this.teams.get(teamId);\n if (team) {\n team.tasks.push(task);\n }\n\n return task;\n }\n\n /**\n * Assign a task to an agent\n */\n async assignTask(teamId: string, taskId: string, agentId: string): Promise<Task | undefined> {\n const taskManager = this.taskManagers.get(teamId);\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!taskManager || !messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n // Verify agent exists in team\n const agent = this.findAgent(team, agentId);\n if (!agent) throw new Error(`Agent not found in team: ${agentId}`);\n\n const task = taskManager.assignTask(taskId, agentId);\n if (!task) return undefined;\n\n // Update agent status\n agent.currentTask = taskId;\n agent.status = 'planning';\n agent.lastActivityAt = new Date();\n\n // Notify agent\n await messageBus.notifyTaskAssignment(\n team.leader.id,\n agentId,\n taskId,\n `Assigned: ${task.name}\\n\\n${task.description}`\n );\n\n return task;\n }\n\n /**\n * List tasks in a team\n */\n listTasks(teamId: string, filter?: TaskFilter): Task[] {\n const taskManager = this.taskManagers.get(teamId);\n if (!taskManager) throw new Error(`Team not found: ${teamId}`);\n\n return taskManager.listTasks(filter);\n }\n\n /**\n * Submit a plan for a task\n */\n async submitPlan(\n teamId: string,\n taskId: string,\n plan: Omit<TaskPlan, 'submittedAt'>\n ): Promise<Task | undefined> {\n const taskManager = this.taskManagers.get(teamId);\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!taskManager || !messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const task = taskManager.submitPlan(taskId, plan);\n if (!task) return undefined;\n\n // Update agent status\n if (task.assignee) {\n const agent = this.findAgent(team, task.assignee);\n if (agent) {\n agent.status = 'reviewing';\n agent.lastActivityAt = new Date();\n }\n }\n\n // Notify leader\n const planSummary = plan.steps.map((s) => `${s.number}. ${s.description}`).join('\\n');\n await messageBus.submitPlan(\n task.assignee || 'unknown',\n team.leader.id,\n taskId,\n `Plan submitted for: ${task.name}\\n\\n${planSummary}`\n );\n\n // If plan approval not required, auto-approve\n if (!team.config.requirePlanApproval) {\n return this.approvePlan(teamId, taskId);\n }\n\n return task;\n }\n\n /**\n * Approve a task plan\n */\n async approvePlan(teamId: string, taskId: string): Promise<Task | undefined> {\n const taskManager = this.taskManagers.get(teamId);\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!taskManager || !messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const task = taskManager.approvePlan(taskId, team.leader.id);\n if (!task) return undefined;\n\n // Update agent status\n if (task.assignee) {\n const agent = this.findAgent(team, task.assignee);\n if (agent) {\n agent.status = 'executing';\n agent.lastActivityAt = new Date();\n }\n }\n\n // Notify agent\n await messageBus.approvePlan(team.leader.id, task.assignee || 'unknown', taskId, 'Plan approved. Proceed with implementation.');\n\n return task;\n }\n\n /**\n * Reject a task plan\n */\n async rejectPlan(teamId: string, taskId: string, reason: string): Promise<Task | undefined> {\n const taskManager = this.taskManagers.get(teamId);\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!taskManager || !messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const task = taskManager.rejectPlan(taskId, reason);\n if (!task) return undefined;\n\n // Update agent status back to planning\n if (task.assignee) {\n const agent = this.findAgent(team, task.assignee);\n if (agent) {\n agent.status = 'planning';\n agent.lastActivityAt = new Date();\n }\n }\n\n // Notify agent\n await messageBus.rejectPlan(team.leader.id, task.assignee || 'unknown', taskId, reason);\n\n return task;\n }\n\n /**\n * Request agent shutdown\n */\n async requestShutdown(teamId: string, agentId: string, reason?: string): Promise<void> {\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const agent = this.findAgent(team, agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n\n agent.status = 'shutdown_requested';\n agent.lastActivityAt = new Date();\n\n // Notify leader\n await messageBus.requestShutdown(agentId, team.leader.id, reason);\n }\n\n /**\n * Approve agent shutdown\n */\n async approveShutdown(teamId: string, agentId: string): Promise<void> {\n const messageBus = this.messageBuses.get(teamId);\n const team = this.teams.get(teamId);\n\n if (!messageBus || !team) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const agent = this.findAgent(team, agentId);\n if (!agent) throw new Error(`Agent not found: ${agentId}`);\n\n agent.status = 'shutdown';\n agent.lastActivityAt = new Date();\n agent.currentTask = undefined;\n\n // Notify agent\n await messageBus.approveShutdown(team.leader.id, agentId);\n\n this.emit('team:teammate_shutdown', team, agent);\n }\n\n /**\n * Send a message\n */\n async send(\n teamId: string,\n from: string,\n to: string,\n content: string,\n taskId?: string\n ): Promise<void> {\n const messageBus = this.messageBuses.get(teamId);\n if (!messageBus) throw new Error(`Team not found: ${teamId}`);\n\n await messageBus.send(from, to, content, { taskId });\n }\n\n /**\n * Broadcast a message\n */\n async broadcast(teamId: string, from: string, content: string): Promise<void> {\n const messageBus = this.messageBuses.get(teamId);\n if (!messageBus) throw new Error(`Team not found: ${teamId}`);\n\n await messageBus.broadcast(from, content);\n }\n\n /**\n * Run review on a task\n */\n async runReview(\n teamId: string,\n taskId: string,\n stage: ReviewStage,\n _implementation: string\n ): Promise<ReviewResult> {\n const team = this.teams.get(teamId);\n const taskManager = this.taskManagers.get(teamId);\n\n if (!team || !taskManager) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const task = taskManager.getTask(taskId);\n if (!task) throw new Error(`Task not found: ${taskId}`);\n\n // Mark task as under review\n taskManager.markForReview(taskId);\n\n // Simulate review (in production, this would invoke the reviewer agent)\n const result: ReviewResult = {\n passed: true,\n issues: [],\n summary: `${stage.name} review passed`,\n reviewerId: team.leader.id,\n reviewedAt: new Date(),\n };\n\n return result;\n }\n\n /**\n * Execute a full plan with all tasks\n */\n async executePlan(teamId: string): Promise<PlanResult> {\n const team = this.teams.get(teamId);\n const taskManager = this.taskManagers.get(teamId);\n\n if (!team || !taskManager) {\n throw new Error(`Team not found: ${teamId}`);\n }\n\n const startTime = Date.now();\n const taskResults = new Map();\n const failedTasks: string[] = [];\n\n // Process tasks in order, respecting dependencies\n while (!taskManager.allTasksComplete()) {\n const nextTask = taskManager.getNextTask();\n if (!nextTask) {\n // No more tasks can be executed (might be blocked by dependencies)\n break;\n }\n\n // Find an idle agent to assign\n const idleTeammate = team.teammates.find((a) => a.status === 'idle');\n const idleLeader = team.leader.status === 'idle' && !team.leader.currentTask ? team.leader : null;\n const idleAgent = idleTeammate || idleLeader;\n\n // Skip task if no idle agent available\n if (!idleAgent) {\n // No agent available, task will be retried in next iteration\n break;\n }\n\n // Assign and execute\n await this.assignTask(teamId, nextTask.id, idleAgent.id);\n\n // Start task\n taskManager.startTask(nextTask.id);\n\n // Simulate execution (in production, agent would do the work)\n const result = {\n success: true,\n output: `Completed: ${nextTask.name}`,\n completedAt: new Date(),\n };\n\n taskManager.completeTask(nextTask.id, result);\n taskResults.set(nextTask.id, result);\n\n // Mark agent as idle\n idleAgent.status = 'idle';\n idleAgent.currentTask = undefined;\n }\n\n // Check for failed or incomplete tasks\n const allTasks = taskManager.getAllTasks();\n for (const task of allTasks) {\n if (task.status === 'failed') {\n failedTasks.push(task.id);\n }\n }\n\n // Also check for incomplete tasks (pending, in_progress, etc.)\n const incomplete = allTasks.filter(\n (task) => task.status !== 'completed' && task.status !== 'failed'\n );\n if (incomplete.length > 0) {\n failedTasks.push(...incomplete.map((task) => task.id));\n }\n\n return {\n success: failedTasks.length === 0,\n taskResults,\n failedTasks,\n durationMs: Date.now() - startTime,\n };\n }\n\n /**\n * Shutdown a team\n */\n async shutdownTeam(teamId: string): Promise<void> {\n const team = this.teams.get(teamId);\n if (!team) throw new Error(`Team not found: ${teamId}`);\n\n // Request shutdown for all teammates\n for (const teammate of team.teammates) {\n if (teammate.status !== 'shutdown') {\n teammate.status = 'shutdown';\n }\n }\n\n // Mark leader as shutdown\n team.leader.status = 'shutdown';\n team.status = 'shutdown';\n\n this.emit('team:shutdown', team);\n\n // Clean up resources\n this.taskManagers.delete(teamId);\n this.messageBuses.delete(teamId);\n this.teams.delete(teamId);\n }\n\n /**\n * Get team stats\n */\n getTeamStats(teamId: string): {\n agents: { total: number; active: number; idle: number };\n tasks: ReturnType<TaskManager['getStats']>;\n messages: number;\n } | undefined {\n const team = this.teams.get(teamId);\n const taskManager = this.taskManagers.get(teamId);\n const messageBus = this.messageBuses.get(teamId);\n\n if (!team || !taskManager || !messageBus) return undefined;\n\n const allAgents = [team.leader, ...team.teammates];\n\n return {\n agents: {\n total: allAgents.length,\n active: allAgents.filter((a) => a.status !== 'idle' && a.status !== 'shutdown').length,\n idle: allAgents.filter((a) => a.status === 'idle').length,\n },\n tasks: taskManager.getStats(),\n messages: messageBus.messageCount,\n };\n }\n\n /**\n * Add event listener\n */\n addListener(listener: TeamEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: TeamEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Find an agent in a team\n */\n private findAgent(team: Team, agentId: string): AgentInstance | undefined {\n if (team.leader.id === agentId) return team.leader;\n return team.teammates.find((t) => t.id === agentId);\n }\n\n /**\n * Emit team event\n */\n private emit(event: TeamEvent, team: Team, agent?: AgentInstance): void {\n for (const listener of this.listeners) {\n try {\n // Call listener (may return Promise or void)\n const result = listener(event, team, agent);\n // If it returns a Promise, catch rejections\n if (result instanceof Promise) {\n result.catch(() => {\n // Ignore async listener errors\n });\n }\n } catch {\n // Ignore sync listener errors\n }\n }\n }\n}\n\n/**\n * Create a TeamOrchestrator instance\n */\nexport function createTeamOrchestrator(options: OrchestratorOptions): TeamOrchestrator {\n return new TeamOrchestrator(options);\n}\n","/**\n * Task Manager\n *\n * Manages tasks within a team with status tracking and assignment.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n Task,\n OrchestratorTaskStatus,\n TaskFiles,\n TaskPlan,\n TaskResult,\n TaskFilter,\n TaskEvent,\n TaskEventListener,\n} from './types.js';\n\n/**\n * TaskManager - Manages team tasks\n */\nexport class TaskManager {\n private tasks: Map<string, Task> = new Map();\n private listeners: Set<TaskEventListener> = new Set();\n\n /**\n * Create a new task\n */\n createTask(\n name: string,\n description: string,\n spec: string,\n options?: {\n files?: TaskFiles;\n priority?: number;\n dependencies?: string[];\n metadata?: Record<string, unknown>;\n }\n ): Task {\n const now = new Date();\n const task: Task = {\n id: randomUUID(),\n name,\n description,\n spec,\n files: options?.files || {},\n status: 'pending',\n priority: options?.priority ?? 0,\n dependencies: options?.dependencies || [],\n createdAt: now,\n updatedAt: now,\n metadata: options?.metadata,\n };\n\n this.tasks.set(task.id, task);\n this.emit('task:created', task);\n return task;\n }\n\n /**\n * Get a task by ID\n */\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all tasks\n */\n getAllTasks(): Task[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * List tasks with optional filter\n */\n listTasks(filter?: TaskFilter): Task[] {\n let tasks = this.getAllTasks();\n\n if (filter) {\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n tasks = tasks.filter((t) => statuses.includes(t.status));\n }\n\n if (filter.assignee) {\n tasks = tasks.filter((t) => t.assignee === filter.assignee);\n }\n\n if (filter.minPriority !== undefined) {\n tasks = tasks.filter((t) => (t.priority || 0) >= filter.minPriority!);\n }\n\n if (!filter.includeCompleted) {\n tasks = tasks.filter((t) => t.status !== 'completed' && t.status !== 'failed');\n }\n }\n\n // Sort by priority (descending) then by creation time\n return tasks.sort((a, b) => {\n const priorityDiff = (b.priority || 0) - (a.priority || 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt.getTime() - b.createdAt.getTime();\n });\n }\n\n /**\n * Assign a task to an agent\n */\n assignTask(taskId: string, agentId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n // Check dependencies\n if (task.dependencies && task.dependencies.length > 0) {\n const unfinished = task.dependencies.filter((depId) => {\n const dep = this.tasks.get(depId);\n return !dep || dep.status !== 'completed';\n });\n\n if (unfinished.length > 0) {\n throw new Error(`Task has unfinished or missing dependencies: ${unfinished.join(', ')}`);\n }\n }\n\n task.assignee = agentId;\n task.status = 'assigned';\n task.updatedAt = new Date();\n\n this.emit('task:assigned', task);\n return task;\n }\n\n /**\n * Unassign a task\n */\n unassignTask(taskId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.assignee = undefined;\n task.status = 'pending';\n task.updatedAt = new Date();\n\n return task;\n }\n\n /**\n * Submit a plan for a task\n */\n submitPlan(taskId: string, plan: Omit<TaskPlan, 'submittedAt'>): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.plan = {\n ...plan,\n submittedAt: new Date(),\n };\n task.status = 'plan_pending';\n task.updatedAt = new Date();\n\n this.emit('task:plan_submitted', task);\n return task;\n }\n\n /**\n * Approve a task plan\n */\n approvePlan(taskId: string, approverId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task || !task.plan) return undefined;\n\n task.plan.approvedAt = new Date();\n task.plan.approvedBy = approverId;\n task.status = 'approved';\n task.updatedAt = new Date();\n\n this.emit('task:plan_approved', task);\n return task;\n }\n\n /**\n * Reject a task plan\n */\n rejectPlan(taskId: string, reason: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task || !task.plan) return undefined;\n\n task.plan.rejectionReason = reason;\n task.status = 'planning';\n task.updatedAt = new Date();\n\n this.emit('task:plan_rejected', task);\n return task;\n }\n\n /**\n * Start a task (mark as in progress)\n */\n startTask(taskId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.status = 'in_progress';\n task.updatedAt = new Date();\n\n this.emit('task:started', task);\n return task;\n }\n\n /**\n * Mark task as under review\n */\n markForReview(taskId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.status = 'review';\n task.updatedAt = new Date();\n\n return task;\n }\n\n /**\n * Complete a task\n */\n completeTask(taskId: string, result: TaskResult): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.result = result;\n task.status = result.success ? 'completed' : 'failed';\n task.updatedAt = new Date();\n\n this.emit(result.success ? 'task:completed' : 'task:failed', task);\n return task;\n }\n\n /**\n * Fail a task\n */\n failTask(taskId: string, errors: string[]): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.result = {\n success: false,\n output: 'Task failed',\n errors,\n completedAt: new Date(),\n };\n task.status = 'failed';\n task.updatedAt = new Date();\n\n this.emit('task:failed', task);\n return task;\n }\n\n /**\n * Update task status\n */\n updateStatus(taskId: string, status: OrchestratorTaskStatus): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n task.status = status;\n task.updatedAt = new Date();\n\n return task;\n }\n\n /**\n * Delete a task\n */\n deleteTask(taskId: string): boolean {\n return this.tasks.delete(taskId);\n }\n\n /**\n * Get tasks by status\n */\n getTasksByStatus(status: OrchestratorTaskStatus): Task[] {\n return this.getAllTasks().filter((t) => t.status === status);\n }\n\n /**\n * Get tasks for an agent\n */\n getTasksForAgent(agentId: string): Task[] {\n return this.getAllTasks().filter((t) => t.assignee === agentId);\n }\n\n /**\n * Get pending tasks (unassigned)\n */\n getPendingTasks(): Task[] {\n return this.getTasksByStatus('pending').sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n /**\n * Get next available task for assignment\n */\n getNextTask(): Task | undefined {\n const pending = this.getPendingTasks();\n\n // Find first task with no unfinished dependencies\n for (const task of pending) {\n if (!task.dependencies || task.dependencies.length === 0) {\n return task;\n }\n\n const allDepsComplete = task.dependencies.every((depId) => {\n const dep = this.tasks.get(depId);\n return dep && dep.status === 'completed';\n });\n\n if (allDepsComplete) {\n return task;\n }\n }\n\n return undefined;\n }\n\n /**\n * Check if all tasks are complete\n */\n allTasksComplete(): boolean {\n const tasks = this.getAllTasks();\n return tasks.length > 0 && tasks.every((t) => t.status === 'completed' || t.status === 'failed');\n }\n\n /**\n * Get completion stats\n */\n getStats(): {\n total: number;\n pending: number;\n inProgress: number;\n completed: number;\n failed: number;\n } {\n const tasks = this.getAllTasks();\n return {\n total: tasks.length,\n pending: tasks.filter((t) => t.status === 'pending' || t.status === 'assigned').length,\n inProgress: tasks.filter((t) =>\n ['planning', 'plan_pending', 'approved', 'in_progress', 'review'].includes(t.status)\n ).length,\n completed: tasks.filter((t) => t.status === 'completed').length,\n failed: tasks.filter((t) => t.status === 'failed').length,\n };\n }\n\n /**\n * Add event listener\n */\n addListener(listener: TaskEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: TaskEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Emit task event\n */\n private emit(event: TaskEvent, task: Task): void {\n for (const listener of this.listeners) {\n try {\n // Call listener (may return Promise or void)\n const result = listener(event, task);\n // If it returns a Promise, catch rejections\n if (result instanceof Promise) {\n result.catch(() => {\n // Ignore async listener errors\n });\n }\n } catch {\n // Ignore sync listener errors\n }\n }\n }\n\n /**\n * Clear all tasks\n */\n clear(): void {\n this.tasks.clear();\n }\n\n /**\n * Export tasks to JSON\n */\n toJSON(): Task[] {\n return this.getAllTasks();\n }\n\n /**\n * Import tasks from JSON\n */\n fromJSON(tasks: Task[]): void {\n this.clear();\n for (const task of tasks) {\n // Rehydrate Date fields that were serialized to strings\n const hydrated: Task = {\n ...task,\n createdAt: new Date(task.createdAt),\n updatedAt: new Date(task.updatedAt),\n plan: task.plan\n ? {\n ...task.plan,\n submittedAt: new Date(task.plan.submittedAt),\n approvedAt: task.plan.approvedAt ? new Date(task.plan.approvedAt) : undefined,\n }\n : undefined,\n result: task.result\n ? {\n ...task.result,\n completedAt: new Date(task.result.completedAt),\n }\n : undefined,\n };\n this.tasks.set(hydrated.id, hydrated);\n }\n }\n}\n\n/**\n * Create a TaskManager instance\n */\nexport function createTaskManager(): TaskManager {\n return new TaskManager();\n}\n","/**\n * Team Message Bus\n *\n * Handles inter-agent communication within a team.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { TeamMessage, MessageType, MessageHandler } from './types.js';\n\n/**\n * TeamMessageBus - Handles team communication\n */\nexport class TeamMessageBus {\n private messages: TeamMessage[] = [];\n private handlers: Map<string, Set<MessageHandler>> = new Map();\n private globalHandlers: Set<MessageHandler> = new Set();\n private maxMessages: number;\n\n constructor(options?: { maxMessages?: number }) {\n this.maxMessages = options?.maxMessages ?? 1000;\n }\n\n /**\n * Send a direct message to a specific agent\n */\n async send(\n from: string,\n to: string,\n content: string,\n options?: {\n type?: MessageType;\n taskId?: string;\n metadata?: Record<string, unknown>;\n }\n ): Promise<TeamMessage> {\n const message: TeamMessage = {\n id: randomUUID(),\n type: options?.type || 'direct',\n from,\n to,\n content,\n taskId: options?.taskId,\n metadata: options?.metadata,\n timestamp: new Date(),\n };\n\n this.addMessage(message);\n await this.notifyHandlers(to, message);\n await this.notifyGlobalHandlers(message);\n\n return message;\n }\n\n /**\n * Broadcast a message to all agents\n */\n async broadcast(\n from: string,\n content: string,\n options?: {\n taskId?: string;\n metadata?: Record<string, unknown>;\n }\n ): Promise<TeamMessage> {\n const message: TeamMessage = {\n id: randomUUID(),\n type: 'broadcast',\n from,\n content,\n taskId: options?.taskId,\n metadata: options?.metadata,\n timestamp: new Date(),\n };\n\n this.addMessage(message);\n\n // Notify all registered handlers\n for (const [agentId, handlers] of this.handlers) {\n if (agentId !== from) {\n for (const handler of handlers) {\n try {\n await handler(message);\n } catch {\n // Ignore handler errors\n }\n }\n }\n }\n\n await this.notifyGlobalHandlers(message);\n\n return message;\n }\n\n /**\n * Submit a plan for approval\n */\n async submitPlan(\n from: string,\n leaderId: string,\n taskId: string,\n planSummary: string\n ): Promise<TeamMessage> {\n return this.send(from, leaderId, planSummary, {\n type: 'plan_submit',\n taskId,\n metadata: { action: 'submit_plan' },\n });\n }\n\n /**\n * Approve a plan\n */\n async approvePlan(\n leaderId: string,\n teammateId: string,\n taskId: string,\n feedback?: string\n ): Promise<TeamMessage> {\n return this.send(leaderId, teammateId, feedback || 'Plan approved', {\n type: 'plan_approve',\n taskId,\n metadata: { action: 'approve_plan' },\n });\n }\n\n /**\n * Reject a plan\n */\n async rejectPlan(\n leaderId: string,\n teammateId: string,\n taskId: string,\n reason: string\n ): Promise<TeamMessage> {\n return this.send(leaderId, teammateId, reason, {\n type: 'plan_reject',\n taskId,\n metadata: { action: 'reject_plan' },\n });\n }\n\n /**\n * Request shutdown\n */\n async requestShutdown(\n from: string,\n leaderId: string,\n reason?: string\n ): Promise<TeamMessage> {\n return this.send(from, leaderId, reason || 'Requesting shutdown', {\n type: 'shutdown_request',\n metadata: { action: 'shutdown_request' },\n });\n }\n\n /**\n * Approve shutdown\n */\n async approveShutdown(\n leaderId: string,\n agentId: string\n ): Promise<TeamMessage> {\n return this.send(leaderId, agentId, 'Shutdown approved', {\n type: 'shutdown_approve',\n metadata: { action: 'shutdown_approve' },\n });\n }\n\n /**\n * Send task assignment notification\n */\n async notifyTaskAssignment(\n leaderId: string,\n agentId: string,\n taskId: string,\n taskSummary: string\n ): Promise<TeamMessage> {\n return this.send(leaderId, agentId, taskSummary, {\n type: 'task_assign',\n taskId,\n metadata: { action: 'assign_task' },\n });\n }\n\n /**\n * Request review\n */\n async requestReview(\n from: string,\n reviewerId: string,\n taskId: string,\n details: string\n ): Promise<TeamMessage> {\n return this.send(from, reviewerId, details, {\n type: 'review_request',\n taskId,\n metadata: { action: 'request_review' },\n });\n }\n\n /**\n * Complete review\n */\n async completeReview(\n reviewerId: string,\n agentId: string,\n taskId: string,\n result: string,\n passed: boolean\n ): Promise<TeamMessage> {\n return this.send(reviewerId, agentId, result, {\n type: 'review_complete',\n taskId,\n metadata: { action: 'complete_review', passed },\n });\n }\n\n /**\n * Register a message handler for an agent\n */\n registerHandler(agentId: string, handler: MessageHandler): void {\n if (!this.handlers.has(agentId)) {\n this.handlers.set(agentId, new Set());\n }\n this.handlers.get(agentId)!.add(handler);\n }\n\n /**\n * Unregister a message handler\n */\n unregisterHandler(agentId: string, handler: MessageHandler): void {\n const handlers = this.handlers.get(agentId);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n\n /**\n * Register a global message handler (receives all messages)\n */\n registerGlobalHandler(handler: MessageHandler): void {\n this.globalHandlers.add(handler);\n }\n\n /**\n * Unregister a global handler\n */\n unregisterGlobalHandler(handler: MessageHandler): void {\n this.globalHandlers.delete(handler);\n }\n\n /**\n * Get messages for an agent\n */\n getMessagesForAgent(agentId: string): TeamMessage[] {\n return this.messages.filter((m) => m.to === agentId || (m.type === 'broadcast' && m.from !== agentId));\n }\n\n /**\n * Get messages from an agent\n */\n getMessagesFromAgent(agentId: string): TeamMessage[] {\n return this.messages.filter((m) => m.from === agentId);\n }\n\n /**\n * Get messages for a task\n */\n getMessagesForTask(taskId: string): TeamMessage[] {\n return this.messages.filter((m) => m.taskId === taskId);\n }\n\n /**\n * Get all messages\n */\n getAllMessages(): TeamMessage[] {\n return [...this.messages];\n }\n\n /**\n * Get recent messages\n */\n getRecentMessages(count: number): TeamMessage[] {\n return this.messages.slice(-count);\n }\n\n /**\n * Get messages by type\n */\n getMessagesByType(type: MessageType): TeamMessage[] {\n return this.messages.filter((m) => m.type === type);\n }\n\n /**\n * Get conversation between two agents\n */\n getConversation(agent1: string, agent2: string): TeamMessage[] {\n return this.messages.filter(\n (m) =>\n m.type === 'direct' &&\n ((m.from === agent1 && m.to === agent2) || (m.from === agent2 && m.to === agent1))\n );\n }\n\n /**\n * Clear all messages\n */\n clear(): void {\n this.messages = [];\n }\n\n /**\n * Add a message to the history\n */\n private addMessage(message: TeamMessage): void {\n this.messages.push(message);\n\n // Trim if exceeds max\n if (this.messages.length > this.maxMessages) {\n this.messages = this.messages.slice(-this.maxMessages);\n }\n }\n\n /**\n * Notify handlers for a specific agent\n */\n private async notifyHandlers(agentId: string, message: TeamMessage): Promise<void> {\n const handlers = this.handlers.get(agentId);\n if (!handlers) return;\n\n for (const handler of handlers) {\n try {\n await handler(message);\n } catch {\n // Ignore handler errors\n }\n }\n }\n\n /**\n * Notify global handlers\n */\n private async notifyGlobalHandlers(message: TeamMessage): Promise<void> {\n for (const handler of this.globalHandlers) {\n try {\n await handler(message);\n } catch {\n // Ignore handler errors\n }\n }\n }\n\n /**\n * Get message count\n */\n get messageCount(): number {\n return this.messages.length;\n }\n}\n\n/**\n * Create a TeamMessageBus instance\n */\nexport function createMessageBus(options?: { maxMessages?: number }): TeamMessageBus {\n return new TeamMessageBus(options);\n}\n","/**\n * Plan Parser\n *\n * Parses markdown plans into structured StructuredPlan format.\n * Supports multiple plan formats and extracts tasks, steps, and metadata.\n */\n\nimport type {\n StructuredPlan,\n PlanTask,\n TaskStep,\n PlanTaskFiles,\n StepType,\n ParseOptions,\n} from './types.js';\n\n/**\n * PlanParser - Parse markdown plans to structured format\n */\nexport class PlanParser {\n private defaultStepType: StepType;\n\n constructor(options?: { defaultStepType?: StepType }) {\n this.defaultStepType = options?.defaultStepType || 'implement';\n }\n\n /**\n * Parse a markdown plan into structured format\n */\n parse(markdown: string, _options?: ParseOptions): StructuredPlan {\n const lines = markdown.split('\\n');\n const plan: StructuredPlan = {\n name: '',\n goal: '',\n tasks: [],\n status: 'draft',\n createdAt: new Date(),\n };\n\n let currentTask: Partial<PlanTask> | null = null;\n let currentStep: Partial<TaskStep> | null = null;\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeBlockContent: string[] = [];\n let section = '';\n let taskIdCounter = 1;\n let stepCounter = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Handle code blocks\n if (trimmed.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeBlockLang = trimmed.slice(3).trim();\n codeBlockContent = [];\n } else {\n inCodeBlock = false;\n if (currentStep) {\n currentStep.code = codeBlockContent.join('\\n');\n currentStep.language = codeBlockLang || undefined;\n }\n codeBlockLang = '';\n codeBlockContent = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line);\n continue;\n }\n\n // Skip empty lines\n if (!trimmed) continue;\n\n // Parse headers\n if (trimmed.startsWith('#')) {\n const headerMatch = trimmed.match(/^(#+)\\s*(.+)$/);\n if (headerMatch) {\n const level = headerMatch[1].length;\n const title = headerMatch[2].trim();\n\n if (level === 1) {\n // Main plan title\n plan.name = title;\n } else if (level === 2) {\n // Section or task\n section = title.toLowerCase();\n\n // Check if this is a task (numbered or \"Task X:\")\n const taskMatch = title.match(/^(?:Task\\s*)?(\\d+)(?:\\.|\\:)?\\s*(.+)$/i);\n if (taskMatch) {\n // Save current step to previous task first\n if (currentStep && currentStep.description && currentTask) {\n if (!currentTask.steps) currentTask.steps = [];\n currentTask.steps.push(this.finalizeStep(currentStep, stepCounter++));\n }\n\n // Save previous task\n if (currentTask && currentTask.name) {\n plan.tasks.push(this.finalizeTask(currentTask, stepCounter));\n }\n\n currentTask = {\n id: parseInt(taskMatch[1], 10) || taskIdCounter++,\n name: taskMatch[2].trim(),\n files: {},\n steps: [],\n };\n stepCounter = 1;\n currentStep = null;\n section = 'task';\n }\n } else if (level === 3 && currentTask) {\n // Sub-section within task\n const subSection = title.toLowerCase();\n if (subSection.includes('file')) {\n section = 'files';\n } else if (subSection.includes('step')) {\n section = 'steps';\n }\n }\n }\n continue;\n }\n\n // Parse plan metadata\n if (section === 'goal' || section === 'objective') {\n plan.goal = (plan.goal ? plan.goal + ' ' : '') + trimmed;\n continue;\n }\n\n if (section === 'architecture') {\n plan.architecture = (plan.architecture ? plan.architecture + '\\n' : '') + trimmed;\n continue;\n }\n\n if (section === 'tech stack' || section === 'technology') {\n if (trimmed.startsWith('-') || trimmed.startsWith('*')) {\n if (!plan.techStack) plan.techStack = [];\n plan.techStack.push(trimmed.slice(1).trim());\n }\n continue;\n }\n\n // Parse task content\n if (currentTask) {\n // Parse files section\n if (trimmed.toLowerCase() === 'files:' || trimmed.toLowerCase().startsWith('**files')) {\n section = 'files';\n continue;\n }\n\n if (section === 'files') {\n const files = this.parseFiles(trimmed);\n if (files) {\n currentTask.files = { ...currentTask.files, ...files };\n }\n continue;\n }\n\n // Parse steps\n const stepMatch = trimmed.match(/^(\\d+)[\\.\\)]\\s*(.+)$/);\n if (stepMatch) {\n // Exit files section when we encounter a step\n if (section === 'files') {\n section = 'steps';\n }\n // Save previous step\n if (currentStep && currentStep.description) {\n if (!currentTask.steps) currentTask.steps = [];\n currentTask.steps.push(this.finalizeStep(currentStep, stepCounter++));\n }\n\n currentStep = {\n description: stepMatch[2].trim(),\n type: this.inferStepType(stepMatch[2]),\n };\n continue;\n }\n\n // Parse bullet points as step details\n if ((trimmed.startsWith('-') || trimmed.startsWith('*')) && currentStep) {\n const detail = trimmed.slice(1).trim();\n\n // Check for command\n if (detail.toLowerCase().startsWith('run:') || detail.toLowerCase().startsWith('command:')) {\n currentStep.command = detail.split(':').slice(1).join(':').trim();\n }\n // Check for expected output\n else if (detail.toLowerCase().startsWith('expect:') || detail.toLowerCase().startsWith('output:')) {\n currentStep.expectedOutput = detail.split(':').slice(1).join(':').trim();\n }\n // Check for critical flag\n else if (detail.toLowerCase().includes('critical') || detail.toLowerCase().includes('required')) {\n currentStep.critical = true;\n }\n continue;\n }\n\n // Parse inline metadata\n if (trimmed.toLowerCase().startsWith('estimated:') || trimmed.toLowerCase().startsWith('time:')) {\n const timeMatch = trimmed.match(/(\\d+)\\s*(?:min|minutes?|m)/i);\n if (timeMatch) {\n currentTask.estimatedMinutes = parseInt(timeMatch[1], 10);\n }\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('depends on:') || trimmed.toLowerCase().startsWith('dependencies:')) {\n const depsStr = trimmed.split(':').slice(1).join(':').trim();\n currentTask.dependencies = depsStr\n .split(/[,\\s]+/)\n .map((d) => parseInt(d.replace(/\\D/g, ''), 10))\n .filter((d) => !isNaN(d));\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('priority:')) {\n const priority = parseInt(trimmed.split(':')[1].trim(), 10);\n if (!isNaN(priority)) {\n currentTask.priority = priority;\n }\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('tags:')) {\n currentTask.tags = trimmed\n .split(':')\n .slice(1)\n .join(':')\n .split(/[,\\s]+/)\n .map((t) => t.trim())\n .filter(Boolean);\n continue;\n }\n\n // Add description content\n if (!currentTask.description) {\n currentTask.description = trimmed;\n } else if (section === 'task') {\n currentTask.description += ' ' + trimmed;\n }\n } else {\n // Parse top-level metadata\n if (trimmed.toLowerCase().startsWith('goal:') || trimmed.toLowerCase().startsWith('objective:')) {\n plan.goal = trimmed.split(':').slice(1).join(':').trim();\n section = 'goal';\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('architecture:')) {\n plan.architecture = trimmed.split(':').slice(1).join(':').trim();\n section = 'architecture';\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('author:')) {\n plan.author = trimmed.split(':').slice(1).join(':').trim();\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('version:')) {\n plan.version = trimmed.split(':').slice(1).join(':').trim();\n continue;\n }\n\n if (trimmed.toLowerCase().startsWith('design doc:') || trimmed.toLowerCase().startsWith('designdoc:')) {\n plan.designDoc = trimmed.split(':').slice(1).join(':').trim();\n continue;\n }\n }\n }\n\n // Save last step\n if (currentStep && currentStep.description && currentTask) {\n if (!currentTask.steps) currentTask.steps = [];\n currentTask.steps.push(this.finalizeStep(currentStep, stepCounter));\n }\n\n // Save last task\n if (currentTask && currentTask.name) {\n plan.tasks.push(this.finalizeTask(currentTask, stepCounter));\n }\n\n // Set plan to ready if it has tasks\n if (plan.tasks.length > 0) {\n plan.status = 'ready';\n }\n\n return plan;\n }\n\n /**\n * Parse files from a line\n */\n private parseFiles(line: string): Partial<PlanTaskFiles> | null {\n const files: Partial<PlanTaskFiles> = {};\n\n // Check for create files\n if (line.toLowerCase().includes('create:')) {\n const createPart = line.split(/create:/i)[1];\n if (createPart) {\n files.create = this.extractFilePaths(createPart);\n }\n }\n\n // Check for modify files\n if (line.toLowerCase().includes('modify:')) {\n const modifyPart = line.split(/modify:/i)[1];\n if (modifyPart) {\n files.modify = this.extractFilePaths(modifyPart);\n }\n }\n\n // Check for test files\n if (line.toLowerCase().includes('test:')) {\n const testPart = line.split(/test:/i)[1];\n if (testPart) {\n files.test = this.extractFilePaths(testPart);\n }\n }\n\n // Check for delete files\n if (line.toLowerCase().includes('delete:')) {\n const deletePart = line.split(/delete:/i)[1];\n if (deletePart) {\n files.delete = this.extractFilePaths(deletePart);\n }\n }\n\n // Check for bullet point with file path\n if (line.startsWith('-') || line.startsWith('*')) {\n const content = line.slice(1).trim();\n const pathMatch = content.match(/`([^`]+)`|(\\S+\\.\\w+)/);\n if (pathMatch) {\n const path = pathMatch[1] || pathMatch[2];\n if (content.toLowerCase().includes('create')) {\n files.create = [path];\n } else if (content.toLowerCase().includes('test')) {\n files.test = [path];\n } else if (content.toLowerCase().includes('delete')) {\n files.delete = [path];\n } else {\n files.modify = [path];\n }\n }\n }\n\n return Object.keys(files).length > 0 ? files : null;\n }\n\n /**\n * Extract file paths from a string\n */\n private extractFilePaths(str: string): string[] {\n const paths: string[] = [];\n\n // Match paths in backticks\n const backtickMatches = str.match(/`([^`]+)`/g);\n if (backtickMatches) {\n paths.push(...backtickMatches.map((m) => m.slice(1, -1)));\n }\n\n // Match common file patterns\n const pathMatches = str.match(/[\\w\\-./]+\\.\\w+/g);\n if (pathMatches) {\n paths.push(...pathMatches.filter((p) => !paths.includes(p)));\n }\n\n return paths;\n }\n\n /**\n * Infer step type from description\n */\n private inferStepType(description: string): StepType {\n const lower = description.toLowerCase();\n\n if (lower.includes('test') || lower.includes('spec') || lower.includes('assert')) {\n return 'test';\n }\n if (lower.includes('verify') || lower.includes('check') || lower.includes('confirm') || lower.includes('ensure')) {\n return 'verify';\n }\n if (lower.includes('commit') || lower.includes('git')) {\n return 'commit';\n }\n if (lower.includes('review') || lower.includes('inspect')) {\n return 'review';\n }\n if (lower.includes('setup') || lower.includes('initialize') || lower.includes('configure')) {\n return 'setup';\n }\n if (lower.includes('cleanup') || lower.includes('clean up') || lower.includes('remove')) {\n return 'cleanup';\n }\n\n return this.defaultStepType;\n }\n\n /**\n * Finalize a step\n */\n private finalizeStep(step: Partial<TaskStep>, number: number): TaskStep {\n return {\n number,\n description: step.description || '',\n type: step.type || this.defaultStepType,\n code: step.code,\n language: step.language,\n command: step.command,\n expectedOutput: step.expectedOutput,\n critical: step.critical,\n metadata: step.metadata,\n };\n }\n\n /**\n * Finalize a task\n */\n private finalizeTask(task: Partial<PlanTask>, _stepCounter: number): PlanTask {\n return {\n id: task.id || 1,\n name: task.name || 'Unnamed Task',\n description: task.description,\n files: task.files || {},\n steps: task.steps || [],\n estimatedMinutes: task.estimatedMinutes,\n dependencies: task.dependencies,\n tags: task.tags,\n priority: task.priority,\n status: 'pending',\n metadata: task.metadata,\n };\n }\n\n /**\n * Parse a plan file from path\n */\n async parseFile(filePath: string, options?: ParseOptions): Promise<StructuredPlan> {\n const fs = await import('node:fs/promises');\n const content = await fs.readFile(filePath, 'utf-8');\n return this.parse(content, options);\n }\n}\n\n/**\n * Create a PlanParser instance\n */\nexport function createPlanParser(options?: { defaultStepType?: StepType }): PlanParser {\n return new PlanParser(options);\n}\n","/**\n * Plan Validator\n *\n * Validates structured plans for completeness, correctness, and best practices.\n */\n\nimport type { StructuredPlan, PlanTask, PlanValidationResult, ValidationIssue } from './types.js';\n\n/**\n * Validation options\n */\nexport interface ValidatorOptions {\n /** Maximum task duration in minutes */\n maxTaskMinutes?: number;\n /** Minimum task duration in minutes */\n minTaskMinutes?: number;\n /** Require tests in each task */\n requireTests?: boolean;\n /** Require commits in each task */\n requireCommits?: boolean;\n /** Maximum steps per task */\n maxStepsPerTask?: number;\n /** Minimum steps per task */\n minStepsPerTask?: number;\n /** Require file specifications */\n requireFiles?: boolean;\n /** Strict mode (treat warnings as errors) */\n strict?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ValidatorOptions = {\n maxTaskMinutes: 10,\n minTaskMinutes: 1,\n requireTests: false,\n requireCommits: false,\n maxStepsPerTask: 15,\n minStepsPerTask: 1,\n requireFiles: false,\n strict: false,\n};\n\n/**\n * PlanValidator - Validate structured plans\n */\nexport class PlanValidator {\n private options: ValidatorOptions;\n\n constructor(options?: ValidatorOptions) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Validate a structured plan\n */\n validate(plan: StructuredPlan): PlanValidationResult {\n const issues: ValidationIssue[] = [];\n\n // Validate plan-level fields\n this.validatePlanFields(plan, issues);\n\n // Validate tasks\n this.validateTasks(plan, issues);\n\n // Validate dependencies\n this.validateDependencies(plan, issues);\n\n // Calculate statistics\n const stats = this.calculateStats(plan);\n\n // Check if valid (no errors, or no errors/warnings in strict mode)\n const hasErrors = issues.some((i) => i.type === 'error');\n const hasWarnings = issues.some((i) => i.type === 'warning');\n const valid = !hasErrors && (!this.options.strict || !hasWarnings);\n\n return { valid, issues, stats };\n }\n\n /**\n * Validate plan-level fields\n */\n private validatePlanFields(plan: StructuredPlan, issues: ValidationIssue[]): void {\n // Name is required\n if (!plan.name || !plan.name.trim()) {\n issues.push({\n type: 'error',\n message: 'Plan must have a name',\n suggestion: 'Add a title to the plan using a # header',\n });\n }\n\n // Goal is required\n if (!plan.goal || !plan.goal.trim()) {\n issues.push({\n type: 'error',\n message: 'Plan must have a goal/objective',\n suggestion: 'Add a goal: field or Goal section to the plan',\n });\n }\n\n // Tasks are required\n if (!plan.tasks || plan.tasks.length === 0) {\n issues.push({\n type: 'error',\n message: 'Plan must have at least one task',\n suggestion: 'Add tasks using ## Task N: Task Name headers',\n });\n }\n\n // Architecture is recommended\n if (!plan.architecture) {\n issues.push({\n type: 'info',\n message: 'Plan has no architecture description',\n suggestion: 'Add an architecture section to describe the high-level design',\n });\n }\n\n // Tech stack is recommended\n if (!plan.techStack || plan.techStack.length === 0) {\n issues.push({\n type: 'info',\n message: 'Plan has no tech stack specified',\n suggestion: 'Add a tech stack section listing technologies used',\n });\n }\n }\n\n /**\n * Validate tasks\n */\n private validateTasks(plan: StructuredPlan, issues: ValidationIssue[]): void {\n const taskIds = new Set<number>();\n\n for (const task of plan.tasks) {\n // Check for duplicate task IDs\n if (taskIds.has(task.id)) {\n issues.push({\n type: 'error',\n message: `Duplicate task ID: ${task.id}`,\n taskId: task.id,\n suggestion: 'Ensure each task has a unique ID',\n });\n }\n taskIds.add(task.id);\n\n // Validate task fields\n this.validateTaskFields(task, issues);\n\n // Validate task steps\n this.validateTaskSteps(task, issues);\n\n // Check for tests\n if (this.options.requireTests) {\n const hasTestStep = task.steps.some((s) => s.type === 'test');\n const hasTestFiles = task.files.test && task.files.test.length > 0;\n\n if (!hasTestStep && !hasTestFiles) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has no test step or test files`,\n taskId: task.id,\n suggestion: 'Add a test step or specify test files',\n });\n }\n }\n\n // Check for commits\n if (this.options.requireCommits) {\n const hasCommitStep = task.steps.some((s) => s.type === 'commit');\n\n if (!hasCommitStep) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has no commit step`,\n taskId: task.id,\n suggestion: 'Add a commit step at the end of the task',\n });\n }\n }\n }\n }\n\n /**\n * Validate task fields\n */\n private validateTaskFields(task: PlanTask, issues: ValidationIssue[]): void {\n // Name is required\n if (!task.name || !task.name.trim()) {\n issues.push({\n type: 'error',\n message: `Task ${task.id} has no name`,\n taskId: task.id,\n suggestion: 'Add a descriptive name to the task',\n });\n }\n\n // Steps are required\n if (!task.steps || task.steps.length === 0) {\n issues.push({\n type: 'error',\n message: `Task ${task.id} has no steps`,\n taskId: task.id,\n suggestion: 'Add numbered steps to describe how to complete the task',\n });\n }\n\n // Check step count\n if (task.steps && task.steps.length > this.options.maxStepsPerTask!) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has too many steps (${task.steps.length} > ${this.options.maxStepsPerTask})`,\n taskId: task.id,\n suggestion: 'Consider breaking this task into smaller tasks',\n });\n }\n\n if (task.steps && task.steps.length < this.options.minStepsPerTask!) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has too few steps (${task.steps.length} < ${this.options.minStepsPerTask})`,\n taskId: task.id,\n suggestion: 'Add more detail to the task steps',\n });\n }\n\n // Check estimated time\n if (task.estimatedMinutes) {\n if (task.estimatedMinutes > this.options.maxTaskMinutes!) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} estimated time (${task.estimatedMinutes} min) exceeds maximum (${this.options.maxTaskMinutes} min)`,\n taskId: task.id,\n suggestion: 'Consider breaking this task into smaller tasks',\n });\n }\n\n if (task.estimatedMinutes < this.options.minTaskMinutes!) {\n issues.push({\n type: 'info',\n message: `Task ${task.id} estimated time (${task.estimatedMinutes} min) is below minimum (${this.options.minTaskMinutes} min)`,\n taskId: task.id,\n suggestion: 'Consider combining with related tasks',\n });\n }\n }\n\n // Check files\n if (this.options.requireFiles) {\n const hasFiles =\n (task.files.create && task.files.create.length > 0) ||\n (task.files.modify && task.files.modify.length > 0) ||\n (task.files.test && task.files.test.length > 0);\n\n if (!hasFiles) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has no files specified`,\n taskId: task.id,\n suggestion: 'Specify which files will be created or modified',\n });\n }\n }\n }\n\n /**\n * Validate task steps\n */\n private validateTaskSteps(task: PlanTask, issues: ValidationIssue[]): void {\n const stepNumbers = new Set<number>();\n\n for (const step of task.steps) {\n // Check for duplicate step numbers\n if (stepNumbers.has(step.number)) {\n issues.push({\n type: 'warning',\n message: `Task ${task.id} has duplicate step number: ${step.number}`,\n taskId: task.id,\n stepNumber: step.number,\n suggestion: 'Ensure each step has a unique number',\n });\n }\n stepNumbers.add(step.number);\n\n // Description is required\n if (!step.description || !step.description.trim()) {\n issues.push({\n type: 'error',\n message: `Task ${task.id}, step ${step.number} has no description`,\n taskId: task.id,\n stepNumber: step.number,\n suggestion: 'Add a description to the step',\n });\n }\n\n // Verify steps should have expected output or command\n if (step.type === 'verify' && !step.expectedOutput && !step.command) {\n issues.push({\n type: 'info',\n message: `Task ${task.id}, step ${step.number} is a verify step without expected output or command`,\n taskId: task.id,\n stepNumber: step.number,\n suggestion: 'Add expected output or command to verify',\n });\n }\n\n // Test steps should have code or command\n if (step.type === 'test' && !step.code && !step.command) {\n issues.push({\n type: 'info',\n message: `Task ${task.id}, step ${step.number} is a test step without code or command`,\n taskId: task.id,\n stepNumber: step.number,\n suggestion: 'Add test code or test command',\n });\n }\n }\n\n // Check step number sequence\n const sortedNumbers = Array.from(stepNumbers).sort((a, b) => a - b);\n for (let i = 0; i < sortedNumbers.length; i++) {\n if (sortedNumbers[i] !== i + 1) {\n issues.push({\n type: 'info',\n message: `Task ${task.id} has non-sequential step numbers`,\n taskId: task.id,\n suggestion: 'Use sequential step numbers starting from 1',\n });\n break;\n }\n }\n }\n\n /**\n * Validate dependencies\n */\n private validateDependencies(plan: StructuredPlan, issues: ValidationIssue[]): void {\n const taskIds = new Set(plan.tasks.map((t) => t.id));\n\n for (const task of plan.tasks) {\n if (task.dependencies) {\n for (const depId of task.dependencies) {\n // Check dependency exists\n if (!taskIds.has(depId)) {\n issues.push({\n type: 'error',\n message: `Task ${task.id} depends on non-existent task ${depId}`,\n taskId: task.id,\n suggestion: `Remove dependency on task ${depId} or add the missing task`,\n });\n }\n\n // Check for self-dependency\n if (depId === task.id) {\n issues.push({\n type: 'error',\n message: `Task ${task.id} depends on itself`,\n taskId: task.id,\n suggestion: 'Remove self-dependency',\n });\n }\n }\n }\n }\n\n // Check for circular dependencies\n const circularDeps = this.findCircularDependencies(plan);\n for (const cycle of circularDeps) {\n issues.push({\n type: 'error',\n message: `Circular dependency detected: ${cycle.join(' -> ')}`,\n suggestion: 'Remove one of the dependencies to break the cycle',\n });\n }\n }\n\n /**\n * Find circular dependencies\n */\n private findCircularDependencies(plan: StructuredPlan): number[][] {\n const cycles: number[][] = [];\n const taskMap = new Map(plan.tasks.map((t) => [t.id, t]));\n const visited = new Set<number>();\n const recursionStack = new Set<number>();\n const path: number[] = [];\n\n const dfs = (taskId: number): void => {\n if (recursionStack.has(taskId)) {\n // Found a cycle\n const cycleStart = path.indexOf(taskId);\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), taskId]);\n }\n return;\n }\n\n if (visited.has(taskId)) return;\n\n visited.add(taskId);\n recursionStack.add(taskId);\n path.push(taskId);\n\n const task = taskMap.get(taskId);\n if (task?.dependencies) {\n for (const depId of task.dependencies) {\n dfs(depId);\n }\n }\n\n path.pop();\n recursionStack.delete(taskId);\n };\n\n for (const task of plan.tasks) {\n if (!visited.has(task.id)) {\n dfs(task.id);\n }\n }\n\n return cycles;\n }\n\n /**\n * Calculate plan statistics\n */\n private calculateStats(plan: StructuredPlan): PlanValidationResult['stats'] {\n const totalTasks = plan.tasks.length;\n const totalSteps = plan.tasks.reduce((sum, t) => sum + t.steps.length, 0);\n const estimatedMinutes = plan.tasks.reduce((sum, t) => sum + (t.estimatedMinutes || 3), 0);\n const tasksWithTests = plan.tasks.filter(\n (t) => t.steps.some((s) => s.type === 'test') || (t.files.test && t.files.test.length > 0)\n ).length;\n const tasksWithCommits = plan.tasks.filter((t) => t.steps.some((s) => s.type === 'commit')).length;\n const avgStepsPerTask = totalTasks > 0 ? Math.round((totalSteps / totalTasks) * 10) / 10 : 0;\n\n return {\n totalTasks,\n totalSteps,\n estimatedMinutes,\n tasksWithTests,\n tasksWithCommits,\n avgStepsPerTask,\n };\n }\n\n /**\n * Quick validation check (just returns valid/invalid)\n */\n isValid(plan: StructuredPlan): boolean {\n return this.validate(plan).valid;\n }\n\n /**\n * Get errors only\n */\n getErrors(plan: StructuredPlan): ValidationIssue[] {\n return this.validate(plan).issues.filter((i) => i.type === 'error');\n }\n\n /**\n * Get warnings only\n */\n getWarnings(plan: StructuredPlan): ValidationIssue[] {\n return this.validate(plan).issues.filter((i) => i.type === 'warning');\n }\n}\n\n/**\n * Create a PlanValidator instance\n */\nexport function createPlanValidator(options?: ValidatorOptions): PlanValidator {\n return new PlanValidator(options);\n}\n\n/**\n * Quick validation helper\n */\nexport function validatePlan(plan: StructuredPlan, options?: ValidatorOptions): PlanValidationResult {\n return createPlanValidator(options).validate(plan);\n}\n","/**\n * Plan Generator\n *\n * Generates structured plans and converts them to markdown format.\n */\n\nimport type {\n StructuredPlan,\n PlanTask,\n TaskStep,\n PlanTaskFiles,\n GenerateOptions,\n StepType,\n} from './types.js';\n\n/**\n * Task template for common patterns\n */\nexport interface TaskTemplate {\n name: string;\n description: string;\n steps: Array<{\n type: StepType;\n description: string;\n code?: string;\n command?: string;\n }>;\n estimatedMinutes: number;\n}\n\n/**\n * Common task templates\n */\nexport const TASK_TEMPLATES: Record<string, TaskTemplate> = {\n 'create-component': {\n name: 'Create Component',\n description: 'Create a new React component with tests',\n steps: [\n { type: 'test', description: 'Write failing tests for the component' },\n { type: 'implement', description: 'Create the component file' },\n { type: 'implement', description: 'Implement the component logic' },\n { type: 'verify', description: 'Run tests to verify implementation', command: 'npm test' },\n { type: 'commit', description: 'Commit the changes' },\n ],\n estimatedMinutes: 5,\n },\n 'add-api-endpoint': {\n name: 'Add API Endpoint',\n description: 'Create a new API endpoint with validation and tests',\n steps: [\n { type: 'test', description: 'Write API tests for the endpoint' },\n { type: 'implement', description: 'Define the route and handler' },\n { type: 'implement', description: 'Add input validation' },\n { type: 'implement', description: 'Implement the business logic' },\n { type: 'verify', description: 'Run tests', command: 'npm test' },\n { type: 'commit', description: 'Commit the endpoint' },\n ],\n estimatedMinutes: 5,\n },\n 'fix-bug': {\n name: 'Fix Bug',\n description: 'Fix a bug with a regression test',\n steps: [\n { type: 'test', description: 'Write a failing test that reproduces the bug' },\n { type: 'implement', description: 'Fix the bug' },\n { type: 'verify', description: 'Verify the test passes', command: 'npm test' },\n { type: 'commit', description: 'Commit the fix' },\n ],\n estimatedMinutes: 3,\n },\n 'add-feature': {\n name: 'Add Feature',\n description: 'Add a new feature with TDD',\n steps: [\n { type: 'test', description: 'Write failing tests for the feature' },\n { type: 'implement', description: 'Implement the feature' },\n { type: 'verify', description: 'Run tests', command: 'npm test' },\n { type: 'review', description: 'Review the implementation' },\n { type: 'commit', description: 'Commit the feature' },\n ],\n estimatedMinutes: 5,\n },\n 'refactor': {\n name: 'Refactor',\n description: 'Refactor code while maintaining behavior',\n steps: [\n { type: 'verify', description: 'Ensure all tests pass before refactoring', command: 'npm test' },\n { type: 'implement', description: 'Apply the refactoring' },\n { type: 'verify', description: 'Verify tests still pass', command: 'npm test' },\n { type: 'commit', description: 'Commit the refactoring' },\n ],\n estimatedMinutes: 4,\n },\n};\n\n/**\n * PlanGenerator - Generate and format structured plans\n */\nexport class PlanGenerator {\n private options: GenerateOptions;\n\n constructor(options?: GenerateOptions) {\n this.options = {\n targetTaskMinutes: 5,\n includeTests: true,\n includeCommits: true,\n ...options,\n };\n }\n\n /**\n * Create a new empty plan\n */\n createPlan(name: string, goal: string): StructuredPlan {\n return {\n name,\n goal,\n tasks: [],\n status: 'draft',\n createdAt: new Date(),\n author: this.options.author,\n techStack: this.options.techStack,\n };\n }\n\n /**\n * Add a task to a plan\n */\n addTask(\n plan: StructuredPlan,\n name: string,\n options?: {\n description?: string;\n files?: PlanTaskFiles;\n steps?: Partial<TaskStep>[];\n estimatedMinutes?: number;\n dependencies?: number[];\n tags?: string[];\n priority?: number;\n }\n ): PlanTask {\n const id = plan.tasks.length > 0 ? Math.max(...plan.tasks.map((t) => t.id)) + 1 : 1;\n\n const task: PlanTask = {\n id,\n name,\n description: options?.description,\n files: options?.files || {},\n steps: (options?.steps || []).map((s, i) => ({\n number: i + 1,\n description: s.description || '',\n type: s.type || 'implement',\n code: s.code,\n language: s.language,\n command: s.command,\n expectedOutput: s.expectedOutput,\n critical: s.critical,\n })),\n estimatedMinutes: options?.estimatedMinutes || this.options.targetTaskMinutes,\n dependencies: options?.dependencies,\n tags: options?.tags,\n priority: options?.priority,\n status: 'pending',\n };\n\n // Add test step if required and not present\n if (this.options.includeTests && !task.steps.some((s) => s.type === 'test')) {\n task.steps.unshift({\n number: 0,\n description: 'Write tests for the implementation',\n type: 'test',\n });\n // Renumber steps\n task.steps.forEach((s, i) => (s.number = i + 1));\n }\n\n // Add commit step if required and not present\n if (this.options.includeCommits && !task.steps.some((s) => s.type === 'commit')) {\n task.steps.push({\n number: task.steps.length + 1,\n description: 'Commit changes',\n type: 'commit',\n });\n }\n\n plan.tasks.push(task);\n plan.updatedAt = new Date();\n\n return task;\n }\n\n /**\n * Add a task from a template\n */\n addTaskFromTemplate(\n plan: StructuredPlan,\n templateName: keyof typeof TASK_TEMPLATES | string,\n customization?: {\n name?: string;\n description?: string;\n files?: PlanTaskFiles;\n dependencies?: number[];\n tags?: string[];\n }\n ): PlanTask | undefined {\n const template = TASK_TEMPLATES[templateName];\n if (!template) return undefined;\n\n return this.addTask(plan, customization?.name || template.name, {\n description: customization?.description || template.description,\n files: customization?.files,\n steps: template.steps,\n estimatedMinutes: template.estimatedMinutes,\n dependencies: customization?.dependencies,\n tags: customization?.tags,\n });\n }\n\n /**\n * Generate markdown from a structured plan\n */\n toMarkdown(plan: StructuredPlan): string {\n const lines: string[] = [];\n\n // Title\n lines.push(`# ${plan.name}`);\n lines.push('');\n\n // Metadata\n if (plan.version) {\n lines.push(`Version: ${plan.version}`);\n }\n if (plan.author) {\n lines.push(`Author: ${plan.author}`);\n }\n if (plan.designDoc) {\n lines.push(`Design Doc: ${plan.designDoc}`);\n }\n if (plan.version || plan.author || plan.designDoc) {\n lines.push('');\n }\n\n // Goal\n lines.push('## Goal');\n lines.push('');\n lines.push(plan.goal);\n lines.push('');\n\n // Architecture\n if (plan.architecture) {\n lines.push('## Architecture');\n lines.push('');\n lines.push(plan.architecture);\n lines.push('');\n }\n\n // Tech Stack\n if (plan.techStack && plan.techStack.length > 0) {\n lines.push('## Tech Stack');\n lines.push('');\n for (const tech of plan.techStack) {\n lines.push(`- ${tech}`);\n }\n lines.push('');\n }\n\n // Tasks\n lines.push('## Tasks');\n lines.push('');\n\n for (const task of plan.tasks) {\n lines.push(`### Task ${task.id}: ${task.name}`);\n lines.push('');\n\n if (task.description) {\n lines.push(task.description);\n lines.push('');\n }\n\n // Files\n const hasFiles =\n (task.files.create && task.files.create.length > 0) ||\n (task.files.modify && task.files.modify.length > 0) ||\n (task.files.test && task.files.test.length > 0) ||\n (task.files.delete && task.files.delete.length > 0);\n\n if (hasFiles) {\n lines.push('**Files:**');\n if (task.files.create && task.files.create.length > 0) {\n lines.push(`- Create: ${task.files.create.map((f) => `\\`${f}\\``).join(', ')}`);\n }\n if (task.files.modify && task.files.modify.length > 0) {\n lines.push(`- Modify: ${task.files.modify.map((f) => `\\`${f}\\``).join(', ')}`);\n }\n if (task.files.test && task.files.test.length > 0) {\n lines.push(`- Test: ${task.files.test.map((f) => `\\`${f}\\``).join(', ')}`);\n }\n if (task.files.delete && task.files.delete.length > 0) {\n lines.push(`- Delete: ${task.files.delete.map((f) => `\\`${f}\\``).join(', ')}`);\n }\n lines.push('');\n }\n\n // Metadata\n if (task.estimatedMinutes) {\n lines.push(`Estimated: ${task.estimatedMinutes} minutes`);\n }\n if (task.dependencies && task.dependencies.length > 0) {\n lines.push(`Depends on: ${task.dependencies.map((d) => `Task ${d}`).join(', ')}`);\n }\n if (task.tags && task.tags.length > 0) {\n lines.push(`Tags: ${task.tags.join(', ')}`);\n }\n if (task.priority !== undefined) {\n lines.push(`Priority: ${task.priority}`);\n }\n if (task.estimatedMinutes || task.dependencies?.length || task.tags?.length || task.priority !== undefined) {\n lines.push('');\n }\n\n // Steps\n lines.push('**Steps:**');\n lines.push('');\n\n for (const step of task.steps) {\n const typeLabel = step.type !== 'implement' ? ` [${step.type}]` : '';\n lines.push(`${step.number}. ${step.description}${typeLabel}`);\n\n if (step.command) {\n lines.push(` - Run: \\`${step.command}\\``);\n }\n if (step.expectedOutput) {\n lines.push(` - Expect: ${step.expectedOutput}`);\n }\n if (step.critical) {\n lines.push(` - Critical: Yes`);\n }\n\n if (step.code) {\n lines.push('');\n lines.push(` \\`\\`\\`${step.language || ''}`);\n for (const codeLine of step.code.split('\\n')) {\n lines.push(` ${codeLine}`);\n }\n lines.push(' ```');\n }\n }\n\n lines.push('');\n }\n\n // Summary\n const totalMinutes = plan.tasks.reduce((sum, t) => sum + (t.estimatedMinutes || 3), 0);\n lines.push('---');\n lines.push('');\n lines.push(`**Summary:** ${plan.tasks.length} tasks, ~${totalMinutes} minutes estimated`);\n lines.push(`**Created:** ${plan.createdAt.toISOString().split('T')[0]}`);\n if (plan.updatedAt) {\n lines.push(`**Updated:** ${plan.updatedAt.toISOString().split('T')[0]}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Generate a plan from a simple task list\n */\n fromTaskList(\n name: string,\n goal: string,\n taskNames: string[],\n options?: {\n architecture?: string;\n techStack?: string[];\n template?: keyof typeof TASK_TEMPLATES;\n }\n ): StructuredPlan {\n const plan = this.createPlan(name, goal);\n\n if (options?.architecture) {\n plan.architecture = options.architecture;\n }\n if (options?.techStack) {\n plan.techStack = options.techStack;\n }\n\n for (let i = 0; i < taskNames.length; i++) {\n const taskName = taskNames[i];\n\n if (options?.template) {\n this.addTaskFromTemplate(plan, options.template, {\n name: taskName,\n dependencies: i > 0 ? [i] : undefined,\n });\n } else {\n this.addTask(plan, taskName, {\n dependencies: i > 0 ? [i] : undefined,\n });\n }\n }\n\n return plan;\n }\n\n /**\n * Clone a plan\n */\n clonePlan(plan: StructuredPlan, newName?: string): StructuredPlan {\n return {\n ...plan,\n name: newName || `${plan.name} (copy)`,\n tasks: plan.tasks.map((t) => ({\n ...t,\n steps: [...t.steps],\n files: { ...t.files },\n dependencies: t.dependencies ? [...t.dependencies] : undefined,\n tags: t.tags ? [...t.tags] : undefined,\n status: 'pending',\n result: undefined,\n })),\n status: 'draft',\n createdAt: new Date(),\n updatedAt: undefined,\n };\n }\n\n /**\n * Merge two plans\n */\n mergePlans(plan1: StructuredPlan, plan2: StructuredPlan, newName?: string): StructuredPlan {\n const merged = this.clonePlan(plan1, newName || `${plan1.name} + ${plan2.name}`);\n\n // Offset task IDs from plan2\n const maxId = Math.max(...merged.tasks.map((t) => t.id), 0);\n\n for (const task of plan2.tasks) {\n const newTask: PlanTask = {\n ...task,\n id: task.id + maxId,\n steps: [...task.steps],\n files: { ...task.files },\n dependencies: task.dependencies?.map((d) => d + maxId),\n tags: task.tags ? [...task.tags] : undefined,\n status: 'pending',\n result: undefined,\n };\n merged.tasks.push(newTask);\n }\n\n // Merge tech stacks\n if (plan2.techStack) {\n merged.techStack = [...(merged.techStack || []), ...plan2.techStack.filter((t) => !(merged.techStack || []).includes(t))];\n }\n\n merged.goal = `${merged.goal}\\n\\n${plan2.goal}`;\n merged.updatedAt = new Date();\n\n return merged;\n }\n}\n\n/**\n * Create a PlanGenerator instance\n */\nexport function createPlanGenerator(options?: GenerateOptions): PlanGenerator {\n return new PlanGenerator(options);\n}\n","/**\n * Plan Executor\n *\n * Executes structured plans with progress tracking and event handling.\n */\n\nimport type {\n StructuredPlan,\n PlanTask,\n TaskStep,\n PlanTaskResult,\n PlanExecutionOptions,\n PlanExecutionResult,\n PlanEvent,\n PlanEventListener,\n} from './types.js';\n\n/**\n * Step executor function type\n */\nexport type StepExecutor = (\n step: TaskStep,\n task: PlanTask,\n plan: StructuredPlan\n) => Promise<{ success: boolean; output: string; error?: string }>;\n\n/**\n * PlanExecutor - Execute structured plans\n */\nexport class PlanExecutor {\n private listeners: Set<PlanEventListener> = new Set();\n private stepExecutor?: StepExecutor;\n private abortController?: AbortController;\n private isPaused = false;\n private resumePromise?: Promise<void>;\n private resumeResolve?: () => void;\n\n constructor(options?: { stepExecutor?: StepExecutor }) {\n this.stepExecutor = options?.stepExecutor;\n }\n\n /**\n * Set the step executor\n */\n setStepExecutor(executor: StepExecutor): void {\n this.stepExecutor = executor;\n }\n\n /**\n * Execute a plan\n */\n async execute(plan: StructuredPlan, options?: PlanExecutionOptions): Promise<PlanExecutionResult> {\n const startTime = Date.now();\n let aborted = false;\n const result: PlanExecutionResult = {\n success: true,\n completedTasks: [],\n failedTasks: [],\n skippedTasks: [],\n durationMs: 0,\n taskResults: new Map(),\n };\n\n // Initialize abort controller\n this.abortController = new AbortController();\n this.isPaused = false;\n\n // Update plan status\n plan.status = 'executing';\n this.emit('plan:execution_started', plan);\n\n try {\n // Build dependency graph\n const dependencyGraph = this.buildDependencyGraph(plan);\n\n // Get execution order\n const executionOrder = this.getExecutionOrder(plan, dependencyGraph);\n\n // Execute tasks\n for (const taskId of executionOrder) {\n // Check if aborted\n if (this.abortController.signal.aborted) {\n aborted = true;\n result.success = false;\n result.errors = [...(result.errors ?? []), 'Execution cancelled'];\n break;\n }\n\n // Wait if paused\n await this.waitIfPaused();\n\n // Re-check if aborted after resuming from pause\n if (this.abortController.signal.aborted) {\n aborted = true;\n result.success = false;\n result.errors = [...(result.errors ?? []), 'Execution cancelled'];\n break;\n }\n\n const task = plan.tasks.find((t) => t.id === taskId);\n if (!task) continue;\n\n // Check if dependencies completed\n const depsCompleted = this.checkDependencies(task, result);\n if (!depsCompleted) {\n task.status = 'skipped';\n result.skippedTasks.push(taskId);\n continue;\n }\n\n // Execute task\n const taskResult = await this.executeTask(task, plan, options);\n result.taskResults.set(taskId, taskResult);\n\n if (taskResult.success) {\n task.status = 'completed';\n task.result = taskResult;\n result.completedTasks.push(taskId);\n this.emit('plan:task_completed', plan, task, taskResult);\n } else {\n task.status = 'failed';\n task.result = taskResult;\n result.failedTasks.push(taskId);\n result.success = false;\n this.emit('plan:task_failed', plan, task, taskResult);\n\n if (options?.stopOnError) {\n // Mark remaining tasks as skipped\n for (const remainingId of executionOrder.slice(executionOrder.indexOf(taskId) + 1)) {\n const remainingTask = plan.tasks.find((t) => t.id === remainingId);\n if (remainingTask) {\n remainingTask.status = 'skipped';\n result.skippedTasks.push(remainingId);\n }\n }\n break;\n }\n }\n }\n\n // Update plan status\n plan.status = aborted ? 'cancelled' : result.success ? 'completed' : 'failed';\n plan.updatedAt = new Date();\n\n result.durationMs = Date.now() - startTime;\n\n // Emit appropriate event\n if (aborted) {\n this.emit('plan:execution_cancelled', plan);\n } else if (result.success) {\n this.emit('plan:execution_completed', plan);\n } else {\n this.emit('plan:execution_failed', plan);\n }\n\n return result;\n } catch (error) {\n plan.status = 'failed';\n result.success = false;\n result.durationMs = Date.now() - startTime;\n result.errors = [(error as Error).message];\n\n this.emit('plan:execution_failed', plan);\n return result;\n } finally {\n // Reset executor state\n this.abortController = undefined;\n this.isPaused = false;\n this.resumePromise = undefined;\n this.resumeResolve = undefined;\n }\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: PlanTask,\n plan: StructuredPlan,\n options?: PlanExecutionOptions\n ): Promise<PlanTaskResult> {\n const startTime = Date.now();\n const errors: string[] = [];\n const filesCreated: string[] = [];\n const filesModified: string[] = [];\n\n task.status = 'in_progress';\n this.emit('plan:task_started', plan, task);\n\n // Report progress\n options?.onProgress?.(task.id, 0, 'starting');\n\n // Execute steps\n for (let i = 0; i < task.steps.length; i++) {\n const step = task.steps[i];\n\n // Check if aborted\n if (this.abortController?.signal.aborted) {\n errors.push('Execution aborted');\n break;\n }\n\n // Wait if paused\n await this.waitIfPaused();\n\n // Re-check if aborted after resuming from pause\n if (this.abortController?.signal.aborted) {\n errors.push('Execution aborted');\n break;\n }\n\n // Report progress\n options?.onProgress?.(task.id, step.number, `executing step ${step.number}`);\n\n // Execute step\n if (options?.dryRun) {\n // Dry run - just log\n console.log(`[DRY RUN] Task ${task.id}, Step ${step.number}: ${step.description}`);\n if (step.command) {\n console.log(` Command: ${step.command}`);\n }\n if (step.code) {\n console.log(` Code: ${step.code.substring(0, 100)}...`);\n }\n } else if (this.stepExecutor) {\n try {\n const stepResult = await this.executeWithTimeout(\n this.stepExecutor(step, task, plan),\n options?.taskTimeout || 60000\n );\n\n if (!stepResult.success) {\n errors.push(`Step ${step.number}: ${stepResult.error || 'Failed'}`);\n\n if (step.critical) {\n break;\n }\n }\n } catch (error) {\n errors.push(`Step ${step.number}: ${(error as Error).message}`);\n\n if (step.critical) {\n break;\n }\n }\n } else {\n // No step executor configured - fail fast\n errors.push('No step executor configured');\n break;\n }\n }\n\n // Collect file changes\n if (task.files.create) filesCreated.push(...task.files.create);\n if (task.files.modify) filesModified.push(...task.files.modify);\n\n const result: PlanTaskResult = {\n success: errors.length === 0,\n output: errors.length === 0 ? `Task ${task.id} completed successfully` : `Task ${task.id} failed`,\n filesCreated: filesCreated.length > 0 ? filesCreated : undefined,\n filesModified: filesModified.length > 0 ? filesModified : undefined,\n errors: errors.length > 0 ? errors : undefined,\n durationMs: Date.now() - startTime,\n completedAt: new Date(),\n };\n\n // Callback\n options?.onTaskComplete?.(task, result);\n\n return result;\n }\n\n /**\n * Execute with timeout\n */\n private async executeWithTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error('Timeout')), timeoutMs)),\n ]);\n }\n\n /**\n * Build dependency graph\n */\n private buildDependencyGraph(plan: StructuredPlan): Map<number, number[]> {\n const graph = new Map<number, number[]>();\n\n for (const task of plan.tasks) {\n graph.set(task.id, task.dependencies || []);\n }\n\n return graph;\n }\n\n /**\n * Get execution order using topological sort\n */\n private getExecutionOrder(plan: StructuredPlan, graph: Map<number, number[]>): number[] {\n const order: number[] = [];\n const visited = new Set<number>();\n const temp = new Set<number>();\n\n const visit = (id: number): void => {\n if (temp.has(id)) {\n throw new Error(`Circular dependency detected at task ${id}`);\n }\n if (visited.has(id)) return;\n\n temp.add(id);\n\n const deps = graph.get(id) || [];\n for (const dep of deps) {\n visit(dep);\n }\n\n temp.delete(id);\n visited.add(id);\n order.push(id);\n };\n\n for (const task of plan.tasks) {\n if (!visited.has(task.id)) {\n visit(task.id);\n }\n }\n\n return order;\n }\n\n /**\n * Check if dependencies are completed\n */\n private checkDependencies(task: PlanTask, result: PlanExecutionResult): boolean {\n if (!task.dependencies || task.dependencies.length === 0) {\n return true;\n }\n\n return task.dependencies.every((depId) => result.completedTasks.includes(depId));\n }\n\n /**\n * Pause execution\n */\n pause(): void {\n if (!this.isPaused) {\n this.isPaused = true;\n this.resumePromise = new Promise((resolve) => {\n this.resumeResolve = resolve;\n });\n this.emit('plan:paused', {} as StructuredPlan);\n }\n }\n\n /**\n * Resume execution\n */\n resume(): void {\n if (this.isPaused && this.resumeResolve) {\n this.isPaused = false;\n this.resumeResolve();\n this.resumeResolve = undefined;\n this.resumePromise = undefined;\n this.emit('plan:resumed', {} as StructuredPlan);\n }\n }\n\n /**\n * Cancel execution\n */\n cancel(): void {\n this.abortController?.abort();\n\n // Unblock any pending pause to prevent hanging\n if (this.isPaused && this.resumeResolve) {\n this.isPaused = false;\n this.resumeResolve();\n this.resumeResolve = undefined;\n this.resumePromise = undefined;\n }\n }\n\n /**\n * Wait if paused\n */\n private async waitIfPaused(): Promise<void> {\n if (this.isPaused && this.resumePromise) {\n await this.resumePromise;\n }\n }\n\n /**\n * Add event listener\n */\n addListener(listener: PlanEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: PlanEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Emit event\n */\n private emit(event: PlanEvent, plan: StructuredPlan, task?: PlanTask, result?: PlanTaskResult): void {\n for (const listener of this.listeners) {\n try {\n listener(event, plan, task, result);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n /**\n * Check if currently executing\n */\n isExecuting(): boolean {\n return this.abortController !== undefined && !this.abortController.signal.aborted;\n }\n\n /**\n * Check if paused\n */\n isPausedState(): boolean {\n return this.isPaused;\n }\n}\n\n/**\n * Create a PlanExecutor instance\n */\nexport function createPlanExecutor(options?: { stepExecutor?: StepExecutor }): PlanExecutor {\n return new PlanExecutor(options);\n}\n\n/**\n * Default step executor (dry run)\n */\nexport const dryRunExecutor: StepExecutor = async (step, task, _plan) => {\n console.log(`[DRY RUN] Task ${task.id}, Step ${step.number}: ${step.description}`);\n return { success: true, output: 'Dry run completed' };\n};\n\n/**\n * Shell step executor (runs commands)\n */\nexport const shellExecutor: StepExecutor = async (step, _task, _plan) => {\n if (!step.command) {\n return { success: true, output: 'No command to execute' };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n const output = execSync(step.command, { encoding: 'utf-8', timeout: 60000 });\n\n // Check expected output if provided\n if (step.expectedOutput && !output.includes(step.expectedOutput)) {\n return {\n success: false,\n output,\n error: `Expected output \"${step.expectedOutput}\" not found`,\n };\n }\n\n return { success: true, output };\n } catch (error) {\n return {\n success: false,\n output: '',\n error: (error as Error).message,\n };\n }\n};\n","/**\n * Command Registry\n *\n * Central registry for managing slash commands.\n */\n\nimport type {\n SlashCommand,\n RegisteredCommand,\n CommandRegistryOptions,\n CommandSearchOptions,\n CommandValidationResult,\n CommandHandler,\n CommandEvent,\n CommandEventListener,\n CommandContext,\n SlashCommandResult,\n CommandBundle,\n} from './types.js';\n\n/**\n * CommandRegistry - Central registry for slash commands\n */\nexport class CommandRegistry {\n private commands: Map<string, RegisteredCommand> = new Map();\n private aliases: Map<string, string> = new Map();\n private listeners: Set<CommandEventListener> = new Set();\n private options: CommandRegistryOptions;\n\n constructor(options?: CommandRegistryOptions) {\n this.options = {\n allowOverrides: false,\n validateOnRegister: true,\n ...options,\n };\n }\n\n /**\n * Register a command\n */\n register(command: SlashCommand, handler?: CommandHandler, source?: string): void {\n // Validate if enabled\n if (this.options.validateOnRegister) {\n const validation = this.validate(command);\n if (!validation.valid) {\n throw new Error(`Invalid command: ${validation.errors.join(', ')}`);\n }\n }\n\n // Check for existing command\n if (this.commands.has(command.name) && !this.options.allowOverrides) {\n throw new Error(`Command already registered: ${command.name}`);\n }\n\n // Create registered command\n const registered: RegisteredCommand = {\n ...command,\n handler: handler || this.options.defaultHandler,\n enabled: true,\n source,\n };\n\n // Register command\n this.commands.set(command.name, registered);\n\n // Register aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n this.aliases.set(alias, command.name);\n }\n }\n\n this.emit('command:registered', registered);\n }\n\n /**\n * Register multiple commands\n */\n registerAll(commands: SlashCommand[], handler?: CommandHandler, source?: string): void {\n for (const command of commands) {\n this.register(command, handler, source);\n }\n }\n\n /**\n * Unregister a command\n */\n unregister(name: string): boolean {\n const command = this.commands.get(name);\n if (!command) {\n return false;\n }\n\n // Remove aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n this.aliases.delete(alias);\n }\n }\n\n this.commands.delete(name);\n this.emit('command:unregistered', command);\n return true;\n }\n\n /**\n * Get a command by name or alias\n */\n get(name: string): RegisteredCommand | undefined {\n // Check direct name\n const command = this.commands.get(name);\n if (command) {\n return command;\n }\n\n // Check aliases\n const aliasTarget = this.aliases.get(name);\n if (aliasTarget) {\n return this.commands.get(aliasTarget);\n }\n\n return undefined;\n }\n\n /**\n * Check if a command exists\n */\n has(name: string): boolean {\n return this.commands.has(name) || this.aliases.has(name);\n }\n\n /**\n * Get all registered commands\n */\n getAll(includeDisabled = false): RegisteredCommand[] {\n const commands = Array.from(this.commands.values());\n return includeDisabled ? commands : commands.filter((c) => c.enabled);\n }\n\n /**\n * Search commands\n */\n search(options?: CommandSearchOptions): RegisteredCommand[] {\n let commands = this.getAll(options?.includeDisabled);\n\n // Filter hidden\n if (!options?.includeHidden) {\n commands = commands.filter((c) => !c.hidden);\n }\n\n // Filter by category\n if (options?.category) {\n commands = commands.filter((c) => c.category === options.category);\n }\n\n // Filter by tags\n if (options?.tags && options.tags.length > 0) {\n commands = commands.filter((c) => c.tags && options.tags!.some((t) => c.tags!.includes(t)));\n }\n\n // Search by query\n if (options?.query) {\n const query = options.query.toLowerCase();\n commands = commands.filter(\n (c) =>\n c.name.toLowerCase().includes(query) ||\n c.description.toLowerCase().includes(query) ||\n c.aliases?.some((a) => a.toLowerCase().includes(query))\n );\n }\n\n // Sort by priority\n commands.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n // Limit results\n if (options?.limit) {\n commands = commands.slice(0, options.limit);\n }\n\n return commands;\n }\n\n /**\n * Enable a command\n */\n enable(name: string): boolean {\n const command = this.commands.get(name);\n if (!command) {\n return false;\n }\n\n command.enabled = true;\n this.emit('command:enabled', command);\n return true;\n }\n\n /**\n * Disable a command\n */\n disable(name: string): boolean {\n const command = this.commands.get(name);\n if (!command) {\n return false;\n }\n\n command.enabled = false;\n this.emit('command:disabled', command);\n return true;\n }\n\n /**\n * Execute a command\n */\n async execute(name: string, context: Omit<CommandContext, 'command'>): Promise<SlashCommandResult> {\n const command = this.get(name);\n if (!command) {\n return {\n success: false,\n error: `Command not found: ${name}`,\n };\n }\n\n if (!command.enabled) {\n return {\n success: false,\n error: `Command is disabled: ${name}`,\n };\n }\n\n if (!command.handler) {\n return {\n success: false,\n error: `Command has no handler: ${name}`,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const result = await command.handler({\n ...context,\n command,\n });\n\n result.durationMs = Date.now() - startTime;\n this.emit('command:executed', command, result);\n return result;\n } catch (error) {\n const result: SlashCommandResult = {\n success: false,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n this.emit('command:failed', command, result);\n return result;\n }\n }\n\n /**\n * Validate a command\n */\n validate(command: SlashCommand): CommandValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Name is required\n if (!command.name || !command.name.trim()) {\n errors.push('Command must have a name');\n } else {\n // Name format validation\n if (!/^[a-z][a-z0-9-]*$/.test(command.name)) {\n errors.push('Command name must start with a letter and contain only lowercase letters, numbers, and hyphens');\n }\n }\n\n // Description is required\n if (!command.description || !command.description.trim()) {\n errors.push('Command must have a description');\n }\n\n // Skill is required\n if (!command.skill || !command.skill.trim()) {\n errors.push('Command must reference a skill');\n }\n\n // Validate aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n if (!/^[a-z][a-z0-9-]*$/.test(alias)) {\n errors.push(`Invalid alias format: ${alias}`);\n }\n }\n }\n\n // Validate args\n if (command.args) {\n const argNames = new Set<string>();\n for (const arg of command.args) {\n if (!arg.name || !arg.name.trim()) {\n errors.push('Argument must have a name');\n } else if (argNames.has(arg.name)) {\n errors.push(`Duplicate argument name: ${arg.name}`);\n } else {\n argNames.add(arg.name);\n }\n\n if (!arg.description || !arg.description.trim()) {\n warnings.push(`Argument ${arg.name} has no description`);\n }\n }\n }\n\n // Validate examples\n if (!command.examples || command.examples.length === 0) {\n warnings.push('Command has no usage examples');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Get categories\n */\n getCategories(): string[] {\n const categories = new Set<string>();\n for (const command of this.commands.values()) {\n if (command.category) {\n categories.add(command.category);\n }\n }\n return Array.from(categories).sort();\n }\n\n /**\n * Get commands by category\n */\n getByCategory(category: string): RegisteredCommand[] {\n return this.getAll().filter((c) => c.category === category);\n }\n\n /**\n * Export commands to bundle\n */\n export(includeDisabled = false): CommandBundle {\n const commands = this.getAll(includeDisabled).map((c) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { handler, enabled, source, ...command } = c;\n return command;\n });\n\n return {\n version: '1.0.0',\n commands,\n metadata: {\n createdAt: new Date(),\n },\n };\n }\n\n /**\n * Import commands from bundle\n */\n import(bundle: CommandBundle, handler?: CommandHandler, source?: string): number {\n let imported = 0;\n for (const command of bundle.commands) {\n try {\n this.register(command, handler, source);\n imported++;\n } catch {\n // Skip commands that fail to register\n }\n }\n return imported;\n }\n\n /**\n * Clear all commands\n */\n clear(): void {\n this.commands.clear();\n this.aliases.clear();\n }\n\n /**\n * Get command count\n */\n get size(): number {\n return this.commands.size;\n }\n\n /**\n * Add event listener\n */\n addListener(listener: CommandEventListener): void {\n this.listeners.add(listener);\n }\n\n /**\n * Remove event listener\n */\n removeListener(listener: CommandEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Emit event\n */\n private emit(event: CommandEvent, command: RegisteredCommand, result?: SlashCommandResult): void {\n for (const listener of this.listeners) {\n try {\n listener(event, command, result);\n } catch {\n // Ignore listener errors\n }\n }\n }\n}\n\n/**\n * Create a CommandRegistry instance\n */\nexport function createCommandRegistry(options?: CommandRegistryOptions): CommandRegistry {\n return new CommandRegistry(options);\n}\n","/**\n * Command Generator\n *\n * Generates agent-specific slash commands from skills.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill } from '../translator/types.js';\nimport type {\n SlashCommand,\n CommandGeneratorOptions,\n AgentCommandFormat,\n RegisteredCommand,\n} from './types.js';\n\n/**\n * Agent command formats\n */\nconst AGENT_FORMATS: Record<AgentType, AgentCommandFormat> = {\n 'claude-code': {\n agent: 'claude-code',\n extension: '.md',\n directory: '.claude/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n cursor: {\n agent: 'cursor',\n extension: '.mdc',\n directory: '.cursor/rules',\n supportsSlashCommands: false,\n supportsCommandFiles: true,\n },\n codex: {\n agent: 'codex',\n extension: '.md',\n directory: '.codex/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n 'gemini-cli': {\n agent: 'gemini-cli',\n extension: '.md',\n directory: '.gemini/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n opencode: {\n agent: 'opencode',\n extension: '.md',\n directory: '.opencode/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n antigravity: {\n agent: 'antigravity',\n extension: '.md',\n directory: '.antigravity/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n amp: {\n agent: 'amp',\n extension: '.md',\n directory: '.amp/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n clawdbot: {\n agent: 'clawdbot',\n extension: '.md',\n directory: '.clawdbot/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n droid: {\n agent: 'droid',\n extension: '.md',\n directory: '.factory/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n 'github-copilot': {\n agent: 'github-copilot',\n extension: '.md',\n directory: '.github/copilot/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n goose: {\n agent: 'goose',\n extension: '.md',\n directory: '.goose/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n kilo: {\n agent: 'kilo',\n extension: '.md',\n directory: '.kilocode/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n 'kiro-cli': {\n agent: 'kiro-cli',\n extension: '.md',\n directory: '.kiro/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n roo: {\n agent: 'roo',\n extension: '.md',\n directory: '.roo/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n trae: {\n agent: 'trae',\n extension: '.md',\n directory: '.trae/commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n windsurf: {\n agent: 'windsurf',\n extension: '.md',\n directory: '.windsurf/commands',\n supportsSlashCommands: false,\n supportsCommandFiles: true,\n },\n universal: {\n agent: 'universal',\n extension: '.md',\n directory: 'commands',\n supportsSlashCommands: true,\n supportsCommandFiles: true,\n },\n};\n\n/**\n * CommandGenerator - Generate agent-specific commands\n */\nexport class CommandGenerator {\n private options: Partial<CommandGeneratorOptions>;\n\n constructor(options?: Partial<CommandGeneratorOptions>) {\n this.options = options || {};\n }\n\n /**\n * Get agent command format\n */\n getAgentFormat(agent: AgentType): AgentCommandFormat {\n return AGENT_FORMATS[agent] || AGENT_FORMATS.universal;\n }\n\n /**\n * Generate command from skill\n */\n fromSkill(skill: CanonicalSkill, commandName?: string): SlashCommand {\n return {\n name: commandName || this.slugify(skill.name),\n description: skill.description || `Execute ${skill.name} skill`,\n skill: skill.name,\n tags: skill.tags,\n category: this.inferCategory(skill),\n examples: this.generateExamples(skill, commandName || this.slugify(skill.name)),\n };\n }\n\n /**\n * Generate commands from multiple skills\n */\n fromSkills(skills: CanonicalSkill[]): SlashCommand[] {\n return skills.map((skill) => this.fromSkill(skill));\n }\n\n /**\n * Generate Claude Code command file\n */\n generateClaudeCommand(command: SlashCommand | RegisteredCommand): string {\n const lines: string[] = [];\n\n // Frontmatter\n lines.push('---');\n lines.push(`name: ${command.name}`);\n lines.push(`description: ${command.description}`);\n if (command.aliases && command.aliases.length > 0) {\n lines.push(`aliases: [${command.aliases.join(', ')}]`);\n }\n if (command.disableModelInvocation) {\n lines.push('disableModelInvocation: true');\n }\n if (command.args && command.args.length > 0) {\n lines.push('args:');\n for (const arg of command.args) {\n lines.push(` - name: ${arg.name}`);\n lines.push(` description: ${arg.description}`);\n if (arg.required) lines.push(` required: true`);\n if (arg.default) lines.push(` default: \"${arg.default}\"`);\n }\n }\n lines.push('---');\n lines.push('');\n\n // Command content\n lines.push(`# /${command.name}`);\n lines.push('');\n lines.push(command.description);\n lines.push('');\n\n // Usage examples\n if (command.examples && command.examples.length > 0) {\n lines.push('## Usage');\n lines.push('');\n for (const example of command.examples) {\n lines.push(`- ${example}`);\n }\n lines.push('');\n }\n\n // Skill reference\n lines.push('## Skill');\n lines.push('');\n lines.push(`This command invokes the \\`${command.skill}\\` skill.`);\n lines.push('');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate Claude Code commands\n */\n generateClaudeCommands(commands: (SlashCommand | RegisteredCommand)[]): Map<string, string> {\n const files = new Map<string, string>();\n for (const command of commands) {\n if (this.shouldInclude(command)) {\n const filename = `${command.name}.md`;\n files.set(filename, this.generateClaudeCommand(command));\n }\n }\n return files;\n }\n\n /**\n * Generate Cursor rules with @-mention syntax\n */\n generateCursorRules(commands: (SlashCommand | RegisteredCommand)[]): string {\n const lines: string[] = [];\n\n lines.push('---');\n lines.push('description: Available commands');\n lines.push('globs: [\"**/*\"]');\n lines.push('---');\n lines.push('');\n lines.push('# Available Commands');\n lines.push('');\n lines.push('You can invoke the following commands using @-mentions:');\n lines.push('');\n\n for (const command of commands) {\n if (this.shouldInclude(command)) {\n lines.push(`## @${command.name}`);\n lines.push('');\n lines.push(command.description);\n lines.push('');\n if (command.examples && command.examples.length > 0) {\n lines.push('**Usage:**');\n for (const example of command.examples) {\n lines.push(`- ${example}`);\n }\n lines.push('');\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Generate OpenCode commands\n */\n generateOpenCodeCommands(commands: (SlashCommand | RegisteredCommand)[]): Map<string, string> {\n const files = new Map<string, string>();\n\n for (const command of commands) {\n if (this.shouldInclude(command)) {\n const lines: string[] = [];\n\n // SKILL.md format with command metadata\n lines.push('---');\n lines.push(`name: ${command.name}`);\n lines.push(`description: ${command.description}`);\n lines.push('type: command');\n if (command.aliases && command.aliases.length > 0) {\n lines.push(`aliases: [${command.aliases.join(', ')}]`);\n }\n lines.push('---');\n lines.push('');\n lines.push(`# ${command.name}`);\n lines.push('');\n lines.push(command.description);\n lines.push('');\n\n if (command.args && command.args.length > 0) {\n lines.push('## Arguments');\n lines.push('');\n for (const arg of command.args) {\n const required = arg.required ? '(required)' : '(optional)';\n lines.push(`- \\`${arg.name}\\` ${required}: ${arg.description}`);\n }\n lines.push('');\n }\n\n if (command.examples && command.examples.length > 0) {\n lines.push('## Examples');\n lines.push('');\n for (const example of command.examples) {\n lines.push(`- ${example}`);\n }\n lines.push('');\n }\n\n lines.push('## Skill Reference');\n lines.push('');\n lines.push(`Invokes: \\`${command.skill}\\``);\n lines.push('');\n\n const filename = `${command.name}.md`;\n files.set(filename, lines.join('\\n'));\n }\n }\n\n return files;\n }\n\n /**\n * Generate Copilot commands (agent skills format)\n */\n generateCopilotCommands(commands: (SlashCommand | RegisteredCommand)[]): Map<string, string> {\n const files = new Map<string, string>();\n\n for (const command of commands) {\n if (this.shouldInclude(command)) {\n const lines: string[] = [];\n\n lines.push(`# ${command.name}`);\n lines.push('');\n lines.push(`> ${command.description}`);\n lines.push('');\n\n if (command.args && command.args.length > 0) {\n lines.push('## Parameters');\n lines.push('');\n lines.push('| Name | Required | Description |');\n lines.push('|------|----------|-------------|');\n for (const arg of command.args) {\n lines.push(`| ${arg.name} | ${arg.required ? 'Yes' : 'No'} | ${arg.description} |`);\n }\n lines.push('');\n }\n\n if (command.examples && command.examples.length > 0) {\n lines.push('## Examples');\n lines.push('');\n for (const example of command.examples) {\n lines.push(`\\`\\`\\`\\n${example}\\n\\`\\`\\``);\n }\n lines.push('');\n }\n\n lines.push('## Implementation');\n lines.push('');\n lines.push(`This command is powered by the \\`${command.skill}\\` skill.`);\n lines.push('');\n\n const filename = `${command.name}.md`;\n files.set(filename, lines.join('\\n'));\n }\n }\n\n return files;\n }\n\n /**\n * Generate commands for any agent\n */\n generate(\n commands: (SlashCommand | RegisteredCommand)[],\n agent: AgentType\n ): Map<string, string> | string {\n switch (agent) {\n case 'claude-code':\n case 'codex':\n case 'gemini-cli':\n case 'amp':\n case 'roo':\n case 'kiro-cli':\n return this.generateClaudeCommands(commands);\n\n case 'cursor':\n return this.generateCursorRules(commands);\n\n case 'opencode':\n return this.generateOpenCodeCommands(commands);\n\n case 'github-copilot':\n return this.generateCopilotCommands(commands);\n\n default:\n // Use Claude Code format as default\n return this.generateClaudeCommands(commands);\n }\n }\n\n /**\n * Generate JSON manifest of commands\n */\n generateManifest(commands: (SlashCommand | RegisteredCommand)[]): string {\n const manifest = {\n version: '1.0.0',\n commands: commands.filter((c) => this.shouldInclude(c)).map((c) => ({\n name: c.name,\n description: c.description,\n skill: c.skill,\n aliases: c.aliases,\n args: c.args,\n category: c.category,\n tags: c.tags,\n })),\n generatedAt: new Date().toISOString(),\n };\n\n return JSON.stringify(manifest, null, 2);\n }\n\n /**\n * Check if command should be included\n */\n private shouldInclude(command: SlashCommand | RegisteredCommand): boolean {\n // Check hidden\n if (command.hidden && !this.options.includeHidden) {\n return false;\n }\n\n // Check enabled (for RegisteredCommand)\n if ('enabled' in command && !command.enabled && !this.options.includeDisabled) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Slugify a string for command name\n */\n private slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n /**\n * Infer category from skill\n */\n private inferCategory(skill: CanonicalSkill): string | undefined {\n const tags = skill.tags || [];\n const name = skill.name.toLowerCase();\n\n if (tags.includes('testing') || name.includes('test')) {\n return 'testing';\n }\n if (tags.includes('debugging') || name.includes('debug')) {\n return 'debugging';\n }\n if (tags.includes('planning') || name.includes('plan')) {\n return 'planning';\n }\n if (tags.includes('collaboration') || name.includes('review')) {\n return 'collaboration';\n }\n if (tags.includes('git') || name.includes('commit') || name.includes('branch')) {\n return 'git';\n }\n\n return undefined;\n }\n\n /**\n * Generate usage examples\n */\n private generateExamples(skill: CanonicalSkill, commandName: string): string[] {\n const examples: string[] = [];\n\n examples.push(`/${commandName}`);\n\n // Add examples based on skill content\n if (skill.content.toLowerCase().includes('file')) {\n examples.push(`/${commandName} path/to/file.ts`);\n }\n\n if (skill.content.toLowerCase().includes('test')) {\n examples.push(`/${commandName} --run-tests`);\n }\n\n return examples;\n }\n}\n\n/**\n * Create a CommandGenerator instance\n */\nexport function createCommandGenerator(options?: Partial<CommandGeneratorOptions>): CommandGenerator {\n return new CommandGenerator(options);\n}\n\n/**\n * Get agent format info\n */\nexport function getAgentFormat(agent: AgentType): AgentCommandFormat {\n return AGENT_FORMATS[agent] || AGENT_FORMATS.universal;\n}\n\n/**\n * Check if agent supports slash commands\n */\nexport function supportsSlashCommands(agent: AgentType): boolean {\n const format = AGENT_FORMATS[agent];\n return format?.supportsSlashCommands ?? true;\n}\n","import type {\n AIProvider,\n AISearchOptions,\n AISearchResult,\n SearchableSkill,\n} from './types.js';\n\nexport class AISearch {\n constructor(private provider: AIProvider) {}\n\n async search(\n query: string,\n skills: SearchableSkill[],\n options: AISearchOptions = {}\n ): Promise<AISearchResult[]> {\n const {\n limit = 10,\n minRelevance = 0.5,\n includeReasoning = true,\n } = options;\n\n const results = await this.provider.search(query, skills);\n\n const filtered = results\n .filter((r) => r.relevance >= minRelevance)\n .slice(0, limit);\n\n if (!includeReasoning) {\n filtered.forEach((r) => {\n r.reasoning = '';\n });\n }\n\n return filtered;\n }\n\n async searchByIntent(\n intent: string,\n skills: SearchableSkill[],\n options: AISearchOptions = {}\n ): Promise<AISearchResult[]> {\n const enhancedQuery = `Find skills that help with: ${intent}. Consider the skill's purpose, capabilities, and use cases.`;\n return this.search(enhancedQuery, skills, options);\n }\n\n async findSimilar(\n skill: SearchableSkill,\n allSkills: SearchableSkill[],\n options: AISearchOptions = {}\n ): Promise<AISearchResult[]> {\n const query = `Find skills similar to \"${skill.name}\". ${skill.description ? `This skill: ${skill.description}` : ''}`;\n const filtered = allSkills.filter((s) => s.name !== skill.name);\n return this.search(query, filtered, options);\n }\n}\n","import type {\n AIProvider,\n AIGenerateOptions,\n GeneratedSkill,\n SkillExample,\n} from './types.js';\n\nexport class AISkillGenerator {\n constructor(private provider: AIProvider) {}\n\n async generate(\n example: SkillExample,\n options: AIGenerateOptions = {}\n ): Promise<GeneratedSkill> {\n const skill = await this.provider.generateSkill(example);\n\n if (options.targetAgent && skill.content) {\n skill.content = this.addAgentMetadata(skill.content, options.targetAgent);\n }\n\n return skill;\n }\n\n async generateFromCode(\n code: string,\n description: string,\n options: AIGenerateOptions = {}\n ): Promise<GeneratedSkill> {\n return this.generate(\n {\n description,\n codeExamples: [code],\n },\n options\n );\n }\n\n async generateFromTemplate(\n templateName: string,\n variables: Record<string, string>,\n options: AIGenerateOptions = {}\n ): Promise<GeneratedSkill> {\n return this.generate(\n {\n description: `Create a skill based on the ${templateName} template with the following customization: ${JSON.stringify(variables)}`,\n context: `Template: ${templateName}`,\n },\n options\n );\n }\n\n private addAgentMetadata(content: string, agent: string): string {\n const metadata = `---\nagent: ${agent}\ngenerated: ${new Date().toISOString()}\n---\n\n${content}`;\n return metadata;\n }\n\n validateGenerated(skill: GeneratedSkill): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!skill.name || skill.name.length < 3) {\n errors.push('Skill name must be at least 3 characters');\n }\n\n if (!skill.description || skill.description.length < 10) {\n errors.push('Skill description must be at least 10 characters');\n }\n\n if (!skill.content || skill.content.length < 50) {\n errors.push('Skill content must be at least 50 characters');\n }\n\n if (skill.confidence < 0.6) {\n errors.push('Skill confidence is too low (< 0.6)');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n","import type {\n AIProvider,\n AISearchResult,\n GeneratedSkill,\n SearchableSkill,\n SkillExample,\n} from '../types.js';\n\nexport abstract class BaseAIProvider implements AIProvider {\n abstract name: string;\n\n abstract search(\n query: string,\n skills: SearchableSkill[]\n ): Promise<AISearchResult[]>;\n\n abstract generateSkill(example: SkillExample): Promise<GeneratedSkill>;\n\n protected buildSearchPrompt(query: string, skills: SearchableSkill[]): string {\n const skillsList = skills\n .map(\n (s, i) =>\n `${i + 1}. ${s.name}${s.description ? ` - ${s.description}` : ''}${s.tags ? ` [${s.tags.join(', ')}]` : ''}`\n )\n .join('\\n');\n\n return `You are a skill search assistant. Given a user query and a list of available skills, identify the most relevant skills.\n\nUser Query: \"${query}\"\n\nAvailable Skills:\n${skillsList}\n\nFor each relevant skill (up to 10), provide:\n1. Skill index number\n2. Relevance score (0-1)\n3. Brief reasoning\n\nFormat your response as JSON:\n[\n {\n \"index\": <number>,\n \"relevance\": <0-1>,\n \"reasoning\": \"<explanation>\"\n }\n]`;\n }\n\n protected buildGeneratePrompt(example: SkillExample): string {\n let prompt = `You are a skill generation assistant. Generate a complete skill based on the following specification:\n\nDescription: ${example.description}`;\n\n if (example.context) {\n prompt += `\\n\\nContext: ${example.context}`;\n }\n\n if (example.codeExamples && example.codeExamples.length > 0) {\n prompt += `\\n\\nCode Examples:\\n${example.codeExamples.map((code, i) => `Example ${i + 1}:\\n\\`\\`\\`\\n${code}\\n\\`\\`\\``).join('\\n\\n')}`;\n }\n\n if (example.expectedBehavior) {\n prompt += `\\n\\nExpected Behavior: ${example.expectedBehavior}`;\n }\n\n prompt += `\n\nGenerate a skill in SKILL.md format with:\n1. Clear name (kebab-case)\n2. Comprehensive description\n3. Detailed instructions\n4. Relevant tags\n5. Usage examples if applicable\n\nFormat your response as JSON:\n{\n \"name\": \"<skill-name>\",\n \"description\": \"<description>\",\n \"content\": \"<full SKILL.md content>\",\n \"tags\": [\"<tag1>\", \"<tag2>\"],\n \"confidence\": <0-1>,\n \"reasoning\": \"<why this skill design>\"\n}`;\n\n return prompt;\n }\n\n protected parseSearchResponse(\n response: string,\n skills: SearchableSkill[]\n ): AISearchResult[] {\n try {\n const parsed = JSON.parse(response);\n return parsed.map((item: any) => ({\n skill: skills[item.index - 1],\n relevance: item.relevance,\n reasoning: item.reasoning,\n }));\n } catch {\n return [];\n }\n }\n\n protected parseGenerateResponse(response: string): GeneratedSkill {\n try {\n const parsed = JSON.parse(response);\n return {\n name: parsed.name,\n description: parsed.description,\n content: parsed.content,\n tags: parsed.tags || [],\n confidence: parsed.confidence || 0.7,\n reasoning: parsed.reasoning || '',\n };\n } catch {\n throw new Error('Failed to parse skill generation response');\n }\n }\n}\n","import { BaseAIProvider } from './base.js';\nimport type {\n AISearchResult,\n GeneratedSkill,\n SearchableSkill,\n SkillExample,\n} from '../types.js';\n\nexport class MockAIProvider extends BaseAIProvider {\n name = 'mock';\n\n async search(\n query: string,\n skills: SearchableSkill[]\n ): Promise<AISearchResult[]> {\n const lowerQuery = query.toLowerCase();\n const queryTerms = lowerQuery.split(/\\s+/).filter((t) => t.length > 2);\n\n return skills\n .map((skill) => {\n let relevance = 0;\n\n const nameMatch = skill.name.toLowerCase().includes(lowerQuery);\n const descMatch = skill.description?.toLowerCase().includes(lowerQuery);\n const tagMatch = skill.tags?.some((t) =>\n t.toLowerCase().includes(lowerQuery)\n );\n const contentMatch = skill.content.toLowerCase().includes(lowerQuery);\n\n // Also check individual terms\n const nameTermMatch = queryTerms.some((term) =>\n skill.name.toLowerCase().includes(term)\n );\n const descTermMatch = queryTerms.some(\n (term) => skill.description?.toLowerCase().includes(term)\n );\n const tagTermMatch = queryTerms.some((term) =>\n skill.tags?.some((t) => t.toLowerCase().includes(term))\n );\n\n if (nameMatch) relevance += 0.5;\n if (descMatch) relevance += 0.3;\n if (tagMatch) relevance += 0.2;\n if (contentMatch) relevance += 0.1;\n\n // Partial term matches\n if (!nameMatch && nameTermMatch) relevance += 0.3;\n if (!descMatch && descTermMatch) relevance += 0.2;\n if (!tagMatch && tagTermMatch) relevance += 0.15;\n\n relevance = Math.min(1, relevance);\n\n return {\n skill,\n relevance,\n reasoning: this.buildReasoning(\n nameMatch || nameTermMatch,\n descMatch || descTermMatch,\n tagMatch || tagTermMatch,\n contentMatch\n ),\n };\n })\n .filter((r) => r.relevance > 0)\n .sort((a, b) => b.relevance - a.relevance)\n .slice(0, 10);\n }\n\n async generateSkill(example: SkillExample): Promise<GeneratedSkill> {\n const name = this.generateName(example.description);\n const tags = this.generateTags(example.description);\n\n return {\n name,\n description: example.description,\n content: this.generateContent(name, example),\n tags,\n confidence: 0.75,\n reasoning: 'Mock generated skill based on description and examples',\n };\n }\n\n private buildReasoning(\n nameMatch: boolean,\n descMatch: boolean | undefined,\n tagMatch: boolean | undefined,\n contentMatch: boolean\n ): string {\n const matches: string[] = [];\n if (nameMatch) matches.push('name');\n if (descMatch === true) matches.push('description');\n if (tagMatch === true) matches.push('tags');\n if (contentMatch) matches.push('content');\n\n return matches.length > 0\n ? `Matched in: ${matches.join(', ')}`\n : 'No significant matches';\n }\n\n private generateName(description: string): string {\n return description\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .slice(0, 3)\n .join('-');\n }\n\n private generateTags(description: string): string[] {\n const commonTags = ['productivity', 'automation', 'development'];\n if (description.toLowerCase().includes('test')) commonTags.push('testing');\n if (description.toLowerCase().includes('debug'))\n commonTags.push('debugging');\n if (description.toLowerCase().includes('code')) commonTags.push('coding');\n return commonTags.slice(0, 5);\n }\n\n private generateContent(name: string, example: SkillExample): string {\n let content = `# ${name}\\n\\n${example.description}\\n\\n`;\n\n if (example.context) {\n content += `## Context\\n\\n${example.context}\\n\\n`;\n }\n\n content += `## Instructions\\n\\n`;\n content += `1. Review the task requirements\\n`;\n content += `2. Implement the solution\\n`;\n content += `3. Test the implementation\\n`;\n content += `4. Document the changes\\n\\n`;\n\n if (example.codeExamples && example.codeExamples.length > 0) {\n content += `## Examples\\n\\n`;\n example.codeExamples.forEach((code, i) => {\n content += `### Example ${i + 1}\\n\\n\\`\\`\\`\\n${code}\\n\\`\\`\\`\\n\\n`;\n });\n }\n\n if (example.expectedBehavior) {\n content += `## Expected Behavior\\n\\n${example.expectedBehavior}\\n`;\n }\n\n return content;\n }\n}\n","import type {\n AIConfig,\n AIProvider,\n AISearchOptions,\n AISearchResult,\n AIGenerateOptions,\n GeneratedSkill,\n SearchableSkill,\n SkillExample,\n} from './types.js';\nimport { AISearch } from './search.js';\nimport { AISkillGenerator } from './generator.js';\nimport { MockAIProvider } from './providers/mock.js';\n\nexport class AIManager {\n private provider: AIProvider;\n private search: AISearch;\n private generator: AISkillGenerator;\n\n constructor(private config: AIConfig) {\n this.provider = this.createProvider();\n this.search = new AISearch(this.provider);\n this.generator = new AISkillGenerator(this.provider);\n }\n\n async searchSkills(\n query: string,\n skills: SearchableSkill[],\n options?: AISearchOptions\n ): Promise<AISearchResult[]> {\n return this.search.search(query, skills, options);\n }\n\n async searchByIntent(\n intent: string,\n skills: SearchableSkill[],\n options?: AISearchOptions\n ): Promise<AISearchResult[]> {\n return this.search.searchByIntent(intent, skills, options);\n }\n\n async findSimilar(\n skill: SearchableSkill,\n allSkills: SearchableSkill[],\n options?: AISearchOptions\n ): Promise<AISearchResult[]> {\n return this.search.findSimilar(skill, allSkills, options);\n }\n\n async generateSkill(\n example: SkillExample,\n options?: AIGenerateOptions\n ): Promise<GeneratedSkill> {\n return this.generator.generate(example, options);\n }\n\n async generateFromCode(\n code: string,\n description: string,\n options?: AIGenerateOptions\n ): Promise<GeneratedSkill> {\n return this.generator.generateFromCode(code, description, options);\n }\n\n async generateFromTemplate(\n templateName: string,\n variables: Record<string, string>,\n options?: AIGenerateOptions\n ): Promise<GeneratedSkill> {\n return this.generator.generateFromTemplate(templateName, variables, options);\n }\n\n validateGenerated(skill: GeneratedSkill): {\n valid: boolean;\n errors: string[];\n } {\n return this.generator.validateGenerated(skill);\n }\n\n private createProvider(): AIProvider {\n if (this.config.provider === 'none' || !this.config.apiKey) {\n return new MockAIProvider();\n }\n\n switch (this.config.provider) {\n case 'anthropic':\n case 'openai':\n return new MockAIProvider();\n default:\n return new MockAIProvider();\n }\n }\n\n getProviderName(): string {\n return this.provider.name;\n }\n\n updateConfig(config: Partial<AIConfig>): void {\n this.config = { ...this.config, ...config };\n this.provider = this.createProvider();\n this.search = new AISearch(this.provider);\n this.generator = new AISkillGenerator(this.provider);\n }\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport type {\n AuditEvent,\n AuditEventType,\n AuditQuery,\n AuditStats,\n AuditExportOptions,\n} from './types.js';\n\nexport class AuditLogger {\n private logFile: string;\n private buffer: AuditEvent[] = [];\n private flushInterval: NodeJS.Timeout | null = null;\n private flushing: Promise<void> | null = null;\n\n constructor(logDir: string) {\n this.logFile = path.join(logDir, 'audit.log');\n this.startAutoFlush();\n }\n\n async log(\n type: AuditEventType,\n action: string,\n resource: string,\n details?: Record<string, unknown>,\n success: boolean = true,\n error?: string,\n duration?: number\n ): Promise<void> {\n const event: AuditEvent = {\n id: this.generateId(),\n timestamp: new Date(),\n type,\n user: process.env.USER || 'unknown',\n action,\n resource,\n details,\n success,\n error,\n duration,\n };\n\n this.buffer.push(event);\n\n if (this.buffer.length >= 10) {\n await this.flush();\n }\n }\n\n async query(query: AuditQuery = {}): Promise<AuditEvent[]> {\n const events = await this.loadEvents();\n return this.filterEvents(events, query);\n }\n\n async stats(): Promise<AuditStats> {\n const events = await this.loadEvents();\n\n const totalEvents = events.length;\n const successEvents = events.filter((e) => e.success).length;\n const successRate = totalEvents > 0 ? successEvents / totalEvents : 0;\n\n const eventsByType: Record<AuditEventType, number> = {} as any;\n events.forEach((e) => {\n eventsByType[e.type] = (eventsByType[e.type] || 0) + 1;\n });\n\n const recentErrors = events\n .filter((e) => !e.success)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, 10);\n\n const resourceCounts = new Map<string, number>();\n events.forEach((e) => {\n resourceCounts.set(e.resource, (resourceCounts.get(e.resource) || 0) + 1);\n });\n\n const topResources = Array.from(resourceCounts.entries())\n .map(([resource, count]) => ({ resource, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n totalEvents,\n successRate,\n eventsByType,\n recentErrors,\n topResources,\n };\n }\n\n async export(options: AuditExportOptions): Promise<string> {\n const events = await this.query(options.query);\n\n switch (options.format) {\n case 'json':\n return JSON.stringify(events, null, 2);\n case 'csv':\n return this.toCsv(events);\n case 'text':\n return this.toText(events);\n default:\n return JSON.stringify(events, null, 2);\n }\n }\n\n async clear(olderThan?: Date): Promise<number> {\n const events = await this.loadEvents();\n\n const filtered = olderThan\n ? events.filter((e) => e.timestamp >= olderThan)\n : [];\n\n await this.saveEvents(filtered);\n\n return events.length - filtered.length;\n }\n\n async flush(): Promise<void> {\n // If already flushing, wait for it to complete\n if (this.flushing) {\n return this.flushing;\n }\n\n if (this.buffer.length === 0) {\n return;\n }\n\n // Start flush with mutex\n this.flushing = this.doFlush();\n try {\n await this.flushing;\n } finally {\n this.flushing = null;\n }\n }\n\n private async doFlush(): Promise<void> {\n // Snapshot buffer and clear it before async operations\n const toFlush = this.buffer;\n this.buffer = [];\n\n try {\n const events = await this.loadEvents();\n events.push(...toFlush);\n await this.saveEvents(events);\n } catch (error) {\n // Restore events on failure\n this.buffer = [...toFlush, ...this.buffer];\n console.error('Failed to flush audit log:', error);\n }\n }\n\n async destroy(): Promise<void> {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n await this.flush();\n }\n\n private startAutoFlush(): void {\n this.flushInterval = setInterval(\n () => {\n this.flush().catch(console.error);\n },\n 30000\n );\n }\n\n private async loadEvents(): Promise<AuditEvent[]> {\n try {\n const content = await fs.readFile(this.logFile, 'utf-8');\n const events: AuditEvent[] = [];\n\n for (const line of content.split('\\n')) {\n if (!line.trim()) continue;\n\n try {\n const event = JSON.parse(line);\n event.timestamp = new Date(event.timestamp);\n events.push(event);\n } catch (error) {\n // Skip malformed lines silently to prevent data loss\n // Malformed lines are ignored, valid events are preserved\n continue;\n }\n }\n\n return events;\n } catch (error) {\n // Only propagate genuine filesystem errors\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n return [];\n }\n }\n\n private async saveEvents(events: AuditEvent[]): Promise<void> {\n const dir = path.dirname(this.logFile);\n await fs.mkdir(dir, { recursive: true });\n const content = events.map((e) => JSON.stringify(e)).join('\\n');\n await fs.writeFile(this.logFile, content, 'utf-8');\n }\n\n private filterEvents(events: AuditEvent[], query: AuditQuery): AuditEvent[] {\n let filtered = events;\n\n if (query.types && query.types.length > 0) {\n filtered = filtered.filter((e) => query.types!.includes(e.type));\n }\n\n if (query.user) {\n filtered = filtered.filter((e) => e.user === query.user);\n }\n\n if (query.resource) {\n filtered = filtered.filter((e) =>\n e.resource.toLowerCase().includes(query.resource!.toLowerCase())\n );\n }\n\n if (query.startDate) {\n filtered = filtered.filter((e) => e.timestamp >= query.startDate!);\n }\n\n if (query.endDate) {\n filtered = filtered.filter((e) => e.timestamp <= query.endDate!);\n }\n\n if (query.success !== undefined) {\n filtered = filtered.filter((e) => e.success === query.success);\n }\n\n filtered.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n if (query.offset !== undefined && query.offset !== null) {\n filtered = filtered.slice(query.offset);\n }\n\n if (query.limit !== undefined && query.limit !== null) {\n filtered = filtered.slice(0, query.limit);\n }\n\n return filtered;\n }\n\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n private toCsv(events: AuditEvent[]): string {\n const headers = [\n 'ID',\n 'Timestamp',\n 'Type',\n 'User',\n 'Action',\n 'Resource',\n 'Success',\n 'Error',\n 'Duration',\n ];\n\n const rows = events.map((e) => [\n e.id,\n e.timestamp.toISOString(),\n e.type,\n e.user || '',\n e.action,\n e.resource,\n e.success ? 'true' : 'false',\n e.error || '',\n e.duration?.toString() || '',\n ]);\n\n return [headers.join(','), ...rows.map((r) => r.join(','))].join('\\n');\n }\n\n private toText(events: AuditEvent[]): string {\n return events\n .map((e) => {\n let text = `[${e.timestamp.toISOString()}] ${e.type} - ${e.action} on ${e.resource}`;\n if (e.user) text += ` by ${e.user}`;\n text += ` (${e.success ? 'SUCCESS' : 'FAILED'})`;\n if (e.error) text += `\\n Error: ${e.error}`;\n if (e.duration) text += `\\n Duration: ${e.duration}ms`;\n return text;\n })\n .join('\\n\\n');\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,YAAY,EAAE,KAAK;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,cAAc,EAAE,KAAK,CAAC,UAAU,UAAU,aAAa,OAAO,CAAC;AAGrE,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,MAAM,EAAE,OAAO,EACZ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B,iGAAiG;AAAA,EACtI,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,EACvC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC5C,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,QAAQ,EAAE,MAAM,SAAS,EAAE,SAAS;AACtC,CAAC;AAGM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO;AAAA,EACtB,QAAQ,EAAE,OAAO;AAAA,EACjB,YAAY;AAAA,EACZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAGM,IAAM,gBAAgB,EAAE,KAAK,CAAC,WAAW,QAAQ,CAAC;AAGlD,IAAM,QAAQ,EAAE,OAAO;AAAA,EAC5B,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO;AAAA,EACtB,MAAM,EAAE,OAAO;AAAA,EACf,UAAU;AAAA,EACV,UAAU,cAAc,SAAS;AAAA,EACjC,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACnC,CAAC;AAGM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,OAAO,UAAU,QAAQ,WAAW;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC7C,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACjD,gBAAgB,EAAE,OAAO,EAAE,SAAS;AACtC,CAAC;;;AChFD,SAAS,YAAY,aAAa,oBAAoB;AACtD,SAAS,MAAM,gBAAgB;AAC/B,SAAS,SAAS,iBAAiB;AAG5B,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBAAoB,KAAsB;AACjD,QAAM,SAAkB,CAAC;AAEzB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAExD,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,UAAM,YAAY,KAAK,KAAK,MAAM,IAAI;AACtC,UAAM,cAAc,KAAK,WAAW,UAAU;AAE9C,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,QAAQ,WAAW,SAAS;AAClC,UAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,wBACP,KACA,MACA,WAAmB,GACnB,eAAuB,GACd;AACT,QAAM,SAAkB,CAAC;AAEzB,MAAI,gBAAgB,YAAY,CAAC,WAAW,GAAG,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAExD,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,QAAQ;AAC1D;AAAA,MACF;AAEA,UAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,YAAM,YAAY,KAAK,KAAK,MAAM,IAAI;AACtC,YAAM,cAAc,KAAK,WAAW,UAAU;AAE9C,UAAI,WAAW,WAAW,GAAG;AAC3B,cAAM,QAAQ,WAAW,SAAS;AAClC,YAAI,SAAS,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AAClC,eAAK,IAAI,MAAM,IAAI;AACnB,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF,OAAO;AACL,cAAM,YAAY,wBAAwB,WAAW,MAAM,UAAU,eAAe,CAAC;AACrF,eAAO,KAAK,GAAG,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,SAAO;AACT;AAEO,SAAS,eAAe,SAA0B;AACvD,QAAM,SAAkB,CAAC;AACzB,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,cAAc,KAAK,SAAS,UAAU;AAC5C,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,QAAQ,WAAW,OAAO;AAChC,QAAI,SAAS,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AAClC,WAAK,IAAI,MAAM,IAAI;AACnB,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAGA,aAAW,cAAc,uBAAuB;AAC9C,UAAM,WAAW,KAAK,SAAS,UAAU;AACzC,QAAI,WAAW,QAAQ,GAAG;AACxB,iBAAW,SAAS,oBAAoB,QAAQ,GAAG;AACjD,YAAI,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AACzB,eAAK,IAAI,MAAM,IAAI;AACnB,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,SAAS,oBAAoB,OAAO,GAAG;AAChD,QAAI,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AACzB,WAAK,IAAI,MAAM,IAAI;AACnB,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,KAAK,GAAG,wBAAwB,SAAS,IAAI,CAAC;AAAA,EACvD;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,WAAmB,WAA0B,WAAyB;AAC/F,QAAM,cAAc,KAAK,WAAW,UAAU;AAE9C,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,aAAa,OAAO;AACjD,UAAM,cAAc,mBAAmB,OAAO;AAE9C,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,SAAS,SAAS;AAC/B,aAAO;AAAA,QACL;AAAA,QACA,aAAa;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,SAAS,iBAAiB,UAAU,WAAW;AAErD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,MAAO,YAAY,QAAmB,SAAS,SAAS;AAAA,QACxD,aAAc,YAAY,eAA0B;AAAA,QACpD,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,SAAS;AAEvC,WAAO;AAAA,MACL,MAAM,OAAO,KAAK;AAAA,MAClB,aAAa,OAAO,KAAK;AAAA,MACzB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,YAAY;AAAA,MACtB,SAAS,UAAU,WAAW;AAAA,IAChC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,SAAiD;AAClF,QAAM,QAAQ,QAAQ,MAAM,0BAA0B;AAEtD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,UAAU,MAAM,CAAC,CAAC;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,SAAiB,OAA8B;AAC1E,QAAM,cAAc,mBAAmB,OAAO;AAC9C,MAAI,CAAC,eAAe,EAAE,SAAS,cAAc;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,KAAK;AAC/B,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEO,SAAS,aAAa,WAAyC;AACpE,QAAM,eAAe,KAAK,WAAW,gBAAgB;AAErD,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,cAAc,OAAO;AAClD,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,UAAM,SAAS,cAAc,UAAU,IAAI;AAE3C,WAAO,OAAO,UAAU,OAAO,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,WAAkC;AACjE,QAAM,cAAc,KAAK,WAAW,UAAU;AAE9C,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,aAAa,aAAa,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU,MAAc,YAAoC;AAC1E,aAAW,OAAO,YAAY;AAC5B,QAAI,CAAC,WAAW,GAAG,EAAG;AAEtB,UAAM,YAAY,KAAK,KAAK,IAAI;AAChC,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,WAA0B,IAAI,SAAS,QAAQ,IAAI,CAAC,IAAI,YAAY;AAC1E,aAAO,WAAW,WAAW,QAAQ;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,YAA+B;AAC3D,QAAM,SAAkB,CAAC;AACzB,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,OAAO,YAAY;AAC5B,QAAI,CAAC,WAAW,GAAG,EAAG;AAEtB,UAAM,WAA0B,IAAI,SAAS,QAAQ,IAAI,CAAC,IAAI,YAAY;AAC1E,UAAM,aAAa,eAAe,GAAG;AAErC,eAAW,SAAS,YAAY;AAC9B,UAAI,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AACzB,aAAK,IAAI,MAAM,IAAI;AACnB,eAAO,KAAK,EAAE,GAAG,OAAO,SAAS,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,WAA8E;AAC1G,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,QAAM,UAAU,SAAS,SAAS;AAElC,QAAM,cAAc,KAAK,WAAW,UAAU;AAC9C,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,WAAO,KAAK,uBAAuB;AACnC,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAChC;AAEA,QAAM,UAAU,aAAa,aAAa,OAAO;AACjD,QAAM,cAAc,mBAAmB,OAAO;AAE9C,MAAI,CAAC,aAAa;AAChB,WAAO,KAAK,sCAAsC;AAClD,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAChC;AAEA,QAAM,SAAS,iBAAiB,UAAU,WAAW;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB,eAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,aAAO,KAAK,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,aAAa,KAAK,MAAM,OAAO,EAAE;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,OAAO,OAAO;AAEpB,QAAI,KAAK,SAAS,SAAS;AACzB,eAAS,KAAK,SAAS,KAAK,IAAI,oCAAoC,OAAO,GAAG;AAAA,IAChF;AAEA,QAAI,KAAK,eAAe,KAAK,YAAY,SAAS,IAAI;AACpD,eAAS,KAAK,kFAAkF;AAAA,IAClG;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,QAAQ,sBAAsB,EAAE;AAC5D,QAAM,YAAY,YAAY,MAAM,IAAI,EAAE;AAC1C,MAAI,YAAY,KAAK;AACnB,aAAS,KAAK,gBAAgB,SAAS,yDAAyD;AAAA,EAClG;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,QAAQ,SAAS;AACxD;AAEO,SAAS,aAAa,OAAe,QAAyB;AACnE,QAAMA,YAAW,MAAM,QAAQ,QAAQ,EAAE;AACzC,SAAO,CAACA,UAAS,WAAW,IAAI,KAAK,CAACA,UAAS,SAAS,KAAK;AAC/D;;;AC5UA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,eAAe,iBAAiB;AACnE,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,eAAe;AACxB,SAAS,SAASC,YAAW,aAAa,qBAAqB;AAG/D,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAEf,SAAS,uBAA+B;AAC7C,SAAOC,MAAK,QAAQ,IAAI,GAAG,WAAW;AACxC;AAEO,SAAS,sBAA8B;AAC5C,SAAOA,MAAK,QAAQ,GAAG,WAAW,YAAY,WAAW;AAC3D;AAEO,SAAS,WAAW,SAAS,OAAuB;AACzD,QAAM,cAAc,qBAAqB;AACzC,QAAM,aAAa,oBAAoB;AAGvC,MAAI,QAAQ;AACV,QAAIC,YAAW,UAAU,GAAG;AAC1B,UAAI;AACF,cAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,cAAM,OAAOC,WAAU,OAAO;AAC9B,cAAM,SAAS,eAAe,UAAU,IAAI;AAC5C,YAAI,OAAO,SAAS;AAClB,iBAAO,OAAO;AAAA,QAChB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,MAAIF,YAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,UAAUC,cAAa,aAAa,OAAO;AACjD,YAAM,OAAOC,WAAU,OAAO;AAC9B,YAAM,SAAS,eAAe,UAAU,IAAI;AAC5C,UAAI,OAAO,SAAS;AAClB,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAIF,YAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,YAAM,OAAOC,WAAU,OAAO;AAC9B,YAAM,SAAS,eAAe,UAAU,IAAI;AAC5C,UAAI,OAAO,SAAS;AAClB,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,WAAW,QAAwB,SAAS,OAAa;AACvE,QAAM,aAAa,SAAS,oBAAoB,IAAI,qBAAqB;AACzE,QAAM,MAAM,QAAQ,UAAU;AAE9B,MAAI,CAACF,YAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,UAAU,cAAc,MAAM;AACpC,gBAAc,YAAY,SAAS,OAAO;AAC5C;AAEO,SAAS,cAAc,SAAqC;AACjE,QAAM,OAAiB,CAAC;AAExB,OAAK,KAAKD,MAAK,QAAQ,IAAI,GAAG,QAAQ,SAAS,CAAC;AAChD,OAAK,KAAKA,MAAK,QAAQ,IAAI,GAAG,UAAU,QAAQ,CAAC;AACjD,OAAK,KAAKA,MAAK,QAAQ,GAAG,QAAQ,SAAS,CAAC;AAC5C,OAAK,KAAKA,MAAK,QAAQ,GAAG,UAAU,QAAQ,CAAC;AAE7C,SAAO;AACT;AAEO,SAAS,cAAc,SAA2B,SAAS,OAAe;AAC/E,MAAI,QAAQ;AACV,WAAOA,MAAK,QAAQ,GAAG,QAAQ,SAAS;AAAA,EAC1C;AAEA,SAAOA,MAAK,QAAQ,IAAI,GAAG,QAAQ,SAAS;AAC9C;AAEO,SAAS,mBAAmB,SAAmC;AACpE,SAAOA,MAAK,QAAQ,IAAI,GAAG,QAAQ,UAAU;AAC/C;AAEO,SAAS,kBAAkB,WAAmB,UAA+B;AAClF,QAAM,eAAeA,MAAK,WAAW,aAAa;AAClD,gBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACxE;AAEO,SAAS,kBAAkB,WAAyC;AACzE,QAAM,eAAeA,MAAK,WAAW,aAAa;AAElD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAUC,cAAa,cAAc,OAAO;AAClD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,WAAmB,SAA2B;AAC5E,QAAM,WAAW,kBAAkB,SAAS;AAE5C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,WAAS,UAAU;AACnB,WAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,oBAAkB,WAAW,QAAQ;AAErC,SAAO;AACT;AAEA,eAAsB,YACpB,MACA,SACe;AACf,QAAM,YAAYF,MAAK,QAAQ,IAAI,GAAG,QAAQ,SAAS;AACvD,MAAI,CAACC,YAAW,SAAS,GAAG;AAC1B,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,SAAyB;AAAA,IAC7B,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACA,aAAW,MAAM;AAEjB,QAAM,kBAAkBD,MAAK,QAAQ,IAAI,GAAG,QAAQ,UAAU;AAC9D,MAAI,CAACC,YAAW,eAAe,GAAG;AAChC,kBAAc,iBAAiB,KAAK,QAAQ,IAAI;AAAA;AAAA,GAAsB,OAAO;AAAA,EAC/E;AACF;;;ACrKA,SAAS,gBAAgB;AACzB,SAAS,cAAAG,aAAY,cAAc;AACnC,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAC/B,SAAS,cAAc;AACvB,SAAS,kBAAkB;;;ACgBpB,SAAS,eAAe,QAA0E;AACvG,QAAM,UAAU,OAAO,QAAQ,cAAc,EAAE;AAC/C,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAE/B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,CAAC;AACrB,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,UAAU,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAE9D,SAAO,EAAE,OAAO,MAAM,QAAQ;AAChC;AAEO,SAAS,YAAY,QAAyB;AACnD,SACE,OAAO,WAAW,GAAG,KACrB,OAAO,WAAW,IAAI,KACtB,OAAO,WAAW,KAAK,KACvB,OAAO,WAAW,IAAI,KACtB,OAAO,WAAW,GAAG;AAEzB;AAEO,SAAS,SAAS,QAAyB;AAChD,SACE,OAAO,WAAW,MAAM,KACxB,OAAO,WAAW,UAAU,KAC5B,OAAO,WAAW,SAAS,KAC3B,OAAO,WAAW,QAAQ;AAE9B;;;AD1CO,IAAM,iBAAN,MAAmD;AAAA,EAC/C,OAAoB;AAAA,EACpB,OAAO;AAAA,EACP,UAAU;AAAA,EAEnB,YAAY,QAA0E;AACpF,QAAI,OAAO,WAAW,qBAAqB,GAAG;AAC5C,YAAMC,QAAO,OAAO,QAAQ,uBAAuB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC3E,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW,iBAAiB,GAAG;AACxC,YAAMA,QAAO,OAAO,QAAQ,mBAAmB,EAAE,EAAE,QAAQ,UAAU,EAAE;AACvE,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AAC9C,aAAO,eAAe,MAAM;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAyB;AAC/B,WACE,OAAO,WAAW,qBAAqB,KACvC,OAAO,WAAW,iBAAiB,KAClC,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG;AAAA,EAEtE;AAAA,EAEA,YAAY,OAAe,MAAsB;AAC/C,WAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAe,MAAsB;AAC7C,WAAO,kBAAkB,KAAK,IAAI,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,QAAgB,YAAoB,UAAwB,CAAC,GAAyB;AAChG,UAAM,SAAS,KAAK,YAAY,MAAM;AACtC,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B,MAAM,GAAG;AAAA,IACrE;AAEA,UAAM,EAAE,OAAO,MAAM,QAAQ,IAAI;AACjC,UAAM,WAAW,QAAQ,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI,KAAK,YAAY,OAAO,IAAI;AAEzF,UAAM,UAAUC,MAAK,OAAO,GAAG,YAAY,WAAW,CAAC,EAAE;AAEzD,QAAI;AACF,YAAM,OAAO,CAAC,OAAO;AACrB,UAAI,QAAQ,OAAO;AACjB,aAAK,KAAK,WAAW,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC5C;AACA,UAAI,QAAQ,QAAQ;AAClB,aAAK,KAAK,YAAY,QAAQ,MAAM;AAAA,MACtC;AACA,WAAK,KAAK,UAAU,OAAO;AAE3B,eAAS,OAAO,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,QAChC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAC9B,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,YAAY,UAAUA,MAAK,SAAS,OAAO,IAAI;AACrD,YAAM,SAAS,eAAe,SAAS;AAEvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,QAC9B,kBAAkB,OAAO,IAAI,QAAM;AAAA,UACjC,MAAM,EAAE;AAAA,UACR,SAASC,UAAS,EAAE,IAAI;AAAA,UACxB,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,UAAIC,YAAW,OAAO,GAAG;AACvB,eAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAClD;AAEA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,EAAE,SAAS,OAAO,OAAO,oBAAoB,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AACF;;;AElGA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,aAAY,UAAAC,eAAc;AACnC,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAC/B,SAAS,UAAAC,eAAc;AACvB,SAAS,cAAAC,mBAAkB;AAMpB,IAAM,iBAAN,MAAmD;AAAA,EAC/C,OAAoB;AAAA,EACpB,OAAO;AAAA,EACP,UAAU;AAAA,EAEnB,YAAY,QAA0E;AACpF,QAAI,OAAO,WAAW,qBAAqB,GAAG;AAC5C,YAAMC,QAAO,OAAO,QAAQ,uBAAuB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC3E,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW,iBAAiB,GAAG;AACxC,YAAMA,QAAO,OAAO,QAAQ,mBAAmB,EAAE,EAAE,QAAQ,UAAU,EAAE;AACvE,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,aAAO,eAAe,OAAO,QAAQ,WAAW,EAAE,CAAC;AAAA,IACrD;AAEA,QAAI,OAAO,WAAW,aAAa,GAAG;AACpC,aAAO,eAAe,OAAO,QAAQ,eAAe,EAAE,CAAC;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAyB;AAC/B,WACE,OAAO,WAAW,qBAAqB,KACvC,OAAO,WAAW,iBAAiB,KACnC,OAAO,WAAW,SAAS,KAC3B,OAAO,WAAW,aAAa;AAAA,EAEnC;AAAA,EAEA,YAAY,OAAe,MAAsB;AAC/C,WAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAe,MAAsB;AAC7C,WAAO,kBAAkB,KAAK,IAAI,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,QAAgB,YAAoB,UAAwB,CAAC,GAAyB;AAChG,UAAM,SAAS,KAAK,YAAY,MAAM;AACtC,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,SAAS,OAAO,OAAO,0BAA0B,MAAM,GAAG;AAAA,IACrE;AAEA,UAAM,EAAE,OAAO,MAAM,QAAQ,IAAI;AACjC,UAAM,WAAW,QAAQ,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI,KAAK,YAAY,OAAO,IAAI;AAEzF,UAAM,UAAUC,MAAKC,QAAO,GAAG,YAAYC,YAAW,CAAC,EAAE;AAEzD,QAAI;AACF,YAAM,OAAO,CAAC,OAAO;AACrB,UAAI,QAAQ,OAAO;AACjB,aAAK,KAAK,WAAW,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC5C;AACA,UAAI,QAAQ,QAAQ;AAClB,aAAK,KAAK,YAAY,QAAQ,MAAM;AAAA,MACtC;AACA,WAAK,KAAK,UAAU,OAAO;AAE3B,MAAAC,UAAS,OAAO,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,QAChC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAC9B,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,YAAY,UAAUH,MAAK,SAAS,OAAO,IAAI;AACrD,YAAM,SAAS,eAAe,SAAS;AAEvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,QAC9B,kBAAkB,OAAO,IAAI,QAAM;AAAA,UACjC,MAAM,EAAE;AAAA,UACR,SAASI,UAAS,EAAE,IAAI;AAAA,UACxB,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,UAAIC,YAAW,OAAO,GAAG;AACvB,QAAAC,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAClD;AAEA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,EAAE,SAAS,OAAO,OAAO,oBAAoB,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AACF;;;ACvGA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,aAAY,UAAAC,eAAc;AACnC,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAC/B,SAAS,UAAAC,eAAc;AACvB,SAAS,cAAAC,mBAAkB;AAMpB,IAAM,oBAAN,MAAsD;AAAA,EAClD,OAAoB;AAAA,EACpB,OAAO;AAAA,EACP,UAAU;AAAA,EAEnB,YAAY,QAA0E;AACpF,QAAI,OAAO,WAAW,wBAAwB,GAAG;AAC/C,YAAMC,QAAO,OAAO,QAAQ,0BAA0B,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC9E,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW,oBAAoB,GAAG;AAC3C,YAAMA,QAAO,OAAO,QAAQ,sBAAsB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC1E,aAAO,eAAeA,KAAI;AAAA,IAC5B;AAEA,QAAI,OAAO,WAAW,YAAY,GAAG;AACnC,aAAO,eAAe,OAAO,QAAQ,cAAc,EAAE,CAAC;AAAA,IACxD;AAEA,QAAI,OAAO,WAAW,gBAAgB,GAAG;AACvC,aAAO,eAAe,OAAO,QAAQ,kBAAkB,EAAE,CAAC;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAyB;AAC/B,WACE,OAAO,WAAW,wBAAwB,KAC1C,OAAO,WAAW,oBAAoB,KACtC,OAAO,WAAW,YAAY,KAC9B,OAAO,WAAW,gBAAgB;AAAA,EAEtC;AAAA,EAEA,YAAY,OAAe,MAAsB;AAC/C,WAAO,yBAAyB,KAAK,IAAI,IAAI;AAAA,EAC/C;AAAA,EAEA,UAAU,OAAe,MAAsB;AAC7C,WAAO,qBAAqB,KAAK,IAAI,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,QAAgB,YAAoB,UAAwB,CAAC,GAAyB;AAChG,UAAM,SAAS,KAAK,YAAY,MAAM;AACtC,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,SAAS,OAAO,OAAO,6BAA6B,MAAM,GAAG;AAAA,IACxE;AAEA,UAAM,EAAE,OAAO,MAAM,QAAQ,IAAI;AACjC,UAAM,WAAW,QAAQ,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI,KAAK,YAAY,OAAO,IAAI;AAEzF,UAAM,UAAUC,MAAKC,QAAO,GAAG,YAAYC,YAAW,CAAC,EAAE;AAEzD,QAAI;AACF,YAAM,OAAO,CAAC,OAAO;AACrB,UAAI,QAAQ,OAAO;AACjB,aAAK,KAAK,WAAW,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC5C;AACA,UAAI,QAAQ,QAAQ;AAClB,aAAK,KAAK,YAAY,QAAQ,MAAM;AAAA,MACtC;AACA,WAAK,KAAK,UAAU,OAAO;AAE3B,MAAAC,UAAS,OAAO,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,QAChC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAC9B,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,YAAY,UAAUH,MAAK,SAAS,OAAO,IAAI;AACrD,YAAM,SAAS,eAAe,SAAS;AAEvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,QAC9B,kBAAkB,OAAO,IAAI,QAAM;AAAA,UACjC,MAAM,EAAE;AAAA,UACR,SAASI,UAAS,EAAE,IAAI;AAAA,UACxB,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,UAAIC,YAAW,OAAO,GAAG;AACvB,QAAAC,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAClD;AAEA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,EAAE,SAAS,OAAO,OAAO,oBAAoB,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AACF;;;ACvGA,SAAS,cAAAC,aAAY,UAAU,oBAAoB;AACnD,SAAS,QAAAC,OAAM,SAAS,YAAAC,iBAAgB;AACxC,SAAS,WAAAC,gBAAe;AAMjB,IAAM,gBAAN,MAAkD;AAAA,EAC9C,OAAoB;AAAA,EACpB,OAAO;AAAA,EACP,UAAU;AAAA,EAEnB,YAAY,QAA0E;AACpF,QAAI,CAAC,YAAY,MAAM,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,QAAI,eAAe;AACnB,QAAI,OAAO,WAAW,IAAI,GAAG;AAC3B,qBAAeC,MAAKC,SAAQ,GAAG,OAAO,MAAM,CAAC,CAAC;AAAA,IAChD;AAEA,UAAM,eAAe,QAAQ,YAAY;AACzC,UAAM,UAAUC,UAAS,YAAY;AAErC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,QAAQ,QAAyB;AAC/B,WAAO,YAAY,MAAM;AAAA,EAC3B;AAAA,EAEA,YAAY,QAAgB,OAAuB;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAAgB,OAAuB;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,QAAgB,YAAoB,WAAyB,CAAC,GAAyB;AACjG,UAAM,SAAS,KAAK,YAAY,MAAM;AACtC,QAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,aAAO,EAAE,SAAS,OAAO,OAAO,uBAAuB,MAAM,GAAG;AAAA,IAClE;AAEA,UAAM,aAAa,OAAO;AAE1B,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,aAAO,EAAE,SAAS,OAAO,OAAO,wBAAwB,UAAU,GAAG;AAAA,IACvE;AAEA,UAAM,QAAQ,SAAS,UAAU;AACjC,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB,aAAO,EAAE,SAAS,OAAO,OAAO,4BAA4B,UAAU,GAAG;AAAA,IAC3E;AAEA,QAAI;AACF,UAAI,aAAa;AACjB,UAAI;AACF,qBAAa,aAAa,UAAU;AAAA,MACtC,QAAQ;AAAA,MAER;AAEA,YAAM,SAAS,eAAe,UAAU;AAExC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,QAC9B,kBAAkB,OAAO,IAAI,QAAM;AAAA,UACjC,MAAM,EAAE;AAAA,UACR,SAASD,UAAS,EAAE,IAAI;AAAA,UACxB,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,EAAE,SAAS,OAAO,OAAO,iCAAiC,OAAO,GAAG;AAAA,IAC7E;AAAA,EACF;AACF;;;AC1EA,IAAM,YAAkC;AAAA,EACtC,IAAI,cAAc;AAAA,EAClB,IAAI,eAAe;AAAA,EACnB,IAAI,kBAAkB;AAAA,EACtB,IAAI,eAAe;AACrB;AAEO,SAAS,YAAY,MAAmD;AAC7E,SAAO,UAAU,KAAK,OAAK,EAAE,SAAS,IAAI;AAC5C;AAEO,SAAS,kBAAwC;AACtD,SAAO;AACT;AAEO,SAAS,eAAe,QAAgD;AAC7E,SAAO,UAAU,KAAK,OAAK,EAAE,QAAQ,MAAM,CAAC;AAC9C;AAEO,SAAS,YAAY,QAKnB;AACP,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,QAAQ,MAAM,GAAG;AAC5B,YAAM,SAAS,SAAS,YAAY,MAAM;AAC1C,UAAI,QAAQ;AACV,eAAO,EAAE,UAAU,GAAG,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/CA,SAAS,KAAAE,UAAS;AAeX,IAAM,mBAAsD;AAAA,EACjE,eAAe;AAAA,EACf,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAKO,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EACnD,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO;AAAA,EACtB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,UAAUA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAExC,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpC,aAAaA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAElC,QAAQA,GAAE,OAAO;AAAA,IACf,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC3C,CAAC,EAAE,SAAS;AACd,CAAC;;;ACxDD,SAAS,SAASC,YAAW,aAAaC,sBAAqB;AAa/D,IAAM,kBAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAASC,oBAAmB,SAAgF;AAC1G,QAAM,QAAQ,QAAQ,MAAM,yCAAyC;AAErE,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC5C;AAEA,MAAI;AACF,UAAM,cAAcF,WAAU,MAAM,CAAC,CAAC;AACtC,WAAO,EAAE,aAAa,MAAM,MAAM,CAAC,KAAK,GAAG;AAAA,EAC7C,QAAQ;AACN,WAAO,EAAE,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC5C;AACF;AAkBO,IAAM,oBAAN,MAAoD;AAAA,EAChD,SAAyB;AAAA,EACzB,SAAsB;AAAA;AAAA;AAAA;AAAA,EAK/B,MAAM,SAAiB,UAA0C;AAC/D,UAAM,EAAE,aAAa,KAAK,IAAIE,oBAAmB,OAAO;AAExD,QAAI,CAAC,aAAa;AAEhB,YAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,YAAMC,QAAO,YACT,UAAU,CAAC,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE,IACzE,UAAU,QAAQ,UAAU,EAAE,EAAE,QAAQ,YAAY,eAAe,KAAK;AAE5E,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,aAAa;AAAA,QACb,SAAS,KAAK,KAAK;AAAA,QACnB,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,OAAQ,YAAY,QAAmB;AAC7C,UAAM,cAAe,YAAY,eAA0B;AAE3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,QAAQ,YAAY;AAAA,MACpB,SAAS,YAAY;AAAA,MACrB,MAAM,YAAY;AAAA,MAClB,eAAe,YAAY;AAAA,MAC3B,cAAc,YAAY,eAAe;AAAA,MACzC,UAAU,YAAY;AAAA,MACtB,SAAS,KAAK,KAAK;AAAA,MACnB,cAAc;AAAA,MACd,aAAa,YAAY;AAAA,MACzB,OAAO,YAAY;AAAA,MACnB,aAAa,YAAY;AAAA,MACzB,YAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,UAA4B;AAElD,QAAI,YAAY,cAAc,KAAK,QAAQ,GAAG;AAC5C,aAAO;AAAA,IACT;AAGA,UAAM,EAAE,YAAY,IAAID,oBAAmB,OAAO;AAClD,QAAI,gBAAgB,UAAU,eAAe,iBAAiB,cAAc;AAC1E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,OACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,WAAqB,CAAC;AAC5B,UAAM,eAAyB,CAAC;AAGhC,UAAM,cAAuC;AAAA,MAC3C,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,IACrB;AAGA,QAAI,MAAM,QAAS,aAAY,UAAU,MAAM;AAC/C,QAAI,MAAM,OAAQ,aAAY,SAAS,MAAM;AAC7C,QAAI,MAAM,QAAS,aAAY,UAAU,MAAM;AAC/C,QAAI,MAAM,MAAM,OAAQ,aAAY,OAAO,MAAM;AACjD,QAAI,MAAM,cAAe,aAAY,gBAAgB,MAAM;AAC3D,QAAI,MAAM,aAAc,aAAY,eAAe,IAAI,MAAM;AAC7D,QAAI,MAAM,YAAY,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC5D,kBAAY,WAAW,MAAM;AAAA,IAC/B;AAGA,QAAI,MAAM,OAAO,QAAQ;AACvB,kBAAY,QAAQ,MAAM;AAC1B,eAAS,KAAK,4DAA4D;AAAA,IAC5E;AACA,QAAI,MAAM,gBAAgB,QAAW;AACnC,kBAAY,cAAc,MAAM;AAChC,eAAS,KAAK,kEAAkE;AAAA,IAClF;AAGA,QAAI,QAAQ,aAAa;AACvB,kBAAY,iBAAiB,MAAM;AACnC,kBAAY,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAClD,kBAAY,cAAc;AAAA,IAC5B;AAGA,UAAM,cAAcD,eAAc,aAAa;AAAA,MAC7C,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACrB,CAAC,EAAE,KAAK;AAGR,UAAM,UAAU;AAAA,EAAQ,WAAW;AAAA;AAAA;AAAA,EAAY,MAAM,OAAO;AAE5D,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU,KAAK,YAAY,MAAM,MAAM,WAAW;AAAA,MAClD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAoB,cAAiC;AAC/D,WAAO;AAAA,EACT;AACF;AAKO,IAAM,oBAAoB,IAAI,kBAAkB;;;AC9MvD,SAAS,SAASG,YAAW,aAAaC,sBAAqB;AAa/D,SAASC,oBAAmB,SAAgF;AAC1G,QAAM,QAAQ,QAAQ,MAAM,yCAAyC;AAErE,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC5C;AAEA,MAAI;AACF,UAAM,cAAcF,WAAU,MAAM,CAAC,CAAC;AACtC,WAAO,EAAE,aAAa,MAAM,MAAM,CAAC,KAAK,GAAG;AAAA,EAC7C,QAAQ;AACN,WAAO,EAAE,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC5C;AACF;AAKA,SAAS,WAAW,OAAiC;AACnD,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,QAAM,OAAO,MAAM,QAAQ,CAAC;AAG5B,QAAM,gBAA0C;AAAA,IAC9C,SAAS,CAAC,YAAY,UAAU;AAAA,IAChC,cAAc,CAAC,WAAW,UAAU;AAAA,IACpC,cAAc,CAAC,WAAW,UAAU;AAAA,IACpC,UAAU,CAAC,SAAS;AAAA,IACpB,QAAQ,CAAC,SAAS;AAAA,IAClB,MAAM,CAAC,SAAS;AAAA,IAChB,OAAO,CAAC,YAAY,aAAa,WAAW;AAAA,IAC5C,QAAQ,CAAC,aAAa,UAAU;AAAA,IAChC,OAAO,CAAC,UAAU;AAAA,IAClB,UAAU,CAAC,aAAa;AAAA,IACxB,WAAW,CAAC,WAAW,WAAW;AAAA,IAClC,UAAU,CAAC,YAAY,WAAW,YAAY,SAAS;AAAA,IACvD,WAAW,CAAC,eAAe,aAAa;AAAA,IACxC,OAAO,CAAC,eAAe,gBAAgB;AAAA,EACzC;AAEA,aAAW,OAAO,MAAM;AACtB,UAAM,aAAa,IAAI,YAAY;AACnC,QAAI,cAAc,UAAU,GAAG;AAC7B,YAAM,KAAK,GAAG,cAAc,UAAU,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK,GAAG;AACvF,QAAI,CAAC,MAAM,SAAS,UAAU,EAAG,OAAM,KAAK,UAAU;AACtD,QAAI,CAAC,MAAM,SAAS,UAAU,EAAG,OAAM,KAAK,UAAU;AAAA,EACxD;AAEA,MAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,QAAQ,GAAG;AACzD,QAAI,CAAC,MAAM,SAAS,SAAS,EAAG,OAAM,KAAK,SAAS;AAAA,EACtD;AAGA,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC3B;AAmBO,IAAM,mBAAN,MAAmD;AAAA,EAC/C,SAAyB;AAAA,EACzB,SAAsB,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKxC,MAAM,SAAiB,UAA0C;AAC/D,UAAM,EAAE,aAAa,KAAK,IAAIE,oBAAmB,OAAO;AAGxD,QAAI,OAAO;AACX,QAAI,UAAU;AACZ,aAAO,SACJ,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,OAAO,EAAE,EACjB,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,IAC9B;AAEA,QAAI,CAAC,aAAa;AAEhB,aAAO;AAAA,QACL;AAAA,QACA,aAAa;AAAA,QACb,SAAS,KAAK,KAAK;AAAA,QACnB,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,cAAe,YAAY,eAA0B;AAE3D,WAAO;AAAA,MACL,MAAO,YAAY,QAAmB;AAAA,MACtC;AAAA,MACA,SAAS,KAAK,KAAK;AAAA,MACnB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,OAAO,YAAY;AAAA,MACnB,aAAa,YAAY;AAAA,MACzB,MAAM,YAAY;AAAA,MAClB,SAAS,YAAY;AAAA,MACrB,QAAQ,YAAY;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,UAA4B;AAElD,QAAI,UAAU;AACZ,UAAI,UAAU,KAAK,QAAQ,EAAG,QAAO;AACrC,UAAI,kBAAkB,KAAK,QAAQ,EAAG,QAAO;AAC7C,UAAI,eAAe,KAAK,QAAQ,EAAG,QAAO;AAAA,IAC5C;AAGA,UAAM,EAAE,YAAY,IAAIA,oBAAmB,OAAO;AAClD,QAAI,aAAa;AACf,UAAI,WAAW,eAAe,iBAAiB,aAAa;AAC1D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,OACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,WAAqB,CAAC;AAC5B,UAAM,eAAyB,CAAC;AAGhC,UAAM,cAAuC;AAAA,MAC3C,aAAa,MAAM;AAAA,IACrB;AAGA,QAAI,QAAQ,QAAQ,SAAS,MAAM;AACnC,QAAI,CAAC,OAAO,QAAQ;AAElB,cAAQ,WAAW,KAAK;AACxB,UAAI,MAAM,SAAS,GAAG;AACpB,iBAAS,KAAK,2BAA2B,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAC7D;AAAA,IACF;AACA,QAAI,OAAO,QAAQ;AACjB,kBAAY,QAAQ;AAAA,IACtB;AAGA,UAAM,cAAc,QAAQ,eAAe,MAAM;AACjD,QAAI,gBAAgB,QAAW;AAC7B,kBAAY,cAAc;AAAA,IAC5B;AAGA,QAAI,MAAM,cAAc;AACtB,mBAAa,KAAK,0DAA0D;AAAA,IAC9E;AACA,QAAI,MAAM,eAAe;AAEvB,eAAS,KAAK,qCAAqC;AAAA,IACrD;AAGA,QAAI,QAAQ,aAAa;AACvB,kBAAY,iBAAiB,MAAM;AACnC,kBAAY,eAAe,MAAM;AAAA,IACnC;AAGA,UAAM,cAAcD,eAAc,aAAa;AAAA,MAC7C,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC,EAAE,KAAK;AAGR,QAAI,OAAO,MAAM;AACjB,QAAI,MAAM,iBAAiB,QAAQ,qBAAqB,OAAO;AAC7D,aAAO,uBAAuB,MAAM,aAAa;AAAA;AAAA,EAAW,IAAI;AAAA,IAClE;AAEA,UAAM,UAAU;AAAA,EAAQ,WAAW;AAAA;AAAA;AAAA,EAAY,IAAI;AAEnD,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU,KAAK,YAAY,MAAM,MAAM,WAAW;AAAA,MAClD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAA+B;AAEjD,QAAI,UAAU;AAGd,eAAW,KAAK,MAAM,IAAI;AAAA;AAC1B,eAAW,KAAK,MAAM,WAAW;AAAA;AAAA;AAGjC,eAAW,MAAM;AAEjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAmB,cAAiC;AAE9D,UAAM,WAAW,UACd,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AAEvB,WAAO,GAAG,QAAQ;AAAA,EACpB;AACF;AAKO,IAAM,mBAAmB,IAAI,iBAAiB;;;ACpQrD,SAAS,sBAAsB,SAAqE;AAClG,QAAM,WAAmC,CAAC;AAC1C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,YAAsB,CAAC;AAC7B,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY;AACd,YAAM,QAAQ,KAAK,MAAM,+BAA+B;AACxD,UAAI,OAAO;AACT,iBAAS,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC;AAC1C;AAAA,MACF;AAEA,UAAI,KAAK,KAAK,KAAK,CAAC,KAAK,WAAW,MAAM,GAAG;AAC3C,qBAAa;AAAA,MACf;AAAA,IACF;AACA,cAAU,KAAK,IAAI;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,KAAK,IAAI,EAAE,KAAK;AAAA,EAClC;AACF;AAkBO,IAAM,qBAAN,MAAqD;AAAA,EACjD,SAAyB;AAAA,EACzB,SAAsB,CAAC,UAAU;AAAA;AAAA;AAAA;AAAA,EAK1C,MAAM,SAAiB,UAA0C;AAC/D,UAAM,EAAE,UAAU,KAAK,IAAI,sBAAsB,OAAO;AAGxD,QAAI,OAAO,SAAS;AACpB,QAAI,CAAC,MAAM;AACT,YAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,UAAI,cAAc;AAChB,eAAO,aAAa,CAAC,EAClB,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,MAC9B,WAAW,UAAU;AACnB,eAAO,SACJ,QAAQ,0BAA0B,EAAE,EACpC,QAAQ,OAAO,EAAE,EACjB,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,MAC9B,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,cAAc,SAAS;AAC3B,QAAI,CAAC,aAAa;AAEhB,YAAM,iBAAiB,KAAK,MAAM,eAAe;AACjD,UAAI,gBAAgB;AAClB,sBAAc,eAAe,CAAC,EAAE,UAAU,GAAG,GAAG;AAChD,YAAI,YAAY,WAAW,IAAK,gBAAe;AAAA,MACjD,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,MAAM,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,UAA4B;AAElD,QAAI,UAAU;AACZ,UAAI,oBAAoB,KAAK,QAAQ,EAAG,QAAO;AAC/C,UAAI,iBAAiB,KAAK,QAAQ,EAAG,QAAO;AAAA,IAC9C;AAGA,QAAI,QAAQ,WAAW,MAAM,KAAK,QAAQ,SAAS,KAAK,GAAG;AACzD,YAAM,EAAE,SAAS,IAAI,sBAAsB,OAAO;AAClD,UAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AACpC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,OACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,WAAqB,CAAC;AAC5B,UAAM,eAAyB,CAAC;AAChC,UAAM,QAAkB,CAAC;AAGzB,QAAI,QAAQ,gBAAgB,OAAO;AACjC,YAAM,KAAK,cAAc,MAAM,IAAI,MAAM;AACzC,YAAM,KAAK,qBAAqB,MAAM,WAAW,MAAM;AACvD,UAAI,MAAM,QAAS,OAAM,KAAK,iBAAiB,MAAM,OAAO,MAAM;AAClE,UAAI,MAAM,OAAQ,OAAM,KAAK,gBAAgB,MAAM,MAAM,MAAM;AAC/D,UAAI,MAAM,MAAM,OAAQ,OAAM,KAAK,cAAc,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM;AAC5E,UAAI,QAAQ,aAAa;AACvB,cAAM,KAAK,wBAAwB,MAAM,YAAY,MAAM;AAC3D,cAAM,KAAK,uBAAsB,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM;AAAA,MACjE;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,MAAM,OAAO,QAAQ;AACvB,mBAAa,KAAK,wDAAwD;AAAA,IAC5E;AACA,QAAI,MAAM,gBAAgB,QAAW;AACnC,mBAAa,KAAK,gEAAgE;AAAA,IACpF;AACA,QAAI,MAAM,cAAc;AACtB,mBAAa,KAAK,4DAA4D;AAAA,IAChF;AAGA,UAAM,KAAK,MAAM,OAAO;AAExB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAM,KAAK,IAAI;AAAA,MACxB,UAAU,KAAK,YAAY,MAAM,MAAM,WAAW;AAAA,MAClD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAoB,cAAiC;AAC/D,WAAO;AAAA,EACT;AACF;AAKO,IAAM,qBAAqB,IAAI,mBAAmB;;;ACtLzD,SAASE,uBAAsB,SAAqE;AAClG,QAAM,WAAmC,CAAC;AAC1C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,YAAsB,CAAC;AAC7B,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY;AACd,YAAM,QAAQ,KAAK,MAAM,+BAA+B;AACxD,UAAI,OAAO;AACT,iBAAS,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC;AAC1C;AAAA,MACF;AACA,UAAI,KAAK,KAAK,KAAK,CAAC,KAAK,WAAW,MAAM,GAAG;AAC3C,qBAAa;AAAA,MACf;AAAA,IACF;AACA,cAAU,KAAK,IAAI;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,KAAK,IAAI,EAAE,KAAK;AAAA,EAClC;AACF;AAmBO,IAAM,oBAAN,MAAoD;AAAA,EAChD,SAAyB;AAAA,EACzB,SAAsB,CAAC,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,SAAiB,UAA0C;AAC/D,UAAM,EAAE,UAAU,KAAK,IAAIA,uBAAsB,OAAO;AAGxD,QAAI,OAAO,SAAS;AACpB,QAAI,CAAC,MAAM;AACT,YAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,UAAI,cAAc;AAChB,eAAO,aAAa,CAAC,EAClB,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,MAC9B,WAAW,UAAU;AACnB,eAAO,SACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,yBAAyB,eAAe,EAChD,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,MAC9B,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,cAAc,SAAS;AAC3B,QAAI,CAAC,aAAa;AAChB,YAAM,iBAAiB,KAAK,MAAM,eAAe;AACjD,UAAI,gBAAgB;AAClB,sBAAc,eAAe,CAAC,EAAE,UAAU,GAAG,GAAG;AAChD,YAAI,YAAY,WAAW,IAAK,gBAAe;AAAA,MACjD,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,MAAM,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,UAA4B;AAElD,QAAI,UAAU;AACZ,UAAI,6BAA6B,KAAK,QAAQ,EAAG,QAAO;AACxD,UAAI,yBAAyB,KAAK,QAAQ,EAAG,QAAO;AAAA,IACtD;AAGA,QAAI,QAAQ,YAAY,EAAE,SAAS,gBAAgB,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,OACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,WAAqB,CAAC;AAC5B,UAAM,eAAyB,CAAC;AAChC,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,oEAAoE;AAC/E,UAAM,KAAK,uEAAuE;AAClF,UAAM,KAAK,EAAE;AAGb,QAAI,QAAQ,aAAa;AACvB,YAAM,KAAK,cAAc,MAAM,IAAI,MAAM;AACzC,YAAM,KAAK,qBAAqB,MAAM,WAAW,MAAM;AACvD,UAAI,MAAM,QAAS,OAAM,KAAK,iBAAiB,MAAM,OAAO,MAAM;AAClE,UAAI,MAAM,OAAQ,OAAM,KAAK,gBAAgB,MAAM,MAAM,MAAM;AAC/D,YAAM,KAAK,wBAAwB,MAAM,YAAY,MAAM;AAC3D,YAAM,KAAK,uBAAsB,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM;AAC/D,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,MAAM,OAAO,QAAQ;AACvB,mBAAa,KAAK,8DAA8D;AAAA,IAClF;AACA,QAAI,MAAM,gBAAgB,QAAW;AACnC,mBAAa,KAAK,sEAAsE;AAAA,IAC1F;AACA,QAAI,MAAM,cAAc;AACtB,mBAAa,KAAK,kEAAkE;AAAA,IACtF;AACA,QAAI,MAAM,YAAY,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC5D,eAAS,KAAK,wDAAwD;AAAA,IACxE;AAGA,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG,GAAG;AACzC,YAAM,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;AAClG,YAAM,KAAK,EAAE;AACb,UAAI,MAAM,aAAa;AACrB,cAAM,KAAK,MAAM,WAAW;AAC5B,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAGA,UAAM,KAAK,MAAM,OAAO;AAExB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAM,KAAK,IAAI;AAAA,MACxB,UAAU,KAAK,YAAY,MAAM,MAAM,WAAW;AAAA,MAClD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAoB,cAAiC;AAC/D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,YAA4B;AAClC,WAAO;AAAA,EACT;AACF;AAKO,IAAM,oBAAoB,IAAI,kBAAkB;;;ACpNvD,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AAuB3B,IAAM,qBAAN,MAAyB;AAAA,EACtB,cAAqD,oBAAI,IAAI;AAAA,EAC7D,mBAAqD,oBAAI,IAAI;AAAA,EAErE,cAAc;AAEZ,SAAK,SAAS,iBAAiB;AAC/B,SAAK,SAAS,gBAAgB;AAC9B,SAAK,SAAS,kBAAkB;AAChC,SAAK,SAAS,iBAAiB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAoC;AAC3C,SAAK,YAAY,IAAI,WAAW,QAAQ,UAAU;AAGlD,eAAW,SAAS,WAAW,QAAQ;AACrC,WAAK,iBAAiB,IAAI,OAAO,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAsD;AAClE,WAAO,KAAK,YAAY,IAAI,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,OAAoC;AAExD,UAAM,WAAW,KAAK,iBAAiB,IAAI,KAAK;AAChD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAkC;AAClD,WAAO,iBAAiB,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAiB,UAA0C;AAEtE,eAAW,CAAC,QAAQ,UAAU,KAAK,KAAK,aAAa;AACnD,UAAI,WAAW,OAAO,SAAS,QAAQ,GAAG;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAiB,UAAqC;AACtE,UAAM,SAAS,KAAK,aAAa,SAAS,QAAQ;AAClD,QAAI,CAAC,OAAQ,QAAO;AAGpB,QAAI,UAAU;AACZ,YAAM,QAAQ,SAAS,YAAY;AACnC,UAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC/D,UAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,UAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AAAA,IACxC;AAGA,eAAW,CAAC,OAAO,WAAW,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACnE,UAAI,gBAAgB,QAAQ;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,UAA0C;AAC/D,UAAM,SAAS,KAAK,aAAa,SAAS,QAAQ;AAClD,QAAI,CAAC,QAAQ;AAEX,aAAO,kBAAkB,MAAM,SAAS,QAAQ;AAAA,IAClD;AAEA,UAAM,aAAa,KAAK,YAAY,IAAI,MAAM;AAC9C,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,MAAM,SAAS,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,OACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,aAAa,KAAK,sBAAsB,WAAW;AACzD,WAAO,WAAW,SAAS,OAAO,aAAa,OAAO;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,iBACE,SACA,aACA,UAA4D,CAAC,GAC1C;AAEnB,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,cAAc;AACxD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,cAAc,CAAC,gCAAgC;AAAA,QAC/C,cAAc,KAAK,kBAAkB,WAAW;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,WAAO,KAAK,UAAU,OAAO,aAAa,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,cACE,YACA,aACA,UAA8B,CAAC,GACZ;AACnB,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAU,CAAC;AAAA,QACX,cAAc,CAAC,0BAA0B,UAAU,EAAE;AAAA,QACrD,cAAc,KAAK,kBAAkB,WAAW;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,UAAM,WAAWC,UAAS,UAAU;AAEpC,WAAO,KAAK,iBAAiB,SAAS,aAAa;AAAA,MACjD,GAAG;AAAA,MACH,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,kBACE,YACA,YACA,aACA,UAA8B,CAAC,GACZ;AACnB,UAAM,SAAS,KAAK,cAAc,YAAY,aAAa,OAAO;AAElE,QAAI,OAAO,SAAS;AAElB,YAAM,YAAYC,SAAQ,UAAU;AACpC,UAAI,CAACH,YAAW,SAAS,GAAG;AAC1B,QAAAI,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAGA,MAAAC,eAAc,YAAY,OAAO,SAAS,OAAO;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAkC;AAChC,WAAO,OAAO,KAAK,gBAAgB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAyC;AACvC,WAAO,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAiB,IAAwB;AAEpD,WAAO,KAAK,mBAAmB,EAAE,SAAS,IAAI,KAAK,KAAK,mBAAmB,EAAE,SAAS,EAAE;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,MAAiB,IAIpC;AACA,UAAM,aAAa,KAAK,kBAAkB,IAAI;AAC9C,UAAM,WAAW,KAAK,kBAAkB,EAAE;AAC1C,UAAM,WAAqB,CAAC;AAC5B,UAAM,cAAwB,CAAC;AAG/B,QAAI,eAAe,gBAAgB,aAAa,cAAc;AAC5D,kBAAY,KAAK,SAAS,aAAa;AACvC,eAAS,KAAK,8EAA8E;AAAA,IAC9F;AAGA,QAAI,eAAe,cAAc,aAAa,kBAAkB;AAC9D,kBAAY,KAAK,iBAAiB,UAAU;AAC5C,eAAS,KAAK,uDAAuD;AAAA,IACvE;AAEA,WAAO;AAAA,MACL,WAAW,KAAK,aAAa,MAAM,EAAE;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,qBAAqB,IAAI,mBAAmB;;;ACrPlD,SAAS,eACd,SACA,aACA,SACmB;AACnB,SAAO,mBAAmB,iBAAiB,SAAS,aAAa,OAAO;AAC1E;AAaO,SAAS,mBACd,YACA,aACA,SACmB;AACnB,SAAO,mBAAmB,cAAc,YAAY,aAAa,OAAO;AAC1E;AAaO,SAAS,kBAAkB,SAAiB,UAA0C;AAC3F,SAAO,mBAAmB,MAAM,SAAS,QAAQ;AACnD;AAaO,SAAS,kBAAkB,SAAiB,UAAkC;AACnF,SAAO,mBAAmB,aAAa,SAAS,QAAQ;AAC1D;AAKO,SAAS,gCAA6C;AAC3D,SAAO,mBAAmB,mBAAmB;AAC/C;AAKO,SAAS,aAAa,MAAiB,IAAwB;AACpE,SAAO,mBAAmB,aAAa,MAAM,EAAE;AACjD;;;AChHA,SAAS,KAAAC,UAAS;AAMX,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,KAAKA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAChC,CAAC;AAMM,IAAM,YAAYA,GAAE,OAAO;AAAA,EAChC,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AAAA,EAClD,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAC9B,CAAC;AAMM,IAAM,eAAeA,GAAE,OAAO;AAAA,EACnC,WAAWA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,YAAYA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,WAAWA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,SAASA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtC,SAASA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtC,WAAWA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,OAAOA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,SAASA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAMM,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EACtC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAChC,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACrC,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC9B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA;AAClC,CAAC;AAMM,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EACvC,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3C,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,UAAUA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClC,eAAeA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,QAAQ;AAAA,EACjE,iBAAiBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAC5C,CAAC;AAMM,IAAM,cAAcA,GAAE,OAAO;AAAA,EAClC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EACxC,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EACtC,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAC1C,CAAC;AAMM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,SAASA,GAAE,OAAO;AAAA,IAChB,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAC1B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AAAA,EACD,OAAO;AAAA,EACP,UAAU,gBAAgB,SAAS;AAAA,EACnC,QAAQ,iBAAiB,SAAS;AAAA,EAClC,QAAQ,YAAY,SAAS;AAAA,EAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC;AAMM,IAAM,eAAe;AACrB,IAAM,cAAc;AAmBpB,IAAM,qBAA+C;AAAA,EAC1D,WAAW,CAAC,SAAS,OAAO,WAAW,UAAU,UAAU,QAAQ,OAAO;AAAA,EAC1E,OAAO,CAAC,WAAW,WAAW,OAAO,QAAQ,WAAW,SAAS,QAAQ;AAAA,EACzE,OAAO,CAAC,aAAa,SAAS,aAAa,QAAQ,OAAO;AAAA,EAC1D,WAAW,CAAC,UAAU,WAAW,QAAQ,SAAS;AAAA,EAClD,UAAU,CAAC,gBAAgB,QAAQ,WAAW,OAAO;AAAA,EACrD,WAAW,CAAC,YAAY,OAAO;AACjC;;;AC/HA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,eAAAC,oBAAmB;AACtD,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAM/B,IAAM,qBAAqB;AAAA;AAAA,EAEzB,OAAO;AAAA,IACL,cAAc,CAAC,SAAS,WAAW;AAAA,IACnC,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,YAAY,IAAI;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,MAAM;AAAA,IACrB,OAAO,CAAC,kBAAkB,mBAAmB,gBAAgB;AAAA,IAC7D,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,SAAS,OAAO,UAAU;AAAA,EAC7C;AAAA,EACA,KAAK;AAAA,IACH,cAAc,CAAC,KAAK;AAAA,IACpB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,OAAO,YAAY,IAAI;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,OAAO,CAAC,kBAAkB,gBAAgB;AAAA,IAC1C,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,OAAO,OAAO,UAAU;AAAA,EACzC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,eAAe;AAAA,IAC9B,OAAO,CAAC,cAAc;AAAA,IACtB,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,YAAY,IAAI;AAAA,EACpC;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,QAAQ;AAAA,IACvB,OAAO,CAAC,kBAAkB;AAAA,IAC1B,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,YAAY,IAAI;AAAA,EACnC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,kBAAkB;AAAA,IACjC,OAAO,CAAC,iBAAiB;AAAA,IACzB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,SAAS,OAAO,UAAU;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,OAAO;AAAA,IACtB,OAAO,CAAC,oBAAoB,iBAAiB;AAAA,IAC7C,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,UAAU,UAAU;AAAA,EACtC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,UAAU;AAAA,IACzB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,YAAY,IAAI;AAAA,EAClC;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,cAAc,CAAC,SAAS;AAAA,IACxB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,UAAU,OAAO,SAAS;AAAA,EAC9C;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,SAAS;AAAA,IACxB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,UAAU,OAAO,SAAS;AAAA,EAC9C;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,QAAQ,OAAO,SAAS;AAAA,EACzC;AAAA,EACA,KAAK;AAAA,IACH,cAAc,CAAC,KAAK;AAAA,IACpB,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,MAAM,CAAC,OAAO,UAAU,OAAO,SAAS;AAAA,EAC1C;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,cAAc;AAAA,IAC7B,OAAO,CAAC,eAAe;AAAA,IACvB,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,UAAU,OAAO,SAAS;AAAA,EAC7C;AAAA;AAAA,EAGA,gBAAgB;AAAA,IACd,cAAc,CAAC,cAAc;AAAA,IAC7B,OAAO,CAAC,mBAAmB,UAAU;AAAA,IACrC,UAAU;AAAA,IACV,MAAM,CAAC,gBAAgB,UAAU,OAAO,SAAS;AAAA,EACnD;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,OAAO,CAAC,YAAY,WAAW;AAAA,IAC/B,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,gBAAgB,QAAQ;AAAA,EACzC;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,cAAc,CAAC,UAAU;AAAA,IACzB,OAAO,CAAC,eAAe,uBAAuB;AAAA,IAC9C,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,SAAS;AAAA,EAC9B;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,iBAAiB;AAAA,IAChC,OAAO,CAAC,mBAAmB,WAAW;AAAA,IACtC,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,WAAW,MAAM;AAAA,EACnC;AACF;AAKA,IAAM,mBAAmB;AAAA;AAAA,EAEvB,OAAO;AAAA,IACL,cAAc,CAAC,SAAS,kBAAkB;AAAA,IAC1C,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,kBAAkB;AAAA,EACpC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,SAAS;AAAA,IACxB,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,kBAAkB;AAAA,EACtC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,kBAAkB;AAAA,EACpC;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,QAAQ;AAAA,IACvB,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,kBAAkB;AAAA,EACrC;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,kBAAkB;AAAA,EACnC;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,cAAc,CAAC,yBAAyB,sBAAsB;AAAA,IAC9D,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,iBAAiB,SAAS;AAAA,EAC/C;AAAA,EACA,KAAK;AAAA,IACH,cAAc,CAAC,KAAK;AAAA,IACpB,UAAU;AAAA,IACV,MAAM,CAAC,OAAO,eAAe;AAAA,EAC/B;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,gBAAgB,cAAc;AAAA,IAC7C,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,OAAO,YAAY;AAAA,EACpC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,WAAW,kBAAkB,MAAM;AAAA,IAClD,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,KAAK;AAAA,EACzB;AAAA;AAAA,EAGA,aAAa;AAAA,IACX,cAAc,CAAC,sBAAsB;AAAA,IACrC,OAAO,CAAC,iBAAiB;AAAA,IACzB,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,MAAM,YAAY;AAAA,EACrC;AAAA,EACA,eAAe;AAAA,IACb,cAAc,CAAC,eAAe;AAAA,IAC9B,UAAU;AAAA,IACV,MAAM,CAAC,OAAO,YAAY,MAAM,YAAY;AAAA,EAC9C;AAAA,EACA,aAAa;AAAA,IACX,cAAc,CAAC,kBAAkB;AAAA,IACjC,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,MAAM,YAAY;AAAA,EACrC;AAAA,EACA,cAAc;AAAA,IACZ,cAAc,CAAC,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,MAAM,YAAY;AAAA,EACnC;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,cAAc,CAAC,iBAAiB;AAAA,IAChC,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,YAAY;AAAA,EAC9B;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,QAAQ;AAAA,IACvB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,YAAY;AAAA,EAC9B;AAAA,EACA,KAAK;AAAA,IACH,cAAc,CAAC,KAAK;AAAA,IACpB,UAAU;AAAA,IACV,MAAM,CAAC,cAAc,UAAU,YAAY;AAAA,EAC7C;AAAA;AAAA,EAGA,iBAAiB;AAAA,IACf,cAAc,CAAC,eAAe;AAAA,IAC9B,UAAU;AAAA,IACV,MAAM,CAAC,aAAa,QAAQ;AAAA,EAC9B;AACF;AAKA,IAAM,mBAAmB;AAAA,EACvB,aAAa;AAAA,IACX,cAAc,CAAC,aAAa;AAAA,IAC5B,OAAO,CAAC,sBAAsB,sBAAsB,qBAAqB;AAAA,IACzE,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,OAAO,eAAe;AAAA,EAC3C;AAAA,EACA,qBAAqB;AAAA,IACnB,cAAc,CAAC,mBAAmB;AAAA,IAClC,UAAU;AAAA,IACV,MAAM,CAAC,qBAAqB,WAAW;AAAA,EACzC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,kBAAkB,iBAAiB;AAAA,IAClD,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,WAAW;AAAA,EAC/B;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,QAAQ,WAAW;AAAA,IAClC,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,QAAQ,KAAK;AAAA,EAC9B;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,KAAK;AAAA,EACtB;AAAA,EACA,eAAe;AAAA,IACb,OAAO,CAAC,gBAAgB,eAAe;AAAA,IACvC,UAAU;AAAA,IACV,MAAM,CAAC,eAAe,KAAK;AAAA,EAC7B;AACF;AAKA,IAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,IACJ,cAAc,CAAC,MAAM;AAAA,IACrB,OAAO,CAAC,kBAAkB,gBAAgB;AAAA,IAC1C,UAAU;AAAA,IACV,MAAM,CAAC,QAAQ,WAAW,cAAc;AAAA,EAC1C;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,CAAC,QAAQ;AAAA,IACvB,OAAO,CAAC,oBAAoB,kBAAkB;AAAA,IAC9C,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,WAAW,cAAc;AAAA,EAC5C;AAAA,EACA,YAAY;AAAA,IACV,cAAc,CAAC,kBAAkB;AAAA,IACjC,OAAO,CAAC,wBAAwB,sBAAsB;AAAA,IACtD,UAAU;AAAA,IACV,MAAM,CAAC,cAAc,OAAO,SAAS;AAAA,EACvC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,SAAS;AAAA,IACxB,OAAO,CAAC,qBAAqB,qBAAqB,cAAc;AAAA,IAChE,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,OAAO,SAAS;AAAA,EACpC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,SAAS;AAAA,EAC3B;AAAA,EACA,mBAAmB;AAAA,IACjB,cAAc,CAAC,0BAA0B,sBAAsB;AAAA,IAC/D,UAAU;AAAA,IACV,MAAM,CAAC,mBAAmB,SAAS;AAAA,EACrC;AACF;AAKA,IAAM,oBAAoB;AAAA,EACxB,QAAQ;AAAA,IACN,cAAc,CAAC,kBAAkB,QAAQ;AAAA,IACzC,OAAO,CAAC,sBAAsB;AAAA,IAC9B,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,OAAO,UAAU;AAAA,EACpC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,aAAa;AAAA,IAC5B,OAAO,CAAC,mBAAmB;AAAA,IAC3B,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,OAAO,UAAU;AAAA,EACrC;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,SAAS;AAAA,IACxB,UAAU;AAAA,IACV,MAAM,CAAC,WAAW,OAAO,UAAU;AAAA,EACrC;AAAA,EACA,UAAU;AAAA,IACR,cAAc,CAAC,UAAU;AAAA,IACzB,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,WAAW,UAAU;AAAA,EAC1C;AAAA,EACA,UAAU;AAAA,IACR,cAAc,CAAC,uBAAuB;AAAA,IACtC,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,YAAY,YAAY,MAAM;AAAA,EACnD;AAAA,EACA,UAAU;AAAA,IACR,cAAc,CAAC,YAAY,gBAAgB;AAAA,IAC3C,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,YAAY,MAAM;AAAA,EACvC;AACF;AAKA,IAAM,gBAAgB;AAAA,EACpB,QAAQ;AAAA,IACN,cAAc,CAAC,QAAQ;AAAA,IACvB,OAAO,CAAC,aAAa,gBAAgB,kBAAkB,kBAAkB;AAAA,IACzE,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,SAAS;AAAA,EAC5B;AAAA,EACA,UAAU;AAAA,IACR,cAAc,CAAC,UAAU;AAAA,IACzB,OAAO,CAAC,eAAe,kBAAkB,oBAAoB;AAAA,IAC7D,UAAU;AAAA,IACV,MAAM,CAAC,YAAY,YAAY;AAAA,EACjC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,gBAAgB;AAAA,IAC/B,OAAO,CAAC,YAAY;AAAA,IACpB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,WAAW,YAAY;AAAA,EACzC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,OAAO;AAAA,IACtB,OAAO,CAAC,QAAQ;AAAA,IAChB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,WAAW;AAAA,EAC7B;AAAA,EACA,eAAe;AAAA,IACb,cAAc,CAAC,aAAa;AAAA,IAC5B,UAAU;AAAA,IACV,MAAM,CAAC,eAAe,WAAW;AAAA,EACnC;AAAA,EACA,OAAO;AAAA,IACL,cAAc,CAAC,OAAO;AAAA,IACtB,OAAO,CAAC,YAAY;AAAA,IACpB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,YAAY,OAAO;AAAA,EACrC;AAAA,EACA,IAAI;AAAA,IACF,cAAc,CAAC,IAAI;AAAA,IACnB,OAAO,CAAC,SAAS;AAAA,IACjB,UAAU;AAAA,IACV,MAAM,CAAC,MAAM,YAAY,OAAO;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACN,OAAO,CAAC,cAAc,sBAAsB,qBAAqB;AAAA,IACjE,UAAU;AAAA,IACV,MAAM,CAAC,UAAU,YAAY;AAAA,EAC/B;AACF;AAQO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,cAA8C;AAAA,EAC9C,QAAqB,oBAAI,IAAI;AAAA,EAErC,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAwB;AAEtB,SAAK,gBAAgB;AAGrB,SAAK,UAAU;AAGf,UAAM,QAAsB;AAAA,MAC1B,WAAW,KAAK,gBAAgB;AAAA,MAChC,YAAY,KAAK,mBAAmB,kBAAkB;AAAA,MACtD,WAAW,KAAK,mBAAmB,gBAAgB;AAAA,MACnD,SAAS,KAAK,mBAAmB,gBAAgB;AAAA,MACjD,SAAS,KAAK,mBAAmB,gBAAgB;AAAA,MACjD,WAAW,KAAK,mBAAmB,iBAAiB;AAAA,MACpD,OAAO,KAAK,mBAAmB,aAAa;AAAA,MAC5C,SAAS,KAAK,cAAc;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAkC;AAChC,UAAM,WAA4B,CAAC;AAGnC,QAAI,KAAK,QAAQ,OAAO,KAAK,KAAK,QAAQ,OAAO,GAAG;AAElD,eAAS,aAAa;AAAA,IACxB;AAGA,UAAM,OAAO,KAAK,gBAAgB;AAClC,QAAI,KAAK,IAAI,SAAS,EAAG,UAAS,kBAAkB;AAAA,aAC3C,KAAK,IAAI,kBAAkB,KAAK,KAAK,IAAI,OAAO,EAAG,UAAS,kBAAkB;AAAA,aAC9E,KAAK,IAAI,OAAO,EAAG,UAAS,kBAAkB;AAAA,aAC9C,KAAK,IAAI,QAAQ,EAAG,UAAS,kBAAkB;AAAA,aAC/C,KAAK,IAAI,MAAM,EAAG,UAAS,kBAAkB;AAGtD,QAAI,KAAK,IAAI,cAAc,EAAG,UAAS,WAAW;AAAA,aACzC,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,gBAAgB,EAAG,UAAS,WAAW;AAAA,aACvE,KAAK,IAAI,MAAM,KAAK,KAAK,QAAQ,mBAAmB,EAAG,UAAS,WAAW;AAAA,QAC/E,UAAS,WAAW;AAGzB,QAAI,KAAK,IAAI,aAAa,EAAG,UAAS,UAAU;AAAA,aACvC,KAAK,IAAI,mBAAmB,EAAG,UAAS,UAAU;AAAA,aAClD,KAAK,IAAI,gBAAgB,EAAG,UAAS,UAAU;AAAA,aAC/C,KAAK,QAAQ,cAAc,EAAG,UAAS,UAAU;AAG1D,QAAI,KAAK,IAAI,QAAQ,EAAG,UAAS,UAAU;AAAA,aAClC,KAAK,IAAI,MAAM,EAAG,UAAS,UAAU;AAAA,aACrC,KAAK,IAAI,kBAAkB,EAAG,UAAS,UAAU;AAAA,aACjD,KAAK,IAAI,SAAS,EAAG,UAAS,UAAU;AAGjD,QAAI,KAAK,IAAI,gBAAgB,EAAG,UAAS,UAAU;AAAA,aAC1C,KAAK,IAAI,QAAQ,EAAG,UAAS,UAAU;AAGhD,QAAI,KAAK,IAAI,gBAAgB,EAAG,UAAS,aAAa;AAAA,aAC7C,KAAK,IAAI,UAAU,EAAG,UAAS,aAAa;AAErD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA4B;AAC1B,UAAM,OAAO,KAAK,gBAAgB;AAGlC,QAAI,KAAK,IAAI,cAAc,KAAK,KAAK,IAAI,MAAM,EAAG,QAAO;AACzD,QAAI,KAAK,IAAI,UAAU,KAAK,KAAK,IAAI,iBAAiB,EAAG,QAAO;AAChE,QAAI,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,EAAG,QAAO;AACtE,QAAI,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,MAAM,EAAG,QAAO;AAC3E,QAAI,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,OAAO,EAAG,QAAO;AAGhF,QAAI,KAAK,QAAQ,kBAAkB,KAAK,KAAK,QAAQ,gBAAgB,EAAG,QAAO;AAG/E,QAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,QAAQ,EAAG,QAAO;AAEvE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACvB,QAAI,KAAK,eAAe,OAAO,KAAK,YAAY,SAAS,UAAU;AACjE,aAAO,KAAK,YAAY;AAAA,IAC1B;AACA,WAAOA,UAAS,KAAK,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA4C;AAC1C,QAAI,KAAK,eAAe,OAAO,KAAK,YAAY,gBAAgB,UAAU;AACxE,aAAO,KAAK,YAAY;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,kBAAwB;AAC9B,UAAM,kBAAkBD,MAAK,KAAK,aAAa,cAAc;AAC7D,QAAIH,YAAW,eAAe,GAAG;AAC/B,UAAI;AACF,cAAM,UAAUC,cAAa,iBAAiB,OAAO;AACrD,aAAK,cAAc,KAAK,MAAM,OAAO;AAAA,MACvC,QAAQ;AACN,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,QAAI;AACF,YAAM,UAAUC,aAAY,KAAK,aAAa,EAAE,eAAe,KAAK,CAAC;AACrE,iBAAW,SAAS,SAAS;AAC3B,aAAK,MAAM,IAAI,MAAM,IAAI;AACzB,YAAI,MAAM,YAAY,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AAEvF,cAAI;AACF,kBAAM,aAAaA,aAAYC,MAAK,KAAK,aAAa,MAAM,IAAI,CAAC;AACjE,uBAAW,YAAY,YAAY;AACjC,mBAAK,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,QAAQ,EAAE;AAAA,YAC5C;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,kBAA+B;AACrC,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,CAAC,KAAK,YAAa,QAAO;AAE9B,UAAM,eAAe,KAAK,YAAY;AACtC,UAAM,kBAAkB,KAAK,YAAY;AAEzC,QAAI,cAAc;AAChB,iBAAW,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3C,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AACA,QAAI,iBAAiB;AACnB,iBAAW,OAAO,OAAO,KAAK,eAAe,GAAG;AAC9C,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,SAAqC;AACtD,QAAI,CAAC,KAAK,YAAa,QAAO;AAE9B,UAAM,eAAe,KAAK,YAAY;AACtC,UAAM,kBAAkB,KAAK,YAAY;AAEzC,UAAM,UAAU,eAAe,OAAO,KAAK,kBAAkB,OAAO;AACpE,QAAI,SAAS;AAEX,aAAO,QAAQ,QAAQ,cAAc,EAAE;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,SAA0B;AACxC,QAAI,QAAQ,SAAS,GAAG,GAAG;AAEzB,YAAM,QAAQ,IAAI,OAAO,QAAQ,QAAQ,OAAO,IAAI,CAAC;AACrD,iBAAW,QAAQ,KAAK,OAAO;AAC7B,YAAI,MAAM,KAAK,IAAI,EAAG,QAAO;AAAA,MAC/B;AACA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,IAAI,OAAO;AAAA,EAC/B;AAAA,EAEQ,kBAA+B;AACrC,UAAM,YAAyB,CAAC;AAGhC,QAAI,KAAK,QAAQ,eAAe,KAAK,KAAK,MAAM,IAAI,MAAM,GAAG;AAC3D,YAAM,YAAY,KAAK,WAAW,YAAY;AAC9C,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,eAAe,KAAM,KAAK,eAAe,CAAC,KAAK,QAAQ,eAAe,GAAI;AACzF,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,kBAAkB,GAAG;AACtE,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,YAAY,GAAG;AAC9B,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,QAAQ,GAAG;AAC1B,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAA6B;AACnC,UAAM,UAAuB,CAAC;AAG9B,QAAI,KAAK,aAAa;AACpB,YAAM,UAAU,KAAK,YAAY;AACjC,YAAM,cAAc,SAAS;AAC7B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,aAAa,QAAQ,aAAa,EAAE;AAAA,QAC7C,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,aAAa,GAAG;AAC5D,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,YAAY,GAAG;AAC3D,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBACN,UACa;AACb,UAAM,WAAwB,CAAC;AAC/B,UAAM,OAAO,KAAK,gBAAgB;AAElC,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACtD,UAAI,QAAQ;AACZ,UAAI;AAGJ,UAAI,QAAQ,cAAc;AACxB,mBAAW,OAAO,QAAQ,cAAc;AACtC,cAAI,KAAK,IAAI,GAAG,GAAG;AACjB,oBAAQ;AACR,qBAAS;AACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,CAAC,SAAS,QAAQ,OAAO;AAC3B,mBAAW,QAAQ,QAAQ,OAAO;AAChC,cAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,oBAAQ;AACR,qBAAS;AACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO;AACT,cAAM,UAAU,QAAQ,eAAe,KAAK,WAAW,QAAQ,aAAa,CAAC,CAAC,IAAI;AAClF,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,eAAe,aAAmC;AAChE,QAAM,WAAW,IAAI,gBAAgB,WAAW;AAChD,SAAO,SAAS,QAAQ;AAC1B;AAKO,SAAS,aAAa,OAA+B;AAC1D,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,UAAU,CAAC,YAAyB,aAAkD;AAC1F,eAAW,aAAa,YAAY;AAClC,YAAM,UAAU,SAAS,UAAU,IAAI;AACvC,UAAI,SAAS,MAAM;AACjB,mBAAW,OAAO,QAAQ,MAAM;AAC9B,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF,OAAO;AACL,aAAK,IAAI,UAAU,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,MAAM,WAAW;AAClC,SAAK,IAAI,KAAK,IAAI;AAAA,EACpB;AAGA,UAAQ,MAAM,YAAY,kBAAkB;AAC5C,UAAQ,MAAM,WAAW,gBAAgB;AACzC,UAAQ,MAAM,SAAS,gBAAgB;AACvC,UAAQ,MAAM,SAAS,gBAAgB;AACvC,UAAQ,MAAM,WAAW,iBAAiB;AAE1C,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC/wBA,SAAS,cAAAE,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,SAASC,YAAW,aAAaC,sBAAqB;AAsBxD,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA,UAAiC;AAAA,EAEzC,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC/C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACvB,WAAOC,MAAK,KAAK,aAAa,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkB;AAChB,WAAOC,YAAW,KAAK,eAAe,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAA8B;AAC5B,UAAM,cAAc,KAAK,eAAe;AAExC,QAAI,CAACA,YAAW,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAUC,cAAa,aAAa,OAAO;AACjD,YAAM,OAAOC,WAAU,OAAO;AAC9B,YAAM,SAAS,eAAqB,UAAU,IAAI;AAElD,UAAI,OAAO,SAAS;AAClB,aAAK,UAAU,OAAO;AACtB,eAAO,KAAK;AAAA,MACd;AAGA,cAAQ,KAAK,kDAAkD;AAC/D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,2BAA2B,KAAK;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAA+B;AAClC,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,aAAaH,MAAK,KAAK,aAAa,WAAW;AAGrD,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,MAAAG,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAGA,YAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAG3C,UAAM,UAAUC,eAAc,SAAS;AAAA,MACrC,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAED,IAAAC,eAAc,aAAa,SAAS,OAAO;AAC3C,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,UAAwD,CAAC,GAAmB;AAE/E,QAAI,KAAK,OAAO,KAAK,CAAC,QAAQ,OAAO;AACnC,YAAM,WAAW,KAAK,KAAK;AAC3B,UAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,WAAW,IAAI,gBAAgB,KAAK,WAAW;AACrD,UAAM,QAAQ,QAAQ,gBAAgB,KAAK,cAAc,IAAI,SAAS,QAAQ;AAC9E,UAAM,WAAW,QAAQ,gBAAgB,CAAC,IAAI,SAAS,eAAe;AACtE,UAAM,cAAc,QAAQ,gBAAgB,YAAY,SAAS,kBAAkB;AACnF,UAAM,cAAc,SAAS,eAAe;AAC5C,UAAM,qBAAqB,SAAS,sBAAsB;AAG1D,UAAM,UAA0B;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC;AAAA,QACd,UAAU,CAAC;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,UAAU,CAAC;AAAA,QACX,QAAQ,CAAC;AAAA,QACT,UAAU,CAAC;AAAA,MACb;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAGA,SAAK,KAAK,OAAO;AACjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAA0B;AACxB,UAAM,WAAW,KAAK,KAAK;AAC3B,UAAM,WAAW,IAAI,gBAAgB,KAAK,WAAW;AACrD,UAAM,QAAQ,SAAS,QAAQ;AAC/B,UAAM,WAAW,SAAS,eAAe;AACzC,UAAM,cAAc,SAAS,kBAAkB;AAE/C,QAAI,UAAU;AAEZ,YAAM,SAAyB;AAAA,QAC7B,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,SAAS;AAAA,UACP,GAAG,SAAS;AAAA,UACZ,MAAM;AAAA,QACR;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAEA,WAAK,KAAK,MAAM;AAChB,aAAO;AAAA,IACT;AAGA,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAA6B;AAC3B,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAyC;AACpD,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,YAAQ,SAAS;AAAA,MACf,GAAG,QAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAoC;AAC/C,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,YAAQ,SAAS;AAAA,MACf,GAAG,QAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAwB;AACtC,SAAK,aAAa,EAAE,SAAS,MAAM,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAwB;AACrC,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,SAAS,IAAI,IAAI,QAAQ,QAAQ,UAAU,CAAC,CAAC;AACnD,WAAO,IAAI,KAAK;AAEhB,SAAK,aAAa,EAAE,QAAQ,MAAM,KAAK,MAAM,EAAE,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAwB;AACxC,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,SAAS,IAAI,IAAI,QAAQ,QAAQ,UAAU,CAAC,CAAC;AACnD,WAAO,OAAO,KAAK;AAEnB,SAAK,aAAa,EAAE,QAAQ,MAAM,KAAK,MAAM,EAAE,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAyB;AACzC,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,QAAS;AAEd,UAAM,YAAY,IAAI,IAAI,QAAQ,QAAQ,aAAa,CAAC,CAAC;AACzD,cAAU,IAAI,SAAS;AAEvB,SAAK,aAAa,EAAE,WAAW,MAAM,KAAK,SAAS,EAAE,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,WAAyB;AAC5C,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,QAAS;AAEd,UAAM,YAAY,IAAI,IAAI,QAAQ,QAAQ,aAAa,CAAC,CAAC;AACzD,cAAU,OAAO,SAAS;AAE1B,SAAK,aAAa,EAAE,WAAW,MAAM,KAAK,SAAS,EAAE,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAgC,CAAC,GAAW;AACjD,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAGA,UAAM,WAAW,EAAE,GAAG,QAAQ;AAE9B,QAAI,CAAC,QAAQ,eAAe;AAC1B,aAAQ,SAAqC;AAAA,IAC/C;AACA,QAAI,CAAC,QAAQ,eAAe;AAC1B,aAAQ,SAAqC;AAAA,IAC/C;AAGA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,aAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,IACzC;AAEA,WAAOD,eAAc,UAAU;AAAA,MAC7B,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,UAAgC,CAAC,GAAmB;AAE1E,QAAI;AACJ,QAAI;AAEF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AAEN,aAAOF,WAAU,OAAO;AAAA,IAC1B;AAEA,UAAM,SAAS,eAAqB,UAAU,IAAI;AAClD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,MAAM,2BAA2B,OAAO,MAAM,OAAO,EAAE;AAAA,IACnE;AAEA,UAAM,WAAW,OAAO;AAExB,QAAI,QAAQ,SAAS,KAAK,OAAO,GAAG;AAClC,YAAM,WAAW,KAAK,KAAK;AAC3B,YAAM,SAAS,KAAK,cAAc,UAAU,QAAQ;AACpD,WAAK,KAAK,MAAM;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,aAAa,KAAK,OAAO,GAAG;AACvC,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,SAAK,KAAK,QAAQ;AAClB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,UAA0B,UAA0C;AACxF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,GAAG,SAAS;AAAA,MACd;AAAA,MACA,OAAO,KAAK,YAAY,SAAS,OAAO,SAAS,KAAK;AAAA,MACtD,UAAU;AAAA,QACR,GAAG,SAAS;AAAA,QACZ,GAAG,SAAS;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,QACN,WAAW,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,aAAa,CAAC,GAAI,GAAI,SAAS,QAAQ,aAAa,CAAC,CAAE,CAAC,CAAC;AAAA,QACtG,aAAa,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,eAAe,CAAC,GAAI,GAAI,SAAS,QAAQ,eAAe,CAAC,CAAE,CAAC,CAAC;AAAA,QAC5G,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,YAAY,CAAC,GAAI,GAAI,SAAS,QAAQ,YAAY,CAAC,CAAE,CAAC,CAAC;AAAA,QACnG,UAAU,SAAS,QAAQ,YAAY,SAAS,QAAQ,YAAY;AAAA,QACpE,eAAe,SAAS,QAAQ,iBAAiB,SAAS,QAAQ,iBAAiB;AAAA,QACnF,iBAAiB,SAAS,QAAQ,mBAAmB,SAAS,QAAQ,mBAAmB;AAAA,MAC3F;AAAA,MACA,QAAQ;AAAA,QACN,SAAS,SAAS,QAAQ,WAAW,SAAS,QAAQ;AAAA,QACtD,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,YAAY,CAAC,GAAI,GAAI,SAAS,QAAQ,YAAY,CAAC,CAAE,CAAC,CAAC;AAAA,QACnG,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,UAAU,CAAC,GAAI,GAAI,SAAS,QAAQ,UAAU,CAAC,CAAE,CAAC,CAAC;AAAA,QAC7F,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,SAAS,QAAQ,YAAY,CAAC,GAAI,GAAI,SAAS,QAAQ,YAAY,CAAC,CAAE,CAAC,CAAC;AAAA,MACrG;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,UAAwB,UAAsC;AAChF,UAAM,cAAc,CAAC,GAAgB,MAAgC;AACnE,YAAM,QAAQ,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAChD,YAAM,SAAsB,CAAC,GAAG,CAAC;AACjC,iBAAW,QAAQ,GAAG;AACpB,YAAI,CAAC,MAAM,IAAI,KAAK,IAAI,GAAG;AACzB,iBAAO,KAAK,IAAI;AAAA,QAClB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,WAAW,YAAY,SAAS,WAAW,SAAS,SAAS;AAAA,MAC7D,YAAY,YAAY,SAAS,YAAY,SAAS,UAAU;AAAA,MAChE,WAAW,YAAY,SAAS,WAAW,SAAS,SAAS;AAAA,MAC7D,SAAS,YAAY,SAAS,SAAS,SAAS,OAAO;AAAA,MACvD,SAAS,YAAY,SAAS,SAAS,SAAS,OAAO;AAAA,MACvD,WAAW,YAAY,SAAS,WAAW,SAAS,SAAS;AAAA,MAC7D,OAAO,YAAY,SAAS,OAAO,SAAS,KAAK;AAAA,MACjD,SAAS,YAAY,SAAS,SAAS,SAAS,OAAO;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAA8B;AACpC,WAAO;AAAA,MACL,WAAW,CAAC;AAAA,MACZ,YAAY,CAAC;AAAA,MACb,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA+B;AAC7B,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,WAAO,aAAa,QAAQ,KAAK;AAAA,EACnC;AACF;AAKO,SAAS,qBAAqB,aAAsC;AACzE,SAAO,IAAI,eAAe,WAAW;AACvC;AAKO,SAAS,YAAY,aAA6C;AACvE,QAAM,UAAU,IAAI,eAAe,WAAW;AAC9C,SAAO,QAAQ,KAAK;AACtB;AAKO,SAAS,YAAY,aAAsB,SAA+C;AAC/F,QAAM,UAAU,IAAI,eAAe,WAAW;AAC9C,SAAO,QAAQ,KAAK,OAAO;AAC7B;;;ACndA,SAAS,cAAAI,cAAY,iBAAAC,gBAAe,aAAAC,YAAW,cAAc,eAAAC,oBAAmB;AAChF,SAAS,QAAAC,aAAY;AAiCrB,IAAM,aAA2E;AAAA,EAC/E,eAAe,EAAE,WAAW,kBAAkB,YAAY,YAAY;AAAA,EACtE,UAAU,EAAE,WAAW,kBAAkB,YAAY,eAAe;AAAA,EACpE,SAAS,EAAE,WAAW,iBAAiB,YAAY,YAAY;AAAA,EAC/D,cAAc,EAAE,WAAW,kBAAkB,YAAY,YAAY;AAAA,EACrE,YAAY,EAAE,WAAW,oBAAoB,YAAY,YAAY;AAAA,EACrE,eAAe,EAAE,WAAW,uBAAuB,YAAY,YAAY;AAAA,EAC3E,OAAO,EAAE,WAAW,kBAAkB,YAAY,YAAY;AAAA,EAC9D,YAAY,EAAE,WAAW,UAAU,YAAY,YAAY;AAAA,EAC3D,SAAS,EAAE,WAAW,mBAAmB,YAAY,YAAY;AAAA,EACjE,kBAAkB,EAAE,WAAW,kBAAkB,YAAY,YAAY;AAAA,EACzE,SAAS,EAAE,WAAW,iBAAiB,YAAY,YAAY;AAAA,EAC/D,QAAQ,EAAE,WAAW,oBAAoB,YAAY,YAAY;AAAA,EACjE,YAAY,EAAE,WAAW,gBAAgB,YAAY,YAAY;AAAA,EACjE,OAAO,EAAE,WAAW,eAAe,YAAY,YAAY;AAAA,EAC3D,QAAQ,EAAE,WAAW,gBAAgB,YAAY,YAAY;AAAA,EAC7D,YAAY,EAAE,WAAW,oBAAoB,YAAY,YAAY;AAAA,EACrE,aAAa,EAAE,WAAW,iBAAiB,YAAY,YAAY;AACrE;AAQO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC/C,SAAK,cAAc;AACnB,SAAK,iBAAiB,IAAI,eAAe,WAAW;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,eAA4B;AAC1B,UAAM,WAAwB,CAAC;AAE/B,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,YAAM,aAAaC,MAAK,KAAK,aAAa,OAAO,SAAS;AAC1D,YAAM,aAAaA,MAAK,KAAK,aAAa,OAAO,UAAU;AAG3D,UAAIC,aAAW,UAAU,KAAKA,aAAW,UAAU,GAAG;AACpD,iBAAS,KAAK,KAAkB;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AAC/D,QAAI,SAAS;AAEX,UAAIA,aAAWD,MAAK,SAAS,SAAS,CAAC,GAAG;AACxC,YAAI,CAAC,SAAS,SAAS,aAAa,EAAG,UAAS,KAAK,aAAa;AAAA,MACpE;AAEA,UAAIC,aAAWD,MAAK,SAAS,SAAS,CAAC,GAAG;AACxC,YAAI,CAAC,SAAS,SAAS,QAAQ,EAAG,UAAS,KAAK,QAAQ;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAA8B,CAAC,GAAgB;AAE7D,QAAI,QAAQ,QAAQ,QAAQ;AAC1B,aAAO,QAAQ;AAAA,IACjB;AAGA,UAAM,UAAU,KAAK,eAAe,IAAI;AACxC,QAAI,SAAS,QAAQ,QAAQ,QAAQ;AACnC,aAAO,QAAQ,OAAO;AAAA,IACxB;AAGA,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,UAA8B,CAAC,GAAwB;AACnE,UAAM,eAAe,KAAK,gBAAgB,OAAO;AACjD,UAAM,UAAwB,CAAC;AAG/B,UAAM,SAAS,KAAK,gBAAgB;AAEpC,eAAW,SAAS,cAAc;AAChC,YAAM,SAAS,MAAM,KAAK,YAAY,OAAO,QAAQ,OAAO;AAC5D,cAAQ,KAAK,MAAM;AAAA,IACrB;AAGA,QAAI,CAAC,QAAQ,QAAQ;AACnB,WAAK,eAAe,aAAa;AAAA,QAC/B,UAAU,KAAK,aAAa;AAAA,QAC5B,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,aAAa,aAAa;AAAA,MAC1B,kBAAkB,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MACnD,aAAa,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,OACA,QACA,UAA8B,CAAC,GACV;AACrB,UAAM,SAAqB;AAAA,MACzB,SAAS;AAAA,MACT;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,MACf,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,OAAO,CAAC;AAAA,IACV;AAGA,UAAM,eAAe,UAAU,KAAK,gBAAgB;AAGpD,UAAM,cAAc,WAAW,KAAK;AACpC,QAAI,CAAC,aAAa;AAChB,aAAO,UAAU;AACjB,aAAO,OAAO,KAAK,kBAAkB,KAAK,EAAE;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,YAAYA,MAAK,KAAK,aAAa,YAAY,SAAS;AAG9D,QAAI,CAAC,QAAQ,UAAU,CAACC,aAAW,SAAS,GAAG;AAC7C,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,eAAW,SAAS,cAAc;AAChC,UAAI;AACF,cAAM,cAAc,MAAM,KAAK,UAAU,OAAO,OAAO,WAAW,OAAO;AACzE,YAAI,YAAY,QAAQ;AACtB,iBAAO;AACP,iBAAO,MAAM,KAAK,YAAY,IAAK;AAAA,QACrC,OAAO;AACL,iBAAO;AACP,cAAI,YAAY,SAAS;AACvB,mBAAO,SAAS,KAAK,YAAY,OAAO;AAAA,UAC1C;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,OAAO,KAAK,kBAAkB,MAAM,IAAI,KAAK,KAAK,EAAE;AAC3D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UACZ,OACA,OACA,WACA,SAC+D;AAC/D,UAAM,cAAcF,MAAK,MAAM,MAAM,UAAU;AAE/C,QAAI,CAACC,aAAW,WAAW,GAAG;AAC5B,aAAO,EAAE,QAAQ,OAAO,SAAS,yBAAyB,MAAM,IAAI,GAAG;AAAA,IACzE;AAGA,UAAM,cAAc,mBAAmB,aAAa,OAAO;AAAA,MACzD,aAAa;AAAA,IACf,CAAC;AAED,QAAI,CAAC,YAAY,SAAS;AACxB,aAAO,EAAE,QAAQ,OAAO,SAAS,0BAA0B,MAAM,IAAI,GAAG;AAAA,IAC1E;AAGA,UAAM,iBAAiBD,MAAK,WAAW,MAAM,IAAI;AACjD,UAAM,aAAaA,MAAK,gBAAgB,YAAY,QAAQ;AAG5D,QAAIC,aAAW,UAAU,KAAK,CAAC,QAAQ,OAAO;AAC5C,aAAO,EAAE,QAAQ,OAAO,SAAS,GAAG,MAAM,IAAI,6CAA6C;AAAA,IAC7F;AAGA,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,CAACA,aAAW,cAAc,GAAG;AAC/B,QAAAC,WAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/C;AACA,MAAAC,eAAc,YAAY,YAAY,SAAS,OAAO;AAGtD,YAAM,KAAK,gBAAgB,MAAM,MAAM,cAAc;AAAA,IACvD;AAEA,WAAO,EAAE,QAAQ,MAAM,MAAM,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,YAAoB,YAAmC;AACnF,UAAM,YAAY,CAAC,cAAc,WAAW,UAAU,WAAW;AAEjE,eAAW,YAAY,WAAW;AAChC,YAAM,iBAAiBH,MAAK,YAAY,QAAQ;AAChD,UAAIC,aAAW,cAAc,GAAG;AAC9B,cAAM,iBAAiBD,MAAK,YAAY,QAAQ;AAChD,YAAI,CAACC,aAAW,cAAc,GAAG;AAC/B,UAAAC,WAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,QAC/C;AAGA,YAAI;AACF,gBAAM,QAAQE,aAAY,cAAc;AACxC,qBAAW,QAAQ,OAAO;AACxB,kBAAM,aAAaJ,MAAK,gBAAgB,IAAI;AAC5C,kBAAM,aAAaA,MAAK,gBAAgB,IAAI;AAC5C,yBAAa,YAAY,UAAU;AAAA,UACrC;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAyD;AAC/D,UAAM,UAAU,KAAK,eAAe,IAAI;AACxC,UAAM,eAAe,SAAS,QAAQ;AAGtC,UAAM,aAAuB,CAAC;AAE9B,QAAI,gBAAgB,WAAW,YAAY,GAAG;AAC5C,iBAAW,KAAKA,MAAK,KAAK,aAAa,WAAW,YAAY,EAAE,SAAS,CAAC;AAAA,IAC5E;AAGA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,OAAO,YAAY;AAC5B,YAAM,WAAWA,MAAK,KAAK,aAAa,GAAG;AAC3C,UAAI,CAAC,WAAW,SAAS,QAAQ,KAAKC,aAAW,QAAQ,GAAG;AAC1D,mBAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,SAAS,cAAc,UAAU;AACvC,WAAO,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,cAA+F;AAC7F,UAAM,SAAuF,CAAC;AAE9F,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,YAAM,aAAaD,MAAK,KAAK,aAAa,OAAO,SAAS;AAC1D,YAAM,SAAmB,CAAC;AAE1B,UAAIC,aAAW,UAAU,GAAG;AAC1B,YAAI;AACF,gBAAM,UAAUG,aAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAC/D,qBAAW,SAAS,SAAS;AAC3B,gBAAI,MAAM,YAAY,GAAG;AACvB,qBAAO,KAAK,MAAM,IAAI;AAAA,YACxB;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,aAAO,KAAK,IAAI;AAAA,QACd,WAAW,OAAO,SAAS;AAAA,QAC3B,YAAY,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,kBAAkB,aAAmC;AACnE,SAAO,IAAI,YAAY,WAAW;AACpC;AAKA,eAAsB,gBACpB,aACA,SACqB;AACrB,QAAM,OAAO,IAAI,YAAY,WAAW;AACxC,SAAO,KAAK,QAAQ,OAAO;AAC7B;AAKA,eAAsB,YACpB,OACA,aACA,SACqB;AACrB,QAAM,OAAO,IAAI,YAAY,WAAW;AACxC,SAAO,KAAK,YAAY,OAAO,QAAW,OAAO;AACnD;;;AC3XA,SAAS,cAAAC,cAAY,gBAAAC,eAAc,YAAAC,iBAAgB;AACnD,SAAS,QAAAC,cAAY;AAuDd,IAAM,6BAAgD;AAAA,EAC3D;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AACF;AAMO,SAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAClC;AAKO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB,SAAsE;AACrG,SAAK,cAAc;AACnB,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,gBAAgB,SAAS,iBAAiB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,UAA8B,CAAC,GAAkB;AACpD,UAAM,cAAc,QAAQ,eAAe,KAAK;AAChD,UAAM,sBAAsB,QAAQ;AAEpC,UAAM,SAAwB;AAAA,MAC5B,SAAS;AAAA,MACT,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC;AAAA,MACnB,mBAAmB,CAAC;AAAA,MACpB,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAEA,UAAM,eAAyB,CAAC;AAGhC,eAAW,YAAY,KAAK,YAAY;AACtC,UAAI,CAAC,SAAS,WAAY;AAC1B,UAAI,uBAAuB,CAAC,oBAAoB,SAAS,SAAS,IAAI,EAAG;AAEzE,WAAK,aAAa,UAAU,QAAQ,cAAc,WAAW;AAAA,IAC/D;AAGA,eAAW,YAAY,KAAK,YAAY;AACtC,UAAI,SAAS,WAAY;AACzB,UAAI,uBAAuB,CAAC,oBAAoB,SAAS,SAAS,IAAI,EAAG;AAEzE,WAAK,aAAa,UAAU,QAAQ,cAAc,WAAW;AAAA,IAC/D;AAGA,WAAO,UAAU,aAAa,KAAK,aAAa;AAGhD,UAAM,eAAgB,OAAO,cAAc,cAAe;AAC1D,WAAO,kBAAkB,gBAAgB;AACzC,WAAO,kBAAkB,gBAAgB;AAGzC,QAAI,OAAO,mBAAmB,QAAQ,sBAAsB,OAAO;AACjE,aAAO,SAAS;AAAA,QACd,oBAAoB,KAAK,MAAM,YAAY,CAAC;AAAA,MAC9C;AAAA,IACF,WAAW,OAAO,mBAAmB,QAAQ,sBAAsB,OAAO;AACxE,aAAO,SAAS,KAAK,oBAAoB,KAAK,MAAM,YAAY,CAAC,wBAAwB;AAAA,IAC3F;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aACN,UACA,QACA,cACA,aACM;AACN,QAAI,UAAyB;AAG7B,QAAI,SAAS,MAAM;AACjB,YAAM,WAAWA,OAAK,KAAK,aAAa,SAAS,IAAI;AACrD,UAAIH,aAAW,QAAQ,GAAG;AACxB,YAAI;AACF,oBAAUC,cAAa,UAAU,OAAO;AAAA,QAC1C,QAAQ;AACN,iBAAO,kBAAkB,KAAK,SAAS,IAAI;AAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,SAAS,SAAS;AAChC,gBAAU,SAAS;AAAA,IACrB;AAEA,QAAI,CAAC,SAAS;AACZ,aAAO,kBAAkB,KAAK,SAAS,IAAI;AAC3C;AAAA,IACF;AAGA,UAAM,SAAS,eAAe,OAAO;AAGrC,QAAI,SAAS,SAAS,WAAW;AAE/B,YAAM,gBAAgB,SAAS,YAAY;AAC3C,gBAAU,QAAQ,MAAM,GAAG,aAAa,IAAI;AAC5C,aAAO,SAAS;AAAA,QACd,aAAa,SAAS,IAAI,kBAAkB,SAAS,SAAS;AAAA,MAChE;AAAA,IACF;AAGA,UAAM,kBAAkB,eAAe,OAAO;AAC9C,QAAI,OAAO,cAAc,kBAAkB,aAAa;AAEtD,aAAO,kBAAkB,KAAK,SAAS,IAAI;AAC3C,aAAO,SAAS;AAAA,QACd,aAAa,SAAS,IAAI;AAAA,MAC5B;AACA;AAAA,IACF;AAGA,iBAAa,KAAK,KAAK,SAAS,KAAK,YAAY,CAAC;AAAA;AAAA,EAAO,OAAO,EAAE;AAClE,WAAO,eAAe;AACtB,WAAO,kBAAkB,cAAc,OAAO;AAC9C,WAAO,iBAAiB,KAAK,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAA2C;AACrD,WAAO,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAiC;AAC3C,UAAM,WAAW,KAAK,WAAW,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS,IAAI;AAC1E,QAAI,YAAY,GAAG;AACjB,WAAK,WAAW,QAAQ,IAAI;AAAA,IAC9B,OAAO;AACL,WAAK,WAAW,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAoB;AACjC,SAAK,aAAa,KAAK,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,eAAsF;AACjG,UAAM,YAAwE,CAAC;AAE/E,eAAW,YAAY,KAAK,YAAY;AACtC,UAAI,iBAAiB,CAAC,cAAc,SAAS,SAAS,IAAI,EAAG;AAE7D,UAAI,SAAS;AACb,UAAI,YAAY;AAEhB,UAAI,SAAS,MAAM;AACjB,cAAM,WAAWE,OAAK,KAAK,aAAa,SAAS,IAAI;AACrD,YAAIH,aAAW,QAAQ,GAAG;AACxB,cAAI;AACF,kBAAM,OAAOE,UAAS,QAAQ;AAC9B,qBAAS,KAAK,KAAK,KAAK,OAAO,CAAC;AAChC,wBAAY;AAAA,UACd,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,WAAW,SAAS,SAAS;AAC3B,iBAAS,eAAe,SAAS,OAAO;AACxC,oBAAY;AAAA,MACd;AAEA,gBAAU,KAAK;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,QAAQ,KAAK,IAAI,QAAQ,SAAS,SAAS;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,kBAA0B,YAAoB,KAAc;AAC/E,UAAM,gBAAgB,KAAK,KAAK,EAAE;AAClC,UAAM,WAAW,gBAAgB;AACjC,WAAO,WAAW,KAAK,gBAAgB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA8D;AAC5D,UAAM,UAAU,KAAK,KAAK;AAE1B,QAAI,QAAQ,iBAAiB;AAC3B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,cAAc,KAAK,MAAO,QAAQ,cAAc,KAAK,gBAAiB,GAAG,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AACF;AAKO,SAAS,oBACd,aACA,SACe;AACf,SAAO,IAAI,cAAc,aAAa,OAAO;AAC/C;;;AC1UA,SAAS,KAAAE,UAAS;AAMX,IAAM,eAAeA,GAAE,OAAO;AAAA,EACnC,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC5B,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,eAAeA,GACZ,OAAO;AAAA,IACN,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IAC1C,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACzC,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACzC,YAAYA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC5C,CAAC,EACA,SAAS;AAAA,EACZ,YAAYA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA;AAAA,EAChC,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA;AAAA,EAC9C,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,UAAUA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACrC,CAAC;AAiDM,IAAM,0BAA0C;AAAA,EACrD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AACb;AAsGO,IAAM,cAAwC;AAAA;AAAA,EAEnD,OAAO,CAAC,SAAS,aAAa,cAAc;AAAA,EAC5C,KAAK,CAAC,OAAO,WAAW;AAAA,EACxB,SAAS,CAAC,eAAe;AAAA,EACzB,QAAQ,CAAC,QAAQ;AAAA,EACjB,OAAO,CAAC,UAAU;AAAA,EAClB,MAAM,CAAC,kBAAkB;AAAA;AAAA,EAGzB,QAAQ,CAAC,MAAM;AAAA,EACf,MAAM,CAAC,MAAM;AAAA,EACb,OAAO,CAAC,kBAAkB;AAAA,EAC1B,OAAO,CAAC,OAAO;AAAA,EACf,QAAQ,CAAC,QAAQ;AAAA,EACjB,WAAW,CAAC,eAAe;AAAA;AAAA,EAG3B,SAAS,CAAC,SAAS;AAAA,EACnB,SAAS,CAAC,SAAS;AAAA,EACnB,KAAK,CAAC,KAAK;AAAA,EACX,MAAM,CAAC,MAAM;AAAA,EACb,QAAQ,CAAC,cAAc;AAAA,EACvB,SAAS,CAAC,SAAS;AAAA,EACnB,QAAQ,CAAC,QAAQ;AAAA,EACjB,OAAO,CAAC,OAAO;AAAA;AAAA,EAGf,YAAY,CAAC,cAAc,aAAa;AAAA,EACxC,YAAY,CAAC;AAAA;AAAA,EACb,QAAQ,CAAC;AAAA,EACT,MAAM,CAAC;AAAA,EACP,IAAI,CAAC;AAAA;AAAA,EAGL,UAAU,CAAC,aAAa;AAAA,EACxB,qBAAqB,CAAC,mBAAmB;AAAA,EACzC,SAAS,CAAC,gBAAgB;AAAA,EAC1B,eAAe,CAAC;AAAA,EAChB,MAAM,CAAC,QAAQ,WAAW;AAAA;AAAA,EAG1B,OAAO,CAAC,oBAAoB,OAAO;AAAA,EACnC,SAAS,CAAC,SAAS;AAAA,EACnB,MAAM,CAAC,MAAM;AAAA,EACb,OAAO,CAAC,OAAO;AAAA,EACf,QAAQ,CAAC,QAAQ;AAAA;AAAA,EAGjB,MAAM,CAAC,MAAM;AAAA,EACb,QAAQ,CAAC,QAAQ;AAAA,EACjB,YAAY,CAAC,kBAAkB;AAAA,EAC/B,SAAS,CAAC,SAAS;AAAA,EACnB,SAAS,CAAC,wBAAwB;AAAA;AAAA,EAGlC,UAAU,CAAC,MAAM,gBAAgB;AAAA,EACjC,SAAS,CAAC,YAAY,SAAS;AAAA,EAC/B,UAAU,CAAC,uBAAuB;AAAA,EAClC,UAAU,CAAC,UAAU;AAAA,EACrB,QAAQ,CAAC,gBAAgB;AAAA,EACzB,SAAS,CAAC,aAAa;AAAA;AAAA,EAGvB,QAAQ,CAAC,QAAQ;AAAA,EACjB,UAAU,CAAC,UAAU;AAAA,EACrB,OAAO,CAAC,gBAAgB;AAAA,EACxB,WAAW,CAAC,OAAO;AAAA,EACnB,UAAU,CAAC,SAAS,IAAI;AAAA;AAAA,EAGxB,SAAS,CAAC,WAAW,gBAAgB;AAAA,EACrC,MAAM,CAAC,cAAc;AAAA,EACrB,MAAM,CAAC;AAAA;AAAA,EAGP,MAAM,CAAC,aAAa,cAAc,UAAU;AAAA,EAC5C,eAAe,CAAC,aAAa;AAAA;AAAA,EAG7B,QAAQ,CAAC,QAAQ;AAAA,EACjB,QAAQ,CAAC;AAAA,EACT,YAAY,CAAC;AAAA;AAAA,EAGb,IAAI,CAAC,UAAU,qBAAqB,IAAI;AAAA,EACxC,QAAQ,CAAC;AAAA,EACT,UAAU,CAAC;AAAA,EACX,aAAa,CAAC;AAAA,EACd,eAAe,CAAC;AAClB;AAKO,SAAS,YAAY,UAA4B;AACtD,QAAM,OAAiB,CAAC;AACxB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,QAAI,MAAM,SAAS,QAAQ,GAAG;AAC5B,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;;;AC1QO,IAAM,uBAAN,MAA2B;AAAA,EACxB;AAAA,EACA,QAA2B;AAAA,EAEnC,YAAY,SAAmC;AAC7C,SAAK,UAAU,EAAE,GAAG,yBAAyB,GAAG,QAAQ;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAyB;AACjC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAyB,OAAkC;AACpE,UAAM,UAAyB,CAAC;AAChC,UAAM,WAAqB,CAAC;AAC5B,QAAI,aAAa;AAGjB,UAAM,iBAAiB,KAAK,gBAAgB,QAAQ,OAAO,KAAK;AAChE,YAAQ,KAAK,cAAc;AAC3B,kBAAc,eAAe;AAG7B,UAAM,gBAAgB,KAAK,eAAe,QAAQ,OAAO,KAAK;AAC9D,YAAQ,KAAK,aAAa;AAC1B,kBAAc,cAAc;AAG5B,UAAM,eAAe,KAAK,eAAe,QAAQ,OAAO,KAAK;AAC7D,YAAQ,KAAK,YAAY;AACzB,kBAAc,aAAa;AAG3B,UAAM,WAAW,KAAK,UAAU,SAAS,KAAK;AAC9C,YAAQ,KAAK,QAAQ;AACrB,kBAAc,SAAS;AAGvB,UAAM,kBAAkB,KAAK,gBAAgB,KAAK;AAClD,YAAQ,KAAK,eAAe;AAC5B,kBAAc,gBAAgB;AAG9B,UAAM,eAAe,KAAK,aAAa,KAAK;AAC5C,YAAQ,KAAK,YAAY;AACzB,kBAAc,aAAa;AAG3B,UAAM,iBAAiB,KAAK,eAAe,KAAK;AAChD,YAAQ,KAAK,cAAc;AAC3B,kBAAc,eAAe;AAG7B,QAAI,MAAM,eAAe,YAAY;AACnC,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,cAAc,UAAU,GAAG;AAC3E,cAAM,WAAW,KAAK,oBAAoB,QAAQ,OAAO,IAAI;AAC7D,YAAI,YAAY,KAAK,eAAe,UAAU,MAAM,GAAG;AACrD,mBAAS,KAAK,YAAY,IAAI,IAAI,MAAM,eAAe,QAAQ,EAAE;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,gBAAgB,SAAS,MAAM,IAAI,GAAG;AAChD,eAAS,KAAK,mBAAmB;AAAA,IACnC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,UAAU,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAqB,OAAkC;AAC7E,UAAM,UAAoB,CAAC;AAC3B,UAAM,kBAAkB,MAAM,eAAe,cAAc,CAAC;AAC5D,UAAM,YAAY,MAAM,QAAQ,CAAC;AAEjC,eAAW,aAAa,MAAM,YAAY;AACxC,YAAM,WAAW,UAAU,KAAK,YAAY;AAG5C,UAAI,gBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,QAAQ,GAAG;AAC7D,gBAAQ,KAAK,UAAU,IAAI;AAC3B;AAAA,MACF;AAGA,YAAM,cAAc,YAAY,QAAQ;AACxC,iBAAW,OAAO,WAAW;AAC3B,YAAI,YAAY,SAAS,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,MAAM,UAAU;AAC7E,kBAAQ,KAAK,UAAU,IAAI;AAC3B;AAAA,QACF;AAAA,MACF;AAGA,iBAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC1D,YAAI,MAAM,SAAS,QAAQ,KAAK,UAAU,SAAS,OAAO,GAAG;AAC3D,cAAI,CAAC,QAAQ,SAAS,UAAU,IAAI,GAAG;AACrC,oBAAQ,KAAK,UAAU,IAAI;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,MAAM,WAAW,QAAQ,CAAC;AAClE,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,YAAY,KAAK;AAExD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aACE,QAAQ,SAAS,IACb,uBAAuB,QAAQ,KAAK,IAAI,CAAC,KACzC;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAqB,OAAkC;AAC5E,UAAM,UAAoB,CAAC;AAC3B,UAAM,iBAAiB,MAAM,eAAe,aAAa,CAAC;AAC1D,UAAM,YAAY,MAAM,QAAQ,CAAC;AAEjC,eAAW,aAAa,MAAM,WAAW;AACvC,YAAM,WAAW,UAAU,KAAK,YAAY;AAG5C,UAAI,eAAe,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,QAAQ,GAAG;AAC5D,gBAAQ,KAAK,UAAU,IAAI;AAC3B;AAAA,MACF;AAGA,UAAI,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,QAAQ,GAAG;AACvD,gBAAQ,KAAK,UAAU,IAAI;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,MAAM,UAAU,QAAQ,CAAC;AACjE,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,WAAW,KAAK;AAEvD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aACE,QAAQ,SAAS,IAAI,sBAAsB,QAAQ,KAAK,IAAI,CAAC,KAAK;AAAA,MACpE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAqB,OAAkC;AAC5E,UAAM,UAAoB,CAAC;AAC3B,UAAM,iBAAiB,MAAM,eAAe,aAAa,CAAC;AAC1D,UAAM,YAAY,MAAM,QAAQ,CAAC;AAEjC,UAAM,eAAe,CAAC,GAAG,MAAM,WAAW,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS;AAEhG,eAAW,aAAa,cAAc;AACpC,YAAM,UAAU,UAAU,KAAK,YAAY;AAG3C,UAAI,eAAe,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,OAAO,GAAG;AAC3D,gBAAQ,KAAK,UAAU,IAAI;AAC3B;AAAA,MACF;AAGA,YAAM,cAAc,YAAY,OAAO;AACvC,iBAAW,OAAO,WAAW;AAC3B,YAAI,YAAY,SAAS,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,MAAM,SAAS;AAC5E,kBAAQ,KAAK,UAAU,IAAI;AAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,aAAa,QAAQ,CAAC;AAC9D,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,UAAU,KAAK;AAEtD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aACE,QAAQ,SAAS,IAAI,sBAAsB,QAAQ,KAAK,IAAI,CAAC,KAAK;AAAA,MACpE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,SAAyB,OAAkC;AAC3E,UAAM,UAAoB,CAAC;AAC3B,UAAM,YAAY,MAAM,QAAQ,CAAC;AAGjC,UAAM,cAAc,KAAK,mBAAmB,OAAO;AAEnD,eAAW,OAAO,WAAW;AAC3B,UAAI,YAAY,SAAS,IAAI,YAAY,CAAC,GAAG;AAC3C,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,UAAU,QAAQ,CAAC;AAC3D,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,MAAM,KAAK;AAElD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aAAa,QAAQ,SAAS,IAAI,iBAAiB,QAAQ,KAAK,IAAI,CAAC,KAAK;AAAA,MAC1E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAAmC;AAC5D,UAAM,OAAiB,CAAC;AAGxB,QAAI,QAAQ,MAAM;AAChB,WAAK,KAAK,QAAQ,KAAK,YAAY,CAAC;AAAA,IACtC;AAGA,QAAI,QAAQ,UAAU;AACpB,UAAI,QAAQ,SAAS,WAAY,MAAK,KAAK,QAAQ,SAAS,UAAU;AACtE,UAAI,QAAQ,SAAS,gBAAiB,MAAK,KAAK,QAAQ,SAAS,eAAe;AAChF,UAAI,QAAQ,SAAS,SAAU,MAAK,KAAK,QAAQ,SAAS,QAAQ;AAClE,UAAI,QAAQ,SAAS,QAAS,MAAK,KAAK,QAAQ,SAAS,OAAO;AAChE,UAAI,QAAQ,SAAS,QAAS,MAAK,KAAK,QAAQ,SAAS,OAAO;AAAA,IAClE;AAGA,UAAM,gBAAgB;AAAA,MACpB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,MACjB,GAAG,QAAQ,MAAM;AAAA,IACnB;AAEA,eAAW,aAAa,eAAe;AACrC,WAAK,KAAK,UAAU,KAAK,YAAY,CAAC;AAEtC,YAAM,UAAU,YAAY,UAAU,KAAK,YAAY,CAAC;AACxD,WAAK,KAAK,GAAG,OAAO;AAAA,IACtB;AAEA,WAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAkC;AAGxD,UAAM,aAAa,MAAM,cAAc;AACvC,UAAM,aAAa,KAAK,IAAI,aAAa,KAAM,CAAC;AAChD,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,aAAa,UAAU;AAE9D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aACE,aAAa,IAAI,GAAG,UAAU,qBAAqB;AAAA,MACrD;AAAA,MACA,SAAS,aAAa,IAAI,CAAC,WAAW,SAAS,CAAC,IAAI,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAkC;AACrD,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,aAAa,UAAU;AAC7B,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,UAAU,UAAU;AAE3D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aAAa,kBAAkB,MAAM,OAAO;AAAA,MAC5C;AAAA,MACA,SAAS,MAAM,WAAW,CAAC,UAAU,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAkC;AACvD,QAAI,CAAC,MAAM,aAAa;AACtB,aAAO;AAAA,QACL,UAAU;AAAA,QACV,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,KAAK,MAAM,WAAW;AAC7C,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,mBAAmB,IAAI,QAAQ,IAAI,WAAW,QAAQ,MAAM,MAAO,KAAK,KAAK;AAGnF,QAAI,aAAa,KAAK,IAAI,GAAG,IAAI,kBAAkB,GAAG;AACtD,QAAI,mBAAmB,GAAI,cAAa;AAExC,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,YAAY,UAAU;AAE7D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,aACE,mBAAmB,KACf,qBACA,WAAW,KAAK,MAAM,eAAe,CAAC;AAAA,MAC5C;AAAA,MACA,SAAS,CAAC,MAAM,WAAW;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAqB,MAA6B;AAC5E,UAAM,YAAY,KAAK,YAAY;AACnC,UAAM,gBAAgB;AAAA,MACpB,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,IACX;AAEA,UAAM,QAAQ,cAAc,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,SAAS;AAC1E,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAAiB,UAA2B;AACjE,UAAM,eAAe,CAAC,MACpB,EACG,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EACT,IAAI,MAAM;AAEf,UAAM,eAAe,aAAa,OAAO;AACzC,UAAM,gBAAgB,aAAa,QAAQ;AAE3C,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,QAAQ,cAAc,MAAM,GAAG,KAAK;AAC5E,YAAM,IAAI,aAAa,CAAC,KAAK;AAC7B,YAAM,IAAI,cAAc,CAAC,KAAK;AAC9B,UAAI,IAAI,EAAG,QAAO;AAClB,UAAI,IAAI,EAAG,QAAO;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAAyB,UAA4B,CAAC,GAAyB;AACvF,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW;AAAA,MACX;AAAA,MACA,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,IACnB,IAAI;AAEJ,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,QACL,iBAAiB,CAAC;AAAA,QAClB;AAAA,QACA,oBAAoB;AAAA,QACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,MAAM;AAGxB,QAAI,cAAc,WAAW,SAAS,GAAG;AACvC,eAAS,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,MAAM,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,IAC3E;AAGA,UAAM,SAAS,OAAO,IAAI,CAAC,UAAU,KAAK,WAAW,SAAS,KAAK,CAAC;AAGpE,QAAI,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAGvD,QAAI,kBAAkB;AACpB,iBAAW,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,gBAAgB,SAAS,EAAE,MAAM,IAAI,CAAC;AAAA,IACnF;AAGA,eAAW,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,eAAe,SAAS,EAAE,MAAM,IAAI,CAAC;AAGhF,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAGzC,UAAM,kBAAkB,SAAS,MAAM,GAAG,KAAK;AAG/C,QAAI,CAAC,gBAAgB;AACnB,sBAAgB,QAAQ,CAAC,MAAM;AAC7B,UAAE,UAAU,CAAC;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,oBAAoB,OAAO;AAAA,MAC3B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAwC;AAC7C,UAAM,EAAE,OAAO,QAAQ,IAAI,WAAW,MAAM,QAAQ,IAAI;AAExD,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,eAAe,MAAM,KAAK;AAChC,QAAI,CAAC,cAAc;AACjB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,aAAa,aAAa,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AACnF,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAA0B,CAAC;AAEjC,eAAW,SAAS,KAAK,MAAM,QAAQ;AAErC,UAAI,SAAS,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC5C,YAAI,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,QAAQ,KAAM,SAAS,CAAC,CAAC,EAAG;AAAA,MAC3D;AACA,UAAI,SAAS,YAAY,CAAC,MAAM,SAAU;AAG1C,YAAM,EAAE,WAAW,cAAc,QAAQ,IAAI,KAAK;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,YAAY,MAAM,CAAC,SAAS,YAAY,aAAa,QAAQ,WAAW;AAC1E,gBAAQ,KAAK,EAAE,OAAO,WAAW,cAAc,QAAQ,CAAC;AAAA,MAC1D;AAAA,IACF;AAGA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAEhD,WAAO,QAAQ,MAAM,GAAG,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,mBACN,OACA,YACA,UACiE;AACjE,UAAM,eAAyB,CAAC;AAChC,QAAI,YAAY;AAGhB,UAAM,YAAY,MAAM,KAAK,YAAY;AACzC,eAAW,QAAQ,YAAY;AAC7B,UAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,qBAAa;AACb,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,eAAe,IAAI,YAAY;AACxD,eAAW,QAAQ,YAAY;AAC7B,UAAI,UAAU,SAAS,IAAI,KAAK,CAAC,aAAa,SAAS,IAAI,GAAG;AAC5D,qBAAa;AACb,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAC/D,eAAW,QAAQ,YAAY;AAC7B,UAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,aAAa,SAAS,IAAI,GAAG;AAC3E,qBAAa;AACb,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAGA,QAAI,UAAU;AACZ,iBAAW,QAAQ,YAAY;AAC7B,cAAM,cAAc,YAAY,IAAI;AACpC,mBAAW,cAAc,aAAa;AACpC,cACE,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,UAAU,GAC7B;AACA,gBAAI,CAAC,aAAa,SAAS,IAAI,GAAG;AAChC,2BAAa;AACb,2BAAa,KAAK,IAAI;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAGA,cAAM,WAAW,YAAY,IAAI,KAAK,CAAC;AACvC,mBAAW,QAAQ,UAAU;AAC3B,cAAI,MAAM,eAAe,WAAW,SAAS,IAAI,GAAG;AAClD,gBAAI,CAAC,aAAa,SAAS,IAAI,GAAG;AAChC,2BAAa;AACb,2BAAa,KAAK,IAAI;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,MAAM,eAAe,aAAa,SAAS,GAAG;AAChD,gBAAU,MAAM,YAAY,MAAM,GAAG,GAAG;AACxC,UAAI,MAAM,YAAY,SAAS,IAAK,YAAW;AAAA,IACjD;AAGA,gBAAY,KAAK,IAAI,KAAK,SAAS;AAEnC,WAAO,EAAE,WAAW,cAAc,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eACE,SACA,iBACmB;AACnB,UAAM,UAA6B,CAAC;AAEpC,eAAW,SAAS,iBAAiB;AACnC,UAAI,CAAC,MAAM,eAAe,YAAY;AACpC,gBAAQ,KAAK;AAAA,UACX,OAAO,MAAM;AAAA,UACb,QAAQ;AAAA,UACR,SAAS,EAAE,SAAS,oCAAoC;AAAA,QAC1D,CAAC;AACD;AAAA,MACF;AAEA,UAAI,SAAiC;AACrC,YAAM,WAAqB,CAAC;AAE5B,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,cAAc,UAAU,GAAG;AAC3E,cAAM,WAAW,KAAK,oBAAoB,QAAQ,OAAO,IAAI;AAC7D,YAAI,UAAU;AACZ,gBAAM,aAAa,SAAS,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;AACrD,gBAAM,eAAe,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;AAIzD,cAAI,eAAe,cAAc,GAAG;AAClC,qBAAS;AACT,qBAAS,KAAK,iBAAiB,IAAI,IAAI,MAAM,cAAc,QAAQ,EAAE;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX,OAAO,MAAM;AAAA,QACb;AAAA,QACA,SACE,SAAS,SAAS,IAAI,EAAE,SAAS,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,aAAa;AAAA,MACrF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,2BACd,SACsB;AACtB,SAAO,IAAI,qBAAqB,OAAO;AACzC;;;AC1pBA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,cAAY,UAAAC,SAAQ,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AAC3E,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,WAAAC,gBAAe;AAChC,SAAS,cAAAC,mBAAkB;AAOpB,IAAM,oBAAoB;AAAA,EAC/B,EAAE,OAAO,cAAc,MAAM,WAAW,aAAa,wCAAwC;AAAA,EAC7F,EAAE,OAAO,eAAe,MAAM,0CAA0C,aAAa,uBAAuB;AAAA,EAC5G,EAAE,OAAO,cAAc,MAAM,8BAA8B,aAAa,6BAA6B;AACvG;AAKO,IAAM,aAAaC,OAAKC,SAAQ,GAAG,aAAa,YAAY;AAC5D,IAAM,oBAAoB;AAKjC,eAAsB,oBACpB,OACA,MACqD;AACrD,QAAM,WAAW,sBAAsB,KAAK,IAAI,IAAI;AACpD,QAAM,UAAUD,OAAKE,QAAO,GAAG,kBAAkBC,YAAW,CAAC,EAAE;AAE/D,MAAI;AAEF,IAAAC,UAAS,uBAAuB,QAAQ,IAAI,OAAO,IAAI;AAAA,MACrD,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,IACX,CAAC;AAGD,UAAM,mBAAmB,eAAe,OAAO;AAC/C,UAAM,SAAyB,CAAC;AAEhC,eAAW,SAAS,kBAAkB;AACpC,YAAM,cAAcJ,OAAK,MAAM,MAAM,UAAU;AAC/C,UAAI,CAACK,aAAW,WAAW,EAAG;AAE9B,UAAI;AACF,cAAM,UAAUC,cAAa,aAAa,OAAO;AACjD,cAAM,cAAc,mBAAmB,OAAO;AAE9C,cAAM,UAAwB;AAAA,UAC5B,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM,eAAe,aAAa,eAAyB;AAAA,UACxE,QAAQ,GAAG,KAAK,IAAI,IAAI;AAAA,UACxB,MAAO,aAAa,QAAqB,CAAC;AAAA,UAC1C,eAAe;AAAA,YACb,YAAa,aAAa,eAA2C,cAA0B,CAAC;AAAA,YAChG,WAAY,aAAa,eAA2C,aAAyB,CAAC;AAAA,YAC9F,WAAY,aAAa,eAA2C,aAAyB,CAAC;AAAA,UAChG;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,UAAU,UAAU,gBAAgB,UAAU;AAAA,QAChD;AAEA,eAAO,KAAK,OAAO;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,EAAE,OAAO;AAAA,EAClB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,mBAAmB,KAAK,IAAI,IAAI,KAAK,OAAO,GAAG;AAAA,EAC7E,UAAE;AAEA,QAAID,aAAW,OAAO,GAAG;AACvB,UAAI;AACF,QAAAE,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAClD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,gBACpB,QAAkC,mBAClC,YACkD;AAClD,QAAM,YAA4B,CAAC;AACnC,QAAM,UAAyB,CAAC;AAChC,QAAM,SAAmB,CAAC;AAE1B,aAAW,EAAE,OAAO,KAAK,KAAK,OAAO;AACnC,iBAAa,YAAY,KAAK,IAAI,IAAI,KAAK;AAE3C,UAAM,SAAS,MAAM,oBAAoB,OAAO,IAAI;AAEpD,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAEA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAU,KAAK,GAAG,OAAO,MAAM;AAC/B,cAAQ,KAAK;AAAA,QACX,MAAM,GAAG,KAAK,IAAI,IAAI;AAAA,QACtB,KAAK,sBAAsB,KAAK,IAAI,IAAI;AAAA,QACxC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,YAAY,OAAO,OAAO;AAAA,MAC5B,CAAC;AACD,mBAAa,WAAW,OAAO,OAAO,MAAM,SAAS;AAAA,IACvD,WAAW,CAAC,OAAO,OAAO;AACxB,mBAAa,mBAAmB;AAAA,IAClC;AAAA,EACF;AAGA,MAAI,UAAU,WAAW,GAAG;AAC1B,iBAAa,0CAA0C;AACvD,cAAU,KAAK,GAAG,gBAAgB,CAAC;AACnC,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,KAAK;AAAA,MACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,YAAY,UAAU;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,QAAM,QAAoB;AAAA,IACxB,SAAS;AAAA,IACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,OAAO;AACzB;AAKO,SAAS,UAAU,OAAyB;AACjD,QAAM,WAAWP,OAAKC,SAAQ,GAAG,WAAW;AAC5C,MAAI,CAACI,aAAW,QAAQ,GAAG;AACzB,IAAAG,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AACA,EAAAC,eAAc,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1D;AAKO,SAAS,YAA+B;AAC7C,MAAI,CAACJ,aAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,aAAa,OAA4B;AACvD,QAAM,cAAc,IAAI,KAAK,MAAM,WAAW;AAC9C,QAAM,oBAAoB,KAAK,IAAI,IAAI,YAAY,QAAQ,MAAM,MAAO,KAAK;AAC7E,SAAO,mBAAmB;AAC5B;AAKO,SAAS,iBAAgD;AAC9D,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,aAAa,KAAK,IAAI,UAAU;AACzC;AAKA,SAAS,kBAAkC;AACzC,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC,SAAS,YAAY,cAAc,UAAU,aAAa;AAAA,MACjE,eAAe;AAAA,QACb,YAAY,CAAC,SAAS,QAAQ;AAAA,QAC9B,WAAW,CAAC,cAAc,YAAY;AAAA,QACtC,WAAW,CAAC;AAAA,MACd;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC,YAAY,OAAO,WAAW,YAAY,YAAY;AAAA,MAC7D,eAAe;AAAA,QACb,YAAY,CAAC;AAAA,QACb,WAAW,CAAC,cAAc,YAAY;AAAA,QACtC,WAAW,CAAC,aAAa;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC,cAAc,SAAS,UAAU,UAAU;AAAA,MAClD,eAAe;AAAA,QACb,YAAY,CAAC;AAAA,QACb,WAAW,CAAC,YAAY;AAAA,QACxB,WAAW,CAAC;AAAA,MACd;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC,YAAY,OAAO,QAAQ,WAAW,OAAO;AAAA,MACpD,eAAe;AAAA,QACb,YAAY,CAAC;AAAA,QACb,WAAW,CAAC,cAAc,cAAc,QAAQ;AAAA,QAChD,WAAW,CAAC;AAAA,MACd;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC,UAAU,QAAQ,WAAW,cAAc,WAAW,KAAK;AAAA,MAClE,eAAe;AAAA,QACb,YAAY,CAAC;AAAA,QACb,WAAW,CAAC,cAAc,YAAY;AAAA,QACtC,WAAW,CAAC,UAAU,MAAM;AAAA,MAC9B;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACZ;AAAA,EACF;AACF;;;AC7JO,IAAM,eAAe;;;AC9G5B,SAAS,cAAAI,cAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,kBAAkB;AAC/E,SAAS,QAAAC,cAAY;AACrB,SAAS,OAAO,iBAAiB;AAa1B,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,QAA6B;AAAA,EAErC,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,cAAcC,OAAK,aAAa,aAAa,YAAY;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAA4B;AAC1B,QAAI,CAACC,aAAW,KAAK,WAAW,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAUC,cAAa,KAAK,aAAa,OAAO;AACtD,WAAK,QAAQ,MAAM,OAAO;AAC1B,aAAO,KAAK;AAAA,IACd,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,CAAC,KAAK,OAAO;AACf;AAAA,IACF;AAEA,UAAM,MAAMF,OAAK,KAAK,aAAa,WAAW;AAC9C,QAAI,CAACC,aAAW,GAAG,GAAG;AACpB,MAAAE,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAEA,SAAK,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AACjD,IAAAC,eAAc,KAAK,aAAa,UAAU,KAAK,KAAK,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAqB;AACnB,SAAK,QAAQ;AAAA,MACX,SAAS;AAAA,MACT,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,aAAa,KAAK;AAAA,MAClB,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,IACd;AACA,SAAK,KAAK;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAA2B;AACzB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,KAAK,KAAK;AAAA,IACzB;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAA4B;AAC1B,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAAmB,aAAqB,OAAwD;AAC7G,UAAM,QAAQ,KAAK,YAAY;AAE/B,UAAM,YAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY,MAAM;AAAA,MAClB,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,QACvB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,EAAE;AAAA,IACJ;AAEA,UAAM,mBAAmB;AACzB,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WACE,QACA,SACM;AACN,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO,kBAAkB;AAC5B;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,iBAAiB,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACrE,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,WAAO,OAAO,MAAM,OAAO;AAE3B,QAAI,QAAQ,WAAW,iBAAiB,CAAC,KAAK,WAAW;AACvD,WAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC1C;AAEA,QAAI,QAAQ,WAAW,eAAe,QAAQ,WAAW,UAAU;AACjE,WAAK,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC5C;AAGA,UAAM,iBAAiB,MAAM,iBAAiB,MAAM;AAAA,MAClD,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW;AAAA,IAClD,EAAE;AACF,UAAM,iBAAiB,cAAc;AAErC,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAwC;AACtC,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO,kBAAkB;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,iBAAiB,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS;AAChF,QAAI,UAAU;AACZ,eAAS,SAAS;AAClB,eAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,WAAK,KAAK;AAAA,IACZ;AAEA,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAiB;AACf,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO,oBAAoB,MAAM,iBAAiB,WAAW,WAAW;AAC3E,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,SAAS;AAChC,UAAM,iBAAiB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAGzD,eAAW,QAAQ,MAAM,iBAAiB,OAAO;AAC/C,UAAI,KAAK,WAAW,eAAe;AACjC,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkB;AAChB,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO,oBAAoB,MAAM,iBAAiB,WAAW,UAAU;AAC1E,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,SAAS;AAChC,WAAO,MAAM,iBAAiB;AAG9B,eAAW,QAAQ,MAAM,iBAAiB,OAAO;AAC/C,UAAI,KAAK,WAAW,UAAU;AAC5B,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAA8C,OAAsB;AACpF,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO,kBAAkB;AAC5B;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AACxB,UAAM,YAAY,IAAI,KAAK,UAAU,SAAS,EAAE,QAAQ;AACxD,UAAM,UAAU,KAAK,IAAI;AAEzB,UAAM,eAAiC;AAAA,MACrC,WAAW,UAAU;AAAA,MACrB,aAAa,UAAU;AAAA,MACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,YAAY,UAAU;AAAA,MACtB;AAAA,MACA,SAAS,UAAU,MAChB,IAAI,CAAC,MAAM,EAAE,SAAS,EACtB,OAAO,CAAC,QAAuB,CAAC,CAAC,GAAG;AAAA,MACvC,eAAe,MAAM;AAAA,QACnB,IAAI,IAAI,UAAU,MAAM,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAAA,MAC/D;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,YAAY;AAClC,WAAO,MAAM;AAGb,QAAI,MAAM,QAAQ,SAAS,IAAI;AAC7B,YAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,EAAE;AAAA,IAC3C;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAa,OAAe,WAA0B;AACnE,UAAM,QAAQ,KAAK,YAAY;AAG/B,UAAM,WAAW,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC1D,QAAI,UAAU;AACZ,eAAS,QAAQ;AACjB,eAAS,UAAS,oBAAI,KAAK,GAAE,YAAY;AACzC,eAAS,YAAY;AAAA,IACvB,OAAO;AACL,YAAM,UAAU,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAiC;AAC3C,UAAM,QAAQ,KAAK,IAAI;AACvB,WAAO,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,GAAG;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAoC;AAC7C,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,CAAC,OAAO;AACV,aAAO,CAAC;AAAA,IACV;AACA,WAAO,QAAQ,MAAM,QAAQ,MAAM,GAAG,KAAK,IAAI,MAAM;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA8B;AAC5B,UAAM,QAAQ,KAAK,IAAI;AACvB,WAAO,CAAC,CAAC,OAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,UAAM,QAAQ,KAAK,IAAI;AACvB,WAAO,OAAO,kBAAkB,WAAW;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAIH,aAAW,KAAK,WAAW,GAAG;AAChC,iBAAW,KAAK,WAAW;AAAA,IAC7B;AACA,SAAK,QAAQ;AAAA,EACf;AACF;AAKO,SAAS,qBAAqB,aAAqC;AACxE,SAAO,IAAI,eAAe,WAAW;AACvC;;;AC9OO,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;;;ACzGlC,SAAS,cAAAI,cAAY,gBAAAC,eAAc,eAAAC,cAAa,iBAAAC,gBAAe,aAAAC,kBAAiB;AAChF,SAAS,QAAAC,cAAY;AACrB,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAO1B,SAAS,cAAc,SAA2B;AACvD,QAAM,OAAOC,OAAM,OAAO;AAE1B,MAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,UAAU;AAC/C,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,MAAI,CAAC,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC7C,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,QAAwB,KAAK,MAAM,IAAI,CAAC,MAAe,UAAkB;AAC7E,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,IAAI,MAAM,QAAQ,KAAK,oBAAoB;AAAA,IACnD;AAEA,UAAM,UAAU;AAChB,UAAM,SAAS,QAAQ;AAEvB,QAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,GAAG;AACrC,YAAM,IAAI,MAAM,QAAQ,KAAK,yBAAyB;AAAA,IACxD;AAEA,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,aAAa;AAAA,MAC/B,QAAQ,OAAO,IAAI,CAAC,MAAe;AACjC,YAAI,OAAO,MAAM,UAAU;AACzB,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,MAAM,YAAY,MAAM,MAAM;AACvC,gBAAM,WAAW;AACjB,iBAAO;AAAA,YACL,OAAO,SAAS;AAAA,YAChB,QAAQ,SAAS;AAAA,YACjB,WAAW,SAAS;AAAA,UACtB;AAAA,QACF;AACA,cAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,MAClD,CAAC;AAAA,MACD,iBAAiB,QAAQ,oBAAoB;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX;AAAA,IACA,KAAK,KAAK;AAAA,IACV,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,EAClB;AACF;AAKO,SAAS,aAAa,UAA4B;AACvD,MAAI,CAACC,aAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,EACxD;AAEA,QAAM,UAAUC,cAAa,UAAU,OAAO;AAC9C,SAAO,cAAc,OAAO;AAC9B;AAKO,SAAS,mBAAmB,aAAqB,MAA+B;AACrF,QAAM,eAAeC,OAAK,aAAa,aAAa,aAAa;AAEjE,MAAI,CAACF,aAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,EACT;AAGA,QAAM,YAAYE,OAAK,cAAc,GAAG,IAAI,GAAG,kBAAkB,EAAE;AACnE,MAAIF,aAAW,SAAS,GAAG;AACzB,WAAO,aAAa,SAAS;AAAA,EAC/B;AAGA,QAAM,QAAQG,aAAY,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,kBAAkB,CAAC;AAEpF,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,WAAW,aAAaD,OAAK,cAAc,IAAI,CAAC;AACtD,UAAI,SAAS,SAAS,MAAM;AAC1B,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,cAAc,aAAiC;AAC7D,QAAM,eAAeA,OAAK,aAAa,aAAa,aAAa;AAEjE,MAAI,CAACF,aAAW,YAAY,GAAG;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQG,aAAY,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,kBAAkB,CAAC;AACpF,QAAM,YAAwB,CAAC;AAE/B,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,WAAW,aAAaD,OAAK,cAAc,IAAI,CAAC;AACtD,gBAAU,KAAK,QAAQ;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,aAAa,aAAqB,UAA4B;AAC5E,QAAM,eAAeA,OAAK,aAAa,aAAa,aAAa;AAEjE,MAAI,CAACF,aAAW,YAAY,GAAG;AAC7B,IAAAI,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAEA,QAAM,WAAW,GAAG,SAAS,KAAK,QAAQ,gBAAgB,GAAG,EAAE,YAAY,CAAC,GAAG,kBAAkB;AACjG,QAAM,WAAWF,OAAK,cAAc,QAAQ;AAE5C,EAAAG,eAAc,UAAUC,WAAU,QAAQ,CAAC;AAE3C,SAAO;AACT;AAKO,SAAS,kBAAkB,UAA4B;AAC5D,SAAOA,WAAU,QAAQ;AAC3B;AAKO,SAAS,iBAAiB,UAA0D;AACzF,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,SAAS,MAAM;AAClB,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAEA,MAAI,CAAC,SAAS,SAAS,SAAS,MAAM,WAAW,GAAG;AAClD,WAAO,KAAK,sCAAsC;AAAA,EACpD;AAEA,WAAS,IAAI,GAAG,IAAI,SAAS,MAAM,QAAQ,KAAK;AAC9C,UAAM,OAAO,SAAS,MAAM,CAAC;AAE7B,QAAI,CAAC,KAAK,UAAU,KAAK,OAAO,WAAW,GAAG;AAC5C,aAAO,KAAK,QAAQ,IAAI,CAAC,+BAA+B;AAAA,IAC1D;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC3C,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,YAAM,YAAY,OAAO,UAAU,WAAW,QAAQ,MAAM;AAE5D,UAAI,CAAC,WAAW;AACd,eAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,mBAAmB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,MAAc,aAAgC;AACnF,SAAO;AAAA,IACL;AAAA,IACA,aAAa,eAAe,aAAa,IAAI;AAAA,IAC7C,SAAS;AAAA,IACT,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,CAAC;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC3NA,SAAS,cAAAC,mBAAkB;AAkCpB,IAAM,uBAAN,MAA2B;AAAA,EACxB,YAAsC;AAAA,EACtC;AAAA,EACA;AAAA,EAER,YAAY,UAAyB,YAAuC;AAC1E,SAAK,WAAW;AAChB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,UAAgD;AAE5D,SAAK,YAAY;AAAA,MACf;AAAA,MACA,aAAaA,YAAW;AAAA,MACxB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO,SAAS,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QAC1C,WAAW;AAAA,QACX,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO;AAAA,UAC9B,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AAAA,UACrC,QAAQ;AAAA,QACV,EAAE;AAAA,MACJ,EAAE;AAAA,MACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,QAAI;AAEF,eAAS,IAAI,GAAG,IAAI,SAAS,MAAM,QAAQ,KAAK;AAC9C,YAAI,KAAK,UAAU,WAAW,eAAe,KAAK,UAAU,WAAW,UAAU;AAC/E;AAAA,QACF;AAEA,aAAK,UAAU,cAAc;AAC7B,cAAM,KAAK,YAAY,SAAS,MAAM,CAAC,GAAG,CAAC;AAG3C,cAAM,aAAa,KAAK,UAAU,MAAM,CAAC;AACzC,YAAI,WAAW,WAAW,YAAY,CAAC,SAAS,MAAM,CAAC,EAAE,iBAAiB;AACxE,eAAK,UAAU,SAAS;AACxB,eAAK,UAAU,QAAQ,QAAQ,IAAI,CAAC;AACpC;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,UAAU,WAAW,WAAW;AACvC,aAAK,UAAU,SAAS;AAAA,MAC1B;AAEA,WAAK,UAAU,eAAc,oBAAI,KAAK,GAAE,YAAY;AAEpD,WAAK,aAAa;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,KAAK,UAAU;AAAA,QACvB,OAAO,KAAK,UAAU;AAAA,MACxB,CAAC;AAED,aAAO,KAAK;AAAA,IACd,SAAS,OAAO;AACd,WAAK,UAAU,SAAS;AACxB,WAAK,UAAU,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC5E,WAAK,UAAU,eAAc,oBAAI,KAAK,GAAE,YAAY;AACpD,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,MAAoB,WAAkC;AAC9E,UAAM,aAAa,KAAK,UAAW,MAAM,SAAS;AAClD,eAAW,SAAS;AACpB,eAAW,aAAY,oBAAI,KAAK,GAAE,YAAY;AAE9C,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,KAAK;AAAA,IACjB,CAAC;AAED,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO;AAAA,MACrC,MAAM,OAAO,MAAM,WAAW,IAAI,EAAE;AAAA,MACpC,QAAQ,OAAO,MAAM,WAAW,SAAa,EAAoB;AAAA,IACnE,EAAE;AAEF,QAAI,KAAK,UAAU;AAEjB,YAAM,QAAQ;AAAA,QACZ,OAAO;AAAA,UAAI,CAAC,OAAO,eACjB,KAAK,aAAa,MAAM,MAAM,MAAM,QAAQ,WAAW,UAAU;AAAA,QACnE;AAAA,MACF;AAAA,IACF,OAAO;AAEL,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAI,KAAK,UAAW,WAAW,eAAe,KAAK,UAAW,WAAW,UAAU;AACjF;AAAA,QACF;AAEA,cAAM,KAAK,aAAa,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,WAAW,CAAC;AAGtE,cAAM,cAAc,WAAW,OAAO,CAAC;AACvC,YAAI,YAAY,WAAW,YAAY,CAAC,KAAK,iBAAiB;AAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ;AACvE,UAAM,eAAe,WAAW,OAAO;AAAA,MACrC,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW;AAAA,IAClD;AAEA,QAAI,cAAc;AAChB,iBAAW,SAAS,cAAc,WAAW;AAAA,IAC/C;AAEA,eAAW,eAAc,oBAAI,KAAK,GAAE,YAAY;AAEhD,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,KAAK;AAAA,MACf,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aACZ,WACA,QACA,WACA,YACe;AACf,UAAM,cAAc,KAAK,UAAW,MAAM,SAAS,EAAE,OAAO,UAAU;AACtE,gBAAY,SAAS;AACrB,gBAAY,aAAY,oBAAI,KAAK,GAAE,YAAY;AAE/C,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,SAAS,WAAW,MAAM;AAEpD,UAAI,OAAO,SAAS;AAClB,oBAAY,SAAS;AAAA,MACvB,OAAO;AACL,oBAAY,SAAS;AACrB,oBAAY,QAAQ,OAAO;AAAA,MAC7B;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,SAAS;AACrB,kBAAY,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC3E;AAEA,gBAAY,eAAc,oBAAI,KAAK,GAAE,YAAY;AAEjD,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,YAAY;AAAA,MACpB,OAAO,YAAY;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAiB;AACf,QAAI,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,WAAW;AAC1D,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,SAAS;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAA0B;AAChC,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA4C;AAChD,QAAI,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,UAAU;AACzD,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,SAAS;AAGxB,UAAM,WAAW,KAAK,UAAU;AAChC,aAAS,IAAI,KAAK,UAAU,aAAa,IAAI,SAAS,MAAM,QAAQ,KAAK;AACvE,UAAI,CAAC,KAAK,eAAe,GAAG;AAC1B;AAAA,MACF;AAEA,WAAK,UAAU,cAAc;AAG7B,UAAI,KAAK,UAAU,MAAM,CAAC,EAAE,WAAW,aAAa;AAClD;AAAA,MACF;AAEA,YAAM,KAAK,YAAY,SAAS,MAAM,CAAC,GAAG,CAAC;AAE3C,YAAM,aAAa,KAAK,UAAU,MAAM,CAAC;AACzC,UAAI,WAAW,WAAW,YAAY,CAAC,SAAS,MAAM,CAAC,EAAE,iBAAiB;AACxE,aAAK,UAAU,SAAS;AACxB,aAAK,UAAU,QAAQ,QAAQ,IAAI,CAAC;AACpC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,WAAW,WAAW;AACvC,WAAK,UAAU,SAAS;AAAA,IAC1B;AAEA,SAAK,UAAU,eAAc,oBAAI,KAAK,GAAE,YAAY;AACpD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkB;AAChB,QAAI,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,eAAe,KAAK,UAAU,WAAW,UAAU;AAClG,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,SAAS;AACxB,SAAK,UAAU,eAAc,oBAAI,KAAK,GAAE,YAAY;AACpD,WAAO;AAAA,EACT;AACF;AAKO,SAAS,2BACd,UACA,YACsB;AACtB,SAAO,IAAI,qBAAqB,UAAU,UAAU;AACtD;;;ACjTA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,mBAAkB;AAoCpB,IAAM,uBAAN,MAA2B;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,aACA,SAIA;AACA,SAAK,cAAc;AACnB,SAAK,iBAAiB,IAAI,eAAe,WAAW;AACpD,SAAK,oBAAoB,SAAS;AAClC,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,OACA,UAA4B,CAAC,GACE;AAC/B,UAAM,YAAY,oBAAI,KAAK;AAC3B,UAAM,QAAQ,MAAM,SAAS,CAAC;AAG9B,QAAI,QAAQ,QAAQ;AAClB,aAAO,KAAK,mBAAmB,KAAK;AAAA,IACtC;AAGA,UAAM,gBAAgB,KAAK,eAAe,IAAI;AAC9C,QAAI,eAAe,kBAAkB,cAAc,MAAM,MAAM;AAC7D,UAAI,cAAc,iBAAiB,WAAW,UAAU;AAEtD,eAAO,KAAK,gBAAgB,OAAO,OAAO;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM,eAA8C,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,MAC9E,IAAI,KAAK,MAAM,QAAQ,KAAK;AAAA,MAC5B,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,SAAS,SAAS,SAAS,KAAK;AAAA,IAC7C,EAAE;AAEF,SAAK,eAAe,eAAe,MAAM,MAAM,MAAM,QAAQ,YAAY;AAEzE,UAAM,cAAqC,CAAC;AAC5C,QAAI,gBAAiE;AACrE,QAAI;AAGJ,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAEpB,WAAK,aAAa;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,YAAY,MAAM;AAAA,MACpB,CAAC;AAGD,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,mBAAmB,MAAM,KAAK,iBAAiB,MAAM;AAAA,UACzD,WAAW,MAAM;AAAA,UACjB,WAAW;AAAA,UACX,YAAY,MAAM;AAAA,QACpB,CAAC;AAED,YAAI,CAAC,iBAAiB,UAAU;AAC9B,0BAAgB;AAChB,eAAK,eAAe,MAAM;AAC1B;AAAA,QACF;AAGA,YAAI,KAAK,SAAS,yBAAyB,iBAAiB,gBAAgB;AAC1E,eAAK,eAAe;AAAA,YAClB,GAAG,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,YACxB,iBAAiB;AAAA,YACjB,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,YAAM,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,OAAO;AAC9D,kBAAY,KAAK,UAAU;AAE3B,WAAK,eAAe,WAAW,KAAK,MAAM,QAAQ,CAAC,IAAI;AAAA,QACrD,QAAQ,WAAW,WAAW,cAAc,cAAc;AAAA,QAC1D,QAAQ,WAAW;AAAA,QACnB,OAAO,WAAW;AAAA,QAClB,eAAe,WAAW;AAAA,QAC1B,WAAW,WAAW;AAAA,MACxB,CAAC;AAED,WAAK,aAAa;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,YAAY,MAAM;AAAA,QAClB,QAAQ,WAAW;AAAA,QACnB,OAAO,WAAW;AAAA,MACpB,CAAC;AAGD,UAAI,WAAW,WAAW,UAAU;AAClC,YAAI,CAAC,QAAQ,iBAAiB;AAC5B,0BAAgB;AAChB,yBAAe,WAAW;AAC1B;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ,UAAU,KAAK,QAAQ;AACjC,cAAM,qBAAqB,MAAM,KAAK,gBAAgB,MAAM,UAAU;AACtE,YAAI,CAAC,sBAAsB,CAAC,QAAQ,iBAAiB;AACnD,0BAAgB;AAChB,yBAAe;AACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,oBAAI,KAAK;AAGzB,QAAI,kBAAkB,UAAU;AAC9B,WAAK,eAAe,kBAAkB,eAAe,YAAY;AAAA,IACnE;AAEA,UAAM,SAA+B;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW,UAAU,YAAY;AAAA,MACjC,aAAa,QAAQ,YAAY;AAAA,MACjC,YAAY,QAAQ,QAAQ,IAAI,UAAU,QAAQ;AAAA,MAClD,OAAO;AAAA,MACP,eAAe,MAAM,KAAK,IAAI,IAAI,YAAY,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAAA,MACpF,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,QAAuB,CAAC,CAAC,GAAG;AAAA,MACjF,OAAO;AAAA,IACT;AAEA,UAAM,iBAAkF;AAAA,MACtF,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,gBAAgB;AAAA,MACxB,WAAW;AAAA,IACb;AAEA,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,eAAe,aAAa;AAAA,IACvC,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,OACA,SAC+B;AAC/B,UAAM,QAAQ,KAAK,eAAe,IAAI;AACtC,QAAI,CAAC,OAAO,kBAAkB;AAC5B,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,SAAK,eAAe,OAAO;AAC3B,UAAM,YAAY,MAAM;AACxB,UAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,UAAM,cAAqC,CAAC;AAC5C,QAAI,gBAAiE;AACrE,QAAI;AAGJ,UAAM,aAAa,UAAU;AAE7B,aAAS,IAAI,YAAY,IAAI,MAAM,QAAQ,KAAK;AAC9C,YAAM,OAAO,MAAM,CAAC;AAEpB,WAAK,aAAa;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,YAAY,MAAM;AAAA,MACpB,CAAC;AAGD,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,mBAAmB,MAAM,KAAK,iBAAiB,MAAM;AAAA,UACzD,WAAW,MAAM;AAAA,UACjB,WAAW;AAAA,UACX,YAAY,MAAM;AAAA,QACpB,CAAC;AAED,YAAI,CAAC,iBAAiB,UAAU;AAC9B,0BAAgB;AAChB,eAAK,eAAe,MAAM;AAC1B;AAAA,QACF;AAGA,YAAI,KAAK,SAAS,yBAAyB,iBAAiB,gBAAgB;AAC1E,eAAK,eAAe;AAAA,YAClB,GAAG,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,YACxB,iBAAiB;AAAA,YACjB,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,KAAK,YAAY,MAAM,OAAO,OAAO;AAC9D,kBAAY,KAAK,UAAU;AAE3B,WAAK,eAAe,WAAW,KAAK,MAAM,QAAQ,CAAC,IAAI;AAAA,QACrD,QAAQ,WAAW,WAAW,cAAc,cAAc;AAAA,QAC1D,QAAQ,WAAW;AAAA,QACnB,OAAO,WAAW;AAAA,QAClB,eAAe,WAAW;AAAA,QAC1B,WAAW,WAAW;AAAA,MACxB,CAAC;AAGD,WAAK,aAAa;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,YAAY,MAAM;AAAA,QAClB,QAAQ,WAAW;AAAA,QACnB,OAAO,WAAW;AAAA,MACpB,CAAC;AAGD,UAAI,WAAW,WAAW,UAAU;AAClC,YAAI,CAAC,QAAQ,iBAAiB;AAC5B,0BAAgB;AAChB,yBAAe,WAAW;AAC1B;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ,UAAU,KAAK,QAAQ;AACjC,cAAM,qBAAqB,MAAM,KAAK,gBAAgB,MAAM,UAAU;AACtE,YAAI,CAAC,sBAAsB,CAAC,QAAQ,iBAAiB;AACnD,0BAAgB;AAChB,yBAAe;AACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,kBAAkB,UAAU;AAC9B,WAAK,eAAe,kBAAkB,eAAe,YAAY;AAAA,IACnE;AAEA,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,MACR,WAAW,UAAU;AAAA,MACrB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,YAAY,KAAK,IAAI,IAAI,IAAI,KAAK,UAAU,SAAS,EAAE,QAAQ;AAAA,MAC/D,OAAO;AAAA,MACP,eAAe,MAAM,KAAK,IAAI,IAAI,YAAY,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAAA,MACpF,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,QAAuB,CAAC,CAAC,GAAG;AAAA,MACjF,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YACZ,MACA,QACA,UAC8B;AAC9B,UAAM,YAAY,oBAAI,KAAK;AAC3B,UAAM,SAAS,KAAK,MAAMC,YAAW;AAErC,QAAI;AAMF,YAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,GAAG,CAAC;AAEvD,YAAM,UAAU,oBAAI,KAAK;AAEzB,aAAO;AAAA,QACL;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,WAAW,UAAU,YAAY;AAAA,QACjC,aAAa,QAAQ,YAAY;AAAA,QACjC,YAAY,QAAQ,QAAQ,IAAI,UAAU,QAAQ;AAAA,QAClD,QAAQ,SAAS,KAAK,IAAI;AAAA,QAC1B,eAAe,KAAK;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,oBAAI,KAAK;AAEzB,aAAO;AAAA,QACL;AAAA,QACA,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,WAAW,UAAU,YAAY;AAAA,QACjC,aAAa,QAAQ,YAAY;AAAA,QACjC,YAAY,QAAQ,QAAQ,IAAI,UAAU,QAAQ;AAAA,QAClD,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,MACA,SAC6B;AAC7B,SAAK,aAAa;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,SAAS,eAAe,KAAK,IAAI;AAAA,IACnC,CAAC;AAED,QAAI,KAAK,mBAAmB;AAC1B,aAAO,KAAK,kBAAkB,MAAM,OAAO;AAAA,IAC7C;AAGA,QAAI,KAAK,SAAS,uBAAuB;AAEvC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,gBAAgB,KAAK,UAAU,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB,SAA0B;AAGrD,UAAM,0BAA0B;AAChC,QAAI,wBAAwB,KAAK,OAAO,GAAG;AACzC,aAAO;AAAA,IACT;AAGA,UAAM,yBAAyB;AAC/B,QAAI,uBAAuB,KAAK,OAAO,GAAG;AACxC,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,QAAQ,MAAM,cAAc,KAAK,CAAC,GAAG;AAC9D,QAAI,kBAAkB,IAAI;AACxB,aAAO;AAAA,IACT;AAGA,UAAM,gBAAgB;AACtB,QAAI,cAAc,KAAK,OAAO,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,cAAc,SAAiB,OAAe,aAAa,KAAe;AAEhF,QAAI,QAAQ,SAAS,OAAO,MAAM,SAAS,KAAO;AAChD,cAAQ,KAAK,+CAA+C;AAC5D,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,qBAAqB,OAAO,GAAG;AACtC,cAAQ,KAAK,iDAAiD,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK;AACvF,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,QAAQ,IAAI,OAAO,OAAO;AAChC,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBACZ,MACA,QACkB;AAClB,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB;AAAA,MAC1B,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,IACV;AAGA,QAAI,KAAK,OAAO,WAAW;AACzB,iBAAW,QAAQ,KAAK,OAAO,WAAW;AACxC,YAAI,KAAK,SAAS;AAChB,cAAI;AAEF,kBAAM,SAASC,UAAS,KAAK,SAAS;AAAA,cACpC,KAAK,KAAK;AAAA,cACV,UAAU;AAAA,cACV,SAAS;AAAA,YACX,CAAC;AAED,gBAAI,SAAS;AACb,gBAAI,KAAK,QAAQ;AACf,kBAAI,KAAK,WAAW,WAAW;AAC7B,yBAAS;AAAA,cACX,WAAW,KAAK,OAAO,WAAW,WAAW,GAAG;AAC9C,sBAAM,WAAW,KAAK,OAAO,MAAM,CAAC;AACpC,yBAAS,OAAO,SAAS,QAAQ;AAAA,cACnC,WAAW,KAAK,OAAO,WAAW,UAAU,GAAG;AAC7C,sBAAM,UAAU,KAAK,OAAO,MAAM,CAAC;AAEnC,yBAAS,KAAK,cAAc,SAAS,MAAM;AAAA,cAC7C;AAAA,YACF;AAEA,gCAAoB,UAAU,KAAK;AAAA,cACjC,MAAM,KAAK;AAAA,cACX;AAAA,cACA;AAAA,YACF,CAAC;AAED,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,QAAQ,KAAK;AAAA,cACb,UAAU,KAAK;AAAA,cACf,SAAS,gBAAgB,SAAS,WAAW,QAAQ,KAAK,KAAK,OAAO;AAAA,YACxE,CAAC;AAED,gBAAI,CAAC,QAAQ;AACX,qBAAO;AAAA,YACT;AAAA,UACF,SAAS,OAAO;AACd,gCAAoB,UAAU,KAAK;AAAA,cACjC,MAAM,KAAK;AAAA,cACX,QAAQ;AAAA,cACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC/D,CAAC;AACD,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,WAAO,sBAAsB;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAA8C;AACvE,UAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,YAAY;AAAA,MACZ,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,QAAQ,KAAK,MAAMF,YAAW;AAAA,QAC9B,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,EAAE;AAAA,MACF,eAAe,CAAC;AAAA,MAChB,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAiB;AACf,WAAO,KAAK,eAAe,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK,eAAe,SAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,sBACd,aACA,SAIsB;AACtB,SAAO,IAAI,qBAAqB,aAAa,OAAO;AACtD;;;AC5lBA,SAAS,aAAgC;AAqClC,IAAM,oBAAsC;AAAA,EACjD;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,CAAC,WAAW,IAAI;AAAA,IAC5B,oBAAoB,CAAC,YAAY;AAAA,IACjC,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,CAAC,IAAI;AAAA,IACjB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,CAAC;AAAA,IACb,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,CAAC,UAAU;AAAA,IACvB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,CAAC,KAAK;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAKO,SAAS,kBAAkB,WAAkD;AAClF,SAAO,kBAAkB,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAC3D;AAKA,eAAsB,oBAAoB,WAAwC;AAChF,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,CAAC,UAAU,CAAC,OAAO,YAAa,QAAO;AAE3C,MAAI;AAEF,UAAM,WAAW,OAAO,gBAAgB,SAAS,OAAO,OAAO;AAC/D,UAAM,SAAS,MAAM,eAAe,SAAS,MAAM,GAAG,EAAE,CAAC,GAAG,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,GAAG;AAAA,MACxF,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,aAAa;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,wBAA8C;AAClE,QAAM,YAAyB,CAAC;AAEhC,aAAW,UAAU,mBAAmB;AACtC,QAAI,OAAO,eAAgB,MAAM,oBAAoB,OAAO,IAAI,GAAI;AAClE,gBAAU,KAAK,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,iBACpB,WACA,QACA,UAII,CAAC,GAC0B;AAC/B,QAAM,SAAS,kBAAkB,SAAS;AAE1C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,uBAAuB,SAAS;AAAA,MACvC,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,SAAS,SAAS;AAAA,MACzB,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,oBAAoB,SAAS;AACvD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,cAAc,OAAO,OAAO;AAAA,MACnC,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,OAAiB,CAAC,GAAI,OAAO,cAAc,CAAC,CAAE;AAGpD,MAAI,cAAc,eAAe;AAC/B,SAAK,KAAK,MAAM;AAAA,EAClB,OAAO;AAEL,SAAK,KAAK,MAAM;AAAA,EAClB;AAGA,MAAI,OAAO,oBAAoB;AAC7B,SAAK,KAAK,GAAG,OAAO,kBAAkB;AAAA,EACxC;AAEA,SAAO,eAAe,OAAO,SAAS,MAAM;AAAA,IAC1C,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAChC,SAAS,QAAQ,WAAW;AAAA;AAAA,IAC5B,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,GAAG,OAAO;AAAA,MACV,GAAG,QAAQ;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAKA,eAAe,eACb,SACA,MACA,UAII,CAAC,GAC0B;AAC/B,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,WAAW;AAEf,UAAM,eAA6B;AAAA,MACjC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA;AAAA,IAEf;AAEA,UAAM,QAAQ,MAAM,SAAS,MAAM,YAAY;AAG/C,UAAM,YAAY,QAAQ,UACtB,WAAW,MAAM;AACf,iBAAW;AACX,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,QAAQ,OAAO,IAClB;AAEJ,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,UAAI,UAAW,cAAa,SAAS;AACrC,MAAAA,SAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO,MAAM;AAAA,QACb,UAAU;AAAA,QACV,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,UAAW,cAAa,SAAS;AACrC,MAAAA,SAAQ;AAAA,QACN,SAAS,SAAS,KAAK,CAAC;AAAA,QACxB,QAAQ;AAAA,QACR,OAAO,WAAW,wBAAwB,UAAU;AAAA,QACpD,UAAU,QAAQ;AAAA,QAClB,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAKO,SAAS,oBACd,WACA,cACA,iBACQ;AACR,MAAI,SAAS,gCAAgC,SAAS;AAAA;AAAA;AAEtD,MAAI,iBAAiB;AACnB,cAAU,SAAS,eAAe;AAAA;AAAA;AAAA,EACpC;AAEA,YAAU;AAAA,EAAmB,YAAY;AAEzC,SAAO;AACT;AAUO,SAAS,qBAAqB,WAAyC;AAC5E,QAAM,SAAS,kBAAkB,SAAS;AAE1C,MAAI,QAAQ,aAAa;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,UAAU,YAAY,kBAAkB,MAAM,EAAE,SAAS,SAAS,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,+BACd,WACA,WACQ;AACR,QAAM,WAAW,qBAAqB,SAAS;AAE/C,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,6BACkB,SAAS;AAAA,0BACZ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKjB,SAAS;AAAA;AAAA,EAEzB;AAEA,SAAO;AAAA;AAAA,0BAEiB,SAAS;AAAA;AAAA;AAAA;AAAA;AAKnC;;;ACpVA,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,QAAAC,cAAY;AACrB,SAAS,WAAAC,gBAAe;AA2CxB,SAASC,eAAc,aAA+B;AACpD,QAAM,OAAiB,CAAC;AAGxB,aAAW,cAAc,uBAAuB;AAC9C,UAAM,WAAWC,OAAK,aAAa,UAAU;AAC7C,QAAIC,aAAW,QAAQ,GAAG;AACxB,WAAK,KAAK,QAAQ;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,OAAOC,SAAQ;AACrB,QAAM,cAAc;AAAA,IAClBF,OAAK,MAAM,WAAW,QAAQ;AAAA,IAC9BA,OAAK,MAAM,WAAW,QAAQ;AAAA,IAC9BA,OAAK,MAAM,UAAU,QAAQ;AAAA,IAC7BA,OAAK,MAAM,aAAa,QAAQ;AAAA,EAClC;AAEA,aAAW,cAAc,aAAa;AACpC,QAAIC,aAAW,UAAU,GAAG;AAC1B,WAAK,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,oBAAoB,UAAgC,CAAC,GAAkB;AACrF,QAAM;AAAA,IACJ,cAAc,QAAQ,IAAI;AAAA,IAC1B;AAAA,IACA,UAAU;AAAA;AAAA,IACV,sBAAsB;AAAA,IACtB;AAAA,EACF,IAAI;AAEJ,SAAO,OAAO,WAAmB,WAAoF;AAEnH,UAAM,aAAaF,eAAc,WAAW;AAC5C,UAAM,QAAQ,UAAU,WAAW,UAAU;AAE7C,QAAI,CAAC,OAAO;AACV,yBAAmB;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA,SAAS,UAAU,SAAS;AAAA,MAC9B,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,UAAU,SAAS,8BAA8B,WAAW,KAAK,IAAI,CAAC;AAAA,MAC/E;AAAA,IACF;AAEA,uBAAmB;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,SAAS,mBAAmB,MAAM,IAAI;AAAA,IACxC,CAAC;AAGD,UAAM,UAAU,iBAAiB,MAAM,IAAI;AAC3C,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,sCAAsC,MAAM,IAAI;AAAA,MACzD;AAAA,IACF;AAGA,QAAI,aAAoC;AAExC,QAAI,CAAC,cAAc,qBAAqB;AACtC,YAAM,kBAAkB,MAAM,sBAAsB;AAEpD,UAAI,kBAAkB,gBAAgB,SAAS,cAAc,GAAG;AAC9D,qBAAa;AAAA,MACf,WAAW,gBAAgB,SAAS,GAAG;AAErC,qBAAa,gBAAgB,SAAS,aAAa,IAAI,gBAAgB,gBAAgB,CAAC;AAAA,MAC1F;AAAA,IACF;AAGA,QAAI,CAAC,YAAY;AACf,YAAM,WAAW,qBAAqB,kBAAkB,WAAW;AACnE,YAAM,eAAe,+BAA+B,kBAAkB,aAAa,MAAM,IAAI;AAE7F,UAAI,aAAa,SAAS,aAAa,UAAU;AAC/C,2BAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,EAA0C,YAAY;AAAA,QAC/D,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,mDAAmD,YAAY;AAAA,QACxE;AAAA,MACF;AAGA,YAAM,WAAW,iBACb,wBAAwB,cAAc,2DACtC;AAEJ,yBAAmB;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO,GAAG,QAAQ;AAAA,EAAK,YAAY;AAAA,MACrC,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,GAAG,QAAQ,IAAI,YAAY;AAAA,MACpC;AAAA,IACF;AAEA,uBAAmB;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,SAAS,gBAAgB,UAAU;AAAA,IACrC,CAAC;AAGD,QAAI;AACJ,QAAI,QAAQ,MAAM;AAChB,wBAAkB,OAAO,OAAO,IAAI;AAAA,IACtC;AAEA,UAAM,SAAS,oBAAoB,WAAW,SAAS,eAAe;AAEtE,uBAAmB;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,SAAS,2BAA2B,UAAU;AAAA,IAChD,CAAC;AAGD,UAAM,SAAS,MAAM,iBAAiB,YAAa,QAAQ;AAAA,MACzD,KAAK;AAAA,MACL;AAAA,IACF,CAAC;AAED,uBAAmB;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO,UAAU,qCAAqC,qBAAqB,OAAO,KAAK;AAAA,IAClG,CAAC;AAED,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAOO,SAAS,6BAA6B,UAIzC,CAAC,GAAkB;AACrB,QAAM,EAAE,QAAQ,KAAK,YAAY,UAAU,IAAI;AAE/C,SAAO,OAAO,WAAmB,YAAqF;AACpH,gBAAY,SAAS;AAGrB,UAAM,IAAI,QAAQ,CAACI,aAAY,WAAWA,UAAS,KAAK,CAAC;AAEzD,UAAM,SAAS,aAAa,SAAS,KAAK;AAE1C,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,OAAO,SAAS,gCAAgC,SAAS,KAAK;AAAA,IAChE;AAAA,EACF;AACF;;;ACpPA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,QAAAC,cAAY;AACrB,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,SAASC,kBAAiB;AAWnC,IAAM,YAAY,UAAU,IAAI;AAKhC,IAAM,kBAAkB;AAKxB,eAAe,aACb,WACA,KACA,SAC0B;AAC1B,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AACF,YAAQ,UAAU,MAAM;AAAA,MACtB,KAAK;AACH,eAAO,iBAAiB,WAAW,KAAK,SAAS;AAAA,MAEnD,KAAK;AACH,eAAO,oBAAoB,WAAW,KAAK,SAAS;AAAA,MAEtD,KAAK;AACH,eAAO,mBAAmB,WAAW,KAAK,SAAS;AAAA,MAErD,KAAK;AACH,eAAO,sBAAsB,WAAW,KAAK,SAAS;AAAA,MAExD,KAAK;AACH,eAAO,kBAAkB,WAAW,KAAK,SAAS;AAAA,MAEpD,KAAK;AACH,eAAO,sBAAsB,WAAW,KAAK,SAAS,SAAS;AAAA,MAEjE,KAAK;AACH,eAAO,mBAAmB,WAAW,KAAK,SAAS,SAAS;AAAA,MAE9D,KAAK;AACH,eAAO,4BAA4B,WAAW,KAAK,SAAS,SAAS;AAAA,MAEvE,KAAK;AACH,eAAO,gBAAgB,WAAW,KAAK,SAAS;AAAA,MAElD,KAAK;AACH,eAAO,iBAAiB,WAAW,KAAK,SAAS;AAAA,MAEnD,KAAK;AACH,eAAO,gBAAgB,WAAW,KAAK,SAAS;AAAA,MAElD,KAAK;AACH,eAAO,gBAAgB,KAAK,SAAS,SAAS;AAAA,MAEhD,KAAK;AACH,eAAO,iBAAiB,KAAK,SAAS,SAAS;AAAA,MAEjD,KAAK;AACH,eAAO,iBAAiB,KAAK,SAAS,SAAS;AAAA,MAEjD,KAAK;AACH,eAAO,gBAAgB,WAAW,SAAS;AAAA,MAE7C,KAAK;AACH,eAAO,oBAAoB,WAAW,SAAS;AAAA,MAEjD,KAAK;AACH,eAAO,kBAAkB,WAAW,SAAS,SAAS;AAAA,MAExD,KAAK;AACH,eAAO,aAAa,WAAW,KAAK,SAAS,SAAS;AAAA,MAExD;AACE,eAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,2BAA2B,UAAU,IAAI;AAAA,UAChD,UAAU,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAIA,SAAS,iBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWD,OAAK,KAAK,UAAU,UAAU,EAAE;AACjD,QAAM,SAASF,aAAW,QAAQ;AAElC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,SAAS,WAAW;AAAA,IAC5B,UAAU;AAAA,IACV,OAAO,SAAS,SAAY,mBAAmB,UAAU,MAAM;AAAA,IAC/D,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,oBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWE,OAAK,KAAK,UAAU,UAAU,EAAE;AACjD,QAAM,SAASF,aAAW,QAAQ;AAElC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ,SAAS,WAAW;AAAA,IAC5B,UAAU;AAAA,IACV,OAAO,CAAC,SAAS,SAAY,0BAA0B,UAAU,MAAM;AAAA,IACvE,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,mBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWE,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,mBAAmB,UAAU,MAAM;AAAA,MAC1C,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,QAAM,WAAW,OAAO,UAAU,YAAY,EAAE;AAChD,QAAM,WAAW,QAAQ,SAAS,QAAQ;AAE1C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,WAAW,aAAa;AAAA,IAChC,UAAU,aAAa,QAAQ;AAAA,IAC/B,OAAO,WAAW,SAAY,0BAA0B,QAAQ;AAAA,IAChE,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,sBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWC,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA;AAAA,MACR,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,QAAM,WAAW,OAAO,UAAU,YAAY,EAAE;AAChD,QAAM,WAAW,QAAQ,SAAS,QAAQ;AAE1C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,QAAQ,WAAW,kBAAkB;AAAA,IACrC,UAAU,qBAAqB,QAAQ;AAAA,IACvC,OAAO,CAAC,WAAW,SAAY,4BAA4B,QAAQ;AAAA,IACnE,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,kBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWC,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,mBAAmB,UAAU,MAAM;AAAA,MAC1C,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,QAAM,UAAU,IAAI,OAAO,OAAO,UAAU,YAAY,EAAE,CAAC;AAC3D,QAAM,UAAU,QAAQ,KAAK,OAAO;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,UAAU,YAAY;AAAA,IAC9B,UAAU,YAAY,UAAU,QAAQ;AAAA,IACxC,OAAO,UAAU,SAAY,gCAAgC,UAAU,QAAQ;AAAA,IAC/E,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,eAAe,sBACb,WACA,KACA,SACA,WAC0B;AAC1B,MAAI;AACF,UAAM,UAAU,UAAU,UAAU,IAAI;AAAA,MACtC;AAAA,MACA,SAAS,UAAU,WAAW;AAAA,IAChC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,mBACb,WACA,KACA,SACA,WAC0B;AAC1B,MAAI;AACF,UAAM,UAAU,UAAU,UAAU,IAAI;AAAA,MACtC;AAAA,MACA,SAAS,UAAU,WAAW;AAAA,IAChC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,4BACb,WACA,KACA,SACA,WAC0B;AAC1B,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,UAAU,UAAU,UAAU,IAAI;AAAA,MACjE;AAAA,MACA,SAAS,UAAU,WAAW;AAAA,IAChC,CAAC;AAED,UAAM,SAAS,SAAS;AACxB,UAAM,WAAW,OAAO,UAAU,YAAY,EAAE;AAChD,UAAM,WAAW,OAAO,SAAS,QAAQ;AAEzC,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,WAAW,oBAAoB;AAAA,MACvC,UAAU,aAAa,QAAQ;AAAA,MAC/B,OAAO,WAAW,SAAY,oCAAoC,QAAQ;AAAA,MAC1E,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,gBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWC,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,mBAAmB,UAAU,MAAM;AAAA,MAC1C,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,SAAK,MAAM,OAAO;AAElB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,iBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWC,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,mBAAmB,UAAU,MAAM;AAAA,MAC1C,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,UAAM,MAAM,OAAO,UAAU,YAAY,EAAE;AAC3C,UAAM,OAAO,IAAI,MAAM,GAAG;AAE1B,QAAI,QAAQ;AACZ,eAAW,KAAK,MAAM;AACpB,UAAI,UAAU,UAAa,UAAU,QAAQ,EAAE,KAAK,QAAQ;AAC1D,eAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU,YAAY,GAAG;AAAA,UACzB,OAAO,2BAA2B,GAAG;AAAA,UACrC,UAAU,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,MACF;AACA,cAAQ,MAAM,CAAC;AAAA,IACjB;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,YAAY,GAAG;AAAA,MACzB,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,gBACP,WACA,KACA,WACiB;AACjB,QAAM,WAAWC,OAAK,KAAK,UAAU,UAAU,EAAE;AAEjD,MAAI,CAACF,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,mBAAmB,UAAU,MAAM;AAAA,MAC1C,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,IAAAE,WAAU,OAAO;AAEjB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,gBACb,KACA,SACA,WAC0B;AAC1B,QAAM,YAA2B,EAAE,MAAM,aAAa;AAGtD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AACrC,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,eAAe,iBACb,KACA,SACA,WAC0B;AAC1B,QAAM,YAA2B,EAAE,MAAM,cAAc;AAGvD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AACrC,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,eAAe,iBACb,KACA,SACA,WAC0B;AAC1B,QAAM,YAA2B,EAAE,MAAM,cAAc;AAGvD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AACrC,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,gBACP,WACA,WACiB;AACjB,QAAM,UAAU,UAAU,UAAU;AACpC,QAAM,QAAQ,QAAQ,IAAI,OAAO,MAAM;AAEvC,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,QAAQ,QAAQ;AAAA,IACxB,UAAU;AAAA,IACV,OAAO,QAAQ,SAAY,iCAAiC,OAAO;AAAA,IACnE,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,eAAe,mBAAmB,MAAgC;AAChE,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,SAAS,aAAa;AAC5B,WAAO,KAAK,SAAS,MAAMA,SAAQ,KAAK,CAAC;AACzC,WAAO,KAAK,aAAa,MAAM;AAC7B,aAAO,MAAM;AACb,MAAAA,SAAQ,IAAI;AAAA,IACd,CAAC;AACD,WAAO,OAAO,MAAM,WAAW;AAAA,EACjC,CAAC;AACH;AAEA,eAAe,oBACb,WACA,WAC0B;AAC1B,QAAM,OAAO,SAAS,UAAU,UAAU,KAAK,EAAE;AAEjD,MAAI,QAAQ,KAAK,OAAO,OAAO;AAC7B,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,gBAAgB,IAAI;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,mBAAmB,IAAI;AAEjD,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,cAAc,cAAc;AAAA,IACpC,UAAU;AAAA,IACV,OAAO,cAAc,SAAY,QAAQ,IAAI;AAAA,IAC7C,UAAU,KAAK,IAAI,IAAI;AAAA,EACzB;AACF;AAEA,eAAe,kBACb,WACA,SACA,WAC0B;AAC1B,QAAM,MAAM,UAAU,UAAU;AAEhC,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,UAAU,WAAW,OAAO;AAEnF,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAC/D,iBAAa,SAAS;AAEtB,UAAM,WAAW,SAAS;AAE1B,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,UAAU,SAAS,MAAM;AAAA,MACjC,UAAU;AAAA,MACV,OAAO,WAAW,SAAY,uBAAuB,SAAS,MAAM;AAAA,MACpE,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,eAAe,aACb,WACA,KACA,SACA,WAC0B;AAC1B,MAAI,CAAC,UAAU,SAAS;AACtB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,UAAU,SAAS;AAAA,MACjC;AAAA,MACA,SAAS,UAAU,WAAW;AAAA,IAChC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,KAAK,IAAI,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAKA,eAAe,YACb,UACA,KACA,SACyB;AACzB,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,SAAS,WAAW,CAAC,GAAG,WAAW,QAAQ,WAAW;AAGtE,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,CAAC;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAE3C,QAAI,CAAC,SAAS,QAAQ,SAAS,KAAK,WAAW,GAAG;AAChD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,CAAC;AAAA,QACb,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,iBAAiB,QAAQ,KAAK,KAAK,CAAC,MAAM,SAAS,MAAM,SAAS,CAAC,CAAC;AAC1E,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,CAAC;AAAA,QACb,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY,SAAS,MAAM;AACrC,UAAM,aAAa,QAAQ,SAAS,KAAK,CAAC,MAAM,SAAS,MAAM,SAAS,CAAC,CAAC;AAC1E,QAAI,YAAY;AACd,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,CAAC;AAAA,QACb,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,SAAS,OAAO;AAClB,eAAW,OAAO,SAAS,OAAO;AAChC,UAAI;AACF,cAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AAAA,MACvC,SAAS,OAAO;AACd,qBAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AACd,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,CAAC;AAAA,MACb;AAAA,MACA,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,SAAS;AAAA,IACX;AAAA,EACF;AAGA,QAAM,mBAAsC,CAAC;AAC7C,MAAI,YAAY;AAEhB,aAAW,aAAa,SAAS,YAAY;AAC3C,YAAQ,aAAa;AAAA,MACnB,MAAM;AAAA,MACN,UAAU,SAAS;AAAA,MACnB,eAAe,UAAU;AAAA,IAC3B,CAAC;AAED,UAAM,SAAS,MAAM,aAAa,WAAW,KAAK,OAAO;AACzD,qBAAiB,KAAK,MAAM;AAE5B,YAAQ,aAAa;AAAA,MACnB,MAAM;AAAA,MACN,UAAU,SAAS;AAAA,MACnB,eAAe,UAAU;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,CAAC,OAAO,QAAQ;AAClB,kBAAY;AACZ,UAAI,QAAQ,MAAM;AAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,SAAS,SAAS;AACpB,eAAW,OAAO,SAAS,SAAS;AAClC,UAAI;AACF,cAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AAAA,MACvC,SAAS,OAAO;AACd,uBAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,UAAU,KAAK,IAAI,IAAI;AAAA,IACvB,SAAS;AAAA,EACX;AACF;AAKA,eAAsB,aACpB,OACA,UAA6B,CAAC,GACJ;AAC1B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,UAAU,MAAM,kBAAkB,QAAQ,WAAW;AAE3D,UAAQ,aAAa;AAAA,IACnB,MAAM;AAAA,IACN,WAAW,MAAM;AAAA,EACnB,CAAC;AAGD,MAAI;AACJ,MAAI,MAAM,aAAa;AACrB,eAAW,OAAO,MAAM,aAAa;AACnC,UAAI;AACF,cAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AAAA,MACvC,SAAS,OAAO;AACd,2BAAmB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI;AAC9C,QAAM,aAAa,UAAU,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM;AAGvE,QAAM,cAAgC,CAAC;AACvC,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,eAAe;AAEnB,aAAW,YAAY,YAAY;AACjC,YAAQ,aAAa;AAAA,MACnB,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,UAAU,SAAS;AAAA,IACrB,CAAC;AAED,UAAMC,UAAS,MAAM,YAAY,UAAU,KAAK,EAAE,GAAG,SAAS,QAAQ,CAAC;AACvE,gBAAY,KAAKA,OAAM;AAEvB,QAAIA,QAAO,SAAS;AAClB;AAAA,IACF,WAAWA,QAAO,QAAQ;AACxB;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAEA,YAAQ,aAAa;AAAA,MACnB,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,QAAQA,QAAO;AAAA,MACf,OAAOA,QAAO,WAAW,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG;AAAA,IACnD,CAAC;AAED,QAAI,CAACA,QAAO,UAAU,QAAQ,MAAM;AAClC;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,MAAM,eAAe;AACvB,eAAW,OAAO,MAAM,eAAe;AACrC,UAAI;AACF,cAAM,UAAU,KAAK,EAAE,KAAK,QAAQ,CAAC;AAAA,MACvC,SAAS,OAAO;AACd,6BAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAA0B;AAAA,IAC9B,WAAW,MAAM;AAAA,IACjB,QAAQ,gBAAgB;AAAA,IACxB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,KAAK,IAAI,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,UAAQ,aAAa;AAAA,IACnB,MAAM;AAAA,IACN,WAAW,MAAM;AAAA,IACjB,QAAQ,OAAO;AAAA,EACjB,CAAC;AAED,SAAO;AACT;AAKO,SAAS,+BACd,WACA,aACuB;AACvB,QAAM,QAAQ,YAAY;AAE1B,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,KAAK,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,YAA6B,MAAM,IAAI,CAAC,OAAgC;AAAA,IAC5E,MAAM,OAAO,EAAE,QAAQ,cAAc;AAAA,IACrC,aAAa,EAAE;AAAA,IACf,YAAY,gBAAgB,EAAE,cAAc,EAAE,MAAM;AAAA,IACpD,OAAO,EAAE;AAAA,IACT,SAAS,EAAE;AAAA,IACX,MAAM,EAAE,SAAS;AAAA,IACjB,MAAM,EAAE,SAAS;AAAA,IACjB,MAAM,EAAE;AAAA,EACV,EAAE;AAEF,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,aAAa,YAAY;AAAA,IACzB,eAAe,YAAY;AAAA,IAC3B,gBAAgB,YAAY;AAAA,EAC9B;AACF;AAKA,SAAS,gBAAgB,YAAsC;AAC7D,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,MAAI,OAAO,eAAe,UAAU;AAElC,WAAO,CAAC,qBAAqB,UAAU,CAAC;AAAA,EAC1C;AAEA,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,WAAW,IAAI,CAAC,MAAM;AAC3B,UAAI,OAAO,MAAM,UAAU;AACzB,eAAO,qBAAqB,CAAC;AAAA,MAC/B;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,UAA2B;AACrC;AAKA,SAAS,qBAAqB,KAA4B;AAExD,QAAM,QAAQ,IAAI,MAAM,kCAAkC;AAE1D,MAAI,OAAO;AACT,WAAO;AAAA,MACL,MAAM,MAAM,CAAC;AAAA,MACb,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,MACtB,UAAU,MAAM,CAAC,GAAG,KAAK;AAAA,IAC3B;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;;;ACz5BO,IAAM,wBAAuC;AAAA,EAClD;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAKO,IAAM,yBAAyB;AAK/B,IAAM,oBAAoB,KAAK,KAAK;;;AClJ3C,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AAC/E,SAAS,QAAAC,cAAY;AACrB,SAAS,WAAAC,gBAAe;AAkBjB,IAAM,wBAAN,MAA4B;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAiC;AAAA,EAEzC,YAAY,SAA4B,CAAC,GAAG;AAC1C,SAAK,SAAS;AACd,SAAK,WAAW,OAAO,YAAYC,OAAKC,SAAQ,GAAG,aAAa,aAAa;AAC7E,SAAK,YAAYD,OAAK,KAAK,UAAU,sBAAsB;AAG3D,QAAI,CAACE,aAAW,KAAK,QAAQ,GAAG;AAC9B,MAAAC,WAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4B;AAC1B,WAAO,CAAC,GAAG,uBAAuB,GAAI,KAAK,OAAO,WAAW,CAAC,CAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqC;AACnC,QAAI,CAACD,aAAW,KAAK,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAUE,eAAa,KAAK,WAAW,OAAO;AACpD,YAAM,QAAQ,KAAK,MAAM,OAAO;AAGhC,YAAM,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AAChE,YAAM,MAAM,KAAK,OAAO,YAAY;AAEpC,UAAI,WAAW,KAAK;AAClB,eAAO;AAAA,MACT;AAEA,WAAK,QAAQ;AACb,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAA+B;AACvC,IAAAC,eAAc,KAAK,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5D,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAkD;AAClE,UAAM,SAA6B,CAAC;AACpC,UAAM,SAAS,OAAO,UAAU;AAEhC,QAAI;AAEF,YAAM,aAAa;AAAA,QACjB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,OAAO,OAAO;AAEhB,iBAAW,aAAa,YAAY;AAClC,YAAI;AACF,gBAAM,MAAM,qCAAqC,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS;AACnG,gBAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,cAAI,SAAS,IAAI;AACf,kBAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,gBAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,yBAAW,QAAQ,MAAM;AACvB,uBAAO,KAAK,KAAK,gBAAgB,MAAiC,MAAM,CAAC;AAAA,cAC3E;AACA,qBAAO;AAAA,YACT;AAEA,kBAAM,UAAU;AAChB,gBAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACnD,yBAAW,QAAQ,QAAQ,QAAQ;AACjC,uBAAO,KAAK,KAAK,gBAAgB,MAAiC,MAAM,CAAC;AAAA,cAC3E;AACA,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,YAAM,YAAY,qCAAqC,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,MAAM;AAC5F,YAAM,iBAAiB,MAAM,MAAM,SAAS;AAE5C,UAAI,eAAe,IAAI;AACrB,cAAM,SAAS,MAAM,eAAe,KAAK;AACzC,cAAM,eAAe,KAAK,qBAAqB,QAAQ,MAAM;AAC7D,eAAO,KAAK,GAAG,YAAY;AAAA,MAC7B;AAGA,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,KAAK;AAAA,UACV,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI;AAAA,UAClC,MAAM,OAAO;AAAA,UACb,aAAa,OAAO,eAAe,eAAe,OAAO,IAAI;AAAA,UAC7D;AAAA,UACA,MAAM;AAAA,UACN,MAAM,CAAC,YAAY;AAAA,UACnB,QAAQ,sBAAsB,OAAO,KAAK,IAAI,OAAO,IAAI;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,OAAO,KAAK,IAAI,OAAO,IAAI,KAAK,KAAK;AAAA,IACpF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAcC,OAAuB;AAC3C,WAAO,gBAAgB,KAAKA,KAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAqB;AACpC,WAAO,IACJ,QAAQ,kBAAkB,+BAA+B,EACzD,QAAQ,UAAU,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,MACA,QACkB;AAClB,UAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,SAAS,SAAS;AACxD,UAAMA,QAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,GAAG;AAG7D,UAAM,SAAS,KAAK,cAAcA,KAAI,IAClC,KAAK,SAASA,KAAI,IAClB,KAAK,YAAY,QAAQA,KAAI;AAEjC,WAAO;AAAA,MACL,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,IAAIA,KAAI;AAAA,MAC1C;AAAA,MACA,aAAa,OAAO,KAAK,eAAe,KAAK,QAAQ,EAAE;AAAA,MACvD;AAAA,MACA,MAAAA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,MAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,MAC9C,QAAQ,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,SAAS;AAAA,MACnD,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,WAAW,KAAK;AAAA,MAChB,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,QACA,QACoB;AACpB,UAAM,SAA6B,CAAC;AACpC,UAAM,SAAS,OAAO,UAAU;AAGhC,UAAM,cAAc;AACpB,QAAI;AAEJ,YAAQ,QAAQ,YAAY,KAAK,MAAM,OAAO,MAAM;AAClD,YAAM,OAAO,MAAM,CAAC;AACpB,YAAMA,QAAO,MAAM,CAAC;AAGpB,UAAIA,MAAK,WAAW,MAAM,KAAK,CAACA,MAAK,SAAS,OAAO,IAAI,GAAG;AAC1D;AAAA,MACF;AAGA,YAAM,eAAe,KAAK,IAAI,GAAG,MAAM,QAAQ,GAAG;AAClD,YAAM,aAAa,KAAK,IAAI,OAAO,QAAQ,MAAM,QAAQ,GAAG;AAC5D,YAAM,UAAU,OAAO,MAAM,cAAc,UAAU;AAGrD,YAAM,YAAY,QAAQ,MAAM,8CAA8C;AAC9E,YAAM,cAAc,YAAY,UAAU,CAAC,EAAE,KAAK,IAAI;AAGtD,YAAMC,cAAa,KAAK,cAAcD,KAAI;AAC1C,YAAM,iBAAiBC,cAAaD,QAAQA,MAAK,WAAW,GAAG,IAAIA,QAAO,IAAIA,KAAI;AAClF,YAAM,SAASC,cACX,KAAK,SAASD,KAAI,IAClB,qCAAqC,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,MAAM,IAAIA,KAAI;AAEtF,aAAO,KAAK;AAAA,QACV,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,IAAIA,KAAI;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,MAAM,WAAW;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,QAAqBA,OAAsB;AAC7D,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,YAAYA,MAAK,WAAW,GAAG,IAAIA,MAAK,MAAM,CAAC,IAAIA;AACzD,WAAO,qCAAqC,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,SAAS;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAc,aAA+B;AAC7D,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAO,GAAG,IAAI,IAAI,WAAW,GAAG,YAAY;AAElD,UAAM,cAAwC;AAAA,MAC5C,YAAY,CAAC,cAAc,MAAM,KAAK;AAAA,MACtC,YAAY,CAAC,cAAc,MAAM,MAAM;AAAA,MACvC,OAAO,CAAC,SAAS,OAAO,KAAK;AAAA,MAC7B,QAAQ,CAAC,QAAQ,UAAU,SAAS;AAAA,MACpC,SAAS,CAAC,QAAQ,QAAQ,UAAU,OAAO;AAAA,MAC3C,SAAS,CAAC,QAAQ,UAAU,UAAU;AAAA,MACtC,MAAM,CAAC,QAAQ,kBAAkB,SAAS,OAAO;AAAA,MACjD,UAAU,CAAC,YAAY,MAAM,YAAY,SAAS,OAAO;AAAA,MACzD,KAAK,CAAC,OAAO,QAAQ,SAAS;AAAA,MAC9B,QAAQ,CAAC,MAAM,MAAM,UAAU,YAAY;AAAA,MAC3C,KAAK,CAAC,OAAO,UAAU,QAAQ;AAAA,IACjC;AAEA,eAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,WAAW,GAAG;AACzD,UAAI,SAAS,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AAC1C,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAqC;AACzC,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,YAAgC,CAAC;AAGvC,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,QAAQ,IAAI,CAAC,WAAW,KAAK,YAAY,MAAM,CAAC;AAAA,IAClD;AAEA,eAAW,UAAU,SAAS;AAC5B,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAGA,UAAM,QAA0B;AAAA,MAC9B,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,UAAU;AAAA,IACxB;AAGA,SAAK,UAAU,KAAK;AAEpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,eAAe,OAAkC;AAE9D,QAAI,CAAC,gBAAgB,KAAK,OAAO;AAC/B,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,CAAC,cAAc;AACjB,YAAM,SAAS,KAAK,UAAU;AAC9B,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAAoC,CAAC,GAAqC;AACrF,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,QAAI,SAAS,CAAC,GAAG,MAAM,MAAM;AAG7B,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,QAAQ,MAAM,YAAY;AACxC,eAAS,OAAO;AAAA,QACd,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KACnC,EAAE,YAAY,YAAY,EAAE,SAAS,KAAK,KAC1C,EAAE,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,MACtD;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,eAAS,OAAO;AAAA,QAAO,CAAC,MACtB,QAAQ,KAAM,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA,MAC9C;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,eAAS,OAAO;AAAA,QACd,CAAC,MACC,EAAE,OAAO,SAAS,QAAQ,UAC1B,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,OAAO,QAAQ;AAAA,MACrD;AAAA,IACF;AAGA,QAAI,QAAQ,OAAO;AACjB,eAAS,OAAO;AAAA,QACd,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,SAAS,QAAQ,KAAM;AAAA,MACtD;AAAA,IACF;AAGA,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,YAAY,QAAQ,aAAa;AAEvC,WAAO,KAAK,CAAC,GAAG,MAAM;AACpB,UAAI,aAAa;AAEjB,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,uBAAa,EAAE,KAAK,cAAc,EAAE,IAAI;AACxC;AAAA,QACF,KAAK;AACH,wBAAc,EAAE,SAAS,MAAM,EAAE,SAAS;AAC1C;AAAA,QACF,KAAK;AACH,wBAAc,EAAE,aAAa,MAAM,EAAE,aAAa;AAClD;AAAA,QACF,KAAK;AACH,uBACE,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,QAAQ,IACnC,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,QAAQ;AACrC;AAAA,MACJ;AAEA,aAAO,cAAc,SAAS,CAAC,aAAa;AAAA,IAC9C,CAAC;AAED,UAAM,QAAQ,OAAO;AAGrB,QAAI,QAAQ,QAAQ;AAClB,eAAS,OAAO,MAAM,QAAQ,MAAM;AAAA,IACtC;AAEA,QAAI,QAAQ,OAAO;AACjB,eAAS,OAAO,MAAM,GAAG,QAAQ,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAA8C;AAC3D,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,WAAO,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAiD;AACrE,QAAI,CAAC,MAAM,QAAQ;AACjB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,MAAM,MAAM;AACzC,UAAI,SAAS,IAAI;AACf,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAQ,IAA+C;AAC1E,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,UAAM,YAAY,oBAAI,IAAoB;AAE1C,eAAW,SAAS,MAAM,QAAQ;AAChC,iBAAW,OAAO,MAAM,MAAM;AAC5B,kBAAU,IAAI,MAAM,UAAU,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,MAClD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,UAAU,QAAQ,CAAC,EACxC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,EACtC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,KAAK;AAEjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,WAAK,OAAO,UAAU,CAAC;AAAA,IACzB;AACA,SAAK,OAAO,QAAQ,KAAK,MAAM;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAe,MAAoB;AAC9C,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,OAAO,UAAU,KAAK,OAAO,QAAQ;AAAA,QACxC,CAAC,MAAM,EAAE,UAAU,SAAS,EAAE,SAAS;AAAA,MACzC;AAAA,IACF;AACA,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,QAAIJ,aAAW,KAAK,SAAS,GAAG;AAC9B,MAAAM,YAAW,KAAK,SAAS;AAAA,IAC3B;AACA,SAAK,QAAQ;AAAA,EACf;AACF;AAKO,SAAS,4BACd,QACuB;AACvB,SAAO,IAAI,sBAAsB,MAAM;AACzC;;;ACpgBO,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6D/B,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDjC,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBnC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0B3B,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCjC,SAAS,gBAAgB,MAA6B;AAC3D,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,oBAA6D;AAC3E,SAAO;AAAA,IACL,EAAE,MAAM,iBAAiB,aAAa,+CAA+C;AAAA,IACrF,EAAE,MAAM,mBAAmB,aAAa,6BAA6B;AAAA,IACrE,EAAE,MAAM,qBAAqB,aAAa,qCAAqC;AAAA,IAC/E,EAAE,MAAM,aAAa,aAAa,0BAA0B;AAAA,IAC5D,EAAE,MAAM,YAAY,aAAa,yBAAyB;AAAA,EAC5D;AACF;;;AC7IO,IAAM,wBAAsC;AAAA,EACjD,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,cAAc;AAChB;;;ACrGA,SAAS,cAAAC,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAC9B,SAAS,SAASC,YAAW,aAAaC,sBAAqB;AAC/D,SAAS,cAAAC,mBAAkB;AASpB,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACT,OAAoC;AAAA,EACpC;AAAA,EAER,YAAY,aAAqB,WAAoB;AACnD,SAAK,WAAWH,OAAK,aAAa,aAAa,UAAU,mBAAmB;AAC5E,SAAK,YAAY,aAAaG,YAAW;AAAA,EAC3C;AAAA,EAEQ,YAAkB;AACxB,UAAM,MAAMJ,SAAQ,KAAK,QAAQ;AACjC,QAAI,CAACJ,aAAW,GAAG,GAAG;AACpB,MAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,OAA6B;AACnC,QAAI,KAAK,KAAM,QAAO,KAAK;AAE3B,QAAID,aAAW,KAAK,QAAQ,GAAG;AAC7B,UAAI;AACF,cAAM,UAAUE,eAAa,KAAK,UAAU,OAAO;AACnD,aAAK,OAAOI,WAAU,OAAO;AAC7B,YAAI,KAAK,KAAK,cAAc,KAAK,WAAW;AAC1C,eAAK,KAAK,YAAY,KAAK;AAC3B,eAAK,KAAK,eAAe,CAAC;AAAA,QAC5B;AAAA,MACF,QAAQ;AACN,aAAK,OAAO,KAAK,YAAY;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,WAAK,OAAO,KAAK,YAAY;AAAA,IAC/B;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,cAAoC;AAC1C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,OAAa;AACnB,SAAK,UAAU;AACf,UAAM,UAAUC,eAAc,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC;AACzD,IAAAJ,eAAc,KAAK,UAAU,SAAS,OAAO;AAAA,EAC/C;AAAA,EAEA,IACE,MACA,SACA,OACA,YAAY,IACC;AACb,UAAM,OAAO,KAAK,KAAK;AAEvB,UAAM,cAA2B;AAAA,MAC/B,IAAIK,YAAW;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,aAAa,KAAK,WAAW;AAClC,SAAK,KAAK;AAEV,WAAO;AAAA,EACT;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK,KAAK,EAAE;AAAA,EACrB;AAAA,EAEA,UAAU,MAAsC;AAC9C,WAAO,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAC/D;AAAA,EAEA,eAAe,cAAqC;AAClD,WAAO,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,YAAY;AAAA,EAC3E;AAAA,EAEA,UAAU,OAA8B;AACtC,UAAM,eAAe,KAAK,KAAK,EAAE;AACjC,WAAO,aAAa,MAAM,CAAC,KAAK;AAAA,EAClC;AAAA,EAEA,gBAAgB,eAAwC;AACtD,UAAM,gBAAgB,IAAI,IAAI,aAAa;AAC3C,WAAO,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;AAAA,EACxE;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK,KAAK,EAAE,aAAa;AAAA,EAClC;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,QAAQ,IAAqC;AAC3C,WAAO,KAAK,KAAK,EAAE,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EACzD;AAAA,EAEA,SAAS,KAA8B;AACrC,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,WAAO,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,CAAC;AAAA,EAC/D;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,WAAyB;AACpC,SAAK,YAAY;AACjB,QAAI,KAAK,MAAM;AACb,WAAK,KAAK,YAAY;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,SAAkB;AAChB,WAAOR,aAAW,KAAK,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAO,IAAqB;AAC1B,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,QAAQ,KAAK,aAAa,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAE5D,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,aAAa,OAAO,OAAO,CAAC;AACjC,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,KAAuB;AAChC,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,gBAAgB,KAAK,aAAa;AAExC,SAAK,eAAe,KAAK,aAAa,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;AAEpE,QAAI,KAAK,aAAa,WAAW,eAAe;AAC9C,WAAK,KAAK;AAAA,IACZ;AAEA,WAAO,gBAAgB,KAAK,aAAa;AAAA,EAC3C;AACF;;;ACvKA,SAAS,cAAAS,cAAY,aAAAC,aAAW,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAASC,YAAW,aAAaC,sBAAqB;AAC/D,SAAS,cAAAC,mBAAkB;AAGpB,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACT,OAAiC;AAAA,EAEzC,YACE,OACA,aACA,aACA;AACA,SAAK,QAAQ;AACb,SAAK,cAAc;AAEnB,QAAI,UAAU,aAAa,aAAa;AACtC,WAAK,WAAWJ,OAAK,aAAa,aAAa,UAAU,gBAAgB;AAAA,IAC3E,OAAO;AACL,WAAK,WAAWA,OAAKC,SAAQ,GAAG,aAAa,UAAU,aAAa;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,UAAM,MAAMF,SAAQ,KAAK,QAAQ;AACjC,QAAI,CAACJ,aAAW,GAAG,GAAG;AACpB,MAAAC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,OAA0B;AAChC,QAAI,KAAK,KAAM,QAAO,KAAK;AAE3B,QAAID,aAAW,KAAK,QAAQ,GAAG;AAC7B,UAAI;AACF,cAAM,UAAUE,eAAa,KAAK,UAAU,OAAO;AACnD,aAAK,OAAOK,WAAU,OAAO;AAAA,MAC/B,QAAQ;AACN,aAAK,OAAO,KAAK,YAAY;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,WAAK,OAAO,KAAK,YAAY;AAAA,IAC/B;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,cAAiC;AACvC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,OAAa;AACnB,SAAK,UAAU;AACf,UAAM,UAAUC,eAAc,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC;AACzD,IAAAL,gBAAc,KAAK,UAAU,SAAS,OAAO;AAAA,EAC/C;AAAA,EAEA,IAAI,UAAyG;AAC3G,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM,cAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,IAAIM,YAAW;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB;AAEA,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,KAAK;AAEV,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,IAAY,SAAuE;AACxF,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAEzD,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,KAAK,IAAI;AAAA,MACtB,GAAG,KAAK,UAAU,KAAK;AAAA,MACvB,GAAG;AAAA,MACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,SAAK,KAAK;AACV,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,OAAO,IAAqB;AAC1B,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAEzD,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,OAAO,OAAO,CAAC;AAC9B,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA,EAEA,SAAqB;AACnB,WAAO,KAAK,KAAK,EAAE;AAAA,EACrB;AAAA,EAEA,QAAQ,IAAkC;AACxC,WAAO,KAAK,KAAK,EAAE,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EACtD;AAAA,EAEA,UAAU,MAA4B;AACpC,UAAM,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACvD,WAAO,KAAK,KAAK,EAAE,UAAU;AAAA,MAAO,CAAC,MACnC,EAAE,KAAK,KAAK,CAAC,MAAM,OAAO,IAAI,EAAE,YAAY,CAAC,CAAC;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAkC;AAChD,UAAM,QAAQ,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC5D,WAAO,KAAK,KAAK,EAAE,UAAU;AAAA,MAAO,CAAC,MACnC,EAAE,YAAY,KAAK,CAAC,MAAM,MAAM,IAAI,EAAE,YAAY,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,UAAU,OAA2B;AACnC,UAAM,YAAY,KAAK,KAAK,EAAE;AAC9B,WAAO,CAAC,GAAG,SAAS,EACjB,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAChF,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EAEA,YAAY,OAA2B;AACrC,UAAM,YAAY,KAAK,KAAK,EAAE;AAC9B,WAAO,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK;AAAA,EAC9E;AAAA,EAEA,iBAAiB,OAA2B;AAC1C,UAAM,YAAY,KAAK,KAAK,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,kBAAkB,MAAS;AACnF,WAAO,CAAC,GAAG,SAAS,EACjB,KAAK,CAAC,GAAG,OAAO,EAAE,iBAAiB,MAAM,EAAE,iBAAiB,EAAE,EAC9D,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EAEA,kBAAkB,IAAkB;AAClC,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,WAAW,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEvD,QAAI,UAAU;AACZ,eAAS,YAAY;AACrB,eAAS,YAAW,oBAAI,KAAK,GAAE,YAAY;AAC3C,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,iBAAiB,IAAY,eAA6B;AACxD,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,WAAW,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEvD,QAAI,UAAU;AACZ,eAAS,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,aAAa,CAAC;AACjE,eAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO,OAA2B;AAChC,UAAM,aAAa,MAAM,YAAY;AACrC,UAAM,aAAa,WAAW,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAErE,WAAO,KAAK,KAAK,EAAE,UAAU,OAAO,CAAC,MAAM;AACzC,YAAM,aAAa,EAAE,MAAM,YAAY,EAAE,SAAS,UAAU;AAC5D,YAAM,eAAe,EAAE,QAAQ,YAAY,EAAE,SAAS,UAAU;AAChE,YAAM,WAAW,EAAE,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,UAAU,CAAC;AACxE,YAAM,YAAY,WAAW;AAAA,QAC3B,CAAC,SACC,EAAE,MAAM,YAAY,EAAE,SAAS,IAAI,KACnC,EAAE,QAAQ,YAAY,EAAE,SAAS,IAAI;AAAA,MACzC;AAEA,aAAO,cAAc,gBAAgB,YAAY;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK,KAAK,EAAE,UAAU;AAAA,EAC/B;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAkB;AAChB,WAAOT,aAAW,KAAK,QAAQ;AAAA,EACjC;AAAA,EAEA,WAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;;;ACjNA,SAAS,cAAAU,cAAY,aAAAC,aAAW,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAC9B,SAAS,SAASC,YAAW,aAAaC,sBAAqB;AAGxD,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACT,OAA2B;AAAA,EAEnC,YAAY,UAAkB,YAAY,OAAO;AAK/C,SAAK,WAAWF,OAAK,UAAU,aAAa,UAAU,YAAY;AAAA,EACpE;AAAA,EAEQ,YAAkB;AACxB,UAAM,MAAMD,SAAQ,KAAK,QAAQ;AACjC,QAAI,CAACJ,aAAW,GAAG,GAAG;AACpB,MAAAC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,OAAoB;AAC1B,QAAI,KAAK,KAAM,QAAO,KAAK;AAE3B,QAAID,aAAW,KAAK,QAAQ,GAAG;AAC7B,UAAI;AACF,cAAM,UAAUE,eAAa,KAAK,UAAU,OAAO;AACnD,aAAK,OAAOI,WAAU,OAAO;AAAA,MAC/B,QAAQ;AACN,aAAK,OAAO,KAAK,YAAY;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,WAAK,OAAO,KAAK,YAAY;AAAA,IAC/B;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,cAA2B;AACjC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,SAAS,CAAC;AAAA,MACV,MAAM,CAAC;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,OAAa;AACnB,SAAK,UAAU;AACf,QAAI,KAAK,MAAM;AACb,WAAK,KAAK,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjD;AACA,UAAM,UAAUC,eAAc,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC;AACzD,IAAAJ,gBAAc,KAAK,UAAU,SAAS,OAAO;AAAA,EAC/C;AAAA,EAEQ,gBAAgB,MAAwB;AAE9C,UAAM,YAAY,oBAAI,IAAI;AAAA,MACxB;AAAA,MAAK;AAAA,MAAM;AAAA,MAAO;AAAA,MAAO;AAAA,MAAM;AAAA,MAAO;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC9D;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM;AAAA,MAC9D;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAO;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAQ;AAAA,MAC5D;AAAA,MAAS;AAAA,MAAU;AAAA,MAAO;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAQ;AAAA,MAC1D;AAAA,MAAS;AAAA,MAAS;AAAA,MAAM;AAAA,MAAO;AAAA,MAAK;AAAA,MAAO;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAM;AAAA,IACjE,CAAC;AAED,UAAM,QAAQ,KACX,YAAY,EACZ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,KAAK,EACX,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;AAE3D,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,EAC3B;AAAA,EAEA,cAAc,UAA0B;AACtC,UAAM,OAAO,KAAK,KAAK;AAGvB,UAAM,gBAAgB,KAAK,gBAAgB,SAAS,KAAK;AACzD,UAAM,kBAAkB,KAAK,gBAAgB,SAAS,OAAO;AAC7D,UAAM,cAAc,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,eAAe,GAAG,eAAe,CAAC,CAAC;AAGvE,eAAW,WAAW,aAAa;AACjC,UAAI,CAAC,KAAK,QAAQ,OAAO,GAAG;AAC1B,aAAK,QAAQ,OAAO,IAAI,CAAC;AAAA,MAC3B;AACA,UAAI,CAAC,KAAK,QAAQ,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;AAChD,aAAK,QAAQ,OAAO,EAAE,KAAK,SAAS,EAAE;AAAA,MACxC;AAAA,IACF;AAGA,eAAW,OAAO,SAAS,MAAM;AAC/B,YAAM,gBAAgB,IAAI,YAAY;AACtC,UAAI,CAAC,KAAK,KAAK,aAAa,GAAG;AAC7B,aAAK,KAAK,aAAa,IAAI,CAAC;AAAA,MAC9B;AACA,UAAI,CAAC,KAAK,KAAK,aAAa,EAAE,SAAS,SAAS,EAAE,GAAG;AACnD,aAAK,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE;AAAA,MAC3C;AAAA,IACF;AAGA,QAAI,SAAS,YAAY;AACvB,iBAAW,aAAa,SAAS,YAAY;AAC3C,cAAM,eAAe,UAAU,YAAY;AAC3C,YAAI,CAAC,KAAK,KAAK,YAAY,GAAG;AAC5B,eAAK,KAAK,YAAY,IAAI,CAAC;AAAA,QAC7B;AACA,YAAI,CAAC,KAAK,KAAK,YAAY,EAAE,SAAS,SAAS,EAAE,GAAG;AAClD,eAAK,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,eAAe,YAA0B;AACvC,UAAM,OAAO,KAAK,KAAK;AAGvB,eAAW,WAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AAC/C,WAAK,QAAQ,OAAO,IAAI,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,OAAO,OAAO,UAAU;AAC9E,UAAI,KAAK,QAAQ,OAAO,EAAE,WAAW,GAAG;AACtC,eAAO,KAAK,QAAQ,OAAO;AAAA,MAC7B;AAAA,IACF;AAGA,eAAW,OAAO,OAAO,KAAK,KAAK,IAAI,GAAG;AACxC,WAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,OAAO,CAAC,OAAO,OAAO,UAAU;AAChE,UAAI,KAAK,KAAK,GAAG,EAAE,WAAW,GAAG;AAC/B,eAAO,KAAK,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,iBAAiB,OAAyB;AACxC,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAE3C,QAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAGnC,UAAM,cAAc,oBAAI,IAAoB;AAE5C,eAAW,WAAW,UAAU;AAE9B,UAAI,KAAK,QAAQ,OAAO,GAAG;AACzB,mBAAW,MAAM,KAAK,QAAQ,OAAO,GAAG;AACtC,sBAAY,IAAI,KAAK,YAAY,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QACpD;AAAA,MACF;AAGA,iBAAW,CAAC,SAAS,GAAG,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAEzD,YAAI,YAAY,QAAS;AACzB,YAAI,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,OAAO,GAAG;AAC1D,qBAAW,MAAM,KAAK;AACpB,wBAAY,IAAI,KAAK,YAAY,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,WAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAAA,EACrB;AAAA,EAEA,aAAa,MAA0B;AACrC,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,iBAAiB,KAAK,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAEtD,UAAM,cAAc,oBAAI,IAAoB;AAE5C,eAAW,OAAO,gBAAgB;AAChC,UAAI,KAAK,KAAK,GAAG,GAAG;AAClB,mBAAW,MAAM,KAAK,KAAK,GAAG,GAAG;AAC/B,sBAAY,IAAI,KAAK,YAAY,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAGA,WAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAAA,EACrB;AAAA,EAEA,OAAO,OAAe,MAA2B;AAC/C,UAAM,iBAAiB,KAAK,iBAAiB,KAAK;AAClD,UAAM,aAAa,OAAO,KAAK,aAAa,IAAI,IAAI,CAAC;AAErD,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,IAAI,IAAI,cAAc;AACzC,UAAM,SAAS,IAAI,IAAI,UAAU;AAEjC,UAAM,OAAiB,CAAC;AACxB,UAAM,cAAwB,CAAC;AAC/B,UAAM,UAAoB,CAAC;AAE3B,eAAW,MAAM,gBAAgB;AAC/B,UAAI,OAAO,IAAI,EAAE,GAAG;AAClB,aAAK,KAAK,EAAE;AAAA,MACd,OAAO;AACL,oBAAY,KAAK,EAAE;AAAA,MACrB;AAAA,IACF;AAEA,eAAW,MAAM,YAAY;AAC3B,UAAI,CAAC,WAAW,IAAI,EAAE,GAAG;AACvB,gBAAQ,KAAK,EAAE;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO;AAAA,EAC7C;AAAA,EAEA,aAAuB;AACrB,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO,OAAO,KAAK,KAAK,IAAI,EAAE,KAAK;AAAA,EACrC;AAAA,EAEA,eAAuC;AACrC,UAAM,OAAO,KAAK,KAAK;AACvB,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,IAAI,GAAG;AAClD,aAAO,GAAG,IAAI,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAA6B;AAExC,SAAK,OAAO,KAAK,YAAY;AAG7B,eAAW,YAAY,WAAW;AAChC,WAAK,cAAc,QAAQ;AAAA,IAC7B;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAkB;AAChB,WAAOH,aAAW,KAAK,QAAQ;AAAA,EACjC;AAAA,EAEA,WAAoE;AAClE,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO;AAAA,MACL,UAAU,OAAO,KAAK,KAAK,OAAO,EAAE;AAAA,MACpC,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE;AAAA,MAC7B,aAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;;;ACxRA,SAAS,cAAAQ,cAAY,aAAAC,mBAAiB;AACtC,SAAS,QAAAC,cAAY;AACrB,SAAS,WAAAC,gBAAe;AAYjB,SAAS,eAAe,aAAkC;AAC/D,QAAM,mBAAmBD,OAAK,aAAa,aAAa,QAAQ;AAChE,QAAM,kBAAkBA,OAAKC,SAAQ,GAAG,aAAa,QAAQ;AAE7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkBD,OAAK,kBAAkB,mBAAmB;AAAA,IAC5D,eAAeA,OAAK,kBAAkB,gBAAgB;AAAA,IACtD,WAAWA,OAAK,kBAAkB,YAAY;AAAA,IAC9C,qBAAqBA,OAAK,iBAAiB,aAAa;AAAA,IACxD,iBAAiBA,OAAK,iBAAiB,YAAY;AAAA,EACrD;AACF;AAEO,SAAS,0BAA0B,aAAkC;AAC1E,QAAM,QAAQ,eAAe,WAAW;AAGxC,MAAI,CAACF,aAAW,MAAM,gBAAgB,GAAG;AACvC,IAAAC,YAAU,MAAM,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAAA,EACvD;AAGA,MAAI,CAACD,aAAW,MAAM,eAAe,GAAG;AACtC,IAAAC,YAAU,MAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,aAA8B;AAClE,QAAM,QAAQ,eAAe,WAAW;AACxC,SAAOD,aAAW,MAAM,gBAAgB;AAC1C;AAEO,SAAS,8BAAuC;AACrD,QAAM,kBAAkBE,OAAKC,SAAQ,GAAG,aAAa,QAAQ;AAC7D,SAAOH,aAAW,eAAe;AACnC;AAYO,SAAS,gBAAgB,aAAmC;AACjE,QAAM,QAAQ,eAAe,WAAW;AAExC,SAAO;AAAA,IACL,qBAAqBA,aAAW,MAAM,gBAAgB;AAAA,IACtD,oBAAoBA,aAAW,MAAM,eAAe;AAAA,IACpD,iBAAiBA,aAAW,MAAM,gBAAgB;AAAA,IAClD,cAAcA,aAAW,MAAM,aAAa;AAAA,IAC5C,oBAAoBA,aAAW,MAAM,mBAAmB;AAAA,IACxD,UAAUA,aAAW,MAAM,SAAS;AAAA,IACpC,gBAAgBA,aAAW,MAAM,eAAe;AAAA,EAClD;AACF;;;ACVA,IAAM,iBAA0E;AAAA,EAC9E,cAAc;AAAA,EACd,mBAAmB;AAAA;AAAA,EACnB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,eAAe;AAAA,EACf,kBAAkB;AACpB;AAOO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EAGA,eAA0B;AAAA,EAC1B;AAAA,EACA,gBAA8C,oBAAI,IAAI;AAAA,EAE9D,YAAY,aAAqB,WAAoB,QAA+B;AAClF,SAAK,QAAQ,IAAI,iBAAiB,aAAa,SAAS;AACxD,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAwB;AAC/B,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAyB;AACpC,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAA4C;AAElD,QAAI,CAAC,KAAK,cAAc,KAAK,GAAG;AAC9B,aAAO;AAAA,IACT;AAGA,UAAM,kBAAkB,KAAK,cAAc,KAAK;AAGhD,UAAM,UAAU,KAAK,eAAe,KAAK;AAGzC,UAAM,YAAY,KAAK,eAAe,KAAK;AAG3C,QAAI,YAAY,KAAK,OAAO,cAAc;AACxC,aAAO;AAAA,IACT;AAGA,WAAO,KAAK,MAAM,IAAI,iBAAiB,SAAS,KAAK,cAAc,SAAS;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAkE;AAChE,WAAO,CAAC,kBAA0C;AAChD,YAAM,kBAAkB,KAAK,qBAAqB,aAAa;AAC/D,UAAI,iBAAiB;AACnB,aAAK,QAAQ,eAAe;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAuD;AAClF,UAAM,YAAY;AAAA,MAChB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,IAClB;AAEA,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,SAAS,iBAAiB,MAAM,cAAc,SAAY,MAAM,YAAY,IAAI,EAAE,OAAO,MAAM,cAAc,GAAG;AAAA,QAClH;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,WAAW,UAAU;AAC7B,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,MAAM;AAAA,YACN,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,UACjB;AAAA,QACF;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,QAAQ,MAAM;AAAA,UACd,SAAS,kBAAkB,MAAM,cAAc,SAAY,MAAM,YAAY,IAAI,EAAE,OAAO,MAAM,cAAc,GAAG;AAAA,QACnH;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,QACjB;AAAA,MAEF,KAAK;AACH,cAAM,SAAS,MAAM,SAAS,SAAS,QAAQ;AAC/C,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM,SAAS,wBAAwB;AAAA,UACvC,SAAS,MAAM;AAAA,UACf,OAAO,SAAS,SAAY,MAAM;AAAA,QACpC;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,OAAO,MAAM,WAAW,WAAW,MAAM,UAAU;AAAA,QACrD;AAAA,MAEF;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAiB,SAAqC;AAC3E,WAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAe,SAAiB,QAAqC;AAC/E,UAAM,QAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,iBAAiB,KAAK;AAC5C,SAAK,cAAc,IAAI,UAAU,KAAK;AAEtC,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAkB,SAAiB,cAA2C;AAC3F,UAAM,QAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT;AAGA,QAAI,cAAc;AAChB,YAAM,WAAW,KAAK,iBAAiB,YAAY;AACnD,WAAK,cAAc,OAAO,QAAQ;AAAA,IACpC;AAEA,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAkB,SAAmB,SAAqC;AACvF,WAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,SAAS,aAAa,QAAQ,cAAc,QAAQ,KAAK,IAAI,CAAC,eAAe,OAAO;AAAA,IACtF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,WAAmB,OAAsC;AAC5E,SAAK,mBAAmB;AACxB,SAAK,eAAe;AAEpB,WAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,SAAS,+BAA+B,SAAS,iBAAiB,KAAK;AAAA,IACzE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,QAAqC;AACxD,WAAO,KAAK,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,SAAS,UAAU;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAiC;AACrD,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,KAAK,OAAO;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,OAAO;AAAA,MACrB,KAAK;AACH,eAAO,KAAK,OAAO;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,OAAO;AAAA,MACrB,KAAK;AACH,eAAO,KAAK,OAAO;AAAA,MACrB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAyC;AAC7D,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAA4C;AACjE,UAAM,UAA8B;AAAA,MAClC,QAAQ,KAAK,qBAAqB,KAAK;AAAA,MACvC,SAAS,MAAM,WAAW,KAAK,gBAAgB,KAAK;AAAA,IACtD;AAEA,QAAI,MAAM,QAAQ;AAChB,cAAQ,SAAS,MAAM;AAAA,IACzB;AAEA,QAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,cAAQ,QAAQ,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,OAAO;AACf,cAAQ,QAAQ,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,SAAS,sBAAsB,MAAM,QAAQ;AACrD,cAAQ,WAAW,MAAM;AAAA,IAC3B;AAGA,YAAQ,OAAO,KAAK,aAAa,KAAK;AAEtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAgC;AAC3D,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,iBAAiB,MAAM,YAAY,SAAS;AAAA,MACrD,KAAK;AACH,eAAO,mBAAmB,MAAM,YAAY,SAAS;AAAA,MACvD,KAAK;AACH,eAAO,gBAAgB,MAAM,YAAY,SAAS;AAAA,MACpD,KAAK;AACH,eAAO,eAAe,MAAM,YAAY,SAAS;AAAA,MACnD,KAAK;AACH,eAAO,kBAAkB,MAAM,YAAY,SAAS;AAAA,MACtD,KAAK;AACH,eAAO,wBAAwB,MAAM,YAAY,SAAS;AAAA,MAC5D,KAAK;AACH,eAAO,wBAAwB,MAAM,YAAY,SAAS;AAAA,MAC5D,KAAK;AACH,eAAO,mBAAmB,MAAM,OAAO,KAAK,IAAI,KAAK,SAAS;AAAA,MAChE,KAAK;AACH,eAAO,UAAU,MAAM,OAAO,MAAM,GAAG,GAAG,KAAK,SAAS;AAAA,MAC1D,KAAK;AACH,eAAO,qBAAqB,MAAM,QAAQ,MAAM,GAAG,GAAG,KAAK,SAAS;AAAA,MACtE,KAAK;AACH,eAAO,kBAAkB,MAAM,aAAa,SAAS;AAAA,MACvD,KAAK;AACH,eAAO,oBAAoB,MAAM,aAAa,SAAS;AAAA,MACzD,KAAK;AACH,eAAO,iBAAiB,MAAM,aAAa,SAAS;AAAA,MACtD;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAgC;AACtD,UAAM,QAAkB,CAAC;AAEzB,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,UAAU,MAAM,SAAS,EAAE;AAAA,IACxC;AAEA,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,SAAS,MAAM,QAAQ,EAAE;AAAA,IACtC;AAEA,QAAI,MAAM,YAAY;AACpB,YAAM,KAAK,WAAW,MAAM,UAAU,EAAE;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,KAAK,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAkC;AACrD,UAAM,OAAiB,CAAC;AAGxB,SAAK,KAAK,MAAM,KAAK,QAAQ,MAAM,GAAG,CAAC;AAGvC,QAAI,MAAM,WAAW;AACnB,WAAK,KAAK,MAAM,UAAU,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC;AAAA,IACrE;AAGA,QAAI,MAAM,OAAO;AACf,UAAI,MAAM,MAAM,YAAY,EAAE,SAAS,MAAM,EAAG,MAAK,KAAK,YAAY;AACtE,UAAI,MAAM,MAAM,YAAY,EAAE,SAAS,QAAQ,EAAG,MAAK,KAAK,SAAS;AACrE,UAAI,MAAM,MAAM,YAAY,EAAE,SAAS,MAAM,KAAK,MAAM,MAAM,YAAY,EAAE,SAAS,WAAW;AAC9F,aAAK,KAAK,YAAY;AACxB,UAAI,MAAM,MAAM,YAAY,EAAE,SAAS,OAAO,KAAK,MAAM,MAAM,YAAY,EAAE,SAAS,OAAO;AAC3F,aAAK,KAAK,OAAO;AAAA,IACrB;AAGA,QAAI,MAAM,OAAO;AACf,iBAAW,QAAQ,MAAM,OAAO;AAC9B,YAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,EAAG,MAAK,KAAK,YAAY;AACzE,YAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,EAAG,MAAK,KAAK,YAAY;AACzE,YAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,EAAG,MAAK,KAAK,QAAQ;AACvE,YAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,EAAG,MAAK,KAAK,SAAS;AACvE,YAAI,KAAK,SAAS,WAAW,EAAG,MAAK,KAAK,YAAY;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAgC;AAErD,QAAI,KAAK,OAAO,iBAAiB;AAC/B,aAAO,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAC1C;AAGA,QAAI,QAAQ;AAEZ,YAAQ,MAAM,MAAM;AAAA;AAAA,MAElB,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF,KAAK;AACH,gBAAQ;AAER,YAAI,MAAM,OAAO;AACf,gBAAM,WAAW,KAAK,iBAAiB,MAAM,KAAK;AAClD,cAAI,KAAK,cAAc,IAAI,QAAQ,GAAG;AACpC,oBAAQ;AAAA,UACV;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF,KAAK;AACH,gBAAQ;AACR;AAAA;AAAA,MAGF,KAAK;AACH,gBAAQ;AAER,YAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,kBAAQ;AAAA,QACV;AACA;AAAA,MAEF,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA;AAAA,MAGF,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF,KAAK;AACH,gBAAQ;AACR;AAAA,MAEF;AACE,gBAAQ;AAAA,IACZ;AAGA,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;AAC/C,eAAS;AAAA,IACX;AAEA,QAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,eAAS;AAAA,IACX;AAGA,WAAO,KAAK,IAAI,OAAO,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAAuB;AAE9C,WAAO,MACJ,YAAY,EACZ,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,EAAE,EACpB,QAAQ,QAAQ,GAAG,EACnB,MAAM,GAAG,GAAG;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAiC;AAC/B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC5B,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAM;AACjB,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;AAKO,SAAS,qBACd,aACA,WACA,QACgB;AAChB,SAAO,IAAI,eAAe,aAAa,WAAW,MAAM;AAC1D;;;ACxlBO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB,UAAsC,CAAC,GAAG;AAEzE,SAAK,WAAW,IAAI,eAAe,aAAa,QAAQ,WAAW,QAAQ,YAAY;AAGvF,QAAI,QAAQ,cAAc;AACxB,WAAK,SAAS,SAAS,QAAQ,YAAY;AAAA,IAC7C;AAGA,SAAK,uBAAuB,QAAQ;AAGpC,UAAM,2BAAsD,CAAC,UAAkC;AAE7F,YAAM,mBAAmB,KAAK,SAAS,uBAAuB;AAC9D,uBAAiB,KAAK;AAGtB,UAAI,KAAK,sBAAsB;AAC7B,aAAK,qBAAqB,KAAK;AAAA,MACjC;AAAA,IACF;AAGA,SAAK,SAAS,sBAAsB,aAAa;AAAA,MAC/C,mBAAmB,QAAQ;AAAA,MAC3B,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,OACA,UAA4B,CAAC,GACgB;AAE7C,SAAK,SAAS,aAAa,MAAM,IAAI;AAGrC,QAAI,QAAQ,OAAO;AACjB,WAAK,SAAS,SAAS,QAAQ,KAAK;AAAA,IACtC;AAGA,SAAK,SAAS,qBAAqB,MAAM,MAAM,QAAQ,SAAS,aAAa;AAE7E,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO;AAGvD,UAAI,OAAO,cAAc,SAAS,GAAG;AACnC,aAAK,SAAS;AAAA,UACZ,OAAO;AAAA,UACP,gCAAgC,MAAM,IAAI;AAAA,QAC5C;AAAA,MACF;AAGA,UAAI,OAAO,OAAO;AAChB,aAAK,SAAS,YAAY,OAAO,OAAO,UAAU,MAAM,IAAI,UAAU;AAAA,MACxE;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,WAAK,SAAS,YAAY,cAAc,kCAAkC,MAAM,IAAI,aAAa;AACjG,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAe,SAAiB,QAAuB;AACjE,SAAK,SAAS,YAAY,OAAO,SAAS,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAkB,SAAiB,cAA6B;AAC7E,SAAK,SAAS,eAAe,UAAU,SAAS,YAAY;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAiB,SAAuB;AAC7D,SAAK,SAAS,uBAAuB,OAAO,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAkB,SAAmB,SAAuB;AACzE,SAAK,SAAS,eAAe,UAAU,SAAS,OAAO;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAiB;AACf,UAAM,SAAS,KAAK,OAAO,MAAM;AACjC,QAAI,QAAQ;AACV,WAAK,SAAS,qBAAqB;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,cAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA2E;AACzE,WAAO,KAAK,OAAO,kBAAkB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC5B,WAAO,KAAK,SAAS,oBAAoB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAiE;AAC/D,WAAO,KAAK,SAAS,gBAAgB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0B;AACxB,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;AAKO,SAAS,0BACd,aACA,SACqB;AACrB,SAAO,IAAI,oBAAoB,aAAa,OAAO;AACrD;AAKO,SAAS,+BACd,aACA,kBACA,cACA,WACmE;AACnE,QAAM,WAAW,IAAI,eAAe,aAAa,WAAW,YAAY;AACxE,QAAM,mBAAmB,SAAS,uBAAuB;AAEzD,QAAM,kBAA6C,CAAC,UAAkC;AACpF,qBAAiB,KAAK;AACtB,QAAI,kBAAkB;AACpB,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,iBAAiB,SAAS;AAC/C;;;ACnOA,SAAS,WAAAI,gBAAe;AAkDxB,IAAM,8BAA4D;AAAA,EAChE,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,gBAAgB,CAAC;AAAA,EACjB,aAAa;AACf;AAsBO,IAAM,sBAAN,MAAuD;AAAA,EAC5D,UAAgC;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SACJ,cACA,UAA8B,CAAC,GACH;AAC5B,UAAM,OAAO,EAAE,GAAG,6BAA6B,GAAG,QAAQ;AAG1D,UAAM,WAAW,KAAK,sBAClB,eACA,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE;AAEhD,QAAI,SAAS,SAAS,KAAK,iBAAiB;AAC1C,aAAO;AAAA,QACL,WAAW,CAAC;AAAA,QACZ,yBAAyB,CAAC;AAAA,QAC1B,uBAAuB,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACnD,OAAO;AAAA,UACL,YAAY,aAAa;AAAA,UACzB,aAAa;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAkC,CAAC;AACzC,UAAM,eAAyB,CAAC;AAGhC,UAAM,SAAS,KAAK,YAAY,QAAQ;AAGxC,UAAM,yBAAyB,KAAK,0BAA0B,QAAQ,IAAI;AAC1E,cAAU,KAAK,GAAG,uBAAuB,SAAS;AAClD,iBAAa,KAAK,GAAG,uBAAuB,YAAY;AAGxD,UAAM,oBAAoB,KAAK,wBAAwB,QAAQ,IAAI;AACnE,cAAU,KAAK,GAAG,kBAAkB,SAAS;AAC7C,iBAAa,KAAK,GAAG,kBAAkB,YAAY;AAGnD,UAAM,sBAAsB,KAAK,0BAA0B,QAAQ,IAAI;AACvE,cAAU,KAAK,GAAG,oBAAoB,SAAS;AAC/C,iBAAa,KAAK,GAAG,oBAAoB,YAAY;AAGrD,UAAM,qBAAqB,KAAK,yBAAyB,QAAQ,IAAI;AACrE,cAAU,KAAK,GAAG,mBAAmB,SAAS;AAC9C,iBAAa,KAAK,GAAG,mBAAmB,YAAY;AAGpD,UAAM,iBAAiB,UACpB,OAAO,CAAC,MAAM,EAAE,cAAc,KAAK,aAAa,EAChD,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,MAAM,GAAG,KAAK,YAAY;AAG7B,QAAI,KAAK,eAAe,SAAS,GAAG;AAClC,iBAAW,YAAY,gBAAgB;AACrC,iBAAS,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,MAAM,GAAG,KAAK,cAAc,CAAC,CAAC;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,aAAa,aAChB,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,OAAO,CAAC,OAAO,CAAC,aAAa,SAAS,EAAE,CAAC;AAE5C,WAAO;AAAA,MACL,WAAW;AAAA,MACX,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,MACvB,OAAO;AAAA,QACL,YAAY,aAAa;AAAA,QACzB,aAAa,eAAe;AAAA,QAC5B,kBAAkB,aAAa,SAAS,IAAI,eAAe,SAAS,aAAa,SAAS;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,cAAkE;AACpF,UAAM,SAAS,oBAAI,IAAoC;AACvD,eAAW,OAAO,cAAc;AAC9B,YAAM,WAAW,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC;AAC1C,eAAS,KAAK,GAAG;AACjB,aAAO,IAAI,IAAI,MAAM,QAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,0BACN,QACA,OAC6D;AAC7D,UAAM,SAAS,OAAO,IAAI,OAAO,KAAK,CAAC;AACvC,UAAM,YAAY,OAAO,IAAI,UAAU,KAAK,CAAC;AAC7C,UAAM,YAAkC,CAAC;AACzC,UAAM,eAAyB,CAAC;AAGhC,eAAW,SAAS,QAAQ;AAC1B,YAAM,YAAY,MAAM,QAAQ,SAAS,MAAM,QAAQ;AACvD,YAAM,mBAAmB,UAAU,KAAK,CAAC,MAAM;AAC7C,cAAM,kBAAkB,EAAE,QAAQ,SAAS,YAAY,KAAK;AAC5D,cAAM,iBAAiB,EAAE,QAAQ,QAAQ,YAAY,KAAK;AAC1D,cAAM,aAAa,UAAU,YAAY;AAGzC,cAAM,kBAAkB,KAAK,mBAAmB,YAAY,eAAe,KACnD,KAAK,mBAAmB,YAAY,cAAc;AAC1E,YAAI,CAAC,iBAAiB;AACpB,iBAAO;AAAA,QACT;AAGA,cAAM,sBAAsB,gBAAgB,SAAS,KAAK,KAC9B,gBAAgB,SAAS,SAAS,KAClC,gBAAgB,SAAS,UAAU,KACnC,eAAe,SAAS,KAAK,KAC7B,eAAe,SAAS,SAAS;AAG7D,eAAO,uBAAuB,KAAK,wBAAwB,YAAY,eAAe;AAAA,MACxF,CAAC;AAED,UAAI,kBAAkB;AACpB,cAAM,QAAQ,KAAK,cAAc,oBAAoB,SAAS;AAC9D,cAAM,UAAU,KAAK,2BAA2B,OAAO,gBAAgB;AACvE,cAAM,OAAO,KAAK,YAAY,CAAC,OAAO,gBAAgB,CAAC;AAEvD,kBAAU,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,UACvC,UAAU,CAAC,kBAAkB,WAAW;AAAA,UACxC,YAAY;AAAA,UACZ,sBAAsB,CAAC,MAAM,IAAI,iBAAiB,EAAE;AAAA,QACtD,CAAC;AAED,qBAAa,KAAK,MAAM,IAAI,iBAAiB,EAAE;AAAA,MACjD,WAAW,MAAM,QAAQ,OAAO;AAE9B,cAAM,QAAQ,KAAK,cAAc,iBAAiB,SAAS;AAC3D,cAAM,UAAU,KAAK,6BAA6B,KAAK;AACvD,cAAM,OAAO,KAAK,YAAY,CAAC,KAAK,CAAC;AAErC,kBAAU,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,UACvC,UAAU,CAAC,gBAAgB;AAAA,UAC3B,YAAY;AAAA,UACZ,sBAAsB,CAAC,MAAM,EAAE;AAAA,QACjC,CAAC;AAED,qBAAa,KAAK,MAAM,EAAE;AAAA,MAC5B;AAAA,IACF;AAGA,eAAW,YAAY,WAAW;AAChC,UAAI,CAAC,aAAa,SAAS,SAAS,EAAE,GAAG;AACvC,cAAM,QAAQ,KAAK,cAAc,YAAY,SAAS,QAAQ,MAAM;AACpE,cAAM,UAAU,KAAK,sBAAsB,QAAQ;AACnD,cAAM,OAAO,KAAK,YAAY,CAAC,QAAQ,CAAC;AAExC,kBAAU,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,UACvC,UAAU,CAAC,kBAAkB;AAAA,UAC7B,YAAY;AAAA,UACZ,sBAAsB,CAAC,SAAS,EAAE;AAAA,QACpC,CAAC;AAED,qBAAa,KAAK,SAAS,EAAE;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,aAAa;AAAA,EACnC;AAAA,EAEQ,wBACN,QACA,OAC6D;AAC7D,UAAM,YAAY,OAAO,IAAI,UAAU,KAAK,CAAC;AAC7C,UAAM,YAAkC,CAAC;AACzC,UAAM,eAAyB,CAAC;AAEhC,eAAW,YAAY,WAAW;AAChC,YAAM,QAAQ,KAAK,cAAc,YAAY,SAAS,QAAQ,MAAM;AACpE,YAAM,UAAU,KAAK,sBAAsB,QAAQ;AACnD,YAAM,OAAO,KAAK,YAAY,CAAC,QAAQ,CAAC;AAExC,gBAAU,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,QACvC,UAAU,CAAC,mBAAmB,cAAc;AAAA,QAC5C,YAAY;AAAA,QACZ,sBAAsB,CAAC,SAAS,EAAE;AAAA,MACpC,CAAC;AAED,mBAAa,KAAK,SAAS,EAAE;AAAA,IAC/B;AAEA,WAAO,EAAE,WAAW,aAAa;AAAA,EACnC;AAAA,EAEQ,0BACN,QACA,OAC6D;AAC7D,UAAM,cAAc,OAAO,IAAI,aAAa,KAAK,CAAC;AAClD,UAAM,YAAkC,CAAC;AACzC,UAAM,eAAyB,CAAC;AAGhC,UAAM,eAAe,oBAAI,IAA2B;AACpD,eAAW,UAAU,aAAa;AAChC,YAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC;AACvC,YAAM,UAAU,KAAK,eAAe,KAAK;AACzC,YAAM,WAAW,aAAa,IAAI,OAAO,KAAK,CAAC;AAC/C,eAAS,KAAK,MAAM;AACpB,mBAAa,IAAI,SAAS,QAAQ;AAAA,IACpC;AAGA,eAAW,CAAC,SAAS,OAAO,KAAK,cAAc;AAC7C,UAAI,QAAQ,UAAU,KAAK,QAAQ,KAAK,CAAC,OAAO,EAAE,QAAQ,OAAO,UAAU,KAAK,CAAC,GAAG;AAClF,cAAM,QAAQ,8BAA8B,OAAO;AACnD,cAAM,UAAU,KAAK,wBAAwB,OAAO;AACpD,cAAM,OAAO,KAAK,YAAY,OAAO;AAErC,kBAAU,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,UACvC,UAAU,CAAC,qBAAqB,gBAAgB;AAAA,UAChD,YAAY;AAAA,UACZ,sBAAsB,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QAC/C,CAAC;AAED,qBAAa,KAAK,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,aAAa;AAAA,EACnC;AAAA,EAEQ,yBACN,QACA,OAC6D;AAC7D,UAAM,WAAW,OAAO,IAAI,UAAU,KAAK,CAAC;AAC5C,UAAM,cAAc,OAAO,IAAI,YAAY,KAAK,CAAC;AACjD,UAAM,YAAkC,CAAC;AACzC,UAAM,eAAyB,CAAC;AAGhC,UAAM,SAAS,CAAC,GAAG,UAAU,GAAG,WAAW;AAC3C,QAAI,OAAO,UAAU,GAAG;AAEtB,YAAM,iBAAiB,oBAAI,IAA2B;AACtD,iBAAW,OAAO,QAAQ;AACxB,cAAM,aAAa,KAAK,cAAc,IAAI,QAAQ,MAAM;AACxD,cAAM,WAAW,eAAe,IAAI,UAAU,KAAK,CAAC;AACpD,iBAAS,KAAK,GAAG;AACjB,uBAAe,IAAI,YAAY,QAAQ;AAAA,MACzC;AAEA,iBAAW,CAAC,YAAY,YAAY,KAAK,gBAAgB;AACvD,YAAI,aAAa,UAAU,GAAG;AAC5B,gBAAM,QAAQ,qBAAqB,UAAU;AAC7C,gBAAM,UAAU,KAAK,uBAAuB,YAAY;AACxD,gBAAM,OAAO,KAAK,YAAY,YAAY;AAE1C,oBAAU,KAAK;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,kBAAkB,IAAI;AAAA,YACvC,UAAU,CAAC,YAAY,YAAY;AAAA,YACnC,YAAY;AAAA,YACZ,sBAAsB,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,UACpD,CAAC;AAED,uBAAa,KAAK,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,aAAa;AAAA,EACnC;AAAA,EAEQ,cAAc,QAAgB,MAAsB;AAE1D,UAAM,UAAU,KACb,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACR,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACrD,WAAO,GAAG,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,EAAE;AAAA,EAC1C;AAAA,EAEQ,2BAA2B,OAAoB,UAA+B;AACpF,WAAO;AAAA,EACT,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM;AAAA;AAAA,eAE9B,MAAM,QAAQ,OAAO;AAAA;AAAA;AAAA,EAGlC,SAAS,QAAQ,YAAY,SAAS,QAAQ,MAAM;AAAA;AAAA,0BAE5B,SAAS,QAAQ,OAAO;AAAA;AAAA;AAAA,EAGhD,CAAC,GAAI,MAAM,QAAQ,SAAS,CAAC,GAAI,GAAI,SAAS,QAAQ,SAAS,CAAC,CAAE,EAAE,KAAK,IAAI,KAAK,KAAK;AAAA;AAAA,EAEvF;AAAA,EAEQ,6BAA6B,OAA4B;AAC/D,WAAO;AAAA,EACT,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM;AAAA;AAAA,eAE9B,MAAM,QAAQ,OAAO;AAAA;AAAA;AAAA,EAGlC,MAAM,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC;AAAA,EAEQ,sBAAsB,UAA+B;AAC3D,WAAO;AAAA,EACT,SAAS,QAAQ,YAAY,SAAS,QAAQ,MAAM;AAAA;AAAA,eAEvC,SAAS,QAAQ,OAAO;AAAA;AAAA;AAAA,EAGrC,SAAS,QAAQ,UAAU,+BAA+B;AAAA;AAAA;AAAA,EAG1D,SAAS,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA;AAAA,EAE3C;AAAA,EAEQ,sBAAsB,UAA+B;AAC3D,WAAO;AAAA,EACT,SAAS,QAAQ,MAAM;AAAA;AAAA,eAEV,SAAS,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,SAAS,QAAQ,UAAU,sBAAsB;AAAA;AAAA,EAEjD;AAAA,EAEQ,wBAAwB,SAAgC;AAC9D,UAAM,WAAW,oBAAI,IAAY;AACjC,UAAM,WAAqB,CAAC;AAE5B,eAAW,UAAU,SAAS;AAC5B,iBAAW,QAAQ,OAAO,QAAQ,SAAS,CAAC,GAAG;AAC7C,iBAAS,IAAI,IAAI;AAAA,MACnB;AACA,UAAI,OAAO,QAAQ,SAAS;AAC1B,iBAAS,KAAK,KAAK,OAAO,QAAQ,OAAO,EAAE;AAAA,MAC7C;AAAA,IACF;AAEA,WAAO;AAAA,EACT,MAAM,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAG/B,SAAS,KAAK,IAAI,KAAK,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9C;AAAA,EAEQ,uBAAuB,cAAqC;AAClE,UAAM,UAAU,aACb,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE,EAClC,MAAM,GAAG,EAAE,EACX,KAAK,IAAI;AAEZ,WAAO;AAAA,EACT,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP;AAAA,EAEQ,YAAY,cAAuC;AACzD,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,OAAO,cAAc;AAC9B,iBAAW,OAAO,IAAI,QAAQ,QAAQ,CAAC,GAAG;AACxC,aAAK,IAAI,IAAI,YAAY,CAAC;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,kBAAkB,MAA0B;AAClD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,OAAO,CAAC,MAAM,WAAW,SAAS,EAAE,YAAY,CAAC,CAAC;AAAA,EAChE;AAAA,EAEQ,eAAe,OAAyB;AAC9C,QAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,UAAM,OAAO,MAAM,IAAI,CAAC,MAAM;AAC5B,YAAM,QAAQ,EAAE,MAAM,GAAG;AACzB,aAAO,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK;AAAA,IACzC,CAAC;AAED,UAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AACpC,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO,WAAW,CAAC;AAAA,IACrB;AAGA,UAAM,aAAa,MAAM,IAAI,CAAC,MAAM;AAClC,YAAM,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAClC,aAAO;AAAA,IACT,CAAC;AACD,UAAM,aAAa,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAE1C,WAAO,GAAG,WAAW,CAAC,CAAC,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA,EAEQ,cAAc,QAAwB;AAC5C,UAAM,cAAc,OAAO,YAAY;AACvC,QAAI,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,MAAM,EAAG,QAAO;AACzE,QAAI,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,QAAQ,EAAG,QAAO;AAC5E,QAAI,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,QAAQ,EAAG,QAAO;AAC3E,QAAI,YAAY,SAAS,QAAQ,KAAK,YAAY,SAAS,QAAQ,EAAG,QAAO;AAC7E,QAAI,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,QAAQ,EAAG,QAAO;AAC3E,QAAI,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,SAAS,EAAG,QAAO;AAC7E,QAAI,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,KAAK,EAAG,QAAO;AACzE,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,OAAe,OAAwB;AAEhE,UAAM,YAAY,CAAC,SAAiB,KAAK,YAAY,EAAE,QAAQ,cAAc,EAAE;AAC/E,UAAM,SAAS,MAAM,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC3E,UAAM,SAAS,IAAI,IAAI,MAAM,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACpF,WAAO,OAAO,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB,OAAe,OAAwB;AAErE,UAAM,YAAY,CAAC,SAAiB,KAAK,YAAY,EAAE,QAAQ,cAAc,EAAE;AAC/E,UAAM,SAAS,MAAM,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC3E,UAAM,SAAS,IAAI,IAAI,MAAM,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACpF,UAAM,aAAa,OAAO,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC,EAAE;AACvD,WAAO,cAAc;AAAA,EACvB;AACF;AAqBO,IAAM,qBAAN,MAAsD;AAAA,EACnD;AAAA,EAER,YAAY,QAA8B;AACxC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAgC;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SACJ,cACA,UAA8B,CAAC,GACH;AAC5B,UAAM,OAAO,EAAE,GAAG,6BAA6B,GAAG,QAAQ;AAG1D,UAAM,WAAW,KAAK,sBAClB,eACA,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE;AAEhD,QAAI,SAAS,SAAS,KAAK,iBAAiB;AAC1C,aAAO;AAAA,QACL,WAAW,CAAC;AAAA,QACZ,yBAAyB,CAAC;AAAA,QAC1B,uBAAuB,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACnD,OAAO;AAAA,UACL,YAAY,aAAa;AAAA,UACzB,aAAa;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,mBAAmB,KAAK,4BAA4B,QAAQ;AAGlE,UAAM,SAAS,KAAK,uBAAuB,kBAAkB,IAAI;AAEjE,QAAI;AAEF,YAAM,WAAW,MAAM,KAAK,QAAQ,MAAM;AAG1C,YAAM,YAAY,KAAK,iBAAiB,UAAU,QAAQ;AAG1D,YAAM,iBAAiB,UACpB,OAAO,CAAC,MAAM,EAAE,cAAc,KAAK,aAAa,EAChD,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,MAAM,GAAG,KAAK,YAAY;AAG7B,UAAI,KAAK,eAAe,SAAS,GAAG;AAClC,mBAAW,YAAY,gBAAgB;AACrC,mBAAS,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,MAAM,GAAG,KAAK,cAAc,CAAC,CAAC;AAAA,QACzE;AAAA,MACF;AAEA,YAAM,eAAe,eAAe,QAAQ,CAAC,MAAM,EAAE,oBAAoB;AACzE,YAAM,aAAa,aAChB,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,OAAO,CAAC,OAAO,CAAC,aAAa,SAAS,EAAE,CAAC;AAE5C,aAAO;AAAA,QACL,WAAW;AAAA,QACX,yBAAyB;AAAA,QACzB,uBAAuB;AAAA,QACvB,OAAO;AAAA,UACL,YAAY,aAAa;AAAA,UACzB,aAAa,eAAe;AAAA,UAC5B,kBACE,aAAa,SAAS,IAAI,eAAe,SAAS,aAAa,SAAS;AAAA,QAC5E;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,KAAK,uDAAuD,KAAK;AACzE,YAAM,WAAW,IAAI,oBAAoB;AACzC,aAAO,SAAS,SAAS,cAAc,OAAO;AAAA,IAChD;AAAA,EACF;AAAA,EAEQ,4BAA4B,cAAqC;AACvE,WAAO,aACJ;AAAA,MACC,CAAC,GAAG,MAAM;AAAA,eACH,IAAI,CAAC,SAAS,EAAE,EAAE;AAAA,QACzB,EAAE,IAAI;AAAA,aACD,EAAE,SAAS;AAAA,UACd,EAAE,QAAQ,MAAM;AAAA,WACf,EAAE,QAAQ,OAAO;AAAA,EAC1B,EAAE,QAAQ,QAAQ,UAAU,EAAE,QAAQ,KAAK,KAAK,EAAE;AAAA,EAClD,EAAE,QAAQ,WAAW,aAAa,EAAE,QAAQ,QAAQ,KAAK,EAAE;AAAA,EAC3D,EAAE,QAAQ,SAAS,WAAW,EAAE,QAAQ,MAAM,KAAK,EAAE;AAAA,EACrD,EAAE,QAAQ,OAAO,SAAS,UAAU,EAAE,QAAQ,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,EACrE,EAAE,QAAQ,MAAM,SAAS,SAAS,EAAE,QAAQ,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,aACvD,EAAE,SAAS;AAAA;AAAA,IAElB,EACC,KAAK,SAAS;AAAA,EACnB;AAAA,EAEQ,uBAAuB,kBAA0B,MAA4C;AACnG,WAAO;AAAA;AAAA;AAAA,EAGT,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBhB,KAAK,cAAc,oBAAoB,KAAK,WAAW,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAgB/C,KAAK,YAAY,yDAAyD,KAAK,aAAa;AAAA,EAC3G;AAAA,EAEA,MAAc,QAAQ,QAAiC;AACrD,QAAI,KAAK,OAAO,aAAa,aAAa;AACxC,aAAO,KAAK,cAAc,MAAM;AAAA,IAClC,OAAO;AACL,aAAO,KAAK,WAAW,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,QAAiC;AAC3D,UAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAM,YAAY,KAAK,OAAO,aAAa;AAE3C,UAAM,WAAW,MAAM,MAAM,yCAAyC;AAAA,MACpE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,aAAa,KAAK,OAAO;AAAA,QACzB,qBAAqB;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,wBAAwB,SAAS,MAAM,MAAM,KAAK,EAAE;AAAA,IACtE;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK,QAAQ,CAAC,GAAG,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAc,WAAW,QAAiC;AACxD,UAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,UAAM,YAAY,KAAK,OAAO,aAAa;AAE3C,UAAM,WAAW,MAAM,MAAM,8CAA8C;AAAA,MACzE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,OAAO,MAAM;AAAA,MAC7C;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,YAAY;AAAA,QACZ,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,qBAAqB,SAAS,MAAM,MAAM,KAAK,EAAE;AAAA,IACnE;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAGlC,WAAO,KAAK,QAAQ,CAAC,GAAG,SAAS,WAAW;AAAA,EAC9C;AAAA,EAEQ,iBAAiB,UAAkB,cAAmD;AAC5F,QAAI;AAEF,UAAI,UAAU;AACd,YAAM,YAAY,SAAS,MAAM,8BAA8B;AAC/D,UAAI,WAAW;AACb,kBAAU,UAAU,CAAC;AAAA,MACvB;AAEA,YAAM,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC;AAExC,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AAGA,YAAM,iBAAiB,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC5D,aAAO,OACJ,OAAO,CAAC,SAAqC;AAC5C,eACE,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,YAAY,YACxB,MAAM,QAAQ,KAAK,IAAI,KACvB,OAAO,KAAK,eAAe;AAAA,MAE/B,CAAC,EACA,IAAI,CAAC,UAAU;AAAA,QACd,GAAG;AAAA;AAAA,QAEH,uBAAuB,KAAK,wBAAwB,CAAC,GAAG;AAAA,UAAO,CAAC,OAC9D,eAAe,IAAI,EAAE;AAAA,QACvB;AAAA,QACA,YAAY,KAAK,cAAc,CAAC;AAAA,QAChC,UAAU,KAAK,YAAY,CAAC;AAAA,MAC9B,EAAE;AAAA,IACN,SAAS,OAAO;AACd,cAAQ,KAAK,iCAAiC,KAAK;AACnD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,aACA,SAKA;AACA,SAAK,SAAS,SAAS,UAAU,IAAI,oBAAoB;AACzD,SAAK,gBAAgB,IAAI;AAAA,MACvB,SAAS,SAAS;AAAA,MAClB;AAAA,MACA,SAAS;AAAA,IACX;AAEA,UAAM,gBAAgB,SAAS,UAAU,WAAWC,SAAQ,IAAI;AAChE,SAAK,aAAa,IAAI,iBAAiB,eAAe,SAAS,UAAU,QAAQ;AACjF,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAiC;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,cACA,SAC4B;AAC5B,UAAM,qBAAqB;AAAA,MACzB,GAAG;AAAA,MACH,aAAa,KAAK,eAAe,SAAS;AAAA,IAC5C;AACA,WAAO,KAAK,OAAO,SAAS,cAAc,kBAAkB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,cACA,SAIC;AACD,UAAM,qBAAqB;AAAA,MACzB,GAAG;AAAA,MACH,aAAa,KAAK,eAAe,SAAS;AAAA,IAC5C;AAGA,UAAM,SAAS,MAAM,KAAK,OAAO,SAAS,cAAc,kBAAkB;AAG1E,UAAM,kBAA8B,CAAC;AACrC,eAAW,cAAc,OAAO,WAAW;AACzC,YAAM,WAAW,KAAK,cAAc,IAAI;AAAA,QACtC,QAAQ;AAAA,QACR,oBAAoB,WAAW;AAAA,QAC/B,OAAO,WAAW;AAAA,QAClB,SAAS,WAAW;AAAA,QACpB,MAAM,WAAW;AAAA,QACjB,YAAY,WAAW;AAAA,QACvB,UAAU,WAAW;AAAA,MACvB,CAAC;AAGD,WAAK,WAAW,cAAc,QAAQ;AAEtC,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsC;AACpC,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AACF;AAOO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA,EAIhC,YAAY,WAAuB,aAAa,KAAkC;AAChF,UAAM,QAAqC,CAAC;AAE5C,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,eAAS,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC7C,cAAM,QAAQ,KAAK,oBAAoB,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AACjE,YAAI,SAAS,YAAY;AACvB,gBAAM,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAqB,WAAuE;AAEhG,UAAM,OAAO,KAAK,kBAAkB,WAAW,SAAS;AACxD,UAAM,QAAQ,SAAS,YAAY,YAAY;AAE/C,WAAO;AAAA;AAAA,MAEL,QAAQ,KAAK;AAAA,MACb,oBAAoB;AAAA,QAClB,GAAI,KAAK,sBAAsB,CAAC;AAAA,QAChC,GAAI,MAAM,sBAAsB,CAAC;AAAA,MACnC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK,aAAa,KAAK,SAAS,MAAM,OAAO;AAAA,MACtD,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,MAAM,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,MAChD,YAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,KAAK,cAAc,CAAC,GAAI,GAAI,MAAM,cAAc,CAAC,CAAE,CAAC,CAAC;AAAA,MAClF,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,KAAK,YAAY,CAAC,GAAI,GAAI,MAAM,YAAY,CAAC,CAAE,CAAC,CAAC;AAAA,MAC5E,UAAU,KAAK,WAAW,MAAM;AAAA,MAChC,UAAU,KAAK,YAAY,MAAM;AAAA,MACjC,eAAe,KAAK,iBAAiB,MAAM;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YACE,WACA,OACA,OACA,aAAa,KAC0B;AACvC,UAAM,QAAQ,KAAK,YAAY,WAAW,UAAU;AACpD,UAAM,YAAY,oBAAI,IAAY;AAClC,QAAI,cAAc;AAElB,eAAW,CAAC,IAAI,EAAE,KAAK,OAAO;AAC5B,UAAI,UAAU,IAAI,GAAG,EAAE,KAAK,UAAU,IAAI,GAAG,EAAE,GAAG;AAChD;AAAA,MACF;AAGA,YAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAGhC,YAAM,cAAc,MAAM,IAAI,MAAM;AACpC,YAAM,cAAc,WAAW;AAG/B,YAAM,OAAO,GAAG,EAAE;AAClB,YAAM,OAAO,GAAG,EAAE;AAClB,YAAM,eAAe,GAAG,EAAE;AAC1B,YAAM,eAAe,GAAG,EAAE;AAE1B,gBAAU,IAAI,GAAG,EAAE;AACnB,gBAAU,IAAI,GAAG,EAAE;AACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,UAAU,SAAS,cAAc,IAAI;AAAA,IAClD;AAAA,EACF;AAAA,EAEQ,oBAAoB,IAAc,IAAsB;AAC9D,QAAI,QAAQ;AAGZ,UAAM,cAAc,IAAI,IAAI,GAAG,MAAM,YAAY,EAAE,MAAM,KAAK,CAAC;AAC/D,UAAM,cAAc,IAAI,IAAI,GAAG,MAAM,YAAY,EAAE,MAAM,KAAK,CAAC;AAC/D,UAAM,oBAAoB,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC,EAAE;AAC7E,UAAM,cAAa,oBAAI,IAAI,CAAC,GAAG,aAAa,GAAG,WAAW,CAAC,GAAE;AAC7D,aAAU,oBAAoB,aAAc;AAG5C,UAAM,QAAQ,IAAI,IAAI,GAAG,IAAI;AAC7B,UAAM,QAAQ,IAAI,IAAI,GAAG,IAAI;AAC7B,UAAM,kBAAkB,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE;AAC/D,UAAM,YAAW,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,GAAE;AAC/C,QAAI,WAAW,GAAG;AAChB,eAAU,kBAAkB,WAAY;AAAA,IAC1C;AAGA,UAAM,YAAY,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC;AAC3C,UAAM,YAAY,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC;AAC3C,UAAM,sBAAsB,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC,EAAE;AAC3E,UAAM,gBAAe,oBAAI,IAAI,CAAC,GAAG,WAAW,GAAG,SAAS,CAAC,GAAE;AAC3D,QAAI,eAAe,GAAG;AACpB,eAAU,sBAAsB,eAAgB;AAAA,IAClD;AAGA,UAAM,gBAAgB,IAAI;AAAA,MACxB,GAAG,QACA,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC/B;AACA,UAAM,gBAAgB,IAAI;AAAA,MACxB,GAAG,QACA,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC/B;AACA,UAAM,sBAAsB,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,MAAM,cAAc,IAAI,CAAC,CAAC,EAAE;AACnF,UAAM,gBAAe,oBAAI,IAAI,CAAC,GAAG,eAAe,GAAG,aAAa,CAAC,GAAE;AACnE,QAAI,eAAe,GAAG;AACpB,eAAU,sBAAsB,eAAgB;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAc,IAAwB;AAE9D,QAAI,GAAG,kBAAkB,GAAG,eAAe;AACzC,cAAQ,GAAG,iBAAiB,MAAM,GAAG,iBAAiB,KAAK,KAAK;AAAA,IAClE;AAEA,QAAI,GAAG,aAAa,GAAG,UAAU;AAC/B,aAAO,GAAG,WAAW,GAAG,WAAW,KAAK;AAAA,IAC1C;AAEA,WAAO,IAAI,KAAK,GAAG,SAAS,IAAI,IAAI,KAAK,GAAG,SAAS,IAAI,KAAK;AAAA,EAChE;AAAA,EAEQ,aAAa,UAAkB,UAA0B;AAE/D,QAAI,SAAS,UAAU,SAAS,QAAQ;AACtC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,4BAAiD;AAC/D,SAAO,IAAI,oBAAoB;AACjC;AAKO,SAAS,yBAAyB,QAAkD;AACzF,SAAO,IAAI,mBAAmB,MAAM;AACtC;AAKO,SAAS,uBACd,aACA,SAKkB;AAClB,SAAO,IAAI,iBAAiB,aAAa,OAAO;AAClD;;;ACjlCA,IAAM,kBAA4E;AAAA,EAChF,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AACnB;AAKA,IAAM,kBAAkB;AAOjB,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,aACA,aACA,gBACA;AACA,SAAK,eAAe,IAAI,cAAc,WAAW,aAAa,WAAW;AACzE,SAAK,cAAc,IAAI,cAAc,QAAQ;AAC7C,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAA+B;AAC/C,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,UAA4B,CAAC,GAA8B;AACnF,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAG9C,UAAM,mBAAmB,KAAK,aAAa,OAAO;AAClD,UAAM,kBAAkB,KAAK,gBAAgB,KAAK,YAAY,OAAO,IAAI,CAAC;AAC1E,UAAM,eAAe,CAAC,GAAG,kBAAkB,GAAG,eAAe;AAG7D,UAAM,SAAS,aAAa,IAAI,CAAC,cAAc;AAAA,MAC7C;AAAA,MACA,GAAG,KAAK,cAAc,UAAU,IAAI;AAAA,IACtC,EAAE;AAGF,UAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,kBAAkB,KAAK,YAAY;AAG3E,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAG3D,WAAO,SAAS,MAAM,GAAG,KAAK,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,UACA,SACkC;AAClC,QAAI,QAAQ;AACZ,UAAM,YAAY;AAAA,MAChB,YAAY,CAAC;AAAA,MACb,MAAM,CAAC;AAAA,MACP,UAAU,CAAC;AAAA,MACX,UAAU,CAAC;AAAA,IACb;AAGA,QAAI,KAAK,gBAAgB,OAAO;AAC9B,YAAM,oBAAoB,KAAK,sBAAsB;AACrD,YAAM,qBAAqB,SAAS,cAAc,CAAC;AAEnD,iBAAW,MAAM,oBAAoB;AACnC,YAAI,kBAAkB,IAAI,GAAG,YAAY,CAAC,GAAG;AAC3C,mBAAS;AACT,oBAAU,WAAW,KAAK,EAAE;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,YAAM,gBAAgB,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACtE,iBAAW,OAAO,SAAS,MAAM;AAC/B,YAAI,cAAc,IAAI,IAAI,YAAY,CAAC,GAAG;AACxC,mBAAS;AACT,oBAAU,KAAK,KAAK,GAAG;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,aAAa;AACvB,YAAM,eAAe,KAAK,gBAAgB,QAAQ,WAAW;AAC7D,YAAM,mBAAmB;AAAA,QACvB,GAAG,KAAK,gBAAgB,SAAS,KAAK;AAAA,QACtC,GAAG,KAAK,gBAAgB,SAAS,OAAO;AAAA,QACxC,GAAG,SAAS;AAAA,MACd;AAEA,YAAM,qBAAqB,IAAI,IAAI,iBAAiB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC/E,iBAAW,MAAM,cAAc;AAC7B,YAAI,mBAAmB,IAAI,GAAG,YAAY,CAAC,GAAG;AAC5C,mBAAS;AACT,cAAI,CAAC,UAAU,SAAS,SAAS,EAAE,GAAG;AACpC,sBAAU,SAAS,KAAK,EAAE;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,SAAS,SAAS,SAAS,GAAG;AAErD,eAAS,SAAS,SAAS,SAAS;AACpC,gBAAU,SAAS,KAAK,GAAG,SAAS,QAAQ;AAAA,IAC9C;AAGA,QAAI,SAAS,kBAAkB,QAAW;AACxC,eAAU,SAAS,gBAAgB,MAAO;AAAA,IAC5C;AAGA,aAAS,KAAK,IAAI,SAAS,WAAW,GAAG,EAAE;AAG3C,UAAM,kBAAkB,KAAK,UAAU,SAAS,SAAS;AACzD,QAAI,kBAAkB,GAAG;AACvB,eAAS;AAAA,IACX,WAAW,kBAAkB,IAAI;AAC/B,eAAS;AAAA,IACX;AAGA,YAAQ,KAAK,IAAI,OAAO,GAAG;AAG3B,UAAM,gBAAgB,KAAK,eAAe,UAAU,QAAQ,mBAAmB,SAAS;AAExF,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAqC;AAC3C,UAAM,QAAQ,oBAAI,IAAY;AAE9B,QAAI,CAAC,KAAK,gBAAgB,MAAO,QAAO;AAExC,UAAM,QAAQ,KAAK,eAAe;AAClC,UAAM,aAAa;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,eAAW,YAAY,YAAY;AACjC,iBAAW,aAAa,UAAU;AAChC,cAAM,IAAI,UAAU,KAAK,YAAY,CAAC;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAwB;AAC9C,WAAO,KACJ,YAAY,EACZ,MAAM,yBAAyB,EAC/B,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,SAAyB;AACzC,UAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAC5C,WAAO,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,UACA,OACQ;AACR,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,KAAK,MAAM,SAAS,MAAM,SAAS,SAAS,KAAK,KAAK,GAAG,EAAE,UAAU,eAAe;AAAA,MAC7F,KAAK;AACH,cAAM,UAAU,SAAS,QAAQ,MAAM,GAAG,GAAG;AAC7C,eAAO,KAAK;AAAA,WACT,SAAS,MAAM,SAAS,QAAQ,SAAS,SAAS,KAAK,KAAK,GAAG,EAAE,UAAU;AAAA,QAC9E;AAAA,MACF,KAAK;AACH,eAAO,KAAK;AAAA,WACT,SAAS,MAAM,SAAS,SAAS,QAAQ,SAAS,SAAS,KAAK,KAAK,GAAG,EAAE,UACzE;AAAA,QACJ;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAA4B,CAAC,GAA6B;AACrE,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,UAAM,cAAc,MAAM,KAAK,oBAAoB,IAAI;AAGvD,UAAM,WAA6B,CAAC;AACpC,QAAI,cAAc;AAClB,QAAI,YAAY;AAEhB,eAAW,UAAU,aAAa;AAChC,UAAI,cAAc,OAAO,iBAAiB,KAAK,WAAW;AACxD,iBAAS,KAAK,MAAM;AACpB,uBAAe,OAAO;AAGtB,YAAI,OAAO,SAAS,UAAU,WAAW;AACvC,eAAK,aAAa,kBAAkB,OAAO,SAAS,EAAE;AAAA,QACxD,OAAO;AACL,eAAK,YAAY,kBAAkB,OAAO,SAAS,EAAE;AAAA,QACvD;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAGA,UAAM,mBAAmB,KAAK,eAAe,UAAU,KAAK,mBAAmB,SAAS;AAExF,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,YAAY,KAAK,aAAa,MAAM,KAAK,KAAK,gBAAgB,KAAK,YAAY,MAAM,IAAI;AAAA,QACzF,SAAS,YAAY;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,OACA,UAA4B,CAAC,GACH;AAC1B,UAAM,SAAS,MAAM,KAAK,OAAO,OAAO;AAGxC,WAAO,mBAAmB,KAAK,eAAe,OAAO,UAAU,OAAO,QAAQ,eAAe;AAE7F,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,UACA,OACQ;AACR,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,QAAkB,CAAC,uBAAuB,EAAE;AAElD,eAAW,EAAE,UAAU,gBAAgB,UAAU,KAAK,UAAU;AAC9D,YAAM,KAAK,MAAM,SAAS,KAAK,EAAE;AACjC,YAAM,KAAK,eAAe,cAAc,aAAa,SAAS,KAAK,KAAK,IAAI,CAAC,GAAG;AAEhF,UAAI,UAAU,WAAW,SAAS,GAAG;AACnC,cAAM,KAAK,wBAAwB,UAAU,WAAW,KAAK,IAAI,CAAC,GAAG;AAAA,MACvE;AAEA,YAAM,KAAK,EAAE;AAEb,cAAQ,OAAO;AAAA,QACb,KAAK;AAEH;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,SAAS,QAAQ,MAAM,GAAG,GAAG,KAAK,SAAS,QAAQ,SAAS,MAAM,QAAQ,GAAG;AACxF;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,SAAS,OAAO;AAC3B;AAAA,MACJ;AAEA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,UACA,OACA,QAAwC,WAChC;AACR,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,KAAK,gBAAgB,UAAU,KAAK;AAAA,MAC7C,KAAK;AACH,eAAO,KAAK,gBAAgB,UAAU,KAAK;AAAA,MAC7C,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,iBAAiB,UAAU,KAAK;AAAA,MAC9C;AACE,eAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,UACA,OACQ;AACR,UAAM,QAAkB,CAAC,YAAY;AAErC,eAAW,EAAE,UAAU,eAAe,KAAK,UAAU;AACnD,YAAM,KAAK,wBAAwB,cAAc,YAAY,SAAS,KAAK,IAAI;AAC/E,YAAM,KAAK,cAAc,KAAK,UAAU,SAAS,KAAK,CAAC,UAAU;AACjE,YAAM,KAAK,aAAa,SAAS,KAAK,KAAK,IAAI,CAAC,SAAS;AAEzD,UAAI,UAAU,WAAW;AACvB,cAAM,UACJ,UAAU,YAAY,SAAS,QAAQ,MAAM,GAAG,GAAG,IAAI,SAAS;AAClE,cAAM,KAAK,gBAAgB,KAAK,UAAU,OAAO,CAAC,YAAY;AAAA,MAChE;AAEA,UAAI,SAAS,cAAc,SAAS,WAAW,SAAS,GAAG;AACzD,cAAM,KAAK,mBAAmB,SAAS,WAAW,KAAK,IAAI,CAAC,eAAe;AAAA,MAC7E;AAEA,YAAM,KAAK,aAAa;AAAA,IAC1B;AAEA,UAAM,KAAK,aAAa;AACxB,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,UACA,OACQ;AACR,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,EAAE,UAAU,eAAe,KAAK,UAAU;AACnD,YAAM,KAAK,MAAM,SAAS,KAAK,EAAE;AACjC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,gBAAgB,cAAc,aAAa,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE;AAChF,YAAM,KAAK,EAAE;AAEb,UAAI,UAAU,WAAW;AACvB,cAAM,UACJ,UAAU,YACN,SAAS,QAAQ,MAAM,GAAG,GAAG,KAAK,SAAS,QAAQ,SAAS,MAAM,QAAQ,MAC1E,SAAS;AACf,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACN,UACA,OACQ;AACR,UAAM,QAAkB,CAAC,2BAA2B;AAEpD,eAAW,EAAE,SAAS,KAAK,UAAU;AACnC,YAAM,KAAK,OAAO,SAAS,KAAK,EAAE;AAClC,YAAM,KAAK,SAAS,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE;AAE9C,UAAI,UAAU,WAAW;AACvB,cAAM,UACJ,UAAU,YAAY,SAAS,QAAQ,MAAM,GAAG,GAAG,IAAI,SAAS;AAClE,cAAM,KAAK,OAAO;AAAA,MACpB;AAEA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAsB;AACtC,WAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAA4B,CAAC,GAAoB;AAC5D,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAE9C,UAAM,mBAAmB,KAAK,aAAa,OAAO;AAClD,UAAM,kBAAkB,KAAK,gBAAgB,KAAK,YAAY,OAAO,IAAI,CAAC;AAC1E,UAAM,eAAe,CAAC,GAAG,kBAAkB,GAAG,eAAe;AAE7D,WAAO,aAAa,IAAI,CAAC,cAAc;AAAA,MACrC,IAAI,SAAS;AAAA,MACb,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,WAAW,KAAK,cAAc,UAAU,IAAI,EAAE;AAAA,IAChD,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAe,UAA4B,CAAC,GAAoB;AAC1E,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,UAAM,WAA4B,CAAC;AAEnC,eAAW,MAAM,KAAK;AACpB,UAAI,WAAW,KAAK,aAAa,QAAQ,EAAE;AAC3C,UAAI,CAAC,YAAY,KAAK,eAAe;AACnC,mBAAW,KAAK,YAAY,QAAQ,EAAE;AAAA,MACxC;AAEA,UAAI,UAAU;AACZ,iBAAS,KAAK;AAAA,UACZ,IAAI,SAAS;AAAA,UACb,OAAO,SAAS;AAAA,UAChB,MAAM,SAAS;AAAA,UACf,WAAW,KAAK,cAAc,UAAU,IAAI,EAAE;AAAA,UAC9C,SAAS,SAAS,QAAQ,MAAM,GAAG,GAAG;AAAA,UACtC,UAAU,SAAS;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAe,UAA4B,CAAC,GAAiB;AAC3E,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,UAAM,eAA6B,CAAC;AAEpC,eAAW,MAAM,KAAK;AACpB,UAAI,WAAW,KAAK,aAAa,QAAQ,EAAE;AAC3C,UAAI,CAAC,YAAY,KAAK,eAAe;AACnC,mBAAW,KAAK,YAAY,QAAQ,EAAE;AAAA,MACxC;AAEA,UAAI,UAAU;AACZ,qBAAa,KAAK;AAAA,UAChB,IAAI,SAAS;AAAA,UACb,OAAO,SAAS;AAAA,UAChB,MAAM,SAAS;AAAA,UACf,WAAW,KAAK,cAAc,UAAU,IAAI,EAAE;AAAA,UAC9C,SAAS,SAAS,QAAQ,MAAM,GAAG,GAAG;AAAA,UACtC,UAAU,SAAS;AAAA,UACnB,SAAS,SAAS;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAe,UAA4B,CAAC,GAAqB;AACtE,UAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,SAAS,aAAa,MAAM;AAClE,UAAM,iBAAiB,KAAK,aAAa,OAAO,KAAK;AACrD,UAAM,gBAAgB,KAAK,gBAAgB,KAAK,YAAY,OAAO,KAAK,IAAI,CAAC;AAC7E,UAAM,aAAa,CAAC,GAAG,gBAAgB,GAAG,aAAa;AAEvD,WAAO,WACJ,IAAI,CAAC,cAAc;AAAA,MAClB;AAAA,MACA,GAAG,KAAK,cAAc,UAAU,IAAI;AAAA,IACtC,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,kBAAkB,KAAK,YAAY,EACnD,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAClD,MAAM,GAAG,KAAK,YAAY;AAAA,EAC/B;AACF;AAKA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,SAAS,qBACd,aACA,aACA,gBACgB;AAChB,SAAO,IAAI,eAAe,aAAa,aAAa,cAAc;AACpE;;;ACrsBA,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,iBAAe,aAAAC,mBAAiB;AACnE,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,SAAS,WAAW,aAAa,qBAAqB;AAW/D,IAAM,mBAAmB;AACzB,IAAM,WAAW;AAKV,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA,SAA4B;AAAA,EAC5B,WAAgC;AAAA,EAExC,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAAyD;AAClE,UAAM,SAAS,KAAK,eAAe;AACnC,UAAM,aAAyB;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,IACF;AAGA,UAAM,UAAUC,OAAK,KAAK,aAAa,QAAQ;AAC/C,QAAI,CAACC,aAAW,OAAO,GAAG;AACxB,MAAAC,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IACxC;AAGA,SAAK,WAAW,UAAU;AAC1B,SAAK,SAAS;AAGd,UAAM,WAAyB;AAAA,MAC7B,SAAS;AAAA,MACT;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,QAAQ,CAAC;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW;AAEhB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAA0B;AACxB,UAAM,aAAaF,OAAK,KAAK,aAAa,UAAU,gBAAgB;AACpE,QAAI,CAACC,aAAW,UAAU,GAAG;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAUE,eAAa,YAAY,OAAO;AAChD,WAAK,SAAS,KAAK,UAAU,OAAO;AACpC,WAAK,aAAa;AAClB,aAAO,KAAK;AAAA,IACd,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAA6C;AAC5D,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU;AAClC,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAGA,UAAM,YAAY,KAAK,eAAe,QAAQ,SAAS;AACvD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,UAAU,QAAQ,SAAS,sBAAsB;AAAA,IACnE;AAGA,UAAM,cAAcH,OAAK,WAAW,UAAU;AAC9C,UAAM,eAAeC,aAAW,WAAW,IACvCE,eAAa,aAAa,OAAO,IACjC;AAGJ,UAAM,WAAW,KAAK,mBAAmB,YAAY;AAGrD,UAAM,SAAsB;AAAA,MAC1B,MAAM,QAAQ;AAAA,MACd,SAAU,SAAS,WAAsB;AAAA,MACzC,aAAa,QAAQ,eAAgB,SAAS,eAA0B;AAAA,MACxE,QAAQ,KAAK,UAAU;AAAA,MACvB,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,MACjC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,GAAG,KAAK,OAAO,WAAW,IAAI,QAAQ,SAAS;AAAA,MACvD,MAAM,QAAQ,QAAS,SAAS,QAAqB,CAAC;AAAA,MACtD,QAAQ,QAAQ,UAAU,KAAK,uBAAuB,SAAS;AAAA,MAC/D,WAAW;AAAA,IACb;AAGA,UAAM,gBAAgB,KAAK,SAAS,OAAO;AAAA,MACzC,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,IAC5B;AAEA,QAAI,iBAAiB,GAAG;AAEtB,aAAO,WAAW,KAAK,SAAS,OAAO,aAAa,EAAE;AACtD,aAAO,YAAY,KAAK,SAAS,OAAO,aAAa,EAAE;AACvD,WAAK,SAAS,OAAO,aAAa,IAAI;AAAA,IACxC,OAAO;AAEL,WAAK,SAAS,OAAO,KAAK,MAAM;AAAA,IAClC;AAEA,SAAK,SAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AACjD,SAAK,aAAa,KAAK,QAAQ;AAE/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAkC;AAChC,WAAO,KAAK,UAAU,UAAU,CAAC;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAA8B;AACzC,QAAI,CAAC,KAAK,SAAU,QAAO,CAAC;AAE5B,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,KAAK,SAAS,OAAO;AAAA,MAC1B,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,UAAU,KACxC,EAAE,aAAa,YAAY,EAAE,SAAS,UAAU,KAChD,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,WACA,UAAyB,CAAC,GACoC;AAC9D,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU;AAClC,aAAO,EAAE,SAAS,OAAO,OAAO,uBAAuB;AAAA,IACzD;AAEA,UAAM,cAAc,KAAK,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACzE,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE,SAAS,OAAO,OAAO,UAAU,SAAS,+BAA+B;AAAA,IACpF;AAGA,UAAM,YAAY,KAAK,eAAe,SAAS;AAC/C,QAAI,aAAa,CAAC,QAAQ,WAAW;AACnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,UAAU,SAAS;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAMH,OAAK,KAAK,aAAa,aAAa,UAAU,SAAS;AAAA,MAC/D;AAAA,IACF;AAGA,QAAI;AACF,YAAM,WAAW,eAAe,KAAK,OAAO,WAAW;AACvD,UAAI,CAAC,UAAU;AACb,eAAO,EAAE,SAAS,OAAO,OAAO,0CAA0C;AAAA,MAC5E;AAGA,YAAM,eAAkD,EAAE,OAAO,EAAE;AACnE,UAAI,KAAK,OAAO,MAAM,SAAS,OAAO;AACpC,qBAAa,MAAM;AAAA,MACrB;AAEA,YAAM,SAAS,MAAM,SAAS,MAAM,KAAK,OAAO,aAAa,WAAW,YAAY;AAEpF,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM;AAAA,MAC/C;AAGA,kBAAY,aAAa,YAAY,aAAa,KAAK;AACvD,WAAK,aAAa,KAAK,QAAQ;AAE/B,aAAO,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK;AAAA,IAC5C,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAIH;AACD,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,SAAS,EAAE,OAAO,CAAC,GAAe,SAAS,CAAC,GAAe,SAAS,CAAC,EAAc;AAEzF,QAAI;AACF,YAAM,WAAW,eAAe,KAAK,OAAO,WAAW;AACvD,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAGA,YAAM,eAAkD,EAAE,OAAO,EAAE;AACnE,UAAI,KAAK,OAAO,MAAM,SAAS,OAAO;AACpC,qBAAa,MAAM;AAAA,MACrB;AAGA,YAAM,cAAc,MAAM,SAAS,MAAM,KAAK,OAAO,aAAa,IAAI,YAAY;AAElF,UAAI,CAAC,YAAY,WAAW,CAAC,YAAY,MAAM;AAC7C,cAAM,IAAI,MAAM,YAAY,SAAS,iCAAiC;AAAA,MACxE;AAGA,YAAM,qBAAqBA,OAAK,YAAY,MAAM,UAAU,eAAe;AAC3E,UAAIC,aAAW,kBAAkB,GAAG;AAClC,cAAM,gBAAgBE,eAAa,oBAAoB,OAAO;AAC9D,cAAM,iBAAiB,KAAK,UAAU,aAAa;AAGnD,cAAM,kBAAkB,IAAI,IAAI,KAAK,UAAU,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC;AAG9E,mBAAW,SAAS,eAAe,QAAQ;AACzC,cAAI,CAAC,gBAAgB,IAAI,MAAM,IAAI,GAAG;AACpC,mBAAO,MAAM,KAAK,MAAM,IAAI;AAC5B,iBAAK,UAAU,OAAO,KAAK,KAAK;AAAA,UAClC,OAAO;AAEL,kBAAM,QAAQ,KAAK,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AACrE,gBAAI,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,IAAI,KAAK,MAAM,SAAS,GAAG;AAClE,qBAAO,QAAQ,KAAK,MAAM,IAAI;AAC9B,qBAAO,OAAO,OAAO,KAAK;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AASA,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AACjD,eAAK,aAAa,KAAK,QAAQ;AAAA,QACjC;AAAA,MACF;AAGA,UAAI,YAAY,UAAU;AACxB,cAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,IAAS;AACzC,QAAAA,QAAO,YAAY,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC/D;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,gBAAgB,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AAAA,IACxF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAA4B;AACtC,QAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,UAAM,QAAQ,KAAK,SAAS,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS;AACxE,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,SAAS,OAAO,OAAO,OAAO,CAAC;AACpC,SAAK,SAAS,aAAY,oBAAI,KAAK,GAAE,YAAY;AACjD,SAAK,aAAa,KAAK,QAAQ;AAE/B,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,iBAAyB;AAC/B,WAAO,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAClF;AAAA,EAEQ,WAAW,QAA0B;AAC3C,UAAM,aAAaJ,OAAK,KAAK,aAAa,UAAU,gBAAgB;AACpE,UAAM,MAAMK,SAAQ,UAAU;AAC9B,QAAI,CAACJ,aAAW,GAAG,GAAG;AACpB,MAAAC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,IAAAI,gBAAc,YAAY,KAAK,OAAO,MAAM,GAAG,OAAO;AAAA,EACxD;AAAA,EAEQ,eAAqB;AAC3B,UAAM,eAAeN,OAAK,KAAK,aAAa,UAAU,eAAe;AACrE,QAAIC,aAAW,YAAY,GAAG;AAC5B,YAAM,UAAUE,eAAa,cAAc,OAAO;AAClD,WAAK,WAAW,KAAK,UAAU,OAAO;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,aAAa,UAA8B;AACjD,UAAM,eAAeH,OAAK,KAAK,aAAa,UAAU,eAAe;AACrE,IAAAM,gBAAc,cAAc,KAAK,OAAO,QAAQ,GAAG,OAAO;AAAA,EAC5D;AAAA,EAEQ,eAAe,WAAkC;AACvD,UAAM,gBAAgB;AAAA,MACpBN,OAAK,KAAK,aAAa,aAAa,UAAU,SAAS;AAAA,MACvDA,OAAK,KAAK,aAAa,UAAU,SAAS;AAAA,MAC1CA,OAAK,KAAK,aAAa,WAAW,UAAU,SAAS;AAAA,IACvD;AAEA,eAAW,KAAK,eAAe;AAC7B,UAAIC,aAAW,CAAC,GAAG;AACjB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAoB;AAE1B,QAAI;AACF,YAAM,OAAOM,UAAS,wBAAwB,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAC1E,YAAM,QAAQA,UAAS,yBAAyB,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAC5E,aAAO,QAAQ,GAAG,IAAI,KAAK,KAAK,MAAM;AAAA,IACxC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,uBAAuB,WAAgC;AAC7D,UAAM,SAAsB,CAAC;AAG7B,QAAIN,aAAWD,OAAK,WAAW,UAAU,CAAC,GAAG;AAC3C,aAAO,KAAK,eAAe,SAAS,cAAc,WAAW;AAAA,IAC/D;AACA,QAAIC,aAAWD,OAAK,WAAW,WAAW,CAAC,GAAG;AAC5C,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,QAAIC,aAAWD,OAAK,WAAW,UAAU,CAAC,GAAG;AAC3C,aAAO,KAAK,UAAU;AAAA,IACxB;AAEA,WAAO,OAAO,SAAS,IAAI,SAAS,CAAC,WAAW;AAAA,EAClD;AAAA,EAEQ,mBAAmB,SAA0C;AACnE,UAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,QAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAI;AACF,aAAO,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,IAChC,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,UAAU,SAA0B;AAC1C,WAAO,UAAU,OAAO;AAAA,EAC1B;AAAA,EAEQ,OAAO,KAAsB;AACnC,WAAO,cAAc,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,EACzC;AACF;AAKO,SAAS,kBAAkB,aAAkC;AAClE,SAAO,IAAI,YAAY,WAAW;AACpC;;;ACxbA,SAAS,cAAAQ,cAAY,gBAAAC,gBAAc,iBAAAC,iBAAe,aAAAC,aAAW,eAAAC,cAAa,YAAAC,iBAAgB;AAC1F,SAAS,QAAAC,QAAM,YAAAC,WAAU,WAAAC,UAAS,UAAU,WAAAC,UAAS,WAAW;AAChE,SAAS,kBAAkB;AAI3B,IAAM,iBAAiB;AAKhB,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA,SAA8B,oBAAI,IAAI;AAAA;AAAA,EAE9C,YAAY,MAAc,QAAgB,aAAsB;AAC9D,SAAK,WAAW;AAAA,MACd,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,CAAC;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,WAAmB,QAA4B;AACtD,UAAM,YAAYF,UAAS,SAAS;AAGpC,QAAI,KAAK,OAAO,IAAI,SAAS,GAAG;AAC9B,YAAM,IAAI,MAAM,UAAU,SAAS,4BAA4B;AAAA,IACjE;AAEA,UAAM,UAAU,KAAK,iBAAiB,SAAS;AAE/C,SAAK,OAAO,IAAI,WAAW,OAAO;AAClC,SAAK,SAAS,OAAO,KAAK;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA;AAAA,MACN,QAAQ,UAAU,KAAK,aAAa,SAAS;AAAA,IAC/C,CAAC;AAED,SAAK,SAAS,aAAa,OAAO,WAAW,SAAS,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAA4B;AACtC,UAAM,QAAQ,KAAK,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACnE,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,UAAU,KAAK,OAAO,IAAI,SAAS;AACzC,QAAI,SAAS;AACX,WAAK,SAAS,aAAa,OAAO,WAAW,SAAS,OAAO;AAAA,IAC/D;AAEA,SAAK,OAAO,OAAO,SAAS;AAC5B,SAAK,SAAS,SAAS,KAAK,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAE9E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAA8B;AAC5B,WAAO,EAAE,GAAG,KAAK,SAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA0B;AACxB,WAAO,KAAK,SAAS,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAAuC;AACrD,WAAO,KAAK,OAAO,IAAI,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,UAAM,WAAqB,CAAC;AAC5B,eAAW,CAAC,MAAM,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AACnD,eAAS,KAAK,GAAG,IAAI,IAAI,OAAO,EAAE;AAAA,IACpC;AACA,aAAS,KAAK;AACd,WAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACnF;AAAA,EAEQ,iBAAiB,WAA2B;AAClD,UAAM,WAAqB,CAAC;AAE5B,UAAM,UAAU,CAAC,KAAa,SAAS,OAAa;AAClD,YAAM,UAAUH,aAAY,GAAG;AAC/B,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAWE,OAAK,KAAK,KAAK;AAChC,cAAM,eAAe,SAAS,GAAG,MAAM,IAAI,KAAK,KAAK;AACrD,cAAM,OAAOD,UAAS,QAAQ;AAE9B,YAAI,KAAK,YAAY,GAAG;AACtB,kBAAQ,UAAU,YAAY;AAAA,QAChC,WAAW,KAAK,OAAO,GAAG;AACxB,gBAAM,UAAUJ,eAAa,UAAU,OAAO;AAC9C,mBAAS,KAAK,OAAO,YAAY;AAAA,EAAS,OAAO,EAAE;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,QAAII,UAAS,SAAS,EAAE,YAAY,GAAG;AACrC,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,eAAS,KAAKJ,eAAa,WAAW,OAAO,CAAC;AAAA,IAChD;AAEA,WAAO,SAAS,KAAK,MAAM;AAAA,EAC7B;AAAA,EAEQ,aAAa,WAAgC;AACnD,UAAM,SAAsB,CAAC;AAG7B,QAAID,aAAW,SAAS,KAAKK,UAAS,SAAS,EAAE,OAAO,GAAG;AACzD,YAAM,WAAWE,UAAS,SAAS,EAAE,YAAY;AACjD,UAAI,aAAa,YAAY;AAC3B,eAAO,CAAC,eAAe,SAAS,cAAc,WAAW;AAAA,MAC3D;AACA,UAAI,aAAa,aAAa;AAC5B,eAAO,CAAC,QAAQ;AAAA,MAClB;AACA,UAAI,aAAa,YAAY;AAC3B,eAAO,CAAC,UAAU;AAAA,MACpB;AACA,aAAO,CAAC,WAAW;AAAA,IACrB;AAGA,QAAIP,aAAWM,OAAK,WAAW,UAAU,CAAC,GAAG;AAC3C,aAAO,KAAK,eAAe,SAAS,cAAc,WAAW;AAAA,IAC/D;AACA,QAAIN,aAAWM,OAAK,WAAW,WAAW,CAAC,GAAG;AAC5C,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,QAAIN,aAAWM,OAAK,WAAW,UAAU,CAAC,GAAG;AAC3C,aAAO,KAAK,UAAU;AAAA,IACxB;AAEA,WAAO,OAAO,SAAS,IAAI,SAAS,CAAC,WAAW;AAAA,EAClD;AACF;AAKO,SAAS,kBACd,MACA,QACA,aACa;AACb,SAAO,IAAI,YAAY,MAAM,QAAQ,WAAW;AAClD;AAKO,SAAS,aACd,QACA,YACqD;AACrD,MAAI;AACF,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAEA,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,UAAU,OAAO,gBAAgB,MAAM,IAAI;AACjD,UAAI,SAAS;AACX,mBAAW,OAAO,MAAM,IAAI,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,MAAMG,SAAQ,UAAU;AAC9B,QAAI,OAAO,CAACT,aAAW,GAAG,GAAG;AAC3B,MAAAG,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAGA,IAAAD,gBAAc,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG,OAAO;AAEtE,WAAO,EAAE,SAAS,MAAM,MAAM,WAAW;AAAA,EAC3C,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,IAC9C;AAAA,EACF;AACF;AAKO,SAAS,aACd,YACA,WACA,UAAmC,CAAC,GACwB;AAC5D,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAE1B,MAAI;AACF,UAAM,UAAUD,eAAa,YAAY,OAAO;AAChD,UAAM,OAAO,KAAK,MAAM,OAAO;AAM/B,UAAM,oBAAoBO,SAAQ,SAAS;AAE3C,eAAW,SAAS,KAAK,SAAS,QAAQ;AAExC,UAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG,KAAK,MAAM,KAAK,SAAS,IAAI,KACnE,MAAM,SAAS,QAAQ,MAAM,SAAS,OAAO,MAAM,KAAK,WAAW,GAAG,GAAG;AAC3E,eAAO,KAAK,2BAA2B,MAAM,IAAI,EAAE;AACnD;AAAA,MACF;AAEA,YAAM,eAAe,KAAK,OAAO,MAAM,IAAI;AAC3C,UAAI,CAAC,cAAc;AACjB,eAAO,KAAK,UAAU,MAAM,IAAI,4BAA4B;AAC5D;AAAA,MACF;AAEA,YAAM,WAAWF,OAAK,mBAAmB,MAAM,IAAI;AAGnD,YAAM,mBAAmBE,SAAQ,QAAQ;AACzC,YAAM,mBAAmB,SAAS,mBAAmB,gBAAgB;AACrE,UAAI,iBAAiB,WAAW,IAAI,KAAK,iBAAiB,WAAW,GAAG,GAAG;AACzE,eAAO,KAAK,UAAU,MAAM,IAAI,iCAAiC;AACjE;AAAA,MACF;AAGA,UAAIR,aAAW,QAAQ,KAAK,CAAC,QAAQ,WAAW;AAC9C,eAAO,KAAK,UAAU,MAAM,IAAI,oCAAoC;AACpE;AAAA,MACF;AAGA,UAAI,CAACA,aAAW,QAAQ,GAAG;AACzB,QAAAG,YAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACzC;AAGA,YAAM,QAAQO,mBAAkB,YAAY;AAC5C,iBAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AAE3D,cAAM,WAAWF,SAAQ,UAAU,QAAQ;AAC3C,cAAM,kBAAkB,SAAS,UAAU,QAAQ;AAGnD,YAAI,gBAAgB,WAAW,IAAI,KAAK,gBAAgB,WAAW,GAAG,GAAG;AACvE,iBAAO,KAAK,UAAU,MAAM,IAAI,iCAAiC,QAAQ,EAAE;AAC3E;AAAA,QACF;AAEA,cAAM,UAAUC,SAAQ,QAAQ;AAChC,YAAI,CAACT,aAAW,OAAO,GAAG;AACxB,UAAAG,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,QACxC;AACA,QAAAD,gBAAc,UAAU,aAAa,OAAO;AAAA,MAC9C;AAEA,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B;AAEA,WAAO,EAAE,SAAS,OAAO,WAAW,GAAG,UAAU,OAAO;AAAA,EAC1D,SAAS,KAAK;AACZ,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,eAAe;AAChE,WAAO,EAAE,SAAS,OAAO,UAAU,OAAO;AAAA,EAC5C;AACF;AAKA,SAASQ,mBAAkB,SAAyC;AAClE,QAAM,QAAgC,CAAC;AAIvC,QAAM,WAAW,QAAQ,MAAM,4BAA4B;AAI3D,MAAI,IAAI;AACR,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,WAAW,SAAS,CAAC;AAC3B,UAAM,cAAc,SAAS,IAAI,CAAC,KAAK;AACvC,QAAI,YAAY,CAAC,SAAS,WAAW,KAAK,GAAG;AAC3C,YAAM,SAAS,KAAK,CAAC,IAAI;AAAA,IAC3B;AACA,SAAK;AAAA,EACP;AAGA,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,KAAK,QAAQ,KAAK,GAAG;AACrD,UAAM,UAAU,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;;;ACrUA,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,iBAAe,aAAAC,mBAAiB;AACnE,SAAS,QAAAC,cAAY;AAarB,IAAM,cAAc;AACpB,IAAM,sBAAsB;AAcrB,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA,UAA+B,oBAAI,IAAI;AAAA,EACvC,cAA6C,oBAAI,IAAI;AAAA,EACrD,YAA6C,oBAAI,IAAI;AAAA,EACrD,WAAuC,oBAAI,IAAI;AAAA,EAC/C,QAAkC,oBAAI,IAAI;AAAA,EAC1C;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,QAAQ,KAAK,UAAU;AAC5B,SAAK,UAAU,KAAK,cAAc;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAA+B;AAC5C,UAAM,OAAO,OAAO,SAAS;AAG7B,QAAI,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC1B,YAAM,IAAI,MAAM,WAAW,IAAI,yBAAyB;AAAA,IAC1D;AAGA,QAAI,OAAO,SAAS,cAAc;AAChC,iBAAW,OAAO,OAAO,SAAS,cAAc;AAC9C,YAAI,CAAC,KAAK,QAAQ,IAAI,GAAG,GAAG;AAC1B,gBAAM,IAAI,MAAM,WAAW,IAAI,eAAe,GAAG,uBAAuB;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,MAAM;AACf,YAAM,OAAO,KAAK,KAAK,OAAO;AAAA,IAChC;AAGA,QAAI,OAAO,aAAa;AACtB,iBAAW,KAAK,OAAO,aAAa;AAClC,aAAK,YAAY,IAAI,EAAE,WAAW,EAAE,UAAU;AAAA,MAChD;AAAA,IACF;AAGA,QAAI,OAAO,WAAW;AACpB,iBAAW,KAAK,OAAO,WAAW;AAChC,aAAK,UAAU,IAAI,EAAE,cAAc,EAAE,QAAQ;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,OAAO,UAAU;AACnB,iBAAW,KAAK,OAAO,UAAU;AAC/B,aAAK,SAAS,IAAI,EAAE,MAAM,CAAC;AAC3B,YAAI,EAAE,SAAS;AACb,qBAAW,SAAS,EAAE,SAAS;AAC7B,iBAAK,SAAS,IAAI,OAAO,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,OAAO;AAChB,WAAK,MAAM,IAAI,MAAM,OAAO,KAAK;AAGjC,UAAI,OAAO,MAAM,QAAQ;AACvB,cAAM,OAAO,MAAM,OAAO,KAAK,OAAO;AAAA,MACxC;AAAA,IACF;AAGA,SAAK,QAAQ,IAAI,MAAM,MAAM;AAG7B,SAAK,MAAM,QAAQ,IAAI,IAAI;AAAA,MACzB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC;AACA,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAA6B;AAC5C,UAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,IAAI,qBAAqB;AAAA,IACtD;AAGA,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,QAAI,OAAO,UAAU;AACnB,YAAM,MAAM,SAAS;AAAA,IACvB;AAGA,QAAI,OAAO,SAAS;AAClB,YAAM,OAAO,QAAQ;AAAA,IACvB;AAGA,QAAI,OAAO,aAAa;AACtB,iBAAW,KAAK,OAAO,aAAa;AAClC,aAAK,YAAY,OAAO,EAAE,SAAS;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,OAAO,WAAW;AACpB,iBAAW,KAAK,OAAO,WAAW;AAChC,aAAK,UAAU,OAAO,EAAE,YAAY;AAAA,MACtC;AAAA,IACF;AAGA,QAAI,OAAO,UAAU;AACnB,iBAAW,KAAK,OAAO,UAAU;AAC/B,aAAK,SAAS,OAAO,EAAE,IAAI;AAC3B,YAAI,EAAE,SAAS;AACb,qBAAW,SAAS,EAAE,SAAS;AAC7B,iBAAK,SAAS,OAAO,KAAK;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,SAAK,MAAM,OAAO,IAAI;AAGtB,SAAK,QAAQ,OAAO,IAAI;AAGxB,WAAO,KAAK,MAAM,QAAQ,IAAI;AAC9B,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAkC;AAC1C,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA0B;AACxB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAgC;AAC9B,WAAO,KAAK,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,WAA6D;AACzE,WAAO,KAAK,YAAY,IAAI,SAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAmD;AACjD,WAAO,IAAI,IAAI,KAAK,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAA8C;AACxD,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAmD;AACjD,WAAO,IAAI,IAAI,KAAK,SAAS;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAyC;AAClD,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAkC;AAChC,WAAO,MAAM,KAAK,IAAI,IAAI,KAAK,SAAS,OAAO,CAAC,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,aACG,MACY;AACf,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,OAAO;AAClC,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,MAAM;AACR,cAAO,KAA+C,GAAG,IAAI;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACJ,OACA,aACyB;AACzB,QAAI,SAAS;AACb,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,OAAO;AAClC,UAAI,MAAM,iBAAiB;AACzB,iBAAS,MAAM,MAAM,gBAAgB,QAAQ,WAAW;AAAA,MAC1D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,SACA,aACiB;AACjB,QAAI,SAAS;AACb,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,OAAO;AAClC,UAAI,MAAM,gBAAgB;AACxB,iBAAS,MAAM,MAAM,eAAe,QAAQ,WAAW;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAc,QAA4B;AACxD,QAAI,CAAC,KAAK,MAAM,QAAQ,IAAI,GAAG;AAC7B,WAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,SAAS,MAAM,OAAO;AAAA,IACrD,OAAO;AACL,WAAK,MAAM,QAAQ,IAAI,EAAE,SAAS;AAAA,IACpC;AACA,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAwC;AACtD,WAAO,KAAK,MAAM,QAAQ,IAAI,GAAG;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAoB;AAC/B,QAAI,KAAK,MAAM,QAAQ,IAAI,GAAG;AAC5B,WAAK,MAAM,QAAQ,IAAI,EAAE,UAAU;AACnC,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAoB;AAChC,QAAI,KAAK,MAAM,QAAQ,IAAI,GAAG;AAC5B,WAAK,MAAM,QAAQ,IAAI,EAAE,UAAU;AACnC,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAuB;AACrC,WAAO,KAAK,MAAM,QAAQ,IAAI,GAAG,WAAW;AAAA,EAC9C;AAAA;AAAA,EAIQ,YAA0B;AAChC,UAAM,YAAYA,OAAK,KAAK,aAAa,aAAa,mBAAmB;AACzE,QAAIJ,aAAW,SAAS,GAAG;AACzB,UAAI;AACF,eAAO,KAAK,MAAMC,eAAa,WAAW,OAAO,CAAC;AAAA,MACpD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,EAAE,SAAS,GAAG,SAAS,CAAC,EAAE;AAAA,EACnC;AAAA,EAEQ,YAAkB;AACxB,UAAM,aAAaG,OAAK,KAAK,aAAa,WAAW;AACrD,QAAI,CAACJ,aAAW,UAAU,GAAG;AAC3B,MAAAG,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AACA,UAAM,YAAYC,OAAK,YAAY,mBAAmB;AACtD,IAAAF,gBAAc,WAAW,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,EACvE;AAAA,EAEQ,gBAA+B;AACrC,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,iBAAiB;AAAA,MACjB,QAAQ,CAAC;AAAA,MACT,KAAK;AAAA,QACH,MAAM,CAAC,QAAQ,QAAQ,IAAI,YAAY,GAAG,EAAE;AAAA,QAC5C,MAAM,CAAC,QAAQ,QAAQ,KAAK,YAAY,GAAG,EAAE;AAAA,QAC7C,OAAO,CAAC,QAAQ,QAAQ,MAAM,YAAY,GAAG,EAAE;AAAA,QAC/C,OAAO,CAAC,QAAQ;AACd,cAAI,QAAQ,IAAI,MAAO,SAAQ,IAAI,kBAAkB,GAAG,EAAE;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,eAAe,CAAC,cAAc,KAAK,YAAY,IAAI,SAAS;AAAA,MAC5D,aAAa,CAAC,SAAS,KAAK,UAAU,IAAI,IAAI;AAAA,IAChD;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,aAAoC;AACtE,SAAO,IAAI,cAAc,WAAW;AACtC;;;ACvXA,SAAS,cAAAG,cAAY,gBAAAC,gBAAc,eAAAC,cAAa,YAAAC,iBAAgB;AAChE,SAAS,QAAAC,QAAM,SAAS,YAAAC,WAAU,kBAAkB;AACpD,SAAS,qBAAqB;AAMvB,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIxB,MAAM,aAAa,UAAmC;AACpD,QAAI,CAACL,aAAW,QAAQ,GAAG;AACzB,YAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,IACtD;AAEA,UAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAI,QAAQ,SAAS,QAAQ,QAAQ;AACnC,YAAM,IAAI,MAAM,iCAAiC,GAAG,0CAA0C;AAAA,IAChG;AAEA,QAAI;AAEF,YAAM,UAAU,cAAc,QAAQ,EAAE;AACxC,YAAM,SAAS,MAAM,OAAO;AAG5B,YAAM,SAAS,OAAO,WAAW,OAAO;AAExC,UAAI,CAAC,UAAU,CAAC,OAAO,UAAU;AAC/B,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AAEA,aAAO,KAAK,eAAe,MAAM;AAAA,IACnC,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,8BAA8B,QAAQ,KACpC,eAAe,QAAQ,IAAI,UAAU,eACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,aAAsC;AAC1D,QAAI;AAEF,YAAM,SAAS,MAAM,OAAO;AAC5B,YAAM,SAAS,OAAO,WAAW,OAAO;AAExC,UAAI,CAAC,UAAU,CAAC,OAAO,UAAU;AAC/B,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AAEA,aAAO,KAAK,eAAe,MAAM;AAAA,IACnC,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,sCAAsC,WAAW,KAC/C,eAAe,QAAQ,IAAI,UAAU,eACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAA0B;AACrC,QAAI,CAACA,aAAW,QAAQ,GAAG;AACzB,YAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,IACtD;AAEA,QAAI;AACF,YAAM,UAAUC,eAAa,UAAU,OAAO;AAC9C,YAAM,OAAO,KAAK,MAAM,OAAO;AAE/B,UAAI,CAAC,KAAK,UAAU;AAClB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAGA,YAAM,SAAiB;AAAA,QACrB,UAAU,KAAK;AAAA,MACjB;AAEA,aAAO,KAAK,eAAe,MAAM;AAAA,IACnC,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,8BAA8B,QAAQ,KACpC,eAAe,QAAQ,IAAI,UAAU,eACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAA4C;AAC9D,QAAI,CAACD,aAAW,OAAO,GAAG;AACxB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAA4B,CAAC;AACnC,UAAM,UAAUE,aAAY,OAAO;AAEnC,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWE,OAAK,SAAS,KAAK;AAGpC,UAAI;AACJ,UAAI;AACF,eAAOD,UAAS,QAAQ;AAAA,MAC1B,QAAQ;AAEN;AAAA,MACF;AAEA,UAAI,KAAK,YAAY,GAAG;AAEtB,cAAM,UAAUC,OAAK,UAAU,cAAc;AAC7C,cAAM,aAAaA,OAAK,UAAU,aAAa;AAE/C,YAAIJ,aAAW,OAAO,GAAG;AACvB,cAAI;AACF,kBAAM,MAAM,KAAK,MAAMC,eAAa,SAAS,OAAO,CAAC;AAErD,iBAAK,IAAI,kBAAkB,IAAI,UAAU,SAAS,iBAAiB,MAC/D,IAAI,QAAQ,OAAO,IAAI,SAAS,YAChC,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;AAClD,sBAAQ,KAAK;AAAA,gBACX,MAAM,IAAI;AAAA,gBACV,SAAS,IAAI;AAAA,gBACb,aAAa,IAAI;AAAA,gBACjB,QAAQ,IAAI;AAAA,gBACZ,UAAU,IAAI;AAAA,cAChB,CAAC;AAAA,YACH;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF,WAAWD,aAAW,UAAU,GAAG;AACjC,cAAI;AACF,kBAAM,OAAO,KAAK,MAAMC,eAAa,YAAY,OAAO,CAAC;AAEzD,gBAAI,KAAK,YACL,KAAK,SAAS,QAAQ,OAAO,KAAK,SAAS,SAAS,YACpD,KAAK,SAAS,WAAW,OAAO,KAAK,SAAS,YAAY,UAAU;AACtE,sBAAQ,KAAK,KAAK,QAAQ;AAAA,YAC5B;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,WAAW,KAAK,OAAO,GAAG;AAExB,cAAM,MAAM,QAAQ,KAAK;AACzB,YAAI,QAAQ,SAAS,QAAQ,QAAQ;AACnC,gBAAM,OAAOI,UAAS,OAAO,GAAG;AAChC,cAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,WAAW,WAAW,GAAG;AAC3D,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,SAAS;AAAA;AAAA,cACT,aAAa,gBAAgB,KAAK;AAAA,YACpC,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAAwB;AAC7C,UAAM,EAAE,SAAS,IAAI;AAGrB,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QAAI,CAAC,SAAS,SAAS;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAGA,QAAI,CAAC,iCAAiC,KAAK,SAAS,IAAI,GAAG;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,iBAAiB,KAAK,SAAS,OAAO,GAAG;AAC5C,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAGA,QAAI,OAAO,aAAa;AACtB,iBAAW,KAAK,OAAO,aAAa;AAClC,YAAI,CAAC,EAAE,aAAa,CAAC,EAAE,YAAY;AACjC,gBAAM,IAAI,MAAM,yDAAyD;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,WAAW;AACpB,iBAAW,KAAK,OAAO,WAAW;AAChC,YAAI,CAAC,EAAE,gBAAgB,CAAC,EAAE,UAAU;AAClC,gBAAM,IAAI,MAAM,wDAAwD;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,UAAU;AACnB,iBAAW,KAAK,OAAO,UAAU;AAC/B,YAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS;AACzB,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,QAAiC;AAChE,QAAM,SAAS,IAAI,aAAa;AAIhC,QAAMC,eACJ,OAAO,WAAW,GAAG;AAAA,EACrB,WAAW,MAAM;AAAA,EAChB,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,WAAW,GAAG;AAAA,EAC/C,OAAO,SAAS,IAAI;AAAA,EACpB,OAAO,WAAW,GAAG;AAEvB,MAAIA,cAAa;AAEf,QAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,aAAO,OAAO,aAAa,MAAM;AAAA,IACnC;AACA,WAAO,OAAO,aAAa,MAAM;AAAA,EACnC,WAAW,OAAO,WAAW,GAAG,KAAK,eAAe,KAAK,MAAM,GAAG;AAEhE,WAAO,OAAO,gBAAgB,MAAM;AAAA,EACtC,OAAO;AACL,UAAM,IAAI,MAAM,wCAAwC,MAAM,EAAE;AAAA,EAClE;AACF;AAKA,eAAsB,yBAAyB,SAAoC;AACjF,QAAM,SAAS,IAAI,aAAa;AAChC,QAAM,UAAoB,CAAC;AAE3B,MAAI,CAACN,aAAW,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,UAAUE,aAAY,OAAO;AAEnC,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWE,OAAK,SAAS,KAAK;AAGpC,QAAI;AACJ,QAAI;AACF,aAAOD,UAAS,QAAQ;AAAA,IAC1B,QAAQ;AAEN;AAAA,IACF;AAEA,QAAI;AACF,UAAI,KAAK,YAAY,GAAG;AAEtB,cAAM,eAAeC,OAAK,UAAU,WAAW;AAC/C,cAAM,YAAYA,OAAK,UAAU,UAAU;AAC3C,cAAM,cAAcA,OAAK,UAAU,YAAY;AAC/C,cAAM,WAAWA,OAAK,UAAU,WAAW;AAC3C,cAAM,WAAWA,OAAK,UAAU,aAAa;AAE7C,YAAIJ,aAAW,YAAY,GAAG;AAC5B,kBAAQ,KAAK,MAAM,OAAO,aAAa,YAAY,CAAC;AAAA,QACtD,WAAWA,aAAW,SAAS,GAAG;AAChC,kBAAQ,KAAK,MAAM,OAAO,aAAa,SAAS,CAAC;AAAA,QACnD,WAAWA,aAAW,WAAW,GAAG;AAClC,kBAAQ,KAAK,MAAM,OAAO,aAAa,WAAW,CAAC;AAAA,QACrD,WAAWA,aAAW,QAAQ,GAAG;AAC/B,kBAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,CAAC;AAAA,QAClD,WAAWA,aAAW,QAAQ,GAAG;AAC/B,kBAAQ,KAAK,OAAO,aAAa,QAAQ,CAAC;AAAA,QAC5C;AAAA,MACF,WAAW,KAAK,OAAO,GAAG;AACxB,cAAM,MAAM,QAAQ,KAAK;AACzB,YAAI,QAAQ,SAAS,QAAQ,QAAQ;AACnC,kBAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,CAAC;AAAA,QAClD,WAAW,QAAQ,WAAW,MAAM,SAAS,QAAQ,GAAG;AACtD,kBAAQ,KAAK,OAAO,aAAa,QAAQ,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AAEZ,cAAQ,KAAK,8BAA8B,QAAQ,KAAK,GAAG,EAAE;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT;;;ACrUA,SAAS,cAAAO,cAAY,gBAAAC,gBAAc,iBAAAC,iBAAe,aAAAC,mBAAiB;AACnE,SAAS,QAAAC,QAAM,WAAAC,gBAAe;;;ACA9B,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,eAAAC,cAAa,YAAAC,iBAAgB;AAChE,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,qBAAqB;;;ACH9B,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,eAAAC,cAAa,YAAAC,iBAAgB;AAChE,SAAS,QAAAC,cAAY;AAWd,SAAS,qBAAqB,MAAiC;AACpE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAEA,QAAM,IAAI;AAGV,MAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,SAAS,UAAU;AACzC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,CAAC,oBAAoB,KAAK,EAAE,IAAI,GAAG;AAC5C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,EAAE,WAAW,OAAO,EAAE,YAAY,UAAU;AAC/C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,CAAC,iBAAiB,KAAK,EAAE,OAAO,GAAG;AAC5C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,EAAE,eAAe,OAAO,EAAE,gBAAgB,UAAU;AACvD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,EAAE,YAAY,SAAS,IAAI;AACpC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,EAAE,UAAU,CAAC,MAAM,QAAQ,EAAE,MAAM,GAAG;AACzC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,WAAW,EAAE,OAAO,WAAW,GAAG;AAChC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH,OAAO;AACL,eAAW,SAAS,EAAE,QAAQ;AAC5B,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,yCAAyC,OAAO,KAAK;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,QAAQ,EAAE,IAAI,GAAG;AACrC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,EAAE,iBAAiB,CAAC,MAAM,QAAQ,EAAE,aAAa,GAAG;AACvD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,SAAmC;AACtE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAEvC,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAEA,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAGhC,QAAM,iBAAiB,MAAM,CAAC,MAAM;AACpC,MAAI,gBAAgB;AAClB,UAAM,iBAAiB,MAAM,MAAM,CAAC,EAAE,UAAU,CAAC,MAAM,MAAM,KAAK;AAClE,QAAI,mBAAmB,IAAI;AACzB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAGA,QAAM,iBAAiB,iCAAiC,KAAK,OAAO;AACpE,QAAM,kBAAkB,gDAAgD,KAAK,OAAO;AAEpF,MAAI,CAAC,kBAAkB,CAAC,iBAAiB;AACvC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAGA,QAAM,4BAA4B,QAC/B,QAAQ,mBAAmB,EAAE,EAC7B,KAAK;AACR,MAAI,0BAA0B,SAAS,KAAK;AAC1C,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAGA,QAAM,uBACJ,8EAA8E;AAAA,IAC5E;AAAA,EACF;AACF,MAAI,CAAC,sBAAsB;AACzB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,UAAoC;AACxE,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,CAACJ,aAAW,QAAQ,GAAG;AACzB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,6BAA6B,QAAQ;AAAA,IAChD,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,QAAM,eAAeI,OAAK,UAAU,WAAW;AAC/C,MAAI,CAACJ,aAAW,YAAY,GAAG;AAC7B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,MAAI;AACJ,MAAI;AACF,UAAM,MAAMC,eAAa,cAAc,OAAO;AAC9C,eAAW,KAAK,MAAM,GAAG;AACzB,UAAM,iBAAiB,qBAAqB,QAAQ;AACpD,WAAO,KAAK,GAAG,eAAe,MAAM;AACpC,aAAS,KAAK,GAAG,eAAe,QAAQ;AAAA,EAC1C,SAAS,GAAG;AACV,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,8BAA8B,aAAa,QAAQ,EAAE,UAAU,eAAe;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AACD,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,MAAI,SAAS,QAAQ;AACnB,eAAW,aAAa,SAAS,QAAQ;AACvC,YAAM,WAAWG,OAAK,UAAU,SAAS;AAEzC,UAAI,CAACJ,aAAW,QAAQ,GAAG;AACzB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,8BAA8B,SAAS;AAAA,UAChD,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAACG,UAAS,QAAQ,EAAE,YAAY,GAAG;AACrC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,8BAA8B,SAAS;AAAA,UAChD,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAGA,YAAM,YAAYC,OAAK,UAAU,UAAU;AAC3C,UAAI,CAACJ,aAAW,SAAS,GAAG;AAC1B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,oCAAoC,SAAS;AAAA,UACtD,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF;AAGA,YAAM,eAAeC,eAAa,WAAW,OAAO;AACpD,YAAM,cAAc,qBAAqB,YAAY;AACrD,iBAAW,OAAO,YAAY,QAAQ;AACpC,eAAO,KAAK;AAAA,UACV,GAAG;AAAA,UACH,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,iBAAW,QAAQ,YAAY,UAAU;AACvC,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,MAAM,GAAG,SAAS,IAAI,KAAK,IAAI;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,UAAiD;AACpF,QAAM,UAAU,oBAAI,IAA8B;AAElD,MAAI,CAACD,aAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAWE,aAAY,QAAQ,EAAE,OAAO,CAAC,SAAS;AACtD,UAAM,WAAWE,OAAK,UAAU,IAAI;AACpC,WAAOD,UAAS,QAAQ,EAAE,YAAY;AAAA,EACxC,CAAC;AAED,aAAW,YAAY,UAAU;AAC/B,UAAM,WAAWC,OAAK,UAAU,QAAQ;AACxC,YAAQ,IAAI,UAAU,sBAAsB,QAAQ,CAAC;AAAA,EACvD;AAEA,SAAO;AACT;AAKO,SAAS,qBAAqB,SAA0C;AAC7E,QAAM,WAAoC,CAAC;AAE3C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,MAAM,CAAC,MAAM,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAM,MAAM,CAAC,EAAE,UAAU,CAAC,MAAM,MAAM,KAAK;AAClE,MAAI,mBAAmB,IAAI;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,MAAM,MAAM,GAAG,iBAAiB,CAAC;AAC1D,MAAI,aAA4B;AAChC,MAAI,qBAA+B,CAAC;AACpC,MAAI,UAAU;AAEd,aAAW,QAAQ,kBAAkB;AAEnC,QAAI,WAAW,KAAK,WAAW,MAAM,GAAG;AACtC,yBAAmB,KAAK,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AAC5C;AAAA,IACF;AAGA,QAAI,WAAW,CAAC,KAAK,WAAW,MAAM,GAAG;AACvC,UAAI,YAAY;AACd,iBAAS,UAAU,IAAI;AAAA,MACzB;AACA,gBAAU;AACV,2BAAqB,CAAC;AACtB,mBAAa;AAAA,IACf;AAGA,UAAM,QAAQ,KAAK,MAAM,uCAAuC;AAChE,QAAI,OAAO;AACT,YAAM,CAAC,EAAE,KAAK,KAAK,IAAI;AACvB,UAAI,MAAM,KAAK,MAAM,IAAI;AAEvB,qBAAa;AACb,kBAAU;AACV,6BAAqB,CAAC;AAAA,MACxB,WAAW,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAEvD,iBAAS,GAAG,IAAI,MACb,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AAAA,MACpD,WAAW,UAAU,UAAU,UAAU,SAAS;AAChD,iBAAS,GAAG,IAAI,UAAU;AAAA,MAC5B,WAAW,QAAQ,KAAK,KAAK,GAAG;AAC9B,iBAAS,GAAG,IAAI,SAAS,OAAO,EAAE;AAAA,MACpC,OAAO;AACL,iBAAS,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW,YAAY;AACzB,aAAS,UAAU,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;;;ADpXA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYC,SAAQ,UAAU;AAGpC,IAAM,oBAAoBC,OAAK,WAAW,OAAO;AAK1C,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,cAA4C,oBAAI,IAAI;AAAA,EACpD,eAA8C,oBAAI,IAAI;AAAA,EAE9D,YAAY,gBAAyB;AACnC,SAAK,WAAW,kBAAkB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA2C;AAC/C,UAAM,QAA2B,CAAC;AAElC,QAAI,CAACC,aAAW,KAAK,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,WAAWC,aAAY,KAAK,QAAQ,EAAE,OAAO,CAAC,SAAS;AAC3D,YAAM,WAAWF,OAAK,KAAK,UAAU,IAAI;AACzC,aAAOG,UAAS,QAAQ,EAAE,YAAY;AAAA,IACxC,CAAC;AAED,eAAW,YAAY,UAAU;AAC/B,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,SAAS,QAAQ;AACzC,YAAI,MAAM;AACR,gBAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,UAAmD;AAEhE,QAAI,KAAK,YAAY,IAAI,QAAQ,GAAG;AAClC,aAAO,KAAK,YAAY,IAAI,QAAQ;AAAA,IACtC;AAEA,UAAM,WAAWH,OAAK,KAAK,UAAU,QAAQ;AAC7C,UAAM,eAAeA,OAAK,UAAU,WAAW;AAE/C,QAAI,CAACC,aAAW,YAAY,GAAG;AAC7B,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,sBAAsB,QAAQ;AACjD,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,IAAI;AAAA,QACR,iBAAiB,QAAQ,MAAM,WAAW,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACnF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK;AAAA,MACpBG,eAAa,cAAc,OAAO;AAAA,IACpC;AAGA,SAAK,YAAY,IAAI,UAAU,QAAQ;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAA+C;AAClE,UAAM,OAAO,MAAM,KAAK,SAAS,QAAQ;AACzC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mBAAmB,QAAQ,EAAE;AAAA,IAC/C;AAEA,UAAM,SAA6B,CAAC;AAEpC,eAAW,aAAa,KAAK,QAAQ;AACnC,YAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,SAAS;AACtD,UAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,UACA,WACkC;AAClC,UAAM,UAAU,GAAG,QAAQ,IAAI,SAAS;AAGxC,QAAI,KAAK,aAAa,IAAI,OAAO,GAAG;AAClC,aAAO,KAAK,aAAa,IAAI,OAAO;AAAA,IACtC;AAEA,UAAM,YAAYJ,OAAK,KAAK,UAAU,UAAU,WAAW,UAAU;AAErE,QAAI,CAACC,aAAW,SAAS,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,UAAUG,eAAa,WAAW,OAAO;AAC/C,UAAM,cAAc,qBAAqB,OAAO;AAGhD,UAAM,WAAqC;AAAA,MACzC,UAAU,YAAY;AAAA,MACtB,eAAe,YAAY;AAAA,MAC3B,YAAY,YAAY;AAAA,MACxB,eAAe,YAAY;AAAA,MAC3B,eAAe,YAAY;AAAA,MAC3B,GAAG;AAAA,IACL;AAEA,UAAM,QAA0B;AAAA,MAC9B,IAAI;AAAA,MACJ,MAAO,YAAY,QAAmB,gBAAgB,SAAS;AAAA,MAC/D,aAAc,YAAY,eAA0B;AAAA,MACpD,SAAU,YAAY,WAAsB;AAAA,MAC5C,MAAM;AAAA,MACN,MAAO,YAAY,QAAqB,CAAC;AAAA,MACzC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAGA,SAAK,aAAa,IAAI,SAAS,KAAK;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAmD;AACpE,UAAM,CAAC,UAAU,SAAS,IAAI,QAAQ,MAAM,GAAG;AAC/C,QAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,UAAU,UAAU,SAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAA4C;AAC7D,UAAM,YAAgC,CAAC;AACvC,UAAM,QAAQ,MAAM,KAAK,aAAa;AAEtC,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,KAAK,eAAe,KAAK,IAAI;AAClD,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAEA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,UAAU,OAAO,CAAC,UAAU;AACjC,aACE,MAAM,KAAK,YAAY,EAAE,SAAS,UAAU,KAC5C,MAAM,YAAY,YAAY,EAAE,SAAS,UAAU,KACnD,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY,EAAE,SAAS,UAAU,CAAC,KAC/D,MAAM,SAAS,UAAU;AAAA,QAAK,CAAC,MAC7B,EAAE,YAAY,EAAE,SAAS,UAAU;AAAA,MACrC;AAAA,IAEJ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAA0C;AAC7D,UAAM,YAAgC,CAAC;AACvC,UAAM,QAAQ,MAAM,KAAK,aAAa;AAEtC,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,KAAK,eAAe,KAAK,IAAI;AAClD,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAEA,UAAM,WAAW,IAAI,YAAY;AACjC,WAAO,UAAU;AAAA,MAAO,CAAC,UACvB,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,QAAQ;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAA2B;AACpC,UAAM,WAAWJ,OAAK,KAAK,UAAU,QAAQ;AAC7C,UAAM,eAAeA,OAAK,UAAU,WAAW;AAC/C,WAAOC,aAAW,YAAY;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;AAKA,SAAS,gBAAgB,SAAyB;AAChD,SAAO,QACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;AAKO,SAAS,wBACd,gBACmB;AACnB,SAAO,IAAI,kBAAkB,cAAc;AAC7C;AAKO,SAAS,qBAA6B;AAC3C,SAAO;AACT;;;AD/PA,IAAM,yBAAyB;AAKxB,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAoC;AAC9C,SAAK,cAAc,QAAQ;AAC3B,SAAK,SAAS,wBAAwB,QAAQ,QAAQ;AACtD,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,QAAQ,KAAK,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,UAA0C;AAC1D,UAAM,SAAwB;AAAA,MAC5B,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAGA,UAAM,OAAO,MAAM,KAAK,OAAO,SAAS,QAAQ;AAChD,QAAI,CAAC,MAAM;AACT,aAAO,UAAU;AACjB,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO,mBAAmB,QAAQ;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,MAAM,eAAe,QAAQ,GAAG;AACvC,YAAM,mBAAmB,KAAK,MAAM,eAAe,QAAQ,EAAE;AAC7D,UAAI,qBAAqB,KAAK,SAAS;AACrC,eAAO,QAAQ,KAAK,QAAQ;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,OAAO,eAAe,QAAQ;AACxD,UAAM,sBAAgC,CAAC;AAEvC,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,KAAK,oBAAoB,KAAK;AACpC,4BAAoB,KAAK,MAAM,EAAE;AACjC,eAAO,UAAU,KAAK,MAAM,EAAE;AAAA,MAChC,SAAS,GAAG;AACV,eAAO,OAAO,KAAK;AAAA,UACjB,MAAM,MAAM;AAAA,UACZ,OAAO,aAAa,QAAQ,EAAE,UAAU;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAGA,SAAK,MAAM,eAAe,QAAQ,IAAI;AAAA,MACpC,SAAS,KAAK;AAAA,MACd,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,QAAQ;AAAA,MACR,UAAU,KAAK;AAAA,IACjB;AACA,SAAK,UAAU;AAGf,QAAI,KAAK,UAAU;AACjB,YAAM,KAAK,SAAS,QAAQ;AAAA,IAC9B;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAA0C;AAC9C,UAAM,SAAwB;AAAA,MAC5B,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAa;AAE7C,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,MAAM,KAAK,YAAY,KAAK,IAAI;AACnD,aAAO,UAAU,KAAK,GAAG,WAAW,SAAS;AAC7C,aAAO,QAAQ,KAAK,GAAG,WAAW,OAAO;AACzC,aAAO,OAAO,KAAK,GAAG,WAAW,MAAM;AAAA,IACzC;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAyC;AAC1D,UAAM,SAAwB;AAAA,MAC5B,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAa,OAAO;AACpD,QAAI,CAAC,OAAO;AACV,aAAO,UAAU;AACjB,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO,oBAAoB,OAAO;AAAA,MACpC,CAAC;AACD,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,MAAM,gBAAgB,OAAO,GAAG;AACvC,YAAM,mBAAmB,KAAK,MAAM,gBAAgB,OAAO,EAAE;AAC7D,UAAI,qBAAqB,MAAM,SAAS;AACtC,eAAO,QAAQ,KAAK,OAAO;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,oBAAoB,KAAK;AACpC,aAAO,UAAU,KAAK,OAAO;AAG7B,WAAK,MAAM,gBAAgB,OAAO,IAAI;AAAA,QACpC,SAAS,MAAM;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,cAAc,CAAC;AAAA,MACjB;AACA,WAAK,UAAU;AAGf,UAAI,KAAK,UAAU;AACjB,cAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF,SAAS,GAAG;AACV,aAAO,UAAU;AACjB,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO,aAAa,QAAQ,EAAE,UAAU;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,UAAiC;AACnD,UAAM,WAAW,KAAK,MAAM,eAAe,QAAQ;AACnD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE;AAAA,IACnD;AAGA,eAAW,WAAW,SAAS,QAAQ;AACrC,YAAM,KAAK,mBAAmB,OAAO;AACrC,aAAO,KAAK,MAAM,gBAAgB,OAAO;AAAA,IAC3C;AAGA,WAAO,KAAK,MAAM,eAAe,QAAQ;AACzC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,SAAgC;AACnD,UAAM,YAAY,KAAK,MAAM,gBAAgB,OAAO;AACpD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,IACnD;AAEA,UAAM,KAAK,mBAAmB,OAAO;AACrC,WAAO,KAAK,MAAM,gBAAgB,OAAO;AACzC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,UAAkB,QAAsD;AACrF,UAAM,SAAgC;AAAA,MACpC,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,IACX;AAEA,UAAM,WAAW,KAAK,MAAM,eAAe,QAAQ;AACnD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE;AAAA,IACnD;AAEA,eAAW,WAAW,SAAS,QAAQ;AACrC,YAAM,cAAc,MAAM,KAAK,UAAU,SAAS,MAAM;AACxD,aAAO,OAAO,KAAK,GAAG,YAAY,MAAM;AACxC,aAAO,OAAO,KAAK,GAAG,YAAY,MAAM;AAAA,IAC1C;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAiB,QAAsD;AACrF,UAAM,SAAgC;AAAA,MACpC,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAa,OAAO;AACpD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,IAC/C;AAEA,UAAM,eAAe,UAAU,KAAK,aAAa;AACjD,UAAM,WAAW,IAAI,mBAAmB;AACxC,UAAM,eAA4B,CAAC;AAEnC,eAAW,SAAS,cAAc;AAChC,UAAI;AAEF,cAAM,oBAAoB,SAAS,iBAAiB,MAAM,SAAS,OAAO;AAAA,UACxE,gBAAgB;AAAA,QAClB,CAAC;AAED,YAAI,CAAC,kBAAkB,SAAS;AAC9B,iBAAO,OAAO,KAAK;AAAA,YACjB,OAAO;AAAA,YACP;AAAA,YACA,OAAO,kBAAkB,cAAc,KAAK,IAAI,KAAK;AAAA,UACvD,CAAC;AACD;AAAA,QACF;AAGA,cAAM,KAAK,kBAAkB,SAAS,kBAAkB,SAAS,KAAK;AAEtE,qBAAa,KAAK,KAAK;AACvB,eAAO,OAAO,KAAK,EAAE,OAAO,SAAS,QAAQ,CAAC,KAAK,EAAE,CAAC;AAAA,MACxD,SAAS,GAAG;AACV,eAAO,OAAO,KAAK;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,aAAa,QAAQ,EAAE,UAAU;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,gBAAgB,OAAO,GAAG;AACvC,WAAK,MAAM,gBAAgB,OAAO,EAAE,eAAe;AAAA,IACrD;AACA,SAAK,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AAC7C,SAAK,UAAU;AAEf,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAsD;AAClE,UAAM,SAAgC;AAAA,MACpC,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,IACX;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG,OAAO,KAAK,KAAK,MAAM,eAAe;AAAA,MACzC,GAAG,OAAO,OAAO,KAAK,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM;AAAA,IACrE;AAEA,UAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC;AAE/C,eAAW,WAAW,gBAAgB;AACpC,YAAM,cAAc,MAAM,KAAK,UAAU,SAAS,MAAM;AACxD,aAAO,OAAO,KAAK,GAAG,YAAY,MAAM;AACxC,aAAO,OAAO,KAAK,GAAG,YAAY,MAAM;AAAA,IAC1C;AAEA,WAAO,UAAU,OAAO,OAAO,WAAW;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAiF;AAC/E,WAAO,OAAO,QAAQ,KAAK,MAAM,cAAc,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,MACtE;AAAA,MACA,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,sBAKG;AACD,UAAM,kBAAkB,OAAO,OAAO,KAAK,MAAM,cAAc,EAAE;AAAA,MAC/D,CAAC,SACC,KAAK,OAAO,IAAI,CAAC,aAAa;AAAA,QAC5B,IAAI;AAAA,QACJ,SAAS,KAAK,MAAM,gBAAgB,OAAO,GAAG,WAAW,KAAK;AAAA,QAC9D,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,QAC1B,cAAc,KAAK,MAAM,gBAAgB,OAAO,GAAG,gBAAgB,CAAC;AAAA,MACtE,EAAE;AAAA,IACN;AAEA,UAAM,mBAAmB,OAAO,QAAQ,KAAK,MAAM,eAAe,EAC/D,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAC1D,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO;AAAA,MACpB;AAAA,MACA,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,cAAc,KAAK;AAAA,IACrB,EAAE;AAEJ,WAAO,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAiD;AACrD,UAAM,WAAW,MAAM,KAAK,OAAO,aAAa;AAChD,WAAO,SAAS,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,eAAe,KAAK,IAAI,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiE;AAC5E,UAAM,QAAQ,MAAM,KAAK,OAAO,aAAa;AAC7C,UAAM,YAAgC,CAAC;AAEvC,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,KAAK,OAAO,eAAe,KAAK,IAAI;AACzD,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAEA,QAAI,iBAAiB;AACrB,QAAI,gBAAgB;AAGpB,QAAI,MAAM,OAAO;AACf,YAAM,aAAa,MAAM,MAAM,YAAY;AAC3C,uBAAiB,eAAe;AAAA,QAC9B,CAAC,UACC,MAAM,KAAK,YAAY,EAAE,SAAS,UAAU,KAC5C,MAAM,YAAY,YAAY,EAAE,SAAS,UAAU,KACnD,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,MAC/D;AACA,sBAAgB,cAAc;AAAA,QAC5B,CAAC,SACC,KAAK,KAAK,YAAY,EAAE,SAAS,UAAU,KAC3C,KAAK,YAAY,YAAY,EAAE,SAAS,UAAU,KAClD,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,MAC9D;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG;AACvC,YAAM,YAAY,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AACvD,uBAAiB,eAAe;AAAA,QAAO,CAAC,UACtC,UAAU;AAAA,UAAK,CAAC,QACd,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,GAAG;AAAA,QAChD;AAAA,MACF;AACA,sBAAgB,cAAc;AAAA,QAAO,CAAC,SACpC,UAAU,KAAK,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,GAAG,CAAC;AAAA,MACxE;AAAA,IACF;AAGA,QAAI,MAAM,MAAM;AACd,uBAAiB,eAAe;AAAA,QAC9B,CAAC,UAAU,MAAM,SAAS,MAAM;AAAA,MAClC;AACA,sBAAgB,cAAc,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,IAAI;AAAA,IACzE;AAGA,QAAI,MAAM,YAAY;AACpB,uBAAiB,eAAe;AAAA,QAC9B,CAAC,UAAU,MAAM,SAAS,eAAe,MAAM;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,eAAe,SAAS,cAAc;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIQ,YAA8B;AACpC,UAAM,YAAYI,OAAK,KAAK,aAAa,sBAAsB;AAC/D,QAAIC,aAAW,SAAS,GAAG;AACzB,UAAI;AACF,eAAO,KAAK,MAAMC,eAAa,WAAW,OAAO,CAAC;AAAA,MACpD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB,CAAC;AAAA,MACjB,iBAAiB,CAAC;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,UAAM,YAAYF,OAAK,KAAK,aAAa,sBAAsB;AAC/D,UAAM,MAAMG,SAAQ,SAAS;AAC7B,QAAI,CAACF,aAAW,GAAG,GAAG;AACpB,MAAAG,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,IAAAC,gBAAc,WAAW,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,EACvE;AAAA,EAEA,MAAc,oBAAoB,OAAwC;AAExE,UAAM,YAAYL,OAAK,KAAK,aAAa,aAAa,eAAe,QAAQ;AAC7E,UAAM,WAAWA,OAAK,WAAW,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AAEnE,QAAI,CAACC,aAAW,QAAQ,GAAG;AACzB,MAAAG,YAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC;AAEA,UAAM,aAAaJ,OAAK,UAAU,UAAU;AAC5C,IAAAK,gBAAc,YAAY,MAAM,SAAS,OAAO;AAAA,EAClD;AAAA,EAEA,MAAc,mBAAmB,UAAiC;AAAA,EAIlE;AAAA,EAEA,MAAc,kBACZ,SACA,SACA,OACe;AACf,UAAM,YAAoC;AAAA,MACxC,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,cAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAa;AAAA,MACb,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAEA,UAAM,WAAW,UAAU,KAAK;AAChC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAAA,IAC3C;AAEA,UAAM,YAAYL,OAAK,KAAK,aAAa,QAAQ;AACjD,QAAI,CAACC,aAAW,SAAS,GAAG;AAC1B,MAAAG,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,UAAM,YAAY,QAAQ,MAAM,GAAG,EAAE,CAAC;AACtC,QAAI;AAEJ,QAAI,UAAU,UAAU;AACtB,iBAAW,GAAG,SAAS;AAAA,IACzB,WAAW,UAAU,oBAAoB,UAAU,YAAY;AAC7D,iBAAW,GAAG,SAAS;AAAA,IACzB,OAAO;AACL,iBAAW,GAAG,SAAS;AAAA,IACzB;AAEA,UAAM,aAAaJ,OAAK,WAAW,QAAQ;AAC3C,IAAAK,gBAAc,YAAY,SAAS,OAAO;AAAA,EAC5C;AAAA,EAEQ,eAA4B;AAClC,UAAM,SAAsB,CAAC;AAC7B,UAAM,YAAmC;AAAA,MACvC,CAAC,eAAe,SAAS;AAAA,MACzB,CAAC,UAAU,SAAS;AAAA,MACpB,CAAC,SAAS,QAAQ;AAAA,MAClB,CAAC,cAAc,SAAS;AAAA,MACxB,CAAC,YAAY,WAAW;AAAA,MACxB,CAAC,eAAe,cAAc;AAAA,MAC9B,CAAC,OAAO,MAAM;AAAA,MACd,CAAC,YAAY,WAAW;AAAA,MACxB,CAAC,SAAS,UAAU;AAAA,MACpB,CAAC,kBAAkB,SAAS;AAAA,MAC5B,CAAC,SAAS,QAAQ;AAAA,MAClB,CAAC,QAAQ,WAAW;AAAA,MACpB,CAAC,YAAY,OAAO;AAAA,MACpB,CAAC,OAAO,MAAM;AAAA,MACd,CAAC,QAAQ,OAAO;AAAA,MAChB,CAAC,YAAY,WAAW;AAAA,IAC1B;AAEA,eAAW,CAAC,OAAO,GAAG,KAAK,WAAW;AACpC,UAAIJ,aAAWD,OAAK,KAAK,aAAa,GAAG,CAAC,GAAG;AAC3C,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAGA,WAAO,KAAK,WAAW;AAEvB,WAAO;AAAA,EACT;AACF;AAKO,SAAS,yBACd,SACoB;AACpB,SAAO,IAAI,mBAAmB,OAAO;AACvC;;;AG9kBA,SAAS,cAAAM,cAAY,gBAAAC,gBAAc,iBAAAC,iBAAe,aAAAC,mBAAiB;AACnE,SAAS,QAAAC,QAAM,WAAAC,iBAAe;AAC9B,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,iBAAiB;AAc1B,IAAM,sBAAsB;AAKrB,IAAM,cAAN,MAAkB;AAAA,EACf,QAAgC,oBAAI,IAAI;AAAA,EACxC,YAAoC,oBAAI,IAAI;AAAA,EAC5C;AAAA,EAER,YAAY,SAA6B;AACvC,SAAK,UAAU;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ,cAAcF,OAAK,QAAQ,aAAa,mBAAmB;AAAA,MAC/E,UAAU,QAAQ,YAAY;AAAA,MAC9B,sBAAsB,QAAQ,wBAAwB;AAAA,IACxD;AAEA,QAAI,KAAK,QAAQ,UAAU;AACzB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAA0D;AACrE,UAAM,WAAsB;AAAA,MAC1B,GAAG;AAAA,MACH,IAAI,KAAK,MAAME,YAAW;AAAA,MAC1B,QAAQ,KAAK,UAAU,KAAK,QAAQ;AAAA,MACpC,SAAS,KAAK,WAAW;AAAA,MACzB,UAAU,KAAK,YAAY;AAAA,IAC7B;AAEA,SAAK,MAAM,IAAI,SAAS,IAAI,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAqB;AAClC,WAAO,KAAK,MAAM,OAAO,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAmC;AACzC,WAAO,KAAK,MAAM,IAAI,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,cAA2B;AACzB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAA+B;AAC9C,WAAO,KAAK,YAAY,EACrB,OAAO,CAAC,SAAS,KAAK,UAAU,SAAS,KAAK,OAAO,EACrD,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAY,SAAoD;AACzE,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG;AAC9C,SAAK,MAAM,IAAI,IAAI,OAAO;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAqB;AAC9B,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,QAAI,CAAC,KAAM,QAAO;AAClB,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAqB;AAC/B,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,QAAI,CAAC,KAAM,QAAO;AAClB,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAkB,SAAkD;AAChF,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAA4B,CAAC;AACnC,UAAM,kBAAoC,CAAC;AAC3C,UAAM,SAAsB,CAAC;AAE7B,UAAM,QAAQ,KAAK,iBAAiB,KAAK;AAEzC,eAAW,QAAQ,OAAO;AACxB,UAAI;AAEF,YAAI,KAAK,WAAW,CAAC,KAAK,eAAe,KAAK,SAAS,QAAQ,OAAO,GAAG;AACvE;AAAA,QACF;AAGA,YAAI,KAAK,aAAa,CAAC,KAAK,kBAAkB,KAAK,WAAW,OAAO,GAAG;AACtE;AAAA,QACF;AAEA,qBAAa,KAAK,IAAI;AAGtB,cAAM,gBAAgB,KAAK,oBAAoB,MAAM,QAAQ,KAAK;AAGlE,mBAAW,WAAW,cAAc,QAAQ;AAC1C,cAAI;AACF,kBAAM,YAAY,MAAM,KAAK,cAAc,SAAS,eAAe,OAAO;AAC1E,4BAAgB,KAAK,SAAS;AAAA,UAChC,SAAS,KAAK;AACZ,mBAAO,KAAK;AAAA,cACV,QAAQ,KAAK;AAAA,cACb;AAAA,cACA,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,cAC9C,OAAO,eAAe,QAAQ,IAAI,QAAQ;AAAA,YAC5C,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV,QAAQ,KAAK;AAAA,UACb,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,UAC9C,OAAO,eAAe,QAAQ,IAAI,QAAQ;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,SAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,KAAK,IAAI,IAAI;AAAA,IAChC;AAGA,UAAM,KAAK,gBAAgB,OAAO,SAAS,MAAM;AAEjD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAmC;AAC7C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAmC;AAChD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,CAACN,aAAW,KAAK,QAAQ,UAAU,GAAG;AACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAUC,eAAa,KAAK,QAAQ,YAAY,OAAO;AAC7D,YAAM,SAAqB,KAAK,MAAM,OAAO;AAE7C,WAAK,MAAM,MAAM;AACjB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,aAAK,MAAM,IAAI,KAAK,IAAI;AAAA,UACtB,GAAG;AAAA,UACH,QAAQ,KAAK,UAAU,OAAO,UAAU,UAAU,KAAK,QAAQ;AAAA,UAC/D,UAAU,KAAK,YAAY,OAAO,UAAU,YAAY;AAAA,UACxD,SAAS,KAAK,WAAW,OAAO,UAAU,WAAW;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,UAAM,SAAqB;AAAA,MACzB,SAAS;AAAA,MACT,OAAO,KAAK,YAAY;AAAA,MACxB,UAAU;AAAA,QACR,QAAQ,KAAK,QAAQ;AAAA,QACrB,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,MAAMI,UAAQ,KAAK,QAAQ,UAAU;AAC3C,QAAI,CAACL,aAAW,GAAG,GAAG;AACpB,MAAAG,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAEA,IAAAD,gBAAc,KAAK,QAAQ,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAoD;AACrE,UAAM,QAAQ,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO;AAExD,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,KAAK,wBAAwB,KAAK;AAAA,MAC3C,KAAK;AACH,eAAO,KAAK,oBAAoB,KAAK;AAAA,MACvC,KAAK;AACH,eAAO,KAAK,sBAAsB,KAAK;AAAA,MACzC;AACE,eAAO,KAAK,qBAAqB,KAAK;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,OAA6C;AAC3E,UAAM,cAAyC,CAAC;AAEhD,eAAW,QAAQ,OAAO;AAExB,YAAM,cAAc,KAAK,qBAAqB,KAAK,KAAK;AACxD,UAAI,CAAC,YAAa;AAElB,kBAAY,KAAK;AAAA,QACf,OAAO;AAAA,QACP,SAAS,KAAK,sBAAsB,IAAI;AAAA,QACxC,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,OAAO,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAiC;AAC5D,UAAM,UAA4C;AAAA,MAChD,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,eAAe;AAAA,MACf,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB;AACA,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAyB;AACrD,UAAM,YAAY,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AAC1D,WAAO,4BAA4B,SAAS;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAA4B;AACtD,UAAM,QAAkB,CAAC,2CAA2C,EAAE;AAEtE,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,MAAM,KAAK,KAAK,OAAO;AAClC,YAAM,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,UAAU;AACzD,iBAAW,SAAS,KAAK,QAAQ;AAC/B,cAAM,KAAK,kBAAkB,KAAK,EAAE;AAAA,MACtC;AACA,UAAI,KAAK,SAAS;AAChB,cAAM,KAAK,cAAc,KAAK,OAAO,EAAE;AAAA,MACzC;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAA6C;AACzE,WAAO;AAAA,MACL,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA,QAC7B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,QAC/C,SAAS,KAAK;AAAA,MAChB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA4B;AACvD,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAc,oBAAI,IAA4B;AACpD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,YAAY,IAAI,KAAK,KAAK,KAAK,CAAC;AAC9C,YAAM,KAAK,IAAI;AACf,kBAAY,IAAI,KAAK,OAAO,KAAK;AAAA,IACnC;AAEA,eAAW,CAAC,OAAO,UAAU,KAAK,aAAa;AAC7C,YAAM,KAAK,SAAS,MAAM,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE;AACtF,iBAAW,QAAQ,YAAY;AAC7B,cAAM,KAAK,eAAe,KAAK,OAAO,KAAK,IAAI,CAAC,EAAE;AAClD,YAAI,KAAK,SAAS;AAChB,gBAAM,KAAK,sBAAsB,KAAK,OAAO,EAAE;AAAA,QACjD;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAA0B,SAA0B;AACzE,QAAI,mBAAmB,QAAQ;AAC7B,aAAO,QAAQ,KAAK,OAAO;AAAA,IAC7B;AAEA,WAAO,UAAU,SAAS,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,WAAmB,SAA+B;AAG1E,QAAI;AACF,YAAM,cAAc;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ,YAAY,CAAC;AAAA,MACjC;AAGA,UAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,cAAM,CAAC,MAAM,KAAK,IAAI,UAAU,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC/D,cAAM,UAAU,KAAK,aAAa,MAAM,WAAW;AACnD,cAAM,WAAW,MAAM,QAAQ,SAAS,EAAE;AAC1C,eAAO,YAAY;AAAA,MACrB;AAEA,UAAI,UAAU,SAAS,YAAY,GAAG;AACpC,cAAM,QAAQ,UAAU,MAAM,iCAAiC;AAC/D,YAAI,OAAO;AACT,gBAAM,CAAC,EAAE,MAAM,MAAM,IAAI;AACzB,gBAAM,MAAM,KAAK,aAAa,MAAM,WAAW;AAC/C,iBAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,MAAM;AAAA,QACvD;AAAA,MACF;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAaK,OAAc,SAA2C;AAC5E,UAAM,QAAQA,MAAK,MAAM,GAAG;AAC5B,QAAI,UAAmB;AAEvB,eAAW,QAAQ,OAAO;AACxB,UAAI,WAAW,OAAO,YAAY,YAAY,QAAQ,SAAS;AAC7D,kBAAW,QAAoC,IAAI;AAAA,MACrD,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAiB,OAA6B;AACxE,QAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,eAAe,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,KAAK,eAAe,KAAK;AAAA,MAC5B,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,SACA,MACA,SACyB;AACzB,UAAM,YAA4B;AAAA,MAChC;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,aAAa,oBAAI,KAAK;AAAA,IACxB;AAEA,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AAEH,kBAAU,UAAU,MAAM,KAAK,iBAAiB,SAAS,OAAO;AAChE;AAAA,MACF,KAAK;AAEH,kBAAU,YAAY,IAAI,OAAO;AACjC;AAAA,MACF,KAAK;AAEH,kBAAU,UAAU,qBAAqB,OAAO;AAChD;AAAA,IACJ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,SAAiB,UAAwC;AAGtF,WAAO,YAAY,OAAO;AAAA;AAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,OACA,SACA,QACe;AACf,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,cAAM,SAAS,OAAO,SAAS,MAAM;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,SAA0C;AAC1E,SAAO,IAAI,YAAY,OAAO;AAChC;;;ACphBA,SAAS,aAA6B;AACtC,SAAS,QAAAC,QAAM,YAAAC,iBAAgB;AAc/B,SAAS,SACP,IACA,OACkC;AAClC,MAAI,YAAkD;AACtD,SAAO,IAAI,SAAwB;AACjC,QAAI,UAAW,cAAa,SAAS;AACrC,gBAAY,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK;AAAA,EACjD;AACF;AAKO,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,WAAmC,oBAAI,IAAI;AAAA,EAC3C,YAAoC,oBAAI,IAAI;AAAA,EAC5C,YAAY;AAAA,EACZ,eAA0B;AAAA,EAElC,YAAY,aAA0B,SAA+B;AACnE,SAAK,cAAc;AACnB,SAAK,UAAU;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ,cAAc;AAAA,MAClC,YAAY,QAAQ,cAAc;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAyB;AAC7B,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AACjB,SAAK,eAAe,SAAS;AAE7B,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,iBAAiB;AAAA,IACxB;AAGA,SAAK,aAAa,iBAAiB,cAAc;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,CAAC,KAAK,UAAW;AAGrB,SAAK,aAAa,eAAe,aAAa;AAE9C,SAAK,gBAAgB;AACrB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAwB;AAC/B,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,OACA,SACA,UAC4B;AAC5B,UAAM,UAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,aAAa,KAAK,QAAQ;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,UAAM,SAAS,MAAM,KAAK,YAAY,QAAQ,OAAO,OAAO;AAG5D,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,cAAM,SAAS,OAAO,SAAS,MAAM;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAA8C;AAClE,WAAO,KAAK,aAAa,aAAa,UAAU,EAAE,SAAS,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAA8C;AAClE,WAAO,KAAK,aAAa,aAAa,UAAU,EAAE,SAAS,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,UAA8C;AACpE,WAAO,KAAK,aAAa,eAAe,UAAU,EAAE,SAAS,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,UAA8C;AACpE,WAAO,KAAK,aAAa,eAAe,UAAU,EAAE,SAAS,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,UAAkB,QAA6C;AACpF,WAAO,KAAK,aAAa,cAAc,UAAU,EAAE,UAAU,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,UACA,QACA,SAC4B;AAC5B,WAAO,KAAK,aAAa,iBAAiB,UAAU,EAAE,UAAU,QAAQ,QAAQ,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAA8C;AACnE,WAAO,KAAK,aAAa,cAAc,cAAc,EAAE,QAAQ,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,YAAqB,SAA8C;AACzF,WAAO,KAAK,aAAa,eAAe,cAAc,EAAE,YAAY,QAAQ,CAAC;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAuB,SAA8C;AACtF,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,UAAM,aAAa,iBAAiB,QAAQ,MAAM,QAAQ;AAC1D,WAAO,KAAK,aAAa,eAAe,cAAc,EAAE,OAAO,cAAc,OAAO,YAAY,QAAQ,CAAC;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAAkB,OAA4C;AAClF,WAAO,KAAK,aAAa,aAAa,UAAU,EAAE,UAAU,MAAM,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,UAA8C;AAClE,WAAO,KAAK,aAAa,aAAa,UAAU,EAAE,SAAS,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAA8C;AACpE,WAAO,KAAK,aAAa,eAAe,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAA4C;AACjE,WAAO,KAAK,aAAa,cAAc,SAAS,EAAE,MAAM,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAkD;AACtD,WAAO,KAAK,aAAa,iBAAiB,SAAS,CAAC,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAmC;AAC7C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAmC;AAChD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAyB;AAC/B,QAAI;AACF,YAAM,UAAU;AAAA,QACd,KAAK,QAAQ;AAAA,QACb,EAAE,WAAW,KAAK;AAAA,QAClB,SAAS,CAAC,WAAmB,aAA4B;AACvD,cAAI,CAAC,SAAU;AAEf,gBAAM,eAAeA,UAAS,KAAK,QAAQ,aAAaD,OAAK,KAAK,QAAQ,aAAa,QAAQ,CAAC;AAGhG,cAAI,KAAK,aAAa,YAAY,EAAG;AAErC,cAAI,cAAc,UAAU;AAE1B,iBAAK,kBAAkB,YAAY;AAAA,UACrC,WAAW,cAAc,UAAU;AACjC,iBAAK,gBAAgB,YAAY;AAAA,UACnC;AAAA,QACF,GAAG,KAAK,QAAQ,UAAU;AAAA,MAC5B;AAEA,WAAK,SAAS,IAAI,QAAQ,OAAO;AAAA,IACnC,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAwB;AAC9B,eAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAC5C,cAAQ,MAAM;AAAA,IAChB;AACA,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAA2B;AAC9C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,YAAY,KAAK,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,EAC/D;AACF;AAKO,SAAS,oBACd,aACA,SACoB;AACpB,SAAO,IAAI,mBAAmB,aAAa,OAAO;AACpD;;;ACnTA,SAAS,cAAAE,oBAAkB;;;ACA3B,SAAS,cAAAC,oBAAkB;AAepB,IAAM,cAAN,MAAkB;AAAA,EACf,QAA2B,oBAAI,IAAI;AAAA,EACnC,YAAoC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAKpD,WACE,MACA,aACA,MACA,SAMM;AACN,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,OAAa;AAAA,MACjB,IAAIA,aAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS,SAAS,CAAC;AAAA,MAC1B,QAAQ;AAAA,MACR,UAAU,SAAS,YAAY;AAAA,MAC/B,cAAc,SAAS,gBAAgB,CAAC;AAAA,MACxC,WAAW;AAAA,MACX,WAAW;AAAA,MACX,UAAU,SAAS;AAAA,IACrB;AAEA,SAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAC5B,SAAK,KAAK,gBAAgB,IAAI;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAkC;AACxC,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA6B;AACrC,QAAI,QAAQ,KAAK,YAAY;AAE7B,QAAI,QAAQ;AACV,UAAI,OAAO,QAAQ;AACjB,cAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,SAAS,CAAC,OAAO,MAAM;AAC9E,gBAAQ,MAAM,OAAO,CAAC,MAAM,SAAS,SAAS,EAAE,MAAM,CAAC;AAAA,MACzD;AAEA,UAAI,OAAO,UAAU;AACnB,gBAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AAAA,MAC5D;AAEA,UAAI,OAAO,gBAAgB,QAAW;AACpC,gBAAQ,MAAM,OAAO,CAAC,OAAO,EAAE,YAAY,MAAM,OAAO,WAAY;AAAA,MACtE;AAEA,UAAI,CAAC,OAAO,kBAAkB;AAC5B,gBAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,QAAQ;AAAA,MAC/E;AAAA,IACF;AAGA,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM;AAC1B,YAAM,gBAAgB,EAAE,YAAY,MAAM,EAAE,YAAY;AACxD,UAAI,iBAAiB,EAAG,QAAO;AAC/B,aAAO,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,IACrD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAgB,SAAmC;AAC5D,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,YAAM,aAAa,KAAK,aAAa,OAAO,CAAC,UAAU;AACrD,cAAM,MAAM,KAAK,MAAM,IAAI,KAAK;AAChC,eAAO,CAAC,OAAO,IAAI,WAAW;AAAA,MAChC,CAAC;AAED,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,IAAI,MAAM,gDAAgD,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,MACzF;AAAA,IACF;AAEA,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,iBAAiB,IAAI;AAC/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAkC;AAC7C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAgB,MAAuD;AAChF,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,OAAO;AAAA,MACV,GAAG;AAAA,MACH,aAAa,oBAAI,KAAK;AAAA,IACxB;AACA,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,uBAAuB,IAAI;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAgB,YAAsC;AAChE,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,QAAQ,CAAC,KAAK,KAAM,QAAO;AAEhC,SAAK,KAAK,aAAa,oBAAI,KAAK;AAChC,SAAK,KAAK,aAAa;AACvB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,sBAAsB,IAAI;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAgB,QAAkC;AAC3D,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,QAAQ,CAAC,KAAK,KAAM,QAAO;AAEhC,SAAK,KAAK,kBAAkB;AAC5B,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,sBAAsB,IAAI;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAkC;AAC1C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,gBAAgB,IAAI;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAkC;AAC9C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAgB,QAAsC;AACjE,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,SAAK,SAAS,OAAO,UAAU,cAAc;AAC7C,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,OAAO,UAAU,mBAAmB,eAAe,IAAI;AACjE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAgB,QAAoC;AAC3D,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,aAAa,oBAAI,KAAK;AAAA,IACxB;AACA,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,SAAK,KAAK,eAAe,IAAI;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAgB,QAAkD;AAC7E,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,SAAK,YAAY,oBAAI,KAAK;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAyB;AAClC,WAAO,KAAK,MAAM,OAAO,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAwC;AACvD,WAAO,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,SAAyB;AACxC,WAAO,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0B;AACxB,WAAO,KAAK,iBAAiB,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,cAAgC;AAC9B,UAAM,UAAU,KAAK,gBAAgB;AAGrC,eAAW,QAAQ,SAAS;AAC1B,UAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,WAAW,GAAG;AACxD,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,KAAK,aAAa,MAAM,CAAC,UAAU;AACzD,cAAM,MAAM,KAAK,MAAM,IAAI,KAAK;AAChC,eAAO,OAAO,IAAI,WAAW;AAAA,MAC/B,CAAC;AAED,UAAI,iBAAiB;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA4B;AAC1B,UAAM,QAAQ,KAAK,YAAY;AAC/B,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,CAAC,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,QAAQ;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,WAME;AACA,UAAM,QAAQ,KAAK,YAAY;AAC/B,WAAO;AAAA,MACL,OAAO,MAAM;AAAA,MACb,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,UAAU,EAAE;AAAA,MAChF,YAAY,MAAM;AAAA,QAAO,CAAC,MACxB,CAAC,YAAY,gBAAgB,YAAY,eAAe,QAAQ,EAAE,SAAS,EAAE,MAAM;AAAA,MACrF,EAAE;AAAA,MACF,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,MACzD,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAmC;AAC7C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAmC;AAChD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAkB,MAAkB;AAC/C,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AAEF,cAAM,SAAS,SAAS,OAAO,IAAI;AAEnC,YAAI,kBAAkB,SAAS;AAC7B,iBAAO,MAAM,MAAM;AAAA,UAEnB,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAiB;AACf,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAqB;AAC5B,SAAK,MAAM;AACX,eAAW,QAAQ,OAAO;AAExB,YAAM,WAAiB;AAAA,QACrB,GAAG;AAAA,QACH,WAAW,IAAI,KAAK,KAAK,SAAS;AAAA,QAClC,WAAW,IAAI,KAAK,KAAK,SAAS;AAAA,QAClC,MAAM,KAAK,OACP;AAAA,UACE,GAAG,KAAK;AAAA,UACR,aAAa,IAAI,KAAK,KAAK,KAAK,WAAW;AAAA,UAC3C,YAAY,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,KAAK,UAAU,IAAI;AAAA,QACtE,IACA;AAAA,QACJ,QAAQ,KAAK,SACT;AAAA,UACE,GAAG,KAAK;AAAA,UACR,aAAa,IAAI,KAAK,KAAK,OAAO,WAAW;AAAA,QAC/C,IACA;AAAA,MACN;AACA,WAAK,MAAM,IAAI,SAAS,IAAI,QAAQ;AAAA,IACtC;AAAA,EACF;AACF;AAKO,SAAS,oBAAiC;AAC/C,SAAO,IAAI,YAAY;AACzB;;;AC/aA,SAAS,cAAAC,oBAAkB;AAMpB,IAAM,iBAAN,MAAqB;AAAA,EAClB,WAA0B,CAAC;AAAA,EAC3B,WAA6C,oBAAI,IAAI;AAAA,EACrD,iBAAsC,oBAAI,IAAI;AAAA,EAC9C;AAAA,EAER,YAAY,SAAoC;AAC9C,SAAK,cAAc,SAAS,eAAe;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,MACA,IACA,SACA,SAKsB;AACtB,UAAM,UAAuB;AAAA,MAC3B,IAAIA,aAAW;AAAA,MACf,MAAM,SAAS,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,WAAW,OAAO;AACvB,UAAM,KAAK,eAAe,IAAI,OAAO;AACrC,UAAM,KAAK,qBAAqB,OAAO;AAEvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,MACA,SACA,SAIsB;AACtB,UAAM,UAAuB;AAAA,MAC3B,IAAIA,aAAW;AAAA,MACf,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,WAAW,OAAO;AAGvB,eAAW,CAAC,SAAS,QAAQ,KAAK,KAAK,UAAU;AAC/C,UAAI,YAAY,MAAM;AACpB,mBAAW,WAAW,UAAU;AAC9B,cAAI;AACF,kBAAM,QAAQ,OAAO;AAAA,UACvB,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,qBAAqB,OAAO;AAEvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,MACA,UACA,QACA,aACsB;AACtB,WAAO,KAAK,KAAK,MAAM,UAAU,aAAa;AAAA,MAC5C,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,UACA,YACA,QACA,UACsB;AACtB,WAAO,KAAK,KAAK,UAAU,YAAY,YAAY,iBAAiB;AAAA,MAClE,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,eAAe;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,UACA,YACA,QACA,QACsB;AACtB,WAAO,KAAK,KAAK,UAAU,YAAY,QAAQ;AAAA,MAC7C,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,MACA,UACA,QACsB;AACtB,WAAO,KAAK,KAAK,MAAM,UAAU,UAAU,uBAAuB;AAAA,MAChE,MAAM;AAAA,MACN,UAAU,EAAE,QAAQ,mBAAmB;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,UACA,SACsB;AACtB,WAAO,KAAK,KAAK,UAAU,SAAS,qBAAqB;AAAA,MACvD,MAAM;AAAA,MACN,UAAU,EAAE,QAAQ,mBAAmB;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,UACA,SACA,QACA,aACsB;AACtB,WAAO,KAAK,KAAK,UAAU,SAAS,aAAa;AAAA,MAC/C,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,MACA,YACA,QACA,SACsB;AACtB,WAAO,KAAK,KAAK,MAAM,YAAY,SAAS;AAAA,MAC1C,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,iBAAiB;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,YACA,SACA,QACA,QACA,QACsB;AACtB,WAAO,KAAK,KAAK,YAAY,SAAS,QAAQ;AAAA,MAC5C,MAAM;AAAA,MACN;AAAA,MACA,UAAU,EAAE,QAAQ,mBAAmB,OAAO;AAAA,IAChD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAiB,SAA+B;AAC9D,QAAI,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG;AAC/B,WAAK,SAAS,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IACtC;AACA,SAAK,SAAS,IAAI,OAAO,EAAG,IAAI,OAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAiB,SAA+B;AAChE,UAAM,WAAW,KAAK,SAAS,IAAI,OAAO;AAC1C,QAAI,UAAU;AACZ,eAAS,OAAO,OAAO;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAA+B;AACnD,SAAK,eAAe,IAAI,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,SAA+B;AACrD,SAAK,eAAe,OAAO,OAAO;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,SAAgC;AAClD,WAAO,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,WAAY,EAAE,SAAS,eAAe,EAAE,SAAS,OAAQ;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAgC;AACnD,WAAO,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,QAA+B;AAChD,WAAO,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAgC;AAC9B,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAA8B;AAC9C,WAAO,KAAK,SAAS,MAAM,CAAC,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAkC;AAClD,WAAO,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAgB,QAA+B;AAC7D,WAAO,KAAK,SAAS;AAAA,MACnB,CAAC,MACC,EAAE,SAAS,aACT,EAAE,SAAS,UAAU,EAAE,OAAO,UAAY,EAAE,SAAS,UAAU,EAAE,OAAO;AAAA,IAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,WAAW,CAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,SAA4B;AAC7C,SAAK,SAAS,KAAK,OAAO;AAG1B,QAAI,KAAK,SAAS,SAAS,KAAK,aAAa;AAC3C,WAAK,WAAW,KAAK,SAAS,MAAM,CAAC,KAAK,WAAW;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,SAAiB,SAAqC;AACjF,UAAM,WAAW,KAAK,SAAS,IAAI,OAAO;AAC1C,QAAI,CAAC,SAAU;AAEf,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,cAAM,QAAQ,OAAO;AAAA,MACvB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,SAAqC;AACtE,eAAW,WAAW,KAAK,gBAAgB;AACzC,UAAI;AACF,cAAM,QAAQ,OAAO;AAAA,MACvB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAuB;AACzB,WAAO,KAAK,SAAS;AAAA,EACvB;AACF;AAKO,SAAS,iBAAiB,SAAoD;AACnF,SAAO,IAAI,eAAe,OAAO;AACnC;;;AFlVA,IAAM,wBAAuC;AAAA,EAC3C;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAA2B,oBAAI,IAAI;AAAA,EACnC,eAAyC,oBAAI,IAAI;AAAA,EACjD,eAA4C,oBAAI,IAAI;AAAA,EACpD,YAAoC,oBAAI,IAAI;AAAA,EAC5C;AAAA,EAER,YAAY,SAA8B;AACxC,SAAK,UAAU;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,qBAAqB,QAAQ,uBAAuB;AAAA,MACpD,qBAAqB,QAAQ,uBAAuB;AAAA,MACpD,aAAa,QAAQ,eAAe;AAAA;AAAA,MACpC,mBAAmB,QAAQ,qBAAqB;AAAA,MAChD,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAA+C;AAC7D,UAAM,SAASC,aAAW;AAC1B,UAAM,MAAM,oBAAI,KAAK;AAGrB,UAAM,SAAwB;AAAA,MAC5B,IAAIA,aAAW;AAAA,MACf,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAGA,UAAM,OAAa;AAAA,MACjB,IAAI;AAAA,MACJ,MAAM,OAAO;AAAA,MACb;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,qBAAqB,OAAO,uBAAuB,KAAK,QAAQ;AAAA,QAChE,cAAc,OAAO,gBAAgB,KAAK,QAAQ,oBAAoB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACzF;AAAA,MACA,UAAU,OAAO;AAAA,IACnB;AAGA,SAAK,aAAa,IAAI,QAAQ,kBAAkB,CAAC;AACjD,SAAK,aAAa,IAAI,QAAQ,iBAAiB,CAAC;AAEhD,SAAK,MAAM,IAAI,QAAQ,IAAI;AAG3B,QAAI,OAAO,aAAa,OAAO,gBAAgB;AAC7C,iBAAW,aAAa,OAAO,gBAAgB;AAC7C,cAAM,KAAK,cAAc,QAAQ,SAAS;AAAA,MAC5C;AAAA,IACF;AAEA,SAAK,SAAS;AACd,SAAK,KAAK,gBAAgB,IAAI;AAE9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAgB,WAA8C;AAChF,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAEtD,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,WAA0B;AAAA,MAC9B,IAAIA,aAAW;AAAA,MACf,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB;AAEA,SAAK,UAAU,KAAK,QAAQ;AAC5B,SAAK,KAAK,yBAAyB,MAAM,QAAQ;AAEjD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAkC;AACxC,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAyC;AACtD,WAAO,KAAK,aAAa,IAAI,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAA4C;AACxD,WAAO,KAAK,aAAa,IAAI,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,QACA,MACA,aACA,MACA,SACe;AACf,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,QAAI,CAAC,YAAa,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAE7D,UAAM,OAAO,YAAY,WAAW,MAAM,aAAa,MAAM,OAAO;AAGpE,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,MAAM;AACR,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAgB,QAAgB,SAA4C;AAC3F,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM;AACxC,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAGA,UAAM,QAAQ,KAAK,UAAU,MAAM,OAAO;AAC1C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAEjE,UAAM,OAAO,YAAY,WAAW,QAAQ,OAAO;AACnD,QAAI,CAAC,KAAM,QAAO;AAGlB,UAAM,cAAc;AACpB,UAAM,SAAS;AACf,UAAM,iBAAiB,oBAAI,KAAK;AAGhC,UAAM,WAAW;AAAA,MACf,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,aAAa,KAAK,IAAI;AAAA;AAAA,EAAO,KAAK,WAAW;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAgB,QAA6B;AACrD,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,QAAI,CAAC,YAAa,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAE7D,WAAO,YAAY,UAAU,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,QACA,QACA,MAC2B;AAC3B,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM;AACxC,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,OAAO,YAAY,WAAW,QAAQ,IAAI;AAChD,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,KAAK,UAAU,MAAM,KAAK,QAAQ;AAChD,UAAI,OAAO;AACT,cAAM,SAAS;AACf,cAAM,iBAAiB,oBAAI,KAAK;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI;AACpF,UAAM,WAAW;AAAA,MACf,KAAK,YAAY;AAAA,MACjB,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,uBAAuB,KAAK,IAAI;AAAA;AAAA,EAAO,WAAW;AAAA,IACpD;AAGA,QAAI,CAAC,KAAK,OAAO,qBAAqB;AACpC,aAAO,KAAK,YAAY,QAAQ,MAAM;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAgB,QAA2C;AAC3E,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM;AACxC,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,OAAO,YAAY,YAAY,QAAQ,KAAK,OAAO,EAAE;AAC3D,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,KAAK,UAAU,MAAM,KAAK,QAAQ;AAChD,UAAI,OAAO;AACT,cAAM,SAAS;AACf,cAAM,iBAAiB,oBAAI,KAAK;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,WAAW,YAAY,KAAK,OAAO,IAAI,KAAK,YAAY,WAAW,QAAQ,6CAA6C;AAE9H,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAgB,QAAgB,QAA2C;AAC1F,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM;AACxC,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,OAAO,YAAY,WAAW,QAAQ,MAAM;AAClD,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,KAAK,UAAU,MAAM,KAAK,QAAQ;AAChD,UAAI,OAAO;AACT,cAAM,SAAS;AACf,cAAM,iBAAiB,oBAAI,KAAK;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,WAAW,WAAW,KAAK,OAAO,IAAI,KAAK,YAAY,WAAW,QAAQ,MAAM;AAEtF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,SAAiB,QAAgC;AACrF,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,cAAc,CAAC,MAAM;AACxB,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,QAAQ,KAAK,UAAU,MAAM,OAAO;AAC1C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAEzD,UAAM,SAAS;AACf,UAAM,iBAAiB,oBAAI,KAAK;AAGhC,UAAM,WAAW,gBAAgB,SAAS,KAAK,OAAO,IAAI,MAAM;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,SAAgC;AACpE,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,QAAI,CAAC,cAAc,CAAC,MAAM;AACxB,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,QAAQ,KAAK,UAAU,MAAM,OAAO;AAC1C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAEzD,UAAM,SAAS;AACf,UAAM,iBAAiB,oBAAI,KAAK;AAChC,UAAM,cAAc;AAGpB,UAAM,WAAW,gBAAgB,KAAK,OAAO,IAAI,OAAO;AAExD,SAAK,KAAK,0BAA0B,MAAM,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,QACA,MACA,IACA,SACA,QACe;AACf,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAE5D,UAAM,WAAW,KAAK,MAAM,IAAI,SAAS,EAAE,OAAO,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAgB,MAAc,SAAgC;AAC5E,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAC/C,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAE5D,UAAM,WAAW,UAAU,MAAM,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,QACA,QACA,OACA,iBACuB;AACvB,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAEhD,QAAI,CAAC,QAAQ,CAAC,aAAa;AACzB,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,OAAO,YAAY,QAAQ,MAAM;AACvC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAGtD,gBAAY,cAAc,MAAM;AAGhC,UAAM,SAAuB;AAAA,MAC3B,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,MACT,SAAS,GAAG,MAAM,IAAI;AAAA,MACtB,YAAY,KAAK,OAAO;AAAA,MACxB,YAAY,oBAAI,KAAK;AAAA,IACvB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAqC;AACrD,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAEhD,QAAI,CAAC,QAAQ,CAAC,aAAa;AACzB,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,cAAc,oBAAI,IAAI;AAC5B,UAAM,cAAwB,CAAC;AAG/B,WAAO,CAAC,YAAY,iBAAiB,GAAG;AACtC,YAAM,WAAW,YAAY,YAAY;AACzC,UAAI,CAAC,UAAU;AAEb;AAAA,MACF;AAGA,YAAM,eAAe,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AACnE,YAAM,aAAa,KAAK,OAAO,WAAW,UAAU,CAAC,KAAK,OAAO,cAAc,KAAK,SAAS;AAC7F,YAAM,YAAY,gBAAgB;AAGlC,UAAI,CAAC,WAAW;AAEd;AAAA,MACF;AAGA,YAAM,KAAK,WAAW,QAAQ,SAAS,IAAI,UAAU,EAAE;AAGvD,kBAAY,UAAU,SAAS,EAAE;AAGjC,YAAM,SAAS;AAAA,QACb,SAAS;AAAA,QACT,QAAQ,cAAc,SAAS,IAAI;AAAA,QACnC,aAAa,oBAAI,KAAK;AAAA,MACxB;AAEA,kBAAY,aAAa,SAAS,IAAI,MAAM;AAC5C,kBAAY,IAAI,SAAS,IAAI,MAAM;AAGnC,gBAAU,SAAS;AACnB,gBAAU,cAAc;AAAA,IAC1B;AAGA,UAAM,WAAW,YAAY,YAAY;AACzC,eAAW,QAAQ,UAAU;AAC3B,UAAI,KAAK,WAAW,UAAU;AAC5B,oBAAY,KAAK,KAAK,EAAE;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,aAAa,SAAS;AAAA,MAC1B,CAAC,SAAS,KAAK,WAAW,eAAe,KAAK,WAAW;AAAA,IAC3D;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,kBAAY,KAAK,GAAG,WAAW,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAAA,IACvD;AAEA,WAAO;AAAA,MACL,SAAS,YAAY,WAAW;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAA+B;AAChD,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAGtD,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI,SAAS,WAAW,YAAY;AAClC,iBAAS,SAAS;AAAA,MACpB;AAAA,IACF;AAGA,SAAK,OAAO,SAAS;AACrB,SAAK,SAAS;AAEd,SAAK,KAAK,iBAAiB,IAAI;AAG/B,SAAK,aAAa,OAAO,MAAM;AAC/B,SAAK,aAAa,OAAO,MAAM;AAC/B,SAAK,MAAM,OAAO,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAIC;AACZ,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,UAAM,cAAc,KAAK,aAAa,IAAI,MAAM;AAChD,UAAM,aAAa,KAAK,aAAa,IAAI,MAAM;AAE/C,QAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAY,QAAO;AAEjD,UAAM,YAAY,CAAC,KAAK,QAAQ,GAAG,KAAK,SAAS;AAEjD,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE,WAAW,UAAU,EAAE;AAAA,QAChF,MAAM,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAAA,MACrD;AAAA,MACA,OAAO,YAAY,SAAS;AAAA,MAC5B,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAmC;AAC7C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAmC;AAChD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAY,SAA4C;AACxE,QAAI,KAAK,OAAO,OAAO,QAAS,QAAO,KAAK;AAC5C,WAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAkB,MAAY,OAA6B;AACtE,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AAEF,cAAM,SAAS,SAAS,OAAO,MAAM,KAAK;AAE1C,YAAI,kBAAkB,SAAS;AAC7B,iBAAO,MAAM,MAAM;AAAA,UAEnB,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,SAAgD;AACrF,SAAO,IAAI,iBAAiB,OAAO;AACrC;;;AGhmBO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,SAA0C;AACpD,SAAK,kBAAkB,SAAS,mBAAmB;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAkB,UAAyC;AAC/D,UAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,UAAM,OAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,QAAI,cAAwC;AAC5C,QAAI,cAAwC;AAC5C,QAAI,cAAc;AAClB,QAAI,gBAAgB;AACpB,QAAI,mBAA6B,CAAC;AAClC,QAAI,UAAU;AACd,QAAI,gBAAgB;AACpB,QAAI,cAAc;AAElB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,UAAU,KAAK,KAAK;AAG1B,UAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAI,CAAC,aAAa;AAChB,wBAAc;AACd,0BAAgB,QAAQ,MAAM,CAAC,EAAE,KAAK;AACtC,6BAAmB,CAAC;AAAA,QACtB,OAAO;AACL,wBAAc;AACd,cAAI,aAAa;AACf,wBAAY,OAAO,iBAAiB,KAAK,IAAI;AAC7C,wBAAY,WAAW,iBAAiB;AAAA,UAC1C;AACA,0BAAgB;AAChB,6BAAmB,CAAC;AAAA,QACtB;AACA;AAAA,MACF;AAEA,UAAI,aAAa;AACf,yBAAiB,KAAK,IAAI;AAC1B;AAAA,MACF;AAGA,UAAI,CAAC,QAAS;AAGd,UAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,cAAM,cAAc,QAAQ,MAAM,eAAe;AACjD,YAAI,aAAa;AACf,gBAAM,QAAQ,YAAY,CAAC,EAAE;AAC7B,gBAAM,QAAQ,YAAY,CAAC,EAAE,KAAK;AAElC,cAAI,UAAU,GAAG;AAEf,iBAAK,OAAO;AAAA,UACd,WAAW,UAAU,GAAG;AAEtB,sBAAU,MAAM,YAAY;AAG5B,kBAAM,YAAY,MAAM,MAAM,uCAAuC;AACrE,gBAAI,WAAW;AAEb,kBAAI,eAAe,YAAY,eAAe,aAAa;AACzD,oBAAI,CAAC,YAAY,MAAO,aAAY,QAAQ,CAAC;AAC7C,4BAAY,MAAM,KAAK,KAAK,aAAa,aAAa,aAAa,CAAC;AAAA,cACtE;AAGA,kBAAI,eAAe,YAAY,MAAM;AACnC,qBAAK,MAAM,KAAK,KAAK,aAAa,aAAa,WAAW,CAAC;AAAA,cAC7D;AAEA,4BAAc;AAAA,gBACZ,IAAI,SAAS,UAAU,CAAC,GAAG,EAAE,KAAK;AAAA,gBAClC,MAAM,UAAU,CAAC,EAAE,KAAK;AAAA,gBACxB,OAAO,CAAC;AAAA,gBACR,OAAO,CAAC;AAAA,cACV;AACA,4BAAc;AACd,4BAAc;AACd,wBAAU;AAAA,YACZ;AAAA,UACF,WAAW,UAAU,KAAK,aAAa;AAErC,kBAAM,aAAa,MAAM,YAAY;AACrC,gBAAI,WAAW,SAAS,MAAM,GAAG;AAC/B,wBAAU;AAAA,YACZ,WAAW,WAAW,SAAS,MAAM,GAAG;AACtC,wBAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAGA,UAAI,YAAY,UAAU,YAAY,aAAa;AACjD,aAAK,QAAQ,KAAK,OAAO,KAAK,OAAO,MAAM,MAAM;AACjD;AAAA,MACF;AAEA,UAAI,YAAY,gBAAgB;AAC9B,aAAK,gBAAgB,KAAK,eAAe,KAAK,eAAe,OAAO,MAAM;AAC1E;AAAA,MACF;AAEA,UAAI,YAAY,gBAAgB,YAAY,cAAc;AACxD,YAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,cAAI,CAAC,KAAK,UAAW,MAAK,YAAY,CAAC;AACvC,eAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,QAC7C;AACA;AAAA,MACF;AAGA,UAAI,aAAa;AAEf,YAAI,QAAQ,YAAY,MAAM,YAAY,QAAQ,YAAY,EAAE,WAAW,SAAS,GAAG;AACrF,oBAAU;AACV;AAAA,QACF;AAEA,YAAI,YAAY,SAAS;AACvB,gBAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,cAAI,OAAO;AACT,wBAAY,QAAQ,EAAE,GAAG,YAAY,OAAO,GAAG,MAAM;AAAA,UACvD;AACA;AAAA,QACF;AAGA,cAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,YAAI,WAAW;AAEb,cAAI,YAAY,SAAS;AACvB,sBAAU;AAAA,UACZ;AAEA,cAAI,eAAe,YAAY,aAAa;AAC1C,gBAAI,CAAC,YAAY,MAAO,aAAY,QAAQ,CAAC;AAC7C,wBAAY,MAAM,KAAK,KAAK,aAAa,aAAa,aAAa,CAAC;AAAA,UACtE;AAEA,wBAAc;AAAA,YACZ,aAAa,UAAU,CAAC,EAAE,KAAK;AAAA,YAC/B,MAAM,KAAK,cAAc,UAAU,CAAC,CAAC;AAAA,UACvC;AACA;AAAA,QACF;AAGA,aAAK,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,MAAM,aAAa;AACvE,gBAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,KAAK;AAGrC,cAAI,OAAO,YAAY,EAAE,WAAW,MAAM,KAAK,OAAO,YAAY,EAAE,WAAW,UAAU,GAAG;AAC1F,wBAAY,UAAU,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,UAClE,WAES,OAAO,YAAY,EAAE,WAAW,SAAS,KAAK,OAAO,YAAY,EAAE,WAAW,SAAS,GAAG;AACjG,wBAAY,iBAAiB,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,UACzE,WAES,OAAO,YAAY,EAAE,SAAS,UAAU,KAAK,OAAO,YAAY,EAAE,SAAS,UAAU,GAAG;AAC/F,wBAAY,WAAW;AAAA,UACzB;AACA;AAAA,QACF;AAGA,YAAI,QAAQ,YAAY,EAAE,WAAW,YAAY,KAAK,QAAQ,YAAY,EAAE,WAAW,OAAO,GAAG;AAC/F,gBAAM,YAAY,QAAQ,MAAM,6BAA6B;AAC7D,cAAI,WAAW;AACb,wBAAY,mBAAmB,SAAS,UAAU,CAAC,GAAG,EAAE;AAAA,UAC1D;AACA;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,aAAa,KAAK,QAAQ,YAAY,EAAE,WAAW,eAAe,GAAG;AACxG,gBAAM,UAAU,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC3D,sBAAY,eAAe,QACxB,MAAM,QAAQ,EACd,IAAI,CAAC,MAAM,SAAS,EAAE,QAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,EAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1B;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,WAAW,GAAG;AACjD,gBAAM,WAAW,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE;AAC1D,cAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,wBAAY,WAAW;AAAA,UACzB;AACA;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,OAAO,GAAG;AAC7C,sBAAY,OAAO,QAChB,MAAM,GAAG,EACT,MAAM,CAAC,EACP,KAAK,GAAG,EACR,MAAM,QAAQ,EACd,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB;AAAA,QACF;AAGA,YAAI,CAAC,YAAY,aAAa;AAC5B,sBAAY,cAAc;AAAA,QAC5B,WAAW,YAAY,QAAQ;AAC7B,sBAAY,eAAe,MAAM;AAAA,QACnC;AAAA,MACF,OAAO;AAEL,YAAI,QAAQ,YAAY,EAAE,WAAW,OAAO,KAAK,QAAQ,YAAY,EAAE,WAAW,YAAY,GAAG;AAC/F,eAAK,OAAO,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AACvD,oBAAU;AACV;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,eAAe,GAAG;AACrD,eAAK,eAAe,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC/D,oBAAU;AACV;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,SAAS,GAAG;AAC/C,eAAK,SAAS,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AACzD;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,UAAU,GAAG;AAChD,eAAK,UAAU,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC1D;AAAA,QACF;AAEA,YAAI,QAAQ,YAAY,EAAE,WAAW,aAAa,KAAK,QAAQ,YAAY,EAAE,WAAW,YAAY,GAAG;AACrG,eAAK,YAAY,QAAQ,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,eAAe,YAAY,eAAe,aAAa;AACzD,UAAI,CAAC,YAAY,MAAO,aAAY,QAAQ,CAAC;AAC7C,kBAAY,MAAM,KAAK,KAAK,aAAa,aAAa,WAAW,CAAC;AAAA,IACpE;AAGA,QAAI,eAAe,YAAY,MAAM;AACnC,WAAK,MAAM,KAAK,KAAK,aAAa,aAAa,WAAW,CAAC;AAAA,IAC7D;AAGA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,SAAS;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAA6C;AAC9D,UAAM,QAAgC,CAAC;AAGvC,QAAI,KAAK,YAAY,EAAE,SAAS,SAAS,GAAG;AAC1C,YAAM,aAAa,KAAK,MAAM,UAAU,EAAE,CAAC;AAC3C,UAAI,YAAY;AACd,cAAM,SAAS,KAAK,iBAAiB,UAAU;AAAA,MACjD;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,EAAE,SAAS,SAAS,GAAG;AAC1C,YAAM,aAAa,KAAK,MAAM,UAAU,EAAE,CAAC;AAC3C,UAAI,YAAY;AACd,cAAM,SAAS,KAAK,iBAAiB,UAAU;AAAA,MACjD;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,EAAE,SAAS,OAAO,GAAG;AACxC,YAAM,WAAW,KAAK,MAAM,QAAQ,EAAE,CAAC;AACvC,UAAI,UAAU;AACZ,cAAM,OAAO,KAAK,iBAAiB,QAAQ;AAAA,MAC7C;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,EAAE,SAAS,SAAS,GAAG;AAC1C,YAAM,aAAa,KAAK,MAAM,UAAU,EAAE,CAAC;AAC3C,UAAI,YAAY;AACd,cAAM,SAAS,KAAK,iBAAiB,UAAU;AAAA,MACjD;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;AAChD,YAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,YAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,UAAI,WAAW;AACb,cAAMC,QAAO,UAAU,CAAC,KAAK,UAAU,CAAC;AACxC,YAAI,QAAQ,YAAY,EAAE,SAAS,QAAQ,GAAG;AAC5C,gBAAM,SAAS,CAACA,KAAI;AAAA,QACtB,WAAW,QAAQ,YAAY,EAAE,SAAS,MAAM,GAAG;AACjD,gBAAM,OAAO,CAACA,KAAI;AAAA,QACpB,WAAW,QAAQ,YAAY,EAAE,SAAS,QAAQ,GAAG;AACnD,gBAAM,SAAS,CAACA,KAAI;AAAA,QACtB,OAAO;AACL,gBAAM,SAAS,CAACA,KAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,KAAuB;AAC9C,UAAM,QAAkB,CAAC;AAGzB,UAAM,kBAAkB,IAAI,MAAM,YAAY;AAC9C,QAAI,iBAAiB;AACnB,YAAM,KAAK,GAAG,gBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IAC1D;AAGA,UAAM,cAAc,IAAI,MAAM,iBAAiB;AAC/C,QAAI,aAAa;AACf,YAAM,KAAK,GAAG,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,aAA+B;AACnD,UAAM,QAAQ,YAAY,YAAY;AAEtC,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,GAAG;AAChF,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,QAAQ,GAAG;AAChH,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,GAAG;AACrD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,SAAS,GAAG;AACzD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,WAAW,GAAG;AAC1F,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,QAAQ,GAAG;AACvF,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,MAAyB,QAA0B;AACtE,WAAO;AAAA,MACL;AAAA,MACA,aAAa,KAAK,eAAe;AAAA,MACjC,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,MAAyB,cAAgC;AAC5E,WAAO;AAAA,MACL,IAAI,KAAK,MAAM;AAAA,MACf,MAAM,KAAK,QAAQ;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK,SAAS,CAAC;AAAA,MACtB,OAAO,KAAK,SAAS,CAAC;AAAA,MACtB,kBAAkB,KAAK;AAAA,MACvB,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,QAAQ;AAAA,MACR,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,UAAkB,SAAiD;AACjF,UAAMC,MAAK,MAAM,OAAO,aAAkB;AAC1C,UAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AACnD,WAAO,KAAK,MAAM,SAAS,OAAO;AAAA,EACpC;AACF;AAKO,SAAS,iBAAiB,SAAsD;AACrF,SAAO,IAAI,WAAW,OAAO;AAC/B;;;ACzaA,IAAMC,mBAAoC;AAAA,EACxC,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,QAAQ;AACV;AAKO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,SAA4B;AACtC,SAAK,UAAU,EAAE,GAAGA,kBAAiB,GAAG,QAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAA4C;AACnD,UAAM,SAA4B,CAAC;AAGnC,SAAK,mBAAmB,MAAM,MAAM;AAGpC,SAAK,cAAc,MAAM,MAAM;AAG/B,SAAK,qBAAqB,MAAM,MAAM;AAGtC,UAAM,QAAQ,KAAK,eAAe,IAAI;AAGtC,UAAM,YAAY,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACvD,UAAM,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAC3D,UAAM,QAAQ,CAAC,cAAc,CAAC,KAAK,QAAQ,UAAU,CAAC;AAEtD,WAAO,EAAE,OAAO,QAAQ,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAsB,QAAiC;AAEhF,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,GAAG;AAC1C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,cAAc;AACtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,GAAG;AAClD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,MAAsB,QAAiC;AAC3E,UAAM,UAAU,oBAAI,IAAY;AAEhC,eAAW,QAAQ,KAAK,OAAO;AAE7B,UAAI,QAAQ,IAAI,KAAK,EAAE,GAAG;AACxB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,sBAAsB,KAAK,EAAE;AAAA,UACtC,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,cAAQ,IAAI,KAAK,EAAE;AAGnB,WAAK,mBAAmB,MAAM,MAAM;AAGpC,WAAK,kBAAkB,MAAM,MAAM;AAGnC,UAAI,KAAK,QAAQ,cAAc;AAC7B,cAAM,cAAc,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC5D,cAAM,eAAe,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS;AAEjE,YAAI,CAAC,eAAe,CAAC,cAAc;AACjC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,QAAQ,KAAK,EAAE;AAAA,YACxB,QAAQ,KAAK;AAAA,YACb,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,KAAK,QAAQ,gBAAgB;AAC/B,cAAM,gBAAgB,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEhE,YAAI,CAAC,eAAe;AAClB,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,QAAQ,KAAK,EAAE;AAAA,YACxB,QAAQ,KAAK;AAAA,YACb,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAgB,QAAiC;AAE1E,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK,EAAE;AAAA,QACxB,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,GAAG;AAC1C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK,EAAE;AAAA,QACxB,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,KAAK,QAAQ,iBAAkB;AACnE,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK,EAAE,wBAAwB,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ,eAAe;AAAA,QACnG,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,KAAK,QAAQ,iBAAkB;AACnE,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK,EAAE,uBAAuB,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ,eAAe;AAAA,QAClG,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,kBAAkB;AACzB,UAAI,KAAK,mBAAmB,KAAK,QAAQ,gBAAiB;AACxD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,oBAAoB,KAAK,gBAAgB,0BAA0B,KAAK,QAAQ,cAAc;AAAA,UACtH,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAEA,UAAI,KAAK,mBAAmB,KAAK,QAAQ,gBAAiB;AACxD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,oBAAoB,KAAK,gBAAgB,2BAA2B,KAAK,QAAQ,cAAc;AAAA,UACvH,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ,cAAc;AAC7B,YAAM,WACH,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,KAChD,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,KAChD,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS;AAE/C,UAAI,CAAC,UAAU;AACb,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE;AAAA,UACxB,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAgB,QAAiC;AACzE,UAAM,cAAc,oBAAI,IAAY;AAEpC,eAAW,QAAQ,KAAK,OAAO;AAE7B,UAAI,YAAY,IAAI,KAAK,MAAM,GAAG;AAChC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,+BAA+B,KAAK,MAAM;AAAA,UAClE,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,kBAAY,IAAI,KAAK,MAAM;AAG3B,UAAI,CAAC,KAAK,eAAe,CAAC,KAAK,YAAY,KAAK,GAAG;AACjD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,UAAU,KAAK,MAAM;AAAA,UAC7C,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,SAAS,YAAY,CAAC,KAAK,kBAAkB,CAAC,KAAK,SAAS;AACnE,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,UAAU,KAAK,MAAM;AAAA,UAC7C,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,SAAS,UAAU,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAS;AACvD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE,UAAU,KAAK,MAAM;AAAA,UAC7C,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,KAAK,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAI,cAAc,CAAC,MAAM,IAAI,GAAG;AAC9B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,QAAQ,KAAK,EAAE;AAAA,UACxB,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAsB,QAAiC;AAClF,UAAM,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,cAAc;AACrB,mBAAW,SAAS,KAAK,cAAc;AAErC,cAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,SAAS,QAAQ,KAAK,EAAE,iCAAiC,KAAK;AAAA,cAC9D,QAAQ,KAAK;AAAA,cACb,YAAY,6BAA6B,KAAK;AAAA,YAChD,CAAC;AAAA,UACH;AAGA,cAAI,UAAU,KAAK,IAAI;AACrB,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,SAAS,QAAQ,KAAK,EAAE;AAAA,cACxB,QAAQ,KAAK;AAAA,cACb,YAAY;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,yBAAyB,IAAI;AACvD,eAAW,SAAS,cAAc;AAChC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,iCAAiC,MAAM,KAAK,MAAM,CAAC;AAAA,QAC5D,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,MAAkC;AACjE,UAAM,SAAqB,CAAC;AAC5B,UAAM,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAMC,QAAiB,CAAC;AAExB,UAAM,MAAM,CAAC,WAAyB;AACpC,UAAI,eAAe,IAAI,MAAM,GAAG;AAE9B,cAAM,aAAaA,MAAK,QAAQ,MAAM;AACtC,YAAI,eAAe,IAAI;AACrB,iBAAO,KAAK,CAAC,GAAGA,MAAK,MAAM,UAAU,GAAG,MAAM,CAAC;AAAA,QACjD;AACA;AAAA,MACF;AAEA,UAAI,QAAQ,IAAI,MAAM,EAAG;AAEzB,cAAQ,IAAI,MAAM;AAClB,qBAAe,IAAI,MAAM;AACzB,MAAAA,MAAK,KAAK,MAAM;AAEhB,YAAM,OAAO,QAAQ,IAAI,MAAM;AAC/B,UAAI,MAAM,cAAc;AACtB,mBAAW,SAAS,KAAK,cAAc;AACrC,cAAI,KAAK;AAAA,QACX;AAAA,MACF;AAEA,MAAAA,MAAK,IAAI;AACT,qBAAe,OAAO,MAAM;AAAA,IAC9B;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,GAAG;AACzB,YAAI,KAAK,EAAE;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAqD;AAC1E,UAAM,aAAa,KAAK,MAAM;AAC9B,UAAM,aAAa,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxE,UAAM,mBAAmB,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,oBAAoB,IAAI,CAAC;AACzF,UAAM,iBAAiB,KAAK,MAAM;AAAA,MAChC,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,KAAM,EAAE,MAAM,QAAQ,EAAE,MAAM,KAAK,SAAS;AAAA,IAC1F,EAAE;AACF,UAAM,mBAAmB,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,EAAE;AAC5F,UAAM,kBAAkB,aAAa,IAAI,KAAK,MAAO,aAAa,aAAc,EAAE,IAAI,KAAK;AAE3F,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA+B;AACrC,WAAO,KAAK,SAAS,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAyC;AACjD,WAAO,KAAK,SAAS,IAAI,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAyC;AACnD,WAAO,KAAK,SAAS,IAAI,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,EACtE;AACF;AAKO,SAAS,oBAAoB,SAA2C;AAC7E,SAAO,IAAI,cAAc,OAAO;AAClC;AAKO,SAAS,aAAa,MAAsB,SAAkD;AACnG,SAAO,oBAAoB,OAAO,EAAE,SAAS,IAAI;AACnD;;;AC7bO,IAAM,iBAA+C;AAAA,EAC1D,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,MACL,EAAE,MAAM,QAAQ,aAAa,wCAAwC;AAAA,MACrE,EAAE,MAAM,aAAa,aAAa,4BAA4B;AAAA,MAC9D,EAAE,MAAM,aAAa,aAAa,gCAAgC;AAAA,MAClE,EAAE,MAAM,UAAU,aAAa,sCAAsC,SAAS,WAAW;AAAA,MACzF,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IACtD;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,MACL,EAAE,MAAM,QAAQ,aAAa,mCAAmC;AAAA,MAChE,EAAE,MAAM,aAAa,aAAa,+BAA+B;AAAA,MACjE,EAAE,MAAM,aAAa,aAAa,uBAAuB;AAAA,MACzD,EAAE,MAAM,aAAa,aAAa,+BAA+B;AAAA,MACjE,EAAE,MAAM,UAAU,aAAa,aAAa,SAAS,WAAW;AAAA,MAChE,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IACvD;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,MACL,EAAE,MAAM,QAAQ,aAAa,+CAA+C;AAAA,MAC5E,EAAE,MAAM,aAAa,aAAa,cAAc;AAAA,MAChD,EAAE,MAAM,UAAU,aAAa,0BAA0B,SAAS,WAAW;AAAA,MAC7E,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,IAClD;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,MACL,EAAE,MAAM,QAAQ,aAAa,sCAAsC;AAAA,MACnE,EAAE,MAAM,aAAa,aAAa,wBAAwB;AAAA,MAC1D,EAAE,MAAM,UAAU,aAAa,aAAa,SAAS,WAAW;AAAA,MAChE,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,MAC3D,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IACtD;AAAA,IACA,kBAAkB;AAAA,EACpB;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,MACL,EAAE,MAAM,UAAU,aAAa,4CAA4C,SAAS,WAAW;AAAA,MAC/F,EAAE,MAAM,aAAa,aAAa,wBAAwB;AAAA,MAC1D,EAAE,MAAM,UAAU,aAAa,2BAA2B,SAAS,WAAW;AAAA,MAC9E,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IAC1D;AAAA,IACA,kBAAkB;AAAA,EACpB;AACF;AAKO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,SAA2B;AACrC,SAAK,UAAU;AAAA,MACb,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAc,MAA8B;AACrD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,oBAAI,KAAK;AAAA,MACpB,QAAQ,KAAK,QAAQ;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QACE,MACA,MACA,SASU;AACV,UAAM,KAAK,KAAK,MAAM,SAAS,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;AAElF,UAAM,OAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,OAAO,SAAS,SAAS,CAAC;AAAA,MAC1B,QAAQ,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO;AAAA,QAC3C,QAAQ,IAAI;AAAA,QACZ,aAAa,EAAE,eAAe;AAAA,QAC9B,MAAM,EAAE,QAAQ;AAAA,QAChB,MAAM,EAAE;AAAA,QACR,UAAU,EAAE;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,gBAAgB,EAAE;AAAA,QAClB,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,kBAAkB,SAAS,oBAAoB,KAAK,QAAQ;AAAA,MAC5D,cAAc,SAAS;AAAA,MACvB,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,MACnB,QAAQ;AAAA,IACV;AAGA,QAAI,KAAK,QAAQ,gBAAgB,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG;AAC3E,WAAK,MAAM,QAAQ;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAED,WAAK,MAAM,QAAQ,CAAC,GAAG,MAAO,EAAE,SAAS,IAAI,CAAE;AAAA,IACjD;AAGA,QAAI,KAAK,QAAQ,kBAAkB,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC/E,WAAK,MAAM,KAAK;AAAA,QACd,QAAQ,KAAK,MAAM,SAAS;AAAA,QAC5B,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,YAAY,oBAAI,KAAK;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBACE,MACA,cACA,eAOsB;AACtB,UAAM,WAAW,eAAe,YAAY;AAC5C,QAAI,CAAC,SAAU,QAAO;AAEtB,WAAO,KAAK,QAAQ,MAAM,eAAe,QAAQ,SAAS,MAAM;AAAA,MAC9D,aAAa,eAAe,eAAe,SAAS;AAAA,MACpD,OAAO,eAAe;AAAA,MACtB,OAAO,SAAS;AAAA,MAChB,kBAAkB,SAAS;AAAA,MAC3B,cAAc,eAAe;AAAA,MAC7B,MAAM,eAAe;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAA8B;AACvC,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,KAAK,KAAK,IAAI,EAAE;AAC3B,UAAM,KAAK,EAAE;AAGb,QAAI,KAAK,SAAS;AAChB,YAAM,KAAK,YAAY,KAAK,OAAO,EAAE;AAAA,IACvC;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,WAAW,KAAK,MAAM,EAAE;AAAA,IACrC;AACA,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,eAAe,KAAK,SAAS,EAAE;AAAA,IAC5C;AACA,QAAI,KAAK,WAAW,KAAK,UAAU,KAAK,WAAW;AACjD,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,KAAK,EAAE;AAGb,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK,iBAAiB;AAC5B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,YAAY;AAC5B,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,EAAE;AACb,iBAAW,QAAQ,KAAK,WAAW;AACjC,cAAM,KAAK,KAAK,IAAI,EAAE;AAAA,MACxB;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,EAAE;AAEb,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,KAAK,YAAY,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE;AAC9C,YAAM,KAAK,EAAE;AAEb,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,KAAK,WAAW;AAC3B,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,YAAM,WACH,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,KAChD,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,KAChD,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS,KAC5C,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS;AAEnD,UAAI,UAAU;AACZ,cAAM,KAAK,YAAY;AACvB,YAAI,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,GAAG;AACrD,gBAAM,KAAK,aAAa,KAAK,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/E;AACA,YAAI,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,GAAG;AACrD,gBAAM,KAAK,aAAa,KAAK,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/E;AACA,YAAI,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS,GAAG;AACjD,gBAAM,KAAK,WAAW,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,QAC3E;AACA,YAAI,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,GAAG;AACrD,gBAAM,KAAK,aAAa,KAAK,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/E;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,UAAI,KAAK,kBAAkB;AACzB,cAAM,KAAK,cAAc,KAAK,gBAAgB,UAAU;AAAA,MAC1D;AACA,UAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,cAAM,KAAK,eAAe,KAAK,aAAa,IAAI,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MAClF;AACA,UAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AACrC,cAAM,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAC5C;AACA,UAAI,KAAK,aAAa,QAAW;AAC/B,cAAM,KAAK,aAAa,KAAK,QAAQ,EAAE;AAAA,MACzC;AACA,UAAI,KAAK,oBAAoB,KAAK,cAAc,UAAU,KAAK,MAAM,UAAU,KAAK,aAAa,QAAW;AAC1G,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,EAAE;AAEb,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,YAAY,KAAK,SAAS,cAAc,KAAK,KAAK,IAAI,MAAM;AAClE,cAAM,KAAK,GAAG,KAAK,MAAM,KAAK,KAAK,WAAW,GAAG,SAAS,EAAE;AAE5D,YAAI,KAAK,SAAS;AAChB,gBAAM,KAAK,eAAe,KAAK,OAAO,IAAI;AAAA,QAC5C;AACA,YAAI,KAAK,gBAAgB;AACvB,gBAAM,KAAK,gBAAgB,KAAK,cAAc,EAAE;AAAA,QAClD;AACA,YAAI,KAAK,UAAU;AACjB,gBAAM,KAAK,oBAAoB;AAAA,QACjC;AAEA,YAAI,KAAK,MAAM;AACb,gBAAM,KAAK,EAAE;AACb,gBAAM,KAAK,YAAY,KAAK,YAAY,EAAE,EAAE;AAC5C,qBAAW,YAAY,KAAK,KAAK,MAAM,IAAI,GAAG;AAC5C,kBAAM,KAAK,MAAM,QAAQ,EAAE;AAAA,UAC7B;AACA,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,UAAM,eAAe,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,oBAAoB,IAAI,CAAC;AACrF,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,gBAAgB,KAAK,MAAM,MAAM,YAAY,YAAY,oBAAoB;AACxF,UAAM,KAAK,gBAAgB,KAAK,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AACvE,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,gBAAgB,KAAK,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAAA,IACzE;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MACA,MACA,WACA,SAKgB;AAChB,UAAM,OAAO,KAAK,WAAW,MAAM,IAAI;AAEvC,QAAI,SAAS,cAAc;AACzB,WAAK,eAAe,QAAQ;AAAA,IAC9B;AACA,QAAI,SAAS,WAAW;AACtB,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAEA,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,SAAS,UAAU;AACrB,aAAK,oBAAoB,MAAM,QAAQ,UAAU;AAAA,UAC/C,MAAM;AAAA,UACN,cAAc,IAAI,IAAI,CAAC,CAAC,IAAI;AAAA,QAC9B,CAAC;AAAA,MACH,OAAO;AACL,aAAK,QAAQ,MAAM,UAAU;AAAA,UAC3B,cAAc,IAAI,IAAI,CAAC,CAAC,IAAI;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAsB,SAAkC;AAChE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,WAAW,GAAG,KAAK,IAAI;AAAA,MAC7B,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,CAAC,GAAG,EAAE,KAAK;AAAA,QAClB,OAAO,EAAE,GAAG,EAAE,MAAM;AAAA,QACpB,cAAc,EAAE,eAAe,CAAC,GAAG,EAAE,YAAY,IAAI;AAAA,QACrD,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI;AAAA,QAC7B,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,EAAE;AAAA,MACF,QAAQ;AAAA,MACR,WAAW,oBAAI,KAAK;AAAA,MACpB,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAuB,OAAuB,SAAkC;AACzF,UAAM,SAAS,KAAK,UAAU,OAAO,WAAW,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,EAAE;AAG/E,UAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC;AAE1D,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,UAAoB;AAAA,QACxB,GAAG;AAAA,QACH,IAAI,KAAK,KAAK;AAAA,QACd,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA,QACrB,OAAO,EAAE,GAAG,KAAK,MAAM;AAAA,QACvB,cAAc,KAAK,cAAc,IAAI,CAAC,MAAM,IAAI,KAAK;AAAA,QACrD,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI;AAAA,QACnC,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AACA,aAAO,MAAM,KAAK,OAAO;AAAA,IAC3B;AAGA,QAAI,MAAM,WAAW;AACnB,aAAO,YAAY,CAAC,GAAI,OAAO,aAAa,CAAC,GAAI,GAAG,MAAM,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AAAA,IAC1H;AAEA,WAAO,OAAO,GAAG,OAAO,IAAI;AAAA;AAAA,EAAO,MAAM,IAAI;AAC7C,WAAO,YAAY,oBAAI,KAAK;AAE5B,WAAO;AAAA,EACT;AACF;AAKO,SAAS,oBAAoB,SAA0C;AAC5E,SAAO,IAAI,cAAc,OAAO;AAClC;;;ACrbO,IAAM,eAAN,MAAmB;AAAA,EAChB,YAAoC,oBAAI,IAAI;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EAER,YAAY,SAA2C;AACrD,SAAK,eAAe,SAAS;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAA8B;AAC5C,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAsB,SAA8D;AAChG,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,UAAU;AACd,UAAM,SAA8B;AAAA,MAClC,SAAS;AAAA,MACT,gBAAgB,CAAC;AAAA,MACjB,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,MACf,YAAY;AAAA,MACZ,aAAa,oBAAI,IAAI;AAAA,IACvB;AAGA,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,SAAK,WAAW;AAGhB,SAAK,SAAS;AACd,SAAK,KAAK,0BAA0B,IAAI;AAExC,QAAI;AAEF,YAAM,kBAAkB,KAAK,qBAAqB,IAAI;AAGtD,YAAM,iBAAiB,KAAK,kBAAkB,MAAM,eAAe;AAGnE,iBAAW,UAAU,gBAAgB;AAEnC,YAAI,KAAK,gBAAgB,OAAO,SAAS;AACvC,oBAAU;AACV,iBAAO,UAAU;AACjB,iBAAO,SAAS,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,qBAAqB;AAChE;AAAA,QACF;AAGA,cAAM,KAAK,aAAa;AAGxB,YAAI,KAAK,gBAAgB,OAAO,SAAS;AACvC,oBAAU;AACV,iBAAO,UAAU;AACjB,iBAAO,SAAS,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,qBAAqB;AAChE;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACnD,YAAI,CAAC,KAAM;AAGX,cAAM,gBAAgB,KAAK,kBAAkB,MAAM,MAAM;AACzD,YAAI,CAAC,eAAe;AAClB,eAAK,SAAS;AACd,iBAAO,aAAa,KAAK,MAAM;AAC/B;AAAA,QACF;AAGA,cAAM,aAAa,MAAM,KAAK,YAAY,MAAM,MAAM,OAAO;AAC7D,eAAO,YAAY,IAAI,QAAQ,UAAU;AAEzC,YAAI,WAAW,SAAS;AACtB,eAAK,SAAS;AACd,eAAK,SAAS;AACd,iBAAO,eAAe,KAAK,MAAM;AACjC,eAAK,KAAK,uBAAuB,MAAM,MAAM,UAAU;AAAA,QACzD,OAAO;AACL,eAAK,SAAS;AACd,eAAK,SAAS;AACd,iBAAO,YAAY,KAAK,MAAM;AAC9B,iBAAO,UAAU;AACjB,eAAK,KAAK,oBAAoB,MAAM,MAAM,UAAU;AAEpD,cAAI,SAAS,aAAa;AAExB,uBAAW,eAAe,eAAe,MAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,GAAG;AAClF,oBAAM,gBAAgB,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AACjE,kBAAI,eAAe;AACjB,8BAAc,SAAS;AACvB,uBAAO,aAAa,KAAK,WAAW;AAAA,cACtC;AAAA,YACF;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,WAAK,SAAS,UAAU,cAAc,OAAO,UAAU,cAAc;AACrE,WAAK,YAAY,oBAAI,KAAK;AAE1B,aAAO,aAAa,KAAK,IAAI,IAAI;AAGjC,UAAI,SAAS;AACX,aAAK,KAAK,4BAA4B,IAAI;AAAA,MAC5C,WAAW,OAAO,SAAS;AACzB,aAAK,KAAK,4BAA4B,IAAI;AAAA,MAC5C,OAAO;AACL,aAAK,KAAK,yBAAyB,IAAI;AAAA,MACzC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,SAAS;AACd,aAAO,UAAU;AACjB,aAAO,aAAa,KAAK,IAAI,IAAI;AACjC,aAAO,SAAS,CAAE,MAAgB,OAAO;AAEzC,WAAK,KAAK,yBAAyB,IAAI;AACvC,aAAO;AAAA,IACT,UAAE;AAEA,WAAK,kBAAkB;AACvB,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YACZ,MACA,MACA,SACyB;AACzB,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAmB,CAAC;AAC1B,UAAM,eAAyB,CAAC;AAChC,UAAM,gBAA0B,CAAC;AAEjC,SAAK,SAAS;AACd,SAAK,KAAK,qBAAqB,MAAM,IAAI;AAGzC,aAAS,aAAa,KAAK,IAAI,GAAG,UAAU;AAG5C,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,YAAM,OAAO,KAAK,MAAM,CAAC;AAGzB,UAAI,KAAK,iBAAiB,OAAO,SAAS;AACxC,eAAO,KAAK,mBAAmB;AAC/B;AAAA,MACF;AAGA,YAAM,KAAK,aAAa;AAGxB,UAAI,KAAK,iBAAiB,OAAO,SAAS;AACxC,eAAO,KAAK,mBAAmB;AAC/B;AAAA,MACF;AAGA,eAAS,aAAa,KAAK,IAAI,KAAK,QAAQ,kBAAkB,KAAK,MAAM,EAAE;AAG3E,UAAI,SAAS,QAAQ;AAEnB,gBAAQ,IAAI,kBAAkB,KAAK,EAAE,UAAU,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE;AACjF,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,cAAc,KAAK,OAAO,EAAE;AAAA,QAC1C;AACA,YAAI,KAAK,MAAM;AACb,kBAAQ,IAAI,WAAW,KAAK,KAAK,UAAU,GAAG,GAAG,CAAC,KAAK;AAAA,QACzD;AAAA,MACF,WAAW,KAAK,cAAc;AAC5B,YAAI;AACF,gBAAM,aAAa,MAAM,KAAK;AAAA,YAC5B,KAAK,aAAa,MAAM,MAAM,IAAI;AAAA,YAClC,SAAS,eAAe;AAAA,UAC1B;AAEA,cAAI,CAAC,WAAW,SAAS;AACvB,mBAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,WAAW,SAAS,QAAQ,EAAE;AAElE,gBAAI,KAAK,UAAU;AACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,KAAK,QAAQ,KAAK,MAAM,KAAM,MAAgB,OAAO,EAAE;AAE9D,cAAI,KAAK,UAAU;AACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,eAAO,KAAK,6BAA6B;AACzC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,OAAQ,cAAa,KAAK,GAAG,KAAK,MAAM,MAAM;AAC7D,QAAI,KAAK,MAAM,OAAQ,eAAc,KAAK,GAAG,KAAK,MAAM,MAAM;AAE9D,UAAM,SAAyB;AAAA,MAC7B,SAAS,OAAO,WAAW;AAAA,MAC3B,QAAQ,OAAO,WAAW,IAAI,QAAQ,KAAK,EAAE,4BAA4B,QAAQ,KAAK,EAAE;AAAA,MACxF,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,MACvD,eAAe,cAAc,SAAS,IAAI,gBAAgB;AAAA,MAC1D,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,MACrC,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,aAAa,oBAAI,KAAK;AAAA,IACxB;AAGA,aAAS,iBAAiB,MAAM,MAAM;AAEtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAsB,SAAqB,WAA+B;AACtF,WAAO,QAAQ,KAAK;AAAA,MAClB;AAAA,MACA,IAAI,QAAW,CAAC,GAAG,WAAW,WAAW,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;AAAA,IACzF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAA6C;AACxE,UAAM,QAAQ,oBAAI,IAAsB;AAExC,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,IAAI,KAAK,IAAI,KAAK,gBAAgB,CAAC,CAAC;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAsB,OAAwC;AACtF,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAE7B,UAAM,QAAQ,CAAC,OAAqB;AAClC,UAAI,KAAK,IAAI,EAAE,GAAG;AAChB,cAAM,IAAI,MAAM,wCAAwC,EAAE,EAAE;AAAA,MAC9D;AACA,UAAI,QAAQ,IAAI,EAAE,EAAG;AAErB,WAAK,IAAI,EAAE;AAEX,YAAM,OAAO,MAAM,IAAI,EAAE,KAAK,CAAC;AAC/B,iBAAW,OAAO,MAAM;AACtB,cAAM,GAAG;AAAA,MACX;AAEA,WAAK,OAAO,EAAE;AACd,cAAQ,IAAI,EAAE;AACd,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,GAAG;AACzB,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAgB,QAAsC;AAC9E,QAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,WAAW,GAAG;AACxD,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,aAAa,MAAM,CAAC,UAAU,OAAO,eAAe,SAAS,KAAK,CAAC;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW;AAChB,WAAK,gBAAgB,IAAI,QAAQ,CAACC,aAAY;AAC5C,aAAK,gBAAgBA;AAAA,MACvB,CAAC;AACD,WAAK,KAAK,eAAe,CAAC,CAAmB;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,QAAI,KAAK,YAAY,KAAK,eAAe;AACvC,WAAK,WAAW;AAChB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AACrB,WAAK,gBAAgB;AACrB,WAAK,KAAK,gBAAgB,CAAC,CAAmB;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,SAAK,iBAAiB,MAAM;AAG5B,QAAI,KAAK,YAAY,KAAK,eAAe;AACvC,WAAK,WAAW;AAChB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AACrB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAA8B;AAC1C,QAAI,KAAK,YAAY,KAAK,eAAe;AACvC,YAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAmC;AAC7C,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAmC;AAChD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAkB,MAAsB,MAAiB,QAA+B;AACnG,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,iBAAS,OAAO,MAAM,MAAM,MAAM;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO,KAAK,oBAAoB,UAAa,CAAC,KAAK,gBAAgB,OAAO;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,mBAAmB,SAAyD;AAC1F,SAAO,IAAI,aAAa,OAAO;AACjC;AAKO,IAAM,iBAA+B,OAAO,MAAM,MAAM,UAAU;AACvE,UAAQ,IAAI,kBAAkB,KAAK,EAAE,UAAU,KAAK,MAAM,KAAK,KAAK,WAAW,EAAE;AACjF,SAAO,EAAE,SAAS,MAAM,QAAQ,oBAAoB;AACtD;AAKO,IAAM,gBAA8B,OAAO,MAAM,OAAO,UAAU;AACvE,MAAI,CAAC,KAAK,SAAS;AACjB,WAAO,EAAE,SAAS,MAAM,QAAQ,wBAAwB;AAAA,EAC1D;AAEA,MAAI;AACF,UAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAM,SAASA,UAAS,KAAK,SAAS,EAAE,UAAU,SAAS,SAAS,IAAM,CAAC;AAG3E,QAAI,KAAK,kBAAkB,CAAC,OAAO,SAAS,KAAK,cAAc,GAAG;AAChE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,OAAO,oBAAoB,KAAK,cAAc;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,MAAM,OAAO;AAAA,EACjC,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAQ,MAAgB;AAAA,IAC1B;AAAA,EACF;AACF;;;ACtcO,IAAM,kBAAN,MAAsB;AAAA,EACnB,WAA2C,oBAAI,IAAI;AAAA,EACnD,UAA+B,oBAAI,IAAI;AAAA,EACvC,YAAuC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EAER,YAAY,SAAkC;AAC5C,SAAK,UAAU;AAAA,MACb,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAuB,SAA0B,QAAuB;AAE/E,QAAI,KAAK,QAAQ,oBAAoB;AACnC,YAAM,aAAa,KAAK,SAAS,OAAO;AACxC,UAAI,CAAC,WAAW,OAAO;AACrB,cAAM,IAAI,MAAM,oBAAoB,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MACpE;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK,QAAQ,gBAAgB;AACnE,YAAM,IAAI,MAAM,+BAA+B,QAAQ,IAAI,EAAE;AAAA,IAC/D;AAGA,UAAM,aAAgC;AAAA,MACpC,GAAG;AAAA,MACH,SAAS,WAAW,KAAK,QAAQ;AAAA,MACjC,SAAS;AAAA,MACT;AAAA,IACF;AAGA,SAAK,SAAS,IAAI,QAAQ,MAAM,UAAU;AAG1C,QAAI,QAAQ,SAAS;AACnB,iBAAW,SAAS,QAAQ,SAAS;AACnC,aAAK,QAAQ,IAAI,OAAO,QAAQ,IAAI;AAAA,MACtC;AAAA,IACF;AAEA,SAAK,KAAK,sBAAsB,UAAU;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAA0B,SAA0B,QAAuB;AACrF,eAAW,WAAW,UAAU;AAC9B,WAAK,SAAS,SAAS,SAAS,MAAM;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAuB;AAChC,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,SAAS;AACnB,iBAAW,SAAS,QAAQ,SAAS;AACnC,aAAK,QAAQ,OAAO,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,SAAS,OAAO,IAAI;AACzB,SAAK,KAAK,wBAAwB,OAAO;AACzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAA6C;AAE/C,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,KAAK,QAAQ,IAAI,IAAI;AACzC,QAAI,aAAa;AACf,aAAO,KAAK,SAAS,IAAI,WAAW;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAuB;AACzB,WAAO,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,OAA4B;AACnD,UAAM,WAAW,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAClD,WAAO,kBAAkB,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAqD;AAC1D,QAAI,WAAW,KAAK,OAAO,SAAS,eAAe;AAGnD,QAAI,CAAC,SAAS,eAAe;AAC3B,iBAAW,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAAA,IAC7C;AAGA,QAAI,SAAS,UAAU;AACrB,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,IACnE;AAGA,QAAI,SAAS,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC5C,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ,KAAM,KAAK,CAAC,MAAM,EAAE,KAAM,SAAS,CAAC,CAAC,CAAC;AAAA,IAC5F;AAGA,QAAI,SAAS,OAAO;AAClB,YAAM,QAAQ,QAAQ,MAAM,YAAY;AACxC,iBAAW,SAAS;AAAA,QAClB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KACnC,EAAE,YAAY,YAAY,EAAE,SAAS,KAAK,KAC1C,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,MAC1D;AAAA,IACF;AAGA,aAAS,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAG7D,QAAI,SAAS,OAAO;AAClB,iBAAW,SAAS,MAAM,GAAG,QAAQ,KAAK;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAuB;AAC5B,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,UAAU;AAClB,SAAK,KAAK,mBAAmB,OAAO;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAuB;AAC7B,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,UAAU;AAClB,SAAK,KAAK,oBAAoB,OAAO;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAc,SAAuE;AACjG,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,sBAAsB,IAAI;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,SAAS;AACpB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,wBAAwB,IAAI;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,SAAS;AACpB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,2BAA2B,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI;AAE3B,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,QACnC,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAED,aAAO,aAAa,KAAK,IAAI,IAAI;AACjC,WAAK,KAAK,oBAAoB,SAAS,MAAM;AAC7C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,SAA6B;AAAA,QACjC,SAAS;AAAA,QACT,OAAQ,MAAgB;AAAA,QACxB,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AACA,WAAK,KAAK,kBAAkB,SAAS,MAAM;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAgD;AACvD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAG5B,QAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,KAAK,KAAK,GAAG;AACzC,aAAO,KAAK,0BAA0B;AAAA,IACxC,OAAO;AAEL,UAAI,CAAC,oBAAoB,KAAK,QAAQ,IAAI,GAAG;AAC3C,eAAO,KAAK,gGAAgG;AAAA,MAC9G;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,eAAe,CAAC,QAAQ,YAAY,KAAK,GAAG;AACvD,aAAO,KAAK,iCAAiC;AAAA,IAC/C;AAGA,QAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,MAAM,KAAK,GAAG;AAC3C,aAAO,KAAK,gCAAgC;AAAA,IAC9C;AAGA,QAAI,QAAQ,SAAS;AACnB,iBAAW,SAAS,QAAQ,SAAS;AACnC,YAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG;AACpC,iBAAO,KAAK,yBAAyB,KAAK,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,MAAM;AAChB,YAAM,WAAW,oBAAI,IAAY;AACjC,iBAAW,OAAO,QAAQ,MAAM;AAC9B,YAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,GAAG;AACjC,iBAAO,KAAK,2BAA2B;AAAA,QACzC,WAAW,SAAS,IAAI,IAAI,IAAI,GAAG;AACjC,iBAAO,KAAK,4BAA4B,IAAI,IAAI,EAAE;AAAA,QACpD,OAAO;AACL,mBAAS,IAAI,IAAI,IAAI;AAAA,QACvB;AAEA,YAAI,CAAC,IAAI,eAAe,CAAC,IAAI,YAAY,KAAK,GAAG;AAC/C,mBAAS,KAAK,YAAY,IAAI,IAAI,qBAAqB;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,YAAY,QAAQ,SAAS,WAAW,GAAG;AACtD,eAAS,KAAK,+BAA+B;AAAA,IAC/C;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA0B;AACxB,UAAM,aAAa,oBAAI,IAAY;AACnC,eAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAC5C,UAAI,QAAQ,UAAU;AACpB,mBAAW,IAAI,QAAQ,QAAQ;AAAA,MACjC;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU,EAAE,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAAuC;AACnD,WAAO,KAAK,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,OAAsB;AAC7C,UAAM,WAAW,KAAK,OAAO,eAAe,EAAE,IAAI,CAAC,MAAM;AAEvD,YAAM,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,IAAI;AACjD,aAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,QACR,WAAW,oBAAI,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAuB,SAA0B,QAAyB;AAC/E,QAAI,WAAW;AACf,eAAW,WAAW,OAAO,UAAU;AACrC,UAAI;AACF,aAAK,SAAS,SAAS,SAAS,MAAM;AACtC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAsC;AAChD,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAsC;AACnD,SAAK,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,KAAK,OAAqB,SAA4B,QAAmC;AAC/F,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,iBAAS,OAAO,SAAS,MAAM;AAAA,MACjC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,SAAmD;AACvF,SAAO,IAAI,gBAAgB,OAAO;AACpC;;;ACzZA,IAAM,gBAAuD;AAAA,EAC3D,eAAe;AAAA,IACb,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACF;AAKO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EAER,YAAY,SAA4C;AACtD,SAAK,UAAU,WAAW,CAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAsC;AACnD,WAAO,cAAc,KAAK,KAAK,cAAc;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAuB,aAAoC;AACnE,WAAO;AAAA,MACL,MAAM,eAAe,KAAK,QAAQ,MAAM,IAAI;AAAA,MAC5C,aAAa,MAAM,eAAe,WAAW,MAAM,IAAI;AAAA,MACvD,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,UAAU,KAAK,cAAc,KAAK;AAAA,MAClC,UAAU,KAAK,iBAAiB,OAAO,eAAe,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAA0C;AACnD,WAAO,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAAmD;AACvE,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,SAAS,QAAQ,IAAI,EAAE;AAClC,UAAM,KAAK,gBAAgB,QAAQ,WAAW,EAAE;AAChD,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,YAAM,KAAK,aAAa,QAAQ,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,IACvD;AACA,QAAI,QAAQ,wBAAwB;AAClC,YAAM,KAAK,8BAA8B;AAAA,IAC3C;AACA,QAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,YAAM,KAAK,OAAO;AAClB,iBAAW,OAAO,QAAQ,MAAM;AAC9B,cAAM,KAAK,aAAa,IAAI,IAAI,EAAE;AAClC,cAAM,KAAK,oBAAoB,IAAI,WAAW,EAAE;AAChD,YAAI,IAAI,SAAU,OAAM,KAAK,oBAAoB;AACjD,YAAI,IAAI,QAAS,OAAM,KAAK,iBAAiB,IAAI,OAAO,GAAG;AAAA,MAC7D;AAAA,IACF;AACA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,MAAM,QAAQ,IAAI,EAAE;AAC/B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,QAAQ,WAAW;AAC9B,UAAM,KAAK,EAAE;AAGb,QAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,YAAM,KAAK,UAAU;AACrB,YAAM,KAAK,EAAE;AACb,iBAAW,WAAW,QAAQ,UAAU;AACtC,cAAM,KAAK,KAAK,OAAO,EAAE;AAAA,MAC3B;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,8BAA8B,QAAQ,KAAK,WAAW;AACjE,UAAM,KAAK,EAAE;AAEb,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,UAAqE;AAC1F,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,WAAW,UAAU;AAC9B,UAAI,KAAK,cAAc,OAAO,GAAG;AAC/B,cAAM,WAAW,GAAG,QAAQ,IAAI;AAChC,cAAM,IAAI,UAAU,KAAK,sBAAsB,OAAO,CAAC;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,UAAwD;AAC1E,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,iCAAiC;AAC5C,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sBAAsB;AACjC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,yDAAyD;AACpE,UAAM,KAAK,EAAE;AAEb,eAAW,WAAW,UAAU;AAC9B,UAAI,KAAK,cAAc,OAAO,GAAG;AAC/B,cAAM,KAAK,OAAO,QAAQ,IAAI,EAAE;AAChC,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,QAAQ,WAAW;AAC9B,cAAM,KAAK,EAAE;AACb,YAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,gBAAM,KAAK,YAAY;AACvB,qBAAW,WAAW,QAAQ,UAAU;AACtC,kBAAM,KAAK,KAAK,OAAO,EAAE;AAAA,UAC3B;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,UAAqE;AAC5F,UAAM,QAAQ,oBAAI,IAAoB;AAEtC,eAAW,WAAW,UAAU;AAC9B,UAAI,KAAK,cAAc,OAAO,GAAG;AAC/B,cAAM,QAAkB,CAAC;AAGzB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,SAAS,QAAQ,IAAI,EAAE;AAClC,cAAM,KAAK,gBAAgB,QAAQ,WAAW,EAAE;AAChD,cAAM,KAAK,eAAe;AAC1B,YAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,gBAAM,KAAK,aAAa,QAAQ,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,QACvD;AACA,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,KAAK,QAAQ,IAAI,EAAE;AAC9B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,QAAQ,WAAW;AAC9B,cAAM,KAAK,EAAE;AAEb,YAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,gBAAM,KAAK,cAAc;AACzB,gBAAM,KAAK,EAAE;AACb,qBAAW,OAAO,QAAQ,MAAM;AAC9B,kBAAM,WAAW,IAAI,WAAW,eAAe;AAC/C,kBAAM,KAAK,OAAO,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,WAAW,EAAE;AAAA,UAChE;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,YAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,gBAAM,KAAK,aAAa;AACxB,gBAAM,KAAK,EAAE;AACb,qBAAW,WAAW,QAAQ,UAAU;AACtC,kBAAM,KAAK,KAAK,OAAO,EAAE;AAAA,UAC3B;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,cAAM,KAAK,oBAAoB;AAC/B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,cAAc,QAAQ,KAAK,IAAI;AAC1C,cAAM,KAAK,EAAE;AAEb,cAAM,WAAW,GAAG,QAAQ,IAAI;AAChC,cAAM,IAAI,UAAU,MAAM,KAAK,IAAI,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,UAAqE;AAC3F,UAAM,QAAQ,oBAAI,IAAoB;AAEtC,eAAW,WAAW,UAAU;AAC9B,UAAI,KAAK,cAAc,OAAO,GAAG;AAC/B,cAAM,QAAkB,CAAC;AAEzB,cAAM,KAAK,KAAK,QAAQ,IAAI,EAAE;AAC9B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,KAAK,QAAQ,WAAW,EAAE;AACrC,cAAM,KAAK,EAAE;AAEb,YAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,gBAAM,KAAK,eAAe;AAC1B,gBAAM,KAAK,EAAE;AACb,gBAAM,KAAK,mCAAmC;AAC9C,gBAAM,KAAK,mCAAmC;AAC9C,qBAAW,OAAO,QAAQ,MAAM;AAC9B,kBAAM,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,WAAW,QAAQ,IAAI,MAAM,IAAI,WAAW,IAAI;AAAA,UACpF;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,YAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,gBAAM,KAAK,aAAa;AACxB,gBAAM,KAAK,EAAE;AACb,qBAAW,WAAW,QAAQ,UAAU;AACtC,kBAAM,KAAK;AAAA,EAAW,OAAO;AAAA,OAAU;AAAA,UACzC;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,cAAM,KAAK,mBAAmB;AAC9B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,oCAAoC,QAAQ,KAAK,WAAW;AACvE,cAAM,KAAK,EAAE;AAEb,cAAM,WAAW,GAAG,QAAQ,IAAI;AAChC,cAAM,IAAI,UAAU,MAAM,KAAK,IAAI,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,UACA,OAC8B;AAC9B,YAAQ,OAAO;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,uBAAuB,QAAQ;AAAA,MAE7C,KAAK;AACH,eAAO,KAAK,oBAAoB,QAAQ;AAAA,MAE1C,KAAK;AACH,eAAO,KAAK,yBAAyB,QAAQ;AAAA,MAE/C,KAAK;AACH,eAAO,KAAK,wBAAwB,QAAQ;AAAA,MAE9C;AAEE,eAAO,KAAK,uBAAuB,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAwD;AACvE,UAAM,WAAW;AAAA,MACf,SAAS;AAAA,MACT,UAAU,SAAS,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,QAClE,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,OAAO,EAAE;AAAA,QACT,SAAS,EAAE;AAAA,QACX,MAAM,EAAE;AAAA,QACR,UAAU,EAAE;AAAA,QACZ,MAAM,EAAE;AAAA,MACV,EAAE;AAAA,MACF,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAEA,WAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,SAAoD;AAExE,QAAI,QAAQ,UAAU,CAAC,KAAK,QAAQ,eAAe;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,aAAa,WAAW,CAAC,QAAQ,WAAW,CAAC,KAAK,QAAQ,iBAAiB;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAQ,KAAqB;AACnC,WAAO,IACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAA2C;AAC/D,UAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,UAAM,OAAO,MAAM,KAAK,YAAY;AAEpC,QAAI,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,MAAM,GAAG;AACrD,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,OAAO,GAAG;AACxD,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,MAAM,GAAG;AACtD,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC7D,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC9E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAAuB,aAA+B;AAC7E,UAAM,WAAqB,CAAC;AAE5B,aAAS,KAAK,IAAI,WAAW,EAAE;AAG/B,QAAI,MAAM,QAAQ,YAAY,EAAE,SAAS,MAAM,GAAG;AAChD,eAAS,KAAK,IAAI,WAAW,kBAAkB;AAAA,IACjD;AAEA,QAAI,MAAM,QAAQ,YAAY,EAAE,SAAS,MAAM,GAAG;AAChD,eAAS,KAAK,IAAI,WAAW,cAAc;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAAuB,SAA8D;AACnG,SAAO,IAAI,iBAAiB,OAAO;AACrC;AAKO,SAAS,eAAe,OAAsC;AACnE,SAAO,cAAc,KAAK,KAAK,cAAc;AAC/C;AAKO,SAAS,sBAAsB,OAA2B;AAC/D,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,QAAQ,yBAAyB;AAC1C;;;AC5gBO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,UAAsB;AAAtB;AAAA,EAAuB;AAAA,EAE3C,MAAM,OACJ,OACA,QACA,UAA2B,CAAC,GACD;AAC3B,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,IAAI;AAEJ,UAAM,UAAU,MAAM,KAAK,SAAS,OAAO,OAAO,MAAM;AAExD,UAAM,WAAW,QACd,OAAO,CAAC,MAAM,EAAE,aAAa,YAAY,EACzC,MAAM,GAAG,KAAK;AAEjB,QAAI,CAAC,kBAAkB;AACrB,eAAS,QAAQ,CAAC,MAAM;AACtB,UAAE,YAAY;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eACJ,QACA,QACA,UAA2B,CAAC,GACD;AAC3B,UAAM,gBAAgB,+BAA+B,MAAM;AAC3D,WAAO,KAAK,OAAO,eAAe,QAAQ,OAAO;AAAA,EACnD;AAAA,EAEA,MAAM,YACJ,OACA,WACA,UAA2B,CAAC,GACD;AAC3B,UAAM,QAAQ,2BAA2B,MAAM,IAAI,MAAM,MAAM,cAAc,eAAe,MAAM,WAAW,KAAK,EAAE;AACpH,UAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AAC9D,WAAO,KAAK,OAAO,OAAO,UAAU,OAAO;AAAA,EAC7C;AACF;;;AC/CO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,UAAsB;AAAtB;AAAA,EAAuB;AAAA,EAE3C,MAAM,SACJ,SACA,UAA6B,CAAC,GACL;AACzB,UAAM,QAAQ,MAAM,KAAK,SAAS,cAAc,OAAO;AAEvD,QAAI,QAAQ,eAAe,MAAM,SAAS;AACxC,YAAM,UAAU,KAAK,iBAAiB,MAAM,SAAS,QAAQ,WAAW;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBACJ,MACA,aACA,UAA6B,CAAC,GACL;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,QACE;AAAA,QACA,cAAc,CAAC,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,cACA,WACA,UAA6B,CAAC,GACL;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,QACE,aAAa,+BAA+B,YAAY,+CAA+C,KAAK,UAAU,SAAS,CAAC;AAAA,QAChI,SAAS,aAAa,YAAY;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,SAAiB,OAAuB;AAC/D,UAAM,WAAW;AAAA,SACZ,KAAK;AAAA,cACD,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAAA,EAGnC,OAAO;AACL,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,OAGhB;AACA,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,SAAS,GAAG;AACxC,aAAO,KAAK,0CAA0C;AAAA,IACxD;AAEA,QAAI,CAAC,MAAM,eAAe,MAAM,YAAY,SAAS,IAAI;AACvD,aAAO,KAAK,kDAAkD;AAAA,IAChE;AAEA,QAAI,CAAC,MAAM,WAAW,MAAM,QAAQ,SAAS,IAAI;AAC/C,aAAO,KAAK,8CAA8C;AAAA,IAC5D;AAEA,QAAI,MAAM,aAAa,KAAK;AAC1B,aAAO,KAAK,qCAAqC;AAAA,IACnD;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;;;AChFO,IAAe,iBAAf,MAAoD;AAAA,EAU/C,kBAAkB,OAAe,QAAmC;AAC5E,UAAM,aAAa,OAChB;AAAA,MACC,CAAC,GAAG,MACF,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,cAAc,MAAM,EAAE,WAAW,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE;AAAA,IAC9G,EACC,KAAK,IAAI;AAEZ,WAAO;AAAA;AAAA,eAEI,KAAK;AAAA;AAAA;AAAA,EAGlB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeV;AAAA,EAEU,oBAAoB,SAA+B;AAC3D,QAAI,SAAS;AAAA;AAAA,eAEF,QAAQ,WAAW;AAE9B,QAAI,QAAQ,SAAS;AACnB,gBAAU;AAAA;AAAA,WAAgB,QAAQ,OAAO;AAAA,IAC3C;AAEA,QAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,gBAAU;AAAA;AAAA;AAAA,EAAuB,QAAQ,aAAa,IAAI,CAAC,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA;AAAA,EAAc,IAAI;AAAA,OAAU,EAAE,KAAK,MAAM,CAAC;AAAA,IACnI;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,gBAAU;AAAA;AAAA,qBAA0B,QAAQ,gBAAgB;AAAA,IAC9D;AAEA,cAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBV,WAAO;AAAA,EACT;AAAA,EAEU,oBACR,UACA,QACkB;AAClB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,aAAO,OAAO,IAAI,CAAC,UAAe;AAAA,QAChC,OAAO,OAAO,KAAK,QAAQ,CAAC;AAAA,QAC5B,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,MAClB,EAAE;AAAA,IACJ,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEU,sBAAsB,UAAkC;AAChE,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,YAAY,OAAO,cAAc;AAAA,QACjC,WAAW,OAAO,aAAa;AAAA,MACjC;AAAA,IACF,QAAQ;AACN,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,EACF;AACF;;;AC9GO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACjD,OAAO;AAAA,EAEP,MAAM,OACJ,OACA,QAC2B;AAC3B,UAAM,aAAa,MAAM,YAAY;AACrC,UAAM,aAAa,WAAW,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAErE,WAAO,OACJ,IAAI,CAAC,UAAU;AACd,UAAI,YAAY;AAEhB,YAAM,YAAY,MAAM,KAAK,YAAY,EAAE,SAAS,UAAU;AAC9D,YAAM,YAAY,MAAM,aAAa,YAAY,EAAE,SAAS,UAAU;AACtE,YAAM,WAAW,MAAM,MAAM;AAAA,QAAK,CAAC,MACjC,EAAE,YAAY,EAAE,SAAS,UAAU;AAAA,MACrC;AACA,YAAM,eAAe,MAAM,QAAQ,YAAY,EAAE,SAAS,UAAU;AAGpE,YAAM,gBAAgB,WAAW;AAAA,QAAK,CAAC,SACrC,MAAM,KAAK,YAAY,EAAE,SAAS,IAAI;AAAA,MACxC;AACA,YAAM,gBAAgB,WAAW;AAAA,QAC/B,CAAC,SAAS,MAAM,aAAa,YAAY,EAAE,SAAS,IAAI;AAAA,MAC1D;AACA,YAAM,eAAe,WAAW;AAAA,QAAK,CAAC,SACpC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,IAAI,CAAC;AAAA,MACxD;AAEA,UAAI,UAAW,cAAa;AAC5B,UAAI,UAAW,cAAa;AAC5B,UAAI,SAAU,cAAa;AAC3B,UAAI,aAAc,cAAa;AAG/B,UAAI,CAAC,aAAa,cAAe,cAAa;AAC9C,UAAI,CAAC,aAAa,cAAe,cAAa;AAC9C,UAAI,CAAC,YAAY,aAAc,cAAa;AAE5C,kBAAY,KAAK,IAAI,GAAG,SAAS;AAEjC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAW,KAAK;AAAA,UACd,aAAa;AAAA,UACb,aAAa;AAAA,UACb,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EACxC,MAAM,GAAG,EAAE;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,SAAgD;AAClE,UAAM,OAAO,KAAK,aAAa,QAAQ,WAAW;AAClD,UAAM,OAAO,KAAK,aAAa,QAAQ,WAAW;AAElD,WAAO;AAAA,MACL;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,SAAS,KAAK,gBAAgB,MAAM,OAAO;AAAA,MAC3C;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEQ,eACN,WACA,WACA,UACA,cACQ;AACR,UAAM,UAAoB,CAAC;AAC3B,QAAI,UAAW,SAAQ,KAAK,MAAM;AAClC,QAAI,cAAc,KAAM,SAAQ,KAAK,aAAa;AAClD,QAAI,aAAa,KAAM,SAAQ,KAAK,MAAM;AAC1C,QAAI,aAAc,SAAQ,KAAK,SAAS;AAExC,WAAO,QAAQ,SAAS,IACpB,eAAe,QAAQ,KAAK,IAAI,CAAC,KACjC;AAAA,EACN;AAAA,EAEQ,aAAa,aAA6B;AAChD,WAAO,YACJ,YAAY,EACZ,QAAQ,gBAAgB,EAAE,EAC1B,MAAM,KAAK,EACX,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AAAA,EACb;AAAA,EAEQ,aAAa,aAA+B;AAClD,UAAM,aAAa,CAAC,gBAAgB,cAAc,aAAa;AAC/D,QAAI,YAAY,YAAY,EAAE,SAAS,MAAM,EAAG,YAAW,KAAK,SAAS;AACzE,QAAI,YAAY,YAAY,EAAE,SAAS,OAAO;AAC5C,iBAAW,KAAK,WAAW;AAC7B,QAAI,YAAY,YAAY,EAAE,SAAS,MAAM,EAAG,YAAW,KAAK,QAAQ;AACxE,WAAO,WAAW,MAAM,GAAG,CAAC;AAAA,EAC9B;AAAA,EAEQ,gBAAgB,MAAc,SAA+B;AACnE,QAAI,UAAU,KAAK,IAAI;AAAA;AAAA,EAAO,QAAQ,WAAW;AAAA;AAAA;AAEjD,QAAI,QAAQ,SAAS;AACnB,iBAAW;AAAA;AAAA,EAAiB,QAAQ,OAAO;AAAA;AAAA;AAAA,IAC7C;AAEA,eAAW;AAAA;AAAA;AACX,eAAW;AAAA;AACX,eAAW;AAAA;AACX,eAAW;AAAA;AACX,eAAW;AAAA;AAAA;AAEX,QAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,iBAAW;AAAA;AAAA;AACX,cAAQ,aAAa,QAAQ,CAAC,MAAM,MAAM;AACxC,mBAAW,eAAe,IAAI,CAAC;AAAA;AAAA;AAAA,EAAe,IAAI;AAAA;AAAA;AAAA;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,iBAAW;AAAA;AAAA,EAA2B,QAAQ,gBAAgB;AAAA;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AACF;;;ACjIO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAoB,QAAkB;AAAlB;AAClB,SAAK,WAAW,KAAK,eAAe;AACpC,SAAK,SAAS,IAAI,SAAS,KAAK,QAAQ;AACxC,SAAK,YAAY,IAAI,iBAAiB,KAAK,QAAQ;AAAA,EACrD;AAAA,EARQ;AAAA,EACA;AAAA,EACA;AAAA,EAQR,MAAM,aACJ,OACA,QACA,SAC2B;AAC3B,WAAO,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO;AAAA,EAClD;AAAA,EAEA,MAAM,eACJ,QACA,QACA,SAC2B;AAC3B,WAAO,KAAK,OAAO,eAAe,QAAQ,QAAQ,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,YACJ,OACA,WACA,SAC2B;AAC3B,WAAO,KAAK,OAAO,YAAY,OAAO,WAAW,OAAO;AAAA,EAC1D;AAAA,EAEA,MAAM,cACJ,SACA,SACyB;AACzB,WAAO,KAAK,UAAU,SAAS,SAAS,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,iBACJ,MACA,aACA,SACyB;AACzB,WAAO,KAAK,UAAU,iBAAiB,MAAM,aAAa,OAAO;AAAA,EACnE;AAAA,EAEA,MAAM,qBACJ,cACA,WACA,SACyB;AACzB,WAAO,KAAK,UAAU,qBAAqB,cAAc,WAAW,OAAO;AAAA,EAC7E;AAAA,EAEA,kBAAkB,OAGhB;AACA,WAAO,KAAK,UAAU,kBAAkB,KAAK;AAAA,EAC/C;AAAA,EAEQ,iBAA6B;AACnC,QAAI,KAAK,OAAO,aAAa,UAAU,CAAC,KAAK,OAAO,QAAQ;AAC1D,aAAO,IAAI,eAAe;AAAA,IAC5B;AAEA,YAAQ,KAAK,OAAO,UAAU;AAAA,MAC5B,KAAK;AAAA,MACL,KAAK;AACH,eAAO,IAAI,eAAe;AAAA,MAC5B;AACE,eAAO,IAAI,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,aAAa,QAAiC;AAC5C,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAC1C,SAAK,WAAW,KAAK,eAAe;AACpC,SAAK,SAAS,IAAI,SAAS,KAAK,QAAQ;AACxC,SAAK,YAAY,IAAI,iBAAiB,KAAK,QAAQ;AAAA,EACrD;AACF;;;ACvGA,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AASV,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA,SAAuB,CAAC;AAAA,EACxB,gBAAuC;AAAA,EACvC,WAAiC;AAAA,EAEzC,YAAY,QAAgB;AAC1B,SAAK,UAAU,KAAK,KAAK,QAAQ,WAAW;AAC5C,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,IACJ,MACA,QACA,UACA,SACA,UAAmB,MACnB,OACA,UACe;AACf,UAAM,QAAoB;AAAA,MACxB,IAAI,KAAK,WAAW;AAAA,MACpB,WAAW,oBAAI,KAAK;AAAA,MACpB;AAAA,MACA,MAAM,QAAQ,IAAI,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,SAAK,OAAO,KAAK,KAAK;AAEtB,QAAI,KAAK,OAAO,UAAU,IAAI;AAC5B,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,QAAoB,CAAC,GAA0B;AACzD,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,WAAO,KAAK,aAAa,QAAQ,KAAK;AAAA,EACxC;AAAA,EAEA,MAAM,QAA6B;AACjC,UAAM,SAAS,MAAM,KAAK,WAAW;AAErC,UAAM,cAAc,OAAO;AAC3B,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,UAAM,cAAc,cAAc,IAAI,gBAAgB,cAAc;AAEpE,UAAM,eAA+C,CAAC;AACtD,WAAO,QAAQ,CAAC,MAAM;AACpB,mBAAa,EAAE,IAAI,KAAK,aAAa,EAAE,IAAI,KAAK,KAAK;AAAA,IACvD,CAAC;AAED,UAAM,eAAe,OAClB,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC,EAC5D,MAAM,GAAG,EAAE;AAEd,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,WAAO,QAAQ,CAAC,MAAM;AACpB,qBAAe,IAAI,EAAE,WAAW,eAAe,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC;AAAA,IAC1E,CAAC;AAED,UAAM,eAAe,MAAM,KAAK,eAAe,QAAQ,CAAC,EACrD,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,EAAE,UAAU,MAAM,EAAE,EAChD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAEd,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAA8C;AACzD,UAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,KAAK;AAE7C,YAAQ,QAAQ,QAAQ;AAAA,MACtB,KAAK;AACH,eAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MACvC,KAAK;AACH,eAAO,KAAK,MAAM,MAAM;AAAA,MAC1B,KAAK;AACH,eAAO,KAAK,OAAO,MAAM;AAAA,MAC3B;AACE,eAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,WAAmC;AAC7C,UAAM,SAAS,MAAM,KAAK,WAAW;AAErC,UAAM,WAAW,YACb,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,IAC7C,CAAC;AAEL,UAAM,KAAK,WAAW,QAAQ;AAE9B,WAAO,OAAO,SAAS,SAAS;AAAA,EAClC;AAAA,EAEA,MAAM,QAAuB;AAE3B,QAAI,KAAK,UAAU;AACjB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B;AAAA,IACF;AAGA,SAAK,WAAW,KAAK,QAAQ;AAC7B,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAc,UAAyB;AAErC,UAAM,UAAU,KAAK;AACrB,SAAK,SAAS,CAAC;AAEf,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,WAAW;AACrC,aAAO,KAAK,GAAG,OAAO;AACtB,YAAM,KAAK,WAAW,MAAM;AAAA,IAC9B,SAAS,OAAO;AAEd,WAAK,SAAS,CAAC,GAAG,SAAS,GAAG,KAAK,MAAM;AACzC,cAAQ,MAAM,8BAA8B,KAAK;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,eAAe;AACtB,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACvB;AACA,UAAM,KAAK,MAAM;AAAA,EACnB;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,gBAAgB;AAAA,MACnB,MAAM;AACJ,aAAK,MAAM,EAAE,MAAM,QAAQ,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,aAAoC;AAChD,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,SAAS,KAAK,SAAS,OAAO;AACvD,YAAM,SAAuB,CAAC;AAE9B,iBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAI,CAAC,KAAK,KAAK,EAAG;AAElB,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,gBAAM,YAAY,IAAI,KAAK,MAAM,SAAS;AAC1C,iBAAO,KAAK,KAAK;AAAA,QACnB,SAAS,OAAO;AAGd;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AACA,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,QAAqC;AAC5D,UAAM,MAAM,KAAK,QAAQ,KAAK,OAAO;AACrC,UAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,UAAM,UAAU,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9D,UAAM,GAAG,UAAU,KAAK,SAAS,SAAS,OAAO;AAAA,EACnD;AAAA,EAEQ,aAAa,QAAsB,OAAiC;AAC1E,QAAI,WAAW;AAEf,QAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,iBAAW,SAAS,OAAO,CAAC,MAAM,MAAM,MAAO,SAAS,EAAE,IAAI,CAAC;AAAA,IACjE;AAEA,QAAI,MAAM,MAAM;AACd,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,IACzD;AAEA,QAAI,MAAM,UAAU;AAClB,iBAAW,SAAS;AAAA,QAAO,CAAC,MAC1B,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM,SAAU,YAAY,CAAC;AAAA,MACjE;AAAA,IACF;AAEA,QAAI,MAAM,WAAW;AACnB,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,SAAU;AAAA,IACnE;AAEA,QAAI,MAAM,SAAS;AACjB,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM,OAAQ;AAAA,IACjE;AAEA,QAAI,MAAM,YAAY,QAAW;AAC/B,iBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,OAAO;AAAA,IAC/D;AAEA,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAErE,QAAI,MAAM,WAAW,UAAa,MAAM,WAAW,MAAM;AACvD,iBAAW,SAAS,MAAM,MAAM,MAAM;AAAA,IACxC;AAEA,QAAI,MAAM,UAAU,UAAa,MAAM,UAAU,MAAM;AACrD,iBAAW,SAAS,MAAM,GAAG,MAAM,KAAK;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqB;AAC3B,WAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACpE;AAAA,EAEQ,MAAM,QAA8B;AAC1C,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,OAAO,IAAI,CAAC,MAAM;AAAA,MAC7B,EAAE;AAAA,MACF,EAAE,UAAU,YAAY;AAAA,MACxB,EAAE;AAAA,MACF,EAAE,QAAQ;AAAA,MACV,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,UAAU,SAAS;AAAA,MACrB,EAAE,SAAS;AAAA,MACX,EAAE,UAAU,SAAS,KAAK;AAAA,IAC5B,CAAC;AAED,WAAO,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACvE;AAAA,EAEQ,OAAO,QAA8B;AAC3C,WAAO,OACJ,IAAI,CAAC,MAAM;AACV,UAAI,OAAO,IAAI,EAAE,UAAU,YAAY,CAAC,KAAK,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,QAAQ;AAClF,UAAI,EAAE,KAAM,SAAQ,OAAO,EAAE,IAAI;AACjC,cAAQ,KAAK,EAAE,UAAU,YAAY,QAAQ;AAC7C,UAAI,EAAE,MAAO,SAAQ;AAAA,WAAc,EAAE,KAAK;AAC1C,UAAI,EAAE,SAAU,SAAQ;AAAA,cAAiB,EAAE,QAAQ;AACnD,aAAO;AAAA,IACT,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AACF;","names":["relative","existsSync","readFileSync","join","parseYaml","join","existsSync","readFileSync","parseYaml","existsSync","join","basename","path","join","basename","existsSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","path","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","path","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","existsSync","join","basename","homedir","join","homedir","basename","existsSync","z","parseYaml","stringifyYaml","extractFrontmatter","name","parseYaml","stringifyYaml","extractFrontmatter","parseMetadataComments","existsSync","readFileSync","writeFileSync","mkdirSync","dirname","basename","existsSync","readFileSync","basename","dirname","mkdirSync","writeFileSync","z","existsSync","readFileSync","readdirSync","join","basename","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","existsSync","readFileSync","parseYaml","mkdirSync","stringifyYaml","writeFileSync","existsSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","mkdirSync","writeFileSync","readdirSync","existsSync","readFileSync","statSync","join","z","execSync","existsSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","tmpdir","homedir","randomUUID","join","homedir","tmpdir","randomUUID","execSync","existsSync","readFileSync","rmSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","readdirSync","writeFileSync","mkdirSync","join","parse","stringify","parse","existsSync","readFileSync","join","readdirSync","mkdirSync","writeFileSync","stringify","randomUUID","execSync","randomUUID","randomUUID","resolve","execSync","resolve","existsSync","join","homedir","getSearchDirs","join","existsSync","homedir","resolve","existsSync","readFileSync","join","parseYaml","resolve","result","existsSync","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","path","isAbsolute","unlinkSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","homedir","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","existsSync","mkdirSync","join","homedir","homedir","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","execSync","join","existsSync","mkdirSync","readFileSync","rmSync","dirname","writeFileSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","statSync","join","basename","resolve","dirname","parseSkillContent","existsSync","readFileSync","writeFileSync","mkdirSync","join","existsSync","readFileSync","readdirSync","statSync","join","basename","isLocalPath","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","existsSync","readFileSync","readdirSync","statSync","join","dirname","existsSync","readFileSync","readdirSync","statSync","join","dirname","join","existsSync","readdirSync","statSync","readFileSync","join","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","randomUUID","path","join","relative","randomUUID","randomUUID","randomUUID","randomUUID","path","fs","DEFAULT_OPTIONS","path","resolve","execSync"]}
|