@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
package/dist/cli/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { getLatestSessionId, loadMCPConfig, Agent, getSessionStoragePath, createSkillRegistry, SessionManager, MCPAdapter } from '../chunk-Q3SOMX26.js';
3
- import { createModel } from '../chunk-NDSL7NPN.js';
4
- import { ToolRegistry, getAllBuiltinTools } from '../chunk-OHXW2YM6.js';
5
- import '../chunk-WH3APNQ5.js';
2
+ import { PACKAGE_VERSION, getLatestSessionId, loadMCPConfig, Agent, getSessionStoragePath, createSkillRegistry, SessionManager, MCPAdapter } from '../chunk-DXMVWGLJ.js';
3
+ import '../chunk-742JTNYI.js';
4
+ import { ToolRegistry, getAllBuiltinTools } from '../chunk-THKEF32L.js';
5
+ import '../chunk-LOYIGOBZ.js';
6
6
  import { Command } from 'commander';
7
7
  import chalk from 'chalk';
8
8
  import { createInterface } from 'readline/promises';
@@ -390,15 +390,15 @@ function addModelOptions(cmd) {
390
390
  (v) => parseOllamaThinkCli(v)
391
391
  );
392
392
  }
393
- function createModelFromOptions(options) {
393
+ function modelConfigFromOptions(options) {
394
394
  const provider = options.model || "openai";
395
- return createModel({
395
+ return {
396
396
  provider,
397
397
  apiKey: options.apiKey,
398
398
  baseUrl: options.baseUrl,
399
399
  model: options.modelName,
400
400
  ...provider === "ollama" && options.ollamaThink !== void 0 ? { think: options.ollamaThink } : {}
401
- });
401
+ };
402
402
  }
403
403
  function createChatCommand() {
404
404
  return addModelOptions(
@@ -412,7 +412,6 @@ function createChatCommand() {
412
412
  console.warn(chalk.yellow("No saved sessions found; starting a new session."));
413
413
  }
414
414
  }
415
- const model = createModelFromOptions(options);
416
415
  const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
417
416
  if (mcpResult.configPath) {
418
417
  console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));
@@ -422,7 +421,7 @@ function createChatCommand() {
422
421
  }
423
422
  const cwd = options.cwd || process.cwd();
424
423
  const agent = new Agent({
425
- model,
424
+ modelConfig: modelConfigFromOptions(options),
426
425
  cwd,
427
426
  hookConfigDir: cwd,
428
427
  systemPrompt: options.system,
@@ -433,6 +432,7 @@ function createChatCommand() {
433
432
  askUserQuestion: process.stdin.isTTY ? createTtyAskUserQuestionResolver() : void 0
434
433
  });
435
434
  await agent.waitForInit();
435
+ const model = agent.getModel();
436
436
  const skillRegistry = agent.getSkillRegistry();
437
437
  const skills = skillRegistry.getUserInvocableSkills();
438
438
  console.log(chalk.cyan("\u{1F916} Agent SDK Chat"));
@@ -583,14 +583,13 @@ function createRunCommand() {
583
583
  console.warn(chalk.yellow("No saved sessions found; starting a new session."));
584
584
  }
585
585
  }
586
- const model = createModelFromOptions(options);
587
586
  const mcpResult = loadMCPConfig(options.mcpConfig, options.cwd || process.cwd(), options.userBasePath);
588
587
  if (mcpResult.configPath) {
589
588
  console.log(chalk.gray(`Loaded MCP config from: ${mcpResult.configPath}`));
590
589
  }
591
590
  const cwd = options.cwd || process.cwd();
592
591
  const agent = new Agent({
593
- model,
592
+ modelConfig: modelConfigFromOptions(options),
594
593
  cwd,
595
594
  hookConfigDir: cwd,
596
595
  systemPrompt: options.system,
@@ -902,7 +901,7 @@ function createMCPCommand() {
902
901
  var isMainModule = process.argv[1]?.endsWith("cli/index.js") || process.argv[1]?.endsWith("cli\\index.js") || process.argv[1]?.includes("agent-sdk");
903
902
  if (isMainModule) {
904
903
  const program = new Command();
905
- program.name("agent-sdk").description("A TypeScript Agent SDK with multi-model support, MCP integration, and streaming").version("0.1.0");
904
+ program.name("agent-sdk").description("A TypeScript Agent SDK with multi-model support, MCP integration, and streaming").version(PACKAGE_VERSION);
906
905
  program.addCommand(createChatCommand());
907
906
  program.addCommand(createRunCommand());
908
907
  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":["argsStr","chalk","Command"],"mappings":"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","file":"index.js","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":["argsStr","chalk","Command"],"mappings":"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","file":"index.js","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"]}
@@ -1,5 +1,5 @@
1
+ import { a8 as ToolExecutionPolicy, E as HookManager, c as ToolDefinition, T as ToolResult, ad as ToolSchema, Y as SkillDefinition, X as SkillConfig, I as HooksSettings, a7 as ToolExecutionContext, y as CreateAskUserQuestionToolOptions } from './types-BLf9IqRs.cjs';
1
2
  import { z } from 'zod';
2
- import { a7 as ToolExecutionPolicy, B as HookManager, c as ToolDefinition, T as ToolResult, ac as ToolSchema, X as SkillDefinition, W as SkillConfig, E as HooksSettings, a6 as ToolExecutionContext, w as CreateAskUserQuestionToolOptions } from './types-C0aX_Qdp.js';
3
3
 
4
4
  /**
5
5
  * Tool 注册中心配置
@@ -119,7 +119,7 @@ declare class ToolRegistry {
119
119
  declare function createTool(config: {
120
120
  name: string;
121
121
  description: string;
122
- parameters: z.ZodSchema;
122
+ parameters: ToolDefinition['parameters'];
123
123
  handler: ToolDefinition['handler'];
124
124
  isDangerous?: boolean;
125
125
  category?: string;
@@ -395,28 +395,15 @@ declare function getSkillTools(skillRegistry: SkillRegistry): ToolDefinition[];
395
395
  declare const subagentRequestSchema: z.ZodObject<{
396
396
  prompt: z.ZodString;
397
397
  description: z.ZodOptional<z.ZodString>;
398
- subagent_type: z.ZodDefault<z.ZodEnum<["general-purpose", "explore"]>>;
399
- allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
398
+ subagent_type: z.ZodDefault<z.ZodEnum<{
399
+ "general-purpose": "general-purpose";
400
+ explore: "explore";
401
+ }>>;
402
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
400
403
  max_iterations: z.ZodOptional<z.ZodNumber>;
401
404
  timeout_ms: z.ZodOptional<z.ZodNumber>;
402
405
  system_prompt: z.ZodOptional<z.ZodString>;
403
- }, "strip", z.ZodTypeAny, {
404
- prompt: string;
405
- subagent_type: "general-purpose" | "explore";
406
- description?: string | undefined;
407
- allowed_tools?: string[] | undefined;
408
- max_iterations?: number | undefined;
409
- timeout_ms?: number | undefined;
410
- system_prompt?: string | undefined;
411
- }, {
412
- prompt: string;
413
- description?: string | undefined;
414
- subagent_type?: "general-purpose" | "explore" | undefined;
415
- allowed_tools?: string[] | undefined;
416
- max_iterations?: number | undefined;
417
- timeout_ms?: number | undefined;
418
- system_prompt?: string | undefined;
419
- }>;
406
+ }, z.core.$strip>;
420
407
  type SubagentRequest = z.infer<typeof subagentRequestSchema>;
421
408
  interface SubagentRunner {
422
409
  (request: SubagentRequest, context?: ToolExecutionContext): Promise<ToolResult>;
@@ -1,5 +1,5 @@
1
+ import { a8 as ToolExecutionPolicy, E as HookManager, c as ToolDefinition, T as ToolResult, ad as ToolSchema, Y as SkillDefinition, X as SkillConfig, I as HooksSettings, a7 as ToolExecutionContext, y as CreateAskUserQuestionToolOptions } from './types-BLf9IqRs.js';
1
2
  import { z } from 'zod';
2
- import { a7 as ToolExecutionPolicy, B as HookManager, c as ToolDefinition, T as ToolResult, ac as ToolSchema, X as SkillDefinition, W as SkillConfig, E as HooksSettings, a6 as ToolExecutionContext, w as CreateAskUserQuestionToolOptions } from './types-C0aX_Qdp.cjs';
3
3
 
4
4
  /**
5
5
  * Tool 注册中心配置
@@ -119,7 +119,7 @@ declare class ToolRegistry {
119
119
  declare function createTool(config: {
120
120
  name: string;
121
121
  description: string;
122
- parameters: z.ZodSchema;
122
+ parameters: ToolDefinition['parameters'];
123
123
  handler: ToolDefinition['handler'];
124
124
  isDangerous?: boolean;
125
125
  category?: string;
@@ -395,28 +395,15 @@ declare function getSkillTools(skillRegistry: SkillRegistry): ToolDefinition[];
395
395
  declare const subagentRequestSchema: z.ZodObject<{
396
396
  prompt: z.ZodString;
397
397
  description: z.ZodOptional<z.ZodString>;
398
- subagent_type: z.ZodDefault<z.ZodEnum<["general-purpose", "explore"]>>;
399
- allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
398
+ subagent_type: z.ZodDefault<z.ZodEnum<{
399
+ "general-purpose": "general-purpose";
400
+ explore: "explore";
401
+ }>>;
402
+ allowed_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
400
403
  max_iterations: z.ZodOptional<z.ZodNumber>;
401
404
  timeout_ms: z.ZodOptional<z.ZodNumber>;
402
405
  system_prompt: z.ZodOptional<z.ZodString>;
403
- }, "strip", z.ZodTypeAny, {
404
- prompt: string;
405
- subagent_type: "general-purpose" | "explore";
406
- description?: string | undefined;
407
- allowed_tools?: string[] | undefined;
408
- max_iterations?: number | undefined;
409
- timeout_ms?: number | undefined;
410
- system_prompt?: string | undefined;
411
- }, {
412
- prompt: string;
413
- description?: string | undefined;
414
- subagent_type?: "general-purpose" | "explore" | undefined;
415
- allowed_tools?: string[] | undefined;
416
- max_iterations?: number | undefined;
417
- timeout_ms?: number | undefined;
418
- system_prompt?: string | undefined;
419
- }>;
406
+ }, z.core.$strip>;
420
407
  type SubagentRequest = z.infer<typeof subagentRequestSchema>;
421
408
  interface SubagentRunner {
422
409
  (request: SubagentRequest, context?: ToolExecutionContext): Promise<ToolResult>;