@ddlqhd/agent-sdk 0.1.0 → 0.1.1

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.
Files changed (48) hide show
  1. package/README.md +4 -2
  2. package/dist/{chunk-NDSL7NPN.js → chunk-742JTNYI.js} +224 -19
  3. package/dist/chunk-742JTNYI.js.map +1 -0
  4. package/dist/{chunk-5QMA2YBY.cjs → chunk-AJD3DTL7.cjs} +57 -28
  5. package/dist/chunk-AJD3DTL7.cjs.map +1 -0
  6. package/dist/{chunk-X35MHWXE.cjs → chunk-DQFTAD3I.cjs} +231 -24
  7. package/dist/chunk-DQFTAD3I.cjs.map +1 -0
  8. package/dist/{chunk-Q3SOMX26.js → chunk-DXMVWGLJ.js} +52 -25
  9. package/dist/chunk-DXMVWGLJ.js.map +1 -0
  10. package/dist/chunk-LOYIGOBZ.js +54 -0
  11. package/dist/chunk-LOYIGOBZ.js.map +1 -0
  12. package/dist/chunk-OZO7D77N.cjs +59 -0
  13. package/dist/chunk-OZO7D77N.cjs.map +1 -0
  14. package/dist/{chunk-JF5AJQMU.cjs → chunk-Q3L4GIBG.cjs} +211 -58
  15. package/dist/chunk-Q3L4GIBG.cjs.map +1 -0
  16. package/dist/{chunk-OHXW2YM6.js → chunk-THKEF32L.js} +210 -57
  17. package/dist/chunk-THKEF32L.js.map +1 -0
  18. package/dist/cli/index.cjs +36 -37
  19. package/dist/cli/index.cjs.map +1 -1
  20. package/dist/cli/index.js +11 -12
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/{index-DPsZ1zat.d.ts → index-DGPDMbW5.d.cts} +8 -21
  23. package/dist/{index-RTPmFjMp.d.cts → index-nEfayAzD.d.ts} +8 -21
  24. package/dist/index.cjs +91 -79
  25. package/dist/index.d.cts +26 -6
  26. package/dist/index.d.ts +26 -6
  27. package/dist/index.js +4 -4
  28. package/dist/models/index.cjs +15 -15
  29. package/dist/models/index.d.cts +50 -6
  30. package/dist/models/index.d.ts +50 -6
  31. package/dist/models/index.js +2 -2
  32. package/dist/tools/index.cjs +51 -51
  33. package/dist/tools/index.d.cts +3 -3
  34. package/dist/tools/index.d.ts +3 -3
  35. package/dist/tools/index.js +2 -2
  36. package/dist/{types-C0aX_Qdp.d.cts → types-BLf9IqRs.d.cts} +34 -49
  37. package/dist/{types-C0aX_Qdp.d.ts → types-BLf9IqRs.d.ts} +34 -49
  38. package/package.json +15 -4
  39. package/dist/chunk-5QMA2YBY.cjs.map +0 -1
  40. package/dist/chunk-CNSGZVRN.cjs +0 -152
  41. package/dist/chunk-CNSGZVRN.cjs.map +0 -1
  42. package/dist/chunk-JF5AJQMU.cjs.map +0 -1
  43. package/dist/chunk-NDSL7NPN.js.map +0 -1
  44. package/dist/chunk-OHXW2YM6.js.map +0 -1
  45. package/dist/chunk-Q3SOMX26.js.map +0 -1
  46. package/dist/chunk-WH3APNQ5.js +0 -147
  47. package/dist/chunk-WH3APNQ5.js.map +0 -1
  48. package/dist/chunk-X35MHWXE.cjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunk5QMA2YBY_cjs = require('../chunk-5QMA2YBY.cjs');
5
- var chunkX35MHWXE_cjs = require('../chunk-X35MHWXE.cjs');
6
- var chunkJF5AJQMU_cjs = require('../chunk-JF5AJQMU.cjs');
7
- require('../chunk-CNSGZVRN.cjs');
4
+ var chunkAJD3DTL7_cjs = require('../chunk-AJD3DTL7.cjs');
5
+ require('../chunk-DQFTAD3I.cjs');
6
+ var chunkQ3L4GIBG_cjs = require('../chunk-Q3L4GIBG.cjs');
7
+ require('../chunk-OZO7D77N.cjs');
8
8
  var commander = require('commander');
9
9
  var chalk = require('chalk');
10
10
  var promises = require('readline/promises');
@@ -396,15 +396,15 @@ function addModelOptions(cmd) {
396
396
  (v) => parseOllamaThinkCli(v)
397
397
  );
398
398
  }
