@aman_asmuei/aman-agent 0.7.4 → 0.7.5
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 +53 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -834,38 +834,80 @@ function handleAkitCommand(action, args) {
|
|
|
834
834
|
const installed = loadAkitInstalled();
|
|
835
835
|
const installedNames = new Set(installed.map((t) => t.name));
|
|
836
836
|
if (action === "add") {
|
|
837
|
+
const available2 = AKIT_REGISTRY.filter((t) => !installedNames.has(t.name));
|
|
837
838
|
if (args.length < 1) {
|
|
838
|
-
|
|
839
|
+
if (available2.length === 0) {
|
|
840
|
+
return { handled: true, output: pc.green("All tools are installed!") };
|
|
841
|
+
}
|
|
842
|
+
const lines3 = [pc.bold("Select a tool to install:"), ""];
|
|
843
|
+
available2.forEach((tool2, i) => {
|
|
844
|
+
const num2 = pc.cyan(String(i + 1).padStart(2));
|
|
845
|
+
lines3.push(` ${num2} ${tool2.name.padEnd(16)} ${pc.dim(tool2.description)}`);
|
|
846
|
+
});
|
|
847
|
+
lines3.push("");
|
|
848
|
+
lines3.push(` Type: ${pc.cyan("/akit add <number>")} or ${pc.cyan("/akit add <name>")}`);
|
|
849
|
+
lines3.push(` Custom: ${pc.cyan("/akit add custom <name> <command> <args...>")}`);
|
|
850
|
+
return { handled: true, output: lines3.join("\n") };
|
|
851
|
+
}
|
|
852
|
+
if (args[0].toLowerCase() === "custom") {
|
|
853
|
+
if (args.length < 3) {
|
|
854
|
+
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") };
|
|
855
|
+
}
|
|
856
|
+
const customName = args[1];
|
|
857
|
+
const customCommand = args[2];
|
|
858
|
+
const customArgs = args.slice(3);
|
|
859
|
+
if (installedNames.has(customName)) {
|
|
860
|
+
return { handled: true, output: pc.yellow(`${customName} is already installed.`) };
|
|
861
|
+
}
|
|
862
|
+
installed.push({
|
|
863
|
+
name: customName,
|
|
864
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
865
|
+
mcpConfigured: true
|
|
866
|
+
});
|
|
867
|
+
saveAkitInstalled(installed);
|
|
868
|
+
addToAmanAgentConfig(customName, { command: customCommand, args: customArgs });
|
|
869
|
+
return {
|
|
870
|
+
handled: true,
|
|
871
|
+
output: [
|
|
872
|
+
pc.green(`\u2713 Added ${pc.bold(customName)}`) + pc.dim(` (custom MCP: ${customCommand} ${customArgs.join(" ")})`),
|
|
873
|
+
pc.dim(" Restart aman-agent to load the new tool.")
|
|
874
|
+
].join("\n")
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
const input = args[0].toLowerCase();
|
|
878
|
+
let tool;
|
|
879
|
+
const num = parseInt(input, 10);
|
|
880
|
+
if (!isNaN(num) && num >= 1 && num <= available2.length) {
|
|
881
|
+
tool = available2[num - 1];
|
|
882
|
+
} else {
|
|
883
|
+
tool = AKIT_REGISTRY.find((t) => t.name === input);
|
|
839
884
|
}
|
|
840
|
-
const toolName = args[0].toLowerCase();
|
|
841
|
-
const tool = AKIT_REGISTRY.find((t) => t.name === toolName);
|
|
842
885
|
if (!tool) {
|
|
843
886
|
return {
|
|
844
887
|
handled: true,
|
|
845
888
|
output: [
|
|
846
|
-
pc.red(`Tool "${
|
|
847
|
-
""
|
|
848
|
-
pc.dim("Available tools: " + AKIT_REGISTRY.map((t) => t.name).join(", "))
|
|
889
|
+
pc.red(`Tool "${input}" not found.`),
|
|
890
|
+
`Type ${pc.cyan("/akit add")} to see available tools.`
|
|
849
891
|
].join("\n")
|
|
850
892
|
};
|
|
851
893
|
}
|
|
852
|
-
if (installedNames.has(
|
|
853
|
-
return { handled: true, output: pc.yellow(`${
|
|
894
|
+
if (installedNames.has(tool.name)) {
|
|
895
|
+
return { handled: true, output: pc.yellow(`${tool.name} is already installed.`) };
|
|
854
896
|
}
|
|
855
897
|
installed.push({
|
|
856
|
-
name:
|
|
898
|
+
name: tool.name,
|
|
857
899
|
installedAt: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
858
900
|
mcpConfigured: tool.mcp !== null
|
|
859
901
|
});
|
|
860
902
|
saveAkitInstalled(installed);
|
|
861
903
|
if (tool.mcp) {
|
|
862
|
-
addToAmanAgentConfig(
|
|
904
|
+
addToAmanAgentConfig(tool.name, {
|
|
863
905
|
command: tool.mcp.command,
|
|
864
906
|
args: tool.mcp.args
|
|
865
907
|
});
|
|
866
908
|
}
|
|
867
909
|
const lines2 = [
|
|
868
|
-
pc.green(`\u2713 Added ${pc.bold(
|
|
910
|
+
pc.green(`\u2713 Added ${pc.bold(tool.name)}`) + (tool.mcp ? pc.dim(` (MCP: ${tool.mcp.package})`) : "")
|
|
869
911
|
];
|
|
870
912
|
if (tool.envHint) {
|
|
871
913
|
lines2.push(pc.yellow(` \u26A0 ${tool.envHint}`));
|
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/hooks.ts","../src/context-manager.ts","../src/memory-extractor.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 } 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 .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 // Assemble system prompt from ecosystem with token budget\n const budget = options.budget || undefined;\n const { prompt: systemPrompt, layers, truncated, totalTokens } = assembleSystemPrompt(budget);\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 corePath = path.join(os.homedir(), \".acore\", \"core.md\");\n let aiName = \"Assistant\";\n if (fs.existsSync(corePath)) {\n const content = fs.readFileSync(corePath, \"utf-8\");\n const match = content.match(/^# (.+)$/m);\n if (match) aiName = match[1];\n }\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}\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};\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}\n\nconst ECOSYSTEM_FILES: EcosystemFile[] = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\" },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"guardrails\", dir: \".arules\", file: \"rules.md\" },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\" },\n];\n\nexport function assembleSystemPrompt(maxTokens?: number): {\n prompt: string;\n layers: string[];\n truncated: string[];\n totalTokens: number;\n} {\n const home = os.homedir();\n const components: PromptComponent[] = [];\n\n for (const entry of ECOSYSTEM_FILES) {\n const filePath = path.join(home, entry.dir, entry.file);\n if (fs.existsSync(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 };\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 (tool_use, tool_result, etc.)\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 === \"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 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 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 ChatResponse,\n} from \"./types.js\";\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?, // Ollama doesn't support tool use — ignored\n ): Promise<ChatResponse> {\n let fullText = \"\";\n\n try {\n const stream = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: [\n { role: \"system\", content: systemPrompt },\n ...messages.map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\"),\n })),\n ],\n stream: true,\n });\n\n for await (const chunk of stream) {\n const text = chunk.choices[0]?.delta?.content || \"\";\n if (text) {\n fullText += text;\n onChunk({ type: \"text\", text });\n }\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 onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\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 ToolDefinition,\n ToolResultBlock,\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 type HookContext,\n} from \"./hooks.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 { 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 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 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 const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = await handleCommand(input, { model, mcpManager });\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 // Auto-trim conversation if approaching token limits\n await trimConversation(messages, client);\n\n // Detect and read file paths in user input\n let enrichedInput = input;\n const filePathMatch = input.match(/(\\/[\\w./-]+|~\\/[\\w./-]+)/);\n if (filePathMatch) {\n let filePath = filePathMatch[1];\n if (filePath.startsWith(\"~/\")) {\n filePath = path.join(os.homedir(), filePath.slice(2));\n }\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n const ext = path.extname(filePath).toLowerCase();\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 if (textExts.has(ext) || ext === \"\") {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const maxChars = 50000; // ~12K tokens\n const trimmed = content.length > maxChars\n ? content.slice(0, maxChars) + `\\n\\n[... truncated, ${content.length - maxChars} chars remaining]`\n : content;\n enrichedInput = `${input}\\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 ([\".docx\", \".doc\", \".pdf\", \".pptx\", \".ppt\", \".xlsx\", \".xls\", \".odt\", \".rtf\", \".epub\"].includes(ext)) {\n // Binary document — try converting via MCP doc_convert tool inline\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 enrichedInput = `${input}\\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 // Conversion failed — pass the error info to LLM\n enrichedInput = `${input}\\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\n // Send to LLM\n messages.push({ role: \"user\", content: enrichedInput });\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 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 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\";\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}\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: \"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 <tool>\n if (action === \"add\") {\n if (args.length < 1) {\n return { handled: true, output: pc.yellow(\"Usage: /akit add <tool>\") };\n }\n const toolName = args[0].toLowerCase();\n const tool = AKIT_REGISTRY.find(t => t.name === toolName);\n\n if (!tool) {\n return {\n handled: true,\n output: [\n pc.red(`Tool \"${toolName}\" not found in registry.`),\n \"\",\n pc.dim(\"Available tools: \" + AKIT_REGISTRY.map(t => t.name).join(\", \")),\n ].join(\"\\n\"),\n };\n }\n\n if (installedNames.has(toolName)) {\n return { handled: true, output: pc.yellow(`${toolName} is already installed.`) };\n }\n\n // Add to installed.json\n installed.push({\n name: toolName,\n installedAt: new Date().toISOString().split(\"T\")[0],\n mcpConfigured: tool.mcp !== null,\n });\n saveAkitInstalled(installed);\n\n // Add to aman-agent config.json → mcpServers\n if (tool.mcp) {\n addToAmanAgentConfig(toolName, {\n command: tool.mcp.command,\n args: tool.mcp.args,\n });\n }\n\n const lines: string[] = [\n pc.green(`✓ Added ${pc.bold(toolName)}`) + (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\", {});\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\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\",\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 \"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 pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\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\";\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;\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\", {});\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 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 // 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 { 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 type { LLMClient } from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.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 } 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","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","os","path","fs","text","text","OpenAI","text","fs","path","os","fs","path","os","pc","fs","path","os","fs","path","os","fs","home","os","path","lines","text","pc","timeContext","pc","text","fs","path","os","pc","path","os","fs","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/hooks.ts","../src/context-manager.ts","../src/memory-extractor.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 } 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 .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 // Assemble system prompt from ecosystem with token budget\n const budget = options.budget || undefined;\n const { prompt: systemPrompt, layers, truncated, totalTokens } = assembleSystemPrompt(budget);\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 corePath = path.join(os.homedir(), \".acore\", \"core.md\");\n let aiName = \"Assistant\";\n if (fs.existsSync(corePath)) {\n const content = fs.readFileSync(corePath, \"utf-8\");\n const match = content.match(/^# (.+)$/m);\n if (match) aiName = match[1];\n }\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}\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};\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}\n\nconst ECOSYSTEM_FILES: EcosystemFile[] = [\n { name: \"identity\", dir: \".acore\", file: \"core.md\" },\n { name: \"tools\", dir: \".akit\", file: \"kit.md\" },\n { name: \"workflows\", dir: \".aflow\", file: \"flow.md\" },\n { name: \"guardrails\", dir: \".arules\", file: \"rules.md\" },\n { name: \"skills\", dir: \".askill\", file: \"skills.md\" },\n];\n\nexport function assembleSystemPrompt(maxTokens?: number): {\n prompt: string;\n layers: string[];\n truncated: string[];\n totalTokens: number;\n} {\n const home = os.homedir();\n const components: PromptComponent[] = [];\n\n for (const entry of ECOSYSTEM_FILES) {\n const filePath = path.join(home, entry.dir, entry.file);\n if (fs.existsSync(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 };\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 (tool_use, tool_result, etc.)\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 === \"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 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 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 ChatResponse,\n} from \"./types.js\";\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?, // Ollama doesn't support tool use — ignored\n ): Promise<ChatResponse> {\n let fullText = \"\";\n\n try {\n const stream = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: [\n { role: \"system\", content: systemPrompt },\n ...messages.map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((b) => b.type === \"text\")\n .map((b) => (\"text\" in b ? b.text : \"\"))\n .join(\"\"),\n })),\n ],\n stream: true,\n });\n\n for await (const chunk of stream) {\n const text = chunk.choices[0]?.delta?.content || \"\";\n if (text) {\n fullText += text;\n onChunk({ type: \"text\", text });\n }\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 onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\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 ToolDefinition,\n ToolResultBlock,\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 type HookContext,\n} from \"./hooks.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 { 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 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 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 const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = await handleCommand(input, { model, mcpManager });\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 // Auto-trim conversation if approaching token limits\n await trimConversation(messages, client);\n\n // Detect and read file paths in user input\n let enrichedInput = input;\n const filePathMatch = input.match(/(\\/[\\w./-]+|~\\/[\\w./-]+)/);\n if (filePathMatch) {\n let filePath = filePathMatch[1];\n if (filePath.startsWith(\"~/\")) {\n filePath = path.join(os.homedir(), filePath.slice(2));\n }\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n const ext = path.extname(filePath).toLowerCase();\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 if (textExts.has(ext) || ext === \"\") {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const maxChars = 50000; // ~12K tokens\n const trimmed = content.length > maxChars\n ? content.slice(0, maxChars) + `\\n\\n[... truncated, ${content.length - maxChars} chars remaining]`\n : content;\n enrichedInput = `${input}\\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 ([\".docx\", \".doc\", \".pdf\", \".pptx\", \".ppt\", \".xlsx\", \".xls\", \".odt\", \".rtf\", \".epub\"].includes(ext)) {\n // Binary document — try converting via MCP doc_convert tool inline\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 enrichedInput = `${input}\\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 // Conversion failed — pass the error info to LLM\n enrichedInput = `${input}\\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\n // Send to LLM\n messages.push({ role: \"user\", content: enrichedInput });\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 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 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\";\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}\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: \"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\", {});\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\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\",\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 \"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 pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\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\";\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;\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\", {});\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 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 // 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 { 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 type { LLMClient } from \"./llm/types.js\";\nimport type { McpManager } from \"./mcp/client.js\";\nimport { log } from \"./logger.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 } 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","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","os","path","fs","text","text","OpenAI","text","fs","path","os","fs","path","os","pc","fs","path","os","fs","path","os","fs","home","os","path","available","lines","tool","num","text","pc","timeContext","pc","text","fs","path","os","pc","path","os","fs","fs","path","os","path","os","fs","home","pc"]}
|