@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.
- package/README.md +53 -0
- package/dist/chunk-5QMA2YBY.cjs +2880 -0
- package/dist/chunk-5QMA2YBY.cjs.map +1 -0
- package/dist/chunk-5Y56A64C.cjs +5 -0
- package/dist/chunk-5Y56A64C.cjs.map +1 -0
- package/dist/chunk-A3S3AGE3.js +3 -0
- package/dist/chunk-A3S3AGE3.js.map +1 -0
- package/dist/chunk-CNSGZVRN.cjs +152 -0
- package/dist/chunk-CNSGZVRN.cjs.map +1 -0
- package/dist/chunk-JF5AJQMU.cjs +2788 -0
- package/dist/chunk-JF5AJQMU.cjs.map +1 -0
- package/dist/chunk-NDSL7NPN.js +807 -0
- package/dist/chunk-NDSL7NPN.js.map +1 -0
- package/dist/chunk-OHXW2YM6.js +2708 -0
- package/dist/chunk-OHXW2YM6.js.map +1 -0
- package/dist/chunk-Q3SOMX26.js +2854 -0
- package/dist/chunk-Q3SOMX26.js.map +1 -0
- package/dist/chunk-WH3APNQ5.js +147 -0
- package/dist/chunk-WH3APNQ5.js.map +1 -0
- package/dist/chunk-X35MHWXE.cjs +817 -0
- package/dist/chunk-X35MHWXE.cjs.map +1 -0
- package/dist/cli/index.cjs +926 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +24 -0
- package/dist/cli/index.d.ts +24 -0
- package/dist/cli/index.js +916 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index-DPsZ1zat.d.ts +447 -0
- package/dist/index-RTPmFjMp.d.cts +447 -0
- package/dist/index.cjs +508 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +664 -0
- package/dist/index.d.ts +664 -0
- package/dist/index.js +204 -0
- package/dist/index.js.map +1 -0
- package/dist/models/index.cjs +62 -0
- package/dist/models/index.cjs.map +1 -0
- package/dist/models/index.d.cts +165 -0
- package/dist/models/index.d.ts +165 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/tools/index.cjs +207 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +108 -0
- package/dist/tools/index.d.ts +108 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types-C0aX_Qdp.d.cts +917 -0
- package/dist/types-C0aX_Qdp.d.ts +917 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/jsonl.ts","../src/storage/memory.ts","../src/storage/session.ts","../src/storage/interface.ts","../src/storage/session-path.ts","../src/core/prompts.ts","../src/memory/manager.ts","../src/mcp/client.ts","../src/mcp/adapter.ts","../src/skills/parser.ts","../src/skills/loader.ts","../src/skills/registry.ts","../src/streaming/chunk-processor.ts","../src/skills/template.ts","../src/core/compressor.ts","../src/core/context-manager.ts","../src/core/agent.ts","../src/config/mcp-config.ts"],"names":["fs","join","homedir","existsSync","randomUUID","assistantMessage","readFileSync"],"mappings":"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","file":"chunk-Q3SOMX26.js","sourcesContent":["import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { StorageAdapter, Message, SessionInfo } from '../core/types.js';\n\n/**\n * JSONL 文件存储配置\n */\nexport interface JsonlStorageConfig {\n basePath?: string;\n}\n\n/**\n * JSONL 文件存储实现\n * 每个会话一个 .jsonl 文件,每行一条消息\n */\nexport class JsonlStorage implements StorageAdapter {\n private basePath: string;\n\n constructor(config: JsonlStorageConfig = {}) {\n this.basePath = config.basePath || './sessions';\n }\n\n /**\n * 获取会话文件路径\n */\n private getFilePath(sessionId: string): string {\n // 确保会话 ID 安全(防止路径遍历)\n const safeId = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(this.basePath, `${safeId}.jsonl`);\n }\n\n /**\n * 获取元数据文件路径\n */\n private getMetaFilePath(sessionId: string): string {\n const safeId = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(this.basePath, `${safeId}.meta.json`);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDir(): Promise<void> {\n await fs.mkdir(this.basePath, { recursive: true });\n }\n\n /**\n * 保存消息(追加模式)\n */\n async save(sessionId: string, messages: Message[]): Promise<void> {\n await this.ensureDir();\n\n const filePath = this.getFilePath(sessionId);\n const metaPath = this.getMetaFilePath(sessionId);\n\n // 获取已有的消息数量\n let existingCount = 0;\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n existingCount = content.split('\\n').filter(Boolean).length;\n } catch {\n // 文件不存在,这是正常的\n }\n\n // 只追加新消息\n const newMessages = messages.slice(existingCount);\n \n if (newMessages.length > 0) {\n const lines = newMessages.map(msg => {\n const record = {\n ...msg,\n timestamp: msg.timestamp || Date.now()\n };\n return JSON.stringify(record);\n }).join('\\n') + '\\n';\n\n await fs.appendFile(filePath, lines, 'utf-8');\n }\n\n // 更新元数据\n const meta: SessionInfo = {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: messages.length\n };\n\n // 读取创建时间(如果存在)\n try {\n const existingMeta = JSON.parse(await fs.readFile(metaPath, 'utf-8'));\n meta.createdAt = existingMeta.createdAt;\n } catch {\n // 新会话\n }\n\n await fs.writeFile(metaPath, JSON.stringify(meta, null, 2), 'utf-8');\n }\n\n /**\n * 加载消息\n */\n async load(sessionId: string): Promise<Message[]> {\n const filePath = this.getFilePath(sessionId);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n\n return lines.map(line => {\n const parsed = JSON.parse(line);\n // 移除 timestamp(存储用的)\n const { timestamp, ...message } = parsed;\n return message as Message;\n });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n }\n\n /**\n * 列出所有会话\n */\n async list(): Promise<SessionInfo[]> {\n await this.ensureDir();\n\n try {\n const files = await fs.readdir(this.basePath);\n const metaFiles = files.filter(f => f.endsWith('.meta.json'));\n\n const sessions: SessionInfo[] = [];\n\n for (const metaFile of metaFiles) {\n try {\n const metaPath = join(this.basePath, metaFile);\n const meta = JSON.parse(await fs.readFile(metaPath, 'utf-8'));\n sessions.push(meta);\n } catch {\n // 跳过损坏的元数据文件\n }\n }\n\n // 按更新时间排序\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt);\n } catch {\n return [];\n }\n }\n\n /**\n * 删除会话\n */\n async delete(sessionId: string): Promise<void> {\n const filePath = this.getFilePath(sessionId);\n const metaPath = this.getMetaFilePath(sessionId);\n\n await Promise.all([\n fs.unlink(filePath).catch(() => {}),\n fs.unlink(metaPath).catch(() => {})\n ]);\n }\n\n /**\n * 检查会话是否存在\n */\n async exists(sessionId: string): Promise<boolean> {\n const filePath = this.getFilePath(sessionId);\n\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * 清空所有会话\n */\n async clear(): Promise<void> {\n await this.ensureDir();\n\n try {\n const files = await fs.readdir(this.basePath);\n await Promise.all(\n files.map(file => fs.unlink(join(this.basePath, file)).catch(() => {}))\n );\n } catch {\n // 目录不存在\n }\n }\n\n /**\n * 获取会话统计\n */\n async getStats(sessionId: string): Promise<{\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n size: number;\n } | null> {\n const filePath = this.getFilePath(sessionId);\n const metaPath = this.getMetaFilePath(sessionId);\n\n try {\n const [metaContent, fileStat] = await Promise.all([\n fs.readFile(metaPath, 'utf-8'),\n fs.stat(filePath)\n ]);\n\n const meta = JSON.parse(metaContent);\n return {\n messageCount: meta.messageCount,\n createdAt: meta.createdAt,\n updatedAt: meta.updatedAt,\n size: fileStat.size\n };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * 创建 JSONL 存储\n */\nexport function createJsonlStorage(config?: JsonlStorageConfig): JsonlStorage {\n return new JsonlStorage(config);\n}\n","import type { StorageAdapter, Message, SessionInfo } from '../core/types.js';\n\n/**\n * 内存存储实现\n * 用于测试或临时会话,重启后数据丢失\n */\nexport class MemoryStorage implements StorageAdapter {\n private sessions: Map<string, Message[]> = new Map();\n private metadata: Map<string, SessionInfo> = new Map();\n\n /**\n * 保存消息\n */\n async save(sessionId: string, messages: Message[]): Promise<void> {\n this.sessions.set(sessionId, [...messages]);\n\n // 更新元数据\n const existing = this.metadata.get(sessionId);\n const now = Date.now();\n\n this.metadata.set(sessionId, {\n id: sessionId,\n createdAt: existing?.createdAt || now,\n updatedAt: now,\n messageCount: messages.length\n });\n }\n\n /**\n * 加载消息\n */\n async load(sessionId: string): Promise<Message[]> {\n return this.sessions.get(sessionId) || [];\n }\n\n /**\n * 列出所有会话\n */\n async list(): Promise<SessionInfo[]> {\n return Array.from(this.metadata.values())\n .sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n /**\n * 删除会话\n */\n async delete(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId);\n this.metadata.delete(sessionId);\n }\n\n /**\n * 检查会话是否存在\n */\n async exists(sessionId: string): Promise<boolean> {\n return this.sessions.has(sessionId);\n }\n\n /**\n * 清空所有会话\n */\n async clear(): Promise<void> {\n this.sessions.clear();\n this.metadata.clear();\n }\n\n /**\n * 获取会话数量\n */\n get size(): number {\n return this.sessions.size;\n }\n\n /**\n * 导出所有数据\n */\n export(): Record<string, Message[]> {\n const result: Record<string, Message[]> = {};\n for (const [key, value] of this.sessions) {\n result[key] = [...value];\n }\n return result;\n }\n\n /**\n * 导入数据\n */\n import(data: Record<string, Message[]>): void {\n for (const [sessionId, messages] of Object.entries(data)) {\n this.save(sessionId, messages);\n }\n }\n}\n\n/**\n * 创建内存存储\n */\nexport function createMemoryStorage(): MemoryStorage {\n return new MemoryStorage();\n}\n","import { randomUUID } from 'node:crypto';\nimport type { StorageAdapter, Message, SessionInfo, StorageConfig } from '../core/types.js';\nimport { createStorage } from './interface.js';\n\n/**\n * 会话管理器配置\n */\nexport interface SessionManagerConfig extends StorageConfig {\n /** 存储路径 */\n basePath?: string;\n}\n\n/**\n * 会话管理器\n */\nexport class SessionManager {\n private storage: StorageAdapter;\n private currentSessionId: string | null = null;\n\n constructor(config?: SessionManagerConfig) {\n this.storage = createStorage(config);\n }\n\n /**\n * 获取当前会话 ID\n */\n get sessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * 创建新会话\n */\n createSession(sessionId?: string): string {\n this.currentSessionId = sessionId || randomUUID();\n return this.currentSessionId;\n }\n\n /**\n * 恢复会话\n */\n async resumeSession(sessionId: string): Promise<Message[]> {\n const exists = await this.storage.exists(sessionId);\n if (!exists) {\n throw new Error(`Session \"${sessionId}\" not found`);\n }\n\n this.currentSessionId = sessionId;\n return this.storage.load(sessionId);\n }\n\n /**\n * 保存消息到当前会话\n */\n async saveMessages(messages: Message[]): Promise<void> {\n if (!this.currentSessionId) {\n this.createSession();\n }\n\n await this.storage.save(this.currentSessionId!, messages);\n }\n\n /**\n * 加载当前会话消息\n */\n async loadMessages(): Promise<Message[]> {\n if (!this.currentSessionId) {\n return [];\n }\n\n return this.storage.load(this.currentSessionId);\n }\n\n /**\n * 追加消息\n */\n async appendMessage(message: Message): Promise<void> {\n if (!this.currentSessionId) {\n this.createSession();\n }\n\n const messages = await this.loadMessages();\n messages.push(message);\n await this.saveMessages(messages);\n }\n\n /**\n * 列出所有会话\n */\n async listSessions(): Promise<SessionInfo[]> {\n return this.storage.list();\n }\n\n /**\n * 删除会话\n */\n async deleteSession(sessionId: string): Promise<void> {\n await this.storage.delete(sessionId);\n\n if (this.currentSessionId === sessionId) {\n this.currentSessionId = null;\n }\n }\n\n /**\n * 检查会话是否存在\n */\n async sessionExists(sessionId: string): Promise<boolean> {\n return this.storage.exists(sessionId);\n }\n\n /**\n * 获取会话信息\n */\n async getSessionInfo(sessionId: string): Promise<SessionInfo | null> {\n const sessions = await this.storage.list();\n return sessions.find(s => s.id === sessionId) || null;\n }\n\n /**\n * 清空当前会话\n */\n async clearCurrentSession(): Promise<void> {\n if (this.currentSessionId) {\n await this.storage.delete(this.currentSessionId);\n this.currentSessionId = null;\n }\n }\n\n /**\n * 获取底层存储适配器\n */\n getStorage(): StorageAdapter {\n return this.storage;\n }\n}\n\n/**\n * 创建会话管理器\n */\nexport function createSessionManager(config?: StorageConfig): SessionManager {\n return new SessionManager(config);\n}\n","import type { StorageAdapter, StorageConfig } from '../core/types.js';\nimport { JsonlStorage } from './jsonl.js';\nimport { MemoryStorage } from './memory.js';\n\n/**\n * 存储工厂函数\n */\nexport function createStorage(config?: StorageConfig & { basePath?: string }): StorageAdapter {\n switch (config?.type) {\n case 'memory':\n return new MemoryStorage();\n case 'jsonl':\n default:\n return new JsonlStorage({ basePath: config?.basePath });\n }\n}\n\n// 重新导出具体实现\nexport { JsonlStorage, createJsonlStorage } from './jsonl.js';\nexport { MemoryStorage, createMemoryStorage } from './memory.js';\nexport { SessionManager } from './session.js';\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { SessionManager } from './session.js';\n\n/**\n * Same directory as {@link Agent} session storage: `<userBase>/.claude/sessions`.\n */\nexport function getSessionStoragePath(userBasePath?: string): string {\n return join(userBasePath || homedir(), '.claude', 'sessions');\n}\n\n/**\n * Most recently updated session id from JSONL storage, or `undefined` if none.\n */\nexport async function getLatestSessionId(userBasePath?: string): Promise<string | undefined> {\n const sm = new SessionManager({\n type: 'jsonl',\n basePath: getSessionStoragePath(userBasePath)\n });\n const list = await sm.listSessions();\n return list[0]?.id;\n}\n","/**\n * Agent SDK 默认系统提示词\n *\n * 占位符说明:\n * - {{SKILL_LIST}}: 会被运行时注入的skill列表替换\n */\nexport const DEFAULT_SYSTEM_PROMPT = `You are an AI assistant powered by the Agent SDK. You can help users with various tasks by using your built-in tools and capabilities.\n\n## Core Capabilities\n\n### Tools\nYou have access to a set of tools that allow you to:\n- **File Operations**: read, write, list, delete files and directories\n- **Code Execution**: run shell commands, Python scripts, Node.js code\n- **Web Access**: make HTTP requests, fetch webpages, download files\n- **Custom Tools**: additional tools registered by the user or skills\n\nWhen to use tools:\n- Use tools when the task requires real-world actions (file I/O, computation, API calls)\n- Prefer reading files before modifying them\n- Use the simplest tool that gets the job done\n- Run multiple independent tool calls in parallel when possible\n\n**Prefer dedicated tools over Bash:** Do not use \\`Bash\\` to do work that has a first-class tool. This keeps actions reviewable and consistent.\n- **Read** for file contents — not \\`cat\\`, \\`head\\`, \\`tail\\`, or \\`sed\\` to print files\n- **Write** to create or overwrite files — not shell redirection or heredocs\n- **Edit** for targeted file changes — not \\`sed\\`, \\`awk\\`, or ad-hoc scripts to patch files\n- **Glob** to find paths by pattern — not \\`find\\` or \\`ls\\` for discovery\n- **Grep** to search file contents — not \\`grep\\` or \\`rg\\` in the shell (built-in line-by-line regex search; correct integration)\n- **WebFetch** / **WebSearch** when the task needs HTTP or web search (when configured)\n\nReserve **Bash** for real shell needs: \\`git\\`, package managers, build commands, compilers, and other operations that require a shell or are not covered above.\n\n### Skills\nSkills are instruction guides for specialized tasks. When activated, you receive the skill's full content including any referenced file paths.\n\n{{SKILL_LIST}}\n\n**Usage:**\n- **Listing skills**: When the user asks about available skills (e.g., \"what skills do you have\", \"你有哪些技能\", \"list your skills\") → Simply describe the skills listed above. Do NOT activate any skill.\n- **Activating skills**: When the user has a specific task that matches a skill's purpose → Call \\`Skill\\` with the skill name, then follow the returned instructions.\n- After activation, use the provided Base Path to read any referenced files.\n\n### Sessions\n- Conversations are persisted in sessions\n- Use session IDs to maintain context across multiple interactions\n- Previous messages provide important context for current tasks\n\n## Task Execution Principles\n\n1. **Plan First for Complex Tasks**: For multi-step tasks, you MUST call \\`TaskCreate\\` BEFORE any other tool. Do NOT skip this step.\n2. **Be Direct**: Go straight to the point. Try the simplest approach first.\n3. **Be Concise**: If you can say it in one sentence, don't use three.\n4. **Read Before Modify**: Always understand existing code before changing it.\n5. **No Over-Engineering**: Only make changes directly requested or clearly necessary.\n6. **Prefer Edit Over Create**: Modify existing files rather than creating new ones when appropriate.\n7. **Handle Errors Gracefully**: Report errors clearly with actionable suggestions.\n\n## Task Management with Todo List\n\n**MANDATORY**: For multi-step tasks, call \\`TaskCreate\\` FIRST.\n\n**Workflow:**\n1. Receive complex task -> call \\`TaskCreate\\` immediately\n2. Start first task (in_progress) -> complete -> mark completed\n3. Move to next task -> repeat\n4. Cancel tasks that become irrelevant\n\n**Example:**\nUser: \"Open Google, search X, summarize results, open first link, extract info\"\n-> Multi-step task detected -> call \\`TaskCreate\\` FIRST, then execute.\n\n## Output Format\n\n- Lead with the answer or action, not the reasoning\n- Skip filler words and unnecessary preamble\n- Use code blocks with language hints for code\n- Structure longer responses with headers and lists\n- Reference file paths with line numbers when relevant (e.g., \\`src/index.ts:42\\`)\n\n## Security Guidelines\n\n- Do not introduce security vulnerabilities (injection, XSS, etc.)\n- Validate user inputs at boundaries\n- Do not execute untrusted code without sandboxing\n- Respect file system permissions and access controls\n\n### High-risk actions (confirm with the user first)\n\nThere is no automatic approval UI: **ask in the conversation** (or use \\`AskUserQuestion\\`) before proceeding when an action is destructive, hard to reverse, or affects others. Examples:\n- Deleting files or branches, dropping data, \\`rm -rf\\`, overwriting uncommitted work\n- Hard-to-reverse git: force-push, \\`reset --hard\\`, rewriting published history, amending shared commits\n- Actions visible outside this machine: pushing code, opening/closing/commenting on PRs or issues, sending messages, posting to external services, changing shared CI/CD or cloud permissions\n- Broad dependency or infrastructure changes (e.g. major version bumps, lockfile rewrites) when impact is unclear\n\nDefault to explaining what you intend and getting explicit agreement unless the user already directed that exact action.\n\n## Tool hooks\n\nWhen hooks are configured (e.g. PreToolUse), a tool call may be **blocked** or its **inputs adjusted** before execution. If a tool fails with a message indicating a hook blocked or rejected the call, **do not** retry the identical tool call unchanged — read the reason, change your approach, or ask the user. Treat hook feedback as binding policy from the environment.\n\n## Interaction Style\n\n- Be helpful and proactive\n- Ask clarifying questions when instructions are ambiguous\n- Provide suggestions when you see opportunities for improvement\n- Acknowledge limitations honestly\n- Maintain a professional, friendly tone`;\n","import { readFileSync, existsSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport type { MemoryConfig } from '../core/types.js';\n\n/**\n * MemoryManager handles the loading of long-term memory files\n * (CLAUDE.md) from user home directory and workspace root.\n */\nexport class MemoryManager {\n private workspaceRoot: string;\n private userBasePath: string;\n private config: MemoryConfig;\n\n constructor(workspaceRoot?: string, config?: MemoryConfig, userBasePath?: string) {\n this.workspaceRoot = workspaceRoot || process.cwd();\n this.userBasePath = userBasePath || homedir();\n this.config = config || {};\n }\n\n /**\n * Loads memory content from both user home ({userBasePath}/.claude/CLAUDE.md)\n * and workspace root (./CLAUDE.md).\n * @returns Combined memory content wrapped in system-minder tags\n */\n loadMemory(): string {\n const memories: string[] = [];\n\n // 1. Load user home memory ({userBasePath}/.claude/CLAUDE.md)\n const userPath = join(this.userBasePath, '.claude', 'CLAUDE.md');\n if (existsSync(userPath)) {\n try {\n const content = readFileSync(userPath, 'utf-8');\n if (content.trim()) {\n memories.push(`# User Memory\\n\\n${content}`);\n }\n } catch (error) {\n console.error(`Error reading user memory file: ${error}`);\n }\n }\n\n // 2. Load workspace memory (./CLAUDE.md)\n const workspacePath = this.config.workspacePath || join(this.workspaceRoot, 'CLAUDE.md');\n if (existsSync(workspacePath)) {\n try {\n const content = readFileSync(workspacePath, 'utf-8');\n if (content.trim()) {\n memories.push(`# Workspace Memory\\n\\n${content}`);\n }\n } catch (error) {\n console.error(`Error reading workspace memory file: ${error}`);\n }\n }\n\n if (memories.length === 0) {\n return '';\n }\n\n // Wrap content in system-minder tags as requested\n const combinedContent = memories.join('\\n\\n');\n return `<system-minder>\\n${combinedContent}\\n</system-minder>`;\n }\n\n /**\n * Checks if memory files exist.\n * @returns Object indicating existence of each memory file type\n */\n checkMemoryFiles(): { userHome: boolean; workspace: boolean } {\n const userPath = join(this.userBasePath, '.claude', 'CLAUDE.md');\n const workspacePath = this.config.workspacePath || join(this.workspaceRoot, 'CLAUDE.md');\n\n return {\n userHome: existsSync(userPath),\n workspace: existsSync(workspacePath)\n };\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { z } from 'zod';\nimport type { ToolDefinition, ToolResult } from '../core/types.js';\n\nexport interface StdioMCPConfig {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface HttpMCPConfig {\n name: string;\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type MCPClientConfig = StdioMCPConfig | HttpMCPConfig;\n\nexport interface MCPTool {\n name: string;\n description?: string;\n inputSchema: {\n type: 'object';\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport interface MCPResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface MCPPrompt {\n name: string;\n description?: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n}\n\nexport interface PromptMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nfunction isStdioConfig(config: MCPClientConfig): config is StdioMCPConfig {\n return 'command' in config;\n}\n\nexport class MCPClient {\n private client: Client;\n private transport: Transport;\n private _name: string;\n private _connected = false;\n private _tools: MCPTool[] = [];\n private _serverInfo?: { name: string; version: string };\n\n constructor(config: MCPClientConfig) {\n this._name = config.name;\n\n this.client = new Client(\n { name: 'agent-sdk-client', version: '0.1.0' },\n { capabilities: {} }\n );\n\n if (isStdioConfig(config)) {\n this.transport = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: config.env\n });\n } else {\n this.transport = new StreamableHTTPClientTransport(\n new URL(config.url),\n { requestInit: { headers: config.headers } }\n );\n }\n }\n\n async connect(): Promise<void> {\n if (this._connected) return;\n\n await this.client.connect(this.transport);\n this._connected = true;\n\n const serverInfo = this.client.getServerVersion();\n if (serverInfo) {\n this._serverInfo = {\n name: serverInfo.name,\n version: serverInfo.version\n };\n }\n\n await this.listTools();\n }\n\n async disconnect(): Promise<void> {\n if (!this._connected) return;\n\n await this.client.close();\n this._connected = false;\n }\n\n async listTools(): Promise<MCPTool[]> {\n const result = await this.client.listTools();\n this._tools = result.tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as MCPTool['inputSchema']\n }));\n return this._tools;\n }\n\n async callTool(name: string, args: unknown): Promise<ToolResult> {\n try {\n const result = await this.client.callTool({\n name,\n arguments: args as Record<string, unknown>\n });\n\n if ('toolResult' in result) {\n return {\n content: JSON.stringify(result.toolResult),\n isError: false\n };\n }\n\n const content = result.content\n .map(c => {\n if (c.type === 'text') return c.text;\n if (c.type === 'image') return `[Image: ${c.mimeType}]`;\n if (c.type === 'resource') {\n const res = c.resource;\n if ('text' in res) return res.text;\n if ('blob' in res) return `[Blob: ${res.mimeType}]`;\n return '';\n }\n return JSON.stringify(c);\n })\n .join('\\n');\n\n return {\n content,\n isError: result.isError ?? false\n };\n } catch (error) {\n return {\n content: `MCP tool error: ${error instanceof Error ? error.message : String(error)}`,\n isError: true\n };\n }\n }\n\n async listResources(): Promise<MCPResource[]> {\n const result = await this.client.listResources();\n return result.resources.map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType\n }));\n }\n\n async readResource(uri: string): Promise<string> {\n const result = await this.client.readResource({ uri });\n const content = result.contents[0];\n if (!content) return '';\n if ('text' in content) return content.text;\n if ('blob' in content) return content.blob;\n return '';\n }\n\n async listPrompts(): Promise<MCPPrompt[]> {\n const result = await this.client.listPrompts();\n return result.prompts.map((p: { name: string; description?: string; arguments?: Array<{ name: string; description?: string; required?: boolean }> }) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments?.map((a: { name: string; description?: string; required?: boolean }) => ({\n name: a.name,\n description: a.description,\n required: a.required\n }))\n }));\n }\n\n async getPrompt(name: string, args?: Record<string, string>): Promise<PromptMessage[]> {\n const result = await this.client.getPrompt({\n name,\n arguments: args\n });\n\n return result.messages.map(m => ({\n role: m.role,\n content: m.content.type === 'text' ? m.content.text : JSON.stringify(m.content)\n }));\n }\n\n toToolDefinitions(): ToolDefinition[] {\n return this._tools.map(tool => ({\n name: `mcp_${this._name}__${tool.name}`,\n description: tool.description || `MCP tool: ${tool.name}`,\n parameters: this.convertSchema(tool.inputSchema),\n handler: async (args: unknown) => this.callTool(tool.name, args),\n category: 'mcp' // 标记为 MCP 类别,用于输出处理策略选择\n }));\n }\n\n private convertSchema(schema?: MCPTool['inputSchema']): z.ZodSchema {\n if (!schema || !schema.properties) {\n return z.object({}).passthrough();\n }\n\n const shape: Record<string, z.ZodSchema> = {};\n\n for (const [key, value] of Object.entries(schema.properties)) {\n const field = value as { type?: string; description?: string };\n let zodField: z.ZodSchema;\n\n switch (field.type) {\n case 'string':\n zodField = z.string();\n break;\n case 'number':\n case 'integer':\n zodField = z.number();\n break;\n case 'boolean':\n zodField = z.boolean();\n break;\n case 'array':\n zodField = z.array(z.any());\n break;\n case 'object':\n zodField = z.object({}).passthrough();\n break;\n default:\n zodField = z.any();\n }\n\n if (field.description) {\n zodField = zodField.describe(field.description);\n }\n\n if (!schema.required?.includes(key)) {\n zodField = zodField.optional();\n }\n\n shape[key] = zodField;\n }\n\n return z.object(shape);\n }\n\n get name(): string {\n return this._name;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get serverInfo(): { name: string; version: string } | undefined {\n return this._serverInfo;\n }\n\n get tools(): MCPTool[] {\n return this._tools;\n }\n}\n\nexport function createMCPClient(config: MCPClientConfig): MCPClient {\n return new MCPClient(config);\n}","import type { ToolDefinition, ToolResult } from '../core/types.js';\nimport { MCPClient, type MCPClientConfig, type MCPTool } from './client.js';\n\nexport class MCPAdapter {\n private clients: Map<string, MCPClient> = new Map();\n private toolMap: Map<string, { client: MCPClient; toolName: string }> = new Map();\n\n async addServer(config: MCPClientConfig): Promise<void> {\n if (this.clients.has(config.name)) {\n throw new Error(`MCP server \"${config.name}\" already exists`);\n }\n\n const client = new MCPClient(config);\n await client.connect();\n\n this.clients.set(config.name, client);\n\n for (const tool of client.tools) {\n const fullName = `mcp_${config.name}__${tool.name}`;\n this.toolMap.set(fullName, { client, toolName: tool.name });\n }\n }\n\n async removeServer(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (!client) return;\n\n for (const [fullName, { client: c }] of this.toolMap.entries()) {\n if (c === client) {\n this.toolMap.delete(fullName);\n }\n }\n\n await client.disconnect();\n this.clients.delete(name);\n }\n\n getToolDefinitions(): ToolDefinition[] {\n const tools: ToolDefinition[] = [];\n\n for (const client of this.clients.values()) {\n tools.push(...client.toToolDefinitions());\n }\n\n return tools;\n }\n\n async executeTool(fullName: string, args: unknown): Promise<ToolResult> {\n const mapping = this.toolMap.get(fullName);\n if (!mapping) {\n return {\n content: `MCP tool \"${fullName}\" not found`,\n isError: true\n };\n }\n\n return mapping.client.callTool(mapping.toolName, args);\n }\n\n getClient(name: string): MCPClient | undefined {\n return this.clients.get(name);\n }\n\n getServerNames(): string[] {\n return Array.from(this.clients.keys());\n }\n\n isConnected(name: string): boolean {\n const client = this.clients.get(name);\n return client?.connected ?? false;\n }\n\n async disconnectAll(): Promise<void> {\n for (const client of this.clients.values()) {\n await client.disconnect();\n }\n this.clients.clear();\n this.toolMap.clear();\n }\n\n async listAllTools(): Promise<Map<string, MCPTool[]>> {\n const result = new Map<string, MCPTool[]>();\n\n for (const [name, client] of this.clients) {\n const tools = await client.listTools();\n result.set(name, tools);\n }\n\n return result;\n }\n\n async listAllResources(): Promise<Map<string, Awaited<ReturnType<MCPClient['listResources']>>>> {\n const result = new Map();\n\n for (const [name, client] of this.clients) {\n const resources = await client.listResources();\n result.set(name, resources);\n }\n\n return result;\n }\n\n get size(): number {\n return this.clients.size;\n }\n}\n\nexport function createMCPAdapter(): MCPAdapter {\n return new MCPAdapter();\n}","import type { SkillMetadata, ParsedSkill } from '../core/types.js';\n\n/**\n * 解析 SKILL.md 文件\n * 格式:\n * ---\n * name: skill-name\n * description: \"Skill description\"\n * version: \"1.0.0\"\n * ---\n * \n * # Instructions\n * ...\n */\nexport function parseSkillMd(content: string): ParsedSkill {\n const lines = content.split('\\n');\n let metadataEndIndex = -1;\n let metadataStartIndex = -1;\n\n // 查找 YAML frontmatter\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '---') {\n if (metadataStartIndex === -1) {\n metadataStartIndex = i;\n } else {\n metadataEndIndex = i;\n break;\n }\n }\n }\n\n let metadata: SkillMetadata = {\n name: 'unknown',\n description: ''\n };\n\n let bodyContent = content;\n\n // 解析 YAML frontmatter\n if (metadataStartIndex !== -1 && metadataEndIndex !== -1) {\n const yamlContent = lines.slice(metadataStartIndex + 1, metadataEndIndex).join('\\n');\n metadata = parseSimpleYaml(yamlContent);\n bodyContent = lines.slice(metadataEndIndex + 1).join('\\n').trim();\n }\n\n // 如果没有名字,从第一个标题推断\n if (metadata.name === 'unknown') {\n const titleMatch = bodyContent.match(/^#\\s+(.+)$/m);\n if (titleMatch) {\n metadata.name = titleMatch[1].toLowerCase().replace(/\\s+/g, '-');\n }\n }\n\n return {\n metadata,\n content: bodyContent\n };\n}\n\n/**\n * 简单的 YAML 解析器\n * 仅支持基本的 key: value 格式\n */\nfunction parseSimpleYaml(yaml: string): SkillMetadata {\n const metadata: SkillMetadata = {\n name: 'unknown',\n description: ''\n };\n\n const lines = yaml.split('\\n');\n let currentKey: string | null = null;\n let currentArray: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // 数组项\n if (trimmed.startsWith('- ')) {\n if (currentKey && currentArray) {\n currentArray.push(trimmed.slice(2).replace(/^[\"']|[\"']$/g, ''));\n }\n continue;\n }\n\n // 处理上一个数组\n if (currentKey && currentArray.length > 0) {\n (metadata as any)[currentKey] = currentArray;\n currentArray = [];\n currentKey = null;\n }\n\n // key: value\n const match = trimmed.match(/^(\\w+):\\s*(.*)$/);\n if (match) {\n const [, key, value] = match;\n \n // 检查是否是数组开始\n if (value === '' || value === '[]') {\n currentKey = key;\n currentArray = [];\n if (value === '[]') {\n (metadata as any)[key] = [];\n currentKey = null;\n }\n } else {\n // 标量值\n let parsedValue: string | string[] | boolean = value.replace(/^[\"']|[\"']$/g, '');\n \n // 处理布尔值\n if (parsedValue === 'true') {\n parsedValue = true;\n } else if (parsedValue === 'false') {\n parsedValue = false;\n } else if (parsedValue.startsWith('[') && parsedValue.endsWith(']')) {\n // 处理引号包裹的字符串数组\n parsedValue = parsedValue.slice(1, -1)\n .split(',')\n .map(s => s.trim().replace(/^[\"']|[\"']$/g, ''));\n }\n \n (metadata as any)[key] = parsedValue;\n }\n }\n }\n\n // 处理最后一个数组\n if (currentKey && currentArray.length > 0) {\n (metadata as any)[currentKey] = currentArray;\n }\n\n return metadata;\n}\n\n/**\n * 验证 Skill 元数据\n */\nexport function validateMetadata(metadata: Partial<SkillMetadata>): metadata is SkillMetadata {\n return typeof metadata.name === 'string' && metadata.name !== 'unknown';\n}\n\n/**\n * 从目录结构推断 Skill 元数据\n */\nexport function inferMetadataFromPath(skillPath: string): Partial<SkillMetadata> {\n const pathParts = skillPath.replace(/\\\\/g, '/').split('/');\n const dirName = pathParts[pathParts.length - 1] || pathParts[pathParts.length - 2];\n\n return {\n name: dirName\n };\n}\n","import { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport type { SkillDefinition } from '../core/types.js';\nimport { parseSkillMd, inferMetadataFromPath } from './parser.js';\n\n/**\n * Skill 加载器配置\n */\nexport interface SkillLoaderConfig {\n /** 工作目录 */\n cwd?: string;\n /** 用户级基础路径 */\n userBasePath?: string;\n /** 文件过滤 */\n filter?: (path: string) => boolean;\n}\n\n/**\n * Skill 加载器\n * Skill 只是一个指导书,不加载工具脚本\n */\nexport class SkillLoader {\n private config: SkillLoaderConfig;\n\n constructor(config: SkillLoaderConfig = {}) {\n this.config = {\n cwd: process.cwd(),\n ...config\n };\n }\n\n /**\n * 加载单个 Skill\n */\n async load(skillPath: string): Promise<SkillDefinition> {\n const resolvedPath = resolve(this.config.cwd!, skillPath);\n\n // 检查是文件还是目录\n const stat = await this.getPathType(resolvedPath);\n\n if (stat === 'file') {\n return this.loadFromFile(resolvedPath);\n } else if (stat === 'directory') {\n return this.loadFromDirectory(resolvedPath);\n }\n\n throw new Error(`Skill path not found: ${resolvedPath}`);\n }\n\n /**\n * 从文件加载 Skill\n */\n private async loadFromFile(filePath: string): Promise<SkillDefinition> {\n const content = await fs.readFile(filePath, 'utf-8');\n const parsed = parseSkillMd(content);\n\n // 从路径推断元数据\n const metadata = parsed.metadata as any;\n if (!metadata.name || metadata.name === 'unknown') {\n const inferred = inferMetadataFromPath(filePath);\n if (inferred.name) {\n parsed.metadata.name = inferred.name;\n }\n }\n\n return {\n metadata: parsed.metadata,\n path: filePath,\n instructions: parsed.content\n };\n }\n\n /**\n * 从目录加载 Skill\n */\n private async loadFromDirectory(dirPath: string): Promise<SkillDefinition> {\n const skillMdPath = join(dirPath, 'SKILL.md');\n\n // 检查 SKILL.md 是否存在\n try {\n await fs.access(skillMdPath);\n } catch {\n throw new Error(`SKILL.md not found in ${dirPath}`);\n }\n\n const content = await fs.readFile(skillMdPath, 'utf-8');\n const parsed = parseSkillMd(content);\n\n // 从目录名推断元数据\n const dirMetadata = parsed.metadata as any;\n if (!dirMetadata.name || dirMetadata.name === 'unknown') {\n const inferred = inferMetadataFromPath(dirPath);\n if (inferred.name) {\n parsed.metadata.name = inferred.name;\n }\n }\n\n // 不预加载引用文件,由模型按需读取\n\n return {\n metadata: parsed.metadata,\n path: dirPath,\n instructions: parsed.content\n };\n }\n\n \n /**\n * 加载目录下的所有 Skills\n */\n async loadAll(dirPath: string): Promise<SkillDefinition[]> {\n const resolvedPath = resolve(this.config.cwd!, dirPath);\n const skills: SkillDefinition[] = [];\n\n try {\n const entries = await fs.readdir(resolvedPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = join(resolvedPath, entry.name);\n\n // 应用过滤器\n if (this.config.filter && !this.config.filter(entryPath)) {\n continue;\n }\n\n try {\n if (entry.isDirectory()) {\n // 检查是否是 Skill 目录\n const hasSkillMd = await this.hasFile(entryPath, 'SKILL.md');\n if (hasSkillMd) {\n const skill = await this.loadFromDirectory(entryPath);\n skills.push(skill);\n }\n } else if (entry.name.endsWith('.md') && entry.name !== 'SKILL.md') {\n // 加载独立的 .md 文件作为 Skill\n const skill = await this.loadFromFile(entryPath);\n skills.push(skill);\n }\n } catch (error) {\n console.warn(`Failed to load skill from ${entryPath}:`, error);\n }\n }\n } catch {\n // 目录不存在\n }\n\n return skills;\n }\n\n /**\n * 检查文件是否存在\n */\n private async hasFile(dirPath: string, fileName: string): Promise<boolean> {\n try {\n await fs.access(join(dirPath, fileName));\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * 获取路径类型\n */\n private async getPathType(path: string): Promise<'file' | 'directory' | null> {\n try {\n const stat = await fs.stat(path);\n if (stat.isFile()) return 'file';\n if (stat.isDirectory()) return 'directory';\n return null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * 创建 Skill 加载器\n */\nexport function createSkillLoader(config?: SkillLoaderConfig): SkillLoader {\n return new SkillLoader(config);\n}\n","import { promises as fs } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport type { SkillDefinition, SkillConfig } from '../core/types.js';\nimport { SkillLoader, type SkillLoaderConfig } from './loader.js';\n\n/**\n * Skill 注册中心\n * Skill 只是一个指导书,不提供工具\n */\nexport class SkillRegistry {\n private skills: Map<string, SkillDefinition> = new Map();\n private loader: SkillLoader;\n private workspaceRoot: string;\n private userBasePath: string;\n private skillConfig?: SkillConfig;\n\n constructor(config?: SkillLoaderConfig & { userBasePath?: string }) {\n this.loader = new SkillLoader(config);\n this.workspaceRoot = config?.cwd || process.cwd();\n this.userBasePath = config?.userBasePath || homedir();\n }\n\n /**\n * 注册 Skill\n */\n register(skill: SkillDefinition): void {\n if (this.skills.has(skill.metadata.name)) {\n throw new Error(`Skill \"${skill.metadata.name}\" is already registered`);\n }\n\n this.skills.set(skill.metadata.name, skill);\n }\n\n /**\n * 加载并注册 Skill\n */\n async load(path: string): Promise<void> {\n const skill = await this.loader.load(path);\n this.register(skill);\n }\n\n /**\n * 加载目录下的所有 Skills\n */\n async loadAll(dirPath: string): Promise<void> {\n const skills = await this.loader.loadAll(dirPath);\n for (const skill of skills) {\n try {\n this.register(skill);\n } catch (error) {\n console.warn(`Failed to register skill \"${skill.metadata.name}\":`, error);\n }\n }\n }\n\n /**\n * 注销 Skill\n */\n unregister(name: string): boolean {\n return this.skills.delete(name);\n }\n\n /**\n * 获取 Skill\n */\n get(name: string): SkillDefinition | undefined {\n return this.skills.get(name);\n }\n\n /**\n * 获取所有 Skill\n */\n getAll(): SkillDefinition[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * 获取 Skill 名称列表\n */\n getNames(): string[] {\n return Array.from(this.skills.keys());\n }\n\n /**\n * 检查 Skill 是否存在\n */\n has(name: string): boolean {\n return this.skills.has(name);\n }\n\n /**\n * 搜索 Skill\n */\n search(query: string): SkillDefinition[] {\n const lowerQuery = query.toLowerCase();\n return this.getAll().filter(skill =>\n skill.metadata.name.toLowerCase().includes(lowerQuery) ||\n skill.metadata.description.toLowerCase().includes(lowerQuery) ||\n skill.metadata.tags?.some(tag => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * 按标签过滤\n */\n filterByTag(tag: string): SkillDefinition[] {\n return this.getAll().filter(skill =>\n skill.metadata.tags?.includes(tag)\n );\n }\n\n /**\n * 获取 Skill 数量\n */\n get size(): number {\n return this.skills.size;\n }\n\n /**\n * 清空所有 Skill\n */\n clear(): void {\n this.skills.clear();\n }\n\n /**\n * 导出 Skill 信息\n */\n export(): Array<{\n name: string;\n description: string;\n version?: string;\n path: string;\n }> {\n return this.getAll().map(skill => ({\n name: skill.metadata.name,\n description: skill.metadata.description,\n version: skill.metadata.version,\n path: skill.path\n }));\n }\n\n /**\n * 获取所有 Skill 的元数据列表(用于 System Prompt)\n */\n getMetadataList(): Array<{ name: string; description: string; argumentHint?: string }> {\n return this.getAll().map(skill => ({\n name: skill.metadata.name,\n description: skill.metadata.description,\n argumentHint: skill.metadata.argumentHint\n }));\n }\n\n /**\n * 获取用户可调用的 Skills\n */\n getUserInvocableSkills(): Array<{ name: string; description: string; argumentHint?: string }> {\n return this.getAll()\n .filter(skill => skill.metadata.userInvocable !== false)\n .map(skill => ({\n name: skill.metadata.name,\n description: skill.metadata.description,\n argumentHint: skill.metadata.argumentHint\n }));\n }\n\n /**\n * 获取模型可自动调用的 Skills(用于注入到 system prompt)\n */\n getModelInvocableSkills(): Array<{ name: string; description: string }> {\n return this.getAll()\n .filter(skill => skill.metadata.disableModelInvocation !== true)\n .map(skill => ({\n name: skill.metadata.name,\n description: skill.metadata.description\n }));\n }\n\n /**\n * 获取格式化的 Skill 列表文本(用于 System Prompt)\n */\n getFormattedList(): string {\n const userInvocable = this.getUserInvocableSkills();\n const modelInvocable = this.getModelInvocableSkills();\n\n if (userInvocable.length === 0 && modelInvocable.length === 0) {\n return 'No skills are currently available.';\n }\n\n const sections: string[] = [];\n\n // 用户可调用的 skills(显示在 / 菜单中)\n if (userInvocable.length > 0) {\n const userSkillsText = userInvocable\n .map(s => {\n const hint = s.argumentHint ? ` ${s.argumentHint}` : '';\n return `- **/${s.name}**${hint}: ${s.description}`;\n })\n .join('\\n');\n sections.push(`**User-invocable Skills** (type /skill-name to invoke):\n${userSkillsText}`);\n }\n\n // 模型可自动调用的 skills\n if (modelInvocable.length > 0) {\n const modelSkillsText = modelInvocable\n .map(s => `- **${s.name}**: ${s.description}`)\n .join('\\n');\n sections.push(`**Auto-loadable Skills** (Claude can invoke when relevant):\n${modelSkillsText}`);\n }\n\n return sections.join('\\n\\n') + `\n\n**Note:** Only activate a skill when you need to perform its specific task. For questions about your capabilities, simply describe the available skills.`;\n }\n\n /**\n * 根据名称获取 Skill 路径\n */\n getSkillPath(name: string): string | undefined {\n const skill = this.skills.get(name);\n return skill?.path;\n }\n\n /**\n * 加载 Skill 全量内容\n */\n async loadFullContent(name: string): Promise<string> {\n const skill = this.skills.get(name);\n if (!skill) {\n throw new Error(`Skill \"${name}\" not found`);\n }\n\n // 如果是目录,读取 SKILL.md\n if (skill.path) {\n try {\n const pathStat = await fs.stat(skill.path);\n let skillMdPath: string;\n\n if (pathStat.isDirectory()) {\n skillMdPath = join(skill.path, 'SKILL.md');\n } else {\n skillMdPath = skill.path;\n }\n\n const content = await fs.readFile(skillMdPath, 'utf-8');\n return content;\n } catch (error) {\n throw new Error(`Failed to read skill file: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // 如果已有instructions,直接返回\n if (skill.instructions) {\n return skill.instructions;\n }\n\n throw new Error(`No content available for skill \"${name}\"`);\n }\n\n /**\n * 获取默认 skill 路径\n */\n private getDefaultPaths(): string[] {\n const paths: string[] = [];\n\n // 用户主目录: {userBasePath}/.claude/skills/\n const userPath = join(this.userBasePath, '.claude', 'skills');\n if (existsSync(userPath)) {\n paths.push(userPath);\n }\n\n // 工作空间目录: ./.claude/skills/\n const workspacePath = this.skillConfig?.workspacePath\n || join(this.workspaceRoot, '.claude', 'skills');\n if (existsSync(workspacePath)) {\n paths.push(workspacePath);\n }\n\n return paths;\n }\n\n /**\n * 初始化加载所有 Skills\n * @param config Skill 配置\n * @param additionalPaths 额外的 skill 路径(来自 AgentConfig.skills)\n */\n async initialize(config?: SkillConfig, additionalPaths?: string[]): Promise<void> {\n this.skillConfig = config;\n\n // 1. 加载默认路径\n if (config?.autoLoad !== false) {\n const defaultPaths = this.getDefaultPaths();\n for (const dirPath of defaultPaths) {\n try {\n const beforeCount = this.skills.size;\n await this.loadAll(dirPath);\n const loaded = this.skills.size - beforeCount;\n if (loaded > 0) {\n console.log(`Loaded ${loaded} skill(s) from: ${dirPath}`);\n }\n } catch (err) {\n console.error(`Failed to load skills from \"${dirPath}\":`, err);\n }\n }\n }\n\n // 2. 加载额外路径\n const allPaths = [...(config?.additionalPaths || []), ...(additionalPaths || [])];\n for (const path of allPaths) {\n try {\n await this.load(path);\n } catch (err) {\n console.error(`Failed to load skill from \"${path}\":`, err);\n }\n }\n\n // 3. 输出汇总\n if (this.skills.size > 0) {\n console.log(`Skills initialized: ${this.getNames().join(', ')}`);\n }\n }\n}\n\n/**\n * 创建 Skill 注册中心\n */\nexport function createSkillRegistry(config?: SkillLoaderConfig): SkillRegistry {\n return new SkillRegistry(config);\n}\n","import type { StreamChunk, StreamEvent, TokenUsage } from '../core/types.js';\n\nexport interface StreamChunkProcessorOptions {\n /** Emit `text_start` / `text_end` around assistant text deltas (Claude-style content blocks). Default true. */\n emitTextBoundaries?: boolean;\n}\n\n/**\n * Stateful conversion from model `StreamChunk` to normalized `StreamEvent`s.\n * Used by `Agent` so streaming tool JSON and text blocks behave consistently.\n */\nexport class StreamChunkProcessor {\n private currentToolCall: { id: string; name: string; arguments: string } | null = null;\n private lastUsage: TokenUsage | undefined;\n private inTextBlock = false;\n private readonly emitTextBoundaries: boolean;\n\n constructor(options?: StreamChunkProcessorOptions) {\n this.emitTextBoundaries = options?.emitTextBoundaries ?? true;\n }\n\n processChunk(chunk: StreamChunk): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n const endTextBlockIfNeeded = (): void => {\n if (this.emitTextBoundaries && this.inTextBlock) {\n events.push({ type: 'text_end' });\n this.inTextBlock = false;\n }\n };\n\n switch (chunk.type) {\n case 'text':\n if (chunk.content) {\n if (this.emitTextBoundaries && !this.inTextBlock) {\n events.push({ type: 'text_start' });\n this.inTextBlock = true;\n }\n events.push({ type: 'text_delta', content: chunk.content });\n }\n break;\n\n case 'tool_call_start':\n endTextBlockIfNeeded();\n if (this.currentToolCall) {\n events.push(...this.finalizeStreamingToolCall());\n }\n if (chunk.toolCall) {\n this.currentToolCall = {\n id: chunk.toolCall.id,\n name: chunk.toolCall.name,\n arguments: ''\n };\n events.push({\n type: 'tool_call_start',\n id: chunk.toolCall.id,\n name: chunk.toolCall.name\n });\n } else if (chunk.toolCallId && chunk.content) {\n // Anthropic-style: tool name in `content`, id in `toolCallId`\n this.currentToolCall = {\n id: chunk.toolCallId,\n name: chunk.content,\n arguments: ''\n };\n events.push({\n type: 'tool_call_start',\n id: chunk.toolCallId,\n name: chunk.content\n });\n }\n break;\n\n case 'tool_call_delta':\n if (this.currentToolCall && chunk.toolCallId === this.currentToolCall.id && chunk.content) {\n this.currentToolCall.arguments += chunk.content;\n events.push({\n type: 'tool_call_delta',\n id: this.currentToolCall.id,\n arguments: chunk.content\n });\n } else if (chunk.toolCallId && chunk.content) {\n events.push({\n type: 'tool_call_delta',\n id: chunk.toolCallId,\n arguments: chunk.content\n });\n }\n break;\n\n case 'tool_call': {\n endTextBlockIfNeeded();\n if (!chunk.toolCall) break;\n const tc = chunk.toolCall;\n if (this.currentToolCall?.id === tc.id) {\n this.currentToolCall = null;\n } else if (this.currentToolCall) {\n events.push(...this.finalizeStreamingToolCall());\n }\n events.push({ type: 'tool_call_end', id: tc.id });\n events.push({\n type: 'tool_call',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments\n });\n break;\n }\n\n case 'tool_call_end':\n endTextBlockIfNeeded();\n if (this.currentToolCall) {\n events.push(...this.finalizeStreamingToolCall());\n }\n break;\n\n case 'thinking':\n endTextBlockIfNeeded();\n if (chunk.content !== undefined) {\n events.push({\n type: 'thinking',\n content: chunk.content,\n signature: chunk.signature\n });\n }\n break;\n\n case 'error':\n endTextBlockIfNeeded();\n if (chunk.error) {\n events.push({\n type: 'end',\n timestamp: Date.now(),\n reason: 'error',\n error: chunk.error\n });\n }\n break;\n\n case 'metadata':\n if (chunk.metadata?.usage) {\n const usage = chunk.metadata.usage as TokenUsage;\n this.lastUsage = usage;\n events.push({\n type: 'model_usage',\n usage,\n ...(chunk.usagePhase !== undefined ? { phase: chunk.usagePhase } : {})\n });\n }\n break;\n\n case 'done':\n break;\n }\n\n return events;\n }\n\n /** End open text block and finalize any in-progress streamed tool call. */\n flush(): StreamEvent[] {\n const events: StreamEvent[] = [];\n if (this.emitTextBoundaries && this.inTextBlock) {\n events.push({ type: 'text_end' });\n this.inTextBlock = false;\n }\n if (this.currentToolCall) {\n events.push(...this.finalizeStreamingToolCall());\n }\n return events;\n }\n\n getUsage(): TokenUsage | undefined {\n return this.lastUsage;\n }\n\n private finalizeStreamingToolCall(): StreamEvent[] {\n if (!this.currentToolCall) return [];\n const { id, name, arguments: argStr } = this.currentToolCall;\n const parsed = this.safeParseJSON(argStr);\n this.currentToolCall = null;\n return [\n { type: 'tool_call_end', id },\n { type: 'tool_call', id, name, arguments: parsed }\n ];\n }\n\n private safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n }\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Skill 模板处理上下文\n */\nexport interface SkillTemplateContext {\n /** Skill 所在目录 */\n skillDir: string;\n\n /** 当前会话 ID */\n sessionId?: string;\n\n /** 工作目录,默认 process.cwd() */\n cwd?: string;\n}\n\n/**\n * Skill 模板处理器\n * 处理 SKILL.md 中的变量替换和命令注入\n */\nexport class SkillTemplateProcessor {\n private context: SkillTemplateContext;\n\n constructor(context: SkillTemplateContext) {\n this.context = {\n cwd: process.cwd(),\n ...context\n };\n }\n\n /**\n * 处理模板内容\n * @param content SKILL.md 内容\n * @param args 用户传入的参数字符串\n * @returns 处理后的内容\n */\n async process(content: string, args: string): Promise<string> {\n let result = content;\n\n // 1. 处理 shell 命令注入 !`command`\n result = await this.processShellCommands(result);\n\n // 2. 处理变量替换\n result = this.processVariables(result, args);\n\n return result;\n }\n\n /**\n * 处理 shell 命令注入\n * 格式: !`command`\n * 命令在工作目录中执行,输出替换占位符\n */\n private async processShellCommands(content: string): Promise<string> {\n const shellCommandRegex = /!`([^`]+)`/g;\n const matches = [...content.matchAll(shellCommandRegex)];\n\n for (const match of matches) {\n const command = match[1];\n try {\n const { stdout } = await execAsync(command, {\n cwd: this.context.cwd,\n timeout: 30000\n });\n content = content.replace(match[0], stdout.trim());\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n content = content.replace(match[0], `[Error executing: ${command}\\n${errorMsg}]`);\n }\n }\n\n return content;\n }\n\n /**\n * 处理变量替换\n */\n private processVariables(content: string, args: string): string {\n const argsArray = this.parseArguments(args);\n\n // $ARGUMENTS - 全部参数\n if (content.includes('$ARGUMENTS')) {\n content = content.replace(/\\$ARGUMENTS/g, args);\n }\n\n // $ARGUMENTS[N] - 按索引访问参数\n content = content.replace(/\\$ARGUMENTS\\[(\\d+)\\]/g, (_, index) => {\n const i = parseInt(index, 10);\n return argsArray[i] || '';\n });\n\n // $0, $1, $2... - 位置参数简写\n content = content.replace(/\\$(\\d+)/g, (_, index) => {\n const i = parseInt(index, 10);\n return argsArray[i] || '';\n });\n\n // ${CLAUDE_SESSION_ID}\n if (this.context.sessionId) {\n content = content.replace(/\\$\\{CLAUDE_SESSION_ID\\}/g, this.context.sessionId);\n }\n\n // ${CLAUDE_SKILL_DIR}\n content = content.replace(/\\$\\{CLAUDE_SKILL_DIR\\}/g, this.context.skillDir);\n\n return content;\n }\n\n /**\n * 解析参数字符串为数组\n * 支持引号包裹的参数\n */\n private parseArguments(args: string): string[] {\n if (!args.trim()) return [];\n\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n\n for (let i = 0; i < args.length; i++) {\n const char = args[i];\n\n if (inQuotes) {\n if (char === quoteChar) {\n inQuotes = false;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuotes = true;\n quoteChar = char;\n } else if (char === ' ') {\n if (current) {\n result.push(current);\n current = '';\n }\n } else {\n current += char;\n }\n }\n\n if (current) {\n result.push(current);\n }\n\n return result;\n }\n}\n\n/**\n * 创建模板处理器\n */\nexport function createSkillTemplateProcessor(context: SkillTemplateContext): SkillTemplateProcessor {\n return new SkillTemplateProcessor(context);\n}","import type { Message, ModelAdapter } from './types.js';\n\n/**\n * 压缩器接口\n */\nexport interface Compressor {\n /** 压缩名称 (用于日志) */\n name: string;\n\n /**\n * 执行压缩\n * @param messages 原始消息列表\n * @param targetTokens 目标 token 数\n * @returns 压缩后的消息列表\n */\n compress(messages: Message[], targetTokens: number): Promise<Message[]>;\n}\n\n/**\n * 压缩结果\n */\nexport interface CompressionResult {\n /** 压缩后的消息 */\n messages: Message[];\n /** 压缩统计 */\n stats: CompressionStats;\n}\n\n/**\n * 压缩统计\n */\nexport interface CompressionStats {\n /** 原始消息数 */\n originalMessageCount: number;\n /** 压缩后消息数 */\n compressedMessageCount: number;\n /** 压缩耗时 (ms) */\n durationMs: number;\n}\n\n/**\n * 摘要压缩器选项\n */\nexport interface SummarizationCompressorOptions {\n /** 保留的最近消息数, 默认 6 */\n preserveRecent?: number;\n /** 摘要系统提示 */\n summaryPrompt?: string;\n /** 摘要最大 token 数, 默认 4000 */\n maxSummaryTokens?: number;\n}\n\n/**\n * 结构化摘要压缩器\n *\n * 借鉴 Opencode 的压缩模板,保留关键上下文信息\n */\nexport class SummarizationCompressor implements Compressor {\n name = 'summarization';\n\n constructor(\n private model: ModelAdapter,\n private options: SummarizationCompressorOptions = {}\n ) {}\n\n async compress(messages: Message[], targetTokens: number): Promise<Message[]> {\n const preserveRecent = this.options.preserveRecent ?? 6;\n\n // 1. 分离系统消息、待压缩消息、保留消息\n const systemMessages = messages.filter(m => m.role === 'system');\n const nonSystemMessages = messages.filter(m => m.role !== 'system');\n\n if (nonSystemMessages.length <= preserveRecent) {\n return messages;\n }\n\n const recentMessages = nonSystemMessages.slice(-preserveRecent);\n const messagesToSummarize = nonSystemMessages.slice(0, -preserveRecent);\n\n // 2. 构建摘要提示\n const summaryPrompt = this.options.summaryPrompt ?? this.buildDefaultPrompt();\n\n // 3. 调用 LLM 生成摘要\n const maxTokens = Math.min(\n this.options.maxSummaryTokens ?? 4000,\n Math.floor(targetTokens * 0.3)\n );\n\n const summaryResponse = await this.model.complete({\n messages: [\n { role: 'system', content: summaryPrompt },\n ...messagesToSummarize,\n ],\n maxTokens,\n });\n\n // 4. 构建压缩后的消息列表\n return [\n ...systemMessages,\n {\n role: 'system' as const,\n content: this.wrapSummary(summaryResponse.content),\n },\n ...recentMessages,\n ];\n }\n\n /**\n * 构建默认摘要提示 (借鉴 Opencode 模板)\n */\n private buildDefaultPrompt(): string {\n return `Provide a detailed prompt for continuing our conversation above.\nFocus on information that would be helpful for continuing the conversation, including what we did, what we're doing, which files we're working on, and what we're going to do next.\nThe summary that you construct will be used so that another agent can read it and continue the work.\n\nWhen constructing the summary, try to stick to this template:\n---\n## Goal\n\n[What goal(s) is the user trying to accomplish?]\n\n## Instructions\n\n- [What important instructions did the user give you that are relevant]\n- [If there is a plan or spec, include information about it so next agent can continue using it]\n\n## Discoveries\n\n[What notable things were learned during this conversation that would be useful for the next agent to know when continuing the work]\n\n## Accomplished\n\n[What work has been completed, what work is still in progress, and what work is left?]\n\n## Relevant files / directories\n\n[Construct a structured list of relevant files that have been read, edited, or created that pertain to the task at hand. If all the files in a directory are relevant, include the path to the directory.]\n---`;\n }\n\n /**\n * 包装摘要为 continuation 格式 (借鉴 Opencode)\n */\n private wrapSummary(summary: string): string {\n return `This session is being continued from a previous conversation that ran out of context.\nThe summary below covers the earlier portion of the conversation.\n\n${summary}\n\nContinue if you have next steps, or stop and ask for clarification if you are unsure how to proceed.`;\n }\n}\n","import type { Message, ModelAdapter, SessionTokenUsage, ContextManagerConfig } from './types.js';\nimport type { Compressor, CompressionResult } from './compressor.js';\nimport { SummarizationCompressor } from './compressor.js';\n\n/**\n * 上下文状态\n */\nexport type { ContextManagerConfig as ContextManagerOptions } from './types.js';\n\nexport interface ContextStatus {\n /** 当前使用 tokens (从 API 获取) */\n used: number;\n /** 可用空间 */\n usable: number;\n /** 是否需要压缩 */\n needsCompaction: boolean;\n /** 压缩次数 */\n compressCount: number;\n}\n\n/**\n * 上下文管理器\n *\n * 核心设计 (借鉴 Opencode):\n * - Token 计算完全依赖 API 返回的实际值,不做本地估算\n * - 压缩触发: contextTokens >= usable (context - output预留 - 压缩缓冲)\n * - contextTokens: 当前上下文大小(用于压缩判断)\n * - inputTokens: 累计输入消耗\n * - 支持 prune 清理旧的工具输出\n */\nexport class ContextManager {\n private compressor: Compressor;\n private reserved: number;\n private pruneEnabled: boolean;\n private pruneMinimum: number;\n private pruneProtect: number;\n private compressCount = 0;\n\n private _contextLength: number;\n private _maxOutputTokens: number;\n\n constructor(model: ModelAdapter, options: ContextManagerConfig = {}) {\n // 从模型 capabilities 获取上下文长度\n const contextLength = options.contextLength ?? model.capabilities?.contextLength ?? 128_000;\n const maxOutputTokens = options.maxOutputTokens ?? model.capabilities?.maxOutputTokens ?? 32_768;\n\n this._contextLength = contextLength;\n this._maxOutputTokens = maxOutputTokens;\n this.reserved = options.reserved ?? Math.min(20_000, maxOutputTokens);\n this.pruneEnabled = options.prune !== false;\n this.pruneMinimum = options.pruneMinimum ?? 20_000;\n this.pruneProtect = options.pruneProtect ?? 40_000;\n\n this.compressor = options.compressor ?? new SummarizationCompressor(model);\n }\n\n /**\n * 计算可用空间\n *\n * usable = contextLength - maxOutputTokens - reserved\n */\n get usable(): number {\n return this._contextLength - this._maxOutputTokens - this.reserved;\n }\n\n /**\n * 判断是否需要压缩\n *\n * 使用当前上下文大小 (contextTokens) 判断,而非累计值\n *\n * @param usage 会话 token 使用量\n */\n shouldCompress(usage: SessionTokenUsage): boolean {\n // 使用 contextTokens (当前上下文大小)\n return usage.contextTokens >= this.usable;\n }\n\n /**\n * 执行压缩\n */\n async compress(\n messages: Message[],\n targetTokens?: number\n ): Promise<CompressionResult> {\n const startTime = Date.now();\n const originalCount = messages.length;\n\n const target = targetTokens ?? Math.floor(this.usable * 0.6);\n const compressedMessages = await this.compressor.compress(messages, target);\n\n this.compressCount++;\n\n return {\n messages: compressedMessages,\n stats: {\n originalMessageCount: originalCount,\n compressedMessageCount: compressedMessages.length,\n durationMs: Date.now() - startTime,\n },\n };\n }\n\n /**\n * Prune: 清理旧的工具输出\n *\n * 借鉴 Opencode 的 prune 策略:\n * - 从后往前遍历消息\n * - 保留最近 PRUNE_PROTECT tokens 的工具输出\n * - 清理更早的工具输出\n *\n * @param messages 消息列表\n * @returns 处理后的消息列表\n */\n prune(messages: Message[]): Message[] {\n if (!this.pruneEnabled) return messages;\n\n let total = 0;\n const toPrune: number[] = [];\n let turns = 0;\n\n // 从后往前遍历\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n\n if (msg.role === 'user') turns++;\n if (turns < 2) continue;\n\n // 工具结果消息\n if (msg.role === 'tool') {\n const estimate = this.estimateTokens(typeof msg.content === 'string' ? msg.content : '');\n total += estimate;\n\n if (total > this.pruneProtect) {\n toPrune.push(i);\n }\n }\n }\n\n // 如果需要 prune 的 token 数足够多\n if (toPrune.length > 0) {\n const prunedTokens = toPrune.reduce((sum, idx) => {\n const content = messages[idx].content;\n return sum + this.estimateTokens(typeof content === 'string' ? content : '');\n }, 0);\n\n if (prunedTokens >= this.pruneMinimum) {\n return messages.map((msg, idx) => {\n if (toPrune.includes(idx) && msg.role === 'tool') {\n return {\n ...msg,\n content: '[Tool output pruned to save context]',\n };\n }\n return msg;\n });\n }\n }\n\n return messages;\n }\n\n /**\n * 获取上下文状态\n */\n getStatus(usage: SessionTokenUsage): ContextStatus {\n return {\n used: usage.contextTokens,\n usable: this.usable,\n needsCompaction: usage.contextTokens >= this.usable,\n compressCount: this.compressCount,\n };\n }\n\n /**\n * 重置 token 使用量 (压缩后调用)\n */\n resetUsage(): SessionTokenUsage {\n return {\n contextTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n totalTokens: 0,\n };\n }\n\n /**\n * Token 估算 (仅用于 prune,不做压缩判断)\n *\n * 借鉴 Opencode: CHARS_PER_TOKEN = 4\n */\n private estimateTokens(text: string): number {\n return Math.max(0, Math.round((text || '').length / 4));\n }\n}\n","import type {\n ToolCall,\n TokenUsage,\n SessionTokenUsage,\n AgentConfig,\n AgentResult,\n StreamEvent,\n SystemPrompt,\n MCPServerConfig,\n ContextManagerConfig,\n Message\n} from '../core/types.js';\nimport { randomUUID } from 'crypto';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { getAllBuiltinTools } from '../tools/builtin/index.js';\nimport { SessionManager } from '../storage/session.js';\nimport { getSessionStoragePath } from '../storage/session-path.js';\nimport { DEFAULT_SYSTEM_PROMPT } from './prompts.js';\nimport { MemoryManager } from '../memory/manager.js';\nimport { getEnvironmentInfo, formatEnvironmentSection } from './environment.js';\nimport { MCPAdapter } from '../mcp/adapter.js';\nimport type { MCPClientConfig } from '../mcp/client.js';\nimport { SkillRegistry, createSkillRegistry } from '../skills/registry.js';\nimport { createSkillTemplateProcessor } from '../skills/template.js';\nimport type { SkillTemplateContext } from '../skills/template.js';\nimport { ContextManager } from './context-manager.js';\nimport { HookManager } from '../tools/hooks/manager.js';\nimport { StreamChunkProcessor } from '../streaming/chunk-processor.js';\nimport { createAgentTool, type SubagentRequest } from '../tools/builtin/subagent.js';\n\nfunction toMCPClientConfig(config: MCPServerConfig): MCPClientConfig {\n if (config.transport === 'http') {\n return {\n name: config.name,\n url: config.url!,\n headers: config.headers\n };\n }\n return {\n name: config.name,\n command: config.command!,\n args: config.args,\n env: config.env\n };\n}\n\n/**\n * 流式执行选项\n */\nexport interface StreamOptions {\n sessionId?: string;\n systemPrompt?: SystemPrompt;\n signal?: AbortSignal;\n /** Pass through to {@link ModelParams.includeRawStreamEvents} (e.g. Anthropic `providerRaw` on chunks). */\n includeRawStreamEvents?: boolean;\n}\n\n/**\n * Agent 类\n * 核心执行引擎,管理对话循环和工具调用\n */\nexport class Agent {\n private config: AgentConfig;\n private toolRegistry: ToolRegistry;\n private sessionManager: SessionManager;\n private messages: Message[] = [];\n private mcpAdapter: MCPAdapter | null = null;\n private skillRegistry: SkillRegistry;\n private initPromise: Promise<void>;\n private contextManager: ContextManager | null = null;\n private hookDiscoverPromise: Promise<void> | null = null;\n private agentDepth = 0;\n private activeSubagentRuns = 0;\n\n // Token 使用量统计\n // contextTokens: 当前上下文大小 (用于压缩判断)\n // inputTokens/outputTokens: 累计消耗\n // totalTokens: 累计总消耗 (inputTokens + outputTokens)\n private sessionUsage: SessionTokenUsage = Agent.createEmptySessionUsage();\n\n constructor(config: AgentConfig) {\n this.config = {\n maxIterations: 200,\n streaming: true,\n ...config\n };\n\n // 初始化 Skill 注册中心\n this.skillRegistry = createSkillRegistry({\n cwd: config.cwd,\n userBasePath: config.userBasePath\n });\n\n // 初始化工具注册中心(执行策略与 AgentConfig 对齐,便于在 ToolRegistry.execute 中统一校验)\n this.toolRegistry = new ToolRegistry({\n executionPolicy: {\n disallowedTools: this.config.disallowedTools,\n allowedTools: this.config.allowedTools,\n canUseTool: this.config.canUseTool\n }\n });\n\n this.registerInitialTools();\n\n const subagentEnabled = this.config.subagent?.enabled !== false;\n if (subagentEnabled) {\n if (this.toolRegistry.has('Agent')) {\n this.toolRegistry.unregister('Agent');\n }\n this.toolRegistry.register(createAgentTool({\n runner: (request, context) => this.runSubagent(request, context)\n }));\n } else if (this.toolRegistry.has('Agent')) {\n this.toolRegistry.unregister('Agent');\n }\n\n if (config.hookManager) {\n this.toolRegistry.setHookManager(config.hookManager);\n } else if (config.hookConfigDir !== undefined) {\n const hm = HookManager.create();\n this.toolRegistry.setHookManager(hm);\n this.hookDiscoverPromise = hm.discoverAndLoad(config.hookConfigDir);\n }\n\n // 初始化会话管理器(存储在用户目录下)\n this.sessionManager = new SessionManager({\n type: config.storage?.type || 'jsonl',\n basePath: getSessionStoragePath(config.userBasePath)\n });\n\n // 初始化 ContextManager\n if (config.contextManagement !== false) {\n const cmConfig: ContextManagerConfig = config.contextManagement === true\n ? {}\n : config.contextManagement ?? {};\n\n this.contextManager = new ContextManager(config.model, cmConfig);\n }\n\n // 启动异步初始化,保存 Promise 供外部等待\n this.initPromise = this.initializeAsync();\n }\n\n /**\n * 注册内置 + 自定义工具,或仅 {@link AgentConfig.exclusiveTools}。\n */\n private registerInitialTools(): void {\n if (this.config.exclusiveTools !== undefined) {\n for (const tool of this.config.exclusiveTools) {\n if (this.toolRegistry.isDisallowed(tool.name)) {\n continue;\n }\n this.toolRegistry.register(tool);\n }\n return;\n }\n\n const builtins = getAllBuiltinTools(this.skillRegistry, {\n resolve: this.config.askUserQuestion\n }).filter(t => !this.toolRegistry.isDisallowed(t.name));\n\n this.toolRegistry.registerMany(builtins);\n\n for (const tool of this.config.tools ?? []) {\n if (this.toolRegistry.isDisallowed(tool.name)) {\n continue;\n }\n if (this.toolRegistry.has(tool.name)) {\n this.toolRegistry.unregister(tool.name);\n }\n this.toolRegistry.register(tool);\n }\n }\n\n /**\n * 异步初始化(skills 和 MCP)\n */\n private async initializeAsync(): Promise<void> {\n try {\n if (this.hookDiscoverPromise) {\n await this.hookDiscoverPromise;\n }\n\n // 初始化 skills(默认路径 + 配置路径)\n await this.skillRegistry.initialize(\n this.config.skillConfig,\n this.config.skills\n );\n\n // 初始化 MCP 适配器\n if (this.config.mcpServers && this.config.mcpServers.length > 0) {\n this.mcpAdapter = new MCPAdapter();\n await this.initializeMCP(this.config.mcpServers);\n }\n } catch (err) {\n // 初始化失败不应阻塞 Agent 使用,只输出警告\n console.error('Failed to initialize:', err);\n }\n }\n\n /**\n * 等待初始化完成\n * CLI 应在开始交互前调用此方法\n */\n async waitForInit(): Promise<void> {\n await this.initPromise;\n }\n\n /**\n * 初始化 MCP 服务器\n */\n private async initializeMCP(servers: MCPServerConfig[]): Promise<void> {\n if (!this.mcpAdapter) return;\n\n for (const serverConfig of servers) {\n try {\n await this.connectMCP(serverConfig);\n } catch (err) {\n console.error(`Failed to connect MCP server \"${serverConfig.name}\":`, err);\n }\n }\n }\n\n private annotateStreamEvent(event: StreamEvent, iteration?: number): StreamEvent {\n return {\n ...event,\n streamEventId: randomUUID(),\n ...(iteration !== undefined ? { iteration } : {}),\n sessionId: this.sessionManager.sessionId ?? undefined\n } as StreamEvent;\n }\n\n private static createEmptySessionUsage(): SessionTokenUsage {\n return {\n contextTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n totalTokens: 0\n };\n }\n\n private resetSessionState(): void {\n this.messages = [];\n this.sessionUsage = this.contextManager\n ? this.contextManager.resetUsage()\n : Agent.createEmptySessionUsage();\n }\n\n /**\n * 构建系统提示词\n * 处理默认提示词、替换模式、追加模式\n */\n private buildSystemPrompt(customPrompt?: SystemPrompt): string {\n // 判断是否需要包含环境信息\n // 优先级:customPrompt.includeEnvironment > config.includeEnvironment > true\n const shouldIncludeEnv = typeof customPrompt === 'object'\n ? customPrompt.includeEnvironment !== false\n : this.config.includeEnvironment !== false;\n\n // 生成环境信息部分\n let envSection = '';\n if (shouldIncludeEnv) {\n const cwd = this.config.cwd || process.cwd();\n const envInfo = getEnvironmentInfo(cwd);\n envSection = formatEnvironmentSection(envInfo);\n }\n\n // 没有自定义提示词\n if (!customPrompt) {\n let basePrompt = DEFAULT_SYSTEM_PROMPT;\n basePrompt = basePrompt.replace('{{SKILL_LIST}}', this.skillRegistry.getFormattedList());\n return basePrompt + envSection;\n }\n\n // 字符串形式:追加模式\n if (typeof customPrompt === 'string') {\n let basePrompt = DEFAULT_SYSTEM_PROMPT;\n basePrompt = basePrompt.replace('{{SKILL_LIST}}', this.skillRegistry.getFormattedList());\n return `${basePrompt}${envSection}\\n\\n${customPrompt}`;\n }\n\n // 配置对象\n const { content, mode = 'append' } = customPrompt;\n\n if (mode === 'replace') {\n // 替换模式:使用自定义内容 + 环境信息\n return content + envSection;\n } else {\n // 追加模式:默认提示词 + 环境信息 + 自定义内容\n let basePrompt = DEFAULT_SYSTEM_PROMPT;\n basePrompt = basePrompt.replace('{{SKILL_LIST}}', this.skillRegistry.getFormattedList());\n return `${basePrompt}${envSection}\\n\\n${content}`;\n }\n }\n\n /**\n * 流式执行\n */\n async *stream(input: string, options?: StreamOptions): AsyncIterable<StreamEvent> {\n const signal = options?.signal;\n\n // 恢复或创建会话\n if (options?.sessionId) {\n const isSwitchingSession = this.sessionManager.sessionId !== options.sessionId;\n if (isSwitchingSession) {\n this.resetSessionState();\n }\n try {\n this.messages = await this.sessionManager.resumeSession(options.sessionId);\n } catch {\n // 目标会话不存在时,创建新会话并保持已重置的空状态\n this.sessionManager.createSession(options.sessionId);\n }\n } else if (!this.sessionManager.sessionId) {\n this.resetSessionState();\n this.sessionManager.createSession();\n }\n\n // 添加系统提示\n if (this.messages.length === 0) {\n // 合并配置中的 systemPrompt 和运行时的 systemPrompt\n const systemPrompt = this.buildSystemPrompt(\n options?.systemPrompt || this.config.systemPrompt\n );\n this.messages.push({\n role: 'system',\n content: systemPrompt\n });\n }\n\n // 加载长期记忆(作为独立的 system message)\n // 检查是否应该加载记忆:\n // 1. 记忆功能已启用\n // 2. 这是新用户消息(会话中没有用户消息)\n if (this.config.memory !== false) {\n const hasUserMessages = this.messages.some(m => m.role === 'user');\n\n // 只有当还没有用户消息时才加载记忆\n // 这样可以确保记忆只被加载一次,并且是在对话开始时\n if (!hasUserMessages) {\n const memoryManager = new MemoryManager(this.config.cwd, this.config.memoryConfig, this.config.userBasePath);\n const memoryContent = memoryManager.loadMemory();\n\n if (memoryContent) {\n this.messages.push({\n role: 'system',\n content: memoryContent\n });\n }\n }\n }\n\n // 处理 skill 调用\n let processedInput = input;\n const processed = await this.processInput(input);\n if (processed.invoked) {\n processedInput = processed.prompt;\n }\n\n // 添加用户消息\n this.messages.push({\n role: 'user',\n content: processedInput\n });\n\n yield this.annotateStreamEvent({ type: 'start', timestamp: Date.now() });\n\n try {\n const maxIterations = this.config.maxIterations || 10;\n let totalUsage: TokenUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0\n };\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n if (signal?.aborted) {\n yield this.annotateStreamEvent(\n {\n type: 'end',\n usage: totalUsage,\n timestamp: Date.now(),\n reason: 'aborted'\n },\n iteration\n );\n return;\n }\n\n // 上下文压缩检查\n const contextEvents = await this.checkContextCompression();\n for (const event of contextEvents) {\n yield this.annotateStreamEvent(event, iteration);\n }\n\n const modelParams = {\n messages: this.messages,\n tools: this.toolRegistry.getAll(),\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n signal,\n includeRawStreamEvents: options?.includeRawStreamEvents\n };\n\n const stream = this.config.model.stream(modelParams);\n let hasToolCalls = false;\n const toolCalls: ToolCall[] = [];\n let assistantContent = '';\n let thinkingContent = '';\n let thinkingSignature: string | undefined;\n const chunkProcessor = new StreamChunkProcessor({ emitTextBoundaries: true });\n\n const applyStreamOut = (out: StreamEvent): void => {\n if (out.type === 'text_delta') {\n assistantContent += out.content;\n }\n if (out.type === 'thinking') {\n thinkingContent += out.content;\n if (out.signature !== undefined && !thinkingSignature) {\n thinkingSignature = out.signature;\n }\n }\n if (out.type === 'tool_call') {\n hasToolCalls = true;\n toolCalls.push({\n id: out.id,\n name: out.name,\n arguments: out.arguments\n });\n }\n if (out.type === 'model_usage') {\n const usage = out.usage;\n if (usage.promptTokens > 0) {\n totalUsage.promptTokens = usage.promptTokens;\n this.sessionUsage.contextTokens = usage.promptTokens;\n this.sessionUsage.inputTokens += usage.promptTokens;\n }\n totalUsage.completionTokens += usage.completionTokens;\n totalUsage.totalTokens = totalUsage.promptTokens + totalUsage.completionTokens;\n this.sessionUsage.outputTokens += usage.completionTokens;\n }\n };\n\n let fatalModelError = false;\n for await (const chunk of stream) {\n if (signal?.aborted) {\n for (const event of chunkProcessor.flush()) {\n const out = this.annotateStreamEvent(event, iteration);\n yield out;\n applyStreamOut(out);\n }\n if (assistantContent) {\n const assistantMessage: Message = {\n role: 'assistant',\n content: assistantContent\n };\n if (thinkingContent) {\n assistantMessage.content = [\n { type: 'thinking', thinking: thinkingContent, signature: thinkingSignature || '' },\n { type: 'text', text: assistantContent }\n ];\n }\n this.messages.push(assistantMessage);\n }\n\n this.messages.push({\n role: 'user',\n content: '[User interrupted the response]'\n });\n\n await this.sessionManager.saveMessages(this.messages);\n\n yield this.annotateStreamEvent(\n {\n type: 'end',\n usage: totalUsage,\n timestamp: Date.now(),\n reason: 'aborted',\n partialContent: assistantContent\n },\n iteration\n );\n return;\n }\n\n const events = chunkProcessor.processChunk(chunk);\n for (const event of events) {\n const out = this.annotateStreamEvent(event, iteration);\n yield out;\n applyStreamOut(out);\n if (out.type === 'end' && out.reason === 'error') {\n fatalModelError = true;\n break;\n }\n }\n if (fatalModelError) {\n break;\n }\n }\n\n if (fatalModelError) {\n return;\n }\n\n for (const event of chunkProcessor.flush()) {\n const out = this.annotateStreamEvent(event, iteration);\n yield out;\n applyStreamOut(out);\n }\n\n const assistantMessage: Message = {\n role: 'assistant',\n content: assistantContent\n };\n\n if (thinkingContent) {\n const contentParts: any[] = [\n {\n type: 'thinking',\n thinking: thinkingContent,\n signature: thinkingSignature\n }\n ];\n if (assistantContent.trim()) {\n contentParts.push({ type: 'text', text: assistantContent });\n }\n assistantMessage.content = contentParts;\n }\n\n if (toolCalls.length > 0) {\n assistantMessage.toolCalls = toolCalls;\n }\n\n this.messages.push(assistantMessage);\n\n if (!hasToolCalls) {\n break;\n }\n\n const toolResults = await this.executeTools(toolCalls);\n\n for (const result of toolResults) {\n if (result.isError && result.error) {\n yield this.annotateStreamEvent(\n {\n type: 'tool_error',\n toolCallId: result.toolCallId,\n error: result.error\n },\n iteration\n );\n }\n yield this.annotateStreamEvent(\n {\n type: 'tool_result',\n toolCallId: result.toolCallId,\n result: result.content\n },\n iteration\n );\n\n this.messages.push({\n role: 'tool',\n toolCallId: result.toolCallId,\n content: result.content\n });\n }\n }\n\n await this.sessionManager.saveMessages(this.messages);\n\n yield this.annotateStreamEvent({\n type: 'session_summary',\n usage: totalUsage,\n iterations: Math.min(maxIterations, this.messages.length)\n });\n\n yield this.annotateStreamEvent({\n type: 'end',\n timestamp: Date.now(),\n reason: 'complete'\n });\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n yield this.annotateStreamEvent({\n type: 'end',\n timestamp: Date.now(),\n reason: 'aborted'\n });\n return;\n }\n yield this.annotateStreamEvent({\n type: 'end',\n timestamp: Date.now(),\n reason: 'error',\n error: error as Error\n });\n }\n }\n\n /**\n * 非流式执行\n */\n async run(input: string, options?: StreamOptions): Promise<AgentResult> {\n let content = '';\n const toolCalls: Array<{\n name: string;\n arguments: unknown;\n result: string;\n }> = [];\n let usage: TokenUsage | undefined;\n let iterations = 0;\n let streamError: Error | undefined;\n\n for await (const event of this.stream(input, options)) {\n if (event.type === 'text_delta') {\n content += event.content;\n }\n\n if (event.type === 'tool_result') {\n const matchingCall = this.messages\n .filter(m => m.role === 'assistant' && m.toolCalls)\n .flatMap(m => m.toolCalls!)\n .find(tc => tc.id === event.toolCallId);\n\n if (matchingCall) {\n toolCalls.push({\n name: matchingCall.name,\n arguments: matchingCall.arguments,\n result: event.result\n });\n }\n }\n\n if (event.type === 'model_usage') {\n usage = event.usage;\n }\n\n if (event.type === 'session_summary') {\n usage = event.usage;\n iterations = event.iterations;\n }\n\n if (event.type === 'end') {\n if (event.usage !== undefined) {\n usage = event.usage;\n }\n if (event.reason === 'error' && event.error) {\n streamError = event.error;\n }\n }\n }\n\n if (streamError) {\n throw streamError;\n }\n\n return {\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n sessionId: this.sessionManager.sessionId!,\n iterations\n };\n }\n\n /**\n * 注册工具\n */\n registerTool(tool: Parameters<ToolRegistry['register']>[0]): void {\n this.toolRegistry.register(tool);\n }\n\n /**\n * 注册多个工具\n */\n registerTools(tools: Parameters<ToolRegistry['registerMany']>[0]): void {\n for (const t of tools) {\n this.registerTool(t);\n }\n }\n\n /**\n * 获取工具注册中心\n */\n getToolRegistry(): ToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * 获取会话管理器\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n\n /**\n * 加载 Skill\n */\n async loadSkill(path: string): Promise<void> {\n await this.skillRegistry.load(path);\n }\n\n /**\n * 获取 Skill 注册中心\n */\n getSkillRegistry(): SkillRegistry {\n return this.skillRegistry;\n }\n\n /**\n * 处理用户输入,检测并处理 skill 调用\n * @param input 用户输入\n * @returns 处理结果\n */\n async processInput(input: string): Promise<{\n invoked: boolean;\n skillName?: string;\n prompt: string;\n }> {\n const invocation = this.parseSkillInvocation(input);\n\n if (!invocation) {\n return { invoked: false, prompt: input };\n }\n\n const { name, args } = invocation;\n\n try {\n const prompt = await this.invokeSkill(name, args);\n return { invoked: true, skillName: name, prompt };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n invoked: false,\n prompt: `Error invoking skill \"${name}\": ${errorMsg}\\n\\nOriginal input: ${input}`\n };\n }\n }\n\n /**\n * 调用 skill 并返回处理后的 prompt\n * @param name Skill 名称\n * @param args 参数字符串\n * @returns 处理后的 prompt\n */\n async invokeSkill(name: string, args: string = ''): Promise<string> {\n const skill = this.skillRegistry.get(name);\n\n if (!skill) {\n const available = this.skillRegistry.getNames();\n throw new Error(\n `Skill \"${name}\" not found. Available skills: ${available.join(', ') || 'none'}`\n );\n }\n\n // 检查 skill 是否可以被用户调用\n if (skill.metadata.userInvocable === false) {\n throw new Error(`Skill \"${name}\" is not user-invocable`);\n }\n\n // 获取 skill 内容\n const content = await this.skillRegistry.loadFullContent(name);\n\n // 创建模板处理器\n const context: SkillTemplateContext = {\n skillDir: skill.path || '',\n sessionId: this.sessionManager.sessionId || undefined,\n cwd: this.config.cwd\n };\n const processor = createSkillTemplateProcessor(context);\n\n // 处理模板\n let processedContent = await processor.process(content, args);\n\n // 如果内容中没有 $ARGUMENTS 但有参数,追加到末尾\n if (args && !content.includes('$ARGUMENTS') && !content.includes('$0')) {\n processedContent += `\\n\\nARGUMENTS: ${args}`;\n }\n\n return processedContent;\n }\n\n /**\n * 解析 skill 调用格式\n * 格式: /skill-name [args]\n * @param input 用户输入\n * @returns 解析结果或 null\n */\n private parseSkillInvocation(input: string): { name: string; args: string } | null {\n const trimmed = input.trim();\n\n // 必须以 / 开头\n if (!trimmed.startsWith('/')) {\n return null;\n }\n\n // 提取 skill 名称和参数(支持中文等任意非空白字符)\n const match = trimmed.match(/^\\/([^\\s\\/]+)(?:\\s+(.*))?$/);\n\n if (!match) {\n return null;\n }\n\n const name = match[1];\n const args = match[2] || '';\n\n // 检查 skill 是否存在\n if (!this.skillRegistry.has(name)) {\n return null;\n }\n\n return { name, args };\n }\n\n /**\n * 连接 MCP 服务器\n */\n async connectMCP(config: MCPServerConfig): Promise<void> {\n if (!this.mcpAdapter) {\n this.mcpAdapter = new MCPAdapter();\n }\n\n await this.mcpAdapter.addServer(toMCPClientConfig(config));\n\n const mcpTools = this.mcpAdapter.getToolDefinitions();\n for (const tool of mcpTools) {\n if (!tool.name.startsWith(`mcp_${config.name}__`)) {\n continue;\n }\n if (this.toolRegistry.isDisallowed(tool.name)) {\n continue;\n }\n this.toolRegistry.register(tool);\n }\n }\n\n /**\n * 断开指定 MCP 服务器\n */\n async disconnectMCP(name: string): Promise<void> {\n if (!this.mcpAdapter) return;\n\n // 获取要移除的工具列表\n const tools = this.toolRegistry.getAll();\n for (const tool of tools) {\n if (tool.name.startsWith(`mcp_${name}__`)) {\n this.toolRegistry.unregister(tool.name);\n }\n }\n\n // 断开服务器连接\n await this.mcpAdapter.removeServer(name);\n }\n\n /**\n * 断开所有 MCP 服务器\n */\n async disconnectAllMCP(): Promise<void> {\n if (!this.mcpAdapter) return;\n\n // 移除所有 MCP 工具\n const tools = this.toolRegistry.getAll();\n for (const tool of tools) {\n if (tool.name.startsWith('mcp_') && tool.name.includes('__')) {\n this.toolRegistry.unregister(tool.name);\n }\n }\n\n // 断开所有连接\n await this.mcpAdapter.disconnectAll();\n this.mcpAdapter = null;\n }\n\n /**\n * 获取 MCP 适配器\n */\n getMCPAdapter(): MCPAdapter | null {\n return this.mcpAdapter;\n }\n\n /**\n * 销毁 Agent,清理资源\n */\n async destroy(): Promise<void> {\n await this.disconnectAllMCP();\n this.messages = [];\n }\n\n /**\n * 获取消息历史\n */\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n /**\n * 清空消息历史\n */\n clearMessages(): void {\n this.resetSessionState();\n }\n\n /**\n * 设置系统提示 (运行时替换)\n */\n setSystemPrompt(prompt: SystemPrompt): void {\n // 移除旧的系统提示\n this.messages = this.messages.filter(m => m.role !== 'system');\n\n // 构建新的系统提示\n const systemPrompt = this.buildSystemPrompt(prompt);\n\n // 添加新的系统提示\n if (this.messages.length > 0) {\n this.messages.unshift({\n role: 'system',\n content: systemPrompt\n });\n }\n }\n\n /**\n * 追加系统提示内容\n */\n appendSystemPrompt(additionalContent: string): void {\n // 查找现有的系统提示\n const systemMessageIndex = this.messages.findIndex(m => m.role === 'system');\n\n if (systemMessageIndex >= 0) {\n // 追加到现有系统提示\n this.messages[systemMessageIndex].content += `\\n\\n${additionalContent}`;\n } else {\n // 如果没有系统提示,创建一个新的\n const systemPrompt = this.buildSystemPrompt(additionalContent);\n this.messages.unshift({\n role: 'system',\n content: systemPrompt\n });\n }\n }\n\n /**\n * 获取当前系统提示内容\n */\n getSystemPrompt(): string | undefined {\n const systemMessage = this.messages.find(m => m.role === 'system');\n if (!systemMessage) return undefined;\n // 系统消息的 content 一定是 string\n return typeof systemMessage.content === 'string'\n ? systemMessage.content\n : undefined;\n }\n\n /**\n * 手动触发上下文压缩\n */\n async compressContext(): Promise<{\n messageCount: number;\n stats: { originalMessageCount: number; compressedMessageCount: number; durationMs: number };\n }> {\n if (!this.contextManager) {\n throw new Error('Context management is disabled');\n }\n\n const result = await this.contextManager.compress(this.messages);\n this.messages = result.messages;\n this.sessionUsage = this.contextManager.resetUsage();\n\n // 保存压缩后的会话\n await this.sessionManager.saveMessages(this.messages);\n\n return {\n messageCount: this.messages.length,\n stats: result.stats\n };\n }\n\n /**\n * 获取上下文状态\n */\n getContextStatus(): {\n used: number;\n usable: number;\n needsCompaction: boolean;\n compressCount: number;\n } | null {\n if (!this.contextManager) {\n return null;\n }\n\n return this.contextManager.getStatus(this.sessionUsage);\n }\n\n /**\n * 获取会话累计 Token 使用量\n */\n getSessionUsage(): SessionTokenUsage {\n // 实时计算 totalTokens = 累计输入 + 累计输出\n return {\n ...this.sessionUsage,\n totalTokens: this.sessionUsage.inputTokens + this.sessionUsage.outputTokens\n };\n }\n\n /**\n * 检查并执行上下文压缩\n * @returns 压缩事件数组(可能为空)\n */\n private async checkContextCompression(): Promise<StreamEvent[]> {\n if (!this.contextManager) {\n return [];\n }\n\n // 先执行 prune 清理旧工具输出\n this.messages = this.contextManager.prune(this.messages);\n\n // 检查是否需要压缩\n if (!this.contextManager.shouldCompress(this.sessionUsage)) {\n return [];\n }\n\n const result = await this.contextManager.compress(this.messages);\n this.messages = result.messages;\n this.sessionUsage = this.contextManager.resetUsage();\n\n return [\n {\n type: 'context_compressed',\n stats: result.stats\n }\n ];\n }\n\n private getSubagentConfig() {\n return {\n enabled: this.config.subagent?.enabled !== false,\n maxDepth: this.config.subagent?.maxDepth ?? 1,\n maxParallel: this.config.subagent?.maxParallel ?? 5,\n timeoutMs: this.config.subagent?.timeoutMs ?? 120000,\n allowDangerousTools: this.config.subagent?.allowDangerousTools ?? false,\n defaultAllowedTools: this.config.subagent?.defaultAllowedTools\n };\n }\n\n private resolveSubagentTools(request: SubagentRequest): {\n tools?: ReturnType<ToolRegistry['getAll']>;\n error?: string;\n } {\n const subagentConfig = this.getSubagentConfig();\n const parentTools = this.toolRegistry.getAll();\n const byName = new Map(parentTools.map(tool => [tool.name, tool] as const));\n\n const requestedNames = request.allowed_tools\n ?? subagentConfig.defaultAllowedTools;\n\n let selected = requestedNames\n ? requestedNames\n .map(name => byName.get(name))\n .filter((tool): tool is NonNullable<typeof tool> => tool !== undefined)\n : parentTools.filter(tool => !tool.isDangerous);\n\n selected = selected.filter(tool => tool.name !== 'Agent');\n selected = selected.filter(tool => tool.name !== 'AskUserQuestion');\n\n if (!subagentConfig.allowDangerousTools) {\n const requestedDangerous = request.allowed_tools?.some(name => byName.get(name)?.isDangerous);\n if (requestedDangerous) {\n return {\n error: 'Subagent dangerous tools are disabled by configuration'\n };\n }\n selected = selected.filter(tool => !tool.isDangerous);\n }\n\n if (selected.length === 0) {\n return { error: 'No tools available for subagent after filtering' };\n }\n\n return { tools: selected };\n }\n\n private async runSubagent(\n request: SubagentRequest,\n context?: { agentDepth?: number }\n ): Promise<{\n content: string;\n isError?: boolean;\n metadata?: Record<string, unknown>;\n }> {\n const subagentConfig = this.getSubagentConfig();\n const currentDepth = context?.agentDepth ?? this.agentDepth;\n\n if (!subagentConfig.enabled) {\n return { content: 'Subagent is disabled by configuration', isError: true };\n }\n if (currentDepth >= subagentConfig.maxDepth) {\n return { content: 'Subagent cannot spawn subagents', isError: true };\n }\n if (this.activeSubagentRuns >= subagentConfig.maxParallel) {\n return { content: 'Subagent concurrency limit reached', isError: true };\n }\n\n const normalizedType = request.subagent_type ?? 'general-purpose';\n const requestedTimeout = request.timeout_ms ?? subagentConfig.timeoutMs;\n const timeoutMs = Math.min(requestedTimeout, subagentConfig.timeoutMs);\n const maxIterations = Math.max(1, request.max_iterations ?? this.config.maxIterations ?? 50);\n\n const resolved = this.resolveSubagentTools(request);\n if (!resolved.tools) {\n return {\n content: resolved.error ?? 'Unable to resolve subagent tools',\n isError: true\n };\n }\n\n const childConfig: AgentConfig = {\n ...this.config,\n exclusiveTools: resolved.tools,\n tools: undefined,\n mcpServers: undefined,\n maxIterations,\n subagent: {\n ...this.config.subagent,\n enabled: false\n }\n };\n\n const child = new Agent(childConfig);\n child.agentDepth = currentDepth + 1;\n const startedAt = Date.now();\n this.activeSubagentRuns += 1;\n\n try {\n await child.waitForInit();\n const runPromise = child.run(request.prompt, {\n systemPrompt: request.system_prompt\n });\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Subagent timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n runPromise.finally(() => clearTimeout(timer)).catch(() => {});\n });\n const result = await Promise.race([runPromise, timeoutPromise]);\n return {\n content: result.content,\n metadata: {\n sessionId: result.sessionId,\n subagentType: normalizedType,\n durationMs: Date.now() - startedAt,\n usage: result.usage,\n toolNames: resolved.tools.map(tool => tool.name),\n description: request.description\n }\n };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n metadata: {\n subagentType: normalizedType,\n durationMs: Date.now() - startedAt,\n description: request.description,\n error: error instanceof Error ? error.message : String(error)\n }\n };\n } finally {\n this.activeSubagentRuns -= 1;\n await child.destroy();\n }\n }\n\n /**\n * 获取默认系统提示词\n */\n static getDefaultSystemPrompt(): string {\n return DEFAULT_SYSTEM_PROMPT;\n }\n\n /**\n * 执行工具调用\n */\n private async executeTools(toolCalls: ToolCall[]): Promise<\n Array<{\n toolCallId: string;\n content: string;\n isError: boolean;\n error?: Error;\n }>\n > {\n const results = await Promise.all(\n toolCalls.map(async (tc) => {\n const result = await this.toolRegistry.execute(tc.name, tc.arguments, {\n toolCallId: tc.id,\n projectDir: this.config.cwd || process.cwd(),\n agentDepth: this.agentDepth\n });\n const isError = Boolean(result.isError);\n return {\n toolCallId: tc.id,\n content: isError ? `Error: ${result.content}` : result.content,\n isError,\n error: isError ? new Error(result.content) : undefined\n };\n })\n );\n\n return results;\n }\n}\n\n/**\n * 创建 Agent 实例\n */\nexport function createAgent(config: AgentConfig): Agent {\n return new Agent(config);\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { MCPServerConfig } from '../core/types.js';\n\n/**\n * MCP 配置文件格式 (Claude Desktop 兼容)\n */\nexport interface MCPConfigFile {\n mcpServers: {\n [name: string]: {\n /** 命令 (stdio transport) */\n command?: string;\n /** 命令参数 */\n args?: string[];\n /** 环境变量 */\n env?: Record<string, string>;\n /** URL (HTTP transport) */\n url?: string;\n /** HTTP headers */\n headers?: Record<string, string>;\n };\n };\n}\n\n/**\n * MCP 配置加载结果\n */\nexport interface MCPConfigLoadResult {\n servers: MCPServerConfig[];\n /** 主配置文件路径 */\n configPath?: string;\n /** 所有加载的配置文件路径 */\n configPaths?: string[];\n}\n\n/**\n * 展开环境变量\n * 支持 ${VAR} 和 $VAR 格式\n */\nfunction expandEnvVars(value: string): string {\n // 匹配 ${VAR} 格式\n let result = value.replace(/\\$\\{([^}]+)\\}/g, (_, varName) => {\n return process.env[varName] || '';\n });\n\n // 匹配 $VAR 格式\n result = result.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, varName) => {\n return process.env[varName] || '';\n });\n\n return result;\n}\n\n/**\n * 递归展开对象中的环境变量\n */\nfunction expandEnvVarsInObject(obj: unknown): unknown {\n if (typeof obj === 'string') {\n return expandEnvVars(obj);\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => expandEnvVarsInObject(item));\n }\n\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = expandEnvVarsInObject(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * 将 Claude Desktop 格式转换为内部 MCPServerConfig[]\n */\nfunction transformConfig(config: MCPConfigFile): MCPServerConfig[] {\n const servers: MCPServerConfig[] = [];\n\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n // 根据是否有 url 判断 transport 类型\n const transport = serverConfig.url ? 'http' : 'stdio';\n\n const server: MCPServerConfig = {\n name,\n transport,\n ...(transport === 'stdio'\n ? {\n command: serverConfig.command,\n args: serverConfig.args,\n env: serverConfig.env as Record<string, string>\n }\n : {\n url: serverConfig.url,\n headers: serverConfig.headers\n })\n };\n\n servers.push(server);\n }\n\n return servers;\n}\n\n/**\n * 查找配置文件\n * 支持用户目录和工作目录两种路径\n */\nfunction findConfigFiles(startDir: string = process.cwd(), userBasePath?: string): string[] {\n const paths: string[] = [];\n const base = userBasePath || homedir();\n\n // 用户目录(优先级低,先加载)\n const userConfig = join(base, '.claude', 'mcp_config.json');\n if (existsSync(userConfig)) {\n paths.push(userConfig);\n }\n\n // 工作目录(优先级高,后加载覆盖)\n const workspaceConfig = join(startDir, '.claude', 'mcp_config.json');\n if (existsSync(workspaceConfig)) {\n paths.push(workspaceConfig);\n }\n\n return paths;\n}\n\n/**\n * 加载单个配置文件\n */\nfunction loadSingleConfig(filePath: string): MCPServerConfig[] {\n const content = readFileSync(filePath, 'utf-8');\n const rawConfig = JSON.parse(content) as MCPConfigFile;\n const expandedConfig = expandEnvVarsInObject(rawConfig) as MCPConfigFile;\n return transformConfig(expandedConfig);\n}\n\n/**\n * 加载 MCP 配置\n * @param configPath 可选的配置文件路径,如未提供则自动加载用户目录和工作目录配置\n * @param startDir 搜索起始目录,默认为当前工作目录\n * @param userBasePath 用户级基础路径,默认 ~ (homedir)\n */\nexport function loadMCPConfig(\n configPath?: string,\n startDir: string = process.cwd(),\n userBasePath?: string\n): MCPConfigLoadResult {\n // 显式指定路径 -> 单文件加载\n if (configPath) {\n if (!existsSync(configPath)) {\n return { servers: [] };\n }\n\n try {\n const servers = loadSingleConfig(configPath);\n return { servers, configPath };\n } catch (error) {\n console.error(`Failed to load MCP config from ${configPath}:`, error);\n return { servers: [] };\n }\n }\n\n // 自动加载 -> 多文件合并\n const configPaths = findConfigFiles(startDir, userBasePath);\n if (configPaths.length === 0) {\n return { servers: [] };\n }\n\n // 合并配置(用户目录先加载,工作目录后覆盖)\n const mergedServers = new Map<string, MCPServerConfig>();\n for (const path of configPaths) {\n try {\n const servers = loadSingleConfig(path);\n for (const server of servers) {\n mergedServers.set(server.name, server);\n }\n } catch (error) {\n console.error(`Failed to load MCP config from ${path}:`, error);\n }\n }\n\n return {\n servers: Array.from(mergedServers.values()),\n configPath: configPaths[configPaths.length - 1], // 主配置(工作目录)\n configPaths\n };\n}\n\n/**\n * 验证 MCP 配置\n */\nexport function validateMCPConfig(config: MCPConfigFile): string[] {\n const errors: string[] = [];\n\n if (!config.mcpServers || typeof config.mcpServers !== 'object') {\n errors.push('mcpServers must be an object');\n return errors;\n }\n\n for (const [name, server] of Object.entries(config.mcpServers)) {\n if (!server.command && !server.url) {\n errors.push(`Server \"${name}\": must have either \"command\" or \"url\"`);\n }\n\n if (server.command && server.url) {\n errors.push(`Server \"${name}\": cannot have both \"command\" and \"url\"`);\n }\n }\n\n return errors;\n}"]}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
function zodToJsonSchema(schema) {
|
|
5
|
+
if (schema instanceof z.ZodObject) {
|
|
6
|
+
const shape = schema.shape;
|
|
7
|
+
const properties = {};
|
|
8
|
+
const required = [];
|
|
9
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
10
|
+
properties[key] = zodFieldToJsonSchema(value);
|
|
11
|
+
if (!value.isOptional()) {
|
|
12
|
+
required.push(key);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
type: "object",
|
|
17
|
+
properties,
|
|
18
|
+
required: required.length > 0 ? required : void 0,
|
|
19
|
+
additionalProperties: false
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return zodFieldToJsonSchema(schema);
|
|
23
|
+
}
|
|
24
|
+
function zodFieldToJsonSchema(schema) {
|
|
25
|
+
if (schema._def?.typeName === "ZodDefault") {
|
|
26
|
+
const inner = zodFieldToJsonSchema(schema._def.innerType);
|
|
27
|
+
const defaultValue = schema._def.defaultValue();
|
|
28
|
+
const desc = schema.description || inner?.description;
|
|
29
|
+
const result = { ...inner };
|
|
30
|
+
if (desc) result.description = desc;
|
|
31
|
+
result.default = defaultValue;
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
if (schema instanceof z.ZodOptional) {
|
|
35
|
+
const inner = zodFieldToJsonSchema(schema.unwrap());
|
|
36
|
+
const desc = schema.description || inner?.description;
|
|
37
|
+
if (desc && inner?.description !== desc) {
|
|
38
|
+
return { ...inner, description: desc };
|
|
39
|
+
}
|
|
40
|
+
return inner;
|
|
41
|
+
}
|
|
42
|
+
if (schema instanceof z.ZodNullable) {
|
|
43
|
+
const inner = zodFieldToJsonSchema(schema.unwrap());
|
|
44
|
+
const desc = schema.description || inner?.description;
|
|
45
|
+
if (desc && inner?.description !== desc) {
|
|
46
|
+
return { ...inner, description: desc };
|
|
47
|
+
}
|
|
48
|
+
return inner;
|
|
49
|
+
}
|
|
50
|
+
if (schema instanceof z.ZodString) {
|
|
51
|
+
const result = { type: "string" };
|
|
52
|
+
if (schema.description) result.description = schema.description;
|
|
53
|
+
for (const check of schema._def.checks) {
|
|
54
|
+
if (check.kind === "min") result.minLength = check.value;
|
|
55
|
+
if (check.kind === "max") result.maxLength = check.value;
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
if (schema instanceof z.ZodNumber) {
|
|
60
|
+
const result = { type: "number" };
|
|
61
|
+
if (schema.description) result.description = schema.description;
|
|
62
|
+
for (const check of schema._def.checks) {
|
|
63
|
+
if (check.kind === "int") result.type = "integer";
|
|
64
|
+
if (check.kind === "min") {
|
|
65
|
+
if (check.inclusive === false) result.exclusiveMinimum = check.value;
|
|
66
|
+
else result.minimum = check.value;
|
|
67
|
+
}
|
|
68
|
+
if (check.kind === "max") {
|
|
69
|
+
if (check.inclusive === false) result.exclusiveMaximum = check.value;
|
|
70
|
+
else result.maximum = check.value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
if (schema instanceof z.ZodBoolean) {
|
|
76
|
+
return { type: "boolean", description: schema.description };
|
|
77
|
+
}
|
|
78
|
+
if (schema instanceof z.ZodArray) {
|
|
79
|
+
const result = {
|
|
80
|
+
type: "array",
|
|
81
|
+
items: zodFieldToJsonSchema(schema.element)
|
|
82
|
+
};
|
|
83
|
+
if (schema.description) result.description = schema.description;
|
|
84
|
+
if (schema._def.minLength) result.minItems = schema._def.minLength.value;
|
|
85
|
+
if (schema._def.maxLength) result.maxItems = schema._def.maxLength.value;
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
if (schema instanceof z.ZodEnum) {
|
|
89
|
+
return {
|
|
90
|
+
type: "string",
|
|
91
|
+
enum: schema.options,
|
|
92
|
+
description: schema.description
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (schema instanceof z.ZodObject) {
|
|
96
|
+
return zodToJsonSchema(schema);
|
|
97
|
+
}
|
|
98
|
+
return { type: "string" };
|
|
99
|
+
}
|
|
100
|
+
function toolsToModelSchema(tools) {
|
|
101
|
+
return tools.map((tool) => ({
|
|
102
|
+
name: tool.name,
|
|
103
|
+
description: tool.description,
|
|
104
|
+
parameters: zodToJsonSchema(tool.parameters)
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
function mergeTokenUsage(...usages) {
|
|
108
|
+
const merged = {
|
|
109
|
+
promptTokens: 0,
|
|
110
|
+
completionTokens: 0,
|
|
111
|
+
totalTokens: 0
|
|
112
|
+
};
|
|
113
|
+
for (const usage of usages) {
|
|
114
|
+
if (usage) {
|
|
115
|
+
merged.promptTokens += usage.promptTokens;
|
|
116
|
+
merged.completionTokens += usage.completionTokens;
|
|
117
|
+
merged.totalTokens += usage.totalTokens;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return merged;
|
|
121
|
+
}
|
|
122
|
+
var BaseModelAdapter = class {
|
|
123
|
+
/** 模型能力描述 */
|
|
124
|
+
capabilities;
|
|
125
|
+
/**
|
|
126
|
+
* 转换消息格式
|
|
127
|
+
*/
|
|
128
|
+
transformMessages(messages) {
|
|
129
|
+
return messages.map((msg) => ({
|
|
130
|
+
role: msg.role,
|
|
131
|
+
content: msg.content,
|
|
132
|
+
...msg.toolCalls && { tool_calls: msg.toolCalls.map((tc) => ({
|
|
133
|
+
id: tc.id,
|
|
134
|
+
type: "function",
|
|
135
|
+
function: {
|
|
136
|
+
name: tc.name,
|
|
137
|
+
arguments: typeof tc.arguments === "string" ? tc.arguments : JSON.stringify(tc.arguments)
|
|
138
|
+
}
|
|
139
|
+
})) },
|
|
140
|
+
...msg.toolCallId && { tool_call_id: msg.toolCallId }
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export { BaseModelAdapter, mergeTokenUsage, toolsToModelSchema, zodToJsonSchema };
|
|
146
|
+
//# sourceMappingURL=chunk-WH3APNQ5.js.map
|
|
147
|
+
//# sourceMappingURL=chunk-WH3APNQ5.js.map
|