399
- function createModelFromOptions(options) {
399
+ function modelConfigFromOptions(options) {
400
400
  const provider = options.model || "openai";
401
- return chunkX35MHWXE_cjs.createModel({
401
+ return {
402
402
  provider,
403
403
  apiKey: options.apiKey,
404
404
  baseUrl: options.baseUrl,
405
405
  model: options.modelName,
406
406
  ...provider === "ollama" && options.ollamaThink !== void 0 ? { think: options.ollamaThink } : {}
407
- });
407
+ };
408
408
  }
409
409
  function createChatCommand() {
410
410
  return addModelOptions(
@@ -413,13 +413,12 @@ function createChatCommand() {
413
413
  try {
414
414
  let sessionId = options.session;
415
415
  if (options.resume && !sessionId) {
416
- sessionId = await chunk5QMA2YBY_cjs.getLatestSessionId(options.userBasePath);
416
+ sessionId = await chunkAJD3DTL7_cjs.getLatestSessionId(options.userBasePath);
417
417
  if (!sessionId) {
418
418
  console.warn(chalk__default.default.yellow("No saved sessions found; starting a new session."));
419
419
  }
420
420
  }
421
- const model = createModelFromOptions(options);
422
- const mcpResult = chunk5QMA2YBY_cjs.loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
421
+ const mcpResult = chunkAJD3DTL7_cjs.loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
423
422
  if (mcpResult.configPath) {
424
423
  console.log(chalk__default.default.gray(`Loaded MCP config from: ${mcpResult.configPath}`));
425
424
  if (mcpResult.servers.length > 0) {
@@ -427,8 +426,8 @@ function createChatCommand() {
427
426
  }
428
427
  }
429
428
  const cwd = options.cwd || process.cwd();
430
- const agent = new chunk5QMA2YBY_cjs.Agent({
431
- model,
429
+ const agent = new chunkAJD3DTL7_cjs.Agent({
430
+ modelConfig: modelConfigFromOptions(options),
432
431
  cwd,
433
432
  hookConfigDir: cwd,
434
433
  systemPrompt: options.system,
@@ -439,11 +438,12 @@ function createChatCommand() {
439
438
  askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : void 0
440
439
  });
441
440
  await agent.waitForInit();
441
+ const model = agent.getModel();
442
442
  const skillRegistry = agent.getSkillRegistry();
443
443
  const skills = skillRegistry.getUserInvocableSkills();
444
444
  console.log(chalk__default.default.cyan("\u{1F916} Agent SDK Chat"));
445
445
  console.log(chalk__default.default.gray(`Model: ${model.name}`));
446
- console.log(chalk__default.default.gray(`Sessions: ${chunk5QMA2YBY_cjs.getSessionStoragePath(options.userBasePath)}`));
446
+ console.log(chalk__default.default.gray(`Sessions: ${chunkAJD3DTL7_cjs.getSessionStoragePath(options.userBasePath)}`));
447
447
  if (skills.length > 0) {
448
448
  console.log(chalk__default.default.gray(`Skills: ${skills.map((s) => `/${s.name}`).join(", ")}`));
449
449
  }
@@ -584,19 +584,18 @@ function createRunCommand() {
584
584
  try {
585
585
  let sessionId = options.session;
586
586
  if (options.resume && !sessionId) {
587
- sessionId = await chunk5QMA2YBY_cjs.getLatestSessionId(options.userBasePath);
587
+ sessionId = await chunkAJD3DTL7_cjs.getLatestSessionId(options.userBasePath);
588
588
  if (!sessionId) {
589
589
  console.warn(chalk__default.default.yellow("No saved sessions found; starting a new session."));
590
590
  }
591
591
  }
592
- const model = createModelFromOptions(options);
593
- const mcpResult = chunk5QMA2YBY_cjs.loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
592
+ const mcpResult = chunkAJD3DTL7_cjs.loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
594
593
  if (mcpResult.configPath) {
595
594
  console.log(chalk__default.default.gray(`Loaded MCP config from: ${mcpResult.configPath}`));
596
595
  }
597
596
  const cwd = options.cwd || process.cwd();
598
- const agent = new chunk5QMA2YBY_cjs.Agent({
599
- model,
597
+ const agent = new chunkAJD3DTL7_cjs.Agent({
598
+ modelConfig: modelConfigFromOptions(options),
600
599
  cwd,
601
600
  hookConfigDir: cwd,
602
601
  systemPrompt: options.system,
@@ -639,9 +638,9 @@ ${formatUsage(result.usage)}`);
639
638
  function createToolsCommand() {
640
639
  const command = new commander.Command("tools").description("Manage agent tools");
641
640
  command.command("list").description("List all available tools").option("-f, --format <format>", "Output format (table/json)", "table").option("-c, --category <category>", "Filter by category").action((options) => {
642
- const registry = new chunkJF5AJQMU_cjs.ToolRegistry();
643
- const skillRegistry = chunk5QMA2YBY_cjs.createSkillRegistry();
644
- registry.registerMany(chunkJF5AJQMU_cjs.getAllBuiltinTools(skillRegistry));
641
+ const registry = new chunkQ3L4GIBG_cjs.ToolRegistry();
642
+ const skillRegistry = chunkAJD3DTL7_cjs.createSkillRegistry();
643
+ registry.registerMany(chunkQ3L4GIBG_cjs.getAllBuiltinTools(skillRegistry));
645
644
  let tools = registry.getAll();
646
645
  if (options.category) {
647
646
  tools = tools.filter(
@@ -676,9 +675,9 @@ Total: ${tools.length} tools`));
676
675
  }
677
676
  });
678
677
  command.command("show <name>").description("Show tool details").action((name) => {
679
- const registry = new chunkJF5AJQMU_cjs.ToolRegistry();
680
- const skillRegistry = chunk5QMA2YBY_cjs.createSkillRegistry();
681
- registry.registerMany(chunkJF5AJQMU_cjs.getAllBuiltinTools(skillRegistry));
678
+ const registry = new chunkQ3L4GIBG_cjs.ToolRegistry();
679
+ const skillRegistry = chunkAJD3DTL7_cjs.createSkillRegistry();
680
+ registry.registerMany(chunkQ3L4GIBG_cjs.getAllBuiltinTools(skillRegistry));
682
681
  const tool = registry.get(name);
683
682
  if (!tool) {
684
683
  console.error(chalk__default.default.red(`Tool "${name}" not found`));
@@ -697,9 +696,9 @@ Parameters Schema:`);
697
696
  command.command("test <name>").description(
698
697
  "Test a tool with arguments. Note: AskUserQuestion returns formatted text only unless the Agent is configured with askUserQuestion (e.g. CLI TTY)."
699
698
  ).option("-a, --args <json>", "Tool arguments as JSON").action(async (name, options) => {
700
- const registry = new chunkJF5AJQMU_cjs.ToolRegistry();
701
- const skillRegistry = chunk5QMA2YBY_cjs.createSkillRegistry();
702
- registry.registerMany(chunkJF5AJQMU_cjs.getAllBuiltinTools(skillRegistry));
699
+ const registry = new chunkQ3L4GIBG_cjs.ToolRegistry();
700
+ const skillRegistry = chunkAJD3DTL7_cjs.createSkillRegistry();
701
+ registry.registerMany(chunkQ3L4GIBG_cjs.getAllBuiltinTools(skillRegistry));
703
702
  if (!registry.has(name)) {
704
703
  console.error(chalk__default.default.red(`Tool "${name}" not found`));
705
704
  process.exit(1);
@@ -737,9 +736,9 @@ function createSessionsCommand() {
737
736
  addUserBasePathOption(
738
737
  command.command("list").description("List all sessions").option("-l, --limit <n>", "Limit number of sessions", parseInt, 20).option("-f, --format <format>", "Output format (table/json)", "table")
739
738
  ).action(async (options) => {
740
- const manager = new chunk5QMA2YBY_cjs.SessionManager({
739
+ const manager = new chunkAJD3DTL7_cjs.SessionManager({
741
740
  type: "jsonl",
742
- basePath: chunk5QMA2YBY_cjs.getSessionStoragePath(options.userBasePath)
741
+ basePath: chunkAJD3DTL7_cjs.getSessionStoragePath(options.userBasePath)
743
742
  });
744
743
  const sessions = await manager.listSessions();
745
744
  const limited = sessions.slice(0, options.limit);
@@ -772,9 +771,9 @@ Total: ${sessions.length} sessions`));
772
771
  addUserBasePathOption(
773
772
  command.command("show <id>").description("Show session messages").option("-l, --limit <n>", "Limit number of messages", parseInt, 50)
774
773
  ).action(async (id, options) => {
775
- const manager = new chunk5QMA2YBY_cjs.SessionManager({
774
+ const manager = new chunkAJD3DTL7_cjs.SessionManager({
776
775
  type: "jsonl",
777
- basePath: chunk5QMA2YBY_cjs.getSessionStoragePath(options.userBasePath)
776
+ basePath: chunkAJD3DTL7_cjs.getSessionStoragePath(options.userBasePath)
778
777
  });
779
778
  const exists = await manager.sessionExists(id);
780
779
  if (!exists) {
@@ -797,9 +796,9 @@ Total: ${sessions.length} sessions`));
797
796
  addUserBasePathOption(
798
797
  command.command("delete <id>").description("Delete a session").option("-f, --force", "Skip confirmation")
799
798
  ).action(async (id, options) => {
800
- const manager = new chunk5QMA2YBY_cjs.SessionManager({
799
+ const manager = new chunkAJD3DTL7_cjs.SessionManager({
801
800
  type: "jsonl",
802
- basePath: chunk5QMA2YBY_cjs.getSessionStoragePath(options.userBasePath)
801
+ basePath: chunkAJD3DTL7_cjs.getSessionStoragePath(options.userBasePath)
803
802
  });
804
803
  const exists = await manager.sessionExists(id);
805
804
  if (!exists) {
@@ -827,9 +826,9 @@ Total: ${sessions.length} sessions`));
827
826
  addUserBasePathOption(
828
827
  command.command("clear").description("Delete all sessions").option("-f, --force", "Skip confirmation")
829
828
  ).action(async (options) => {
830
- const manager = new chunk5QMA2YBY_cjs.SessionManager({
829
+ const manager = new chunkAJD3DTL7_cjs.SessionManager({
831
830
  type: "jsonl",
832
- basePath: chunk5QMA2YBY_cjs.getSessionStoragePath(options.userBasePath)
831
+ basePath: chunkAJD3DTL7_cjs.getSessionStoragePath(options.userBasePath)
833
832
  });
834
833
  const sessions = await manager.listSessions();
835
834
  if (sessions.length === 0) {
@@ -863,7 +862,7 @@ function createMCPCommand() {
863
862
  const command = new commander.Command("mcp").description("Manage MCP servers");
864
863
  command.command("connect <command>").description("Connect to an MCP server and list available tools").option("-n, --name <name>", "Server name", "default").option("-a, --args <args>", "Command arguments (comma-separated)").option("-e, --env <env>", "Environment variables (KEY=VALUE,comma-separated)").action(async (cmd, options) => {
865
864
  try {
866
- const adapter = new chunk5QMA2YBY_cjs.MCPAdapter();
865
+ const adapter = new chunkAJD3DTL7_cjs.MCPAdapter();
867
866
  const args = options.args ? options.args.split(",") : [];
868
867
  const env = {};
869
868
  if (options.env) {
@@ -908,7 +907,7 @@ function createMCPCommand() {
908
907
  var isMainModule = process.argv[1]?.endsWith("cli/index.js") || process.argv[1]?.endsWith("cli\\index.js") || process.argv[1]?.includes("agent-sdk");
909
908
  if (isMainModule) {
910
909
  const program = new commander.Command();
911
- program.name("agent-sdk").description("A TypeScript Agent SDK with multi-model support, MCP integration, and streaming").version("0.1.0");
910
+ program.name("agent-sdk").description("A TypeScript Agent SDK with multi-model support, MCP integration, and streaming").version(chunkAJD3DTL7_cjs.PACKAGE_VERSION);
912
911
  program.addCommand(createChatCommand());
913
912
  program.addCommand(createRunCommand());
914
913
  program.addCommand(createToolsCommand());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/utils/output.ts","../../src/cli/utils/keypress.ts","../../src/cli/utils/ask-user-question.ts","../../src/cli/commands/chat.ts","../../src/cli/commands/tools.ts","../../src/cli/commands/sessions.ts","../../src/cli/commands/mcp.ts","../../src/cli/index.ts"],"names":["chalk","argsStr","createInterface","createModel","Command","getLatestSessionId","loadMCPConfig","Agent","getSessionStoragePath","ToolRegistry","createSkillRegistry","getAllBuiltinTools","SessionManager","MCPAdapter"],"mappings":"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","file":"index.cjs","sourcesContent":["import chalk from 'chalk';\nimport type { StreamEvent, TokenUsage, SessionTokenUsage } from '../../core/types.js';\n\n/**\n * 输出格式化配置\n */\nexport interface OutputConfig {\n color?: boolean;\n verbose?: boolean;\n}\n\n/**\n * 格式化流式事件输出\n */\nexport function formatEvent(event: StreamEvent, config: OutputConfig = {}): string {\n const { color = true, verbose = false } = config;\n\n switch (event.type) {\n case 'start':\n return color ? chalk.gray('▶ Starting...') : '▶ Starting...';\n\n case 'text_delta':\n return event.content;\n\n case 'text_start':\n return '';\n\n case 'text_end':\n return '\\n';\n\n case 'tool_call_start':\n return color\n ? chalk.yellow(`\\n🔧 Calling tool: ${event.name}`)\n : `\\n🔧 Calling tool: ${event.name}`;\n\n case 'tool_call':\n return color\n ? chalk.yellow(`\\n🔧 Tool: ${event.name}(${JSON.stringify(event.arguments)})`)\n : `\\n🔧 Tool: ${event.name}(${JSON.stringify(event.arguments)})`;\n\n case 'tool_result':\n return color\n ? chalk.green(`\\n✓ Result: ${truncate(event.result, 100)}`)\n : `\\n✓ Result: ${truncate(event.result, 100)}`;\n\n case 'tool_error':\n return color\n ? chalk.red(`\\n✗ Tool error: ${event.error.message}`)\n : `\\n✗ Tool error: ${event.error.message}`;\n\n case 'thinking':\n return color\n ? chalk.gray(`💭 ${event.content}`)\n : `💭 ${event.content}`;\n\n case 'model_usage':\n if (verbose) {\n const phase = event.phase ? ` (${event.phase})` : '';\n const payload = JSON.stringify(event.usage, null, 2);\n return color ? chalk.gray(`\\n📊 usage${phase}\\n${payload}`) : `\\n📊 usage${phase}\\n${payload}`;\n }\n return '';\n\n case 'session_summary':\n if (verbose) {\n const payload = JSON.stringify(\n {\n ...(event.sessionId !== undefined ? { sessionId: event.sessionId } : {}),\n iterations: event.iterations,\n usage: event.usage\n },\n null,\n 2\n );\n return color ? chalk.gray(`\\n📊 ${payload}`) : `\\n📊 ${payload}`;\n }\n return '';\n\n case 'end': {\n if (event.reason === 'error' && event.error) {\n return color\n ? chalk.red(`\\n✗ Error: ${event.error.message}`)\n : `\\n✗ Error: ${event.error.message}`;\n }\n if (event.reason === 'aborted') {\n return color ? chalk.yellow('\\n[interrupted]') : '\\n[interrupted]';\n }\n return '';\n }\n\n case 'tool_call_delta':\n case 'tool_call_end':\n return '';\n\n case 'context_compressed':\n return color\n ? chalk.gray(\n `\\n📦 Context compressed (${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages)`\n )\n : `\\n📦 Context compressed (${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages)`;\n\n default:\n return '';\n }\n}\n\n/**\n * 有状态的流式事件格式化器\n */\nexport interface StreamFormatter {\n format(event: StreamEvent): string;\n finalize(): string;\n}\n\nfunction tokenUsageEqual(a: TokenUsage, b: TokenUsage): boolean {\n return (\n a.promptTokens === b.promptTokens &&\n a.completionTokens === b.completionTokens &&\n a.totalTokens === b.totalTokens\n );\n}\n\n/** Full tool call id for CLI (call vs result lines use the same string). */\nfunction toolCallIdTag(id: string): string {\n return `[${id}]`;\n}\n\n/** CLI stream: tool invocation line (printed on `tool_call`, before execution). */\nfunction formatStreamToolCallLine(\n verbose: boolean,\n toolCallId: string,\n name: string,\n args: unknown\n): string {\n const idPart = chalk.gray(` ${toolCallIdTag(toolCallId)}`);\n if (verbose) {\n const argsStr = args != null ? ` ${JSON.stringify(args, null, 2)}` : '';\n return chalk.yellow(`\\n🔧 ${name}`) + idPart + chalk.gray(argsStr);\n }\n const argsStr = args != null ? `(${truncate(JSON.stringify(args), 80)})` : '()';\n return chalk.yellow(`\\n🔧 ${name}`) + idPart + chalk.gray(argsStr);\n}\n\nexport function createStreamFormatter(config: OutputConfig = {}): StreamFormatter {\n const { verbose = false } = config;\n let lastEventType: string | null = null;\n let isFirstThinking = true;\n let lastPrintedUsage: TokenUsage | null = null;\n /** 工具输出后若中间插入了 model_usage 等事件,lastEventType 不再是 tool_result,需靠此标志在正文/thinking 前补换行 */\n let needsGapAfterToolBlock = false;\n\n return {\n format(event: StreamEvent): string {\n let output = '';\n\n // thinking 块结束时插入换行\n if (lastEventType === 'thinking' && event.type !== 'thinking') {\n output += '\\n';\n isFirstThinking = true;\n }\n\n // 工具块结束后与助手正文或 thinking 分段(model_usage 会插在 tool_result 与 text_delta 之间,不能仅靠 lastEventType)\n if (\n needsGapAfterToolBlock &&\n (event.type === 'text_delta' || event.type === 'thinking')\n ) {\n output += '\\n';\n needsGapAfterToolBlock = false;\n }\n\n switch (event.type) {\n case 'text_start':\n case 'text_end':\n case 'tool_call_start':\n case 'tool_call_delta':\n case 'tool_call_end':\n break;\n\n case 'context_compressed':\n if (verbose) {\n output += chalk.gray(\n `\\n📦 Context compressed: ${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages (${event.stats.durationMs}ms)\\n`\n );\n }\n break;\n\n case 'text_delta':\n output += event.content;\n break;\n\n case 'thinking':\n if (isFirstThinking) {\n output += `\\n${chalk.gray(`💭 ${event.content}`)}`;\n isFirstThinking = false;\n } else {\n output += chalk.gray(event.content);\n }\n break;\n\n case 'tool_call':\n output += formatStreamToolCallLine(verbose, event.id, event.name, event.arguments);\n break;\n\n case 'tool_result': {\n const idTag = toolCallIdTag(event.toolCallId);\n if (verbose) {\n output +=\n chalk.green('\\n✓ ') +\n chalk.gray(`${idTag} `) +\n chalk.green(`Result:\\n${event.result}\\n`);\n } else {\n const resultStr = truncate(event.result, 120);\n output +=\n chalk.green('\\n✓ ') + chalk.gray(`${idTag} `) + chalk.green(resultStr);\n }\n needsGapAfterToolBlock = true;\n break;\n }\n\n case 'tool_error': {\n const idTag = toolCallIdTag(event.toolCallId);\n if (verbose) {\n output +=\n chalk.red('\\n✗ ') +\n chalk.gray(`${idTag} `) +\n chalk.red(`Error:\\n${event.error.message}\\n`);\n } else {\n output +=\n chalk.red('\\n✗ ') + chalk.gray(`${idTag} `) + chalk.red(event.error.message);\n }\n needsGapAfterToolBlock = true;\n break;\n }\n\n case 'model_usage': {\n const usage = event.usage;\n if (!lastPrintedUsage || !tokenUsageEqual(lastPrintedUsage, usage)) {\n lastPrintedUsage = usage;\n output += `\\n${formatUsage(usage)}`;\n }\n break;\n }\n\n case 'session_summary': {\n const usage = event.usage;\n if (!lastPrintedUsage || !tokenUsageEqual(lastPrintedUsage, usage)) {\n lastPrintedUsage = usage;\n output += `\\n${formatUsage(usage)}`;\n }\n break;\n }\n\n case 'end':\n if (event.reason === 'error' && event.error) {\n output += chalk.red(`\\n✗ ${event.error.message}`);\n } else if (event.reason === 'aborted') {\n output += chalk.yellow('\\n[interrupted]');\n }\n break;\n }\n\n lastEventType = event.type;\n return output;\n },\n\n finalize(): string {\n return lastEventType === 'thinking' ? '\\n' : '';\n }\n };\n}\n\n/**\n * 格式化 Token 使用统计\n */\nexport function formatUsage(usage: TokenUsage, config: OutputConfig = {}): string {\n const { color = true } = config;\n\n const text = `📊 Tokens: ${usage.promptTokens} in, ${usage.completionTokens} out (${usage.totalTokens} total)`;\n\n return color ? chalk.gray(text) : text;\n}\n\n/**\n * 格式化会话 Token 使用统计\n *\n * 区分:\n * - Context: 当前上下文大小 (用于压缩判断)\n * - Input: 累计输入消耗\n * - Output: 累计输出消耗\n * - Total: 累计总消耗 (Input + Output)\n */\nexport function formatSessionUsage(usage: SessionTokenUsage, config: OutputConfig = {}): string {\n const { color = true } = config;\n\n let text = `📊 Input: ${usage.inputTokens} | Output: ${usage.outputTokens} | Total: ${usage.totalTokens}`;\n if (usage.cacheReadTokens > 0 || usage.cacheWriteTokens > 0) {\n text += ` | Cache: ${usage.cacheReadTokens}r/${usage.cacheWriteTokens}w`;\n }\n\n return color ? chalk.gray(text) : text;\n}\n\n/**\n * 格式化表格\n *\n * `columns[].width` 为列的最小宽度;实际宽度还会按表头与单元格内容撑开,避免截断或错位。\n */\nexport function formatTable(\n data: Record<string, unknown>[],\n columns: Array<{ key: string; header: string; width?: number }>\n): string {\n if (data.length === 0) {\n return 'No data';\n }\n\n // 计算列宽(width 视为下限,避免固定宽度短于 UUID 等长内容时排版错位)\n const widths = columns.map(col => {\n const headerLen = col.header.length;\n const maxDataLen = Math.max(\n ...data.map(row => String(row[col.key] || '').length),\n 0\n );\n const minW = col.width ?? 0;\n return Math.max(minW, headerLen, maxDataLen, 10);\n });\n\n // 生成表头\n const header = columns.map((col, i) => col.header.padEnd(widths[i])).join(' │ ');\n const separator = widths.map(w => '─'.repeat(w)).join('─┼─');\n\n // 生成数据行\n const rows = data.map(row =>\n columns.map((col, i) => String(row[col.key] || '').padEnd(widths[i])).join(' │ ')\n );\n\n return [header, separator, ...rows].join('\\n');\n}\n\n/**\n * 截断字符串\n */\nexport function truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + '...';\n}\n\n/**\n * 打印成功消息\n */\nexport function success(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * 打印错误消息\n */\nexport function error(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * 打印警告消息\n */\nexport function warn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * 打印信息消息\n */\nexport function info(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n}\n\n/**\n * 创建进度指示器\n */\nexport function createSpinner(text: string): {\n start: () => void;\n stop: (finalText?: string) => void;\n update: (text: string) => void;\n} {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n return {\n start() {\n process.stdout.write('\\x1B[?25l'); // 隐藏光标\n interval = setInterval(() => {\n process.stdout.write(`\\r${chalk.cyan(frames[frameIndex])} ${currentText}`);\n frameIndex = (frameIndex + 1) % frames.length;\n }, 80);\n },\n\n stop(finalText?: string) {\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // 清除行\n process.stdout.write('\\x1B[?25h'); // 显示光标\n if (finalText) {\n console.log(finalText);\n }\n },\n\n update(text: string) {\n currentText = text;\n }\n };\n}\n\n/**\n * 读取用户输入\n */\nexport async function prompt(question: string): Promise<string> {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\n/**\n * 确认提示\n */\nexport async function confirm(question: string): Promise<boolean> {\n const answer = await prompt(`${question} (y/N) `);\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n","export interface KeyPressHandler {\n onAbort: () => void;\n onExit?: () => void;\n}\n\nlet isActive = false;\nlet currentHandler: KeyPressHandler | null = null;\nlet paused = false;\n\nconst onKeypress = (chunk: string | Buffer) => {\n if (!isActive || !currentHandler) return;\n\n const key = typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n if (key === '\\x1b' || key.charCodeAt(0) === 27) {\n currentHandler.onAbort();\n }\n if (key === '\\u0003') {\n currentHandler.onExit?.() || process.exit(130);\n }\n};\n\nexport function initKeypressListener(): () => void {\n if (!process.stdin.isTTY) {\n return () => {};\n }\n\n if (isActive) {\n return () => {};\n }\n\n isActive = true;\n process.stdin.setRawMode(true);\n process.stdin.resume();\n // Do not call setEncoding on stdin: readline's emitKeypressEvents uses its own decoder; mixing\n // string 'data' chunks with raw ESC handling breaks TTY input on some platforms after raw mode.\n process.stdin.on('data', onKeypress);\n\n return () => {\n if (!isActive) return;\n isActive = false;\n currentHandler = null;\n paused = false;\n\n process.stdin.off('data', onKeypress);\n try {\n process.stdin.setRawMode(false);\n } catch {\n // ignore\n }\n // Removing the last `data` listener can pause stdin; readline needs flowing mode (esp. Windows TTY).\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n };\n}\n\nexport function setKeypressHandler(handler: KeyPressHandler): void {\n currentHandler = handler;\n}\n\nexport function clearKeypressHandler(): void {\n currentHandler = null;\n}\n\n/**\n * CLI-only: release raw mode and the stdin `data` listener so line-based prompts\n * (e.g. AskUserQuestion) work while streaming. Pair with the returned resume function.\n */\nexport function pauseKeypressListener(): () => void {\n if (!process.stdin.isTTY || !isActive || paused) {\n return () => {};\n }\n\n paused = true;\n process.stdin.off('data', onKeypress);\n try {\n process.stdin.setRawMode(false);\n } catch {\n // ignore\n }\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n\n return () => {\n if (!paused) return;\n paused = false;\n if (!process.stdin.isTTY || !isActive) return;\n try {\n process.stdin.setRawMode(true);\n } catch {\n // ignore\n }\n process.stdin.on('data', onKeypress);\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n };\n}\n","import { createInterface } from 'node:readline/promises';\nimport type {\n AskUserQuestionAnswer,\n AskUserQuestionItem,\n AskUserQuestionResolver\n} from '../../tools/builtin/interaction.js';\n\nconst MAX_PROMPT_RETRIES = 10;\n\nfunction parseSingleLine(\n line: string,\n optionCount: number\n): { kind: 'indices'; indices: number[] } | { kind: 'other' } | null {\n const t = line.trim().toLowerCase();\n if (t === '0' || t === 'o') {\n return { kind: 'other' };\n }\n const n = parseInt(t, 10);\n if (!Number.isFinite(n) || n < 1 || n > optionCount) {\n return null;\n }\n return { kind: 'indices', indices: [n - 1] };\n}\n\nfunction parseMultiLine(\n line: string,\n optionCount: number\n): { kind: 'indices'; indices: number[] } | { kind: 'other' } | null {\n const t = line.trim().toLowerCase();\n if (t === '0' || t === 'o') {\n return { kind: 'other' };\n }\n const parts = t.split(/[\\s,]+/).filter(Boolean);\n if (parts.length === 0) {\n return null;\n }\n const indices = new Set<number>();\n for (const p of parts) {\n const n = parseInt(p, 10);\n if (!Number.isFinite(n) || n < 1 || n > optionCount) {\n return null;\n }\n indices.add(n - 1);\n }\n if (indices.size === 0) {\n return null;\n }\n return { kind: 'indices', indices: [...indices] };\n}\n\n/**\n * Collect answers via readLine (TTY or injected for tests).\n */\nexport async function runInteractiveAskUserQuestion(\n questions: AskUserQuestionItem[],\n readLine: (prompt: string) => Promise<string>\n): Promise<AskUserQuestionAnswer[]> {\n const answers: AskUserQuestionAnswer[] = [];\n\n for (let qi = 0; qi < questions.length; qi++) {\n const q = questions[qi];\n const n = q.options.length;\n let attempt = 0;\n let resolved: AskUserQuestionAnswer | null = null;\n\n const block = [\n `[${q.header}] ${q.question}`,\n ...q.options.map((opt, i) => ` ${i + 1}. ${opt.label} — ${opt.description}`),\n ' 0. Other — custom answer when chosen',\n '',\n q.multiSelect\n ? 'Enter one or more numbers (1-' +\n n +\n ') separated by comma or space, or 0/o for Other:'\n : 'Enter a number 1-' + n + ', or 0/o for Other:'\n ].join('\\n');\n\n while (attempt < MAX_PROMPT_RETRIES && !resolved) {\n attempt++;\n process.stdout.write(block + '\\n');\n const line = await readLine('> ');\n const parsed = q.multiSelect ? parseMultiLine(line, n) : parseSingleLine(line, n);\n\n if (!parsed) {\n process.stdout.write(\n `Invalid input. ${q.multiSelect ? 'Use numbers 1-' + n + ' (comma/space separated)' : 'Enter 1-' + n}, or 0/o for Other.\\n`\n );\n continue;\n }\n\n if (parsed.kind === 'other') {\n const otherText = (await readLine('Other (custom text): ')).trim();\n resolved = {\n questionIndex: qi,\n selectedLabels: [],\n otherText\n };\n break;\n }\n\n const labels = parsed.indices.map((idx) => q.options[idx]!.label);\n resolved = {\n questionIndex: qi,\n selectedLabels: labels\n };\n break;\n }\n\n if (!resolved) {\n resolved = {\n questionIndex: qi,\n selectedLabels: [],\n otherText: '(skipped after invalid input)'\n };\n }\n\n answers.push(resolved);\n }\n\n return answers;\n}\n\nfunction createTtyReadLineSession(): {\n readLine: (prompt: string) => Promise<string>;\n close: () => void;\n} {\n const stdin = process.stdin;\n const ttyIn = stdin.isTTY ? (stdin as NodeJS.ReadStream & { isRaw?: boolean }) : null;\n const wasRaw = Boolean(ttyIn?.isRaw);\n if (wasRaw) {\n try {\n stdin.setRawMode(false);\n } catch {\n // ignore\n }\n }\n if (stdin.isPaused()) {\n stdin.resume();\n }\n\n const rl = createInterface({ input: stdin, output: process.stdout });\n return {\n readLine: (prompt: string) => rl.question(prompt),\n close: () => {\n rl.close();\n if (wasRaw && stdin.isTTY) {\n try {\n stdin.setRawMode(true);\n } catch {\n // ignore\n }\n }\n }\n };\n}\n\n/**\n * TTY stdin: interactive AskUserQuestion for {@link Agent} `askUserQuestion`.\n */\nexport function createTtyAskUserQuestionResolver(): AskUserQuestionResolver {\n return async (questions) => {\n const session = createTtyReadLineSession();\n try {\n return await runInteractiveAskUserQuestion(questions, session.readLine);\n } finally {\n session.close();\n }\n };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createModel, type ModelProvider } from '../../models/index.js';\nimport { Agent } from '../../core/agent.js';\nimport { formatUsage, formatSessionUsage, createStreamFormatter } from '../utils/output.js';\nimport {\n initKeypressListener,\n setKeypressHandler,\n clearKeypressHandler,\n pauseKeypressListener\n} from '../utils/keypress.js';\nimport type { CLIConfig } from '../../core/types.js';\nimport { loadMCPConfig } from '../../config/index.js';\nimport { createTtyAskUserQuestionResolver } from '../utils/ask-user-question.js';\nimport { getLatestSessionId, getSessionStoragePath } from '../../storage/session-path.js';\n\nfunction parseOllamaThinkCli(value: string | undefined): boolean | 'low' | 'medium' | 'high' {\n if (value === undefined || value === '') return true;\n const s = value.toLowerCase();\n if (s === 'true' || s === '1' || s === 'yes') return true;\n if (s === 'false' || s === '0' || s === 'no') return false;\n if (s === 'low' || s === 'medium' || s === 'high') return s;\n throw new Error(`Invalid --ollama-think: ${value} (use true, false, low, medium, or high)`);\n}\n\nfunction addModelOptions(cmd: Command): Command {\n return cmd\n .option('-m, --model <model>', 'Model to use (openai/anthropic/ollama)', 'openai')\n .option('-k, --api-key <key>', 'API key')\n .option('-u, --base-url <url>', 'Base URL for API')\n .option('-M, --model-name <name>', 'Model name')\n .option('-s, --session <id>', 'Session ID to resume')\n .option('-S, --system <prompt>', 'System prompt')\n .option('-t, --temperature <temp>', 'Temperature', parseFloat)\n .option('--max-tokens <tokens>', 'Max tokens', (v) => parseInt(v, 10))\n .option('--no-stream', 'Disable streaming')\n .option('-v, --verbose', 'Show full tool calls and results')\n .option('--mcp-config <path>', 'Path to MCP config file (mcp_config.json)')\n .option('--user-base-path <path>', 'User base path (default: ~)')\n .option('--cwd <path>', 'Working directory (default: current directory)')\n .option(\n '--resume',\n 'Resume the most recently updated session (uses same storage as --user-base-path; ignored if --session is set)'\n )\n .option(\n '--ollama-think [value]',\n 'Ollama only: `think` param (true|false|low|medium|high; bare flag => true)',\n (v: string | undefined) => parseOllamaThinkCli(v)\n );\n}\n\nfunction createModelFromOptions(options: CLIConfig) {\n const provider = (options.model || 'openai') as ModelProvider;\n return createModel({\n provider,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n model: options.modelName,\n ...(provider === 'ollama' && options.ollamaThink !== undefined\n ? { think: options.ollamaThink }\n : {})\n });\n}\n\n/**\n * 交互式对话命令\n */\nexport function createChatCommand(): Command {\n return addModelOptions(\n new Command('chat').description('Start an interactive chat session')\n ).action(async (options) => {\n try {\n let sessionId: string | undefined = options.session;\n if (options.resume && !sessionId) {\n sessionId = await getLatestSessionId(options.userBasePath);\n if (!sessionId) {\n console.warn(chalk.yellow('No saved sessions found; starting a new session.'));\n }\n }\n\n const model = createModelFromOptions(options);\n\n // 加载 MCP 配置\n const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);\n if (mcpResult.configPath) {\n console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));\n if (mcpResult.servers.length > 0) {\n console.log(chalk.gray(`MCP servers: ${mcpResult.servers.map(s => s.name).join(', ')}`));\n }\n }\n\n const cwd = options.cwd || process.cwd();\n const agent = new Agent({\n model,\n cwd,\n hookConfigDir: cwd,\n systemPrompt: options.system,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n mcpServers: mcpResult.servers,\n userBasePath: options.userBasePath,\n askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : undefined\n });\n\n // 等待 Agent 初始化完成(skill 加载、MCP 连接等)\n await agent.waitForInit();\n\n // 显示已加载的 skills\n const skillRegistry = agent.getSkillRegistry();\n const skills = skillRegistry.getUserInvocableSkills();\n\n console.log(chalk.cyan('🤖 Agent SDK Chat'));\n console.log(chalk.gray(`Model: ${model.name}`));\n console.log(chalk.gray(`Sessions: ${getSessionStoragePath(options.userBasePath)}`));\n if (skills.length > 0) {\n console.log(chalk.gray(`Skills: ${skills.map(s => `/${s.name}`).join(', ')}`));\n }\n console.log(chalk.gray('Type \"exit\" or \"quit\" to end the session'));\n console.log(chalk.gray('Press ESC to interrupt streaming'));\n console.log(chalk.gray('Use /skill-name to invoke a skill\\n'));\n\n const readline = await import('readline');\n // terminal: false avoids readline's raw mode + emitKeypressEvents on stdin. We toggle raw\n // mode ourselves during streaming (ESC interrupt); mixing both causes stuck input after a turn\n // on Windows and other TTYs (see Node internal/readline/interface close() + emitKeypressEvents).\n let rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false\n });\n\n const askQuestion = (): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(chalk.green('You: '), resolve);\n });\n };\n\n try {\n while (true) {\n const input = await askQuestion();\n\n if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {\n console.log(chalk.gray('\\nGoodbye! 👋'));\n break;\n }\n\n if (!input.trim()) continue;\n\n // Close outer readline for the assistant turn so tools (e.g. AskUserQuestion) can attach\n // their own readline to stdin without duplicate echo. Recreate in finally.\n let releasedOuterReadline = false;\n rl.close();\n releasedOuterReadline = true;\n try {\n // 检测 skill 调用并显示反馈\n const processed = await agent.processInput(input);\n if (processed.invoked) {\n console.log(chalk.yellow(`\\n⚡ Invoked skill: ${processed.skillName}`));\n }\n\n process.stdout.write(chalk.blue('\\nAssistant: '));\n\n if (options.stream === false) {\n const result = await agent.run(input, { sessionId });\n console.log(result.content);\n if (result.usage) {\n console.log(`\\n${formatUsage(result.usage)}`);\n }\n console.log(`\\n${formatSessionUsage(agent.getSessionUsage())}`);\n const sid = agent.getSessionManager().sessionId;\n if (sid) {\n console.log(chalk.gray(`Session id: ${sid} (next time: add --resume or -s ${sid})`));\n }\n } else {\n const abortController = new AbortController();\n let interrupted = false;\n\n const cleanupKeypress = initKeypressListener();\n setKeypressHandler({\n onAbort: () => {\n interrupted = true;\n abortController.abort();\n process.stdout.write(chalk.yellow('\\n[interrupted]\\n'));\n }\n });\n\n let resumeAskStdin: (() => void) | null = null;\n const pendingAskToolCallIds = new Set<string>();\n\n try {\n const formatter = createStreamFormatter({ verbose: options.verbose });\n\n for await (const event of agent.stream(input, {\n sessionId,\n signal: abortController.signal\n })) {\n if (interrupted) break;\n\n if (event.type === 'tool_call' && event.name === 'AskUserQuestion') {\n pendingAskToolCallIds.add(event.id);\n if (!resumeAskStdin) {\n resumeAskStdin = pauseKeypressListener();\n }\n }\n if (event.type === 'tool_result' && pendingAskToolCallIds.has(event.toolCallId)) {\n pendingAskToolCallIds.delete(event.toolCallId);\n if (pendingAskToolCallIds.size === 0 && resumeAskStdin) {\n resumeAskStdin();\n resumeAskStdin = null;\n }\n }\n if (event.type === 'tool_error' && pendingAskToolCallIds.has(event.toolCallId)) {\n pendingAskToolCallIds.delete(event.toolCallId);\n if (pendingAskToolCallIds.size === 0 && resumeAskStdin) {\n resumeAskStdin();\n resumeAskStdin = null;\n }\n }\n\n const output = formatter.format(event);\n if (output) process.stdout.write(output);\n }\n if (!interrupted) {\n const tail = formatter.finalize();\n if (tail) process.stdout.write(tail);\n console.log(`\\n${formatSessionUsage(agent.getSessionUsage())}`);\n const sid = agent.getSessionManager().sessionId;\n if (sid) {\n console.log(chalk.gray(`Session id: ${sid} (next time: add --resume or -s ${sid})`));\n }\n }\n } finally {\n if (resumeAskStdin) {\n resumeAskStdin();\n }\n clearKeypressHandler();\n cleanupKeypress();\n }\n }\n\n console.log('\\n');\n } finally {\n if (releasedOuterReadline) {\n rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false\n });\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n }\n }\n }\n } finally {\n await agent.destroy();\n rl.close();\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n}\n\n/**\n * 单次执行命令\n */\nexport function createRunCommand(): Command {\n return addModelOptions(\n new Command('run')\n .description('Run a single prompt')\n .argument('<prompt>', 'The prompt to run')\n ).option('-o, --output <format>', 'Output format (text/json)', 'text')\n .action(async (prompt, options) => {\n try {\n let sessionId: string | undefined = options.session;\n if (options.resume && !sessionId) {\n sessionId = await getLatestSessionId(options.userBasePath);\n if (!sessionId) {\n console.warn(chalk.yellow('No saved sessions found; starting a new session.'));\n }\n }\n\n const model = createModelFromOptions(options);\n\n // 加载 MCP 配置\n const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);\n if (mcpResult.configPath) {\n console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));\n }\n\n const cwd = options.cwd || process.cwd();\n const agent = new Agent({\n model,\n cwd,\n hookConfigDir: cwd,\n systemPrompt: options.system,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n mcpServers: mcpResult.servers,\n userBasePath: options.userBasePath,\n askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : undefined\n });\n\n // 等待 Agent 初始化完成\n await agent.waitForInit();\n\n try {\n if (options.output === 'json') {\n const result = await agent.run(prompt, { sessionId });\n console.log(JSON.stringify(result, null, 2));\n } else if (options.stream !== false) {\n const formatter = createStreamFormatter({ verbose: options.verbose });\n for await (const event of agent.stream(prompt, { sessionId })) {\n const output = formatter.format(event);\n if (output) process.stdout.write(output);\n }\n const tail = formatter.finalize();\n if (tail) process.stdout.write(tail);\n } else {\n const result = await agent.run(prompt, { sessionId });\n console.log(result.content);\n if (result.usage) {\n console.log(`\\n${formatUsage(result.usage)}`);\n }\n }\n } finally {\n // 清理资源\n await agent.destroy();\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ToolRegistry } from '../../tools/registry.js';\nimport { getAllBuiltinTools } from '../../tools/builtin/index.js';\nimport { createSkillRegistry } from '../../skills/registry.js';\nimport { formatTable } from '../utils/output.js';\n\n/**\n * 工具管理命令\n */\nexport function createToolsCommand(): Command {\n const command = new Command('tools')\n .description('Manage agent tools');\n\n // 列出工具\n command\n .command('list')\n .description('List all available tools')\n .option('-f, --format <format>', 'Output format (table/json)', 'table')\n .option('-c, --category <category>', 'Filter by category')\n .action((options) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n let tools = registry.getAll();\n\n if (options.category) {\n tools = tools.filter(t =>\n t.name.startsWith(options.category) ||\n t.description.toLowerCase().includes(options.category.toLowerCase())\n );\n }\n\n if (options.format === 'json') {\n console.log(JSON.stringify(tools.map(t => ({\n name: t.name,\n description: t.description,\n dangerous: t.isDangerous || false,\n category: t.category || null\n })), null, 2));\n } else {\n console.log(chalk.cyan('\\n📦 Available Tools\\n'));\n console.log(formatTable(\n tools.map(t => ({\n name: t.name,\n description: t.description.slice(0, 50) + (t.description.length > 50 ? '...' : ''),\n category: t.category || '',\n dangerous: t.isDangerous ? '⚠️' : ''\n })),\n [\n { key: 'name', header: 'Name', width: 20 },\n { key: 'description', header: 'Description', width: 50 },\n { key: 'category', header: 'Category', width: 12 },\n { key: 'dangerous', header: '', width: 3 }\n ]\n ));\n console.log(chalk.gray(`\\nTotal: ${tools.length} tools`));\n }\n });\n\n // 查看工具详情\n command\n .command('show <name>')\n .description('Show tool details')\n .action((name) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n const tool = registry.get(name);\n if (!tool) {\n console.error(chalk.red(`Tool \"${name}\" not found`));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n🔧 ${tool.name}\\n`));\n console.log(`Description: ${tool.description}`);\n console.log(`Category: ${tool.category || 'none'}`);\n console.log(`Dangerous: ${tool.isDangerous ? 'Yes ⚠️' : 'No'}`);\n console.log(`\\nParameters Schema:`);\n console.log(JSON.stringify(tool.parameters, null, 2));\n });\n\n // 测试工具\n command\n .command('test <name>')\n .description(\n 'Test a tool with arguments. Note: AskUserQuestion returns formatted text only unless the Agent is configured with askUserQuestion (e.g. CLI TTY).'\n )\n .option('-a, --args <json>', 'Tool arguments as JSON')\n .action(async (name, options) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n if (!registry.has(name)) {\n console.error(chalk.red(`Tool \"${name}\" not found`));\n process.exit(1);\n }\n\n let args = {};\n if (options.args) {\n try {\n args = JSON.parse(options.args);\n } catch {\n console.error(chalk.red('Invalid JSON in --args'));\n process.exit(1);\n }\n }\n\n console.log(chalk.cyan(`\\n🧪 Testing tool: ${name}\\n`));\n console.log(chalk.gray(`Arguments: ${JSON.stringify(args)}\\n`));\n\n const result = await registry.execute(name, args);\n\n if (result.isError) {\n console.log(chalk.red('❌ Error:'));\n console.log(result.content);\n } else {\n console.log(chalk.green('✅ Result:'));\n console.log(result.content);\n }\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { SessionManager } from '../../storage/session.js';\nimport { formatTable } from '../utils/output.js';\nimport { getSessionStoragePath } from '../../storage/session-path.js';\n\nfunction addUserBasePathOption(cmd: Command): Command {\n return cmd.option('--user-base-path <path>', 'User base path (default: ~), must match chat/run');\n}\n\n/**\n * 会话管理命令\n */\nexport function createSessionsCommand(): Command {\n const command = new Command('sessions')\n .description('Manage chat sessions');\n\n // 列出会话\n addUserBasePathOption(\n command\n .command('list')\n .description('List all sessions')\n .option('-l, --limit <n>', 'Limit number of sessions', parseInt, 20)\n .option('-f, --format <format>', 'Output format (table/json)', 'table')\n )\n .action(async (options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n const sessions = await manager.listSessions();\n\n const limited = sessions.slice(0, options.limit);\n\n if (options.format === 'json') {\n console.log(JSON.stringify(limited, null, 2));\n } else {\n if (limited.length === 0) {\n console.log(chalk.gray('No sessions found'));\n return;\n }\n\n console.log(chalk.cyan('\\n💬 Sessions\\n'));\n console.log(formatTable(\n limited.map(s => ({\n id: s.id,\n messages: s.messageCount,\n created: new Date(s.createdAt).toLocaleString(),\n updated: new Date(s.updatedAt).toLocaleString()\n })),\n [\n { key: 'id', header: 'ID', width: 36 },\n { key: 'messages', header: 'Messages', width: 10 },\n { key: 'created', header: 'Created', width: 20 },\n { key: 'updated', header: 'Updated', width: 20 }\n ]\n ));\n console.log(chalk.gray(`\\nTotal: ${sessions.length} sessions`));\n }\n });\n\n // 查看会话详情\n addUserBasePathOption(\n command\n .command('show <id>')\n .description('Show session messages')\n .option('-l, --limit <n>', 'Limit number of messages', parseInt, 50)\n )\n .action(async (id, options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n\n const exists = await manager.sessionExists(id);\n if (!exists) {\n console.error(chalk.red(`Session \"${id}\" not found`));\n process.exit(1);\n }\n\n const messages = await manager.resumeSession(id);\n const limited = messages.slice(-options.limit);\n\n console.log(chalk.cyan(`\\n💬 Session: ${id}\\n`));\n console.log(chalk.gray(`Showing ${limited.length} of ${messages.length} messages\\n`));\n\n for (const msg of limited) {\n const role = msg.role === 'user'\n ? chalk.green('You')\n : msg.role === 'assistant'\n ? chalk.blue('Assistant')\n : chalk.yellow(msg.role);\n\n console.log(`${role}: ${msg.content}\\n`);\n }\n });\n\n // 删除会话\n addUserBasePathOption(\n command\n .command('delete <id>')\n .description('Delete a session')\n .option('-f, --force', 'Skip confirmation')\n )\n .action(async (id, options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n\n const exists = await manager.sessionExists(id);\n if (!exists) {\n console.error(chalk.red(`Session \"${id}\" not found`));\n process.exit(1);\n }\n\n if (!options.force) {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow(`Delete session \"${id}\"? (y/N) `), resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'));\n return;\n }\n }\n\n await manager.deleteSession(id);\n console.log(chalk.green(`✓ Session \"${id}\" deleted`));\n });\n\n // 清空所有会话\n addUserBasePathOption(\n command\n .command('clear')\n .description('Delete all sessions')\n .option('-f, --force', 'Skip confirmation')\n )\n .action(async (options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n const sessions = await manager.listSessions();\n\n if (sessions.length === 0) {\n console.log(chalk.gray('No sessions to clear'));\n return;\n }\n\n if (!options.force) {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow(`Delete all ${sessions.length} sessions? (y/N) `), resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'));\n return;\n }\n }\n\n const storage = manager.getStorage();\n for (const session of sessions) {\n await storage.delete(session.id);\n }\n\n console.log(chalk.green(`✓ Deleted ${sessions.length} sessions`));\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { MCPAdapter } from '../../mcp/adapter.js';\nimport type { MCPClientConfig } from '../../mcp/client.js';\n\nexport function createMCPCommand(): Command {\n const command = new Command('mcp')\n .description('Manage MCP servers');\n\n command\n .command('connect <command>')\n .description('Connect to an MCP server and list available tools')\n .option('-n, --name <name>', 'Server name', 'default')\n .option('-a, --args <args>', 'Command arguments (comma-separated)')\n .option('-e, --env <env>', 'Environment variables (KEY=VALUE,comma-separated)')\n .action(async (cmd, options) => {\n try {\n const adapter = new MCPAdapter();\n\n const args = options.args ? options.args.split(',') : [];\n const env: Record<string, string> = {};\n if (options.env) {\n for (const pair of options.env.split(',')) {\n const [key, value] = pair.split('=');\n if (key && value) {\n env[key] = value;\n }\n }\n }\n\n console.log(chalk.cyan(`\\n🔌 Connecting to MCP server: ${options.name}\\n`));\n\n const config: MCPClientConfig = {\n name: options.name,\n command: cmd,\n args,\n env: Object.keys(env).length > 0 ? env : undefined\n };\n\n await adapter.addServer(config);\n\n console.log(chalk.green('✓ Connected successfully'));\n\n const tools = await adapter.listAllTools();\n const serverTools = tools.get(options.name) || [];\n\n if (serverTools.length > 0) {\n console.log(chalk.cyan('\\n📦 Available tools:\\n'));\n for (const tool of serverTools) {\n console.log(` • ${tool.name}: ${tool.description || 'No description'}`);\n }\n } else {\n console.log(chalk.gray('\\nNo tools available'));\n }\n\n await adapter.disconnectAll();\n } catch (err) {\n console.error(chalk.red(`Connection failed: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return command;\n}","import { Command } from 'commander';\nimport { createChatCommand } from './commands/chat.js';\nimport { createRunCommand } from './commands/chat.js';\nimport { createToolsCommand } from './commands/tools.js';\nimport { createSessionsCommand } from './commands/sessions.js';\nimport { createMCPCommand } from './commands/mcp.js';\n\n// 动态移除 shebang(tsup 会添加)\nconst isMainModule = process.argv[1]?.endsWith('cli/index.js') ||\n process.argv[1]?.endsWith('cli\\\\index.js') ||\n process.argv[1]?.includes('agent-sdk');\n\nif (isMainModule) {\n const program = new Command();\n\n program\n .name('agent-sdk')\n .description('A TypeScript Agent SDK with multi-model support, MCP integration, and streaming')\n .version('0.1.0');\n\n // 添加子命令\n program.addCommand(createChatCommand());\n program.addCommand(createRunCommand());\n program.addCommand(createToolsCommand());\n program.addCommand(createSessionsCommand());\n program.addCommand(createMCPCommand());\n\n // 解析命令行参数\n program.parse();\n}\n\nexport { createChatCommand, createRunCommand, createToolsCommand, createSessionsCommand, createMCPCommand };\n"]}
1
+ {"version":3,"sources":["../../src/cli/utils/output.ts","../../src/cli/utils/keypress.ts","../../src/cli/utils/ask-user-question.ts","../../src/cli/commands/chat.ts","../../src/cli/commands/tools.ts","../../src/cli/commands/sessions.ts","../../src/cli/commands/mcp.ts","../../src/cli/index.ts"],"names":["chalk","argsStr","createInterface","Command","getLatestSessionId","loadMCPConfig","Agent","getSessionStoragePath","ToolRegistry","createSkillRegistry","getAllBuiltinTools","SessionManager","MCPAdapter","PACKAGE_VERSION"],"mappings":"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","file":"index.cjs","sourcesContent":["import chalk from 'chalk';\nimport type { StreamEvent, TokenUsage, SessionTokenUsage } from '../../core/types.js';\n\n/**\n * 输出格式化配置\n */\nexport interface OutputConfig {\n color?: boolean;\n verbose?: boolean;\n}\n\n/**\n * 格式化流式事件输出\n */\nexport function formatEvent(event: StreamEvent, config: OutputConfig = {}): string {\n const { color = true, verbose = false } = config;\n\n switch (event.type) {\n case 'start':\n return color ? chalk.gray('▶ Starting...') : '▶ Starting...';\n\n case 'text_delta':\n return event.content;\n\n case 'text_start':\n return '';\n\n case 'text_end':\n return '\\n';\n\n case 'tool_call_start':\n return color\n ? chalk.yellow(`\\n🔧 Calling tool: ${event.name}`)\n : `\\n🔧 Calling tool: ${event.name}`;\n\n case 'tool_call':\n return color\n ? chalk.yellow(`\\n🔧 Tool: ${event.name}(${JSON.stringify(event.arguments)})`)\n : `\\n🔧 Tool: ${event.name}(${JSON.stringify(event.arguments)})`;\n\n case 'tool_result':\n return color\n ? chalk.green(`\\n✓ Result: ${truncate(event.result, 100)}`)\n : `\\n✓ Result: ${truncate(event.result, 100)}`;\n\n case 'tool_error':\n return color\n ? chalk.red(`\\n✗ Tool error: ${event.error.message}`)\n : `\\n✗ Tool error: ${event.error.message}`;\n\n case 'thinking':\n return color\n ? chalk.gray(`💭 ${event.content}`)\n : `💭 ${event.content}`;\n\n case 'model_usage':\n if (verbose) {\n const phase = event.phase ? ` (${event.phase})` : '';\n const payload = JSON.stringify(event.usage, null, 2);\n return color ? chalk.gray(`\\n📊 usage${phase}\\n${payload}`) : `\\n📊 usage${phase}\\n${payload}`;\n }\n return '';\n\n case 'session_summary':\n if (verbose) {\n const payload = JSON.stringify(\n {\n ...(event.sessionId !== undefined ? { sessionId: event.sessionId } : {}),\n iterations: event.iterations,\n usage: event.usage\n },\n null,\n 2\n );\n return color ? chalk.gray(`\\n📊 ${payload}`) : `\\n📊 ${payload}`;\n }\n return '';\n\n case 'end': {\n if (event.reason === 'error' && event.error) {\n return color\n ? chalk.red(`\\n✗ Error: ${event.error.message}`)\n : `\\n✗ Error: ${event.error.message}`;\n }\n if (event.reason === 'aborted') {\n return color ? chalk.yellow('\\n[interrupted]') : '\\n[interrupted]';\n }\n return '';\n }\n\n case 'tool_call_delta':\n case 'tool_call_end':\n return '';\n\n case 'context_compressed':\n return color\n ? chalk.gray(\n `\\n📦 Context compressed (${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages)`\n )\n : `\\n📦 Context compressed (${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages)`;\n\n default:\n return '';\n }\n}\n\n/**\n * 有状态的流式事件格式化器\n */\nexport interface StreamFormatter {\n format(event: StreamEvent): string;\n finalize(): string;\n}\n\nfunction tokenUsageEqual(a: TokenUsage, b: TokenUsage): boolean {\n return (\n a.promptTokens === b.promptTokens &&\n a.completionTokens === b.completionTokens &&\n a.totalTokens === b.totalTokens\n );\n}\n\n/** Full tool call id for CLI (call vs result lines use the same string). */\nfunction toolCallIdTag(id: string): string {\n return `[${id}]`;\n}\n\n/** CLI stream: tool invocation line (printed on `tool_call`, before execution). */\nfunction formatStreamToolCallLine(\n verbose: boolean,\n toolCallId: string,\n name: string,\n args: unknown\n): string {\n const idPart = chalk.gray(` ${toolCallIdTag(toolCallId)}`);\n if (verbose) {\n const argsStr = args != null ? ` ${JSON.stringify(args, null, 2)}` : '';\n return chalk.yellow(`\\n🔧 ${name}`) + idPart + chalk.gray(argsStr);\n }\n const argsStr = args != null ? `(${truncate(JSON.stringify(args), 80)})` : '()';\n return chalk.yellow(`\\n🔧 ${name}`) + idPart + chalk.gray(argsStr);\n}\n\nexport function createStreamFormatter(config: OutputConfig = {}): StreamFormatter {\n const { verbose = false } = config;\n let lastEventType: string | null = null;\n let isFirstThinking = true;\n let lastPrintedUsage: TokenUsage | null = null;\n /** 工具输出后若中间插入了 model_usage 等事件,lastEventType 不再是 tool_result,需靠此标志在正文/thinking 前补换行 */\n let needsGapAfterToolBlock = false;\n\n return {\n format(event: StreamEvent): string {\n let output = '';\n\n // thinking 块结束时插入换行\n if (lastEventType === 'thinking' && event.type !== 'thinking') {\n output += '\\n';\n isFirstThinking = true;\n }\n\n // 工具块结束后与助手正文或 thinking 分段(model_usage 会插在 tool_result 与 text_delta 之间,不能仅靠 lastEventType)\n if (\n needsGapAfterToolBlock &&\n (event.type === 'text_delta' || event.type === 'thinking')\n ) {\n output += '\\n';\n needsGapAfterToolBlock = false;\n }\n\n switch (event.type) {\n case 'text_start':\n case 'text_end':\n case 'tool_call_start':\n case 'tool_call_delta':\n case 'tool_call_end':\n break;\n\n case 'context_compressed':\n if (verbose) {\n output += chalk.gray(\n `\\n📦 Context compressed: ${event.stats.originalMessageCount} → ${event.stats.compressedMessageCount} messages (${event.stats.durationMs}ms)\\n`\n );\n }\n break;\n\n case 'text_delta':\n output += event.content;\n break;\n\n case 'thinking':\n if (isFirstThinking) {\n output += `\\n${chalk.gray(`💭 ${event.content}`)}`;\n isFirstThinking = false;\n } else {\n output += chalk.gray(event.content);\n }\n break;\n\n case 'tool_call':\n output += formatStreamToolCallLine(verbose, event.id, event.name, event.arguments);\n break;\n\n case 'tool_result': {\n const idTag = toolCallIdTag(event.toolCallId);\n if (verbose) {\n output +=\n chalk.green('\\n✓ ') +\n chalk.gray(`${idTag} `) +\n chalk.green(`Result:\\n${event.result}\\n`);\n } else {\n const resultStr = truncate(event.result, 120);\n output +=\n chalk.green('\\n✓ ') + chalk.gray(`${idTag} `) + chalk.green(resultStr);\n }\n needsGapAfterToolBlock = true;\n break;\n }\n\n case 'tool_error': {\n const idTag = toolCallIdTag(event.toolCallId);\n if (verbose) {\n output +=\n chalk.red('\\n✗ ') +\n chalk.gray(`${idTag} `) +\n chalk.red(`Error:\\n${event.error.message}\\n`);\n } else {\n output +=\n chalk.red('\\n✗ ') + chalk.gray(`${idTag} `) + chalk.red(event.error.message);\n }\n needsGapAfterToolBlock = true;\n break;\n }\n\n case 'model_usage': {\n const usage = event.usage;\n if (!lastPrintedUsage || !tokenUsageEqual(lastPrintedUsage, usage)) {\n lastPrintedUsage = usage;\n output += `\\n${formatUsage(usage)}`;\n }\n break;\n }\n\n case 'session_summary': {\n const usage = event.usage;\n if (!lastPrintedUsage || !tokenUsageEqual(lastPrintedUsage, usage)) {\n lastPrintedUsage = usage;\n output += `\\n${formatUsage(usage)}`;\n }\n break;\n }\n\n case 'end':\n if (event.reason === 'error' && event.error) {\n output += chalk.red(`\\n✗ ${event.error.message}`);\n } else if (event.reason === 'aborted') {\n output += chalk.yellow('\\n[interrupted]');\n }\n break;\n }\n\n lastEventType = event.type;\n return output;\n },\n\n finalize(): string {\n return lastEventType === 'thinking' ? '\\n' : '';\n }\n };\n}\n\n/**\n * 格式化 Token 使用统计\n */\nexport function formatUsage(usage: TokenUsage, config: OutputConfig = {}): string {\n const { color = true } = config;\n\n const text = `📊 Tokens: ${usage.promptTokens} in, ${usage.completionTokens} out (${usage.totalTokens} total)`;\n\n return color ? chalk.gray(text) : text;\n}\n\n/**\n * 格式化会话 Token 使用统计\n *\n * 区分:\n * - Context: 当前上下文大小 (用于压缩判断)\n * - Input: 累计输入消耗\n * - Output: 累计输出消耗\n * - Total: 累计总消耗 (Input + Output)\n */\nexport function formatSessionUsage(usage: SessionTokenUsage, config: OutputConfig = {}): string {\n const { color = true } = config;\n\n let text = `📊 Input: ${usage.inputTokens} | Output: ${usage.outputTokens} | Total: ${usage.totalTokens}`;\n if (usage.cacheReadTokens > 0 || usage.cacheWriteTokens > 0) {\n text += ` | Cache: ${usage.cacheReadTokens}r/${usage.cacheWriteTokens}w`;\n }\n\n return color ? chalk.gray(text) : text;\n}\n\n/**\n * 格式化表格\n *\n * `columns[].width` 为列的最小宽度;实际宽度还会按表头与单元格内容撑开,避免截断或错位。\n */\nexport function formatTable(\n data: Record<string, unknown>[],\n columns: Array<{ key: string; header: string; width?: number }>\n): string {\n if (data.length === 0) {\n return 'No data';\n }\n\n // 计算列宽(width 视为下限,避免固定宽度短于 UUID 等长内容时排版错位)\n const widths = columns.map(col => {\n const headerLen = col.header.length;\n const maxDataLen = Math.max(\n ...data.map(row => String(row[col.key] || '').length),\n 0\n );\n const minW = col.width ?? 0;\n return Math.max(minW, headerLen, maxDataLen, 10);\n });\n\n // 生成表头\n const header = columns.map((col, i) => col.header.padEnd(widths[i])).join(' │ ');\n const separator = widths.map(w => '─'.repeat(w)).join('─┼─');\n\n // 生成数据行\n const rows = data.map(row =>\n columns.map((col, i) => String(row[col.key] || '').padEnd(widths[i])).join(' │ ')\n );\n\n return [header, separator, ...rows].join('\\n');\n}\n\n/**\n * 截断字符串\n */\nexport function truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + '...';\n}\n\n/**\n * 打印成功消息\n */\nexport function success(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * 打印错误消息\n */\nexport function error(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * 打印警告消息\n */\nexport function warn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * 打印信息消息\n */\nexport function info(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n}\n\n/**\n * 创建进度指示器\n */\nexport function createSpinner(text: string): {\n start: () => void;\n stop: (finalText?: string) => void;\n update: (text: string) => void;\n} {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n return {\n start() {\n process.stdout.write('\\x1B[?25l'); // 隐藏光标\n interval = setInterval(() => {\n process.stdout.write(`\\r${chalk.cyan(frames[frameIndex])} ${currentText}`);\n frameIndex = (frameIndex + 1) % frames.length;\n }, 80);\n },\n\n stop(finalText?: string) {\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // 清除行\n process.stdout.write('\\x1B[?25h'); // 显示光标\n if (finalText) {\n console.log(finalText);\n }\n },\n\n update(text: string) {\n currentText = text;\n }\n };\n}\n\n/**\n * 读取用户输入\n */\nexport async function prompt(question: string): Promise<string> {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\n/**\n * 确认提示\n */\nexport async function confirm(question: string): Promise<boolean> {\n const answer = await prompt(`${question} (y/N) `);\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n","export interface KeyPressHandler {\n onAbort: () => void;\n onExit?: () => void;\n}\n\nlet isActive = false;\nlet currentHandler: KeyPressHandler | null = null;\nlet paused = false;\n\nconst onKeypress = (chunk: string | Buffer) => {\n if (!isActive || !currentHandler) return;\n\n const key = typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n if (key === '\\x1b' || key.charCodeAt(0) === 27) {\n currentHandler.onAbort();\n }\n if (key === '\\u0003') {\n currentHandler.onExit?.() || process.exit(130);\n }\n};\n\nexport function initKeypressListener(): () => void {\n if (!process.stdin.isTTY) {\n return () => {};\n }\n\n if (isActive) {\n return () => {};\n }\n\n isActive = true;\n process.stdin.setRawMode(true);\n process.stdin.resume();\n // Do not call setEncoding on stdin: readline's emitKeypressEvents uses its own decoder; mixing\n // string 'data' chunks with raw ESC handling breaks TTY input on some platforms after raw mode.\n process.stdin.on('data', onKeypress);\n\n return () => {\n if (!isActive) return;\n isActive = false;\n currentHandler = null;\n paused = false;\n\n process.stdin.off('data', onKeypress);\n try {\n process.stdin.setRawMode(false);\n } catch {\n // ignore\n }\n // Removing the last `data` listener can pause stdin; readline needs flowing mode (esp. Windows TTY).\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n };\n}\n\nexport function setKeypressHandler(handler: KeyPressHandler): void {\n currentHandler = handler;\n}\n\nexport function clearKeypressHandler(): void {\n currentHandler = null;\n}\n\n/**\n * CLI-only: release raw mode and the stdin `data` listener so line-based prompts\n * (e.g. AskUserQuestion) work while streaming. Pair with the returned resume function.\n */\nexport function pauseKeypressListener(): () => void {\n if (!process.stdin.isTTY || !isActive || paused) {\n return () => {};\n }\n\n paused = true;\n process.stdin.off('data', onKeypress);\n try {\n process.stdin.setRawMode(false);\n } catch {\n // ignore\n }\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n\n return () => {\n if (!paused) return;\n paused = false;\n if (!process.stdin.isTTY || !isActive) return;\n try {\n process.stdin.setRawMode(true);\n } catch {\n // ignore\n }\n process.stdin.on('data', onKeypress);\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n };\n}\n","import { createInterface } from 'node:readline/promises';\nimport type {\n AskUserQuestionAnswer,\n AskUserQuestionItem,\n AskUserQuestionResolver\n} from '../../tools/builtin/interaction.js';\n\nconst MAX_PROMPT_RETRIES = 10;\n\nfunction parseSingleLine(\n line: string,\n optionCount: number\n): { kind: 'indices'; indices: number[] } | { kind: 'other' } | null {\n const t = line.trim().toLowerCase();\n if (t === '0' || t === 'o') {\n return { kind: 'other' };\n }\n const n = parseInt(t, 10);\n if (!Number.isFinite(n) || n < 1 || n > optionCount) {\n return null;\n }\n return { kind: 'indices', indices: [n - 1] };\n}\n\nfunction parseMultiLine(\n line: string,\n optionCount: number\n): { kind: 'indices'; indices: number[] } | { kind: 'other' } | null {\n const t = line.trim().toLowerCase();\n if (t === '0' || t === 'o') {\n return { kind: 'other' };\n }\n const parts = t.split(/[\\s,]+/).filter(Boolean);\n if (parts.length === 0) {\n return null;\n }\n const indices = new Set<number>();\n for (const p of parts) {\n const n = parseInt(p, 10);\n if (!Number.isFinite(n) || n < 1 || n > optionCount) {\n return null;\n }\n indices.add(n - 1);\n }\n if (indices.size === 0) {\n return null;\n }\n return { kind: 'indices', indices: [...indices] };\n}\n\n/**\n * Collect answers via readLine (TTY or injected for tests).\n */\nexport async function runInteractiveAskUserQuestion(\n questions: AskUserQuestionItem[],\n readLine: (prompt: string) => Promise<string>\n): Promise<AskUserQuestionAnswer[]> {\n const answers: AskUserQuestionAnswer[] = [];\n\n for (let qi = 0; qi < questions.length; qi++) {\n const q = questions[qi];\n const n = q.options.length;\n let attempt = 0;\n let resolved: AskUserQuestionAnswer | null = null;\n\n const block = [\n `[${q.header}] ${q.question}`,\n ...q.options.map((opt, i) => ` ${i + 1}. ${opt.label} — ${opt.description}`),\n ' 0. Other — custom answer when chosen',\n '',\n q.multiSelect\n ? 'Enter one or more numbers (1-' +\n n +\n ') separated by comma or space, or 0/o for Other:'\n : 'Enter a number 1-' + n + ', or 0/o for Other:'\n ].join('\\n');\n\n while (attempt < MAX_PROMPT_RETRIES && !resolved) {\n attempt++;\n process.stdout.write(block + '\\n');\n const line = await readLine('> ');\n const parsed = q.multiSelect ? parseMultiLine(line, n) : parseSingleLine(line, n);\n\n if (!parsed) {\n process.stdout.write(\n `Invalid input. ${q.multiSelect ? 'Use numbers 1-' + n + ' (comma/space separated)' : 'Enter 1-' + n}, or 0/o for Other.\\n`\n );\n continue;\n }\n\n if (parsed.kind === 'other') {\n const otherText = (await readLine('Other (custom text): ')).trim();\n resolved = {\n questionIndex: qi,\n selectedLabels: [],\n otherText\n };\n break;\n }\n\n const labels = parsed.indices.map((idx) => q.options[idx]!.label);\n resolved = {\n questionIndex: qi,\n selectedLabels: labels\n };\n break;\n }\n\n if (!resolved) {\n resolved = {\n questionIndex: qi,\n selectedLabels: [],\n otherText: '(skipped after invalid input)'\n };\n }\n\n answers.push(resolved);\n }\n\n return answers;\n}\n\nfunction createTtyReadLineSession(): {\n readLine: (prompt: string) => Promise<string>;\n close: () => void;\n} {\n const stdin = process.stdin;\n const ttyIn = stdin.isTTY ? (stdin as NodeJS.ReadStream & { isRaw?: boolean }) : null;\n const wasRaw = Boolean(ttyIn?.isRaw);\n if (wasRaw) {\n try {\n stdin.setRawMode(false);\n } catch {\n // ignore\n }\n }\n if (stdin.isPaused()) {\n stdin.resume();\n }\n\n const rl = createInterface({ input: stdin, output: process.stdout });\n return {\n readLine: (prompt: string) => rl.question(prompt),\n close: () => {\n rl.close();\n if (wasRaw && stdin.isTTY) {\n try {\n stdin.setRawMode(true);\n } catch {\n // ignore\n }\n }\n }\n };\n}\n\n/**\n * TTY stdin: interactive AskUserQuestion for {@link Agent} `askUserQuestion`.\n */\nexport function createTtyAskUserQuestionResolver(): AskUserQuestionResolver {\n return async (questions) => {\n const session = createTtyReadLineSession();\n try {\n return await runInteractiveAskUserQuestion(questions, session.readLine);\n } finally {\n session.close();\n }\n };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport type { ModelProvider } from '../../models/index.js';\nimport { Agent } from '../../core/agent.js';\nimport { formatUsage, formatSessionUsage, createStreamFormatter } from '../utils/output.js';\nimport {\n initKeypressListener,\n setKeypressHandler,\n clearKeypressHandler,\n pauseKeypressListener\n} from '../utils/keypress.js';\nimport type { AgentModelConfig, CLIConfig } from '../../core/types.js';\nimport { loadMCPConfig } from '../../config/index.js';\nimport { createTtyAskUserQuestionResolver } from '../utils/ask-user-question.js';\nimport { getLatestSessionId, getSessionStoragePath } from '../../storage/session-path.js';\n\nfunction parseOllamaThinkCli(value: string | undefined): boolean | 'low' | 'medium' | 'high' {\n if (value === undefined || value === '') return true;\n const s = value.toLowerCase();\n if (s === 'true' || s === '1' || s === 'yes') return true;\n if (s === 'false' || s === '0' || s === 'no') return false;\n if (s === 'low' || s === 'medium' || s === 'high') return s;\n throw new Error(`Invalid --ollama-think: ${value} (use true, false, low, medium, or high)`);\n}\n\nfunction addModelOptions(cmd: Command): Command {\n return cmd\n .option('-m, --model <model>', 'Model to use (openai/anthropic/ollama)', 'openai')\n .option('-k, --api-key <key>', 'API key')\n .option('-u, --base-url <url>', 'Base URL for API')\n .option('-M, --model-name <name>', 'Model name')\n .option('-s, --session <id>', 'Session ID to resume')\n .option('-S, --system <prompt>', 'System prompt')\n .option('-t, --temperature <temp>', 'Temperature', parseFloat)\n .option('--max-tokens <tokens>', 'Max tokens', (v) => parseInt(v, 10))\n .option('--no-stream', 'Disable streaming')\n .option('-v, --verbose', 'Show full tool calls and results')\n .option('--mcp-config <path>', 'Path to MCP config file (mcp_config.json)')\n .option('--user-base-path <path>', 'User base path (default: ~)')\n .option('--cwd <path>', 'Working directory (default: current directory)')\n .option(\n '--resume',\n 'Resume the most recently updated session (uses same storage as --user-base-path; ignored if --session is set)'\n )\n .option(\n '--ollama-think [value]',\n 'Ollama only: `think` param (true|false|low|medium|high; bare flag => true)',\n (v: string | undefined) => parseOllamaThinkCli(v)\n );\n}\n\nfunction modelConfigFromOptions(options: CLIConfig): AgentModelConfig {\n const provider = (options.model || 'openai') as ModelProvider;\n return {\n provider,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n model: options.modelName,\n ...(provider === 'ollama' && options.ollamaThink !== undefined\n ? { think: options.ollamaThink }\n : {})\n };\n}\n\n/**\n * 交互式对话命令\n */\nexport function createChatCommand(): Command {\n return addModelOptions(\n new Command('chat').description('Start an interactive chat session')\n ).action(async (options) => {\n try {\n let sessionId: string | undefined = options.session;\n if (options.resume && !sessionId) {\n sessionId = await getLatestSessionId(options.userBasePath);\n if (!sessionId) {\n console.warn(chalk.yellow('No saved sessions found; starting a new session.'));\n }\n }\n\n // 加载 MCP 配置\n const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);\n if (mcpResult.configPath) {\n console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));\n if (mcpResult.servers.length > 0) {\n console.log(chalk.gray(`MCP servers: ${mcpResult.servers.map(s => s.name).join(', ')}`));\n }\n }\n\n const cwd = options.cwd || process.cwd();\n const agent = new Agent({\n modelConfig: modelConfigFromOptions(options),\n cwd,\n hookConfigDir: cwd,\n systemPrompt: options.system,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n mcpServers: mcpResult.servers,\n userBasePath: options.userBasePath,\n askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : undefined\n });\n\n // 等待 Agent 初始化完成(skill 加载、MCP 连接等)\n await agent.waitForInit();\n const model = agent.getModel();\n\n // 显示已加载的 skills\n const skillRegistry = agent.getSkillRegistry();\n const skills = skillRegistry.getUserInvocableSkills();\n\n console.log(chalk.cyan('🤖 Agent SDK Chat'));\n console.log(chalk.gray(`Model: ${model.name}`));\n console.log(chalk.gray(`Sessions: ${getSessionStoragePath(options.userBasePath)}`));\n if (skills.length > 0) {\n console.log(chalk.gray(`Skills: ${skills.map(s => `/${s.name}`).join(', ')}`));\n }\n console.log(chalk.gray('Type \"exit\" or \"quit\" to end the session'));\n console.log(chalk.gray('Press ESC to interrupt streaming'));\n console.log(chalk.gray('Use /skill-name to invoke a skill\\n'));\n\n const readline = await import('readline');\n // terminal: false avoids readline's raw mode + emitKeypressEvents on stdin. We toggle raw\n // mode ourselves during streaming (ESC interrupt); mixing both causes stuck input after a turn\n // on Windows and other TTYs (see Node internal/readline/interface close() + emitKeypressEvents).\n let rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false\n });\n\n const askQuestion = (): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(chalk.green('You: '), resolve);\n });\n };\n\n try {\n while (true) {\n const input = await askQuestion();\n\n if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {\n console.log(chalk.gray('\\nGoodbye! 👋'));\n break;\n }\n\n if (!input.trim()) continue;\n\n // Close outer readline for the assistant turn so tools (e.g. AskUserQuestion) can attach\n // their own readline to stdin without duplicate echo. Recreate in finally.\n let releasedOuterReadline = false;\n rl.close();\n releasedOuterReadline = true;\n try {\n // 检测 skill 调用并显示反馈\n const processed = await agent.processInput(input);\n if (processed.invoked) {\n console.log(chalk.yellow(`\\n⚡ Invoked skill: ${processed.skillName}`));\n }\n\n process.stdout.write(chalk.blue('\\nAssistant: '));\n\n if (options.stream === false) {\n const result = await agent.run(input, { sessionId });\n console.log(result.content);\n if (result.usage) {\n console.log(`\\n${formatUsage(result.usage)}`);\n }\n console.log(`\\n${formatSessionUsage(agent.getSessionUsage())}`);\n const sid = agent.getSessionManager().sessionId;\n if (sid) {\n console.log(chalk.gray(`Session id: ${sid} (next time: add --resume or -s ${sid})`));\n }\n } else {\n const abortController = new AbortController();\n let interrupted = false;\n\n const cleanupKeypress = initKeypressListener();\n setKeypressHandler({\n onAbort: () => {\n interrupted = true;\n abortController.abort();\n process.stdout.write(chalk.yellow('\\n[interrupted]\\n'));\n }\n });\n\n let resumeAskStdin: (() => void) | null = null;\n const pendingAskToolCallIds = new Set<string>();\n\n try {\n const formatter = createStreamFormatter({ verbose: options.verbose });\n\n for await (const event of agent.stream(input, {\n sessionId,\n signal: abortController.signal\n })) {\n if (interrupted) break;\n\n if (event.type === 'tool_call' && event.name === 'AskUserQuestion') {\n pendingAskToolCallIds.add(event.id);\n if (!resumeAskStdin) {\n resumeAskStdin = pauseKeypressListener();\n }\n }\n if (event.type === 'tool_result' && pendingAskToolCallIds.has(event.toolCallId)) {\n pendingAskToolCallIds.delete(event.toolCallId);\n if (pendingAskToolCallIds.size === 0 && resumeAskStdin) {\n resumeAskStdin();\n resumeAskStdin = null;\n }\n }\n if (event.type === 'tool_error' && pendingAskToolCallIds.has(event.toolCallId)) {\n pendingAskToolCallIds.delete(event.toolCallId);\n if (pendingAskToolCallIds.size === 0 && resumeAskStdin) {\n resumeAskStdin();\n resumeAskStdin = null;\n }\n }\n\n const output = formatter.format(event);\n if (output) process.stdout.write(output);\n }\n if (!interrupted) {\n const tail = formatter.finalize();\n if (tail) process.stdout.write(tail);\n console.log(`\\n${formatSessionUsage(agent.getSessionUsage())}`);\n const sid = agent.getSessionManager().sessionId;\n if (sid) {\n console.log(chalk.gray(`Session id: ${sid} (next time: add --resume or -s ${sid})`));\n }\n }\n } finally {\n if (resumeAskStdin) {\n resumeAskStdin();\n }\n clearKeypressHandler();\n cleanupKeypress();\n }\n }\n\n console.log('\\n');\n } finally {\n if (releasedOuterReadline) {\n rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false\n });\n if (process.stdin.isPaused()) {\n process.stdin.resume();\n }\n }\n }\n }\n } finally {\n await agent.destroy();\n rl.close();\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n}\n\n/**\n * 单次执行命令\n */\nexport function createRunCommand(): Command {\n return addModelOptions(\n new Command('run')\n .description('Run a single prompt')\n .argument('<prompt>', 'The prompt to run')\n ).option('-o, --output <format>', 'Output format (text/json)', 'text')\n .action(async (prompt, options) => {\n try {\n let sessionId: string | undefined = options.session;\n if (options.resume && !sessionId) {\n sessionId = await getLatestSessionId(options.userBasePath);\n if (!sessionId) {\n console.warn(chalk.yellow('No saved sessions found; starting a new session.'));\n }\n }\n\n // 加载 MCP 配置\n const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);\n if (mcpResult.configPath) {\n console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));\n }\n\n const cwd = options.cwd || process.cwd();\n const agent = new Agent({\n modelConfig: modelConfigFromOptions(options),\n cwd,\n hookConfigDir: cwd,\n systemPrompt: options.system,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n mcpServers: mcpResult.servers,\n userBasePath: options.userBasePath,\n askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : undefined\n });\n\n // 等待 Agent 初始化完成\n await agent.waitForInit();\n\n try {\n if (options.output === 'json') {\n const result = await agent.run(prompt, { sessionId });\n console.log(JSON.stringify(result, null, 2));\n } else if (options.stream !== false) {\n const formatter = createStreamFormatter({ verbose: options.verbose });\n for await (const event of agent.stream(prompt, { sessionId })) {\n const output = formatter.format(event);\n if (output) process.stdout.write(output);\n }\n const tail = formatter.finalize();\n if (tail) process.stdout.write(tail);\n } else {\n const result = await agent.run(prompt, { sessionId });\n console.log(result.content);\n if (result.usage) {\n console.log(`\\n${formatUsage(result.usage)}`);\n }\n }\n } finally {\n // 清理资源\n await agent.destroy();\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ToolRegistry } from '../../tools/registry.js';\nimport { getAllBuiltinTools } from '../../tools/builtin/index.js';\nimport { createSkillRegistry } from '../../skills/registry.js';\nimport { formatTable } from '../utils/output.js';\n\n/**\n * 工具管理命令\n */\nexport function createToolsCommand(): Command {\n const command = new Command('tools')\n .description('Manage agent tools');\n\n // 列出工具\n command\n .command('list')\n .description('List all available tools')\n .option('-f, --format <format>', 'Output format (table/json)', 'table')\n .option('-c, --category <category>', 'Filter by category')\n .action((options) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n let tools = registry.getAll();\n\n if (options.category) {\n tools = tools.filter(t =>\n t.name.startsWith(options.category) ||\n t.description.toLowerCase().includes(options.category.toLowerCase())\n );\n }\n\n if (options.format === 'json') {\n console.log(JSON.stringify(tools.map(t => ({\n name: t.name,\n description: t.description,\n dangerous: t.isDangerous || false,\n category: t.category || null\n })), null, 2));\n } else {\n console.log(chalk.cyan('\\n📦 Available Tools\\n'));\n console.log(formatTable(\n tools.map(t => ({\n name: t.name,\n description: t.description.slice(0, 50) + (t.description.length > 50 ? '...' : ''),\n category: t.category || '',\n dangerous: t.isDangerous ? '⚠️' : ''\n })),\n [\n { key: 'name', header: 'Name', width: 20 },\n { key: 'description', header: 'Description', width: 50 },\n { key: 'category', header: 'Category', width: 12 },\n { key: 'dangerous', header: '', width: 3 }\n ]\n ));\n console.log(chalk.gray(`\\nTotal: ${tools.length} tools`));\n }\n });\n\n // 查看工具详情\n command\n .command('show <name>')\n .description('Show tool details')\n .action((name) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n const tool = registry.get(name);\n if (!tool) {\n console.error(chalk.red(`Tool \"${name}\" not found`));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n🔧 ${tool.name}\\n`));\n console.log(`Description: ${tool.description}`);\n console.log(`Category: ${tool.category || 'none'}`);\n console.log(`Dangerous: ${tool.isDangerous ? 'Yes ⚠️' : 'No'}`);\n console.log(`\\nParameters Schema:`);\n console.log(JSON.stringify(tool.parameters, null, 2));\n });\n\n // 测试工具\n command\n .command('test <name>')\n .description(\n 'Test a tool with arguments. Note: AskUserQuestion returns formatted text only unless the Agent is configured with askUserQuestion (e.g. CLI TTY).'\n )\n .option('-a, --args <json>', 'Tool arguments as JSON')\n .action(async (name, options) => {\n const registry = new ToolRegistry();\n const skillRegistry = createSkillRegistry();\n registry.registerMany(getAllBuiltinTools(skillRegistry));\n\n if (!registry.has(name)) {\n console.error(chalk.red(`Tool \"${name}\" not found`));\n process.exit(1);\n }\n\n let args = {};\n if (options.args) {\n try {\n args = JSON.parse(options.args);\n } catch {\n console.error(chalk.red('Invalid JSON in --args'));\n process.exit(1);\n }\n }\n\n console.log(chalk.cyan(`\\n🧪 Testing tool: ${name}\\n`));\n console.log(chalk.gray(`Arguments: ${JSON.stringify(args)}\\n`));\n\n const result = await registry.execute(name, args);\n\n if (result.isError) {\n console.log(chalk.red('❌ Error:'));\n console.log(result.content);\n } else {\n console.log(chalk.green('✅ Result:'));\n console.log(result.content);\n }\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { SessionManager } from '../../storage/session.js';\nimport { formatTable } from '../utils/output.js';\nimport { getSessionStoragePath } from '../../storage/session-path.js';\n\nfunction addUserBasePathOption(cmd: Command): Command {\n return cmd.option('--user-base-path <path>', 'User base path (default: ~), must match chat/run');\n}\n\n/**\n * 会话管理命令\n */\nexport function createSessionsCommand(): Command {\n const command = new Command('sessions')\n .description('Manage chat sessions');\n\n // 列出会话\n addUserBasePathOption(\n command\n .command('list')\n .description('List all sessions')\n .option('-l, --limit <n>', 'Limit number of sessions', parseInt, 20)\n .option('-f, --format <format>', 'Output format (table/json)', 'table')\n )\n .action(async (options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n const sessions = await manager.listSessions();\n\n const limited = sessions.slice(0, options.limit);\n\n if (options.format === 'json') {\n console.log(JSON.stringify(limited, null, 2));\n } else {\n if (limited.length === 0) {\n console.log(chalk.gray('No sessions found'));\n return;\n }\n\n console.log(chalk.cyan('\\n💬 Sessions\\n'));\n console.log(formatTable(\n limited.map(s => ({\n id: s.id,\n messages: s.messageCount,\n created: new Date(s.createdAt).toLocaleString(),\n updated: new Date(s.updatedAt).toLocaleString()\n })),\n [\n { key: 'id', header: 'ID', width: 36 },\n { key: 'messages', header: 'Messages', width: 10 },\n { key: 'created', header: 'Created', width: 20 },\n { key: 'updated', header: 'Updated', width: 20 }\n ]\n ));\n console.log(chalk.gray(`\\nTotal: ${sessions.length} sessions`));\n }\n });\n\n // 查看会话详情\n addUserBasePathOption(\n command\n .command('show <id>')\n .description('Show session messages')\n .option('-l, --limit <n>', 'Limit number of messages', parseInt, 50)\n )\n .action(async (id, options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n\n const exists = await manager.sessionExists(id);\n if (!exists) {\n console.error(chalk.red(`Session \"${id}\" not found`));\n process.exit(1);\n }\n\n const messages = await manager.resumeSession(id);\n const limited = messages.slice(-options.limit);\n\n console.log(chalk.cyan(`\\n💬 Session: ${id}\\n`));\n console.log(chalk.gray(`Showing ${limited.length} of ${messages.length} messages\\n`));\n\n for (const msg of limited) {\n const role = msg.role === 'user'\n ? chalk.green('You')\n : msg.role === 'assistant'\n ? chalk.blue('Assistant')\n : chalk.yellow(msg.role);\n\n console.log(`${role}: ${msg.content}\\n`);\n }\n });\n\n // 删除会话\n addUserBasePathOption(\n command\n .command('delete <id>')\n .description('Delete a session')\n .option('-f, --force', 'Skip confirmation')\n )\n .action(async (id, options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n\n const exists = await manager.sessionExists(id);\n if (!exists) {\n console.error(chalk.red(`Session \"${id}\" not found`));\n process.exit(1);\n }\n\n if (!options.force) {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow(`Delete session \"${id}\"? (y/N) `), resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'));\n return;\n }\n }\n\n await manager.deleteSession(id);\n console.log(chalk.green(`✓ Session \"${id}\" deleted`));\n });\n\n // 清空所有会话\n addUserBasePathOption(\n command\n .command('clear')\n .description('Delete all sessions')\n .option('-f, --force', 'Skip confirmation')\n )\n .action(async (options) => {\n const manager = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(options.userBasePath)\n });\n const sessions = await manager.listSessions();\n\n if (sessions.length === 0) {\n console.log(chalk.gray('No sessions to clear'));\n return;\n }\n\n if (!options.force) {\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow(`Delete all ${sessions.length} sessions? (y/N) `), resolve);\n });\n rl.close();\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'));\n return;\n }\n }\n\n const storage = manager.getStorage();\n for (const session of sessions) {\n await storage.delete(session.id);\n }\n\n console.log(chalk.green(`✓ Deleted ${sessions.length} sessions`));\n });\n\n return command;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { MCPAdapter } from '../../mcp/adapter.js';\nimport type { MCPClientConfig } from '../../mcp/client.js';\n\nexport function createMCPCommand(): Command {\n const command = new Command('mcp')\n .description('Manage MCP servers');\n\n command\n .command('connect <command>')\n .description('Connect to an MCP server and list available tools')\n .option('-n, --name <name>', 'Server name', 'default')\n .option('-a, --args <args>', 'Command arguments (comma-separated)')\n .option('-e, --env <env>', 'Environment variables (KEY=VALUE,comma-separated)')\n .action(async (cmd, options) => {\n try {\n const adapter = new MCPAdapter();\n\n const args = options.args ? options.args.split(',') : [];\n const env: Record<string, string> = {};\n if (options.env) {\n for (const pair of options.env.split(',')) {\n const [key, value] = pair.split('=');\n if (key && value) {\n env[key] = value;\n }\n }\n }\n\n console.log(chalk.cyan(`\\n🔌 Connecting to MCP server: ${options.name}\\n`));\n\n const config: MCPClientConfig = {\n name: options.name,\n command: cmd,\n args,\n env: Object.keys(env).length > 0 ? env : undefined\n };\n\n await adapter.addServer(config);\n\n console.log(chalk.green('✓ Connected successfully'));\n\n const tools = await adapter.listAllTools();\n const serverTools = tools.get(options.name) || [];\n\n if (serverTools.length > 0) {\n console.log(chalk.cyan('\\n📦 Available tools:\\n'));\n for (const tool of serverTools) {\n console.log(` • ${tool.name}: ${tool.description || 'No description'}`);\n }\n } else {\n console.log(chalk.gray('\\nNo tools available'));\n }\n\n await adapter.disconnectAll();\n } catch (err) {\n console.error(chalk.red(`Connection failed: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return command;\n}","import { Command } from 'commander';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { createChatCommand } from './commands/chat.js';\nimport { createRunCommand } from './commands/chat.js';\nimport { createToolsCommand } from './commands/tools.js';\nimport { createSessionsCommand } from './commands/sessions.js';\nimport { createMCPCommand } from './commands/mcp.js';\n\n// 动态移除 shebang(tsup 会添加)\nconst isMainModule = process.argv[1]?.endsWith('cli/index.js') ||\n process.argv[1]?.endsWith('cli\\\\index.js') ||\n process.argv[1]?.includes('agent-sdk');\n\nif (isMainModule) {\n const program = new Command();\n\n program\n .name('agent-sdk')\n .description('A TypeScript Agent SDK with multi-model support, MCP integration, and streaming')\n .version(PACKAGE_VERSION);\n\n // 添加子命令\n program.addCommand(createChatCommand());\n program.addCommand(createRunCommand());\n program.addCommand(createToolsCommand());\n program.addCommand(createSessionsCommand());\n program.addCommand(createMCPCommand());\n\n // 解析命令行参数\n program.parse();\n}\n\nexport { createChatCommand, createRunCommand, createToolsCommand, createSessionsCommand, createMCPCommand };\n"]}