agentix-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/providers/types.ts","../src/agent/context/schema.ts","../src/agent/context/context7.ts","../src/agent/outputs/types.ts","../src/agent/outputs/handlers.ts","../src/hooks/registry.ts","../src/hooks/types.ts","../src/observability/tracker.ts","../src/observability/debug.ts","../src/observability/export.ts","../src/hooks/loader.ts","../src/hooks/index.ts","../src/permissions/manager.ts","../src/permissions/types.ts","../src/memory/hierarchy.ts","../src/memory/context-builder.ts","../src/agent/tools/executor.ts","../src/agent/orchestrator.ts","../src/utils/async-queue.ts","../src/agent/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\n// --- Provider abstraction ---\n\nexport interface GenerationMessage {\n role: \"user\" | \"assistant\" | \"system\"\n content: string\n}\n\nexport interface GenerationResult {\n content: string\n files: GeneratedFile[]\n followUp?: string // Agent may ask for more info\n tokensUsed?: number\n}\n\nexport interface GeneratedFile {\n path: string\n content: string\n language?: string\n description?: string\n}\n\nexport interface ProviderOptions {\n model?: string\n maxTokens?: number\n temperature?: number\n apiKey?: string\n}\n\nexport type StreamEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"tool_use_start\"; name: string; id: string }\n | { type: \"tool_use_delta\"; json: string }\n | { type: \"tool_use_end\"; name: string }\n | { type: \"done\"; result: GenerationResult }\n | { type: \"error\"; error: string }\n\n// --- Raw (agentic) API types ---\n\nexport interface AnthropicMessage {\n role: \"user\" | \"assistant\"\n content: string | ContentBlock[]\n}\n\nexport type ContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; tool_use_id: string; content: string; is_error?: boolean }\n\nexport interface RawGenerationResult {\n content: ContentBlock[]\n stop_reason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\n usage: { input_tokens: number; output_tokens: number }\n}\n\nexport interface AgentProvider {\n name: string\n generate(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): Promise<GenerationResult>\n stream?(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): AsyncIterable<StreamEvent>\n /** Low-level method returning raw content blocks for the agentic tool_result loop */\n generateRaw?(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions\n ): Promise<RawGenerationResult>\n}\n\n// --- Agent configuration ---\n\nexport const agentConfigSchema = z.object({\n provider: z.enum([\"claude-code\", \"claude\", \"openai\", \"ollama\", \"custom\"]).default(\"claude-code\"),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n skills: z.array(z.string()).default([]),\n output: z\n .object({\n dir: z.string().default(\"./generated\"),\n })\n .default({}),\n context7: z\n .object({\n enabled: z.boolean().default(true),\n apiKey: z.string().optional(),\n })\n .default({}),\n agentic: z\n .object({\n maxIterations: z.number().default(20),\n enabledTools: z.array(z.string()).default([\n \"create_files\", \"ask_user\", \"read_file\",\n \"search_files\", \"list_directory\", \"run_command\", \"edit_file\",\n ]),\n disabledTools: z.array(z.string()).default([]),\n })\n .default({}),\n})\n\nexport type AgentConfig = z.infer<typeof agentConfigSchema>\n\n// --- Output types ---\n\nexport const OUTPUT_TYPES = [\n \"component\",\n \"page\",\n \"api\",\n \"website\",\n \"document\",\n \"script\",\n \"config\",\n \"skill\",\n \"media\",\n \"report\",\n \"test\",\n \"workflow\",\n \"schema\",\n \"email\",\n \"diagram\",\n \"auto\",\n] as const\n\nexport type OutputType = (typeof OUTPUT_TYPES)[number]\n\nexport const outputTypeDescriptions: Record<OutputType, string> = {\n component: \"UI component (any framework)\",\n page: \"Full page or screen\",\n api: \"API endpoint, route handler, or service\",\n website: \"Multi-page website or app\",\n document: \"Markdown, documentation, or specification\",\n script: \"Standalone script or utility\",\n config: \"Configuration file or setup\",\n skill: \"Agent skill (SKILL.md format for skills.sh)\",\n media: \"Media generation prompt (image/audio/video description)\",\n report: \"Analysis report or audit\",\n test: \"Test suite, test fixtures, or test data\",\n workflow: \"CI/CD pipeline, GitHub Actions, or automation\",\n schema: \"Database schema, Zod validators, or GraphQL types\",\n email: \"Email template (React Email, MJML, HTML)\",\n diagram: \"Mermaid, D2, or PlantUML diagram\",\n auto: \"Auto-detect the best output type\",\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport fg from \"fast-glob\"\n\n// --- Schema awareness: detect DB schemas, API specs, env vars, configs ---\n\nexport interface ProjectSchemas {\n database?: DatabaseSchema\n api?: ApiSchema\n env?: EnvSchema\n models?: ModelFile[]\n}\n\nexport interface DatabaseSchema {\n type: string // prisma, drizzle, typeorm, etc.\n content: string\n tables?: string[]\n}\n\nexport interface ApiSchema {\n type: string // openapi, graphql, trpc, etc.\n content: string\n endpoints?: string[]\n}\n\nexport interface EnvSchema {\n variables: { key: string; description?: string; required: boolean }[]\n}\n\nexport interface ModelFile {\n path: string\n content: string\n type: string\n}\n\nconst SCHEMA_FILES: Record<string, { type: string; category: \"database\" | \"api\" | \"model\" }> = {\n \"prisma/schema.prisma\": { type: \"prisma\", category: \"database\" },\n \"drizzle/schema.ts\": { type: \"drizzle\", category: \"database\" },\n \"schema.graphql\": { type: \"graphql\", category: \"api\" },\n \"schema.gql\": { type: \"graphql\", category: \"api\" },\n \"openapi.yaml\": { type: \"openapi\", category: \"api\" },\n \"openapi.json\": { type: \"openapi\", category: \"api\" },\n \"swagger.yaml\": { type: \"openapi\", category: \"api\" },\n \"swagger.json\": { type: \"openapi\", category: \"api\" },\n}\n\nexport async function detectSchemas(cwd: string): Promise<ProjectSchemas> {\n const schemas: ProjectSchemas = {}\n\n // Find schema files\n const files = await fg.glob(\"**/*\", {\n cwd,\n deep: 4,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/target/**\",\n \"**/__pycache__/**\",\n \"**/vendor/**\",\n \"**/.git/**\",\n ],\n onlyFiles: true,\n })\n\n // Detect database schemas\n for (const [schemaFile, info] of Object.entries(SCHEMA_FILES)) {\n const match = files.find((f) => f.endsWith(schemaFile) || f === schemaFile)\n if (match && info.category === \"database\") {\n const content = await safeReadFile(path.resolve(cwd, match))\n if (content) {\n schemas.database = {\n type: info.type,\n content: truncate(content, 3000),\n tables: extractTableNames(content, info.type),\n }\n break\n }\n }\n }\n\n // Detect API schemas\n for (const [schemaFile, info] of Object.entries(SCHEMA_FILES)) {\n const match = files.find((f) => f.endsWith(schemaFile) || f === schemaFile)\n if (match && info.category === \"api\") {\n const content = await safeReadFile(path.resolve(cwd, match))\n if (content) {\n schemas.api = {\n type: info.type,\n content: truncate(content, 3000),\n }\n break\n }\n }\n }\n\n // Detect tRPC router\n if (!schemas.api) {\n const trpcRouter = files.find(\n (f) => f.includes(\"trpc\") && (f.endsWith(\"router.ts\") || f.endsWith(\"router.js\"))\n )\n if (trpcRouter) {\n const content = await safeReadFile(path.resolve(cwd, trpcRouter))\n if (content) {\n schemas.api = {\n type: \"trpc\",\n content: truncate(content, 3000),\n }\n }\n }\n }\n\n // Detect env variables\n const envExample = files.find(\n (f) => f === \".env.example\" || f === \".env.local.example\" || f === \".env.template\"\n )\n if (envExample) {\n const content = await safeReadFile(path.resolve(cwd, envExample))\n if (content) {\n schemas.env = parseEnvFile(content)\n }\n }\n\n // Detect model/type files\n const modelFiles = files.filter(\n (f) =>\n (f.includes(\"models\") || f.includes(\"types\") || f.includes(\"schemas\")) &&\n (f.endsWith(\".ts\") || f.endsWith(\".py\") || f.endsWith(\".rs\") || f.endsWith(\".go\"))\n )\n\n if (modelFiles.length) {\n schemas.models = []\n for (const mf of modelFiles.slice(0, 5)) {\n const content = await safeReadFile(path.resolve(cwd, mf))\n if (content) {\n schemas.models.push({\n path: mf,\n content: truncate(content, 2000),\n type: path.extname(mf).slice(1),\n })\n }\n }\n }\n\n return schemas\n}\n\nfunction extractTableNames(content: string, type: string): string[] {\n if (type === \"prisma\") {\n const matches = content.match(/model\\s+(\\w+)\\s*\\{/g)\n return matches ? matches.map((m) => m.replace(/model\\s+/, \"\").replace(/\\s*\\{/, \"\")) : []\n }\n return []\n}\n\nfunction parseEnvFile(content: string): EnvSchema {\n const lines = content.split(\"\\n\").filter((l) => l.trim() && !l.trim().startsWith(\"#\"))\n const variables = lines.map((line) => {\n const [keyPart] = line.split(\"=\")\n const key = keyPart.trim()\n const hasValue = line.includes(\"=\") && line.split(\"=\")[1]?.trim().length > 0\n return {\n key,\n required: !hasValue,\n }\n })\n return { variables }\n}\n\nasync function safeReadFile(filePath: string): Promise<string | null> {\n try {\n if (!existsSync(filePath)) return null\n return await fs.readFile(filePath, \"utf8\")\n } catch {\n return null\n }\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str\n return str.slice(0, maxLen) + \"\\n... (truncated)\"\n}\n\nexport function formatSchemas(schemas: ProjectSchemas): string {\n const sections: string[] = []\n\n if (schemas.database) {\n sections.push(\n `## Database Schema (${schemas.database.type})\\n` +\n (schemas.database.tables?.length\n ? `Tables: ${schemas.database.tables.join(\", \")}\\n`\n : \"\") +\n \"```\\n\" +\n schemas.database.content +\n \"\\n```\"\n )\n }\n\n if (schemas.api) {\n sections.push(\n `## API Schema (${schemas.api.type})\\n` + \"```\\n\" + schemas.api.content + \"\\n```\"\n )\n }\n\n if (schemas.env) {\n sections.push(\n `## Environment Variables\\n` +\n schemas.env.variables.map((v) => `- ${v.key}${v.required ? \" (required)\" : \"\"}`).join(\"\\n\")\n )\n }\n\n if (schemas.models?.length) {\n for (const model of schemas.models) {\n sections.push(\n `## Model: ${model.path}\\n` + \"```\" + model.type + \"\\n\" + model.content + \"\\n```\"\n )\n }\n }\n\n return sections.join(\"\\n\\n\")\n}\n","import fetch from \"node-fetch\"\nimport { logger } from \"@/utils/logger\"\nimport type { TechStack } from \"./tech-stack\"\n\n// --- Context7 integration: fetch up-to-date library documentation ---\n\nconst CONTEXT7_API = \"https://api.context7.com/v1\"\n\ninterface Context7Library {\n id: string\n name: string\n description?: string\n}\n\ninterface Context7Docs {\n libraryId: string\n content: string\n tokens: number\n}\n\nexport async function resolveLibraryId(\n libraryName: string,\n apiKey?: string\n): Promise<Context7Library | null> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`\n\n const response = await fetch(`${CONTEXT7_API}/libraries/resolve`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ name: libraryName }),\n })\n\n if (!response.ok) return null\n\n const data = (await response.json()) as any\n if (data?.libraries?.length) {\n return data.libraries[0]\n }\n return null\n } catch {\n return null\n }\n}\n\nexport async function getLibraryDocs(\n libraryId: string,\n topic?: string,\n maxTokens: number = 5000,\n apiKey?: string\n): Promise<string | null> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`\n\n const response = await fetch(`${CONTEXT7_API}/libraries/${encodeURIComponent(libraryId)}/docs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ topic, maxTokens }),\n })\n\n if (!response.ok) return null\n\n const data = (await response.json()) as any\n return data?.content || null\n } catch {\n return null\n }\n}\n\nexport async function gatherContext7Docs(\n stack: TechStack,\n topic: string,\n apiKey?: string\n): Promise<string> {\n const relevantLibraries: string[] = []\n\n // Gather the most important frameworks and libraries\n for (const fw of stack.frameworks.slice(0, 3)) {\n relevantLibraries.push(fw.name)\n }\n\n // Add key dependencies\n const priorityDeps = [\n \"react\",\n \"vue\",\n \"svelte\",\n \"angular\",\n \"next\",\n \"nuxt\",\n \"express\",\n \"fastify\",\n \"hono\",\n \"prisma\",\n \"drizzle-orm\",\n \"tailwindcss\",\n \"shadcn\",\n \"@tanstack/react-query\",\n \"zod\",\n \"trpc\",\n ]\n\n for (const dep of priorityDeps) {\n if (stack.dependencies[dep] || stack.devDependencies[dep]) {\n if (!relevantLibraries.includes(dep)) {\n relevantLibraries.push(dep)\n }\n }\n }\n\n const docs: string[] = []\n\n for (const lib of relevantLibraries.slice(0, 5)) {\n const library = await resolveLibraryId(lib, apiKey)\n if (library) {\n const content = await getLibraryDocs(library.id, topic, 3000, apiKey)\n if (content) {\n docs.push(`## ${library.name} Documentation\\n${content}`)\n }\n }\n }\n\n if (!docs.length) {\n return \"\"\n }\n\n return `# Relevant Library Documentation (via Context7)\\n\\n${docs.join(\"\\n\\n---\\n\\n\")}`\n}\n","import type { OutputType } from \"../providers/types\"\n\n// --- Output type resolution and file path mapping ---\n\nexport interface OutputConfig {\n type: OutputType\n baseDir: string\n filePatterns: string[]\n description: string\n}\n\nexport const OUTPUT_CONFIGS: Record<string, OutputConfig> = {\n component: {\n type: \"component\",\n baseDir: \"src/components\",\n filePatterns: [\"*.tsx\", \"*.vue\", \"*.svelte\", \"*.jsx\", \"*.ts\"],\n description: \"UI component\",\n },\n page: {\n type: \"page\",\n baseDir: \"src/app\",\n filePatterns: [\"*.tsx\", \"*.vue\", \"*.svelte\", \"*.jsx\", \"*.astro\"],\n description: \"Page or screen\",\n },\n api: {\n type: \"api\",\n baseDir: \"src/api\",\n filePatterns: [\"*.ts\", \"*.js\", \"*.py\", \"*.go\", \"*.rs\"],\n description: \"API route or endpoint\",\n },\n website: {\n type: \"website\",\n baseDir: \".\",\n filePatterns: [\"*\"],\n description: \"Multi-file website\",\n },\n document: {\n type: \"document\",\n baseDir: \"docs\",\n filePatterns: [\"*.md\", \"*.mdx\", \"*.txt\", \"*.rst\"],\n description: \"Documentation\",\n },\n script: {\n type: \"script\",\n baseDir: \"scripts\",\n filePatterns: [\"*.ts\", \"*.js\", \"*.py\", \"*.sh\", \"*.go\"],\n description: \"Standalone script\",\n },\n config: {\n type: \"config\",\n baseDir: \".\",\n filePatterns: [\"*.json\", \"*.yaml\", \"*.yml\", \"*.toml\", \"*.env\"],\n description: \"Configuration file\",\n },\n skill: {\n type: \"skill\",\n baseDir: \".skills\",\n filePatterns: [\"SKILL.md\"],\n description: \"Agent skill (SKILL.md)\",\n },\n media: {\n type: \"media\",\n baseDir: \"media\",\n filePatterns: [\"*.md\", \"*.json\", \"*.txt\"],\n description: \"Media generation prompt/description\",\n },\n report: {\n type: \"report\",\n baseDir: \"reports\",\n filePatterns: [\"*.md\", \"*.html\", \"*.json\"],\n description: \"Analysis report\",\n },\n test: {\n type: \"test\",\n baseDir: \"src\",\n filePatterns: [\"*.test.ts\", \"*.test.tsx\", \"*.spec.ts\", \"*.test.js\", \"*.test.py\", \"*.test.go\"],\n description: \"Test suite or fixture\",\n },\n workflow: {\n type: \"workflow\",\n baseDir: \".github/workflows\",\n filePatterns: [\"*.yml\", \"*.yaml\"],\n description: \"CI/CD pipeline or automation\",\n },\n schema: {\n type: \"schema\",\n baseDir: \"src\",\n filePatterns: [\"*.ts\", \"*.prisma\", \"*.graphql\", \"*.gql\", \"*.py\"],\n description: \"Database schema, validators, or types\",\n },\n email: {\n type: \"email\",\n baseDir: \"src/emails\",\n filePatterns: [\"*.tsx\", \"*.jsx\", \"*.html\", \"*.mjml\"],\n description: \"Email template\",\n },\n diagram: {\n type: \"diagram\",\n baseDir: \"docs\",\n filePatterns: [\"*.md\", \"*.mmd\", \"*.d2\", \"*.puml\"],\n description: \"Architecture or data diagram\",\n },\n}\n\nexport function resolveOutputType(\n userHint: string | undefined,\n taskDescription: string\n): OutputType {\n if (userHint && userHint !== \"auto\") {\n return userHint as OutputType\n }\n\n const lower = taskDescription.toLowerCase()\n\n // Pattern matching for output type detection\n const patterns: [RegExp, OutputType][] = [\n [/\\b(component|button|card|modal|dialog|form|input|dropdown|nav|sidebar|header|footer|widget|ui)\\b/i, \"component\"],\n [/\\b(page|screen|view|route|layout|dashboard|landing)\\b/i, \"page\"],\n [/\\b(api|endpoint|route handler|rest|graphql|webhook|middleware|server)\\b/i, \"api\"],\n [/\\b(website|site|web app|landing page|portfolio|blog)\\b/i, \"website\"],\n [/\\b(document|doc|readme|guide|tutorial|specification|spec|changelog)\\b/i, \"document\"],\n [/\\b(script|cli|command|tool|utility|migration|seed|cron)\\b/i, \"script\"],\n [/\\b(config|configuration|setup|env|settings)\\b/i, \"config\"],\n [/\\b(skill|agent skill|skill\\.md)\\b/i, \"skill\"],\n [/\\b(video|audio|image|media|animation|thumbnail|podcast)\\b/i, \"media\"],\n [/\\b(report|audit|analysis|review|assessment|benchmark)\\b/i, \"report\"],\n [/\\b(test|spec|unit test|integration test|e2e|coverage|fixture|mock)\\b/i, \"test\"],\n [/\\b(workflow|ci|cd|pipeline|github action|deploy|automation|ci\\/cd)\\b/i, \"workflow\"],\n [/\\b(schema|model|migration|prisma|drizzle|zod|validator|graphql type)\\b/i, \"schema\"],\n [/\\b(email|newsletter|transactional|invite|welcome email|notification email)\\b/i, \"email\"],\n [/\\b(diagram|erd|flowchart|architecture diagram|sequence diagram|mermaid|plantuml|d2)\\b/i, \"diagram\"],\n ]\n\n for (const [pattern, type] of patterns) {\n if (pattern.test(lower)) {\n return type\n }\n }\n\n return \"component\" // Default fallback\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport type { GeneratedFile } from \"../providers/types\"\nimport type { TechStack } from \"../context/tech-stack\"\nimport { OUTPUT_CONFIGS } from \"./types\"\nimport { logger } from \"@/utils/logger\"\nimport { globalHooks } from \"@/hooks\"\nimport { globalPermissions } from \"@/permissions\"\n\n// --- Write generated files to disk ---\n\nexport interface WriteOptions {\n cwd: string\n overwrite: boolean\n dryRun: boolean\n outputDir?: string\n}\n\nexport interface WriteResult {\n written: string[]\n skipped: string[]\n errors: string[]\n}\n\nexport async function writeGeneratedFiles(\n files: GeneratedFile[],\n options: WriteOptions\n): Promise<WriteResult> {\n const result: WriteResult = { written: [], skipped: [], errors: [] }\n\n for (const file of files) {\n const filePath = path.isAbsolute(file.path)\n ? file.path\n : path.resolve(options.cwd, options.outputDir || \"\", file.path)\n\n try {\n // pre:file-write hook — can block or modify file content\n let fileContent = file.content\n if (globalHooks.has(\"pre:file-write\")) {\n const hookResult = await globalHooks.execute(\"pre:file-write\", {\n event: \"pre:file-write\",\n file: filePath,\n fileContent,\n cwd: options.cwd,\n })\n if (hookResult.blocked) {\n result.skipped.push(filePath)\n continue\n }\n if (hookResult.modified?.fileContent) {\n fileContent = String(hookResult.modified.fileContent)\n }\n }\n\n // Permissions check — can allow, deny, or skip (plan mode)\n const relativePath = path.relative(options.cwd, filePath)\n const permission = await globalPermissions.checkFileWrite(relativePath)\n if (permission === \"deny\") {\n result.skipped.push(filePath)\n continue\n }\n if (permission === \"skip\") {\n // Plan mode: record what would be written but don't write\n result.written.push(filePath)\n continue\n }\n\n if (existsSync(filePath) && !options.overwrite) {\n result.skipped.push(filePath)\n continue\n }\n\n if (options.dryRun) {\n result.written.push(filePath)\n continue\n }\n\n // Create directory structure\n const dir = path.dirname(filePath)\n await fs.mkdir(dir, { recursive: true })\n\n // Write file\n await fs.writeFile(filePath, fileContent, \"utf8\")\n result.written.push(filePath)\n\n // post:file-write hook — post-processing (format, git add, etc.)\n if (globalHooks.has(\"post:file-write\")) {\n await globalHooks.execute(\"post:file-write\", {\n event: \"post:file-write\",\n file: filePath,\n fileContent,\n cwd: options.cwd,\n })\n }\n } catch (error: any) {\n result.errors.push(`${filePath}: ${error.message}`)\n }\n }\n\n return result\n}\n\nexport function resolveOutputDir(\n outputType: string,\n stack: TechStack,\n customDir?: string\n): string {\n if (customDir) return customDir\n\n const config = OUTPUT_CONFIGS[outputType]\n if (!config) return \"generated\"\n\n // Adjust base dir based on project structure\n let baseDir = config.baseDir\n\n if (outputType === \"component\") {\n // Detect existing component directory\n if (stack.srcDir) {\n baseDir = `${stack.srcDir}/components`\n } else {\n baseDir = \"components\"\n }\n }\n\n if (outputType === \"page\") {\n // Detect app dir structure\n const hasAppDir =\n stack.frameworks.find((f) => f.name === \"nextjs\") && stack.srcDir\n if (hasAppDir) {\n baseDir = `${stack.srcDir}/app`\n }\n }\n\n if (outputType === \"api\") {\n const isNextJs = stack.frameworks.find((f) => f.name === \"nextjs\")\n if (isNextJs) {\n baseDir = stack.srcDir ? `${stack.srcDir}/app/api` : \"app/api\"\n }\n }\n\n if (outputType === \"test\") {\n if (stack.testing.includes(\"vitest\") || stack.testing.includes(\"jest\")) {\n baseDir = stack.srcDir || \"src\"\n }\n }\n\n if (outputType === \"workflow\") {\n baseDir = \".github/workflows\"\n }\n\n if (outputType === \"schema\") {\n if (stack.databases.includes(\"prisma\")) {\n baseDir = \"prisma\"\n } else if (stack.srcDir) {\n baseDir = `${stack.srcDir}/schemas`\n }\n }\n\n if (outputType === \"email\") {\n baseDir = stack.srcDir ? `${stack.srcDir}/emails` : \"emails\"\n }\n\n return baseDir\n}\n","import { execa } from \"execa\"\nimport type { HookEvent, HookDefinition, HookContext, HookResult, HookHandler } from \"./types\"\nimport { BLOCKING_EVENTS } from \"./types\"\nimport { logger } from \"@/utils/logger\"\nimport { debug } from \"@/observability\"\nimport { loadAuthConfig, resolveToken } from \"@/utils/auth-store\"\n\n// --- Hook Registry: registration, priority ordering, execution ---\n\ninterface RegisteredHook {\n event: HookEvent\n definition: HookDefinition\n handler: HookHandler\n}\n\nexport class HookRegistry {\n private hooks: Map<HookEvent, RegisteredHook[]> = new Map()\n\n /**\n * Register a hook for an event.\n */\n register(event: HookEvent, definition: HookDefinition): void {\n if (!definition.enabled) return\n\n const handler = this.createHandler(definition)\n const entry: RegisteredHook = { event, definition, handler }\n\n const existing = this.hooks.get(event) || []\n existing.push(entry)\n // Sort by priority (lower number = runs first)\n existing.sort((a, b) => a.definition.priority - b.definition.priority)\n this.hooks.set(event, existing)\n }\n\n /**\n * Execute all hooks for an event. Returns combined result.\n * For blocking events, stops at the first hook that returns { blocked: true }.\n */\n async execute(event: HookEvent, context: HookContext): Promise<HookResult> {\n const registered = this.hooks.get(event)\n if (!registered?.length) {\n return {}\n }\n\n const canBlock = BLOCKING_EVENTS.includes(event)\n let combinedModified: Record<string, unknown> = {}\n\n for (const hook of registered) {\n const start = Date.now()\n try {\n const result = await hook.handler({ ...context, ...combinedModified })\n const duration = Date.now() - start\n\n if (result.modified) {\n combinedModified = { ...combinedModified, ...result.modified }\n }\n\n if (canBlock && result.blocked) {\n debug.hook(hook.definition.name, duration, \"blocked\")\n return {\n blocked: true,\n message: result.message || `Blocked by hook: ${hook.definition.name}`,\n modified: combinedModified,\n }\n }\n\n debug.hook(hook.definition.name, duration, \"ok\")\n } catch (error: any) {\n const duration = Date.now() - start\n debug.hook(hook.definition.name, duration, `error: ${error.message}`)\n logger.warn(`Hook \"${hook.definition.name}\" failed: ${error.message}`)\n // Non-blocking hooks swallow errors; blocking hooks propagate\n if (canBlock) {\n return {\n blocked: true,\n message: `Hook \"${hook.definition.name}\" errored: ${error.message}`,\n }\n }\n }\n }\n\n return { modified: Object.keys(combinedModified).length ? combinedModified : undefined }\n }\n\n /**\n * Check if any hooks are registered for an event.\n */\n has(event: HookEvent): boolean {\n const registered = this.hooks.get(event)\n return !!registered?.length\n }\n\n /**\n * Clear all hooks (useful for testing).\n */\n clear(): void {\n this.hooks.clear()\n }\n\n /**\n * Create a HookHandler from a HookDefinition.\n */\n private createHandler(definition: HookDefinition): HookHandler {\n switch (definition.type) {\n case \"command\":\n return this.createCommandHandler(definition)\n case \"script\":\n return this.createScriptHandler(definition)\n case \"prompt\":\n return this.createPromptHandler(definition)\n default:\n throw new Error(`Unknown hook type: ${definition.type}`)\n }\n }\n\n /**\n * Command hook: runs a shell command with {{variable}} interpolation.\n * Exit code 0 = success, non-zero = blocked (for blocking events).\n */\n private createCommandHandler(definition: HookDefinition): HookHandler {\n return async (context: HookContext): Promise<HookResult> => {\n if (!definition.command) {\n return {}\n }\n\n // Interpolate {{variable}} placeholders\n let cmd = definition.command\n cmd = cmd.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key) => {\n return String(context[key] ?? \"\")\n })\n\n const result = await execa(\"sh\", [\"-c\", cmd], {\n cwd: context.cwd || process.cwd(),\n reject: false,\n timeout: 60_000,\n env: process.env,\n })\n\n if (result.exitCode !== 0) {\n return {\n blocked: true,\n message: result.stderr || result.stdout || `Command hook \"${definition.name}\" failed`,\n }\n }\n\n return {}\n }\n }\n\n /**\n * Script hook: imports and runs a JS/TS module that exports a handler function.\n */\n private createScriptHandler(definition: HookDefinition): HookHandler {\n return async (context: HookContext): Promise<HookResult> => {\n if (!definition.script) {\n return {}\n }\n\n const scriptPath = definition.script.startsWith(\"/\")\n ? definition.script\n : `${context.cwd || process.cwd()}/${definition.script}`\n\n const mod = await import(scriptPath)\n const handler = mod.default || mod.handler || mod\n\n if (typeof handler === \"function\") {\n return await handler(context)\n }\n\n return {}\n }\n }\n\n /**\n * Prompt hook: single-turn LLM call that can block or modify the operation.\n * The prompt template supports {{variable}} interpolation from hook context.\n * The LLM must respond with JSON: { \"action\": \"allow\"|\"block\", \"message\": \"...\", \"modified\": {...} }\n */\n private createPromptHandler(definition: HookDefinition): HookHandler {\n return async (context: HookContext): Promise<HookResult> => {\n if (!definition.prompt) {\n return {}\n }\n\n // Check credentials are available (don't prompt interactively)\n const providerName = definition.provider || loadAuthConfig()?.provider || \"claude-code\"\n const resolved = resolveToken()\n if (!resolved && providerName !== \"claude-code\") {\n logger.warn(\n `Prompt hook \"${definition.name}\" skipped: no credentials available for provider \"${providerName}\"`\n )\n return {}\n }\n\n try {\n // Lazy import to avoid circular deps\n const { createProvider } = await import(\"@/agent/providers\")\n const provider = createProvider(providerName as any, resolved?.token)\n\n // Interpolate {{variable}} placeholders in the prompt template\n let prompt = definition.prompt\n prompt = prompt.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key) => {\n return String(context[key] ?? \"\")\n })\n\n const systemPrompt = `You are a hook validator for agentx. Analyze the following context and respond with ONLY a JSON object (no markdown, no code fences).\n\nResponse format:\n{\"action\": \"allow\", \"message\": \"optional explanation\"}\nOR\n{\"action\": \"block\", \"message\": \"reason for blocking\"}\nOR\n{\"action\": \"allow\", \"message\": \"optional\", \"modified\": {\"key\": \"new value\"}}\n\nThe \"modified\" field is optional and can contain updated values to pass forward.`\n\n const result = await provider.generate(\n [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: prompt },\n ],\n {\n model: definition.model,\n maxTokens: 1024,\n }\n )\n\n // Parse the LLM response as JSON\n const content = result.content.trim()\n // Try to extract JSON from the response (handle markdown fences)\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) {\n logger.warn(`Prompt hook \"${definition.name}\": LLM response was not valid JSON, allowing`)\n return {}\n }\n\n const parsed = JSON.parse(jsonMatch[0])\n\n if (parsed.action === \"block\") {\n return {\n blocked: true,\n message: parsed.message || `Blocked by prompt hook: ${definition.name}`,\n }\n }\n\n if (parsed.modified) {\n return { modified: parsed.modified }\n }\n\n return {}\n } catch (error: any) {\n // Don't block on hook failures — log and continue\n logger.warn(`Prompt hook \"${definition.name}\" failed: ${error.message}`)\n return {}\n }\n }\n }\n}\n","import { z } from \"zod\"\n\n// --- Hook system types ---\n\nexport const HOOK_EVENTS = [\n \"pre:generate\",\n \"post:generate\",\n \"pre:file-write\",\n \"post:file-write\",\n \"pre:prompt\",\n \"post:response\",\n \"pre:command\",\n \"on:error\",\n \"pre:tool-call\",\n \"post:tool-call\",\n // Daemon events\n \"pre:channel-message\",\n \"post:channel-message\",\n \"pre:a2a-task\",\n \"pre:cron-run\",\n \"post:cron-run\",\n] as const\n\nexport type HookEvent = (typeof HOOK_EVENTS)[number]\n\n// Which hooks can block (return { blocked: true } to cancel the operation)\nexport const BLOCKING_EVENTS: HookEvent[] = [\n \"pre:generate\",\n \"pre:file-write\",\n \"pre:prompt\",\n \"post:response\",\n \"pre:command\",\n \"pre:tool-call\",\n // Daemon blocking events\n \"pre:channel-message\",\n \"post:channel-message\",\n \"pre:a2a-task\",\n \"pre:cron-run\",\n]\n\nexport type HookType = \"command\" | \"prompt\" | \"script\"\n\nexport const hookDefinitionSchema = z.object({\n name: z.string(),\n type: z.enum([\"command\", \"prompt\", \"script\"]),\n // For \"command\" type: shell command with {{variable}} interpolation\n command: z.string().optional(),\n // For \"prompt\" type: LLM prompt template\n prompt: z.string().optional(),\n // For \"prompt\" type: override provider/model for this hook\n provider: z.enum([\"claude-code\", \"claude\", \"openai\", \"ollama\", \"custom\"]).optional(),\n model: z.string().optional(),\n // For \"script\" type: path to JS/TS file exporting a handler\n script: z.string().optional(),\n // Hook priority (lower runs first, default 100)\n priority: z.number().default(100),\n // Whether this hook is enabled\n enabled: z.boolean().default(true),\n})\n\nexport type HookDefinition = z.infer<typeof hookDefinitionSchema>\n\nexport interface HookContext {\n event: HookEvent\n // Data varies by event\n task?: string\n file?: string\n fileContent?: string\n content?: string\n command?: string\n error?: Error\n cwd?: string\n [key: string]: unknown\n}\n\nexport interface HookResult {\n // If true, the operation is blocked/cancelled\n blocked?: boolean\n // Optional message explaining why it was blocked\n message?: string\n // Modified data to pass forward (e.g., modified file content)\n modified?: Record<string, unknown>\n}\n\nexport type HookHandler = (context: HookContext) => Promise<HookResult>\n","// --- Usage tracking: tokens, cost, per-step and per-model breakdown ---\n\nexport interface StepUsage {\n step: number\n model: string\n inputTokens: number\n outputTokens: number\n cost: number\n timestamp: number\n}\n\nexport interface ModelUsage {\n inputTokens: number\n outputTokens: number\n cost: number\n steps: number\n}\n\nexport interface UsageSummary {\n totalInputTokens: number\n totalOutputTokens: number\n totalTokens: number\n totalCost: number\n steps: StepUsage[]\n models: Record<string, ModelUsage>\n}\n\n// Cost per million tokens (input / output)\nconst MODEL_PRICING: Record<string, { input: number; output: number }> = {\n \"claude-sonnet\": { input: 3, output: 15 },\n \"claude-opus\": { input: 15, output: 75 },\n \"claude-haiku\": { input: 0.25, output: 1.25 },\n}\n\nfunction getModelFamily(model: string): string {\n const lower = model.toLowerCase()\n if (lower.includes(\"opus\")) return \"claude-opus\"\n if (lower.includes(\"haiku\")) return \"claude-haiku\"\n return \"claude-sonnet\" // default\n}\n\nexport class UsageTracker {\n private steps: StepUsage[] = []\n private models: Map<string, ModelUsage> = new Map()\n\n recordStep(\n step: number,\n model: string,\n inputTokens: number,\n outputTokens: number\n ): void {\n const family = getModelFamily(model)\n const pricing = MODEL_PRICING[family] || MODEL_PRICING[\"claude-sonnet\"]\n const cost =\n (inputTokens / 1_000_000) * pricing.input +\n (outputTokens / 1_000_000) * pricing.output\n\n this.steps.push({\n step,\n model,\n inputTokens,\n outputTokens,\n cost,\n timestamp: Date.now(),\n })\n\n const existing = this.models.get(model) || {\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n steps: 0,\n }\n existing.inputTokens += inputTokens\n existing.outputTokens += outputTokens\n existing.cost += cost\n existing.steps++\n this.models.set(model, existing)\n }\n\n getSummary(): UsageSummary {\n let totalInputTokens = 0\n let totalOutputTokens = 0\n let totalCost = 0\n\n for (const step of this.steps) {\n totalInputTokens += step.inputTokens\n totalOutputTokens += step.outputTokens\n totalCost += step.cost\n }\n\n const models: Record<string, ModelUsage> = {}\n for (const [name, usage] of this.models) {\n models[name] = { ...usage }\n }\n\n return {\n totalInputTokens,\n totalOutputTokens,\n totalTokens: totalInputTokens + totalOutputTokens,\n totalCost,\n steps: [...this.steps],\n models,\n }\n }\n\n reset(): void {\n this.steps = []\n this.models.clear()\n }\n}\n\nexport const globalTracker = new UsageTracker()\n","// --- Debug mode: timestamped verbose logging ---\n\nimport chalk from \"chalk\"\n\nlet debugEnabled = false\n\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled\n}\n\nexport function isDebug(): boolean {\n return debugEnabled\n}\n\nfunction timestamp(): string {\n return new Date().toISOString().slice(11, 23) // HH:mm:ss.SSS\n}\n\nexport const debug = {\n log(...args: unknown[]): void {\n if (!debugEnabled) return\n console.log(chalk.dim(`[${timestamp()}]`), ...args)\n },\n\n step(step: number, message: string): void {\n if (!debugEnabled) return\n console.log(chalk.dim(`[${timestamp()}]`), chalk.blue(`[step ${step}]`), message)\n },\n\n hook(name: string, duration: number, result: string): void {\n if (!debugEnabled) return\n console.log(\n chalk.dim(`[${timestamp()}]`),\n chalk.magenta(`[hook]`),\n `${name} (${duration}ms) → ${result}`\n )\n },\n\n api(method: string, model: string, tokens?: number): void {\n if (!debugEnabled) return\n const tokenStr = tokens ? ` (${tokens} tokens)` : \"\"\n console.log(\n chalk.dim(`[${timestamp()}]`),\n chalk.yellow(`[api]`),\n `${method} → ${model}${tokenStr}`\n )\n },\n\n tokens(input: number, output: number, cost: number): void {\n if (!debugEnabled) return\n console.log(\n chalk.dim(`[${timestamp()}]`),\n chalk.green(`[tokens]`),\n `in: ${input.toLocaleString()}, out: ${output.toLocaleString()}, cost: $${cost.toFixed(4)}`\n )\n },\n\n context(label: string, detail: string): void {\n if (!debugEnabled) return\n console.log(chalk.dim(`[${timestamp()}]`), chalk.cyan(`[${label}]`), detail)\n },\n}\n","// --- Session export: convert a session to readable markdown ---\n\nimport type { Session } from \"@/repl/session\"\nimport type { UsageSummary } from \"./tracker\"\n\nexport function exportSession(session: Session, usage?: UsageSummary): string {\n const lines: string[] = []\n\n // Header\n lines.push(`# Session: ${session.id}`)\n lines.push(\"\")\n lines.push(`- **Created**: ${session.createdAt}`)\n lines.push(`- **Updated**: ${session.updatedAt}`)\n lines.push(`- **CWD**: ${session.cwd}`)\n lines.push(`- **Messages**: ${session.messages.length}`)\n lines.push(`- **Tokens**: ${session.tokensUsed.toLocaleString()}`)\n lines.push(\"\")\n\n // Files generated\n if (session.filesGenerated.length) {\n lines.push(\"## Files Generated\")\n lines.push(\"\")\n for (const file of session.filesGenerated) {\n lines.push(`- \\`${file}\\``)\n }\n lines.push(\"\")\n }\n\n // Conversation\n if (session.messages.length) {\n lines.push(\"## Conversation\")\n lines.push(\"\")\n for (const msg of session.messages) {\n if (msg.role === \"system\") continue\n const label = msg.role === \"user\" ? \"**User**\" : \"**Assistant**\"\n lines.push(`### ${label}`)\n lines.push(\"\")\n if (msg.role === \"assistant\") {\n lines.push(msg.content)\n } else {\n lines.push(msg.content)\n }\n lines.push(\"\")\n }\n }\n\n // Cost summary\n if (usage) {\n lines.push(\"## Cost Summary\")\n lines.push(\"\")\n lines.push(`- **Total tokens**: ${usage.totalTokens.toLocaleString()}`)\n lines.push(` - Input: ${usage.totalInputTokens.toLocaleString()}`)\n lines.push(` - Output: ${usage.totalOutputTokens.toLocaleString()}`)\n lines.push(`- **Total cost**: $${usage.totalCost.toFixed(4)}`)\n lines.push(\"\")\n\n if (Object.keys(usage.models).length) {\n lines.push(\"### Per Model\")\n lines.push(\"\")\n lines.push(\"| Model | Input | Output | Cost | Steps |\")\n lines.push(\"|-------|-------|--------|------|-------|\")\n for (const [model, mu] of Object.entries(usage.models)) {\n lines.push(\n `| ${model} | ${mu.inputTokens.toLocaleString()} | ${mu.outputTokens.toLocaleString()} | $${mu.cost.toFixed(4)} | ${mu.steps} |`\n )\n }\n lines.push(\"\")\n }\n\n if (usage.steps.length) {\n lines.push(\"### Per Step\")\n lines.push(\"\")\n lines.push(\"| Step | Model | Input | Output | Cost |\")\n lines.push(\"|------|-------|-------|--------|------|\")\n for (const step of usage.steps) {\n lines.push(\n `| ${step.step} | ${step.model} | ${step.inputTokens.toLocaleString()} | ${step.outputTokens.toLocaleString()} | $${step.cost.toFixed(4)} |`\n )\n }\n lines.push(\"\")\n }\n }\n\n return lines.join(\"\\n\")\n}\n","import { existsSync, readFileSync, readdirSync } from \"fs\"\nimport path from \"path\"\nimport type { HookEvent, HookDefinition } from \"./types\"\nimport { HOOK_EVENTS, hookDefinitionSchema } from \"./types\"\nimport { HookRegistry } from \"./registry\"\nimport { logger } from \"@/utils/logger\"\n\n// --- Hook Loader: load hooks from config and .agentx/hooks/ ---\n\ninterface HooksConfig {\n hooks?: Partial<Record<HookEvent, HookDefinition[]>>\n}\n\n/**\n * Load hooks from agentx.config.json and .agentx/hooks/ directory.\n */\nexport function loadHooks(cwd: string, registry: HookRegistry): void {\n loadHooksFromConfig(cwd, registry)\n loadHooksFromDirectory(cwd, registry)\n}\n\n/**\n * Load hook definitions from agentx.config.json.\n */\nfunction loadHooksFromConfig(cwd: string, registry: HookRegistry): void {\n const configPath = path.join(cwd, \"agentx.config.json\")\n if (!existsSync(configPath)) return\n\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf8\")) as HooksConfig\n if (!raw.hooks) return\n\n for (const [eventName, definitions] of Object.entries(raw.hooks)) {\n if (!HOOK_EVENTS.includes(eventName as HookEvent)) {\n logger.warn(`Unknown hook event in config: ${eventName}`)\n continue\n }\n\n const event = eventName as HookEvent\n if (!Array.isArray(definitions)) continue\n\n for (const def of definitions) {\n try {\n const parsed = hookDefinitionSchema.parse(def)\n registry.register(event, parsed)\n } catch (error: any) {\n logger.warn(`Invalid hook definition for ${event}: ${error.message}`)\n }\n }\n }\n } catch (error: any) {\n logger.warn(`Failed to load hooks from config: ${error.message}`)\n }\n}\n\n/**\n * Load hook scripts from .agentx/hooks/ directory.\n * Files are named <event>.<name>.ts (e.g., pre-file-write.format.ts).\n */\nfunction loadHooksFromDirectory(cwd: string, registry: HookRegistry): void {\n const hooksDir = path.join(cwd, \".agentx\", \"hooks\")\n if (!existsSync(hooksDir)) return\n\n try {\n const files = readdirSync(hooksDir).filter(\n (f) => f.endsWith(\".ts\") || f.endsWith(\".js\") || f.endsWith(\".mjs\")\n )\n\n for (const file of files) {\n // Parse filename: <event>.<name>.<ext>\n // Event uses dashes in filename: pre-file-write → pre:file-write\n const parts = file.replace(/\\.(ts|js|mjs)$/, \"\").split(\".\")\n if (parts.length < 2) {\n logger.warn(`Hook file \"${file}\" should be named <event>.<name>.<ext>`)\n continue\n }\n\n const eventSlug = parts[0]\n const name = parts.slice(1).join(\".\")\n\n // Convert slug to event name: pre-file-write → pre:file-write\n const eventName = eventSlug.replace(/-/g, \":\") as HookEvent\n if (!HOOK_EVENTS.includes(eventName)) {\n // Try replacing first dash only: pre-generate → pre:generate\n const altEvent = eventSlug.replace(\"-\", \":\") as HookEvent\n if (!HOOK_EVENTS.includes(altEvent)) {\n logger.warn(`Unknown hook event in filename: ${file}`)\n continue\n }\n registry.register(altEvent, {\n name,\n type: \"script\",\n script: path.join(hooksDir, file),\n priority: 100,\n enabled: true,\n })\n continue\n }\n\n registry.register(eventName, {\n name,\n type: \"script\",\n script: path.join(hooksDir, file),\n priority: 100,\n enabled: true,\n })\n }\n } catch (error: any) {\n logger.warn(`Failed to load hooks from directory: ${error.message}`)\n }\n}\n","export { HookRegistry } from \"./registry\"\nexport { loadHooks } from \"./loader\"\nexport type { HookEvent, HookDefinition, HookContext, HookResult, HookHandler } from \"./types\"\nexport { HOOK_EVENTS, BLOCKING_EVENTS } from \"./types\"\n\nimport { HookRegistry } from \"./registry\"\n\n// Singleton hook registry for the CLI process\nexport const globalHooks = new HookRegistry()\n","// --- Permission Manager: checking and inline prompts for file writes ---\n\nimport prompts from \"prompts\"\nimport chalk from \"chalk\"\nimport type { PermissionMode, PermissionConfig } from \"./types\"\nimport { permissionConfigSchema } from \"./types\"\nimport { debug } from \"@/observability\"\n\nexport type PermissionAction = \"allow\" | \"deny\" | \"skip\"\n\n/**\n * Simple glob matching: supports *, **, and ? wildcards.\n */\nfunction matchGlob(filePath: string, pattern: string): boolean {\n // Convert glob pattern to regex\n let regex = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\")\n .replace(/\\?/g, \"[^/]\")\n return new RegExp(`^${regex}$`).test(filePath)\n}\n\nexport class PermissionManager {\n private mode: PermissionMode\n private allowPatterns: string[]\n private denyPatterns: string[]\n private confirmPatterns: string[]\n private autoAllowAll = false // set when user picks \"all\" in interactive prompt\n\n constructor(config?: Partial<PermissionConfig>) {\n const parsed = permissionConfigSchema.parse(config || {})\n this.mode = parsed.mode\n this.allowPatterns = parsed.allow\n this.denyPatterns = parsed.deny\n this.confirmPatterns = parsed.confirm\n }\n\n getMode(): PermissionMode {\n return this.mode\n }\n\n setMode(mode: PermissionMode): void {\n this.mode = mode\n this.autoAllowAll = false // reset on mode change\n debug.context(\"permissions\", `mode set to ${mode}`)\n }\n\n /**\n * Check whether a file write should proceed.\n */\n async checkFileWrite(filePath: string): Promise<PermissionAction> {\n debug.context(\"permissions\", `checking write: ${filePath} (mode: ${this.mode})`)\n\n // Always deny files matching deny patterns\n if (this.matchesAny(filePath, this.denyPatterns)) {\n debug.context(\"permissions\", `denied by pattern: ${filePath}`)\n return \"deny\"\n }\n\n switch (this.mode) {\n case \"yolo\":\n return \"allow\"\n\n case \"plan\":\n return \"skip\"\n\n case \"acceptEdits\":\n return \"allow\"\n\n case \"default\":\n // If user already chose \"all\", auto-allow\n if (this.autoAllowAll) return \"allow\"\n\n // Auto-allow if matches allow patterns\n if (this.matchesAny(filePath, this.allowPatterns)) {\n return \"allow\"\n }\n\n // Must confirm if matches confirm patterns or no patterns match\n return this.promptUser(filePath)\n\n default:\n return \"allow\"\n }\n }\n\n /**\n * Check whether a command should proceed (for pre:command hook).\n */\n async checkCommand(command: string): Promise<\"allow\" | \"deny\"> {\n if (this.mode === \"yolo\") return \"allow\"\n if (this.mode === \"plan\") return \"deny\"\n // For default and acceptEdits, commands are allowed\n return \"allow\"\n }\n\n private matchesAny(filePath: string, patterns: string[]): boolean {\n return patterns.some((p) => matchGlob(filePath, p))\n }\n\n private async promptUser(filePath: string): Promise<PermissionAction> {\n const { action } = await prompts({\n type: \"select\",\n name: \"action\",\n message: `Write file ${chalk.cyan(filePath)}?`,\n choices: [\n { title: \"Yes\", value: \"allow\" },\n { title: \"No\", value: \"deny\" },\n { title: \"All (allow remaining)\", value: \"all\" },\n { title: \"Skip\", value: \"skip\" },\n ],\n initial: 0,\n })\n\n if (action === \"all\") {\n this.autoAllowAll = true\n return \"allow\"\n }\n\n return action || \"deny\"\n }\n}\n\nexport const globalPermissions = new PermissionManager()\n","// --- Permission mode definitions and config schema ---\n\nimport { z } from \"zod\"\n\nexport const PERMISSION_MODES = [\"default\", \"acceptEdits\", \"plan\", \"yolo\"] as const\nexport type PermissionMode = (typeof PERMISSION_MODES)[number]\n\nexport const permissionModeSchema = z.enum(PERMISSION_MODES)\n\nexport interface PermissionRule {\n pattern: string\n action: \"allow\" | \"deny\" | \"confirm\"\n}\n\nexport const permissionConfigSchema = z.object({\n mode: permissionModeSchema.default(\"default\"),\n allow: z.array(z.string()).default([]),\n deny: z.array(z.string()).default([]),\n confirm: z.array(z.string()).default([]),\n})\n\nexport type PermissionConfig = z.infer<typeof permissionConfigSchema>\n","// --- Memory Hierarchy: user-level + project-level layered memory ---\n\nimport os from \"os\"\nimport { Memory, type UserPreference, type MemoryEntry, type LearnedPattern, type MemoryStore } from \"@/runtime/memory\"\n\nconst USER_MEMORY_DIR = os.homedir()\n\nexport class MemoryHierarchy {\n private userMemory: Memory\n private projectMemory: Memory\n\n constructor(private cwd: string) {\n // User-level memory at ~/.agentx/memory.json\n this.userMemory = new Memory(USER_MEMORY_DIR)\n // Project-level memory at <cwd>/.agentx/memory.json\n this.projectMemory = new Memory(cwd)\n }\n\n async load(): Promise<void> {\n await Promise.all([this.userMemory.load(), this.projectMemory.load()])\n }\n\n async save(): Promise<void> {\n await Promise.all([this.userMemory.save(), this.projectMemory.save()])\n }\n\n /**\n * Build merged memory context for the agent. Project overrides user.\n */\n buildMemoryContext(task: string): string {\n const userCtx = this.userMemory.buildMemoryContext(task)\n const projectCtx = this.projectMemory.buildMemoryContext(task)\n\n if (!userCtx && !projectCtx) return \"\"\n\n const sections: string[] = []\n if (projectCtx) {\n sections.push(projectCtx)\n }\n if (userCtx) {\n // Prefix user-level context to distinguish it\n sections.push(\n userCtx.replace(\n \"# Memory (learned from past interactions)\",\n \"# Global Memory (cross-project patterns)\"\n )\n )\n }\n\n return sections.join(\"\\n\\n\")\n }\n\n /**\n * Learn a preference at user level (global).\n */\n async learnPreference(key: string, value: string, source: string): Promise<void> {\n await this.userMemory.learnPreference(key, value, source)\n }\n\n /**\n * Record a generation at project level (task-specific).\n */\n async recordGeneration(\n entry: Omit<MemoryEntry, \"id\" | \"timestamp\" | \"type\"> & { type?: MemoryEntry[\"type\"] }\n ): Promise<string> {\n return this.projectMemory.recordGeneration(entry)\n }\n\n /**\n * Get combined preferences (project overrides user for same keys).\n */\n getPreferences(): UserPreference[] {\n const userPrefs = this.userMemory.getPreferences()\n const projectPrefs = this.projectMemory.getPreferences()\n\n const merged = new Map<string, UserPreference>()\n for (const p of userPrefs) {\n merged.set(p.key, p)\n }\n for (const p of projectPrefs) {\n merged.set(p.key, p) // project overrides\n }\n return Array.from(merged.values())\n }\n\n /**\n * Get combined patterns from both levels.\n */\n getPatterns(): LearnedPattern[] {\n const userPatterns = this.userMemory.getPatterns()\n const projectPatterns = this.projectMemory.getPatterns()\n return [...projectPatterns, ...userPatterns]\n }\n\n /**\n * Get stats from both levels.\n */\n getStats(): { user: MemoryStore[\"stats\"]; project: MemoryStore[\"stats\"] } {\n return {\n user: this.userMemory.getStats(),\n project: this.projectMemory.getStats(),\n }\n }\n\n /**\n * Get recent generations from project level.\n */\n getRecentGenerations(limit = 10): MemoryEntry[] {\n return this.projectMemory.getRecentGenerations(limit)\n }\n}\n","// --- Context Builder: smart assembly with @-import resolution and relevance trimming ---\n\nimport { existsSync, readFileSync } from \"fs\"\nimport path from \"path\"\n\ninterface ContextSection {\n label: string\n content: string\n priority: number // higher = more important\n}\n\n/**\n * Resolve @-imports in content: replace @path/to/file with file contents.\n */\nexport function resolveAtImports(content: string, basedir: string): string {\n return content.replace(/@([\\w./-]+)/g, (match, filePath: string) => {\n const resolved = path.resolve(basedir, filePath)\n if (existsSync(resolved)) {\n try {\n return readFileSync(resolved, \"utf8\")\n } catch {\n return match // keep original if read fails\n }\n }\n return match // keep original if file doesn't exist\n })\n}\n\n/**\n * Load project instructions from SHADXN.md or CLAUDE.md.\n */\nexport function loadProjectInstructions(cwd: string): string {\n const candidates = [\"SHADXN.md\", \"CLAUDE.md\"]\n for (const name of candidates) {\n const filePath = path.join(cwd, name)\n if (existsSync(filePath)) {\n try {\n let content = readFileSync(filePath, \"utf8\")\n content = resolveAtImports(content, cwd)\n return content\n } catch {\n // skip if unreadable\n }\n }\n }\n return \"\"\n}\n\n/**\n * Estimate token count from content (rough chars-to-tokens).\n */\nfunction estimateTokens(content: string): number {\n return Math.ceil(content.length / 4)\n}\n\n/**\n * Score a section's relevance to a task via word overlap.\n */\nfunction scoreRelevance(section: string, task: string): number {\n const taskWords = new Set(\n task.toLowerCase().split(/\\s+/).filter((w) => w.length > 3)\n )\n if (taskWords.size === 0) return 0\n\n const sectionWords = new Set(\n section.toLowerCase().split(/\\s+/).filter((w) => w.length > 3)\n )\n let overlap = 0\n for (const w of taskWords) {\n if (sectionWords.has(w)) overlap++\n }\n return overlap / taskWords.size\n}\n\nexport class ContextBuilder {\n private sections: ContextSection[] = []\n\n addSection(label: string, content: string, priority = 50): void {\n if (!content.trim()) return\n this.sections.push({ label, content, priority })\n }\n\n /**\n * Build final context, trimming lowest-relevance sections if over budget.\n */\n buildContext(task: string, maxTokens = 12000): string {\n if (this.sections.length === 0) return \"\"\n\n // Score each section by priority + relevance\n const scored = this.sections.map((s) => ({\n ...s,\n relevance: scoreRelevance(s.content, task),\n tokens: estimateTokens(s.content),\n }))\n\n // Sort by combined score (priority weight + relevance)\n scored.sort(\n (a, b) => b.priority + b.relevance * 100 - (a.priority + a.relevance * 100)\n )\n\n // Include sections until budget is exceeded\n const included: typeof scored = []\n let totalTokens = 0\n\n for (const section of scored) {\n if (totalTokens + section.tokens > maxTokens && included.length > 0) {\n // Skip this section — over budget\n continue\n }\n included.push(section)\n totalTokens += section.tokens\n }\n\n return included.map((s) => s.content).join(\"\\n\\n\")\n }\n}\n","// --- Tool Executor: runs tool calls with permission and hook integration ---\n\nimport { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { execa } from \"execa\"\nimport fg from \"fast-glob\"\nimport { globalPermissions } from \"@/permissions\"\nimport { globalHooks } from \"@/hooks\"\nimport { debug } from \"@/observability\"\nimport type { GeneratedFile } from \"../providers/types\"\n\nexport interface ToolCallInput {\n name: string\n id: string\n input: Record<string, unknown>\n}\n\nexport interface ToolResult {\n tool_use_id: string\n content: string\n is_error?: boolean\n /** Files collected from create_files calls */\n files?: GeneratedFile[]\n /** Question from ask_user calls */\n followUp?: string\n}\n\nexport interface ToolExecutorOptions {\n interactive?: boolean\n overwrite?: boolean\n dryRun?: boolean\n}\n\nexport class ToolExecutor {\n private cwd: string\n private options: ToolExecutorOptions\n\n constructor(cwd: string, options: ToolExecutorOptions = {}) {\n this.cwd = cwd\n this.options = options\n }\n\n async execute(call: ToolCallInput): Promise<ToolResult> {\n debug.context(\"tool-executor\", `executing: ${call.name}`)\n\n // pre:tool-call hook\n if (globalHooks.has(\"pre:tool-call\")) {\n const hookResult = await globalHooks.execute(\"pre:tool-call\", {\n event: \"pre:tool-call\" as any,\n toolName: call.name,\n toolInput: call.input,\n cwd: this.cwd,\n })\n if (hookResult.blocked) {\n return {\n tool_use_id: call.id,\n content: hookResult.message || `Tool ${call.name} blocked by pre:tool-call hook`,\n is_error: true,\n }\n }\n }\n\n let result: ToolResult\n\n try {\n switch (call.name) {\n case \"read_file\":\n result = await this.readFile(call)\n break\n case \"search_files\":\n result = await this.searchFiles(call)\n break\n case \"list_directory\":\n result = await this.listDirectory(call)\n break\n case \"run_command\":\n result = await this.runCommand(call)\n break\n case \"edit_file\":\n result = await this.editFile(call)\n break\n case \"create_files\":\n result = await this.createFiles(call)\n break\n case \"ask_user\":\n result = await this.askUser(call)\n break\n default:\n result = {\n tool_use_id: call.id,\n content: `Unknown tool: ${call.name}`,\n is_error: true,\n }\n }\n } catch (error: any) {\n result = {\n tool_use_id: call.id,\n content: `Error executing ${call.name}: ${error.message}`,\n is_error: true,\n }\n }\n\n // post:tool-call hook\n if (globalHooks.has(\"post:tool-call\")) {\n await globalHooks.execute(\"post:tool-call\", {\n event: \"post:tool-call\" as any,\n toolName: call.name,\n toolInput: call.input,\n toolResult: result.content,\n cwd: this.cwd,\n })\n }\n\n return result\n }\n\n private async readFile(call: ToolCallInput): Promise<ToolResult> {\n const filePath = String(call.input.path || \"\")\n const maxLines = Number(call.input.max_lines) || 500\n const absPath = path.resolve(this.cwd, filePath)\n\n const content = await fs.readFile(absPath, \"utf8\")\n const lines = content.split(\"\\n\")\n const truncated = lines.length > maxLines\n const output = truncated\n ? lines.slice(0, maxLines).join(\"\\n\") + `\\n\\n... (truncated, ${lines.length - maxLines} more lines)`\n : content\n\n return {\n tool_use_id: call.id,\n content: output,\n }\n }\n\n private async searchFiles(call: ToolCallInput): Promise<ToolResult> {\n const pattern = String(call.input.pattern || \"**/*\")\n const contentRegex = call.input.content_regex ? String(call.input.content_regex) : undefined\n const maxResults = Number(call.input.max_results) || 50\n\n const files = await fg(pattern, {\n cwd: this.cwd,\n ignore: [\"node_modules/**\", \".git/**\", \"dist/**\", \".next/**\"],\n dot: false,\n })\n\n if (!contentRegex) {\n const limited = files.slice(0, maxResults)\n return {\n tool_use_id: call.id,\n content: limited.length\n ? limited.join(\"\\n\") + (files.length > maxResults ? `\\n\\n... (${files.length - maxResults} more files)` : \"\")\n : \"No files matched the pattern.\",\n }\n }\n\n // Search content within matched files\n const regex = new RegExp(contentRegex, \"gm\")\n const results: string[] = []\n\n for (const file of files) {\n if (results.length >= maxResults) break\n try {\n const content = await fs.readFile(path.resolve(this.cwd, file), \"utf8\")\n const lines = content.split(\"\\n\")\n for (let i = 0; i < lines.length; i++) {\n if (results.length >= maxResults) break\n if (regex.test(lines[i])) {\n results.push(`${file}:${i + 1}: ${lines[i]}`)\n }\n regex.lastIndex = 0\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n tool_use_id: call.id,\n content: results.length\n ? results.join(\"\\n\")\n : \"No matches found.\",\n }\n }\n\n private async listDirectory(call: ToolCallInput): Promise<ToolResult> {\n const dirPath = String(call.input.path || \".\")\n const recursive = Boolean(call.input.recursive)\n const maxDepth = Number(call.input.max_depth) || 3\n const absPath = path.resolve(this.cwd, dirPath)\n\n if (recursive) {\n const pattern = \"**/*\"\n const entries = await fg(pattern, {\n cwd: absPath,\n onlyFiles: false,\n markDirectories: true,\n deep: maxDepth,\n ignore: [\"node_modules/**\", \".git/**\", \"dist/**\", \".next/**\"],\n })\n return {\n tool_use_id: call.id,\n content: entries.length ? entries.join(\"\\n\") : \"Empty directory.\",\n }\n }\n\n const entries = await fs.readdir(absPath, { withFileTypes: true })\n const formatted = entries.map((e) =>\n e.isDirectory() ? `${e.name}/` : e.name\n )\n\n return {\n tool_use_id: call.id,\n content: formatted.length ? formatted.join(\"\\n\") : \"Empty directory.\",\n }\n }\n\n private async runCommand(call: ToolCallInput): Promise<ToolResult> {\n const command = String(call.input.command || \"\")\n const timeout = Number(call.input.timeout) || 30_000\n\n // Check permissions\n const permission = await globalPermissions.checkCommand(command)\n if (permission === \"deny\") {\n return {\n tool_use_id: call.id,\n content: `Command blocked by permissions (mode: ${globalPermissions.getMode()}): ${command}`,\n is_error: true,\n }\n }\n\n // pre:command hook\n if (globalHooks.has(\"pre:command\")) {\n const hookResult = await globalHooks.execute(\"pre:command\", {\n event: \"pre:command\",\n command,\n cwd: this.cwd,\n })\n if (hookResult.blocked) {\n return {\n tool_use_id: call.id,\n content: hookResult.message || `Command blocked by pre:command hook: ${command}`,\n is_error: true,\n }\n }\n }\n\n const result = await execa(\"sh\", [\"-c\", command], {\n cwd: this.cwd,\n timeout,\n reject: false,\n stdin: \"ignore\",\n })\n\n const output = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\")\n const truncated = output.length > 10_000\n ? output.slice(0, 10_000) + \"\\n\\n... (output truncated)\"\n : output\n\n if (result.exitCode !== 0) {\n return {\n tool_use_id: call.id,\n content: `Command exited with code ${result.exitCode}:\\n${truncated}`,\n is_error: true,\n }\n }\n\n return {\n tool_use_id: call.id,\n content: truncated || \"(no output)\",\n }\n }\n\n private async editFile(call: ToolCallInput): Promise<ToolResult> {\n const filePath = String(call.input.path || \"\")\n const edits = call.input.edits as Array<{ old_text: string; new_text: string }> | undefined\n const absPath = path.resolve(this.cwd, filePath)\n\n if (!edits || edits.length === 0) {\n return {\n tool_use_id: call.id,\n content: \"No edits provided.\",\n is_error: true,\n }\n }\n\n // Check write permission\n const permission = await globalPermissions.checkFileWrite(filePath)\n if (permission === \"deny\") {\n return {\n tool_use_id: call.id,\n content: `File write blocked by permissions: ${filePath}`,\n is_error: true,\n }\n }\n if (permission === \"skip\") {\n return {\n tool_use_id: call.id,\n content: `File write skipped (plan mode): ${filePath}`,\n }\n }\n\n // pre:file-write hook\n if (globalHooks.has(\"pre:file-write\")) {\n const hookResult = await globalHooks.execute(\"pre:file-write\", {\n event: \"pre:file-write\",\n file: absPath,\n cwd: this.cwd,\n })\n if (hookResult.blocked) {\n return {\n tool_use_id: call.id,\n content: hookResult.message || `File edit blocked by pre:file-write hook: ${filePath}`,\n is_error: true,\n }\n }\n }\n\n let content = await fs.readFile(absPath, \"utf8\")\n const applied: string[] = []\n\n for (const edit of edits) {\n if (content.includes(edit.old_text)) {\n content = content.replace(edit.old_text, edit.new_text)\n applied.push(`Replaced: \"${edit.old_text.slice(0, 40)}...\"`)\n } else {\n applied.push(`Not found: \"${edit.old_text.slice(0, 40)}...\"`)\n }\n }\n\n if (!this.options.dryRun) {\n await fs.writeFile(absPath, content, \"utf8\")\n }\n\n // post:file-write hook\n if (globalHooks.has(\"post:file-write\")) {\n await globalHooks.execute(\"post:file-write\", {\n event: \"post:file-write\",\n file: absPath,\n fileContent: content,\n cwd: this.cwd,\n })\n }\n\n return {\n tool_use_id: call.id,\n content: `Edited ${filePath}:\\n${applied.join(\"\\n\")}`,\n }\n }\n\n private async createFiles(call: ToolCallInput): Promise<ToolResult> {\n const input = call.input as {\n files?: GeneratedFile[]\n summary?: string\n }\n\n const files = input.files || []\n\n return {\n tool_use_id: call.id,\n content: input.summary || `Queued ${files.length} file(s) for creation.`,\n files,\n }\n }\n\n private async askUser(call: ToolCallInput): Promise<ToolResult> {\n const question = String(call.input.question || \"\")\n const options = call.input.options as string[] | undefined\n\n let followUp = question\n if (options?.length) {\n followUp += `\\nOptions: ${options.join(\", \")}`\n }\n\n return {\n tool_use_id: call.id,\n content: \"Question sent to user.\",\n followUp,\n }\n }\n}\n","// --- Agentic Orchestrator: tool_result feedback loop ---\n\nimport type {\n AgentProvider,\n GenerationMessage,\n GeneratedFile,\n ProviderOptions,\n AnthropicMessage,\n ContentBlock,\n RawGenerationResult,\n} from \"./providers/types\"\nimport { ToolExecutor, type ToolResult } from \"./tools\"\nimport { getAnthropicTools, formatToolsForSystemPrompt } from \"./tools\"\nimport { debug } from \"@/observability\"\n\nexport interface AgenticLoopOptions {\n provider: AgentProvider\n systemPrompt: string\n messages: GenerationMessage[]\n providerOptions: ProviderOptions\n cwd: string\n maxIterations?: number\n enabledTools?: string[]\n interactive?: boolean\n overwrite?: boolean\n dryRun?: boolean\n onProgress?: (event: AgenticProgressEvent) => void\n}\n\nexport type AgenticProgressEvent =\n | { type: \"iteration_start\"; iteration: number }\n | { type: \"tool_call\"; name: string; id: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; name: string; id: string; content: string; is_error?: boolean }\n | { type: \"text_delta\"; text: string }\n | { type: \"files_created\"; files: GeneratedFile[] }\n | { type: \"complete\"; iterations: number; totalTokens: number }\n\nexport interface AgenticResult {\n files: GeneratedFile[]\n content: string\n followUp?: string\n tokensUsed: number\n iterations: number\n}\n\n/**\n * Run the agentic tool_result loop.\n * The LLM decides what tools to call (read files, search, edit, etc.)\n * and we feed results back until it signals completion.\n */\nexport async function runAgenticLoop(options: AgenticLoopOptions): Promise<AgenticResult> {\n const {\n provider,\n systemPrompt,\n messages: inputMessages,\n providerOptions,\n cwd,\n maxIterations = 20,\n enabledTools,\n interactive = true,\n overwrite = false,\n dryRun = false,\n onProgress,\n } = options\n\n // Check if provider supports generateRaw\n if (!provider.generateRaw) {\n return runLegacyLoop(options)\n }\n\n const executor = new ToolExecutor(cwd, { interactive, overwrite, dryRun })\n const tools = getAnthropicTools(enabledTools)\n\n // Convert GenerationMessage[] to AnthropicMessage[] (strip system messages)\n const anthropicMessages: AnthropicMessage[] = inputMessages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n }))\n\n const allFiles: GeneratedFile[] = []\n let totalTokens = 0\n let textContent = \"\"\n let followUp: string | undefined\n let iteration = 0\n\n while (iteration < maxIterations) {\n iteration++\n onProgress?.({ type: \"iteration_start\", iteration })\n debug.step(iteration, `Agentic loop iteration (${tools.length} tools available)`)\n\n let result: RawGenerationResult\n try {\n result = await provider.generateRaw(\n anthropicMessages,\n systemPrompt,\n tools,\n providerOptions\n )\n } catch (error: any) {\n // If generateRaw fails (e.g., OAuth mode), fall back to legacy\n if (error.message?.includes(\"not available\")) {\n return runLegacyLoop(options)\n }\n throw error\n }\n\n totalTokens += result.usage.input_tokens + result.usage.output_tokens\n\n // Collect text from response\n for (const block of result.content) {\n if (block.type === \"text\") {\n textContent += block.text\n onProgress?.({ type: \"text_delta\", text: block.text })\n }\n }\n\n // If stop_reason is end_turn or max_tokens, we're done\n if (result.stop_reason === \"end_turn\" || result.stop_reason === \"max_tokens\") {\n break\n }\n\n // If stop_reason is tool_use, execute the tools\n if (result.stop_reason === \"tool_use\") {\n const toolUseBlocks = result.content.filter(\n (b): b is Extract<ContentBlock, { type: \"tool_use\" }> => b.type === \"tool_use\"\n )\n\n if (toolUseBlocks.length === 0) break\n\n // Append assistant message with the tool_use blocks\n anthropicMessages.push({\n role: \"assistant\",\n content: result.content,\n })\n\n // Execute each tool and collect results\n const toolResults: ContentBlock[] = []\n\n for (const toolBlock of toolUseBlocks) {\n onProgress?.({\n type: \"tool_call\",\n name: toolBlock.name,\n id: toolBlock.id,\n input: toolBlock.input,\n })\n\n debug.step(iteration, `Tool call: ${toolBlock.name}`)\n\n const toolResult = await executor.execute({\n name: toolBlock.name,\n id: toolBlock.id,\n input: toolBlock.input,\n })\n\n onProgress?.({\n type: \"tool_result\",\n name: toolBlock.name,\n id: toolBlock.id,\n content: toolResult.content.slice(0, 200),\n is_error: toolResult.is_error,\n })\n\n // Collect files from create_files calls\n if (toolResult.files?.length) {\n allFiles.push(...toolResult.files)\n onProgress?.({ type: \"files_created\", files: toolResult.files })\n }\n\n // Handle ask_user — surface the question to caller\n if (toolResult.followUp) {\n followUp = toolResult.followUp\n }\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolResult.tool_use_id,\n content: toolResult.content,\n is_error: toolResult.is_error,\n })\n }\n\n // Append user message with tool_result blocks\n anthropicMessages.push({\n role: \"user\",\n content: toolResults,\n })\n\n // If we got a follow-up question, break the loop to surface it\n if (followUp) break\n\n continue\n }\n\n // Unknown stop_reason — break\n break\n }\n\n onProgress?.({ type: \"complete\", iterations: iteration, totalTokens })\n\n return {\n files: allFiles,\n content: textContent,\n followUp,\n tokensUsed: totalTokens,\n iterations: iteration,\n }\n}\n\n/**\n * Fallback to the legacy [CONTINUE]-based multi-step loop.\n * Used when provider doesn't support generateRaw() (CLI/OAuth mode).\n * For CLI mode, we include tool descriptions in the system prompt so the\n * `claude` binary uses its own built-in tools (read, write, bash, etc.).\n */\nasync function runLegacyLoop(options: AgenticLoopOptions): Promise<AgenticResult> {\n const {\n provider,\n systemPrompt,\n messages: inputMessages,\n providerOptions,\n maxIterations = 5,\n } = options\n\n // Enhance system prompt with tool descriptions for CLI mode\n const enhancedSystemPrompt = systemPrompt + \"\\n\\n\" + formatToolsForSystemPrompt()\n\n const messages: GenerationMessage[] = [\n { role: \"system\", content: enhancedSystemPrompt },\n ...inputMessages.filter((m) => m.role !== \"system\"),\n ]\n\n const allFiles: GeneratedFile[] = []\n let totalTokens = 0\n let content = \"\"\n let followUp: string | undefined\n let step = 0\n\n while (step < maxIterations) {\n step++\n debug.step(step, `Legacy loop step (model: ${providerOptions.model || \"default\"})`)\n\n const result = await provider.generate(messages, providerOptions)\n\n totalTokens += result.tokensUsed || 0\n content = result.content\n\n if (result.files.length) {\n allFiles.push(...result.files)\n }\n\n if (result.followUp) {\n followUp = result.followUp\n break\n }\n\n if (result.files.length === 0 && step > 1) break\n\n const wantsContinuation =\n result.content.includes(\"[CONTINUE]\") ||\n result.content.includes(\"Next, I'll\") ||\n result.content.includes(\"Now let me\") ||\n result.content.includes(\"I'll also generate\")\n\n if (!wantsContinuation) break\n\n const filesSummary = result.files\n .map((f) => `Created: ${f.path}${f.description ? ` — ${f.description}` : \"\"}`)\n .join(\"\\n\")\n\n messages.push({\n role: \"assistant\",\n content: result.content + (filesSummary ? `\\n\\nFiles created:\\n${filesSummary}` : \"\"),\n })\n\n messages.push({\n role: \"user\",\n content:\n \"Continue generating the remaining files. Build on what you've already created. When finished, do not include [CONTINUE] in your response.\",\n })\n }\n\n return {\n files: allFiles,\n content,\n followUp,\n tokensUsed: totalTokens,\n iterations: step,\n }\n}\n\n/**\n * Check if a provider supports the agentic loop (has generateRaw).\n */\nexport function supportsAgenticLoop(provider: AgentProvider): boolean {\n return typeof provider.generateRaw === \"function\"\n}\n","export class AsyncQueue<T> {\n private queue: T[] = []\n private resolvers: Array<(value: IteratorResult<T>) => void> = []\n private closed = false\n\n push(item: T): void {\n if (this.closed) return\n\n const resolver = this.resolvers.shift()\n if (resolver) {\n resolver({ value: item, done: false })\n return\n }\n this.queue.push(item)\n }\n\n close(): void {\n if (this.closed) return\n this.closed = true\n for (const resolve of this.resolvers.splice(0)) {\n resolve({ value: undefined as any, done: true })\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.queue.length) {\n return { value: this.queue.shift() as T, done: false }\n }\n if (this.closed) {\n return { value: undefined as any, done: true }\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve)\n })\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<T> {\n while (true) {\n const { value, done } = await this.next()\n if (done) return\n yield value\n }\n }\n}\n\n","import type { AgentProvider, GenerationMessage, GenerationResult, OutputType, StreamEvent } from \"./providers/types\"\nimport { agentConfigSchema, type AgentConfig } from \"./providers/types\"\nimport { createProvider, type ProviderName } from \"./providers\"\nimport { loadAuthConfig } from \"@/utils/auth-store\"\nimport { ensureCredentials } from \"@/utils/auth-store\"\nimport { detectTechStack, formatTechStack, type TechStack } from \"./context/tech-stack\"\nimport { detectSchemas, formatSchemas, type ProjectSchemas } from \"./context/schema\"\nimport { gatherContext7Docs } from \"./context/context7\"\nimport { loadLocalSkills, matchSkillsToTask } from \"./skills/loader\"\nimport { resolveOutputType } from \"./outputs/types\"\nimport { writeGeneratedFiles, resolveOutputDir, type WriteOptions, type WriteResult } from \"./outputs/handlers\"\nimport { logger } from \"@/utils/logger\"\nimport { globalHooks } from \"@/hooks\"\nimport { globalTracker } from \"@/observability\"\nimport { debug } from \"@/observability\"\nimport { MemoryHierarchy, ContextBuilder, loadProjectInstructions } from \"@/memory\"\nimport type { Skill } from \"./skills/types\"\nimport { runAgenticLoop, supportsAgenticLoop, type AgenticProgressEvent } from \"./orchestrator\"\nimport { AsyncQueue } from \"@/utils/async-queue\"\n\n// --- Agent Orchestrator: the brain that coordinates everything ---\n\nexport interface AgentContext {\n techStack: TechStack\n schemas: ProjectSchemas\n skills: Skill[]\n docs: string\n config: AgentConfig\n memoryContext: string\n projectInstructions: string\n}\n\nexport interface GenerateOptions {\n task: string\n outputType?: OutputType\n outputDir?: string\n overwrite?: boolean\n dryRun?: boolean\n provider?: ProviderName\n model?: string\n apiKey?: string\n cwd: string\n context7?: boolean\n interactive?: boolean\n skills?: string[] // Additional skill packages to load\n maxSteps?: number // Max agentic loop iterations (default 20 for agentic, 5 for legacy)\n sessionMessages?: GenerationMessage[] // Multi-turn context from REPL sessions\n heal?: boolean // undefined = auto (heal if files written), false = skip\n healConfig?: {\n testCommand?: string\n buildCommand?: string\n lintCommand?: string\n maxAttempts?: number\n }\n}\n\nexport interface GenerateResult {\n files: WriteResult\n content: string\n outputType: OutputType\n followUp?: string\n tokensUsed?: number\n healResult?: import(\"@/runtime/heal\").HealResult\n}\n\nexport async function createAgentContext(\n cwd: string,\n task: string,\n config?: Partial<AgentConfig>\n): Promise<AgentContext> {\n const agentConfig = agentConfigSchema.parse(config || {})\n\n // Load memory hierarchy\n const memory = new MemoryHierarchy(cwd)\n await memory.load()\n\n // Gather all context in parallel\n const [techStack, schemas, skills] = await Promise.all([\n detectTechStack(cwd),\n detectSchemas(cwd),\n loadLocalSkills(cwd),\n ])\n\n // Context7 docs (optional, can fail gracefully)\n let docs = \"\"\n if (agentConfig.context7.enabled) {\n try {\n docs = await gatherContext7Docs(techStack, task, agentConfig.context7.apiKey)\n } catch {\n // Context7 is optional, don't fail the whole flow\n }\n }\n\n // Build memory context from both user and project levels\n const memoryContext = memory.buildMemoryContext(task)\n\n // Load project instructions (SHADXN.md or CLAUDE.md) with @-import resolution\n const projectInstructions = loadProjectInstructions(cwd)\n\n debug.context(\"memory\", memoryContext ? \"loaded\" : \"empty\")\n debug.context(\"instructions\", projectInstructions ? \"loaded from project\" : \"none\")\n\n return {\n techStack,\n schemas,\n skills,\n docs,\n config: agentConfig,\n memoryContext,\n projectInstructions,\n }\n}\n\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const {\n task,\n cwd,\n overwrite = false,\n dryRun = false,\n provider: providerName = \"claude-code\",\n model,\n apiKey,\n context7 = true,\n interactive = true,\n } = options\n\n // 0. pre:prompt hook — can modify or block the task prompt\n let effectiveTask = task\n if (globalHooks.has(\"pre:prompt\")) {\n const promptResult = await globalHooks.execute(\"pre:prompt\", {\n event: \"pre:prompt\",\n task,\n cwd,\n })\n if (promptResult.blocked) {\n throw new Error(promptResult.message || \"Blocked by pre:prompt hook\")\n }\n if (promptResult.modified?.task) {\n effectiveTask = String(promptResult.modified.task)\n }\n }\n\n // 0b. pre:generate hook — can block the entire generation\n if (globalHooks.has(\"pre:generate\")) {\n const genResult = await globalHooks.execute(\"pre:generate\", {\n event: \"pre:generate\",\n task: effectiveTask,\n cwd,\n })\n if (genResult.blocked) {\n throw new Error(genResult.message || \"Blocked by pre:generate hook\")\n }\n }\n\n // 1. Gather context\n logger.info(\"Analyzing project...\")\n const context = await createAgentContext(cwd, effectiveTask, {\n provider: providerName,\n context7: { enabled: context7, apiKey },\n })\n\n // 2. Resolve output type\n const outputType = resolveOutputType(options.outputType, effectiveTask)\n logger.info(`Output type: ${outputType}`)\n\n // 3. Match relevant skills\n const matchedSkills = matchSkillsToTask(context.skills, effectiveTask, outputType)\n if (matchedSkills.length) {\n logger.info(\n `Loaded ${matchedSkills.length} relevant skill(s): ${matchedSkills.map((m) => m.skill.frontmatter.name).join(\", \")}`\n )\n }\n\n // 4. Build system prompt\n const systemPrompt = buildSystemPrompt(context, outputType, matchedSkills.map((m) => m.skill))\n\n // 5. Ensure credentials exist (auto-prompt if missing)\n const hasCredentials = await ensureCredentials(apiKey)\n if (!hasCredentials) {\n throw new Error(\"No credentials configured. Run `agentx model` to set up.\")\n }\n\n // 6. Create provider\n const provider = createProvider(providerName, apiKey)\n const resolvedModel = model || loadAuthConfig()?.model\n\n // Build initial messages (without system — orchestrator handles it)\n const sessionMessages: GenerationMessage[] = [\n ...(options.sessionMessages || []),\n { role: \"user\", content: effectiveTask },\n ]\n\n logger.info(\"Generating...\")\n\n // Determine if we should use the agentic loop\n const useAgentic = supportsAgenticLoop(provider)\n const maxSteps = options.maxSteps ?? (useAgentic ? 20 : 5)\n\n // 7. Run orchestrator (agentic or legacy)\n const agenticResult = await runAgenticLoop({\n provider,\n systemPrompt,\n messages: [\n { role: \"system\", content: systemPrompt },\n ...sessionMessages,\n ],\n providerOptions: { model: resolvedModel, maxTokens: 8192 },\n cwd,\n maxIterations: maxSteps,\n enabledTools: context.config.agentic.enabledTools.filter(\n (t) => !context.config.agentic.disabledTools.includes(t)\n ),\n interactive,\n overwrite,\n dryRun,\n onProgress: (event) => {\n if (event.type === \"iteration_start\" && event.iteration > 1) {\n logger.info(`Step ${event.iteration}/${maxSteps}...`)\n }\n if (event.type === \"tool_call\") {\n debug.step(0, `Tool: ${event.name}`)\n }\n },\n })\n\n // Track token usage\n if (agenticResult.tokensUsed) {\n const stepModel = resolvedModel || \"claude-sonnet-4-20250514\"\n const estInput = Math.round(agenticResult.tokensUsed * 0.3)\n const estOutput = agenticResult.tokensUsed - estInput\n globalTracker.recordStep(1, stepModel, estInput, estOutput)\n }\n\n let { content } = agenticResult\n const { followUp, tokensUsed: totalTokens } = agenticResult\n\n if (agenticResult.iterations > 1) {\n logger.info(`Completed in ${agenticResult.iterations} step(s)`)\n }\n\n // post:response hook — can modify or block the AI response\n if (globalHooks.has(\"post:response\")) {\n const responseResult = await globalHooks.execute(\"post:response\", {\n event: \"post:response\",\n content,\n task: effectiveTask,\n cwd,\n })\n if (responseResult.blocked) {\n throw new Error(responseResult.message || \"Blocked by post:response hook\")\n }\n if (responseResult.modified?.content) {\n content = String(responseResult.modified.content)\n }\n }\n\n // Handle follow-up questions (interactive mode)\n if (followUp && interactive) {\n return {\n files: { written: [], skipped: [], errors: [] },\n content,\n outputType,\n followUp,\n tokensUsed: totalTokens,\n }\n }\n\n // Deduplicate files (later versions override earlier ones)\n const deduped = new Map<string, import(\"./providers/types\").GeneratedFile>()\n for (const file of agenticResult.files) {\n deduped.set(file.path, file)\n }\n\n // Write files\n const outputDir = resolveOutputDir(outputType, context.techStack, options.outputDir)\n\n const writeResult = await writeGeneratedFiles(Array.from(deduped.values()), {\n cwd,\n overwrite,\n dryRun,\n outputDir,\n })\n\n // Heal loop — verify generated code and auto-fix if needed\n let healResult: import(\"@/runtime/heal\").HealResult | undefined\n if (options.heal !== false && !dryRun && writeResult.written.length > 0) {\n const { HealEngine } = await import(\"@/runtime/heal\")\n const healEngine = new HealEngine(cwd, {\n enabled: true,\n testCommand: options.healConfig?.testCommand,\n buildCommand: options.healConfig?.buildCommand,\n lintCommand: options.healConfig?.lintCommand,\n maxAttempts: options.healConfig?.maxAttempts ?? 3,\n provider: providerName,\n model: resolvedModel,\n apiKey,\n })\n healResult = await healEngine.detectAndHeal(writeResult.written, effectiveTask)\n\n if (!healResult.healed && healResult.error) {\n await globalHooks.execute(\"on:error\", {\n event: \"on:error\",\n error: new Error(healResult.error),\n task: effectiveTask,\n cwd,\n })\n }\n }\n\n // post:generate hook — post-processing (format, lint, etc.)\n if (globalHooks.has(\"post:generate\")) {\n await globalHooks.execute(\"post:generate\", {\n event: \"post:generate\",\n task: effectiveTask,\n content,\n cwd,\n })\n }\n\n return {\n files: writeResult,\n content,\n outputType,\n tokensUsed: totalTokens,\n healResult,\n }\n}\n\n// --- Streaming generation ---\n\nexport type GenerateStreamEvent =\n | StreamEvent\n | { type: \"context_ready\"; outputType: OutputType }\n | { type: \"step_complete\"; step: number; filesCount: number }\n | { type: \"tool_call\"; name: string; id: string }\n | { type: \"tool_result\"; name: string; id: string; is_error?: boolean }\n | { type: \"iteration\"; iteration: number }\n | { type: \"generate_result\"; result: GenerateResult }\n\nexport async function* generateStream(\n options: GenerateOptions\n): AsyncGenerator<GenerateStreamEvent> {\n const {\n task,\n cwd,\n overwrite = false,\n dryRun = false,\n provider: providerName = \"claude-code\",\n model,\n apiKey,\n context7 = true,\n interactive = true,\n } = options\n\n // 0. pre:prompt hook\n let effectiveTask = task\n if (globalHooks.has(\"pre:prompt\")) {\n const promptResult = await globalHooks.execute(\"pre:prompt\", {\n event: \"pre:prompt\",\n task,\n cwd,\n })\n if (promptResult.blocked) {\n yield { type: \"error\", error: promptResult.message || \"Blocked by pre:prompt hook\" }\n return\n }\n if (promptResult.modified?.task) {\n effectiveTask = String(promptResult.modified.task)\n }\n }\n\n // 0b. pre:generate hook\n if (globalHooks.has(\"pre:generate\")) {\n const genResult = await globalHooks.execute(\"pre:generate\", {\n event: \"pre:generate\",\n task: effectiveTask,\n cwd,\n })\n if (genResult.blocked) {\n yield { type: \"error\", error: genResult.message || \"Blocked by pre:generate hook\" }\n return\n }\n }\n\n // 1. Gather context\n const context = await createAgentContext(cwd, effectiveTask, {\n provider: providerName,\n context7: { enabled: context7, apiKey },\n })\n\n // 2. Resolve output type\n const outputType = resolveOutputType(options.outputType, effectiveTask)\n\n // Signal context ready so UI can stop spinner\n yield { type: \"context_ready\", outputType }\n\n // 3. Match relevant skills\n const matchedSkills = matchSkillsToTask(context.skills, effectiveTask, outputType)\n\n // 4. Build system prompt\n const systemPrompt = buildSystemPrompt(context, outputType, matchedSkills.map((m) => m.skill))\n\n // 5. Ensure credentials\n const hasCredentials = await ensureCredentials(apiKey)\n if (!hasCredentials) {\n yield { type: \"error\", error: \"No credentials configured. Run `agentx model` to set up.\" }\n return\n }\n\n // 6. Create provider\n const provider = createProvider(providerName, apiKey)\n const resolvedModel = model || loadAuthConfig()?.model\n const useAgentic = supportsAgenticLoop(provider)\n const maxSteps = options.maxSteps ?? (useAgentic ? 20 : 5)\n\n const sessionMessages: GenerationMessage[] = [\n ...(options.sessionMessages || []),\n { role: \"user\", content: effectiveTask },\n ]\n\n // For agentic mode, use the orchestrator with progress events\n if (useAgentic) {\n const q = new AsyncQueue<GenerateStreamEvent>()\n let agenticResult: Awaited<ReturnType<typeof runAgenticLoop>> | undefined\n let agenticError: unknown\n\n const agenticPromise = (async () => {\n try {\n agenticResult = await runAgenticLoop({\n provider,\n systemPrompt,\n messages: [\n { role: \"system\", content: systemPrompt },\n ...sessionMessages,\n ],\n providerOptions: { model: resolvedModel, maxTokens: 8192 },\n cwd,\n maxIterations: maxSteps,\n enabledTools: context.config.agentic.enabledTools.filter(\n (t) => !context.config.agentic.disabledTools.includes(t)\n ),\n interactive,\n overwrite,\n dryRun,\n onProgress: (event) => {\n if (event.type === \"text_delta\") {\n q.push({ type: \"text_delta\", text: event.text })\n }\n if (event.type === \"iteration_start\") {\n q.push({ type: \"iteration\", iteration: event.iteration })\n }\n if (event.type === \"tool_call\") {\n q.push({ type: \"tool_call\", name: event.name, id: event.id })\n }\n if (event.type === \"tool_result\") {\n q.push({ type: \"tool_result\", name: event.name, id: event.id, is_error: event.is_error })\n }\n if (event.type === \"files_created\") {\n q.push({ type: \"step_complete\", step: 0, filesCount: event.files.length })\n }\n },\n })\n } catch (err) {\n agenticError = err\n } finally {\n q.close()\n }\n })()\n\n for await (const evt of q) {\n yield evt\n }\n\n await agenticPromise\n if (agenticError) {\n const msg = agenticError instanceof Error ? agenticError.message : String(agenticError)\n yield { type: \"error\", error: msg }\n return\n }\n if (!agenticResult) {\n yield { type: \"error\", error: \"Agentic loop failed without a result\" }\n return\n }\n\n yield {\n type: \"done\",\n result: {\n content: agenticResult.content,\n files: agenticResult.files,\n tokensUsed: agenticResult.tokensUsed,\n followUp: agenticResult.followUp,\n },\n }\n\n // Write files and heal\n let { content } = agenticResult\n\n // post:response hook\n if (globalHooks.has(\"post:response\")) {\n const responseResult = await globalHooks.execute(\"post:response\", {\n event: \"post:response\",\n content,\n task: effectiveTask,\n cwd,\n })\n if (responseResult.blocked) {\n yield { type: \"error\", error: responseResult.message || \"Blocked by post:response hook\" }\n return\n }\n if (responseResult.modified?.content) {\n content = String(responseResult.modified.content)\n }\n }\n\n if (agenticResult.followUp && interactive) {\n yield {\n type: \"generate_result\",\n result: {\n files: { written: [], skipped: [], errors: [] },\n content,\n outputType,\n followUp: agenticResult.followUp,\n tokensUsed: agenticResult.tokensUsed,\n },\n }\n return\n }\n\n const deduped = new Map<string, import(\"./providers/types\").GeneratedFile>()\n for (const file of agenticResult.files) {\n deduped.set(file.path, file)\n }\n\n const outputDir = resolveOutputDir(outputType, context.techStack, options.outputDir)\n const writeResult = await writeGeneratedFiles(Array.from(deduped.values()), {\n cwd,\n overwrite,\n dryRun,\n outputDir,\n })\n\n let healResult: import(\"@/runtime/heal\").HealResult | undefined\n if (options.heal !== false && !dryRun && writeResult.written.length > 0) {\n const { HealEngine } = await import(\"@/runtime/heal\")\n const healEngine = new HealEngine(cwd, {\n enabled: true,\n testCommand: options.healConfig?.testCommand,\n buildCommand: options.healConfig?.buildCommand,\n lintCommand: options.healConfig?.lintCommand,\n maxAttempts: options.healConfig?.maxAttempts ?? 3,\n provider: providerName,\n model: resolvedModel,\n apiKey,\n })\n healResult = await healEngine.detectAndHeal(writeResult.written, effectiveTask)\n }\n\n if (globalHooks.has(\"post:generate\")) {\n await globalHooks.execute(\"post:generate\", {\n event: \"post:generate\",\n task: effectiveTask,\n content,\n cwd,\n })\n }\n\n yield {\n type: \"generate_result\",\n result: {\n files: writeResult,\n content,\n outputType,\n tokensUsed: agenticResult.tokensUsed,\n healResult,\n },\n }\n return\n }\n\n // --- Legacy streaming path (no generateRaw) ---\n\n const messages: GenerationMessage[] = [\n { role: \"system\", content: systemPrompt },\n ...sessionMessages,\n ]\n\n const allFiles: import(\"./providers/types\").GeneratedFile[] = []\n let totalTokens = 0\n let content = \"\"\n let followUp: string | undefined\n let step = 0\n\n // --- Step 1: streamed ---\n step++\n debug.step(step, `Starting generation (model: ${resolvedModel || \"default\"})`)\n\n let step1Result: GenerationResult\n\n if (provider.stream) {\n let accumulated = \"\"\n let streamResult: GenerationResult | undefined\n\n for await (const event of provider.stream(messages, {\n model: resolvedModel,\n maxTokens: 8192,\n })) {\n yield event\n\n if (event.type === \"text_delta\") {\n accumulated += event.text\n }\n if (event.type === \"done\") {\n streamResult = event.result\n }\n }\n\n step1Result = streamResult || {\n content: accumulated,\n files: [],\n tokensUsed: 0,\n }\n } else {\n const result = await provider.generate(messages, {\n model: resolvedModel,\n maxTokens: 8192,\n })\n\n if (result.content) {\n yield { type: \"text_delta\", text: result.content }\n }\n yield { type: \"done\", result }\n step1Result = result\n }\n\n totalTokens += step1Result.tokensUsed || 0\n content = step1Result.content\n\n const step1Tokens = step1Result.tokensUsed || 0\n const step1Model = resolvedModel || \"claude-sonnet-4-20250514\"\n const estInput1 = Math.round(step1Tokens * 0.3)\n const estOutput1 = step1Tokens - estInput1\n globalTracker.recordStep(step, step1Model, estInput1, estOutput1)\n debug.api(\"generate\", step1Model, step1Tokens)\n debug.step(step, `Generated ${step1Result.files.length} file(s), ${step1Tokens} tokens`)\n\n if (step1Result.files.length) {\n allFiles.push(...step1Result.files)\n }\n\n if (step1Result.followUp) {\n followUp = step1Result.followUp\n }\n\n yield { type: \"step_complete\", step, filesCount: step1Result.files.length }\n\n // --- Steps 2-N: non-streaming continuation loop ---\n if (!followUp) {\n const wantsContinuation1 =\n content.includes(\"[CONTINUE]\") ||\n content.includes(\"Next, I'll\") ||\n content.includes(\"Now let me\") ||\n content.includes(\"I'll also generate\")\n\n if (wantsContinuation1 && step1Result.files.length > 0) {\n const filesSummary = step1Result.files\n .map((f) => `Created: ${f.path}${f.description ? ` — ${f.description}` : \"\"}`)\n .join(\"\\n\")\n messages.push({\n role: \"assistant\",\n content: content + (filesSummary ? `\\n\\nFiles created:\\n${filesSummary}` : \"\"),\n })\n messages.push({\n role: \"user\",\n content:\n \"Continue generating the remaining files. Build on what you've already created. When finished, do not include [CONTINUE] in your response.\",\n })\n\n while (step < maxSteps) {\n step++\n debug.step(step, `Starting generation (model: ${resolvedModel || \"default\"})`)\n\n const result = await provider.generate(messages, {\n model: resolvedModel,\n maxTokens: 8192,\n })\n\n totalTokens += result.tokensUsed || 0\n content = result.content\n\n const stepTokens = result.tokensUsed || 0\n const stepModel = resolvedModel || \"claude-sonnet-4-20250514\"\n const estInput = Math.round(stepTokens * 0.3)\n const estOutput = stepTokens - estInput\n globalTracker.recordStep(step, stepModel, estInput, estOutput)\n debug.api(\"generate\", stepModel, stepTokens)\n debug.step(step, `Generated ${result.files.length} file(s), ${stepTokens} tokens`)\n\n if (result.files.length) {\n allFiles.push(...result.files)\n }\n\n yield { type: \"step_complete\", step, filesCount: result.files.length }\n\n if (result.followUp) {\n followUp = result.followUp\n break\n }\n if (result.files.length === 0 && step > 1) break\n\n const wantsContinuation =\n result.content.includes(\"[CONTINUE]\") ||\n result.content.includes(\"Next, I'll\") ||\n result.content.includes(\"Now let me\") ||\n result.content.includes(\"I'll also generate\")\n\n if (!wantsContinuation) break\n\n const filesSummary2 = result.files\n .map((f) => `Created: ${f.path}${f.description ? ` — ${f.description}` : \"\"}`)\n .join(\"\\n\")\n messages.push({\n role: \"assistant\",\n content: result.content + (filesSummary2 ? `\\n\\nFiles created:\\n${filesSummary2}` : \"\"),\n })\n messages.push({\n role: \"user\",\n content:\n \"Continue generating the remaining files. Build on what you've already created. When finished, do not include [CONTINUE] in your response.\",\n })\n }\n }\n }\n\n // post:response hook\n if (globalHooks.has(\"post:response\")) {\n const responseResult = await globalHooks.execute(\"post:response\", {\n event: \"post:response\",\n content,\n task: effectiveTask,\n cwd,\n })\n if (responseResult.blocked) {\n yield { type: \"error\", error: responseResult.message || \"Blocked by post:response hook\" }\n return\n }\n if (responseResult.modified?.content) {\n content = String(responseResult.modified.content)\n }\n }\n\n if (followUp && interactive) {\n yield {\n type: \"generate_result\",\n result: {\n files: { written: [], skipped: [], errors: [] },\n content,\n outputType,\n followUp,\n tokensUsed: totalTokens,\n },\n }\n return\n }\n\n const deduped = new Map<import(\"./providers/types\").GeneratedFile[\"path\"], import(\"./providers/types\").GeneratedFile>()\n for (const file of allFiles) {\n deduped.set(file.path, file)\n }\n\n const outputDir = resolveOutputDir(outputType, context.techStack, options.outputDir)\n const writeResult = await writeGeneratedFiles(Array.from(deduped.values()), {\n cwd,\n overwrite,\n dryRun,\n outputDir,\n })\n\n let healResult: import(\"@/runtime/heal\").HealResult | undefined\n if (options.heal !== false && !dryRun && writeResult.written.length > 0) {\n const { HealEngine } = await import(\"@/runtime/heal\")\n const healEngine = new HealEngine(cwd, {\n enabled: true,\n testCommand: options.healConfig?.testCommand,\n buildCommand: options.healConfig?.buildCommand,\n lintCommand: options.healConfig?.lintCommand,\n maxAttempts: options.healConfig?.maxAttempts ?? 3,\n provider: providerName,\n model: resolvedModel,\n apiKey,\n })\n healResult = await healEngine.detectAndHeal(writeResult.written, effectiveTask)\n\n if (!healResult.healed && healResult.error) {\n await globalHooks.execute(\"on:error\", {\n event: \"on:error\",\n error: new Error(healResult.error),\n task: effectiveTask,\n cwd,\n })\n }\n }\n\n if (globalHooks.has(\"post:generate\")) {\n await globalHooks.execute(\"post:generate\", {\n event: \"post:generate\",\n task: effectiveTask,\n content,\n cwd,\n })\n }\n\n yield {\n type: \"generate_result\",\n result: {\n files: writeResult,\n content,\n outputType,\n tokensUsed: totalTokens,\n healResult,\n },\n }\n}\n\nfunction buildSystemPrompt(\n context: AgentContext,\n outputType: string,\n skills: Skill[]\n): string {\n const sections: string[] = []\n\n // Identity — updated for agentic capabilities\n sections.push(`You are agentx, an agentic code generation tool. You generate high-quality, production-ready output for any tech stack.\n\nYour primary tool is \\`create_files\\` — use it to output all generated code, documents, and configs as files.\nIf the request is ambiguous or you need critical information to proceed correctly, use \\`ask_user\\` to ask a clarifying question.\n\nYou also have tools to inspect the codebase before generating code:\n- \\`read_file\\` — read existing files to understand patterns, styles, and implementations\n- \\`search_files\\` — search for files by glob pattern, optionally grep content with regex\n- \\`list_directory\\` — explore the project structure\n- \\`run_command\\` — run shell commands (build, test, lint, etc.)\n- \\`edit_file\\` — apply targeted search/replace edits to existing files\n\nAGENTIC WORKFLOW:\n- Before generating code, use \\`read_file\\` and \\`search_files\\` to understand the existing codebase\n- Match the project's existing patterns, naming conventions, and code style\n- After creating files, consider running tests or build commands to verify correctness\n- Use \\`edit_file\\` for small, targeted changes instead of rewriting entire files\n\nIMPORTANT RULES:\n- Generate complete, working code — not stubs or placeholders\n- Follow the project's existing patterns and conventions\n- Use the detected tech stack to choose the right language, framework, and patterns\n- File paths should be relative to the project root\n- Include all necessary imports\n- Do NOT add unnecessary dependencies\n\nMULTI-STEP GENERATION:\nFor complex tasks that require multiple related files (e.g., schema + API + UI + tests), you can chain steps:\n- Generate the foundational files first (schemas, types, configs)\n- Include \"[CONTINUE]\" in your response text when there are more files to generate\n- In subsequent steps, you'll see what was already created — build on it\n- When all files are generated, do NOT include \"[CONTINUE]\"\n- This enables you to generate a schema first, then an API that references it, then a UI that calls the API`)\n\n // Tech stack context\n sections.push(`# Project Tech Stack\\n${formatTechStack(context.techStack)}`)\n\n // Key dependencies\n const deps = Object.keys(context.techStack.dependencies).slice(0, 30)\n if (deps.length) {\n sections.push(`# Key Dependencies\\n${deps.join(\", \")}`)\n }\n\n // Schema context\n const schemaStr = formatSchemas(context.schemas)\n if (schemaStr) {\n sections.push(`# Project Schemas\\n${schemaStr}`)\n }\n\n // Skills context\n if (skills.length) {\n sections.push(\n `# Active Skills\\nFollow these skill instructions when applicable:\\n\\n` +\n skills\n .map(\n (s) =>\n `## Skill: ${s.frontmatter.name}\\n${s.frontmatter.description}\\n\\n${s.instructions}`\n )\n .join(\"\\n\\n---\\n\\n\")\n )\n }\n\n // Context7 docs\n if (context.docs) {\n sections.push(context.docs)\n }\n\n // Project instructions (SHADXN.md / CLAUDE.md)\n if (context.projectInstructions) {\n sections.push(`# Project Instructions\\n${context.projectInstructions}`)\n }\n\n // Memory context (past generations, patterns, preferences)\n if (context.memoryContext) {\n sections.push(context.memoryContext)\n }\n\n // Output type guidance\n sections.push(`# Output Type: ${outputType}\\nGenerate output appropriate for: ${outputType}. Use the \\`create_files\\` tool to output all files.`)\n\n return sections.join(\"\\n\\n\")\n}\n\n// Re-export key types\nexport type { TechStack } from \"./context/tech-stack\"\nexport type { ProjectSchemas } from \"./context/schema\"\nexport type { Skill } from \"./skills/types\"\nexport type { AgentConfig, OutputType, GeneratedFile, StreamEvent } from \"./providers/types\"\n"],"mappings":"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","names":["z","agentConfigSchema","OUTPUT_TYPES","outputTypeDescriptions","existsSync","fs","path","fg","SCHEMA_FILES","detectSchemas","cwd","schemas","files","schemaFile","info","match","f","content","safeReadFile","truncate","extractTableNames","trpcRouter","envExample","parseEnvFile","modelFiles","mf","type","matches","m","l","line","keyPart","key","hasValue","filePath","str","maxLen","formatSchemas","sections","v","model","fetch","CONTEXT7_API","resolveLibraryId","libraryName","apiKey","headers","response","data","getLibraryDocs","libraryId","topic","maxTokens","gatherContext7Docs","stack","relevantLibraries","fw","priorityDeps","dep","docs","lib","library","content","OUTPUT_CONFIGS","resolveOutputType","userHint","taskDescription","lower","patterns","pattern","type","existsSync","fs","path","execa","z","HOOK_EVENTS","BLOCKING_EVENTS","hookDefinitionSchema","MODEL_PRICING","getModelFamily","model","lower","UsageTracker","step","inputTokens","outputTokens","family","pricing","cost","existing","totalInputTokens","totalOutputTokens","totalCost","models","name","usage","globalTracker","chalk","debugEnabled","setDebug","enabled","isDebug","timestamp","debug","args","step","message","name","duration","result","method","model","tokens","tokenStr","input","output","cost","label","detail","exportSession","session","usage","lines","file","msg","label","model","mu","step","HookRegistry","event","definition","handler","entry","existing","a","b","context","registered","canBlock","BLOCKING_EVENTS","combinedModified","hook","start","result","duration","debug","error","logger","cmd","_match","key","execa","mod","providerName","loadAuthConfig","resolved","resolveToken","createProvider","provider","prompt","systemPrompt","jsonMatch","parsed","existsSync","readFileSync","readdirSync","path","loadHooks","cwd","registry","loadHooksFromConfig","loadHooksFromDirectory","configPath","path","existsSync","raw","readFileSync","eventName","definitions","HOOK_EVENTS","logger","event","def","parsed","hookDefinitionSchema","error","hooksDir","files","readdirSync","f","file","parts","eventSlug","name","altEvent","globalHooks","HookRegistry","prompts","chalk","z","PERMISSION_MODES","permissionModeSchema","permissionConfigSchema","matchGlob","filePath","pattern","regex","PermissionManager","config","parsed","permissionConfigSchema","mode","debug","command","patterns","p","action","prompts","chalk","globalPermissions","writeGeneratedFiles","files","options","result","file","filePath","path","fileContent","globalHooks","hookResult","relativePath","permission","globalPermissions","existsSync","dir","fs","error","resolveOutputDir","outputType","stack","customDir","config","OUTPUT_CONFIGS","baseDir","f","os","USER_MEMORY_DIR","os","MemoryHierarchy","cwd","Memory","task","userCtx","projectCtx","sections","key","value","source","entry","userPrefs","projectPrefs","merged","p","userPatterns","limit","existsSync","readFileSync","path","resolveAtImports","content","basedir","match","filePath","resolved","loadProjectInstructions","cwd","candidates","name","estimateTokens","scoreRelevance","section","task","taskWords","w","sectionWords","overlap","ContextBuilder","label","priority","maxTokens","scored","s","a","b","included","totalTokens","fs","path","execa","fg","ToolExecutor","cwd","options","call","debug","globalHooks","hookResult","result","error","filePath","maxLines","absPath","path","content","fs","lines","output","pattern","contentRegex","maxResults","files","fg","limited","regex","results","file","i","dirPath","recursive","maxDepth","entries","formatted","e","command","timeout","globalPermissions","execa","truncated","edits","permission","applied","edit","input","question","followUp","runAgenticLoop","options","provider","systemPrompt","inputMessages","providerOptions","cwd","maxIterations","enabledTools","interactive","overwrite","dryRun","onProgress","runLegacyLoop","executor","ToolExecutor","tools","getAnthropicTools","anthropicMessages","m","allFiles","totalTokens","textContent","followUp","iteration","debug","result","error","block","toolUseBlocks","b","toolResults","toolBlock","toolResult","messages","formatToolsForSystemPrompt","content","step","filesSummary","f","supportsAgenticLoop","AsyncQueue","item","resolver","resolve","value","done","createAgentContext","cwd","task","config","agentConfig","agentConfigSchema","memory","MemoryHierarchy","techStack","schemas","skills","detectTechStack","detectSchemas","loadLocalSkills","docs","gatherContext7Docs","memoryContext","projectInstructions","loadProjectInstructions","debug","generate","options","overwrite","dryRun","providerName","model","apiKey","context7","interactive","effectiveTask","globalHooks","promptResult","genResult","logger","context","outputType","resolveOutputType","matchedSkills","matchSkillsToTask","m","systemPrompt","buildSystemPrompt","ensureCredentials","provider","createProvider","resolvedModel","loadAuthConfig","sessionMessages","useAgentic","supportsAgenticLoop","maxSteps","agenticResult","runAgenticLoop","t","event","stepModel","estInput","estOutput","globalTracker","content","followUp","totalTokens","responseResult","deduped","file","outputDir","resolveOutputDir","writeResult","writeGeneratedFiles","healResult","HealEngine","generateStream","q","AsyncQueue","agenticError","agenticPromise","err","evt","messages","allFiles","step","step1Result","accumulated","streamResult","result","step1Tokens","step1Model","estInput1","estOutput1","filesSummary","stepTokens","filesSummary2","f","sections","formatTechStack","deps","schemaStr","formatSchemas","s"]}
@@ -0,0 +1,15 @@
1
+ import{existsSync as d,promises as S}from"fs";import g from"path";import R from"fast-glob";var P={"package.json":{language:"javascript"},"tsconfig.json":{language:"typescript"},"requirements.txt":{language:"python"},"pyproject.toml":{language:"python"},"setup.py":{language:"python"},Pipfile:{language:"python"},"Cargo.toml":{language:"rust"},"go.mod":{language:"go"},Gemfile:{language:"ruby"},"composer.json":{language:"php"},"build.gradle":{language:"java"},"build.gradle.kts":{language:"kotlin"},"pom.xml":{language:"java"},"pubspec.yaml":{language:"dart",framework:"flutter",type:"mobile"},"Package.swift":{language:"swift"},Makefile:{language:"c"},"CMakeLists.txt":{language:"cpp"},"mix.exs":{language:"elixir"},"deno.json":{language:"typescript",framework:"deno"},"bun.lockb":{language:"typescript"}},M={"next.config.js":{name:"nextjs",type:"fullstack"},"next.config.ts":{name:"nextjs",type:"fullstack"},"next.config.mjs":{name:"nextjs",type:"fullstack"},"nuxt.config.ts":{name:"nuxt",type:"fullstack"},"nuxt.config.js":{name:"nuxt",type:"fullstack"},"svelte.config.js":{name:"sveltekit",type:"fullstack"},"astro.config.mjs":{name:"astro",type:"frontend"},"astro.config.ts":{name:"astro",type:"frontend"},"remix.config.js":{name:"remix",type:"fullstack"},"angular.json":{name:"angular",type:"frontend"},"vue.config.js":{name:"vue-cli",type:"frontend"},"vite.config.ts":{name:"vite",type:"frontend"},"vite.config.js":{name:"vite",type:"frontend"},"gatsby-config.js":{name:"gatsby",type:"frontend"},"gatsby-config.ts":{name:"gatsby",type:"frontend"},"eleventy.config.js":{name:"eleventy",type:"frontend"},"docusaurus.config.js":{name:"docusaurus",type:"frontend"},"expo-env.d.ts":{name:"expo",type:"mobile"},"app.json":{name:"expo",type:"mobile"},fastapi:{name:"fastapi",type:"backend"},"manage.py":{name:"django",type:"fullstack"},"config/routes.rb":{name:"rails",type:"fullstack"},artisan:{name:"laravel",type:"fullstack"},"main.go":{name:"go-app",type:"backend"},Dockerfile:{name:"docker",type:"backend"}},F={"prisma/schema.prisma":"prisma","drizzle.config.ts":"drizzle","drizzle.config.js":"drizzle","knexfile.js":"knex","knexfile.ts":"knex","ormconfig.json":"typeorm","mikro-orm.config.ts":"mikro-orm","supabase/config.toml":"supabase","firebase.json":"firebase","mongod.conf":"mongodb"},E={"tailwind.config.js":"tailwindcss","tailwind.config.ts":"tailwindcss","postcss.config.js":"postcss","postcss.config.mjs":"postcss",".stylelintrc":"stylelint","styled-components":"styled-components"},$={"jest.config.js":"jest","jest.config.ts":"jest","vitest.config.ts":"vitest","vitest.config.js":"vitest","cypress.config.ts":"cypress","cypress.config.js":"cypress","playwright.config.ts":"playwright","playwright.config.js":"playwright",".mocharc.yml":"mocha","pytest.ini":"pytest","conftest.py":"pytest"},D={"vercel.json":"vercel","netlify.toml":"netlify","fly.toml":"fly.io","railway.toml":"railway","render.yaml":"render",Dockerfile:"docker","docker-compose.yml":"docker-compose","docker-compose.yaml":"docker-compose",".github/workflows":"github-actions","serverless.yml":"serverless",terraform:"terraform",pulumi:"pulumi"},G=["pnpm-workspace.yaml","lerna.json","nx.json","turbo.json","rush.json"],O={"pnpm-lock.yaml":"pnpm","yarn.lock":"yarn","package-lock.json":"npm","bun.lockb":"bun"};async function Q(r){let e=await R.glob("**/*",{cwd:r,deep:3,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/target/**","**/__pycache__/**","**/vendor/**","**/.git/**"],onlyFiles:!0}),t=T(e,r),n=await A(e,r),s=_(e),i=L(e),a=I(e),o=U(e),v=W(e),b=z(e),{dependencies:m,devDependencies:f,scripts:j}=await C(r),w=d(g.resolve(r,"src"))?"src":null,x=e.filter(c=>c.endsWith(".json")||c.endsWith(".yaml")||c.endsWith(".yml")||c.endsWith(".toml")||c.endsWith(".config.js")||c.endsWith(".config.ts")||c.endsWith(".config.mjs"));return N(n,m,f),{languages:t,frameworks:n,packageManager:s,databases:i,styling:a,testing:o,deployment:v,monorepo:b,dependencies:m,devDependencies:f,scripts:j,projectRoot:r,srcDir:w,configFiles:x}}function T(r,e){let t=new Map;for(let[s,{language:i}]of Object.entries(P))r.includes(s)&&(t.has(i)||t.set(i,{name:i,configFile:s}));let n={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".py":"python",".rs":"rust",".go":"go",".rb":"ruby",".php":"php",".java":"java",".kt":"kotlin",".swift":"swift",".dart":"dart",".ex":"elixir",".exs":"elixir",".c":"c",".cpp":"cpp",".cs":"csharp",".lua":"lua",".zig":"zig",".v":"vlang"};for(let s of r){let i=g.extname(s);n[i]&&!t.has(n[i])&&t.set(n[i],{name:n[i]})}return Array.from(t.values())}async function A(r,e){let t=new Map;for(let[n,{name:s,type:i}]of Object.entries(M))r.includes(n)&&(t.has(s)||t.set(s,{name:s,type:i}));return Array.from(t.values())}function N(r,e,t){let n={...e,...t},s={react:{name:"react",type:"frontend"},vue:{name:"vue",type:"frontend"},svelte:{name:"svelte",type:"frontend"},"@angular/core":{name:"angular",type:"frontend"},express:{name:"express",type:"backend"},fastify:{name:"fastify",type:"backend"},hono:{name:"hono",type:"backend"},"socket.io":{name:"socket.io",type:"backend"},electron:{name:"electron",type:"frontend"},tauri:{name:"tauri",type:"frontend"},"react-native":{name:"react-native",type:"mobile"},"@capacitor/core":{name:"capacitor",type:"mobile"},ionic:{name:"ionic",type:"mobile"},three:{name:"threejs",type:"frontend"},d3:{name:"d3",type:"library"},"@langchain/core":{name:"langchain",type:"library"},ai:{name:"vercel-ai-sdk",type:"library"},"@anthropic-ai/sdk":{name:"anthropic-sdk",type:"library"},openai:{name:"openai-sdk",type:"library"}};for(let[i,a]of Object.entries(s))n[i]&&!r.find(o=>o.name===a.name)&&r.push({...a,version:n[i]})}function _(r){for(let[e,t]of Object.entries(O))if(r.includes(e))return t}function L(r){let e=new Set;for(let[t,n]of Object.entries(F))r.some(s=>s.includes(t))&&e.add(n);return Array.from(e)}function I(r){let e=new Set;for(let[t,n]of Object.entries(E))r.includes(t)&&e.add(n);return Array.from(e)}function U(r){let e=new Set;for(let[t,n]of Object.entries($))r.some(s=>s.includes(t))&&e.add(n);return Array.from(e)}function W(r){let e=new Set;for(let[t,n]of Object.entries(D))r.some(s=>s.includes(t))&&e.add(n);return Array.from(e)}function z(r){return G.some(e=>r.includes(e))}async function C(r){let e=g.resolve(r,"package.json");if(!d(e))return{dependencies:{},devDependencies:{},scripts:{}};try{let t=await S.readFile(e,"utf8"),n=JSON.parse(t);return{dependencies:n.dependencies||{},devDependencies:n.devDependencies||{},scripts:n.scripts||{}}}catch{return{dependencies:{},devDependencies:{},scripts:{}}}}function Z(r){let e=[];return r.languages.length&&e.push(`Languages: ${r.languages.map(t=>t.name).join(", ")}`),r.frameworks.length&&e.push(`Frameworks: ${r.frameworks.map(t=>`${t.name}${t.version?`@${t.version}`:""} (${t.type})`).join(", ")}`),r.packageManager&&e.push(`Package Manager: ${r.packageManager}`),r.databases.length&&e.push(`Databases: ${r.databases.join(", ")}`),r.styling.length&&e.push(`Styling: ${r.styling.join(", ")}`),r.testing.length&&e.push(`Testing: ${r.testing.join(", ")}`),r.deployment.length&&e.push(`Deployment: ${r.deployment.join(", ")}`),r.monorepo&&e.push("Monorepo: yes"),r.srcDir&&e.push(`Source Dir: ${r.srcDir}`),e.join(`
2
+ `)}import{existsSync as q,promises as l}from"fs";import u from"path";var Y=".agentx",H="memory.json",y=500,J=1;function h(){return{version:J,entries:[],patterns:[],preferences:[],stats:{totalGenerations:0,successRate:1,totalHeals:0,skillsGenerated:0}}}var k=class{constructor(e){this.cwd=e;this.memoryPath=u.resolve(e,Y,H),this.store=h()}store;memoryPath;dirty=!1;async load(){try{if(q(this.memoryPath)){let e=await l.readFile(this.memoryPath,"utf8");this.store=JSON.parse(e)}}catch{this.store=h()}}async save(){if(!this.dirty)return;let e=u.dirname(this.memoryPath);await l.mkdir(e,{recursive:!0}),await l.writeFile(this.memoryPath,JSON.stringify(this.store,null,2),"utf8"),this.dirty=!1}async recordGeneration(e){let t=p();return this.store.entries.push({id:t,timestamp:Date.now(),type:e.type||"generation",...e}),this.store.stats.totalGenerations++,this.updateSuccessRate(),this.trimEntries(),this.dirty=!0,await this.save(),t}async recordHeal(e,t,n,s){this.store.entries.push({id:p(),timestamp:Date.now(),type:"heal",task:`Auto-heal for ${e}: ${t}`,files:s,success:n,error:n?void 0:t,context:{}}),this.store.stats.totalHeals++,this.dirty=!0,await this.save()}async recordFeedback(e,t){let n=this.store.entries.find(s=>s.id===e);n&&(n.userFeedback=t,t==="positive"&&await this.extractPattern(n),this.dirty=!0,await this.save())}async learnPreference(e,t,n){let s=this.store.preferences.find(i=>i.key===e);s?(s.value===t?s.confidence=Math.min(s.confidence+.1,1):(s.value=t,s.confidence=.5),s.source=n):this.store.preferences.push({key:e,value:t,confidence:.5,source:n}),this.dirty=!0,await this.save()}getRecentGenerations(e=10){return this.store.entries.filter(t=>t.type==="generation").sort((t,n)=>n.timestamp-t.timestamp).slice(0,e)}getFailedGenerations(e=5){return this.store.entries.filter(t=>!t.success).sort((t,n)=>n.timestamp-t.timestamp).slice(0,e)}getSimilarTasks(e,t=5){let n=new Set(e.toLowerCase().split(/\s+/).filter(s=>s.length>3));return this.store.entries.filter(s=>s.type==="generation"&&s.success).map(s=>{let i=new Set(s.task.toLowerCase().split(/\s+/).filter(o=>o.length>3)),a=[...n].filter(o=>i.has(o)).length;return{entry:s,score:a}}).filter(s=>s.score>0).sort((s,i)=>i.score-s.score).slice(0,t).map(s=>s.entry)}getPatterns(){return this.store.patterns.sort((e,t)=>t.frequency-e.frequency)}getPreferences(){return this.store.preferences.filter(e=>e.confidence>.3)}getStats(){return{...this.store.stats}}buildMemoryContext(e){let t=[],n=this.getSimilarTasks(e,3);n.length&&t.push(`## Relevant Past Generations
3
+ `+n.map(o=>`- Task: "${o.task}" \u2192 ${o.success?"succeeded":"failed"}${o.files.length?` (files: ${o.files.join(", ")})`:""}${o.userFeedback==="positive"?" (user liked this)":""}`).join(`
4
+ `));let s=this.getFailedGenerations(3);s.length&&t.push(`## Past Failures (avoid these patterns)
5
+ `+s.map(o=>`- "${o.task}": ${o.error||"unknown error"}`).join(`
6
+ `));let i=this.getPatterns().slice(0,5);i.length&&t.push(`## Learned Patterns
7
+ `+i.map(o=>`- ${o.description}`).join(`
8
+ `));let a=this.getPreferences();return a.length&&t.push(`## User Preferences
9
+ `+a.map(o=>`- ${o.key}: ${o.value}`).join(`
10
+ `)),t.length?`# Memory (learned from past interactions)
11
+
12
+ ${t.join(`
13
+
14
+ `)}`:""}async extractPattern(e){let t=`When asked "${K(e.task,80)}", generated ${e.files.length} file(s) successfully`,n=this.store.patterns.find(s=>s.description===t);n?(n.frequency++,n.lastUsed=Date.now()):this.store.patterns.push({id:p(),description:t,frequency:1,lastUsed:Date.now(),techStack:e.context.techStack||[]})}updateSuccessRate(){let e=this.store.entries.filter(n=>n.type==="generation");if(e.length===0){this.store.stats.successRate=1;return}let t=e.filter(n=>n.success).length;this.store.stats.successRate=t/e.length}trimEntries(){if(this.store.entries.length>y){let e=[...this.store.entries].sort((t,n)=>{let s=0,i=0;return t.userFeedback==="positive"&&(s+=100),n.userFeedback==="positive"&&(i+=100),t.success&&(s+=10),n.success&&(i+=10),s+=t.timestamp/1e10,i+=n.timestamp/1e10,i-s});this.store.entries=e.slice(0,y)}}};function p(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function K(r,e){return r.length>e?r.slice(0,e)+"...":r}export{Q as a,Z as b,k as c};
15
+ //# sourceMappingURL=chunk-SFQUP3BP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/context/tech-stack.ts","../src/runtime/memory.ts"],"sourcesContent":["import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport fg from \"fast-glob\"\n\n// --- Tech stack detection for any language/framework ---\n\nexport interface TechStack {\n languages: Language[]\n frameworks: Framework[]\n packageManager?: string\n databases: string[]\n styling: string[]\n testing: string[]\n deployment: string[]\n monorepo: boolean\n dependencies: Record<string, string>\n devDependencies: Record<string, string>\n scripts: Record<string, string>\n projectRoot: string\n srcDir: string | null\n configFiles: string[]\n}\n\nexport interface Language {\n name: string\n version?: string\n configFile?: string\n}\n\nexport interface Framework {\n name: string\n version?: string\n type: \"frontend\" | \"backend\" | \"fullstack\" | \"mobile\" | \"cli\" | \"library\"\n}\n\nconst CONFIG_SIGNATURES: Record<string, { language: string; framework?: string; type?: Framework[\"type\"] }> = {\n \"package.json\": { language: \"javascript\" },\n \"tsconfig.json\": { language: \"typescript\" },\n \"requirements.txt\": { language: \"python\" },\n \"pyproject.toml\": { language: \"python\" },\n \"setup.py\": { language: \"python\" },\n \"Pipfile\": { language: \"python\" },\n \"Cargo.toml\": { language: \"rust\" },\n \"go.mod\": { language: \"go\" },\n \"Gemfile\": { language: \"ruby\" },\n \"composer.json\": { language: \"php\" },\n \"build.gradle\": { language: \"java\" },\n \"build.gradle.kts\": { language: \"kotlin\" },\n \"pom.xml\": { language: \"java\" },\n \"pubspec.yaml\": { language: \"dart\", framework: \"flutter\", type: \"mobile\" },\n \"Package.swift\": { language: \"swift\" },\n \"Makefile\": { language: \"c\" },\n \"CMakeLists.txt\": { language: \"cpp\" },\n \"mix.exs\": { language: \"elixir\" },\n \"deno.json\": { language: \"typescript\", framework: \"deno\" },\n \"bun.lockb\": { language: \"typescript\" },\n}\n\nconst FRAMEWORK_SIGNATURES: Record<string, { name: string; type: Framework[\"type\"] }> = {\n \"next.config.js\": { name: \"nextjs\", type: \"fullstack\" },\n \"next.config.ts\": { name: \"nextjs\", type: \"fullstack\" },\n \"next.config.mjs\": { name: \"nextjs\", type: \"fullstack\" },\n \"nuxt.config.ts\": { name: \"nuxt\", type: \"fullstack\" },\n \"nuxt.config.js\": { name: \"nuxt\", type: \"fullstack\" },\n \"svelte.config.js\": { name: \"sveltekit\", type: \"fullstack\" },\n \"astro.config.mjs\": { name: \"astro\", type: \"frontend\" },\n \"astro.config.ts\": { name: \"astro\", type: \"frontend\" },\n \"remix.config.js\": { name: \"remix\", type: \"fullstack\" },\n \"angular.json\": { name: \"angular\", type: \"frontend\" },\n \"vue.config.js\": { name: \"vue-cli\", type: \"frontend\" },\n \"vite.config.ts\": { name: \"vite\", type: \"frontend\" },\n \"vite.config.js\": { name: \"vite\", type: \"frontend\" },\n \"gatsby-config.js\": { name: \"gatsby\", type: \"frontend\" },\n \"gatsby-config.ts\": { name: \"gatsby\", type: \"frontend\" },\n \"eleventy.config.js\": { name: \"eleventy\", type: \"frontend\" },\n \"docusaurus.config.js\": { name: \"docusaurus\", type: \"frontend\" },\n \"expo-env.d.ts\": { name: \"expo\", type: \"mobile\" },\n \"app.json\": { name: \"expo\", type: \"mobile\" }, // Could also be other things\n \"fastapi\": { name: \"fastapi\", type: \"backend\" },\n \"manage.py\": { name: \"django\", type: \"fullstack\" },\n \"config/routes.rb\": { name: \"rails\", type: \"fullstack\" },\n \"artisan\": { name: \"laravel\", type: \"fullstack\" },\n \"main.go\": { name: \"go-app\", type: \"backend\" },\n \"Dockerfile\": { name: \"docker\", type: \"backend\" },\n}\n\nconst DB_SIGNATURES: Record<string, string> = {\n \"prisma/schema.prisma\": \"prisma\",\n \"drizzle.config.ts\": \"drizzle\",\n \"drizzle.config.js\": \"drizzle\",\n \"knexfile.js\": \"knex\",\n \"knexfile.ts\": \"knex\",\n \"ormconfig.json\": \"typeorm\",\n \"mikro-orm.config.ts\": \"mikro-orm\",\n \"supabase/config.toml\": \"supabase\",\n \"firebase.json\": \"firebase\",\n \"mongod.conf\": \"mongodb\",\n}\n\nconst STYLING_SIGNATURES: Record<string, string> = {\n \"tailwind.config.js\": \"tailwindcss\",\n \"tailwind.config.ts\": \"tailwindcss\",\n \"postcss.config.js\": \"postcss\",\n \"postcss.config.mjs\": \"postcss\",\n \".stylelintrc\": \"stylelint\",\n \"styled-components\": \"styled-components\",\n}\n\nconst TESTING_SIGNATURES: Record<string, string> = {\n \"jest.config.js\": \"jest\",\n \"jest.config.ts\": \"jest\",\n \"vitest.config.ts\": \"vitest\",\n \"vitest.config.js\": \"vitest\",\n \"cypress.config.ts\": \"cypress\",\n \"cypress.config.js\": \"cypress\",\n \"playwright.config.ts\": \"playwright\",\n \"playwright.config.js\": \"playwright\",\n \".mocharc.yml\": \"mocha\",\n \"pytest.ini\": \"pytest\",\n \"conftest.py\": \"pytest\",\n}\n\nconst DEPLOYMENT_SIGNATURES: Record<string, string> = {\n \"vercel.json\": \"vercel\",\n \"netlify.toml\": \"netlify\",\n \"fly.toml\": \"fly.io\",\n \"railway.toml\": \"railway\",\n \"render.yaml\": \"render\",\n \"Dockerfile\": \"docker\",\n \"docker-compose.yml\": \"docker-compose\",\n \"docker-compose.yaml\": \"docker-compose\",\n \".github/workflows\": \"github-actions\",\n \"serverless.yml\": \"serverless\",\n \"terraform\": \"terraform\",\n \"pulumi\": \"pulumi\",\n}\n\nconst MONOREPO_SIGNATURES = [\n \"pnpm-workspace.yaml\",\n \"lerna.json\",\n \"nx.json\",\n \"turbo.json\",\n \"rush.json\",\n]\n\nconst PACKAGE_MANAGER_LOCKS: Record<string, string> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"yarn.lock\": \"yarn\",\n \"package-lock.json\": \"npm\",\n \"bun.lockb\": \"bun\",\n}\n\nexport async function detectTechStack(cwd: string): Promise<TechStack> {\n const files = await fg.glob(\"**/*\", {\n cwd,\n deep: 3,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/.nuxt/**\",\n \"**/target/**\",\n \"**/__pycache__/**\",\n \"**/vendor/**\",\n \"**/.git/**\",\n ],\n onlyFiles: true,\n })\n\n const languages = detectLanguages(files, cwd)\n const frameworks = await detectFrameworks(files, cwd)\n const packageManager = detectPackageManager(files)\n const databases = detectDatabases(files)\n const styling = detectStyling(files)\n const testing = detectTesting(files)\n const deployment = detectDeployment(files)\n const monorepo = detectMonorepo(files)\n const { dependencies, devDependencies, scripts } = await readPackageJson(cwd)\n const srcDir = existsSync(path.resolve(cwd, \"src\")) ? \"src\" : null\n const configFiles = files.filter(\n (f) =>\n f.endsWith(\".json\") ||\n f.endsWith(\".yaml\") ||\n f.endsWith(\".yml\") ||\n f.endsWith(\".toml\") ||\n f.endsWith(\".config.js\") ||\n f.endsWith(\".config.ts\") ||\n f.endsWith(\".config.mjs\")\n )\n\n // Enrich frameworks from package.json dependencies\n enrichFrameworksFromDeps(frameworks, dependencies, devDependencies)\n\n return {\n languages,\n frameworks,\n packageManager,\n databases,\n styling,\n testing,\n deployment,\n monorepo,\n dependencies,\n devDependencies,\n scripts,\n projectRoot: cwd,\n srcDir,\n configFiles,\n }\n}\n\nfunction detectLanguages(files: string[], cwd: string): Language[] {\n const langs = new Map<string, Language>()\n\n for (const [configFile, { language }] of Object.entries(CONFIG_SIGNATURES)) {\n if (files.includes(configFile)) {\n if (!langs.has(language)) {\n langs.set(language, { name: language, configFile })\n }\n }\n }\n\n // Detect from file extensions\n const extMap: Record<string, string> = {\n \".ts\": \"typescript\",\n \".tsx\": \"typescript\",\n \".js\": \"javascript\",\n \".jsx\": \"javascript\",\n \".py\": \"python\",\n \".rs\": \"rust\",\n \".go\": \"go\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".java\": \"java\",\n \".kt\": \"kotlin\",\n \".swift\": \"swift\",\n \".dart\": \"dart\",\n \".ex\": \"elixir\",\n \".exs\": \"elixir\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".cs\": \"csharp\",\n \".lua\": \"lua\",\n \".zig\": \"zig\",\n \".v\": \"vlang\",\n }\n\n for (const file of files) {\n const ext = path.extname(file)\n if (extMap[ext] && !langs.has(extMap[ext])) {\n langs.set(extMap[ext], { name: extMap[ext] })\n }\n }\n\n return Array.from(langs.values())\n}\n\nasync function detectFrameworks(files: string[], cwd: string): Promise<Framework[]> {\n const frameworks = new Map<string, Framework>()\n\n for (const [file, { name, type }] of Object.entries(FRAMEWORK_SIGNATURES)) {\n if (files.includes(file)) {\n if (!frameworks.has(name)) {\n frameworks.set(name, { name, type })\n }\n }\n }\n\n return Array.from(frameworks.values())\n}\n\nfunction enrichFrameworksFromDeps(\n frameworks: Framework[],\n deps: Record<string, string>,\n devDeps: Record<string, string>\n) {\n const allDeps = { ...deps, ...devDeps }\n const depFrameworks: Record<string, { name: string; type: Framework[\"type\"] }> = {\n react: { name: \"react\", type: \"frontend\" },\n vue: { name: \"vue\", type: \"frontend\" },\n svelte: { name: \"svelte\", type: \"frontend\" },\n \"@angular/core\": { name: \"angular\", type: \"frontend\" },\n express: { name: \"express\", type: \"backend\" },\n fastify: { name: \"fastify\", type: \"backend\" },\n hono: { name: \"hono\", type: \"backend\" },\n \"socket.io\": { name: \"socket.io\", type: \"backend\" },\n electron: { name: \"electron\", type: \"frontend\" },\n tauri: { name: \"tauri\", type: \"frontend\" },\n \"react-native\": { name: \"react-native\", type: \"mobile\" },\n \"@capacitor/core\": { name: \"capacitor\", type: \"mobile\" },\n ionic: { name: \"ionic\", type: \"mobile\" },\n three: { name: \"threejs\", type: \"frontend\" },\n d3: { name: \"d3\", type: \"library\" },\n \"@langchain/core\": { name: \"langchain\", type: \"library\" },\n \"ai\": { name: \"vercel-ai-sdk\", type: \"library\" },\n \"@anthropic-ai/sdk\": { name: \"anthropic-sdk\", type: \"library\" },\n openai: { name: \"openai-sdk\", type: \"library\" },\n }\n\n for (const [dep, info] of Object.entries(depFrameworks)) {\n if (allDeps[dep] && !frameworks.find((f) => f.name === info.name)) {\n frameworks.push({ ...info, version: allDeps[dep] })\n }\n }\n}\n\nfunction detectPackageManager(files: string[]): string | undefined {\n for (const [lockFile, pm] of Object.entries(PACKAGE_MANAGER_LOCKS)) {\n if (files.includes(lockFile)) {\n return pm\n }\n }\n return undefined\n}\n\nfunction detectDatabases(files: string[]): string[] {\n const dbs = new Set<string>()\n for (const [file, db] of Object.entries(DB_SIGNATURES)) {\n if (files.some((f) => f.includes(file))) {\n dbs.add(db)\n }\n }\n return Array.from(dbs)\n}\n\nfunction detectStyling(files: string[]): string[] {\n const styles = new Set<string>()\n for (const [file, style] of Object.entries(STYLING_SIGNATURES)) {\n if (files.includes(file)) {\n styles.add(style)\n }\n }\n return Array.from(styles)\n}\n\nfunction detectTesting(files: string[]): string[] {\n const tests = new Set<string>()\n for (const [file, test] of Object.entries(TESTING_SIGNATURES)) {\n if (files.some((f) => f.includes(file))) {\n tests.add(test)\n }\n }\n return Array.from(tests)\n}\n\nfunction detectDeployment(files: string[]): string[] {\n const deploys = new Set<string>()\n for (const [file, deploy] of Object.entries(DEPLOYMENT_SIGNATURES)) {\n if (files.some((f) => f.includes(file))) {\n deploys.add(deploy)\n }\n }\n return Array.from(deploys)\n}\n\nfunction detectMonorepo(files: string[]): boolean {\n return MONOREPO_SIGNATURES.some((sig) => files.includes(sig))\n}\n\nasync function readPackageJson(cwd: string): Promise<{\n dependencies: Record<string, string>\n devDependencies: Record<string, string>\n scripts: Record<string, string>\n}> {\n const pkgPath = path.resolve(cwd, \"package.json\")\n if (!existsSync(pkgPath)) {\n return { dependencies: {}, devDependencies: {}, scripts: {} }\n }\n\n try {\n const content = await fs.readFile(pkgPath, \"utf8\")\n const pkg = JSON.parse(content)\n return {\n dependencies: pkg.dependencies || {},\n devDependencies: pkg.devDependencies || {},\n scripts: pkg.scripts || {},\n }\n } catch {\n return { dependencies: {}, devDependencies: {}, scripts: {} }\n }\n}\n\nexport function formatTechStack(stack: TechStack): string {\n const lines: string[] = []\n\n if (stack.languages.length) {\n lines.push(`Languages: ${stack.languages.map((l) => l.name).join(\", \")}`)\n }\n if (stack.frameworks.length) {\n lines.push(\n `Frameworks: ${stack.frameworks.map((f) => `${f.name}${f.version ? `@${f.version}` : \"\"} (${f.type})`).join(\", \")}`\n )\n }\n if (stack.packageManager) {\n lines.push(`Package Manager: ${stack.packageManager}`)\n }\n if (stack.databases.length) {\n lines.push(`Databases: ${stack.databases.join(\", \")}`)\n }\n if (stack.styling.length) {\n lines.push(`Styling: ${stack.styling.join(\", \")}`)\n }\n if (stack.testing.length) {\n lines.push(`Testing: ${stack.testing.join(\", \")}`)\n }\n if (stack.deployment.length) {\n lines.push(`Deployment: ${stack.deployment.join(\", \")}`)\n }\n if (stack.monorepo) {\n lines.push(`Monorepo: yes`)\n }\n if (stack.srcDir) {\n lines.push(`Source Dir: ${stack.srcDir}`)\n }\n\n return lines.join(\"\\n\")\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\n\n// --- Memory System: persistent learning from past generations ---\n// agentx remembers what it generated, what worked, what failed,\n// user preferences, and successful patterns. Every interaction\n// makes it smarter.\n\nexport interface MemoryEntry {\n id: string\n timestamp: number\n type: \"generation\" | \"evolution\" | \"heal\" | \"skill\" | \"feedback\" | \"pattern\"\n task: string\n outputType?: string\n files: string[]\n success: boolean\n error?: string\n userFeedback?: \"positive\" | \"negative\" | \"neutral\"\n context: {\n techStack?: string[]\n frameworks?: string[]\n skillsUsed?: string[]\n }\n metadata?: Record<string, unknown>\n}\n\nexport interface LearnedPattern {\n id: string\n description: string\n frequency: number\n lastUsed: number\n techStack: string[]\n example?: string\n}\n\nexport interface UserPreference {\n key: string\n value: string\n confidence: number // 0-1, increases with repeated preference\n source: string // what interaction inferred this\n}\n\nexport interface MemoryStore {\n version: number\n entries: MemoryEntry[]\n patterns: LearnedPattern[]\n preferences: UserPreference[]\n stats: {\n totalGenerations: number\n successRate: number\n totalHeals: number\n skillsGenerated: number\n }\n}\n\nconst MEMORY_DIR = \".agentx\"\nconst MEMORY_FILE = \"memory.json\"\nconst MAX_ENTRIES = 500\nconst MEMORY_VERSION = 1\n\nfunction createEmptyStore(): MemoryStore {\n return {\n version: MEMORY_VERSION,\n entries: [],\n patterns: [],\n preferences: [],\n stats: {\n totalGenerations: 0,\n successRate: 1.0,\n totalHeals: 0,\n skillsGenerated: 0,\n },\n }\n}\n\nexport class Memory {\n private store: MemoryStore\n private memoryPath: string\n private dirty = false\n\n constructor(private cwd: string) {\n this.memoryPath = path.resolve(cwd, MEMORY_DIR, MEMORY_FILE)\n this.store = createEmptyStore()\n }\n\n async load(): Promise<void> {\n try {\n if (existsSync(this.memoryPath)) {\n const raw = await fs.readFile(this.memoryPath, \"utf8\")\n this.store = JSON.parse(raw)\n }\n } catch {\n this.store = createEmptyStore()\n }\n }\n\n async save(): Promise<void> {\n if (!this.dirty) return\n const dir = path.dirname(this.memoryPath)\n await fs.mkdir(dir, { recursive: true })\n await fs.writeFile(this.memoryPath, JSON.stringify(this.store, null, 2), \"utf8\")\n this.dirty = false\n }\n\n // --- Record events ---\n\n async recordGeneration(\n entry: Omit<MemoryEntry, \"id\" | \"timestamp\" | \"type\"> & { type?: MemoryEntry[\"type\"] }\n ): Promise<string> {\n const id = generateId()\n this.store.entries.push({\n id,\n timestamp: Date.now(),\n type: entry.type || \"generation\",\n ...entry,\n })\n this.store.stats.totalGenerations++\n this.updateSuccessRate()\n this.trimEntries()\n this.dirty = true\n await this.save()\n return id\n }\n\n async recordHeal(\n originalEntryId: string,\n error: string,\n fixed: boolean,\n fixFiles: string[]\n ): Promise<void> {\n this.store.entries.push({\n id: generateId(),\n timestamp: Date.now(),\n type: \"heal\",\n task: `Auto-heal for ${originalEntryId}: ${error}`,\n files: fixFiles,\n success: fixed,\n error: fixed ? undefined : error,\n context: {},\n })\n this.store.stats.totalHeals++\n this.dirty = true\n await this.save()\n }\n\n async recordFeedback(entryId: string, feedback: \"positive\" | \"negative\" | \"neutral\"): Promise<void> {\n const entry = this.store.entries.find((e) => e.id === entryId)\n if (entry) {\n entry.userFeedback = feedback\n if (feedback === \"positive\") {\n await this.extractPattern(entry)\n }\n this.dirty = true\n await this.save()\n }\n }\n\n async learnPreference(key: string, value: string, source: string): Promise<void> {\n const existing = this.store.preferences.find((p) => p.key === key)\n if (existing) {\n if (existing.value === value) {\n existing.confidence = Math.min(existing.confidence + 0.1, 1.0)\n } else {\n existing.value = value\n existing.confidence = 0.5\n }\n existing.source = source\n } else {\n this.store.preferences.push({ key, value, confidence: 0.5, source })\n }\n this.dirty = true\n await this.save()\n }\n\n // --- Query memory ---\n\n getRecentGenerations(limit = 10): MemoryEntry[] {\n return this.store.entries\n .filter((e) => e.type === \"generation\")\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit)\n }\n\n getFailedGenerations(limit = 5): MemoryEntry[] {\n return this.store.entries\n .filter((e) => !e.success)\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit)\n }\n\n getSimilarTasks(task: string, limit = 5): MemoryEntry[] {\n const taskWords = new Set(task.toLowerCase().split(/\\s+/).filter((w) => w.length > 3))\n return this.store.entries\n .filter((e) => e.type === \"generation\" && e.success)\n .map((e) => {\n const entryWords = new Set(e.task.toLowerCase().split(/\\s+/).filter((w) => w.length > 3))\n const overlap = [...taskWords].filter((w) => entryWords.has(w)).length\n return { entry: e, score: overlap }\n })\n .filter((e) => e.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((e) => e.entry)\n }\n\n getPatterns(): LearnedPattern[] {\n return this.store.patterns.sort((a, b) => b.frequency - a.frequency)\n }\n\n getPreferences(): UserPreference[] {\n return this.store.preferences.filter((p) => p.confidence > 0.3)\n }\n\n getStats(): MemoryStore[\"stats\"] {\n return { ...this.store.stats }\n }\n\n // --- Build context for agent ---\n\n buildMemoryContext(task: string): string {\n const sections: string[] = []\n\n // Similar past tasks\n const similar = this.getSimilarTasks(task, 3)\n if (similar.length) {\n sections.push(\n \"## Relevant Past Generations\\n\" +\n similar\n .map(\n (s) =>\n `- Task: \"${s.task}\" → ${s.success ? \"succeeded\" : \"failed\"}${s.files.length ? ` (files: ${s.files.join(\", \")})` : \"\"}${s.userFeedback === \"positive\" ? \" (user liked this)\" : \"\"}`\n )\n .join(\"\\n\")\n )\n }\n\n // Known failures to avoid\n const failures = this.getFailedGenerations(3)\n if (failures.length) {\n sections.push(\n \"## Past Failures (avoid these patterns)\\n\" +\n failures\n .map((f) => `- \"${f.task}\": ${f.error || \"unknown error\"}`)\n .join(\"\\n\")\n )\n }\n\n // Learned patterns\n const patterns = this.getPatterns().slice(0, 5)\n if (patterns.length) {\n sections.push(\n \"## Learned Patterns\\n\" +\n patterns.map((p) => `- ${p.description}`).join(\"\\n\")\n )\n }\n\n // User preferences\n const prefs = this.getPreferences()\n if (prefs.length) {\n sections.push(\n \"## User Preferences\\n\" +\n prefs.map((p) => `- ${p.key}: ${p.value}`).join(\"\\n\")\n )\n }\n\n if (!sections.length) return \"\"\n return `# Memory (learned from past interactions)\\n\\n${sections.join(\"\\n\\n\")}`\n }\n\n // --- Internal ---\n\n private async extractPattern(entry: MemoryEntry): Promise<void> {\n const description = `When asked \"${truncate(entry.task, 80)}\", generated ${entry.files.length} file(s) successfully`\n const existing = this.store.patterns.find(\n (p) => p.description === description\n )\n if (existing) {\n existing.frequency++\n existing.lastUsed = Date.now()\n } else {\n this.store.patterns.push({\n id: generateId(),\n description,\n frequency: 1,\n lastUsed: Date.now(),\n techStack: entry.context.techStack || [],\n })\n }\n }\n\n private updateSuccessRate(): void {\n const gens = this.store.entries.filter((e) => e.type === \"generation\")\n if (gens.length === 0) {\n this.store.stats.successRate = 1.0\n return\n }\n const successes = gens.filter((e) => e.success).length\n this.store.stats.successRate = successes / gens.length\n }\n\n private trimEntries(): void {\n if (this.store.entries.length > MAX_ENTRIES) {\n // Keep recent + successful + user-liked entries\n const sorted = [...this.store.entries].sort((a, b) => {\n let scoreA = 0\n let scoreB = 0\n if (a.userFeedback === \"positive\") scoreA += 100\n if (b.userFeedback === \"positive\") scoreB += 100\n if (a.success) scoreA += 10\n if (b.success) scoreB += 10\n scoreA += a.timestamp / 1e10\n scoreB += b.timestamp / 1e10\n return scoreB - scoreA\n })\n this.store.entries = sorted.slice(0, MAX_ENTRIES)\n }\n }\n}\n\nfunction generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"...\" : s\n}\n"],"mappings":"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","names":["existsSync","fs","path","fg","CONFIG_SIGNATURES","FRAMEWORK_SIGNATURES","DB_SIGNATURES","STYLING_SIGNATURES","TESTING_SIGNATURES","DEPLOYMENT_SIGNATURES","MONOREPO_SIGNATURES","PACKAGE_MANAGER_LOCKS","detectTechStack","cwd","files","languages","detectLanguages","frameworks","detectFrameworks","packageManager","detectPackageManager","databases","detectDatabases","styling","detectStyling","testing","detectTesting","deployment","detectDeployment","monorepo","detectMonorepo","dependencies","devDependencies","scripts","readPackageJson","srcDir","configFiles","f","enrichFrameworksFromDeps","langs","configFile","language","extMap","file","ext","name","type","deps","devDeps","allDeps","depFrameworks","dep","info","lockFile","pm","dbs","db","styles","style","tests","test","deploys","deploy","sig","pkgPath","content","pkg","formatTechStack","stack","lines","l","existsSync","fs","path","MEMORY_DIR","MEMORY_FILE","MAX_ENTRIES","MEMORY_VERSION","createEmptyStore","Memory","cwd","raw","dir","entry","id","generateId","originalEntryId","error","fixed","fixFiles","entryId","feedback","e","key","value","source","existing","p","limit","a","b","task","taskWords","w","entryWords","overlap","sections","similar","s","failures","f","patterns","prefs","description","truncate","gens","successes","sorted","scoreA","scoreB","max"]}