agentix-cli 0.29.0 → 0.30.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.
Files changed (69) hide show
  1. package/dist/{agent-LS4CZPJ6.js → agent-SPE7Q7MD.js} +2 -2
  2. package/dist/{board-dashboard-6QQCKFB3.js → board-dashboard-K4DM32SO.js} +2 -2
  3. package/dist/{chunk-LNWX4MPX.js → chunk-42DCRKUD.js} +130 -129
  4. package/dist/chunk-42DCRKUD.js.map +1 -0
  5. package/dist/chunk-45BLFNDG.js +170 -0
  6. package/dist/chunk-45BLFNDG.js.map +1 -0
  7. package/dist/{chunk-SBCZLZG3.js → chunk-AUNDQPDR.js} +2 -2
  8. package/dist/chunk-DWADWDMU.js +96 -0
  9. package/dist/chunk-DWADWDMU.js.map +1 -0
  10. package/dist/{chunk-3QVOWDHZ.js → chunk-EL3J74N2.js} +2 -2
  11. package/dist/{chunk-AE2LDMZU.js → chunk-GK7XAM3D.js} +2 -2
  12. package/dist/chunk-GK7XAM3D.js.map +1 -0
  13. package/dist/{chunk-OTXDKKEU.js → chunk-GUBMLV34.js} +134 -122
  14. package/dist/chunk-GUBMLV34.js.map +1 -0
  15. package/dist/{chunk-Z2Y24ETP.js → chunk-IVQO43U2.js} +2 -2
  16. package/dist/{chunk-F5AEXRPR.js → chunk-MGNJWBVP.js} +2 -2
  17. package/dist/{chunk-6F2IKJ2F.js → chunk-Q7CZIRBB.js} +2 -2
  18. package/dist/{chunk-UYSNGBDT.js → chunk-UU4WOZNR.js} +2 -2
  19. package/dist/{chunk-JIOLJIBM.js → chunk-V4HURNMX.js} +2 -2
  20. package/dist/cli.js +1 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/index.d.ts +161 -155
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/program-DWZAI4GY.js +2 -0
  26. package/dist/query-3HXGBKGM.js +2 -0
  27. package/dist/registry-EJRWAJYG.js +2 -0
  28. package/dist/{request-planner-BKT6RZKX.js → request-planner-BCOXUAPA.js} +2 -2
  29. package/dist/{review-candidates-F3OFYTCZ.js → review-candidates-O2PS7L3B.js} +2 -2
  30. package/dist/routing-5K7PGHPL.js +2 -0
  31. package/dist/{seat-ZVHXNAEN.js → seat-FZRNRAHQ.js} +2 -2
  32. package/dist/{select-L7C52URW.js → select-SOJYFAMI.js} +2 -2
  33. package/dist/wiki-34XVI32N.js +2 -0
  34. package/dist/workspace-setup-G6KGWPHY.js +2 -0
  35. package/package.json +1 -1
  36. package/dist/chunk-67Q4DCPS.js +0 -54
  37. package/dist/chunk-67Q4DCPS.js.map +0 -1
  38. package/dist/chunk-AE2LDMZU.js.map +0 -1
  39. package/dist/chunk-I3SIXTJO.js +0 -44
  40. package/dist/chunk-I3SIXTJO.js.map +0 -1
  41. package/dist/chunk-LNWX4MPX.js.map +0 -1
  42. package/dist/chunk-OTXDKKEU.js.map +0 -1
  43. package/dist/chunk-XPXO5K4L.js +0 -164
  44. package/dist/chunk-XPXO5K4L.js.map +0 -1
  45. package/dist/program-I4J63BQ7.js +0 -2
  46. package/dist/query-R7EI3VGX.js +0 -2
  47. package/dist/registry-UJIJBLUR.js +0 -2
  48. package/dist/routing-S5WSFIAD.js +0 -2
  49. package/dist/wiki-5YQI4YKM.js +0 -2
  50. package/dist/workspace-setup-B3F3TUDE.js +0 -2
  51. /package/dist/{agent-LS4CZPJ6.js.map → agent-SPE7Q7MD.js.map} +0 -0
  52. /package/dist/{board-dashboard-6QQCKFB3.js.map → board-dashboard-K4DM32SO.js.map} +0 -0
  53. /package/dist/{chunk-SBCZLZG3.js.map → chunk-AUNDQPDR.js.map} +0 -0
  54. /package/dist/{chunk-3QVOWDHZ.js.map → chunk-EL3J74N2.js.map} +0 -0
  55. /package/dist/{chunk-Z2Y24ETP.js.map → chunk-IVQO43U2.js.map} +0 -0
  56. /package/dist/{chunk-F5AEXRPR.js.map → chunk-MGNJWBVP.js.map} +0 -0
  57. /package/dist/{chunk-6F2IKJ2F.js.map → chunk-Q7CZIRBB.js.map} +0 -0
  58. /package/dist/{chunk-UYSNGBDT.js.map → chunk-UU4WOZNR.js.map} +0 -0
  59. /package/dist/{chunk-JIOLJIBM.js.map → chunk-V4HURNMX.js.map} +0 -0
  60. /package/dist/{program-I4J63BQ7.js.map → program-DWZAI4GY.js.map} +0 -0
  61. /package/dist/{query-R7EI3VGX.js.map → query-3HXGBKGM.js.map} +0 -0
  62. /package/dist/{registry-UJIJBLUR.js.map → registry-EJRWAJYG.js.map} +0 -0
  63. /package/dist/{request-planner-BKT6RZKX.js.map → request-planner-BCOXUAPA.js.map} +0 -0
  64. /package/dist/{review-candidates-F3OFYTCZ.js.map → review-candidates-O2PS7L3B.js.map} +0 -0
  65. /package/dist/{routing-S5WSFIAD.js.map → routing-5K7PGHPL.js.map} +0 -0
  66. /package/dist/{seat-ZVHXNAEN.js.map → seat-FZRNRAHQ.js.map} +0 -0
  67. /package/dist/{select-L7C52URW.js.map → select-SOJYFAMI.js.map} +0 -0
  68. /package/dist/{wiki-5YQI4YKM.js.map → wiki-34XVI32N.js.map} +0 -0
  69. /package/dist/{workspace-setup-B3F3TUDE.js.map → workspace-setup-G6KGWPHY.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent/skills/registry.ts","../src/agent/skills/generator.ts","../src/runtime/enhance.ts","../src/runtime/pipeline.ts","../src/runtime/server.ts","../src/git/manager.ts","../src/repl/engine.ts","../src/repl/session.ts","../src/repl/commands.ts","../src/repl/renderer.ts"],"sourcesContent":["// agentx — public library API\n\n// Core agent orchestrator\nexport {\n createAgentContext,\n generate,\n generateStream,\n type AgentContext,\n type GenerateOptions,\n type GenerateResult,\n type GenerateStreamEvent,\n} from \"./agent\"\n\n// Providers\nexport {\n createProvider,\n ClaudeProvider,\n ClaudeCodeProvider,\n type ProviderName,\n} from \"./agent/providers\"\n\nexport type {\n AgentProvider,\n AgentConfig,\n OutputType,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n ContentBlock,\n RawGenerationResult,\n} from \"./agent/providers/types\"\n\nexport { agentConfigSchema, OUTPUT_TYPES, outputTypeDescriptions } from \"./agent/providers/types\"\n\n// Context\nexport { detectTechStack, formatTechStack, type TechStack } from \"./agent/context/tech-stack\"\nexport { detectSchemas, formatSchemas, type ProjectSchemas } from \"./agent/context/schema\"\nexport { gatherContext7Docs } from \"./agent/context/context7\"\n\n// Skills\nexport { loadLocalSkills, matchSkillsToTask, parseSkillFile, parseSkillContent } from \"./agent/skills/loader\"\nexport { installSkillPackage, generateSkillMd, listInstalledSkills } from \"./agent/skills/registry\"\nexport { generateSkill } from \"./agent/skills/generator\"\n\n// Outputs\nexport { resolveOutputType, OUTPUT_CONFIGS, type OutputConfig } from \"./agent/outputs/types\"\n\n// Tools\nexport { getAnthropicTools, getLegacyTools, formatToolsForSystemPrompt, ALL_TOOL_NAMES } from \"./agent/tools\"\nexport { ToolExecutor, type ToolCallInput, type ToolResult, type ToolExecutorOptions } from \"./agent/tools\"\n\n// Runtime\nexport {\n AgentXRuntime,\n Memory,\n HealEngine,\n EnhanceEngine,\n Pipeline,\n type MemoryEntry,\n type MemoryStore,\n type HealConfig,\n type HealResult,\n type EnhanceConfig,\n type EnhanceResult,\n type PipelineRequest,\n type PipelineResponse,\n type MiddlewareFn,\n type RuntimeConfig,\n} from \"./runtime\"\n\n// MCP\nexport { startMcpServer } from \"./mcp\"\n\n// Memory hierarchy\nexport { MemoryHierarchy } from \"./memory\"\nexport { ContextBuilder, resolveAtImports, loadProjectInstructions } from \"./memory\"\n\n// Observability\nexport { UsageTracker, globalTracker, debug, setDebug, isDebug, exportSession } from \"./observability\"\nexport type { StepUsage, ModelUsage, UsageSummary } from \"./observability\"\n\n// Permissions\nexport { PermissionManager, globalPermissions, permissionModeSchema, permissionConfigSchema, PERMISSION_MODES } from \"./permissions\"\nexport type { PermissionMode, PermissionConfig, PermissionRule, PermissionAction } from \"./permissions\"\n\n// Hooks\nexport { HookRegistry, loadHooks, globalHooks, HOOK_EVENTS, BLOCKING_EVENTS } from \"./hooks\"\nexport type { HookEvent, HookDefinition, HookContext, HookResult, HookHandler } from \"./hooks\"\n\n// Git\nexport { GitManager } from \"./git\"\nexport type { GitStatus, GitLogEntry, GitDiffFile, GitCommitResult } from \"./git\"\n\n// REPL\nexport { ReplEngine, createSession, saveSession, loadSession, loadLatestSession, listSessions } from \"./repl\"\nexport { isCommand, parseCommand, getCommand, registerCommand } from \"./repl\"\nexport type { ReplOptions, Session } from \"./repl\"\n\n// A2A\nexport { A2AServer } from \"./a2a\"\nexport type { A2AServerConfig, AgentCard, Task, TaskState, TaskMessage, TaskArtifact, TaskStatusUpdate } from \"./a2a\"\n\n// Daemon\nexport { AgentXDaemon } from \"./daemon\"\nexport { loadDaemonConfig, validateWorkspaces, daemonConfigSchema } from \"./daemon/config\"\nexport type { DaemonConfig, AgentDef, CronJobDef, MeshPeer } from \"./daemon/config\"\n\n// Agent Registry\nexport { AgentRegistry } from \"./agents/registry\"\nexport { executeTask, executeClaudeCode, executeOpenCodeCli, executeSdk, executeOrchestrator } from \"./agents/runtime\"\nexport type { AgentTask, AgentResponse } from \"./agents/runtime\"\n\n// Channels\nexport { MessageRouter } from \"./channels/router\"\nexport { TelegramAdapter } from \"./channels/telegram\"\nexport { WhatsAppAdapter } from \"./channels/whatsapp\"\nexport type { ChannelAdapter, IncomingMessage, OutgoingMessage } from \"./channels/types\"\n\n// Crons\nexport { CronScheduler } from \"./crons/scheduler\"\nexport type { CronJobState, CronRunResult } from \"./crons/types\"\n\n// A2A Mesh\nexport { A2AMesh } from \"./a2a/mesh\"\nexport { A2AClient } from \"./a2a/client\"\n\n// Wiki Knowledge Base\nexport { WikiStore } from \"./wiki\"\nexport type { WikiArticle, WikiArticleMeta, WikiEntry, WikiIndex, WikiAccess } from \"./wiki\"\n\n// Intent Knowledge Graph\nexport { GraphStore, STARTER_SCHEMA } from \"./graph\"\nexport type {\n GraphSchema,\n GraphNode,\n LevelDef,\n AxisDef,\n AxisType,\n Classification,\n ClassificationSource,\n ClassificationStatus,\n FingerprintEntry,\n NodesFile,\n IndexFile,\n GraphStoreOptions,\n} from \"./graph\"\n\n// Provider Capabilities\nexport { PROVIDER_CAPABILITIES, checkCapabilities } from \"./agent/providers/capabilities\"\nexport type { ProviderCapabilities } from \"./agent/providers/capabilities\"\n\n// Auth & Utils\nexport {\n loadAuthConfig,\n saveAuthConfig,\n resolveToken,\n ensureCredentials,\n runModelSetup,\n type AuthConfig,\n} from \"./utils/auth-store\"\n\nexport { logger } from \"./utils/logger\"\nexport { handleError } from \"./utils/handle-error\"\nexport { getPackageInfo } from \"./utils/get-package-info\"\n","import { execa } from \"execa\"\nimport { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport fetch from \"node-fetch\"\nimport { logger } from \"@/utils/logger\"\nimport type { Skill, SkillPackage } from \"./types\"\nimport { parseSkillContent } from \"./loader\"\n\n// --- skills.sh integration: install, list, and search skills ---\n\nconst SKILLS_SH_API = \"https://skills.sh\"\n\nexport async function installSkillPackage(\n packageId: string,\n cwd: string\n): Promise<Skill[]> {\n // packageId format: \"owner/repo\" or \"owner/repo/skill-name\"\n const parts = packageId.split(\"/\")\n if (parts.length < 2) {\n throw new Error(`Invalid skill package ID: ${packageId}. Expected format: owner/repo`)\n }\n\n const owner = parts[0]\n const repo = parts[1]\n const specificSkill = parts[2] // optional\n\n // Try using npx skills add first (official CLI)\n try {\n const skillArg = specificSkill ? `${owner}/${repo}/${specificSkill}` : `${owner}/${repo}`\n await execa(\"npx\", [\"-y\", \"skills\", \"add\", skillArg], {\n cwd,\n stdio: \"pipe\",\n })\n\n logger.success(`Installed skill package: ${packageId}`)\n\n // Load the installed skills\n const skillsDir = path.resolve(cwd, \".skills\", `${owner}_${repo}`)\n if (existsSync(skillsDir)) {\n return await loadInstalledSkills(skillsDir, packageId)\n }\n\n // Also check the standard .skills directory structure\n const altDir = path.resolve(cwd, \".skills\")\n if (existsSync(altDir)) {\n return await loadInstalledSkills(altDir, packageId)\n }\n\n return []\n } catch {\n // Fallback: fetch directly from GitHub\n logger.info(`Fetching skills directly from GitHub: ${owner}/${repo}`)\n return await fetchFromGitHub(owner, repo, specificSkill, cwd)\n }\n}\n\nasync function fetchFromGitHub(\n owner: string,\n repo: string,\n specificSkill: string | undefined,\n cwd: string\n): Promise<Skill[]> {\n const skills: Skill[] = []\n\n try {\n // Fetch repo tree to find SKILL.md files\n const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/main?recursive=1`\n const response = await fetch(treeUrl)\n\n if (!response.ok) {\n throw new Error(`GitHub API error: ${response.status}`)\n }\n\n const data = (await response.json()) as { tree: { path: string; type: string }[] }\n const skillFiles = data.tree.filter(\n (item) => item.type === \"blob\" && item.path.endsWith(\"SKILL.md\")\n )\n\n if (specificSkill) {\n const specific = skillFiles.find(\n (f) =>\n f.path.includes(`/${specificSkill}/`) || f.path === `${specificSkill}/SKILL.md`\n )\n if (specific) {\n const skill = await fetchAndSaveSkill(owner, repo, specific.path, cwd)\n if (skill) skills.push(skill)\n }\n } else {\n for (const file of skillFiles) {\n const skill = await fetchAndSaveSkill(owner, repo, file.path, cwd)\n if (skill) skills.push(skill)\n }\n }\n } catch (error: any) {\n logger.error(`Failed to fetch skills from GitHub: ${error.message}`)\n }\n\n return skills\n}\n\nasync function fetchAndSaveSkill(\n owner: string,\n repo: string,\n filePath: string,\n cwd: string\n): Promise<Skill | null> {\n try {\n const rawUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/${filePath}`\n const response = await fetch(rawUrl)\n\n if (!response.ok) return null\n\n const content = await response.text()\n const skill = parseSkillContent(content)\n\n if (skill) {\n skill.source = \"remote\"\n skill.packageId = `${owner}/${repo}`\n\n // Save locally\n const skillDir = path.dirname(filePath)\n const localDir = path.resolve(cwd, \".skills\", `${owner}_${repo}`, skillDir)\n await fs.mkdir(localDir, { recursive: true })\n await fs.writeFile(path.resolve(localDir, \"SKILL.md\"), content)\n skill.path = path.resolve(localDir, \"SKILL.md\")\n }\n\n return skill\n } catch {\n return null\n }\n}\n\nasync function loadInstalledSkills(dir: string, packageId: string): Promise<Skill[]> {\n const skills: Skill[] = []\n const { default: fg } = await import(\"fast-glob\")\n\n const skillFiles = await fg.glob(\"**/SKILL.md\", {\n cwd: dir,\n deep: 5,\n })\n\n for (const file of skillFiles) {\n try {\n const fullPath = path.resolve(dir, file)\n const content = await fs.readFile(fullPath, \"utf8\")\n const skill = parseSkillContent(content)\n if (skill) {\n skill.source = \"remote\"\n skill.path = fullPath\n skill.packageId = packageId\n skills.push(skill)\n }\n } catch {\n // Skip broken skill files\n }\n }\n\n return skills\n}\n\nexport async function generateSkillMd(\n name: string,\n description: string,\n instructions: string,\n tags?: string[],\n globs?: string[]\n): Promise<string> {\n const frontmatter: string[] = [\n \"---\",\n `name: ${name}`,\n `description: ${description}`,\n ]\n\n if (tags?.length) {\n frontmatter.push(\"tags:\")\n for (const tag of tags) {\n frontmatter.push(` - ${tag}`)\n }\n }\n\n if (globs?.length) {\n frontmatter.push(\"globs:\")\n for (const glob of globs) {\n frontmatter.push(` - ${glob}`)\n }\n }\n\n frontmatter.push(\"---\")\n\n return `${frontmatter.join(\"\\n\")}\\n\\n${instructions}`\n}\n\nexport async function listInstalledSkills(cwd: string): Promise<Skill[]> {\n const { loadLocalSkills } = await import(\"./loader\")\n return loadLocalSkills(cwd)\n}\n","import type { AgentProvider, GenerationMessage } from \"../providers/types\"\nimport type { TechStack } from \"../context/tech-stack\"\nimport { formatTechStack } from \"../context/tech-stack\"\nimport { generateSkillMd } from \"./registry\"\nimport type { Skill } from \"./types\"\n\n// --- Generate new skills using AI ---\n\nexport async function generateSkill(\n provider: AgentProvider,\n name: string,\n description: string,\n techStack: TechStack,\n options?: { tags?: string[]; outputType?: string }\n): Promise<{ skill: Skill; content: string }> {\n const systemPrompt = `You are a skill author for the Agent Skills ecosystem (skills.sh).\nYou create high-quality SKILL.md files that provide reusable instructions for AI coding agents.\n\nA skill is a markdown document with YAML frontmatter that teaches an agent how to perform a specific task.\nSkills should be:\n- Clear and actionable\n- Tech-stack aware (use the right patterns for the project)\n- Complete but concise\n- Include examples where helpful\n- Follow the Agent Skills specification\n\nThe project's tech stack:\n${formatTechStack(techStack)}\n\nOutput ONLY the SKILL.md content (frontmatter + markdown instructions). Do not wrap in code fences.`\n\n const messages: GenerationMessage[] = [\n { role: \"system\", content: systemPrompt },\n {\n role: \"user\",\n content: `Create a skill called \"${name}\" with this description: \"${description}\"${\n options?.tags?.length ? `\\nTags: ${options.tags.join(\", \")}` : \"\"\n }${options?.outputType ? `\\nPrimary output type: ${options.outputType}` : \"\"}\n\nThe skill should contain detailed instructions for an AI agent to follow when performing this task in a project with the above tech stack. Include:\n1. Step-by-step instructions\n2. Code patterns and conventions to follow\n3. Common pitfalls to avoid\n4. Examples where helpful`,\n },\n ]\n\n const result = await provider.generate(messages, {\n temperature: 0.7,\n maxTokens: 4096,\n })\n\n const skillContent = result.content.trim()\n\n // Parse the generated content\n const skill: Skill = {\n frontmatter: { name, description },\n instructions: skillContent,\n source: \"generated\",\n }\n\n // Try to parse the frontmatter from generated content\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/)\n if (frontmatterMatch) {\n skill.instructions = frontmatterMatch[2].trim()\n }\n\n return { skill, content: skillContent }\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { createProvider, type ProviderName } from \"@/agent/providers\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\nimport { detectTechStack, formatTechStack } from \"@/agent/context/tech-stack\"\nimport { Memory, type MemoryEntry, type LearnedPattern } from \"./memory\"\nimport { generateSkillMd } from \"@/agent/skills/registry\"\n\n// --- Self-Enhancement: auto-create skills from successful patterns ---\n// After enough successful generations with positive feedback,\n// the system distills what worked into reusable skills.\n// It also detects degradation and triggers skill upgrades.\n\nexport interface EnhanceConfig {\n enabled: boolean\n autoSkills: boolean // Auto-create skills from patterns\n minFrequency: number // Min pattern frequency before creating a skill\n provider: ProviderName\n model?: string\n apiKey?: string\n}\n\nexport interface EnhanceResult {\n skillsCreated: string[]\n skillsUpdated: string[]\n insights: string[]\n}\n\nconst DEFAULT_CONFIG: EnhanceConfig = {\n enabled: true,\n autoSkills: true,\n minFrequency: 3,\n provider: \"claude-code\",\n}\n\nexport class EnhanceEngine {\n private config: EnhanceConfig\n\n constructor(\n private cwd: string,\n private memory: Memory,\n config?: Partial<EnhanceConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n }\n\n async enhance(): Promise<EnhanceResult> {\n if (!this.config.enabled) {\n return { skillsCreated: [], skillsUpdated: [], insights: [] }\n }\n\n const result: EnhanceResult = {\n skillsCreated: [],\n skillsUpdated: [],\n insights: [],\n }\n\n // 1. Analyze patterns and create skills\n if (this.config.autoSkills) {\n const newSkills = await this.createSkillsFromPatterns()\n result.skillsCreated.push(...newSkills)\n }\n\n // 2. Analyze failure patterns for insights\n const insights = this.analyzeFailures()\n result.insights.push(...insights)\n\n // 3. Detect preference patterns\n const prefInsights = this.analyzePreferences()\n result.insights.push(...prefInsights)\n\n return result\n }\n\n private async createSkillsFromPatterns(): Promise<string[]> {\n const patterns = this.memory.getPatterns()\n const eligiblePatterns = patterns.filter(\n (p) => p.frequency >= this.config.minFrequency\n )\n\n if (!eligiblePatterns.length) return []\n\n const created: string[] = []\n const skillsDir = path.resolve(this.cwd, \".skills\", \"_auto\")\n\n for (const pattern of eligiblePatterns.slice(0, 3)) {\n const skillName = patternToSkillName(pattern)\n const skillPath = path.resolve(skillsDir, skillName, \"SKILL.md\")\n\n // Don't recreate existing skills\n if (existsSync(skillPath)) continue\n\n try {\n const content = await this.generateSkillFromPattern(pattern)\n if (content) {\n await fs.mkdir(path.dirname(skillPath), { recursive: true })\n await fs.writeFile(skillPath, content, \"utf8\")\n created.push(skillName)\n }\n } catch {\n // Skip failed skill generation\n }\n }\n\n return created\n }\n\n private async generateSkillFromPattern(pattern: LearnedPattern): Promise<string | null> {\n // Get examples of successful generations matching this pattern\n const recentSuccesses = this.memory\n .getRecentGenerations(20)\n .filter((e) => e.success && e.userFeedback !== \"negative\")\n .slice(0, 3)\n\n if (!recentSuccesses.length) return null\n\n const provider = createProvider(this.config.provider, this.config.apiKey)\n const techStack = await detectTechStack(this.cwd)\n\n const messages: GenerationMessage[] = [\n {\n role: \"system\",\n content: `You are a skill author. Create a SKILL.md file that captures a successful pattern.\nTech stack: ${formatTechStack(techStack)}\nOutput ONLY the SKILL.md content with YAML frontmatter. No code fences.`,\n },\n {\n role: \"user\",\n content: `Create a skill from this recurring pattern:\n\nPattern: ${pattern.description}\nFrequency: used ${pattern.frequency} times\nTech stack: ${pattern.techStack.join(\", \") || \"general\"}\n\nSuccessful examples:\n${recentSuccesses.map((e) => `- \"${e.task}\" → ${e.files.join(\", \")}`).join(\"\\n\")}\n\nCreate a concise, reusable skill that captures what worked.`,\n },\n ]\n\n const result = await provider.generate(messages, {\n maxTokens: 2048,\n temperature: 0.7,\n })\n\n return result.content.trim() || null\n }\n\n private analyzeFailures(): string[] {\n const insights: string[] = []\n const failures = this.memory.getFailedGenerations(20)\n\n if (failures.length < 2) return insights\n\n // Group failures by error pattern\n const errorGroups = new Map<string, MemoryEntry[]>()\n for (const f of failures) {\n const key = (f.error || \"unknown\").split(\"\\n\")[0].slice(0, 80)\n const group = errorGroups.get(key) || []\n group.push(f)\n errorGroups.set(key, group)\n }\n\n for (const [error, entries] of errorGroups) {\n if (entries.length >= 2) {\n insights.push(\n `Recurring error (${entries.length}x): \"${error}\" — consider creating a skill to prevent this`\n )\n }\n }\n\n // Success rate trending down\n const stats = this.memory.getStats()\n if (stats.successRate < 0.7 && stats.totalGenerations > 5) {\n insights.push(\n `Success rate is ${(stats.successRate * 100).toFixed(0)}% — review recent failures and update skills`\n )\n }\n\n return insights\n }\n\n private analyzePreferences(): string[] {\n const insights: string[] = []\n const prefs = this.memory.getPreferences()\n\n const highConfidence = prefs.filter((p) => p.confidence > 0.8)\n if (highConfidence.length) {\n insights.push(\n `Strong preferences detected: ${highConfidence.map((p) => `${p.key}=${p.value}`).join(\", \")}`\n )\n }\n\n return insights\n }\n}\n\nfunction patternToSkillName(pattern: LearnedPattern): string {\n return pattern.description\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 40)\n .replace(/-+$/, \"\")\n}\n","import type { AgentContext } from \"@/agent\"\nimport type { Memory } from \"./memory\"\n\n// --- Agent Pipeline: middleware chain like Laravel/Express ---\n// Request → Auth → Context → Memory → Skills → Agent → Validate → Heal → Enhance → Response\n\nexport interface PipelineRequest {\n id: string\n task: string\n outputType?: string\n outputDir?: string\n provider?: string\n model?: string\n apiKey?: string\n cwd: string\n overwrite?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface PipelineResponse {\n id: string\n success: boolean\n files: { path: string; content?: string }[]\n content: string\n outputType: string\n error?: string\n healed?: boolean\n healAttempts?: number\n tokensUsed?: number\n memoryEntryId?: string\n insights?: string[]\n duration: number\n}\n\nexport type MiddlewareFn = (\n req: PipelineRequest,\n res: PipelineResponse,\n context: PipelineContext,\n next: () => Promise<void>\n) => Promise<void>\n\nexport interface PipelineContext {\n agentContext?: AgentContext\n memory?: Memory\n startTime: number\n [key: string]: unknown\n}\n\nexport class Pipeline {\n private middleware: { name: string; fn: MiddlewareFn }[] = []\n\n use(name: string, fn: MiddlewareFn): Pipeline {\n this.middleware.push({ name, fn })\n return this\n }\n\n async execute(req: PipelineRequest): Promise<PipelineResponse> {\n const res: PipelineResponse = {\n id: req.id,\n success: false,\n files: [],\n content: \"\",\n outputType: req.outputType || \"auto\",\n duration: 0,\n }\n\n const context: PipelineContext = {\n startTime: Date.now(),\n }\n\n let index = 0\n\n const next = async (): Promise<void> => {\n if (index >= this.middleware.length) return\n const mw = this.middleware[index++]\n await mw.fn(req, res, context, next)\n }\n\n try {\n await next()\n res.duration = Date.now() - context.startTime\n } catch (error: any) {\n res.success = false\n res.error = error.message\n res.duration = Date.now() - context.startTime\n }\n\n return res\n }\n\n getMiddlewareNames(): string[] {\n return this.middleware.map((m) => m.name)\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\"\nimport { createAgentContext, generate } from \"@/agent\"\nimport type { ProviderName } from \"@/agent/providers\"\nimport { Memory } from \"./memory\"\nimport { HealEngine } from \"./heal\"\nimport { EnhanceEngine } from \"./enhance\"\nimport { Pipeline, type PipelineRequest, type PipelineResponse, type MiddlewareFn } from \"./pipeline\"\nimport { detectTechStack, formatTechStack } from \"@/agent/context/tech-stack\"\n\n// --- Runtime Server: HTTP server that receives requests and sends responses ---\n// Like Laravel, but every request is powered by AI agents.\n// The server learns, heals, and enhances itself over time.\n\nexport interface RuntimeConfig {\n port: number\n host: string\n provider: ProviderName\n model?: string\n apiKey?: string\n cwd: string\n memory: { enabled: boolean }\n heal: {\n enabled: boolean\n testCommand?: string\n buildCommand?: string\n }\n enhance: { enabled: boolean; autoSkills: boolean }\n cors: boolean\n}\n\nconst DEFAULT_CONFIG: RuntimeConfig = {\n port: 3170,\n host: \"0.0.0.0\",\n provider: \"claude-code\",\n cwd: process.cwd(),\n memory: { enabled: true },\n heal: { enabled: true },\n enhance: { enabled: true, autoSkills: true },\n cors: true,\n}\n\nexport class AgentXRuntime {\n private config: RuntimeConfig\n private memory: Memory\n private healEngine: HealEngine\n private enhanceEngine: EnhanceEngine\n private pipeline: Pipeline\n private requestCount = 0\n private log: (...args: unknown[]) => void\n\n constructor(config?: Partial<RuntimeConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n this.memory = new Memory(this.config.cwd)\n this.healEngine = new HealEngine(this.config.cwd, {\n enabled: this.config.heal.enabled,\n testCommand: this.config.heal.testCommand,\n buildCommand: this.config.heal.buildCommand,\n provider: this.config.provider,\n model: this.config.model,\n apiKey: this.config.apiKey,\n })\n this.enhanceEngine = new EnhanceEngine(this.config.cwd, this.memory, {\n enabled: this.config.enhance.enabled,\n autoSkills: this.config.enhance.autoSkills,\n provider: this.config.provider,\n model: this.config.model,\n apiKey: this.config.apiKey,\n })\n this.pipeline = this.buildPipeline()\n this.log = console.error.bind(console, \"[agentx]\")\n }\n\n private buildPipeline(): Pipeline {\n const pipeline = new Pipeline()\n\n // 1. Memory loading\n pipeline.use(\"memory\", this.memoryMiddleware())\n\n // 2. Context gathering\n pipeline.use(\"context\", this.contextMiddleware())\n\n // 3. Generation\n pipeline.use(\"generate\", this.generateMiddleware())\n\n // 4. Auto-heal\n pipeline.use(\"heal\", this.healMiddleware())\n\n // 5. Memory recording\n pipeline.use(\"record\", this.recordMiddleware())\n\n // 6. Enhancement check\n pipeline.use(\"enhance\", this.enhanceMiddleware())\n\n return pipeline\n }\n\n async start(): Promise<void> {\n await this.memory.load()\n\n const server = createServer(async (req, res) => {\n if (this.config.cors) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\")\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\")\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\")\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n }\n\n await this.handleRequest(req, res)\n })\n\n server.listen(this.config.port, this.config.host, () => {\n this.log(`\\n agentx runtime v0.1.0`)\n this.log(` Listening on http://${this.config.host}:${this.config.port}`)\n this.log(` Provider: ${this.config.provider}`)\n this.log(` Memory: ${this.config.memory.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Auto-heal: ${this.config.heal.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Self-enhance: ${this.config.enhance.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Pipeline: ${this.pipeline.getMiddlewareNames().join(\" → \")}`)\n this.log(` Working dir: ${this.config.cwd}`)\n this.log(\"\")\n this.log(\" Endpoints:\")\n this.log(\" POST /generate — generate code/content\")\n this.log(\" POST /evolve — transform existing code\")\n this.log(\" GET /inspect — project analysis\")\n this.log(\" GET /memory — view learning history\")\n this.log(\" POST /feedback — provide feedback on a generation\")\n this.log(\" GET /health — health check\")\n this.log(\" POST /enhance — trigger self-enhancement\")\n this.log(\"\")\n })\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`)\n const method = req.method || \"GET\"\n const pathname = url.pathname\n\n this.log(`${method} ${pathname}`)\n\n try {\n switch (`${method} ${pathname}`) {\n case \"POST /generate\":\n await this.handleGenerate(req, res)\n break\n case \"POST /evolve\":\n await this.handleEvolve(req, res)\n break\n case \"GET /inspect\":\n await this.handleInspect(res)\n break\n case \"GET /memory\":\n await this.handleMemory(res)\n break\n case \"POST /feedback\":\n await this.handleFeedback(req, res)\n break\n case \"GET /health\":\n this.sendJson(res, 200, {\n status: \"ok\",\n uptime: process.uptime(),\n requests: this.requestCount,\n stats: this.memory.getStats(),\n pipeline: this.pipeline.getMiddlewareNames(),\n })\n break\n case \"POST /enhance\":\n await this.handleEnhance(res)\n break\n default:\n this.sendJson(res, 404, {\n error: \"Not found\",\n endpoints: [\n \"POST /generate\",\n \"POST /evolve\",\n \"GET /inspect\",\n \"GET /memory\",\n \"POST /feedback\",\n \"GET /health\",\n \"POST /enhance\",\n ],\n })\n }\n } catch (error: any) {\n this.log(\"Error:\", error.message)\n this.sendJson(res, 500, { error: error.message })\n }\n\n this.requestCount++\n }\n\n private async handleGenerate(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.task) {\n this.sendJson(res, 400, { error: \"Missing required field: task\" })\n return\n }\n\n const pipelineReq: PipelineRequest = {\n id: `req-${Date.now().toString(36)}`,\n task: body.task,\n outputType: body.type || body.outputType || \"auto\",\n outputDir: body.outputDir || body.output_dir,\n provider: body.provider || this.config.provider,\n model: body.model || this.config.model,\n apiKey: body.apiKey || body.api_key || this.config.apiKey,\n cwd: this.config.cwd,\n overwrite: body.overwrite ?? true,\n metadata: body.metadata,\n }\n\n const result = await this.pipeline.execute(pipelineReq)\n this.sendJson(res, result.success ? 200 : 500, result)\n }\n\n private async handleEvolve(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.task || !body.glob) {\n this.sendJson(res, 400, {\n error: \"Missing required fields: task, glob\",\n })\n return\n }\n\n // Evolve uses the same pipeline but with file reading\n this.sendJson(res, 200, {\n message: \"Use the CLI for evolve: agentx evolve \\\"\" + body.task + \"\\\" --glob \\\"\" + body.glob + \"\\\"\",\n hint: \"The evolve endpoint requires interactive diff review. Use the CLI for full functionality.\",\n })\n }\n\n private async handleInspect(res: ServerResponse): Promise<void> {\n const context = await createAgentContext(this.config.cwd, \"inspect\", {\n context7: { enabled: false },\n })\n\n this.sendJson(res, 200, {\n techStack: {\n languages: context.techStack.languages,\n frameworks: context.techStack.frameworks,\n packageManager: context.techStack.packageManager,\n databases: context.techStack.databases,\n styling: context.techStack.styling,\n testing: context.techStack.testing,\n deployment: context.techStack.deployment,\n monorepo: context.techStack.monorepo,\n },\n schemas: {\n database: context.schemas.database\n ? { type: context.schemas.database.type, tables: context.schemas.database.tables }\n : null,\n api: context.schemas.api ? { type: context.schemas.api.type } : null,\n env: context.schemas.env,\n models: context.schemas.models?.map((m) => ({ path: m.path, type: m.type })),\n },\n skills: context.skills.map((s) => ({\n name: s.frontmatter.name,\n description: s.frontmatter.description,\n source: s.source,\n tags: s.frontmatter.tags,\n })),\n dependencies: Object.keys(context.techStack.dependencies).length,\n devDependencies: Object.keys(context.techStack.devDependencies).length,\n })\n }\n\n private async handleMemory(res: ServerResponse): Promise<void> {\n this.sendJson(res, 200, {\n stats: this.memory.getStats(),\n recent: this.memory.getRecentGenerations(10),\n patterns: this.memory.getPatterns().slice(0, 10),\n preferences: this.memory.getPreferences(),\n })\n }\n\n private async handleFeedback(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.entryId || !body.feedback) {\n this.sendJson(res, 400, {\n error: \"Missing required fields: entryId, feedback (positive/negative/neutral)\",\n })\n return\n }\n\n await this.memory.recordFeedback(body.entryId, body.feedback)\n this.sendJson(res, 200, { recorded: true })\n }\n\n private async handleEnhance(res: ServerResponse): Promise<void> {\n const result = await this.enhanceEngine.enhance()\n this.sendJson(res, 200, result)\n }\n\n // --- Middleware factories ---\n\n private memoryMiddleware(): MiddlewareFn {\n const memory = this.memory\n return async (req, res, ctx, next) => {\n ctx.memory = memory\n const memoryContext = memory.buildMemoryContext(req.task)\n if (memoryContext) {\n ctx.memoryContext = memoryContext\n }\n await next()\n }\n }\n\n private contextMiddleware(): MiddlewareFn {\n return async (req, res, ctx, next) => {\n ctx.agentContext = await createAgentContext(req.cwd, req.task, {\n provider: req.provider as any,\n context7: { enabled: true },\n })\n await next()\n }\n }\n\n private generateMiddleware(): MiddlewareFn {\n return async (req, res, ctx, next) => {\n const result = await generate({\n task: ctx.memoryContext\n ? `${req.task}\\n\\n${ctx.memoryContext}`\n : req.task,\n outputType: req.outputType as any,\n outputDir: req.outputDir,\n overwrite: req.overwrite ?? true,\n cwd: req.cwd,\n provider: (req.provider || this.config.provider) as any,\n model: req.model || this.config.model,\n apiKey: req.apiKey || this.config.apiKey,\n context7: true,\n interactive: false,\n maxSteps: 5,\n })\n\n res.success = result.files.errors.length === 0\n res.files = result.files.written.map((f) => ({ path: f }))\n res.content = result.content\n res.outputType = result.outputType\n res.tokensUsed = result.tokensUsed\n\n await next()\n }\n }\n\n private healMiddleware(): MiddlewareFn {\n const healEngine = this.healEngine\n return async (req, res, ctx, next) => {\n if (this.config.heal.enabled && res.files.length > 0) {\n const healResult = await healEngine.detectAndHeal(\n res.files.map((f) => f.path),\n req.task,\n res.memoryEntryId\n )\n if (healResult.attempts > 0) {\n res.healed = healResult.healed\n res.healAttempts = healResult.attempts\n if (healResult.healed) {\n res.success = true\n }\n }\n }\n await next()\n }\n }\n\n private recordMiddleware(): MiddlewareFn {\n const memory = this.memory\n return async (req, res, ctx, next) => {\n if (this.config.memory.enabled) {\n const entryId = await memory.recordGeneration({\n task: req.task,\n outputType: res.outputType,\n files: res.files.map((f) => f.path),\n success: res.success,\n error: res.error,\n context: {\n techStack: ctx.agentContext?.techStack.languages.map((l) => l.name),\n frameworks: ctx.agentContext?.techStack.frameworks.map((f) => f.name),\n },\n })\n res.memoryEntryId = entryId\n\n // Learn preferences from request patterns\n if (req.outputType && req.outputType !== \"auto\") {\n await memory.learnPreference(\n \"preferred-output-type\",\n req.outputType,\n `generation request: ${req.task.slice(0, 50)}`\n )\n }\n }\n await next()\n }\n }\n\n private enhanceMiddleware(): MiddlewareFn {\n const enhanceEngine = this.enhanceEngine\n return async (req, res, ctx, next) => {\n // Run enhancement in background every 10 requests\n if (this.config.enhance.enabled && this.requestCount % 10 === 0 && this.requestCount > 0) {\n enhanceEngine.enhance().then((result) => {\n if (result.skillsCreated.length) {\n this.log(`Auto-created ${result.skillsCreated.length} skill(s): ${result.skillsCreated.join(\", \")}`)\n }\n if (result.insights.length) {\n for (const insight of result.insights) {\n this.log(`Insight: ${insight}`)\n }\n }\n }).catch(() => {})\n }\n await next()\n }\n }\n\n private sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" })\n res.end(JSON.stringify(data, null, 2))\n }\n}\n\nasync function readBody(req: IncomingMessage): Promise<Record<string, any>> {\n return new Promise((resolve, reject) => {\n let body = \"\"\n req.on(\"data\", (chunk) => (body += chunk))\n req.on(\"end\", () => {\n try {\n resolve(body ? JSON.parse(body) : {})\n } catch {\n resolve({})\n }\n })\n req.on(\"error\", reject)\n })\n}\n","import { execa } from \"execa\"\nimport type { GitStatus, GitLogEntry, GitDiffFile, GitCommitResult } from \"./types\"\n\n// --- Git Manager: wraps git operations via execa ---\n\nexport class GitManager {\n constructor(private cwd: string) {}\n\n /**\n * Check if the current directory is a git repository.\n */\n async isRepo(): Promise<boolean> {\n try {\n await execa(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd: this.cwd,\n reject: false,\n })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Get current git status.\n */\n async status(): Promise<GitStatus> {\n const result = await execa(\"git\", [\"status\", \"--porcelain\", \"-b\"], {\n cwd: this.cwd,\n reject: false,\n })\n\n const lines = result.stdout.trim().split(\"\\n\").filter(Boolean)\n let branch = \"unknown\"\n const staged: string[] = []\n const modified: string[] = []\n const untracked: string[] = []\n const deleted: string[] = []\n\n for (const line of lines) {\n // Branch line: ## main...origin/main\n if (line.startsWith(\"## \")) {\n branch = line.slice(3).split(\"...\")[0]\n continue\n }\n\n const indexStatus = line[0]\n const workStatus = line[1]\n const file = line.slice(3).trim()\n\n // Staged changes (index column)\n if (indexStatus === \"A\" || indexStatus === \"M\" || indexStatus === \"R\") {\n staged.push(file)\n }\n if (indexStatus === \"D\") {\n deleted.push(file)\n staged.push(file)\n }\n\n // Unstaged changes (working tree column)\n if (workStatus === \"M\") {\n modified.push(file)\n }\n if (workStatus === \"D\") {\n deleted.push(file)\n }\n\n // Untracked\n if (indexStatus === \"?\" && workStatus === \"?\") {\n untracked.push(file)\n }\n }\n\n return {\n staged,\n modified,\n untracked,\n deleted: [...new Set(deleted)],\n branch,\n isClean: staged.length === 0 && modified.length === 0 && untracked.length === 0,\n }\n }\n\n /**\n * Get git diff (staged or unstaged).\n */\n async diff(staged = false): Promise<string> {\n const args = staged ? [\"diff\", \"--cached\"] : [\"diff\"]\n const result = await execa(\"git\", args, {\n cwd: this.cwd,\n reject: false,\n })\n return result.stdout\n }\n\n /**\n * Get diff summary with file-level stats.\n */\n async diffStat(staged = false): Promise<GitDiffFile[]> {\n const args = staged\n ? [\"diff\", \"--cached\", \"--numstat\"]\n : [\"diff\", \"--numstat\"]\n\n const result = await execa(\"git\", args, {\n cwd: this.cwd,\n reject: false,\n })\n\n const files: GitDiffFile[] = []\n for (const line of result.stdout.trim().split(\"\\n\").filter(Boolean)) {\n const [additions, deletions, path] = line.split(\"\\t\")\n if (!path) continue\n\n let status: GitDiffFile[\"status\"] = \"modified\"\n if (additions === \"-\" && deletions === \"-\") {\n status = \"renamed\" // binary or renamed\n }\n\n files.push({\n path,\n status,\n additions: parseInt(additions) || 0,\n deletions: parseInt(deletions) || 0,\n })\n }\n\n return files\n }\n\n /**\n * Get recent git log entries.\n */\n async log(count = 10): Promise<GitLogEntry[]> {\n const result = await execa(\n \"git\",\n [\"log\", `--max-count=${count}`, \"--format=%H|%h|%s|%an|%ai\"],\n {\n cwd: this.cwd,\n reject: false,\n }\n )\n\n if (!result.stdout.trim()) return []\n\n return result.stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const [hash, shortHash, message, author, date] = line.split(\"|\")\n return { hash, shortHash, message, author, date }\n })\n }\n\n /**\n * Stage files.\n */\n async add(files: string[]): Promise<void> {\n if (!files.length) return\n await execa(\"git\", [\"add\", ...files], { cwd: this.cwd })\n }\n\n /**\n * Stage all changes.\n */\n async addAll(): Promise<void> {\n await execa(\"git\", [\"add\", \"-A\"], { cwd: this.cwd })\n }\n\n /**\n * Commit with a message.\n */\n async commit(message: string): Promise<GitCommitResult> {\n const result = await execa(\"git\", [\"commit\", \"-m\", message], {\n cwd: this.cwd,\n reject: false,\n })\n\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || result.stdout || \"Git commit failed\")\n }\n\n // Parse commit hash from output\n const hashMatch = result.stdout.match(/\\[[\\w/.-]+\\s+(\\w+)\\]/)\n const hash = hashMatch?.[1] || \"unknown\"\n\n // Count files changed\n const filesMatch = result.stdout.match(/(\\d+)\\s+files?\\s+changed/)\n const filesChanged = parseInt(filesMatch?.[1] || \"0\")\n\n return { hash, message, filesChanged }\n }\n\n /**\n * Get current branch name.\n */\n async currentBranch(): Promise<string> {\n const result = await execa(\"git\", [\"branch\", \"--show-current\"], {\n cwd: this.cwd,\n reject: false,\n })\n return result.stdout.trim()\n }\n\n /**\n * Create and switch to a new branch.\n */\n async createBranch(name: string): Promise<void> {\n await execa(\"git\", [\"checkout\", \"-b\", name], { cwd: this.cwd })\n }\n\n /**\n * Switch to an existing branch.\n */\n async checkout(name: string): Promise<void> {\n await execa(\"git\", [\"checkout\", name], { cwd: this.cwd })\n }\n\n /**\n * Stash current changes.\n */\n async stash(message?: string): Promise<void> {\n const args = [\"stash\", \"push\"]\n if (message) args.push(\"-m\", message)\n await execa(\"git\", args, { cwd: this.cwd })\n }\n\n /**\n * Pop the latest stash.\n */\n async stashPop(): Promise<void> {\n await execa(\"git\", [\"stash\", \"pop\"], { cwd: this.cwd })\n }\n\n /**\n * Generate an AI commit message from staged changes.\n * Returns a conventional commit message based on the diff.\n */\n async generateCommitMessage(provider?: {\n generate: (messages: any[], options?: any) => Promise<any>\n }): Promise<string> {\n const diff = await this.diff(true)\n if (!diff.trim()) {\n throw new Error(\"No staged changes to commit\")\n }\n\n if (!provider) {\n // Fallback: generate from diff summary\n return this.fallbackCommitMessage(diff)\n }\n\n const result = await provider.generate([\n {\n role: \"system\",\n content: `You are a git commit message generator. Generate a conventional commit message (type(scope): subject) from the given diff.\nRules:\n- Use conventional commit format: feat|fix|refactor|docs|test|chore|style(scope): message\n- Keep the subject line under 72 characters\n- Be specific about what changed\n- Output ONLY the commit message, nothing else`,\n },\n {\n role: \"user\",\n content: `Generate a commit message for this diff:\\n\\n${diff.slice(0, 4000)}`,\n },\n ])\n\n return result.content.trim().split(\"\\n\")[0]\n }\n\n private fallbackCommitMessage(diff: string): string {\n const lines = diff.split(\"\\n\")\n const fileChanges: string[] = []\n\n for (const line of lines) {\n if (line.startsWith(\"diff --git\")) {\n const match = line.match(/b\\/(.+)$/)\n if (match) fileChanges.push(match[1])\n }\n }\n\n if (fileChanges.length === 0) return \"chore: update files\"\n if (fileChanges.length === 1) return `chore: update ${fileChanges[0]}`\n return `chore: update ${fileChanges.length} files`\n }\n}\n","import { createInterface, type Interface } from \"readline\"\nimport chalk from \"chalk\"\nimport ora from \"ora\"\nimport type { Session } from \"./session\"\nimport { createSession, saveSession, loadSession, loadLatestSession } from \"./session\"\nimport { isCommand, parseCommand, getCommand, type CommandContext } from \"./commands\"\nimport { renderBanner, renderResponse, renderFiles, renderCost, renderPlan, renderStreamChunk } from \"./renderer\"\nimport { generateStream, type GenerateOptions, type GenerateStreamEvent } from \"@/agent\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\nimport { logger } from \"@/utils/logger\"\nimport { globalPermissions } from \"@/permissions\"\n\n// --- REPL Engine ---\n\nexport interface ReplOptions {\n cwd: string\n provider?: string\n model?: string\n apiKey?: string\n resume?: boolean\n sessionId?: string\n version: string\n}\n\nexport class ReplEngine {\n private rl: Interface | null = null\n private session: Session\n private options: ReplOptions\n private running = false\n\n constructor(options: ReplOptions) {\n this.options = options\n\n // Resume or create session\n if (options.sessionId) {\n const loaded = loadSession(options.sessionId)\n if (!loaded) {\n logger.warn(`Session ${options.sessionId} not found, starting new session`)\n this.session = createSession(options.cwd)\n } else {\n this.session = loaded\n }\n } else if (options.resume) {\n const latest = loadLatestSession()\n if (!latest) {\n logger.info(\"No previous session found, starting new session\")\n this.session = createSession(options.cwd)\n } else {\n this.session = latest\n logger.info(`Resumed session: ${latest.id}`)\n }\n } else {\n this.session = createSession(options.cwd)\n }\n }\n\n /**\n * Start the REPL loop.\n */\n async start(): Promise<void> {\n this.running = true\n renderBanner(this.options.version, this.session.id)\n\n // Show resumed session context\n if (this.session.messages.length > 0) {\n console.log(\n chalk.dim(\n ` Resumed with ${this.session.messages.length} messages, ${this.session.tokensUsed.toLocaleString()} tokens`\n )\n )\n console.log()\n }\n\n this.rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"agentx > \"),\n terminal: true,\n })\n\n this.rl.prompt()\n\n this.rl.on(\"line\", async (line) => {\n const input = line.trim()\n\n if (!input) {\n this.rl?.prompt()\n return\n }\n\n try {\n if (isCommand(input)) {\n const shouldContinue = await this.handleCommand(input)\n if (!shouldContinue) {\n this.stop()\n return\n }\n } else {\n await this.handleGeneration(input)\n }\n } catch (error: any) {\n logger.error(` Error: ${error.message}`)\n }\n\n if (this.running) {\n this.rl?.prompt()\n }\n })\n\n this.rl.on(\"close\", () => {\n this.stop()\n })\n\n // Handle Ctrl+C gracefully\n this.rl.on(\"SIGINT\", () => {\n console.log()\n this.stop()\n })\n }\n\n /**\n * Stop the REPL and save session.\n */\n private stop(): void {\n this.running = false\n saveSession(this.session)\n console.log()\n console.log(chalk.dim(` Session saved: ${this.session.id}`))\n renderCost(this.session.tokensUsed)\n console.log()\n this.rl?.close()\n process.exit(0)\n }\n\n /**\n * Handle a slash command.\n */\n private async handleCommand(input: string): Promise<boolean> {\n const { name, args } = parseCommand(input)\n const handler = getCommand(name)\n\n if (!handler) {\n logger.warn(` Unknown command: /${name}. Type /help for available commands.`)\n return true\n }\n\n const ctx: CommandContext = {\n session: this.session,\n cwd: this.options.cwd,\n onSessionChange: (newSession) => {\n this.session = newSession\n },\n }\n\n return handler(args, ctx)\n }\n\n /**\n * Handle a natural language generation prompt.\n * Uses streaming to render text in real-time instead of blocking with a spinner.\n */\n private async handleGeneration(input: string): Promise<void> {\n const spinner = ora({\n text: \"Thinking...\",\n color: \"cyan\",\n }).start()\n\n try {\n // Build session messages for multi-turn context (exclude system messages)\n const sessionMessages: GenerationMessage[] = this.session.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({ role: m.role, content: m.content }))\n\n const generateOptions: GenerateOptions = {\n task: input,\n cwd: this.options.cwd,\n provider: (this.options.provider as any) || \"claude-code\",\n model: this.options.model,\n apiKey: this.options.apiKey,\n overwrite: true,\n dryRun: false,\n interactive: false,\n context7: true,\n sessionMessages,\n }\n\n let result: import(\"@/agent\").GenerateResult | undefined\n let streaming = false\n\n for await (const event of generateStream(generateOptions)) {\n if (event.type === \"context_ready\") {\n spinner.stop()\n console.log()\n streaming = true\n continue\n }\n if (event.type === \"text_delta\") {\n renderStreamChunk(event.text)\n continue\n }\n if (event.type === \"done\") {\n console.log()\n continue\n }\n if (event.type === \"error\") {\n throw new Error(event.error)\n }\n if (event.type === \"step_complete\") {\n if (event.step > 1) {\n console.log(chalk.dim(` Step ${event.step}: ${event.filesCount} file(s)`))\n }\n continue\n }\n if (event.type === \"generate_result\") {\n result = event.result\n }\n }\n\n // Ensure spinner is stopped if streaming never started\n if (!streaming) {\n spinner.stop()\n }\n\n if (!result) return\n\n // Render file results (plan mode shows preview instead)\n if (result.files.written.length || result.files.skipped.length || result.files.errors.length) {\n if (globalPermissions.getMode() === \"plan\") {\n renderPlan(result.files.written.map((f) => ({ path: f, action: \"create\" })))\n } else {\n renderFiles(result.files)\n }\n }\n\n // Track cost\n if (result.tokensUsed) {\n renderCost(result.tokensUsed)\n }\n\n // Update session\n this.session.messages.push({ role: \"user\", content: input })\n this.session.messages.push({\n role: \"assistant\",\n content: result.content || \"\",\n })\n this.session.tokensUsed += result.tokensUsed || 0\n this.session.filesGenerated.push(...result.files.written)\n\n // Handle follow-up questions\n if (result.followUp) {\n console.log()\n console.log(chalk.yellow(` ${result.followUp}`))\n }\n\n // Display heal results if present\n if (result.healResult) {\n console.log()\n if (result.healResult.healed) {\n console.log(chalk.green(` Heal: passed verification${result.healResult.attempts > 0 ? ` (fixed in ${result.healResult.attempts} attempt(s))` : \"\"}`))\n } else if (result.healResult.error) {\n console.log(chalk.red(` Heal: verification failed after ${result.healResult.attempts} attempt(s)`))\n console.log(chalk.dim(` ${result.healResult.error.split(\"\\n\")[0]}`))\n }\n }\n } catch (error: any) {\n spinner.stop()\n throw error\n }\n }\n}\n","import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"fs\"\nimport path from \"path\"\nimport os from \"os\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\n\n// --- Session management for REPL persistence ---\n\nexport interface Session {\n id: string\n createdAt: string\n updatedAt: string\n cwd: string\n messages: GenerationMessage[]\n tokensUsed: number\n filesGenerated: string[]\n}\n\nconst SESSIONS_DIR = path.join(os.homedir(), \".agentx\", \"sessions\")\n\nfunction ensureSessionsDir(): void {\n if (!existsSync(SESSIONS_DIR)) {\n mkdirSync(SESSIONS_DIR, { recursive: true })\n }\n}\n\n/**\n * Create a new session.\n */\nexport function createSession(cwd: string): Session {\n const id = generateId()\n return {\n id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n cwd,\n messages: [],\n tokensUsed: 0,\n filesGenerated: [],\n }\n}\n\n/**\n * Save a session to disk.\n */\nexport function saveSession(session: Session): void {\n ensureSessionsDir()\n const filePath = path.join(SESSIONS_DIR, `${session.id}.json`)\n session.updatedAt = new Date().toISOString()\n writeFileSync(filePath, JSON.stringify(session, null, 2), \"utf8\")\n}\n\n/**\n * Load a session from disk.\n */\nexport function loadSession(id: string): Session | null {\n const filePath = path.join(SESSIONS_DIR, `${id}.json`)\n if (!existsSync(filePath)) return null\n try {\n return JSON.parse(readFileSync(filePath, \"utf8\")) as Session\n } catch {\n return null\n }\n}\n\n/**\n * Load the most recent session.\n */\nexport function loadLatestSession(): Session | null {\n ensureSessionsDir()\n const files = readdirSync(SESSIONS_DIR)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => ({\n name: f,\n path: path.join(SESSIONS_DIR, f),\n }))\n\n if (!files.length) return null\n\n // Sort by modification time, most recent first\n let latest: { name: string; session: Session } | null = null\n for (const file of files) {\n try {\n const session = JSON.parse(readFileSync(file.path, \"utf8\")) as Session\n if (!latest || session.updatedAt > latest.session.updatedAt) {\n latest = { name: file.name, session }\n }\n } catch {\n // Skip corrupted files\n }\n }\n\n return latest?.session ?? null\n}\n\n/**\n * List all saved sessions.\n */\nexport function listSessions(): Session[] {\n ensureSessionsDir()\n const files = readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(\".json\"))\n const sessions: Session[] = []\n\n for (const file of files) {\n try {\n const session = JSON.parse(\n readFileSync(path.join(SESSIONS_DIR, file), \"utf8\")\n ) as Session\n sessions.push(session)\n } catch {\n // Skip corrupted files\n }\n }\n\n // Sort by most recent first\n sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n return sessions\n}\n\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 10) + Date.now().toString(36).slice(-4)\n}\n","import chalk from \"chalk\"\nimport { writeFileSync } from \"fs\"\nimport path from \"path\"\nimport type { Session } from \"./session\"\nimport { saveSession, loadSession, loadLatestSession, listSessions } from \"./session\"\nimport { renderHelp, renderCost, renderCostBreakdown, renderGitStatus } from \"./renderer\"\nimport { GitManager } from \"@/git\"\nimport { createProvider } from \"@/agent/providers\"\nimport { logger } from \"@/utils/logger\"\nimport { globalTracker, exportSession } from \"@/observability\"\nimport { MemoryHierarchy } from \"@/memory\"\nimport { globalPermissions, PERMISSION_MODES, type PermissionMode } from \"@/permissions\"\nimport prompts from \"prompts\"\n\n// --- REPL slash commands ---\n\nexport interface CommandContext {\n session: Session\n cwd: string\n onSessionChange: (session: Session) => void\n}\n\nexport type SlashCommandHandler = (\n args: string,\n ctx: CommandContext\n) => Promise<boolean> // Returns true to continue REPL, false to quit\n\nconst commands: Record<string, SlashCommandHandler> = {}\n\nexport function registerCommand(name: string, handler: SlashCommandHandler): void {\n commands[name] = handler\n}\n\nexport function getCommand(name: string): SlashCommandHandler | undefined {\n return commands[name]\n}\n\nexport function isCommand(input: string): boolean {\n return input.startsWith(\"/\")\n}\n\nexport function parseCommand(input: string): { name: string; args: string } {\n const trimmed = input.trim()\n const spaceIdx = trimmed.indexOf(\" \")\n if (spaceIdx === -1) {\n return { name: trimmed.slice(1), args: \"\" }\n }\n return {\n name: trimmed.slice(1, spaceIdx),\n args: trimmed.slice(spaceIdx + 1).trim(),\n }\n}\n\n// --- Built-in commands ---\n\nregisterCommand(\"help\", async () => {\n renderHelp()\n return true\n})\n\nregisterCommand(\"quit\", async () => {\n return false\n})\n\nregisterCommand(\"exit\", async () => {\n return false\n})\n\nregisterCommand(\"q\", async () => {\n return false\n})\n\nregisterCommand(\"clear\", async (_args, ctx) => {\n ctx.session.messages = []\n console.log(chalk.dim(\" Conversation cleared\"))\n return true\n})\n\nregisterCommand(\"save\", async (_args, ctx) => {\n saveSession(ctx.session)\n console.log(chalk.dim(` Session saved: ${ctx.session.id}`))\n return true\n})\n\nregisterCommand(\"load\", async (args, ctx) => {\n let session: Session | null = null\n\n if (args) {\n session = loadSession(args)\n if (!session) {\n logger.warn(`Session not found: ${args}`)\n return true\n }\n } else {\n // Show session list and let user pick\n const sessions = listSessions()\n if (!sessions.length) {\n logger.info(\"No saved sessions\")\n return true\n }\n\n const { sessionId } = await prompts({\n type: \"select\",\n name: \"sessionId\",\n message: \"Select a session\",\n choices: sessions.slice(0, 10).map((s) => ({\n title: `${s.id} — ${new Date(s.updatedAt).toLocaleDateString()} (${s.messages.length} messages)`,\n value: s.id,\n })),\n })\n\n if (!sessionId) return true\n session = loadSession(sessionId)\n }\n\n if (session) {\n ctx.onSessionChange(session)\n console.log(\n chalk.dim(` Loaded session: ${session.id} (${session.messages.length} messages)`)\n )\n }\n\n return true\n})\n\nregisterCommand(\"undo\", async (_args, ctx) => {\n // Remove last assistant + user message pair\n const messages = ctx.session.messages\n if (messages.length < 2) {\n logger.info(\"Nothing to undo\")\n return true\n }\n\n // Pop from the end: assistant response, then user prompt\n if (messages[messages.length - 1]?.role === \"assistant\") {\n messages.pop()\n }\n if (messages[messages.length - 1]?.role === \"user\") {\n messages.pop()\n }\n\n console.log(chalk.dim(\" Undid last exchange\"))\n return true\n})\n\nregisterCommand(\"cost\", async (_args, ctx) => {\n const summary = globalTracker.getSummary()\n if (summary.steps.length > 0) {\n renderCostBreakdown(summary)\n } else {\n renderCost(ctx.session.tokensUsed)\n }\n return true\n})\n\nregisterCommand(\"export\", async (args, ctx) => {\n const summary = globalTracker.getSummary()\n const markdown = exportSession(ctx.session, summary.steps.length ? summary : undefined)\n const filename = args || `session-${ctx.session.id}.md`\n const filePath = path.resolve(ctx.cwd, filename)\n writeFileSync(filePath, markdown, \"utf8\")\n logger.success(` Session exported to ${filePath}`)\n return true\n})\n\nregisterCommand(\"files\", async (_args, ctx) => {\n const files = ctx.session.filesGenerated\n if (!files.length) {\n logger.info(\"No files generated in this session\")\n return true\n }\n\n console.log()\n console.log(chalk.dim(` Files generated (${files.length}):`))\n for (const f of files) {\n console.log(` ${chalk.green(\"+\")} ${f}`)\n }\n console.log()\n return true\n})\n\nregisterCommand(\"context\", async (_args, ctx) => {\n console.log()\n console.log(chalk.dim(` Session: ${ctx.session.id}`))\n console.log(chalk.dim(` CWD: ${ctx.session.cwd}`))\n console.log(chalk.dim(` Messages: ${ctx.session.messages.length}`))\n console.log(chalk.dim(` Tokens: ${ctx.session.tokensUsed.toLocaleString()}`))\n console.log(chalk.dim(` Files: ${ctx.session.filesGenerated.length}`))\n console.log(chalk.dim(` Created: ${new Date(ctx.session.createdAt).toLocaleString()}`))\n console.log()\n return true\n})\n\n// --- Memory commands ---\n\nregisterCommand(\"memory\", async (_args, ctx) => {\n try {\n const memory = new MemoryHierarchy(ctx.cwd)\n await memory.load()\n\n const stats = memory.getStats()\n const prefs = memory.getPreferences()\n const patterns = memory.getPatterns()\n const recent = memory.getRecentGenerations(5)\n\n console.log()\n console.log(chalk.bold(\" Memory\"))\n console.log()\n console.log(chalk.dim(\" Project:\"))\n console.log(chalk.dim(` Generations: ${stats.project.totalGenerations}`))\n console.log(chalk.dim(` Success rate: ${(stats.project.successRate * 100).toFixed(0)}%`))\n console.log(chalk.dim(` Heals: ${stats.project.totalHeals}`))\n console.log()\n console.log(chalk.dim(\" Global:\"))\n console.log(chalk.dim(` Generations: ${stats.user.totalGenerations}`))\n console.log(chalk.dim(` Success rate: ${(stats.user.successRate * 100).toFixed(0)}%`))\n\n if (prefs.length) {\n console.log()\n console.log(chalk.dim(\" Preferences:\"))\n for (const p of prefs.slice(0, 10)) {\n console.log(chalk.dim(` ${p.key}: ${p.value} (${(p.confidence * 100).toFixed(0)}%)`))\n }\n }\n\n if (patterns.length) {\n console.log()\n console.log(chalk.dim(\" Patterns:\"))\n for (const p of patterns.slice(0, 5)) {\n console.log(chalk.dim(` ${p.description} (${p.frequency}x)`))\n }\n }\n\n if (recent.length) {\n console.log()\n console.log(chalk.dim(\" Recent:\"))\n for (const r of recent) {\n const status = r.success ? chalk.green(\"ok\") : chalk.red(\"fail\")\n console.log(chalk.dim(` [${status}] ${r.task.slice(0, 60)}`))\n }\n }\n\n console.log()\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n\n// --- Permission commands ---\n\nregisterCommand(\"mode\", async (args, _ctx) => {\n if (args && PERMISSION_MODES.includes(args as PermissionMode)) {\n globalPermissions.setMode(args as PermissionMode)\n logger.success(` Permission mode: ${args}`)\n } else if (args) {\n logger.warn(` Unknown mode: ${args}. Valid modes: ${PERMISSION_MODES.join(\", \")}`)\n } else {\n const current = globalPermissions.getMode()\n console.log()\n console.log(chalk.dim(` Current mode: ${chalk.bold(current)}`))\n console.log()\n console.log(chalk.dim(\" Available modes:\"))\n console.log(chalk.dim(\" default — confirm each file write\"))\n console.log(chalk.dim(\" acceptEdits — auto-allow writes, confirm destructive ops\"))\n console.log(chalk.dim(\" plan — show plan without writing\"))\n console.log(chalk.dim(\" yolo — auto-allow everything\"))\n console.log()\n console.log(chalk.dim(` Usage: /mode <mode>`))\n console.log()\n }\n return true\n})\n\n// --- Git commands ---\n\nregisterCommand(\"commit\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n if (!(await gm.isRepo())) {\n logger.warn(\"Not a git repository\")\n return true\n }\n\n // Auto-stage generated files\n const generatedFiles = ctx.session.filesGenerated.filter((f) => f)\n if (generatedFiles.length) {\n await gm.add(generatedFiles)\n console.log(chalk.dim(` Staged ${generatedFiles.length} generated file(s)`))\n }\n\n const status = await gm.status()\n if (status.staged.length === 0) {\n logger.warn(\"Nothing staged to commit\")\n return true\n }\n\n // Generate AI commit message\n let message: string\n try {\n const provider = createProvider()\n message = await gm.generateCommitMessage(provider)\n } catch {\n message = await gm.generateCommitMessage()\n }\n\n console.log(chalk.dim(` Message: ${message}`))\n\n const result = await gm.commit(message)\n logger.success(` [${result.hash}] ${result.message}`)\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n\n return true\n})\n\nregisterCommand(\"diff\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n const diff = await gm.diff()\n if (!diff.trim()) {\n logger.info(\"No changes\")\n } else {\n console.log(diff)\n }\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n\nregisterCommand(\"status\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n if (!(await gm.isRepo())) {\n logger.warn(\"Not a git repository\")\n return true\n }\n const status = await gm.status()\n renderGitStatus(status)\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n","import chalk from \"chalk\"\nimport type { WriteResult } from \"@/agent/outputs/handlers\"\nimport type { UsageSummary } from \"@/observability\"\n\n// --- Terminal rendering utilities for the REPL ---\n\n/**\n * Render the REPL welcome banner.\n */\nexport function renderBanner(version: string, sessionId: string): void {\n console.log()\n console.log(chalk.bold.cyan(\" agentx\") + chalk.dim(` v${version}`))\n console.log(chalk.dim(` Session: ${sessionId}`))\n console.log(chalk.dim(\" Type /help for commands, /quit to exit\"))\n console.log()\n}\n\n/**\n * Render file write results.\n */\nexport function renderFiles(result: WriteResult): void {\n if (result.written.length) {\n console.log()\n console.log(chalk.green(` Created ${result.written.length} file(s):`))\n for (const file of result.written) {\n console.log(` ${chalk.green(\"+\")} ${file}`)\n }\n }\n\n if (result.skipped.length) {\n console.log()\n console.log(chalk.yellow(` Skipped ${result.skipped.length} file(s):`))\n for (const file of result.skipped) {\n console.log(` ${chalk.yellow(\"~\")} ${file}`)\n }\n }\n\n if (result.errors.length) {\n console.log()\n console.log(chalk.red(` Failed ${result.errors.length} file(s):`))\n for (const err of result.errors) {\n console.log(` ${chalk.red(\"x\")} ${err}`)\n }\n }\n}\n\n/**\n * Render token usage and cost estimate.\n */\nexport function renderCost(tokensUsed: number): void {\n // Rough cost estimate based on Sonnet pricing ($3/MTok input, $15/MTok output)\n // We only have total tokens, so use a blended rate of ~$9/MTok\n const cost = (tokensUsed / 1_000_000) * 9\n console.log()\n console.log(\n chalk.dim(` Tokens: ${tokensUsed.toLocaleString()} | Est. cost: $${cost.toFixed(4)}`)\n )\n}\n\n/**\n * Render AI response text with basic formatting.\n */\nexport function renderResponse(content: string): void {\n if (!content.trim()) return\n console.log()\n\n // Simple rendering: preserve code blocks, add indentation\n const lines = content.split(\"\\n\")\n let inCodeBlock = false\n\n for (const line of lines) {\n if (line.startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock\n console.log(chalk.dim(` ${line}`))\n continue\n }\n\n if (inCodeBlock) {\n console.log(chalk.dim(` ${line}`))\n } else {\n console.log(` ${line}`)\n }\n }\n}\n\n/**\n * Render a streaming text chunk (no newline).\n */\nexport function renderStreamChunk(text: string): void {\n process.stdout.write(text)\n}\n\n/**\n * Render help text for REPL commands.\n */\nexport function renderHelp(): void {\n console.log()\n console.log(chalk.bold(\" Commands:\"))\n console.log()\n console.log(` ${chalk.cyan(\"/help\")} Show this help`)\n console.log(` ${chalk.cyan(\"/clear\")} Clear conversation history`)\n console.log(` ${chalk.cyan(\"/save\")} Save current session`)\n console.log(` ${chalk.cyan(\"/load\")} Load a saved session`)\n console.log(` ${chalk.cyan(\"/undo\")} Undo last generation`)\n console.log(` ${chalk.cyan(\"/cost\")} Show token usage and cost breakdown`)\n console.log(` ${chalk.cyan(\"/export\")} Export session as markdown`)\n console.log(` ${chalk.cyan(\"/files\")} List generated files`)\n console.log(` ${chalk.cyan(\"/context\")} Show session context info`)\n console.log(` ${chalk.cyan(\"/memory\")} Show memory stats and preferences`)\n console.log(` ${chalk.cyan(\"/mode\")} Switch permission mode`)\n console.log(` ${chalk.cyan(\"/commit\")} Commit generated files with AI message`)\n console.log(` ${chalk.cyan(\"/diff\")} Show git diff`)\n console.log(` ${chalk.cyan(\"/status\")} Show git status`)\n console.log(` ${chalk.cyan(\"/quit\")} Exit the REPL`)\n console.log()\n}\n\n/**\n * Render a git status summary.\n */\nexport function renderGitStatus(status: {\n branch: string\n staged: string[]\n modified: string[]\n untracked: string[]\n isClean: boolean\n}): void {\n console.log()\n console.log(chalk.dim(` Branch: ${status.branch}`))\n\n if (status.isClean) {\n console.log(chalk.green(\" Working tree clean\"))\n return\n }\n\n if (status.staged.length) {\n console.log(chalk.green(` Staged: ${status.staged.length}`))\n }\n if (status.modified.length) {\n console.log(chalk.yellow(` Modified: ${status.modified.length}`))\n }\n if (status.untracked.length) {\n console.log(chalk.dim(` Untracked: ${status.untracked.length}`))\n }\n console.log()\n}\n\n/**\n * Render detailed cost breakdown with per-step and per-model info.\n */\nexport function renderCostBreakdown(summary: UsageSummary): void {\n console.log()\n console.log(chalk.bold(\" Cost Breakdown\"))\n console.log()\n console.log(\n chalk.dim(\n ` Total: ${summary.totalTokens.toLocaleString()} tokens ($${summary.totalCost.toFixed(4)})`\n )\n )\n console.log(\n chalk.dim(\n ` Input: ${summary.totalInputTokens.toLocaleString()} | Output: ${summary.totalOutputTokens.toLocaleString()}`\n )\n )\n\n if (Object.keys(summary.models).length) {\n console.log()\n console.log(chalk.dim(\" Per model:\"))\n for (const [model, usage] of Object.entries(summary.models)) {\n console.log(\n ` ${chalk.cyan(model)}: ${(usage.inputTokens + usage.outputTokens).toLocaleString()} tokens, $${usage.cost.toFixed(4)} (${usage.steps} step${usage.steps !== 1 ? \"s\" : \"\"})`\n )\n }\n }\n\n if (summary.steps.length > 1) {\n console.log()\n console.log(chalk.dim(\" Per step:\"))\n for (const step of summary.steps) {\n console.log(\n ` Step ${step.step}: ${(step.inputTokens + step.outputTokens).toLocaleString()} tokens ($${step.cost.toFixed(4)})`\n )\n }\n }\n console.log()\n}\n\n/**\n * Render a plan preview showing what files would be written (for plan mode).\n */\nexport function renderPlan(files: Array<{ path: string; action: string }>): void {\n console.log()\n console.log(chalk.bold(\" Plan Preview\"))\n console.log(chalk.dim(\" No files will be written in plan mode.\"))\n console.log()\n for (const file of files) {\n const icon = file.action === \"create\" ? chalk.green(\"+\") : chalk.yellow(\"~\")\n console.log(` ${icon} ${file.path} (${file.action})`)\n }\n console.log()\n}\n"],"mappings":"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","names":["init_providers","init_logger","execa","existsSync","fs","path","fetch","installSkillPackage","packageId","cwd","parts","owner","repo","specificSkill","skillArg","execa","logger","skillsDir","path","existsSync","loadInstalledSkills","altDir","fetchFromGitHub","skills","treeUrl","response","fetch","skillFiles","item","specific","skill","fetchAndSaveSkill","file","error","filePath","rawUrl","content","parseSkillContent","skillDir","localDir","fs","dir","fg","fullPath","generateSkillMd","name","description","instructions","tags","globs","frontmatter","tag","glob","listInstalledSkills","loadLocalSkills","generateSkill","provider","name","description","techStack","options","messages","formatTechStack","skillContent","skill","frontmatterMatch","init_providers","existsSync","fs","path","DEFAULT_CONFIG","EnhanceEngine","cwd","memory","config","result","newSkills","insights","prefInsights","eligiblePatterns","p","created","skillsDir","path","pattern","skillName","patternToSkillName","skillPath","existsSync","content","fs","recentSuccesses","e","provider","createProvider","techStack","detectTechStack","messages","formatTechStack","failures","errorGroups","f","key","group","error","entries","stats","highConfidence","Pipeline","name","fn","req","res","context","index","next","error","m","createServer","DEFAULT_CONFIG","AgentXRuntime","config","Memory","HealEngine","EnhanceEngine","pipeline","Pipeline","createServer","req","res","url","method","pathname","error","body","readBody","pipelineReq","result","context","createAgentContext","m","memory","ctx","next","memoryContext","generate","f","healEngine","healResult","entryId","l","enhanceEngine","insight","status","data","resolve","reject","chunk","execa","GitManager","cwd","lines","branch","staged","modified","untracked","deleted","line","indexStatus","workStatus","file","result","files","additions","deletions","path","status","count","hash","shortHash","message","author","date","filesMatch","filesChanged","name","args","provider","diff","fileChanges","match","createInterface","chalk","ora","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","path","os","SESSIONS_DIR","ensureSessionsDir","createSession","cwd","generateId","saveSession","session","filePath","loadSession","id","loadLatestSession","files","f","latest","file","listSessions","sessions","a","b","chalk","writeFileSync","path","chalk","renderBanner","version","sessionId","renderFiles","result","file","err","renderCost","tokensUsed","cost","renderStreamChunk","text","renderHelp","chalk","renderGitStatus","status","renderCostBreakdown","summary","model","usage","step","renderPlan","files","file","icon","init_providers","init_logger","prompts","commands","registerCommand","name","handler","getCommand","isCommand","input","parseCommand","trimmed","spaceIdx","renderHelp","_args","ctx","chalk","saveSession","args","session","loadSession","logger","sessions","listSessions","sessionId","s","messages","summary","globalTracker","renderCostBreakdown","renderCost","markdown","exportSession","filename","filePath","path","writeFileSync","files","f","memory","MemoryHierarchy","stats","prefs","patterns","recent","p","status","error","_ctx","PERMISSION_MODES","globalPermissions","current","gm","GitManager","generatedFiles","message","provider","createProvider","result","diff","renderGitStatus","init_logger","ReplEngine","options","loaded","loadSession","logger","createSession","latest","loadLatestSession","renderBanner","chalk","createInterface","line","input","isCommand","error","saveSession","renderCost","name","args","parseCommand","handler","getCommand","ctx","newSession","spinner","ora","sessionMessages","m","generateOptions","result","streaming","event","generateStream","renderStreamChunk","globalPermissions","renderPlan","f","renderFiles","init_config","init_capabilities","init_auth_store","init_logger"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent/skills/registry.ts","../src/agent/skills/generator.ts","../src/runtime/enhance.ts","../src/runtime/pipeline.ts","../src/runtime/server.ts","../src/git/manager.ts","../src/repl/engine.ts","../src/repl/session.ts","../src/repl/commands.ts","../src/repl/renderer.ts"],"sourcesContent":["// agentx — public library API\n\n// Core agent orchestrator\nexport {\n createAgentContext,\n generate,\n generateStream,\n type AgentContext,\n type GenerateOptions,\n type GenerateResult,\n type GenerateStreamEvent,\n} from \"./agent\"\n\n// Providers\nexport {\n createProvider,\n ClaudeProvider,\n ClaudeCodeProvider,\n type ProviderName,\n} from \"./agent/providers\"\n\nexport type {\n AgentProvider,\n AgentConfig,\n OutputType,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n ContentBlock,\n RawGenerationResult,\n} from \"./agent/providers/types\"\n\nexport { agentConfigSchema, OUTPUT_TYPES, outputTypeDescriptions } from \"./agent/providers/types\"\n\n// Context\nexport { detectTechStack, formatTechStack, type TechStack } from \"./agent/context/tech-stack\"\nexport { detectSchemas, formatSchemas, type ProjectSchemas } from \"./agent/context/schema\"\nexport { gatherContext7Docs } from \"./agent/context/context7\"\n\n// Skills\nexport { loadLocalSkills, matchSkillsToTask, parseSkillFile, parseSkillContent } from \"./agent/skills/loader\"\nexport { installSkillPackage, generateSkillMd, listInstalledSkills } from \"./agent/skills/registry\"\nexport { generateSkill } from \"./agent/skills/generator\"\n\n// Outputs\nexport { resolveOutputType, OUTPUT_CONFIGS, type OutputConfig } from \"./agent/outputs/types\"\n\n// Tools\nexport { getAnthropicTools, getLegacyTools, formatToolsForSystemPrompt, ALL_TOOL_NAMES } from \"./agent/tools\"\nexport { ToolExecutor, type ToolCallInput, type ToolResult, type ToolExecutorOptions } from \"./agent/tools\"\n\n// Runtime\nexport {\n AgentXRuntime,\n Memory,\n HealEngine,\n EnhanceEngine,\n Pipeline,\n type MemoryEntry,\n type MemoryStore,\n type HealConfig,\n type HealResult,\n type EnhanceConfig,\n type EnhanceResult,\n type PipelineRequest,\n type PipelineResponse,\n type MiddlewareFn,\n type RuntimeConfig,\n} from \"./runtime\"\n\n// MCP\nexport { startMcpServer } from \"./mcp\"\n\n// Memory hierarchy\nexport { MemoryHierarchy } from \"./memory\"\nexport { ContextBuilder, resolveAtImports, loadProjectInstructions } from \"./memory\"\n\n// Observability\nexport { UsageTracker, globalTracker, debug, setDebug, isDebug, exportSession } from \"./observability\"\nexport type { StepUsage, ModelUsage, UsageSummary } from \"./observability\"\n\n// Permissions\nexport { PermissionManager, globalPermissions, permissionModeSchema, permissionConfigSchema, PERMISSION_MODES } from \"./permissions\"\nexport type { PermissionMode, PermissionConfig, PermissionRule, PermissionAction } from \"./permissions\"\n\n// Hooks\nexport { HookRegistry, loadHooks, globalHooks, HOOK_EVENTS, BLOCKING_EVENTS } from \"./hooks\"\nexport type { HookEvent, HookDefinition, HookContext, HookResult, HookHandler } from \"./hooks\"\n\n// Git\nexport { GitManager } from \"./git\"\nexport type { GitStatus, GitLogEntry, GitDiffFile, GitCommitResult } from \"./git\"\n\n// REPL\nexport { ReplEngine, createSession, saveSession, loadSession, loadLatestSession, listSessions } from \"./repl\"\nexport { isCommand, parseCommand, getCommand, registerCommand } from \"./repl\"\nexport type { ReplOptions, Session } from \"./repl\"\n\n// A2A\nexport { A2AServer } from \"./a2a\"\nexport type { A2AServerConfig, AgentCard, Task, TaskState, TaskMessage, TaskArtifact, TaskStatusUpdate } from \"./a2a\"\n\n// Daemon\nexport { AgentXDaemon } from \"./daemon\"\nexport { loadDaemonConfig, validateWorkspaces, daemonConfigSchema } from \"./daemon/config\"\nexport type { DaemonConfig, AgentDef, CronJobDef, MeshPeer } from \"./daemon/config\"\n\n// Agent Registry\nexport { AgentRegistry } from \"./agents/registry\"\nexport { executeTask, executeClaudeCode, executeOpenCodeCli, executeSdk, executeOrchestrator } from \"./agents/runtime\"\nexport type { AgentTask, AgentResponse } from \"./agents/runtime\"\n\n// Channels\nexport { MessageRouter } from \"./channels/router\"\nexport { TelegramAdapter } from \"./channels/telegram\"\nexport { WhatsAppAdapter } from \"./channels/whatsapp\"\nexport type { ChannelAdapter, IncomingMessage, OutgoingMessage } from \"./channels/types\"\n\n// Crons\nexport { CronScheduler } from \"./crons/scheduler\"\nexport type { CronJobState, CronRunResult } from \"./crons/types\"\n\n// A2A Mesh\nexport { A2AMesh } from \"./a2a/mesh\"\nexport { A2AClient } from \"./a2a/client\"\n\n// Wiki Knowledge Base\nexport { WikiStore } from \"./wiki\"\nexport type { WikiArticle, WikiArticleMeta, WikiEntry, WikiIndex, WikiAccess } from \"./wiki\"\n\n// Intent Knowledge Graph\nexport { GraphStore, STARTER_SCHEMA } from \"./graph\"\nexport type {\n GraphSchema,\n GraphNode,\n LevelDef,\n AxisDef,\n AxisType,\n Classification,\n ClassificationSource,\n ClassificationStatus,\n FingerprintEntry,\n NodesFile,\n IndexFile,\n GraphStoreOptions,\n} from \"./graph\"\n\n// Provider Capabilities\nexport { PROVIDER_CAPABILITIES, checkCapabilities } from \"./agent/providers/capabilities\"\nexport type { ProviderCapabilities } from \"./agent/providers/capabilities\"\n\n// Auth & Utils\nexport {\n loadAuthConfig,\n saveAuthConfig,\n resolveToken,\n ensureCredentials,\n runModelSetup,\n type AuthConfig,\n} from \"./utils/auth-store\"\n\nexport { logger } from \"./utils/logger\"\nexport { handleError } from \"./utils/handle-error\"\nexport { getPackageInfo } from \"./utils/get-package-info\"\n","import { execa } from \"execa\"\nimport { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport fetch from \"node-fetch\"\nimport { logger } from \"@/utils/logger\"\nimport type { Skill, SkillPackage } from \"./types\"\nimport { parseSkillContent } from \"./loader\"\n\n// --- skills.sh integration: install, list, and search skills ---\n\nconst SKILLS_SH_API = \"https://skills.sh\"\n\nexport async function installSkillPackage(\n packageId: string,\n cwd: string\n): Promise<Skill[]> {\n // packageId format: \"owner/repo\" or \"owner/repo/skill-name\"\n const parts = packageId.split(\"/\")\n if (parts.length < 2) {\n throw new Error(`Invalid skill package ID: ${packageId}. Expected format: owner/repo`)\n }\n\n const owner = parts[0]\n const repo = parts[1]\n const specificSkill = parts[2] // optional\n\n // Try using npx skills add first (official CLI)\n try {\n const skillArg = specificSkill ? `${owner}/${repo}/${specificSkill}` : `${owner}/${repo}`\n await execa(\"npx\", [\"-y\", \"skills\", \"add\", skillArg], {\n cwd,\n stdio: \"pipe\",\n })\n\n logger.success(`Installed skill package: ${packageId}`)\n\n // Load the installed skills\n const skillsDir = path.resolve(cwd, \".skills\", `${owner}_${repo}`)\n if (existsSync(skillsDir)) {\n return await loadInstalledSkills(skillsDir, packageId)\n }\n\n // Also check the standard .skills directory structure\n const altDir = path.resolve(cwd, \".skills\")\n if (existsSync(altDir)) {\n return await loadInstalledSkills(altDir, packageId)\n }\n\n return []\n } catch {\n // Fallback: fetch directly from GitHub\n logger.info(`Fetching skills directly from GitHub: ${owner}/${repo}`)\n return await fetchFromGitHub(owner, repo, specificSkill, cwd)\n }\n}\n\nasync function fetchFromGitHub(\n owner: string,\n repo: string,\n specificSkill: string | undefined,\n cwd: string\n): Promise<Skill[]> {\n const skills: Skill[] = []\n\n try {\n // Fetch repo tree to find SKILL.md files\n const treeUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/main?recursive=1`\n const response = await fetch(treeUrl)\n\n if (!response.ok) {\n throw new Error(`GitHub API error: ${response.status}`)\n }\n\n const data = (await response.json()) as { tree: { path: string; type: string }[] }\n const skillFiles = data.tree.filter(\n (item) => item.type === \"blob\" && item.path.endsWith(\"SKILL.md\")\n )\n\n if (specificSkill) {\n const specific = skillFiles.find(\n (f) =>\n f.path.includes(`/${specificSkill}/`) || f.path === `${specificSkill}/SKILL.md`\n )\n if (specific) {\n const skill = await fetchAndSaveSkill(owner, repo, specific.path, cwd)\n if (skill) skills.push(skill)\n }\n } else {\n for (const file of skillFiles) {\n const skill = await fetchAndSaveSkill(owner, repo, file.path, cwd)\n if (skill) skills.push(skill)\n }\n }\n } catch (error: any) {\n logger.error(`Failed to fetch skills from GitHub: ${error.message}`)\n }\n\n return skills\n}\n\nasync function fetchAndSaveSkill(\n owner: string,\n repo: string,\n filePath: string,\n cwd: string\n): Promise<Skill | null> {\n try {\n const rawUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/${filePath}`\n const response = await fetch(rawUrl)\n\n if (!response.ok) return null\n\n const content = await response.text()\n const skill = parseSkillContent(content)\n\n if (skill) {\n skill.source = \"remote\"\n skill.packageId = `${owner}/${repo}`\n\n // Save locally\n const skillDir = path.dirname(filePath)\n const localDir = path.resolve(cwd, \".skills\", `${owner}_${repo}`, skillDir)\n await fs.mkdir(localDir, { recursive: true })\n await fs.writeFile(path.resolve(localDir, \"SKILL.md\"), content)\n skill.path = path.resolve(localDir, \"SKILL.md\")\n }\n\n return skill\n } catch {\n return null\n }\n}\n\nasync function loadInstalledSkills(dir: string, packageId: string): Promise<Skill[]> {\n const skills: Skill[] = []\n const { default: fg } = await import(\"fast-glob\")\n\n const skillFiles = await fg.glob(\"**/SKILL.md\", {\n cwd: dir,\n deep: 5,\n })\n\n for (const file of skillFiles) {\n try {\n const fullPath = path.resolve(dir, file)\n const content = await fs.readFile(fullPath, \"utf8\")\n const skill = parseSkillContent(content)\n if (skill) {\n skill.source = \"remote\"\n skill.path = fullPath\n skill.packageId = packageId\n skills.push(skill)\n }\n } catch {\n // Skip broken skill files\n }\n }\n\n return skills\n}\n\nexport async function generateSkillMd(\n name: string,\n description: string,\n instructions: string,\n tags?: string[],\n globs?: string[]\n): Promise<string> {\n const frontmatter: string[] = [\n \"---\",\n `name: ${name}`,\n `description: ${description}`,\n ]\n\n if (tags?.length) {\n frontmatter.push(\"tags:\")\n for (const tag of tags) {\n frontmatter.push(` - ${tag}`)\n }\n }\n\n if (globs?.length) {\n frontmatter.push(\"globs:\")\n for (const glob of globs) {\n frontmatter.push(` - ${glob}`)\n }\n }\n\n frontmatter.push(\"---\")\n\n return `${frontmatter.join(\"\\n\")}\\n\\n${instructions}`\n}\n\nexport async function listInstalledSkills(cwd: string): Promise<Skill[]> {\n const { loadLocalSkills } = await import(\"./loader\")\n return loadLocalSkills(cwd)\n}\n","import type { AgentProvider, GenerationMessage } from \"../providers/types\"\nimport type { TechStack } from \"../context/tech-stack\"\nimport { formatTechStack } from \"../context/tech-stack\"\nimport { generateSkillMd } from \"./registry\"\nimport type { Skill } from \"./types\"\n\n// --- Generate new skills using AI ---\n\nexport async function generateSkill(\n provider: AgentProvider,\n name: string,\n description: string,\n techStack: TechStack,\n options?: { tags?: string[]; outputType?: string }\n): Promise<{ skill: Skill; content: string }> {\n const systemPrompt = `You are a skill author for the Agent Skills ecosystem (skills.sh).\nYou create high-quality SKILL.md files that provide reusable instructions for AI coding agents.\n\nA skill is a markdown document with YAML frontmatter that teaches an agent how to perform a specific task.\nSkills should be:\n- Clear and actionable\n- Tech-stack aware (use the right patterns for the project)\n- Complete but concise\n- Include examples where helpful\n- Follow the Agent Skills specification\n\nThe project's tech stack:\n${formatTechStack(techStack)}\n\nOutput ONLY the SKILL.md content (frontmatter + markdown instructions). Do not wrap in code fences.`\n\n const messages: GenerationMessage[] = [\n { role: \"system\", content: systemPrompt },\n {\n role: \"user\",\n content: `Create a skill called \"${name}\" with this description: \"${description}\"${\n options?.tags?.length ? `\\nTags: ${options.tags.join(\", \")}` : \"\"\n }${options?.outputType ? `\\nPrimary output type: ${options.outputType}` : \"\"}\n\nThe skill should contain detailed instructions for an AI agent to follow when performing this task in a project with the above tech stack. Include:\n1. Step-by-step instructions\n2. Code patterns and conventions to follow\n3. Common pitfalls to avoid\n4. Examples where helpful`,\n },\n ]\n\n const result = await provider.generate(messages, {\n temperature: 0.7,\n maxTokens: 4096,\n })\n\n const skillContent = result.content.trim()\n\n // Parse the generated content\n const skill: Skill = {\n frontmatter: { name, description },\n instructions: skillContent,\n source: \"generated\",\n }\n\n // Try to parse the frontmatter from generated content\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/)\n if (frontmatterMatch) {\n skill.instructions = frontmatterMatch[2].trim()\n }\n\n return { skill, content: skillContent }\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport { createProvider, type ProviderName } from \"@/agent/providers\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\nimport { detectTechStack, formatTechStack } from \"@/agent/context/tech-stack\"\nimport { Memory, type MemoryEntry, type LearnedPattern } from \"./memory\"\nimport { generateSkillMd } from \"@/agent/skills/registry\"\n\n// --- Self-Enhancement: auto-create skills from successful patterns ---\n// After enough successful generations with positive feedback,\n// the system distills what worked into reusable skills.\n// It also detects degradation and triggers skill upgrades.\n\nexport interface EnhanceConfig {\n enabled: boolean\n autoSkills: boolean // Auto-create skills from patterns\n minFrequency: number // Min pattern frequency before creating a skill\n provider: ProviderName\n model?: string\n apiKey?: string\n}\n\nexport interface EnhanceResult {\n skillsCreated: string[]\n skillsUpdated: string[]\n insights: string[]\n}\n\nconst DEFAULT_CONFIG: EnhanceConfig = {\n enabled: true,\n autoSkills: true,\n minFrequency: 3,\n provider: \"claude-code\",\n}\n\nexport class EnhanceEngine {\n private config: EnhanceConfig\n\n constructor(\n private cwd: string,\n private memory: Memory,\n config?: Partial<EnhanceConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n }\n\n async enhance(): Promise<EnhanceResult> {\n if (!this.config.enabled) {\n return { skillsCreated: [], skillsUpdated: [], insights: [] }\n }\n\n const result: EnhanceResult = {\n skillsCreated: [],\n skillsUpdated: [],\n insights: [],\n }\n\n // 1. Analyze patterns and create skills\n if (this.config.autoSkills) {\n const newSkills = await this.createSkillsFromPatterns()\n result.skillsCreated.push(...newSkills)\n }\n\n // 2. Analyze failure patterns for insights\n const insights = this.analyzeFailures()\n result.insights.push(...insights)\n\n // 3. Detect preference patterns\n const prefInsights = this.analyzePreferences()\n result.insights.push(...prefInsights)\n\n return result\n }\n\n private async createSkillsFromPatterns(): Promise<string[]> {\n const patterns = this.memory.getPatterns()\n const eligiblePatterns = patterns.filter(\n (p) => p.frequency >= this.config.minFrequency\n )\n\n if (!eligiblePatterns.length) return []\n\n const created: string[] = []\n const skillsDir = path.resolve(this.cwd, \".skills\", \"_auto\")\n\n for (const pattern of eligiblePatterns.slice(0, 3)) {\n const skillName = patternToSkillName(pattern)\n const skillPath = path.resolve(skillsDir, skillName, \"SKILL.md\")\n\n // Don't recreate existing skills\n if (existsSync(skillPath)) continue\n\n try {\n const content = await this.generateSkillFromPattern(pattern)\n if (content) {\n await fs.mkdir(path.dirname(skillPath), { recursive: true })\n await fs.writeFile(skillPath, content, \"utf8\")\n created.push(skillName)\n }\n } catch {\n // Skip failed skill generation\n }\n }\n\n return created\n }\n\n private async generateSkillFromPattern(pattern: LearnedPattern): Promise<string | null> {\n // Get examples of successful generations matching this pattern\n const recentSuccesses = this.memory\n .getRecentGenerations(20)\n .filter((e) => e.success && e.userFeedback !== \"negative\")\n .slice(0, 3)\n\n if (!recentSuccesses.length) return null\n\n const provider = createProvider(this.config.provider, this.config.apiKey)\n const techStack = await detectTechStack(this.cwd)\n\n const messages: GenerationMessage[] = [\n {\n role: \"system\",\n content: `You are a skill author. Create a SKILL.md file that captures a successful pattern.\nTech stack: ${formatTechStack(techStack)}\nOutput ONLY the SKILL.md content with YAML frontmatter. No code fences.`,\n },\n {\n role: \"user\",\n content: `Create a skill from this recurring pattern:\n\nPattern: ${pattern.description}\nFrequency: used ${pattern.frequency} times\nTech stack: ${pattern.techStack.join(\", \") || \"general\"}\n\nSuccessful examples:\n${recentSuccesses.map((e) => `- \"${e.task}\" → ${e.files.join(\", \")}`).join(\"\\n\")}\n\nCreate a concise, reusable skill that captures what worked.`,\n },\n ]\n\n const result = await provider.generate(messages, {\n maxTokens: 2048,\n temperature: 0.7,\n })\n\n return result.content.trim() || null\n }\n\n private analyzeFailures(): string[] {\n const insights: string[] = []\n const failures = this.memory.getFailedGenerations(20)\n\n if (failures.length < 2) return insights\n\n // Group failures by error pattern\n const errorGroups = new Map<string, MemoryEntry[]>()\n for (const f of failures) {\n const key = (f.error || \"unknown\").split(\"\\n\")[0].slice(0, 80)\n const group = errorGroups.get(key) || []\n group.push(f)\n errorGroups.set(key, group)\n }\n\n for (const [error, entries] of errorGroups) {\n if (entries.length >= 2) {\n insights.push(\n `Recurring error (${entries.length}x): \"${error}\" — consider creating a skill to prevent this`\n )\n }\n }\n\n // Success rate trending down\n const stats = this.memory.getStats()\n if (stats.successRate < 0.7 && stats.totalGenerations > 5) {\n insights.push(\n `Success rate is ${(stats.successRate * 100).toFixed(0)}% — review recent failures and update skills`\n )\n }\n\n return insights\n }\n\n private analyzePreferences(): string[] {\n const insights: string[] = []\n const prefs = this.memory.getPreferences()\n\n const highConfidence = prefs.filter((p) => p.confidence > 0.8)\n if (highConfidence.length) {\n insights.push(\n `Strong preferences detected: ${highConfidence.map((p) => `${p.key}=${p.value}`).join(\", \")}`\n )\n }\n\n return insights\n }\n}\n\nfunction patternToSkillName(pattern: LearnedPattern): string {\n return pattern.description\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 40)\n .replace(/-+$/, \"\")\n}\n","import type { AgentContext } from \"@/agent\"\nimport type { Memory } from \"./memory\"\n\n// --- Agent Pipeline: middleware chain like Laravel/Express ---\n// Request → Auth → Context → Memory → Skills → Agent → Validate → Heal → Enhance → Response\n\nexport interface PipelineRequest {\n id: string\n task: string\n outputType?: string\n outputDir?: string\n provider?: string\n model?: string\n apiKey?: string\n cwd: string\n overwrite?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface PipelineResponse {\n id: string\n success: boolean\n files: { path: string; content?: string }[]\n content: string\n outputType: string\n error?: string\n healed?: boolean\n healAttempts?: number\n tokensUsed?: number\n memoryEntryId?: string\n insights?: string[]\n duration: number\n}\n\nexport type MiddlewareFn = (\n req: PipelineRequest,\n res: PipelineResponse,\n context: PipelineContext,\n next: () => Promise<void>\n) => Promise<void>\n\nexport interface PipelineContext {\n agentContext?: AgentContext\n memory?: Memory\n startTime: number\n [key: string]: unknown\n}\n\nexport class Pipeline {\n private middleware: { name: string; fn: MiddlewareFn }[] = []\n\n use(name: string, fn: MiddlewareFn): Pipeline {\n this.middleware.push({ name, fn })\n return this\n }\n\n async execute(req: PipelineRequest): Promise<PipelineResponse> {\n const res: PipelineResponse = {\n id: req.id,\n success: false,\n files: [],\n content: \"\",\n outputType: req.outputType || \"auto\",\n duration: 0,\n }\n\n const context: PipelineContext = {\n startTime: Date.now(),\n }\n\n let index = 0\n\n const next = async (): Promise<void> => {\n if (index >= this.middleware.length) return\n const mw = this.middleware[index++]\n await mw.fn(req, res, context, next)\n }\n\n try {\n await next()\n res.duration = Date.now() - context.startTime\n } catch (error: any) {\n res.success = false\n res.error = error.message\n res.duration = Date.now() - context.startTime\n }\n\n return res\n }\n\n getMiddlewareNames(): string[] {\n return this.middleware.map((m) => m.name)\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\"\nimport { createAgentContext, generate } from \"@/agent\"\nimport type { ProviderName } from \"@/agent/providers\"\nimport { Memory } from \"./memory\"\nimport { HealEngine } from \"./heal\"\nimport { EnhanceEngine } from \"./enhance\"\nimport { Pipeline, type PipelineRequest, type PipelineResponse, type MiddlewareFn } from \"./pipeline\"\nimport { detectTechStack, formatTechStack } from \"@/agent/context/tech-stack\"\n\n// --- Runtime Server: HTTP server that receives requests and sends responses ---\n// Like Laravel, but every request is powered by AI agents.\n// The server learns, heals, and enhances itself over time.\n\nexport interface RuntimeConfig {\n port: number\n host: string\n provider: ProviderName\n model?: string\n apiKey?: string\n cwd: string\n memory: { enabled: boolean }\n heal: {\n enabled: boolean\n testCommand?: string\n buildCommand?: string\n }\n enhance: { enabled: boolean; autoSkills: boolean }\n cors: boolean\n}\n\nconst DEFAULT_CONFIG: RuntimeConfig = {\n port: 3170,\n host: \"0.0.0.0\",\n provider: \"claude-code\",\n cwd: process.cwd(),\n memory: { enabled: true },\n heal: { enabled: true },\n enhance: { enabled: true, autoSkills: true },\n cors: true,\n}\n\nexport class AgentXRuntime {\n private config: RuntimeConfig\n private memory: Memory\n private healEngine: HealEngine\n private enhanceEngine: EnhanceEngine\n private pipeline: Pipeline\n private requestCount = 0\n private log: (...args: unknown[]) => void\n\n constructor(config?: Partial<RuntimeConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n this.memory = new Memory(this.config.cwd)\n this.healEngine = new HealEngine(this.config.cwd, {\n enabled: this.config.heal.enabled,\n testCommand: this.config.heal.testCommand,\n buildCommand: this.config.heal.buildCommand,\n provider: this.config.provider,\n model: this.config.model,\n apiKey: this.config.apiKey,\n })\n this.enhanceEngine = new EnhanceEngine(this.config.cwd, this.memory, {\n enabled: this.config.enhance.enabled,\n autoSkills: this.config.enhance.autoSkills,\n provider: this.config.provider,\n model: this.config.model,\n apiKey: this.config.apiKey,\n })\n this.pipeline = this.buildPipeline()\n this.log = console.error.bind(console, \"[agentx]\")\n }\n\n private buildPipeline(): Pipeline {\n const pipeline = new Pipeline()\n\n // 1. Memory loading\n pipeline.use(\"memory\", this.memoryMiddleware())\n\n // 2. Context gathering\n pipeline.use(\"context\", this.contextMiddleware())\n\n // 3. Generation\n pipeline.use(\"generate\", this.generateMiddleware())\n\n // 4. Auto-heal\n pipeline.use(\"heal\", this.healMiddleware())\n\n // 5. Memory recording\n pipeline.use(\"record\", this.recordMiddleware())\n\n // 6. Enhancement check\n pipeline.use(\"enhance\", this.enhanceMiddleware())\n\n return pipeline\n }\n\n async start(): Promise<void> {\n await this.memory.load()\n\n const server = createServer(async (req, res) => {\n if (this.config.cors) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\")\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\")\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\")\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n }\n\n await this.handleRequest(req, res)\n })\n\n server.listen(this.config.port, this.config.host, () => {\n this.log(`\\n agentx runtime v0.1.0`)\n this.log(` Listening on http://${this.config.host}:${this.config.port}`)\n this.log(` Provider: ${this.config.provider}`)\n this.log(` Memory: ${this.config.memory.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Auto-heal: ${this.config.heal.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Self-enhance: ${this.config.enhance.enabled ? \"enabled\" : \"disabled\"}`)\n this.log(` Pipeline: ${this.pipeline.getMiddlewareNames().join(\" → \")}`)\n this.log(` Working dir: ${this.config.cwd}`)\n this.log(\"\")\n this.log(\" Endpoints:\")\n this.log(\" POST /generate — generate code/content\")\n this.log(\" POST /evolve — transform existing code\")\n this.log(\" GET /inspect — project analysis\")\n this.log(\" GET /memory — view learning history\")\n this.log(\" POST /feedback — provide feedback on a generation\")\n this.log(\" GET /health — health check\")\n this.log(\" POST /enhance — trigger self-enhancement\")\n this.log(\"\")\n })\n }\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`)\n const method = req.method || \"GET\"\n const pathname = url.pathname\n\n this.log(`${method} ${pathname}`)\n\n try {\n switch (`${method} ${pathname}`) {\n case \"POST /generate\":\n await this.handleGenerate(req, res)\n break\n case \"POST /evolve\":\n await this.handleEvolve(req, res)\n break\n case \"GET /inspect\":\n await this.handleInspect(res)\n break\n case \"GET /memory\":\n await this.handleMemory(res)\n break\n case \"POST /feedback\":\n await this.handleFeedback(req, res)\n break\n case \"GET /health\":\n this.sendJson(res, 200, {\n status: \"ok\",\n uptime: process.uptime(),\n requests: this.requestCount,\n stats: this.memory.getStats(),\n pipeline: this.pipeline.getMiddlewareNames(),\n })\n break\n case \"POST /enhance\":\n await this.handleEnhance(res)\n break\n default:\n this.sendJson(res, 404, {\n error: \"Not found\",\n endpoints: [\n \"POST /generate\",\n \"POST /evolve\",\n \"GET /inspect\",\n \"GET /memory\",\n \"POST /feedback\",\n \"GET /health\",\n \"POST /enhance\",\n ],\n })\n }\n } catch (error: any) {\n this.log(\"Error:\", error.message)\n this.sendJson(res, 500, { error: error.message })\n }\n\n this.requestCount++\n }\n\n private async handleGenerate(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.task) {\n this.sendJson(res, 400, { error: \"Missing required field: task\" })\n return\n }\n\n const pipelineReq: PipelineRequest = {\n id: `req-${Date.now().toString(36)}`,\n task: body.task,\n outputType: body.type || body.outputType || \"auto\",\n outputDir: body.outputDir || body.output_dir,\n provider: body.provider || this.config.provider,\n model: body.model || this.config.model,\n apiKey: body.apiKey || body.api_key || this.config.apiKey,\n cwd: this.config.cwd,\n overwrite: body.overwrite ?? true,\n metadata: body.metadata,\n }\n\n const result = await this.pipeline.execute(pipelineReq)\n this.sendJson(res, result.success ? 200 : 500, result)\n }\n\n private async handleEvolve(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.task || !body.glob) {\n this.sendJson(res, 400, {\n error: \"Missing required fields: task, glob\",\n })\n return\n }\n\n // Evolve uses the same pipeline but with file reading\n this.sendJson(res, 200, {\n message: \"Use the CLI for evolve: agentx evolve \\\"\" + body.task + \"\\\" --glob \\\"\" + body.glob + \"\\\"\",\n hint: \"The evolve endpoint requires interactive diff review. Use the CLI for full functionality.\",\n })\n }\n\n private async handleInspect(res: ServerResponse): Promise<void> {\n const context = await createAgentContext(this.config.cwd, \"inspect\", {\n context7: { enabled: false },\n })\n\n this.sendJson(res, 200, {\n techStack: {\n languages: context.techStack.languages,\n frameworks: context.techStack.frameworks,\n packageManager: context.techStack.packageManager,\n databases: context.techStack.databases,\n styling: context.techStack.styling,\n testing: context.techStack.testing,\n deployment: context.techStack.deployment,\n monorepo: context.techStack.monorepo,\n },\n schemas: {\n database: context.schemas.database\n ? { type: context.schemas.database.type, tables: context.schemas.database.tables }\n : null,\n api: context.schemas.api ? { type: context.schemas.api.type } : null,\n env: context.schemas.env,\n models: context.schemas.models?.map((m) => ({ path: m.path, type: m.type })),\n },\n skills: context.skills.map((s) => ({\n name: s.frontmatter.name,\n description: s.frontmatter.description,\n source: s.source,\n tags: s.frontmatter.tags,\n })),\n dependencies: Object.keys(context.techStack.dependencies).length,\n devDependencies: Object.keys(context.techStack.devDependencies).length,\n })\n }\n\n private async handleMemory(res: ServerResponse): Promise<void> {\n this.sendJson(res, 200, {\n stats: this.memory.getStats(),\n recent: this.memory.getRecentGenerations(10),\n patterns: this.memory.getPatterns().slice(0, 10),\n preferences: this.memory.getPreferences(),\n })\n }\n\n private async handleFeedback(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await readBody(req)\n if (!body.entryId || !body.feedback) {\n this.sendJson(res, 400, {\n error: \"Missing required fields: entryId, feedback (positive/negative/neutral)\",\n })\n return\n }\n\n await this.memory.recordFeedback(body.entryId, body.feedback)\n this.sendJson(res, 200, { recorded: true })\n }\n\n private async handleEnhance(res: ServerResponse): Promise<void> {\n const result = await this.enhanceEngine.enhance()\n this.sendJson(res, 200, result)\n }\n\n // --- Middleware factories ---\n\n private memoryMiddleware(): MiddlewareFn {\n const memory = this.memory\n return async (req, res, ctx, next) => {\n ctx.memory = memory\n const memoryContext = memory.buildMemoryContext(req.task)\n if (memoryContext) {\n ctx.memoryContext = memoryContext\n }\n await next()\n }\n }\n\n private contextMiddleware(): MiddlewareFn {\n return async (req, res, ctx, next) => {\n ctx.agentContext = await createAgentContext(req.cwd, req.task, {\n provider: req.provider as any,\n context7: { enabled: true },\n })\n await next()\n }\n }\n\n private generateMiddleware(): MiddlewareFn {\n return async (req, res, ctx, next) => {\n const result = await generate({\n task: ctx.memoryContext\n ? `${req.task}\\n\\n${ctx.memoryContext}`\n : req.task,\n outputType: req.outputType as any,\n outputDir: req.outputDir,\n overwrite: req.overwrite ?? true,\n cwd: req.cwd,\n provider: (req.provider || this.config.provider) as any,\n model: req.model || this.config.model,\n apiKey: req.apiKey || this.config.apiKey,\n context7: true,\n interactive: false,\n maxSteps: 5,\n })\n\n res.success = result.files.errors.length === 0\n res.files = result.files.written.map((f) => ({ path: f }))\n res.content = result.content\n res.outputType = result.outputType\n res.tokensUsed = result.tokensUsed\n\n await next()\n }\n }\n\n private healMiddleware(): MiddlewareFn {\n const healEngine = this.healEngine\n return async (req, res, ctx, next) => {\n if (this.config.heal.enabled && res.files.length > 0) {\n const healResult = await healEngine.detectAndHeal(\n res.files.map((f) => f.path),\n req.task,\n res.memoryEntryId\n )\n if (healResult.attempts > 0) {\n res.healed = healResult.healed\n res.healAttempts = healResult.attempts\n if (healResult.healed) {\n res.success = true\n }\n }\n }\n await next()\n }\n }\n\n private recordMiddleware(): MiddlewareFn {\n const memory = this.memory\n return async (req, res, ctx, next) => {\n if (this.config.memory.enabled) {\n const entryId = await memory.recordGeneration({\n task: req.task,\n outputType: res.outputType,\n files: res.files.map((f) => f.path),\n success: res.success,\n error: res.error,\n context: {\n techStack: ctx.agentContext?.techStack.languages.map((l) => l.name),\n frameworks: ctx.agentContext?.techStack.frameworks.map((f) => f.name),\n },\n })\n res.memoryEntryId = entryId\n\n // Learn preferences from request patterns\n if (req.outputType && req.outputType !== \"auto\") {\n await memory.learnPreference(\n \"preferred-output-type\",\n req.outputType,\n `generation request: ${req.task.slice(0, 50)}`\n )\n }\n }\n await next()\n }\n }\n\n private enhanceMiddleware(): MiddlewareFn {\n const enhanceEngine = this.enhanceEngine\n return async (req, res, ctx, next) => {\n // Run enhancement in background every 10 requests\n if (this.config.enhance.enabled && this.requestCount % 10 === 0 && this.requestCount > 0) {\n enhanceEngine.enhance().then((result) => {\n if (result.skillsCreated.length) {\n this.log(`Auto-created ${result.skillsCreated.length} skill(s): ${result.skillsCreated.join(\", \")}`)\n }\n if (result.insights.length) {\n for (const insight of result.insights) {\n this.log(`Insight: ${insight}`)\n }\n }\n }).catch(() => {})\n }\n await next()\n }\n }\n\n private sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" })\n res.end(JSON.stringify(data, null, 2))\n }\n}\n\nasync function readBody(req: IncomingMessage): Promise<Record<string, any>> {\n return new Promise((resolve, reject) => {\n let body = \"\"\n req.on(\"data\", (chunk) => (body += chunk))\n req.on(\"end\", () => {\n try {\n resolve(body ? JSON.parse(body) : {})\n } catch {\n resolve({})\n }\n })\n req.on(\"error\", reject)\n })\n}\n","import { execa } from \"execa\"\nimport type { GitStatus, GitLogEntry, GitDiffFile, GitCommitResult } from \"./types\"\n\n// --- Git Manager: wraps git operations via execa ---\n\nexport class GitManager {\n constructor(private cwd: string) {}\n\n /**\n * Check if the current directory is a git repository.\n */\n async isRepo(): Promise<boolean> {\n try {\n await execa(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd: this.cwd,\n reject: false,\n })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Get current git status.\n */\n async status(): Promise<GitStatus> {\n const result = await execa(\"git\", [\"status\", \"--porcelain\", \"-b\"], {\n cwd: this.cwd,\n reject: false,\n })\n\n const lines = result.stdout.trim().split(\"\\n\").filter(Boolean)\n let branch = \"unknown\"\n const staged: string[] = []\n const modified: string[] = []\n const untracked: string[] = []\n const deleted: string[] = []\n\n for (const line of lines) {\n // Branch line: ## main...origin/main\n if (line.startsWith(\"## \")) {\n branch = line.slice(3).split(\"...\")[0]\n continue\n }\n\n const indexStatus = line[0]\n const workStatus = line[1]\n const file = line.slice(3).trim()\n\n // Staged changes (index column)\n if (indexStatus === \"A\" || indexStatus === \"M\" || indexStatus === \"R\") {\n staged.push(file)\n }\n if (indexStatus === \"D\") {\n deleted.push(file)\n staged.push(file)\n }\n\n // Unstaged changes (working tree column)\n if (workStatus === \"M\") {\n modified.push(file)\n }\n if (workStatus === \"D\") {\n deleted.push(file)\n }\n\n // Untracked\n if (indexStatus === \"?\" && workStatus === \"?\") {\n untracked.push(file)\n }\n }\n\n return {\n staged,\n modified,\n untracked,\n deleted: [...new Set(deleted)],\n branch,\n isClean: staged.length === 0 && modified.length === 0 && untracked.length === 0,\n }\n }\n\n /**\n * Get git diff (staged or unstaged).\n */\n async diff(staged = false): Promise<string> {\n const args = staged ? [\"diff\", \"--cached\"] : [\"diff\"]\n const result = await execa(\"git\", args, {\n cwd: this.cwd,\n reject: false,\n })\n return result.stdout\n }\n\n /**\n * Get diff summary with file-level stats.\n */\n async diffStat(staged = false): Promise<GitDiffFile[]> {\n const args = staged\n ? [\"diff\", \"--cached\", \"--numstat\"]\n : [\"diff\", \"--numstat\"]\n\n const result = await execa(\"git\", args, {\n cwd: this.cwd,\n reject: false,\n })\n\n const files: GitDiffFile[] = []\n for (const line of result.stdout.trim().split(\"\\n\").filter(Boolean)) {\n const [additions, deletions, path] = line.split(\"\\t\")\n if (!path) continue\n\n let status: GitDiffFile[\"status\"] = \"modified\"\n if (additions === \"-\" && deletions === \"-\") {\n status = \"renamed\" // binary or renamed\n }\n\n files.push({\n path,\n status,\n additions: parseInt(additions) || 0,\n deletions: parseInt(deletions) || 0,\n })\n }\n\n return files\n }\n\n /**\n * Get recent git log entries.\n */\n async log(count = 10): Promise<GitLogEntry[]> {\n const result = await execa(\n \"git\",\n [\"log\", `--max-count=${count}`, \"--format=%H|%h|%s|%an|%ai\"],\n {\n cwd: this.cwd,\n reject: false,\n }\n )\n\n if (!result.stdout.trim()) return []\n\n return result.stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const [hash, shortHash, message, author, date] = line.split(\"|\")\n return { hash, shortHash, message, author, date }\n })\n }\n\n /**\n * Stage files.\n */\n async add(files: string[]): Promise<void> {\n if (!files.length) return\n await execa(\"git\", [\"add\", ...files], { cwd: this.cwd })\n }\n\n /**\n * Stage all changes.\n */\n async addAll(): Promise<void> {\n await execa(\"git\", [\"add\", \"-A\"], { cwd: this.cwd })\n }\n\n /**\n * Commit with a message.\n */\n async commit(message: string): Promise<GitCommitResult> {\n const result = await execa(\"git\", [\"commit\", \"-m\", message], {\n cwd: this.cwd,\n reject: false,\n })\n\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || result.stdout || \"Git commit failed\")\n }\n\n // Parse commit hash from output\n const hashMatch = result.stdout.match(/\\[[\\w/.-]+\\s+(\\w+)\\]/)\n const hash = hashMatch?.[1] || \"unknown\"\n\n // Count files changed\n const filesMatch = result.stdout.match(/(\\d+)\\s+files?\\s+changed/)\n const filesChanged = parseInt(filesMatch?.[1] || \"0\")\n\n return { hash, message, filesChanged }\n }\n\n /**\n * Get current branch name.\n */\n async currentBranch(): Promise<string> {\n const result = await execa(\"git\", [\"branch\", \"--show-current\"], {\n cwd: this.cwd,\n reject: false,\n })\n return result.stdout.trim()\n }\n\n /**\n * Create and switch to a new branch.\n */\n async createBranch(name: string): Promise<void> {\n await execa(\"git\", [\"checkout\", \"-b\", name], { cwd: this.cwd })\n }\n\n /**\n * Switch to an existing branch.\n */\n async checkout(name: string): Promise<void> {\n await execa(\"git\", [\"checkout\", name], { cwd: this.cwd })\n }\n\n /**\n * Stash current changes.\n */\n async stash(message?: string): Promise<void> {\n const args = [\"stash\", \"push\"]\n if (message) args.push(\"-m\", message)\n await execa(\"git\", args, { cwd: this.cwd })\n }\n\n /**\n * Pop the latest stash.\n */\n async stashPop(): Promise<void> {\n await execa(\"git\", [\"stash\", \"pop\"], { cwd: this.cwd })\n }\n\n /**\n * Generate an AI commit message from staged changes.\n * Returns a conventional commit message based on the diff.\n */\n async generateCommitMessage(provider?: {\n generate: (messages: any[], options?: any) => Promise<any>\n }): Promise<string> {\n const diff = await this.diff(true)\n if (!diff.trim()) {\n throw new Error(\"No staged changes to commit\")\n }\n\n if (!provider) {\n // Fallback: generate from diff summary\n return this.fallbackCommitMessage(diff)\n }\n\n const result = await provider.generate([\n {\n role: \"system\",\n content: `You are a git commit message generator. Generate a conventional commit message (type(scope): subject) from the given diff.\nRules:\n- Use conventional commit format: feat|fix|refactor|docs|test|chore|style(scope): message\n- Keep the subject line under 72 characters\n- Be specific about what changed\n- Output ONLY the commit message, nothing else`,\n },\n {\n role: \"user\",\n content: `Generate a commit message for this diff:\\n\\n${diff.slice(0, 4000)}`,\n },\n ])\n\n return result.content.trim().split(\"\\n\")[0]\n }\n\n private fallbackCommitMessage(diff: string): string {\n const lines = diff.split(\"\\n\")\n const fileChanges: string[] = []\n\n for (const line of lines) {\n if (line.startsWith(\"diff --git\")) {\n const match = line.match(/b\\/(.+)$/)\n if (match) fileChanges.push(match[1])\n }\n }\n\n if (fileChanges.length === 0) return \"chore: update files\"\n if (fileChanges.length === 1) return `chore: update ${fileChanges[0]}`\n return `chore: update ${fileChanges.length} files`\n }\n}\n","import { createInterface, type Interface } from \"readline\"\nimport chalk from \"chalk\"\nimport ora from \"ora\"\nimport type { Session } from \"./session\"\nimport { createSession, saveSession, loadSession, loadLatestSession } from \"./session\"\nimport { isCommand, parseCommand, getCommand, type CommandContext } from \"./commands\"\nimport { renderBanner, renderResponse, renderFiles, renderCost, renderPlan, renderStreamChunk } from \"./renderer\"\nimport { generateStream, type GenerateOptions, type GenerateStreamEvent } from \"@/agent\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\nimport { logger } from \"@/utils/logger\"\nimport { globalPermissions } from \"@/permissions\"\n\n// --- REPL Engine ---\n\nexport interface ReplOptions {\n cwd: string\n provider?: string\n model?: string\n apiKey?: string\n resume?: boolean\n sessionId?: string\n version: string\n}\n\nexport class ReplEngine {\n private rl: Interface | null = null\n private session: Session\n private options: ReplOptions\n private running = false\n\n constructor(options: ReplOptions) {\n this.options = options\n\n // Resume or create session\n if (options.sessionId) {\n const loaded = loadSession(options.sessionId)\n if (!loaded) {\n logger.warn(`Session ${options.sessionId} not found, starting new session`)\n this.session = createSession(options.cwd)\n } else {\n this.session = loaded\n }\n } else if (options.resume) {\n const latest = loadLatestSession()\n if (!latest) {\n logger.info(\"No previous session found, starting new session\")\n this.session = createSession(options.cwd)\n } else {\n this.session = latest\n logger.info(`Resumed session: ${latest.id}`)\n }\n } else {\n this.session = createSession(options.cwd)\n }\n }\n\n /**\n * Start the REPL loop.\n */\n async start(): Promise<void> {\n this.running = true\n renderBanner(this.options.version, this.session.id)\n\n // Show resumed session context\n if (this.session.messages.length > 0) {\n console.log(\n chalk.dim(\n ` Resumed with ${this.session.messages.length} messages, ${this.session.tokensUsed.toLocaleString()} tokens`\n )\n )\n console.log()\n }\n\n this.rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"agentx > \"),\n terminal: true,\n })\n\n this.rl.prompt()\n\n this.rl.on(\"line\", async (line) => {\n const input = line.trim()\n\n if (!input) {\n this.rl?.prompt()\n return\n }\n\n try {\n if (isCommand(input)) {\n const shouldContinue = await this.handleCommand(input)\n if (!shouldContinue) {\n this.stop()\n return\n }\n } else {\n await this.handleGeneration(input)\n }\n } catch (error: any) {\n logger.error(` Error: ${error.message}`)\n }\n\n if (this.running) {\n this.rl?.prompt()\n }\n })\n\n this.rl.on(\"close\", () => {\n this.stop()\n })\n\n // Handle Ctrl+C gracefully\n this.rl.on(\"SIGINT\", () => {\n console.log()\n this.stop()\n })\n }\n\n /**\n * Stop the REPL and save session.\n */\n private stop(): void {\n this.running = false\n saveSession(this.session)\n console.log()\n console.log(chalk.dim(` Session saved: ${this.session.id}`))\n renderCost(this.session.tokensUsed)\n console.log()\n this.rl?.close()\n process.exit(0)\n }\n\n /**\n * Handle a slash command.\n */\n private async handleCommand(input: string): Promise<boolean> {\n const { name, args } = parseCommand(input)\n const handler = getCommand(name)\n\n if (!handler) {\n logger.warn(` Unknown command: /${name}. Type /help for available commands.`)\n return true\n }\n\n const ctx: CommandContext = {\n session: this.session,\n cwd: this.options.cwd,\n onSessionChange: (newSession) => {\n this.session = newSession\n },\n }\n\n return handler(args, ctx)\n }\n\n /**\n * Handle a natural language generation prompt.\n * Uses streaming to render text in real-time instead of blocking with a spinner.\n */\n private async handleGeneration(input: string): Promise<void> {\n const spinner = ora({\n text: \"Thinking...\",\n color: \"cyan\",\n }).start()\n\n try {\n // Build session messages for multi-turn context (exclude system messages)\n const sessionMessages: GenerationMessage[] = this.session.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({ role: m.role, content: m.content }))\n\n const generateOptions: GenerateOptions = {\n task: input,\n cwd: this.options.cwd,\n provider: (this.options.provider as any) || \"claude-code\",\n model: this.options.model,\n apiKey: this.options.apiKey,\n overwrite: true,\n dryRun: false,\n interactive: false,\n context7: true,\n sessionMessages,\n }\n\n let result: import(\"@/agent\").GenerateResult | undefined\n let streaming = false\n\n for await (const event of generateStream(generateOptions)) {\n if (event.type === \"context_ready\") {\n spinner.stop()\n console.log()\n streaming = true\n continue\n }\n if (event.type === \"text_delta\") {\n renderStreamChunk(event.text)\n continue\n }\n if (event.type === \"done\") {\n console.log()\n continue\n }\n if (event.type === \"error\") {\n throw new Error(event.error)\n }\n if (event.type === \"step_complete\") {\n if (event.step > 1) {\n console.log(chalk.dim(` Step ${event.step}: ${event.filesCount} file(s)`))\n }\n continue\n }\n if (event.type === \"generate_result\") {\n result = event.result\n }\n }\n\n // Ensure spinner is stopped if streaming never started\n if (!streaming) {\n spinner.stop()\n }\n\n if (!result) return\n\n // Render file results (plan mode shows preview instead)\n if (result.files.written.length || result.files.skipped.length || result.files.errors.length) {\n if (globalPermissions.getMode() === \"plan\") {\n renderPlan(result.files.written.map((f) => ({ path: f, action: \"create\" })))\n } else {\n renderFiles(result.files)\n }\n }\n\n // Track cost\n if (result.tokensUsed) {\n renderCost(result.tokensUsed)\n }\n\n // Update session\n this.session.messages.push({ role: \"user\", content: input })\n this.session.messages.push({\n role: \"assistant\",\n content: result.content || \"\",\n })\n this.session.tokensUsed += result.tokensUsed || 0\n this.session.filesGenerated.push(...result.files.written)\n\n // Handle follow-up questions\n if (result.followUp) {\n console.log()\n console.log(chalk.yellow(` ${result.followUp}`))\n }\n\n // Display heal results if present\n if (result.healResult) {\n console.log()\n if (result.healResult.healed) {\n console.log(chalk.green(` Heal: passed verification${result.healResult.attempts > 0 ? ` (fixed in ${result.healResult.attempts} attempt(s))` : \"\"}`))\n } else if (result.healResult.error) {\n console.log(chalk.red(` Heal: verification failed after ${result.healResult.attempts} attempt(s)`))\n console.log(chalk.dim(` ${result.healResult.error.split(\"\\n\")[0]}`))\n }\n }\n } catch (error: any) {\n spinner.stop()\n throw error\n }\n }\n}\n","import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"fs\"\nimport path from \"path\"\nimport os from \"os\"\nimport type { GenerationMessage } from \"@/agent/providers/types\"\n\n// --- Session management for REPL persistence ---\n\nexport interface Session {\n id: string\n createdAt: string\n updatedAt: string\n cwd: string\n messages: GenerationMessage[]\n tokensUsed: number\n filesGenerated: string[]\n}\n\nconst SESSIONS_DIR = path.join(os.homedir(), \".agentx\", \"sessions\")\n\nfunction ensureSessionsDir(): void {\n if (!existsSync(SESSIONS_DIR)) {\n mkdirSync(SESSIONS_DIR, { recursive: true })\n }\n}\n\n/**\n * Create a new session.\n */\nexport function createSession(cwd: string): Session {\n const id = generateId()\n return {\n id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n cwd,\n messages: [],\n tokensUsed: 0,\n filesGenerated: [],\n }\n}\n\n/**\n * Save a session to disk.\n */\nexport function saveSession(session: Session): void {\n ensureSessionsDir()\n const filePath = path.join(SESSIONS_DIR, `${session.id}.json`)\n session.updatedAt = new Date().toISOString()\n writeFileSync(filePath, JSON.stringify(session, null, 2), \"utf8\")\n}\n\n/**\n * Load a session from disk.\n */\nexport function loadSession(id: string): Session | null {\n const filePath = path.join(SESSIONS_DIR, `${id}.json`)\n if (!existsSync(filePath)) return null\n try {\n return JSON.parse(readFileSync(filePath, \"utf8\")) as Session\n } catch {\n return null\n }\n}\n\n/**\n * Load the most recent session.\n */\nexport function loadLatestSession(): Session | null {\n ensureSessionsDir()\n const files = readdirSync(SESSIONS_DIR)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => ({\n name: f,\n path: path.join(SESSIONS_DIR, f),\n }))\n\n if (!files.length) return null\n\n // Sort by modification time, most recent first\n let latest: { name: string; session: Session } | null = null\n for (const file of files) {\n try {\n const session = JSON.parse(readFileSync(file.path, \"utf8\")) as Session\n if (!latest || session.updatedAt > latest.session.updatedAt) {\n latest = { name: file.name, session }\n }\n } catch {\n // Skip corrupted files\n }\n }\n\n return latest?.session ?? null\n}\n\n/**\n * List all saved sessions.\n */\nexport function listSessions(): Session[] {\n ensureSessionsDir()\n const files = readdirSync(SESSIONS_DIR).filter((f) => f.endsWith(\".json\"))\n const sessions: Session[] = []\n\n for (const file of files) {\n try {\n const session = JSON.parse(\n readFileSync(path.join(SESSIONS_DIR, file), \"utf8\")\n ) as Session\n sessions.push(session)\n } catch {\n // Skip corrupted files\n }\n }\n\n // Sort by most recent first\n sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n return sessions\n}\n\nfunction generateId(): string {\n return Math.random().toString(36).slice(2, 10) + Date.now().toString(36).slice(-4)\n}\n","import chalk from \"chalk\"\nimport { writeFileSync } from \"fs\"\nimport path from \"path\"\nimport type { Session } from \"./session\"\nimport { saveSession, loadSession, loadLatestSession, listSessions } from \"./session\"\nimport { renderHelp, renderCost, renderCostBreakdown, renderGitStatus } from \"./renderer\"\nimport { GitManager } from \"@/git\"\nimport { createProvider } from \"@/agent/providers\"\nimport { logger } from \"@/utils/logger\"\nimport { globalTracker, exportSession } from \"@/observability\"\nimport { MemoryHierarchy } from \"@/memory\"\nimport { globalPermissions, PERMISSION_MODES, type PermissionMode } from \"@/permissions\"\nimport prompts from \"prompts\"\n\n// --- REPL slash commands ---\n\nexport interface CommandContext {\n session: Session\n cwd: string\n onSessionChange: (session: Session) => void\n}\n\nexport type SlashCommandHandler = (\n args: string,\n ctx: CommandContext\n) => Promise<boolean> // Returns true to continue REPL, false to quit\n\nconst commands: Record<string, SlashCommandHandler> = {}\n\nexport function registerCommand(name: string, handler: SlashCommandHandler): void {\n commands[name] = handler\n}\n\nexport function getCommand(name: string): SlashCommandHandler | undefined {\n return commands[name]\n}\n\nexport function isCommand(input: string): boolean {\n return input.startsWith(\"/\")\n}\n\nexport function parseCommand(input: string): { name: string; args: string } {\n const trimmed = input.trim()\n const spaceIdx = trimmed.indexOf(\" \")\n if (spaceIdx === -1) {\n return { name: trimmed.slice(1), args: \"\" }\n }\n return {\n name: trimmed.slice(1, spaceIdx),\n args: trimmed.slice(spaceIdx + 1).trim(),\n }\n}\n\n// --- Built-in commands ---\n\nregisterCommand(\"help\", async () => {\n renderHelp()\n return true\n})\n\nregisterCommand(\"quit\", async () => {\n return false\n})\n\nregisterCommand(\"exit\", async () => {\n return false\n})\n\nregisterCommand(\"q\", async () => {\n return false\n})\n\nregisterCommand(\"clear\", async (_args, ctx) => {\n ctx.session.messages = []\n console.log(chalk.dim(\" Conversation cleared\"))\n return true\n})\n\nregisterCommand(\"save\", async (_args, ctx) => {\n saveSession(ctx.session)\n console.log(chalk.dim(` Session saved: ${ctx.session.id}`))\n return true\n})\n\nregisterCommand(\"load\", async (args, ctx) => {\n let session: Session | null = null\n\n if (args) {\n session = loadSession(args)\n if (!session) {\n logger.warn(`Session not found: ${args}`)\n return true\n }\n } else {\n // Show session list and let user pick\n const sessions = listSessions()\n if (!sessions.length) {\n logger.info(\"No saved sessions\")\n return true\n }\n\n const { sessionId } = await prompts({\n type: \"select\",\n name: \"sessionId\",\n message: \"Select a session\",\n choices: sessions.slice(0, 10).map((s) => ({\n title: `${s.id} — ${new Date(s.updatedAt).toLocaleDateString()} (${s.messages.length} messages)`,\n value: s.id,\n })),\n })\n\n if (!sessionId) return true\n session = loadSession(sessionId)\n }\n\n if (session) {\n ctx.onSessionChange(session)\n console.log(\n chalk.dim(` Loaded session: ${session.id} (${session.messages.length} messages)`)\n )\n }\n\n return true\n})\n\nregisterCommand(\"undo\", async (_args, ctx) => {\n // Remove last assistant + user message pair\n const messages = ctx.session.messages\n if (messages.length < 2) {\n logger.info(\"Nothing to undo\")\n return true\n }\n\n // Pop from the end: assistant response, then user prompt\n if (messages[messages.length - 1]?.role === \"assistant\") {\n messages.pop()\n }\n if (messages[messages.length - 1]?.role === \"user\") {\n messages.pop()\n }\n\n console.log(chalk.dim(\" Undid last exchange\"))\n return true\n})\n\nregisterCommand(\"cost\", async (_args, ctx) => {\n const summary = globalTracker.getSummary()\n if (summary.steps.length > 0) {\n renderCostBreakdown(summary)\n } else {\n renderCost(ctx.session.tokensUsed)\n }\n return true\n})\n\nregisterCommand(\"export\", async (args, ctx) => {\n const summary = globalTracker.getSummary()\n const markdown = exportSession(ctx.session, summary.steps.length ? summary : undefined)\n const filename = args || `session-${ctx.session.id}.md`\n const filePath = path.resolve(ctx.cwd, filename)\n writeFileSync(filePath, markdown, \"utf8\")\n logger.success(` Session exported to ${filePath}`)\n return true\n})\n\nregisterCommand(\"files\", async (_args, ctx) => {\n const files = ctx.session.filesGenerated\n if (!files.length) {\n logger.info(\"No files generated in this session\")\n return true\n }\n\n console.log()\n console.log(chalk.dim(` Files generated (${files.length}):`))\n for (const f of files) {\n console.log(` ${chalk.green(\"+\")} ${f}`)\n }\n console.log()\n return true\n})\n\nregisterCommand(\"context\", async (_args, ctx) => {\n console.log()\n console.log(chalk.dim(` Session: ${ctx.session.id}`))\n console.log(chalk.dim(` CWD: ${ctx.session.cwd}`))\n console.log(chalk.dim(` Messages: ${ctx.session.messages.length}`))\n console.log(chalk.dim(` Tokens: ${ctx.session.tokensUsed.toLocaleString()}`))\n console.log(chalk.dim(` Files: ${ctx.session.filesGenerated.length}`))\n console.log(chalk.dim(` Created: ${new Date(ctx.session.createdAt).toLocaleString()}`))\n console.log()\n return true\n})\n\n// --- Memory commands ---\n\nregisterCommand(\"memory\", async (_args, ctx) => {\n try {\n const memory = new MemoryHierarchy(ctx.cwd)\n await memory.load()\n\n const stats = memory.getStats()\n const prefs = memory.getPreferences()\n const patterns = memory.getPatterns()\n const recent = memory.getRecentGenerations(5)\n\n console.log()\n console.log(chalk.bold(\" Memory\"))\n console.log()\n console.log(chalk.dim(\" Project:\"))\n console.log(chalk.dim(` Generations: ${stats.project.totalGenerations}`))\n console.log(chalk.dim(` Success rate: ${(stats.project.successRate * 100).toFixed(0)}%`))\n console.log(chalk.dim(` Heals: ${stats.project.totalHeals}`))\n console.log()\n console.log(chalk.dim(\" Global:\"))\n console.log(chalk.dim(` Generations: ${stats.user.totalGenerations}`))\n console.log(chalk.dim(` Success rate: ${(stats.user.successRate * 100).toFixed(0)}%`))\n\n if (prefs.length) {\n console.log()\n console.log(chalk.dim(\" Preferences:\"))\n for (const p of prefs.slice(0, 10)) {\n console.log(chalk.dim(` ${p.key}: ${p.value} (${(p.confidence * 100).toFixed(0)}%)`))\n }\n }\n\n if (patterns.length) {\n console.log()\n console.log(chalk.dim(\" Patterns:\"))\n for (const p of patterns.slice(0, 5)) {\n console.log(chalk.dim(` ${p.description} (${p.frequency}x)`))\n }\n }\n\n if (recent.length) {\n console.log()\n console.log(chalk.dim(\" Recent:\"))\n for (const r of recent) {\n const status = r.success ? chalk.green(\"ok\") : chalk.red(\"fail\")\n console.log(chalk.dim(` [${status}] ${r.task.slice(0, 60)}`))\n }\n }\n\n console.log()\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n\n// --- Permission commands ---\n\nregisterCommand(\"mode\", async (args, _ctx) => {\n if (args && PERMISSION_MODES.includes(args as PermissionMode)) {\n globalPermissions.setMode(args as PermissionMode)\n logger.success(` Permission mode: ${args}`)\n } else if (args) {\n logger.warn(` Unknown mode: ${args}. Valid modes: ${PERMISSION_MODES.join(\", \")}`)\n } else {\n const current = globalPermissions.getMode()\n console.log()\n console.log(chalk.dim(` Current mode: ${chalk.bold(current)}`))\n console.log()\n console.log(chalk.dim(\" Available modes:\"))\n console.log(chalk.dim(\" default — confirm each file write\"))\n console.log(chalk.dim(\" acceptEdits — auto-allow writes, confirm destructive ops\"))\n console.log(chalk.dim(\" plan — show plan without writing\"))\n console.log(chalk.dim(\" yolo — auto-allow everything\"))\n console.log()\n console.log(chalk.dim(` Usage: /mode <mode>`))\n console.log()\n }\n return true\n})\n\n// --- Git commands ---\n\nregisterCommand(\"commit\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n if (!(await gm.isRepo())) {\n logger.warn(\"Not a git repository\")\n return true\n }\n\n // Auto-stage generated files\n const generatedFiles = ctx.session.filesGenerated.filter((f) => f)\n if (generatedFiles.length) {\n await gm.add(generatedFiles)\n console.log(chalk.dim(` Staged ${generatedFiles.length} generated file(s)`))\n }\n\n const status = await gm.status()\n if (status.staged.length === 0) {\n logger.warn(\"Nothing staged to commit\")\n return true\n }\n\n // Generate AI commit message\n let message: string\n try {\n const provider = createProvider()\n message = await gm.generateCommitMessage(provider)\n } catch {\n message = await gm.generateCommitMessage()\n }\n\n console.log(chalk.dim(` Message: ${message}`))\n\n const result = await gm.commit(message)\n logger.success(` [${result.hash}] ${result.message}`)\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n\n return true\n})\n\nregisterCommand(\"diff\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n const diff = await gm.diff()\n if (!diff.trim()) {\n logger.info(\"No changes\")\n } else {\n console.log(diff)\n }\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n\nregisterCommand(\"status\", async (_args, ctx) => {\n try {\n const gm = new GitManager(ctx.cwd)\n if (!(await gm.isRepo())) {\n logger.warn(\"Not a git repository\")\n return true\n }\n const status = await gm.status()\n renderGitStatus(status)\n } catch (error: any) {\n logger.error(` ${error.message}`)\n }\n return true\n})\n","import chalk from \"chalk\"\nimport type { WriteResult } from \"@/agent/outputs/handlers\"\nimport type { UsageSummary } from \"@/observability\"\n\n// --- Terminal rendering utilities for the REPL ---\n\n/**\n * Render the REPL welcome banner.\n */\nexport function renderBanner(version: string, sessionId: string): void {\n console.log()\n console.log(chalk.bold.cyan(\" agentx\") + chalk.dim(` v${version}`))\n console.log(chalk.dim(` Session: ${sessionId}`))\n console.log(chalk.dim(\" Type /help for commands, /quit to exit\"))\n console.log()\n}\n\n/**\n * Render file write results.\n */\nexport function renderFiles(result: WriteResult): void {\n if (result.written.length) {\n console.log()\n console.log(chalk.green(` Created ${result.written.length} file(s):`))\n for (const file of result.written) {\n console.log(` ${chalk.green(\"+\")} ${file}`)\n }\n }\n\n if (result.skipped.length) {\n console.log()\n console.log(chalk.yellow(` Skipped ${result.skipped.length} file(s):`))\n for (const file of result.skipped) {\n console.log(` ${chalk.yellow(\"~\")} ${file}`)\n }\n }\n\n if (result.errors.length) {\n console.log()\n console.log(chalk.red(` Failed ${result.errors.length} file(s):`))\n for (const err of result.errors) {\n console.log(` ${chalk.red(\"x\")} ${err}`)\n }\n }\n}\n\n/**\n * Render token usage and cost estimate.\n */\nexport function renderCost(tokensUsed: number): void {\n // Rough cost estimate based on Sonnet pricing ($3/MTok input, $15/MTok output)\n // We only have total tokens, so use a blended rate of ~$9/MTok\n const cost = (tokensUsed / 1_000_000) * 9\n console.log()\n console.log(\n chalk.dim(` Tokens: ${tokensUsed.toLocaleString()} | Est. cost: $${cost.toFixed(4)}`)\n )\n}\n\n/**\n * Render AI response text with basic formatting.\n */\nexport function renderResponse(content: string): void {\n if (!content.trim()) return\n console.log()\n\n // Simple rendering: preserve code blocks, add indentation\n const lines = content.split(\"\\n\")\n let inCodeBlock = false\n\n for (const line of lines) {\n if (line.startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock\n console.log(chalk.dim(` ${line}`))\n continue\n }\n\n if (inCodeBlock) {\n console.log(chalk.dim(` ${line}`))\n } else {\n console.log(` ${line}`)\n }\n }\n}\n\n/**\n * Render a streaming text chunk (no newline).\n */\nexport function renderStreamChunk(text: string): void {\n process.stdout.write(text)\n}\n\n/**\n * Render help text for REPL commands.\n */\nexport function renderHelp(): void {\n console.log()\n console.log(chalk.bold(\" Commands:\"))\n console.log()\n console.log(` ${chalk.cyan(\"/help\")} Show this help`)\n console.log(` ${chalk.cyan(\"/clear\")} Clear conversation history`)\n console.log(` ${chalk.cyan(\"/save\")} Save current session`)\n console.log(` ${chalk.cyan(\"/load\")} Load a saved session`)\n console.log(` ${chalk.cyan(\"/undo\")} Undo last generation`)\n console.log(` ${chalk.cyan(\"/cost\")} Show token usage and cost breakdown`)\n console.log(` ${chalk.cyan(\"/export\")} Export session as markdown`)\n console.log(` ${chalk.cyan(\"/files\")} List generated files`)\n console.log(` ${chalk.cyan(\"/context\")} Show session context info`)\n console.log(` ${chalk.cyan(\"/memory\")} Show memory stats and preferences`)\n console.log(` ${chalk.cyan(\"/mode\")} Switch permission mode`)\n console.log(` ${chalk.cyan(\"/commit\")} Commit generated files with AI message`)\n console.log(` ${chalk.cyan(\"/diff\")} Show git diff`)\n console.log(` ${chalk.cyan(\"/status\")} Show git status`)\n console.log(` ${chalk.cyan(\"/quit\")} Exit the REPL`)\n console.log()\n}\n\n/**\n * Render a git status summary.\n */\nexport function renderGitStatus(status: {\n branch: string\n staged: string[]\n modified: string[]\n untracked: string[]\n isClean: boolean\n}): void {\n console.log()\n console.log(chalk.dim(` Branch: ${status.branch}`))\n\n if (status.isClean) {\n console.log(chalk.green(\" Working tree clean\"))\n return\n }\n\n if (status.staged.length) {\n console.log(chalk.green(` Staged: ${status.staged.length}`))\n }\n if (status.modified.length) {\n console.log(chalk.yellow(` Modified: ${status.modified.length}`))\n }\n if (status.untracked.length) {\n console.log(chalk.dim(` Untracked: ${status.untracked.length}`))\n }\n console.log()\n}\n\n/**\n * Render detailed cost breakdown with per-step and per-model info.\n */\nexport function renderCostBreakdown(summary: UsageSummary): void {\n console.log()\n console.log(chalk.bold(\" Cost Breakdown\"))\n console.log()\n console.log(\n chalk.dim(\n ` Total: ${summary.totalTokens.toLocaleString()} tokens ($${summary.totalCost.toFixed(4)})`\n )\n )\n console.log(\n chalk.dim(\n ` Input: ${summary.totalInputTokens.toLocaleString()} | Output: ${summary.totalOutputTokens.toLocaleString()}`\n )\n )\n\n if (Object.keys(summary.models).length) {\n console.log()\n console.log(chalk.dim(\" Per model:\"))\n for (const [model, usage] of Object.entries(summary.models)) {\n console.log(\n ` ${chalk.cyan(model)}: ${(usage.inputTokens + usage.outputTokens).toLocaleString()} tokens, $${usage.cost.toFixed(4)} (${usage.steps} step${usage.steps !== 1 ? \"s\" : \"\"})`\n )\n }\n }\n\n if (summary.steps.length > 1) {\n console.log()\n console.log(chalk.dim(\" Per step:\"))\n for (const step of summary.steps) {\n console.log(\n ` Step ${step.step}: ${(step.inputTokens + step.outputTokens).toLocaleString()} tokens ($${step.cost.toFixed(4)})`\n )\n }\n }\n console.log()\n}\n\n/**\n * Render a plan preview showing what files would be written (for plan mode).\n */\nexport function renderPlan(files: Array<{ path: string; action: string }>): void {\n console.log()\n console.log(chalk.bold(\" Plan Preview\"))\n console.log(chalk.dim(\" No files will be written in plan mode.\"))\n console.log()\n for (const file of files) {\n const icon = file.action === \"create\" ? chalk.green(\"+\") : chalk.yellow(\"~\")\n console.log(` ${icon} ${file.path} (${file.action})`)\n }\n console.log()\n}\n"],"mappings":"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","names":["init_providers","init_logger","execa","existsSync","fs","path","fetch","installSkillPackage","packageId","cwd","parts","owner","repo","specificSkill","skillArg","execa","logger","skillsDir","path","existsSync","loadInstalledSkills","altDir","fetchFromGitHub","skills","treeUrl","response","fetch","skillFiles","item","specific","skill","fetchAndSaveSkill","file","error","filePath","rawUrl","content","parseSkillContent","skillDir","localDir","fs","dir","fg","fullPath","generateSkillMd","name","description","instructions","tags","globs","frontmatter","tag","glob","listInstalledSkills","loadLocalSkills","generateSkill","provider","name","description","techStack","options","messages","formatTechStack","skillContent","skill","frontmatterMatch","init_providers","existsSync","fs","path","DEFAULT_CONFIG","EnhanceEngine","cwd","memory","config","result","newSkills","insights","prefInsights","eligiblePatterns","p","created","skillsDir","path","pattern","skillName","patternToSkillName","skillPath","existsSync","content","fs","recentSuccesses","e","provider","createProvider","techStack","detectTechStack","messages","formatTechStack","failures","errorGroups","f","key","group","error","entries","stats","highConfidence","Pipeline","name","fn","req","res","context","index","next","error","m","createServer","DEFAULT_CONFIG","AgentXRuntime","config","Memory","HealEngine","EnhanceEngine","pipeline","Pipeline","createServer","req","res","url","method","pathname","error","body","readBody","pipelineReq","result","context","createAgentContext","m","memory","ctx","next","memoryContext","generate","f","healEngine","healResult","entryId","l","enhanceEngine","insight","status","data","resolve","reject","chunk","execa","GitManager","cwd","lines","branch","staged","modified","untracked","deleted","line","indexStatus","workStatus","file","result","files","additions","deletions","path","status","count","hash","shortHash","message","author","date","filesMatch","filesChanged","name","args","provider","diff","fileChanges","match","createInterface","chalk","ora","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","path","os","SESSIONS_DIR","ensureSessionsDir","createSession","cwd","generateId","saveSession","session","filePath","loadSession","id","loadLatestSession","files","f","latest","file","listSessions","sessions","a","b","chalk","writeFileSync","path","chalk","renderBanner","version","sessionId","renderFiles","result","file","err","renderCost","tokensUsed","cost","renderStreamChunk","text","renderHelp","chalk","renderGitStatus","status","renderCostBreakdown","summary","model","usage","step","renderPlan","files","file","icon","init_providers","init_logger","prompts","commands","registerCommand","name","handler","getCommand","isCommand","input","parseCommand","trimmed","spaceIdx","renderHelp","_args","ctx","chalk","saveSession","args","session","loadSession","logger","sessions","listSessions","sessionId","s","messages","summary","globalTracker","renderCostBreakdown","renderCost","markdown","exportSession","filename","filePath","path","writeFileSync","files","f","memory","MemoryHierarchy","stats","prefs","patterns","recent","p","status","error","_ctx","PERMISSION_MODES","globalPermissions","current","gm","GitManager","generatedFiles","message","provider","createProvider","result","diff","renderGitStatus","init_logger","ReplEngine","options","loaded","loadSession","logger","createSession","latest","loadLatestSession","renderBanner","chalk","createInterface","line","input","isCommand","error","saveSession","renderCost","name","args","parseCommand","handler","getCommand","ctx","newSession","spinner","ora","sessionMessages","m","generateOptions","result","streaming","event","generateStream","renderStreamChunk","globalPermissions","renderPlan","f","renderFiles","init_config","init_capabilities","init_auth_store","init_logger"]}
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-42DCRKUD.js";import"./chunk-DI7FMCDK.js";import"./chunk-JKYMXLYL.js";import"./chunk-Q7CZIRBB.js";import"./chunk-UCQ2N3KO.js";import"./chunk-52ZPELD2.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-SZDACK6O.js";import"./chunk-GUBMLV34.js";import"./chunk-F6CNF7V3.js";import"./chunk-EL3J74N2.js";import"./chunk-IWMW5432.js";import"./chunk-ZVP6GB4G.js";import"./chunk-45BLFNDG.js";import"./chunk-IVQO43U2.js";import"./chunk-4BR7D2OU.js";import"./chunk-M4AMWP3H.js";import"./chunk-4KXBUORV.js";import"./chunk-UU4WOZNR.js";import"./chunk-SFQUP3BP.js";import"./chunk-3SCPRYJB.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-SC5DIKBB.js";import"./chunk-GK7XAM3D.js";import"./chunk-DWADWDMU.js";import"./chunk-77OV7346.js";import"./chunk-VWTBHLMX.js";import"./chunk-AUNDQPDR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-V4HURNMX.js";import"./chunk-AJ5RMU7X.js";import"./chunk-EVWEG3VD.js";import"./chunk-MGNJWBVP.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-VDMYBPYB.js";import"./chunk-DSYKYZMT.js";import"./chunk-GMNKJXTR.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";export{a as buildProgram};
2
+ //# sourceMappingURL=program-DWZAI4GY.js.map
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-V4HURNMX.js";import"./chunk-AJ5RMU7X.js";import"./chunk-EVWEG3VD.js";import"./chunk-MGNJWBVP.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-GMNKJXTR.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";export{a as agenticQuery};
2
+ //# sourceMappingURL=query-3HXGBKGM.js.map
@@ -0,0 +1,2 @@
1
+ import{A as a,B as b,C as c,D as d,E as e,F as f,G as g,H as h,I as i,J as j}from"./chunk-45BLFNDG.js";import"./chunk-IVQO43U2.js";import"./chunk-4BR7D2OU.js";import"./chunk-M4AMWP3H.js";import"./chunk-4KXBUORV.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-SC5DIKBB.js";import"./chunk-GK7XAM3D.js";import"./chunk-DWADWDMU.js";import"./chunk-77OV7346.js";import"./chunk-VWTBHLMX.js";import"./chunk-AUNDQPDR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-V4HURNMX.js";import"./chunk-AJ5RMU7X.js";import"./chunk-EVWEG3VD.js";import"./chunk-MGNJWBVP.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-AJONZWLT.js";import"./chunk-F4HZTZHW.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-DSYKYZMT.js";import"./chunk-GMNKJXTR.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";export{j as AgentRegistry,e as TRACE_STEP_SUMMARY_BYTES,c as buildEntryMeta,d as buildWikiContext,f as clipForTrace,i as emitTraceStepsFromStreamEvent,h as firstMissingRequiredTool,b as getGlobalRegistry,a as setGlobalRegistry,g as tallyToolUses};
2
+ //# sourceMappingURL=registry-EJRWAJYG.js.map