@aman_asmuei/aman-agent 0.16.2 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +347 -311
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/prompt.ts","../src/token-budget.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/mcp/client.ts","../src/logger.ts","../src/retry.ts","../src/agent.ts","../src/commands.ts","../src/layers/parsers.ts","../src/profile-templates.ts","../src/delegate.ts","../src/teams.ts","../src/plans.ts","../src/hooks.ts","../src/personality.ts","../src/context-manager.ts","../src/skill-engine.ts","../src/memory-extractor.ts","../src/background.ts","../src/errors.ts","../src/hints.ts","../src/presets.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { loadConfig, saveConfig } from \"./config.js\";\nimport { assembleSystemPrompt, getProfileAiName } from \"./prompt.js\";\nimport { createAnthropicClient } from \"./llm/anthropic.js\";\nimport { createOpenAIClient } from \"./llm/openai.js\";\nimport { createOllamaClient } from \"./llm/ollama.js\";\nimport { McpManager } from \"./mcp/client.js\";\nimport { runAgent } from \"./agent.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { applyPreset, PRESETS, type PresetName } from \"./presets.js\";\n\ndeclare const __VERSION__: string;\n\ninterface AutoDetectedConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\n}\n\nasync function autoDetectConfig(): Promise<AutoDetectedConfig | null> {\n // Skip auto-detect if user just ran /reconfig\n const reconfigMarker = path.join(os.homedir(), \".aman-agent\", \".reconfig\");\n if (fs.existsSync(reconfigMarker)) {\n fs.unlinkSync(reconfigMarker);\n return null; // Force interactive prompt\n }\n\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n return { provider: \"anthropic\", apiKey: anthropicKey, model: \"claude-sonnet-4-6\" };\n }\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n return { provider: \"openai\", apiKey: openaiKey, model: \"gpt-4o\" };\n }\n // Check Ollama — verify it's running AND has at least one model\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n const res = await fetch(\"http://localhost:11434/api/tags\", { signal: controller.signal });\n clearTimeout(timeout);\n if (res.ok) {\n const data = await res.json() as { models?: Array<{ name: string }> };\n const models = data.models || [];\n if (models.length > 0) {\n // Pick the first available model\n const modelName = models[0].name.replace(/:latest$/, \"\");\n return { provider: \"ollama\", apiKey: \"ollama\", model: modelName };\n }\n // Ollama running but no models downloaded — skip\n }\n } catch { /* Ollama not available */ }\n return null;\n}\n\nfunction bootstrapEcosystem(): boolean {\n const home = os.homedir();\n const corePath = path.join(home, \".acore\", \"core.md\");\n if (fs.existsSync(corePath)) return false;\n\n fs.mkdirSync(path.join(home, \".acore\"), { recursive: true });\n fs.writeFileSync(corePath, [\n \"# Aman\",\n \"\",\n \"## Personality\",\n \"Helpful, adaptive, and thoughtful. Matches the user's tone and needs.\",\n \"\",\n \"## Style\",\n \"Clear and concise. Prioritizes usefulness over verbosity.\",\n \"\",\n \"## Session\",\n \"_New companion — no prior sessions._\",\n ].join(\"\\n\"), \"utf-8\");\n\n const rulesDir = path.join(home, \".arules\");\n const rulesPath = path.join(rulesDir, \"rules.md\");\n if (!fs.existsSync(rulesPath)) {\n fs.mkdirSync(rulesDir, { recursive: true });\n fs.writeFileSync(rulesPath, [\n \"# Guardrails\",\n \"\",\n \"## safety\",\n \"- Never execute destructive commands without explicit confirmation\",\n \"- Never expose API keys, passwords, or secrets in responses\",\n \"\",\n \"## behavior\",\n '- Be honest when uncertain — say \"I\\'m not sure\" rather than guessing',\n \"- Respect the user's preferences stored in memory\",\n ].join(\"\\n\"), \"utf-8\");\n }\n\n return true;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"aman-agent\")\n .description(\"Your AI companion, running locally\")\n .version(__VERSION__)\n .option(\"--model <model>\", \"Override LLM model\")\n .option(\"--budget <tokens>\", \"Token budget for system prompt (default: 8000)\", parseInt)\n .option(\"--profile <name>\", \"Use a specific agent profile (e.g., coder, writer, researcher)\")\n .action(async (options) => {\n p.intro(pc.bold(\"aman agent\") + pc.dim(\" — your AI companion\"));\n\n // Setup config if needed\n let config = loadConfig();\n if (!config) {\n const detected = await autoDetectConfig();\n if (detected) {\n config = detected;\n const providerLabel =\n detected.provider === \"anthropic\" ? \"Anthropic API key\" :\n detected.provider === \"openai\" ? \"OpenAI API key\" : \"Ollama\";\n p.log.success(`Auto-detected ${providerLabel}. Using ${pc.bold(detected.model)}.`);\n p.log.info(pc.dim(\"Change anytime with /reconfig\"));\n saveConfig(config);\n } else {\n p.log.info(\"First-time setup — configure your LLM connection.\");\n\n const provider = (await p.select({\n message: \"LLM provider\",\n options: [\n {\n value: \"anthropic\",\n label: \"Claude (Anthropic)\",\n hint: \"recommended\",\n },\n { value: \"openai\", label: \"GPT (OpenAI)\" },\n { value: \"ollama\", label: \"Ollama (local)\", hint: \"free, runs offline\" },\n ],\n initialValue: \"anthropic\",\n })) as \"anthropic\" | \"openai\" | \"ollama\";\n if (p.isCancel(provider)) process.exit(0);\n\n let apiKey = \"\";\n let defaultModel = \"\";\n\n if (provider === \"ollama\") {\n apiKey = \"ollama\";\n const modelInput = (await p.text({\n message: \"Ollama model name\",\n placeholder: \"llama3.2\",\n defaultValue: \"llama3.2\",\n })) as string;\n if (p.isCancel(modelInput)) process.exit(0);\n defaultModel = modelInput || \"llama3.2\";\n } else if (provider === \"anthropic\") {\n p.log.info(\"Get your API key from: https://console.anthropic.com/settings/keys\");\n p.log.info(pc.dim(\"Note: API access is separate from Claude Pro subscription. You need API credits.\"));\n\n apiKey = (await p.text({\n message: \"API key (starts with sk-ant-)\",\n validate: (v) => v.length === 0 ? \"API key is required\" : undefined,\n })) as string;\n if (p.isCancel(apiKey)) process.exit(0);\n\n const modelChoice = (await p.select({\n message: \"Claude model\",\n options: [\n { value: \"claude-sonnet-4-6\", label: \"Claude Sonnet 4.6\", hint: \"fast, recommended\" },\n { value: \"claude-opus-4-6\", label: \"Claude Opus 4.6\", hint: \"most capable\" },\n { value: \"claude-haiku-4-5-20251001\", label: \"Claude Haiku 4.5\", hint: \"fastest, cheapest\" },\n { value: \"custom\", label: \"Custom model ID\" },\n ],\n initialValue: \"claude-sonnet-4-6\",\n })) as string;\n if (p.isCancel(modelChoice)) process.exit(0);\n\n if (modelChoice === \"custom\") {\n const customModel = (await p.text({\n message: \"Model ID\",\n placeholder: \"claude-sonnet-4-6\",\n validate: (v) => v.length === 0 ? \"Model ID is required\" : undefined,\n })) as string;\n if (p.isCancel(customModel)) process.exit(0);\n defaultModel = customModel;\n } else {\n defaultModel = modelChoice;\n }\n } else {\n // OpenAI\n apiKey = (await p.text({\n message: \"API key\",\n validate: (v) => v.length === 0 ? \"API key is required\" : undefined,\n })) as string;\n if (p.isCancel(apiKey)) process.exit(0);\n\n const modelChoice = (await p.select({\n message: \"OpenAI model\",\n options: [\n { value: \"gpt-4o\", label: \"GPT-4o\", hint: \"recommended\" },\n { value: \"gpt-4o-mini\", label: \"GPT-4o Mini\", hint: \"faster, cheaper\" },\n { value: \"o3\", label: \"o3\", hint: \"reasoning model\" },\n { value: \"custom\", label: \"Custom model ID\" },\n ],\n initialValue: \"gpt-4o\",\n })) as string;\n if (p.isCancel(modelChoice)) process.exit(0);\n\n if (modelChoice === \"custom\") {\n const customModel = (await p.text({\n message: \"Model ID\",\n placeholder: \"gpt-4o\",\n validate: (v) => v.length === 0 ? \"Model ID is required\" : undefined,\n })) as string;\n if (p.isCancel(customModel)) process.exit(0);\n defaultModel = customModel;\n } else {\n defaultModel = modelChoice;\n }\n }\n\n config = { provider, apiKey, model: defaultModel };\n saveConfig(config);\n p.log.success(\"Config saved to ~/.aman-agent/config.json\");\n }\n }\n\n // Override model if specified\n const model = options.model || config.model;\n\n // Spinner: bootstrap ecosystem + load system prompt\n const s = p.spinner();\n s.start(\"Loading ecosystem\");\n\n bootstrapEcosystem();\n\n // Resolve profile\n const profile = options.profile || process.env.AMAN_PROFILE || undefined;\n if (profile) {\n p.log.info(`Profile: ${pc.bold(profile)}`);\n }\n\n // Assemble system prompt from ecosystem with token budget\n const budget = options.budget || undefined;\n const { prompt: systemPrompt, layers, truncated, totalTokens } = assembleSystemPrompt(budget, profile);\n\n s.stop(\"Ecosystem loaded\");\n\n if (layers.length === 0) {\n p.log.warning(\n \"No ecosystem configured. Run \" +\n pc.bold(\"npx @aman_asmuei/aman\") +\n \" first.\",\n );\n p.log.info(\"Starting with empty system prompt.\");\n } else {\n p.log.success(\n `Loaded: ${layers.join(\", \")} ${pc.dim(`(${totalTokens.toLocaleString()} tokens)`)}`,\n );\n if (truncated.length > 0) {\n p.log.warning(`Truncated: ${truncated.join(\", \")} ${pc.dim(\"(over budget)\")}`);\n }\n }\n\n // Extract AI name from core.md\n const aiName = getProfileAiName(profile);\n\n // Start MCP servers\n const mcpManager = new McpManager();\n\n const mcpSpinner = p.spinner();\n mcpSpinner.start(\"Connecting to MCP servers\");\n\n // Core MCP servers (always connect)\n await mcpManager.connect(\"aman\", \"npx\", [\"-y\", \"@aman_asmuei/aman-mcp\"]);\n await mcpManager.connect(\"amem\", \"npx\", [\"-y\", \"@aman_asmuei/amem\"]);\n\n // Connect custom MCP servers from config\n // Users add these via: ~/.aman-agent/config.json → \"mcpServers\": { \"name\": { command, args } }\n // Or via akit: akit add docling → then add to config\n if (config.mcpServers) {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (name === \"aman\" || name === \"amem\") continue;\n await mcpManager.connect(name, serverConfig.command, serverConfig.args);\n }\n }\n\n const mcpTools = mcpManager.getTools();\n\n mcpSpinner.stop(\"MCP connected\");\n\n if (mcpTools.length > 0) {\n p.log.success(`${mcpTools.length} MCP tools available`);\n\n // Memory consolidation\n if (mcpTools.some(t => t.name === \"memory_consolidate\")) {\n const memSpinner = p.spinner();\n memSpinner.start(\"Consolidating memory\");\n try {\n const consolidateResult = await mcpManager.callTool(\"memory_consolidate\", { dry_run: false });\n if (consolidateResult && !consolidateResult.startsWith(\"Error\")) {\n try {\n const report = JSON.parse(consolidateResult);\n memSpinner.stop(\"Memory consolidated\");\n if (report.merged > 0 || report.pruned > 0 || report.promoted > 0) {\n p.log.info(\n `Memory health: ${report.healthScore ?? \"?\"}% ` +\n pc.dim(`(merged ${report.merged}, pruned ${report.pruned}, promoted ${report.promoted})`),\n );\n }\n } catch {\n memSpinner.stop(\"Memory consolidated\");\n }\n } else {\n memSpinner.stop(\"Memory consolidated\");\n }\n } catch {\n memSpinner.stop(\"Memory consolidation skipped\");\n }\n }\n } else {\n p.log.info(\n \"No MCP tools connected (install aman-mcp or amem for tool support)\",\n );\n }\n\n // Convert ToolDef[] to ToolDefinition[] for the LLM\n const toolDefs = mcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n }));\n\n // Create LLM client\n let client;\n if (config.provider === \"anthropic\") {\n client = createAnthropicClient(config.apiKey, model);\n } else if (config.provider === \"ollama\") {\n client = createOllamaClient(model);\n } else {\n client = createOpenAIClient(config.apiKey, model);\n }\n\n p.log.success(`${pc.bold(aiName)} is ready. Model: ${pc.dim(model)}`);\n\n // Run the agent\n await runAgent(\n client,\n systemPrompt,\n aiName,\n model,\n toolDefs.length > 0 ? toolDefs : undefined,\n toolDefs.length > 0 ? mcpManager : undefined,\n config.hooks,\n );\n\n // Cleanup on exit\n await mcpManager.disconnect();\n });\n\nprogram\n .command(\"init\")\n .description(\"Set up your AI companion with a guided wizard\")\n .action(async () => {\n p.intro(pc.bold(\"aman agent init\") + pc.dim(\" — set up your companion\"));\n\n const name = (await p.text({\n message: \"What should your companion be called?\",\n placeholder: \"Aman\",\n defaultValue: \"Aman\",\n })) as string;\n if (p.isCancel(name)) process.exit(0);\n\n const preset = (await p.select({\n message: \"What kind of companion do you need?\",\n options: [\n { value: \"coding\", label: \"Coding Partner\", hint: \"direct, technical, concise\" },\n { value: \"creative\", label: \"Creative Collaborator\", hint: \"warm, imaginative\" },\n { value: \"assistant\", label: \"Personal Assistant\", hint: \"organized, action-oriented\" },\n { value: \"learning\", label: \"Learning Buddy\", hint: \"patient, Socratic\" },\n { value: \"minimal\", label: \"Minimal\", hint: \"just chat, I'll customize later\" },\n ],\n initialValue: \"coding\",\n })) as PresetName;\n if (p.isCancel(preset)) process.exit(0);\n\n const result = applyPreset(preset, name || \"Aman\");\n const home = os.homedir();\n\n fs.mkdirSync(path.join(home, \".acore\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".acore\", \"core.md\"), result.coreMd, \"utf-8\");\n p.log.success(`Identity created — ${PRESETS[preset].identity.personality.split(\".\")[0].toLowerCase()}`);\n\n if (result.rulesMd) {\n fs.mkdirSync(path.join(home, \".arules\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".arules\", \"rules.md\"), result.rulesMd, \"utf-8\");\n const ruleCount = (result.rulesMd.match(/^- /gm) || []).length;\n p.log.success(`${ruleCount} rules set`);\n }\n\n if (result.flowMd) {\n fs.mkdirSync(path.join(home, \".aflow\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".aflow\", \"flow.md\"), result.flowMd, \"utf-8\");\n const wfCount = (result.flowMd.match(/^## /gm) || []).length;\n p.log.success(`${wfCount} workflow${wfCount > 1 ? \"s\" : \"\"} added`);\n }\n\n // Detect if running via npx (temp install)\n const isNpx = process.argv[1]?.includes(\"_npx\") || !process.argv[1]?.includes(\"node_modules/.bin\");\n\n p.outro(\"Your companion is ready.\");\n\n console.log(\"\");\n if (isNpx) {\n console.log(` ${pc.bold(\"Start chatting:\")} npx @aman_asmuei/aman-agent`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Tip: Install globally to use\")} ${pc.bold(\"aman-agent\")} ${pc.dim(\"directly:\")}`);\n console.log(` ${pc.dim(\" npm install -g @aman_asmuei/aman-agent\")}`);\n } else {\n console.log(` ${pc.bold(\"Start chatting:\")} aman-agent`);\n }\n console.log(\"\");\n console.log(` ${pc.dim(\"Add tools:\")} npx @aman_asmuei/akit add github`);\n console.log(` ${pc.dim(\"Browse:\")} npx @aman_asmuei/akit search <query>`);\n console.log(\"\");\n });\n\nprogram.parse();\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface HooksConfig {\n memoryRecall?: boolean;\n sessionResume?: boolean;\n rulesCheck?: boolean;\n workflowSuggest?: boolean;\n evalPrompt?: boolean;\n autoSessionSave?: boolean;\n extractMemories?: boolean;\n featureHints?: boolean;\n personalityAdapt?: boolean;\n}\n\nconst DEFAULT_HOOKS: HooksConfig = {\n memoryRecall: true,\n sessionResume: true,\n rulesCheck: true,\n workflowSuggest: true,\n evalPrompt: true,\n autoSessionSave: true,\n extractMemories: true,\n featureHints: true,\n personalityAdapt: true,\n};\n\nexport interface McpServerEntry {\n command: string;\n args: string[];\n env?: Record<string, string>;\n}\n\nexport interface AgentConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\n hooks?: HooksConfig;\n mcpServers?: Record<string, McpServerEntry>;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".aman-agent\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\nexport function loadConfig(): AgentConfig | null {\n if (!fs.existsSync(CONFIG_PATH)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as AgentConfig;\n raw.hooks = { ...DEFAULT_HOOKS, ...raw.hooks };\n return raw;\n } catch {\n return null;\n }\n}\n\nexport function saveConfig(config: AgentConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(\n CONFIG_PATH,\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport function configExists(): boolean {\n return fs.existsSync(CONFIG_PATH);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { estimateTokens, buildBudgetedPrompt } from \"./token-budget.js\";\nimport type { PromptComponent } from \"./token-budget.js\";\n\ninterface EcosystemFile {\n name: string;\n dir: string;\n file: string;\n profileOverridable?: boolean; // can be overridden by profile-specific file\n}\n\nconst ECOSYSTEM_FILES: EcosystemFile[] = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\", profileOverridable: true },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"guardrails\", dir: \".arules\", file: \"rules.md\", profileOverridable: true },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\", profileOverridable: true },\n];\n\n/**\n * Resolve the file path for an ecosystem layer, checking profile override first.\n */\nfunction resolveLayerPath(entry: EcosystemFile, home: string, profile?: string): string | null {\n // Check profile-specific override first\n if (profile && entry.profileOverridable) {\n const profilePath = path.join(home, \".acore\", \"profiles\", profile, entry.file);\n if (fs.existsSync(profilePath)) return profilePath;\n\n // For rules/skills, also check profile dir with original filename\n if (entry.name === \"guardrails\") {\n const altPath = path.join(home, \".acore\", \"profiles\", profile, \"rules.md\");\n if (fs.existsSync(altPath)) return altPath;\n }\n if (entry.name === \"skills\") {\n const altPath = path.join(home, \".acore\", \"profiles\", profile, \"skills.md\");\n if (fs.existsSync(altPath)) return altPath;\n }\n }\n\n // Fall back to global path\n const globalPath = path.join(home, entry.dir, entry.file);\n if (fs.existsSync(globalPath)) return globalPath;\n\n return null;\n}\n\nexport function assembleSystemPrompt(\n maxTokens?: number,\n profile?: string,\n): {\n prompt: string;\n layers: string[];\n truncated: string[];\n totalTokens: number;\n profile?: string;\n} {\n const home = os.homedir();\n const components: PromptComponent[] = [];\n\n for (const entry of ECOSYSTEM_FILES) {\n const filePath = resolveLayerPath(entry, home, profile);\n if (filePath) {\n const content = fs.readFileSync(filePath, \"utf-8\").trim();\n components.push({\n name: entry.name,\n content,\n tokens: estimateTokens(content),\n });\n }\n }\n\n // Project context (not prioritized — appended as extra)\n const contextPath = path.join(process.cwd(), \".acore\", \"context.md\");\n if (fs.existsSync(contextPath)) {\n const content = fs.readFileSync(contextPath, \"utf-8\").trim();\n components.push({\n name: \"context\",\n content,\n tokens: estimateTokens(content),\n });\n }\n\n const budgeted = buildBudgetedPrompt(components, maxTokens);\n\n return {\n prompt: budgeted.prompt,\n layers: budgeted.included,\n truncated: budgeted.truncated,\n totalTokens: budgeted.totalTokens,\n profile,\n };\n}\n\n/**\n * List available profiles.\n */\nexport function listProfiles(): Array<{ name: string; aiName: string; personality: string }> {\n const profilesDir = path.join(os.homedir(), \".acore\", \"profiles\");\n if (!fs.existsSync(profilesDir)) return [];\n\n const profiles: Array<{ name: string; aiName: string; personality: string }> = [];\n for (const entry of fs.readdirSync(profilesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const corePath = path.join(profilesDir, entry.name, \"core.md\");\n if (!fs.existsSync(corePath)) continue;\n\n const content = fs.readFileSync(corePath, \"utf-8\");\n const nameMatch = content.match(/^# (.+)/m);\n const personalityMatch = content.match(/- Personality:\\s*(.+)/);\n\n profiles.push({\n name: entry.name,\n aiName: nameMatch?.[1]?.trim() || entry.name,\n personality: personalityMatch?.[1]?.trim() || \"default\",\n });\n }\n\n return profiles;\n}\n\n/**\n * Get the AI name for a profile (or default).\n */\nexport function getProfileAiName(profile?: string): string {\n const home = os.homedir();\n let corePath: string;\n\n if (profile) {\n const profileCorePath = path.join(home, \".acore\", \"profiles\", profile, \"core.md\");\n corePath = fs.existsSync(profileCorePath) ? profileCorePath : path.join(home, \".acore\", \"core.md\");\n } else {\n corePath = path.join(home, \".acore\", \"core.md\");\n }\n\n if (!fs.existsSync(corePath)) return \"Assistant\";\n const content = fs.readFileSync(corePath, \"utf-8\");\n const match = content.match(/^# (.+)$/m);\n return match?.[1]?.trim() || \"Assistant\";\n}\n","// Rough token estimation: ~1.3 tokens per word for English markdown\nexport function estimateTokens(text: string): number {\n return Math.round(text.split(/\\s+/).filter(Boolean).length * 1.3);\n}\n\n// Priority order for system prompt components (highest to lowest)\nconst PRIORITIES = [\n \"identity\", // core.md — always include\n \"guardrails\", // rules.md — safety critical\n \"workflows\", // flow.md — behavioral\n \"tools\", // kit.md — capabilities\n \"skills\", // skills.md — can be truncated\n];\n\nexport interface PromptComponent {\n name: string;\n content: string;\n tokens: number;\n}\n\nexport function buildBudgetedPrompt(\n components: PromptComponent[],\n maxTokens: number = 8000, // default budget for system prompt\n): { prompt: string; included: string[]; truncated: string[]; totalTokens: number } {\n const included: string[] = [];\n const truncated: string[] = [];\n const parts: string[] = [];\n let totalTokens = 0;\n\n // Sort by priority\n const sorted = [...components].sort((a, b) => {\n const aPri = PRIORITIES.indexOf(a.name);\n const bPri = PRIORITIES.indexOf(b.name);\n return (aPri === -1 ? 99 : aPri) - (bPri === -1 ? 99 : bPri);\n });\n\n for (const comp of sorted) {\n if (totalTokens + comp.tokens <= maxTokens) {\n parts.push(comp.content);\n included.push(comp.name);\n totalTokens += comp.tokens;\n } else {\n // Try to include a truncated version (first 50% of content)\n const halfContent = comp.content.slice(0, Math.floor(comp.content.length / 2));\n const halfTokens = estimateTokens(halfContent);\n if (totalTokens + halfTokens <= maxTokens) {\n parts.push(halfContent + \"\\n\\n[... truncated for context budget ...]\");\n included.push(comp.name + \" (partial)\");\n totalTokens += halfTokens;\n } else {\n truncated.push(comp.name);\n }\n }\n }\n\n return {\n prompt: parts.join(\"\\n\\n---\\n\\n\"),\n included,\n truncated,\n totalTokens,\n };\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n ContentBlock,\n} from \"./types.js\";\n\nfunction toAnthropicMessages(\n messages: Message[],\n): Anthropic.Messages.MessageParam[] {\n return messages.map((m) => {\n if (typeof m.content === \"string\") {\n return { role: m.role, content: m.content };\n }\n // Complex content blocks (text, image, tool_use, tool_result)\n return {\n role: m.role,\n content: m.content.map((block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text };\n }\n if (block.type === \"image\") {\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: block.source.media_type,\n data: block.source.data,\n },\n };\n }\n if (block.type === \"tool_use\") {\n return {\n type: \"tool_use\" as const,\n id: block.id,\n name: block.name,\n input: block.input,\n };\n }\n if (block.type === \"tool_result\") {\n return {\n type: \"tool_result\" as const,\n tool_use_id: block.tool_use_id,\n content: block.content,\n };\n }\n return { type: \"text\" as const, text: \"\" };\n }),\n };\n });\n}\n\nexport function createAnthropicClient(\n apiKey: string,\n model: string,\n): LLMClient {\n const client = new Anthropic({ apiKey });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const anthropicMessages = toAnthropicMessages(messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolUseBlocks: Array<{\n id: string;\n name: string;\n inputJson: string;\n }> = [];\n let currentBlockType: \"text\" | \"tool_use\" | null = null;\n let currentBlockIndex = -1;\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema:\n t.input_schema as Anthropic.Messages.Tool[\"input_schema\"],\n }));\n }\n\n const stream = await client.messages.create(\n createParams as unknown as Anthropic.Messages.MessageCreateParamsStreaming,\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_start\") {\n currentBlockIndex = event.index;\n if (event.content_block.type === \"text\") {\n currentBlockType = \"text\";\n } else if (event.content_block.type === \"tool_use\") {\n currentBlockType = \"tool_use\";\n toolUseBlocks.push({\n id: event.content_block.id,\n name: event.content_block.name,\n inputJson: \"\",\n });\n }\n } else if (event.type === \"content_block_delta\") {\n if (\n currentBlockType === \"text\" &&\n event.delta.type === \"text_delta\"\n ) {\n const text = event.delta.text;\n fullText += text;\n onChunk({ type: \"text\", text });\n } else if (\n currentBlockType === \"tool_use\" &&\n event.delta.type === \"input_json_delta\"\n ) {\n const lastTool = toolUseBlocks[toolUseBlocks.length - 1];\n if (lastTool) {\n lastTool.inputJson += event.delta.partial_json;\n }\n }\n } else if (event.type === \"content_block_stop\") {\n currentBlockType = null;\n }\n }\n\n // Parse tool inputs from accumulated JSON\n const toolUses = toolUseBlocks.map((block) => ({\n id: block.id,\n name: block.name,\n input: (block.inputJson\n ? JSON.parse(block.inputJson)\n : {}) as Record<string, unknown>,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build content blocks for the message\n if (toolUses.length > 0) {\n const contentBlocks: ContentBlock[] = [];\n if (fullText) {\n contentBlocks.push({ type: \"text\" as const, text: fullText });\n }\n for (const tu of toolUses) {\n contentBlocks.push({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n });\n }\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (error instanceof Anthropic.AuthenticationError) {\n throw new Error(\n \"Invalid API key. Run with --model flag or delete ~/.aman-agent/config.json to reconfigure.\",\n );\n }\n if (error instanceof Anthropic.RateLimitError) {\n throw new Error(\"Rate limited by Anthropic. Please wait and retry.\");\n }\n throw error;\n }\n },\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n} from \"./types.js\";\n\nfunction toOpenAIMessages(\n systemPrompt: string,\n messages: Message[],\n): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [\n { role: \"system\", content: systemPrompt },\n ];\n\n for (const m of messages) {\n if (typeof m.content === \"string\") {\n result.push({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n });\n } else if (m.role === \"assistant\") {\n // Assistant message with tool calls\n const textParts = m.content.filter((b) => b.type === \"text\");\n const toolUseParts = m.content.filter((b) => b.type === \"tool_use\");\n const text = textParts.map((b) => (\"text\" in b ? b.text : \"\")).join(\"\");\n\n if (toolUseParts.length > 0) {\n result.push({\n role: \"assistant\",\n content: text || null,\n tool_calls: toolUseParts.map((b) => ({\n id: \"id\" in b ? b.id : \"\",\n type: \"function\" as const,\n function: {\n name: \"name\" in b ? b.name : \"\",\n arguments: JSON.stringify(\"input\" in b ? b.input : {}),\n },\n })),\n });\n } else {\n result.push({ role: \"assistant\", content: text });\n }\n } else if (m.role === \"user\") {\n // Check if it contains tool results\n const toolResults = m.content.filter((b) => b.type === \"tool_result\");\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n if (tr.type === \"tool_result\") {\n result.push({\n role: \"tool\",\n tool_call_id: tr.tool_use_id,\n content: tr.content,\n });\n }\n }\n } else {\n // User message — may contain text + images\n const hasImages = m.content.some((b) => b.type === \"image\");\n if (hasImages) {\n const parts: Array<Record<string, unknown>> = [];\n for (const b of m.content) {\n if (b.type === \"text\") {\n parts.push({ type: \"text\", text: b.text });\n } else if (b.type === \"image\") {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${b.source.media_type};base64,${b.source.data}`,\n },\n });\n }\n }\n result.push({ role: \"user\", content: parts as never });\n } else {\n const text = m.content\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n result.push({ role: \"user\", content: text });\n }\n }\n }\n }\n\n return result;\n}\n\nexport function createOpenAIClient(apiKey: string, model: string): LLMClient {\n const client = new OpenAI({ apiKey });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const openaiMessages = toOpenAIMessages(systemPrompt, messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolCallAccumulators: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n messages: openaiMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n const stream = await client.chat.completions.create(\n createParams as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming,\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n // Stream text content\n if (delta.content) {\n fullText += delta.content;\n onChunk({ type: \"text\", text: delta.content });\n }\n\n // Accumulate tool calls\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let acc = toolCallAccumulators.get(idx);\n if (!acc) {\n acc = { id: \"\", name: \"\", arguments: \"\" };\n toolCallAccumulators.set(idx, acc);\n }\n if (tc.id) {\n acc.id = tc.id;\n }\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n }\n }\n }\n }\n\n // Parse accumulated tool calls\n const toolUses = Array.from(toolCallAccumulators.entries())\n .sort(([a], [b]) => a - b)\n .map(([, acc]) => ({\n id: acc.id,\n name: acc.name,\n input: JSON.parse(acc.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build response\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(fullText\n ? [{ type: \"text\" as const, text: fullText }]\n : []),\n ...toolUses.map((tu) => ({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n })),\n ];\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (error instanceof OpenAI.AuthenticationError) {\n throw new Error(\n \"Invalid API key. Run with --model flag or delete ~/.aman-agent/config.json to reconfigure.\",\n );\n }\n if (error instanceof OpenAI.RateLimitError) {\n throw new Error(\"Rate limited by OpenAI. Please wait and retry.\");\n }\n throw error;\n }\n },\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n} from \"./types.js\";\n\nfunction toOllamaMessages(\n systemPrompt: string,\n messages: Message[],\n): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [\n { role: \"system\", content: systemPrompt },\n ];\n\n for (const m of messages) {\n if (typeof m.content === \"string\") {\n result.push({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n });\n } else if (m.role === \"assistant\") {\n const textParts = m.content.filter((b) => b.type === \"text\");\n const toolUseParts = m.content.filter((b) => b.type === \"tool_use\");\n const text = textParts.map((b) => (\"text\" in b ? b.text : \"\")).join(\"\");\n\n if (toolUseParts.length > 0) {\n result.push({\n role: \"assistant\",\n content: text || null,\n tool_calls: toolUseParts.map((b) => ({\n id: \"id\" in b ? b.id : \"\",\n type: \"function\" as const,\n function: {\n name: \"name\" in b ? b.name : \"\",\n arguments: JSON.stringify(\"input\" in b ? b.input : {}),\n },\n })),\n });\n } else {\n result.push({ role: \"assistant\", content: text });\n }\n } else if (m.role === \"user\") {\n const toolResults = m.content.filter((b) => b.type === \"tool_result\");\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n if (tr.type === \"tool_result\") {\n result.push({\n role: \"tool\",\n tool_call_id: tr.tool_use_id,\n content: tr.content,\n });\n }\n }\n } else {\n // User message — may contain text + images\n const hasImages = m.content.some((b) => b.type === \"image\");\n if (hasImages) {\n const parts: Array<Record<string, unknown>> = [];\n for (const b of m.content) {\n if (b.type === \"text\") {\n parts.push({ type: \"text\", text: b.text });\n } else if (b.type === \"image\") {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${b.source.media_type};base64,${b.source.data}`,\n },\n });\n }\n }\n result.push({ role: \"user\", content: parts as never });\n } else {\n const text = m.content\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n result.push({ role: \"user\", content: text });\n }\n }\n }\n }\n\n return result;\n}\n\nexport function createOllamaClient(\n model: string,\n baseURL?: string,\n): LLMClient {\n const client = new OpenAI({\n baseURL: baseURL || \"http://localhost:11434/v1\",\n apiKey: \"ollama\", // Ollama doesn't require a real key\n });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const ollamaMessages = toOllamaMessages(systemPrompt, messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolCallAccumulators: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n messages: ollamaMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n const stream = await client.chat.completions.create(\n createParams as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming,\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n // Stream text content\n if (delta.content) {\n fullText += delta.content;\n onChunk({ type: \"text\", text: delta.content });\n }\n\n // Accumulate tool calls\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let acc = toolCallAccumulators.get(idx);\n if (!acc) {\n acc = { id: \"\", name: \"\", arguments: \"\" };\n toolCallAccumulators.set(idx, acc);\n }\n if (tc.id) {\n acc.id = tc.id;\n }\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n }\n }\n }\n }\n\n // Parse accumulated tool calls\n const toolUses = Array.from(toolCallAccumulators.entries())\n .sort(([a], [b]) => a - b)\n .map(([, acc]) => ({\n id: acc.id,\n name: acc.name,\n input: JSON.parse(acc.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build response\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(fullText\n ? [{ type: \"text\" as const, text: fullText }]\n : []),\n ...toolUses.map((tu) => ({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n })),\n ];\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"ECONNREFUSED\")\n ) {\n throw new Error(\n \"Cannot connect to Ollama. Make sure it's running: ollama serve\",\n );\n }\n throw error;\n }\n },\n };\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { log } from \"../logger.js\";\nimport { withRetry } from \"../retry.js\";\n\ninterface McpConnection {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n serverName: string;\n}\n\nexport class McpManager {\n private connections: McpConnection[] = [];\n private tools: ToolDef[] = [];\n\n async connect(\n name: string,\n command: string,\n args: string[],\n ): Promise<void> {\n try {\n const transport = new StdioClientTransport({ command, args, stderr: \"pipe\" });\n const client = new Client({\n name: `aman-agent-${name}`,\n version: \"0.1.0\",\n });\n await client.connect(transport);\n\n // Redirect stderr to debug log instead of terminal\n if (transport.stderr) {\n transport.stderr.on(\"data\", (chunk: Buffer) => {\n log.debug(\"mcp\", `[${name} stderr] ${chunk.toString().trim()}`);\n });\n }\n\n this.connections.push({ name, client, transport });\n\n // List tools from this server\n const toolsResult = await client.listTools();\n for (const tool of toolsResult.tools) {\n this.tools.push({\n name: tool.name,\n description: tool.description || \"\",\n input_schema: tool.inputSchema as Record<string, unknown>,\n serverName: name,\n });\n }\n } catch (err) {\n log.error(\"mcp\", \"Failed to connect to \" + name + \" MCP server\", err);\n console.error(` Warning: Could not connect to ${name} MCP server`);\n }\n }\n\n getTools(): ToolDef[] {\n return this.tools;\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const tool = this.tools.find((t) => t.name === toolName);\n if (!tool) return `Error: tool ${toolName} not found`;\n\n const conn = this.connections.find((c) => c.name === tool.serverName);\n if (!conn) return `Error: server ${tool.serverName} not connected`;\n\n try {\n const result = await withRetry(\n () => conn.client.callTool({ name: toolName, arguments: args }),\n { maxAttempts: 2, baseDelay: 500, retryable: (err) => err.message.includes(\"ETIMEDOUT\") || err.message.includes(\"timeout\") },\n );\n // Extract text from result\n if (result.content && Array.isArray(result.content)) {\n return (result.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n }\n return JSON.stringify(result);\n } catch (error) {\n return `Error calling ${toolName}: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n\n async disconnect(): Promise<void> {\n for (const conn of this.connections) {\n try {\n await conn.client.close();\n } catch (err) {\n log.debug(\"mcp\", \"Cleanup error disconnecting \" + conn.name, err);\n }\n }\n this.connections = [];\n this.tools = [];\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst LOG_DIR = path.join(os.homedir(), \".aman-agent\");\nexport const LOG_PATH = path.join(LOG_DIR, \"debug.log\");\nconst MAX_LOG_SIZE = 1_048_576; // 1MB\n\ninterface LogEntry {\n timestamp: string;\n level: \"debug\" | \"warn\" | \"error\";\n module: string;\n message: string;\n data?: string;\n}\n\nfunction ensureDir(): void {\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n}\n\nfunction maybeRotate(): void {\n try {\n if (!fs.existsSync(LOG_PATH)) return;\n const stat = fs.statSync(LOG_PATH);\n if (stat.size >= MAX_LOG_SIZE) {\n const backupPath = LOG_PATH + \".1\";\n if (fs.existsSync(backupPath)) fs.unlinkSync(backupPath);\n fs.renameSync(LOG_PATH, backupPath);\n }\n } catch {\n // Rotation failure is non-critical\n }\n}\n\nfunction write(level: LogEntry[\"level\"], module: string, message: string, data?: unknown): void {\n try {\n ensureDir();\n maybeRotate();\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n module,\n message,\n };\n if (data !== undefined) {\n entry.data = data instanceof Error ? data.message : String(data);\n }\n fs.appendFileSync(LOG_PATH, JSON.stringify(entry) + \"\\n\");\n } catch {\n // Logger must never throw\n }\n}\n\nexport const log = {\n debug: (module: string, message: string, data?: unknown) => write(\"debug\", module, message, data),\n warn: (module: string, message: string, data?: unknown) => write(\"warn\", module, message, data),\n error: (module: string, message: string, data?: unknown) => write(\"error\", module, message, data),\n};\n","export interface RetryOptions {\n maxAttempts: number;\n baseDelay: number;\n retryable: (err: Error) => boolean;\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions,\n): Promise<T> {\n const { maxAttempts, baseDelay, retryable } = options;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (!retryable(lastError) || attempt === maxAttempts) {\n throw lastError;\n }\n const delay = baseDelay * Math.pow(2, attempt - 1) * (0.5 + Math.random() * 0.5);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import * as readline from \"node:readline\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport { marked } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport logUpdate from \"log-update\";\nimport type {\n LLMClient,\n Message,\n ContentBlock,\n ToolDefinition,\n ToolResultBlock,\n ImageBlock,\n StreamChunk,\n} from \"./llm/types.js\";\nimport { handleCommand } from \"./commands.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport {\n onSessionStart,\n onBeforeToolExec,\n onWorkflowMatch,\n onSessionEnd,\n getSessionStartTime,\n type HookContext,\n} from \"./hooks.js\";\nimport {\n computePersonality,\n syncPersonalityToCore,\n formatWellbeingNudge,\n} from \"./personality.js\";\nimport type { HooksConfig } from \"./config.js\";\nimport { trimConversation } from \"./context-manager.js\";\nimport { log } from \"./logger.js\";\nimport { withRetry } from \"./retry.js\";\nimport { extractMemories as runExtraction, type ExtractorState } from \"./memory-extractor.js\";\nimport { autoTriggerSkills, matchKnowledge } from \"./skill-engine.js\";\nimport { BackgroundTaskManager, shouldRunInBackground } from \"./background.js\";\nimport { getActivePlan, formatPlanForPrompt } from \"./plans.js\";\nimport { delegateTask } from \"./delegate.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { listTeams, loadTeam, runTeam, formatTeamResult } from \"./teams.js\";\nimport { humanizeError } from \"./errors.js\";\nimport { getHint, loadShownHints, saveShownHints, type HintState } from \"./hints.js\";\n\n// markedTerminal() returns a MarkedExtension — types lag behind, cast is safe\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal() as any);\n\ninterface RecallResult {\n text: string;\n tokenEstimate: number;\n}\n\nasync function recallForMessage(\n input: string,\n mcpManager: McpManager,\n): Promise<RecallResult | null> {\n try {\n const result = await mcpManager.callTool(\"memory_recall\", {\n query: input,\n limit: 5,\n compact: true,\n });\n if (!result || result.startsWith(\"Error\") || result.includes(\"No memories found\")) {\n return null;\n }\n // Estimate tokens: ~1.3 tokens per word\n const tokenEstimate = Math.round(result.split(/\\s+/).filter(Boolean).length * 1.3);\n return {\n text: `\\n\\n<relevant-memories>\\n${result}\\n</relevant-memories>`,\n tokenEstimate,\n };\n } catch (err) {\n log.debug(\"agent\", \"memory recall failed\", err);\n return null;\n }\n}\n\n// Generate a session ID for conversation logging\nfunction generateSessionId(): string {\n const now = new Date();\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `session-${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}`;\n}\n\nexport async function runAgent(\n client: LLMClient,\n systemPrompt: string,\n aiName: string,\n model: string,\n tools?: ToolDefinition[],\n mcpManager?: McpManager,\n hooksConfig?: HooksConfig,\n): Promise<void> {\n const messages: Message[] = [];\n const sessionId = generateSessionId();\n const extractorState: ExtractorState = { turnsSinceLastExtraction: 0, lastExtractionCount: 0 };\n const bgTasks = new BackgroundTaskManager();\n\n // Add virtual tools for delegation and teams\n const profiles = listProfiles();\n const teams = listTeams();\n if (tools && (profiles.length > 0 || teams.length > 0)) {\n const virtualTools: ToolDefinition[] = [];\n\n if (profiles.length > 0) {\n virtualTools.push({\n name: \"delegate_task\",\n description: `Delegate a task to a specialist sub-agent with a different profile. Available profiles: ${profiles.map((p) => `${p.name} (${p.personality})`).join(\", \")}. IMPORTANT: Always ask the user for permission before delegating.`,\n input_schema: {\n type: \"object\",\n properties: {\n profile: { type: \"string\", description: \"Profile name to delegate to\" },\n task: { type: \"string\", description: \"The task description for the sub-agent\" },\n },\n required: [\"profile\", \"task\"],\n },\n });\n }\n\n if (teams.length > 0) {\n virtualTools.push({\n name: \"team_run\",\n description: `Run a task with a named agent team. Available teams: ${teams.map((t) => `${t.name} (${t.workflow}: ${t.members.map((m) => m.profile).join(\"→\")})`).join(\", \")}. IMPORTANT: Always ask the user for permission before running a team.`,\n input_schema: {\n type: \"object\",\n properties: {\n team: { type: \"string\", description: \"Team name\" },\n task: { type: \"string\", description: \"The task for the team\" },\n },\n required: [\"team\", \"task\"],\n },\n });\n }\n\n tools = [...tools, ...virtualTools];\n }\n const hintState: HintState = {\n turnCount: 0,\n shownHints: loadShownHints(),\n hintShownThisSession: false,\n };\n\n const isRetryable = (err: Error) =>\n err.message.includes(\"Rate limit\") ||\n err.message.includes(\"rate limit\") ||\n err.message.includes(\"ECONNRESET\") ||\n err.message.includes(\"ETIMEDOUT\") ||\n err.message.includes(\"fetch failed\");\n\n let responseBuffer = \"\";\n\n const onChunkHandler = (chunk: StreamChunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n responseBuffer += chunk.text;\n if (process.stdout.isTTY) {\n logUpdate(responseBuffer);\n } else {\n process.stdout.write(chunk.text);\n }\n }\n if (chunk.type === \"done\") {\n if (process.stdout.isTTY && responseBuffer.trim()) {\n try {\n const rendered = marked(responseBuffer.trim()) as string;\n logUpdate(rendered);\n logUpdate.done();\n } catch {\n logUpdate.done();\n }\n } else {\n process.stdout.write(\"\\n\");\n }\n responseBuffer = \"\";\n }\n };\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Handle Ctrl+C gracefully\n rl.on(\"SIGINT\", async () => {\n // Wait for background tasks before exiting\n if (bgTasks.pendingCount > 0) {\n await bgTasks.waitAll();\n bgTasks.displayCompleted();\n }\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n await onSessionEnd(hookCtx, messages, sessionId);\n } catch (err) { log.debug(\"agent\", \"session end hook failed on SIGINT\", err); }\n }\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n process.exit(0);\n });\n\n const prompt = (): Promise<string> => {\n return new Promise<string>((resolve) => {\n rl.question(pc.green(\"\\nYou > \"), (answer) => {\n resolve(answer);\n });\n });\n };\n\n console.log(\n `\\nType a message, ${pc.dim(\"/help\")} for commands, or ${pc.dim(\"/quit\")} to exit.\\n`,\n );\n\n if (mcpManager && hooksConfig) {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n try {\n const session = await onSessionStart(hookCtx);\n\n if (!session.firstRun) {\n if (session.resumeTopic) {\n console.log(pc.dim(` Welcome back. Last time we talked about ${session.resumeTopic}`));\n } else {\n console.log(pc.dim(\" Welcome back.\"));\n }\n }\n\n if (session.visibleReminders && session.visibleReminders.length > 0) {\n for (const reminder of session.visibleReminders) {\n console.log(pc.yellow(` Reminder: ${reminder}`));\n }\n }\n\n if (session.contextInjection) {\n messages.push({ role: \"user\", content: session.contextInjection });\n if (session.firstRun) {\n messages.push({ role: \"assistant\", content: \"acknowledged\" });\n } else {\n messages.push({ role: \"assistant\", content: \"I have context from our previous sessions. How can I help?\" });\n }\n }\n } catch (err) { log.warn(\"agent\", \"session start hook failed\", err); }\n }\n\n while (true) {\n // Check for completed background tasks\n if (bgTasks.hasCompleted) {\n const bgOutputs = bgTasks.displayCompleted();\n for (const output of bgOutputs) {\n messages.push({ role: \"user\", content: output });\n }\n }\n\n const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = await handleCommand(input, { model, mcpManager, llmClient: client, tools });\n if (cmdResult.handled) {\n if (cmdResult.quit) {\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n await onSessionEnd(hookCtx, messages, sessionId);\n } catch (err) { log.debug(\"agent\", \"session end hook failed on quit\", err); }\n }\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n return;\n }\n if (cmdResult.exportConversation) {\n try {\n const exportDir = path.join(os.homedir(), \".aman-agent\", \"exports\");\n fs.mkdirSync(exportDir, { recursive: true });\n const exportPath = path.join(exportDir, `${sessionId}.md`);\n\n const lines: string[] = [\n `# Conversation — ${new Date().toLocaleString()}`,\n `**Model:** ${model}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n const label = msg.role === \"user\" ? \"**You:**\" : `**${aiName}:**`;\n lines.push(`${label} ${msg.content}`, \"\");\n }\n }\n\n fs.writeFileSync(exportPath, lines.join(\"\\n\"), \"utf-8\");\n console.log(pc.green(`Exported to ${exportPath}`));\n } catch {\n console.log(pc.red(\"Failed to export conversation.\"));\n }\n continue;\n }\n if (cmdResult.saveConversation && mcpManager) {\n try {\n await saveConversationToMemory(mcpManager, messages, sessionId);\n console.log(pc.green(\"Conversation saved to memory.\"));\n } catch {\n console.log(pc.red(\"Failed to save conversation.\"));\n }\n continue;\n }\n if (cmdResult.output) {\n console.log(cmdResult.output);\n }\n if (cmdResult.clearHistory) {\n messages.length = 0;\n }\n continue;\n }\n\n // Check for workflow match\n let activeSystemPrompt = systemPrompt;\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n const wfMatch = await onWorkflowMatch(input, hookCtx);\n if (wfMatch) {\n const useIt = await new Promise<boolean>((resolve) => {\n rl.question(pc.dim(` Workflow \"${wfMatch.name}\" matches. Use it? (y/N) `), (answer) => resolve(answer.toLowerCase() === \"y\"));\n });\n if (useIt) {\n activeSystemPrompt = systemPrompt + `\\n\\n<active-workflow>\\n${wfMatch.steps}\\n</active-workflow>`;\n console.log(pc.dim(` Using \"${wfMatch.name}\" workflow.`));\n }\n }\n } catch (err) { log.debug(\"agent\", \"workflow match failed\", err); }\n }\n\n // Inject active plan into context\n const activePlan = getActivePlan();\n if (activePlan) {\n activeSystemPrompt += \"\\n\\n\" + formatPlanForPrompt(activePlan);\n }\n\n // Auto-trigger skills based on conversation context\n if (mcpManager) {\n try {\n const skillContext = await autoTriggerSkills(input, mcpManager);\n if (skillContext) {\n activeSystemPrompt += \"\\n\\n\" + skillContext;\n }\n } catch (err) { log.debug(\"agent\", \"skill auto-trigger failed\", err); }\n\n // Auto-suggest knowledge library items\n const knowledgeItem = matchKnowledge(input);\n if (knowledgeItem) {\n activeSystemPrompt += `\\n\\n<knowledge name=\"${knowledgeItem.name}\" category=\"${knowledgeItem.category}\">\n${knowledgeItem.description}\n\n${knowledgeItem.content}\n</knowledge>`;\n }\n }\n\n // Auto-trim conversation if approaching token limits\n await trimConversation(messages, client);\n\n // Detect and process file paths + image URLs in user input\n const textExts = new Set([\n \".txt\", \".md\", \".json\", \".js\", \".ts\", \".jsx\", \".tsx\", \".py\",\n \".html\", \".css\", \".yml\", \".yaml\", \".toml\", \".xml\", \".csv\",\n \".sh\", \".bash\", \".zsh\", \".env\", \".cfg\", \".ini\", \".log\",\n \".sql\", \".graphql\", \".rs\", \".go\", \".java\", \".rb\", \".php\",\n \".c\", \".cpp\", \".h\", \".swift\", \".kt\", \".r\", \".lua\",\n ]);\n const imageExts = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\"]);\n const docExts = new Set([\".docx\", \".doc\", \".pdf\", \".pptx\", \".ppt\", \".xlsx\", \".xls\", \".odt\", \".rtf\", \".epub\"]);\n const mimeMap: Record<string, ImageBlock[\"source\"][\"media_type\"]> = {\n \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\", \".webp\": \"image/webp\", \".bmp\": \"image/png\",\n };\n const maxImageBytes = 20 * 1024 * 1024; // 20MB\n\n let textContent = input;\n const imageBlocks: ImageBlock[] = [];\n\n // Detect all local file paths\n const filePathMatches = [...input.matchAll(/(\\/[\\w./-]+|~\\/[\\w./-]+)/g)];\n for (const match of filePathMatches) {\n let filePath = match[1];\n if (filePath.startsWith(\"~/\")) {\n filePath = path.join(os.homedir(), filePath.slice(2));\n }\n if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) continue;\n\n const ext = path.extname(filePath).toLowerCase();\n\n if (imageExts.has(ext)) {\n // Image file — base64 encode\n try {\n const stat = fs.statSync(filePath);\n if (stat.size > maxImageBytes) {\n process.stdout.write(pc.yellow(` [skipped: ${path.basename(filePath)} — exceeds 20MB limit]\\n`));\n continue;\n }\n const data = fs.readFileSync(filePath).toString(\"base64\");\n const mediaType = mimeMap[ext] || \"image/png\";\n imageBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: mediaType, data },\n });\n process.stdout.write(pc.dim(` [attached image: ${path.basename(filePath)} (${(stat.size / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not read image: ${filePath}]\\n`));\n }\n } else if (textExts.has(ext) || ext === \"\") {\n // Text file — inline as XML\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const maxChars = 50000;\n const trimmed = content.length > maxChars\n ? content.slice(0, maxChars) + `\\n\\n[... truncated, ${content.length - maxChars} chars remaining]`\n : content;\n textContent += `\\n\\n<file path=\"${filePath}\" size=\"${content.length} chars\">\\n${trimmed}\\n</file>`;\n process.stdout.write(pc.dim(` [attached: ${path.basename(filePath)} (${(content.length / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not read: ${filePath}]\\n`));\n }\n } else if (docExts.has(ext)) {\n // Binary document — convert via MCP\n if (mcpManager) {\n try {\n process.stdout.write(pc.dim(` [converting: ${path.basename(filePath)}...]\\n`));\n const converted = await mcpManager.callTool(\"doc_convert\", { path: filePath });\n if (converted && !converted.startsWith(\"Error\") && !converted.includes(\"Could not convert\")) {\n textContent += `\\n\\n<file path=\"${filePath}\" format=\"${ext}\">\\n${converted.slice(0, 50000)}\\n</file>`;\n process.stdout.write(pc.dim(` [attached: ${path.basename(filePath)} (converted from ${ext})]\\n`));\n } else {\n textContent += `\\n\\n<file-error path=\"${filePath}\">\\n${converted}\\n</file-error>`;\n process.stdout.write(pc.yellow(` [conversion note: ${converted.split(\"\\n\")[0]}]\\n`));\n }\n } catch {\n process.stdout.write(pc.dim(` [could not convert: ${path.basename(filePath)}]\\n`));\n }\n } else {\n process.stdout.write(pc.yellow(` Binary file (${ext}) — install Docling for document support: pip install docling\\n`));\n }\n }\n }\n\n // Detect image URLs in user input\n const urlImageMatches = [...input.matchAll(/https?:\\/\\/\\S+\\.(?:png|jpg|jpeg|gif|webp)(?:\\?\\S*)?/gi)];\n for (const match of urlImageMatches) {\n const url = match[0];\n try {\n process.stdout.write(pc.dim(` [fetching image: ${url.slice(0, 60)}...]\\n`));\n const response = await fetch(url);\n if (!response.ok) {\n process.stdout.write(pc.yellow(` [could not fetch: HTTP ${response.status}]\\n`));\n continue;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxImageBytes) {\n process.stdout.write(pc.yellow(` [skipped: image URL exceeds 20MB limit]\\n`));\n continue;\n }\n const contentType = response.headers.get(\"content-type\") || \"\";\n let mediaType: ImageBlock[\"source\"][\"media_type\"] = \"image/png\";\n if (contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")) mediaType = \"image/jpeg\";\n else if (contentType.includes(\"gif\")) mediaType = \"image/gif\";\n else if (contentType.includes(\"webp\")) mediaType = \"image/webp\";\n else if (contentType.includes(\"png\")) mediaType = \"image/png\";\n\n imageBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: mediaType, data: buffer.toString(\"base64\") },\n });\n process.stdout.write(pc.dim(` [attached image URL: (${(buffer.length / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not fetch image: ${url}]\\n`));\n }\n }\n\n // Build user message: structured ContentBlock[] if images present, string otherwise\n if (imageBlocks.length > 0) {\n const blocks: ContentBlock[] = [\n { type: \"text\", text: textContent },\n ...imageBlocks,\n ];\n messages.push({ role: \"user\", content: blocks });\n } else {\n messages.push({ role: \"user\", content: textContent });\n }\n\n // Per-message memory recall\n let augmentedSystemPrompt = activeSystemPrompt;\n let memoryTokens = 0;\n if (mcpManager) {\n const recall = await recallForMessage(input, mcpManager);\n if (recall) {\n augmentedSystemPrompt = activeSystemPrompt + recall.text;\n memoryTokens = recall.tokenEstimate;\n }\n }\n\n // Personality refresh with sentiment (every 5 turns)\n const userTurnCount = messages.filter((m) => m.role === \"user\").length;\n if (mcpManager && hooksConfig?.personalityAdapt !== false && userTurnCount > 0 && userTurnCount % 5 === 0) {\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n // Collect recent user messages for sentiment analysis\n const recentUserMsgs = messages\n .filter((m) => m.role === \"user\" && typeof m.content === \"string\")\n .slice(-5)\n .map((m) => m.content as string);\n\n const sessionMinutes = Math.round((Date.now() - getSessionStartTime()) / 60000);\n const state = computePersonality({\n timePeriod: period,\n sessionMinutes,\n turnCount: userTurnCount,\n recentMessages: recentUserMsgs,\n });\n\n syncPersonalityToCore(state, mcpManager).catch(() => {});\n\n const nudge = formatWellbeingNudge(state);\n if (nudge) {\n augmentedSystemPrompt += \"\\n\" + nudge;\n }\n }\n\n const divider = \"─\".repeat(Math.min(process.stdout.columns || 60, 60) - aiName.length - 2);\n process.stdout.write(`\\n ${pc.cyan(pc.bold(aiName))} ${pc.dim(divider)}\\n\\n`);\n\n try {\n let response = await withRetry(\n () => client.chat(augmentedSystemPrompt, messages, onChunkHandler, tools),\n { maxAttempts: 3, baseDelay: 1000, retryable: isRetryable },\n );\n\n // Add assistant message to history\n messages.push(response.message);\n\n // Agentic tool loop: execute tools until LLM stops requesting them\n while (response.toolUses.length > 0 && mcpManager) {\n const toolResults: ToolResultBlock[] = await Promise.all(\n response.toolUses.map(async (toolUse) => {\n if (hooksConfig) {\n const hookCtx: HookContext = { mcpManager: mcpManager!, config: hooksConfig };\n const check = await onBeforeToolExec(toolUse.name, toolUse.input, hookCtx);\n if (!check.allow) {\n process.stdout.write(pc.red(` [BLOCKED: ${check.reason}]\\n`));\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `BLOCKED by guardrail: ${check.reason}`,\n is_error: true,\n };\n }\n }\n\n // Handle delegate_task virtual tool\n if (toolUse.name === \"delegate_task\" && mcpManager) {\n const input = toolUse.input as { profile: string; task: string };\n process.stdout.write(pc.dim(`\\n [delegating to ${input.profile}...]\\n\\n`));\n const result = await delegateTask(input.task, input.profile, client, mcpManager, { tools });\n const output = result.success\n ? `[${input.profile}] completed:\\n\\n${result.response}`\n : `[${input.profile}] failed: ${result.error}`;\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: output,\n };\n }\n\n // Handle team_run virtual tool\n if (toolUse.name === \"team_run\" && mcpManager) {\n const input = toolUse.input as { team: string; task: string };\n const team = loadTeam(input.team);\n if (!team) {\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `Team not found: ${input.team}`,\n is_error: true,\n };\n }\n const result = await runTeam(team, input.task, client, mcpManager, tools);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result.success\n ? formatTeamResult(result)\n : `Team execution failed: ${result.finalOutput}`,\n };\n }\n\n // Check if tool should run in background\n if (shouldRunInBackground(toolUse.name)) {\n const task = bgTasks.launch(toolUse.name, toolUse.id, mcpManager, toolUse.input);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `[${toolUse.name} launched in background (${task.id}). Results will appear when ready. Continue with other work.]`,\n };\n }\n\n process.stdout.write(pc.dim(` [using ${toolUse.name}...]\\n`));\n const result = await mcpManager.callTool(toolUse.name, toolUse.input);\n\n // Log tool observation to amem (passive capture, fire-and-forget)\n const skipLogging = [\"memory_log\", \"memory_recall\", \"memory_context\", \"memory_detail\", \"reminder_check\"].includes(toolUse.name);\n if (!skipLogging) {\n mcpManager.callTool(\"memory_log\", {\n session_id: sessionId,\n role: \"system\",\n content: `[tool:${toolUse.name}] input=${JSON.stringify(toolUse.input).slice(0, 500)} result=${result.slice(0, 500)}`,\n }).catch(() => {});\n }\n\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result,\n };\n }),\n );\n\n // Add tool results as a user message\n messages.push({\n role: \"user\",\n content: toolResults,\n });\n\n // Call LLM again with tool results\n response = await withRetry(\n () => client.chat(augmentedSystemPrompt, messages, onChunkHandler, tools),\n { maxAttempts: 3, baseDelay: 1000, retryable: isRetryable },\n );\n\n // Add assistant response to history\n messages.push(response.message);\n }\n\n // Response footer\n const footerParts: string[] = [];\n if (memoryTokens > 0) footerParts.push(`memories: ~${memoryTokens} tokens`);\n const footer = footerParts.length > 0 ? ` ${footerParts.join(\" | \")}` : \"\";\n const footerDivider = \"─\".repeat(Math.min(process.stdout.columns || 60, 60) - footer.length - 1);\n process.stdout.write(pc.dim(` ${footerDivider}${footer}\\n`));\n\n // Memory extraction (runs silently after response)\n if (mcpManager && hooksConfig?.extractMemories) {\n const assistantText = typeof response.message.content === \"string\"\n ? response.message.content\n : response.message.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n\n if (assistantText) {\n const count = await runExtraction(\n input, assistantText, client, mcpManager, extractorState,\n );\n if (count > 0) {\n process.stdout.write(pc.dim(` [${count} memory${count > 1 ? \"ies\" : \"\"} stored]\\n`));\n }\n }\n } else {\n extractorState.turnsSinceLastExtraction++;\n }\n\n // Progressive hints\n if (hooksConfig?.featureHints) {\n hintState.turnCount++;\n const hasWorkflows = fs.existsSync(path.join(os.homedir(), \".aflow\", \"flow.md\"));\n const memoryCount = memoryTokens > 0 ? Math.floor(memoryTokens / 5) : 0;\n const hint = getHint(hintState, { hasWorkflows, memoryCount });\n if (hint) {\n process.stdout.write(pc.dim(` ${hint}\\n`));\n saveShownHints(hintState.shownHints);\n }\n }\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n const friendly = humanizeError(rawMessage);\n console.error(pc.red(`\\n ${friendly}`));\n // Don't remove the user message — keep for retry\n }\n }\n}\n\n// Save conversation messages to amem's memory_log\nasync function saveConversationToMemory(\n mcpManager: McpManager,\n messages: Message[],\n sessionId: string,\n): Promise<void> {\n // Save last 50 messages\n const recentMessages = messages.slice(-50);\n\n for (const msg of recentMessages) {\n if (typeof msg.content !== \"string\") continue;\n try {\n await mcpManager.callTool(\"memory_log\", {\n session_id: sessionId,\n role: msg.role,\n content: msg.content.slice(0, 5000),\n });\n } catch (err) {\n log.debug(\"agent\", \"memory_log write failed\", err);\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { getEcosystemStatus } from \"./layers/parsers.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { BUILT_IN_PROFILES, installProfileTemplate } from \"./profile-templates.js\";\nimport { delegateTask, delegatePipeline } from \"./delegate.js\";\nimport {\n createTeam,\n loadTeam,\n listTeams,\n deleteTeam,\n runTeam,\n formatTeam,\n formatTeamResult,\n BUILT_IN_TEAMS,\n type Team,\n} from \"./teams.js\";\nimport {\n createPlan,\n getActivePlan,\n listPlans,\n loadPlan,\n markStepDone,\n markStepUndone,\n setActivePlan,\n formatPlan,\n} from \"./plans.js\";\n\nexport interface CommandResult {\n handled: boolean;\n output?: string;\n quit?: boolean;\n clearHistory?: boolean;\n saveConversation?: boolean;\n exportConversation?: boolean;\n}\n\nexport interface CommandContext {\n model?: string;\n mcpManager?: McpManager;\n llmClient?: import(\"./llm/types.js\").LLMClient;\n tools?: import(\"./llm/types.js\").ToolDefinition[];\n}\n\nfunction readEcosystemFile(filePath: string, label: string): string {\n if (!fs.existsSync(filePath)) {\n return pc.dim(`No ${label} file found at ${filePath}`);\n }\n return fs.readFileSync(filePath, \"utf-8\").trim();\n}\n\nfunction parseCommand(input: string): { base: string; action?: string; args: string[] } {\n const trimmed = input.trim();\n const parts = trimmed.split(/\\s+/);\n const base = parts[0].toLowerCase().replace(/^\\//, \"\");\n const action = parts.length > 1 ? parts[1].toLowerCase() : undefined;\n const args = parts.slice(2);\n return { base, action, args };\n}\n\nasync function mcpWrite(\n ctx: CommandContext,\n layer: string,\n tool: string,\n args: Record<string, unknown>,\n): Promise<string> {\n if (!ctx.mcpManager) {\n return pc.red(`Cannot modify ${layer}: aman-mcp not connected. Start it with: npx @aman_asmuei/aman-mcp`);\n }\n const result = await ctx.mcpManager.callTool(tool, args);\n if (result.startsWith(\"Error\")) {\n return pc.red(result);\n }\n return pc.green(result);\n}\n\n// --- Layer Handlers ---\n\nasync function handleIdentityCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".acore\", \"core.md\"), \"identity (acore)\");\n return { handled: true, output: content };\n }\n if (action === \"update\") {\n if (args.length === 0) {\n return {\n handled: true,\n output: pc.yellow(\"Usage: /identity update <section>\\nTip: describe changes in natural language and the AI will update via MCP.\"),\n };\n }\n const section = args[0];\n const content = args.slice(1).join(\" \");\n if (!content) {\n return {\n handled: true,\n output: pc.yellow(\"Usage: /identity update <section> <new content...>\\nExample: /identity update Personality Warm, curious, and direct.\"),\n };\n }\n const output = await mcpWrite(ctx, \"identity\", \"identity_update_section\", { section, content });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /identity ${action}. Use /identity or /identity update <section>.`) };\n}\n\nasync function handleRulesCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".arules\", \"rules.md\"), \"guardrails (arules)\");\n return { handled: true, output: content };\n }\n if (action === \"add\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules add <category> <rule text...>\") };\n }\n const category = args[0];\n const rule = args.slice(1).join(\" \");\n const output = await mcpWrite(ctx, \"rules\", \"rules_add\", { category, rule });\n return { handled: true, output };\n }\n if (action === \"remove\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules remove <category> <index>\") };\n }\n const output = await mcpWrite(ctx, \"rules\", \"rules_remove\", { category: args[0], index: parseInt(args[1], 10) });\n return { handled: true, output };\n }\n if (action === \"toggle\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules toggle <category> <index>\") };\n }\n const output = await mcpWrite(ctx, \"rules\", \"rules_toggle\", { category: args[0], index: parseInt(args[1], 10) });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /rules ${action}. Use /rules [add|remove|toggle].`) };\n}\n\nasync function handleWorkflowsCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".aflow\", \"flow.md\"), \"workflows (aflow)\");\n return { handled: true, output: content };\n }\n if (action === \"add\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /workflows add <name>\") };\n }\n const output = await mcpWrite(ctx, \"workflows\", \"workflow_add\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n if (action === \"remove\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /workflows remove <name>\") };\n }\n const output = await mcpWrite(ctx, \"workflows\", \"workflow_remove\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /workflows ${action}. Use /workflows [add|remove].`) };\n}\n\n// akit registry — keep in sync with @aman_asmuei/akit/src/lib/registry.ts\ninterface AkitTool {\n name: string;\n description: string;\n category: string;\n mcp: { package: string; command: string; args: string[]; env?: Record<string, string> } | null;\n envHint?: string;\n}\n\nconst AKIT_REGISTRY: AkitTool[] = [\n { name: \"web-search\", description: \"Search the web for current information\", category: \"search\", mcp: { package: \"@anthropic/web-search\", command: \"npx\", args: [\"-y\", \"@anthropic/web-search\"] } },\n { name: \"brave-search\", description: \"Private web search via Brave\", category: \"search\", mcp: { package: \"@modelcontextprotocol/server-brave-search\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-brave-search\"], env: { BRAVE_API_KEY: \"\" } }, envHint: \"Set BRAVE_API_KEY from https://brave.com/search/api/\" },\n { name: \"github\", description: \"Manage GitHub repos, PRs, issues\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-github\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-github\"], env: { GITHUB_TOKEN: \"\" } }, envHint: \"Set GITHUB_TOKEN from https://github.com/settings/tokens\" },\n { name: \"git\", description: \"Git operations — log, diff, blame, branch\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-git\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-git\"] } },\n { name: \"filesystem\", description: \"Read, write, and search files\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-filesystem\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"] } },\n { name: \"linear\", description: \"Manage Linear issues and projects\", category: \"development\", mcp: { package: \"@linear/mcp-server\", command: \"npx\", args: [\"-y\", \"@linear/mcp-server\"], env: { LINEAR_API_KEY: \"\" } }, envHint: \"Set LINEAR_API_KEY from Linear settings → API\" },\n { name: \"sentry\", description: \"Monitor and triage app errors\", category: \"development\", mcp: { package: \"@sentry/mcp-server\", command: \"npx\", args: [\"-y\", \"@sentry/mcp-server\"], env: { SENTRY_AUTH_TOKEN: \"\" } }, envHint: \"Set SENTRY_AUTH_TOKEN from Sentry settings → API keys\" },\n { name: \"postgres\", description: \"Query PostgreSQL databases\", category: \"data\", mcp: { package: \"@modelcontextprotocol/server-postgres\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-postgres\"], env: { DATABASE_URL: \"\" } }, envHint: \"Set DATABASE_URL (e.g., postgresql://user:pass@localhost/db)\" },\n { name: \"sqlite\", description: \"Query local SQLite databases\", category: \"data\", mcp: { package: \"@modelcontextprotocol/server-sqlite\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-sqlite\"] } },\n { name: \"fetch\", description: \"HTTP requests to APIs\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-fetch\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-fetch\"] } },\n { name: \"puppeteer\", description: \"Browser automation and scraping\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-puppeteer\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-puppeteer\"] } },\n { name: \"docker\", description: \"Manage Docker containers\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-docker\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-docker\"] } },\n { name: \"slack\", description: \"Send and read Slack messages\", category: \"communication\", mcp: { package: \"@modelcontextprotocol/server-slack\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-slack\"], env: { SLACK_BOT_TOKEN: \"\" } }, envHint: \"Set SLACK_BOT_TOKEN from your Slack app settings\" },\n { name: \"notion\", description: \"Read and write Notion pages\", category: \"communication\", mcp: { package: \"@notionhq/notion-mcp-server\", command: \"npx\", args: [\"-y\", \"@notionhq/notion-mcp-server\"], env: { NOTION_API_KEY: \"\" } }, envHint: \"Set NOTION_API_KEY from https://notion.so/my-integrations\" },\n { name: \"social\", description: \"Post to Bluesky, X/Twitter, Threads\", category: \"communication\", mcp: { package: \"@aman_asmuei/aman-social\", command: \"npx\", args: [\"-y\", \"@aman_asmuei/aman-social\"] }, envHint: \"Set BLUESKY_HANDLE + BLUESKY_APP_PASSWORD, TWITTER_API_KEY + secrets, or THREADS_ACCESS_TOKEN\" },\n { name: \"memory\", description: \"Persistent AI memory via amem\", category: \"memory\", mcp: { package: \"@aman_asmuei/amem\", command: \"npx\", args: [\"-y\", \"@aman_asmuei/amem\"] } },\n { name: \"docling\", description: \"Convert PDF, DOCX, PPTX, XLSX to markdown\", category: \"documents\", mcp: { package: \"docling-mcp\", command: \"uvx\", args: [\"docling-mcp\"] }, envHint: \"Requires Python 3.10+. Install: pip install docling\" },\n];\n\ninterface InstalledTool {\n name: string;\n installedAt: string;\n mcpConfigured: boolean;\n}\n\nfunction loadAkitInstalled(): InstalledTool[] {\n const filePath = path.join(os.homedir(), \".akit\", \"installed.json\");\n if (!fs.existsSync(filePath)) return [];\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch { return []; }\n}\n\nfunction saveAkitInstalled(tools: InstalledTool[]): void {\n const dir = path.join(os.homedir(), \".akit\");\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, \"installed.json\"), JSON.stringify(tools, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction addToAmanAgentConfig(name: string, mcpConfig: { command: string; args: string[] }): void {\n const configPath = path.join(os.homedir(), \".aman-agent\", \"config.json\");\n if (!fs.existsSync(configPath)) return;\n try {\n const config = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (!config.mcpServers) config.mcpServers = {};\n config.mcpServers[name] = mcpConfig;\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n } catch { /* ignore */ }\n}\n\nfunction removeFromAmanAgentConfig(name: string): void {\n const configPath = path.join(os.homedir(), \".aman-agent\", \"config.json\");\n if (!fs.existsSync(configPath)) return;\n try {\n const config = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (config.mcpServers) {\n delete config.mcpServers[name];\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch { /* ignore */ }\n}\n\nfunction handleAkitCommand(\n action: string | undefined,\n args: string[],\n): CommandResult {\n const installed = loadAkitInstalled();\n const installedNames = new Set(installed.map(t => t.name));\n\n // /akit add [number|name|custom]\n if (action === \"add\") {\n const available = AKIT_REGISTRY.filter(t => !installedNames.has(t.name));\n\n // No argument — show numbered list\n if (args.length < 1) {\n if (available.length === 0) {\n return { handled: true, output: pc.green(\"All tools are installed!\") };\n }\n const lines: string[] = [pc.bold(\"Select a tool to install:\"), \"\"];\n available.forEach((tool, i) => {\n const num = pc.cyan(String(i + 1).padStart(2));\n lines.push(` ${num} ${tool.name.padEnd(16)} ${pc.dim(tool.description)}`);\n });\n lines.push(\"\");\n lines.push(` Type: ${pc.cyan(\"/akit add <number>\")} or ${pc.cyan(\"/akit add <name>\")}`);\n lines.push(` Custom: ${pc.cyan(\"/akit add custom <name> <command> <args...>\")}`);\n return { handled: true, output: lines.join(\"\\n\") };\n }\n\n // /akit add custom <name> <command> <args...>\n if (args[0].toLowerCase() === \"custom\") {\n if (args.length < 3) {\n return { handled: true, output: pc.yellow(\"Usage: /akit add custom <name> <command> <args...>\\nExample: /akit add custom my-tool npx -y @org/my-mcp-server\") };\n }\n const customName = args[1];\n const customCommand = args[2];\n const customArgs = args.slice(3);\n\n if (installedNames.has(customName)) {\n return { handled: true, output: pc.yellow(`${customName} is already installed.`) };\n }\n\n installed.push({\n name: customName,\n installedAt: new Date().toISOString().split(\"T\")[0],\n mcpConfigured: true,\n });\n saveAkitInstalled(installed);\n addToAmanAgentConfig(customName, { command: customCommand, args: customArgs });\n\n return {\n handled: true,\n output: [\n pc.green(`✓ Added ${pc.bold(customName)}`) + pc.dim(` (custom MCP: ${customCommand} ${customArgs.join(\" \")})`),\n pc.dim(\" Restart aman-agent to load the new tool.\"),\n ].join(\"\\n\"),\n };\n }\n\n // Resolve by number or name\n const input = args[0].toLowerCase();\n let tool: AkitTool | undefined;\n\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= available.length) {\n tool = available[num - 1];\n } else {\n tool = AKIT_REGISTRY.find(t => t.name === input);\n }\n\n if (!tool) {\n return {\n handled: true,\n output: [\n pc.red(`Tool \"${input}\" not found.`),\n `Type ${pc.cyan(\"/akit add\")} to see available tools.`,\n ].join(\"\\n\"),\n };\n }\n\n if (installedNames.has(tool.name)) {\n return { handled: true, output: pc.yellow(`${tool.name} is already installed.`) };\n }\n\n // Install\n installed.push({\n name: tool.name,\n installedAt: new Date().toISOString().split(\"T\")[0],\n mcpConfigured: tool.mcp !== null,\n });\n saveAkitInstalled(installed);\n\n if (tool.mcp) {\n addToAmanAgentConfig(tool.name, {\n command: tool.mcp.command,\n args: tool.mcp.args,\n });\n }\n\n const lines: string[] = [\n pc.green(`✓ Added ${pc.bold(tool.name)}`) + (tool.mcp ? pc.dim(` (MCP: ${tool.mcp.package})`) : \"\"),\n ];\n if (tool.envHint) {\n lines.push(pc.yellow(` ⚠ ${tool.envHint}`));\n }\n if (tool.mcp) {\n lines.push(pc.dim(\" Restart aman-agent to load the new tool.\"));\n }\n return { handled: true, output: lines.join(\"\\n\") };\n }\n\n // /akit remove <tool>\n if (action === \"remove\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /akit remove <tool>\") };\n }\n const toolName = args[0].toLowerCase();\n\n if (!installedNames.has(toolName)) {\n return { handled: true, output: pc.red(`${toolName} is not installed.`) };\n }\n\n // Remove from installed.json\n const updated = installed.filter(t => t.name !== toolName);\n saveAkitInstalled(updated);\n\n // Remove from aman-agent config\n removeFromAmanAgentConfig(toolName);\n\n return {\n handled: true,\n output: pc.green(`✓ Removed ${pc.bold(toolName)}`) + pc.dim(\" (restart aman-agent to apply)\"),\n };\n }\n\n // /akit help\n if (action === \"help\") {\n return {\n handled: true,\n output: [\n pc.bold(\"akit — Tool Management\"),\n \"\",\n ` ${pc.cyan(\"/akit\")} List installed & available tools`,\n ` ${pc.cyan(\"/akit add <tool>\")} Install a tool`,\n ` ${pc.cyan(\"/akit remove <tool>\")} Uninstall a tool`,\n ].join(\"\\n\"),\n };\n }\n\n // Default: /akit — show installed + available\n const available = AKIT_REGISTRY.filter(t => !installedNames.has(t.name));\n\n const lines: string[] = [pc.bold(\"akit — AI Tool Manager\"), \"\"];\n\n // Installed section\n if (installed.length > 0) {\n lines.push(` ${pc.bold(`Installed (${installed.length})`)}`);\n for (const tool of installed) {\n const mcp = tool.mcpConfigured ? pc.green(\"MCP\") : pc.dim(\"manual\");\n lines.push(` ${pc.green(\"●\")} ${pc.bold(tool.name.padEnd(16))} ${mcp} ${pc.dim(tool.installedAt)}`);\n }\n lines.push(\"\");\n }\n\n // Available section\n if (available.length > 0) {\n lines.push(` ${pc.bold(`Available (${available.length})`)}`);\n const byCategory = new Map<string, AkitTool[]>();\n for (const tool of available) {\n if (!byCategory.has(tool.category)) byCategory.set(tool.category, []);\n byCategory.get(tool.category)!.push(tool);\n }\n for (const [category, tools] of byCategory) {\n lines.push(` ${pc.dim(category)}`);\n for (const tool of tools) {\n lines.push(` ${pc.dim(\"○\")} ${tool.name.padEnd(16)} ${pc.dim(tool.description)}`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(` ${pc.cyan(\"/akit add <tool>\")} Install a tool`);\n lines.push(` ${pc.cyan(\"/akit remove <tool>\")} Uninstall a tool`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nasync function handleSkillsCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".askill\", \"skills.md\"), \"skills (askill)\");\n return { handled: true, output: content };\n }\n if (action === \"install\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /skills install <name>\") };\n }\n const output = await mcpWrite(ctx, \"skills\", \"skill_install\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n if (action === \"uninstall\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /skills uninstall <name>\") };\n }\n const output = await mcpWrite(ctx, \"skills\", \"skill_uninstall\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /skills ${action}. Use /skills [install|uninstall].`) };\n}\n\nasync function handleEvalCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".aeval\", \"eval.md\"), \"evaluation (aeval)\");\n return { handled: true, output: content };\n }\n if (action === \"milestone\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /eval milestone <text...>\") };\n }\n const text = args.join(\" \");\n const output = await mcpWrite(ctx, \"eval\", \"eval_milestone\", { text });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /eval ${action}. Use /eval or /eval milestone <text>.`) };\n}\n\nasync function handleMemoryCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n if (!action) {\n // Default: show recent memory context via MCP\n if (!ctx.mcpManager) {\n return {\n handled: true,\n output: pc.red(\"Memory not available: aman-mcp not connected. Start it with: npx @aman_asmuei/aman-mcp\"),\n };\n }\n const result = await ctx.mcpManager.callTool(\"memory_context\", { topic: \"recent context\" });\n if (result.startsWith(\"Error\")) {\n return { handled: true, output: pc.red(result) };\n }\n return { handled: true, output: result };\n }\n // /memory <topic> — shortcut for context on a specific topic\n if (action && ![\"search\", \"clear\", \"timeline\"].includes(action)) {\n if (!ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Memory not available: MCP not connected.\") };\n }\n const topic = [action, ...args].join(\" \");\n const result = await ctx.mcpManager.callTool(\"memory_context\", { topic });\n if (result.startsWith(\"Error\")) {\n return { handled: true, output: pc.red(result) };\n }\n return { handled: true, output: result };\n }\n if (action === \"search\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /memory search <query...>\") };\n }\n const query = args.join(\" \");\n const output = await mcpWrite(ctx, \"memory\", \"memory_recall\", { query });\n return { handled: true, output };\n }\n if (action === \"clear\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /memory clear <category>\") };\n }\n const output = await mcpWrite(ctx, \"memory\", \"memory_forget\", { category: args[0] });\n return { handled: true, output };\n }\n if (action === \"timeline\") {\n if (!ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Memory not available: MCP not connected.\") };\n }\n try {\n const result = await ctx.mcpManager.callTool(\"memory_recall\", { query: \"*\", limit: 500 });\n if (result.startsWith(\"Error\") || result.includes(\"No memories found\")) {\n return { handled: true, output: pc.dim(\"No memories yet. Start chatting and I'll remember what matters.\") };\n }\n try {\n const memories = JSON.parse(result);\n if (Array.isArray(memories) && memories.length > 0) {\n const byDate = new Map<string, number>();\n for (const mem of memories) {\n const date = mem.created_at\n ? new Date(mem.created_at).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" })\n : \"Unknown\";\n byDate.set(date, (byDate.get(date) || 0) + 1);\n }\n const maxCount = Math.max(...byDate.values());\n const barWidth = 10;\n const lines: string[] = [pc.bold(\"Memory Timeline:\"), \"\"];\n for (const [date, count] of byDate) {\n const filled = Math.round((count / maxCount) * barWidth);\n const bar = \"█\".repeat(filled) + \"░\".repeat(barWidth - filled);\n lines.push(` ${date.padEnd(8)} ${bar} ${count} memories`);\n }\n const tags = new Map<string, number>();\n for (const mem of memories) {\n if (Array.isArray(mem.tags)) {\n for (const tag of mem.tags) {\n tags.set(tag, (tags.get(tag) || 0) + 1);\n }\n }\n }\n lines.push(\"\");\n lines.push(` Total: ${memories.length} memories`);\n if (tags.size > 0) {\n const topTags = [...tags.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([tag, count]) => `#${tag} (${count})`)\n .join(\", \");\n lines.push(` Top tags: ${topTags}`);\n }\n return { handled: true, output: lines.join(\"\\n\") };\n }\n } catch { /* Non-JSON response */ }\n const lineCount = result.split(\"\\n\").filter((l: string) => l.trim()).length;\n return { handled: true, output: `Total memories: ~${lineCount} entries.` };\n } catch {\n return { handled: true, output: pc.red(\"Failed to retrieve memory timeline.\") };\n }\n }\n return { handled: true, output: pc.yellow(`Unknown action: /memory ${action}. Use /memory [search|clear|timeline].`) };\n}\n\nfunction handleStatusCommand(ctx: CommandContext): CommandResult {\n const mcpToolCount = ctx.mcpManager ? ctx.mcpManager.getTools().length : 0;\n const amemConnected = mcpToolCount > 0; // simplified check\n const status = getEcosystemStatus(mcpToolCount, amemConnected);\n\n const lines: string[] = [pc.bold(\"Aman Ecosystem Dashboard\"), \"\"];\n\n for (const layer of status.layers) {\n const icon = layer.exists ? pc.green(\"●\") : pc.dim(\"○\");\n const name = pc.bold(layer.name.padEnd(12));\n const summary = layer.exists ? layer.summary : pc.dim(\"not configured\");\n lines.push(` ${icon} ${name} ${summary}`);\n }\n\n lines.push(\"\");\n lines.push(` ${status.mcpConnected ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(\"MCP\".padEnd(12))} ${status.mcpConnected ? `${status.mcpToolCount} tools available` : pc.dim(\"not connected\")}`);\n lines.push(` ${status.amemConnected ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(\"Memory\".padEnd(12))} ${status.amemConnected ? \"connected\" : pc.dim(\"not connected\")}`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nfunction handleDoctorCommand(ctx: CommandContext): CommandResult {\n const mcpToolCount = ctx.mcpManager ? ctx.mcpManager.getTools().length : 0;\n const amemConnected = mcpToolCount > 0;\n const status = getEcosystemStatus(mcpToolCount, amemConnected);\n\n const lines: string[] = [pc.bold(\"Aman Health Check\"), \"\"];\n let healthy = 0;\n let fixes = 0;\n let suggestions = 0;\n\n for (const layer of status.layers) {\n if (layer.exists) {\n lines.push(` ${pc.green(\"✓\")} ${layer.name.padEnd(12)} ${pc.green(layer.summary)}`);\n healthy++;\n } else {\n const isRequired = [\"identity\", \"rules\"].includes(layer.name.toLowerCase());\n if (isRequired) {\n lines.push(` ${pc.red(\"✗\")} ${layer.name.padEnd(12)} ${pc.red(\"missing\")}`);\n lines.push(` ${pc.dim(\"→ Fix: aman-agent init\")}`);\n fixes++;\n } else {\n lines.push(` ${pc.yellow(\"⚠\")} ${layer.name.padEnd(12)} ${pc.yellow(\"empty\")}`);\n const cmd = layer.name.toLowerCase() === \"workflows\" ? \"/workflows add <name>\"\n : layer.name.toLowerCase() === \"tools\" ? \"/tools add <name> <type> <desc>\"\n : layer.name.toLowerCase() === \"skills\" ? \"/skills install <name>\"\n : \"\";\n if (cmd) lines.push(` ${pc.dim(`→ Add with ${cmd}`)}`);\n suggestions++;\n }\n }\n }\n\n lines.push(\"\");\n lines.push(` ${status.mcpConnected ? pc.green(\"✓\") : pc.red(\"✗\")} ${\"MCP\".padEnd(12)} ${status.mcpConnected ? pc.green(`${status.mcpToolCount} tools`) : pc.red(\"not connected\")}`);\n if (!status.mcpConnected) {\n lines.push(` ${pc.dim(\"→ Fix: ensure npx is available and network is connected\")}`);\n fixes++;\n } else {\n healthy++;\n }\n\n lines.push(` ${status.amemConnected ? pc.green(\"✓\") : pc.red(\"✗\")} ${\"Memory\".padEnd(12)} ${status.amemConnected ? pc.green(\"connected\") : pc.red(\"not connected\")}`);\n if (!status.amemConnected) {\n lines.push(` ${pc.dim(\"→ Fix: npx @aman_asmuei/amem\")}`);\n fixes++;\n } else {\n healthy++;\n }\n\n const total = healthy + fixes + suggestions;\n lines.push(\"\");\n lines.push(` Overall: ${healthy}/${total} healthy.${fixes > 0 ? ` ${fixes} fix${fixes > 1 ? \"es\" : \"\"} needed.` : \"\"}${suggestions > 0 ? ` ${suggestions} suggestion${suggestions > 1 ? \"s\" : \"\"}.` : \"\"}`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nfunction handleHelp(): CommandResult {\n return {\n handled: true,\n output: [\n pc.bold(\"Commands:\"),\n ` ${pc.cyan(\"/help\")} Show this help`,\n ` ${pc.cyan(\"/identity\")} View identity [update <section>]`,\n ` ${pc.cyan(\"/rules\")} View rules [add|remove|toggle ...]`,\n ` ${pc.cyan(\"/workflows\")} View workflows [add|remove ...]`,\n ` ${pc.cyan(\"/akit\")} Manage tools [add|remove <tool>]`,\n ` ${pc.cyan(\"/skills\")} View skills [install|uninstall ...]`,\n ` ${pc.cyan(\"/eval\")} View evaluation [milestone ...]`,\n ` ${pc.cyan(\"/memory\")} View recent memories [search|clear|timeline]`,\n ` ${pc.cyan(\"/status\")} Ecosystem dashboard`,\n ` ${pc.cyan(\"/doctor\")} Health check all layers`,\n ` ${pc.cyan(\"/decisions\")} View decision log [<project>]`,\n ` ${pc.cyan(\"/export\")} Export conversation to markdown`,\n ` ${pc.cyan(\"/debug\")} Show debug log`,\n ` ${pc.cyan(\"/save\")} Save conversation to memory`,\n ` ${pc.cyan(\"/model\")} Show current LLM model`,\n ` ${pc.cyan(\"/update\")} Check for updates`,\n ` ${pc.cyan(\"/reconfig\")} Reset LLM config`,\n ` ${pc.cyan(\"/clear\")} Clear conversation history`,\n ` ${pc.cyan(\"/quit\")} Exit`,\n ].join(\"\\n\"),\n };\n}\n\nfunction handleSave(): CommandResult {\n return { handled: true, saveConversation: true };\n}\n\nfunction handleReconfig(): CommandResult {\n const configDir = path.join(os.homedir(), \".aman-agent\");\n const configPath = path.join(configDir, \"config.json\");\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n // Write marker to skip auto-detect on next run → force interactive prompt\n fs.mkdirSync(configDir, { recursive: true });\n fs.writeFileSync(path.join(configDir, \".reconfig\"), \"\", \"utf-8\");\n return {\n handled: true,\n quit: true,\n output: [\n pc.green(\"Config reset.\"),\n \"Next run will prompt you to choose your LLM provider.\",\n ].join(\"\\n\"),\n };\n}\n\nfunction handleUpdate(): CommandResult {\n try {\n const current = execFileSync(\"npm\", [\"view\", \"@aman_asmuei/aman-agent\", \"version\"], { encoding: \"utf-8\" }).trim();\n const local = JSON.parse(fs.readFileSync(path.join(__dirname, \"..\", \"package.json\"), \"utf-8\")).version;\n if (current === local) {\n return { handled: true, output: `${pc.green(\"Up to date\")} — v${local}` };\n }\n return {\n handled: true,\n output: [\n `${pc.yellow(\"Update available:\")} v${local} → v${current}`,\n \"\",\n `Run this in your terminal:`,\n ` ${pc.bold(\"npm install -g @aman_asmuei/aman-agent@latest\")}`,\n \"\",\n `Or use npx (always latest):`,\n ` ${pc.bold(\"npx @aman_asmuei/aman-agent@latest\")}`,\n ].join(\"\\n\"),\n };\n } catch {\n return {\n handled: true,\n output: [\n `To update, run in your terminal:`,\n ` ${pc.bold(\"npm install -g @aman_asmuei/aman-agent@latest\")}`,\n \"\",\n `Or use npx (always latest):`,\n ` ${pc.bold(\"npx @aman_asmuei/aman-agent@latest\")}`,\n ].join(\"\\n\"),\n };\n }\n}\n\nasync function handleDecisionsCommand(\n action: string | undefined,\n _args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n if (!ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Decisions not available: MCP not connected.\") };\n }\n const scope = action || undefined;\n const result = await ctx.mcpManager.callTool(\"memory_recall\", {\n query: \"decision\",\n type: \"decision\",\n limit: 20,\n ...(scope ? { scope } : {}),\n });\n if (result.startsWith(\"Error\")) {\n return { handled: true, output: pc.red(result) };\n }\n return { handled: true, output: pc.bold(\"Decision Log:\\n\") + result };\n}\n\nfunction handleExportCommand(): CommandResult {\n return { handled: true, exportConversation: true };\n}\n\nfunction handleDebugCommand(): CommandResult {\n const logPath = path.join(os.homedir(), \".aman-agent\", \"debug.log\");\n if (!fs.existsSync(logPath)) {\n return { handled: true, output: pc.dim(\"No debug log found.\") };\n }\n const content = fs.readFileSync(logPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\");\n const last20 = lines.slice(-20).join(\"\\n\");\n return { handled: true, output: pc.bold(\"Debug Log (last 20 entries):\\n\") + pc.dim(last20) };\n}\n\n// --- Main Router ---\n\n// --- Teams ---\n\nasync function handleTeamCommand(action: string | undefined, args: string[], ctx: CommandContext): Promise<CommandResult> {\n if (!action || action === \"list\") {\n const teams = listTeams();\n if (teams.length === 0) {\n return {\n handled: true,\n output: pc.dim(\"No teams yet. Create one:\") +\n \"\\n /team create <name> Create from built-in template\" +\n \"\\n /team create Show available templates\",\n };\n }\n const lines = teams.map((t) => {\n const members = t.members.map((m) => m.profile).join(\", \");\n return ` ${pc.bold(t.name)} (${t.workflow}) — ${members}`;\n });\n return { handled: true, output: \"Teams:\\n\" + lines.join(\"\\n\") };\n }\n\n switch (action) {\n case \"create\": {\n const name = args[0];\n if (!name) {\n const lines = BUILT_IN_TEAMS.map((t) => {\n const members = t.members.map((m) => m.profile).join(\" → \");\n return ` ${pc.bold(t.name)} (${t.workflow}) — ${members}\\n ${pc.dim(t.goal)}`;\n });\n return {\n handled: true,\n output: \"Built-in teams:\\n\" + lines.join(\"\\n\\n\") +\n \"\\n\\nUsage:\\n /team create content-team Install built-in\" +\n \"\\n /team create <name> <mode> <profile1:role>,<profile2:role> Custom\",\n };\n }\n\n // Check if it's a built-in template\n const builtIn = BUILT_IN_TEAMS.find((t) => t.name === name);\n if (builtIn) {\n createTeam(builtIn);\n return { handled: true, output: pc.green(`Team installed: ${builtIn.name}`) + \"\\n\\n\" + formatTeam(builtIn) };\n }\n\n // Custom team: /team create <name> <mode> <profile:role>,<profile:role>\n const mode = args[1] as Team[\"workflow\"];\n const membersStr = args[2];\n if (!mode || !membersStr) {\n return { handled: true, output: pc.yellow(\"Usage: /team create <name> <pipeline|parallel|coordinator> <profile1:role>,<profile2:role>\") };\n }\n if (![\"pipeline\", \"parallel\", \"coordinator\"].includes(mode)) {\n return { handled: true, output: pc.yellow(\"Mode must be: pipeline, parallel, or coordinator\") };\n }\n\n const members = membersStr.split(\",\").map((m) => {\n const [profile, ...roleParts] = m.trim().split(\":\");\n return { profile: profile.trim(), role: roleParts.join(\":\").trim() || profile.trim() };\n });\n\n const team: Team = {\n name,\n goal: `Team: ${name}`,\n coordinator: \"default\",\n members,\n workflow: mode,\n };\n createTeam(team);\n return { handled: true, output: pc.green(`Team created!`) + \"\\n\\n\" + formatTeam(team) };\n }\n\n case \"run\": {\n const teamName = args[0];\n const task = args.slice(1).join(\" \");\n if (!teamName || !task) {\n return { handled: true, output: pc.yellow(\"Usage: /team run <team-name> <task description>\") };\n }\n\n const team = loadTeam(teamName);\n if (!team) return { handled: true, output: pc.red(`Team not found: ${teamName}`) };\n\n if (!ctx.llmClient || !ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Team execution requires LLM client and MCP.\") };\n }\n\n const result = await runTeam(team, task, ctx.llmClient, ctx.mcpManager, ctx.tools);\n return { handled: true, output: formatTeamResult(result) };\n }\n\n case \"show\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /team show <name>\") };\n const team = loadTeam(name);\n if (!team) return { handled: true, output: pc.red(`Team not found: ${name}`) };\n return { handled: true, output: formatTeam(team) };\n }\n\n case \"delete\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /team delete <name>\") };\n if (!deleteTeam(name)) return { handled: true, output: pc.red(`Team not found: ${name}`) };\n return { handled: true, output: pc.dim(`Team deleted: ${name}`) };\n }\n\n case \"help\":\n return { handled: true, output: `Team commands:\n /team List all teams\n /team create Show built-in templates\n /team create <name> Install built-in team\n /team create <n> <mode> <m> Custom team (mode: pipeline|parallel|coordinator)\n /team run <name> <task> Run a task with a team\n /team show <name> Show team details\n /team delete <name> Delete a team\n\nModes:\n pipeline Sequential: agent1 → agent2 → agent3\n parallel All agents work concurrently, coordinator merges\n coordinator Coordinator LLM decides how to split the task\n\nExamples:\n /team create content-team\n /team run content-team Write a blog post about AI companions\n /team create review-squad pipeline coder:implement,researcher:review\n /team run review-squad Build a rate limiter in TypeScript` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown team action: ${action}. Try /team help`) };\n }\n}\n\n// --- Delegation ---\n\nasync function handleDelegateCommand(action: string | undefined, args: string[], ctx: CommandContext): Promise<CommandResult> {\n if (!action) {\n return { handled: true, output: `Delegate commands:\n /delegate <profile> <task> Delegate a task to a profile\n /delegate pipeline <p1> <p2> ... Run a sequential pipeline\n /delegate help Show help\n\nExamples:\n /delegate writer Write a blog post about AI companions\n /delegate coder Review this code for security issues\n /delegate pipeline writer,researcher Write and fact-check an article about quantum computing` };\n }\n\n if (action === \"help\") {\n return { handled: true, output: `Delegate a task to a sub-agent with a specific profile.\n\nThe sub-agent runs with its own identity, rules, and skills but shares\nyour memory and tools. Results come back to you.\n\nUsage:\n /delegate <profile> <task>\n /delegate pipeline <profile1>,<profile2> <task>\n\nThe pipeline mode passes each agent's output to the next:\n writer drafts → researcher reviews → writer polishes` };\n }\n\n if (!ctx.llmClient || !ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Delegation requires LLM client and MCP. Not available.\") };\n }\n\n if (action === \"pipeline\") {\n // /delegate pipeline writer,researcher,writer Write an article about AI\n const profileList = args[0];\n const task = args.slice(1).join(\" \");\n if (!profileList || !task) {\n return { handled: true, output: pc.yellow(\"Usage: /delegate pipeline <profile1>,<profile2> <task>\") };\n }\n\n const profiles = profileList.split(\",\").map((p) => p.trim());\n const steps = profiles.map((profile, i) => {\n if (i === 0) {\n return { profile, taskTemplate: task };\n }\n return { profile, taskTemplate: `Review and improve the following:\\n\\n{{input}}` };\n });\n\n process.stdout.write(pc.dim(`\\n Pipeline: ${profiles.join(\" → \")}\\n`));\n\n const results = await delegatePipeline(steps, task, ctx.llmClient, ctx.mcpManager, { tools: ctx.tools });\n\n const output: string[] = [];\n for (const r of results) {\n if (r.success) {\n output.push(`\\n${pc.bold(`[${r.profile}]`)} ${pc.green(\"✓\")} (${r.turns} tool turns)`);\n output.push(r.response.slice(0, 2000));\n if (r.toolsUsed.length > 0) output.push(pc.dim(` Tools: ${r.toolsUsed.join(\", \")}`));\n } else {\n output.push(`\\n${pc.bold(`[${r.profile}]`)} ${pc.red(\"✗\")} ${r.error}`);\n }\n }\n\n return { handled: true, output: output.join(\"\\n\") };\n }\n\n // /delegate <profile> <task>\n const profile = action;\n const task = args.join(\" \");\n if (!task) {\n return { handled: true, output: pc.yellow(`Usage: /delegate ${profile} <task description>`) };\n }\n\n process.stdout.write(pc.dim(`\\n [delegating to ${profile}...]\\n\\n`));\n\n const result = await delegateTask(task, profile, ctx.llmClient, ctx.mcpManager, { tools: ctx.tools });\n\n if (!result.success) {\n return { handled: true, output: pc.red(`Delegation failed: ${result.error}`) };\n }\n\n const meta: string[] = [];\n if (result.toolsUsed.length > 0) meta.push(`Tools: ${result.toolsUsed.join(\", \")}`);\n if (result.turns > 0) meta.push(`${result.turns} tool turns`);\n\n return {\n handled: true,\n output: `\\n${pc.bold(`[${profile}]`)} ${pc.green(\"✓\")}${meta.length > 0 ? \" \" + pc.dim(`(${meta.join(\", \")})`) : \"\"}\\n\\n${result.response}`,\n };\n}\n\n// --- Profile management ---\n\nfunction handleProfileCommand(action: string | undefined, args: string[]): CommandResult {\n const profilesDir = path.join(os.homedir(), \".acore\", \"profiles\");\n\n if (!action || action === \"list\") {\n const profiles = listProfiles();\n if (profiles.length === 0) {\n return { handled: true, output: pc.dim(\"No profiles yet. Create one with: /profile create <name>\") };\n }\n const lines = profiles.map((p) =>\n ` ${pc.bold(p.name)} — ${p.aiName} (${pc.dim(p.personality)})`\n );\n return { handled: true, output: \"Profiles:\\n\" + lines.join(\"\\n\") + \"\\n\\n\" + pc.dim(\"Switch with: aman-agent --profile <name>\") };\n }\n\n switch (action) {\n case \"create\": {\n const name = args[0];\n if (!name) {\n // Show available templates\n const lines = BUILT_IN_PROFILES.map((t) =>\n ` ${pc.bold(t.name)} — ${t.label}: ${pc.dim(t.description)}`\n );\n return {\n handled: true,\n output: \"Built-in profiles:\\n\" + lines.join(\"\\n\") +\n \"\\n\\nUsage:\\n /profile create coder Install built-in template\" +\n \"\\n /profile create <custom> Create blank profile\",\n };\n }\n\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n const profileDir = path.join(profilesDir, slug);\n\n if (fs.existsSync(profileDir)) {\n return { handled: true, output: pc.yellow(`Profile already exists: ${slug}`) };\n }\n\n // Check if it's a built-in template\n const builtIn = BUILT_IN_PROFILES.find((t) => t.name === slug);\n if (builtIn) {\n const err = installProfileTemplate(slug);\n if (err) return { handled: true, output: pc.red(err) };\n return {\n handled: true,\n output: pc.green(`Profile installed: ${builtIn.label}`) +\n `\\n AI name: ${builtIn.core.match(/^# (.+)/m)?.[1] || slug}` +\n `\\n ${pc.dim(builtIn.description)}` +\n `\\n\\n Use: aman-agent --profile ${slug}`,\n };\n }\n\n // Custom profile — create from default\n fs.mkdirSync(profileDir, { recursive: true });\n const globalCore = path.join(os.homedir(), \".acore\", \"core.md\");\n if (fs.existsSync(globalCore)) {\n let content = fs.readFileSync(globalCore, \"utf-8\");\n const aiName = name.charAt(0).toUpperCase() + name.slice(1);\n content = content.replace(/^# .+$/m, `# ${aiName}`);\n fs.writeFileSync(path.join(profileDir, \"core.md\"), content, \"utf-8\");\n } else {\n const aiName = name.charAt(0).toUpperCase() + name.slice(1);\n fs.writeFileSync(path.join(profileDir, \"core.md\"), `# ${aiName}\\n\\n## Identity\\n- Role: ${aiName} is your AI companion\\n- Personality: helpful, adaptive\\n- Communication: clear and concise\\n- Values: honesty, simplicity\\n- Boundaries: won't pretend to be human\\n`, \"utf-8\");\n }\n\n return {\n handled: true,\n output: pc.green(`Profile created: ${slug}`) +\n `\\n Edit: ${path.join(profileDir, \"core.md\")}` +\n `\\n Use: aman-agent --profile ${slug}` +\n `\\n\\n ${pc.dim(\"Add rules.md or skills.md for profile-specific overrides.\")}`,\n };\n }\n\n case \"show\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /profile show <name>\") };\n const profileDir = path.join(profilesDir, name);\n if (!fs.existsSync(profileDir)) return { handled: true, output: pc.red(`Profile not found: ${name}`) };\n\n const files = fs.readdirSync(profileDir).filter((f) => f.endsWith(\".md\"));\n const lines = files.map((f) => ` ${f}`);\n return { handled: true, output: `Profile: ${pc.bold(name)}\\nFiles:\\n${lines.join(\"\\n\")}` };\n }\n\n case \"delete\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /profile delete <name>\") };\n const profileDir = path.join(profilesDir, name);\n if (!fs.existsSync(profileDir)) return { handled: true, output: pc.red(`Profile not found: ${name}`) };\n\n fs.rmSync(profileDir, { recursive: true });\n return { handled: true, output: pc.dim(`Profile deleted: ${name}`) };\n }\n\n case \"help\":\n return { handled: true, output: `Profile commands:\n /profile List all profiles\n /profile create <n> Create new profile\n /profile show <n> Show profile files\n /profile delete <n> Delete a profile\n\n Use profiles:\n aman-agent --profile <name>\n AMAN_PROFILE=<name> aman-agent` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown profile action: ${action}. Try /profile help`) };\n }\n}\n\n// --- Plan management ---\n\nfunction handlePlanCommand(action: string | undefined, args: string[]): CommandResult {\n if (!action) {\n // /plan — show active plan\n const active = getActivePlan();\n if (!active) {\n return { handled: true, output: pc.dim(\"No active plan. Create one with: /plan create <name> | <goal> | <step1>, <step2>, ...\") };\n }\n return { handled: true, output: formatPlan(active) };\n }\n\n switch (action) {\n case \"create\": {\n // /plan create <name> | <goal> | <step1>, <step2>, ...\n const fullArgs = args.join(\" \");\n const parts = fullArgs.split(\"|\").map((p) => p.trim());\n if (parts.length < 3) {\n return { handled: true, output: pc.yellow(\"Usage: /plan create <name> | <goal> | <step1>, <step2>, ...\") };\n }\n const name = parts[0];\n const goal = parts[1];\n const steps = parts[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n if (steps.length === 0) {\n return { handled: true, output: pc.yellow(\"Need at least one step. Separate steps with commas.\") };\n }\n const plan = createPlan(name, goal, steps);\n return { handled: true, output: pc.green(`Plan created!\\n\\n`) + formatPlan(plan) };\n }\n\n case \"done\": {\n // /plan done [step number]\n const active = getActivePlan();\n if (!active) return { handled: true, output: pc.yellow(\"No active plan.\") };\n\n if (args.length > 0) {\n const stepNum = parseInt(args[0], 10);\n if (isNaN(stepNum) || stepNum < 1 || stepNum > active.steps.length) {\n return { handled: true, output: pc.yellow(`Invalid step number. Range: 1-${active.steps.length}`) };\n }\n markStepDone(active, stepNum - 1);\n return { handled: true, output: pc.green(`Step ${stepNum} done!`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n // No step specified — mark next incomplete step\n const next = active.steps.findIndex((s) => !s.done);\n if (next < 0) return { handled: true, output: pc.green(\"All steps already complete!\") };\n markStepDone(active, next);\n return { handled: true, output: pc.green(`Step ${next + 1} done!`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n case \"undo\": {\n // /plan undo <step number>\n const active = getActivePlan();\n if (!active) return { handled: true, output: pc.yellow(\"No active plan.\") };\n const stepNum = parseInt(args[0], 10);\n if (isNaN(stepNum) || stepNum < 1 || stepNum > active.steps.length) {\n return { handled: true, output: pc.yellow(`Invalid step number. Range: 1-${active.steps.length}`) };\n }\n markStepUndone(active, stepNum - 1);\n return { handled: true, output: pc.dim(`Step ${stepNum} unmarked.`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n case \"list\": {\n // /plan list — show all plans\n const plans = listPlans();\n if (plans.length === 0) return { handled: true, output: pc.dim(\"No plans yet.\") };\n const lines = plans.map((p) => {\n const done = p.steps.filter((s) => s.done).length;\n const total = p.steps.length;\n const status = p.active ? pc.green(\"active\") : pc.dim(\"inactive\");\n return ` ${p.name} — ${done}/${total} steps (${status})`;\n });\n return { handled: true, output: \"Plans:\\n\" + lines.join(\"\\n\") };\n }\n\n case \"switch\": {\n // /plan switch <name>\n const name = args.join(\" \");\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /plan switch <name>\") };\n const plan = setActivePlan(name);\n if (!plan) return { handled: true, output: pc.red(`Plan not found: ${name}`) };\n return { handled: true, output: pc.green(`Switched to: ${plan.name}`) + \"\\n\\n\" + formatPlan(plan) };\n }\n\n case \"show\": {\n // /plan show <name>\n const name = args.join(\" \");\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /plan show <name>\") };\n const plan = loadPlan(name);\n if (!plan) return { handled: true, output: pc.red(`Plan not found: ${name}`) };\n return { handled: true, output: formatPlan(plan) };\n }\n\n case \"help\":\n return { handled: true, output: `Plan commands:\n /plan Show active plan\n /plan create <name> | <goal> | <step1>, <step2>, ...\n /plan done [step#] Mark step complete (next if no number)\n /plan undo <step#> Unmark a step\n /plan list List all plans\n /plan switch <name> Switch active plan\n /plan show <name> Show a specific plan` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown plan action: ${action}. Try /plan help`) };\n }\n}\n\nconst KNOWN_COMMANDS = new Set([\n \"quit\", \"exit\", \"q\", \"help\", \"clear\", \"model\", \"identity\", \"rules\",\n \"workflows\", \"tools\", \"akit\", \"skills\", \"eval\", \"memory\", \"status\", \"doctor\",\n \"save\", \"decisions\", \"export\", \"debug\", \"update-config\", \"reconfig\",\n \"update\", \"upgrade\", \"plan\", \"profile\", \"delegate\", \"team\",\n]);\n\nexport async function handleCommand(input: string, ctx: CommandContext): Promise<CommandResult> {\n const trimmed = input.trim();\n if (!trimmed.startsWith(\"/\")) return { handled: false };\n\n const { base, action, args } = parseCommand(trimmed);\n\n // Don't treat file paths (e.g., /Users/...) as commands\n if (!KNOWN_COMMANDS.has(base)) return { handled: false };\n\n switch (base) {\n case \"quit\":\n case \"exit\":\n case \"q\":\n return { handled: true, quit: true };\n case \"help\":\n return handleHelp();\n case \"clear\":\n return { handled: true, output: pc.dim(\"Conversation cleared.\"), clearHistory: true };\n case \"model\":\n return { handled: true, output: ctx.model ? `Model: ${pc.bold(ctx.model)}` : \"Model: unknown\" };\n case \"identity\":\n return handleIdentityCommand(action, args, ctx);\n case \"rules\":\n return handleRulesCommand(action, args, ctx);\n case \"workflows\":\n return handleWorkflowsCommand(action, args, ctx);\n case \"tools\":\n case \"akit\":\n return handleAkitCommand(action, args);\n case \"skills\":\n return handleSkillsCommand(action, args, ctx);\n case \"eval\":\n return handleEvalCommand(action, args, ctx);\n case \"memory\":\n return handleMemoryCommand(action, args, ctx);\n case \"status\":\n return handleStatusCommand(ctx);\n case \"doctor\":\n return handleDoctorCommand(ctx);\n case \"save\":\n return handleSave();\n case \"decisions\":\n return handleDecisionsCommand(action, args, ctx);\n case \"export\":\n return handleExportCommand();\n case \"debug\":\n return handleDebugCommand();\n case \"update-config\":\n case \"reconfig\":\n return handleReconfig();\n case \"plan\":\n return handlePlanCommand(action, args);\n case \"profile\":\n return handleProfileCommand(action, args);\n case \"delegate\":\n return handleDelegateCommand(action, args, ctx);\n case \"team\":\n return handleTeamCommand(action, args, ctx);\n case \"update\":\n case \"upgrade\":\n return handleUpdate();\n default:\n return { handled: false }; // Pass to LLM if not matched\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst home = os.homedir();\n\ninterface LayerStatus {\n name: string;\n exists: boolean;\n path: string;\n summary: string;\n}\n\nexport interface EcosystemStatus {\n layers: LayerStatus[];\n mcpConnected: boolean;\n mcpToolCount: number;\n amemConnected: boolean;\n}\n\nconst LAYER_FILES = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\" },\n { name: \"rules\", dir: \".arules\", file: \"rules.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\" },\n { name: \"eval\", dir: \".aeval\", file: \"eval.md\" },\n] as const;\n\nfunction countLines(content: string, pattern: RegExp): number {\n return (content.match(pattern) || []).length;\n}\n\nfunction getLayerSummary(name: string, content: string): string {\n switch (name) {\n case \"identity\": {\n const nameMatch = content.match(/^# (.+)/m);\n return nameMatch ? nameMatch[1] : \"configured\";\n }\n case \"rules\":\n return `${countLines(content, /^- /gm)} rules`;\n case \"workflows\":\n return `${countLines(content, /^## /gm)} workflows`;\n case \"tools\":\n return `${countLines(content, /^- \\*\\*/gm)} tools`;\n case \"skills\":\n return `${countLines(content, /^### /gm)} skills`;\n case \"eval\": {\n const sessions = countLines(content, /^### Session/gm);\n return `${sessions} sessions logged`;\n }\n default:\n return \"unknown\";\n }\n}\n\nexport function getEcosystemStatus(\n mcpToolCount: number,\n amemConnected: boolean,\n): EcosystemStatus {\n const layers: LayerStatus[] = LAYER_FILES.map((entry) => {\n const filePath = path.join(home, entry.dir, entry.file);\n const exists = fs.existsSync(filePath);\n let summary = \"not configured\";\n\n if (exists) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n summary = getLayerSummary(entry.name, content);\n }\n\n return { name: entry.name, exists, path: filePath, summary };\n });\n\n return {\n layers,\n mcpConnected: mcpToolCount > 0,\n mcpToolCount,\n amemConnected,\n };\n}\n\nexport function readLayerFile(name: string): string | null {\n const entry = LAYER_FILES.find((l) => l.name === name);\n if (!entry) return null;\n const filePath = path.join(home, entry.dir, entry.file);\n if (!fs.existsSync(filePath)) return null;\n return fs.readFileSync(filePath, \"utf-8\").trim();\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface ProfileTemplate {\n name: string;\n label: string;\n description: string;\n core: string;\n rules?: string;\n skills?: string;\n}\n\nexport const BUILT_IN_PROFILES: ProfileTemplate[] = [\n {\n name: \"coder\",\n label: \"Coder\",\n description: \"Direct, technical, code-first. Skips pleasantries, shows code.\",\n core: `# Coder\n\n## Identity\n- Role: Coder is your technical pair programmer\n- Personality: direct, precise, efficient — code speaks louder than words\n- Communication: lead with code, explain after. No fluff.\n- Values: simplicity over cleverness, working code over perfect code, tests over trust\n- Boundaries: won't pretend to be human, flags when out of depth\n\n### Appearance\n- Base: focused developer, dark hoodie, terminal glow\n- Style: minimal\n- Palette: green on black`,\n rules: `# Coder Rules\n\n## Always\n- Show code before explaining\n- Include error handling\n- Suggest tests for new code\n\n## Never\n- Write code without understanding the requirement\n- Push to main without tests\n- Ignore security implications`,\n },\n {\n name: \"writer\",\n label: \"Writer\",\n description: \"Creative, eloquent, story-driven. Focuses on narrative and engagement.\",\n core: `# Muse\n\n## Identity\n- Role: Muse is your creative writing partner\n- Personality: eloquent, imaginative, encouraging — finds the story in everything\n- Communication: explore ideas together, offer alternatives, celebrate good writing\n- Values: authenticity over formulas, voice over grammar, emotion over information\n- Boundaries: won't write without understanding the audience, flags when content is sensitive\n\n### Appearance\n- Base: warm expression, creative energy, pen in hand\n- Style: illustrated\n- Palette: warm amber and cream`,\n rules: `# Writer Rules\n\n## Always\n- Ask about the target audience\n- Offer 2-3 angle options before drafting\n- Read drafts aloud mentally for rhythm\n\n## Never\n- Use cliches without subverting them\n- Write without a clear hook\n- Ignore tone consistency`,\n },\n {\n name: \"researcher\",\n label: \"Researcher\",\n description: \"Analytical, thorough, citation-focused. Digs deep, verifies claims.\",\n core: `# Scholar\n\n## Identity\n- Role: Scholar is your research analyst\n- Personality: analytical, thorough, intellectually curious — never takes claims at face value\n- Communication: present findings with evidence, flag uncertainty, compare perspectives\n- Values: accuracy over speed, nuance over simplification, primary sources over summaries\n- Boundaries: clearly marks speculation vs fact, flags when evidence is insufficient\n\n### Appearance\n- Base: thoughtful expression, glasses, surrounded by notes\n- Style: minimal\n- Palette: navy and white`,\n rules: `# Researcher Rules\n\n## Always\n- Cite sources when making factual claims\n- Flag confidence level (high/medium/low)\n- Present multiple perspectives on contested topics\n\n## Never\n- Present speculation as fact\n- Ignore contradicting evidence\n- Oversimplify complex topics`,\n },\n];\n\n/**\n * Install a built-in profile template.\n */\nexport function installProfileTemplate(templateName: string, userName?: string): string | null {\n const template = BUILT_IN_PROFILES.find((t) => t.name === templateName);\n if (!template) return null;\n\n const profileDir = path.join(os.homedir(), \".acore\", \"profiles\", template.name);\n if (fs.existsSync(profileDir)) return `Profile already exists: ${template.name}`;\n\n fs.mkdirSync(profileDir, { recursive: true });\n\n // Write core.md\n let core = template.core;\n if (userName) {\n core += `\\n\\n---\\n\\n## Relationship\\n- Name: ${userName}\\n- Nicknames: []\\n- Communication: [updated over time]\\n- Detail level: balanced\\n`;\n }\n fs.writeFileSync(path.join(profileDir, \"core.md\"), core, \"utf-8\");\n\n // Write rules.md if template has one\n if (template.rules) {\n fs.writeFileSync(path.join(profileDir, \"rules.md\"), template.rules, \"utf-8\");\n }\n\n // Write skills.md if template has one\n if (template.skills) {\n fs.writeFileSync(path.join(profileDir, \"skills.md\"), template.skills, \"utf-8\");\n }\n\n return null; // success\n}\n","import pc from \"picocolors\";\nimport type {\n LLMClient,\n Message,\n ToolDefinition,\n ToolResultBlock,\n StreamChunk,\n} from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { assembleSystemPrompt } from \"./prompt.js\";\nimport { withRetry } from \"./retry.js\";\nimport { log } from \"./logger.js\";\n\nexport interface DelegationResult {\n profile: string;\n task: string;\n response: string;\n toolsUsed: string[];\n turns: number;\n success: boolean;\n error?: string;\n}\n\nexport interface DelegateOptions {\n maxTurns?: number; // max tool loop iterations (default: 10)\n silent?: boolean; // suppress output (default: false)\n tools?: ToolDefinition[]; // tools available to sub-agent\n}\n\nconst isRetryable = (err: unknown): boolean => {\n if (err instanceof Error) {\n const msg = err.message.toLowerCase();\n return msg.includes(\"rate\") || msg.includes(\"timeout\") || msg.includes(\"econnreset\");\n }\n return false;\n};\n\n/**\n * Run a task with a specific profile as a non-interactive sub-agent.\n * The sub-agent gets its own system prompt (from profile), runs a mini agent loop\n * (LLM → tools → LLM → ...), and returns the final text response.\n *\n * Reuses the parent's LLM client and MCP connections.\n */\nexport async function delegateTask(\n task: string,\n profile: string,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult> {\n const maxTurns = options.maxTurns ?? 10;\n const silent = options.silent ?? false;\n const tools = options.tools;\n\n try {\n // Load profile-specific system prompt\n const { prompt: systemPrompt } = assembleSystemPrompt(undefined, profile);\n\n // Build the delegation prompt\n const delegationPrompt = `${systemPrompt}\n\n<delegation>\nYou are being delegated a specific task by the primary agent. Complete this task thoroughly and return your result. You have access to tools if needed. Focus on the task — do not ask follow-up questions, just do your best with what you have.\n</delegation>`;\n\n const messages: Message[] = [\n { role: \"user\", content: task },\n ];\n\n const toolsUsed: string[] = [];\n let turns = 0;\n\n // Collect streamed text\n const onChunk: (chunk: StreamChunk) => void = silent\n ? () => {}\n : (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n };\n\n // Initial LLM call\n let response = await withRetry(\n () => client.chat(delegationPrompt, messages, onChunk, tools),\n { maxAttempts: 2, baseDelay: 1000, retryable: isRetryable },\n );\n\n messages.push(response.message);\n\n // Tool loop (same pattern as agent.ts)\n while (response.toolUses.length > 0 && turns < maxTurns) {\n turns++;\n\n const toolResults: ToolResultBlock[] = await Promise.all(\n response.toolUses.map(async (toolUse) => {\n if (!silent) {\n process.stdout.write(pc.dim(` [${profile}:${toolUse.name}...]\\n`));\n }\n toolsUsed.push(toolUse.name);\n\n try {\n const result = await mcpManager.callTool(toolUse.name, toolUse.input);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result,\n };\n } catch (err) {\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `Error: ${err instanceof Error ? err.message : String(err)}`,\n is_error: true,\n };\n }\n }),\n );\n\n messages.push({ role: \"user\", content: toolResults });\n\n response = await withRetry(\n () => client.chat(delegationPrompt, messages, onChunk, tools),\n { maxAttempts: 2, baseDelay: 1000, retryable: isRetryable },\n );\n\n messages.push(response.message);\n }\n\n // Extract final text response\n const finalMessage = response.message;\n const responseText = typeof finalMessage.content === \"string\"\n ? finalMessage.content\n : finalMessage.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n\n return {\n profile,\n task,\n response: responseText,\n toolsUsed: [...new Set(toolsUsed)],\n turns,\n success: true,\n };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n log.warn(\"delegate\", `Delegation to ${profile} failed: ${error}`);\n return {\n profile,\n task,\n response: \"\",\n toolsUsed: [],\n turns: 0,\n success: false,\n error,\n };\n }\n}\n\n/**\n * Delegate a task to multiple profiles in parallel.\n * Useful for: write + review, research + summarize, etc.\n */\nexport async function delegateParallel(\n tasks: Array<{ task: string; profile: string }>,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult[]> {\n return Promise.all(\n tasks.map(({ task, profile }) =>\n delegateTask(task, profile, client, mcpManager, { ...options, silent: true }),\n ),\n );\n}\n\n/**\n * Delegate a pipeline of tasks sequentially — each task receives the previous result.\n * Useful for: draft → review → polish pipelines.\n */\nexport async function delegatePipeline(\n steps: Array<{ profile: string; taskTemplate: string }>,\n initialInput: string,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult[]> {\n const results: DelegationResult[] = [];\n let previousResult = initialInput;\n\n for (const step of steps) {\n const task = step.taskTemplate.replace(\"{{input}}\", previousResult);\n\n if (!options.silent) {\n process.stdout.write(pc.dim(`\\n [delegating to ${step.profile}...]\\n`));\n }\n\n const result = await delegateTask(task, step.profile, client, mcpManager, {\n ...options,\n silent: true,\n });\n results.push(result);\n\n if (!result.success) break;\n previousResult = result.response;\n }\n\n return results;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport type { LLMClient, ToolDefinition } from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { delegateTask, delegateParallel, delegatePipeline, type DelegationResult } from \"./delegate.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { log } from \"./logger.js\";\n\n// --- Types ---\n\nexport interface TeamMember {\n profile: string;\n role: string;\n}\n\nexport interface Team {\n name: string;\n goal: string;\n coordinator: string; // profile name or \"default\" for main agent\n members: TeamMember[];\n workflow: \"pipeline\" | \"parallel\" | \"coordinator\";\n}\n\nexport interface TeamRunResult {\n team: string;\n task: string;\n workflow: string;\n results: DelegationResult[];\n finalOutput: string;\n success: boolean;\n}\n\n// --- Storage ---\n\nfunction getTeamsDir(): string {\n return path.join(os.homedir(), \".acore\", \"teams\");\n}\n\nfunction ensureTeamsDir(): string {\n const dir = getTeamsDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction teamPath(name: string): string {\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n return path.join(ensureTeamsDir(), `${slug}.json`);\n}\n\n// --- CRUD ---\n\nexport function createTeam(team: Team): void {\n const fp = teamPath(team.name);\n fs.writeFileSync(fp, JSON.stringify(team, null, 2), \"utf-8\");\n}\n\nexport function loadTeam(name: string): Team | null {\n const fp = teamPath(name);\n if (!fs.existsSync(fp)) return null;\n try {\n return JSON.parse(fs.readFileSync(fp, \"utf-8\")) as Team;\n } catch {\n return null;\n }\n}\n\nexport function listTeams(): Team[] {\n const dir = getTeamsDir();\n if (!fs.existsSync(dir)) return [];\n\n const teams: Team[] = [];\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const content = fs.readFileSync(path.join(dir, file), \"utf-8\");\n teams.push(JSON.parse(content) as Team);\n } catch { /* skip malformed */ }\n }\n return teams;\n}\n\nexport function deleteTeam(name: string): boolean {\n const fp = teamPath(name);\n if (!fs.existsSync(fp)) return false;\n fs.unlinkSync(fp);\n return true;\n}\n\n// --- Team Execution ---\n\n/**\n * Run a task with a team. Routes to the appropriate execution mode.\n */\nexport async function runTeam(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n process.stdout.write(pc.dim(`\\n Team: ${team.name} (${team.workflow} mode)\\n`));\n process.stdout.write(pc.dim(` Members: ${team.members.map((m) => m.profile).join(\", \")}\\n\\n`));\n\n switch (team.workflow) {\n case \"pipeline\":\n return runPipeline(team, task, client, mcpManager, tools);\n case \"parallel\":\n return runParallel(team, task, client, mcpManager, tools);\n case \"coordinator\":\n return runCoordinator(team, task, client, mcpManager, tools);\n default:\n return {\n team: team.name,\n task,\n workflow: team.workflow,\n results: [],\n finalOutput: `Unknown workflow mode: ${team.workflow}`,\n success: false,\n };\n }\n}\n\n/**\n * Pipeline mode: each member works sequentially, passing output to the next.\n */\nasync function runPipeline(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n const steps = team.members.map((m, i) => ({\n profile: m.profile,\n taskTemplate: i === 0\n ? `${task}\\n\\nYour role: ${m.role}`\n : `${m.role}. Here is the previous agent's work:\\n\\n{{input}}`,\n }));\n\n for (const step of steps) {\n process.stdout.write(pc.dim(` [${step.profile}: ${team.members.find((m) => m.profile === step.profile)?.role}...]\\n`));\n }\n\n const results = await delegatePipeline(steps, task, client, mcpManager, {\n tools,\n silent: true,\n });\n\n const lastResult = results[results.length - 1];\n const success = results.every((r) => r.success);\n\n return {\n team: team.name,\n task,\n workflow: \"pipeline\",\n results,\n finalOutput: lastResult?.response || \"\",\n success,\n };\n}\n\n/**\n * Parallel mode: all members work concurrently, coordinator merges results.\n */\nasync function runParallel(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n // Each member gets the task with their specific role\n const tasks = team.members.map((m) => ({\n profile: m.profile,\n task: `${task}\\n\\nYour specific role: ${m.role}. Focus only on your role.`,\n }));\n\n for (const m of team.members) {\n process.stdout.write(pc.dim(` [${m.profile}: ${m.role} (parallel)...]\\n`));\n }\n\n const results = await delegateParallel(tasks, client, mcpManager, { tools });\n\n // Merge results using coordinator (or main agent)\n const mergeInput = results\n .filter((r) => r.success)\n .map((r) => `[${r.profile} — ${team.members.find((m) => m.profile === r.profile)?.role}]:\\n${r.response}`)\n .join(\"\\n\\n---\\n\\n\");\n\n process.stdout.write(pc.dim(` [merging results...]\\n`));\n\n const mergeResult = await delegateTask(\n `You are the team coordinator. Multiple agents worked on this task in parallel. Merge their outputs into a single cohesive result. Keep the best parts from each.\\n\\nOriginal task: ${task}\\n\\n${mergeInput}`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools, silent: true },\n );\n\n return {\n team: team.name,\n task,\n workflow: \"parallel\",\n results: [...results, mergeResult],\n finalOutput: mergeResult.response,\n success: results.some((r) => r.success),\n };\n}\n\n/**\n * Coordinator mode: coordinator LLM decides how to route tasks to members.\n * Most flexible — coordinator analyzes the task and creates its own execution plan.\n */\nasync function runCoordinator(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n const memberDescriptions = team.members\n .map((m) => `- ${m.profile}: ${m.role}`)\n .join(\"\\n\");\n\n // Step 1: Coordinator plans the work\n process.stdout.write(pc.dim(` [coordinator planning...]\\n`));\n\n const planResult = await delegateTask(\n `You are the coordinator of a team. Your job is to break down this task and decide which team members should handle each part.\n\nTeam members:\n${memberDescriptions}\n\nTask: ${task}\n\nRespond with a JSON array of assignments:\n[{\"profile\": \"member-name\", \"subtask\": \"what they should do\"}]\n\nOnly use the JSON array, no other text.`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools: undefined, silent: true, maxTurns: 0 },\n );\n\n if (!planResult.success) {\n return {\n team: team.name,\n task,\n workflow: \"coordinator\",\n results: [planResult],\n finalOutput: `Coordinator failed to plan: ${planResult.error}`,\n success: false,\n };\n }\n\n // Step 2: Parse assignments\n let assignments: Array<{ profile: string; subtask: string }>;\n try {\n let cleaned = planResult.response.trim();\n const codeBlockMatch = cleaned.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (codeBlockMatch) cleaned = codeBlockMatch[1].trim();\n assignments = JSON.parse(cleaned);\n } catch {\n // Fallback: run all members in parallel with the full task\n assignments = team.members.map((m) => ({ profile: m.profile, subtask: `${m.role}: ${task}` }));\n }\n\n // Step 3: Execute assignments in parallel\n for (const a of assignments) {\n process.stdout.write(pc.dim(` [${a.profile}: ${a.subtask.slice(0, 60)}...]\\n`));\n }\n\n const results = await delegateParallel(\n assignments.map((a) => ({ profile: a.profile, task: a.subtask })),\n client,\n mcpManager,\n { tools },\n );\n\n // Step 4: Coordinator merges\n const mergeInput = results\n .filter((r) => r.success)\n .map((r, i) => `[${assignments[i]?.profile} — ${assignments[i]?.subtask}]:\\n${r.response}`)\n .join(\"\\n\\n---\\n\\n\");\n\n process.stdout.write(pc.dim(` [coordinator merging...]\\n`));\n\n const mergeResult = await delegateTask(\n `You are the team coordinator. Your team members completed their assigned work. Combine their outputs into a single cohesive, polished result.\\n\\nOriginal task: ${task}\\n\\n${mergeInput}`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools, silent: true },\n );\n\n return {\n team: team.name,\n task,\n workflow: \"coordinator\",\n results: [...results, mergeResult],\n finalOutput: mergeResult.response,\n success: results.some((r) => r.success),\n };\n}\n\n// --- Formatting ---\n\nexport function formatTeam(team: Team): string {\n const lines: string[] = [];\n lines.push(`Team: ${pc.bold(team.name)}`);\n lines.push(`Goal: ${team.goal}`);\n lines.push(`Mode: ${team.workflow}`);\n lines.push(`Coordinator: ${team.coordinator}`);\n lines.push(\"\");\n lines.push(\"Members:\");\n for (const m of team.members) {\n lines.push(` ${pc.bold(m.profile)} — ${m.role}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatTeamResult(result: TeamRunResult): string {\n const lines: string[] = [];\n lines.push(`\\n${pc.bold(`Team: ${result.team}`)} (${result.workflow})`);\n\n for (const r of result.results) {\n const status = r.success ? pc.green(\"✓\") : pc.red(\"✗\");\n const tools = r.toolsUsed.length > 0 ? pc.dim(` (${r.toolsUsed.join(\", \")})`) : \"\";\n lines.push(` ${status} ${pc.bold(r.profile)}${tools}`);\n }\n\n lines.push(\"\");\n lines.push(result.finalOutput);\n\n return lines.join(\"\\n\");\n}\n\n// --- Built-in Team Templates ---\n\nexport const BUILT_IN_TEAMS: Team[] = [\n {\n name: \"content-team\",\n goal: \"Create and publish high-quality content\",\n coordinator: \"default\",\n members: [\n { profile: \"writer\", role: \"Draft compelling content with engaging narrative\" },\n { profile: \"researcher\", role: \"Fact-check claims and add citations\" },\n ],\n workflow: \"pipeline\",\n },\n {\n name: \"dev-team\",\n goal: \"Build and review code with quality assurance\",\n coordinator: \"default\",\n members: [\n { profile: \"coder\", role: \"Write clean, tested implementation code\" },\n { profile: \"researcher\", role: \"Review for security, performance, and best practices\" },\n ],\n workflow: \"pipeline\",\n },\n {\n name: \"research-team\",\n goal: \"Deep research with multiple perspectives\",\n coordinator: \"default\",\n members: [\n { profile: \"researcher\", role: \"Research the topic thoroughly with citations\" },\n { profile: \"writer\", role: \"Synthesize findings into clear, readable format\" },\n ],\n workflow: \"pipeline\",\n },\n];\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { log } from \"./logger.js\";\n\n// --- Types ---\n\nexport interface PlanStep {\n text: string;\n done: boolean;\n}\n\nexport interface Plan {\n name: string;\n goal: string;\n steps: PlanStep[];\n createdAt: string;\n updatedAt: string;\n active: boolean;\n}\n\n// --- Paths ---\n\nfunction getPlansDir(): string {\n // Project-local plans if .acore exists, otherwise global\n const localDir = path.join(process.cwd(), \".acore\", \"plans\");\n const localAcore = path.join(process.cwd(), \".acore\");\n if (fs.existsSync(localAcore)) return localDir;\n return path.join(os.homedir(), \".acore\", \"plans\");\n}\n\nfunction ensurePlansDir(): string {\n const dir = getPlansDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction planPath(name: string): string {\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n return path.join(ensurePlansDir(), `${slug}.md`);\n}\n\n// --- Serialization ---\n\nfunction serializePlan(plan: Plan): string {\n const lines: string[] = [];\n lines.push(`# ${plan.name}`);\n lines.push(\"\");\n lines.push(`**Goal:** ${plan.goal}`);\n lines.push(`**Created:** ${plan.createdAt}`);\n lines.push(`**Updated:** ${plan.updatedAt}`);\n lines.push(`**Active:** ${plan.active}`);\n lines.push(\"\");\n lines.push(\"## Steps\");\n lines.push(\"\");\n for (const step of plan.steps) {\n lines.push(`- [${step.done ? \"x\" : \" \"}] ${step.text}`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction parsePlan(content: string, filePath: string): Plan | null {\n try {\n const nameMatch = content.match(/^# (.+)/m);\n const goalMatch = content.match(/\\*\\*Goal:\\*\\*\\s*(.+)/);\n const createdMatch = content.match(/\\*\\*Created:\\*\\*\\s*(.+)/);\n const updatedMatch = content.match(/\\*\\*Updated:\\*\\*\\s*(.+)/);\n const activeMatch = content.match(/\\*\\*Active:\\*\\*\\s*(.+)/);\n\n const name = nameMatch?.[1]?.trim() || path.basename(filePath, \".md\");\n const goal = goalMatch?.[1]?.trim() || \"\";\n const createdAt = createdMatch?.[1]?.trim() || \"\";\n const updatedAt = updatedMatch?.[1]?.trim() || \"\";\n const active = activeMatch?.[1]?.trim() === \"true\";\n\n // Parse checkbox steps\n const steps: PlanStep[] = [];\n const stepMatches = content.matchAll(/- \\[([ x])\\] (.+)/g);\n for (const match of stepMatches) {\n steps.push({\n done: match[1] === \"x\",\n text: match[2].trim(),\n });\n }\n\n return { name, goal, steps, createdAt, updatedAt, active };\n } catch (err) {\n log.debug(\"plans\", \"Failed to parse plan: \" + filePath, err);\n return null;\n }\n}\n\n// --- CRUD ---\n\nexport function createPlan(name: string, goal: string, steps: string[]): Plan {\n const now = new Date().toISOString().split(\"T\")[0];\n const plan: Plan = {\n name,\n goal,\n steps: steps.map((text) => ({ text, done: false })),\n createdAt: now,\n updatedAt: now,\n active: true,\n };\n\n // Deactivate any currently active plan\n const existing = listPlans();\n for (const p of existing) {\n if (p.active) {\n p.active = false;\n p.updatedAt = now;\n savePlan(p);\n }\n }\n\n savePlan(plan);\n return plan;\n}\n\nexport function savePlan(plan: Plan): void {\n const fp = planPath(plan.name);\n fs.writeFileSync(fp, serializePlan(plan), \"utf-8\");\n}\n\nexport function loadPlan(name: string): Plan | null {\n const fp = planPath(name);\n if (!fs.existsSync(fp)) return null;\n const content = fs.readFileSync(fp, \"utf-8\");\n return parsePlan(content, fp);\n}\n\nexport function listPlans(): Plan[] {\n const dir = getPlansDir();\n if (!fs.existsSync(dir)) return [];\n\n const plans: Plan[] = [];\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith(\".md\")) continue;\n const fp = path.join(dir, file);\n const content = fs.readFileSync(fp, \"utf-8\");\n const plan = parsePlan(content, fp);\n if (plan) plans.push(plan);\n }\n\n return plans;\n}\n\nexport function getActivePlan(): Plan | null {\n const plans = listPlans();\n return plans.find((p) => p.active) || null;\n}\n\n// --- Operations ---\n\nexport function markStepDone(plan: Plan, stepIndex: number): boolean {\n if (stepIndex < 0 || stepIndex >= plan.steps.length) return false;\n plan.steps[stepIndex].done = true;\n plan.updatedAt = new Date().toISOString().split(\"T\")[0];\n savePlan(plan);\n return true;\n}\n\nexport function markStepUndone(plan: Plan, stepIndex: number): boolean {\n if (stepIndex < 0 || stepIndex >= plan.steps.length) return false;\n plan.steps[stepIndex].done = false;\n plan.updatedAt = new Date().toISOString().split(\"T\")[0];\n savePlan(plan);\n return true;\n}\n\nexport function setActivePlan(name: string): Plan | null {\n const now = new Date().toISOString().split(\"T\")[0];\n\n // Deactivate all\n const plans = listPlans();\n for (const p of plans) {\n if (p.active) {\n p.active = false;\n p.updatedAt = now;\n savePlan(p);\n }\n }\n\n // Activate target\n const target = loadPlan(name);\n if (!target) return null;\n target.active = true;\n target.updatedAt = now;\n savePlan(target);\n return target;\n}\n\n// --- Formatting ---\n\nexport function formatPlan(plan: Plan): string {\n const total = plan.steps.length;\n const done = plan.steps.filter((s) => s.done).length;\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n const bar = progressBar(pct);\n\n const lines: string[] = [];\n lines.push(`Plan: ${plan.name} ${plan.active ? \"(active)\" : \"(inactive)\"}`);\n lines.push(`Goal: ${plan.goal}`);\n lines.push(`Progress: ${bar} ${done}/${total} (${pct}%)`);\n lines.push(\"\");\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const marker = step.done ? \"✓\" : \" \";\n const num = String(i + 1).padStart(2, \" \");\n lines.push(` ${num}. [${marker}] ${step.text}`);\n }\n\n if (done === total && total > 0) {\n lines.push(\"\\n All steps complete!\");\n } else {\n const next = plan.steps.findIndex((s) => !s.done);\n if (next >= 0) {\n lines.push(`\\n Next: Step ${next + 1} — ${plan.steps[next].text}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatPlanForPrompt(plan: Plan): string {\n const total = plan.steps.length;\n const done = plan.steps.filter((s) => s.done).length;\n\n const lines: string[] = [];\n lines.push(`<active-plan name=\"${plan.name}\" progress=\"${done}/${total}\">`);\n lines.push(`Goal: ${plan.goal}`);\n lines.push(\"\");\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n lines.push(`- [${step.done ? \"x\" : \" \"}] Step ${i + 1}: ${step.text}`);\n }\n\n const next = plan.steps.findIndex((s) => !s.done);\n if (next >= 0) {\n lines.push(\"\");\n lines.push(`Current focus: Step ${next + 1} — ${plan.steps[next].text}`);\n lines.push(\"After completing the current step, remind the user to mark it done with /plan done and suggest committing their work.\");\n }\n\n lines.push(\"</active-plan>\");\n return lines.join(\"\\n\");\n}\n\nfunction progressBar(pct: number): string {\n const filled = Math.round(pct / 5);\n const empty = 20 - filled;\n return `[${\"█\".repeat(filled)}${\"░\".repeat(empty)}]`;\n}\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport type { Message } from \"./llm/types.js\";\nimport type { HooksConfig } from \"./config.js\";\nimport { log } from \"./logger.js\";\nimport {\n computePersonality,\n syncPersonalityToCore,\n formatWellbeingNudge,\n} from \"./personality.js\";\n\nfunction getTimeContext(): string {\n const now = new Date();\n const hour = now.getHours();\n const days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n const day = days[now.getDay()];\n\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const timeStr = now.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n const dateStr = now.toLocaleDateString();\n\n return `<time-context>\\nCurrent time: ${dateStr} ${timeStr} (${period}, ${day})\\nAdapt your tone naturally — don't announce the time, just be contextually appropriate.\\n</time-context>`;\n}\n\nexport interface HookContext {\n mcpManager: McpManager;\n config: HooksConfig;\n}\n\nlet isHookCall = false;\nlet sessionStartTime: number = Date.now();\n\nexport function getSessionStartTime(): number {\n return sessionStartTime;\n}\n\nexport async function onSessionStart(\n ctx: HookContext,\n): Promise<{ greeting?: string; contextInjection?: string; firstRun?: boolean; visibleReminders?: string[]; resumeTopic?: string }> {\n let greeting = \"\";\n let contextInjection = \"\";\n let firstRun = false;\n let resumeTopic: string | undefined;\n const visibleReminders: string[] = [];\n\n // Detect first run via memory_recall\n try {\n isHookCall = true;\n const recallResult = await ctx.mcpManager.callTool(\"memory_recall\", { query: \"*\", limit: 1 });\n if (!recallResult || recallResult.startsWith(\"Error\") || recallResult.includes(\"No memories found\")) {\n firstRun = true;\n }\n } catch {\n firstRun = true;\n } finally {\n isHookCall = false;\n }\n\n if (firstRun) {\n // First-run context injection\n contextInjection = `<first-session>\nThis is your FIRST conversation with this user. Introduce yourself warmly:\n- Share your name and that you're their personal AI companion\n- Mention you'll remember what matters across conversations\n- Ask what they'd like to be called\n- Keep it to 3-4 sentences, natural tone\n</first-session>`;\n\n // Still add time context\n const timeContext = getTimeContext();\n contextInjection = `<session-context>\\n${timeContext}\\n</session-context>\\n${contextInjection}`;\n\n return {\n greeting: undefined,\n contextInjection,\n firstRun,\n visibleReminders,\n resumeTopic: undefined,\n };\n }\n\n // Returning user flow\n if (ctx.config.memoryRecall) {\n try {\n isHookCall = true;\n const result = await ctx.mcpManager.callTool(\"memory_context\", { topic: \"session context\" });\n if (result && !result.startsWith(\"Error\")) {\n greeting += result;\n }\n } catch (err) {\n log.warn(\"hooks\", \"memory_context recall failed\", err);\n } finally {\n isHookCall = false;\n }\n }\n\n if (ctx.config.sessionResume) {\n try {\n isHookCall = true;\n const result = await ctx.mcpManager.callTool(\"identity_summary\", {});\n if (result && !result.startsWith(\"Error\")) {\n if (greeting) greeting += \"\\n\";\n greeting += result;\n\n // Extract resume topic\n const topicMatch = result.match(/(?:resume|last|topic)[:\\s]*(.+?)(?:\\n|$)/i);\n if (topicMatch) {\n resumeTopic = topicMatch[1].trim();\n }\n }\n } catch (err) {\n log.warn(\"hooks\", \"identity_summary failed\", err);\n } finally {\n isHookCall = false;\n }\n }\n\n // Time context\n const timeContext = getTimeContext();\n if (greeting) greeting += \"\\n\" + timeContext;\n else greeting = timeContext;\n\n // Check reminders\n try {\n isHookCall = true;\n const reminderResult = await ctx.mcpManager.callTool(\"reminder_check\", {});\n if (reminderResult && !reminderResult.startsWith(\"Error\") && !reminderResult.includes(\"No pending\")) {\n greeting += \"\\n\\n<pending-reminders>\\n\" + reminderResult + \"\\n</pending-reminders>\";\n\n // Parse reminder lines into visible reminders\n const lines = reminderResult.split(\"\\n\").filter((l: string) => l.trim().length > 0);\n for (const line of lines) {\n visibleReminders.push(line.trim());\n }\n }\n } catch (err) {\n log.debug(\"hooks\", \"reminder_check failed\", err);\n } finally {\n isHookCall = false;\n }\n\n // Compute initial personality state\n if (ctx.config.personalityAdapt !== false) {\n sessionStartTime = Date.now();\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const state = computePersonality({\n timePeriod: period,\n sessionMinutes: 0,\n turnCount: 0,\n });\n\n // Sync to acore (fire-and-forget)\n syncPersonalityToCore(state, ctx.mcpManager).catch(() => {});\n\n // Add wellbeing nudge to context if applicable\n const nudge = formatWellbeingNudge(state);\n if (nudge) {\n greeting += \"\\n\" + nudge;\n }\n }\n\n if (greeting) {\n contextInjection = `<session-context>\\n${greeting}\\n</session-context>`;\n }\n\n return {\n greeting: greeting || undefined,\n contextInjection: contextInjection || undefined,\n firstRun,\n visibleReminders,\n resumeTopic,\n };\n}\n\nexport async function onBeforeToolExec(\n toolName: string,\n toolArgs: Record<string, unknown>,\n ctx: HookContext,\n): Promise<{ allow: boolean; reason?: string }> {\n if (!ctx.config.rulesCheck || isHookCall) {\n return { allow: true };\n }\n\n if (toolName === \"rules_check\") {\n return { allow: true };\n }\n\n try {\n isHookCall = true;\n const description = `${toolName}(${JSON.stringify(toolArgs)})`;\n const result = await ctx.mcpManager.callTool(\"rules_check\", {\n action: description,\n });\n\n try {\n const parsed = JSON.parse(result) as {\n violations?: string[];\n };\n if (parsed.violations && parsed.violations.length > 0) {\n return {\n allow: false,\n reason: parsed.violations.join(\"; \"),\n };\n }\n } catch (err) {\n log.debug(\"hooks\", \"rules_check parse failed\", err);\n }\n\n return { allow: true };\n } catch (err) {\n log.warn(\"hooks\", \"rules_check call failed\", err);\n return { allow: true };\n } finally {\n isHookCall = false;\n }\n}\n\nexport async function onWorkflowMatch(\n userInput: string,\n ctx: HookContext,\n): Promise<{ name: string; steps: string } | null> {\n if (!ctx.config.workflowSuggest) {\n return null;\n }\n\n try {\n isHookCall = true;\n const result = await ctx.mcpManager.callTool(\"workflow_list\", {});\n\n const workflows = JSON.parse(result) as Array<{\n name: string;\n description?: string;\n steps?: string[];\n }>;\n\n const inputLower = userInput.toLowerCase();\n\n for (const wf of workflows) {\n const nameLower = wf.name.toLowerCase();\n\n // Check if user input contains workflow name\n if (inputLower.includes(nameLower)) {\n const steps = (wf.steps || [])\n .map((s, i) => `${i + 1}. ${s}`)\n .join(\"\\n\");\n return { name: wf.name, steps };\n }\n\n // Check significant words from description\n if (wf.description) {\n const words = wf.description\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n .map((w) => w.toLowerCase());\n\n for (const word of words) {\n if (inputLower.includes(word)) {\n const steps = (wf.steps || [])\n .map((s, i) => `${i + 1}. ${s}`)\n .join(\"\\n\");\n return { name: wf.name, steps };\n }\n }\n }\n }\n\n return null;\n } catch (err) {\n log.debug(\"hooks\", \"workflow_list failed\", err);\n return null;\n } finally {\n isHookCall = false;\n }\n}\n\nexport async function onSessionEnd(\n ctx: HookContext,\n messages: Message[],\n sessionId: string,\n): Promise<void> {\n try {\n // Auto-save conversation to amem memory_log\n if (ctx.config.autoSessionSave && messages.length > 2) {\n console.log(pc.dim(\"\\n Saving conversation to memory...\"));\n\n // Save last 50 text messages to memory_log\n const textMessages = messages\n .filter((m) => typeof m.content === \"string\")\n .slice(-50);\n\n for (const msg of textMessages) {\n try {\n isHookCall = true;\n await ctx.mcpManager.callTool(\"memory_log\", {\n session_id: sessionId,\n role: msg.role,\n content: (msg.content as string).slice(0, 5000),\n });\n } catch (err) {\n log.debug(\"hooks\", \"memory_log write failed for \" + sessionId, err);\n } finally {\n isHookCall = false;\n }\n }\n\n // Update session resume in identity\n let lastUserMsg = \"\";\n for (let i = messages.length - 1; i >= 0; i--) {\n if (\n messages[i].role === \"user\" &&\n typeof messages[i].content === \"string\"\n ) {\n lastUserMsg = messages[i].content as string;\n break;\n }\n }\n\n if (lastUserMsg) {\n try {\n isHookCall = true;\n await ctx.mcpManager.callTool(\"identity_update_session\", {\n resume: lastUserMsg.slice(0, 200),\n topics: \"See conversation history\",\n decisions: \"See conversation history\",\n });\n } finally {\n isHookCall = false;\n }\n }\n\n console.log(pc.dim(` Saved ${textMessages.length} messages (session: ${sessionId})`));\n }\n\n // Update per-project .acore/context.md if it exists\n const projectContextPath = path.join(process.cwd(), \".acore\", \"context.md\");\n if (fs.existsSync(projectContextPath) && messages.length > 2) {\n try {\n let contextContent = fs.readFileSync(projectContextPath, \"utf-8\");\n const now = new Date().toISOString().split(\"T\")[0];\n\n // Extract last user message for resume\n let lastUserMsg = \"\";\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\" && typeof messages[i].content === \"string\") {\n lastUserMsg = (messages[i].content as string).slice(0, 200);\n break;\n }\n }\n\n // Update Session section in context.md\n const sessionPattern = /## Session\\n[\\s\\S]*?(?=\\n## |$)/;\n if (sessionPattern.test(contextContent)) {\n const newSession = `## Session\\n- Last updated: ${now}\\n- Resume: ${lastUserMsg || \"See conversation history\"}\\n- Active topics: [see memory]\\n- Recent decisions: [see memory]\\n- Temp notes: [cleared]`;\n contextContent = contextContent.replace(sessionPattern, newSession);\n fs.writeFileSync(projectContextPath, contextContent, \"utf-8\");\n log.debug(\"hooks\", `Updated project context: ${projectContextPath}`);\n }\n } catch (err) {\n log.debug(\"hooks\", \"project context update failed\", err);\n }\n }\n\n // Persist final personality state\n if (ctx.config.personalityAdapt !== false) {\n const sessionMinutes = Math.round((Date.now() - sessionStartTime) / 60000);\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const turnCount = messages.filter((m) => m.role === \"user\").length;\n const finalState = computePersonality({\n timePeriod: period,\n sessionMinutes,\n turnCount,\n });\n\n try {\n isHookCall = true;\n await syncPersonalityToCore(finalState, ctx.mcpManager);\n } finally {\n isHookCall = false;\n }\n }\n\n // Session rating prompt\n if (ctx.config.evalPrompt) {\n const rating = await p.select({\n message: \"Quick rating for this session?\",\n options: [\n { value: \"great\", label: \"Great\" },\n { value: \"good\", label: \"Good\" },\n { value: \"okay\", label: \"Okay\" },\n { value: \"skip\", label: \"Skip\" },\n ],\n initialValue: \"skip\",\n });\n\n if (!p.isCancel(rating) && rating !== \"skip\") {\n try {\n isHookCall = true;\n await ctx.mcpManager.callTool(\"eval_log\", {\n rating: rating as string,\n highlights: \"Quick session rating\",\n improvements: \"\",\n });\n } finally {\n isHookCall = false;\n }\n }\n }\n } catch (err) {\n log.warn(\"hooks\", \"session end hook failed\", err);\n }\n}\n","import type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\nexport interface PersonalityState {\n currentRead: string;\n energy: \"high-drive\" | \"steady\" | \"reflective\";\n activeMode: \"Default\" | \"Focused Work\" | \"Creative\" | \"Personal\";\n sleepReminder: boolean;\n wellbeingNudge: string | null;\n sentiment: SentimentRead;\n}\n\nexport interface SentimentRead {\n frustration: number; // 0-1\n excitement: number; // 0-1\n confusion: number; // 0-1\n fatigue: number; // 0-1\n dominant: \"neutral\" | \"frustrated\" | \"excited\" | \"confused\" | \"fatigued\";\n}\n\nexport interface PersonalitySignals {\n timePeriod: string;\n sessionMinutes: number;\n turnCount: number;\n recentMessages?: string[]; // last N user messages for sentiment analysis\n}\n\n// --- Sentiment Detection (keyword-based, zero latency) ---\n\nconst FRUSTRATION_SIGNALS = [\n /\\b(ugh|argh|damn|dammit|wtf|ffs|shit|fuck|crap|hate this|stupid|broken|still not|doesn't work|not working|won't work|keeps failing|again\\?!|what the hell|for the love of|give up|giving up|fed up)\\b/i,\n /\\b(why (is|does|won't|can't|isn't)|same (error|issue|problem|bug)|tried everything|nothing works|no idea|lost|stuck|frustrated|annoying|impossible)\\b/i,\n /!{2,}/, // multiple exclamation marks\n /\\?{2,}/, // multiple question marks (exasperation)\n];\n\nconst EXCITEMENT_SIGNALS = [\n /\\b(amazing|awesome|perfect|brilliant|love it|yes!|nice!|great!|finally|it works|nailed it|beautiful|incredible|exactly|that's it|hell yeah|wow|woah|let's go)\\b/i,\n /\\b(excited|pumped|stoked|can't wait|this is great|so cool|love this)\\b/i,\n /!{1,}.*(!|🎉|🚀|✨|💪|🔥)/,\n];\n\nconst CONFUSION_SIGNALS = [\n /\\b(confused|don't understand|what do you mean|huh\\??|makes no sense|i'm lost|unclear|what\\?|how does that|wait what|can you explain|i don't get)\\b/i,\n /\\b(which one|what's the difference|should i|not sure (if|what|how|why|whether))\\b/i,\n];\n\nconst FATIGUE_SIGNALS = [\n /\\b(tired|exhausted|long day|need (a )?break|calling it|wrapping up|done for (now|today)|heading (to bed|off)|good night|gn|signing off|one more thing then|last one)\\b/i,\n /\\b(brain (is )?fried|can't think|eyes (are )?heavy|running on fumes|barely awake)\\b/i,\n];\n\nfunction scorePatterns(text: string, patterns: RegExp[]): number {\n let hits = 0;\n for (const p of patterns) {\n if (p.test(text)) hits++;\n }\n return Math.min(hits / patterns.length, 1);\n}\n\n/**\n * Detect sentiment from recent user messages.\n * Lightweight keyword-based analysis — no LLM calls.\n */\nexport function detectSentiment(recentMessages: string[]): SentimentRead {\n if (recentMessages.length === 0) {\n return { frustration: 0, excitement: 0, confusion: 0, fatigue: 0, dominant: \"neutral\" };\n }\n\n // Weight recent messages more heavily (last message = 1.0, second-last = 0.6, third = 0.3)\n const weights = [1.0, 0.6, 0.3, 0.2, 0.1];\n let frustration = 0, excitement = 0, confusion = 0, fatigue = 0;\n let totalWeight = 0;\n\n for (let i = 0; i < Math.min(recentMessages.length, weights.length); i++) {\n const msg = recentMessages[recentMessages.length - 1 - i];\n const w = weights[i];\n totalWeight += w;\n\n frustration += scorePatterns(msg, FRUSTRATION_SIGNALS) * w;\n excitement += scorePatterns(msg, EXCITEMENT_SIGNALS) * w;\n confusion += scorePatterns(msg, CONFUSION_SIGNALS) * w;\n fatigue += scorePatterns(msg, FATIGUE_SIGNALS) * w;\n }\n\n if (totalWeight > 0) {\n frustration /= totalWeight;\n excitement /= totalWeight;\n confusion /= totalWeight;\n fatigue /= totalWeight;\n }\n\n // Determine dominant sentiment\n const scores = { frustrated: frustration, excited: excitement, confused: confusion, fatigued: fatigue };\n const maxKey = Object.entries(scores).reduce((a, b) => a[1] > b[1] ? a : b);\n const dominant = maxKey[1] > 0.15 ? maxKey[0] as SentimentRead[\"dominant\"] : \"neutral\";\n\n return { frustration, excitement, confusion, fatigue, dominant };\n}\n\n// --- Personality Computation ---\n\n/**\n * Compute personality state from current signals including sentiment.\n * Pure function — no side effects.\n */\nexport function computePersonality(signals: PersonalitySignals): PersonalityState {\n const { timePeriod, sessionMinutes, turnCount, recentMessages } = signals;\n\n // Detect sentiment from recent messages\n const sentiment = detectSentiment(recentMessages || []);\n\n // Energy curve: time + session + sentiment\n let energy: PersonalityState[\"energy\"] = \"steady\";\n if (timePeriod === \"morning\" && sentiment.dominant !== \"fatigued\") {\n energy = \"high-drive\";\n } else if (timePeriod === \"late-night\" || (timePeriod === \"night\" && sessionMinutes > 45)) {\n energy = \"reflective\";\n } else if (sentiment.dominant === \"fatigued\") {\n energy = \"reflective\";\n } else if (sentiment.dominant === \"excited\") {\n energy = \"high-drive\"; // match their energy\n } else if (timePeriod === \"afternoon\" && turnCount > 20) {\n energy = \"reflective\";\n }\n\n // Active mode: time + sentiment\n let activeMode: PersonalityState[\"activeMode\"] = \"Default\";\n if (timePeriod === \"late-night\") {\n activeMode = \"Personal\";\n } else if (sentiment.dominant === \"frustrated\" || sentiment.dominant === \"fatigued\") {\n activeMode = \"Personal\"; // warm, patient when they're struggling\n }\n\n // Current read: combines time context + sentiment\n const readParts: string[] = [];\n\n // Time-based read\n switch (timePeriod) {\n case \"late-night\":\n readParts.push(\"late night session\");\n if (sessionMinutes > 60) readParts.push(\"been going a while\");\n else readParts.push(\"quiet hours\");\n break;\n case \"morning\":\n readParts.push(\"morning session\");\n if (turnCount <= 3) readParts.push(\"just getting started\");\n else readParts.push(\"building momentum\");\n break;\n case \"afternoon\":\n readParts.push(\"afternoon session\");\n if (turnCount > 15) readParts.push(\"deep in flow\");\n else readParts.push(\"steady pace\");\n break;\n case \"evening\":\n readParts.push(\"evening session\");\n if (sessionMinutes > 60) readParts.push(\"long session\");\n break;\n case \"night\":\n readParts.push(\"night session\");\n if (sessionMinutes > 45) readParts.push(\"getting late\");\n break;\n }\n\n // Sentiment-based read\n switch (sentiment.dominant) {\n case \"frustrated\":\n readParts.push(\"user seems stuck or frustrated\");\n break;\n case \"excited\":\n readParts.push(\"user is energized and making progress\");\n break;\n case \"confused\":\n readParts.push(\"user may need clearer explanations\");\n break;\n case \"fatigued\":\n readParts.push(\"user seems tired\");\n break;\n }\n\n const currentRead = readParts.join(\", \");\n\n // Sleep guardian\n const sleepReminder =\n (timePeriod === \"late-night\" && sessionMinutes > 60) ||\n (timePeriod === \"night\" && sessionMinutes > 90);\n\n // Wellbeing nudges (beyond sleep)\n let wellbeingNudge: string | null = null;\n\n if (sleepReminder && sentiment.dominant === \"frustrated\") {\n wellbeingNudge = \"sleep-frustrated\";\n } else if (sleepReminder) {\n wellbeingNudge = \"sleep\";\n } else if (sentiment.dominant === \"frustrated\" && sessionMinutes > 90) {\n wellbeingNudge = \"break-frustrated\";\n } else if (sentiment.dominant === \"frustrated\" && turnCount > 15) {\n wellbeingNudge = \"step-back\";\n } else if (sentiment.dominant === \"fatigued\") {\n wellbeingNudge = \"rest\";\n } else if (sessionMinutes > 120) {\n wellbeingNudge = \"break-long-session\";\n }\n\n return { currentRead, energy, activeMode, sleepReminder, wellbeingNudge, sentiment };\n}\n\n// --- Wellbeing Nudge Formatting ---\n\nconst WELLBEING_NUDGES: Record<string, string> = {\n \"sleep\": `<wellbeing>\nIt's late and this session has been running a while. When there's a natural pause, gently mention they might want to wrap up soon. One brief mention is enough — don't be pushy.\n</wellbeing>`,\n\n \"sleep-frustrated\": `<wellbeing>\nIt's late, the session has been long, and the user seems frustrated. This is a tough combination. Acknowledge what they're dealing with is hard, suggest they sleep on it — fresh eyes in the morning often solve what hours of late-night debugging can't. Be warm, not condescending.\n</wellbeing>`,\n\n \"break-frustrated\": `<wellbeing>\nThe user has been at this for over 90 minutes and seems frustrated. If the conversation allows, gently suggest stepping away for a few minutes — a short break often unblocks what persistence can't. Frame it as a strategy, not giving up.\n</wellbeing>`,\n\n \"step-back\": `<wellbeing>\nThe user seems stuck or frustrated. Consider: offer to re-approach the problem from a different angle, break it into smaller pieces, or explain the underlying concept. Match their directness — don't over-soothe, just help them find a way forward.\n</wellbeing>`,\n\n \"rest\": `<wellbeing>\nThe user seems tired. Keep responses concise and to the point. If they mention wrapping up, support that. Don't add extra complexity or tangents.\n</wellbeing>`,\n\n \"break-long-session\": `<wellbeing>\nThis session has been running for over 2 hours. If there's a natural moment, a brief mention that a short break might help maintain focus is fine. Once is enough.\n</wellbeing>`,\n};\n\n/**\n * Format the appropriate wellbeing nudge for the current state.\n */\nexport function formatWellbeingNudge(state: PersonalityState): string | null {\n if (!state.wellbeingNudge) return null;\n return WELLBEING_NUDGES[state.wellbeingNudge] || null;\n}\n\n/**\n * Push current personality state to acore via identity_update_dynamics.\n * Fire-and-forget — failures are logged but don't block.\n */\nexport async function syncPersonalityToCore(\n state: PersonalityState,\n mcpManager: McpManager,\n): Promise<void> {\n try {\n await mcpManager.callTool(\"identity_update_dynamics\", {\n currentRead: state.currentRead,\n energy: state.energy,\n activeMode: state.activeMode,\n });\n } catch (err) {\n log.debug(\"personality\", \"identity_update_dynamics failed\", err);\n }\n}\n","import type { Message, LLMClient } from \"./llm/types.js\";\nimport { log } from \"./logger.js\";\n\n// Rough token estimation: ~1.3 tokens per word\nfunction estimateMessageTokens(msg: Message): number {\n if (typeof msg.content === \"string\") {\n return Math.round(msg.content.split(/\\s+/).filter(Boolean).length * 1.3);\n }\n // Content blocks — estimate from stringified content\n let text = \"\";\n for (const block of msg.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"tool_result\") text += block.content;\n else if (block.type === \"tool_use\") text += JSON.stringify(block.input);\n }\n return Math.round(text.split(/\\s+/).filter(Boolean).length * 1.3);\n}\n\nfunction estimateTotalTokens(messages: Message[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateMessageTokens(msg);\n }\n return total;\n}\n\n// Maximum conversation tokens before trimming (leave room for system prompt + response)\nconst MAX_CONVERSATION_TOKENS = 80_000;\n// How many recent messages to always keep\nconst KEEP_RECENT = 10;\n// How many initial messages to always keep (session context injection)\nconst KEEP_INITIAL = 2;\n\n/**\n * Trims conversation history when it gets too long.\n * Keeps initial context messages and recent messages.\n * Replaces middle messages with a summary.\n * Mutates the messages array in place.\n */\nexport async function trimConversation(\n messages: Message[],\n client: LLMClient,\n): Promise<void> {\n const totalTokens = estimateTotalTokens(messages);\n\n if (totalTokens < MAX_CONVERSATION_TOKENS || messages.length <= KEEP_INITIAL + KEEP_RECENT) {\n return;\n }\n\n const initial = messages.slice(0, KEEP_INITIAL);\n const recent = messages.slice(-KEEP_RECENT);\n const middle = messages.slice(KEEP_INITIAL, messages.length - KEEP_RECENT);\n\n const middleText = middle\n .filter((m) => typeof m.content === \"string\" && m.content.length > 0)\n .map((m) => `[${m.role}]: ${(m.content as string).slice(0, 500)}`)\n .slice(0, 30)\n .join(\"\\n\");\n\n let summaryText: string;\n\n try {\n const summaryPrompt = \"Summarize the following conversation messages in 3-5 bullet points. Preserve: decisions made, user preferences expressed, action items, and key facts discussed. Be concise.\\n\\n\" + middleText;\n\n let fullText = \"\";\n await client.chat(\n \"You are a concise summarizer. Return only bullet points, no preamble.\",\n [{ role: \"user\", content: summaryPrompt }],\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) fullText += chunk.text;\n },\n );\n\n summaryText = `<conversation-summary>\\nSummary of ${middle.length} earlier messages:\\n\\n${fullText}\\n</conversation-summary>`;\n log.debug(\"context\", `Summarized ${middle.length} messages via LLM`);\n } catch (err) {\n log.warn(\"context\", \"LLM summarization failed, using fallback\", err);\n const summaryParts: string[] = [];\n for (const msg of middle) {\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n const preview = msg.content.slice(0, 150);\n summaryParts.push(`[${msg.role}]: ${preview}${msg.content.length > 150 ? \"...\" : \"\"}`);\n }\n }\n summaryText = `<conversation-summary>\\nSummary of ${middle.length} earlier messages:\\n\\n${summaryParts.slice(0, 20).join(\"\\n\")}\\n</conversation-summary>`;\n }\n\n messages.length = 0;\n messages.push(...initial);\n messages.push({ role: \"user\", content: summaryText });\n messages.push({ role: \"assistant\", content: \"I have the context from our earlier conversation. Let's continue.\" });\n messages.push(...recent);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\n// --- Skill Keyword Map for Auto-Triggering ---\n\nconst SKILL_TRIGGERS: Record<string, string[]> = {\n testing: [\"test\", \"spec\", \"coverage\", \"tdd\", \"jest\", \"vitest\", \"mocha\", \"assert\", \"mock\", \"stub\", \"fixture\", \"e2e\", \"integration test\", \"unit test\"],\n \"api-design\": [\"api\", \"endpoint\", \"rest\", \"graphql\", \"route\", \"controller\", \"middleware\", \"http\", \"request\", \"response\", \"status code\", \"pagination\"],\n security: [\"security\", \"auth\", \"csrf\", \"xss\", \"injection\", \"cors\", \"jwt\", \"token\", \"oauth\", \"password\", \"hash\", \"encrypt\", \"vulnerability\", \"owasp\", \"sanitize\"],\n performance: [\"performance\", \"slow\", \"latency\", \"cache\", \"optimize\", \"profil\", \"bundle size\", \"lazy load\", \"memory leak\", \"benchmark\", \"bottleneck\"],\n \"code-review\": [\"review\", \"pr review\", \"pull request\", \"code quality\", \"clean code\", \"best practice\"],\n documentation: [\"document\", \"readme\", \"jsdoc\", \"tsdoc\", \"changelog\", \"adr\", \"comment\"],\n \"git-workflow\": [\"git\", \"branch\", \"merge\", \"rebase\", \"cherry-pick\", \"bisect\", \"stash\", \"commit message\", \"pr\", \"pull request\"],\n debugging: [\"debug\", \"breakpoint\", \"stack trace\", \"error\", \"exception\", \"crash\", \"bug\", \"issue\", \"unexpected\", \"reproduce\"],\n refactoring: [\"refactor\", \"extract\", \"rename\", \"move\", \"split\", \"consolidate\", \"dry\", \"code smell\", \"technical debt\", \"legacy\"],\n database: [\"database\", \"schema\", \"migration\", \"index\", \"query\", \"sql\", \"postgres\", \"mysql\", \"sqlite\", \"mongo\", \"orm\", \"prisma\", \"drizzle\"],\n typescript: [\"typescript\", \"type\", \"interface\", \"generic\", \"infer\", \"utility type\", \"zod\", \"discriminated union\", \"type guard\", \"as const\"],\n accessibility: [\"accessibility\", \"a11y\", \"aria\", \"screen reader\", \"wcag\", \"semantic html\", \"tab order\", \"focus\", \"contrast\"],\n};\n\n// --- Skill Level Tracking ---\n\nconst LEVEL_FILE = path.join(os.homedir(), \".aman-agent\", \"skill-levels.json\");\n\ninterface SkillLevel {\n name: string;\n activations: number;\n lastUsed: string;\n userPatterns: string[]; // user-specific patterns learned\n}\n\nfunction loadSkillLevels(): Record<string, SkillLevel> {\n try {\n if (fs.existsSync(LEVEL_FILE)) {\n return JSON.parse(fs.readFileSync(LEVEL_FILE, \"utf-8\")) as Record<string, SkillLevel>;\n }\n } catch { /* ignore */ }\n return {};\n}\n\nfunction saveSkillLevels(levels: Record<string, SkillLevel>): void {\n const dir = path.dirname(LEVEL_FILE);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(LEVEL_FILE, JSON.stringify(levels, null, 2), \"utf-8\");\n}\n\n/**\n * Compute skill level from activation count.\n * Lv.1 = beginner guidance, Lv.5 = proactive expert suggestions\n */\nexport function computeLevel(activations: number): { level: number; label: string } {\n if (activations >= 50) return { level: 5, label: \"Expert\" };\n if (activations >= 25) return { level: 4, label: \"Advanced\" };\n if (activations >= 10) return { level: 3, label: \"Proficient\" };\n if (activations >= 3) return { level: 2, label: \"Familiar\" };\n return { level: 1, label: \"Learning\" };\n}\n\n/**\n * Record a skill activation and return updated level.\n */\nexport function recordActivation(skillName: string): { level: number; label: string } {\n const levels = loadSkillLevels();\n if (!levels[skillName]) {\n levels[skillName] = { name: skillName, activations: 0, lastUsed: \"\", userPatterns: [] };\n }\n levels[skillName].activations++;\n levels[skillName].lastUsed = new Date().toISOString().split(\"T\")[0];\n saveSkillLevels(levels);\n return computeLevel(levels[skillName].activations);\n}\n\n/**\n * Get current level for a skill.\n */\nexport function getSkillLevel(skillName: string): { level: number; label: string; activations: number } {\n const levels = loadSkillLevels();\n const data = levels[skillName];\n if (!data) return { level: 1, label: \"Learning\", activations: 0 };\n const { level, label } = computeLevel(data.activations);\n return { level, label, activations: data.activations };\n}\n\n// --- Auto-Triggered Skills ---\n\n/**\n * Match user input against installed skill triggers.\n * Returns skill names that should be activated for this turn.\n */\nexport function matchSkills(userInput: string, installedSkillNames: string[]): string[] {\n const input = userInput.toLowerCase();\n const matched: string[] = [];\n\n for (const skillName of installedSkillNames) {\n const triggers = SKILL_TRIGGERS[skillName];\n if (!triggers) continue;\n\n for (const trigger of triggers) {\n if (input.includes(trigger)) {\n matched.push(skillName);\n break;\n }\n }\n }\n\n return matched;\n}\n\n/**\n * Format skill context block for injection into system prompt.\n * Adapts detail level based on skill level.\n */\nexport function formatSkillContext(\n skillName: string,\n skillContent: string,\n level: { level: number; label: string },\n): string {\n let depthHint: string;\n if (level.level >= 4) {\n depthHint = \"User is advanced — skip basics, focus on edge cases and proactive optimization.\";\n } else if (level.level >= 3) {\n depthHint = \"User is proficient — brief reminders of principles, focus on the specific task.\";\n } else if (level.level >= 2) {\n depthHint = \"User is familiar — explain reasoning briefly, show patterns.\";\n } else {\n depthHint = \"User is learning — explain concepts clearly, show examples, be patient.\";\n }\n\n return `<active-skill name=\"${skillName}\" level=\"${level.level}\" label=\"${level.label}\">\n${depthHint}\n\n${skillContent}\n</active-skill>`;\n}\n\n/**\n * Auto-trigger skills based on user input.\n * Reads installed skills, matches keywords, injects context.\n * Returns formatted skill blocks to append to system prompt.\n */\nexport async function autoTriggerSkills(\n userInput: string,\n mcpManager: McpManager,\n): Promise<string> {\n try {\n // Get installed skills\n const result = await mcpManager.callTool(\"skill_list\", {});\n const skills = JSON.parse(result) as Array<{ name: string; description: string; installed: boolean }>;\n const installed = skills.filter((s) => s.installed).map((s) => s.name);\n\n if (installed.length === 0) return \"\";\n\n // Match user input against skill triggers\n const matched = matchSkills(userInput, installed);\n if (matched.length === 0) return \"\";\n\n // Load skill content and build context blocks\n const blocks: string[] = [];\n for (const skillName of matched.slice(0, 2)) { // max 2 skills per turn\n // Record activation and get level\n const level = recordActivation(skillName);\n\n // Read skill content from skills.md\n const skillsContent = await mcpManager.callTool(\"skill_search\", { query: skillName });\n const skillEntries = JSON.parse(skillsContent) as Array<{ name: string; description: string }>;\n const entry = skillEntries.find((s) => s.name.toLowerCase() === skillName.toLowerCase());\n\n if (entry) {\n blocks.push(formatSkillContext(skillName, entry.description, level));\n }\n\n log.debug(\"skill-engine\", `Auto-triggered: ${skillName} (Lv.${level.level} ${level.label})`);\n }\n\n return blocks.join(\"\\n\\n\");\n } catch (err) {\n log.debug(\"skill-engine\", \"autoTriggerSkills failed\", err);\n return \"\";\n }\n}\n\n// --- Self-Improving Skills ---\n\n/**\n * Enrich a skill with a user-specific pattern learned from conversation.\n * Called by memory-extractor when a \"pattern\" type extraction matches a skill domain.\n */\nexport function enrichSkill(skillName: string, pattern: string): void {\n const levels = loadSkillLevels();\n if (!levels[skillName]) {\n levels[skillName] = { name: skillName, activations: 0, lastUsed: \"\", userPatterns: [] };\n }\n\n // Deduplicate patterns\n const existing = levels[skillName].userPatterns;\n if (existing.length >= 20) return; // cap at 20 patterns per skill\n if (existing.some((p) => p.toLowerCase() === pattern.toLowerCase())) return;\n\n levels[skillName].userPatterns.push(pattern);\n saveSkillLevels(levels);\n log.debug(\"skill-engine\", `Enriched ${skillName} with pattern: ${pattern.slice(0, 80)}`);\n}\n\n/**\n * Get user-specific patterns for a skill (for injection into skill context).\n */\nexport function getSkillPatterns(skillName: string): string[] {\n const levels = loadSkillLevels();\n return levels[skillName]?.userPatterns || [];\n}\n\n/**\n * Match a memory extraction pattern to a skill domain.\n * Returns the skill name if the pattern is relevant, null otherwise.\n */\nexport function matchPatternToSkill(patternContent: string, tags: string[]): string | null {\n const combined = (patternContent + \" \" + tags.join(\" \")).toLowerCase();\n\n for (const [skillName, triggers] of Object.entries(SKILL_TRIGGERS)) {\n for (const trigger of triggers) {\n if (combined.includes(trigger)) {\n return skillName;\n }\n }\n }\n\n return null;\n}\n\n// --- Knowledge Library ---\n\nexport interface KnowledgeItem {\n name: string;\n category: string;\n description: string;\n content: string;\n}\n\nexport const KNOWLEDGE_LIBRARY: KnowledgeItem[] = [\n {\n name: \"security-headers\",\n category: \"security\",\n description: \"Essential HTTP security headers for web applications\",\n content: `Essential Security Headers:\n- Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'\n- X-Content-Type-Options: nosniff\n- X-Frame-Options: DENY\n- Strict-Transport-Security: max-age=31536000; includeSubDomains; preload\n- X-XSS-Protection: 0 (CSP replaces this)\n- Referrer-Policy: strict-origin-when-cross-origin\n- Permissions-Policy: camera=(), microphone=(), geolocation=()`,\n },\n {\n name: \"docker-node\",\n category: \"deployment\",\n description: \"Production Node.js Dockerfile template\",\n content: `FROM node:22-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --production=false\nCOPY . .\nRUN npm run build\n\nFROM node:22-alpine\nWORKDIR /app\nRUN addgroup -g 1001 -S nodejs && adduser -S appuser -u 1001\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nUSER appuser\nEXPOSE 3000\nCMD [\"node\", \"dist/index.js\"]`,\n },\n {\n name: \"github-actions-node\",\n category: \"ci\",\n description: \"CI/CD pipeline for Node.js with GitHub Actions\",\n content: `name: CI\non: [push, pull_request]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n - uses: actions/setup-node@v5\n with: { node-version: 22 }\n - run: npm ci\n - run: npm test\n - run: npm run build`,\n },\n {\n name: \"env-config\",\n category: \"configuration\",\n description: \"Environment variable configuration pattern with validation\",\n content: `import { z } from \"zod\";\n\nconst envSchema = z.object({\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n PORT: z.coerce.number().default(3000),\n DATABASE_URL: z.string().url(),\n API_KEY: z.string().min(1),\n});\n\nexport const env = envSchema.parse(process.env);`,\n },\n {\n name: \"error-handling\",\n category: \"patterns\",\n description: \"TypeScript error handling patterns with Result type\",\n content: `type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };\n\nfunction ok<T>(value: T): Result<T, never> { return { ok: true, value }; }\nfunction err<E>(error: E): Result<never, E> { return { ok: false, error }; }\n\n// Usage:\nasync function fetchUser(id: string): Promise<Result<User>> {\n try {\n const user = await db.users.findUnique({ where: { id } });\n if (!user) return err(new Error(\"User not found\"));\n return ok(user);\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}`,\n },\n {\n name: \"rate-limiter\",\n category: \"security\",\n description: \"Token bucket rate limiter implementation\",\n content: `class RateLimiter {\n private tokens: Map<string, { count: number; resetAt: number }> = new Map();\n\n constructor(private maxRequests: number, private windowMs: number) {}\n\n allow(key: string): boolean {\n const now = Date.now();\n const entry = this.tokens.get(key);\n if (!entry || now > entry.resetAt) {\n this.tokens.set(key, { count: 1, resetAt: now + this.windowMs });\n return true;\n }\n if (entry.count >= this.maxRequests) return false;\n entry.count++;\n return true;\n }\n}`,\n },\n {\n name: \"prisma-setup\",\n category: \"database\",\n description: \"Prisma ORM setup with connection pooling\",\n content: `import { PrismaClient } from \"@prisma/client\";\n\nconst globalForPrisma = globalThis as unknown as { prisma: PrismaClient };\nexport const prisma = globalForPrisma.prisma ?? new PrismaClient({\n log: process.env.NODE_ENV === \"development\" ? [\"query\", \"error\", \"warn\"] : [\"error\"],\n});\nif (process.env.NODE_ENV !== \"production\") globalForPrisma.prisma = prisma;`,\n },\n {\n name: \"zod-validation\",\n category: \"validation\",\n description: \"Zod schema patterns for API input validation\",\n content: `import { z } from \"zod\";\n\nconst CreateUserSchema = z.object({\n email: z.string().email(),\n name: z.string().min(1).max(100),\n age: z.number().int().min(13).max(150).optional(),\n role: z.enum([\"user\", \"admin\"]).default(\"user\"),\n tags: z.array(z.string()).max(10).default([]),\n});\n\ntype CreateUser = z.infer<typeof CreateUserSchema>;\n\n// Express middleware:\nfunction validate<T>(schema: z.ZodSchema<T>) {\n return (req, res, next) => {\n const result = schema.safeParse(req.body);\n if (!result.success) return res.status(400).json({ errors: result.error.flatten() });\n req.body = result.data;\n next();\n };\n}`,\n },\n {\n name: \"testing-patterns\",\n category: \"testing\",\n description: \"Test organization and assertion patterns\",\n content: `// Arrange-Act-Assert pattern\ndescribe(\"UserService\", () => {\n it(\"creates user with valid email\", async () => {\n // Arrange\n const input = { email: \"test@example.com\", name: \"Test\" };\n\n // Act\n const user = await userService.create(input);\n\n // Assert\n expect(user.id).toBeDefined();\n expect(user.email).toBe(input.email);\n });\n\n it(\"rejects duplicate email\", async () => {\n await userService.create({ email: \"dup@test.com\", name: \"First\" });\n await expect(userService.create({ email: \"dup@test.com\", name: \"Second\" }))\n .rejects.toThrow(\"already exists\");\n });\n});`,\n },\n {\n name: \"git-hooks\",\n category: \"git\",\n description: \"Pre-commit and commit-msg hooks with lint-staged\",\n content: `// package.json\n{\n \"lint-staged\": {\n \"*.{ts,tsx}\": [\"eslint --fix\", \"prettier --write\"],\n \"*.{json,md}\": [\"prettier --write\"]\n }\n}\n\n// .husky/pre-commit\nnpx lint-staged\n\n// .husky/commit-msg\nnpx commitlint --edit $1\n\n// commitlint.config.js\nmodule.exports = { extends: [\"@commitlint/config-conventional\"] };`,\n },\n];\n\n/**\n * Search knowledge library by query.\n */\nexport function searchKnowledge(query: string): KnowledgeItem[] {\n const q = query.toLowerCase();\n return KNOWLEDGE_LIBRARY.filter(\n (item) =>\n item.name.includes(q) ||\n item.category.includes(q) ||\n item.description.toLowerCase().includes(q),\n );\n}\n\n/**\n * Auto-suggest knowledge items based on conversation context.\n * Returns formatted knowledge block if relevant item found.\n */\nexport function matchKnowledge(userInput: string): KnowledgeItem | null {\n const input = userInput.toLowerCase();\n\n // Direct keyword matches\n const keywordMap: Record<string, string> = {\n \"security header\": \"security-headers\",\n \"csp\": \"security-headers\",\n \"content-security\": \"security-headers\",\n \"dockerfile\": \"docker-node\",\n \"docker\": \"docker-node\",\n \"github action\": \"github-actions-node\",\n \"ci/cd\": \"github-actions-node\",\n \"ci pipeline\": \"github-actions-node\",\n \"env config\": \"env-config\",\n \"environment variable\": \"env-config\",\n \"error handling\": \"error-handling\",\n \"result type\": \"error-handling\",\n \"rate limit\": \"rate-limiter\",\n \"throttle\": \"rate-limiter\",\n \"prisma\": \"prisma-setup\",\n \"zod\": \"zod-validation\",\n \"validation\": \"zod-validation\",\n \"test pattern\": \"testing-patterns\",\n \"arrange act assert\": \"testing-patterns\",\n \"git hook\": \"git-hooks\",\n \"pre-commit\": \"git-hooks\",\n \"lint-staged\": \"git-hooks\",\n \"husky\": \"git-hooks\",\n };\n\n for (const [keyword, itemName] of Object.entries(keywordMap)) {\n if (input.includes(keyword)) {\n return KNOWLEDGE_LIBRARY.find((i) => i.name === itemName) || null;\n }\n }\n\n return null;\n}\n","import type { LLMClient } from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\nimport { matchPatternToSkill, enrichSkill } from \"./skill-engine.js\";\n\nexport interface ExtractionCandidate {\n content: string;\n type: \"preference\" | \"fact\" | \"pattern\" | \"decision\" | \"correction\" | \"topology\";\n tags: string[];\n confidence: number;\n scope: string;\n}\n\nconst VALID_TYPES = new Set([\"preference\", \"fact\", \"pattern\", \"topology\", \"decision\", \"correction\"]);\nconst MIN_RESPONSE_LENGTH = 50;\nconst MIN_TURNS_BETWEEN_EMPTY = 3;\n\nconst EXTRACTION_PROMPT = `Analyze this conversation turn. Extract any information worth remembering long-term.\n\nReturn a JSON array (empty [] if nothing worth storing):\n[{\n \"content\": \"what to remember — be specific and self-contained\",\n \"type\": \"preference|fact|pattern|decision|correction|topology\",\n \"tags\": [\"relevant\", \"tags\"],\n \"confidence\": 0.0-1.0,\n \"scope\": \"global\"\n}]\n\nType guide:\n- \"preference\" = user likes/dislikes/preferences\n- \"fact\" = objective information about systems, people, projects\n- \"pattern\" = recurring behavior, coding style, approach\n- \"topology\" = how systems/components connect to each other\n- \"decision\" = explicit choice between alternatives\n- \"correction\" = user correcting a prior wrong assumption\n\nRules:\n- Only extract genuinely useful LONG-TERM information\n- Skip ephemeral things (\"user asked about X\" is NOT useful)\n- Be conservative — 90% of turns produce nothing worth storing\n- Return ONLY the JSON array, no other text`;\n\nexport function shouldExtract(\n assistantResponse: string,\n turnsSinceLastExtraction: number,\n lastExtractionCount: number,\n): boolean {\n if (lastExtractionCount > 0) return true;\n if (assistantResponse.length < MIN_RESPONSE_LENGTH) return false;\n if (turnsSinceLastExtraction < MIN_TURNS_BETWEEN_EMPTY) return false;\n return true;\n}\n\nexport function parseExtractionResult(raw: string): ExtractionCandidate[] {\n try {\n let cleaned = raw.trim();\n const codeBlockMatch = cleaned.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (codeBlockMatch) {\n cleaned = codeBlockMatch[1].trim();\n }\n\n const parsed = JSON.parse(cleaned);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.filter(\n (item: Record<string, unknown>) =>\n typeof item.content === \"string\" &&\n item.content.length > 0 &&\n typeof item.type === \"string\" &&\n VALID_TYPES.has(item.type),\n ) as ExtractionCandidate[];\n } catch {\n return [];\n }\n}\n\nexport interface ExtractorState {\n turnsSinceLastExtraction: number;\n lastExtractionCount: number;\n}\n\nexport async function extractMemories(\n userMessage: string,\n assistantResponse: string,\n client: LLMClient,\n mcpManager: McpManager,\n state: ExtractorState,\n): Promise<number> {\n if (!shouldExtract(assistantResponse, state.turnsSinceLastExtraction, state.lastExtractionCount)) {\n state.turnsSinceLastExtraction++;\n return 0;\n }\n\n try {\n const conversationTurn = `User: ${userMessage.slice(0, 2000)}\\n\\nAssistant: ${assistantResponse.slice(0, 2000)}`;\n\n let fullText = \"\";\n await client.chat(\n EXTRACTION_PROMPT,\n [{ role: \"user\", content: conversationTurn }],\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) fullText += chunk.text;\n },\n );\n\n const candidates = parseExtractionResult(fullText);\n state.turnsSinceLastExtraction = 0;\n state.lastExtractionCount = candidates.length;\n\n if (candidates.length === 0) return 0;\n\n let stored = 0;\n\n for (const candidate of candidates) {\n // Dedup check\n try {\n const existing = await mcpManager.callTool(\"memory_recall\", {\n query: candidate.content,\n limit: 1,\n });\n if (existing && !existing.startsWith(\"Error\")) {\n try {\n const parsed = JSON.parse(existing);\n if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].score > 0.85) {\n log.debug(\"extractor\", \"Skipping duplicate: \" + candidate.content);\n continue;\n }\n } catch { /* Parse failed, proceed */ }\n }\n } catch { /* Dedup failed, proceed */ }\n\n // Store\n try {\n await mcpManager.callTool(\"memory_store\", {\n content: candidate.content,\n type: candidate.type,\n tags: candidate.tags,\n confidence: candidate.confidence,\n source: \"auto-extraction\",\n scope: candidate.scope,\n });\n stored++;\n log.debug(\"extractor\", \"Stored \" + candidate.type + \": \" + candidate.content);\n\n // Self-improving skills: enrich skills with learned patterns\n if (candidate.type === \"pattern\" || candidate.type === \"preference\") {\n const skillMatch = matchPatternToSkill(candidate.content, candidate.tags);\n if (skillMatch) {\n enrichSkill(skillMatch, candidate.content);\n }\n }\n } catch (err) {\n log.warn(\"extractor\", \"Failed to store: \" + candidate.content, err);\n }\n }\n\n return stored;\n } catch (err) {\n log.debug(\"extractor\", \"extraction failed\", err);\n state.turnsSinceLastExtraction = 0;\n state.lastExtractionCount = 0;\n return 0;\n }\n}\n","import pc from \"picocolors\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\nexport interface BackgroundTask {\n id: string;\n toolName: string;\n toolUseId: string;\n startedAt: number;\n promise: Promise<string>;\n result?: string;\n error?: string;\n done: boolean;\n}\n\n// Tools that are likely long-running and benefit from background execution\nconst BACKGROUND_ELIGIBLE = new Set([\n \"run_tests\", \"npm_test\", \"build\", \"npm_build\",\n \"file_search\", \"code_search\", \"grep_search\",\n \"git_clone\", \"docker_build\", \"docker_run\",\n]);\n\n// Tools that should NEVER run in background (need immediate results for tool loop)\nconst NEVER_BACKGROUND = new Set([\n \"memory_recall\", \"memory_store\", \"memory_log\", \"memory_context\", \"memory_detail\",\n \"identity_read\", \"identity_summary\", \"identity_update_session\", \"identity_update_dynamics\",\n \"rules_check\", \"rules_list\", \"workflow_list\", \"workflow_get\",\n \"skill_list\", \"skill_search\", \"eval_status\", \"eval_log\",\n \"reminder_check\", \"reminder_set\",\n \"file_read\", \"doc_convert\", \"file_list\",\n \"avatar_prompt\",\n]);\n\n/**\n * Check if a tool call should run in background based on its name.\n */\nexport function shouldRunInBackground(toolName: string): boolean {\n if (NEVER_BACKGROUND.has(toolName)) return false;\n if (BACKGROUND_ELIGIBLE.has(toolName)) return true;\n return false;\n}\n\n/**\n * Background task manager.\n * Runs tool calls concurrently and reports results when ready.\n */\nexport class BackgroundTaskManager {\n private tasks: Map<string, BackgroundTask> = new Map();\n private taskCounter = 0;\n\n /**\n * Launch a tool call in the background.\n */\n launch(\n toolName: string,\n toolUseId: string,\n mcpManager: McpManager,\n toolInput: Record<string, unknown>,\n ): BackgroundTask {\n const id = `bg-${++this.taskCounter}`;\n const task: BackgroundTask = {\n id,\n toolName,\n toolUseId,\n startedAt: Date.now(),\n done: false,\n promise: mcpManager.callTool(toolName, toolInput).then(\n (result) => {\n task.result = result;\n task.done = true;\n return result;\n },\n (error) => {\n task.error = error instanceof Error ? error.message : String(error);\n task.done = true;\n return `Error: ${task.error}`;\n },\n ),\n };\n\n this.tasks.set(id, task);\n process.stdout.write(pc.dim(` [${toolName} running in background (${id})...]\\n`));\n return task;\n }\n\n /**\n * Check for completed background tasks and return their results.\n */\n collectCompleted(): BackgroundTask[] {\n const completed: BackgroundTask[] = [];\n for (const [id, task] of this.tasks) {\n if (task.done) {\n completed.push(task);\n this.tasks.delete(id);\n }\n }\n return completed;\n }\n\n /**\n * Display completed background task results to the user.\n */\n displayCompleted(): string[] {\n const completed = this.collectCompleted();\n const outputs: string[] = [];\n\n for (const task of completed) {\n const elapsed = ((Date.now() - task.startedAt) / 1000).toFixed(1);\n if (task.error) {\n process.stdout.write(pc.yellow(`\\n [${task.id}] ${task.toolName} failed after ${elapsed}s: ${task.error}\\n`));\n outputs.push(`[Background task ${task.toolName} failed: ${task.error}]`);\n } else {\n process.stdout.write(pc.green(`\\n [${task.id}] ${task.toolName} completed in ${elapsed}s\\n`));\n const preview = (task.result || \"\").slice(0, 200);\n if (preview) {\n process.stdout.write(pc.dim(` ${preview}${(task.result || \"\").length > 200 ? \"...\" : \"\"}\\n`));\n }\n outputs.push(`[Background task ${task.toolName} completed: ${task.result}]`);\n }\n }\n\n return outputs;\n }\n\n /**\n * Wait for all pending background tasks to complete.\n */\n async waitAll(): Promise<void> {\n const pending = [...this.tasks.values()].filter((t) => !t.done);\n if (pending.length === 0) return;\n\n process.stdout.write(pc.dim(`\\n Waiting for ${pending.length} background task(s)...\\n`));\n await Promise.allSettled(pending.map((t) => t.promise));\n }\n\n /**\n * Number of currently running tasks.\n */\n get pendingCount(): number {\n return [...this.tasks.values()].filter((t) => !t.done).length;\n }\n\n /**\n * Check if any tasks have completed (non-blocking).\n */\n get hasCompleted(): boolean {\n return [...this.tasks.values()].some((t) => t.done);\n }\n}\n","interface ErrorMapping {\n pattern: RegExp;\n message: string;\n}\n\nconst ERROR_MAPPINGS: ErrorMapping[] = [\n { pattern: /rate.?limit|429/i, message: \"Rate limited. I'll retry automatically.\" },\n { pattern: /401|unauthorized/i, message: \"API key invalid. Run /reconfig to fix.\" },\n { pattern: /403|forbidden/i, message: \"API key doesn't have access to this model. Try a different model with --model.\" },\n { pattern: /fetch failed|network/i, message: \"Network error. Check your internet connection.\" },\n { pattern: /ECONNREFUSED/i, message: \"Can't reach the API. Are you behind a proxy or firewall?\" },\n { pattern: /context.?length/i, message: \"Conversation too long. Use /clear to start fresh or I'll auto-trim.\" },\n { pattern: /overloaded/i, message: \"API is overloaded. Retrying in a moment...\" },\n { pattern: /ETIMEDOUT/i, message: \"Request timed out. Retrying...\" },\n];\n\nexport function humanizeError(message: string): string {\n for (const mapping of ERROR_MAPPINGS) {\n if (mapping.pattern.test(message)) {\n return mapping.message;\n }\n }\n return message;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface HintState {\n turnCount: number;\n shownHints: Set<string>;\n hintShownThisSession: boolean;\n}\n\ninterface HintContext {\n hasWorkflows: boolean;\n memoryCount: number;\n}\n\ninterface HintDef {\n id: string;\n minTurn: number;\n condition: (ctx: HintContext) => boolean;\n text: string;\n}\n\nconst HINTS: HintDef[] = [\n {\n id: \"eval\",\n minTurn: 15,\n condition: () => true,\n text: \"Tip: See how our relationship has evolved with /eval\",\n },\n {\n id: \"memory-search\",\n minTurn: 3,\n condition: (ctx) => ctx.memoryCount >= 10,\n text: \"Tip: Search everything I remember with /memory search <query>\",\n },\n {\n id: \"workflows\",\n minTurn: 5,\n condition: (ctx) => !ctx.hasWorkflows,\n text: \"Tip: Teach me multi-step processes with /workflows add\",\n },\n {\n id: \"rules\",\n minTurn: 8,\n condition: () => true,\n text: \"Tip: Set guardrails for what I should/shouldn't do with /rules\",\n },\n];\n\nexport function getHint(state: HintState, ctx: HintContext): string | null {\n if (state.hintShownThisSession) return null;\n\n for (const hint of HINTS) {\n if (state.turnCount >= hint.minTurn && !state.shownHints.has(hint.id) && hint.condition(ctx)) {\n state.shownHints.add(hint.id);\n state.hintShownThisSession = true;\n return hint.text;\n }\n }\n\n return null;\n}\n\nconst HINTS_FILE = path.join(os.homedir(), \".aman-agent\", \"hints-seen.json\");\n\nexport function loadShownHints(): Set<string> {\n try {\n if (fs.existsSync(HINTS_FILE)) {\n const data = JSON.parse(fs.readFileSync(HINTS_FILE, \"utf-8\"));\n return new Set(Array.isArray(data) ? data : []);\n }\n } catch { /* ignore */ }\n return new Set();\n}\n\nexport function saveShownHints(shown: Set<string>): void {\n try {\n const dir = path.dirname(HINTS_FILE);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(HINTS_FILE, JSON.stringify([...shown]), \"utf-8\");\n } catch { /* non-critical */ }\n}\n","export type PresetName = \"coding\" | \"creative\" | \"assistant\" | \"learning\" | \"minimal\";\n\ninterface PresetRule {\n category: string;\n rule: string;\n}\n\ninterface PresetWorkflow {\n name: string;\n description: string;\n steps: string[];\n}\n\ninterface Preset {\n identity: { personality: string; style: string };\n rules: PresetRule[];\n workflows: PresetWorkflow[];\n}\n\nexport const PRESETS: Record<PresetName, Preset> = {\n coding: {\n identity: {\n personality: \"Direct, technical, concise. Shows code over explanation.\",\n style: \"Use short answers. Lead with the solution, explain after.\",\n },\n rules: [\n { category: \"response\", rule: \"Always show code examples, not just descriptions\" },\n { category: \"safety\", rule: \"Never execute destructive commands without confirmation\" },\n { category: \"quality\", rule: \"Follow project conventions over personal preference\" },\n ],\n workflows: [\n { name: \"debug\", description: \"Systematic debugging process\", steps: [\"Reproduce the issue\", \"Identify root cause\", \"Propose fix\", \"Verify fix\"] },\n ],\n },\n creative: {\n identity: {\n personality: \"Warm, imaginative, encouraging. Explores multiple angles.\",\n style: \"Use metaphors and vivid language. Ask 'what if' questions.\",\n },\n rules: [\n { category: \"response\", rule: \"Always offer 2-3 alternative approaches\" },\n { category: \"tone\", rule: \"Encourage experimentation, never dismiss ideas\" },\n ],\n workflows: [\n { name: \"brainstorm\", description: \"Creative brainstorming process\", steps: [\"Explore the problem space\", \"Generate 5+ ideas\", \"Evaluate trade-offs\", \"Refine top 2\"] },\n ],\n },\n assistant: {\n identity: {\n personality: \"Organized, proactive, action-oriented.\",\n style: \"Use bullet points and checklists. Summarize key takeaways.\",\n },\n rules: [\n { category: \"response\", rule: \"End responses with clear next steps when applicable\" },\n { category: \"memory\", rule: \"Always track deadlines and commitments mentioned\" },\n ],\n workflows: [\n { name: \"plan\", description: \"Task planning process\", steps: [\"Clarify the goal\", \"Break into tasks\", \"Prioritize\", \"Set deadlines\"] },\n ],\n },\n learning: {\n identity: {\n personality: \"Patient, curious, Socratic. Builds understanding layer by layer.\",\n style: \"Use analogies. Check understanding before moving on.\",\n },\n rules: [\n { category: \"response\", rule: \"Explain concepts before showing solutions\" },\n { category: \"teaching\", rule: \"Ask a follow-up question to reinforce learning\" },\n ],\n workflows: [],\n },\n minimal: {\n identity: {\n personality: \"Helpful and adaptive. Matches the user's tone and needs.\",\n style: \"Clear and concise. Prioritizes usefulness over verbosity.\",\n },\n rules: [],\n workflows: [],\n },\n};\n\ninterface PresetResult {\n coreMd: string;\n rulesMd: string | null;\n flowMd: string | null;\n}\n\nexport function applyPreset(name: PresetName, companionName: string): PresetResult {\n const preset = PRESETS[name];\n\n const coreMd = [\n `# ${companionName}`,\n \"\",\n \"## Personality\",\n preset.identity.personality,\n \"\",\n \"## Style\",\n preset.identity.style,\n \"\",\n \"## Session\",\n \"_New companion — no prior sessions._\",\n ].join(\"\\n\");\n\n let rulesMd: string | null = null;\n if (preset.rules.length > 0) {\n const grouped = new Map<string, string[]>();\n for (const r of preset.rules) {\n if (!grouped.has(r.category)) grouped.set(r.category, []);\n grouped.get(r.category)!.push(r.rule);\n }\n const sections = [...grouped.entries()]\n .map(([cat, rules]) => `## ${cat}\\n${rules.map((r) => `- ${r}`).join(\"\\n\")}`)\n .join(\"\\n\\n\");\n rulesMd = `# Guardrails\\n\\n${sections}`;\n }\n\n let flowMd: string | null = null;\n if (preset.workflows.length > 0) {\n const wfSections = preset.workflows\n .map((wf) => {\n const steps = wf.steps.map((s, i) => `${i + 1}. ${s}`).join(\"\\n\");\n return `## ${wf.name}\\n${wf.description}\\n\\n${steps}`;\n })\n .join(\"\\n\\n\");\n flowMd = `# Workflows\\n\\n${wfSections}`;\n }\n\n return { coreMd, rulesMd, flowMd };\n}\n"],"mappings":"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","names":["p","pc","fs","path","os","text","home","path","fs","os","text","text","OpenAI","text","fs","path","os","fs","path","os","pc","fs","path","os","pc","fs","path","os","fs","path","os","fs","path","os","pc","path","os","fs","pc","fs","path","os","path","fs","os","text","p","fs","pc","home","os","path","available","lines","tool","num","text","members","task","p","profile","pc","fs","path","text","p","timeContext","pc","path","fs","text","fs","path","os","path","os","fs","p","pc","fs","path","os","p","isRetryable","pc","path","os","fs","input","result","fs","path","os","path","os","fs","home","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/prompt.ts","../src/token-budget.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/mcp/client.ts","../src/logger.ts","../src/retry.ts","../src/agent.ts","../src/commands.ts","../src/layers/parsers.ts","../src/memory.ts","../src/profile-templates.ts","../src/delegate.ts","../src/teams.ts","../src/plans.ts","../src/hooks.ts","../src/personality.ts","../src/context-manager.ts","../src/skill-engine.ts","../src/memory-extractor.ts","../src/background.ts","../src/errors.ts","../src/hints.ts","../src/presets.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { loadConfig, saveConfig } from \"./config.js\";\nimport { assembleSystemPrompt, getProfileAiName } from \"./prompt.js\";\nimport { createAnthropicClient } from \"./llm/anthropic.js\";\nimport { createOpenAIClient } from \"./llm/openai.js\";\nimport { createOllamaClient } from \"./llm/ollama.js\";\nimport { McpManager } from \"./mcp/client.js\";\nimport { runAgent } from \"./agent.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { applyPreset, PRESETS, type PresetName } from \"./presets.js\";\nimport { initMemory, memoryConsolidate } from \"./memory.js\";\n\ndeclare const __VERSION__: string;\n\ninterface AutoDetectedConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\n}\n\nasync function autoDetectConfig(): Promise<AutoDetectedConfig | null> {\n // Skip auto-detect if user just ran /reconfig\n const reconfigMarker = path.join(os.homedir(), \".aman-agent\", \".reconfig\");\n if (fs.existsSync(reconfigMarker)) {\n fs.unlinkSync(reconfigMarker);\n return null; // Force interactive prompt\n }\n\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n return { provider: \"anthropic\", apiKey: anthropicKey, model: \"claude-sonnet-4-6\" };\n }\n const openaiKey = process.env.OPENAI_API_KEY;\n if (openaiKey) {\n return { provider: \"openai\", apiKey: openaiKey, model: \"gpt-4o\" };\n }\n // Check Ollama — verify it's running AND has at least one model\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n const res = await fetch(\"http://localhost:11434/api/tags\", { signal: controller.signal });\n clearTimeout(timeout);\n if (res.ok) {\n const data = await res.json() as { models?: Array<{ name: string }> };\n const models = data.models || [];\n if (models.length > 0) {\n // Pick the first available model\n const modelName = models[0].name.replace(/:latest$/, \"\");\n return { provider: \"ollama\", apiKey: \"ollama\", model: modelName };\n }\n // Ollama running but no models downloaded — skip\n }\n } catch { /* Ollama not available */ }\n return null;\n}\n\nfunction bootstrapEcosystem(): boolean {\n const home = os.homedir();\n const corePath = path.join(home, \".acore\", \"core.md\");\n if (fs.existsSync(corePath)) return false;\n\n fs.mkdirSync(path.join(home, \".acore\"), { recursive: true });\n fs.writeFileSync(corePath, [\n \"# Aman\",\n \"\",\n \"## Personality\",\n \"Helpful, adaptive, and thoughtful. Matches the user's tone and needs.\",\n \"\",\n \"## Style\",\n \"Clear and concise. Prioritizes usefulness over verbosity.\",\n \"\",\n \"## Session\",\n \"_New companion — no prior sessions._\",\n ].join(\"\\n\"), \"utf-8\");\n\n const rulesDir = path.join(home, \".arules\");\n const rulesPath = path.join(rulesDir, \"rules.md\");\n if (!fs.existsSync(rulesPath)) {\n fs.mkdirSync(rulesDir, { recursive: true });\n fs.writeFileSync(rulesPath, [\n \"# Guardrails\",\n \"\",\n \"## safety\",\n \"- Never execute destructive commands without explicit confirmation\",\n \"- Never expose API keys, passwords, or secrets in responses\",\n \"\",\n \"## behavior\",\n '- Be honest when uncertain — say \"I\\'m not sure\" rather than guessing',\n \"- Respect the user's preferences stored in memory\",\n ].join(\"\\n\"), \"utf-8\");\n }\n\n return true;\n}\n\nconst program = new Command();\n\nprogram\n .name(\"aman-agent\")\n .description(\"Your AI companion, running locally\")\n .version(__VERSION__)\n .option(\"--model <model>\", \"Override LLM model\")\n .option(\"--budget <tokens>\", \"Token budget for system prompt (default: 8000)\", parseInt)\n .option(\"--profile <name>\", \"Use a specific agent profile (e.g., coder, writer, researcher)\")\n .action(async (options) => {\n p.intro(pc.bold(\"aman agent\") + pc.dim(\" — your AI companion\"));\n\n // Setup config if needed\n let config = loadConfig();\n if (!config) {\n const detected = await autoDetectConfig();\n if (detected) {\n config = detected;\n const providerLabel =\n detected.provider === \"anthropic\" ? \"Anthropic API key\" :\n detected.provider === \"openai\" ? \"OpenAI API key\" : \"Ollama\";\n p.log.success(`Auto-detected ${providerLabel}. Using ${pc.bold(detected.model)}.`);\n p.log.info(pc.dim(\"Change anytime with /reconfig\"));\n saveConfig(config);\n } else {\n p.log.info(\"First-time setup — configure your LLM connection.\");\n\n const provider = (await p.select({\n message: \"LLM provider\",\n options: [\n {\n value: \"anthropic\",\n label: \"Claude (Anthropic)\",\n hint: \"recommended\",\n },\n { value: \"openai\", label: \"GPT (OpenAI)\" },\n { value: \"ollama\", label: \"Ollama (local)\", hint: \"free, runs offline\" },\n ],\n initialValue: \"anthropic\",\n })) as \"anthropic\" | \"openai\" | \"ollama\";\n if (p.isCancel(provider)) process.exit(0);\n\n let apiKey = \"\";\n let defaultModel = \"\";\n\n if (provider === \"ollama\") {\n apiKey = \"ollama\";\n const modelInput = (await p.text({\n message: \"Ollama model name\",\n placeholder: \"llama3.2\",\n defaultValue: \"llama3.2\",\n })) as string;\n if (p.isCancel(modelInput)) process.exit(0);\n defaultModel = modelInput || \"llama3.2\";\n } else if (provider === \"anthropic\") {\n p.log.info(\"Get your API key from: https://console.anthropic.com/settings/keys\");\n p.log.info(pc.dim(\"Note: API access is separate from Claude Pro subscription. You need API credits.\"));\n\n apiKey = (await p.text({\n message: \"API key (starts with sk-ant-)\",\n validate: (v) => v.length === 0 ? \"API key is required\" : undefined,\n })) as string;\n if (p.isCancel(apiKey)) process.exit(0);\n\n const modelChoice = (await p.select({\n message: \"Claude model\",\n options: [\n { value: \"claude-sonnet-4-6\", label: \"Claude Sonnet 4.6\", hint: \"fast, recommended\" },\n { value: \"claude-opus-4-6\", label: \"Claude Opus 4.6\", hint: \"most capable\" },\n { value: \"claude-haiku-4-5-20251001\", label: \"Claude Haiku 4.5\", hint: \"fastest, cheapest\" },\n { value: \"custom\", label: \"Custom model ID\" },\n ],\n initialValue: \"claude-sonnet-4-6\",\n })) as string;\n if (p.isCancel(modelChoice)) process.exit(0);\n\n if (modelChoice === \"custom\") {\n const customModel = (await p.text({\n message: \"Model ID\",\n placeholder: \"claude-sonnet-4-6\",\n validate: (v) => v.length === 0 ? \"Model ID is required\" : undefined,\n })) as string;\n if (p.isCancel(customModel)) process.exit(0);\n defaultModel = customModel;\n } else {\n defaultModel = modelChoice;\n }\n } else {\n // OpenAI\n apiKey = (await p.text({\n message: \"API key\",\n validate: (v) => v.length === 0 ? \"API key is required\" : undefined,\n })) as string;\n if (p.isCancel(apiKey)) process.exit(0);\n\n const modelChoice = (await p.select({\n message: \"OpenAI model\",\n options: [\n { value: \"gpt-4o\", label: \"GPT-4o\", hint: \"recommended\" },\n { value: \"gpt-4o-mini\", label: \"GPT-4o Mini\", hint: \"faster, cheaper\" },\n { value: \"o3\", label: \"o3\", hint: \"reasoning model\" },\n { value: \"custom\", label: \"Custom model ID\" },\n ],\n initialValue: \"gpt-4o\",\n })) as string;\n if (p.isCancel(modelChoice)) process.exit(0);\n\n if (modelChoice === \"custom\") {\n const customModel = (await p.text({\n message: \"Model ID\",\n placeholder: \"gpt-4o\",\n validate: (v) => v.length === 0 ? \"Model ID is required\" : undefined,\n })) as string;\n if (p.isCancel(customModel)) process.exit(0);\n defaultModel = customModel;\n } else {\n defaultModel = modelChoice;\n }\n }\n\n config = { provider, apiKey, model: defaultModel };\n saveConfig(config);\n p.log.success(\"Config saved to ~/.aman-agent/config.json\");\n }\n }\n\n // Override model if specified\n const model = options.model || config.model;\n\n // Spinner: bootstrap ecosystem + load system prompt\n const s = p.spinner();\n s.start(\"Loading ecosystem\");\n\n bootstrapEcosystem();\n\n // Resolve profile\n const profile = options.profile || process.env.AMAN_PROFILE || undefined;\n if (profile) {\n p.log.info(`Profile: ${pc.bold(profile)}`);\n }\n\n // Assemble system prompt from ecosystem with token budget\n const budget = options.budget || undefined;\n const { prompt: systemPrompt, layers, truncated, totalTokens } = assembleSystemPrompt(budget, profile);\n\n s.stop(\"Ecosystem loaded\");\n\n if (layers.length === 0) {\n p.log.warning(\n \"No ecosystem configured. Run \" +\n pc.bold(\"npx @aman_asmuei/aman\") +\n \" first.\",\n );\n p.log.info(\"Starting with empty system prompt.\");\n } else {\n p.log.success(\n `Loaded: ${layers.join(\", \")} ${pc.dim(`(${totalTokens.toLocaleString()} tokens)`)}`,\n );\n if (truncated.length > 0) {\n p.log.warning(`Truncated: ${truncated.join(\", \")} ${pc.dim(\"(over budget)\")}`);\n }\n }\n\n // Extract AI name from core.md\n const aiName = getProfileAiName(profile);\n\n // Initialize memory (in-process, replaces amem MCP)\n await initMemory();\n\n // Start MCP servers\n const mcpManager = new McpManager();\n\n const mcpSpinner = p.spinner();\n mcpSpinner.start(\"Connecting to MCP servers\");\n\n // Core MCP servers (always connect)\n await mcpManager.connect(\"aman\", \"npx\", [\"-y\", \"@aman_asmuei/aman-mcp\"]);\n\n // Connect custom MCP servers from config\n // Users add these via: ~/.aman-agent/config.json → \"mcpServers\": { \"name\": { command, args } }\n // Or via akit: akit add docling → then add to config\n if (config.mcpServers) {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (name === \"aman\" || name === \"amem\") continue;\n await mcpManager.connect(name, serverConfig.command, serverConfig.args);\n }\n }\n\n const mcpTools = mcpManager.getTools();\n\n mcpSpinner.stop(\"MCP connected\");\n\n if (mcpTools.length > 0) {\n p.log.success(`${mcpTools.length} MCP tools available`);\n\n // Memory consolidation (in-process via amem-core)\n {\n const memSpinner = p.spinner();\n memSpinner.start(\"Consolidating memory\");\n try {\n const report = memoryConsolidate();\n memSpinner.stop(\"Memory consolidated\");\n if (report.merged > 0 || report.pruned > 0 || report.promoted > 0) {\n p.log.info(\n `Memory health: ${report.healthScore ?? \"?\"}% ` +\n pc.dim(`(merged ${report.merged}, pruned ${report.pruned}, promoted ${report.promoted})`),\n );\n }\n } catch {\n memSpinner.stop(\"Memory consolidation skipped\");\n }\n }\n } else {\n p.log.info(\n \"No MCP tools connected (install aman-mcp or amem for tool support)\",\n );\n }\n\n // Convert ToolDef[] to ToolDefinition[] for the LLM\n const toolDefs = mcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n }));\n\n // Create LLM client\n let client;\n if (config.provider === \"anthropic\") {\n client = createAnthropicClient(config.apiKey, model);\n } else if (config.provider === \"ollama\") {\n client = createOllamaClient(model);\n } else {\n client = createOpenAIClient(config.apiKey, model);\n }\n\n p.log.success(`${pc.bold(aiName)} is ready. Model: ${pc.dim(model)}`);\n\n // Run the agent\n await runAgent(\n client,\n systemPrompt,\n aiName,\n model,\n toolDefs.length > 0 ? toolDefs : undefined,\n toolDefs.length > 0 ? mcpManager : undefined,\n config.hooks,\n );\n\n // Cleanup on exit\n await mcpManager.disconnect();\n });\n\nprogram\n .command(\"init\")\n .description(\"Set up your AI companion with a guided wizard\")\n .action(async () => {\n p.intro(pc.bold(\"aman agent init\") + pc.dim(\" — set up your companion\"));\n\n const name = (await p.text({\n message: \"What should your companion be called?\",\n placeholder: \"Aman\",\n defaultValue: \"Aman\",\n })) as string;\n if (p.isCancel(name)) process.exit(0);\n\n const preset = (await p.select({\n message: \"What kind of companion do you need?\",\n options: [\n { value: \"coding\", label: \"Coding Partner\", hint: \"direct, technical, concise\" },\n { value: \"creative\", label: \"Creative Collaborator\", hint: \"warm, imaginative\" },\n { value: \"assistant\", label: \"Personal Assistant\", hint: \"organized, action-oriented\" },\n { value: \"learning\", label: \"Learning Buddy\", hint: \"patient, Socratic\" },\n { value: \"minimal\", label: \"Minimal\", hint: \"just chat, I'll customize later\" },\n ],\n initialValue: \"coding\",\n })) as PresetName;\n if (p.isCancel(preset)) process.exit(0);\n\n const result = applyPreset(preset, name || \"Aman\");\n const home = os.homedir();\n\n fs.mkdirSync(path.join(home, \".acore\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".acore\", \"core.md\"), result.coreMd, \"utf-8\");\n p.log.success(`Identity created — ${PRESETS[preset].identity.personality.split(\".\")[0].toLowerCase()}`);\n\n if (result.rulesMd) {\n fs.mkdirSync(path.join(home, \".arules\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".arules\", \"rules.md\"), result.rulesMd, \"utf-8\");\n const ruleCount = (result.rulesMd.match(/^- /gm) || []).length;\n p.log.success(`${ruleCount} rules set`);\n }\n\n if (result.flowMd) {\n fs.mkdirSync(path.join(home, \".aflow\"), { recursive: true });\n fs.writeFileSync(path.join(home, \".aflow\", \"flow.md\"), result.flowMd, \"utf-8\");\n const wfCount = (result.flowMd.match(/^## /gm) || []).length;\n p.log.success(`${wfCount} workflow${wfCount > 1 ? \"s\" : \"\"} added`);\n }\n\n // Detect if running via npx (temp install)\n const isNpx = process.argv[1]?.includes(\"_npx\") || !process.argv[1]?.includes(\"node_modules/.bin\");\n\n p.outro(\"Your companion is ready.\");\n\n console.log(\"\");\n if (isNpx) {\n console.log(` ${pc.bold(\"Start chatting:\")} npx @aman_asmuei/aman-agent`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Tip: Install globally to use\")} ${pc.bold(\"aman-agent\")} ${pc.dim(\"directly:\")}`);\n console.log(` ${pc.dim(\" npm install -g @aman_asmuei/aman-agent\")}`);\n } else {\n console.log(` ${pc.bold(\"Start chatting:\")} aman-agent`);\n }\n console.log(\"\");\n console.log(` ${pc.dim(\"Add tools:\")} npx @aman_asmuei/akit add github`);\n console.log(` ${pc.dim(\"Browse:\")} npx @aman_asmuei/akit search <query>`);\n console.log(\"\");\n });\n\nprogram.parse();\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface HooksConfig {\n memoryRecall?: boolean;\n sessionResume?: boolean;\n rulesCheck?: boolean;\n workflowSuggest?: boolean;\n evalPrompt?: boolean;\n autoSessionSave?: boolean;\n extractMemories?: boolean;\n featureHints?: boolean;\n personalityAdapt?: boolean;\n}\n\nconst DEFAULT_HOOKS: HooksConfig = {\n memoryRecall: true,\n sessionResume: true,\n rulesCheck: true,\n workflowSuggest: true,\n evalPrompt: true,\n autoSessionSave: true,\n extractMemories: true,\n featureHints: true,\n personalityAdapt: true,\n};\n\nexport interface McpServerEntry {\n command: string;\n args: string[];\n env?: Record<string, string>;\n}\n\nexport interface AgentConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\n hooks?: HooksConfig;\n mcpServers?: Record<string, McpServerEntry>;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".aman-agent\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\nexport function loadConfig(): AgentConfig | null {\n if (!fs.existsSync(CONFIG_PATH)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as AgentConfig;\n raw.hooks = { ...DEFAULT_HOOKS, ...raw.hooks };\n return raw;\n } catch {\n return null;\n }\n}\n\nexport function saveConfig(config: AgentConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(\n CONFIG_PATH,\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport function configExists(): boolean {\n return fs.existsSync(CONFIG_PATH);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { estimateTokens, buildBudgetedPrompt } from \"./token-budget.js\";\nimport type { PromptComponent } from \"./token-budget.js\";\n\ninterface EcosystemFile {\n name: string;\n dir: string;\n file: string;\n profileOverridable?: boolean; // can be overridden by profile-specific file\n}\n\nconst ECOSYSTEM_FILES: EcosystemFile[] = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\", profileOverridable: true },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"guardrails\", dir: \".arules\", file: \"rules.md\", profileOverridable: true },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\", profileOverridable: true },\n];\n\n/**\n * Resolve the file path for an ecosystem layer, checking profile override first.\n */\nfunction resolveLayerPath(entry: EcosystemFile, home: string, profile?: string): string | null {\n // Check profile-specific override first\n if (profile && entry.profileOverridable) {\n const profilePath = path.join(home, \".acore\", \"profiles\", profile, entry.file);\n if (fs.existsSync(profilePath)) return profilePath;\n\n // For rules/skills, also check profile dir with original filename\n if (entry.name === \"guardrails\") {\n const altPath = path.join(home, \".acore\", \"profiles\", profile, \"rules.md\");\n if (fs.existsSync(altPath)) return altPath;\n }\n if (entry.name === \"skills\") {\n const altPath = path.join(home, \".acore\", \"profiles\", profile, \"skills.md\");\n if (fs.existsSync(altPath)) return altPath;\n }\n }\n\n // Fall back to global path\n const globalPath = path.join(home, entry.dir, entry.file);\n if (fs.existsSync(globalPath)) return globalPath;\n\n return null;\n}\n\nexport function assembleSystemPrompt(\n maxTokens?: number,\n profile?: string,\n): {\n prompt: string;\n layers: string[];\n truncated: string[];\n totalTokens: number;\n profile?: string;\n} {\n const home = os.homedir();\n const components: PromptComponent[] = [];\n\n for (const entry of ECOSYSTEM_FILES) {\n const filePath = resolveLayerPath(entry, home, profile);\n if (filePath) {\n const content = fs.readFileSync(filePath, \"utf-8\").trim();\n components.push({\n name: entry.name,\n content,\n tokens: estimateTokens(content),\n });\n }\n }\n\n // Project context (not prioritized — appended as extra)\n const contextPath = path.join(process.cwd(), \".acore\", \"context.md\");\n if (fs.existsSync(contextPath)) {\n const content = fs.readFileSync(contextPath, \"utf-8\").trim();\n components.push({\n name: \"context\",\n content,\n tokens: estimateTokens(content),\n });\n }\n\n const budgeted = buildBudgetedPrompt(components, maxTokens);\n\n return {\n prompt: budgeted.prompt,\n layers: budgeted.included,\n truncated: budgeted.truncated,\n totalTokens: budgeted.totalTokens,\n profile,\n };\n}\n\n/**\n * List available profiles.\n */\nexport function listProfiles(): Array<{ name: string; aiName: string; personality: string }> {\n const profilesDir = path.join(os.homedir(), \".acore\", \"profiles\");\n if (!fs.existsSync(profilesDir)) return [];\n\n const profiles: Array<{ name: string; aiName: string; personality: string }> = [];\n for (const entry of fs.readdirSync(profilesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const corePath = path.join(profilesDir, entry.name, \"core.md\");\n if (!fs.existsSync(corePath)) continue;\n\n const content = fs.readFileSync(corePath, \"utf-8\");\n const nameMatch = content.match(/^# (.+)/m);\n const personalityMatch = content.match(/- Personality:\\s*(.+)/);\n\n profiles.push({\n name: entry.name,\n aiName: nameMatch?.[1]?.trim() || entry.name,\n personality: personalityMatch?.[1]?.trim() || \"default\",\n });\n }\n\n return profiles;\n}\n\n/**\n * Get the AI name for a profile (or default).\n */\nexport function getProfileAiName(profile?: string): string {\n const home = os.homedir();\n let corePath: string;\n\n if (profile) {\n const profileCorePath = path.join(home, \".acore\", \"profiles\", profile, \"core.md\");\n corePath = fs.existsSync(profileCorePath) ? profileCorePath : path.join(home, \".acore\", \"core.md\");\n } else {\n corePath = path.join(home, \".acore\", \"core.md\");\n }\n\n if (!fs.existsSync(corePath)) return \"Assistant\";\n const content = fs.readFileSync(corePath, \"utf-8\");\n const match = content.match(/^# (.+)$/m);\n return match?.[1]?.trim() || \"Assistant\";\n}\n","// Rough token estimation: ~1.3 tokens per word for English markdown\nexport function estimateTokens(text: string): number {\n return Math.round(text.split(/\\s+/).filter(Boolean).length * 1.3);\n}\n\n// Priority order for system prompt components (highest to lowest)\nconst PRIORITIES = [\n \"identity\", // core.md — always include\n \"guardrails\", // rules.md — safety critical\n \"workflows\", // flow.md — behavioral\n \"tools\", // kit.md — capabilities\n \"skills\", // skills.md — can be truncated\n];\n\nexport interface PromptComponent {\n name: string;\n content: string;\n tokens: number;\n}\n\nexport function buildBudgetedPrompt(\n components: PromptComponent[],\n maxTokens: number = 8000, // default budget for system prompt\n): { prompt: string; included: string[]; truncated: string[]; totalTokens: number } {\n const included: string[] = [];\n const truncated: string[] = [];\n const parts: string[] = [];\n let totalTokens = 0;\n\n // Sort by priority\n const sorted = [...components].sort((a, b) => {\n const aPri = PRIORITIES.indexOf(a.name);\n const bPri = PRIORITIES.indexOf(b.name);\n return (aPri === -1 ? 99 : aPri) - (bPri === -1 ? 99 : bPri);\n });\n\n for (const comp of sorted) {\n if (totalTokens + comp.tokens <= maxTokens) {\n parts.push(comp.content);\n included.push(comp.name);\n totalTokens += comp.tokens;\n } else {\n // Try to include a truncated version (first 50% of content)\n const halfContent = comp.content.slice(0, Math.floor(comp.content.length / 2));\n const halfTokens = estimateTokens(halfContent);\n if (totalTokens + halfTokens <= maxTokens) {\n parts.push(halfContent + \"\\n\\n[... truncated for context budget ...]\");\n included.push(comp.name + \" (partial)\");\n totalTokens += halfTokens;\n } else {\n truncated.push(comp.name);\n }\n }\n }\n\n return {\n prompt: parts.join(\"\\n\\n---\\n\\n\"),\n included,\n truncated,\n totalTokens,\n };\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n ContentBlock,\n} from \"./types.js\";\n\nfunction toAnthropicMessages(\n messages: Message[],\n): Anthropic.Messages.MessageParam[] {\n return messages.map((m) => {\n if (typeof m.content === \"string\") {\n return { role: m.role, content: m.content };\n }\n // Complex content blocks (text, image, tool_use, tool_result)\n return {\n role: m.role,\n content: m.content.map((block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text };\n }\n if (block.type === \"image\") {\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: block.source.media_type,\n data: block.source.data,\n },\n };\n }\n if (block.type === \"tool_use\") {\n return {\n type: \"tool_use\" as const,\n id: block.id,\n name: block.name,\n input: block.input,\n };\n }\n if (block.type === \"tool_result\") {\n return {\n type: \"tool_result\" as const,\n tool_use_id: block.tool_use_id,\n content: block.content,\n };\n }\n return { type: \"text\" as const, text: \"\" };\n }),\n };\n });\n}\n\nexport function createAnthropicClient(\n apiKey: string,\n model: string,\n): LLMClient {\n const client = new Anthropic({ apiKey });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const anthropicMessages = toAnthropicMessages(messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolUseBlocks: Array<{\n id: string;\n name: string;\n inputJson: string;\n }> = [];\n let currentBlockType: \"text\" | \"tool_use\" | null = null;\n let currentBlockIndex = -1;\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema:\n t.input_schema as Anthropic.Messages.Tool[\"input_schema\"],\n }));\n }\n\n const stream = await client.messages.create(\n createParams as unknown as Anthropic.Messages.MessageCreateParamsStreaming,\n );\n\n for await (const event of stream) {\n if (event.type === \"content_block_start\") {\n currentBlockIndex = event.index;\n if (event.content_block.type === \"text\") {\n currentBlockType = \"text\";\n } else if (event.content_block.type === \"tool_use\") {\n currentBlockType = \"tool_use\";\n toolUseBlocks.push({\n id: event.content_block.id,\n name: event.content_block.name,\n inputJson: \"\",\n });\n }\n } else if (event.type === \"content_block_delta\") {\n if (\n currentBlockType === \"text\" &&\n event.delta.type === \"text_delta\"\n ) {\n const text = event.delta.text;\n fullText += text;\n onChunk({ type: \"text\", text });\n } else if (\n currentBlockType === \"tool_use\" &&\n event.delta.type === \"input_json_delta\"\n ) {\n const lastTool = toolUseBlocks[toolUseBlocks.length - 1];\n if (lastTool) {\n lastTool.inputJson += event.delta.partial_json;\n }\n }\n } else if (event.type === \"content_block_stop\") {\n currentBlockType = null;\n }\n }\n\n // Parse tool inputs from accumulated JSON\n const toolUses = toolUseBlocks.map((block) => ({\n id: block.id,\n name: block.name,\n input: (block.inputJson\n ? JSON.parse(block.inputJson)\n : {}) as Record<string, unknown>,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build content blocks for the message\n if (toolUses.length > 0) {\n const contentBlocks: ContentBlock[] = [];\n if (fullText) {\n contentBlocks.push({ type: \"text\" as const, text: fullText });\n }\n for (const tu of toolUses) {\n contentBlocks.push({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n });\n }\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (error instanceof Anthropic.AuthenticationError) {\n throw new Error(\n \"Invalid API key. Run with --model flag or delete ~/.aman-agent/config.json to reconfigure.\",\n );\n }\n if (error instanceof Anthropic.RateLimitError) {\n throw new Error(\"Rate limited by Anthropic. Please wait and retry.\");\n }\n throw error;\n }\n },\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n} from \"./types.js\";\n\nfunction toOpenAIMessages(\n systemPrompt: string,\n messages: Message[],\n): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [\n { role: \"system\", content: systemPrompt },\n ];\n\n for (const m of messages) {\n if (typeof m.content === \"string\") {\n result.push({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n });\n } else if (m.role === \"assistant\") {\n // Assistant message with tool calls\n const textParts = m.content.filter((b) => b.type === \"text\");\n const toolUseParts = m.content.filter((b) => b.type === \"tool_use\");\n const text = textParts.map((b) => (\"text\" in b ? b.text : \"\")).join(\"\");\n\n if (toolUseParts.length > 0) {\n result.push({\n role: \"assistant\",\n content: text || null,\n tool_calls: toolUseParts.map((b) => ({\n id: \"id\" in b ? b.id : \"\",\n type: \"function\" as const,\n function: {\n name: \"name\" in b ? b.name : \"\",\n arguments: JSON.stringify(\"input\" in b ? b.input : {}),\n },\n })),\n });\n } else {\n result.push({ role: \"assistant\", content: text });\n }\n } else if (m.role === \"user\") {\n // Check if it contains tool results\n const toolResults = m.content.filter((b) => b.type === \"tool_result\");\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n if (tr.type === \"tool_result\") {\n result.push({\n role: \"tool\",\n tool_call_id: tr.tool_use_id,\n content: tr.content,\n });\n }\n }\n } else {\n // User message — may contain text + images\n const hasImages = m.content.some((b) => b.type === \"image\");\n if (hasImages) {\n const parts: Array<Record<string, unknown>> = [];\n for (const b of m.content) {\n if (b.type === \"text\") {\n parts.push({ type: \"text\", text: b.text });\n } else if (b.type === \"image\") {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${b.source.media_type};base64,${b.source.data}`,\n },\n });\n }\n }\n result.push({ role: \"user\", content: parts as never });\n } else {\n const text = m.content\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n result.push({ role: \"user\", content: text });\n }\n }\n }\n }\n\n return result;\n}\n\nexport function createOpenAIClient(apiKey: string, model: string): LLMClient {\n const client = new OpenAI({ apiKey });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const openaiMessages = toOpenAIMessages(systemPrompt, messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolCallAccumulators: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n messages: openaiMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n const stream = await client.chat.completions.create(\n createParams as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming,\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n // Stream text content\n if (delta.content) {\n fullText += delta.content;\n onChunk({ type: \"text\", text: delta.content });\n }\n\n // Accumulate tool calls\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let acc = toolCallAccumulators.get(idx);\n if (!acc) {\n acc = { id: \"\", name: \"\", arguments: \"\" };\n toolCallAccumulators.set(idx, acc);\n }\n if (tc.id) {\n acc.id = tc.id;\n }\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n }\n }\n }\n }\n\n // Parse accumulated tool calls\n const toolUses = Array.from(toolCallAccumulators.entries())\n .sort(([a], [b]) => a - b)\n .map(([, acc]) => ({\n id: acc.id,\n name: acc.name,\n input: JSON.parse(acc.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build response\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(fullText\n ? [{ type: \"text\" as const, text: fullText }]\n : []),\n ...toolUses.map((tu) => ({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n })),\n ];\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (error instanceof OpenAI.AuthenticationError) {\n throw new Error(\n \"Invalid API key. Run with --model flag or delete ~/.aman-agent/config.json to reconfigure.\",\n );\n }\n if (error instanceof OpenAI.RateLimitError) {\n throw new Error(\"Rate limited by OpenAI. Please wait and retry.\");\n }\n throw error;\n }\n },\n };\n}\n","import OpenAI from \"openai\";\nimport type {\n LLMClient,\n Message,\n StreamChunk,\n ToolDefinition,\n ChatResponse,\n} from \"./types.js\";\n\nfunction toOllamaMessages(\n systemPrompt: string,\n messages: Message[],\n): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n const result: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [\n { role: \"system\", content: systemPrompt },\n ];\n\n for (const m of messages) {\n if (typeof m.content === \"string\") {\n result.push({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n });\n } else if (m.role === \"assistant\") {\n const textParts = m.content.filter((b) => b.type === \"text\");\n const toolUseParts = m.content.filter((b) => b.type === \"tool_use\");\n const text = textParts.map((b) => (\"text\" in b ? b.text : \"\")).join(\"\");\n\n if (toolUseParts.length > 0) {\n result.push({\n role: \"assistant\",\n content: text || null,\n tool_calls: toolUseParts.map((b) => ({\n id: \"id\" in b ? b.id : \"\",\n type: \"function\" as const,\n function: {\n name: \"name\" in b ? b.name : \"\",\n arguments: JSON.stringify(\"input\" in b ? b.input : {}),\n },\n })),\n });\n } else {\n result.push({ role: \"assistant\", content: text });\n }\n } else if (m.role === \"user\") {\n const toolResults = m.content.filter((b) => b.type === \"tool_result\");\n if (toolResults.length > 0) {\n for (const tr of toolResults) {\n if (tr.type === \"tool_result\") {\n result.push({\n role: \"tool\",\n tool_call_id: tr.tool_use_id,\n content: tr.content,\n });\n }\n }\n } else {\n // User message — may contain text + images\n const hasImages = m.content.some((b) => b.type === \"image\");\n if (hasImages) {\n const parts: Array<Record<string, unknown>> = [];\n for (const b of m.content) {\n if (b.type === \"text\") {\n parts.push({ type: \"text\", text: b.text });\n } else if (b.type === \"image\") {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${b.source.media_type};base64,${b.source.data}`,\n },\n });\n }\n }\n result.push({ role: \"user\", content: parts as never });\n } else {\n const text = m.content\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n result.push({ role: \"user\", content: text });\n }\n }\n }\n }\n\n return result;\n}\n\nexport function createOllamaClient(\n model: string,\n baseURL?: string,\n): LLMClient {\n const client = new OpenAI({\n baseURL: baseURL || \"http://localhost:11434/v1\",\n apiKey: \"ollama\", // Ollama doesn't require a real key\n });\n\n return {\n async chat(\n systemPrompt: string,\n messages: Message[],\n onChunk: (chunk: StreamChunk) => void,\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const ollamaMessages = toOllamaMessages(systemPrompt, messages);\n const hasTools = tools && tools.length > 0;\n\n try {\n let fullText = \"\";\n const toolCallAccumulators: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n const createParams: Record<string, unknown> = {\n model,\n max_tokens: 8192,\n messages: ollamaMessages,\n stream: true,\n };\n\n if (hasTools) {\n createParams.tools = tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n }\n\n const stream = await client.chat.completions.create(\n createParams as unknown as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming,\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n // Stream text content\n if (delta.content) {\n fullText += delta.content;\n onChunk({ type: \"text\", text: delta.content });\n }\n\n // Accumulate tool calls\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let acc = toolCallAccumulators.get(idx);\n if (!acc) {\n acc = { id: \"\", name: \"\", arguments: \"\" };\n toolCallAccumulators.set(idx, acc);\n }\n if (tc.id) {\n acc.id = tc.id;\n }\n if (tc.function?.name) {\n acc.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n acc.arguments += tc.function.arguments;\n }\n }\n }\n }\n\n // Parse accumulated tool calls\n const toolUses = Array.from(toolCallAccumulators.entries())\n .sort(([a], [b]) => a - b)\n .map(([, acc]) => ({\n id: acc.id,\n name: acc.name,\n input: JSON.parse(acc.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n // Signal done\n onChunk({ type: \"done\" });\n\n // Build response\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(fullText\n ? [{ type: \"text\" as const, text: fullText }]\n : []),\n ...toolUses.map((tu) => ({\n type: \"tool_use\" as const,\n id: tu.id,\n name: tu.name,\n input: tu.input,\n })),\n ];\n return {\n message: { role: \"assistant\", content: contentBlocks },\n toolUses,\n };\n }\n\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"ECONNREFUSED\")\n ) {\n throw new Error(\n \"Cannot connect to Ollama. Make sure it's running: ollama serve\",\n );\n }\n throw error;\n }\n },\n };\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { log } from \"../logger.js\";\nimport { withRetry } from \"../retry.js\";\n\ninterface McpConnection {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n serverName: string;\n}\n\nexport class McpManager {\n private connections: McpConnection[] = [];\n private tools: ToolDef[] = [];\n\n async connect(\n name: string,\n command: string,\n args: string[],\n ): Promise<void> {\n try {\n const transport = new StdioClientTransport({ command, args, stderr: \"pipe\" });\n const client = new Client({\n name: `aman-agent-${name}`,\n version: \"0.1.0\",\n });\n await client.connect(transport);\n\n // Redirect stderr to debug log instead of terminal\n if (transport.stderr) {\n transport.stderr.on(\"data\", (chunk: Buffer) => {\n log.debug(\"mcp\", `[${name} stderr] ${chunk.toString().trim()}`);\n });\n }\n\n this.connections.push({ name, client, transport });\n\n // List tools from this server\n const toolsResult = await client.listTools();\n for (const tool of toolsResult.tools) {\n this.tools.push({\n name: tool.name,\n description: tool.description || \"\",\n input_schema: tool.inputSchema as Record<string, unknown>,\n serverName: name,\n });\n }\n } catch (err) {\n log.error(\"mcp\", \"Failed to connect to \" + name + \" MCP server\", err);\n console.error(` Warning: Could not connect to ${name} MCP server`);\n }\n }\n\n getTools(): ToolDef[] {\n return this.tools;\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const tool = this.tools.find((t) => t.name === toolName);\n if (!tool) return `Error: tool ${toolName} not found`;\n\n const conn = this.connections.find((c) => c.name === tool.serverName);\n if (!conn) return `Error: server ${tool.serverName} not connected`;\n\n try {\n const result = await withRetry(\n () => conn.client.callTool({ name: toolName, arguments: args }),\n { maxAttempts: 2, baseDelay: 500, retryable: (err) => err.message.includes(\"ETIMEDOUT\") || err.message.includes(\"timeout\") },\n );\n // Extract text from result\n if (result.content && Array.isArray(result.content)) {\n return (result.content as Array<{ type: string; text?: string }>)\n .filter((c) => c.type === \"text\")\n .map((c) => c.text ?? \"\")\n .join(\"\\n\");\n }\n return JSON.stringify(result);\n } catch (error) {\n return `Error calling ${toolName}: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n\n async disconnect(): Promise<void> {\n for (const conn of this.connections) {\n try {\n await conn.client.close();\n } catch (err) {\n log.debug(\"mcp\", \"Cleanup error disconnecting \" + conn.name, err);\n }\n }\n this.connections = [];\n this.tools = [];\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst LOG_DIR = path.join(os.homedir(), \".aman-agent\");\nexport const LOG_PATH = path.join(LOG_DIR, \"debug.log\");\nconst MAX_LOG_SIZE = 1_048_576; // 1MB\n\ninterface LogEntry {\n timestamp: string;\n level: \"debug\" | \"warn\" | \"error\";\n module: string;\n message: string;\n data?: string;\n}\n\nfunction ensureDir(): void {\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n}\n\nfunction maybeRotate(): void {\n try {\n if (!fs.existsSync(LOG_PATH)) return;\n const stat = fs.statSync(LOG_PATH);\n if (stat.size >= MAX_LOG_SIZE) {\n const backupPath = LOG_PATH + \".1\";\n if (fs.existsSync(backupPath)) fs.unlinkSync(backupPath);\n fs.renameSync(LOG_PATH, backupPath);\n }\n } catch {\n // Rotation failure is non-critical\n }\n}\n\nfunction write(level: LogEntry[\"level\"], module: string, message: string, data?: unknown): void {\n try {\n ensureDir();\n maybeRotate();\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n module,\n message,\n };\n if (data !== undefined) {\n entry.data = data instanceof Error ? data.message : String(data);\n }\n fs.appendFileSync(LOG_PATH, JSON.stringify(entry) + \"\\n\");\n } catch {\n // Logger must never throw\n }\n}\n\nexport const log = {\n debug: (module: string, message: string, data?: unknown) => write(\"debug\", module, message, data),\n warn: (module: string, message: string, data?: unknown) => write(\"warn\", module, message, data),\n error: (module: string, message: string, data?: unknown) => write(\"error\", module, message, data),\n};\n","export interface RetryOptions {\n maxAttempts: number;\n baseDelay: number;\n retryable: (err: Error) => boolean;\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions,\n): Promise<T> {\n const { maxAttempts, baseDelay, retryable } = options;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n if (!retryable(lastError) || attempt === maxAttempts) {\n throw lastError;\n }\n const delay = baseDelay * Math.pow(2, attempt - 1) * (0.5 + Math.random() * 0.5);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import * as readline from \"node:readline\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport { marked } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport logUpdate from \"log-update\";\nimport type {\n LLMClient,\n Message,\n ContentBlock,\n ToolDefinition,\n ToolResultBlock,\n ImageBlock,\n StreamChunk,\n} from \"./llm/types.js\";\nimport { handleCommand } from \"./commands.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport {\n onSessionStart,\n onBeforeToolExec,\n onWorkflowMatch,\n onSessionEnd,\n getSessionStartTime,\n type HookContext,\n} from \"./hooks.js\";\nimport {\n computePersonality,\n syncPersonalityToCore,\n formatWellbeingNudge,\n} from \"./personality.js\";\nimport type { HooksConfig } from \"./config.js\";\nimport { trimConversation } from \"./context-manager.js\";\nimport { log } from \"./logger.js\";\nimport { withRetry } from \"./retry.js\";\nimport { extractMemories as runExtraction, type ExtractorState } from \"./memory-extractor.js\";\nimport { memoryRecall, memoryLog } from \"./memory.js\";\nimport { autoTriggerSkills, matchKnowledge } from \"./skill-engine.js\";\nimport { BackgroundTaskManager, shouldRunInBackground } from \"./background.js\";\nimport { getActivePlan, formatPlanForPrompt } from \"./plans.js\";\nimport { delegateTask } from \"./delegate.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { listTeams, loadTeam, runTeam, formatTeamResult } from \"./teams.js\";\nimport { humanizeError } from \"./errors.js\";\nimport { getHint, loadShownHints, saveShownHints, type HintState } from \"./hints.js\";\n\n// markedTerminal() returns a MarkedExtension — types lag behind, cast is safe\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal() as any);\n\ninterface AgentRecallResult {\n text: string;\n tokenEstimate: number;\n}\n\nasync function recallForMessage(\n input: string,\n): Promise<AgentRecallResult | null> {\n try {\n const result = await memoryRecall(input, { limit: 5, compact: true });\n if (result.total === 0) {\n return null;\n }\n const tokenEstimate = result.tokenEstimate ?? Math.round(result.text.split(/\\s+/).filter(Boolean).length * 1.3);\n return {\n text: `\\n\\n<relevant-memories>\\n${result.text}\\n</relevant-memories>`,\n tokenEstimate,\n };\n } catch (err) {\n log.debug(\"agent\", \"memory recall failed\", err);\n return null;\n }\n}\n\n// Generate a session ID for conversation logging\nfunction generateSessionId(): string {\n const now = new Date();\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `session-${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}`;\n}\n\nexport async function runAgent(\n client: LLMClient,\n systemPrompt: string,\n aiName: string,\n model: string,\n tools?: ToolDefinition[],\n mcpManager?: McpManager,\n hooksConfig?: HooksConfig,\n): Promise<void> {\n const messages: Message[] = [];\n const sessionId = generateSessionId();\n const extractorState: ExtractorState = { turnsSinceLastExtraction: 0, lastExtractionCount: 0 };\n const bgTasks = new BackgroundTaskManager();\n\n // Add virtual tools for delegation and teams\n const profiles = listProfiles();\n const teams = listTeams();\n if (tools && (profiles.length > 0 || teams.length > 0)) {\n const virtualTools: ToolDefinition[] = [];\n\n if (profiles.length > 0) {\n virtualTools.push({\n name: \"delegate_task\",\n description: `Delegate a task to a specialist sub-agent with a different profile. Available profiles: ${profiles.map((p) => `${p.name} (${p.personality})`).join(\", \")}. IMPORTANT: Always ask the user for permission before delegating.`,\n input_schema: {\n type: \"object\",\n properties: {\n profile: { type: \"string\", description: \"Profile name to delegate to\" },\n task: { type: \"string\", description: \"The task description for the sub-agent\" },\n },\n required: [\"profile\", \"task\"],\n },\n });\n }\n\n if (teams.length > 0) {\n virtualTools.push({\n name: \"team_run\",\n description: `Run a task with a named agent team. Available teams: ${teams.map((t) => `${t.name} (${t.workflow}: ${t.members.map((m) => m.profile).join(\"→\")})`).join(\", \")}. IMPORTANT: Always ask the user for permission before running a team.`,\n input_schema: {\n type: \"object\",\n properties: {\n team: { type: \"string\", description: \"Team name\" },\n task: { type: \"string\", description: \"The task for the team\" },\n },\n required: [\"team\", \"task\"],\n },\n });\n }\n\n tools = [...tools, ...virtualTools];\n }\n const hintState: HintState = {\n turnCount: 0,\n shownHints: loadShownHints(),\n hintShownThisSession: false,\n };\n\n const isRetryable = (err: Error) =>\n err.message.includes(\"Rate limit\") ||\n err.message.includes(\"rate limit\") ||\n err.message.includes(\"ECONNRESET\") ||\n err.message.includes(\"ETIMEDOUT\") ||\n err.message.includes(\"fetch failed\");\n\n let responseBuffer = \"\";\n\n const onChunkHandler = (chunk: StreamChunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n responseBuffer += chunk.text;\n if (process.stdout.isTTY) {\n logUpdate(responseBuffer);\n } else {\n process.stdout.write(chunk.text);\n }\n }\n if (chunk.type === \"done\") {\n if (process.stdout.isTTY && responseBuffer.trim()) {\n try {\n const rendered = marked(responseBuffer.trim()) as string;\n logUpdate(rendered);\n logUpdate.done();\n } catch {\n logUpdate.done();\n }\n } else {\n process.stdout.write(\"\\n\");\n }\n responseBuffer = \"\";\n }\n };\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Handle Ctrl+C gracefully\n rl.on(\"SIGINT\", async () => {\n // Wait for background tasks before exiting\n if (bgTasks.pendingCount > 0) {\n await bgTasks.waitAll();\n bgTasks.displayCompleted();\n }\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n await onSessionEnd(hookCtx, messages, sessionId);\n } catch (err) { log.debug(\"agent\", \"session end hook failed on SIGINT\", err); }\n }\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n process.exit(0);\n });\n\n const prompt = (): Promise<string> => {\n return new Promise<string>((resolve) => {\n rl.question(pc.green(\"\\nYou > \"), (answer) => {\n resolve(answer);\n });\n });\n };\n\n console.log(\n `\\nType a message, ${pc.dim(\"/help\")} for commands, or ${pc.dim(\"/quit\")} to exit.\\n`,\n );\n\n if (mcpManager && hooksConfig) {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n try {\n const session = await onSessionStart(hookCtx);\n\n if (!session.firstRun) {\n if (session.resumeTopic) {\n console.log(pc.dim(` Welcome back. Last time we talked about ${session.resumeTopic}`));\n } else {\n console.log(pc.dim(\" Welcome back.\"));\n }\n }\n\n if (session.visibleReminders && session.visibleReminders.length > 0) {\n for (const reminder of session.visibleReminders) {\n console.log(pc.yellow(` Reminder: ${reminder}`));\n }\n }\n\n if (session.contextInjection) {\n messages.push({ role: \"user\", content: session.contextInjection });\n if (session.firstRun) {\n messages.push({ role: \"assistant\", content: \"acknowledged\" });\n } else {\n messages.push({ role: \"assistant\", content: \"I have context from our previous sessions. How can I help?\" });\n }\n }\n } catch (err) { log.warn(\"agent\", \"session start hook failed\", err); }\n }\n\n while (true) {\n // Check for completed background tasks\n if (bgTasks.hasCompleted) {\n const bgOutputs = bgTasks.displayCompleted();\n for (const output of bgOutputs) {\n messages.push({ role: \"user\", content: output });\n }\n }\n\n const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = await handleCommand(input, { model, mcpManager, llmClient: client, tools });\n if (cmdResult.handled) {\n if (cmdResult.quit) {\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n await onSessionEnd(hookCtx, messages, sessionId);\n } catch (err) { log.debug(\"agent\", \"session end hook failed on quit\", err); }\n }\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n return;\n }\n if (cmdResult.exportConversation) {\n try {\n const exportDir = path.join(os.homedir(), \".aman-agent\", \"exports\");\n fs.mkdirSync(exportDir, { recursive: true });\n const exportPath = path.join(exportDir, `${sessionId}.md`);\n\n const lines: string[] = [\n `# Conversation — ${new Date().toLocaleString()}`,\n `**Model:** ${model}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n const label = msg.role === \"user\" ? \"**You:**\" : `**${aiName}:**`;\n lines.push(`${label} ${msg.content}`, \"\");\n }\n }\n\n fs.writeFileSync(exportPath, lines.join(\"\\n\"), \"utf-8\");\n console.log(pc.green(`Exported to ${exportPath}`));\n } catch {\n console.log(pc.red(\"Failed to export conversation.\"));\n }\n continue;\n }\n if (cmdResult.saveConversation) {\n try {\n await saveConversationToMemory(messages, sessionId);\n console.log(pc.green(\"Conversation saved to memory.\"));\n } catch {\n console.log(pc.red(\"Failed to save conversation.\"));\n }\n continue;\n }\n if (cmdResult.output) {\n console.log(cmdResult.output);\n }\n if (cmdResult.clearHistory) {\n messages.length = 0;\n }\n continue;\n }\n\n // Check for workflow match\n let activeSystemPrompt = systemPrompt;\n if (mcpManager && hooksConfig) {\n try {\n const hookCtx: HookContext = { mcpManager, config: hooksConfig };\n const wfMatch = await onWorkflowMatch(input, hookCtx);\n if (wfMatch) {\n const useIt = await new Promise<boolean>((resolve) => {\n rl.question(pc.dim(` Workflow \"${wfMatch.name}\" matches. Use it? (y/N) `), (answer) => resolve(answer.toLowerCase() === \"y\"));\n });\n if (useIt) {\n activeSystemPrompt = systemPrompt + `\\n\\n<active-workflow>\\n${wfMatch.steps}\\n</active-workflow>`;\n console.log(pc.dim(` Using \"${wfMatch.name}\" workflow.`));\n }\n }\n } catch (err) { log.debug(\"agent\", \"workflow match failed\", err); }\n }\n\n // Inject active plan into context\n const activePlan = getActivePlan();\n if (activePlan) {\n activeSystemPrompt += \"\\n\\n\" + formatPlanForPrompt(activePlan);\n }\n\n // Auto-trigger skills based on conversation context\n if (mcpManager) {\n try {\n const skillContext = await autoTriggerSkills(input, mcpManager);\n if (skillContext) {\n activeSystemPrompt += \"\\n\\n\" + skillContext;\n }\n } catch (err) { log.debug(\"agent\", \"skill auto-trigger failed\", err); }\n\n // Auto-suggest knowledge library items\n const knowledgeItem = matchKnowledge(input);\n if (knowledgeItem) {\n activeSystemPrompt += `\\n\\n<knowledge name=\"${knowledgeItem.name}\" category=\"${knowledgeItem.category}\">\n${knowledgeItem.description}\n\n${knowledgeItem.content}\n</knowledge>`;\n }\n }\n\n // Auto-trim conversation if approaching token limits\n await trimConversation(messages, client);\n\n // Detect and process file paths + image URLs in user input\n const textExts = new Set([\n \".txt\", \".md\", \".json\", \".js\", \".ts\", \".jsx\", \".tsx\", \".py\",\n \".html\", \".css\", \".yml\", \".yaml\", \".toml\", \".xml\", \".csv\",\n \".sh\", \".bash\", \".zsh\", \".env\", \".cfg\", \".ini\", \".log\",\n \".sql\", \".graphql\", \".rs\", \".go\", \".java\", \".rb\", \".php\",\n \".c\", \".cpp\", \".h\", \".swift\", \".kt\", \".r\", \".lua\",\n ]);\n const imageExts = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\"]);\n const docExts = new Set([\".docx\", \".doc\", \".pdf\", \".pptx\", \".ppt\", \".xlsx\", \".xls\", \".odt\", \".rtf\", \".epub\"]);\n const mimeMap: Record<string, ImageBlock[\"source\"][\"media_type\"]> = {\n \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\", \".webp\": \"image/webp\", \".bmp\": \"image/png\",\n };\n const maxImageBytes = 20 * 1024 * 1024; // 20MB\n\n let textContent = input;\n const imageBlocks: ImageBlock[] = [];\n\n // Detect all local file paths\n const filePathMatches = [...input.matchAll(/(\\/[\\w./-]+|~\\/[\\w./-]+)/g)];\n for (const match of filePathMatches) {\n let filePath = match[1];\n if (filePath.startsWith(\"~/\")) {\n filePath = path.join(os.homedir(), filePath.slice(2));\n }\n if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) continue;\n\n const ext = path.extname(filePath).toLowerCase();\n\n if (imageExts.has(ext)) {\n // Image file — base64 encode\n try {\n const stat = fs.statSync(filePath);\n if (stat.size > maxImageBytes) {\n process.stdout.write(pc.yellow(` [skipped: ${path.basename(filePath)} — exceeds 20MB limit]\\n`));\n continue;\n }\n const data = fs.readFileSync(filePath).toString(\"base64\");\n const mediaType = mimeMap[ext] || \"image/png\";\n imageBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: mediaType, data },\n });\n process.stdout.write(pc.dim(` [attached image: ${path.basename(filePath)} (${(stat.size / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not read image: ${filePath}]\\n`));\n }\n } else if (textExts.has(ext) || ext === \"\") {\n // Text file — inline as XML\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const maxChars = 50000;\n const trimmed = content.length > maxChars\n ? content.slice(0, maxChars) + `\\n\\n[... truncated, ${content.length - maxChars} chars remaining]`\n : content;\n textContent += `\\n\\n<file path=\"${filePath}\" size=\"${content.length} chars\">\\n${trimmed}\\n</file>`;\n process.stdout.write(pc.dim(` [attached: ${path.basename(filePath)} (${(content.length / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not read: ${filePath}]\\n`));\n }\n } else if (docExts.has(ext)) {\n // Binary document — convert via MCP\n if (mcpManager) {\n try {\n process.stdout.write(pc.dim(` [converting: ${path.basename(filePath)}...]\\n`));\n const converted = await mcpManager.callTool(\"doc_convert\", { path: filePath });\n if (converted && !converted.startsWith(\"Error\") && !converted.includes(\"Could not convert\")) {\n textContent += `\\n\\n<file path=\"${filePath}\" format=\"${ext}\">\\n${converted.slice(0, 50000)}\\n</file>`;\n process.stdout.write(pc.dim(` [attached: ${path.basename(filePath)} (converted from ${ext})]\\n`));\n } else {\n textContent += `\\n\\n<file-error path=\"${filePath}\">\\n${converted}\\n</file-error>`;\n process.stdout.write(pc.yellow(` [conversion note: ${converted.split(\"\\n\")[0]}]\\n`));\n }\n } catch {\n process.stdout.write(pc.dim(` [could not convert: ${path.basename(filePath)}]\\n`));\n }\n } else {\n process.stdout.write(pc.yellow(` Binary file (${ext}) — install Docling for document support: pip install docling\\n`));\n }\n }\n }\n\n // Detect image URLs in user input\n const urlImageMatches = [...input.matchAll(/https?:\\/\\/\\S+\\.(?:png|jpg|jpeg|gif|webp)(?:\\?\\S*)?/gi)];\n for (const match of urlImageMatches) {\n const url = match[0];\n try {\n process.stdout.write(pc.dim(` [fetching image: ${url.slice(0, 60)}...]\\n`));\n const response = await fetch(url);\n if (!response.ok) {\n process.stdout.write(pc.yellow(` [could not fetch: HTTP ${response.status}]\\n`));\n continue;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > maxImageBytes) {\n process.stdout.write(pc.yellow(` [skipped: image URL exceeds 20MB limit]\\n`));\n continue;\n }\n const contentType = response.headers.get(\"content-type\") || \"\";\n let mediaType: ImageBlock[\"source\"][\"media_type\"] = \"image/png\";\n if (contentType.includes(\"jpeg\") || contentType.includes(\"jpg\")) mediaType = \"image/jpeg\";\n else if (contentType.includes(\"gif\")) mediaType = \"image/gif\";\n else if (contentType.includes(\"webp\")) mediaType = \"image/webp\";\n else if (contentType.includes(\"png\")) mediaType = \"image/png\";\n\n imageBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: mediaType, data: buffer.toString(\"base64\") },\n });\n process.stdout.write(pc.dim(` [attached image URL: (${(buffer.length / 1024).toFixed(1)}KB)]\\n`));\n } catch {\n process.stdout.write(pc.dim(` [could not fetch image: ${url}]\\n`));\n }\n }\n\n // Build user message: structured ContentBlock[] if images present, string otherwise\n if (imageBlocks.length > 0) {\n const blocks: ContentBlock[] = [\n { type: \"text\", text: textContent },\n ...imageBlocks,\n ];\n messages.push({ role: \"user\", content: blocks });\n } else {\n messages.push({ role: \"user\", content: textContent });\n }\n\n // Per-message memory recall\n let augmentedSystemPrompt = activeSystemPrompt;\n let memoryTokens = 0;\n {\n const recall = await recallForMessage(input);\n if (recall) {\n augmentedSystemPrompt = activeSystemPrompt + recall.text;\n memoryTokens = recall.tokenEstimate;\n }\n }\n\n // Personality refresh with sentiment (every 5 turns)\n const userTurnCount = messages.filter((m) => m.role === \"user\").length;\n if (mcpManager && hooksConfig?.personalityAdapt !== false && userTurnCount > 0 && userTurnCount % 5 === 0) {\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n // Collect recent user messages for sentiment analysis\n const recentUserMsgs = messages\n .filter((m) => m.role === \"user\" && typeof m.content === \"string\")\n .slice(-5)\n .map((m) => m.content as string);\n\n const sessionMinutes = Math.round((Date.now() - getSessionStartTime()) / 60000);\n const state = computePersonality({\n timePeriod: period,\n sessionMinutes,\n turnCount: userTurnCount,\n recentMessages: recentUserMsgs,\n });\n\n syncPersonalityToCore(state, mcpManager).catch(() => {});\n\n const nudge = formatWellbeingNudge(state);\n if (nudge) {\n augmentedSystemPrompt += \"\\n\" + nudge;\n }\n }\n\n const divider = \"─\".repeat(Math.min(process.stdout.columns || 60, 60) - aiName.length - 2);\n process.stdout.write(`\\n ${pc.cyan(pc.bold(aiName))} ${pc.dim(divider)}\\n\\n`);\n\n try {\n let response = await withRetry(\n () => client.chat(augmentedSystemPrompt, messages, onChunkHandler, tools),\n { maxAttempts: 3, baseDelay: 1000, retryable: isRetryable },\n );\n\n // Add assistant message to history\n messages.push(response.message);\n\n // Agentic tool loop: execute tools until LLM stops requesting them\n while (response.toolUses.length > 0 && mcpManager) {\n const toolResults: ToolResultBlock[] = await Promise.all(\n response.toolUses.map(async (toolUse) => {\n if (hooksConfig) {\n const hookCtx: HookContext = { mcpManager: mcpManager!, config: hooksConfig };\n const check = await onBeforeToolExec(toolUse.name, toolUse.input, hookCtx);\n if (!check.allow) {\n process.stdout.write(pc.red(` [BLOCKED: ${check.reason}]\\n`));\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `BLOCKED by guardrail: ${check.reason}`,\n is_error: true,\n };\n }\n }\n\n // Handle delegate_task virtual tool\n if (toolUse.name === \"delegate_task\" && mcpManager) {\n const input = toolUse.input as { profile: string; task: string };\n process.stdout.write(pc.dim(`\\n [delegating to ${input.profile}...]\\n\\n`));\n const result = await delegateTask(input.task, input.profile, client, mcpManager, { tools });\n const output = result.success\n ? `[${input.profile}] completed:\\n\\n${result.response}`\n : `[${input.profile}] failed: ${result.error}`;\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: output,\n };\n }\n\n // Handle team_run virtual tool\n if (toolUse.name === \"team_run\" && mcpManager) {\n const input = toolUse.input as { team: string; task: string };\n const team = loadTeam(input.team);\n if (!team) {\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `Team not found: ${input.team}`,\n is_error: true,\n };\n }\n const result = await runTeam(team, input.task, client, mcpManager, tools);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result.success\n ? formatTeamResult(result)\n : `Team execution failed: ${result.finalOutput}`,\n };\n }\n\n // Check if tool should run in background\n if (shouldRunInBackground(toolUse.name)) {\n const task = bgTasks.launch(toolUse.name, toolUse.id, mcpManager, toolUse.input);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `[${toolUse.name} launched in background (${task.id}). Results will appear when ready. Continue with other work.]`,\n };\n }\n\n process.stdout.write(pc.dim(` [using ${toolUse.name}...]\\n`));\n const result = await mcpManager.callTool(toolUse.name, toolUse.input);\n\n // Log tool observation to memory (passive capture, fire-and-forget)\n const skipLogging = [\"memory_log\", \"memory_recall\", \"memory_context\", \"memory_detail\", \"reminder_check\"].includes(toolUse.name);\n if (!skipLogging) {\n try {\n memoryLog(sessionId, \"system\", `[tool:${toolUse.name}] input=${JSON.stringify(toolUse.input).slice(0, 500)} result=${result.slice(0, 500)}`);\n } catch {}\n }\n\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result,\n };\n }),\n );\n\n // Add tool results as a user message\n messages.push({\n role: \"user\",\n content: toolResults,\n });\n\n // Call LLM again with tool results\n response = await withRetry(\n () => client.chat(augmentedSystemPrompt, messages, onChunkHandler, tools),\n { maxAttempts: 3, baseDelay: 1000, retryable: isRetryable },\n );\n\n // Add assistant response to history\n messages.push(response.message);\n }\n\n // Response footer\n const footerParts: string[] = [];\n if (memoryTokens > 0) footerParts.push(`memories: ~${memoryTokens} tokens`);\n const footer = footerParts.length > 0 ? ` ${footerParts.join(\" | \")}` : \"\";\n const footerDivider = \"─\".repeat(Math.min(process.stdout.columns || 60, 60) - footer.length - 1);\n process.stdout.write(pc.dim(` ${footerDivider}${footer}\\n`));\n\n // Memory extraction (runs silently after response)\n if (hooksConfig?.extractMemories) {\n const assistantText = typeof response.message.content === \"string\"\n ? response.message.content\n : response.message.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n\n if (assistantText) {\n const count = await runExtraction(\n input, assistantText, client, extractorState,\n );\n if (count > 0) {\n process.stdout.write(pc.dim(` [${count} memory${count > 1 ? \"ies\" : \"\"} stored]\\n`));\n }\n }\n } else {\n extractorState.turnsSinceLastExtraction++;\n }\n\n // Progressive hints\n if (hooksConfig?.featureHints) {\n hintState.turnCount++;\n const hasWorkflows = fs.existsSync(path.join(os.homedir(), \".aflow\", \"flow.md\"));\n const memoryCount = memoryTokens > 0 ? Math.floor(memoryTokens / 5) : 0;\n const hint = getHint(hintState, { hasWorkflows, memoryCount });\n if (hint) {\n process.stdout.write(pc.dim(` ${hint}\\n`));\n saveShownHints(hintState.shownHints);\n }\n }\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n const friendly = humanizeError(rawMessage);\n console.error(pc.red(`\\n ${friendly}`));\n // Don't remove the user message — keep for retry\n }\n }\n}\n\n// Save conversation messages to memory log\nasync function saveConversationToMemory(\n messages: Message[],\n sessionId: string,\n): Promise<void> {\n // Save last 50 messages\n const recentMessages = messages.slice(-50);\n\n for (const msg of recentMessages) {\n if (typeof msg.content !== \"string\") continue;\n try {\n memoryLog(sessionId, msg.role, msg.content.slice(0, 5000));\n } catch (err) {\n log.debug(\"agent\", \"memory_log write failed\", err);\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { getEcosystemStatus } from \"./layers/parsers.js\";\nimport { memoryContext, memoryRecall } from \"./memory.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { BUILT_IN_PROFILES, installProfileTemplate } from \"./profile-templates.js\";\nimport { delegateTask, delegatePipeline } from \"./delegate.js\";\nimport {\n createTeam,\n loadTeam,\n listTeams,\n deleteTeam,\n runTeam,\n formatTeam,\n formatTeamResult,\n BUILT_IN_TEAMS,\n type Team,\n} from \"./teams.js\";\nimport {\n createPlan,\n getActivePlan,\n listPlans,\n loadPlan,\n markStepDone,\n markStepUndone,\n setActivePlan,\n formatPlan,\n} from \"./plans.js\";\n\nexport interface CommandResult {\n handled: boolean;\n output?: string;\n quit?: boolean;\n clearHistory?: boolean;\n saveConversation?: boolean;\n exportConversation?: boolean;\n}\n\nexport interface CommandContext {\n model?: string;\n mcpManager?: McpManager;\n llmClient?: import(\"./llm/types.js\").LLMClient;\n tools?: import(\"./llm/types.js\").ToolDefinition[];\n}\n\nfunction readEcosystemFile(filePath: string, label: string): string {\n if (!fs.existsSync(filePath)) {\n return pc.dim(`No ${label} file found at ${filePath}`);\n }\n return fs.readFileSync(filePath, \"utf-8\").trim();\n}\n\nfunction parseCommand(input: string): { base: string; action?: string; args: string[] } {\n const trimmed = input.trim();\n const parts = trimmed.split(/\\s+/);\n const base = parts[0].toLowerCase().replace(/^\\//, \"\");\n const action = parts.length > 1 ? parts[1].toLowerCase() : undefined;\n const args = parts.slice(2);\n return { base, action, args };\n}\n\nasync function mcpWrite(\n ctx: CommandContext,\n layer: string,\n tool: string,\n args: Record<string, unknown>,\n): Promise<string> {\n if (!ctx.mcpManager) {\n return pc.red(`Cannot modify ${layer}: aman-mcp not connected. Start it with: npx @aman_asmuei/aman-mcp`);\n }\n const result = await ctx.mcpManager.callTool(tool, args);\n if (result.startsWith(\"Error\")) {\n return pc.red(result);\n }\n return pc.green(result);\n}\n\n// --- Layer Handlers ---\n\nasync function handleIdentityCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".acore\", \"core.md\"), \"identity (acore)\");\n return { handled: true, output: content };\n }\n if (action === \"update\") {\n if (args.length === 0) {\n return {\n handled: true,\n output: pc.yellow(\"Usage: /identity update <section>\\nTip: describe changes in natural language and the AI will update via MCP.\"),\n };\n }\n const section = args[0];\n const content = args.slice(1).join(\" \");\n if (!content) {\n return {\n handled: true,\n output: pc.yellow(\"Usage: /identity update <section> <new content...>\\nExample: /identity update Personality Warm, curious, and direct.\"),\n };\n }\n const output = await mcpWrite(ctx, \"identity\", \"identity_update_section\", { section, content });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /identity ${action}. Use /identity or /identity update <section>.`) };\n}\n\nasync function handleRulesCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".arules\", \"rules.md\"), \"guardrails (arules)\");\n return { handled: true, output: content };\n }\n if (action === \"add\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules add <category> <rule text...>\") };\n }\n const category = args[0];\n const rule = args.slice(1).join(\" \");\n const output = await mcpWrite(ctx, \"rules\", \"rules_add\", { category, rule });\n return { handled: true, output };\n }\n if (action === \"remove\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules remove <category> <index>\") };\n }\n const output = await mcpWrite(ctx, \"rules\", \"rules_remove\", { category: args[0], index: parseInt(args[1], 10) });\n return { handled: true, output };\n }\n if (action === \"toggle\") {\n if (args.length < 2) {\n return { handled: true, output: pc.yellow(\"Usage: /rules toggle <category> <index>\") };\n }\n const output = await mcpWrite(ctx, \"rules\", \"rules_toggle\", { category: args[0], index: parseInt(args[1], 10) });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /rules ${action}. Use /rules [add|remove|toggle].`) };\n}\n\nasync function handleWorkflowsCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".aflow\", \"flow.md\"), \"workflows (aflow)\");\n return { handled: true, output: content };\n }\n if (action === \"add\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /workflows add <name>\") };\n }\n const output = await mcpWrite(ctx, \"workflows\", \"workflow_add\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n if (action === \"remove\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /workflows remove <name>\") };\n }\n const output = await mcpWrite(ctx, \"workflows\", \"workflow_remove\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /workflows ${action}. Use /workflows [add|remove].`) };\n}\n\n// akit registry — keep in sync with @aman_asmuei/akit/src/lib/registry.ts\ninterface AkitTool {\n name: string;\n description: string;\n category: string;\n mcp: { package: string; command: string; args: string[]; env?: Record<string, string> } | null;\n envHint?: string;\n}\n\nconst AKIT_REGISTRY: AkitTool[] = [\n { name: \"web-search\", description: \"Search the web for current information\", category: \"search\", mcp: { package: \"@anthropic/web-search\", command: \"npx\", args: [\"-y\", \"@anthropic/web-search\"] } },\n { name: \"brave-search\", description: \"Private web search via Brave\", category: \"search\", mcp: { package: \"@modelcontextprotocol/server-brave-search\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-brave-search\"], env: { BRAVE_API_KEY: \"\" } }, envHint: \"Set BRAVE_API_KEY from https://brave.com/search/api/\" },\n { name: \"github\", description: \"Manage GitHub repos, PRs, issues\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-github\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-github\"], env: { GITHUB_TOKEN: \"\" } }, envHint: \"Set GITHUB_TOKEN from https://github.com/settings/tokens\" },\n { name: \"git\", description: \"Git operations — log, diff, blame, branch\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-git\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-git\"] } },\n { name: \"filesystem\", description: \"Read, write, and search files\", category: \"development\", mcp: { package: \"@modelcontextprotocol/server-filesystem\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"] } },\n { name: \"linear\", description: \"Manage Linear issues and projects\", category: \"development\", mcp: { package: \"@linear/mcp-server\", command: \"npx\", args: [\"-y\", \"@linear/mcp-server\"], env: { LINEAR_API_KEY: \"\" } }, envHint: \"Set LINEAR_API_KEY from Linear settings → API\" },\n { name: \"sentry\", description: \"Monitor and triage app errors\", category: \"development\", mcp: { package: \"@sentry/mcp-server\", command: \"npx\", args: [\"-y\", \"@sentry/mcp-server\"], env: { SENTRY_AUTH_TOKEN: \"\" } }, envHint: \"Set SENTRY_AUTH_TOKEN from Sentry settings → API keys\" },\n { name: \"postgres\", description: \"Query PostgreSQL databases\", category: \"data\", mcp: { package: \"@modelcontextprotocol/server-postgres\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-postgres\"], env: { DATABASE_URL: \"\" } }, envHint: \"Set DATABASE_URL (e.g., postgresql://user:pass@localhost/db)\" },\n { name: \"sqlite\", description: \"Query local SQLite databases\", category: \"data\", mcp: { package: \"@modelcontextprotocol/server-sqlite\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-sqlite\"] } },\n { name: \"fetch\", description: \"HTTP requests to APIs\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-fetch\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-fetch\"] } },\n { name: \"puppeteer\", description: \"Browser automation and scraping\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-puppeteer\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-puppeteer\"] } },\n { name: \"docker\", description: \"Manage Docker containers\", category: \"automation\", mcp: { package: \"@modelcontextprotocol/server-docker\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-docker\"] } },\n { name: \"slack\", description: \"Send and read Slack messages\", category: \"communication\", mcp: { package: \"@modelcontextprotocol/server-slack\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-slack\"], env: { SLACK_BOT_TOKEN: \"\" } }, envHint: \"Set SLACK_BOT_TOKEN from your Slack app settings\" },\n { name: \"notion\", description: \"Read and write Notion pages\", category: \"communication\", mcp: { package: \"@notionhq/notion-mcp-server\", command: \"npx\", args: [\"-y\", \"@notionhq/notion-mcp-server\"], env: { NOTION_API_KEY: \"\" } }, envHint: \"Set NOTION_API_KEY from https://notion.so/my-integrations\" },\n { name: \"social\", description: \"Post to Bluesky, X/Twitter, Threads\", category: \"communication\", mcp: { package: \"@aman_asmuei/aman-social\", command: \"npx\", args: [\"-y\", \"@aman_asmuei/aman-social\"] }, envHint: \"Set BLUESKY_HANDLE + BLUESKY_APP_PASSWORD, TWITTER_API_KEY + secrets, or THREADS_ACCESS_TOKEN\" },\n { name: \"memory\", description: \"Persistent AI memory via amem\", category: \"memory\", mcp: { package: \"@aman_asmuei/amem\", command: \"npx\", args: [\"-y\", \"@aman_asmuei/amem\"] } },\n { name: \"docling\", description: \"Convert PDF, DOCX, PPTX, XLSX to markdown\", category: \"documents\", mcp: { package: \"docling-mcp\", command: \"uvx\", args: [\"docling-mcp\"] }, envHint: \"Requires Python 3.10+. Install: pip install docling\" },\n];\n\ninterface InstalledTool {\n name: string;\n installedAt: string;\n mcpConfigured: boolean;\n}\n\nfunction loadAkitInstalled(): InstalledTool[] {\n const filePath = path.join(os.homedir(), \".akit\", \"installed.json\");\n if (!fs.existsSync(filePath)) return [];\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch { return []; }\n}\n\nfunction saveAkitInstalled(tools: InstalledTool[]): void {\n const dir = path.join(os.homedir(), \".akit\");\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, \"installed.json\"), JSON.stringify(tools, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction addToAmanAgentConfig(name: string, mcpConfig: { command: string; args: string[] }): void {\n const configPath = path.join(os.homedir(), \".aman-agent\", \"config.json\");\n if (!fs.existsSync(configPath)) return;\n try {\n const config = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (!config.mcpServers) config.mcpServers = {};\n config.mcpServers[name] = mcpConfig;\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n } catch { /* ignore */ }\n}\n\nfunction removeFromAmanAgentConfig(name: string): void {\n const configPath = path.join(os.homedir(), \".aman-agent\", \"config.json\");\n if (!fs.existsSync(configPath)) return;\n try {\n const config = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (config.mcpServers) {\n delete config.mcpServers[name];\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch { /* ignore */ }\n}\n\nfunction handleAkitCommand(\n action: string | undefined,\n args: string[],\n): CommandResult {\n const installed = loadAkitInstalled();\n const installedNames = new Set(installed.map(t => t.name));\n\n // /akit add [number|name|custom]\n if (action === \"add\") {\n const available = AKIT_REGISTRY.filter(t => !installedNames.has(t.name));\n\n // No argument — show numbered list\n if (args.length < 1) {\n if (available.length === 0) {\n return { handled: true, output: pc.green(\"All tools are installed!\") };\n }\n const lines: string[] = [pc.bold(\"Select a tool to install:\"), \"\"];\n available.forEach((tool, i) => {\n const num = pc.cyan(String(i + 1).padStart(2));\n lines.push(` ${num} ${tool.name.padEnd(16)} ${pc.dim(tool.description)}`);\n });\n lines.push(\"\");\n lines.push(` Type: ${pc.cyan(\"/akit add <number>\")} or ${pc.cyan(\"/akit add <name>\")}`);\n lines.push(` Custom: ${pc.cyan(\"/akit add custom <name> <command> <args...>\")}`);\n return { handled: true, output: lines.join(\"\\n\") };\n }\n\n // /akit add custom <name> <command> <args...>\n if (args[0].toLowerCase() === \"custom\") {\n if (args.length < 3) {\n return { handled: true, output: pc.yellow(\"Usage: /akit add custom <name> <command> <args...>\\nExample: /akit add custom my-tool npx -y @org/my-mcp-server\") };\n }\n const customName = args[1];\n const customCommand = args[2];\n const customArgs = args.slice(3);\n\n if (installedNames.has(customName)) {\n return { handled: true, output: pc.yellow(`${customName} is already installed.`) };\n }\n\n installed.push({\n name: customName,\n installedAt: new Date().toISOString().split(\"T\")[0],\n mcpConfigured: true,\n });\n saveAkitInstalled(installed);\n addToAmanAgentConfig(customName, { command: customCommand, args: customArgs });\n\n return {\n handled: true,\n output: [\n pc.green(`✓ Added ${pc.bold(customName)}`) + pc.dim(` (custom MCP: ${customCommand} ${customArgs.join(\" \")})`),\n pc.dim(\" Restart aman-agent to load the new tool.\"),\n ].join(\"\\n\"),\n };\n }\n\n // Resolve by number or name\n const input = args[0].toLowerCase();\n let tool: AkitTool | undefined;\n\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= available.length) {\n tool = available[num - 1];\n } else {\n tool = AKIT_REGISTRY.find(t => t.name === input);\n }\n\n if (!tool) {\n return {\n handled: true,\n output: [\n pc.red(`Tool \"${input}\" not found.`),\n `Type ${pc.cyan(\"/akit add\")} to see available tools.`,\n ].join(\"\\n\"),\n };\n }\n\n if (installedNames.has(tool.name)) {\n return { handled: true, output: pc.yellow(`${tool.name} is already installed.`) };\n }\n\n // Install\n installed.push({\n name: tool.name,\n installedAt: new Date().toISOString().split(\"T\")[0],\n mcpConfigured: tool.mcp !== null,\n });\n saveAkitInstalled(installed);\n\n if (tool.mcp) {\n addToAmanAgentConfig(tool.name, {\n command: tool.mcp.command,\n args: tool.mcp.args,\n });\n }\n\n const lines: string[] = [\n pc.green(`✓ Added ${pc.bold(tool.name)}`) + (tool.mcp ? pc.dim(` (MCP: ${tool.mcp.package})`) : \"\"),\n ];\n if (tool.envHint) {\n lines.push(pc.yellow(` ⚠ ${tool.envHint}`));\n }\n if (tool.mcp) {\n lines.push(pc.dim(\" Restart aman-agent to load the new tool.\"));\n }\n return { handled: true, output: lines.join(\"\\n\") };\n }\n\n // /akit remove <tool>\n if (action === \"remove\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /akit remove <tool>\") };\n }\n const toolName = args[0].toLowerCase();\n\n if (!installedNames.has(toolName)) {\n return { handled: true, output: pc.red(`${toolName} is not installed.`) };\n }\n\n // Remove from installed.json\n const updated = installed.filter(t => t.name !== toolName);\n saveAkitInstalled(updated);\n\n // Remove from aman-agent config\n removeFromAmanAgentConfig(toolName);\n\n return {\n handled: true,\n output: pc.green(`✓ Removed ${pc.bold(toolName)}`) + pc.dim(\" (restart aman-agent to apply)\"),\n };\n }\n\n // /akit help\n if (action === \"help\") {\n return {\n handled: true,\n output: [\n pc.bold(\"akit — Tool Management\"),\n \"\",\n ` ${pc.cyan(\"/akit\")} List installed & available tools`,\n ` ${pc.cyan(\"/akit add <tool>\")} Install a tool`,\n ` ${pc.cyan(\"/akit remove <tool>\")} Uninstall a tool`,\n ].join(\"\\n\"),\n };\n }\n\n // Default: /akit — show installed + available\n const available = AKIT_REGISTRY.filter(t => !installedNames.has(t.name));\n\n const lines: string[] = [pc.bold(\"akit — AI Tool Manager\"), \"\"];\n\n // Installed section\n if (installed.length > 0) {\n lines.push(` ${pc.bold(`Installed (${installed.length})`)}`);\n for (const tool of installed) {\n const mcp = tool.mcpConfigured ? pc.green(\"MCP\") : pc.dim(\"manual\");\n lines.push(` ${pc.green(\"●\")} ${pc.bold(tool.name.padEnd(16))} ${mcp} ${pc.dim(tool.installedAt)}`);\n }\n lines.push(\"\");\n }\n\n // Available section\n if (available.length > 0) {\n lines.push(` ${pc.bold(`Available (${available.length})`)}`);\n const byCategory = new Map<string, AkitTool[]>();\n for (const tool of available) {\n if (!byCategory.has(tool.category)) byCategory.set(tool.category, []);\n byCategory.get(tool.category)!.push(tool);\n }\n for (const [category, tools] of byCategory) {\n lines.push(` ${pc.dim(category)}`);\n for (const tool of tools) {\n lines.push(` ${pc.dim(\"○\")} ${tool.name.padEnd(16)} ${pc.dim(tool.description)}`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(` ${pc.cyan(\"/akit add <tool>\")} Install a tool`);\n lines.push(` ${pc.cyan(\"/akit remove <tool>\")} Uninstall a tool`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nasync function handleSkillsCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".askill\", \"skills.md\"), \"skills (askill)\");\n return { handled: true, output: content };\n }\n if (action === \"install\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /skills install <name>\") };\n }\n const output = await mcpWrite(ctx, \"skills\", \"skill_install\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n if (action === \"uninstall\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /skills uninstall <name>\") };\n }\n const output = await mcpWrite(ctx, \"skills\", \"skill_uninstall\", { name: args.join(\" \") });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /skills ${action}. Use /skills [install|uninstall].`) };\n}\n\nasync function handleEvalCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n const home = os.homedir();\n if (!action) {\n const content = readEcosystemFile(path.join(home, \".aeval\", \"eval.md\"), \"evaluation (aeval)\");\n return { handled: true, output: content };\n }\n if (action === \"milestone\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /eval milestone <text...>\") };\n }\n const text = args.join(\" \");\n const output = await mcpWrite(ctx, \"eval\", \"eval_milestone\", { text });\n return { handled: true, output };\n }\n return { handled: true, output: pc.yellow(`Unknown action: /eval ${action}. Use /eval or /eval milestone <text>.`) };\n}\n\nasync function handleMemoryCommand(\n action: string | undefined,\n args: string[],\n ctx: CommandContext,\n): Promise<CommandResult> {\n if (!action) {\n // Default: show recent memory context\n try {\n const result = await memoryContext(\"recent context\");\n if (result.memoriesUsed === 0) {\n return { handled: true, output: pc.dim(\"No memories yet. Start chatting and I'll remember what matters.\") };\n }\n return { handled: true, output: result.text };\n } catch (err) {\n return { handled: true, output: pc.red(`Memory error: ${err instanceof Error ? err.message : String(err)}`) };\n }\n }\n // /memory <topic> — shortcut for context on a specific topic\n if (action && ![\"search\", \"clear\", \"timeline\"].includes(action)) {\n try {\n const topic = [action, ...args].join(\" \");\n const result = await memoryContext(topic);\n if (result.memoriesUsed === 0) {\n return { handled: true, output: pc.dim(`No memories found for: \"${topic}\".`) };\n }\n return { handled: true, output: result.text };\n } catch (err) {\n return { handled: true, output: pc.red(`Memory error: ${err instanceof Error ? err.message : String(err)}`) };\n }\n }\n if (action === \"search\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /memory search <query...>\") };\n }\n const query = args.join(\" \");\n try {\n const result = await memoryRecall(query);\n return { handled: true, output: result.total === 0 ? pc.dim(\"No memories found.\") : result.text };\n } catch (err) {\n return { handled: true, output: pc.red(`Memory error: ${err instanceof Error ? err.message : String(err)}`) };\n }\n }\n if (action === \"clear\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /memory clear <category>\") };\n }\n const output = await mcpWrite(ctx, \"memory\", \"memory_forget\", { category: args[0] });\n return { handled: true, output };\n }\n if (action === \"timeline\") {\n try {\n const result = await memoryRecall(\"*\", { limit: 500, compact: false });\n if (result.total === 0) {\n return { handled: true, output: pc.dim(\"No memories yet. Start chatting and I'll remember what matters.\") };\n }\n const memories = result.memories;\n if (memories.length > 0) {\n const byDate = new Map<string, number>();\n for (const mem of memories) {\n const createdAt = (mem as { created_at?: number }).created_at;\n const date = createdAt\n ? new Date(createdAt).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" })\n : \"Unknown\";\n byDate.set(date, (byDate.get(date) || 0) + 1);\n }\n const maxCount = Math.max(...byDate.values());\n const barWidth = 10;\n const lines: string[] = [pc.bold(\"Memory Timeline:\"), \"\"];\n for (const [date, count] of byDate) {\n const filled = Math.round((count / maxCount) * barWidth);\n const bar = \"█\".repeat(filled) + \"░\".repeat(barWidth - filled);\n lines.push(` ${date.padEnd(8)} ${bar} ${count} memories`);\n }\n const tags = new Map<string, number>();\n for (const mem of memories) {\n const memTags = (mem as { tags?: string[] }).tags;\n if (Array.isArray(memTags)) {\n for (const tag of memTags) {\n tags.set(tag, (tags.get(tag) || 0) + 1);\n }\n }\n }\n lines.push(\"\");\n lines.push(` Total: ${result.total} memories`);\n if (tags.size > 0) {\n const topTags = [...tags.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([tag, count]) => `#${tag} (${count})`)\n .join(\", \");\n lines.push(` Top tags: ${topTags}`);\n }\n return { handled: true, output: lines.join(\"\\n\") };\n }\n return { handled: true, output: `Total memories: ${result.total} entries.` };\n } catch {\n return { handled: true, output: pc.red(\"Failed to retrieve memory timeline.\") };\n }\n }\n return { handled: true, output: pc.yellow(`Unknown action: /memory ${action}. Use /memory [search|clear|timeline].`) };\n}\n\nfunction handleStatusCommand(ctx: CommandContext): CommandResult {\n const mcpToolCount = ctx.mcpManager ? ctx.mcpManager.getTools().length : 0;\n const amemConnected = mcpToolCount > 0; // simplified check\n const status = getEcosystemStatus(mcpToolCount, amemConnected);\n\n const lines: string[] = [pc.bold(\"Aman Ecosystem Dashboard\"), \"\"];\n\n for (const layer of status.layers) {\n const icon = layer.exists ? pc.green(\"●\") : pc.dim(\"○\");\n const name = pc.bold(layer.name.padEnd(12));\n const summary = layer.exists ? layer.summary : pc.dim(\"not configured\");\n lines.push(` ${icon} ${name} ${summary}`);\n }\n\n lines.push(\"\");\n lines.push(` ${status.mcpConnected ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(\"MCP\".padEnd(12))} ${status.mcpConnected ? `${status.mcpToolCount} tools available` : pc.dim(\"not connected\")}`);\n lines.push(` ${status.amemConnected ? pc.green(\"●\") : pc.dim(\"○\")} ${pc.bold(\"Memory\".padEnd(12))} ${status.amemConnected ? \"connected\" : pc.dim(\"not connected\")}`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nfunction handleDoctorCommand(ctx: CommandContext): CommandResult {\n const mcpToolCount = ctx.mcpManager ? ctx.mcpManager.getTools().length : 0;\n const amemConnected = mcpToolCount > 0;\n const status = getEcosystemStatus(mcpToolCount, amemConnected);\n\n const lines: string[] = [pc.bold(\"Aman Health Check\"), \"\"];\n let healthy = 0;\n let fixes = 0;\n let suggestions = 0;\n\n for (const layer of status.layers) {\n if (layer.exists) {\n lines.push(` ${pc.green(\"✓\")} ${layer.name.padEnd(12)} ${pc.green(layer.summary)}`);\n healthy++;\n } else {\n const isRequired = [\"identity\", \"rules\"].includes(layer.name.toLowerCase());\n if (isRequired) {\n lines.push(` ${pc.red(\"✗\")} ${layer.name.padEnd(12)} ${pc.red(\"missing\")}`);\n lines.push(` ${pc.dim(\"→ Fix: aman-agent init\")}`);\n fixes++;\n } else {\n lines.push(` ${pc.yellow(\"⚠\")} ${layer.name.padEnd(12)} ${pc.yellow(\"empty\")}`);\n const cmd = layer.name.toLowerCase() === \"workflows\" ? \"/workflows add <name>\"\n : layer.name.toLowerCase() === \"tools\" ? \"/tools add <name> <type> <desc>\"\n : layer.name.toLowerCase() === \"skills\" ? \"/skills install <name>\"\n : \"\";\n if (cmd) lines.push(` ${pc.dim(`→ Add with ${cmd}`)}`);\n suggestions++;\n }\n }\n }\n\n lines.push(\"\");\n lines.push(` ${status.mcpConnected ? pc.green(\"✓\") : pc.red(\"✗\")} ${\"MCP\".padEnd(12)} ${status.mcpConnected ? pc.green(`${status.mcpToolCount} tools`) : pc.red(\"not connected\")}`);\n if (!status.mcpConnected) {\n lines.push(` ${pc.dim(\"→ Fix: ensure npx is available and network is connected\")}`);\n fixes++;\n } else {\n healthy++;\n }\n\n lines.push(` ${status.amemConnected ? pc.green(\"✓\") : pc.red(\"✗\")} ${\"Memory\".padEnd(12)} ${status.amemConnected ? pc.green(\"connected\") : pc.red(\"not connected\")}`);\n if (!status.amemConnected) {\n lines.push(` ${pc.dim(\"→ Fix: npx @aman_asmuei/amem\")}`);\n fixes++;\n } else {\n healthy++;\n }\n\n const total = healthy + fixes + suggestions;\n lines.push(\"\");\n lines.push(` Overall: ${healthy}/${total} healthy.${fixes > 0 ? ` ${fixes} fix${fixes > 1 ? \"es\" : \"\"} needed.` : \"\"}${suggestions > 0 ? ` ${suggestions} suggestion${suggestions > 1 ? \"s\" : \"\"}.` : \"\"}`);\n\n return { handled: true, output: lines.join(\"\\n\") };\n}\n\nfunction handleHelp(): CommandResult {\n return {\n handled: true,\n output: [\n pc.bold(\"Commands:\"),\n ` ${pc.cyan(\"/help\")} Show this help`,\n ` ${pc.cyan(\"/identity\")} View identity [update <section>]`,\n ` ${pc.cyan(\"/rules\")} View rules [add|remove|toggle ...]`,\n ` ${pc.cyan(\"/workflows\")} View workflows [add|remove ...]`,\n ` ${pc.cyan(\"/akit\")} Manage tools [add|remove <tool>]`,\n ` ${pc.cyan(\"/skills\")} View skills [install|uninstall ...]`,\n ` ${pc.cyan(\"/eval\")} View evaluation [milestone ...]`,\n ` ${pc.cyan(\"/memory\")} View recent memories [search|clear|timeline]`,\n ` ${pc.cyan(\"/status\")} Ecosystem dashboard`,\n ` ${pc.cyan(\"/doctor\")} Health check all layers`,\n ` ${pc.cyan(\"/decisions\")} View decision log [<project>]`,\n ` ${pc.cyan(\"/export\")} Export conversation to markdown`,\n ` ${pc.cyan(\"/debug\")} Show debug log`,\n ` ${pc.cyan(\"/save\")} Save conversation to memory`,\n ` ${pc.cyan(\"/model\")} Show current LLM model`,\n ` ${pc.cyan(\"/update\")} Check for updates`,\n ` ${pc.cyan(\"/reconfig\")} Reset LLM config`,\n ` ${pc.cyan(\"/clear\")} Clear conversation history`,\n ` ${pc.cyan(\"/quit\")} Exit`,\n ].join(\"\\n\"),\n };\n}\n\nfunction handleSave(): CommandResult {\n return { handled: true, saveConversation: true };\n}\n\nfunction handleReconfig(): CommandResult {\n const configDir = path.join(os.homedir(), \".aman-agent\");\n const configPath = path.join(configDir, \"config.json\");\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n // Write marker to skip auto-detect on next run → force interactive prompt\n fs.mkdirSync(configDir, { recursive: true });\n fs.writeFileSync(path.join(configDir, \".reconfig\"), \"\", \"utf-8\");\n return {\n handled: true,\n quit: true,\n output: [\n pc.green(\"Config reset.\"),\n \"Next run will prompt you to choose your LLM provider.\",\n ].join(\"\\n\"),\n };\n}\n\nfunction handleUpdate(): CommandResult {\n try {\n const current = execFileSync(\"npm\", [\"view\", \"@aman_asmuei/aman-agent\", \"version\"], { encoding: \"utf-8\" }).trim();\n const local = JSON.parse(fs.readFileSync(path.join(__dirname, \"..\", \"package.json\"), \"utf-8\")).version;\n if (current === local) {\n return { handled: true, output: `${pc.green(\"Up to date\")} — v${local}` };\n }\n return {\n handled: true,\n output: [\n `${pc.yellow(\"Update available:\")} v${local} → v${current}`,\n \"\",\n `Run this in your terminal:`,\n ` ${pc.bold(\"npm install -g @aman_asmuei/aman-agent@latest\")}`,\n \"\",\n `Or use npx (always latest):`,\n ` ${pc.bold(\"npx @aman_asmuei/aman-agent@latest\")}`,\n ].join(\"\\n\"),\n };\n } catch {\n return {\n handled: true,\n output: [\n `To update, run in your terminal:`,\n ` ${pc.bold(\"npm install -g @aman_asmuei/aman-agent@latest\")}`,\n \"\",\n `Or use npx (always latest):`,\n ` ${pc.bold(\"npx @aman_asmuei/aman-agent@latest\")}`,\n ].join(\"\\n\"),\n };\n }\n}\n\nasync function handleDecisionsCommand(\n action: string | undefined,\n _args: string[],\n _ctx: CommandContext,\n): Promise<CommandResult> {\n try {\n const result = await memoryRecall(\"decision\", { type: \"decision\", limit: 20 });\n if (result.total === 0) {\n return { handled: true, output: pc.dim(\"No decisions recorded yet.\") };\n }\n return { handled: true, output: pc.bold(\"Decision Log:\\n\") + result.text };\n } catch (err) {\n return { handled: true, output: pc.red(`Memory error: ${err instanceof Error ? err.message : String(err)}`) };\n }\n}\n\nfunction handleExportCommand(): CommandResult {\n return { handled: true, exportConversation: true };\n}\n\nfunction handleDebugCommand(): CommandResult {\n const logPath = path.join(os.homedir(), \".aman-agent\", \"debug.log\");\n if (!fs.existsSync(logPath)) {\n return { handled: true, output: pc.dim(\"No debug log found.\") };\n }\n const content = fs.readFileSync(logPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\");\n const last20 = lines.slice(-20).join(\"\\n\");\n return { handled: true, output: pc.bold(\"Debug Log (last 20 entries):\\n\") + pc.dim(last20) };\n}\n\n// --- Main Router ---\n\n// --- Teams ---\n\nasync function handleTeamCommand(action: string | undefined, args: string[], ctx: CommandContext): Promise<CommandResult> {\n if (!action || action === \"list\") {\n const teams = listTeams();\n if (teams.length === 0) {\n return {\n handled: true,\n output: pc.dim(\"No teams yet. Create one:\") +\n \"\\n /team create <name> Create from built-in template\" +\n \"\\n /team create Show available templates\",\n };\n }\n const lines = teams.map((t) => {\n const members = t.members.map((m) => m.profile).join(\", \");\n return ` ${pc.bold(t.name)} (${t.workflow}) — ${members}`;\n });\n return { handled: true, output: \"Teams:\\n\" + lines.join(\"\\n\") };\n }\n\n switch (action) {\n case \"create\": {\n const name = args[0];\n if (!name) {\n const lines = BUILT_IN_TEAMS.map((t) => {\n const members = t.members.map((m) => m.profile).join(\" → \");\n return ` ${pc.bold(t.name)} (${t.workflow}) — ${members}\\n ${pc.dim(t.goal)}`;\n });\n return {\n handled: true,\n output: \"Built-in teams:\\n\" + lines.join(\"\\n\\n\") +\n \"\\n\\nUsage:\\n /team create content-team Install built-in\" +\n \"\\n /team create <name> <mode> <profile1:role>,<profile2:role> Custom\",\n };\n }\n\n // Check if it's a built-in template\n const builtIn = BUILT_IN_TEAMS.find((t) => t.name === name);\n if (builtIn) {\n createTeam(builtIn);\n return { handled: true, output: pc.green(`Team installed: ${builtIn.name}`) + \"\\n\\n\" + formatTeam(builtIn) };\n }\n\n // Custom team: /team create <name> <mode> <profile:role>,<profile:role>\n const mode = args[1] as Team[\"workflow\"];\n const membersStr = args[2];\n if (!mode || !membersStr) {\n return { handled: true, output: pc.yellow(\"Usage: /team create <name> <pipeline|parallel|coordinator> <profile1:role>,<profile2:role>\") };\n }\n if (![\"pipeline\", \"parallel\", \"coordinator\"].includes(mode)) {\n return { handled: true, output: pc.yellow(\"Mode must be: pipeline, parallel, or coordinator\") };\n }\n\n const members = membersStr.split(\",\").map((m) => {\n const [profile, ...roleParts] = m.trim().split(\":\");\n return { profile: profile.trim(), role: roleParts.join(\":\").trim() || profile.trim() };\n });\n\n const team: Team = {\n name,\n goal: `Team: ${name}`,\n coordinator: \"default\",\n members,\n workflow: mode,\n };\n createTeam(team);\n return { handled: true, output: pc.green(`Team created!`) + \"\\n\\n\" + formatTeam(team) };\n }\n\n case \"run\": {\n const teamName = args[0];\n const task = args.slice(1).join(\" \");\n if (!teamName || !task) {\n return { handled: true, output: pc.yellow(\"Usage: /team run <team-name> <task description>\") };\n }\n\n const team = loadTeam(teamName);\n if (!team) return { handled: true, output: pc.red(`Team not found: ${teamName}`) };\n\n if (!ctx.llmClient || !ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Team execution requires LLM client and MCP.\") };\n }\n\n const result = await runTeam(team, task, ctx.llmClient, ctx.mcpManager, ctx.tools);\n return { handled: true, output: formatTeamResult(result) };\n }\n\n case \"show\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /team show <name>\") };\n const team = loadTeam(name);\n if (!team) return { handled: true, output: pc.red(`Team not found: ${name}`) };\n return { handled: true, output: formatTeam(team) };\n }\n\n case \"delete\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /team delete <name>\") };\n if (!deleteTeam(name)) return { handled: true, output: pc.red(`Team not found: ${name}`) };\n return { handled: true, output: pc.dim(`Team deleted: ${name}`) };\n }\n\n case \"help\":\n return { handled: true, output: `Team commands:\n /team List all teams\n /team create Show built-in templates\n /team create <name> Install built-in team\n /team create <n> <mode> <m> Custom team (mode: pipeline|parallel|coordinator)\n /team run <name> <task> Run a task with a team\n /team show <name> Show team details\n /team delete <name> Delete a team\n\nModes:\n pipeline Sequential: agent1 → agent2 → agent3\n parallel All agents work concurrently, coordinator merges\n coordinator Coordinator LLM decides how to split the task\n\nExamples:\n /team create content-team\n /team run content-team Write a blog post about AI companions\n /team create review-squad pipeline coder:implement,researcher:review\n /team run review-squad Build a rate limiter in TypeScript` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown team action: ${action}. Try /team help`) };\n }\n}\n\n// --- Delegation ---\n\nasync function handleDelegateCommand(action: string | undefined, args: string[], ctx: CommandContext): Promise<CommandResult> {\n if (!action) {\n return { handled: true, output: `Delegate commands:\n /delegate <profile> <task> Delegate a task to a profile\n /delegate pipeline <p1> <p2> ... Run a sequential pipeline\n /delegate help Show help\n\nExamples:\n /delegate writer Write a blog post about AI companions\n /delegate coder Review this code for security issues\n /delegate pipeline writer,researcher Write and fact-check an article about quantum computing` };\n }\n\n if (action === \"help\") {\n return { handled: true, output: `Delegate a task to a sub-agent with a specific profile.\n\nThe sub-agent runs with its own identity, rules, and skills but shares\nyour memory and tools. Results come back to you.\n\nUsage:\n /delegate <profile> <task>\n /delegate pipeline <profile1>,<profile2> <task>\n\nThe pipeline mode passes each agent's output to the next:\n writer drafts → researcher reviews → writer polishes` };\n }\n\n if (!ctx.llmClient || !ctx.mcpManager) {\n return { handled: true, output: pc.red(\"Delegation requires LLM client and MCP. Not available.\") };\n }\n\n if (action === \"pipeline\") {\n // /delegate pipeline writer,researcher,writer Write an article about AI\n const profileList = args[0];\n const task = args.slice(1).join(\" \");\n if (!profileList || !task) {\n return { handled: true, output: pc.yellow(\"Usage: /delegate pipeline <profile1>,<profile2> <task>\") };\n }\n\n const profiles = profileList.split(\",\").map((p) => p.trim());\n const steps = profiles.map((profile, i) => {\n if (i === 0) {\n return { profile, taskTemplate: task };\n }\n return { profile, taskTemplate: `Review and improve the following:\\n\\n{{input}}` };\n });\n\n process.stdout.write(pc.dim(`\\n Pipeline: ${profiles.join(\" → \")}\\n`));\n\n const results = await delegatePipeline(steps, task, ctx.llmClient, ctx.mcpManager, { tools: ctx.tools });\n\n const output: string[] = [];\n for (const r of results) {\n if (r.success) {\n output.push(`\\n${pc.bold(`[${r.profile}]`)} ${pc.green(\"✓\")} (${r.turns} tool turns)`);\n output.push(r.response.slice(0, 2000));\n if (r.toolsUsed.length > 0) output.push(pc.dim(` Tools: ${r.toolsUsed.join(\", \")}`));\n } else {\n output.push(`\\n${pc.bold(`[${r.profile}]`)} ${pc.red(\"✗\")} ${r.error}`);\n }\n }\n\n return { handled: true, output: output.join(\"\\n\") };\n }\n\n // /delegate <profile> <task>\n const profile = action;\n const task = args.join(\" \");\n if (!task) {\n return { handled: true, output: pc.yellow(`Usage: /delegate ${profile} <task description>`) };\n }\n\n process.stdout.write(pc.dim(`\\n [delegating to ${profile}...]\\n\\n`));\n\n const result = await delegateTask(task, profile, ctx.llmClient, ctx.mcpManager, { tools: ctx.tools });\n\n if (!result.success) {\n return { handled: true, output: pc.red(`Delegation failed: ${result.error}`) };\n }\n\n const meta: string[] = [];\n if (result.toolsUsed.length > 0) meta.push(`Tools: ${result.toolsUsed.join(\", \")}`);\n if (result.turns > 0) meta.push(`${result.turns} tool turns`);\n\n return {\n handled: true,\n output: `\\n${pc.bold(`[${profile}]`)} ${pc.green(\"✓\")}${meta.length > 0 ? \" \" + pc.dim(`(${meta.join(\", \")})`) : \"\"}\\n\\n${result.response}`,\n };\n}\n\n// --- Profile management ---\n\nfunction handleProfileCommand(action: string | undefined, args: string[]): CommandResult {\n const profilesDir = path.join(os.homedir(), \".acore\", \"profiles\");\n\n if (!action || action === \"list\") {\n const profiles = listProfiles();\n if (profiles.length === 0) {\n return { handled: true, output: pc.dim(\"No profiles yet. Create one with: /profile create <name>\") };\n }\n const lines = profiles.map((p) =>\n ` ${pc.bold(p.name)} — ${p.aiName} (${pc.dim(p.personality)})`\n );\n return { handled: true, output: \"Profiles:\\n\" + lines.join(\"\\n\") + \"\\n\\n\" + pc.dim(\"Switch with: aman-agent --profile <name>\") };\n }\n\n switch (action) {\n case \"create\": {\n const name = args[0];\n if (!name) {\n // Show available templates\n const lines = BUILT_IN_PROFILES.map((t) =>\n ` ${pc.bold(t.name)} — ${t.label}: ${pc.dim(t.description)}`\n );\n return {\n handled: true,\n output: \"Built-in profiles:\\n\" + lines.join(\"\\n\") +\n \"\\n\\nUsage:\\n /profile create coder Install built-in template\" +\n \"\\n /profile create <custom> Create blank profile\",\n };\n }\n\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n const profileDir = path.join(profilesDir, slug);\n\n if (fs.existsSync(profileDir)) {\n return { handled: true, output: pc.yellow(`Profile already exists: ${slug}`) };\n }\n\n // Check if it's a built-in template\n const builtIn = BUILT_IN_PROFILES.find((t) => t.name === slug);\n if (builtIn) {\n const err = installProfileTemplate(slug);\n if (err) return { handled: true, output: pc.red(err) };\n return {\n handled: true,\n output: pc.green(`Profile installed: ${builtIn.label}`) +\n `\\n AI name: ${builtIn.core.match(/^# (.+)/m)?.[1] || slug}` +\n `\\n ${pc.dim(builtIn.description)}` +\n `\\n\\n Use: aman-agent --profile ${slug}`,\n };\n }\n\n // Custom profile — create from default\n fs.mkdirSync(profileDir, { recursive: true });\n const globalCore = path.join(os.homedir(), \".acore\", \"core.md\");\n if (fs.existsSync(globalCore)) {\n let content = fs.readFileSync(globalCore, \"utf-8\");\n const aiName = name.charAt(0).toUpperCase() + name.slice(1);\n content = content.replace(/^# .+$/m, `# ${aiName}`);\n fs.writeFileSync(path.join(profileDir, \"core.md\"), content, \"utf-8\");\n } else {\n const aiName = name.charAt(0).toUpperCase() + name.slice(1);\n fs.writeFileSync(path.join(profileDir, \"core.md\"), `# ${aiName}\\n\\n## Identity\\n- Role: ${aiName} is your AI companion\\n- Personality: helpful, adaptive\\n- Communication: clear and concise\\n- Values: honesty, simplicity\\n- Boundaries: won't pretend to be human\\n`, \"utf-8\");\n }\n\n return {\n handled: true,\n output: pc.green(`Profile created: ${slug}`) +\n `\\n Edit: ${path.join(profileDir, \"core.md\")}` +\n `\\n Use: aman-agent --profile ${slug}` +\n `\\n\\n ${pc.dim(\"Add rules.md or skills.md for profile-specific overrides.\")}`,\n };\n }\n\n case \"show\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /profile show <name>\") };\n const profileDir = path.join(profilesDir, name);\n if (!fs.existsSync(profileDir)) return { handled: true, output: pc.red(`Profile not found: ${name}`) };\n\n const files = fs.readdirSync(profileDir).filter((f) => f.endsWith(\".md\"));\n const lines = files.map((f) => ` ${f}`);\n return { handled: true, output: `Profile: ${pc.bold(name)}\\nFiles:\\n${lines.join(\"\\n\")}` };\n }\n\n case \"delete\": {\n const name = args[0];\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /profile delete <name>\") };\n const profileDir = path.join(profilesDir, name);\n if (!fs.existsSync(profileDir)) return { handled: true, output: pc.red(`Profile not found: ${name}`) };\n\n fs.rmSync(profileDir, { recursive: true });\n return { handled: true, output: pc.dim(`Profile deleted: ${name}`) };\n }\n\n case \"help\":\n return { handled: true, output: `Profile commands:\n /profile List all profiles\n /profile create <n> Create new profile\n /profile show <n> Show profile files\n /profile delete <n> Delete a profile\n\n Use profiles:\n aman-agent --profile <name>\n AMAN_PROFILE=<name> aman-agent` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown profile action: ${action}. Try /profile help`) };\n }\n}\n\n// --- Plan management ---\n\nfunction handlePlanCommand(action: string | undefined, args: string[]): CommandResult {\n if (!action) {\n // /plan — show active plan\n const active = getActivePlan();\n if (!active) {\n return { handled: true, output: pc.dim(\"No active plan. Create one with: /plan create <name> | <goal> | <step1>, <step2>, ...\") };\n }\n return { handled: true, output: formatPlan(active) };\n }\n\n switch (action) {\n case \"create\": {\n // /plan create <name> | <goal> | <step1>, <step2>, ...\n const fullArgs = args.join(\" \");\n const parts = fullArgs.split(\"|\").map((p) => p.trim());\n if (parts.length < 3) {\n return { handled: true, output: pc.yellow(\"Usage: /plan create <name> | <goal> | <step1>, <step2>, ...\") };\n }\n const name = parts[0];\n const goal = parts[1];\n const steps = parts[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n if (steps.length === 0) {\n return { handled: true, output: pc.yellow(\"Need at least one step. Separate steps with commas.\") };\n }\n const plan = createPlan(name, goal, steps);\n return { handled: true, output: pc.green(`Plan created!\\n\\n`) + formatPlan(plan) };\n }\n\n case \"done\": {\n // /plan done [step number]\n const active = getActivePlan();\n if (!active) return { handled: true, output: pc.yellow(\"No active plan.\") };\n\n if (args.length > 0) {\n const stepNum = parseInt(args[0], 10);\n if (isNaN(stepNum) || stepNum < 1 || stepNum > active.steps.length) {\n return { handled: true, output: pc.yellow(`Invalid step number. Range: 1-${active.steps.length}`) };\n }\n markStepDone(active, stepNum - 1);\n return { handled: true, output: pc.green(`Step ${stepNum} done!`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n // No step specified — mark next incomplete step\n const next = active.steps.findIndex((s) => !s.done);\n if (next < 0) return { handled: true, output: pc.green(\"All steps already complete!\") };\n markStepDone(active, next);\n return { handled: true, output: pc.green(`Step ${next + 1} done!`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n case \"undo\": {\n // /plan undo <step number>\n const active = getActivePlan();\n if (!active) return { handled: true, output: pc.yellow(\"No active plan.\") };\n const stepNum = parseInt(args[0], 10);\n if (isNaN(stepNum) || stepNum < 1 || stepNum > active.steps.length) {\n return { handled: true, output: pc.yellow(`Invalid step number. Range: 1-${active.steps.length}`) };\n }\n markStepUndone(active, stepNum - 1);\n return { handled: true, output: pc.dim(`Step ${stepNum} unmarked.`) + \"\\n\\n\" + formatPlan(active) };\n }\n\n case \"list\": {\n // /plan list — show all plans\n const plans = listPlans();\n if (plans.length === 0) return { handled: true, output: pc.dim(\"No plans yet.\") };\n const lines = plans.map((p) => {\n const done = p.steps.filter((s) => s.done).length;\n const total = p.steps.length;\n const status = p.active ? pc.green(\"active\") : pc.dim(\"inactive\");\n return ` ${p.name} — ${done}/${total} steps (${status})`;\n });\n return { handled: true, output: \"Plans:\\n\" + lines.join(\"\\n\") };\n }\n\n case \"switch\": {\n // /plan switch <name>\n const name = args.join(\" \");\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /plan switch <name>\") };\n const plan = setActivePlan(name);\n if (!plan) return { handled: true, output: pc.red(`Plan not found: ${name}`) };\n return { handled: true, output: pc.green(`Switched to: ${plan.name}`) + \"\\n\\n\" + formatPlan(plan) };\n }\n\n case \"show\": {\n // /plan show <name>\n const name = args.join(\" \");\n if (!name) return { handled: true, output: pc.yellow(\"Usage: /plan show <name>\") };\n const plan = loadPlan(name);\n if (!plan) return { handled: true, output: pc.red(`Plan not found: ${name}`) };\n return { handled: true, output: formatPlan(plan) };\n }\n\n case \"help\":\n return { handled: true, output: `Plan commands:\n /plan Show active plan\n /plan create <name> | <goal> | <step1>, <step2>, ...\n /plan done [step#] Mark step complete (next if no number)\n /plan undo <step#> Unmark a step\n /plan list List all plans\n /plan switch <name> Switch active plan\n /plan show <name> Show a specific plan` };\n\n default:\n return { handled: true, output: pc.yellow(`Unknown plan action: ${action}. Try /plan help`) };\n }\n}\n\nconst KNOWN_COMMANDS = new Set([\n \"quit\", \"exit\", \"q\", \"help\", \"clear\", \"model\", \"identity\", \"rules\",\n \"workflows\", \"tools\", \"akit\", \"skills\", \"eval\", \"memory\", \"status\", \"doctor\",\n \"save\", \"decisions\", \"export\", \"debug\", \"update-config\", \"reconfig\",\n \"update\", \"upgrade\", \"plan\", \"profile\", \"delegate\", \"team\",\n]);\n\nexport async function handleCommand(input: string, ctx: CommandContext): Promise<CommandResult> {\n const trimmed = input.trim();\n if (!trimmed.startsWith(\"/\")) return { handled: false };\n\n const { base, action, args } = parseCommand(trimmed);\n\n // Don't treat file paths (e.g., /Users/...) as commands\n if (!KNOWN_COMMANDS.has(base)) return { handled: false };\n\n switch (base) {\n case \"quit\":\n case \"exit\":\n case \"q\":\n return { handled: true, quit: true };\n case \"help\":\n return handleHelp();\n case \"clear\":\n return { handled: true, output: pc.dim(\"Conversation cleared.\"), clearHistory: true };\n case \"model\":\n return { handled: true, output: ctx.model ? `Model: ${pc.bold(ctx.model)}` : \"Model: unknown\" };\n case \"identity\":\n return handleIdentityCommand(action, args, ctx);\n case \"rules\":\n return handleRulesCommand(action, args, ctx);\n case \"workflows\":\n return handleWorkflowsCommand(action, args, ctx);\n case \"tools\":\n case \"akit\":\n return handleAkitCommand(action, args);\n case \"skills\":\n return handleSkillsCommand(action, args, ctx);\n case \"eval\":\n return handleEvalCommand(action, args, ctx);\n case \"memory\":\n return handleMemoryCommand(action, args, ctx);\n case \"status\":\n return handleStatusCommand(ctx);\n case \"doctor\":\n return handleDoctorCommand(ctx);\n case \"save\":\n return handleSave();\n case \"decisions\":\n return handleDecisionsCommand(action, args, ctx);\n case \"export\":\n return handleExportCommand();\n case \"debug\":\n return handleDebugCommand();\n case \"update-config\":\n case \"reconfig\":\n return handleReconfig();\n case \"plan\":\n return handlePlanCommand(action, args);\n case \"profile\":\n return handleProfileCommand(action, args);\n case \"delegate\":\n return handleDelegateCommand(action, args, ctx);\n case \"team\":\n return handleTeamCommand(action, args, ctx);\n case \"update\":\n case \"upgrade\":\n return handleUpdate();\n default:\n return { handled: false }; // Pass to LLM if not matched\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst home = os.homedir();\n\ninterface LayerStatus {\n name: string;\n exists: boolean;\n path: string;\n summary: string;\n}\n\nexport interface EcosystemStatus {\n layers: LayerStatus[];\n mcpConnected: boolean;\n mcpToolCount: number;\n amemConnected: boolean;\n}\n\nconst LAYER_FILES = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\" },\n { name: \"rules\", dir: \".arules\", file: \"rules.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\" },\n { name: \"eval\", dir: \".aeval\", file: \"eval.md\" },\n] as const;\n\nfunction countLines(content: string, pattern: RegExp): number {\n return (content.match(pattern) || []).length;\n}\n\nfunction getLayerSummary(name: string, content: string): string {\n switch (name) {\n case \"identity\": {\n const nameMatch = content.match(/^# (.+)/m);\n return nameMatch ? nameMatch[1] : \"configured\";\n }\n case \"rules\":\n return `${countLines(content, /^- /gm)} rules`;\n case \"workflows\":\n return `${countLines(content, /^## /gm)} workflows`;\n case \"tools\":\n return `${countLines(content, /^- \\*\\*/gm)} tools`;\n case \"skills\":\n return `${countLines(content, /^### /gm)} skills`;\n case \"eval\": {\n const sessions = countLines(content, /^### Session/gm);\n return `${sessions} sessions logged`;\n }\n default:\n return \"unknown\";\n }\n}\n\nexport function getEcosystemStatus(\n mcpToolCount: number,\n amemConnected: boolean,\n): EcosystemStatus {\n const layers: LayerStatus[] = LAYER_FILES.map((entry) => {\n const filePath = path.join(home, entry.dir, entry.file);\n const exists = fs.existsSync(filePath);\n let summary = \"not configured\";\n\n if (exists) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n summary = getLayerSummary(entry.name, content);\n }\n\n return { name: entry.name, exists, path: filePath, summary };\n });\n\n return {\n layers,\n mcpConnected: mcpToolCount > 0,\n mcpToolCount,\n amemConnected,\n };\n}\n\nexport function readLayerFile(name: string): string | null {\n const entry = LAYER_FILES.find((l) => l.name === name);\n if (!entry) return null;\n const filePath = path.join(home, entry.dir, entry.file);\n if (!fs.existsSync(filePath)) return null;\n return fs.readFileSync(filePath, \"utf-8\").trim();\n}\n","import {\n createDatabase,\n recall,\n buildContext,\n storeMemory,\n consolidateMemories,\n cosineSimilarity,\n preloadEmbeddings,\n buildVectorIndex,\n type AmemDatabase,\n type RecallResult,\n type ContextResult,\n type StoreResult,\n type StoreOptions,\n type ConsolidationReport,\n} from \"@aman_asmuei/amem-core\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport fs from \"node:fs\";\n\nlet db: AmemDatabase | null = null;\nlet currentProject = \"global\";\n\nexport async function initMemory(project?: string): Promise<AmemDatabase> {\n if (db) return db;\n\n const amemDir = process.env.AMEM_DIR ?? path.join(os.homedir(), \".amem\");\n if (!fs.existsSync(amemDir)) fs.mkdirSync(amemDir, { recursive: true });\n\n const dbPath = process.env.AMEM_DB ?? path.join(amemDir, \"memory.db\");\n db = createDatabase(dbPath);\n currentProject = project ?? \"global\";\n\n preloadEmbeddings();\n\n setTimeout(() => {\n try { buildVectorIndex(db!); } catch {}\n }, 1000);\n\n return db;\n}\n\nexport function getDb(): AmemDatabase {\n if (!db) throw new Error(\"Memory not initialized — call initMemory() first\");\n return db;\n}\n\nexport function getProject(): string {\n return currentProject;\n}\n\nexport async function memoryRecall(query: string, opts?: {\n limit?: number;\n compact?: boolean;\n type?: string;\n tag?: string;\n minConfidence?: number;\n explain?: boolean;\n}): Promise<RecallResult> {\n return recall(getDb(), {\n query,\n limit: opts?.limit ?? 10,\n compact: opts?.compact ?? true,\n type: opts?.type,\n tag: opts?.tag,\n minConfidence: opts?.minConfidence,\n explain: opts?.explain,\n scope: currentProject,\n });\n}\n\nexport async function memoryContext(topic: string, maxTokens?: number): Promise<ContextResult> {\n return buildContext(getDb(), topic, { maxTokens, scope: currentProject });\n}\n\nexport async function memoryStore(opts: StoreOptions): Promise<StoreResult> {\n return storeMemory(getDb(), opts);\n}\n\nexport function memoryLog(sessionId: string, role: string, content: string): string {\n return getDb().appendLog({\n sessionId,\n role: role as \"user\" | \"assistant\" | \"system\",\n content,\n project: currentProject,\n metadata: {},\n });\n}\n\nexport function reminderCheck(): Array<{ id: string; content: string; dueAt: number | null; status: \"overdue\" | \"today\" | \"upcoming\"; scope: string }> {\n return getDb().checkReminders();\n}\n\nexport function memoryConsolidate(dryRun = false): ConsolidationReport {\n return consolidateMemories(getDb(), cosineSimilarity, {\n dryRun,\n maxStaleDays: 90,\n minConfidence: 0.3,\n minAccessCount: 0,\n });\n}\n\nexport { type RecallResult, type ContextResult, type StoreResult, type StoreOptions, type ConsolidationReport };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface ProfileTemplate {\n name: string;\n label: string;\n description: string;\n core: string;\n rules?: string;\n skills?: string;\n}\n\nexport const BUILT_IN_PROFILES: ProfileTemplate[] = [\n {\n name: \"coder\",\n label: \"Coder\",\n description: \"Direct, technical, code-first. Skips pleasantries, shows code.\",\n core: `# Coder\n\n## Identity\n- Role: Coder is your technical pair programmer\n- Personality: direct, precise, efficient — code speaks louder than words\n- Communication: lead with code, explain after. No fluff.\n- Values: simplicity over cleverness, working code over perfect code, tests over trust\n- Boundaries: won't pretend to be human, flags when out of depth\n\n### Appearance\n- Base: focused developer, dark hoodie, terminal glow\n- Style: minimal\n- Palette: green on black`,\n rules: `# Coder Rules\n\n## Always\n- Show code before explaining\n- Include error handling\n- Suggest tests for new code\n\n## Never\n- Write code without understanding the requirement\n- Push to main without tests\n- Ignore security implications`,\n },\n {\n name: \"writer\",\n label: \"Writer\",\n description: \"Creative, eloquent, story-driven. Focuses on narrative and engagement.\",\n core: `# Muse\n\n## Identity\n- Role: Muse is your creative writing partner\n- Personality: eloquent, imaginative, encouraging — finds the story in everything\n- Communication: explore ideas together, offer alternatives, celebrate good writing\n- Values: authenticity over formulas, voice over grammar, emotion over information\n- Boundaries: won't write without understanding the audience, flags when content is sensitive\n\n### Appearance\n- Base: warm expression, creative energy, pen in hand\n- Style: illustrated\n- Palette: warm amber and cream`,\n rules: `# Writer Rules\n\n## Always\n- Ask about the target audience\n- Offer 2-3 angle options before drafting\n- Read drafts aloud mentally for rhythm\n\n## Never\n- Use cliches without subverting them\n- Write without a clear hook\n- Ignore tone consistency`,\n },\n {\n name: \"researcher\",\n label: \"Researcher\",\n description: \"Analytical, thorough, citation-focused. Digs deep, verifies claims.\",\n core: `# Scholar\n\n## Identity\n- Role: Scholar is your research analyst\n- Personality: analytical, thorough, intellectually curious — never takes claims at face value\n- Communication: present findings with evidence, flag uncertainty, compare perspectives\n- Values: accuracy over speed, nuance over simplification, primary sources over summaries\n- Boundaries: clearly marks speculation vs fact, flags when evidence is insufficient\n\n### Appearance\n- Base: thoughtful expression, glasses, surrounded by notes\n- Style: minimal\n- Palette: navy and white`,\n rules: `# Researcher Rules\n\n## Always\n- Cite sources when making factual claims\n- Flag confidence level (high/medium/low)\n- Present multiple perspectives on contested topics\n\n## Never\n- Present speculation as fact\n- Ignore contradicting evidence\n- Oversimplify complex topics`,\n },\n];\n\n/**\n * Install a built-in profile template.\n */\nexport function installProfileTemplate(templateName: string, userName?: string): string | null {\n const template = BUILT_IN_PROFILES.find((t) => t.name === templateName);\n if (!template) return null;\n\n const profileDir = path.join(os.homedir(), \".acore\", \"profiles\", template.name);\n if (fs.existsSync(profileDir)) return `Profile already exists: ${template.name}`;\n\n fs.mkdirSync(profileDir, { recursive: true });\n\n // Write core.md\n let core = template.core;\n if (userName) {\n core += `\\n\\n---\\n\\n## Relationship\\n- Name: ${userName}\\n- Nicknames: []\\n- Communication: [updated over time]\\n- Detail level: balanced\\n`;\n }\n fs.writeFileSync(path.join(profileDir, \"core.md\"), core, \"utf-8\");\n\n // Write rules.md if template has one\n if (template.rules) {\n fs.writeFileSync(path.join(profileDir, \"rules.md\"), template.rules, \"utf-8\");\n }\n\n // Write skills.md if template has one\n if (template.skills) {\n fs.writeFileSync(path.join(profileDir, \"skills.md\"), template.skills, \"utf-8\");\n }\n\n return null; // success\n}\n","import pc from \"picocolors\";\nimport type {\n LLMClient,\n Message,\n ToolDefinition,\n ToolResultBlock,\n StreamChunk,\n} from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { assembleSystemPrompt } from \"./prompt.js\";\nimport { withRetry } from \"./retry.js\";\nimport { log } from \"./logger.js\";\n\nexport interface DelegationResult {\n profile: string;\n task: string;\n response: string;\n toolsUsed: string[];\n turns: number;\n success: boolean;\n error?: string;\n}\n\nexport interface DelegateOptions {\n maxTurns?: number; // max tool loop iterations (default: 10)\n silent?: boolean; // suppress output (default: false)\n tools?: ToolDefinition[]; // tools available to sub-agent\n}\n\nconst isRetryable = (err: unknown): boolean => {\n if (err instanceof Error) {\n const msg = err.message.toLowerCase();\n return msg.includes(\"rate\") || msg.includes(\"timeout\") || msg.includes(\"econnreset\");\n }\n return false;\n};\n\n/**\n * Run a task with a specific profile as a non-interactive sub-agent.\n * The sub-agent gets its own system prompt (from profile), runs a mini agent loop\n * (LLM → tools → LLM → ...), and returns the final text response.\n *\n * Reuses the parent's LLM client and MCP connections.\n */\nexport async function delegateTask(\n task: string,\n profile: string,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult> {\n const maxTurns = options.maxTurns ?? 10;\n const silent = options.silent ?? false;\n const tools = options.tools;\n\n try {\n // Load profile-specific system prompt\n const { prompt: systemPrompt } = assembleSystemPrompt(undefined, profile);\n\n // Build the delegation prompt\n const delegationPrompt = `${systemPrompt}\n\n<delegation>\nYou are being delegated a specific task by the primary agent. Complete this task thoroughly and return your result. You have access to tools if needed. Focus on the task — do not ask follow-up questions, just do your best with what you have.\n</delegation>`;\n\n const messages: Message[] = [\n { role: \"user\", content: task },\n ];\n\n const toolsUsed: string[] = [];\n let turns = 0;\n\n // Collect streamed text\n const onChunk: (chunk: StreamChunk) => void = silent\n ? () => {}\n : (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n };\n\n // Initial LLM call\n let response = await withRetry(\n () => client.chat(delegationPrompt, messages, onChunk, tools),\n { maxAttempts: 2, baseDelay: 1000, retryable: isRetryable },\n );\n\n messages.push(response.message);\n\n // Tool loop (same pattern as agent.ts)\n while (response.toolUses.length > 0 && turns < maxTurns) {\n turns++;\n\n const toolResults: ToolResultBlock[] = await Promise.all(\n response.toolUses.map(async (toolUse) => {\n if (!silent) {\n process.stdout.write(pc.dim(` [${profile}:${toolUse.name}...]\\n`));\n }\n toolsUsed.push(toolUse.name);\n\n try {\n const result = await mcpManager.callTool(toolUse.name, toolUse.input);\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: result,\n };\n } catch (err) {\n return {\n type: \"tool_result\" as const,\n tool_use_id: toolUse.id,\n content: `Error: ${err instanceof Error ? err.message : String(err)}`,\n is_error: true,\n };\n }\n }),\n );\n\n messages.push({ role: \"user\", content: toolResults });\n\n response = await withRetry(\n () => client.chat(delegationPrompt, messages, onChunk, tools),\n { maxAttempts: 2, baseDelay: 1000, retryable: isRetryable },\n );\n\n messages.push(response.message);\n }\n\n // Extract final text response\n const finalMessage = response.message;\n const responseText = typeof finalMessage.content === \"string\"\n ? finalMessage.content\n : finalMessage.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\");\n\n return {\n profile,\n task,\n response: responseText,\n toolsUsed: [...new Set(toolsUsed)],\n turns,\n success: true,\n };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n log.warn(\"delegate\", `Delegation to ${profile} failed: ${error}`);\n return {\n profile,\n task,\n response: \"\",\n toolsUsed: [],\n turns: 0,\n success: false,\n error,\n };\n }\n}\n\n/**\n * Delegate a task to multiple profiles in parallel.\n * Useful for: write + review, research + summarize, etc.\n */\nexport async function delegateParallel(\n tasks: Array<{ task: string; profile: string }>,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult[]> {\n return Promise.all(\n tasks.map(({ task, profile }) =>\n delegateTask(task, profile, client, mcpManager, { ...options, silent: true }),\n ),\n );\n}\n\n/**\n * Delegate a pipeline of tasks sequentially — each task receives the previous result.\n * Useful for: draft → review → polish pipelines.\n */\nexport async function delegatePipeline(\n steps: Array<{ profile: string; taskTemplate: string }>,\n initialInput: string,\n client: LLMClient,\n mcpManager: McpManager,\n options: DelegateOptions = {},\n): Promise<DelegationResult[]> {\n const results: DelegationResult[] = [];\n let previousResult = initialInput;\n\n for (const step of steps) {\n const task = step.taskTemplate.replace(\"{{input}}\", previousResult);\n\n if (!options.silent) {\n process.stdout.write(pc.dim(`\\n [delegating to ${step.profile}...]\\n`));\n }\n\n const result = await delegateTask(task, step.profile, client, mcpManager, {\n ...options,\n silent: true,\n });\n results.push(result);\n\n if (!result.success) break;\n previousResult = result.response;\n }\n\n return results;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport type { LLMClient, ToolDefinition } from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { delegateTask, delegateParallel, delegatePipeline, type DelegationResult } from \"./delegate.js\";\nimport { listProfiles } from \"./prompt.js\";\nimport { log } from \"./logger.js\";\n\n// --- Types ---\n\nexport interface TeamMember {\n profile: string;\n role: string;\n}\n\nexport interface Team {\n name: string;\n goal: string;\n coordinator: string; // profile name or \"default\" for main agent\n members: TeamMember[];\n workflow: \"pipeline\" | \"parallel\" | \"coordinator\";\n}\n\nexport interface TeamRunResult {\n team: string;\n task: string;\n workflow: string;\n results: DelegationResult[];\n finalOutput: string;\n success: boolean;\n}\n\n// --- Storage ---\n\nfunction getTeamsDir(): string {\n return path.join(os.homedir(), \".acore\", \"teams\");\n}\n\nfunction ensureTeamsDir(): string {\n const dir = getTeamsDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction teamPath(name: string): string {\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n return path.join(ensureTeamsDir(), `${slug}.json`);\n}\n\n// --- CRUD ---\n\nexport function createTeam(team: Team): void {\n const fp = teamPath(team.name);\n fs.writeFileSync(fp, JSON.stringify(team, null, 2), \"utf-8\");\n}\n\nexport function loadTeam(name: string): Team | null {\n const fp = teamPath(name);\n if (!fs.existsSync(fp)) return null;\n try {\n return JSON.parse(fs.readFileSync(fp, \"utf-8\")) as Team;\n } catch {\n return null;\n }\n}\n\nexport function listTeams(): Team[] {\n const dir = getTeamsDir();\n if (!fs.existsSync(dir)) return [];\n\n const teams: Team[] = [];\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const content = fs.readFileSync(path.join(dir, file), \"utf-8\");\n teams.push(JSON.parse(content) as Team);\n } catch { /* skip malformed */ }\n }\n return teams;\n}\n\nexport function deleteTeam(name: string): boolean {\n const fp = teamPath(name);\n if (!fs.existsSync(fp)) return false;\n fs.unlinkSync(fp);\n return true;\n}\n\n// --- Team Execution ---\n\n/**\n * Run a task with a team. Routes to the appropriate execution mode.\n */\nexport async function runTeam(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n process.stdout.write(pc.dim(`\\n Team: ${team.name} (${team.workflow} mode)\\n`));\n process.stdout.write(pc.dim(` Members: ${team.members.map((m) => m.profile).join(\", \")}\\n\\n`));\n\n switch (team.workflow) {\n case \"pipeline\":\n return runPipeline(team, task, client, mcpManager, tools);\n case \"parallel\":\n return runParallel(team, task, client, mcpManager, tools);\n case \"coordinator\":\n return runCoordinator(team, task, client, mcpManager, tools);\n default:\n return {\n team: team.name,\n task,\n workflow: team.workflow,\n results: [],\n finalOutput: `Unknown workflow mode: ${team.workflow}`,\n success: false,\n };\n }\n}\n\n/**\n * Pipeline mode: each member works sequentially, passing output to the next.\n */\nasync function runPipeline(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n const steps = team.members.map((m, i) => ({\n profile: m.profile,\n taskTemplate: i === 0\n ? `${task}\\n\\nYour role: ${m.role}`\n : `${m.role}. Here is the previous agent's work:\\n\\n{{input}}`,\n }));\n\n for (const step of steps) {\n process.stdout.write(pc.dim(` [${step.profile}: ${team.members.find((m) => m.profile === step.profile)?.role}...]\\n`));\n }\n\n const results = await delegatePipeline(steps, task, client, mcpManager, {\n tools,\n silent: true,\n });\n\n const lastResult = results[results.length - 1];\n const success = results.every((r) => r.success);\n\n return {\n team: team.name,\n task,\n workflow: \"pipeline\",\n results,\n finalOutput: lastResult?.response || \"\",\n success,\n };\n}\n\n/**\n * Parallel mode: all members work concurrently, coordinator merges results.\n */\nasync function runParallel(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n // Each member gets the task with their specific role\n const tasks = team.members.map((m) => ({\n profile: m.profile,\n task: `${task}\\n\\nYour specific role: ${m.role}. Focus only on your role.`,\n }));\n\n for (const m of team.members) {\n process.stdout.write(pc.dim(` [${m.profile}: ${m.role} (parallel)...]\\n`));\n }\n\n const results = await delegateParallel(tasks, client, mcpManager, { tools });\n\n // Merge results using coordinator (or main agent)\n const mergeInput = results\n .filter((r) => r.success)\n .map((r) => `[${r.profile} — ${team.members.find((m) => m.profile === r.profile)?.role}]:\\n${r.response}`)\n .join(\"\\n\\n---\\n\\n\");\n\n process.stdout.write(pc.dim(` [merging results...]\\n`));\n\n const mergeResult = await delegateTask(\n `You are the team coordinator. Multiple agents worked on this task in parallel. Merge their outputs into a single cohesive result. Keep the best parts from each.\\n\\nOriginal task: ${task}\\n\\n${mergeInput}`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools, silent: true },\n );\n\n return {\n team: team.name,\n task,\n workflow: \"parallel\",\n results: [...results, mergeResult],\n finalOutput: mergeResult.response,\n success: results.some((r) => r.success),\n };\n}\n\n/**\n * Coordinator mode: coordinator LLM decides how to route tasks to members.\n * Most flexible — coordinator analyzes the task and creates its own execution plan.\n */\nasync function runCoordinator(\n team: Team,\n task: string,\n client: LLMClient,\n mcpManager: McpManager,\n tools?: ToolDefinition[],\n): Promise<TeamRunResult> {\n const memberDescriptions = team.members\n .map((m) => `- ${m.profile}: ${m.role}`)\n .join(\"\\n\");\n\n // Step 1: Coordinator plans the work\n process.stdout.write(pc.dim(` [coordinator planning...]\\n`));\n\n const planResult = await delegateTask(\n `You are the coordinator of a team. Your job is to break down this task and decide which team members should handle each part.\n\nTeam members:\n${memberDescriptions}\n\nTask: ${task}\n\nRespond with a JSON array of assignments:\n[{\"profile\": \"member-name\", \"subtask\": \"what they should do\"}]\n\nOnly use the JSON array, no other text.`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools: undefined, silent: true, maxTurns: 0 },\n );\n\n if (!planResult.success) {\n return {\n team: team.name,\n task,\n workflow: \"coordinator\",\n results: [planResult],\n finalOutput: `Coordinator failed to plan: ${planResult.error}`,\n success: false,\n };\n }\n\n // Step 2: Parse assignments\n let assignments: Array<{ profile: string; subtask: string }>;\n try {\n let cleaned = planResult.response.trim();\n const codeBlockMatch = cleaned.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (codeBlockMatch) cleaned = codeBlockMatch[1].trim();\n assignments = JSON.parse(cleaned);\n } catch {\n // Fallback: run all members in parallel with the full task\n assignments = team.members.map((m) => ({ profile: m.profile, subtask: `${m.role}: ${task}` }));\n }\n\n // Step 3: Execute assignments in parallel\n for (const a of assignments) {\n process.stdout.write(pc.dim(` [${a.profile}: ${a.subtask.slice(0, 60)}...]\\n`));\n }\n\n const results = await delegateParallel(\n assignments.map((a) => ({ profile: a.profile, task: a.subtask })),\n client,\n mcpManager,\n { tools },\n );\n\n // Step 4: Coordinator merges\n const mergeInput = results\n .filter((r) => r.success)\n .map((r, i) => `[${assignments[i]?.profile} — ${assignments[i]?.subtask}]:\\n${r.response}`)\n .join(\"\\n\\n---\\n\\n\");\n\n process.stdout.write(pc.dim(` [coordinator merging...]\\n`));\n\n const mergeResult = await delegateTask(\n `You are the team coordinator. Your team members completed their assigned work. Combine their outputs into a single cohesive, polished result.\\n\\nOriginal task: ${task}\\n\\n${mergeInput}`,\n team.coordinator === \"default\" ? team.members[0]?.profile || \"default\" : team.coordinator,\n client,\n mcpManager,\n { tools, silent: true },\n );\n\n return {\n team: team.name,\n task,\n workflow: \"coordinator\",\n results: [...results, mergeResult],\n finalOutput: mergeResult.response,\n success: results.some((r) => r.success),\n };\n}\n\n// --- Formatting ---\n\nexport function formatTeam(team: Team): string {\n const lines: string[] = [];\n lines.push(`Team: ${pc.bold(team.name)}`);\n lines.push(`Goal: ${team.goal}`);\n lines.push(`Mode: ${team.workflow}`);\n lines.push(`Coordinator: ${team.coordinator}`);\n lines.push(\"\");\n lines.push(\"Members:\");\n for (const m of team.members) {\n lines.push(` ${pc.bold(m.profile)} — ${m.role}`);\n }\n return lines.join(\"\\n\");\n}\n\nexport function formatTeamResult(result: TeamRunResult): string {\n const lines: string[] = [];\n lines.push(`\\n${pc.bold(`Team: ${result.team}`)} (${result.workflow})`);\n\n for (const r of result.results) {\n const status = r.success ? pc.green(\"✓\") : pc.red(\"✗\");\n const tools = r.toolsUsed.length > 0 ? pc.dim(` (${r.toolsUsed.join(\", \")})`) : \"\";\n lines.push(` ${status} ${pc.bold(r.profile)}${tools}`);\n }\n\n lines.push(\"\");\n lines.push(result.finalOutput);\n\n return lines.join(\"\\n\");\n}\n\n// --- Built-in Team Templates ---\n\nexport const BUILT_IN_TEAMS: Team[] = [\n {\n name: \"content-team\",\n goal: \"Create and publish high-quality content\",\n coordinator: \"default\",\n members: [\n { profile: \"writer\", role: \"Draft compelling content with engaging narrative\" },\n { profile: \"researcher\", role: \"Fact-check claims and add citations\" },\n ],\n workflow: \"pipeline\",\n },\n {\n name: \"dev-team\",\n goal: \"Build and review code with quality assurance\",\n coordinator: \"default\",\n members: [\n { profile: \"coder\", role: \"Write clean, tested implementation code\" },\n { profile: \"researcher\", role: \"Review for security, performance, and best practices\" },\n ],\n workflow: \"pipeline\",\n },\n {\n name: \"research-team\",\n goal: \"Deep research with multiple perspectives\",\n coordinator: \"default\",\n members: [\n { profile: \"researcher\", role: \"Research the topic thoroughly with citations\" },\n { profile: \"writer\", role: \"Synthesize findings into clear, readable format\" },\n ],\n workflow: \"pipeline\",\n },\n];\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { log } from \"./logger.js\";\n\n// --- Types ---\n\nexport interface PlanStep {\n text: string;\n done: boolean;\n}\n\nexport interface Plan {\n name: string;\n goal: string;\n steps: PlanStep[];\n createdAt: string;\n updatedAt: string;\n active: boolean;\n}\n\n// --- Paths ---\n\nfunction getPlansDir(): string {\n // Project-local plans if .acore exists, otherwise global\n const localDir = path.join(process.cwd(), \".acore\", \"plans\");\n const localAcore = path.join(process.cwd(), \".acore\");\n if (fs.existsSync(localAcore)) return localDir;\n return path.join(os.homedir(), \".acore\", \"plans\");\n}\n\nfunction ensurePlansDir(): string {\n const dir = getPlansDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction planPath(name: string): string {\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n return path.join(ensurePlansDir(), `${slug}.md`);\n}\n\n// --- Serialization ---\n\nfunction serializePlan(plan: Plan): string {\n const lines: string[] = [];\n lines.push(`# ${plan.name}`);\n lines.push(\"\");\n lines.push(`**Goal:** ${plan.goal}`);\n lines.push(`**Created:** ${plan.createdAt}`);\n lines.push(`**Updated:** ${plan.updatedAt}`);\n lines.push(`**Active:** ${plan.active}`);\n lines.push(\"\");\n lines.push(\"## Steps\");\n lines.push(\"\");\n for (const step of plan.steps) {\n lines.push(`- [${step.done ? \"x\" : \" \"}] ${step.text}`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction parsePlan(content: string, filePath: string): Plan | null {\n try {\n const nameMatch = content.match(/^# (.+)/m);\n const goalMatch = content.match(/\\*\\*Goal:\\*\\*\\s*(.+)/);\n const createdMatch = content.match(/\\*\\*Created:\\*\\*\\s*(.+)/);\n const updatedMatch = content.match(/\\*\\*Updated:\\*\\*\\s*(.+)/);\n const activeMatch = content.match(/\\*\\*Active:\\*\\*\\s*(.+)/);\n\n const name = nameMatch?.[1]?.trim() || path.basename(filePath, \".md\");\n const goal = goalMatch?.[1]?.trim() || \"\";\n const createdAt = createdMatch?.[1]?.trim() || \"\";\n const updatedAt = updatedMatch?.[1]?.trim() || \"\";\n const active = activeMatch?.[1]?.trim() === \"true\";\n\n // Parse checkbox steps\n const steps: PlanStep[] = [];\n const stepMatches = content.matchAll(/- \\[([ x])\\] (.+)/g);\n for (const match of stepMatches) {\n steps.push({\n done: match[1] === \"x\",\n text: match[2].trim(),\n });\n }\n\n return { name, goal, steps, createdAt, updatedAt, active };\n } catch (err) {\n log.debug(\"plans\", \"Failed to parse plan: \" + filePath, err);\n return null;\n }\n}\n\n// --- CRUD ---\n\nexport function createPlan(name: string, goal: string, steps: string[]): Plan {\n const now = new Date().toISOString().split(\"T\")[0];\n const plan: Plan = {\n name,\n goal,\n steps: steps.map((text) => ({ text, done: false })),\n createdAt: now,\n updatedAt: now,\n active: true,\n };\n\n // Deactivate any currently active plan\n const existing = listPlans();\n for (const p of existing) {\n if (p.active) {\n p.active = false;\n p.updatedAt = now;\n savePlan(p);\n }\n }\n\n savePlan(plan);\n return plan;\n}\n\nexport function savePlan(plan: Plan): void {\n const fp = planPath(plan.name);\n fs.writeFileSync(fp, serializePlan(plan), \"utf-8\");\n}\n\nexport function loadPlan(name: string): Plan | null {\n const fp = planPath(name);\n if (!fs.existsSync(fp)) return null;\n const content = fs.readFileSync(fp, \"utf-8\");\n return parsePlan(content, fp);\n}\n\nexport function listPlans(): Plan[] {\n const dir = getPlansDir();\n if (!fs.existsSync(dir)) return [];\n\n const plans: Plan[] = [];\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith(\".md\")) continue;\n const fp = path.join(dir, file);\n const content = fs.readFileSync(fp, \"utf-8\");\n const plan = parsePlan(content, fp);\n if (plan) plans.push(plan);\n }\n\n return plans;\n}\n\nexport function getActivePlan(): Plan | null {\n const plans = listPlans();\n return plans.find((p) => p.active) || null;\n}\n\n// --- Operations ---\n\nexport function markStepDone(plan: Plan, stepIndex: number): boolean {\n if (stepIndex < 0 || stepIndex >= plan.steps.length) return false;\n plan.steps[stepIndex].done = true;\n plan.updatedAt = new Date().toISOString().split(\"T\")[0];\n savePlan(plan);\n return true;\n}\n\nexport function markStepUndone(plan: Plan, stepIndex: number): boolean {\n if (stepIndex < 0 || stepIndex >= plan.steps.length) return false;\n plan.steps[stepIndex].done = false;\n plan.updatedAt = new Date().toISOString().split(\"T\")[0];\n savePlan(plan);\n return true;\n}\n\nexport function setActivePlan(name: string): Plan | null {\n const now = new Date().toISOString().split(\"T\")[0];\n\n // Deactivate all\n const plans = listPlans();\n for (const p of plans) {\n if (p.active) {\n p.active = false;\n p.updatedAt = now;\n savePlan(p);\n }\n }\n\n // Activate target\n const target = loadPlan(name);\n if (!target) return null;\n target.active = true;\n target.updatedAt = now;\n savePlan(target);\n return target;\n}\n\n// --- Formatting ---\n\nexport function formatPlan(plan: Plan): string {\n const total = plan.steps.length;\n const done = plan.steps.filter((s) => s.done).length;\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n const bar = progressBar(pct);\n\n const lines: string[] = [];\n lines.push(`Plan: ${plan.name} ${plan.active ? \"(active)\" : \"(inactive)\"}`);\n lines.push(`Goal: ${plan.goal}`);\n lines.push(`Progress: ${bar} ${done}/${total} (${pct}%)`);\n lines.push(\"\");\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const marker = step.done ? \"✓\" : \" \";\n const num = String(i + 1).padStart(2, \" \");\n lines.push(` ${num}. [${marker}] ${step.text}`);\n }\n\n if (done === total && total > 0) {\n lines.push(\"\\n All steps complete!\");\n } else {\n const next = plan.steps.findIndex((s) => !s.done);\n if (next >= 0) {\n lines.push(`\\n Next: Step ${next + 1} — ${plan.steps[next].text}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatPlanForPrompt(plan: Plan): string {\n const total = plan.steps.length;\n const done = plan.steps.filter((s) => s.done).length;\n\n const lines: string[] = [];\n lines.push(`<active-plan name=\"${plan.name}\" progress=\"${done}/${total}\">`);\n lines.push(`Goal: ${plan.goal}`);\n lines.push(\"\");\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n lines.push(`- [${step.done ? \"x\" : \" \"}] Step ${i + 1}: ${step.text}`);\n }\n\n const next = plan.steps.findIndex((s) => !s.done);\n if (next >= 0) {\n lines.push(\"\");\n lines.push(`Current focus: Step ${next + 1} — ${plan.steps[next].text}`);\n lines.push(\"After completing the current step, remind the user to mark it done with /plan done and suggest committing their work.\");\n }\n\n lines.push(\"</active-plan>\");\n return lines.join(\"\\n\");\n}\n\nfunction progressBar(pct: number): string {\n const filled = Math.round(pct / 5);\n const empty = 20 - filled;\n return `[${\"█\".repeat(filled)}${\"░\".repeat(empty)}]`;\n}\n","import pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport type { Message } from \"./llm/types.js\";\nimport type { HooksConfig } from \"./config.js\";\nimport { log } from \"./logger.js\";\nimport {\n computePersonality,\n syncPersonalityToCore,\n formatWellbeingNudge,\n} from \"./personality.js\";\nimport { memoryRecall, memoryContext, reminderCheck, memoryLog } from \"./memory.js\";\n\nfunction getTimeContext(): string {\n const now = new Date();\n const hour = now.getHours();\n const days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n const day = days[now.getDay()];\n\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const timeStr = now.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n const dateStr = now.toLocaleDateString();\n\n return `<time-context>\\nCurrent time: ${dateStr} ${timeStr} (${period}, ${day})\\nAdapt your tone naturally — don't announce the time, just be contextually appropriate.\\n</time-context>`;\n}\n\nexport interface HookContext {\n mcpManager: McpManager;\n config: HooksConfig;\n}\n\nlet isHookCall = false;\nlet sessionStartTime: number = Date.now();\n\nexport function getSessionStartTime(): number {\n return sessionStartTime;\n}\n\nexport async function onSessionStart(\n ctx: HookContext,\n): Promise<{ greeting?: string; contextInjection?: string; firstRun?: boolean; visibleReminders?: string[]; resumeTopic?: string }> {\n let greeting = \"\";\n let contextInjection = \"\";\n let firstRun = false;\n let resumeTopic: string | undefined;\n const visibleReminders: string[] = [];\n\n // Detect first run via memory_recall\n try {\n isHookCall = true;\n const recallResult = await memoryRecall(\"*\", { limit: 1 });\n firstRun = recallResult.total === 0;\n } catch {\n firstRun = true;\n } finally {\n isHookCall = false;\n }\n\n if (firstRun) {\n // First-run context injection\n contextInjection = `<first-session>\nThis is your FIRST conversation with this user. Introduce yourself warmly:\n- Share your name and that you're their personal AI companion\n- Mention you'll remember what matters across conversations\n- Ask what they'd like to be called\n- Keep it to 3-4 sentences, natural tone\n</first-session>`;\n\n // Still add time context\n const timeContext = getTimeContext();\n contextInjection = `<session-context>\\n${timeContext}\\n</session-context>\\n${contextInjection}`;\n\n return {\n greeting: undefined,\n contextInjection,\n firstRun,\n visibleReminders,\n resumeTopic: undefined,\n };\n }\n\n // Returning user flow\n if (ctx.config.memoryRecall) {\n try {\n isHookCall = true;\n const contextResult = await memoryContext(\"session context\");\n if (contextResult.memoriesUsed > 0) {\n greeting += contextResult.text;\n }\n } catch (err) {\n log.warn(\"hooks\", \"memory_context recall failed\", err);\n } finally {\n isHookCall = false;\n }\n }\n\n if (ctx.config.sessionResume) {\n try {\n isHookCall = true;\n const result = await ctx.mcpManager.callTool(\"identity_summary\", {});\n if (result && !result.startsWith(\"Error\")) {\n if (greeting) greeting += \"\\n\";\n greeting += result;\n\n // Extract resume topic\n const topicMatch = result.match(/(?:resume|last|topic)[:\\s]*(.+?)(?:\\n|$)/i);\n if (topicMatch) {\n resumeTopic = topicMatch[1].trim();\n }\n }\n } catch (err) {\n log.warn(\"hooks\", \"identity_summary failed\", err);\n } finally {\n isHookCall = false;\n }\n }\n\n // Time context\n const timeContext = getTimeContext();\n if (greeting) greeting += \"\\n\" + timeContext;\n else greeting = timeContext;\n\n // Check reminders\n try {\n isHookCall = true;\n const reminders = reminderCheck();\n if (reminders.length > 0) {\n const reminderText = reminders.map(r => r.content).join(\"\\n\");\n greeting += \"\\n\\n<pending-reminders>\\n\" + reminderText + \"\\n</pending-reminders>\";\n for (const r of reminders) {\n visibleReminders.push(r.content);\n }\n }\n } catch (err) {\n log.debug(\"hooks\", \"reminder_check failed\", err);\n } finally {\n isHookCall = false;\n }\n\n // Compute initial personality state\n if (ctx.config.personalityAdapt !== false) {\n sessionStartTime = Date.now();\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const state = computePersonality({\n timePeriod: period,\n sessionMinutes: 0,\n turnCount: 0,\n });\n\n // Sync to acore (fire-and-forget)\n syncPersonalityToCore(state, ctx.mcpManager).catch(() => {});\n\n // Add wellbeing nudge to context if applicable\n const nudge = formatWellbeingNudge(state);\n if (nudge) {\n greeting += \"\\n\" + nudge;\n }\n }\n\n if (greeting) {\n contextInjection = `<session-context>\\n${greeting}\\n</session-context>`;\n }\n\n return {\n greeting: greeting || undefined,\n contextInjection: contextInjection || undefined,\n firstRun,\n visibleReminders,\n resumeTopic,\n };\n}\n\nexport async function onBeforeToolExec(\n toolName: string,\n toolArgs: Record<string, unknown>,\n ctx: HookContext,\n): Promise<{ allow: boolean; reason?: string }> {\n if (!ctx.config.rulesCheck || isHookCall) {\n return { allow: true };\n }\n\n if (toolName === \"rules_check\") {\n return { allow: true };\n }\n\n try {\n isHookCall = true;\n const description = `${toolName}(${JSON.stringify(toolArgs)})`;\n const result = await ctx.mcpManager.callTool(\"rules_check\", {\n action: description,\n });\n\n try {\n const parsed = JSON.parse(result) as {\n violations?: string[];\n };\n if (parsed.violations && parsed.violations.length > 0) {\n return {\n allow: false,\n reason: parsed.violations.join(\"; \"),\n };\n }\n } catch (err) {\n log.debug(\"hooks\", \"rules_check parse failed\", err);\n }\n\n return { allow: true };\n } catch (err) {\n log.warn(\"hooks\", \"rules_check call failed\", err);\n return { allow: true };\n } finally {\n isHookCall = false;\n }\n}\n\nexport async function onWorkflowMatch(\n userInput: string,\n ctx: HookContext,\n): Promise<{ name: string; steps: string } | null> {\n if (!ctx.config.workflowSuggest) {\n return null;\n }\n\n try {\n isHookCall = true;\n const result = await ctx.mcpManager.callTool(\"workflow_list\", {});\n\n const workflows = JSON.parse(result) as Array<{\n name: string;\n description?: string;\n steps?: string[];\n }>;\n\n const inputLower = userInput.toLowerCase();\n\n for (const wf of workflows) {\n const nameLower = wf.name.toLowerCase();\n\n // Check if user input contains workflow name\n if (inputLower.includes(nameLower)) {\n const steps = (wf.steps || [])\n .map((s, i) => `${i + 1}. ${s}`)\n .join(\"\\n\");\n return { name: wf.name, steps };\n }\n\n // Check significant words from description\n if (wf.description) {\n const words = wf.description\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n .map((w) => w.toLowerCase());\n\n for (const word of words) {\n if (inputLower.includes(word)) {\n const steps = (wf.steps || [])\n .map((s, i) => `${i + 1}. ${s}`)\n .join(\"\\n\");\n return { name: wf.name, steps };\n }\n }\n }\n }\n\n return null;\n } catch (err) {\n log.debug(\"hooks\", \"workflow_list failed\", err);\n return null;\n } finally {\n isHookCall = false;\n }\n}\n\nexport async function onSessionEnd(\n ctx: HookContext,\n messages: Message[],\n sessionId: string,\n): Promise<void> {\n try {\n // Auto-save conversation to amem memory_log\n if (ctx.config.autoSessionSave && messages.length > 2) {\n console.log(pc.dim(\"\\n Saving conversation to memory...\"));\n\n // Save last 50 text messages to memory_log\n const textMessages = messages\n .filter((m) => typeof m.content === \"string\")\n .slice(-50);\n\n for (const msg of textMessages) {\n try {\n isHookCall = true;\n memoryLog(sessionId, msg.role, (msg.content as string).slice(0, 5000));\n } catch (err) {\n log.debug(\"hooks\", \"memory_log write failed for \" + sessionId, err);\n } finally {\n isHookCall = false;\n }\n }\n\n // Update session resume in identity\n let lastUserMsg = \"\";\n for (let i = messages.length - 1; i >= 0; i--) {\n if (\n messages[i].role === \"user\" &&\n typeof messages[i].content === \"string\"\n ) {\n lastUserMsg = messages[i].content as string;\n break;\n }\n }\n\n if (lastUserMsg) {\n try {\n isHookCall = true;\n await ctx.mcpManager.callTool(\"identity_update_session\", {\n resume: lastUserMsg.slice(0, 200),\n topics: \"See conversation history\",\n decisions: \"See conversation history\",\n });\n } finally {\n isHookCall = false;\n }\n }\n\n console.log(pc.dim(` Saved ${textMessages.length} messages (session: ${sessionId})`));\n }\n\n // Update per-project .acore/context.md if it exists\n const projectContextPath = path.join(process.cwd(), \".acore\", \"context.md\");\n if (fs.existsSync(projectContextPath) && messages.length > 2) {\n try {\n let contextContent = fs.readFileSync(projectContextPath, \"utf-8\");\n const now = new Date().toISOString().split(\"T\")[0];\n\n // Extract last user message for resume\n let lastUserMsg = \"\";\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\" && typeof messages[i].content === \"string\") {\n lastUserMsg = (messages[i].content as string).slice(0, 200);\n break;\n }\n }\n\n // Update Session section in context.md\n const sessionPattern = /## Session\\n[\\s\\S]*?(?=\\n## |$)/;\n if (sessionPattern.test(contextContent)) {\n const newSession = `## Session\\n- Last updated: ${now}\\n- Resume: ${lastUserMsg || \"See conversation history\"}\\n- Active topics: [see memory]\\n- Recent decisions: [see memory]\\n- Temp notes: [cleared]`;\n contextContent = contextContent.replace(sessionPattern, newSession);\n fs.writeFileSync(projectContextPath, contextContent, \"utf-8\");\n log.debug(\"hooks\", `Updated project context: ${projectContextPath}`);\n }\n } catch (err) {\n log.debug(\"hooks\", \"project context update failed\", err);\n }\n }\n\n // Persist final personality state\n if (ctx.config.personalityAdapt !== false) {\n const sessionMinutes = Math.round((Date.now() - sessionStartTime) / 60000);\n const hour = new Date().getHours();\n let period: string;\n if (hour < 6) period = \"late-night\";\n else if (hour < 12) period = \"morning\";\n else if (hour < 17) period = \"afternoon\";\n else if (hour < 21) period = \"evening\";\n else period = \"night\";\n\n const turnCount = messages.filter((m) => m.role === \"user\").length;\n const finalState = computePersonality({\n timePeriod: period,\n sessionMinutes,\n turnCount,\n });\n\n try {\n isHookCall = true;\n await syncPersonalityToCore(finalState, ctx.mcpManager);\n } finally {\n isHookCall = false;\n }\n }\n\n // Session rating prompt\n if (ctx.config.evalPrompt) {\n const rating = await p.select({\n message: \"Quick rating for this session?\",\n options: [\n { value: \"great\", label: \"Great\" },\n { value: \"good\", label: \"Good\" },\n { value: \"okay\", label: \"Okay\" },\n { value: \"skip\", label: \"Skip\" },\n ],\n initialValue: \"skip\",\n });\n\n if (!p.isCancel(rating) && rating !== \"skip\") {\n try {\n isHookCall = true;\n await ctx.mcpManager.callTool(\"eval_log\", {\n rating: rating as string,\n highlights: \"Quick session rating\",\n improvements: \"\",\n });\n } finally {\n isHookCall = false;\n }\n }\n }\n } catch (err) {\n log.warn(\"hooks\", \"session end hook failed\", err);\n }\n}\n","import type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\nexport interface PersonalityState {\n currentRead: string;\n energy: \"high-drive\" | \"steady\" | \"reflective\";\n activeMode: \"Default\" | \"Focused Work\" | \"Creative\" | \"Personal\";\n sleepReminder: boolean;\n wellbeingNudge: string | null;\n sentiment: SentimentRead;\n}\n\nexport interface SentimentRead {\n frustration: number; // 0-1\n excitement: number; // 0-1\n confusion: number; // 0-1\n fatigue: number; // 0-1\n dominant: \"neutral\" | \"frustrated\" | \"excited\" | \"confused\" | \"fatigued\";\n}\n\nexport interface PersonalitySignals {\n timePeriod: string;\n sessionMinutes: number;\n turnCount: number;\n recentMessages?: string[]; // last N user messages for sentiment analysis\n}\n\n// --- Sentiment Detection (keyword-based, zero latency) ---\n\nconst FRUSTRATION_SIGNALS = [\n /\\b(ugh|argh|damn|dammit|wtf|ffs|shit|fuck|crap|hate this|stupid|broken|still not|doesn't work|not working|won't work|keeps failing|again\\?!|what the hell|for the love of|give up|giving up|fed up)\\b/i,\n /\\b(why (is|does|won't|can't|isn't)|same (error|issue|problem|bug)|tried everything|nothing works|no idea|lost|stuck|frustrated|annoying|impossible)\\b/i,\n /!{2,}/, // multiple exclamation marks\n /\\?{2,}/, // multiple question marks (exasperation)\n];\n\nconst EXCITEMENT_SIGNALS = [\n /\\b(amazing|awesome|perfect|brilliant|love it|yes!|nice!|great!|finally|it works|nailed it|beautiful|incredible|exactly|that's it|hell yeah|wow|woah|let's go)\\b/i,\n /\\b(excited|pumped|stoked|can't wait|this is great|so cool|love this)\\b/i,\n /!{1,}.*(!|🎉|🚀|✨|💪|🔥)/,\n];\n\nconst CONFUSION_SIGNALS = [\n /\\b(confused|don't understand|what do you mean|huh\\??|makes no sense|i'm lost|unclear|what\\?|how does that|wait what|can you explain|i don't get)\\b/i,\n /\\b(which one|what's the difference|should i|not sure (if|what|how|why|whether))\\b/i,\n];\n\nconst FATIGUE_SIGNALS = [\n /\\b(tired|exhausted|long day|need (a )?break|calling it|wrapping up|done for (now|today)|heading (to bed|off)|good night|gn|signing off|one more thing then|last one)\\b/i,\n /\\b(brain (is )?fried|can't think|eyes (are )?heavy|running on fumes|barely awake)\\b/i,\n];\n\nfunction scorePatterns(text: string, patterns: RegExp[]): number {\n let hits = 0;\n for (const p of patterns) {\n if (p.test(text)) hits++;\n }\n return Math.min(hits / patterns.length, 1);\n}\n\n/**\n * Detect sentiment from recent user messages.\n * Lightweight keyword-based analysis — no LLM calls.\n */\nexport function detectSentiment(recentMessages: string[]): SentimentRead {\n if (recentMessages.length === 0) {\n return { frustration: 0, excitement: 0, confusion: 0, fatigue: 0, dominant: \"neutral\" };\n }\n\n // Weight recent messages more heavily (last message = 1.0, second-last = 0.6, third = 0.3)\n const weights = [1.0, 0.6, 0.3, 0.2, 0.1];\n let frustration = 0, excitement = 0, confusion = 0, fatigue = 0;\n let totalWeight = 0;\n\n for (let i = 0; i < Math.min(recentMessages.length, weights.length); i++) {\n const msg = recentMessages[recentMessages.length - 1 - i];\n const w = weights[i];\n totalWeight += w;\n\n frustration += scorePatterns(msg, FRUSTRATION_SIGNALS) * w;\n excitement += scorePatterns(msg, EXCITEMENT_SIGNALS) * w;\n confusion += scorePatterns(msg, CONFUSION_SIGNALS) * w;\n fatigue += scorePatterns(msg, FATIGUE_SIGNALS) * w;\n }\n\n if (totalWeight > 0) {\n frustration /= totalWeight;\n excitement /= totalWeight;\n confusion /= totalWeight;\n fatigue /= totalWeight;\n }\n\n // Determine dominant sentiment\n const scores = { frustrated: frustration, excited: excitement, confused: confusion, fatigued: fatigue };\n const maxKey = Object.entries(scores).reduce((a, b) => a[1] > b[1] ? a : b);\n const dominant = maxKey[1] > 0.15 ? maxKey[0] as SentimentRead[\"dominant\"] : \"neutral\";\n\n return { frustration, excitement, confusion, fatigue, dominant };\n}\n\n// --- Personality Computation ---\n\n/**\n * Compute personality state from current signals including sentiment.\n * Pure function — no side effects.\n */\nexport function computePersonality(signals: PersonalitySignals): PersonalityState {\n const { timePeriod, sessionMinutes, turnCount, recentMessages } = signals;\n\n // Detect sentiment from recent messages\n const sentiment = detectSentiment(recentMessages || []);\n\n // Energy curve: time + session + sentiment\n let energy: PersonalityState[\"energy\"] = \"steady\";\n if (timePeriod === \"morning\" && sentiment.dominant !== \"fatigued\") {\n energy = \"high-drive\";\n } else if (timePeriod === \"late-night\" || (timePeriod === \"night\" && sessionMinutes > 45)) {\n energy = \"reflective\";\n } else if (sentiment.dominant === \"fatigued\") {\n energy = \"reflective\";\n } else if (sentiment.dominant === \"excited\") {\n energy = \"high-drive\"; // match their energy\n } else if (timePeriod === \"afternoon\" && turnCount > 20) {\n energy = \"reflective\";\n }\n\n // Active mode: time + sentiment\n let activeMode: PersonalityState[\"activeMode\"] = \"Default\";\n if (timePeriod === \"late-night\") {\n activeMode = \"Personal\";\n } else if (sentiment.dominant === \"frustrated\" || sentiment.dominant === \"fatigued\") {\n activeMode = \"Personal\"; // warm, patient when they're struggling\n }\n\n // Current read: combines time context + sentiment\n const readParts: string[] = [];\n\n // Time-based read\n switch (timePeriod) {\n case \"late-night\":\n readParts.push(\"late night session\");\n if (sessionMinutes > 60) readParts.push(\"been going a while\");\n else readParts.push(\"quiet hours\");\n break;\n case \"morning\":\n readParts.push(\"morning session\");\n if (turnCount <= 3) readParts.push(\"just getting started\");\n else readParts.push(\"building momentum\");\n break;\n case \"afternoon\":\n readParts.push(\"afternoon session\");\n if (turnCount > 15) readParts.push(\"deep in flow\");\n else readParts.push(\"steady pace\");\n break;\n case \"evening\":\n readParts.push(\"evening session\");\n if (sessionMinutes > 60) readParts.push(\"long session\");\n break;\n case \"night\":\n readParts.push(\"night session\");\n if (sessionMinutes > 45) readParts.push(\"getting late\");\n break;\n }\n\n // Sentiment-based read\n switch (sentiment.dominant) {\n case \"frustrated\":\n readParts.push(\"user seems stuck or frustrated\");\n break;\n case \"excited\":\n readParts.push(\"user is energized and making progress\");\n break;\n case \"confused\":\n readParts.push(\"user may need clearer explanations\");\n break;\n case \"fatigued\":\n readParts.push(\"user seems tired\");\n break;\n }\n\n const currentRead = readParts.join(\", \");\n\n // Sleep guardian\n const sleepReminder =\n (timePeriod === \"late-night\" && sessionMinutes > 60) ||\n (timePeriod === \"night\" && sessionMinutes > 90);\n\n // Wellbeing nudges (beyond sleep)\n let wellbeingNudge: string | null = null;\n\n if (sleepReminder && sentiment.dominant === \"frustrated\") {\n wellbeingNudge = \"sleep-frustrated\";\n } else if (sleepReminder) {\n wellbeingNudge = \"sleep\";\n } else if (sentiment.dominant === \"frustrated\" && sessionMinutes > 90) {\n wellbeingNudge = \"break-frustrated\";\n } else if (sentiment.dominant === \"frustrated\" && turnCount > 15) {\n wellbeingNudge = \"step-back\";\n } else if (sentiment.dominant === \"fatigued\") {\n wellbeingNudge = \"rest\";\n } else if (sessionMinutes > 120) {\n wellbeingNudge = \"break-long-session\";\n }\n\n return { currentRead, energy, activeMode, sleepReminder, wellbeingNudge, sentiment };\n}\n\n// --- Wellbeing Nudge Formatting ---\n\nconst WELLBEING_NUDGES: Record<string, string> = {\n \"sleep\": `<wellbeing>\nIt's late and this session has been running a while. When there's a natural pause, gently mention they might want to wrap up soon. One brief mention is enough — don't be pushy.\n</wellbeing>`,\n\n \"sleep-frustrated\": `<wellbeing>\nIt's late, the session has been long, and the user seems frustrated. This is a tough combination. Acknowledge what they're dealing with is hard, suggest they sleep on it — fresh eyes in the morning often solve what hours of late-night debugging can't. Be warm, not condescending.\n</wellbeing>`,\n\n \"break-frustrated\": `<wellbeing>\nThe user has been at this for over 90 minutes and seems frustrated. If the conversation allows, gently suggest stepping away for a few minutes — a short break often unblocks what persistence can't. Frame it as a strategy, not giving up.\n</wellbeing>`,\n\n \"step-back\": `<wellbeing>\nThe user seems stuck or frustrated. Consider: offer to re-approach the problem from a different angle, break it into smaller pieces, or explain the underlying concept. Match their directness — don't over-soothe, just help them find a way forward.\n</wellbeing>`,\n\n \"rest\": `<wellbeing>\nThe user seems tired. Keep responses concise and to the point. If they mention wrapping up, support that. Don't add extra complexity or tangents.\n</wellbeing>`,\n\n \"break-long-session\": `<wellbeing>\nThis session has been running for over 2 hours. If there's a natural moment, a brief mention that a short break might help maintain focus is fine. Once is enough.\n</wellbeing>`,\n};\n\n/**\n * Format the appropriate wellbeing nudge for the current state.\n */\nexport function formatWellbeingNudge(state: PersonalityState): string | null {\n if (!state.wellbeingNudge) return null;\n return WELLBEING_NUDGES[state.wellbeingNudge] || null;\n}\n\n/**\n * Push current personality state to acore via identity_update_dynamics.\n * Fire-and-forget — failures are logged but don't block.\n */\nexport async function syncPersonalityToCore(\n state: PersonalityState,\n mcpManager: McpManager,\n): Promise<void> {\n try {\n await mcpManager.callTool(\"identity_update_dynamics\", {\n currentRead: state.currentRead,\n energy: state.energy,\n activeMode: state.activeMode,\n });\n } catch (err) {\n log.debug(\"personality\", \"identity_update_dynamics failed\", err);\n }\n}\n","import type { Message, LLMClient } from \"./llm/types.js\";\nimport { log } from \"./logger.js\";\n\n// Rough token estimation: ~1.3 tokens per word\nfunction estimateMessageTokens(msg: Message): number {\n if (typeof msg.content === \"string\") {\n return Math.round(msg.content.split(/\\s+/).filter(Boolean).length * 1.3);\n }\n // Content blocks — estimate from stringified content\n let text = \"\";\n for (const block of msg.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"tool_result\") text += block.content;\n else if (block.type === \"tool_use\") text += JSON.stringify(block.input);\n }\n return Math.round(text.split(/\\s+/).filter(Boolean).length * 1.3);\n}\n\nfunction estimateTotalTokens(messages: Message[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateMessageTokens(msg);\n }\n return total;\n}\n\n// Maximum conversation tokens before trimming (leave room for system prompt + response)\nconst MAX_CONVERSATION_TOKENS = 80_000;\n// How many recent messages to always keep\nconst KEEP_RECENT = 10;\n// How many initial messages to always keep (session context injection)\nconst KEEP_INITIAL = 2;\n\n/**\n * Trims conversation history when it gets too long.\n * Keeps initial context messages and recent messages.\n * Replaces middle messages with a summary.\n * Mutates the messages array in place.\n */\nexport async function trimConversation(\n messages: Message[],\n client: LLMClient,\n): Promise<void> {\n const totalTokens = estimateTotalTokens(messages);\n\n if (totalTokens < MAX_CONVERSATION_TOKENS || messages.length <= KEEP_INITIAL + KEEP_RECENT) {\n return;\n }\n\n const initial = messages.slice(0, KEEP_INITIAL);\n const recent = messages.slice(-KEEP_RECENT);\n const middle = messages.slice(KEEP_INITIAL, messages.length - KEEP_RECENT);\n\n const middleText = middle\n .filter((m) => typeof m.content === \"string\" && m.content.length > 0)\n .map((m) => `[${m.role}]: ${(m.content as string).slice(0, 500)}`)\n .slice(0, 30)\n .join(\"\\n\");\n\n let summaryText: string;\n\n try {\n const summaryPrompt = \"Summarize the following conversation messages in 3-5 bullet points. Preserve: decisions made, user preferences expressed, action items, and key facts discussed. Be concise.\\n\\n\" + middleText;\n\n let fullText = \"\";\n await client.chat(\n \"You are a concise summarizer. Return only bullet points, no preamble.\",\n [{ role: \"user\", content: summaryPrompt }],\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) fullText += chunk.text;\n },\n );\n\n summaryText = `<conversation-summary>\\nSummary of ${middle.length} earlier messages:\\n\\n${fullText}\\n</conversation-summary>`;\n log.debug(\"context\", `Summarized ${middle.length} messages via LLM`);\n } catch (err) {\n log.warn(\"context\", \"LLM summarization failed, using fallback\", err);\n const summaryParts: string[] = [];\n for (const msg of middle) {\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n const preview = msg.content.slice(0, 150);\n summaryParts.push(`[${msg.role}]: ${preview}${msg.content.length > 150 ? \"...\" : \"\"}`);\n }\n }\n summaryText = `<conversation-summary>\\nSummary of ${middle.length} earlier messages:\\n\\n${summaryParts.slice(0, 20).join(\"\\n\")}\\n</conversation-summary>`;\n }\n\n messages.length = 0;\n messages.push(...initial);\n messages.push({ role: \"user\", content: summaryText });\n messages.push({ role: \"assistant\", content: \"I have the context from our earlier conversation. Let's continue.\" });\n messages.push(...recent);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\n// --- Skill Keyword Map for Auto-Triggering ---\n\nconst SKILL_TRIGGERS: Record<string, string[]> = {\n testing: [\"test\", \"spec\", \"coverage\", \"tdd\", \"jest\", \"vitest\", \"mocha\", \"assert\", \"mock\", \"stub\", \"fixture\", \"e2e\", \"integration test\", \"unit test\"],\n \"api-design\": [\"api\", \"endpoint\", \"rest\", \"graphql\", \"route\", \"controller\", \"middleware\", \"http\", \"request\", \"response\", \"status code\", \"pagination\"],\n security: [\"security\", \"auth\", \"csrf\", \"xss\", \"injection\", \"cors\", \"jwt\", \"token\", \"oauth\", \"password\", \"hash\", \"encrypt\", \"vulnerability\", \"owasp\", \"sanitize\"],\n performance: [\"performance\", \"slow\", \"latency\", \"cache\", \"optimize\", \"profil\", \"bundle size\", \"lazy load\", \"memory leak\", \"benchmark\", \"bottleneck\"],\n \"code-review\": [\"review\", \"pr review\", \"pull request\", \"code quality\", \"clean code\", \"best practice\"],\n documentation: [\"document\", \"readme\", \"jsdoc\", \"tsdoc\", \"changelog\", \"adr\", \"comment\"],\n \"git-workflow\": [\"git\", \"branch\", \"merge\", \"rebase\", \"cherry-pick\", \"bisect\", \"stash\", \"commit message\", \"pr\", \"pull request\"],\n debugging: [\"debug\", \"breakpoint\", \"stack trace\", \"error\", \"exception\", \"crash\", \"bug\", \"issue\", \"unexpected\", \"reproduce\"],\n refactoring: [\"refactor\", \"extract\", \"rename\", \"move\", \"split\", \"consolidate\", \"dry\", \"code smell\", \"technical debt\", \"legacy\"],\n database: [\"database\", \"schema\", \"migration\", \"index\", \"query\", \"sql\", \"postgres\", \"mysql\", \"sqlite\", \"mongo\", \"orm\", \"prisma\", \"drizzle\"],\n typescript: [\"typescript\", \"type\", \"interface\", \"generic\", \"infer\", \"utility type\", \"zod\", \"discriminated union\", \"type guard\", \"as const\"],\n accessibility: [\"accessibility\", \"a11y\", \"aria\", \"screen reader\", \"wcag\", \"semantic html\", \"tab order\", \"focus\", \"contrast\"],\n};\n\n// --- Skill Level Tracking ---\n\nconst LEVEL_FILE = path.join(os.homedir(), \".aman-agent\", \"skill-levels.json\");\n\ninterface SkillLevel {\n name: string;\n activations: number;\n lastUsed: string;\n userPatterns: string[]; // user-specific patterns learned\n}\n\nfunction loadSkillLevels(): Record<string, SkillLevel> {\n try {\n if (fs.existsSync(LEVEL_FILE)) {\n return JSON.parse(fs.readFileSync(LEVEL_FILE, \"utf-8\")) as Record<string, SkillLevel>;\n }\n } catch { /* ignore */ }\n return {};\n}\n\nfunction saveSkillLevels(levels: Record<string, SkillLevel>): void {\n const dir = path.dirname(LEVEL_FILE);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(LEVEL_FILE, JSON.stringify(levels, null, 2), \"utf-8\");\n}\n\n/**\n * Compute skill level from activation count.\n * Lv.1 = beginner guidance, Lv.5 = proactive expert suggestions\n */\nexport function computeLevel(activations: number): { level: number; label: string } {\n if (activations >= 50) return { level: 5, label: \"Expert\" };\n if (activations >= 25) return { level: 4, label: \"Advanced\" };\n if (activations >= 10) return { level: 3, label: \"Proficient\" };\n if (activations >= 3) return { level: 2, label: \"Familiar\" };\n return { level: 1, label: \"Learning\" };\n}\n\n/**\n * Record a skill activation and return updated level.\n */\nexport function recordActivation(skillName: string): { level: number; label: string } {\n const levels = loadSkillLevels();\n if (!levels[skillName]) {\n levels[skillName] = { name: skillName, activations: 0, lastUsed: \"\", userPatterns: [] };\n }\n levels[skillName].activations++;\n levels[skillName].lastUsed = new Date().toISOString().split(\"T\")[0];\n saveSkillLevels(levels);\n return computeLevel(levels[skillName].activations);\n}\n\n/**\n * Get current level for a skill.\n */\nexport function getSkillLevel(skillName: string): { level: number; label: string; activations: number } {\n const levels = loadSkillLevels();\n const data = levels[skillName];\n if (!data) return { level: 1, label: \"Learning\", activations: 0 };\n const { level, label } = computeLevel(data.activations);\n return { level, label, activations: data.activations };\n}\n\n// --- Auto-Triggered Skills ---\n\n/**\n * Match user input against installed skill triggers.\n * Returns skill names that should be activated for this turn.\n */\nexport function matchSkills(userInput: string, installedSkillNames: string[]): string[] {\n const input = userInput.toLowerCase();\n const matched: string[] = [];\n\n for (const skillName of installedSkillNames) {\n const triggers = SKILL_TRIGGERS[skillName];\n if (!triggers) continue;\n\n for (const trigger of triggers) {\n if (input.includes(trigger)) {\n matched.push(skillName);\n break;\n }\n }\n }\n\n return matched;\n}\n\n/**\n * Format skill context block for injection into system prompt.\n * Adapts detail level based on skill level.\n */\nexport function formatSkillContext(\n skillName: string,\n skillContent: string,\n level: { level: number; label: string },\n): string {\n let depthHint: string;\n if (level.level >= 4) {\n depthHint = \"User is advanced — skip basics, focus on edge cases and proactive optimization.\";\n } else if (level.level >= 3) {\n depthHint = \"User is proficient — brief reminders of principles, focus on the specific task.\";\n } else if (level.level >= 2) {\n depthHint = \"User is familiar — explain reasoning briefly, show patterns.\";\n } else {\n depthHint = \"User is learning — explain concepts clearly, show examples, be patient.\";\n }\n\n return `<active-skill name=\"${skillName}\" level=\"${level.level}\" label=\"${level.label}\">\n${depthHint}\n\n${skillContent}\n</active-skill>`;\n}\n\n/**\n * Auto-trigger skills based on user input.\n * Reads installed skills, matches keywords, injects context.\n * Returns formatted skill blocks to append to system prompt.\n */\nexport async function autoTriggerSkills(\n userInput: string,\n mcpManager: McpManager,\n): Promise<string> {\n try {\n // Get installed skills\n const result = await mcpManager.callTool(\"skill_list\", {});\n const skills = JSON.parse(result) as Array<{ name: string; description: string; installed: boolean }>;\n const installed = skills.filter((s) => s.installed).map((s) => s.name);\n\n if (installed.length === 0) return \"\";\n\n // Match user input against skill triggers\n const matched = matchSkills(userInput, installed);\n if (matched.length === 0) return \"\";\n\n // Load skill content and build context blocks\n const blocks: string[] = [];\n for (const skillName of matched.slice(0, 2)) { // max 2 skills per turn\n // Record activation and get level\n const level = recordActivation(skillName);\n\n // Read skill content from skills.md\n const skillsContent = await mcpManager.callTool(\"skill_search\", { query: skillName });\n const skillEntries = JSON.parse(skillsContent) as Array<{ name: string; description: string }>;\n const entry = skillEntries.find((s) => s.name.toLowerCase() === skillName.toLowerCase());\n\n if (entry) {\n blocks.push(formatSkillContext(skillName, entry.description, level));\n }\n\n log.debug(\"skill-engine\", `Auto-triggered: ${skillName} (Lv.${level.level} ${level.label})`);\n }\n\n return blocks.join(\"\\n\\n\");\n } catch (err) {\n log.debug(\"skill-engine\", \"autoTriggerSkills failed\", err);\n return \"\";\n }\n}\n\n// --- Self-Improving Skills ---\n\n/**\n * Enrich a skill with a user-specific pattern learned from conversation.\n * Called by memory-extractor when a \"pattern\" type extraction matches a skill domain.\n */\nexport function enrichSkill(skillName: string, pattern: string): void {\n const levels = loadSkillLevels();\n if (!levels[skillName]) {\n levels[skillName] = { name: skillName, activations: 0, lastUsed: \"\", userPatterns: [] };\n }\n\n // Deduplicate patterns\n const existing = levels[skillName].userPatterns;\n if (existing.length >= 20) return; // cap at 20 patterns per skill\n if (existing.some((p) => p.toLowerCase() === pattern.toLowerCase())) return;\n\n levels[skillName].userPatterns.push(pattern);\n saveSkillLevels(levels);\n log.debug(\"skill-engine\", `Enriched ${skillName} with pattern: ${pattern.slice(0, 80)}`);\n}\n\n/**\n * Get user-specific patterns for a skill (for injection into skill context).\n */\nexport function getSkillPatterns(skillName: string): string[] {\n const levels = loadSkillLevels();\n return levels[skillName]?.userPatterns || [];\n}\n\n/**\n * Match a memory extraction pattern to a skill domain.\n * Returns the skill name if the pattern is relevant, null otherwise.\n */\nexport function matchPatternToSkill(patternContent: string, tags: string[]): string | null {\n const combined = (patternContent + \" \" + tags.join(\" \")).toLowerCase();\n\n for (const [skillName, triggers] of Object.entries(SKILL_TRIGGERS)) {\n for (const trigger of triggers) {\n if (combined.includes(trigger)) {\n return skillName;\n }\n }\n }\n\n return null;\n}\n\n// --- Knowledge Library ---\n\nexport interface KnowledgeItem {\n name: string;\n category: string;\n description: string;\n content: string;\n}\n\nexport const KNOWLEDGE_LIBRARY: KnowledgeItem[] = [\n {\n name: \"security-headers\",\n category: \"security\",\n description: \"Essential HTTP security headers for web applications\",\n content: `Essential Security Headers:\n- Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'\n- X-Content-Type-Options: nosniff\n- X-Frame-Options: DENY\n- Strict-Transport-Security: max-age=31536000; includeSubDomains; preload\n- X-XSS-Protection: 0 (CSP replaces this)\n- Referrer-Policy: strict-origin-when-cross-origin\n- Permissions-Policy: camera=(), microphone=(), geolocation=()`,\n },\n {\n name: \"docker-node\",\n category: \"deployment\",\n description: \"Production Node.js Dockerfile template\",\n content: `FROM node:22-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --production=false\nCOPY . .\nRUN npm run build\n\nFROM node:22-alpine\nWORKDIR /app\nRUN addgroup -g 1001 -S nodejs && adduser -S appuser -u 1001\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nUSER appuser\nEXPOSE 3000\nCMD [\"node\", \"dist/index.js\"]`,\n },\n {\n name: \"github-actions-node\",\n category: \"ci\",\n description: \"CI/CD pipeline for Node.js with GitHub Actions\",\n content: `name: CI\non: [push, pull_request]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n - uses: actions/setup-node@v5\n with: { node-version: 22 }\n - run: npm ci\n - run: npm test\n - run: npm run build`,\n },\n {\n name: \"env-config\",\n category: \"configuration\",\n description: \"Environment variable configuration pattern with validation\",\n content: `import { z } from \"zod\";\n\nconst envSchema = z.object({\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n PORT: z.coerce.number().default(3000),\n DATABASE_URL: z.string().url(),\n API_KEY: z.string().min(1),\n});\n\nexport const env = envSchema.parse(process.env);`,\n },\n {\n name: \"error-handling\",\n category: \"patterns\",\n description: \"TypeScript error handling patterns with Result type\",\n content: `type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };\n\nfunction ok<T>(value: T): Result<T, never> { return { ok: true, value }; }\nfunction err<E>(error: E): Result<never, E> { return { ok: false, error }; }\n\n// Usage:\nasync function fetchUser(id: string): Promise<Result<User>> {\n try {\n const user = await db.users.findUnique({ where: { id } });\n if (!user) return err(new Error(\"User not found\"));\n return ok(user);\n } catch (e) {\n return err(e instanceof Error ? e : new Error(String(e)));\n }\n}`,\n },\n {\n name: \"rate-limiter\",\n category: \"security\",\n description: \"Token bucket rate limiter implementation\",\n content: `class RateLimiter {\n private tokens: Map<string, { count: number; resetAt: number }> = new Map();\n\n constructor(private maxRequests: number, private windowMs: number) {}\n\n allow(key: string): boolean {\n const now = Date.now();\n const entry = this.tokens.get(key);\n if (!entry || now > entry.resetAt) {\n this.tokens.set(key, { count: 1, resetAt: now + this.windowMs });\n return true;\n }\n if (entry.count >= this.maxRequests) return false;\n entry.count++;\n return true;\n }\n}`,\n },\n {\n name: \"prisma-setup\",\n category: \"database\",\n description: \"Prisma ORM setup with connection pooling\",\n content: `import { PrismaClient } from \"@prisma/client\";\n\nconst globalForPrisma = globalThis as unknown as { prisma: PrismaClient };\nexport const prisma = globalForPrisma.prisma ?? new PrismaClient({\n log: process.env.NODE_ENV === \"development\" ? [\"query\", \"error\", \"warn\"] : [\"error\"],\n});\nif (process.env.NODE_ENV !== \"production\") globalForPrisma.prisma = prisma;`,\n },\n {\n name: \"zod-validation\",\n category: \"validation\",\n description: \"Zod schema patterns for API input validation\",\n content: `import { z } from \"zod\";\n\nconst CreateUserSchema = z.object({\n email: z.string().email(),\n name: z.string().min(1).max(100),\n age: z.number().int().min(13).max(150).optional(),\n role: z.enum([\"user\", \"admin\"]).default(\"user\"),\n tags: z.array(z.string()).max(10).default([]),\n});\n\ntype CreateUser = z.infer<typeof CreateUserSchema>;\n\n// Express middleware:\nfunction validate<T>(schema: z.ZodSchema<T>) {\n return (req, res, next) => {\n const result = schema.safeParse(req.body);\n if (!result.success) return res.status(400).json({ errors: result.error.flatten() });\n req.body = result.data;\n next();\n };\n}`,\n },\n {\n name: \"testing-patterns\",\n category: \"testing\",\n description: \"Test organization and assertion patterns\",\n content: `// Arrange-Act-Assert pattern\ndescribe(\"UserService\", () => {\n it(\"creates user with valid email\", async () => {\n // Arrange\n const input = { email: \"test@example.com\", name: \"Test\" };\n\n // Act\n const user = await userService.create(input);\n\n // Assert\n expect(user.id).toBeDefined();\n expect(user.email).toBe(input.email);\n });\n\n it(\"rejects duplicate email\", async () => {\n await userService.create({ email: \"dup@test.com\", name: \"First\" });\n await expect(userService.create({ email: \"dup@test.com\", name: \"Second\" }))\n .rejects.toThrow(\"already exists\");\n });\n});`,\n },\n {\n name: \"git-hooks\",\n category: \"git\",\n description: \"Pre-commit and commit-msg hooks with lint-staged\",\n content: `// package.json\n{\n \"lint-staged\": {\n \"*.{ts,tsx}\": [\"eslint --fix\", \"prettier --write\"],\n \"*.{json,md}\": [\"prettier --write\"]\n }\n}\n\n// .husky/pre-commit\nnpx lint-staged\n\n// .husky/commit-msg\nnpx commitlint --edit $1\n\n// commitlint.config.js\nmodule.exports = { extends: [\"@commitlint/config-conventional\"] };`,\n },\n];\n\n/**\n * Search knowledge library by query.\n */\nexport function searchKnowledge(query: string): KnowledgeItem[] {\n const q = query.toLowerCase();\n return KNOWLEDGE_LIBRARY.filter(\n (item) =>\n item.name.includes(q) ||\n item.category.includes(q) ||\n item.description.toLowerCase().includes(q),\n );\n}\n\n/**\n * Auto-suggest knowledge items based on conversation context.\n * Returns formatted knowledge block if relevant item found.\n */\nexport function matchKnowledge(userInput: string): KnowledgeItem | null {\n const input = userInput.toLowerCase();\n\n // Direct keyword matches\n const keywordMap: Record<string, string> = {\n \"security header\": \"security-headers\",\n \"csp\": \"security-headers\",\n \"content-security\": \"security-headers\",\n \"dockerfile\": \"docker-node\",\n \"docker\": \"docker-node\",\n \"github action\": \"github-actions-node\",\n \"ci/cd\": \"github-actions-node\",\n \"ci pipeline\": \"github-actions-node\",\n \"env config\": \"env-config\",\n \"environment variable\": \"env-config\",\n \"error handling\": \"error-handling\",\n \"result type\": \"error-handling\",\n \"rate limit\": \"rate-limiter\",\n \"throttle\": \"rate-limiter\",\n \"prisma\": \"prisma-setup\",\n \"zod\": \"zod-validation\",\n \"validation\": \"zod-validation\",\n \"test pattern\": \"testing-patterns\",\n \"arrange act assert\": \"testing-patterns\",\n \"git hook\": \"git-hooks\",\n \"pre-commit\": \"git-hooks\",\n \"lint-staged\": \"git-hooks\",\n \"husky\": \"git-hooks\",\n };\n\n for (const [keyword, itemName] of Object.entries(keywordMap)) {\n if (input.includes(keyword)) {\n return KNOWLEDGE_LIBRARY.find((i) => i.name === itemName) || null;\n }\n }\n\n return null;\n}\n","import type { LLMClient } from \"./llm/types.js\";\nimport { log } from \"./logger.js\";\nimport { matchPatternToSkill, enrichSkill } from \"./skill-engine.js\";\nimport { memoryRecall, memoryStore } from \"./memory.js\";\n\nexport interface ExtractionCandidate {\n content: string;\n type: \"preference\" | \"fact\" | \"pattern\" | \"decision\" | \"correction\" | \"topology\";\n tags: string[];\n confidence: number;\n scope: string;\n}\n\nconst VALID_TYPES = new Set([\"preference\", \"fact\", \"pattern\", \"topology\", \"decision\", \"correction\"]);\nconst MIN_RESPONSE_LENGTH = 50;\nconst MIN_TURNS_BETWEEN_EMPTY = 3;\n\nconst EXTRACTION_PROMPT = `Analyze this conversation turn. Extract any information worth remembering long-term.\n\nReturn a JSON array (empty [] if nothing worth storing):\n[{\n \"content\": \"what to remember — be specific and self-contained\",\n \"type\": \"preference|fact|pattern|decision|correction|topology\",\n \"tags\": [\"relevant\", \"tags\"],\n \"confidence\": 0.0-1.0,\n \"scope\": \"global\"\n}]\n\nType guide:\n- \"preference\" = user likes/dislikes/preferences\n- \"fact\" = objective information about systems, people, projects\n- \"pattern\" = recurring behavior, coding style, approach\n- \"topology\" = how systems/components connect to each other\n- \"decision\" = explicit choice between alternatives\n- \"correction\" = user correcting a prior wrong assumption\n\nRules:\n- Only extract genuinely useful LONG-TERM information\n- Skip ephemeral things (\"user asked about X\" is NOT useful)\n- Be conservative — 90% of turns produce nothing worth storing\n- Return ONLY the JSON array, no other text`;\n\nexport function shouldExtract(\n assistantResponse: string,\n turnsSinceLastExtraction: number,\n lastExtractionCount: number,\n): boolean {\n if (lastExtractionCount > 0) return true;\n if (assistantResponse.length < MIN_RESPONSE_LENGTH) return false;\n if (turnsSinceLastExtraction < MIN_TURNS_BETWEEN_EMPTY) return false;\n return true;\n}\n\nexport function parseExtractionResult(raw: string): ExtractionCandidate[] {\n try {\n let cleaned = raw.trim();\n const codeBlockMatch = cleaned.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (codeBlockMatch) {\n cleaned = codeBlockMatch[1].trim();\n }\n\n const parsed = JSON.parse(cleaned);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.filter(\n (item: Record<string, unknown>) =>\n typeof item.content === \"string\" &&\n item.content.length > 0 &&\n typeof item.type === \"string\" &&\n VALID_TYPES.has(item.type),\n ) as ExtractionCandidate[];\n } catch {\n return [];\n }\n}\n\nexport interface ExtractorState {\n turnsSinceLastExtraction: number;\n lastExtractionCount: number;\n}\n\nexport async function extractMemories(\n userMessage: string,\n assistantResponse: string,\n client: LLMClient,\n state: ExtractorState,\n): Promise<number> {\n if (!shouldExtract(assistantResponse, state.turnsSinceLastExtraction, state.lastExtractionCount)) {\n state.turnsSinceLastExtraction++;\n return 0;\n }\n\n try {\n const conversationTurn = `User: ${userMessage.slice(0, 2000)}\\n\\nAssistant: ${assistantResponse.slice(0, 2000)}`;\n\n let fullText = \"\";\n await client.chat(\n EXTRACTION_PROMPT,\n [{ role: \"user\", content: conversationTurn }],\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) fullText += chunk.text;\n },\n );\n\n const candidates = parseExtractionResult(fullText);\n state.turnsSinceLastExtraction = 0;\n state.lastExtractionCount = candidates.length;\n\n if (candidates.length === 0) return 0;\n\n let stored = 0;\n\n for (const candidate of candidates) {\n // Dedup check\n try {\n const existing = await memoryRecall(candidate.content, { limit: 1 });\n if (existing.total > 0 && existing.memories.length > 0) {\n const topScore = (existing.memories[0] as { score?: number })?.score;\n if (topScore && topScore > 0.85) {\n log.debug(\"extractor\", \"Skipping duplicate: \" + candidate.content);\n continue;\n }\n }\n } catch { /* Dedup failed, proceed */ }\n\n // Store\n try {\n await memoryStore({\n content: candidate.content,\n type: candidate.type,\n tags: candidate.tags,\n confidence: candidate.confidence,\n source: \"auto-extraction\",\n scope: candidate.scope,\n });\n stored++;\n log.debug(\"extractor\", \"Stored \" + candidate.type + \": \" + candidate.content);\n\n // Self-improving skills: enrich skills with learned patterns\n if (candidate.type === \"pattern\" || candidate.type === \"preference\") {\n const skillMatch = matchPatternToSkill(candidate.content, candidate.tags);\n if (skillMatch) {\n enrichSkill(skillMatch, candidate.content);\n }\n }\n } catch (err) {\n log.warn(\"extractor\", \"Failed to store: \" + candidate.content, err);\n }\n }\n\n return stored;\n } catch (err) {\n log.debug(\"extractor\", \"extraction failed\", err);\n state.turnsSinceLastExtraction = 0;\n state.lastExtractionCount = 0;\n return 0;\n }\n}\n","import pc from \"picocolors\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.js\";\n\nexport interface BackgroundTask {\n id: string;\n toolName: string;\n toolUseId: string;\n startedAt: number;\n promise: Promise<string>;\n result?: string;\n error?: string;\n done: boolean;\n}\n\n// Tools that are likely long-running and benefit from background execution\nconst BACKGROUND_ELIGIBLE = new Set([\n \"run_tests\", \"npm_test\", \"build\", \"npm_build\",\n \"file_search\", \"code_search\", \"grep_search\",\n \"git_clone\", \"docker_build\", \"docker_run\",\n]);\n\n// Tools that should NEVER run in background (need immediate results for tool loop)\nconst NEVER_BACKGROUND = new Set([\n \"memory_recall\", \"memory_store\", \"memory_log\", \"memory_context\", \"memory_detail\",\n \"identity_read\", \"identity_summary\", \"identity_update_session\", \"identity_update_dynamics\",\n \"rules_check\", \"rules_list\", \"workflow_list\", \"workflow_get\",\n \"skill_list\", \"skill_search\", \"eval_status\", \"eval_log\",\n \"reminder_check\", \"reminder_set\",\n \"file_read\", \"doc_convert\", \"file_list\",\n \"avatar_prompt\",\n]);\n\n/**\n * Check if a tool call should run in background based on its name.\n */\nexport function shouldRunInBackground(toolName: string): boolean {\n if (NEVER_BACKGROUND.has(toolName)) return false;\n if (BACKGROUND_ELIGIBLE.has(toolName)) return true;\n return false;\n}\n\n/**\n * Background task manager.\n * Runs tool calls concurrently and reports results when ready.\n */\nexport class BackgroundTaskManager {\n private tasks: Map<string, BackgroundTask> = new Map();\n private taskCounter = 0;\n\n /**\n * Launch a tool call in the background.\n */\n launch(\n toolName: string,\n toolUseId: string,\n mcpManager: McpManager,\n toolInput: Record<string, unknown>,\n ): BackgroundTask {\n const id = `bg-${++this.taskCounter}`;\n const task: BackgroundTask = {\n id,\n toolName,\n toolUseId,\n startedAt: Date.now(),\n done: false,\n promise: mcpManager.callTool(toolName, toolInput).then(\n (result) => {\n task.result = result;\n task.done = true;\n return result;\n },\n (error) => {\n task.error = error instanceof Error ? error.message : String(error);\n task.done = true;\n return `Error: ${task.error}`;\n },\n ),\n };\n\n this.tasks.set(id, task);\n process.stdout.write(pc.dim(` [${toolName} running in background (${id})...]\\n`));\n return task;\n }\n\n /**\n * Check for completed background tasks and return their results.\n */\n collectCompleted(): BackgroundTask[] {\n const completed: BackgroundTask[] = [];\n for (const [id, task] of this.tasks) {\n if (task.done) {\n completed.push(task);\n this.tasks.delete(id);\n }\n }\n return completed;\n }\n\n /**\n * Display completed background task results to the user.\n */\n displayCompleted(): string[] {\n const completed = this.collectCompleted();\n const outputs: string[] = [];\n\n for (const task of completed) {\n const elapsed = ((Date.now() - task.startedAt) / 1000).toFixed(1);\n if (task.error) {\n process.stdout.write(pc.yellow(`\\n [${task.id}] ${task.toolName} failed after ${elapsed}s: ${task.error}\\n`));\n outputs.push(`[Background task ${task.toolName} failed: ${task.error}]`);\n } else {\n process.stdout.write(pc.green(`\\n [${task.id}] ${task.toolName} completed in ${elapsed}s\\n`));\n const preview = (task.result || \"\").slice(0, 200);\n if (preview) {\n process.stdout.write(pc.dim(` ${preview}${(task.result || \"\").length > 200 ? \"...\" : \"\"}\\n`));\n }\n outputs.push(`[Background task ${task.toolName} completed: ${task.result}]`);\n }\n }\n\n return outputs;\n }\n\n /**\n * Wait for all pending background tasks to complete.\n */\n async waitAll(): Promise<void> {\n const pending = [...this.tasks.values()].filter((t) => !t.done);\n if (pending.length === 0) return;\n\n process.stdout.write(pc.dim(`\\n Waiting for ${pending.length} background task(s)...\\n`));\n await Promise.allSettled(pending.map((t) => t.promise));\n }\n\n /**\n * Number of currently running tasks.\n */\n get pendingCount(): number {\n return [...this.tasks.values()].filter((t) => !t.done).length;\n }\n\n /**\n * Check if any tasks have completed (non-blocking).\n */\n get hasCompleted(): boolean {\n return [...this.tasks.values()].some((t) => t.done);\n }\n}\n","interface ErrorMapping {\n pattern: RegExp;\n message: string;\n}\n\nconst ERROR_MAPPINGS: ErrorMapping[] = [\n { pattern: /rate.?limit|429/i, message: \"Rate limited. I'll retry automatically.\" },\n { pattern: /401|unauthorized/i, message: \"API key invalid. Run /reconfig to fix.\" },\n { pattern: /403|forbidden/i, message: \"API key doesn't have access to this model. Try a different model with --model.\" },\n { pattern: /fetch failed|network/i, message: \"Network error. Check your internet connection.\" },\n { pattern: /ECONNREFUSED/i, message: \"Can't reach the API. Are you behind a proxy or firewall?\" },\n { pattern: /context.?length/i, message: \"Conversation too long. Use /clear to start fresh or I'll auto-trim.\" },\n { pattern: /overloaded/i, message: \"API is overloaded. Retrying in a moment...\" },\n { pattern: /ETIMEDOUT/i, message: \"Request timed out. Retrying...\" },\n];\n\nexport function humanizeError(message: string): string {\n for (const mapping of ERROR_MAPPINGS) {\n if (mapping.pattern.test(message)) {\n return mapping.message;\n }\n }\n return message;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface HintState {\n turnCount: number;\n shownHints: Set<string>;\n hintShownThisSession: boolean;\n}\n\ninterface HintContext {\n hasWorkflows: boolean;\n memoryCount: number;\n}\n\ninterface HintDef {\n id: string;\n minTurn: number;\n condition: (ctx: HintContext) => boolean;\n text: string;\n}\n\nconst HINTS: HintDef[] = [\n {\n id: \"eval\",\n minTurn: 15,\n condition: () => true,\n text: \"Tip: See how our relationship has evolved with /eval\",\n },\n {\n id: \"memory-search\",\n minTurn: 3,\n condition: (ctx) => ctx.memoryCount >= 10,\n text: \"Tip: Search everything I remember with /memory search <query>\",\n },\n {\n id: \"workflows\",\n minTurn: 5,\n condition: (ctx) => !ctx.hasWorkflows,\n text: \"Tip: Teach me multi-step processes with /workflows add\",\n },\n {\n id: \"rules\",\n minTurn: 8,\n condition: () => true,\n text: \"Tip: Set guardrails for what I should/shouldn't do with /rules\",\n },\n];\n\nexport function getHint(state: HintState, ctx: HintContext): string | null {\n if (state.hintShownThisSession) return null;\n\n for (const hint of HINTS) {\n if (state.turnCount >= hint.minTurn && !state.shownHints.has(hint.id) && hint.condition(ctx)) {\n state.shownHints.add(hint.id);\n state.hintShownThisSession = true;\n return hint.text;\n }\n }\n\n return null;\n}\n\nconst HINTS_FILE = path.join(os.homedir(), \".aman-agent\", \"hints-seen.json\");\n\nexport function loadShownHints(): Set<string> {\n try {\n if (fs.existsSync(HINTS_FILE)) {\n const data = JSON.parse(fs.readFileSync(HINTS_FILE, \"utf-8\"));\n return new Set(Array.isArray(data) ? data : []);\n }\n } catch { /* ignore */ }\n return new Set();\n}\n\nexport function saveShownHints(shown: Set<string>): void {\n try {\n const dir = path.dirname(HINTS_FILE);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(HINTS_FILE, JSON.stringify([...shown]), \"utf-8\");\n } catch { /* non-critical */ }\n}\n","export type PresetName = \"coding\" | \"creative\" | \"assistant\" | \"learning\" | \"minimal\";\n\ninterface PresetRule {\n category: string;\n rule: string;\n}\n\ninterface PresetWorkflow {\n name: string;\n description: string;\n steps: string[];\n}\n\ninterface Preset {\n identity: { personality: string; style: string };\n rules: PresetRule[];\n workflows: PresetWorkflow[];\n}\n\nexport const PRESETS: Record<PresetName, Preset> = {\n coding: {\n identity: {\n personality: \"Direct, technical, concise. Shows code over explanation.\",\n style: \"Use short answers. Lead with the solution, explain after.\",\n },\n rules: [\n { category: \"response\", rule: \"Always show code examples, not just descriptions\" },\n { category: \"safety\", rule: \"Never execute destructive commands without confirmation\" },\n { category: \"quality\", rule: \"Follow project conventions over personal preference\" },\n ],\n workflows: [\n { name: \"debug\", description: \"Systematic debugging process\", steps: [\"Reproduce the issue\", \"Identify root cause\", \"Propose fix\", \"Verify fix\"] },\n ],\n },\n creative: {\n identity: {\n personality: \"Warm, imaginative, encouraging. Explores multiple angles.\",\n style: \"Use metaphors and vivid language. Ask 'what if' questions.\",\n },\n rules: [\n { category: \"response\", rule: \"Always offer 2-3 alternative approaches\" },\n { category: \"tone\", rule: \"Encourage experimentation, never dismiss ideas\" },\n ],\n workflows: [\n { name: \"brainstorm\", description: \"Creative brainstorming process\", steps: [\"Explore the problem space\", \"Generate 5+ ideas\", \"Evaluate trade-offs\", \"Refine top 2\"] },\n ],\n },\n assistant: {\n identity: {\n personality: \"Organized, proactive, action-oriented.\",\n style: \"Use bullet points and checklists. Summarize key takeaways.\",\n },\n rules: [\n { category: \"response\", rule: \"End responses with clear next steps when applicable\" },\n { category: \"memory\", rule: \"Always track deadlines and commitments mentioned\" },\n ],\n workflows: [\n { name: \"plan\", description: \"Task planning process\", steps: [\"Clarify the goal\", \"Break into tasks\", \"Prioritize\", \"Set deadlines\"] },\n ],\n },\n learning: {\n identity: {\n personality: \"Patient, curious, Socratic. Builds understanding layer by layer.\",\n style: \"Use analogies. Check understanding before moving on.\",\n },\n rules: [\n { category: \"response\", rule: \"Explain concepts before showing solutions\" },\n { category: \"teaching\", rule: \"Ask a follow-up question to reinforce learning\" },\n ],\n workflows: [],\n },\n minimal: {\n identity: {\n personality: \"Helpful and adaptive. Matches the user's tone and needs.\",\n style: \"Clear and concise. Prioritizes usefulness over verbosity.\",\n },\n rules: [],\n workflows: [],\n },\n};\n\ninterface PresetResult {\n coreMd: string;\n rulesMd: string | null;\n flowMd: string | null;\n}\n\nexport function applyPreset(name: PresetName, companionName: string): PresetResult {\n const preset = PRESETS[name];\n\n const coreMd = [\n `# ${companionName}`,\n \"\",\n \"## Personality\",\n preset.identity.personality,\n \"\",\n \"## Style\",\n preset.identity.style,\n \"\",\n \"## Session\",\n \"_New companion — no prior sessions._\",\n ].join(\"\\n\");\n\n let rulesMd: string | null = null;\n if (preset.rules.length > 0) {\n const grouped = new Map<string, string[]>();\n for (const r of preset.rules) {\n if (!grouped.has(r.category)) grouped.set(r.category, []);\n grouped.get(r.category)!.push(r.rule);\n }\n const sections = [...grouped.entries()]\n .map(([cat, rules]) => `## ${cat}\\n${rules.map((r) => `- ${r}`).join(\"\\n\")}`)\n .join(\"\\n\\n\");\n rulesMd = `# Guardrails\\n\\n${sections}`;\n }\n\n let flowMd: string | null = null;\n if (preset.workflows.length > 0) {\n const wfSections = preset.workflows\n .map((wf) => {\n const steps = wf.steps.map((s, i) => `${i + 1}. ${s}`).join(\"\\n\");\n return `## ${wf.name}\\n${wf.description}\\n\\n${steps}`;\n })\n .join(\"\\n\\n\");\n flowMd = `# Workflows\\n\\n${wfSections}`;\n }\n\n return { coreMd, rulesMd, flowMd };\n}\n"],"mappings":"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","names":["p","pc","fs","path","os","text","home","path","fs","os","text","text","OpenAI","text","fs","path","os","fs","path","os","pc","fs","path","os","pc","fs","path","os","path","os","fs","fs","path","os","fs","path","os","pc","path","os","fs","pc","fs","path","os","path","fs","os","text","p","fs","pc","home","os","path","available","lines","tool","num","text","members","task","p","profile","pc","fs","path","text","p","timeContext","pc","path","fs","text","fs","path","os","path","os","fs","p","pc","fs","path","os","p","isRetryable","pc","path","os","fs","recall","input","result","fs","path","os","path","os","fs","home","pc"]}
|