@ddlqhd/agent-sdk 0.1.0

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