@aman_asmuei/aman-agent 0.2.2 → 0.2.3
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 +15 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -534,6 +534,7 @@ function handleCommand(input, model) {
|
|
|
534
534
|
` ${pc.cyan("/remind")} Set a reminder (e.g. /remind 30m Review PR)`,
|
|
535
535
|
` ${pc.cyan("/model")} Show current LLM model`,
|
|
536
536
|
` ${pc.cyan("/update")} Check for updates`,
|
|
537
|
+
` ${pc.cyan("/reconfig")} Reset LLM config (provider, model, API key)`,
|
|
537
538
|
` ${pc.cyan("/clear")} Clear conversation history`,
|
|
538
539
|
` ${pc.cyan("/quit")} Exit`
|
|
539
540
|
].join("\n")
|
|
@@ -580,6 +581,20 @@ function handleCommand(input, model) {
|
|
|
580
581
|
output: model ? `Model: ${pc.bold(model)}` : "Model: unknown"
|
|
581
582
|
};
|
|
582
583
|
}
|
|
584
|
+
if (cmd === "/update-config" || cmd === "/reconfig") {
|
|
585
|
+
const configPath = path3.join(os3.homedir(), ".aman-agent", "config.json");
|
|
586
|
+
if (fs3.existsSync(configPath)) {
|
|
587
|
+
fs3.unlinkSync(configPath);
|
|
588
|
+
}
|
|
589
|
+
return {
|
|
590
|
+
handled: true,
|
|
591
|
+
quit: true,
|
|
592
|
+
output: [
|
|
593
|
+
pc.green("Config reset."),
|
|
594
|
+
`Run ${pc.bold("npx @aman_asmuei/aman-agent")} again to reconfigure your LLM provider, model, and API key.`
|
|
595
|
+
].join("\n")
|
|
596
|
+
};
|
|
597
|
+
}
|
|
583
598
|
if (cmd === "/update" || cmd === "/upgrade") {
|
|
584
599
|
try {
|
|
585
600
|
const current = execFileSync("npm", ["view", "@aman_asmuei/aman-agent", "version"], { encoding: "utf-8" }).trim();
|
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/agent.ts","../src/commands.ts","../src/reminders.ts","../src/scheduler.ts","../src/notifications.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 {\n loadSchedules,\n addSchedule,\n removeSchedule,\n} from \"./scheduler.js\";\nimport {\n checkNotifications,\n displayNotifications,\n} from \"./notifications.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\ndeclare const __VERSION__: string;\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(\" — starting your AI companion\"));\n\n // Setup config if needed\n let config = loadConfig();\n if (!config) {\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 const authMethod = (await p.select({\n message: \"Authentication method\",\n options: [\n { value: \"api-key\", label: \"API key\", hint: \"from console.anthropic.com\" },\n { value: \"subscription\", label: \"Claude Pro/Team subscription\", hint: \"uses claude.ai session\" },\n ],\n initialValue: \"api-key\",\n })) as string;\n if (p.isCancel(authMethod)) process.exit(0);\n\n if (authMethod === \"subscription\") {\n p.log.info(\"To use your Claude subscription:\");\n p.log.info(\"1. Go to https://console.anthropic.com/settings/keys\");\n p.log.info(\"2. Create an API key (included with Pro/Team plan)\");\n p.log.info(\"3. Paste it below\");\n }\n\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: \"Claude model\",\n options: [\n { value: \"claude-sonnet-4-5-20250514\", label: \"Claude Sonnet 4.5\", 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-5-20250514\",\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-5-20250514\",\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 // Override model if specified\n const model = options.model || config.model;\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 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 p.log.info(`Model: ${pc.dim(model)}`);\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 p.log.success(`${pc.bold(aiName)} is ready.`);\n\n // Session-start notifications\n const notifications = checkNotifications();\n displayNotifications(notifications);\n\n // Start MCP servers\n const mcpManager = new McpManager();\n\n p.log.step(\"Connecting to MCP servers...\");\n\n // Connect to aman-mcp (identity, tools, workflows, rules, eval)\n await mcpManager.connect(\"aman\", \"npx\", [\"-y\", \"@aman_asmuei/aman-mcp\"]);\n\n // Connect to amem (memory)\n await mcpManager.connect(\"amem\", \"npx\", [\"-y\", \"@aman_asmuei/amem\"]);\n\n const mcpTools = mcpManager.getTools();\n if (mcpTools.length > 0) {\n p.log.success(`${mcpTools.length} MCP tools available`);\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 // 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 );\n\n // Cleanup on exit\n await mcpManager.disconnect();\n });\n\nprogram\n .command(\"schedule\")\n .description(\"Manage scheduled tasks\")\n .argument(\"[action]\", \"add, list, or remove\")\n .argument(\"[id]\", \"task ID (for remove)\")\n .action(async (action?: string, id?: string) => {\n if (!action || action === \"list\") {\n const tasks = loadSchedules();\n if (tasks.length === 0) {\n console.log(pc.dim(\"No scheduled tasks.\"));\n return;\n }\n console.log(pc.bold(\"Scheduled tasks:\\n\"));\n for (const task of tasks) {\n const lastRun = task.lastRun\n ? pc.dim(` (last run: ${new Date(task.lastRun).toLocaleString()})`)\n : pc.dim(\" (never run)\");\n console.log(\n ` ${pc.cyan(task.id)} ${task.name} ${pc.dim(task.schedule)} [${task.mode}]${lastRun}`,\n );\n }\n return;\n }\n\n if (action === \"add\") {\n const name = (await p.text({\n message: \"Task name?\",\n validate: (v) => (v.length === 0 ? \"Name is required\" : undefined),\n })) as string;\n if (p.isCancel(name)) return;\n\n const schedule = (await p.select({\n message: \"Schedule?\",\n options: [\n { value: \"daily 9am\", label: \"Daily at 9am\" },\n { value: \"weekdays 9am\", label: \"Weekdays at 9am\" },\n { value: \"weekly friday 4pm\", label: \"Weekly Friday 4pm\" },\n { value: \"every 2h\", label: \"Every 2 hours\" },\n { value: \"every 4h\", label: \"Every 4 hours\" },\n ],\n })) as string;\n if (p.isCancel(schedule)) return;\n\n const actionType = (await p.select({\n message: \"What should happen?\",\n options: [\n { value: \"notify\", label: \"Show notification\" },\n { value: \"auto-run\", label: \"Run automatically\" },\n ],\n })) as \"notify\" | \"auto-run\";\n if (p.isCancel(actionType)) return;\n\n let taskAction = \"notify\";\n if (actionType === \"auto-run\") {\n const cmd = (await p.text({\n message: \"Command to run?\",\n placeholder: \"e.g. run:daily-standup\",\n validate: (v) =>\n v.length === 0 ? \"Command is required\" : undefined,\n })) as string;\n if (p.isCancel(cmd)) return;\n taskAction = cmd;\n }\n\n const task = addSchedule({\n name,\n schedule,\n action: taskAction,\n mode: actionType,\n });\n console.log(\n pc.green(`\\nScheduled task created: ${pc.bold(task.name)} (${task.id})`),\n );\n return;\n }\n\n if (action === \"remove\") {\n if (!id) {\n console.log(pc.red(\"Usage: aman-agent schedule remove <id>\"));\n return;\n }\n const removed = removeSchedule(id);\n if (removed) {\n console.log(pc.green(`Task ${id} removed.`));\n } else {\n console.log(pc.red(`Task ${id} not found.`));\n }\n return;\n }\n\n console.log(\n pc.red(`Unknown action: ${action}. Use add, list, or remove.`),\n );\n });\n\nprogram.parse();\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface AgentConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\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 return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\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 if (hasTools) {\n // Non-streaming when tools are present for simpler tool_use handling\n const response = await client.messages.create({\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Messages.Tool[\"input_schema\"],\n })),\n });\n\n const toolUses = response.content\n .filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\",\n )\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n }));\n\n const textContent = response.content\n .filter(\n (block): block is Anthropic.Messages.TextBlock =>\n block.type === \"text\",\n )\n .map((block) => block.text)\n .join(\"\");\n\n // Stream text to output if there's text and no tool calls\n if (textContent && toolUses.length === 0) {\n onChunk({ type: \"text\", text: textContent });\n onChunk({ type: \"done\" });\n } else if (textContent) {\n // There's text alongside tool calls — show it\n onChunk({ type: \"text\", text: textContent });\n }\n\n // Build the content blocks for the message\n const contentBlocks: ContentBlock[] = response.content.map(\n (block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text };\n }\n // tool_use\n return {\n type: \"tool_use\" as const,\n id: (block as Anthropic.Messages.ToolUseBlock).id,\n name: (block as Anthropic.Messages.ToolUseBlock).name,\n input: (block as Anthropic.Messages.ToolUseBlock)\n .input as Record<string, unknown>,\n };\n },\n );\n\n return {\n message: {\n role: \"assistant\",\n content: toolUses.length > 0 ? contentBlocks : textContent,\n },\n toolUses,\n };\n } else {\n // Streaming when no tools — original behavior\n let fullText = \"\";\n\n const stream = await client.messages.create({\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n stream: true,\n });\n\n for await (const event of stream) {\n if (\n event.type === \"content_block_delta\" &&\n event.delta.type === \"text_delta\"\n ) {\n const text = event.delta.text;\n fullText += text;\n onChunk({ type: \"text\", text });\n }\n }\n\n onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\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 if (hasTools) {\n // Non-streaming with tools\n const response = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: openaiMessages,\n 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 choice = response.choices[0];\n const textContent = choice?.message?.content || \"\";\n const toolCalls = choice?.message?.tool_calls || [];\n\n const toolUses = toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n if (textContent && toolUses.length === 0) {\n onChunk({ type: \"text\", text: textContent });\n onChunk({ type: \"done\" });\n } else if (textContent) {\n onChunk({ type: \"text\", text: textContent });\n }\n\n // Build content blocks\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(textContent\n ? [{ type: \"text\" as const, text: textContent }]\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: textContent },\n toolUses: [],\n };\n } else {\n // Streaming without tools — original behavior\n let fullText = \"\";\n\n const stream = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: openaiMessages,\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\n onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\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\";\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 });\n const client = new Client({\n name: `aman-agent-${name}`,\n version: \"0.1.0\",\n });\n await client.connect(transport);\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 {\n // Server not available — skip silently\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 conn.client.callTool({\n name: toolName,\n arguments: args,\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 {\n /* ignore cleanup errors */\n }\n }\n this.connections = [];\n this.tools = [];\n }\n}\n","import * as readline from \"node:readline\";\nimport pc from \"picocolors\";\nimport type {\n LLMClient,\n Message,\n ToolDefinition,\n ToolResultBlock,\n} from \"./llm/types.js\";\nimport { handleCommand } from \"./commands.js\";\nimport { setReminder, clearReminders } from \"./reminders.js\";\nimport type { McpManager } from \"./mcp/client.js\";\n\nexport async function runAgent(\n client: LLMClient,\n systemPrompt: string,\n aiName: string,\n model: string,\n tools?: ToolDefinition[],\n mcpManager?: McpManager,\n): Promise<void> {\n const messages: Message[] = [];\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\", () => {\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 while (true) {\n const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = handleCommand(input, model);\n if (cmdResult.handled) {\n if (cmdResult.quit) {\n clearReminders();\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n return;\n }\n if (cmdResult.remind) {\n const duration = setReminder(\n cmdResult.remind.timeStr,\n cmdResult.remind.message,\n );\n if (duration) {\n console.log(pc.dim(`Reminder set for ${duration} from now.`));\n } else {\n console.log(\n pc.red(\"Invalid time format. Use: 5m, 30m, 1h, 2h, tomorrow\"),\n );\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 // Send to LLM\n messages.push({ role: \"user\", content: input });\n\n process.stdout.write(pc.cyan(`\\n${aiName} > `));\n\n try {\n let response = await client.chat(\n systemPrompt,\n messages,\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n if (chunk.type === \"done\") {\n process.stdout.write(\"\\n\");\n }\n },\n tools,\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[] = [];\n\n for (const toolUse of response.toolUses) {\n process.stdout.write(\n pc.dim(` [using ${toolUse.name}...]\\n`),\n );\n const result = await mcpManager.callTool(\n toolUse.name,\n toolUse.input,\n );\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolUse.id,\n content: result,\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 client.chat(\n systemPrompt,\n messages,\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n if (chunk.type === \"done\") {\n process.stdout.write(\"\\n\");\n }\n },\n tools,\n );\n\n // Add assistant response to history\n messages.push(response.message);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error occurred\";\n console.error(pc.red(`\\nError: ${message}`));\n // Remove the user message that failed\n messages.pop();\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\";\n\nexport interface CommandResult {\n handled: boolean;\n output?: string;\n quit?: boolean;\n clearHistory?: boolean;\n remind?: { timeStr: string; message: string };\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\nexport function handleCommand(input: string, model?: string): CommandResult {\n const cmd = input.trim().toLowerCase();\n const home = os.homedir();\n\n if (cmd === \"/quit\" || cmd === \"/exit\" || cmd === \"/q\") {\n return { handled: true, quit: true };\n }\n\n if (cmd === \"/help\") {\n return {\n handled: true,\n output: [\n pc.bold(\"Commands:\"),\n ` ${pc.cyan(\"/help\")} Show this help`,\n ` ${pc.cyan(\"/identity\")} View your AI identity`,\n ` ${pc.cyan(\"/tools\")} View installed tools`,\n ` ${pc.cyan(\"/workflows\")} View defined workflows`,\n ` ${pc.cyan(\"/rules\")} View guardrails`,\n ` ${pc.cyan(\"/skills\")} View installed skills`,\n ` ${pc.cyan(\"/remind\")} Set a reminder (e.g. /remind 30m Review PR)`,\n ` ${pc.cyan(\"/model\")} Show current LLM model`,\n ` ${pc.cyan(\"/update\")} Check for updates`,\n ` ${pc.cyan(\"/clear\")} Clear conversation history`,\n ` ${pc.cyan(\"/quit\")} Exit`,\n ].join(\"\\n\"),\n };\n }\n\n if (cmd === \"/identity\") {\n const content = readEcosystemFile(\n path.join(home, \".acore\", \"core.md\"),\n \"identity (acore)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/tools\") {\n const content = readEcosystemFile(\n path.join(home, \".akit\", \"kit.md\"),\n \"tools (akit)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/workflows\") {\n const content = readEcosystemFile(\n path.join(home, \".aflow\", \"flow.md\"),\n \"workflows (aflow)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/rules\") {\n const content = readEcosystemFile(\n path.join(home, \".arules\", \"rules.md\"),\n \"guardrails (arules)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/skills\") {\n const content = readEcosystemFile(\n path.join(home, \".askill\", \"skills.md\"),\n \"skills (askill)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/model\") {\n return {\n handled: true,\n output: model ? `Model: ${pc.bold(model)}` : \"Model: unknown\",\n };\n }\n\n if (cmd === \"/update\" || cmd === \"/upgrade\") {\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\n if (cmd === \"/clear\") {\n return { handled: true, output: pc.dim(\"Conversation cleared.\"), clearHistory: true };\n }\n\n if (cmd.startsWith(\"/remind\")) {\n const parts = input.trim().split(/\\s+/);\n if (parts.length < 3) {\n return {\n handled: true,\n output:\n \"Usage: /remind <time> <message>\\nExamples: /remind 30m Review PR, /remind 2h Deploy, /remind tomorrow Check metrics\",\n };\n }\n const timeStr = parts[1];\n const message = parts.slice(2).join(\" \");\n return { handled: true, remind: { timeStr, message } };\n }\n\n if (cmd.startsWith(\"/\")) {\n return {\n handled: true,\n output: `Unknown command: ${cmd}. Type ${pc.cyan(\"/help\")} for available commands.`,\n };\n }\n\n return { handled: false };\n}\n","import pc from \"picocolors\";\n\ninterface Reminder {\n message: string;\n dueAt: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst activeReminders: Reminder[] = [];\n\nexport function parseTime(timeStr: string): number | null {\n const match = timeStr.match(/^(\\d+)(m|h)$/);\n if (match) {\n const value = parseInt(match[1]);\n const unit = match[2];\n return unit === \"m\" ? value * 60 * 1000 : value * 60 * 60 * 1000;\n }\n if (timeStr === \"tomorrow\") return 24 * 60 * 60 * 1000;\n return null;\n}\n\nexport function setReminder(timeStr: string, message: string): string | null {\n const ms = parseTime(timeStr);\n if (!ms) return null;\n\n const reminder: Reminder = {\n message,\n dueAt: Date.now() + ms,\n };\n\n reminder.timer = setTimeout(() => {\n console.log(`\\n${pc.yellow(\"\\u23f0\")} ${pc.bold(\"Reminder:\")} ${message}`);\n const idx = activeReminders.indexOf(reminder);\n if (idx >= 0) activeReminders.splice(idx, 1);\n }, ms);\n\n activeReminders.push(reminder);\n\n const mins = Math.round(ms / 60000);\n if (mins < 60) return `${mins} minutes`;\n const hours = Math.round(mins / 60);\n return `${hours} hour${hours > 1 ? \"s\" : \"\"}`;\n}\n\nexport function clearReminders(): void {\n for (const r of activeReminders) {\n if (r.timer) clearTimeout(r.timer);\n }\n activeReminders.length = 0;\n}\n\nexport function getActiveCount(): number {\n return activeReminders.length;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst SCHEDULES_PATH = path.join(os.homedir(), \".aman-agent\", \"schedules.json\");\n\nexport interface ScheduledTask {\n id: string;\n name: string;\n schedule: string;\n action: string;\n mode: \"notify\" | \"auto-run\";\n createdAt: string;\n lastRun?: string;\n}\n\nexport function loadSchedules(): ScheduledTask[] {\n if (!fs.existsSync(SCHEDULES_PATH)) return [];\n try {\n return JSON.parse(fs.readFileSync(SCHEDULES_PATH, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\nexport function saveSchedules(tasks: ScheduledTask[]): void {\n const dir = path.dirname(SCHEDULES_PATH);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(\n SCHEDULES_PATH,\n JSON.stringify(tasks, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport function addSchedule(\n task: Omit<ScheduledTask, \"id\" | \"createdAt\">,\n): ScheduledTask {\n const tasks = loadSchedules();\n const newTask: ScheduledTask = {\n ...task,\n id: Date.now().toString(36),\n createdAt: new Date().toISOString(),\n };\n tasks.push(newTask);\n saveSchedules(tasks);\n return newTask;\n}\n\nexport function removeSchedule(id: string): boolean {\n const tasks = loadSchedules();\n const filtered = tasks.filter((t) => t.id !== id);\n if (filtered.length === tasks.length) return false;\n saveSchedules(filtered);\n return true;\n}\n\nexport function getDueTasks(): ScheduledTask[] {\n const tasks = loadSchedules();\n const now = new Date();\n return tasks.filter((task) => {\n if (!task.lastRun) return true;\n const lastRun = new Date(task.lastRun);\n return isDue(task.schedule, lastRun, now);\n });\n}\n\nexport function isDue(schedule: string, lastRun: Date, now: Date): boolean {\n const hoursSinceLastRun =\n (now.getTime() - lastRun.getTime()) / (1000 * 60 * 60);\n\n if (schedule.startsWith(\"every \")) {\n const match = schedule.match(/every (\\d+)h/);\n if (match) return hoursSinceLastRun >= parseInt(match[1]);\n }\n if (schedule === \"daily\" || schedule.startsWith(\"daily \")) {\n return hoursSinceLastRun >= 20;\n }\n if (schedule === \"weekdays\" || schedule.startsWith(\"weekdays \")) {\n const day = now.getDay();\n return day >= 1 && day <= 5 && hoursSinceLastRun >= 20;\n }\n if (schedule.startsWith(\"weekly\")) {\n return hoursSinceLastRun >= 144;\n }\n return false;\n}\n\nexport function markRun(id: string): void {\n const tasks = loadSchedules();\n const task = tasks.find((t) => t.id === id);\n if (task) {\n task.lastRun = new Date().toISOString();\n saveSchedules(tasks);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport { getDueTasks } from \"./scheduler.js\";\n\nexport interface Notification {\n type: \"schedule\" | \"eval\" | \"health\";\n message: string;\n}\n\nexport function checkNotifications(): Notification[] {\n const notifications: Notification[] = [];\n\n // Check due scheduled tasks\n const dueTasks = getDueTasks();\n for (const task of dueTasks) {\n notifications.push({\n type: \"schedule\",\n message: `${task.name} (${task.schedule})`,\n });\n }\n\n // Check aeval — sessions not logged recently\n const evalPath = path.join(os.homedir(), \".aeval\", \"eval.md\");\n if (fs.existsSync(evalPath)) {\n const content = fs.readFileSync(evalPath, \"utf-8\");\n const dateMatch = content.match(/- Last updated: (.+)$/m);\n if (dateMatch) {\n const lastDate = new Date(dateMatch[1]);\n const daysSince =\n (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24);\n if (daysSince > 3) {\n notifications.push({\n type: \"eval\",\n message: `No session logged in ${Math.floor(daysSince)} days \\u2014 run /eval to log one`,\n });\n }\n }\n }\n\n return notifications;\n}\n\nexport function displayNotifications(notifications: Notification[]): void {\n if (notifications.length === 0) return;\n\n console.log(\n pc.yellow(\n `\\n\\u26a0 ${notifications.length} notification${notifications.length > 1 ? \"s\" : \"\"}:`,\n ),\n );\n for (const n of notifications) {\n console.log(` - ${n.message}`);\n }\n console.log(\"\");\n}\n"],"mappings":"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","names":["pc","fs","path","os","text","os","path","fs","text","text","OpenAI","text","pc","fs","path","os","pc","pc","fs","path","os","fs","path","os","pc","path","os","fs","pc","fs","path","os","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/agent.ts","../src/commands.ts","../src/reminders.ts","../src/scheduler.ts","../src/notifications.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 {\n loadSchedules,\n addSchedule,\n removeSchedule,\n} from \"./scheduler.js\";\nimport {\n checkNotifications,\n displayNotifications,\n} from \"./notifications.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\ndeclare const __VERSION__: string;\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(\" — starting your AI companion\"));\n\n // Setup config if needed\n let config = loadConfig();\n if (!config) {\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 const authMethod = (await p.select({\n message: \"Authentication method\",\n options: [\n { value: \"api-key\", label: \"API key\", hint: \"from console.anthropic.com\" },\n { value: \"subscription\", label: \"Claude Pro/Team subscription\", hint: \"uses claude.ai session\" },\n ],\n initialValue: \"api-key\",\n })) as string;\n if (p.isCancel(authMethod)) process.exit(0);\n\n if (authMethod === \"subscription\") {\n p.log.info(\"To use your Claude subscription:\");\n p.log.info(\"1. Go to https://console.anthropic.com/settings/keys\");\n p.log.info(\"2. Create an API key (included with Pro/Team plan)\");\n p.log.info(\"3. Paste it below\");\n }\n\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: \"Claude model\",\n options: [\n { value: \"claude-sonnet-4-5-20250514\", label: \"Claude Sonnet 4.5\", 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-5-20250514\",\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-5-20250514\",\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 // Override model if specified\n const model = options.model || config.model;\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 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 p.log.info(`Model: ${pc.dim(model)}`);\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 p.log.success(`${pc.bold(aiName)} is ready.`);\n\n // Session-start notifications\n const notifications = checkNotifications();\n displayNotifications(notifications);\n\n // Start MCP servers\n const mcpManager = new McpManager();\n\n p.log.step(\"Connecting to MCP servers...\");\n\n // Connect to aman-mcp (identity, tools, workflows, rules, eval)\n await mcpManager.connect(\"aman\", \"npx\", [\"-y\", \"@aman_asmuei/aman-mcp\"]);\n\n // Connect to amem (memory)\n await mcpManager.connect(\"amem\", \"npx\", [\"-y\", \"@aman_asmuei/amem\"]);\n\n const mcpTools = mcpManager.getTools();\n if (mcpTools.length > 0) {\n p.log.success(`${mcpTools.length} MCP tools available`);\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 // 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 );\n\n // Cleanup on exit\n await mcpManager.disconnect();\n });\n\nprogram\n .command(\"schedule\")\n .description(\"Manage scheduled tasks\")\n .argument(\"[action]\", \"add, list, or remove\")\n .argument(\"[id]\", \"task ID (for remove)\")\n .action(async (action?: string, id?: string) => {\n if (!action || action === \"list\") {\n const tasks = loadSchedules();\n if (tasks.length === 0) {\n console.log(pc.dim(\"No scheduled tasks.\"));\n return;\n }\n console.log(pc.bold(\"Scheduled tasks:\\n\"));\n for (const task of tasks) {\n const lastRun = task.lastRun\n ? pc.dim(` (last run: ${new Date(task.lastRun).toLocaleString()})`)\n : pc.dim(\" (never run)\");\n console.log(\n ` ${pc.cyan(task.id)} ${task.name} ${pc.dim(task.schedule)} [${task.mode}]${lastRun}`,\n );\n }\n return;\n }\n\n if (action === \"add\") {\n const name = (await p.text({\n message: \"Task name?\",\n validate: (v) => (v.length === 0 ? \"Name is required\" : undefined),\n })) as string;\n if (p.isCancel(name)) return;\n\n const schedule = (await p.select({\n message: \"Schedule?\",\n options: [\n { value: \"daily 9am\", label: \"Daily at 9am\" },\n { value: \"weekdays 9am\", label: \"Weekdays at 9am\" },\n { value: \"weekly friday 4pm\", label: \"Weekly Friday 4pm\" },\n { value: \"every 2h\", label: \"Every 2 hours\" },\n { value: \"every 4h\", label: \"Every 4 hours\" },\n ],\n })) as string;\n if (p.isCancel(schedule)) return;\n\n const actionType = (await p.select({\n message: \"What should happen?\",\n options: [\n { value: \"notify\", label: \"Show notification\" },\n { value: \"auto-run\", label: \"Run automatically\" },\n ],\n })) as \"notify\" | \"auto-run\";\n if (p.isCancel(actionType)) return;\n\n let taskAction = \"notify\";\n if (actionType === \"auto-run\") {\n const cmd = (await p.text({\n message: \"Command to run?\",\n placeholder: \"e.g. run:daily-standup\",\n validate: (v) =>\n v.length === 0 ? \"Command is required\" : undefined,\n })) as string;\n if (p.isCancel(cmd)) return;\n taskAction = cmd;\n }\n\n const task = addSchedule({\n name,\n schedule,\n action: taskAction,\n mode: actionType,\n });\n console.log(\n pc.green(`\\nScheduled task created: ${pc.bold(task.name)} (${task.id})`),\n );\n return;\n }\n\n if (action === \"remove\") {\n if (!id) {\n console.log(pc.red(\"Usage: aman-agent schedule remove <id>\"));\n return;\n }\n const removed = removeSchedule(id);\n if (removed) {\n console.log(pc.green(`Task ${id} removed.`));\n } else {\n console.log(pc.red(`Task ${id} not found.`));\n }\n return;\n }\n\n console.log(\n pc.red(`Unknown action: ${action}. Use add, list, or remove.`),\n );\n });\n\nprogram.parse();\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nexport interface AgentConfig {\n provider: \"anthropic\" | \"openai\" | \"ollama\";\n apiKey: string;\n model: string;\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 return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\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 if (hasTools) {\n // Non-streaming when tools are present for simpler tool_use handling\n const response = await client.messages.create({\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Messages.Tool[\"input_schema\"],\n })),\n });\n\n const toolUses = response.content\n .filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\",\n )\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n }));\n\n const textContent = response.content\n .filter(\n (block): block is Anthropic.Messages.TextBlock =>\n block.type === \"text\",\n )\n .map((block) => block.text)\n .join(\"\");\n\n // Stream text to output if there's text and no tool calls\n if (textContent && toolUses.length === 0) {\n onChunk({ type: \"text\", text: textContent });\n onChunk({ type: \"done\" });\n } else if (textContent) {\n // There's text alongside tool calls — show it\n onChunk({ type: \"text\", text: textContent });\n }\n\n // Build the content blocks for the message\n const contentBlocks: ContentBlock[] = response.content.map(\n (block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text };\n }\n // tool_use\n return {\n type: \"tool_use\" as const,\n id: (block as Anthropic.Messages.ToolUseBlock).id,\n name: (block as Anthropic.Messages.ToolUseBlock).name,\n input: (block as Anthropic.Messages.ToolUseBlock)\n .input as Record<string, unknown>,\n };\n },\n );\n\n return {\n message: {\n role: \"assistant\",\n content: toolUses.length > 0 ? contentBlocks : textContent,\n },\n toolUses,\n };\n } else {\n // Streaming when no tools — original behavior\n let fullText = \"\";\n\n const stream = await client.messages.create({\n model,\n max_tokens: 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n stream: true,\n });\n\n for await (const event of stream) {\n if (\n event.type === \"content_block_delta\" &&\n event.delta.type === \"text_delta\"\n ) {\n const text = event.delta.text;\n fullText += text;\n onChunk({ type: \"text\", text });\n }\n }\n\n onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\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 if (hasTools) {\n // Non-streaming with tools\n const response = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: openaiMessages,\n 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 choice = response.choices[0];\n const textContent = choice?.message?.content || \"\";\n const toolCalls = choice?.message?.tool_calls || [];\n\n const toolUses = toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || \"{}\") as Record<\n string,\n unknown\n >,\n }));\n\n if (textContent && toolUses.length === 0) {\n onChunk({ type: \"text\", text: textContent });\n onChunk({ type: \"done\" });\n } else if (textContent) {\n onChunk({ type: \"text\", text: textContent });\n }\n\n // Build content blocks\n if (toolUses.length > 0) {\n const contentBlocks = [\n ...(textContent\n ? [{ type: \"text\" as const, text: textContent }]\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: textContent },\n toolUses: [],\n };\n } else {\n // Streaming without tools — original behavior\n let fullText = \"\";\n\n const stream = await client.chat.completions.create({\n model,\n max_tokens: 8192,\n messages: openaiMessages,\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\n onChunk({ type: \"done\" });\n return {\n message: { role: \"assistant\", content: fullText },\n toolUses: [],\n };\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\";\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 });\n const client = new Client({\n name: `aman-agent-${name}`,\n version: \"0.1.0\",\n });\n await client.connect(transport);\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 {\n // Server not available — skip silently\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 conn.client.callTool({\n name: toolName,\n arguments: args,\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 {\n /* ignore cleanup errors */\n }\n }\n this.connections = [];\n this.tools = [];\n }\n}\n","import * as readline from \"node:readline\";\nimport pc from \"picocolors\";\nimport type {\n LLMClient,\n Message,\n ToolDefinition,\n ToolResultBlock,\n} from \"./llm/types.js\";\nimport { handleCommand } from \"./commands.js\";\nimport { setReminder, clearReminders } from \"./reminders.js\";\nimport type { McpManager } from \"./mcp/client.js\";\n\nexport async function runAgent(\n client: LLMClient,\n systemPrompt: string,\n aiName: string,\n model: string,\n tools?: ToolDefinition[],\n mcpManager?: McpManager,\n): Promise<void> {\n const messages: Message[] = [];\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\", () => {\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 while (true) {\n const input = await prompt();\n if (!input.trim()) continue;\n\n // Handle slash commands\n const cmdResult = handleCommand(input, model);\n if (cmdResult.handled) {\n if (cmdResult.quit) {\n clearReminders();\n console.log(pc.dim(\"\\nGoodbye.\\n\"));\n rl.close();\n return;\n }\n if (cmdResult.remind) {\n const duration = setReminder(\n cmdResult.remind.timeStr,\n cmdResult.remind.message,\n );\n if (duration) {\n console.log(pc.dim(`Reminder set for ${duration} from now.`));\n } else {\n console.log(\n pc.red(\"Invalid time format. Use: 5m, 30m, 1h, 2h, tomorrow\"),\n );\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 // Send to LLM\n messages.push({ role: \"user\", content: input });\n\n process.stdout.write(pc.cyan(`\\n${aiName} > `));\n\n try {\n let response = await client.chat(\n systemPrompt,\n messages,\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n if (chunk.type === \"done\") {\n process.stdout.write(\"\\n\");\n }\n },\n tools,\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[] = [];\n\n for (const toolUse of response.toolUses) {\n process.stdout.write(\n pc.dim(` [using ${toolUse.name}...]\\n`),\n );\n const result = await mcpManager.callTool(\n toolUse.name,\n toolUse.input,\n );\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: toolUse.id,\n content: result,\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 client.chat(\n systemPrompt,\n messages,\n (chunk) => {\n if (chunk.type === \"text\" && chunk.text) {\n process.stdout.write(chunk.text);\n }\n if (chunk.type === \"done\") {\n process.stdout.write(\"\\n\");\n }\n },\n tools,\n );\n\n // Add assistant response to history\n messages.push(response.message);\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error occurred\";\n console.error(pc.red(`\\nError: ${message}`));\n // Remove the user message that failed\n messages.pop();\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\";\n\nexport interface CommandResult {\n handled: boolean;\n output?: string;\n quit?: boolean;\n clearHistory?: boolean;\n remind?: { timeStr: string; message: string };\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\nexport function handleCommand(input: string, model?: string): CommandResult {\n const cmd = input.trim().toLowerCase();\n const home = os.homedir();\n\n if (cmd === \"/quit\" || cmd === \"/exit\" || cmd === \"/q\") {\n return { handled: true, quit: true };\n }\n\n if (cmd === \"/help\") {\n return {\n handled: true,\n output: [\n pc.bold(\"Commands:\"),\n ` ${pc.cyan(\"/help\")} Show this help`,\n ` ${pc.cyan(\"/identity\")} View your AI identity`,\n ` ${pc.cyan(\"/tools\")} View installed tools`,\n ` ${pc.cyan(\"/workflows\")} View defined workflows`,\n ` ${pc.cyan(\"/rules\")} View guardrails`,\n ` ${pc.cyan(\"/skills\")} View installed skills`,\n ` ${pc.cyan(\"/remind\")} Set a reminder (e.g. /remind 30m Review PR)`,\n ` ${pc.cyan(\"/model\")} Show current LLM model`,\n ` ${pc.cyan(\"/update\")} Check for updates`,\n ` ${pc.cyan(\"/reconfig\")} Reset LLM config (provider, model, API key)`,\n ` ${pc.cyan(\"/clear\")} Clear conversation history`,\n ` ${pc.cyan(\"/quit\")} Exit`,\n ].join(\"\\n\"),\n };\n }\n\n if (cmd === \"/identity\") {\n const content = readEcosystemFile(\n path.join(home, \".acore\", \"core.md\"),\n \"identity (acore)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/tools\") {\n const content = readEcosystemFile(\n path.join(home, \".akit\", \"kit.md\"),\n \"tools (akit)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/workflows\") {\n const content = readEcosystemFile(\n path.join(home, \".aflow\", \"flow.md\"),\n \"workflows (aflow)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/rules\") {\n const content = readEcosystemFile(\n path.join(home, \".arules\", \"rules.md\"),\n \"guardrails (arules)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/skills\") {\n const content = readEcosystemFile(\n path.join(home, \".askill\", \"skills.md\"),\n \"skills (askill)\",\n );\n return { handled: true, output: content };\n }\n\n if (cmd === \"/model\") {\n return {\n handled: true,\n output: model ? `Model: ${pc.bold(model)}` : \"Model: unknown\",\n };\n }\n\n if (cmd === \"/update-config\" || cmd === \"/reconfig\") {\n const configPath = path.join(os.homedir(), \".aman-agent\", \"config.json\");\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n return {\n handled: true,\n quit: true,\n output: [\n pc.green(\"Config reset.\"),\n `Run ${pc.bold(\"npx @aman_asmuei/aman-agent\")} again to reconfigure your LLM provider, model, and API key.`,\n ].join(\"\\n\"),\n };\n }\n\n if (cmd === \"/update\" || cmd === \"/upgrade\") {\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\n if (cmd === \"/clear\") {\n return { handled: true, output: pc.dim(\"Conversation cleared.\"), clearHistory: true };\n }\n\n if (cmd.startsWith(\"/remind\")) {\n const parts = input.trim().split(/\\s+/);\n if (parts.length < 3) {\n return {\n handled: true,\n output:\n \"Usage: /remind <time> <message>\\nExamples: /remind 30m Review PR, /remind 2h Deploy, /remind tomorrow Check metrics\",\n };\n }\n const timeStr = parts[1];\n const message = parts.slice(2).join(\" \");\n return { handled: true, remind: { timeStr, message } };\n }\n\n if (cmd.startsWith(\"/\")) {\n return {\n handled: true,\n output: `Unknown command: ${cmd}. Type ${pc.cyan(\"/help\")} for available commands.`,\n };\n }\n\n return { handled: false };\n}\n","import pc from \"picocolors\";\n\ninterface Reminder {\n message: string;\n dueAt: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst activeReminders: Reminder[] = [];\n\nexport function parseTime(timeStr: string): number | null {\n const match = timeStr.match(/^(\\d+)(m|h)$/);\n if (match) {\n const value = parseInt(match[1]);\n const unit = match[2];\n return unit === \"m\" ? value * 60 * 1000 : value * 60 * 60 * 1000;\n }\n if (timeStr === \"tomorrow\") return 24 * 60 * 60 * 1000;\n return null;\n}\n\nexport function setReminder(timeStr: string, message: string): string | null {\n const ms = parseTime(timeStr);\n if (!ms) return null;\n\n const reminder: Reminder = {\n message,\n dueAt: Date.now() + ms,\n };\n\n reminder.timer = setTimeout(() => {\n console.log(`\\n${pc.yellow(\"\\u23f0\")} ${pc.bold(\"Reminder:\")} ${message}`);\n const idx = activeReminders.indexOf(reminder);\n if (idx >= 0) activeReminders.splice(idx, 1);\n }, ms);\n\n activeReminders.push(reminder);\n\n const mins = Math.round(ms / 60000);\n if (mins < 60) return `${mins} minutes`;\n const hours = Math.round(mins / 60);\n return `${hours} hour${hours > 1 ? \"s\" : \"\"}`;\n}\n\nexport function clearReminders(): void {\n for (const r of activeReminders) {\n if (r.timer) clearTimeout(r.timer);\n }\n activeReminders.length = 0;\n}\n\nexport function getActiveCount(): number {\n return activeReminders.length;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nconst SCHEDULES_PATH = path.join(os.homedir(), \".aman-agent\", \"schedules.json\");\n\nexport interface ScheduledTask {\n id: string;\n name: string;\n schedule: string;\n action: string;\n mode: \"notify\" | \"auto-run\";\n createdAt: string;\n lastRun?: string;\n}\n\nexport function loadSchedules(): ScheduledTask[] {\n if (!fs.existsSync(SCHEDULES_PATH)) return [];\n try {\n return JSON.parse(fs.readFileSync(SCHEDULES_PATH, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\nexport function saveSchedules(tasks: ScheduledTask[]): void {\n const dir = path.dirname(SCHEDULES_PATH);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(\n SCHEDULES_PATH,\n JSON.stringify(tasks, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport function addSchedule(\n task: Omit<ScheduledTask, \"id\" | \"createdAt\">,\n): ScheduledTask {\n const tasks = loadSchedules();\n const newTask: ScheduledTask = {\n ...task,\n id: Date.now().toString(36),\n createdAt: new Date().toISOString(),\n };\n tasks.push(newTask);\n saveSchedules(tasks);\n return newTask;\n}\n\nexport function removeSchedule(id: string): boolean {\n const tasks = loadSchedules();\n const filtered = tasks.filter((t) => t.id !== id);\n if (filtered.length === tasks.length) return false;\n saveSchedules(filtered);\n return true;\n}\n\nexport function getDueTasks(): ScheduledTask[] {\n const tasks = loadSchedules();\n const now = new Date();\n return tasks.filter((task) => {\n if (!task.lastRun) return true;\n const lastRun = new Date(task.lastRun);\n return isDue(task.schedule, lastRun, now);\n });\n}\n\nexport function isDue(schedule: string, lastRun: Date, now: Date): boolean {\n const hoursSinceLastRun =\n (now.getTime() - lastRun.getTime()) / (1000 * 60 * 60);\n\n if (schedule.startsWith(\"every \")) {\n const match = schedule.match(/every (\\d+)h/);\n if (match) return hoursSinceLastRun >= parseInt(match[1]);\n }\n if (schedule === \"daily\" || schedule.startsWith(\"daily \")) {\n return hoursSinceLastRun >= 20;\n }\n if (schedule === \"weekdays\" || schedule.startsWith(\"weekdays \")) {\n const day = now.getDay();\n return day >= 1 && day <= 5 && hoursSinceLastRun >= 20;\n }\n if (schedule.startsWith(\"weekly\")) {\n return hoursSinceLastRun >= 144;\n }\n return false;\n}\n\nexport function markRun(id: string): void {\n const tasks = loadSchedules();\n const task = tasks.find((t) => t.id === id);\n if (task) {\n task.lastRun = new Date().toISOString();\n saveSchedules(tasks);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport pc from \"picocolors\";\nimport { getDueTasks } from \"./scheduler.js\";\n\nexport interface Notification {\n type: \"schedule\" | \"eval\" | \"health\";\n message: string;\n}\n\nexport function checkNotifications(): Notification[] {\n const notifications: Notification[] = [];\n\n // Check due scheduled tasks\n const dueTasks = getDueTasks();\n for (const task of dueTasks) {\n notifications.push({\n type: \"schedule\",\n message: `${task.name} (${task.schedule})`,\n });\n }\n\n // Check aeval — sessions not logged recently\n const evalPath = path.join(os.homedir(), \".aeval\", \"eval.md\");\n if (fs.existsSync(evalPath)) {\n const content = fs.readFileSync(evalPath, \"utf-8\");\n const dateMatch = content.match(/- Last updated: (.+)$/m);\n if (dateMatch) {\n const lastDate = new Date(dateMatch[1]);\n const daysSince =\n (Date.now() - lastDate.getTime()) / (1000 * 60 * 60 * 24);\n if (daysSince > 3) {\n notifications.push({\n type: \"eval\",\n message: `No session logged in ${Math.floor(daysSince)} days \\u2014 run /eval to log one`,\n });\n }\n }\n }\n\n return notifications;\n}\n\nexport function displayNotifications(notifications: Notification[]): void {\n if (notifications.length === 0) return;\n\n console.log(\n pc.yellow(\n `\\n\\u26a0 ${notifications.length} notification${notifications.length > 1 ? \"s\" : \"\"}:`,\n ),\n );\n for (const n of notifications) {\n console.log(` - ${n.message}`);\n }\n console.log(\"\");\n}\n"],"mappings":"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","names":["pc","fs","path","os","text","os","path","fs","text","text","OpenAI","text","pc","fs","path","os","pc","pc","fs","path","os","fs","path","os","pc","path","os","fs","pc","fs","path","os","pc"]}
|