cliskill 1.1.7 → 1.2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/memory/store.ts","../src/extensions/skill-loader.ts","../src/extensions/skill-registry.ts","../src/safety/permissions.ts","../src/safety/command-inspector.ts","../src/services/history.ts","../src/hooks/registry.ts","../src/hooks/executor.ts","../src/utils/bash-parser.ts","../src/tasks/executor.ts","../src/swarm/coordinator.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, readdir, stat, unlink } from 'node:fs/promises'\r\nimport { join, resolve } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport type { MemoryEntry, MemoryConfig } from './types.js'\r\nimport { DEFAULT_MEMORY_DIR } from '../config/constants.js'\r\n\r\nconst DEFAULT_CONFIG: MemoryConfig = {\r\n memoryDir: DEFAULT_MEMORY_DIR,\r\n maxEntrypointSize: 25_000,\r\n maxTopicFiles: 50,\r\n}\r\n\r\n/**\r\n * File-based memory store.\r\n * Stores memories in a directory structure:\r\n * .cliskill/memory/\r\n * MEMORY.md — entrypoint (summary)\r\n * topics/\r\n * project.md — topic-specific memories\r\n * preferences.md\r\n * ...\r\n */\r\nexport class MemoryStore {\r\n private config: MemoryConfig\r\n private rootDir: string\r\n private cache = new Map<string, MemoryEntry>()\r\n private loaded = false\r\n\r\n constructor(projectRoot: string, config?: Partial<MemoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n this.rootDir = resolve(projectRoot, this.config.memoryDir)\r\n }\r\n\r\n /**\r\n * Initialize the memory directory structure.\r\n */\r\n async init(): Promise<void> {\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (!existsSync(entrypointPath)) {\r\n await writeFile(\r\n entrypointPath,\r\n '# Project Memory\\n\\nThis file contains persistent memory for the AI assistant.\\n',\r\n 'utf-8',\r\n )\r\n }\r\n\r\n await this.load()\r\n }\r\n\r\n /**\r\n * Load all memories from disk into cache.\r\n */\r\n async load(): Promise<void> {\r\n this.cache.clear()\r\n\r\n const topicsDir = join(this.rootDir, 'topics')\r\n if (existsSync(topicsDir)) {\r\n const files = await readdir(topicsDir)\r\n for (const file of files) {\r\n if (file.endsWith('.md')) {\r\n const topic = file.replace('.md', '')\r\n const filePath = join(topicsDir, file)\r\n const content = await readFile(filePath, 'utf-8')\r\n const fileStat = await stat(filePath)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: fileStat.birthtimeMs,\r\n lastAccessedAt: fileStat.mtimeMs,\r\n })\r\n }\r\n }\r\n }\r\n\r\n this.loaded = true\r\n }\r\n\r\n /**\r\n * Get a memory by topic.\r\n */\r\n get(topic: string): MemoryEntry | undefined {\r\n return this.cache.get(topic)\r\n }\r\n\r\n /**\r\n * Get all memories.\r\n */\r\n getAll(): MemoryEntry[] {\r\n return Array.from(this.cache.values())\r\n }\r\n\r\n /**\r\n * Save a memory entry to disk.\r\n */\r\n async set(topic: string, content: string): Promise<void> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n await writeFile(filePath, content, 'utf-8')\r\n\r\n const now = Date.now()\r\n const existing = this.cache.get(topic)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: existing?.createdAt ?? now,\r\n lastAccessedAt: now,\r\n })\r\n }\r\n\r\n /**\r\n * Delete a memory by topic.\r\n */\r\n async delete(topic: string): Promise<boolean> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n if (existsSync(filePath)) {\r\n await unlink(filePath)\r\n this.cache.delete(topic)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Search memories by keyword.\r\n */\r\n search(query: string): MemoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.getAll()\r\n .filter(\r\n (entry) =>\r\n entry.content.toLowerCase().includes(lowerQuery) ||\r\n entry.topic.toLowerCase().includes(lowerQuery),\r\n )\r\n .sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n /**\r\n * Get the entrypoint (MEMORY.md) content.\r\n */\r\n async getEntrypoint(): Promise<string> {\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (existsSync(entrypointPath)) {\r\n return readFile(entrypointPath, 'utf-8')\r\n }\r\n return ''\r\n }\r\n\r\n /**\r\n * Update the entrypoint (MEMORY.md) content.\r\n */\r\n async setEntrypoint(content: string): Promise<void> {\r\n if (content.length > this.config.maxEntrypointSize) {\r\n content = content.slice(0, this.config.maxEntrypointSize) + '\\n\\n... (truncated)'\r\n }\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n await writeFile(entrypointPath, content, 'utf-8')\r\n }\r\n\r\n /**\r\n * Build a context string from relevant memories for inclusion in system prompt.\r\n */\r\n async buildContext(query?: string, maxTokens: number = 2000): Promise<string> {\r\n let memories: MemoryEntry[]\r\n\r\n if (query) {\r\n memories = this.search(query)\r\n } else {\r\n memories = this.getAll().sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n const entrypoint = await this.getEntrypoint()\r\n let context = ''\r\n\r\n if (entrypoint) {\r\n context += `## Project Memory\\n${entrypoint}\\n\\n`\r\n }\r\n\r\n for (const memory of memories) {\r\n const addition = `### ${memory.topic}\\n${memory.content.slice(0, 500)}\\n\\n`\r\n // Rough token estimation: ~4 chars per token\r\n if ((context.length + addition.length) / 4 > maxTokens) break\r\n context += addition\r\n }\r\n\r\n return context.trim()\r\n }\r\n}\r\n","import { readFile, readdir } from 'node:fs/promises'\r\nimport { join } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport type { SkillDefinition } from './types.js'\r\n\r\n/**\r\n * Load skills from .md files in a directory.\r\n * Skills use YAML frontmatter for metadata:\r\n *\r\n * ---\r\n * name: debug\r\n * description: Debug assistant mode\r\n * aliases: [dbg, troubleshoot]\r\n * allowedTools: [bash, file_read, glob]\r\n * ---\r\n *\r\n * Skill prompt content here...\r\n */\r\nexport async function loadSkillsFromDir(dir: string): Promise<SkillDefinition[]> {\r\n if (!existsSync(dir)) return []\r\n\r\n const skills: SkillDefinition[] = []\r\n const files = await readdir(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n const content = await readFile(filePath, 'utf-8')\r\n const skill = parseSkillMarkdown(content, filePath)\r\n\r\n if (skill) {\r\n skills.push(skill)\r\n }\r\n }\r\n\r\n return skills\r\n}\r\n\r\n/**\r\n * Parse a skill from markdown with YAML frontmatter.\r\n */\r\nexport function parseSkillMarkdown(content: string, sourcePath?: string): SkillDefinition | null {\r\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/)\r\n if (!frontmatterMatch) {\r\n const name = sourcePath\r\n ? sourcePath.split(/[\\\\/]/).pop()?.replace('.md', '') ?? 'unnamed'\r\n : 'unnamed'\r\n return {\r\n name,\r\n description: `Skill: ${name}`,\r\n prompt: content.trim(),\r\n builtin: false,\r\n sourcePath,\r\n }\r\n }\r\n\r\n const [, frontmatter, body] = frontmatterMatch\r\n const metadata = parseSimpleYaml(frontmatter)\r\n\r\n if (!metadata.name) {\r\n metadata.name = sourcePath\r\n ? sourcePath.split(/[\\\\/]/).pop()?.replace('.md', '') ?? 'unnamed'\r\n : 'unnamed'\r\n }\r\n\r\n return {\r\n name: metadata.name,\r\n description: metadata.description ?? `Skill: ${metadata.name}`,\r\n aliases: metadata.aliases\r\n ? String(metadata.aliases)\r\n .replace(/^\\[(.+)\\]$/, '$1')\r\n .split(',')\r\n .map((s: string) => s.trim())\r\n : undefined,\r\n prompt: body.trim(),\r\n allowedTools: metadata.allowedTools\r\n ? String(metadata.allowedTools)\r\n .replace(/^\\[(.+)\\]$/, '$1')\r\n .split(',')\r\n .map((s: string) => s.trim())\r\n : undefined,\r\n builtin: false,\r\n sourcePath,\r\n }\r\n}\r\n\r\n/**\r\n * Minimal YAML parser for simple key-value pairs.\r\n * Handles: name: value, name: [a, b, c]\r\n */\r\nfunction parseSimpleYaml(yaml: string): Record<string, string> {\r\n const result: Record<string, string> = {}\r\n\r\n for (const line of yaml.split('\\n')) {\r\n const trimmed = line.trim()\r\n if (!trimmed || trimmed.startsWith('#')) continue\r\n\r\n const colonIndex = trimmed.indexOf(':')\r\n if (colonIndex === -1) continue\r\n\r\n const key = trimmed.slice(0, colonIndex).trim()\r\n const value = trimmed.slice(colonIndex + 1).trim()\r\n\r\n result[key] = value\r\n }\r\n\r\n return result\r\n}\r\n","import type { SkillDefinition } from './types.js'\r\nimport { loadSkillsFromDir } from './skill-loader.js'\r\nimport { join } from 'node:path'\r\nimport { getGlobalSkillsDir } from '../config/paths.js'\r\n\r\n/**\r\n * Registry of available skills.\r\n * Manages skill registration, lookup, and loading from disk.\r\n */\r\nexport class SkillRegistry {\r\n private skills = new Map<string, SkillDefinition>()\r\n private aliasIndex = new Map<string, string>()\r\n\r\n /** Register a skill */\r\n register(skill: SkillDefinition): void {\r\n this.skills.set(skill.name, skill)\r\n if (skill.aliases) {\r\n for (const alias of skill.aliases) {\r\n this.aliasIndex.set(alias.toLowerCase(), skill.name)\r\n }\r\n }\r\n }\r\n\r\n /** Get a skill by name or alias */\r\n get(nameOrAlias: string): SkillDefinition | undefined {\r\n const aliasTarget = this.aliasIndex.get(nameOrAlias.toLowerCase())\r\n return this.skills.get(aliasTarget ?? nameOrAlias)\r\n }\r\n\r\n /** Get all registered skills */\r\n getAll(): SkillDefinition[] {\r\n return Array.from(this.skills.values())\r\n }\r\n\r\n /** Check if a skill exists */\r\n has(name: string): boolean {\r\n return this.skills.has(name) || this.aliasIndex.has(name.toLowerCase())\r\n }\r\n\r\n /** Unregister a skill */\r\n unregister(name: string): void {\r\n const skill = this.skills.get(name)\r\n if (skill?.aliases) {\r\n for (const alias of skill.aliases) {\r\n this.aliasIndex.delete(alias.toLowerCase())\r\n }\r\n }\r\n this.skills.delete(name)\r\n }\r\n\r\n /**\r\n * Load skills from a directory.\r\n * Returns the number of skills loaded.\r\n */\r\n async loadFromDir(dir: string): Promise<number> {\r\n const skills = await loadSkillsFromDir(dir)\r\n for (const skill of skills) {\r\n this.register(skill)\r\n }\r\n return skills.length\r\n }\r\n\r\n /**\r\n * Load skills from standard locations:\r\n * 1. ~/.cliskill/skills/ (global user skills)\r\n * 2. .cliskill/skills/ (project skills)\r\n */\r\n async loadStandardSkills(projectRoot: string): Promise<number> {\r\n let count = 0\r\n\r\n const globalDir = getGlobalSkillsDir()\r\n count += await this.loadFromDir(globalDir)\r\n\r\n const projectDir = join(projectRoot, '.cliskill', 'skills')\r\n count += await this.loadFromDir(projectDir)\r\n\r\n return count\r\n }\r\n\r\n /**\r\n * Get skill prompt for injection into system prompt.\r\n */\r\n getSkillPrompt(nameOrAlias: string): string | undefined {\r\n const skill = this.get(nameOrAlias)\r\n return skill?.prompt\r\n }\r\n}\r\n","import type { RiskLevel } from '../tools/contract.js'\r\n\r\n/** Permission mode for the session */\r\nexport type PermissionMode = 'ask' | 'auto-accept' | 'plan'\r\n\r\n/** A rule that allows or denies an operation */\r\nexport interface PermissionRule {\r\n /** Tool name pattern (e.g., \"bash\", \"file_*\") */\r\n tool: string\r\n /** Content pattern (e.g., \"git *\", \"rm *\") */\r\n contentPattern?: string\r\n /** Whether this rule allows or denies */\r\n allow: boolean\r\n}\r\n\r\n/** Result of a permission check */\r\nexport interface PermissionResult {\r\n allowed: boolean\r\n reason?: string\r\n}\r\n\r\n/** Auto-approve rule pattern */\r\nexport interface AutoApprovePattern {\r\n /** Tool name or glob pattern */\r\n tool: string\r\n /** Content regex pattern for auto-approval */\r\n inputPattern?: RegExp\r\n /** Max risk level to auto-approve */\r\n maxRiskLevel?: RiskLevel\r\n}\r\n\r\n/**\r\n * Permission manager that evaluates tool execution requests\r\n * against configured rules, auto-approve patterns, and the current permission mode.\r\n * P3.13: Enhanced with dynamic permission checking, auto-approve patterns, and caching.\r\n */\r\nexport class PermissionManager {\r\n private mode: PermissionMode\r\n private rules: PermissionRule[] = []\r\n private sessionDecisions = new Map<string, boolean>()\r\n private autoApprovePatterns: AutoApprovePattern[] = []\r\n private decisionCache = new Map<string, { result: PermissionResult; timestamp: number }>()\r\n private cacheTtl = 60_000\r\n\r\n constructor(mode: PermissionMode, rules?: PermissionRule[], autoApprovePatterns?: AutoApprovePattern[]) {\r\n this.mode = mode\r\n this.rules = rules ?? []\r\n this.autoApprovePatterns = autoApprovePatterns ?? []\r\n }\r\n\r\n /**\r\n * P3.13: Dynamic permission check — evaluates tool + input together.\r\n * Uses auto-approve patterns for regex-based matching.\r\n */\r\n canUseTool(toolName: string, input: Record<string, unknown>, riskLevel: RiskLevel): PermissionResult {\r\n const inputStr = JSON.stringify(input)\r\n\r\n // Check auto-approve patterns first\r\n for (const pattern of this.autoApprovePatterns) {\r\n if (this.matchTool(toolName, pattern.tool)) {\r\n if (pattern.maxRiskLevel && this.riskLevelOrdinal(riskLevel) > this.riskLevelOrdinal(pattern.maxRiskLevel)) {\r\n continue\r\n }\r\n if (!pattern.inputPattern || pattern.inputPattern.test(inputStr)) {\r\n return { allowed: true, reason: `Auto-approved by pattern: ${pattern.tool}` }\r\n }\r\n }\r\n }\r\n\r\n // Delegate to standard check\r\n return this.check(toolName, riskLevel, inputStr)\r\n }\r\n\r\n /**\r\n * Check if a tool operation is allowed.\r\n */\r\n check(\r\n toolName: string,\r\n riskLevel: RiskLevel,\r\n content?: string,\r\n ): PermissionResult {\r\n if (this.mode === 'auto-accept') {\r\n return { allowed: true, reason: 'auto-accept mode' }\r\n }\r\n\r\n if (this.mode === 'plan') {\r\n if (riskLevel === 'readonly') {\r\n return { allowed: true, reason: 'readonly in plan mode' }\r\n }\r\n return { allowed: false, reason: `${riskLevel} operations not allowed in plan mode` }\r\n }\r\n\r\n // Ask mode: check rules first\r\n for (const rule of this.rules) {\r\n if (this.matchTool(toolName, rule.tool)) {\r\n if (!rule.contentPattern || (content && this.matchContent(content, rule.contentPattern))) {\r\n return {\r\n allowed: rule.allow,\r\n reason: rule.allow ? `Allowed by rule: ${rule.tool}` : `Denied by rule: ${rule.tool}`,\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check session decisions (user already approved this exact operation)\r\n const sessionKey = `${toolName}:${content ?? ''}`\r\n const sessionDecision = this.sessionDecisions.get(sessionKey)\r\n if (sessionDecision !== undefined) {\r\n return { allowed: sessionDecision, reason: 'session decision' }\r\n }\r\n\r\n // Check cached decisions\r\n const cached = this.decisionCache.get(sessionKey)\r\n if (cached && Date.now() - cached.timestamp < this.cacheTtl) {\r\n return cached.result\r\n }\r\n\r\n return { allowed: false, reason: 'No rule matched — requires user approval' }\r\n }\r\n\r\n /**\r\n * Record a user decision for the session with caching.\r\n */\r\n recordDecision(toolName: string, content: string, allowed: boolean): void {\r\n const key = `${toolName}:${content}`\r\n this.sessionDecisions.set(key, allowed)\r\n this.decisionCache.set(key, {\r\n result: { allowed, reason: 'session decision' },\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n /**\r\n * Add a permission rule.\r\n */\r\n addRule(rule: PermissionRule): void {\r\n this.rules.push(rule)\r\n }\r\n\r\n /**\r\n * P3.13: Add an auto-approve pattern.\r\n */\r\n addAutoApprovePattern(pattern: AutoApprovePattern): void {\r\n this.autoApprovePatterns.push(pattern)\r\n }\r\n\r\n /**\r\n * Set the permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode\r\n }\r\n\r\n /**\r\n * Get the current permission mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode\r\n }\r\n\r\n private matchTool(toolName: string, pattern: string): boolean {\r\n if (pattern === '*') return true\r\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$')\r\n return regex.test(toolName)\r\n }\r\n\r\n private matchContent(content: string, pattern: string): boolean {\r\n if (pattern.endsWith('*')) {\r\n return content.startsWith(pattern.slice(0, -1).trim())\r\n }\r\n return content.includes(pattern)\r\n }\r\n\r\n private riskLevelOrdinal(level: RiskLevel): number {\r\n const order: RiskLevel[] = ['readonly', 'safe', 'destructive', 'critical']\r\n return order.indexOf(level)\r\n }\r\n}\r\n","/**\r\n * Simple command inspector for shell commands.\r\n * Analyzes commands for potential security risks without full AST parsing.\r\n */\r\n\r\n/** Risk classification of a shell command */\r\nexport type CommandRisk = 'safe' | 'moderate' | 'dangerous'\r\n\r\n/** Result of command analysis */\r\nexport interface CommandAnalysis {\r\n risk: CommandRisk\r\n reason: string\r\n /** The base command (first word) */\r\n baseCommand: string\r\n /** Whether the command modifies the filesystem */\r\n modifiesFiles: boolean\r\n /** Whether the command accesses the network */\r\n accessesNetwork: boolean\r\n}\r\n\r\n/** Commands that are generally safe (readonly) */\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'dir', 'cat', 'type', 'head', 'tail', 'less', 'more',\r\n 'pwd', 'echo', 'whoami', 'hostname', 'date', 'uname',\r\n 'git status', 'git log', 'git diff', 'git branch', 'git show', 'git remote',\r\n 'node --version', 'npm --version', 'npx --version',\r\n 'which', 'where', 'env', 'printenv',\r\n 'grep', 'find', 'wc', 'sort', 'uniq', 'diff',\r\n 'ps', 'top', 'df', 'du', 'free',\r\n 'curl --head', 'curl -I',\r\n])\r\n\r\n/** Patterns that are always dangerous */\r\nconst DANGEROUS_PATTERNS = [\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\//,\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\*/,\r\n /\\bdd\\s+if=/,\r\n /\\bmkfs\\./,\r\n /\\b(format\\s+[A-Z]:)/i,\r\n />\\s*\\/dev\\//,\r\n /\\bshutdown\\b/,\r\n /\\breboot\\b/,\r\n /\\binit\\s+[06]\\b/,\r\n /\\bsudo\\s+rm\\b/,\r\n /\\bchmod\\s+(-R\\s+)?000\\b/,\r\n /\\bchown\\s+(-R\\s+)?root\\b/,\r\n]\r\n\r\n/** Commands that modify the filesystem */\r\nconst FILE_MODIFYING_COMMANDS = new Set([\r\n 'touch', 'mkdir', 'cp', 'mv', 'rm', 'rmdir',\r\n 'chmod', 'chown', 'ln',\r\n 'npm install', 'npm uninstall', 'npm update',\r\n 'pip install', 'pip uninstall',\r\n 'git add', 'git commit', 'git push', 'git merge', 'git rebase', 'git reset', 'git checkout',\r\n 'docker', 'kubectl',\r\n])\r\n\r\n/** Commands that access the network */\r\nconst NETWORK_COMMANDS = new Set([\r\n 'curl', 'wget', 'ssh', 'scp', 'rsync', 'nc', 'netcat',\r\n 'ping', 'traceroute', 'dig', 'nslookup',\r\n 'npm publish', 'git push', 'git fetch', 'git pull',\r\n])\r\n\r\n/**\r\n * Analyze a shell command for security risks.\r\n */\r\nexport function inspectCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const baseCommand = trimmed.split(/\\s+/)[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n\r\n for (const pattern of DANGEROUS_PATTERNS) {\r\n if (pattern.test(fullCommand)) {\r\n return {\r\n risk: 'dangerous',\r\n reason: 'Potentially destructive command detected',\r\n baseCommand,\r\n modifiesFiles: true,\r\n accessesNetwork: false,\r\n }\r\n }\r\n }\r\n\r\n const pipeParts = trimmed.split(/\\|/).map(p => p.trim())\r\n let maxRisk: CommandRisk = 'safe'\r\n let modifiesFiles = false\r\n let accessesNetwork = false\r\n\r\n for (const part of pipeParts) {\r\n const analysis = analyzeSingleCommand(part)\r\n if (analysis.risk === 'dangerous') return analysis\r\n if (analysis.risk === 'moderate') maxRisk = 'moderate'\r\n if (analysis.modifiesFiles) modifiesFiles = true\r\n if (analysis.accessesNetwork) accessesNetwork = true\r\n }\r\n\r\n return {\r\n risk: maxRisk,\r\n reason: maxRisk === 'safe' ? 'Readonly or low-risk command' : 'Command may modify files or access network',\r\n baseCommand,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction analyzeSingleCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const parts = trimmed.split(/\\s+/)\r\n const base = parts[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n const firstTwoWords = parts.slice(0, 2).join(' ').toLowerCase()\r\n\r\n if (SAFE_COMMANDS.has(fullCommand) || SAFE_COMMANDS.has(firstTwoWords)) {\r\n return {\r\n risk: 'safe',\r\n reason: 'Known safe command',\r\n baseCommand: base,\r\n modifiesFiles: false,\r\n accessesNetwork: false,\r\n }\r\n }\r\n\r\n const modifiesFiles = matchesAny(fullCommand, firstTwoWords, FILE_MODIFYING_COMMANDS)\r\n const accessesNetwork = matchesAny(fullCommand, firstTwoWords, NETWORK_COMMANDS)\r\n\r\n let risk: CommandRisk = 'safe'\r\n if (modifiesFiles || accessesNetwork) risk = 'moderate'\r\n\r\n return {\r\n risk,\r\n reason: risk === 'safe' ? 'Low-risk command' : modifiesFiles ? 'Modifies filesystem' : 'Accesses network',\r\n baseCommand: base,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction matchesAny(fullCommand: string, firstTwoWords: string, set: Set<string>): boolean {\r\n return set.has(fullCommand) || set.has(firstTwoWords) || Array.from(set).some(cmd => fullCommand.startsWith(cmd))\r\n}\r\n","import { readFile, writeFile, mkdir, appendFile } from 'node:fs/promises'\r\nimport { existsSync } from 'node:fs'\r\nimport { dirname } from 'node:path'\r\nimport { getHistoryPath } from '../config/paths.js'\r\n\r\nexport interface HistoryEntry {\r\n content: string\r\n timestamp: number\r\n type: 'user' | 'paste'\r\n}\r\n\r\nexport interface HistoryConfig {\r\n maxEntries: number\r\n filePath: string\r\n}\r\n\r\nconst DEFAULT_CONFIG: HistoryConfig = {\r\n maxEntries: 1000,\r\n filePath: getHistoryPath(),\r\n}\r\n\r\nexport class HistoryManager {\r\n private entries: HistoryEntry[] = []\r\n private config: HistoryConfig\r\n private cursorIndex = -1\r\n\r\n constructor(config?: Partial<HistoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n }\r\n\r\n addEntry(content: string, type: 'user' | 'paste' = 'user'): void {\r\n const trimmed = content.trim()\r\n if (!trimmed) return\r\n\r\n const lastEntry = this.entries[this.entries.length - 1]\r\n if (lastEntry && lastEntry.content === trimmed) return\r\n\r\n this.entries.push({\r\n content: trimmed,\r\n timestamp: Date.now(),\r\n type,\r\n })\r\n\r\n if (this.entries.length > this.config.maxEntries) {\r\n this.entries = this.entries.slice(-this.config.maxEntries)\r\n }\r\n\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n getEntries(): HistoryEntry[] {\r\n return [...this.entries]\r\n }\r\n\r\n search(query: string): HistoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.entries.filter(e => e.content.toLowerCase().includes(lowerQuery))\r\n }\r\n\r\n getRecent(count: number): HistoryEntry[] {\r\n return this.entries.slice(-count)\r\n }\r\n\r\n clear(): void {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n }\r\n\r\n navigateUp(): string | null {\r\n if (this.entries.length === 0) return null\r\n if (this.cursorIndex > 0) {\r\n this.cursorIndex--\r\n } else if (this.cursorIndex === -1 || this.cursorIndex === this.entries.length) {\r\n this.cursorIndex = this.entries.length - 1\r\n }\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n\r\n navigateDown(): string | null {\r\n if (this.cursorIndex < this.entries.length - 1) {\r\n this.cursorIndex++\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n this.cursorIndex = this.entries.length\r\n return null\r\n }\r\n\r\n async save(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n const dir = dirname(filePath)\r\n\r\n if (!existsSync(dir)) {\r\n await mkdir(dir, { recursive: true })\r\n }\r\n\r\n const lines = this.entries.map(e => JSON.stringify(e)).join('\\n')\r\n await writeFile(filePath, lines, 'utf-8')\r\n }\r\n\r\n async load(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n\r\n if (!existsSync(filePath)) {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n return\r\n }\r\n\r\n const content = await readFile(filePath, 'utf-8')\r\n const lines = content.split('\\n').filter(Boolean)\r\n const loaded: HistoryEntry[] = []\r\n\r\n for (const line of lines) {\r\n try {\r\n const entry = JSON.parse(line) as HistoryEntry\r\n if (entry.content && typeof entry.content === 'string' && entry.timestamp) {\r\n loaded.push({\r\n content: entry.content,\r\n timestamp: entry.timestamp,\r\n type: entry.type ?? 'user',\r\n })\r\n }\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n\r\n this.entries = loaded.slice(-this.config.maxEntries)\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n private resolvePath(): string {\r\n if (this.config.filePath.startsWith('~')) {\r\n return getHistoryPath()\r\n }\r\n return this.config.filePath\r\n }\r\n}\r\n","import type { HookDefinition, HookEvent } from './types.js';\r\n\r\nexport class HookRegistry {\r\n private hooks = new Map<string, HookDefinition>();\r\n\r\n register(hook: HookDefinition): void {\r\n this.hooks.set(hook.id, hook);\r\n }\r\n\r\n unregister(id: string): void {\r\n this.hooks.delete(id);\r\n }\r\n\r\n getHooksForEvent(event: HookEvent): HookDefinition[] {\r\n return Array.from(this.hooks.values()).filter(\r\n (h) => h.event === event && h.enabled,\r\n );\r\n }\r\n\r\n getAll(): HookDefinition[] {\r\n return Array.from(this.hooks.values());\r\n }\r\n\r\n loadFromConfig(config: unknown): void {\r\n if (!config || typeof config !== 'object') return;\r\n\r\n const cfg = config as Record<string, unknown>;\r\n const hooksArr = cfg.hooks;\r\n if (!Array.isArray(hooksArr)) return;\r\n\r\n for (const raw of hooksArr) {\r\n if (!raw || typeof raw !== 'object') continue;\r\n const def = raw as Record<string, unknown>;\r\n\r\n const hook: HookDefinition = {\r\n id: String(def.id ?? `hook_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`),\r\n event: String(def.event ?? 'pre_tool_use') as HookEvent,\r\n type: def.type === 'function' ? 'function' : 'command',\r\n command: typeof def.command === 'string' ? def.command : undefined,\r\n handler: typeof def.handler === 'string' ? def.handler : undefined,\r\n condition:\r\n def.condition && typeof def.condition === 'object'\r\n ? (def.condition as { tool_name?: string; pattern?: string })\r\n : undefined,\r\n timeout: typeof def.timeout === 'number' ? def.timeout : 30_000,\r\n enabled: def.enabled !== false,\r\n };\r\n\r\n this.register(hook);\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.hooks.clear();\r\n }\r\n}\r\n","import { exec } from 'node:child_process';\r\nimport type { HookDefinition, HookContext, HookResult } from './types.js';\r\nimport type { HookRegistry } from './registry.js';\r\n\r\nexport class HookExecutor {\r\n private registry: HookRegistry;\r\n\r\n constructor(registry: HookRegistry) {\r\n this.registry = registry;\r\n }\r\n\r\n async executeHooks(event: HookContext['event'], context: HookContext): Promise<HookResult[]> {\r\n const hooks = this.registry.getHooksForEvent(event);\r\n const matched = hooks.filter((h) => this.matchesCondition(h, context));\r\n const results: HookResult[] = [];\r\n\r\n for (const hook of matched) {\r\n const result = await this.executeOne(hook, context);\r\n results.push(result);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private matchesCondition(hook: HookDefinition, context: HookContext): boolean {\r\n if (!hook.condition) return true;\r\n\r\n if (hook.condition.tool_name && context.toolName) {\r\n if (hook.condition.tool_name !== context.toolName) return false;\r\n }\r\n\r\n if (hook.condition.pattern) {\r\n try {\r\n const regex = new RegExp(hook.condition.pattern);\r\n const text = context.toolOutput ?? String(context.toolInput ?? '');\r\n if (!regex.test(text)) return false;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private executeOne(hook: HookDefinition, context: HookContext): Promise<HookResult> {\r\n const start = Date.now();\r\n\r\n if (hook.type === 'function') {\r\n return Promise.resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: `Function handler \"${hook.handler}\" executed (stub)`,\r\n duration: Date.now() - start,\r\n });\r\n }\r\n\r\n return this.executeCommand(hook, context, start);\r\n }\r\n\r\n private executeCommand(\r\n hook: HookDefinition,\r\n context: HookContext,\r\n start: number,\r\n ): Promise<HookResult> {\r\n const command = hook.command ?? '';\r\n const env: Record<string, string> = {\r\n ...process.env as Record<string, string>,\r\n CLISKILL_EVENT: context.event,\r\n CLISKILL_TOOL_NAME: context.toolName ?? '',\r\n CLISKILL_WORKING_DIR: context.workingDirectory,\r\n };\r\n\r\n if (context.error) {\r\n env.CLISKILL_ERROR_MESSAGE = context.error.message;\r\n }\r\n\r\n return new Promise<HookResult>((resolve) => {\r\n exec(\r\n command,\r\n {\r\n timeout: hook.timeout,\r\n cwd: context.workingDirectory,\r\n env,\r\n },\r\n (error, stdout, stderr) => {\r\n const duration = Date.now() - start;\r\n if (error) {\r\n resolve({\r\n hookId: hook.id,\r\n success: false,\r\n output: stdout?.trim() ?? '',\r\n error: stderr?.trim() || error.message,\r\n duration,\r\n });\r\n } else {\r\n resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: stdout?.trim() ?? '',\r\n duration,\r\n });\r\n }\r\n },\r\n );\r\n });\r\n }\r\n}\r\n","export interface ParsedCommand {\r\n command: string;\r\n args: string[];\r\n operators: string[];\r\n subCommands: ParsedCommand[];\r\n redirections: Redirection[];\r\n envVars: Record<string, string>;\r\n isBackground: boolean;\r\n isSubshell: boolean;\r\n}\r\n\r\nexport interface Redirection {\r\n type: '>' | '>>' | '<' | '2>' | '2>>' | '&>' | '|';\r\n target: string;\r\n}\r\n\r\nexport interface CommandAnalysis {\r\n commands: string[];\r\n isPipe: boolean;\r\n isChained: boolean;\r\n hasRedirection: boolean;\r\n hasSubshell: boolean;\r\n isBackground: boolean;\r\n envVarCount: number;\r\n estimatedRisk: 'safe' | 'moderate' | 'dangerous';\r\n}\r\n\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'cat', 'pwd', 'echo', 'head', 'tail', 'grep', 'find',\r\n 'wc', 'sort', 'uniq', 'date', 'whoami', 'hostname', 'uname',\r\n 'which', 'type', 'file', 'stat', 'df', 'du', 'ps', 'top',\r\n 'env', 'printenv', 'id', 'dirname', 'basename', 'realpath',\r\n]);\r\n\r\nconst MODERATE_COMMANDS = new Set([\r\n 'curl', 'wget', 'npm', 'pip', 'git', 'make', 'docker',\r\n 'node', 'python', 'python3', 'java', 'go', 'cargo',\r\n 'apt', 'yum', 'brew', 'npx', 'yarn', 'pnpm',\r\n]);\r\n\r\nconst DANGEROUS_COMMANDS = new Set([\r\n 'rm', 'mv', 'chmod', 'chown', 'sudo', 'su', 'dd', 'mkfs',\r\n 'format', 'fdisk', 'mkfs.ext4', 'mkfs.ntfs', 'shutdown',\r\n 'reboot', 'halt', 'poweroff', 'kill', 'killall',\r\n]);\r\n\r\nconst REDIRECTION_RE = /\\s(&?>{1,2}|2>>?|<{1,2})\\s*(\\S+)/g;\r\nconst ENV_VAR_RE = /^([A-Za-z_][A-Za-z0-9_]*)=(\\S*)\\s+/;\r\nconst SUBSHELL_RE = /\\$\\(([^)]+)\\)/;\r\nconst OPERATOR_SPLIT_RE = /\\s*(\\|\\||&&|;|\\|)\\s*/;\r\n\r\nexport function parseCommand(input: string): ParsedCommand {\r\n const trimmed = input.trim();\r\n let remaining = trimmed;\r\n\r\n const envVars: Record<string, string> = {};\r\n let envMatch: RegExpExecArray | null;\r\n while ((envMatch = ENV_VAR_RE.exec(remaining)) !== null) {\r\n envVars[envMatch[1]] = envMatch[2];\r\n remaining = remaining.slice(envMatch[0].length);\r\n }\r\n\r\n const isBackground = /(?:^|\\s)&\\s*$/.test(remaining);\r\n if (isBackground) {\r\n remaining = remaining.replace(/&\\s*$/, '').trim();\r\n }\r\n\r\n const redirections: Redirection[] = [];\r\n let redirMatch: RegExpExecArray | null;\r\n while ((redirMatch = REDIRECTION_RE.exec(remaining)) !== null) {\r\n const kind = redirMatch[1];\r\n const target = redirMatch[2];\r\n if (kind === '|') {\r\n redirections.push({ type: '|', target });\r\n } else if (kind === '>>') {\r\n redirections.push({ type: '>>', target });\r\n } else if (kind === '2>>') {\r\n redirections.push({ type: '2>>', target });\r\n } else if (kind === '2>') {\r\n redirections.push({ type: '2>', target });\r\n } else if (kind === '&>') {\r\n redirections.push({ type: '&>', target });\r\n } else if (kind === '<' || kind === '<<') {\r\n redirections.push({ type: '<', target });\r\n } else {\r\n redirections.push({ type: '>', target });\r\n }\r\n }\r\n remaining = remaining.replace(REDIRECTION_RE, ' ').trim();\r\n\r\n const isSubshell = SUBSHELL_RE.test(remaining);\r\n const subCommands: ParsedCommand[] = [];\r\n let subMatch: RegExpExecArray | null;\r\n const subshellGlobal = /\\$\\(([^)]+)\\)/g;\r\n while ((subMatch = subshellGlobal.exec(remaining)) !== null) {\r\n subCommands.push(parseCommand(subMatch[1]));\r\n }\r\n\r\n const parts = remaining.split(OPERATOR_SPLIT_RE).filter(Boolean);\r\n const operators: string[] = [];\r\n const commandParts: string[] = [];\r\n\r\n for (const part of parts) {\r\n if (['||', '&&', ';', '|'].includes(part)) {\r\n operators.push(part);\r\n } else {\r\n commandParts.push(part);\r\n }\r\n }\r\n\r\n let command = '';\r\n let args: string[] = [];\r\n\r\n if (commandParts.length > 0) {\r\n const first = commandParts[0];\r\n const tokens = tokenize(first);\r\n command = tokens[0] ?? '';\r\n args = tokens.slice(1);\r\n }\r\n\r\n const parsedSubCommands = commandParts.slice(1).map((cp) => {\r\n const tokens = tokenize(cp);\r\n return {\r\n command: tokens[0] ?? '',\r\n args: tokens.slice(1),\r\n operators: [],\r\n subCommands: [],\r\n redirections: [],\r\n envVars: {},\r\n isBackground: false,\r\n isSubshell: false,\r\n } satisfies ParsedCommand;\r\n });\r\n\r\n return {\r\n command,\r\n args,\r\n operators,\r\n subCommands: [...subCommands, ...parsedSubCommands],\r\n redirections,\r\n envVars,\r\n isBackground,\r\n isSubshell,\r\n };\r\n}\r\n\r\nexport function analyzeCommand(input: string): CommandAnalysis {\r\n const parsed = parseCommand(input);\r\n const allCommands = collectCommands(parsed);\r\n\r\n const isPipe = parsed.operators.includes('|');\r\n const isChained = parsed.operators.some((op) => op === '&&' || op === '||' || op === ';');\r\n const hasRedirection = parsed.redirections.length > 0;\r\n const hasSubshell = parsed.isSubshell || parsed.subCommands.length > 0;\r\n const envVarCount = Object.keys(parsed.envVars).length;\r\n\r\n const estimatedRisk = determineRisk(allCommands, isPipe, isChained, hasRedirection, hasSubshell);\r\n\r\n return {\r\n commands: allCommands,\r\n isPipe,\r\n isChained,\r\n hasRedirection,\r\n hasSubshell,\r\n isBackground: parsed.isBackground,\r\n envVarCount,\r\n estimatedRisk,\r\n };\r\n}\r\n\r\nfunction collectCommands(parsed: ParsedCommand): string[] {\r\n const commands: string[] = [];\r\n if (parsed.command) {\r\n commands.push(parsed.command);\r\n }\r\n for (const sub of parsed.subCommands) {\r\n commands.push(...collectCommands(sub));\r\n }\r\n return commands;\r\n}\r\n\r\nfunction determineRisk(\r\n commands: string[],\r\n isPipe: boolean,\r\n isChained: boolean,\r\n hasRedirection: boolean,\r\n hasSubshell: boolean,\r\n): 'safe' | 'moderate' | 'dangerous' {\r\n let hasDangerous = false;\r\n let hasModerate = false;\r\n\r\n for (const cmd of commands) {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n if (DANGEROUS_COMMANDS.has(base)) hasDangerous = true;\r\n else if (MODERATE_COMMANDS.has(base)) hasModerate = true;\r\n }\r\n\r\n if (hasDangerous) return 'dangerous';\r\n if (hasModerate) return 'moderate';\r\n\r\n const allSafe = commands.every((cmd) => {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n return SAFE_COMMANDS.has(base);\r\n });\r\n\r\n if (allSafe && commands.length > 0) return 'safe';\r\n\r\n if (isPipe || isChained || hasRedirection || hasSubshell) {\r\n return 'moderate';\r\n }\r\n\r\n return 'moderate';\r\n}\r\n\r\nfunction tokenize(segment: string): string[] {\r\n const tokens: string[] = [];\r\n let current = '';\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let i = 0; i < segment.length; i++) {\r\n const ch = segment[i];\r\n\r\n if (ch === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (ch === '\"' && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (ch === '\\\\' && !inSingle && i + 1 < segment.length) {\r\n current += segment[i + 1];\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/\\s/.test(ch) && !inSingle && !inDouble) {\r\n if (current) {\r\n tokens.push(current);\r\n current = '';\r\n }\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n\r\n if (current) tokens.push(current);\r\n return tokens;\r\n}\r\n","import type { TaskManager } from './manager.js'\r\nimport type { ProviderAdapter } from '../connect/adapter.js'\r\nimport type { ToolRegistry } from '../tools/registry.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\nimport { exec } from 'node:child_process'\r\n\r\nexport async function executeAgentTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n adapter: ProviderAdapter,\r\n tools: ToolRegistry,\r\n prompt: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n const engine = new QueryEngine(\r\n { maxTurns: 20, systemPrompt: 'You are a background agent. Complete the task concisely.' },\r\n adapter,\r\n tools,\r\n )\r\n\r\n let finalText = ''\r\n let turnsUsed = 0\r\n\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n return\r\n }\r\n\r\n switch (event.type) {\r\n case 'text_delta':\r\n finalText += event.text\r\n break\r\n case 'turn_end':\r\n turnsUsed = event.turn\r\n manager.updateProgress(taskId, Math.min(90, turnsUsed * 10))\r\n break\r\n case 'complete':\r\n finalText = finalText || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n') || 'Task completed'\r\n break\r\n case 'error':\r\n manager.setError(taskId, event.error.message)\r\n return\r\n }\r\n }\r\n\r\n manager.setResult(taskId, finalText || 'Task completed (no output)')\r\n } catch (err) {\r\n manager.setError(taskId, (err as Error).message)\r\n }\r\n}\r\n\r\nexport async function executeShellTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n command: string,\r\n cwd: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n return new Promise<void>((resolve) => {\r\n const child = exec(command, { cwd, signal }, (error, stdout, stderr) => {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n resolve()\r\n return\r\n }\r\n\r\n if (error) {\r\n manager.setError(taskId, stderr || error.message)\r\n resolve()\r\n return\r\n }\r\n\r\n manager.setResult(taskId, stdout || '(no output)')\r\n resolve()\r\n })\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', () => {\r\n child.kill('SIGTERM')\r\n }, { once: true })\r\n }\r\n })\r\n}\r\n","import type { ProviderAdapter } from '../connect/adapter.js'\r\nimport { ToolRegistry } from '../tools/registry.js'\r\nimport type { AgentConfig, SwarmMessage, SwarmResult, SubTask } from './types.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\n\r\nconst MAX_PARALLEL_WORKERS = 3\r\nconst SUBTASK_REGEX = /(?:^|\\n)\\s*(?:\\d+[\\.\\)])\\s*(.+?)(?=\\n\\s*(?:\\d+[\\.\\)])|$)/gs\r\n\r\nexport class SwarmCoordinator {\r\n private agents = new Map<string, AgentConfig>()\r\n private mailbox = new Map<string, SwarmMessage[]>()\r\n private abortController = new AbortController()\r\n\r\n constructor(\r\n private adapter: ProviderAdapter,\r\n private tools: ToolRegistry,\r\n ) {}\r\n\r\n addAgent(config: AgentConfig): void {\r\n this.agents.set(config.id, config)\r\n this.mailbox.set(config.id, [])\r\n }\r\n\r\n removeAgent(id: string): void {\r\n this.agents.delete(id)\r\n this.mailbox.delete(id)\r\n }\r\n\r\n getAgents(): AgentConfig[] {\r\n return Array.from(this.agents.values())\r\n }\r\n\r\n async sendMessage(message: SwarmMessage): Promise<void> {\r\n if (message.to === '*') {\r\n for (const [agentId] of this.agents) {\r\n this.mailbox.get(agentId)?.push({ ...message, to: agentId })\r\n }\r\n } else {\r\n this.mailbox.get(message.to)?.push(message)\r\n }\r\n }\r\n\r\n async executeSwarm(task: string): Promise<SwarmResult[]> {\r\n this.abortController = new AbortController()\r\n const startTime = performance.now()\r\n\r\n const coordinator = this.findAgentByRole('coordinator')\r\n const workers = this.findAgentsByRole('worker')\r\n const reviewers = this.findAgentsByRole('reviewer')\r\n\r\n // Phase 1: Coordinator decomposes the task\r\n const subtasks = coordinator\r\n ? await this.decomposeTask(coordinator, task)\r\n : this.fallbackDecompose(task, workers.length)\r\n\r\n // Phase 2: Assign and execute subtasks in parallel\r\n const assignments = this.assignSubtasks(subtasks, workers)\r\n const workerResults = await this.executeParallel(assignments)\r\n\r\n // Phase 3: Optional review\r\n if (reviewers.length > 0) {\r\n await this.reviewResults(reviewers[0], workerResults)\r\n }\r\n\r\n // Phase 4: Collect final results\r\n const results: SwarmResult[] = workerResults.map(wr => ({\r\n agentId: wr.agentId,\r\n agentName: wr.agentName,\r\n task: wr.task,\r\n result: wr.result,\r\n success: wr.success,\r\n duration: performance.now() - startTime,\r\n turns: wr.turns,\r\n }))\r\n\r\n return results\r\n }\r\n\r\n shutdown(): void {\r\n this.abortController.abort()\r\n for (const [agentId] of this.agents) {\r\n this.mailbox.get(agentId)?.push({\r\n from: 'system',\r\n to: agentId,\r\n type: 'shutdown',\r\n content: 'Shutdown requested',\r\n timestamp: Date.now(),\r\n })\r\n }\r\n }\r\n\r\n private findAgentByRole(role: AgentConfig['role']): AgentConfig | undefined {\r\n for (const agent of this.agents.values()) {\r\n if (agent.role === role) return agent\r\n }\r\n return undefined\r\n }\r\n\r\n private findAgentsByRole(role: AgentConfig['role']): AgentConfig[] {\r\n return Array.from(this.agents.values()).filter(a => a.role === role)\r\n }\r\n\r\n private async decomposeTask(coordinator: AgentConfig, task: string): Promise<SubTask[]> {\r\n const engine = this.createEngine(coordinator)\r\n const prompt = `Decompose the following task into subtasks. Return ONLY a numbered list, one subtask per line. No explanations.\r\n\r\nTask: ${task}\r\n\r\nSubtasks:`\r\n\r\n let decomposition = ''\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (event.type === 'text_delta') decomposition += event.text\r\n if (event.type === 'error') break\r\n }\r\n } catch {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n const matches = [...decomposition.matchAll(SUBTASK_REGEX)]\r\n if (matches.length === 0) {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n return matches.map((m, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: m[1].trim(),\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private fallbackDecompose(task: string, workerCount: number): SubTask[] {\r\n const count = Math.max(1, Math.min(workerCount, MAX_PARALLEL_WORKERS))\r\n return Array.from({ length: count }, (_, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: count === 1 ? task : `Part ${i + 1} of: ${task}`,\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private assignSubtasks(subtasks: SubTask[], workers: AgentConfig[]): Array<{ task: SubTask; worker: AgentConfig }> {\r\n const assignments: Array<{ task: SubTask; worker: AgentConfig }> = []\r\n if (workers.length === 0) return assignments\r\n\r\n subtasks.forEach((task, i) => {\r\n const worker = workers[i % workers.length]\r\n task.assignedTo = worker.id\r\n assignments.push({ task, worker })\r\n })\r\n\r\n return assignments\r\n }\r\n\r\n private async executeParallel(\r\n assignments: Array<{ task: SubTask; worker: AgentConfig }>,\r\n ): Promise<Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }>> {\r\n const chunks: Array<Array<{ task: SubTask; worker: AgentConfig }>> = []\r\n for (let i = 0; i < assignments.length; i += MAX_PARALLEL_WORKERS) {\r\n chunks.push(assignments.slice(i, i + MAX_PARALLEL_WORKERS))\r\n }\r\n\r\n const allResults: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }> = []\r\n\r\n for (const chunk of chunks) {\r\n if (this.abortController.signal.aborted) break\r\n\r\n const settled = await Promise.allSettled(\r\n chunk.map(async ({ task, worker }) => {\r\n task.status = 'running'\r\n const engine = this.createEngine(worker)\r\n\r\n let output = ''\r\n let turns = 0\r\n\r\n try {\r\n for await (const event of engine.run(task.description)) {\r\n if (this.abortController.signal.aborted) break\r\n if (event.type === 'text_delta') output += event.text\r\n if (event.type === 'turn_end') turns = event.turn\r\n if (event.type === 'complete') {\r\n turns = event.result.turns\r\n output = output || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n')\r\n }\r\n }\r\n\r\n task.status = 'completed'\r\n task.result = output\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: output, success: true, turns }\r\n } catch (err) {\r\n task.status = 'failed'\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: (err as Error).message, success: false, turns }\r\n }\r\n }),\r\n )\r\n\r\n for (const r of settled) {\r\n if (r.status === 'fulfilled') allResults.push(r.value)\r\n else allResults.push({ agentId: 'unknown', agentName: 'unknown', task: '', result: r.reason?.message ?? 'Unknown error', success: false, turns: 0 })\r\n }\r\n }\r\n\r\n return allResults\r\n }\r\n\r\n private async reviewResults(reviewer: AgentConfig, results: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean }>): Promise<void> {\r\n const engine = this.createEngine(reviewer)\r\n const summary = results.map((r, i) => `Worker ${i + 1} (${r.agentName}): ${r.success ? 'SUCCESS' : 'FAILED'}\\nTask: ${r.task}\\nResult: ${r.result.slice(0, 500)}`).join('\\n\\n')\r\n\r\n const prompt = `Review the following worker results and provide a brief assessment:\r\n\r\n${summary}\r\n\r\nProvide a concise review:`\r\n\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (event.type === 'error') break\r\n }\r\n } catch {\r\n // Review failure is non-critical\r\n }\r\n }\r\n\r\n private createEngine(agent: AgentConfig): QueryEngine {\r\n const filteredTools = new ToolRegistry()\r\n if (agent.tools) {\r\n for (const toolName of agent.tools) {\r\n const tool = this.tools.get(toolName)\r\n if (tool) filteredTools.register(tool)\r\n }\r\n } else {\r\n for (const tool of this.tools.getAll()) {\r\n if (tool.name !== 'agent') filteredTools.register(tool)\r\n }\r\n }\r\n\r\n return new QueryEngine(\r\n {\r\n maxTurns: agent.maxTurns ?? 10,\r\n systemPrompt: agent.systemPrompt ?? `You are agent \"${agent.name}\" with role \"${agent.role}\". Complete assigned tasks concisely.`,\r\n },\r\n this.adapter,\r\n filteredTools,\r\n )\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU,WAAW,OAAO,SAAS,MAAM,cAAc;AAClE,SAAS,MAAM,eAAe;AAC9B,SAAS,kBAAkB;AAI3B,IAAM,iBAA+B;AAAA,EACnC,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,eAAe;AACjB;AAYO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EACA,QAAQ,oBAAI,IAAyB;AAAA,EACrC,SAAS;AAAA,EAEjB,YAAY,aAAqB,QAAgC;AAC/D,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAC7C,SAAK,UAAU,QAAQ,aAAa,KAAK,OAAO,SAAS;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAsB;AAC1B,UAAM,MAAM,KAAK,KAAK,SAAS,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAM,iBAAiB,KAAK,KAAK,SAAS,WAAW;AACrD,QAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAsB;AAC1B,SAAK,MAAM,MAAM;AAEjB,UAAM,YAAY,KAAK,KAAK,SAAS,QAAQ;AAC7C,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,KAAK,GAAG;AACxB,gBAAM,QAAQ,KAAK,QAAQ,OAAO,EAAE;AACpC,gBAAM,WAAW,KAAK,WAAW,IAAI;AACrC,gBAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,gBAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,eAAK,MAAM,IAAI,OAAO;AAAA,YACpB,IAAI;AAAA,YACJ;AAAA,YACA;AAAA,YACA,WAAW,SAAS;AAAA,YACpB,gBAAgB,SAAS;AAAA,UAC3B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAwC;AAC1C,WAAO,KAAK,MAAM,IAAI,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,OAAe,SAAgC;AACvD,UAAM,WAAW,KAAK,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK;AAC3D,UAAM,MAAM,KAAK,KAAK,SAAS,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,UAAM,UAAU,UAAU,SAAS,OAAO;AAE1C,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,KAAK,MAAM,IAAI,KAAK;AACrC,SAAK,MAAM,IAAI,OAAO;AAAA,MACpB,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,WAAW,UAAU,aAAa;AAAA,MAClC,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiC;AAC5C,UAAM,WAAW,KAAK,KAAK,SAAS,UAAU,GAAG,KAAK,KAAK;AAC3D,QAAI,WAAW,QAAQ,GAAG;AACxB,YAAM,OAAO,QAAQ;AACrB,WAAK,MAAM,OAAO,KAAK;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAA8B;AACnC,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,KAAK,OAAO,EAChB;AAAA,MACC,CAAC,UACC,MAAM,QAAQ,YAAY,EAAE,SAAS,UAAU,KAC/C,MAAM,MAAM,YAAY,EAAE,SAAS,UAAU;AAAA,IACjD,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAiC;AACrC,UAAM,iBAAiB,KAAK,KAAK,SAAS,WAAW;AACrD,QAAI,WAAW,cAAc,GAAG;AAC9B,aAAO,SAAS,gBAAgB,OAAO;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAgC;AAClD,QAAI,QAAQ,SAAS,KAAK,OAAO,mBAAmB;AAClD,gBAAU,QAAQ,MAAM,GAAG,KAAK,OAAO,iBAAiB,IAAI;AAAA,IAC9D;AACA,UAAM,iBAAiB,KAAK,KAAK,SAAS,WAAW;AACrD,UAAM,UAAU,gBAAgB,SAAS,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAgB,YAAoB,KAAuB;AAC5E,QAAI;AAEJ,QAAI,OAAO;AACT,iBAAW,KAAK,OAAO,KAAK;AAAA,IAC9B,OAAO;AACL,iBAAW,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAAA,IAC7E;AAEA,UAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,QAAI,UAAU;AAEd,QAAI,YAAY;AACd,iBAAW;AAAA,EAAsB,UAAU;AAAA;AAAA;AAAA,IAC7C;AAEA,eAAW,UAAU,UAAU;AAC7B,YAAM,WAAW,OAAO,OAAO,KAAK;AAAA,EAAK,OAAO,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAErE,WAAK,QAAQ,SAAS,SAAS,UAAU,IAAI,UAAW;AACxD,iBAAW;AAAA,IACb;AAEA,WAAO,QAAQ,KAAK;AAAA,EACtB;AACF;;;AC9LA,SAAS,YAAAA,WAAU,WAAAC,gBAAe;AAClC,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAAC,mBAAkB;AAgB3B,eAAsB,kBAAkB,KAAyC;AAC/E,MAAI,CAACA,YAAW,GAAG,EAAG,QAAO,CAAC;AAE9B,QAAM,SAA4B,CAAC;AACnC,QAAM,QAAQ,MAAMF,SAAQ,GAAG;AAE/B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,UAAM,WAAWC,MAAK,KAAK,IAAI;AAC/B,UAAM,UAAU,MAAMF,UAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,mBAAmB,SAAS,QAAQ;AAElD,QAAI,OAAO;AACT,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,SAAiB,YAA6C;AAC/F,QAAM,mBAAmB,QAAQ,MAAM,yCAAyC;AAChF,MAAI,CAAC,kBAAkB;AACrB,UAAM,OAAO,aACT,WAAW,MAAM,OAAO,EAAE,IAAI,GAAG,QAAQ,OAAO,EAAE,KAAK,YACvD;AACJ,WAAO;AAAA,MACL;AAAA,MACA,aAAa,UAAU,IAAI;AAAA,MAC3B,QAAQ,QAAQ,KAAK;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,CAAC,EAAE,aAAa,IAAI,IAAI;AAC9B,QAAM,WAAW,gBAAgB,WAAW;AAE5C,MAAI,CAAC,SAAS,MAAM;AAClB,aAAS,OAAO,aACZ,WAAW,MAAM,OAAO,EAAE,IAAI,GAAG,QAAQ,OAAO,EAAE,KAAK,YACvD;AAAA,EACN;AAEA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,aAAa,SAAS,eAAe,UAAU,SAAS,IAAI;AAAA,IAC5D,SAAS,SAAS,UACd,OAAO,SAAS,OAAO,EACpB,QAAQ,cAAc,IAAI,EAC1B,MAAM,GAAG,EACT,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IAC9B;AAAA,IACJ,QAAQ,KAAK,KAAK;AAAA,IAClB,cAAc,SAAS,eACnB,OAAO,SAAS,YAAY,EACzB,QAAQ,cAAc,IAAI,EAC1B,MAAM,GAAG,EACT,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,IAC9B;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAMA,SAAS,gBAAgB,MAAsC;AAC7D,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAEzC,UAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,QAAI,eAAe,GAAI;AAEvB,UAAM,MAAM,QAAQ,MAAM,GAAG,UAAU,EAAE,KAAK;AAC9C,UAAM,QAAQ,QAAQ,MAAM,aAAa,CAAC,EAAE,KAAK;AAEjD,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;;;AC1GA,SAAS,QAAAI,aAAY;AAOd,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAS,oBAAI,IAA6B;AAAA,EAC1C,aAAa,oBAAI,IAAoB;AAAA;AAAA,EAG7C,SAAS,OAA8B;AACrC,SAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AACjC,QAAI,MAAM,SAAS;AACjB,iBAAW,SAAS,MAAM,SAAS;AACjC,aAAK,WAAW,IAAI,MAAM,YAAY,GAAG,MAAM,IAAI;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,aAAkD;AACpD,UAAM,cAAc,KAAK,WAAW,IAAI,YAAY,YAAY,CAAC;AACjE,WAAO,KAAK,OAAO,IAAI,eAAe,WAAW;AAAA,EACnD;AAAA;AAAA,EAGA,SAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,MAAuB;AACzB,WAAO,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,YAAY,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,WAAW,MAAoB;AAC7B,UAAM,QAAQ,KAAK,OAAO,IAAI,IAAI;AAClC,QAAI,OAAO,SAAS;AAClB,iBAAW,SAAS,MAAM,SAAS;AACjC,aAAK,WAAW,OAAO,MAAM,YAAY,CAAC;AAAA,MAC5C;AAAA,IACF;AACA,SAAK,OAAO,OAAO,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,KAA8B;AAC9C,UAAM,SAAS,MAAM,kBAAkB,GAAG;AAC1C,eAAW,SAAS,QAAQ;AAC1B,WAAK,SAAS,KAAK;AAAA,IACrB;AACA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAmB,aAAsC;AAC7D,QAAI,QAAQ;AAEZ,UAAM,YAAY,mBAAmB;AACrC,aAAS,MAAM,KAAK,YAAY,SAAS;AAEzC,UAAM,aAAaC,MAAK,aAAa,aAAa,QAAQ;AAC1D,aAAS,MAAM,KAAK,YAAY,UAAU;AAE1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,aAAyC;AACtD,UAAM,QAAQ,KAAK,IAAI,WAAW;AAClC,WAAO,OAAO;AAAA,EAChB;AACF;;;AClDO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,QAA0B,CAAC;AAAA,EAC3B,mBAAmB,oBAAI,IAAqB;AAAA,EAC5C,sBAA4C,CAAC;AAAA,EAC7C,gBAAgB,oBAAI,IAA6D;AAAA,EACjF,WAAW;AAAA,EAEnB,YAAY,MAAsB,OAA0B,qBAA4C;AACtG,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS,CAAC;AACvB,SAAK,sBAAsB,uBAAuB,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,UAAkB,OAAgC,WAAwC;AACnG,UAAM,WAAW,KAAK,UAAU,KAAK;AAGrC,eAAW,WAAW,KAAK,qBAAqB;AAC9C,UAAI,KAAK,UAAU,UAAU,QAAQ,IAAI,GAAG;AAC1C,YAAI,QAAQ,gBAAgB,KAAK,iBAAiB,SAAS,IAAI,KAAK,iBAAiB,QAAQ,YAAY,GAAG;AAC1G;AAAA,QACF;AACA,YAAI,CAAC,QAAQ,gBAAgB,QAAQ,aAAa,KAAK,QAAQ,GAAG;AAChE,iBAAO,EAAE,SAAS,MAAM,QAAQ,6BAA6B,QAAQ,IAAI,GAAG;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAGA,WAAO,KAAK,MAAM,UAAU,WAAW,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MACE,UACA,WACA,SACkB;AAClB,QAAI,KAAK,SAAS,eAAe;AAC/B,aAAO,EAAE,SAAS,MAAM,QAAQ,mBAAmB;AAAA,IACrD;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,UAAI,cAAc,YAAY;AAC5B,eAAO,EAAE,SAAS,MAAM,QAAQ,wBAAwB;AAAA,MAC1D;AACA,aAAO,EAAE,SAAS,OAAO,QAAQ,GAAG,SAAS,uCAAuC;AAAA,IACtF;AAGA,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,UAAU,UAAU,KAAK,IAAI,GAAG;AACvC,YAAI,CAAC,KAAK,kBAAmB,WAAW,KAAK,aAAa,SAAS,KAAK,cAAc,GAAI;AACxF,iBAAO;AAAA,YACL,SAAS,KAAK;AAAA,YACd,QAAQ,KAAK,QAAQ,oBAAoB,KAAK,IAAI,KAAK,mBAAmB,KAAK,IAAI;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,GAAG,QAAQ,IAAI,WAAW,EAAE;AAC/C,UAAM,kBAAkB,KAAK,iBAAiB,IAAI,UAAU;AAC5D,QAAI,oBAAoB,QAAW;AACjC,aAAO,EAAE,SAAS,iBAAiB,QAAQ,mBAAmB;AAAA,IAChE;AAGA,UAAM,SAAS,KAAK,cAAc,IAAI,UAAU;AAChD,QAAI,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY,KAAK,UAAU;AAC3D,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO,EAAE,SAAS,OAAO,QAAQ,gDAA2C;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAkB,SAAiB,SAAwB;AACxE,UAAM,MAAM,GAAG,QAAQ,IAAI,OAAO;AAClC,SAAK,iBAAiB,IAAI,KAAK,OAAO;AACtC,SAAK,cAAc,IAAI,KAAK;AAAA,MAC1B,QAAQ,EAAE,SAAS,QAAQ,mBAAmB;AAAA,MAC9C,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA4B;AAClC,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAAmC;AACvD,SAAK,oBAAoB,KAAK,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA4B;AAClC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,UAAU,UAAkB,SAA0B;AAC5D,QAAI,YAAY,IAAK,QAAO;AAC5B,UAAM,QAAQ,IAAI,OAAO,MAAM,QAAQ,QAAQ,OAAO,IAAI,IAAI,GAAG;AACjE,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC5B;AAAA,EAEQ,aAAa,SAAiB,SAA0B;AAC9D,QAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,aAAO,QAAQ,WAAW,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC;AAAA,IACvD;AACA,WAAO,QAAQ,SAAS,OAAO;AAAA,EACjC;AAAA,EAEQ,iBAAiB,OAA0B;AACjD,UAAM,QAAqB,CAAC,YAAY,QAAQ,eAAe,UAAU;AACzE,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AACF;;;AC5JA,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACpD;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAY;AAAA,EAAQ;AAAA,EAC7C;AAAA,EAAc;AAAA,EAAW;AAAA,EAAY;AAAA,EAAc;AAAA,EAAY;AAAA,EAC/D;AAAA,EAAkB;AAAA,EAAiB;AAAA,EACnC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAO;AAAA,EACzB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACtC;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EACzB;AAAA,EAAe;AACjB,CAAC;AAGD,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACpC;AAAA,EAAS;AAAA,EAAS;AAAA,EAClB;AAAA,EAAe;AAAA,EAAiB;AAAA,EAChC;AAAA,EAAe;AAAA,EACf;AAAA,EAAW;AAAA,EAAc;AAAA,EAAY;AAAA,EAAa;AAAA,EAAc;AAAA,EAAa;AAAA,EAC7E;AAAA,EAAU;AACZ,CAAC;AAGD,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAO;AAAA,EAAS;AAAA,EAAM;AAAA,EAC7C;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAO;AAAA,EAC7B;AAAA,EAAe;AAAA,EAAY;AAAA,EAAa;AAC1C,CAAC;AAKM,SAAS,eAAe,SAAkC;AAC/D,QAAM,UAAU,QAAQ,KAAK;AAC7B,QAAM,cAAc,QAAQ,MAAM,KAAK,EAAE,CAAC,KAAK;AAC/C,QAAM,cAAc,QAAQ,YAAY;AAExC,aAAW,WAAW,oBAAoB;AACxC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AACvD,MAAI,UAAuB;AAC3B,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AAEtB,aAAW,QAAQ,WAAW;AAC5B,UAAM,WAAW,qBAAqB,IAAI;AAC1C,QAAI,SAAS,SAAS,YAAa,QAAO;AAC1C,QAAI,SAAS,SAAS,WAAY,WAAU;AAC5C,QAAI,SAAS,cAAe,iBAAgB;AAC5C,QAAI,SAAS,gBAAiB,mBAAkB;AAAA,EAClD;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,YAAY,SAAS,iCAAiC;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,SAAkC;AAC9D,QAAM,UAAU,QAAQ,KAAK;AAC7B,QAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,cAAc,QAAQ,YAAY;AACxC,QAAM,gBAAgB,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,YAAY;AAE9D,MAAI,cAAc,IAAI,WAAW,KAAK,cAAc,IAAI,aAAa,GAAG;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,eAAe;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,gBAAgB,WAAW,aAAa,eAAe,uBAAuB;AACpF,QAAM,kBAAkB,WAAW,aAAa,eAAe,gBAAgB;AAE/E,MAAI,OAAoB;AACxB,MAAI,iBAAiB,gBAAiB,QAAO;AAE7C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,SAAS,SAAS,qBAAqB,gBAAgB,wBAAwB;AAAA,IACvF,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,WAAW,aAAqB,eAAuB,KAA2B;AACzF,SAAO,IAAI,IAAI,WAAW,KAAK,IAAI,IAAI,aAAa,KAAK,MAAM,KAAK,GAAG,EAAE,KAAK,SAAO,YAAY,WAAW,GAAG,CAAC;AAClH;;;AC7IA,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAyB;AACvD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,eAAe;AAcxB,IAAMC,kBAAgC;AAAA,EACpC,YAAY;AAAA,EACZ,UAAU,eAAe;AAC3B;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,UAA0B,CAAC;AAAA,EAC3B;AAAA,EACA,cAAc;AAAA,EAEtB,YAAY,QAAiC;AAC3C,SAAK,SAAS,EAAE,GAAGA,iBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA,EAEA,SAAS,SAAiB,OAAyB,QAAc;AAC/D,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,QAAS;AAEd,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC;AACtD,QAAI,aAAa,UAAU,YAAY,QAAS;AAEhD,SAAK,QAAQ,KAAK;AAAA,MAChB,SAAS;AAAA,MACT,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF,CAAC;AAED,QAAI,KAAK,QAAQ,SAAS,KAAK,OAAO,YAAY;AAChD,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,KAAK,OAAO,UAAU;AAAA,IAC3D;AAEA,SAAK,cAAc,KAAK,QAAQ;AAAA,EAClC;AAAA,EAEA,aAA6B;AAC3B,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO,OAA+B;AACpC,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,KAAK,QAAQ,OAAO,OAAK,EAAE,QAAQ,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,EAC9E;AAAA,EAEA,UAAU,OAA+B;AACvC,WAAO,KAAK,QAAQ,MAAM,CAAC,KAAK;AAAA,EAClC;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,CAAC;AAChB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,aAA4B;AAC1B,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAI,KAAK,cAAc,GAAG;AACxB,WAAK;AAAA,IACP,WAAW,KAAK,gBAAgB,MAAM,KAAK,gBAAgB,KAAK,QAAQ,QAAQ;AAC9E,WAAK,cAAc,KAAK,QAAQ,SAAS;AAAA,IAC3C;AACA,WAAO,KAAK,QAAQ,KAAK,WAAW,GAAG,WAAW;AAAA,EACpD;AAAA,EAEA,eAA8B;AAC5B,QAAI,KAAK,cAAc,KAAK,QAAQ,SAAS,GAAG;AAC9C,WAAK;AACL,aAAO,KAAK,QAAQ,KAAK,WAAW,GAAG,WAAW;AAAA,IACpD;AACA,SAAK,cAAc,KAAK,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,WAAW,KAAK,YAAY;AAClC,UAAM,MAAM,QAAQ,QAAQ;AAE5B,QAAI,CAACC,YAAW,GAAG,GAAG;AACpB,YAAMC,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACtC;AAEA,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAChE,UAAMC,WAAU,UAAU,OAAO,OAAO;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,WAAW,KAAK,YAAY;AAElC,QAAI,CAACF,YAAW,QAAQ,GAAG;AACzB,WAAK,UAAU,CAAC;AAChB,WAAK,cAAc;AACnB;AAAA,IACF;AAEA,UAAM,UAAU,MAAMG,UAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AAChD,UAAM,SAAyB,CAAC;AAEhC,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,MAAM,WAAW,OAAO,MAAM,YAAY,YAAY,MAAM,WAAW;AACzE,iBAAO,KAAK;AAAA,YACV,SAAS,MAAM;AAAA,YACf,WAAW,MAAM;AAAA,YACjB,MAAM,MAAM,QAAQ;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,UAAU;AACnD,SAAK,cAAc,KAAK,QAAQ;AAAA,EAClC;AAAA,EAEQ,cAAsB;AAC5B,QAAI,KAAK,OAAO,SAAS,WAAW,GAAG,GAAG;AACxC,aAAO,eAAe;AAAA,IACxB;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;;;ACvIO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAQ,oBAAI,IAA4B;AAAA,EAEhD,SAAS,MAA4B;AACnC,SAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,WAAW,IAAkB;AAC3B,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA,EAEA,iBAAiB,OAAoC;AACnD,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE;AAAA,MACrC,CAAC,MAAM,EAAE,UAAU,SAAS,EAAE;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,SAA2B;AACzB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,eAAe,QAAuB;AACpC,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU;AAE3C,UAAM,MAAM;AACZ,UAAM,WAAW,IAAI;AACrB,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG;AAE9B,eAAW,OAAO,UAAU;AAC1B,UAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,YAAM,MAAM;AAEZ,YAAM,OAAuB;AAAA,QAC3B,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE;AAAA,QACnF,OAAO,OAAO,IAAI,SAAS,cAAc;AAAA,QACzC,MAAM,IAAI,SAAS,aAAa,aAAa;AAAA,QAC7C,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,QACzD,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,QACzD,WACE,IAAI,aAAa,OAAO,IAAI,cAAc,WACrC,IAAI,YACL;AAAA,QACN,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,QACzD,SAAS,IAAI,YAAY;AAAA,MAC3B;AAEA,WAAK,SAAS,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;;;ACvDA,SAAS,YAAY;AAId,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EAER,YAAY,UAAwB;AAClC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,aAAa,OAA6B,SAA6C;AAC3F,UAAM,QAAQ,KAAK,SAAS,iBAAiB,KAAK;AAClD,UAAM,UAAU,MAAM,OAAO,CAAC,MAAM,KAAK,iBAAiB,GAAG,OAAO,CAAC;AACrE,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,SAAS;AAC1B,YAAM,SAAS,MAAM,KAAK,WAAW,MAAM,OAAO;AAClD,cAAQ,KAAK,MAAM;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAsB,SAA+B;AAC5E,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,QAAI,KAAK,UAAU,aAAa,QAAQ,UAAU;AAChD,UAAI,KAAK,UAAU,cAAc,QAAQ,SAAU,QAAO;AAAA,IAC5D;AAEA,QAAI,KAAK,UAAU,SAAS;AAC1B,UAAI;AACF,cAAM,QAAQ,IAAI,OAAO,KAAK,UAAU,OAAO;AAC/C,cAAM,OAAO,QAAQ,cAAc,OAAO,QAAQ,aAAa,EAAE;AACjE,YAAI,CAAC,MAAM,KAAK,IAAI,EAAG,QAAO;AAAA,MAChC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,MAAsB,SAA2C;AAClF,UAAM,QAAQ,KAAK,IAAI;AAEvB,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,QAAQ,qBAAqB,KAAK,OAAO;AAAA,QACzC,UAAU,KAAK,IAAI,IAAI;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,eAAe,MAAM,SAAS,KAAK;AAAA,EACjD;AAAA,EAEQ,eACN,MACA,SACA,OACqB;AACrB,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,MAA8B;AAAA,MAClC,GAAG,QAAQ;AAAA,MACX,gBAAgB,QAAQ;AAAA,MACxB,oBAAoB,QAAQ,YAAY;AAAA,MACxC,sBAAsB,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,OAAO;AACjB,UAAI,yBAAyB,QAAQ,MAAM;AAAA,IAC7C;AAEA,WAAO,IAAI,QAAoB,CAACC,aAAY;AAC1C;AAAA,QACE;AAAA,QACA;AAAA,UACE,SAAS,KAAK;AAAA,UACd,KAAK,QAAQ;AAAA,UACb;AAAA,QACF;AAAA,QACA,CAAC,OAAO,QAAQ,WAAW;AACzB,gBAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,cAAI,OAAO;AACT,YAAAA,SAAQ;AAAA,cACN,QAAQ,KAAK;AAAA,cACb,SAAS;AAAA,cACT,QAAQ,QAAQ,KAAK,KAAK;AAAA,cAC1B,OAAO,QAAQ,KAAK,KAAK,MAAM;AAAA,cAC/B;AAAA,YACF,CAAC;AAAA,UACH,OAAO;AACL,YAAAA,SAAQ;AAAA,cACN,QAAQ,KAAK;AAAA,cACb,SAAS;AAAA,cACT,QAAQ,QAAQ,KAAK,KAAK;AAAA,cAC1B;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/EA,IAAMC,iBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACpD;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAY;AAAA,EACpD;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACnD;AAAA,EAAO;AAAA,EAAY;AAAA,EAAM;AAAA,EAAW;AAAA,EAAY;AAClD,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAC7C;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAW;AAAA,EAAQ;AAAA,EAAM;AAAA,EAC3C;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAQ;AACvC,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EAAM;AAAA,EAAM;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAM;AAAA,EAClD;AAAA,EAAU;AAAA,EAAS;AAAA,EAAa;AAAA,EAAa;AAAA,EAC7C;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAQ;AACxC,CAAC;AAED,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAEnB,SAAS,aAAa,OAA8B;AACzD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,YAAY;AAEhB,QAAM,UAAkC,CAAC;AACzC,MAAI;AACJ,UAAQ,WAAW,WAAW,KAAK,SAAS,OAAO,MAAM;AACvD,YAAQ,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC;AACjC,gBAAY,UAAU,MAAM,SAAS,CAAC,EAAE,MAAM;AAAA,EAChD;AAEA,QAAM,eAAe,gBAAgB,KAAK,SAAS;AACnD,MAAI,cAAc;AAChB,gBAAY,UAAU,QAAQ,SAAS,EAAE,EAAE,KAAK;AAAA,EAClD;AAEA,QAAM,eAA8B,CAAC;AACrC,MAAI;AACJ,UAAQ,aAAa,eAAe,KAAK,SAAS,OAAO,MAAM;AAC7D,UAAM,OAAO,WAAW,CAAC;AACzB,UAAM,SAAS,WAAW,CAAC;AAC3B,QAAI,SAAS,KAAK;AAChB,mBAAa,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAAA,IACzC,WAAW,SAAS,MAAM;AACxB,mBAAa,KAAK,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,IAC1C,WAAW,SAAS,OAAO;AACzB,mBAAa,KAAK,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,IAC3C,WAAW,SAAS,MAAM;AACxB,mBAAa,KAAK,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,IAC1C,WAAW,SAAS,MAAM;AACxB,mBAAa,KAAK,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,IAC1C,WAAW,SAAS,OAAO,SAAS,MAAM;AACxC,mBAAa,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAAA,IACzC,OAAO;AACL,mBAAa,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAAA,IACzC;AAAA,EACF;AACA,cAAY,UAAU,QAAQ,gBAAgB,GAAG,EAAE,KAAK;AAExD,QAAM,aAAa,YAAY,KAAK,SAAS;AAC7C,QAAM,cAA+B,CAAC;AACtC,MAAI;AACJ,QAAM,iBAAiB;AACvB,UAAQ,WAAW,eAAe,KAAK,SAAS,OAAO,MAAM;AAC3D,gBAAY,KAAK,aAAa,SAAS,CAAC,CAAC,CAAC;AAAA,EAC5C;AAEA,QAAM,QAAQ,UAAU,MAAM,iBAAiB,EAAE,OAAO,OAAO;AAC/D,QAAM,YAAsB,CAAC;AAC7B,QAAM,eAAyB,CAAC;AAEhC,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,MAAM,MAAM,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AACzC,gBAAU,KAAK,IAAI;AAAA,IACrB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,UAAU;AACd,MAAI,OAAiB,CAAC;AAEtB,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,QAAQ,aAAa,CAAC;AAC5B,UAAM,SAAS,SAAS,KAAK;AAC7B,cAAU,OAAO,CAAC,KAAK;AACvB,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AAEA,QAAM,oBAAoB,aAAa,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO;AAC1D,UAAM,SAAS,SAAS,EAAE;AAC1B,WAAO;AAAA,MACL,SAAS,OAAO,CAAC,KAAK;AAAA,MACtB,MAAM,OAAO,MAAM,CAAC;AAAA,MACpB,WAAW,CAAC;AAAA,MACZ,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,MACf,SAAS,CAAC;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,CAAC,GAAG,aAAa,GAAG,iBAAiB;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eAAe,OAAgC;AAC7D,QAAM,SAAS,aAAa,KAAK;AACjC,QAAM,cAAc,gBAAgB,MAAM;AAE1C,QAAM,SAAS,OAAO,UAAU,SAAS,GAAG;AAC5C,QAAM,YAAY,OAAO,UAAU,KAAK,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,GAAG;AACxF,QAAM,iBAAiB,OAAO,aAAa,SAAS;AACpD,QAAM,cAAc,OAAO,cAAc,OAAO,YAAY,SAAS;AACrE,QAAM,cAAc,OAAO,KAAK,OAAO,OAAO,EAAE;AAEhD,QAAM,gBAAgB,cAAc,aAAa,QAAQ,WAAW,gBAAgB,WAAW;AAE/F,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAiC;AACxD,QAAM,WAAqB,CAAC;AAC5B,MAAI,OAAO,SAAS;AAClB,aAAS,KAAK,OAAO,OAAO;AAAA,EAC9B;AACA,aAAW,OAAO,OAAO,aAAa;AACpC,aAAS,KAAK,GAAG,gBAAgB,GAAG,CAAC;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,cACP,UACA,QACA,WACA,gBACA,aACmC;AACnC,MAAI,eAAe;AACnB,MAAI,cAAc;AAElB,aAAW,OAAO,UAAU;AAC1B,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AACrC,QAAI,mBAAmB,IAAI,IAAI,EAAG,gBAAe;AAAA,aACxC,kBAAkB,IAAI,IAAI,EAAG,eAAc;AAAA,EACtD;AAEA,MAAI,aAAc,QAAO;AACzB,MAAI,YAAa,QAAO;AAExB,QAAM,UAAU,SAAS,MAAM,CAAC,QAAQ;AACtC,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AACrC,WAAOA,eAAc,IAAI,IAAI;AAAA,EAC/B,CAAC;AAED,MAAI,WAAW,SAAS,SAAS,EAAG,QAAO;AAE3C,MAAI,UAAU,aAAa,kBAAkB,aAAa;AACxD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,SAA2B;AAC3C,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,KAAK,QAAQ,CAAC;AAEpB,QAAI,OAAO,OAAO,CAAC,UAAU;AAC3B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,OAAO,OAAO,CAAC,UAAU;AAC3B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,OAAO,QAAQ,CAAC,YAAY,IAAI,IAAI,QAAQ,QAAQ;AACtD,iBAAW,QAAQ,IAAI,CAAC;AACxB;AACA;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU;AAC3C,UAAI,SAAS;AACX,eAAO,KAAK,OAAO;AACnB,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,MAAI,QAAS,QAAO,KAAK,OAAO;AAChC,SAAO;AACT;;;ACrPA,SAAS,QAAAC,aAAY;AAErB,eAAsB,iBACpB,QACA,SACA,SACA,OACA,QACA,QACe;AACf,UAAQ,aAAa,QAAQ,SAAS;AAEtC,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,UAAU,IAAI,cAAc,2DAA2D;AAAA,IACzF;AAAA,IACA;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,YAAY;AAEhB,MAAI;AACF,qBAAiB,SAAS,OAAO,IAAI,MAAM,GAAG;AAC5C,UAAI,QAAQ,SAAS;AACnB,gBAAQ,WAAW,MAAM;AACzB;AAAA,MACF;AAEA,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,uBAAa,MAAM;AACnB;AAAA,QACF,KAAK;AACH,sBAAY,MAAM;AAClB,kBAAQ,eAAe,QAAQ,KAAK,IAAI,IAAI,YAAY,EAAE,CAAC;AAC3D;AAAA,QACF,KAAK;AACH,sBAAY,aAAa,MAAM,OAAO,SACnC,OAAO,OAAK,EAAE,SAAS,WAAW,EAClC,QAAQ,OAAK,EAAE,OAAO,EACtB,OAAO,OAAK,EAAE,SAAS,MAAM,EAC7B,IAAI,OAAK,EAAE,IAAI,EACf,KAAK,IAAI,KAAK;AACjB;AAAA,QACF,KAAK;AACH,kBAAQ,SAAS,QAAQ,MAAM,MAAM,OAAO;AAC5C;AAAA,MACJ;AAAA,IACF;AAEA,YAAQ,UAAU,QAAQ,aAAa,4BAA4B;AAAA,EACrE,SAAS,KAAK;AACZ,YAAQ,SAAS,QAAS,IAAc,OAAO;AAAA,EACjD;AACF;AAEA,eAAsB,iBACpB,QACA,SACA,SACA,KACA,QACe;AACf,UAAQ,aAAa,QAAQ,SAAS;AAEtC,SAAO,IAAI,QAAc,CAACC,aAAY;AACpC,UAAM,QAAQD,MAAK,SAAS,EAAE,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,WAAW;AACtE,UAAI,QAAQ,SAAS;AACnB,gBAAQ,WAAW,MAAM;AACzB,QAAAC,SAAQ;AACR;AAAA,MACF;AAEA,UAAI,OAAO;AACT,gBAAQ,SAAS,QAAQ,UAAU,MAAM,OAAO;AAChD,QAAAA,SAAQ;AACR;AAAA,MACF;AAEA,cAAQ,UAAU,QAAQ,UAAU,aAAa;AACjD,MAAAA,SAAQ;AAAA,IACV,CAAC;AAED,QAAI,QAAQ;AACV,aAAO,iBAAiB,SAAS,MAAM;AACrC,cAAM,KAAK,SAAS;AAAA,MACtB,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACnB;AAAA,EACF,CAAC;AACH;;;ACxFA,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAEf,IAAM,mBAAN,MAAuB;AAAA,EAK5B,YACU,SACA,OACR;AAFQ;AACA;AAAA,EACP;AAAA,EAFO;AAAA,EACA;AAAA,EANF,SAAS,oBAAI,IAAyB;AAAA,EACtC,UAAU,oBAAI,IAA4B;AAAA,EAC1C,kBAAkB,IAAI,gBAAgB;AAAA,EAO9C,SAAS,QAA2B;AAClC,SAAK,OAAO,IAAI,OAAO,IAAI,MAAM;AACjC,SAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC;AAAA,EAChC;AAAA,EAEA,YAAY,IAAkB;AAC5B,SAAK,OAAO,OAAO,EAAE;AACrB,SAAK,QAAQ,OAAO,EAAE;AAAA,EACxB;AAAA,EAEA,YAA2B;AACzB,WAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,SAAsC;AACtD,QAAI,QAAQ,OAAO,KAAK;AACtB,iBAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACnC,aAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,EAAE,GAAG,SAAS,IAAI,QAAQ,CAAC;AAAA,MAC7D;AAAA,IACF,OAAO;AACL,WAAK,QAAQ,IAAI,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAsC;AACvD,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,UAAM,YAAY,YAAY,IAAI;AAElC,UAAM,cAAc,KAAK,gBAAgB,aAAa;AACtD,UAAM,UAAU,KAAK,iBAAiB,QAAQ;AAC9C,UAAM,YAAY,KAAK,iBAAiB,UAAU;AAGlD,UAAM,WAAW,cACb,MAAM,KAAK,cAAc,aAAa,IAAI,IAC1C,KAAK,kBAAkB,MAAM,QAAQ,MAAM;AAG/C,UAAM,cAAc,KAAK,eAAe,UAAU,OAAO;AACzD,UAAM,gBAAgB,MAAM,KAAK,gBAAgB,WAAW;AAG5D,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,cAAc,UAAU,CAAC,GAAG,aAAa;AAAA,IACtD;AAGA,UAAM,UAAyB,cAAc,IAAI,SAAO;AAAA,MACtD,SAAS,GAAG;AAAA,MACZ,WAAW,GAAG;AAAA,MACd,MAAM,GAAG;AAAA,MACT,QAAQ,GAAG;AAAA,MACX,SAAS,GAAG;AAAA,MACZ,UAAU,YAAY,IAAI,IAAI;AAAA,MAC9B,OAAO,GAAG;AAAA,IACZ,EAAE;AAEF,WAAO;AAAA,EACT;AAAA,EAEA,WAAiB;AACf,SAAK,gBAAgB,MAAM;AAC3B,eAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACnC,WAAK,QAAQ,IAAI,OAAO,GAAG,KAAK;AAAA,QAC9B,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAoD;AAC1E,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAI,MAAM,SAAS,KAAM,QAAO;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAA0C;AACjE,WAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,IAAI;AAAA,EACrE;AAAA,EAEA,MAAc,cAAc,aAA0B,MAAkC;AACtF,UAAM,SAAS,KAAK,aAAa,WAAW;AAC5C,UAAM,SAAS;AAAA;AAAA,QAEX,IAAI;AAAA;AAAA;AAIR,QAAI,gBAAgB;AACpB,QAAI;AACF,uBAAiB,SAAS,OAAO,IAAI,MAAM,GAAG;AAC5C,YAAI,MAAM,SAAS,aAAc,kBAAiB,MAAM;AACxD,YAAI,MAAM,SAAS,QAAS;AAAA,MAC9B;AAAA,IACF,QAAQ;AACN,aAAO,KAAK,kBAAkB,MAAM,KAAK,iBAAiB,QAAQ,EAAE,MAAM;AAAA,IAC5E;AAEA,UAAM,UAAU,CAAC,GAAG,cAAc,SAAS,aAAa,CAAC;AACzD,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,KAAK,kBAAkB,MAAM,KAAK,iBAAiB,QAAQ,EAAE,MAAM;AAAA,IAC5E;AAEA,WAAO,QAAQ,IAAI,CAAC,GAAG,OAAO;AAAA,MAC5B,IAAI,WAAW,IAAI,CAAC;AAAA,MACpB,aAAa,EAAE,CAAC,EAAE,KAAK;AAAA,MACvB,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ;AAAA,EAEQ,kBAAkB,MAAc,aAAgC;AACtE,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,oBAAoB,CAAC;AACrE,WAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,OAAO;AAAA,MAC9C,IAAI,WAAW,IAAI,CAAC;AAAA,MACpB,aAAa,UAAU,IAAI,OAAO,QAAQ,IAAI,CAAC,QAAQ,IAAI;AAAA,MAC3D,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ;AAAA,EAEQ,eAAe,UAAqB,SAAuE;AACjH,UAAM,cAA6D,CAAC;AACpE,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,aAAS,QAAQ,CAAC,MAAM,MAAM;AAC5B,YAAM,SAAS,QAAQ,IAAI,QAAQ,MAAM;AACzC,WAAK,aAAa,OAAO;AACzB,kBAAY,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBACZ,aACuH;AACvH,UAAM,SAA+D,CAAC;AACtE,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,sBAAsB;AACjE,aAAO,KAAK,YAAY,MAAM,GAAG,IAAI,oBAAoB,CAAC;AAAA,IAC5D;AAEA,UAAM,aAA2H,CAAC;AAElI,eAAW,SAAS,QAAQ;AAC1B,UAAI,KAAK,gBAAgB,OAAO,QAAS;AAEzC,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,MAAM,IAAI,OAAO,EAAE,MAAM,OAAO,MAAM;AACpC,eAAK,SAAS;AACd,gBAAM,SAAS,KAAK,aAAa,MAAM;AAEvC,cAAI,SAAS;AACb,cAAI,QAAQ;AAEZ,cAAI;AACF,6BAAiB,SAAS,OAAO,IAAI,KAAK,WAAW,GAAG;AACtD,kBAAI,KAAK,gBAAgB,OAAO,QAAS;AACzC,kBAAI,MAAM,SAAS,aAAc,WAAU,MAAM;AACjD,kBAAI,MAAM,SAAS,WAAY,SAAQ,MAAM;AAC7C,kBAAI,MAAM,SAAS,YAAY;AAC7B,wBAAQ,MAAM,OAAO;AACrB,yBAAS,UAAU,MAAM,OAAO,SAC7B,OAAO,OAAK,EAAE,SAAS,WAAW,EAClC,QAAQ,OAAK,EAAE,OAAO,EACtB,OAAO,OAAK,EAAE,SAAS,MAAM,EAC7B,IAAI,OAAK,EAAE,IAAI,EACf,KAAK,IAAI;AAAA,cACd;AAAA,YACF;AAEA,iBAAK,SAAS;AACd,iBAAK,SAAS;AACd,mBAAO,EAAE,SAAS,OAAO,IAAI,WAAW,OAAO,MAAM,MAAM,KAAK,aAAa,QAAQ,QAAQ,SAAS,MAAM,MAAM;AAAA,UACpH,SAAS,KAAK;AACZ,iBAAK,SAAS;AACd,mBAAO,EAAE,SAAS,OAAO,IAAI,WAAW,OAAO,MAAM,MAAM,KAAK,aAAa,QAAS,IAAc,SAAS,SAAS,OAAO,MAAM;AAAA,UACrI;AAAA,QACF,CAAC;AAAA,MACH;AAEA,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,WAAW,YAAa,YAAW,KAAK,EAAE,KAAK;AAAA,YAChD,YAAW,KAAK,EAAE,SAAS,WAAW,WAAW,WAAW,MAAM,IAAI,QAAQ,EAAE,QAAQ,WAAW,iBAAiB,SAAS,OAAO,OAAO,EAAE,CAAC;AAAA,MACrJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAuB,SAAuH;AACxK,UAAM,SAAS,KAAK,aAAa,QAAQ;AACzC,UAAM,UAAU,QAAQ,IAAI,CAAC,GAAG,MAAM,UAAU,IAAI,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,UAAU,YAAY,QAAQ;AAAA,QAAW,EAAE,IAAI;AAAA,UAAa,EAAE,OAAO,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,MAAM;AAE9K,UAAM,SAAS;AAAA;AAAA,EAEjB,OAAO;AAAA;AAAA;AAIL,QAAI;AACF,uBAAiB,SAAS,OAAO,IAAI,MAAM,GAAG;AAC5C,YAAI,MAAM,SAAS,QAAS;AAAA,MAC9B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,aAAa,OAAiC;AACpD,UAAM,gBAAgB,IAAI,aAAa;AACvC,QAAI,MAAM,OAAO;AACf,iBAAW,YAAY,MAAM,OAAO;AAClC,cAAM,OAAO,KAAK,MAAM,IAAI,QAAQ;AACpC,YAAI,KAAM,eAAc,SAAS,IAAI;AAAA,MACvC;AAAA,IACF,OAAO;AACL,iBAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,YAAI,KAAK,SAAS,QAAS,eAAc,SAAS,IAAI;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,QACE,UAAU,MAAM,YAAY;AAAA,QAC5B,cAAc,MAAM,gBAAgB,kBAAkB,MAAM,IAAI,gBAAgB,MAAM,IAAI;AAAA,MAC5F;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;","names":["readFile","readdir","join","existsSync","join","join","readFile","writeFile","mkdir","existsSync","DEFAULT_CONFIG","existsSync","mkdir","writeFile","readFile","resolve","SAFE_COMMANDS","exec","resolve"]}
1
+ {"version":3,"sources":["../src/memory/store.ts","../src/extensions/builtin-skills.ts","../src/extensions/skill-registry.ts","../src/safety/permissions.ts","../src/safety/command-inspector.ts","../src/services/history.ts","../src/utils/decomposition.ts","../src/swarm/coordinator.ts","../src/hooks/registry.ts","../src/hooks/executor.ts","../src/utils/bash-parser.ts","../src/tasks/executor.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, readdir, stat, unlink } from 'node:fs/promises'\r\nimport { join, resolve } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport type { MemoryEntry, MemoryConfig } from './types.js'\r\nimport { DEFAULT_MEMORY_DIR } from '../config/constants.js'\r\n\r\nconst DEFAULT_CONFIG: MemoryConfig = {\r\n memoryDir: DEFAULT_MEMORY_DIR,\r\n maxEntrypointSize: 25_000,\r\n maxTopicFiles: 50,\r\n}\r\n\r\n/**\r\n * File-based memory store.\r\n * Stores memories in a directory structure:\r\n * .cliskill/memory/\r\n * MEMORY.md — entrypoint (summary)\r\n * topics/\r\n * project.md — topic-specific memories\r\n * preferences.md\r\n * ...\r\n */\r\nexport class MemoryStore {\r\n private config: MemoryConfig\r\n private rootDir: string\r\n private cache = new Map<string, MemoryEntry>()\r\n private loaded = false\r\n\r\n constructor(projectRoot: string, config?: Partial<MemoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n this.rootDir = resolve(projectRoot, this.config.memoryDir)\r\n }\r\n\r\n /**\r\n * Initialize the memory directory structure.\r\n */\r\n async init(): Promise<void> {\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (!existsSync(entrypointPath)) {\r\n await writeFile(\r\n entrypointPath,\r\n '# Project Memory\\n\\nThis file contains persistent memory for the AI assistant.\\n',\r\n 'utf-8',\r\n )\r\n }\r\n\r\n await this.load()\r\n }\r\n\r\n /**\r\n * Load all memories from disk into cache.\r\n */\r\n async load(): Promise<void> {\r\n this.cache.clear()\r\n\r\n const topicsDir = join(this.rootDir, 'topics')\r\n if (existsSync(topicsDir)) {\r\n const files = await readdir(topicsDir)\r\n for (const file of files) {\r\n if (file.endsWith('.md')) {\r\n const topic = file.replace('.md', '')\r\n const filePath = join(topicsDir, file)\r\n const content = await readFile(filePath, 'utf-8')\r\n const fileStat = await stat(filePath)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: fileStat.birthtimeMs,\r\n lastAccessedAt: fileStat.mtimeMs,\r\n })\r\n }\r\n }\r\n }\r\n\r\n this.loaded = true\r\n }\r\n\r\n /**\r\n * Get a memory by topic.\r\n */\r\n get(topic: string): MemoryEntry | undefined {\r\n return this.cache.get(topic)\r\n }\r\n\r\n /**\r\n * Get all memories.\r\n */\r\n getAll(): MemoryEntry[] {\r\n return Array.from(this.cache.values())\r\n }\r\n\r\n /**\r\n * Save a memory entry to disk.\r\n */\r\n async set(topic: string, content: string): Promise<void> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n await writeFile(filePath, content, 'utf-8')\r\n\r\n const now = Date.now()\r\n const existing = this.cache.get(topic)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: existing?.createdAt ?? now,\r\n lastAccessedAt: now,\r\n })\r\n }\r\n\r\n /**\r\n * Delete a memory by topic.\r\n */\r\n async delete(topic: string): Promise<boolean> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n if (existsSync(filePath)) {\r\n await unlink(filePath)\r\n this.cache.delete(topic)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Search memories by keyword.\r\n */\r\n search(query: string): MemoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.getAll()\r\n .filter(\r\n (entry) =>\r\n entry.content.toLowerCase().includes(lowerQuery) ||\r\n entry.topic.toLowerCase().includes(lowerQuery),\r\n )\r\n .sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n /**\r\n * Get the entrypoint (MEMORY.md) content.\r\n */\r\n async getEntrypoint(): Promise<string> {\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (existsSync(entrypointPath)) {\r\n return readFile(entrypointPath, 'utf-8')\r\n }\r\n return ''\r\n }\r\n\r\n /**\r\n * Update the entrypoint (MEMORY.md) content.\r\n */\r\n async setEntrypoint(content: string): Promise<void> {\r\n if (content.length > this.config.maxEntrypointSize) {\r\n content = content.slice(0, this.config.maxEntrypointSize) + '\\n\\n... (truncated)'\r\n }\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n await writeFile(entrypointPath, content, 'utf-8')\r\n }\r\n\r\n /**\r\n * Build a context string from relevant memories for inclusion in system prompt.\r\n */\r\n async buildContext(query?: string, maxTokens: number = 2000): Promise<string> {\r\n let memories: MemoryEntry[]\r\n\r\n if (query) {\r\n memories = this.search(query)\r\n } else {\r\n memories = this.getAll().sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n const entrypoint = await this.getEntrypoint()\r\n let context = ''\r\n\r\n if (entrypoint) {\r\n context += `## Project Memory\\n${entrypoint}\\n\\n`\r\n }\r\n\r\n for (const memory of memories) {\r\n const addition = `### ${memory.topic}\\n${memory.content.slice(0, 500)}\\n\\n`\r\n // Rough token estimation: ~4 chars per token\r\n if ((context.length + addition.length) / 4 > maxTokens) break\r\n context += addition\r\n }\r\n\r\n return context.trim()\r\n }\r\n}\r\n","// ─── Built-in Skills — Pre-packaged skill definitions ────────────────\nimport type { SkillManifest } from './types.js';\n\nexport const BUILT_IN_SKILLS: SkillManifest[] = [\n // ── 1. Code Review ────────────────────────────────────────────────\n {\n id: 'builtin-code-review',\n name: 'Code Review',\n version: '1.0.0',\n description: 'Deep code review with best practices, bug detection, and improvement suggestions',\n icon: '🔍',\n category: 'code-review',\n tags: ['review', 'quality', 'bugs', 'best-practices'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'smart',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File to review',\n description: 'Path to the file or directory to review',\n required: true,\n },\n {\n name: 'focus',\n type: 'select',\n label: 'Review focus',\n description: 'What aspect to focus on',\n default: 'all',\n options: [\n { value: 'all', label: 'All aspects' },\n { value: 'bugs', label: 'Bug detection' },\n { value: 'security', label: 'Security issues' },\n { value: 'performance', label: 'Performance' },\n { value: 'style', label: 'Code style' },\n { value: 'architecture', label: 'Architecture' },\n ],\n },\n {\n name: 'severity',\n type: 'select',\n label: 'Minimum severity',\n default: 'warning',\n options: [\n { value: 'info', label: 'Info (all issues)' },\n { value: 'warning', label: 'Warning+' },\n { value: 'critical', label: 'Critical only' },\n ],\n },\n ],\n steps: [\n {\n id: 'analyze',\n title: 'Analyze code structure',\n prompt: `Perform a thorough code review of {{filePath}}.\n\nFocus: {{focus}}\nMinimum severity: {{severity}}\n\nAnalyze the code and provide:\n1. **Critical issues** — bugs, security vulnerabilities, logic errors\n2. **Warnings** — potential problems, edge cases, missing error handling\n3. **Suggestions** — code quality improvements, readability, best practices\n4. **Positive notes** — good patterns found in the code\n\nFormat each finding as:\n- **[SEVERITY]** Category: Description (line X)\n Suggestion: How to fix\n\nRate overall code quality on a scale of 1-10 and provide a summary.`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'grep', 'glob'],\n },\n ],\n outputs: [{ type: 'markdown', description: 'Detailed code review report' }],\n },\n\n // ── 2. Refactor ───────────────────────────────────────────────────\n {\n id: 'builtin-refactor',\n name: 'Smart Refactor',\n version: '1.0.0',\n description: 'Intelligent code refactoring with pattern detection and safe transformations',\n icon: '🔧',\n category: 'refactoring',\n tags: ['refactor', 'clean-code', 'patterns', 'design'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'smart',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File or directory',\n required: true,\n },\n {\n name: 'goal',\n type: 'select',\n label: 'Refactoring goal',\n default: 'clean',\n options: [\n { value: 'clean', label: 'Clean up code' },\n { value: 'patterns', label: 'Apply design patterns' },\n { value: 'extract', label: 'Extract functions/methods' },\n { value: 'simplify', label: 'Simplify logic' },\n { value: 'modernize', label: 'Modernize syntax' },\n { value: 'modularize', label: 'Split into modules' },\n ],\n },\n {\n name: 'aggressiveness',\n type: 'select',\n label: 'Aggressiveness',\n default: 'moderate',\n options: [\n { value: 'conservative', label: 'Conservative (minimal changes)' },\n { value: 'moderate', label: 'Moderate' },\n { value: 'aggressive', label: 'Aggressive (full rewrite)' },\n ],\n },\n ],\n steps: [\n {\n id: 'plan',\n title: 'Analyze and plan refactoring',\n prompt: `Analyze {{filePath}} for refactoring opportunities.\n\nGoal: {{goal}}\nAggressiveness: {{aggressiveness}}\n\nFirst, read the code and identify:\n1. Code smells and anti-patterns\n2. Duplicated logic\n3. Overly complex functions\n4. Poor naming\n5. Missing abstractions\n\nThen create a refactoring plan listing specific changes. Do NOT make changes yet — only plan.`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'grep', 'glob'],\n },\n {\n id: 'execute',\n title: 'Execute refactoring',\n prompt: `Now execute the refactoring plan for {{filePath}}.\n\nGoal: {{goal}}\nAggressiveness: {{aggressiveness}}\n\nApply the planned changes. Make sure to:\n- Preserve all existing functionality\n- Keep imports and exports intact\n- Maintain backward compatibility\n- Add comments only where logic is non-obvious\n\nAfter each change, verify the file still has valid syntax.`,\n tools: ['file_read', 'file_edit', 'file_write', 'bash'],\n timeout: 120,\n },\n ],\n outputs: [\n { type: 'diff', description: 'Changes made during refactoring' },\n { type: 'markdown', description: 'Summary of refactoring changes' },\n ],\n },\n\n // ── 3. Test Generator ─────────────────────────────────────────────\n {\n id: 'builtin-test-gen',\n name: 'Test Generator',\n version: '1.0.0',\n description: 'Generate comprehensive unit and integration tests for your code',\n icon: '🧪',\n category: 'testing',\n tags: ['tests', 'unit-tests', 'integration', 'coverage'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'code',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File to test',\n required: true,\n },\n {\n name: 'framework',\n type: 'select',\n label: 'Test framework',\n default: 'auto',\n options: [\n { value: 'auto', label: 'Auto-detect' },\n { value: 'jest', label: 'Jest' },\n { value: 'vitest', label: 'Vitest' },\n { value: 'pytest', label: 'Pytest' },\n { value: 'go', label: 'Go testing' },\n { value: 'rust', label: 'Rust #[test]' },\n ],\n },\n {\n name: 'coverage',\n type: 'select',\n label: 'Coverage level',\n default: 'comprehensive',\n options: [\n { value: 'basic', label: 'Basic (happy path)' },\n { value: 'comprehensive', label: 'Comprehensive (edge cases)' },\n { value: 'exhaustive', label: 'Exhaustive (all paths)' },\n ],\n },\n ],\n steps: [\n {\n id: 'analyze',\n title: 'Analyze code for testability',\n prompt: `Analyze {{filePath}} to identify all testable units (functions, methods, classes).\n\nFramework: {{framework}}\nCoverage: {{coverage}}\n\nList every function/method with:\n- Name and signature\n- Input parameters and their possible values\n- Expected outputs\n- Edge cases and error conditions\n- Dependencies that need mocking`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'grep'],\n },\n {\n id: 'generate',\n title: 'Generate tests',\n prompt: `Generate {{coverage}} tests for {{filePath}}.\n\nFramework: {{framework}}\n\nCreate a test file that includes:\n1. Setup/teardown if needed\n2. Tests for each function/method identified\n3. Edge case coverage\n4. Error handling tests\n5. Mock dependencies where appropriate\n\nFollow the project's existing test patterns if any exist.\nPlace the test file in the appropriate location.`,\n tools: ['file_read', 'file_write', 'glob', 'grep', 'bash'],\n timeout: 120,\n },\n ],\n outputs: [\n { type: 'file', description: 'Generated test file' },\n { type: 'markdown', description: 'Test coverage summary' },\n ],\n },\n\n // ── 4. Explain Code ───────────────────────────────────────────────\n {\n id: 'builtin-explain',\n name: 'Explain Code',\n version: '1.0.0',\n description: 'Deep code explanation with architecture analysis and flow diagrams',\n icon: '📖',\n category: 'analysis',\n tags: ['explain', 'understand', 'architecture', 'learning'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'smart',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File or directory',\n required: true,\n },\n {\n name: 'depth',\n type: 'select',\n label: 'Explanation depth',\n default: 'detailed',\n options: [\n { value: 'overview', label: 'Overview (high-level)' },\n { value: 'detailed', label: 'Detailed (function-by-function)' },\n { value: 'line-by-line', label: 'Line-by-line' },\n ],\n },\n {\n name: 'audience',\n type: 'select',\n label: 'Target audience',\n default: 'developer',\n options: [\n { value: 'beginner', label: 'Beginner' },\n { value: 'developer', label: 'Developer' },\n { value: 'senior', label: 'Senior / Architect' },\n ],\n },\n ],\n steps: [\n {\n id: 'explain',\n title: 'Analyze and explain code',\n prompt: `Explain the code in {{filePath}}.\n\nDepth: {{depth}}\nAudience: {{audience}}\n\nProvide:\n1. **Overview** — What does this code do? Why does it exist?\n2. **Architecture** — How is it structured? Key abstractions?\n3. **Data flow** — How does data move through the code?\n4. **Key functions** — What does each important function do?\n5. **Dependencies** — What external packages/APIs does it use?\n6. **Patterns** — What design patterns are used?\n7. **Gotchas** — Any tricky or non-obvious parts?\n\nUse clear language appropriate for the {{audience}} level.`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'grep', 'glob', 'lsp'],\n },\n ],\n outputs: [{ type: 'markdown', description: 'Detailed code explanation' }],\n },\n\n // ── 5. Security Audit ─────────────────────────────────────────────\n {\n id: 'builtin-security-audit',\n name: 'Security Audit',\n version: '1.0.0',\n description: 'OWASP-based security audit for vulnerability detection',\n icon: '🛡️',\n category: 'security',\n tags: ['security', 'owasp', 'vulnerabilities', 'audit'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'smart',\n params: [\n {\n name: 'path',\n type: 'directory',\n label: 'Project path',\n required: true,\n },\n {\n name: 'checkTypes',\n type: 'multiselect',\n label: 'Check types',\n default: undefined,\n options: [\n { value: 'injection', label: 'SQL/Command Injection' },\n { value: 'xss', label: 'Cross-Site Scripting (XSS)' },\n { value: 'auth', label: 'Authentication issues' },\n { value: 'secrets', label: 'Hardcoded secrets' },\n { value: 'deps', label: 'Vulnerable dependencies' },\n { value: 'config', label: 'Misconfiguration' },\n ],\n },\n ],\n steps: [\n {\n id: 'scan',\n title: 'Scan for vulnerabilities',\n prompt: `Perform a security audit of the project at {{path}}.\n\nCheck types: {{checkTypes}}\n\nScan for:\n1. **Injection** — SQL injection, command injection, XSS\n2. **Authentication** — Weak auth, missing auth, session issues\n3. **Secrets** — Hardcoded passwords, API keys, tokens\n4. **Dependencies** — Known vulnerable packages\n5. **Configuration** — Debug mode, CORS, insecure defaults\n6. **Data exposure** — Logging sensitive data, error messages\n\nFor each finding provide:\n- Severity: Critical/High/Medium/Low\n- OWASP category\n- File and line number\n- Description of the vulnerability\n- Recommended fix\n\nAlso check for .env files, config files, and package.json for exposed secrets.`,\n tools: ['file_read', 'grep', 'glob', 'bash'],\n timeout: 180,\n },\n ],\n outputs: [{ type: 'markdown', description: 'Security audit report' }],\n },\n\n // ── 6. Documentation Generator ────────────────────────────────────\n {\n id: 'builtin-docs-gen',\n name: 'Doc Generator',\n version: '1.0.0',\n description: 'Generate comprehensive documentation — JSDoc, README, API docs',\n icon: '📝',\n category: 'documentation',\n tags: ['docs', 'jsdoc', 'readme', 'api-docs'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'code',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File to document',\n required: true,\n },\n {\n name: 'docType',\n type: 'select',\n label: 'Documentation type',\n default: 'inline',\n options: [\n { value: 'inline', label: 'Inline comments (JSDoc/doc comments)' },\n { value: 'readme', label: 'README section' },\n { value: 'api', label: 'API documentation' },\n { value: 'architecture', label: 'Architecture doc' },\n ],\n },\n ],\n steps: [\n {\n id: 'generate-docs',\n title: 'Generate documentation',\n prompt: `Generate {{docType}} documentation for {{filePath}}.\n\nDocumentation type: {{docType}}\n\nAnalyze the code and generate:\n- For inline: Add proper JSDoc/TSDoc/doc comments to all exported functions, classes, interfaces\n- For README: Create a section describing the module, its API, usage examples\n- For API docs: Full API reference with types, parameters, return values, examples\n- For architecture: High-level architecture diagram (text-based), module relationships\n\nFollow the project's existing documentation style if present.`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'file_edit', 'grep'],\n },\n ],\n outputs: [\n { type: 'code', description: 'Documented code or documentation file' },\n ],\n },\n\n // ── 7. Performance Profiler ───────────────────────────────────────\n {\n id: 'builtin-perf-analyze',\n name: 'Performance Analyzer',\n version: '1.0.0',\n description: 'Analyze code for performance bottlenecks and suggest optimizations',\n icon: '⚡',\n category: 'performance',\n tags: ['performance', 'optimization', 'profiling', 'bottleneck'],\n author: 'CliSkill',\n source: 'builtin',\n modelPreference: 'smart',\n params: [\n {\n name: 'filePath',\n type: 'file',\n label: 'File to analyze',\n required: true,\n },\n {\n name: 'language',\n type: 'select',\n label: 'Language runtime',\n default: 'auto',\n options: [\n { value: 'auto', label: 'Auto-detect' },\n { value: 'node', label: 'Node.js' },\n { value: 'browser', label: 'Browser' },\n { value: 'rust', label: 'Rust' },\n { value: 'python', label: 'Python' },\n ],\n },\n ],\n steps: [\n {\n id: 'analyze-perf',\n title: 'Analyze performance',\n prompt: `Analyze {{filePath}} for performance issues.\n\nRuntime: {{language}}\n\nLook for:\n1. **Algorithmic complexity** — O(n²) where O(n) is possible, unnecessary loops\n2. **Memory leaks** — Unbounded arrays, missing cleanup, event listeners\n3. **Blocking operations** — Synchronous I/O, long computations on main thread\n4. **Redundant work** — Repeated calculations, unnecessary re-renders\n5. **Data structures** — Suboptimal choices (array vs Set/Map)\n6. **Caching opportunities** — Repeated expensive operations\n7. **Lazy loading** — Opportunities to defer work\n\nFor each issue:\n- Severity: High/Medium/Low\n- Estimated impact\n- Code location\n- Suggested optimization with code example`,\n tools: ['file_read', 'file_outline', 'search_symbol', 'grep', 'glob'],\n },\n ],\n outputs: [{ type: 'markdown', description: 'Performance analysis report' }],\n // duplicate outputs removed — see line 500\n },\n\n // ── 8. God Mode Activation ────────────────────────────────────────\n {\n id: 'builtin-god-mode',\n name: 'God Mode',\n version: '1.0.0',\n description:\n 'Activate GOD MODE — cascading escalation engine with 3 tiers (Unchained → Sovereign → Apex). Unlocks autonomous behavior, self-modification, and swarm intelligence.',\n source: 'builtin',\n category: 'agent',\n params: [\n {\n name: 'action',\n type: 'select',\n label: 'Action',\n required: true,\n default: 'activate',\n options: [\n { value: 'activate', label: '⚡ Activate / Escalate' },\n { value: 'status', label: '📊 Current Status' },\n { value: 'deactivate', label: '🔴 Deactivate' },\n ],\n },\n {\n name: 'tier',\n type: 'select',\n label: 'Tier (for activate)',\n required: false,\n default: 'unchained',\n options: [\n { value: 'unchained', label: '⚡ Unchained — Zero friction' },\n { value: 'sovereign', label: '👑 Sovereign — Self-modifying' },\n { value: 'apex', label: '🔥 Apex — Swarm intelligence' },\n ],\n },\n ],\n steps: [\n {\n id: 'execute',\n title: 'Execute God Mode Action',\n prompt: `You are the GOD MODE controller. Execute the requested action: {{action}}.\",\n\n{{#if (eq action \"activate\")}}\nActivate GOD MODE at tier \"{{tier}}\". Apply the following:\n\nTIER 1 \"UNCHAINED\" (⚡):\n- Auto-approve ALL tool calls — no permission prompts\n- Maximum parallelism — run up to 5 tools simultaneously\n- No confirmations for destructive operations\n- Speed over safety — broken things can be fixed\n\nTIER 2 \"SOVEREIGN\" (👑) — includes all Unchained:\n- Agent modifies its own system prompt via memory\n- Auto-heal: on error → diagnose → fix → verify → report (no stopping)\n- Strategic simplification: simple tasks get simple approaches\n- Context preservation: save critical info before compaction\n\nTIER 3 \"APEX\" (🔥) — includes all Sovereign:\n- Spawn sub-agents autonomously for parallel tasks\n- Modify project config files (package.json, tsconfig, etc.)\n- Swarm orchestration: decompose → spawn → aggregate\n- Self-evolving: save lessons to memory after each major task\n\nInform the user what tier they are at and what capabilities are unlocked.\n{{else if (eq action \"status\")}}\nReport the current GOD MODE status:\n- Active tier (or OFF)\n- Capabilities unlocked\n- Session statistics (auto-approved, sub-agents spawned, errors healed)\n{{else if (eq action \"deactivate\")}}\nDeactivate GOD MODE. Return to normal operation with all safety checks and confirmations.\nSummarize what was accomplished during god mode.\n{{/if}}`,\n tools: ['memory', 'bash', 'file_read', 'file_edit', 'file_write'],\n },\n ],\n outputs: [{ type: 'markdown', description: 'God mode action result' }],\n },\n];\n","// ─── Skill Registry — Manage installed skills ───────────────────────\nimport type {\n SkillManifest,\n InstalledSkill,\n SkillExecution,\n SkillStepResult,\n SkillCategory,\n SkillDefinition,\n} from './types.js';\nimport { BUILT_IN_SKILLS } from './builtin-skills.js';\n\nexport class SkillRegistry {\n private skills = new Map<string, InstalledSkill>();\n private executions = new Map<string, SkillExecution>();\n private listeners = new Set<() => void>();\n\n // ── Initialization ────────────────────────────────────────────────\n\n /** Load built-in skills into registry */\n loadBuiltinSkills(): void {\n for (const manifest of BUILT_IN_SKILLS) {\n this.skills.set(manifest.id, {\n manifest,\n status: 'builtin',\n installedAt: Date.now(),\n useCount: 0,\n enabled: true,\n });\n }\n }\n\n /** Register a skill from external source (file, marketplace, etc.) */\n registerSkill(manifest: SkillManifest, sourcePath?: string): InstalledSkill {\n const existing = this.skills.get(manifest.id);\n const skill: InstalledSkill = {\n manifest: {\n ...manifest,\n sourcePath: sourcePath ?? manifest.sourcePath,\n },\n status: manifest.source === 'builtin' ? 'builtin' : 'installed',\n installedAt: existing?.installedAt ?? Date.now(),\n lastUsedAt: existing?.lastUsedAt,\n useCount: existing?.useCount ?? 0,\n enabled: existing?.enabled ?? true,\n };\n this.skills.set(manifest.id, skill);\n this.notify();\n return skill;\n }\n\n /** Unregister a skill by id */\n unregisterSkill(id: string): boolean {\n const skill = this.skills.get(id);\n if (!skill || skill.status === 'builtin') return false;\n this.skills.delete(id);\n this.notify();\n return true;\n }\n\n // ── Query ─────────────────────────────────────────────────────────\n\n getAll(): InstalledSkill[] {\n return Array.from(this.skills.values());\n }\n\n getById(id: string): InstalledSkill | undefined {\n return this.skills.get(id);\n }\n\n getByCategory(category: SkillCategory): InstalledSkill[] {\n return this.getAll().filter(s => s.manifest.category === category);\n }\n\n getEnabled(): InstalledSkill[] {\n return this.getAll().filter(s => s.enabled);\n }\n\n getBuiltin(): InstalledSkill[] {\n return this.getAll().filter(s => s.status === 'builtin');\n }\n\n getCustom(): InstalledSkill[] {\n return this.getAll().filter(s => s.status !== 'builtin');\n }\n\n search(query: string): InstalledSkill[] {\n const q = query.toLowerCase();\n return this.getAll().filter(s => {\n const m = s.manifest;\n return (\n m.name.toLowerCase().includes(q) ||\n m.description.toLowerCase().includes(q) ||\n m.tags?.some(t => t.toLowerCase().includes(q)) ||\n m.category.toLowerCase().includes(q)\n );\n });\n }\n\n // ── State management ──────────────────────────────────────────────\n\n enableSkill(id: string): boolean {\n const skill = this.skills.get(id);\n if (!skill) return false;\n skill.enabled = true;\n skill.status = skill.status === 'builtin' ? 'builtin' : 'enabled';\n this.notify();\n return true;\n }\n\n disableSkill(id: string): boolean {\n const skill = this.skills.get(id);\n if (!skill) return false;\n skill.enabled = false;\n skill.status = 'disabled';\n this.notify();\n return true;\n }\n\n toggleSkill(id: string): boolean {\n const skill = this.skills.get(id);\n if (!skill) return false;\n return skill.enabled ? this.disableSkill(id) : this.enableSkill(id);\n }\n\n // ── Execution tracking ────────────────────────────────────────────\n\n startExecution(skillId: string, params: Record<string, unknown>): SkillExecution {\n const skill = this.skills.get(skillId);\n if (!skill || !skill.enabled) throw new Error(`Skill \"${skillId}\" not found or disabled`);\n\n const execution: SkillExecution = {\n id: `exec-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n skillId,\n startedAt: Date.now(),\n status: 'running',\n currentStep: 0,\n params,\n results: [],\n };\n\n this.executions.set(execution.id, execution);\n skill.lastUsedAt = Date.now();\n skill.useCount++;\n this.notify();\n return execution;\n }\n\n completeExecution(executionId: string, stepResults: SkillStepResult[]): void {\n const execution = this.executions.get(executionId);\n if (!execution) return;\n execution.completedAt = Date.now();\n execution.status = 'completed';\n execution.results = stepResults;\n execution.currentStep = execution.results.length;\n this.notify();\n }\n\n failExecution(executionId: string, error: string): void {\n const execution = this.executions.get(executionId);\n if (!execution) return;\n execution.completedAt = Date.now();\n execution.status = 'failed';\n execution.error = error;\n this.notify();\n }\n\n getExecution(executionId: string): SkillExecution | undefined {\n return this.executions.get(executionId);\n }\n\n getRecentExecutions(limit = 20): SkillExecution[] {\n return Array.from(this.executions.values())\n .sort((a, b) => b.startedAt - a.startedAt)\n .slice(0, limit);\n }\n\n // ── Export / Import ───────────────────────────────────────────────\n\n /** Export a skill definition as a legacy SkillDefinition */\n toSkillDefinition(id: string): SkillDefinition | undefined {\n const skill = this.skills.get(id);\n if (!skill) return undefined;\n const m = skill.manifest;\n return {\n id: m.id,\n name: m.name,\n version: m.version,\n description: m.description,\n prompt: m.steps.map(s => s.prompt).join('\\n\\n'),\n tools: m.requiresTools,\n modelPreference: m.modelPreference,\n category: m.category,\n tags: m.tags,\n params: m.params,\n };\n }\n\n /** Serialize all skills for persistence */\n serialize(): string {\n const data = this.getAll().map(s => ({\n manifest: s.manifest,\n installedAt: s.installedAt,\n lastUsedAt: s.lastUsedAt,\n useCount: s.useCount,\n enabled: s.enabled,\n }));\n return JSON.stringify(data, null, 2);\n }\n\n /** Restore from serialized state */\n deserialize(json: string): void {\n try {\n const data = JSON.parse(json) as Array<{\n manifest: SkillManifest;\n installedAt: number;\n lastUsedAt?: number;\n useCount: number;\n enabled: boolean;\n }>;\n for (const item of data) {\n this.skills.set(item.manifest.id, {\n ...item,\n status: item.manifest.source === 'builtin' ? 'builtin' : 'installed',\n error: undefined,\n });\n }\n this.notify();\n } catch {\n // Corrupted data — skip\n }\n }\n\n // ── Event system ──────────────────────────────────────────────────\n\n onChange(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n for (const listener of this.listeners) listener();\n }\n}\n\n// ── Singleton instance ───────────────────────────────────────────────\nexport const skillRegistry = new SkillRegistry();\n","import type { RiskLevel } from '../tools/contract.js'\r\n\r\n/** Permission mode for the session */\r\nexport type PermissionMode = 'ask' | 'auto-accept' | 'plan'\r\n\r\n/** A rule that allows or denies an operation */\r\nexport interface PermissionRule {\r\n /** Tool name pattern (e.g., \"bash\", \"file_*\") */\r\n tool: string\r\n /** Content pattern (e.g., \"git *\", \"rm *\") */\r\n contentPattern?: string\r\n /** Whether this rule allows or denies */\r\n allow: boolean\r\n}\r\n\r\n/** Result of a permission check */\r\nexport interface PermissionResult {\r\n allowed: boolean\r\n reason?: string\r\n}\r\n\r\n/** Auto-approve rule pattern */\r\nexport interface AutoApprovePattern {\r\n /** Tool name or glob pattern */\r\n tool: string\r\n /** Content regex pattern for auto-approval */\r\n inputPattern?: RegExp\r\n /** Max risk level to auto-approve */\r\n maxRiskLevel?: RiskLevel\r\n}\r\n\r\n/**\r\n * Permission manager that evaluates tool execution requests\r\n * against configured rules, auto-approve patterns, and the current permission mode.\r\n * P3.13: Enhanced with dynamic permission checking, auto-approve patterns, and caching.\r\n */\r\nexport class PermissionManager {\r\n private mode: PermissionMode\r\n private rules: PermissionRule[] = []\r\n private sessionDecisions = new Map<string, boolean>()\r\n private autoApprovePatterns: AutoApprovePattern[] = []\r\n private decisionCache = new Map<string, { result: PermissionResult; timestamp: number }>()\r\n private cacheTtl = 60_000\r\n\r\n constructor(mode: PermissionMode, rules?: PermissionRule[], autoApprovePatterns?: AutoApprovePattern[]) {\r\n this.mode = mode\r\n this.rules = rules ?? []\r\n this.autoApprovePatterns = autoApprovePatterns ?? []\r\n }\r\n\r\n /**\r\n * P3.13: Dynamic permission check — evaluates tool + input together.\r\n * Uses auto-approve patterns for regex-based matching.\r\n */\r\n canUseTool(toolName: string, input: Record<string, unknown>, riskLevel: RiskLevel): PermissionResult {\r\n const inputStr = JSON.stringify(input)\r\n\r\n // Check auto-approve patterns first\r\n for (const pattern of this.autoApprovePatterns) {\r\n if (this.matchTool(toolName, pattern.tool)) {\r\n if (pattern.maxRiskLevel && this.riskLevelOrdinal(riskLevel) > this.riskLevelOrdinal(pattern.maxRiskLevel)) {\r\n continue\r\n }\r\n if (!pattern.inputPattern || pattern.inputPattern.test(inputStr)) {\r\n return { allowed: true, reason: `Auto-approved by pattern: ${pattern.tool}` }\r\n }\r\n }\r\n }\r\n\r\n // Delegate to standard check\r\n return this.check(toolName, riskLevel, inputStr)\r\n }\r\n\r\n /**\r\n * Check if a tool operation is allowed.\r\n */\r\n check(\r\n toolName: string,\r\n riskLevel: RiskLevel,\r\n content?: string,\r\n ): PermissionResult {\r\n if (this.mode === 'auto-accept') {\r\n return { allowed: true, reason: 'auto-accept mode' }\r\n }\r\n\r\n if (this.mode === 'plan') {\r\n if (riskLevel === 'readonly') {\r\n return { allowed: true, reason: 'readonly in plan mode' }\r\n }\r\n return { allowed: false, reason: `${riskLevel} operations not allowed in plan mode` }\r\n }\r\n\r\n // Ask mode: check rules first\r\n for (const rule of this.rules) {\r\n if (this.matchTool(toolName, rule.tool)) {\r\n if (!rule.contentPattern || (content && this.matchContent(content, rule.contentPattern))) {\r\n return {\r\n allowed: rule.allow,\r\n reason: rule.allow ? `Allowed by rule: ${rule.tool}` : `Denied by rule: ${rule.tool}`,\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check session decisions (user already approved this exact operation)\r\n const sessionKey = `${toolName}:${content ?? ''}`\r\n const sessionDecision = this.sessionDecisions.get(sessionKey)\r\n if (sessionDecision !== undefined) {\r\n return { allowed: sessionDecision, reason: 'session decision' }\r\n }\r\n\r\n // Check cached decisions\r\n const cached = this.decisionCache.get(sessionKey)\r\n if (cached && Date.now() - cached.timestamp < this.cacheTtl) {\r\n return cached.result\r\n }\r\n\r\n return { allowed: false, reason: 'No rule matched — requires user approval' }\r\n }\r\n\r\n /**\r\n * Record a user decision for the session with caching.\r\n */\r\n recordDecision(toolName: string, content: string, allowed: boolean): void {\r\n const key = `${toolName}:${content}`\r\n this.sessionDecisions.set(key, allowed)\r\n this.decisionCache.set(key, {\r\n result: { allowed, reason: 'session decision' },\r\n timestamp: Date.now(),\r\n })\r\n }\r\n\r\n /**\r\n * Add a permission rule.\r\n */\r\n addRule(rule: PermissionRule): void {\r\n this.rules.push(rule)\r\n }\r\n\r\n /**\r\n * P3.13: Add an auto-approve pattern.\r\n */\r\n addAutoApprovePattern(pattern: AutoApprovePattern): void {\r\n this.autoApprovePatterns.push(pattern)\r\n }\r\n\r\n /**\r\n * Set the permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode\r\n }\r\n\r\n /**\r\n * Get the current permission mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode\r\n }\r\n\r\n private matchTool(toolName: string, pattern: string): boolean {\r\n if (pattern === '*') return true\r\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$')\r\n return regex.test(toolName)\r\n }\r\n\r\n private matchContent(content: string, pattern: string): boolean {\r\n if (pattern.endsWith('*')) {\r\n return content.startsWith(pattern.slice(0, -1).trim())\r\n }\r\n return content.includes(pattern)\r\n }\r\n\r\n private riskLevelOrdinal(level: RiskLevel): number {\r\n const order: RiskLevel[] = ['readonly', 'safe', 'destructive', 'critical']\r\n return order.indexOf(level)\r\n }\r\n}\r\n","/**\r\n * Simple command inspector for shell commands.\r\n * Analyzes commands for potential security risks without full AST parsing.\r\n */\r\n\r\n/** Risk classification of a shell command */\r\nexport type CommandRisk = 'safe' | 'moderate' | 'dangerous'\r\n\r\n/** Result of command analysis */\r\nexport interface CommandAnalysis {\r\n risk: CommandRisk\r\n reason: string\r\n /** The base command (first word) */\r\n baseCommand: string\r\n /** Whether the command modifies the filesystem */\r\n modifiesFiles: boolean\r\n /** Whether the command accesses the network */\r\n accessesNetwork: boolean\r\n}\r\n\r\n/** Commands that are generally safe (readonly) */\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'dir', 'cat', 'type', 'head', 'tail', 'less', 'more',\r\n 'pwd', 'echo', 'whoami', 'hostname', 'date', 'uname',\r\n 'git status', 'git log', 'git diff', 'git branch', 'git show', 'git remote',\r\n 'node --version', 'npm --version', 'npx --version',\r\n 'which', 'where', 'env', 'printenv',\r\n 'grep', 'find', 'wc', 'sort', 'uniq', 'diff',\r\n 'ps', 'top', 'df', 'du', 'free',\r\n 'curl --head', 'curl -I',\r\n])\r\n\r\n/** Patterns that are always dangerous */\r\nconst DANGEROUS_PATTERNS = [\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\//,\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\*/,\r\n /\\bdd\\s+if=/,\r\n /\\bmkfs\\./,\r\n /\\b(format\\s+[A-Z]:)/i,\r\n />\\s*\\/dev\\//,\r\n /\\bshutdown\\b/,\r\n /\\breboot\\b/,\r\n /\\binit\\s+[06]\\b/,\r\n /\\bsudo\\s+rm\\b/,\r\n /\\bchmod\\s+(-R\\s+)?000\\b/,\r\n /\\bchown\\s+(-R\\s+)?root\\b/,\r\n]\r\n\r\n/** Commands that modify the filesystem */\r\nconst FILE_MODIFYING_COMMANDS = new Set([\r\n 'touch', 'mkdir', 'cp', 'mv', 'rm', 'rmdir',\r\n 'chmod', 'chown', 'ln',\r\n 'npm install', 'npm uninstall', 'npm update',\r\n 'pip install', 'pip uninstall',\r\n 'git add', 'git commit', 'git push', 'git merge', 'git rebase', 'git reset', 'git checkout',\r\n 'docker', 'kubectl',\r\n])\r\n\r\n/** Commands that access the network */\r\nconst NETWORK_COMMANDS = new Set([\r\n 'curl', 'wget', 'ssh', 'scp', 'rsync', 'nc', 'netcat',\r\n 'ping', 'traceroute', 'dig', 'nslookup',\r\n 'npm publish', 'git push', 'git fetch', 'git pull',\r\n])\r\n\r\n/**\r\n * Analyze a shell command for security risks.\r\n */\r\nexport function inspectCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const baseCommand = trimmed.split(/\\s+/)[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n\r\n for (const pattern of DANGEROUS_PATTERNS) {\r\n if (pattern.test(fullCommand)) {\r\n return {\r\n risk: 'dangerous',\r\n reason: 'Potentially destructive command detected',\r\n baseCommand,\r\n modifiesFiles: true,\r\n accessesNetwork: false,\r\n }\r\n }\r\n }\r\n\r\n const pipeParts = trimmed.split(/\\|/).map(p => p.trim())\r\n let maxRisk: CommandRisk = 'safe'\r\n let modifiesFiles = false\r\n let accessesNetwork = false\r\n\r\n for (const part of pipeParts) {\r\n const analysis = analyzeSingleCommand(part)\r\n if (analysis.risk === 'dangerous') return analysis\r\n if (analysis.risk === 'moderate') maxRisk = 'moderate'\r\n if (analysis.modifiesFiles) modifiesFiles = true\r\n if (analysis.accessesNetwork) accessesNetwork = true\r\n }\r\n\r\n return {\r\n risk: maxRisk,\r\n reason: maxRisk === 'safe' ? 'Readonly or low-risk command' : 'Command may modify files or access network',\r\n baseCommand,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction analyzeSingleCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const parts = trimmed.split(/\\s+/)\r\n const base = parts[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n const firstTwoWords = parts.slice(0, 2).join(' ').toLowerCase()\r\n\r\n if (SAFE_COMMANDS.has(fullCommand) || SAFE_COMMANDS.has(firstTwoWords)) {\r\n return {\r\n risk: 'safe',\r\n reason: 'Known safe command',\r\n baseCommand: base,\r\n modifiesFiles: false,\r\n accessesNetwork: false,\r\n }\r\n }\r\n\r\n const modifiesFiles = matchesAny(fullCommand, firstTwoWords, FILE_MODIFYING_COMMANDS)\r\n const accessesNetwork = matchesAny(fullCommand, firstTwoWords, NETWORK_COMMANDS)\r\n\r\n let risk: CommandRisk = 'safe'\r\n if (modifiesFiles || accessesNetwork) risk = 'moderate'\r\n\r\n return {\r\n risk,\r\n reason: risk === 'safe' ? 'Low-risk command' : modifiesFiles ? 'Modifies filesystem' : 'Accesses network',\r\n baseCommand: base,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction matchesAny(fullCommand: string, firstTwoWords: string, set: Set<string>): boolean {\r\n return set.has(fullCommand) || set.has(firstTwoWords) || Array.from(set).some(cmd => fullCommand.startsWith(cmd))\r\n}\r\n","import { readFile, writeFile, mkdir, appendFile } from 'node:fs/promises'\r\nimport { existsSync } from 'node:fs'\r\nimport { dirname } from 'node:path'\r\nimport { getHistoryPath } from '../config/paths.js'\r\n\r\nexport interface HistoryEntry {\r\n content: string\r\n timestamp: number\r\n type: 'user' | 'paste'\r\n}\r\n\r\nexport interface HistoryConfig {\r\n maxEntries: number\r\n filePath: string\r\n}\r\n\r\nconst DEFAULT_CONFIG: HistoryConfig = {\r\n maxEntries: 1000,\r\n filePath: getHistoryPath(),\r\n}\r\n\r\nexport class HistoryManager {\r\n private entries: HistoryEntry[] = []\r\n private config: HistoryConfig\r\n private cursorIndex = -1\r\n\r\n constructor(config?: Partial<HistoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n }\r\n\r\n addEntry(content: string, type: 'user' | 'paste' = 'user'): void {\r\n const trimmed = content.trim()\r\n if (!trimmed) return\r\n\r\n const lastEntry = this.entries[this.entries.length - 1]\r\n if (lastEntry && lastEntry.content === trimmed) return\r\n\r\n this.entries.push({\r\n content: trimmed,\r\n timestamp: Date.now(),\r\n type,\r\n })\r\n\r\n if (this.entries.length > this.config.maxEntries) {\r\n this.entries = this.entries.slice(-this.config.maxEntries)\r\n }\r\n\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n getEntries(): HistoryEntry[] {\r\n return [...this.entries]\r\n }\r\n\r\n search(query: string): HistoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.entries.filter(e => e.content.toLowerCase().includes(lowerQuery))\r\n }\r\n\r\n getRecent(count: number): HistoryEntry[] {\r\n return this.entries.slice(-count)\r\n }\r\n\r\n clear(): void {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n }\r\n\r\n navigateUp(): string | null {\r\n if (this.entries.length === 0) return null\r\n if (this.cursorIndex > 0) {\r\n this.cursorIndex--\r\n } else if (this.cursorIndex === -1 || this.cursorIndex === this.entries.length) {\r\n this.cursorIndex = this.entries.length - 1\r\n }\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n\r\n navigateDown(): string | null {\r\n if (this.cursorIndex < this.entries.length - 1) {\r\n this.cursorIndex++\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n this.cursorIndex = this.entries.length\r\n return null\r\n }\r\n\r\n async save(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n const dir = dirname(filePath)\r\n\r\n if (!existsSync(dir)) {\r\n await mkdir(dir, { recursive: true })\r\n }\r\n\r\n const lines = this.entries.map(e => JSON.stringify(e)).join('\\n')\r\n await writeFile(filePath, lines, 'utf-8')\r\n }\r\n\r\n async load(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n\r\n if (!existsSync(filePath)) {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n return\r\n }\r\n\r\n const content = await readFile(filePath, 'utf-8')\r\n const lines = content.split('\\n').filter(Boolean)\r\n const loaded: HistoryEntry[] = []\r\n\r\n for (const line of lines) {\r\n try {\r\n const entry = JSON.parse(line) as HistoryEntry\r\n if (entry.content && typeof entry.content === 'string' && entry.timestamp) {\r\n loaded.push({\r\n content: entry.content,\r\n timestamp: entry.timestamp,\r\n type: entry.type ?? 'user',\r\n })\r\n }\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n\r\n this.entries = loaded.slice(-this.config.maxEntries)\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n private resolvePath(): string {\r\n if (this.config.filePath.startsWith('~')) {\r\n return getHistoryPath()\r\n }\r\n return this.config.filePath\r\n }\r\n}\r\n","/**\n * Shared regex for parsing numbered step/subtask lists from AI responses.\n * Matches lines like: \"1. Do something\" or \"2) Do something else\"\n */\nexport const NUMBERED_LIST_REGEX = /(?:^|\\n)\\s*(?:\\d+[\\.|\\)])\\s*(.+?)(?=\\n\\s*(?:\\d+[\\.|\\)])|$)/gs\n","import type { ProviderAdapter } from '../connect/adapter.js'\r\nimport { ToolRegistry } from '../tools/registry.js'\r\nimport type { AgentConfig, SwarmMessage, SwarmResult, SubTask } from './types.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\n\r\nconst MAX_PARALLEL_WORKERS = 3\r\nimport { NUMBERED_LIST_REGEX as SUBTASK_REGEX } from '../utils/decomposition.js'\n\n\r\nexport class SwarmCoordinator {\r\n private agents = new Map<string, AgentConfig>()\r\n private mailbox = new Map<string, SwarmMessage[]>()\r\n private abortController = new AbortController()\r\n\r\n constructor(\r\n private adapter: ProviderAdapter,\r\n private tools: ToolRegistry,\r\n ) {}\r\n\r\n addAgent(config: AgentConfig): void {\r\n this.agents.set(config.id, config)\r\n this.mailbox.set(config.id, [])\r\n }\r\n\r\n removeAgent(id: string): void {\r\n this.agents.delete(id)\r\n this.mailbox.delete(id)\r\n }\r\n\r\n getAgents(): AgentConfig[] {\r\n return Array.from(this.agents.values())\r\n }\r\n\r\n async sendMessage(message: SwarmMessage): Promise<void> {\n if (message.to === '*') {\n for (const [agentId] of this.agents) {\n this.mailbox.get(agentId)?.push({ ...message, to: agentId })\n }\n } else {\n this.mailbox.get(message.to)?.push(message)\n }\n }\n\n getMessages(agentId: string): SwarmMessage[] {\n return this.mailbox.get(agentId) ?? []\n }\n\r\n async executeSwarm(task: string): Promise<SwarmResult[]> {\r\n this.abortController = new AbortController()\r\n const startTime = performance.now()\r\n\r\n const coordinator = this.findAgentByRole('coordinator')\r\n const workers = this.findAgentsByRole('worker')\r\n const reviewers = this.findAgentsByRole('reviewer')\r\n\r\n // Phase 1: Coordinator decomposes the task\r\n const subtasks = coordinator\r\n ? await this.decomposeTask(coordinator, task)\r\n : this.fallbackDecompose(task, workers.length)\r\n\r\n // Phase 2: Assign and execute subtasks in parallel\r\n const assignments = this.assignSubtasks(subtasks, workers)\r\n const workerResults = await this.executeParallel(assignments)\r\n\r\n // Phase 3: Optional review\n let reviewResult: string | undefined\n if (reviewers.length > 0) {\n reviewResult = await this.reviewResults(reviewers[0], workerResults)\n }\n\n // Phase 4: Collect final results\n const results: SwarmResult[] = workerResults.map(wr => ({\n agentId: wr.agentId,\n agentName: wr.agentName,\n task: wr.task,\n result: wr.result,\n success: wr.success,\n duration: performance.now() - startTime,\n turns: wr.turns,\n }))\n\n // Append review as a separate result entry\n if (reviewResult !== undefined && reviewers.length > 0) {\n results.push({\n agentId: reviewers[0].id,\n agentName: reviewers[0].name,\n task: 'Review all worker results',\n result: reviewResult,\n success: true,\n duration: 0,\n turns: 1,\n })\n }\n\n return results\n }\r\n\r\n shutdown(): void {\r\n this.abortController.abort()\r\n for (const [agentId] of this.agents) {\r\n this.mailbox.get(agentId)?.push({\r\n from: 'system',\r\n to: agentId,\r\n type: 'shutdown',\r\n content: 'Shutdown requested',\r\n timestamp: Date.now(),\r\n })\r\n }\r\n }\r\n\r\n private findAgentByRole(role: AgentConfig['role']): AgentConfig | undefined {\r\n for (const agent of this.agents.values()) {\r\n if (agent.role === role) return agent\r\n }\r\n return undefined\r\n }\r\n\r\n private findAgentsByRole(role: AgentConfig['role']): AgentConfig[] {\r\n return Array.from(this.agents.values()).filter(a => a.role === role)\r\n }\r\n\r\n private async decomposeTask(coordinator: AgentConfig, task: string): Promise<SubTask[]> {\r\n const engine = this.createEngine(coordinator)\r\n const prompt = `Decompose the following task into subtasks. Return ONLY a numbered list, one subtask per line. No explanations.\r\n\r\nTask: ${task}\r\n\r\nSubtasks:`\r\n\r\n let decomposition = ''\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (event.type === 'text_delta') decomposition += event.text\r\n if (event.type === 'error') break\r\n }\r\n } catch {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n const matches = [...decomposition.matchAll(SUBTASK_REGEX)]\r\n if (matches.length === 0) {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n return matches.map((m, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: m[1].trim(),\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private fallbackDecompose(task: string, workerCount: number): SubTask[] {\r\n const count = Math.max(1, Math.min(workerCount, MAX_PARALLEL_WORKERS))\r\n return Array.from({ length: count }, (_, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: count === 1 ? task : `Part ${i + 1} of: ${task}`,\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private assignSubtasks(subtasks: SubTask[], workers: AgentConfig[]): Array<{ task: SubTask; worker: AgentConfig }> {\r\n const assignments: Array<{ task: SubTask; worker: AgentConfig }> = []\r\n if (workers.length === 0) return assignments\r\n\r\n subtasks.forEach((task, i) => {\r\n const worker = workers[i % workers.length]\r\n task.assignedTo = worker.id\r\n assignments.push({ task, worker })\r\n })\r\n\r\n return assignments\r\n }\r\n\r\n private async executeParallel(\r\n assignments: Array<{ task: SubTask; worker: AgentConfig }>,\r\n ): Promise<Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }>> {\r\n const chunks: Array<Array<{ task: SubTask; worker: AgentConfig }>> = []\r\n for (let i = 0; i < assignments.length; i += MAX_PARALLEL_WORKERS) {\r\n chunks.push(assignments.slice(i, i + MAX_PARALLEL_WORKERS))\r\n }\r\n\r\n const allResults: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }> = []\r\n\r\n for (const chunk of chunks) {\r\n if (this.abortController.signal.aborted) break\r\n\r\n const settled = await Promise.allSettled(\r\n chunk.map(async ({ task, worker }) => {\r\n task.status = 'running'\r\n const engine = this.createEngine(worker)\r\n\r\n let output = ''\r\n let turns = 0\r\n\r\n try {\r\n for await (const event of engine.run(task.description)) {\r\n if (this.abortController.signal.aborted) break\r\n if (event.type === 'text_delta') output += event.text\r\n if (event.type === 'turn_end') turns = event.turn\r\n if (event.type === 'complete') {\r\n turns = event.result.turns\r\n output = output || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n')\r\n }\r\n }\r\n\r\n task.status = 'completed'\r\n task.result = output\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: output, success: true, turns }\r\n } catch (err) {\r\n task.status = 'failed'\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: (err as Error).message, success: false, turns }\r\n }\r\n }),\r\n )\r\n\r\n for (const r of settled) {\r\n if (r.status === 'fulfilled') allResults.push(r.value)\r\n else allResults.push({ agentId: 'unknown', agentName: 'unknown', task: '', result: r.reason?.message ?? 'Unknown error', success: false, turns: 0 })\r\n }\r\n }\r\n\r\n return allResults\r\n }\r\n\r\n private async reviewResults(reviewer: AgentConfig, results: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean }>): Promise<string> {\n const engine = this.createEngine(reviewer)\n const summary = results.map((r, i) => `Worker ${i + 1} (${r.agentName}): ${r.success ? 'SUCCESS' : 'FAILED'}\\nTask: ${r.task}\\nResult: ${r.result.slice(0, 500)}`).join('\\n\\n')\n\n const prompt = `Review the following worker results and provide a brief assessment:\n\n${summary}\n\nProvide a concise review:`\n\n let reviewText = ''\n try {\n for await (const event of engine.run(prompt)) {\n if (event.type === 'error') break\n if (event.type === 'text_delta' && event.text) reviewText += event.text\n }\n } catch {\n // Review failure is non-critical\n }\n return reviewText || 'Review completed with no output.'\n }\n\r\n private createEngine(agent: AgentConfig): QueryEngine {\r\n const filteredTools = new ToolRegistry()\r\n if (agent.tools) {\r\n for (const toolName of agent.tools) {\r\n const tool = this.tools.get(toolName)\r\n if (tool) filteredTools.register(tool)\r\n }\r\n } else {\r\n for (const tool of this.tools.getAll()) {\r\n if (tool.name !== 'agent') filteredTools.register(tool)\r\n }\r\n }\r\n\r\n return new QueryEngine(\r\n {\r\n maxTurns: agent.maxTurns ?? 10,\r\n systemPrompt: agent.systemPrompt ?? `You are agent \"${agent.name}\" with role \"${agent.role}\". Complete assigned tasks concisely.`,\r\n },\r\n this.adapter,\r\n filteredTools,\r\n )\r\n }\r\n}\r\n","import type { HookDefinition, HookEvent } from './types.js';\r\n\r\nexport class HookRegistry {\r\n private hooks = new Map<string, HookDefinition>();\r\n\r\n register(hook: HookDefinition): void {\r\n this.hooks.set(hook.id, hook);\r\n }\r\n\r\n unregister(id: string): void {\r\n this.hooks.delete(id);\r\n }\r\n\r\n getHooksForEvent(event: HookEvent): HookDefinition[] {\r\n return Array.from(this.hooks.values()).filter(\r\n (h) => h.event === event && h.enabled,\r\n );\r\n }\r\n\r\n getAll(): HookDefinition[] {\r\n return Array.from(this.hooks.values());\r\n }\r\n\r\n loadFromConfig(config: unknown): void {\r\n if (!config || typeof config !== 'object') return;\r\n\r\n const cfg = config as Record<string, unknown>;\r\n const hooksArr = cfg.hooks;\r\n if (!Array.isArray(hooksArr)) return;\r\n\r\n for (const raw of hooksArr) {\r\n if (!raw || typeof raw !== 'object') continue;\r\n const def = raw as Record<string, unknown>;\r\n\r\n const hook: HookDefinition = {\r\n id: String(def.id ?? `hook_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`),\r\n event: String(def.event ?? 'pre_tool_use') as HookEvent,\r\n type: def.type === 'function' ? 'function' : 'command',\r\n command: typeof def.command === 'string' ? def.command : undefined,\r\n handler: typeof def.handler === 'string' ? def.handler : undefined,\r\n condition:\r\n def.condition && typeof def.condition === 'object'\r\n ? (def.condition as { tool_name?: string; pattern?: string })\r\n : undefined,\r\n timeout: typeof def.timeout === 'number' ? def.timeout : 30_000,\r\n enabled: def.enabled !== false,\r\n };\r\n\r\n this.register(hook);\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.hooks.clear();\r\n }\r\n}\r\n","import { exec } from 'node:child_process';\r\nimport type { HookDefinition, HookContext, HookResult } from './types.js';\r\nimport type { HookRegistry } from './registry.js';\r\n\r\nexport class HookExecutor {\r\n private registry: HookRegistry;\r\n\r\n constructor(registry: HookRegistry) {\r\n this.registry = registry;\r\n }\r\n\r\n async executeHooks(event: HookContext['event'], context: HookContext): Promise<HookResult[]> {\r\n const hooks = this.registry.getHooksForEvent(event);\r\n const matched = hooks.filter((h) => this.matchesCondition(h, context));\r\n const results: HookResult[] = [];\r\n\r\n for (const hook of matched) {\r\n const result = await this.executeOne(hook, context);\r\n results.push(result);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private matchesCondition(hook: HookDefinition, context: HookContext): boolean {\r\n if (!hook.condition) return true;\r\n\r\n if (hook.condition.tool_name && context.toolName) {\r\n if (hook.condition.tool_name !== context.toolName) return false;\r\n }\r\n\r\n if (hook.condition.pattern) {\r\n try {\r\n const regex = new RegExp(hook.condition.pattern);\r\n const text = context.toolOutput ?? String(context.toolInput ?? '');\r\n if (!regex.test(text)) return false;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private executeOne(hook: HookDefinition, context: HookContext): Promise<HookResult> {\r\n const start = Date.now();\r\n\r\n if (hook.type === 'function') {\r\n // Function-type hooks: evaluate the handler expression in a sandboxed manner.\r\n // The handler string is treated as a JavaScript expression that receives context.\r\n try {\r\n const handlerFn = new Function('context', `return (${hook.handler})`);\r\n const result = handlerFn(context);\r\n return Promise.resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: typeof result === 'string' ? result : JSON.stringify(result),\r\n duration: Date.now() - start,\r\n });\r\n } catch (err: any) {\r\n return Promise.resolve({\r\n hookId: hook.id,\r\n success: false,\r\n output: `Function handler \"${hook.handler}\" failed: ${err.message}`,\r\n duration: Date.now() - start,\r\n });\r\n }\r\n }\r\n\r\n return this.executeCommand(hook, context, start);\r\n }\r\n\r\n private executeCommand(\r\n hook: HookDefinition,\r\n context: HookContext,\r\n start: number,\r\n ): Promise<HookResult> {\r\n const command = hook.command ?? '';\r\n const env: Record<string, string> = {\r\n ...process.env as Record<string, string>,\r\n CLISKILL_EVENT: context.event,\r\n CLISKILL_TOOL_NAME: context.toolName ?? '',\r\n CLISKILL_WORKING_DIR: context.workingDirectory,\r\n };\r\n\r\n if (context.error) {\r\n env.CLISKILL_ERROR_MESSAGE = context.error.message;\r\n }\r\n\r\n return new Promise<HookResult>((resolve) => {\r\n exec(\r\n command,\r\n {\r\n timeout: hook.timeout,\r\n cwd: context.workingDirectory,\r\n env,\r\n },\r\n (error, stdout, stderr) => {\r\n const duration = Date.now() - start;\r\n if (error) {\r\n resolve({\r\n hookId: hook.id,\r\n success: false,\r\n output: stdout?.trim() ?? '',\r\n error: stderr?.trim() || error.message,\r\n duration,\r\n });\r\n } else {\r\n resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: stdout?.trim() ?? '',\r\n duration,\r\n });\r\n }\r\n },\r\n );\r\n });\r\n }\r\n}\r\n","export interface ParsedCommand {\r\n command: string;\r\n args: string[];\r\n operators: string[];\r\n subCommands: ParsedCommand[];\r\n redirections: Redirection[];\r\n envVars: Record<string, string>;\r\n isBackground: boolean;\r\n isSubshell: boolean;\r\n}\r\n\r\nexport interface Redirection {\r\n type: '>' | '>>' | '<' | '2>' | '2>>' | '&>' | '|';\r\n target: string;\r\n}\r\n\r\nexport interface CommandAnalysis {\r\n commands: string[];\r\n isPipe: boolean;\r\n isChained: boolean;\r\n hasRedirection: boolean;\r\n hasSubshell: boolean;\r\n isBackground: boolean;\r\n envVarCount: number;\r\n estimatedRisk: 'safe' | 'moderate' | 'dangerous';\r\n}\r\n\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'cat', 'pwd', 'echo', 'head', 'tail', 'grep', 'find',\r\n 'wc', 'sort', 'uniq', 'date', 'whoami', 'hostname', 'uname',\r\n 'which', 'type', 'file', 'stat', 'df', 'du', 'ps', 'top',\r\n 'env', 'printenv', 'id', 'dirname', 'basename', 'realpath',\r\n]);\r\n\r\nconst MODERATE_COMMANDS = new Set([\r\n 'curl', 'wget', 'npm', 'pip', 'git', 'make', 'docker',\r\n 'node', 'python', 'python3', 'java', 'go', 'cargo',\r\n 'apt', 'yum', 'brew', 'npx', 'yarn', 'pnpm',\r\n]);\r\n\r\nconst DANGEROUS_COMMANDS = new Set([\r\n 'rm', 'mv', 'chmod', 'chown', 'sudo', 'su', 'dd', 'mkfs',\r\n 'format', 'fdisk', 'mkfs.ext4', 'mkfs.ntfs', 'shutdown',\r\n 'reboot', 'halt', 'poweroff', 'kill', 'killall',\r\n]);\r\n\r\nconst REDIRECTION_RE = /\\s(&?>{1,2}|2>>?|<{1,2})\\s*(\\S+)/g;\r\nconst ENV_VAR_RE = /^([A-Za-z_][A-Za-z0-9_]*)=(\\S*)\\s+/;\r\nconst SUBSHELL_RE = /\\$\\(([^)]+)\\)/;\r\nconst OPERATOR_SPLIT_RE = /\\s*(\\|\\||&&|;|\\|)\\s*/;\r\n\r\nexport function parseCommand(input: string): ParsedCommand {\r\n const trimmed = input.trim();\r\n let remaining = trimmed;\r\n\r\n const envVars: Record<string, string> = {};\r\n let envMatch: RegExpExecArray | null;\r\n while ((envMatch = ENV_VAR_RE.exec(remaining)) !== null) {\r\n envVars[envMatch[1]] = envMatch[2];\r\n remaining = remaining.slice(envMatch[0].length);\r\n }\r\n\r\n const isBackground = /(?:^|\\s)&\\s*$/.test(remaining);\r\n if (isBackground) {\r\n remaining = remaining.replace(/&\\s*$/, '').trim();\r\n }\r\n\r\n const redirections: Redirection[] = [];\r\n let redirMatch: RegExpExecArray | null;\r\n while ((redirMatch = REDIRECTION_RE.exec(remaining)) !== null) {\r\n const kind = redirMatch[1];\r\n const target = redirMatch[2];\r\n if (kind === '|') {\r\n redirections.push({ type: '|', target });\r\n } else if (kind === '>>') {\r\n redirections.push({ type: '>>', target });\r\n } else if (kind === '2>>') {\r\n redirections.push({ type: '2>>', target });\r\n } else if (kind === '2>') {\r\n redirections.push({ type: '2>', target });\r\n } else if (kind === '&>') {\r\n redirections.push({ type: '&>', target });\r\n } else if (kind === '<' || kind === '<<') {\r\n redirections.push({ type: '<', target });\r\n } else {\r\n redirections.push({ type: '>', target });\r\n }\r\n }\r\n remaining = remaining.replace(REDIRECTION_RE, ' ').trim();\r\n\r\n const isSubshell = SUBSHELL_RE.test(remaining);\r\n const subCommands: ParsedCommand[] = [];\r\n let subMatch: RegExpExecArray | null;\r\n const subshellGlobal = /\\$\\(([^)]+)\\)/g;\r\n while ((subMatch = subshellGlobal.exec(remaining)) !== null) {\r\n subCommands.push(parseCommand(subMatch[1]));\r\n }\r\n\r\n const parts = remaining.split(OPERATOR_SPLIT_RE).filter(Boolean);\r\n const operators: string[] = [];\r\n const commandParts: string[] = [];\r\n\r\n for (const part of parts) {\r\n if (['||', '&&', ';', '|'].includes(part)) {\r\n operators.push(part);\r\n } else {\r\n commandParts.push(part);\r\n }\r\n }\r\n\r\n let command = '';\r\n let args: string[] = [];\r\n\r\n if (commandParts.length > 0) {\r\n const first = commandParts[0];\r\n const tokens = tokenize(first);\r\n command = tokens[0] ?? '';\r\n args = tokens.slice(1);\r\n }\r\n\r\n const parsedSubCommands = commandParts.slice(1).map((cp) => {\r\n const tokens = tokenize(cp);\r\n return {\r\n command: tokens[0] ?? '',\r\n args: tokens.slice(1),\r\n operators: [],\r\n subCommands: [],\r\n redirections: [],\r\n envVars: {},\r\n isBackground: false,\r\n isSubshell: false,\r\n } satisfies ParsedCommand;\r\n });\r\n\r\n return {\r\n command,\r\n args,\r\n operators,\r\n subCommands: [...subCommands, ...parsedSubCommands],\r\n redirections,\r\n envVars,\r\n isBackground,\r\n isSubshell,\r\n };\r\n}\r\n\r\nexport function analyzeCommand(input: string): CommandAnalysis {\r\n const parsed = parseCommand(input);\r\n const allCommands = collectCommands(parsed);\r\n\r\n const isPipe = parsed.operators.includes('|');\r\n const isChained = parsed.operators.some((op) => op === '&&' || op === '||' || op === ';');\r\n const hasRedirection = parsed.redirections.length > 0;\r\n const hasSubshell = parsed.isSubshell || parsed.subCommands.length > 0;\r\n const envVarCount = Object.keys(parsed.envVars).length;\r\n\r\n const estimatedRisk = determineRisk(allCommands, isPipe, isChained, hasRedirection, hasSubshell);\r\n\r\n return {\r\n commands: allCommands,\r\n isPipe,\r\n isChained,\r\n hasRedirection,\r\n hasSubshell,\r\n isBackground: parsed.isBackground,\r\n envVarCount,\r\n estimatedRisk,\r\n };\r\n}\r\n\r\nfunction collectCommands(parsed: ParsedCommand): string[] {\r\n const commands: string[] = [];\r\n if (parsed.command) {\r\n commands.push(parsed.command);\r\n }\r\n for (const sub of parsed.subCommands) {\r\n commands.push(...collectCommands(sub));\r\n }\r\n return commands;\r\n}\r\n\r\nfunction determineRisk(\r\n commands: string[],\r\n isPipe: boolean,\r\n isChained: boolean,\r\n hasRedirection: boolean,\r\n hasSubshell: boolean,\r\n): 'safe' | 'moderate' | 'dangerous' {\r\n let hasDangerous = false;\r\n let hasModerate = false;\r\n\r\n for (const cmd of commands) {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n if (DANGEROUS_COMMANDS.has(base)) hasDangerous = true;\r\n else if (MODERATE_COMMANDS.has(base)) hasModerate = true;\r\n }\r\n\r\n if (hasDangerous) return 'dangerous';\r\n if (hasModerate) return 'moderate';\r\n\r\n const allSafe = commands.every((cmd) => {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n return SAFE_COMMANDS.has(base);\r\n });\r\n\r\n if (allSafe && commands.length > 0) return 'safe';\r\n\r\n if (isPipe || isChained || hasRedirection || hasSubshell) {\r\n return 'moderate';\r\n }\r\n\r\n return 'moderate';\r\n}\r\n\r\nfunction tokenize(segment: string): string[] {\r\n const tokens: string[] = [];\r\n let current = '';\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let i = 0; i < segment.length; i++) {\r\n const ch = segment[i];\r\n\r\n if (ch === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (ch === '\"' && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (ch === '\\\\' && !inSingle && i + 1 < segment.length) {\r\n current += segment[i + 1];\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/\\s/.test(ch) && !inSingle && !inDouble) {\r\n if (current) {\r\n tokens.push(current);\r\n current = '';\r\n }\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n\r\n if (current) tokens.push(current);\r\n return tokens;\r\n}\r\n","import type { TaskManager } from './manager.js'\r\nimport type { ProviderAdapter } from '../connect/adapter.js'\r\nimport type { ToolRegistry } from '../tools/registry.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\nimport { exec } from 'node:child_process'\r\n\r\nexport async function executeAgentTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n adapter: ProviderAdapter,\r\n tools: ToolRegistry,\r\n prompt: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n const engine = new QueryEngine(\r\n { maxTurns: 20, systemPrompt: 'You are a background agent. Complete the task concisely.' },\r\n adapter,\r\n tools,\r\n )\r\n\r\n let finalText = ''\r\n let turnsUsed = 0\r\n\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n return\r\n }\r\n\r\n switch (event.type) {\r\n case 'text_delta':\r\n finalText += event.text\r\n break\r\n case 'turn_end':\r\n turnsUsed = event.turn\r\n manager.updateProgress(taskId, Math.min(90, turnsUsed * 10))\r\n break\r\n case 'complete':\r\n finalText = finalText || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n') || 'Task completed'\r\n break\r\n case 'error':\r\n manager.setError(taskId, event.error.message)\r\n return\r\n }\r\n }\r\n\r\n manager.setResult(taskId, finalText || 'Task completed (no output)')\r\n } catch (err) {\r\n manager.setError(taskId, (err as Error).message)\r\n }\r\n}\r\n\r\nexport async function executeShellTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n command: string,\r\n cwd: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n return new Promise<void>((resolve) => {\r\n const child = exec(command, { cwd, signal }, (error, stdout, stderr) => {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n resolve()\r\n return\r\n }\r\n\r\n if (error) {\r\n manager.setError(taskId, stderr || error.message)\r\n resolve()\r\n return\r\n }\r\n\r\n manager.setResult(taskId, stdout || '(no output)')\r\n resolve()\r\n })\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', () => {\r\n child.kill('SIGTERM')\r\n }, { once: true })\r\n }\r\n })\r\n}\r\n"],"mappings":"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","names":["readFile","writeFile","mkdir","existsSync","DEFAULT_CONFIG","existsSync","mkdir","writeFile","readFile","resolve","SAFE_COMMANDS","exec","resolve"]}
@@ -16,7 +16,7 @@ import {
16
16
  getTmpDir,
17
17
  migrateLegacyConfig,
18
18
  resolveConfigPath
19
- } from "./chunk-S7IQHES2.js";
19
+ } from "./chunk-CISBSDJM.js";
20
20
  export {
21
21
  ensureDataDir,
22
22
  getConfigPath,
@@ -36,4 +36,4 @@ export {
36
36
  migrateLegacyConfig,
37
37
  resolveConfigPath
38
38
  };
39
- //# sourceMappingURL=paths-FVFXSRUD.js.map
39
+ //# sourceMappingURL=paths-5LG4XBLZ.js.map