import { Command } from "commander"; import { runAgentLoop } from "@actalk/inkos-core"; import { loadConfig, createClient, findProjectRoot, resolveContext, log, logError } from "../utils.js"; export const agentCommand = new Command("agent") .description("Natural language agent mode (LLM orchestrates via tool-use)") .argument("", "Natural language instruction") .option("--context ", "Additional context (natural language)") .option("--context-file ", "Read additional context from file") .option("--max-turns ", "Maximum agent turns", "20") .option("--json", "Output JSON (suppress progress messages)") .option("--quiet", "Suppress tool call logs") .action(async (instruction: string, opts) => { try { const config = await loadConfig(); const client = createClient(config); const root = findProjectRoot(); const context = await resolveContext(opts); const fullInstruction = context ? `${instruction}\n\n补充信息:${context}` : instruction; const maxTurns = parseInt(opts.maxTurns, 10); const result = await runAgentLoop( { client, model: config.llm.model, projectRoot: root, }, fullInstruction, { maxTurns, onToolCall: opts.quiet || opts.json ? undefined : (name, args) => { log(` [tool] ${name}(${JSON.stringify(args)})`); }, onToolResult: opts.quiet || opts.json ? undefined : (name, result) => { const preview = result.length > 200 ? `${result.slice(0, 200)}...` : result; log(` [result] ${name} → ${preview}`); }, onMessage: opts.json ? undefined : (content) => { log(`\n${content}`); }, }, ); if (opts.json) { log(JSON.stringify({ result })); } } catch (e) { if (opts.json) { log(JSON.stringify({ error: String(e) })); } else { logError(`Agent failed: ${e}`); } process.exit(1); } });