@ddlqhd/agent-sdk 0.1.1 → 0.2.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/dist/{chunk-AJD3DTL7.cjs → chunk-6X7EYQLS.cjs} +742 -103
- package/dist/chunk-6X7EYQLS.cjs.map +1 -0
- package/dist/{chunk-742JTNYI.js → chunk-D3UZNLZO.js} +570 -77
- package/dist/chunk-D3UZNLZO.js.map +1 -0
- package/dist/{chunk-DXMVWGLJ.js → chunk-EQ5CXH44.js} +730 -96
- package/dist/chunk-EQ5CXH44.js.map +1 -0
- package/dist/{chunk-THKEF32L.js → chunk-MEJHTQJM.js} +82 -112
- package/dist/chunk-MEJHTQJM.js.map +1 -0
- package/dist/{chunk-DQFTAD3I.cjs → chunk-NYZD3THB.cjs} +573 -76
- package/dist/chunk-NYZD3THB.cjs.map +1 -0
- package/dist/{chunk-Q3L4GIBG.cjs → chunk-Z45DHTDX.cjs} +83 -115
- package/dist/chunk-Z45DHTDX.cjs.map +1 -0
- package/dist/cli/index.cjs +40 -31
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +14 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/{index-DGPDMbW5.d.cts → index-Cw3SfEAB.d.ts} +13 -14
- package/dist/{index-nEfayAzD.d.ts → index-D2Qntkn_.d.cts} +13 -14
- package/dist/index.cjs +115 -91
- package/dist/index.d.cts +42 -22
- package/dist/index.d.ts +42 -22
- package/dist/index.js +3 -3
- package/dist/models/index.cjs +14 -10
- package/dist/models/index.d.cts +7 -2
- package/dist/models/index.d.ts +7 -2
- package/dist/models/index.js +1 -1
- package/dist/tools/index.cjs +52 -60
- package/dist/tools/index.d.cts +3 -3
- package/dist/tools/index.d.ts +3 -3
- package/dist/tools/index.js +1 -1
- package/dist/{types-BLf9IqRs.d.cts → types-CWPAYWzr.d.cts} +274 -13
- package/dist/{types-BLf9IqRs.d.ts → types-CWPAYWzr.d.ts} +274 -13
- package/package.json +11 -11
- package/dist/chunk-742JTNYI.js.map +0 -1
- package/dist/chunk-AJD3DTL7.cjs.map +0 -1
- package/dist/chunk-DQFTAD3I.cjs.map +0 -1
- package/dist/chunk-DXMVWGLJ.js.map +0 -1
- package/dist/chunk-Q3L4GIBG.cjs.map +0 -1
- package/dist/chunk-THKEF32L.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/models/default-capabilities.ts","../src/core/logger.ts","../src/models/model-request-log.ts","../src/models/openai.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/core/process-env-merge.ts","../src/models/index.ts"],"names":["randomUUID","BaseModelAdapter","toolsToModelSchema"],"mappings":"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","file":"chunk-NYZD3THB.cjs","sourcesContent":["import type { ModelCapabilities } from '../core/types.js';\n\n/**\n * 各提供商适配器在省略 `config.capabilities` 时共用的默认能力(上下文 200K、最大输出 32K)。\n */\nexport const DEFAULT_ADAPTER_CAPABILITIES: ModelCapabilities = {\n contextLength: 200_000,\n maxOutputTokens: 32_000\n};\n","import type { LogEvent, LogRedactionConfig, SDKLogLevel, SDKLogger } from './types.js';\n\nconst TRUTHY = /^(1|true|yes)$/i;\nconst DEFAULT_MAX_BODY_CHARS = 4000;\nconst DEFAULT_REDACT_KEYS = [\n 'authorization',\n 'proxy-authorization',\n 'x-api-key',\n 'api-key',\n 'apikey',\n 'api_key',\n 'cookie',\n 'set-cookie',\n 'token',\n 'access_token',\n 'refresh_token',\n 'password',\n 'secret'\n];\n\nconst LEVEL_PRIORITY: Record<SDKLogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: 99\n};\n\nfunction parseEnvLogLevel(raw: string | undefined): SDKLogLevel | undefined {\n switch ((raw ?? '').trim().toLowerCase()) {\n case 'debug':\n case 'info':\n case 'warn':\n case 'error':\n case 'silent':\n return (raw ?? '').trim().toLowerCase() as SDKLogLevel;\n default:\n return undefined;\n }\n}\n\nfunction parseBooleanEnv(name: string): boolean | undefined {\n const raw = process.env[name];\n if (raw == null || raw === '') {\n return undefined;\n }\n if (TRUTHY.test(raw.trim())) {\n return true;\n }\n if (/^(0|false|no)$/i.test(raw.trim())) {\n return false;\n }\n return undefined;\n}\n\nfunction parseNumericEnv(name: string): number | undefined {\n const raw = process.env[name];\n if (raw == null || raw === '') {\n return undefined;\n }\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nexport function resolveSDKLogLevel(level?: SDKLogLevel, hasLogger = false): SDKLogLevel {\n if (level != null) {\n return level;\n }\n const fromEnv = parseEnvLogLevel(process.env.AGENT_SDK_LOG_LEVEL);\n if (fromEnv != null) {\n return fromEnv;\n }\n if (hasLogger) {\n return 'info';\n }\n return 'silent';\n}\n\nexport function resolveLogRedaction(config?: LogRedactionConfig): Required<LogRedactionConfig> {\n const envIncludeBodies = parseBooleanEnv('AGENT_SDK_LOG_BODIES');\n const envIncludeToolArgs = parseBooleanEnv('AGENT_SDK_LOG_INCLUDE_TOOL_ARGS');\n const envMaxBodyChars = parseNumericEnv('AGENT_SDK_LOG_MAX_BODY_CHARS');\n\n return {\n includeBodies: config?.includeBodies ?? envIncludeBodies ?? false,\n includeToolArguments: config?.includeToolArguments ?? envIncludeToolArgs ?? false,\n maxBodyChars: Math.max(\n 0,\n Math.floor(config?.maxBodyChars ?? envMaxBodyChars ?? DEFAULT_MAX_BODY_CHARS)\n ),\n redactKeys: [\n ...DEFAULT_REDACT_KEYS,\n ...(config?.redactKeys ?? [])\n ]\n };\n}\n\nexport function shouldEmitLog(\n configuredLevel: SDKLogLevel | undefined,\n hasLogger: boolean,\n eventLevel: Exclude<SDKLogLevel, 'silent'>\n): boolean {\n const effectiveLevel = resolveSDKLogLevel(configuredLevel, hasLogger);\n return LEVEL_PRIORITY[eventLevel] >= LEVEL_PRIORITY[effectiveLevel];\n}\n\nfunction truncateString(value: string, maxChars: number): string {\n if (maxChars <= 0 || value.length <= maxChars) {\n return value;\n }\n return `${value.slice(0, maxChars)}... [truncated ${value.length - maxChars} chars]`;\n}\n\nfunction isSensitiveKey(key?: string, redaction?: Required<LogRedactionConfig>): boolean {\n if (key == null || redaction == null) {\n return false;\n }\n const normalized = key.toLowerCase();\n return redaction.redactKeys.some(candidate => candidate.toLowerCase() === normalized);\n}\n\nfunction sanitizeObjectEntries(\n entries: Array<[string, unknown]>,\n redaction: Required<LogRedactionConfig>\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n for (const [key, value] of entries) {\n if (isSensitiveKey(key, redaction)) {\n output[key] = '[REDACTED]';\n continue;\n }\n if (key === 'messages' && !redaction.includeBodies && Array.isArray(value)) {\n output[key] = `[REDACTED_MESSAGES:${value.length}]`;\n continue;\n }\n if ((key === 'arguments' || key === 'input') && !redaction.includeToolArguments) {\n output[key] = '[REDACTED_TOOL_ARGUMENTS]';\n continue;\n }\n output[key] = sanitizeForLogging(value, redaction, key);\n }\n return output;\n}\n\nexport function sanitizeForLogging(\n value: unknown,\n redaction: Required<LogRedactionConfig>,\n key?: string\n): unknown {\n if (isSensitiveKey(key, redaction)) {\n return '[REDACTED]';\n }\n\n if (typeof value === 'string') {\n if (!redaction.includeBodies && (key === 'content' || key === 'text' || key === 'thinking')) {\n return '[REDACTED_BODY]';\n }\n return truncateString(value, redaction.maxBodyChars);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean' || value == null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (!redaction.includeBodies && key === 'messages') {\n return `[REDACTED_MESSAGES:${value.length}]`;\n }\n return value.map(item => sanitizeForLogging(item, redaction));\n }\n\n if (typeof value === 'object') {\n return sanitizeObjectEntries(Object.entries(value as Record<string, unknown>), redaction);\n }\n\n return String(value);\n}\n\nexport function formatSDKLog(event: LogEvent): string {\n const prefix = `[agent-sdk][${event.component}][${event.event}]`;\n const details: string[] = [];\n\n if (event.provider) details.push(`provider=${event.provider}`);\n if (event.model) details.push(`model=${event.model}`);\n if (event.sessionId) details.push(`sessionId=${event.sessionId}`);\n if (event.iteration !== undefined) details.push(`iteration=${event.iteration}`);\n if (event.statusCode !== undefined) details.push(`statusCode=${event.statusCode}`);\n if (event.durationMs !== undefined) details.push(`durationMs=${event.durationMs}`);\n if (event.toolName) details.push(`tool=${event.toolName}`);\n if (event.requestId) details.push(`requestId=${event.requestId}`);\n if (event.clientRequestId) details.push(`clientRequestId=${event.clientRequestId}`);\n\n const suffix = details.length > 0 ? ` ${details.join(' ')}` : '';\n return event.message ? `${prefix} ${event.message}${suffix}` : `${prefix}${suffix}`;\n}\n\nfunction consoleMethod(level: Exclude<SDKLogLevel, 'silent'>): (...args: unknown[]) => void {\n if (level === 'error') return console.error.bind(console);\n if (level === 'warn') return console.warn.bind(console);\n if (level === 'info') return console.info.bind(console);\n return console.debug.bind(console);\n}\n\nexport function createConsoleSDKLogger(): SDKLogger {\n const write = (\n level: Exclude<SDKLogLevel, 'silent'>,\n event: LogEvent\n ): void => {\n const line = formatSDKLog(event);\n const logFn = consoleMethod(level);\n if (event.metadata != null) {\n logFn(line, event.metadata);\n } else {\n logFn(line);\n }\n };\n\n return {\n debug(event) {\n write('debug', event);\n },\n info(event) {\n write('info', event);\n },\n warn(event) {\n write('warn', event);\n },\n error(event) {\n write('error', event);\n }\n };\n}\n\n/**\n * 发出一条 SDK 日志。若未传入 `logger` 且当前级别允许输出,则使用内置的 {@link createConsoleSDKLogger}\n * 写到 `console`(级别对应 `console.debug` / `info` / `warn` / `error`)。\n */\nexport function emitSDKLog(args: {\n logger?: SDKLogger;\n logLevel?: SDKLogLevel;\n level: Exclude<SDKLogLevel, 'silent'>;\n event: Omit<LogEvent, 'source'>;\n}): void {\n if (!shouldEmitLog(args.logLevel, args.logger != null, args.level)) {\n return;\n }\n\n const logger = args.logger ?? createConsoleSDKLogger();\n const payload: LogEvent = {\n source: 'agent-sdk',\n ...args.event\n };\n\n logger[args.level]?.(payload);\n}\n\nexport function extractProviderRequestId(headers: Headers | undefined): string | undefined {\n if (headers == null) {\n return undefined;\n }\n return headers.get('x-request-id')\n ?? headers.get('request-id')\n ?? headers.get('x-amzn-requestid')\n ?? undefined;\n}\n","import { randomUUID } from 'crypto';\nimport type { ModelParams } from '../core/types.js';\nimport {\n emitSDKLog,\n extractProviderRequestId,\n resolveLogRedaction,\n sanitizeForLogging\n} from '../core/logger.js';\n\nexport interface ModelRequestLogContext {\n provider: string;\n model: string;\n path: string;\n operation: 'stream' | 'complete';\n params?: Pick<ModelParams, 'logger' | 'logLevel' | 'redaction' | 'sessionId'>;\n iteration?: number;\n}\n\nexport interface ModelRequestLogState {\n clientRequestId: string;\n startedAt: number;\n}\n\nfunction countMessages(body: unknown): number | undefined {\n if (body == null || typeof body !== 'object' || !('messages' in body)) {\n return undefined;\n }\n const messages = (body as { messages?: unknown }).messages;\n return Array.isArray(messages) ? messages.length : undefined;\n}\n\nfunction countTools(body: unknown): number | undefined {\n if (body == null || typeof body !== 'object' || !('tools' in body)) {\n return undefined;\n }\n const tools = (body as { tools?: unknown }).tools;\n return Array.isArray(tools) ? tools.length : undefined;\n}\n\nfunction buildRequestMetadata(body: unknown, params?: ModelRequestLogContext['params']): Record<string, unknown> {\n const redaction = resolveLogRedaction(params?.redaction);\n const metadata: Record<string, unknown> = {};\n const messageCount = countMessages(body);\n const toolCount = countTools(body);\n\n if (messageCount !== undefined) metadata.messageCount = messageCount;\n if (toolCount !== undefined) metadata.toolCount = toolCount;\n if (redaction.includeBodies) {\n metadata.requestBody = sanitizeForLogging(body, redaction);\n }\n\n return metadata;\n}\n\nexport function logModelRequestStart(\n context: ModelRequestLogContext,\n body: unknown,\n extraMetadata?: Record<string, unknown>\n): ModelRequestLogState {\n const state: ModelRequestLogState = {\n clientRequestId: randomUUID(),\n startedAt: Date.now()\n };\n\n emitSDKLog({\n logger: context.params?.logger,\n logLevel: context.params?.logLevel,\n level: 'info',\n event: {\n component: 'model',\n event: 'model.request.start',\n message: `Starting ${context.operation} request`,\n provider: context.provider,\n model: context.model,\n operation: context.operation,\n sessionId: context.params?.sessionId,\n iteration: context.iteration,\n clientRequestId: state.clientRequestId,\n metadata: {\n path: context.path,\n ...buildRequestMetadata(body, context.params),\n ...extraMetadata\n }\n }\n });\n\n return state;\n}\n\nexport function logModelRequestEnd(\n context: ModelRequestLogContext,\n state: ModelRequestLogState,\n response: Response,\n extraMetadata?: Record<string, unknown>\n): void {\n emitSDKLog({\n logger: context.params?.logger,\n logLevel: context.params?.logLevel,\n level: response.ok ? 'info' : 'warn',\n event: {\n component: 'model',\n event: response.ok ? 'model.request.end' : 'model.request.error',\n message: response.ok ? 'Model request completed' : 'Model request returned error response',\n provider: context.provider,\n model: context.model,\n operation: context.operation,\n sessionId: context.params?.sessionId,\n iteration: context.iteration,\n clientRequestId: state.clientRequestId,\n requestId: extractProviderRequestId(response.headers),\n statusCode: response.status,\n durationMs: Date.now() - state.startedAt,\n metadata: {\n path: context.path,\n ...extraMetadata\n }\n }\n });\n}\n\nexport function logModelRequestFailure(\n context: ModelRequestLogContext,\n state: ModelRequestLogState,\n error: unknown,\n extraMetadata?: Record<string, unknown>\n): void {\n const err = error instanceof Error ? error : new Error(String(error));\n emitSDKLog({\n logger: context.params?.logger,\n logLevel: context.params?.logLevel,\n level: err.name === 'AbortError' ? 'info' : 'error',\n event: {\n component: 'model',\n event: err.name === 'AbortError' ? 'model.request.aborted' : 'model.request.error',\n message: err.name === 'AbortError' ? 'Model request aborted' : 'Model request failed',\n provider: context.provider,\n model: context.model,\n operation: context.operation,\n sessionId: context.params?.sessionId,\n iteration: context.iteration,\n clientRequestId: state.clientRequestId,\n durationMs: Date.now() - state.startedAt,\n errorName: err.name,\n errorMessage: err.message,\n metadata: {\n path: context.path,\n ...extraMetadata\n }\n }\n });\n}\n\nexport function logModelStreamParseError(\n context: ModelRequestLogContext,\n rawChunk: string,\n error: unknown\n): void {\n const err = error instanceof Error ? error : new Error(String(error));\n const redaction = resolveLogRedaction(context.params?.redaction);\n emitSDKLog({\n logger: context.params?.logger,\n logLevel: context.params?.logLevel,\n level: 'warn',\n event: {\n component: 'streaming',\n event: 'model.stream.parse_error',\n message: 'Failed to parse provider stream chunk',\n provider: context.provider,\n model: context.model,\n operation: context.operation,\n sessionId: context.params?.sessionId,\n iteration: context.iteration,\n errorName: err.name,\n errorMessage: err.message,\n metadata: {\n path: context.path,\n rawChunk: sanitizeForLogging(rawChunk, redaction)\n }\n }\n });\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { DEFAULT_ADAPTER_CAPABILITIES } from './default-capabilities.js';\nimport {\n logModelRequestEnd,\n logModelRequestFailure,\n logModelRequestStart,\n logModelStreamParseError\n} from './model-request-log.js';\n\n/**\n * OpenAI 配置\n */\nexport interface OpenAIConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n organization?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n}\n\n/**\n * OpenAI 模型适配器\n */\nexport class OpenAIAdapter extends BaseModelAdapter {\n readonly name: string;\n private apiKey: string;\n private baseUrl: string;\n private model: string;\n private organization?: string;\n\n constructor(config: OpenAIConfig = {}) {\n super();\n this.apiKey = config.apiKey || process.env.OPENAI_API_KEY || '';\n this.baseUrl = config.baseUrl || process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';\n this.model = config.model || 'gpt-4o';\n this.organization = config.organization || process.env.OPENAI_ORG_ID;\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass apiKey in config.');\n }\n\n this.name = `openai/${this.model}`;\n\n this.capabilities = config.capabilities ?? DEFAULT_ADAPTER_CAPABILITIES;\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/chat/completions', body, 'stream', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n try {\n const data = JSON.parse(trimmed.slice(6));\n const choice = data.choices?.[0];\n if (!choice) continue;\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n // 处理内容增量\n if (choice.delta?.content) {\n yield { type: 'text', content: choice.delta.content, ...raw };\n }\n\n // 处理工具调用\n if (choice.delta?.tool_calls) {\n for (const toolCall of choice.delta.tool_calls) {\n if (toolCall.index !== undefined) {\n // 新的工具调用开始\n if (toolCall.id && toolCall.function?.name) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...raw\n };\n }\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments || ''\n };\n yield {\n type: 'tool_call_start',\n content: toolCall.function.name,\n toolCallId: toolCall.id,\n ...raw\n };\n } else if (toolCall.function?.arguments && currentToolCall) {\n currentToolCall.arguments += toolCall.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: toolCall.function.arguments,\n toolCallId: currentToolCall.id,\n ...raw\n };\n }\n }\n }\n }\n\n // 处理完成\n if (choice.finish_reason === 'tool_calls' && currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...raw\n };\n currentToolCall = null;\n }\n\n // 处理元数据\n if (data.usage) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n }\n },\n ...raw\n };\n }\n } catch (error) {\n logModelStreamParseError(\n {\n provider: 'openai',\n model: this.model,\n path: '/chat/completions',\n operation: 'stream',\n params\n },\n trimmed,\n error\n );\n }\n }\n }\n\n // 处理剩余的工具调用\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...(params.includeRawStreamEvents ? { providerRaw: { trailing: true } } : {})\n };\n }\n\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/chat/completions', body, 'complete', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error('No completion choice returned');\n }\n\n const result: CompletionResult = {\n content: choice.message?.content || ''\n };\n\n // 处理工具调用\n if (choice.message?.tool_calls) {\n result.toolCalls = choice.message.tool_calls.map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: this.safeParseJSON(tc.function.arguments)\n }));\n }\n\n // 处理使用统计\n if (data.usage) {\n result.usage = {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n };\n }\n\n return result;\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const messages = this.transformMessages(params.messages);\n const defaultMaxTokens =\n this.capabilities?.maxOutputTokens ?? DEFAULT_ADAPTER_CAPABILITIES.maxOutputTokens;\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream,\n ...(stream && { stream_options: { include_usage: true } }),\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n max_tokens: params.maxTokens ?? defaultMaxTokens,\n ...(params.stopSequences && { stop: params.stopSequences })\n };\n\n // 添加工具\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n type: 'function',\n function: tool\n }));\n }\n\n return body;\n }\n\n private async fetch(\n path: string,\n body: unknown,\n operation: 'stream' | 'complete',\n params: ModelParams\n ): Promise<Response> {\n const requestLog = logModelRequestStart({\n provider: 'openai',\n model: this.model,\n path,\n operation,\n params\n }, body);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n 'X-Client-Request-Id': requestLog.clientRequestId\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n try {\n const response = await globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: params.signal\n });\n logModelRequestEnd(\n {\n provider: 'openai',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n response\n );\n return response;\n } catch (error) {\n logModelRequestFailure(\n {\n provider: 'openai',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n error\n );\n throw error;\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\n/**\n * 创建 OpenAI 适配器\n */\nexport function createOpenAI(config?: OpenAIConfig): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { DEFAULT_ADAPTER_CAPABILITIES } from './default-capabilities.js';\nimport {\n logModelRequestEnd,\n logModelRequestFailure,\n logModelRequestStart,\n logModelStreamParseError\n} from './model-request-log.js';\n\n/**\n * Messages API 顶层 `metadata`:静态字典,或根据每次请求的 {@link ModelParams} 生成字典。\n */\nexport type AnthropicRequestMetadata =\n | Record<string, unknown>\n | ((params: ModelParams) => Record<string, unknown>);\n\n/**\n * 初次 Messages API `POST` 的重试选项(不含 SSE 已建立后 `read` 中途断线)。\n * 未传 `fetchRetry` 时默认共 **2** 次尝试(即 **1** 次自动重试),退避基数 200ms、单次等待上限 2000ms。\n */\nexport interface AnthropicFetchRetryOptions {\n /**\n * 总尝试次数(含第一次)。省略 `fetchRetry` 时默认为 **2**(失败可再试 1 次)。\n * 设为 `1` 可关闭重试。\n * @example `4` → 首次失败后最多再试 3 次。\n */\n maxAttempts?: number;\n /** 指数退避的基准间隔(毫秒),默认 200。 */\n baseDelayMs?: number;\n /** 单次等待上限(毫秒),默认 2000;亦为 `Retry-After` 解析结果的上限。 */\n maxDelayMs?: number;\n}\n\n/** 未配置 `fetchRetry` 时的默认策略:最多 2 次 HTTP 尝试(网络抖动或 429/502/503/504 时可自动重试 1 次)。 */\nconst DEFAULT_FETCH_RETRY: Required<AnthropicFetchRetryOptions> = {\n maxAttempts: 2,\n baseDelayMs: 200,\n maxDelayMs: 2_000\n};\n\nfunction normalizeFetchRetry(options?: AnthropicFetchRetryOptions): Required<AnthropicFetchRetryOptions> {\n if (options == null) {\n return { ...DEFAULT_FETCH_RETRY };\n }\n const maxAttempts = Math.max(1, Math.floor(options.maxAttempts ?? DEFAULT_FETCH_RETRY.maxAttempts));\n const baseDelayMs = Math.max(0, options.baseDelayMs ?? DEFAULT_FETCH_RETRY.baseDelayMs);\n const maxDelayMs = Math.max(baseDelayMs, options.maxDelayMs ?? DEFAULT_FETCH_RETRY.maxDelayMs);\n return { maxAttempts, baseDelayMs, maxDelayMs };\n}\n\nfunction isAbortError(e: unknown): boolean {\n if (e instanceof DOMException && e.name === 'AbortError') {\n return true;\n }\n return typeof e === 'object' && e !== null && (e as { name?: string }).name === 'AbortError';\n}\n\nfunction isRetriableFetchError(e: unknown): boolean {\n if (isAbortError(e)) {\n return false;\n }\n if (e instanceof TypeError) {\n return true;\n }\n const cause = typeof e === 'object' && e !== null && 'cause' in e\n ? (e as { cause?: { code?: string } }).cause\n : undefined;\n const code = cause?.code;\n return (\n code === 'ECONNRESET' ||\n code === 'ETIMEDOUT' ||\n code === 'EPIPE' ||\n code === 'UND_ERR_SOCKET'\n );\n}\n\nfunction isRetriableHttpStatus(status: number): boolean {\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\n/** Parse Retry-After: delta-seconds or HTTP-date → wait ms (undefined if unparseable). */\nfunction parseRetryAfterMs(header: string | null): number | undefined {\n if (header == null || header === '') {\n return undefined;\n }\n const trimmed = header.trim();\n const asNum = Number(trimmed);\n if (Number.isFinite(asNum) && asNum >= 0) {\n return asNum * 1000;\n }\n const parsed = Date.parse(trimmed);\n if (!Number.isNaN(parsed)) {\n const delta = parsed - Date.now();\n return delta > 0 ? delta : 0;\n }\n return undefined;\n}\n\nfunction computeBackoffMs(\n attemptIndex: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const exp = Math.min(maxDelayMs, baseDelayMs * 2 ** attemptIndex);\n const jitter = 0.5 + Math.random() * 0.5;\n return Math.min(maxDelayMs, Math.floor(exp * jitter));\n}\n\nasync function delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return;\n }\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n return;\n }\n const id = setTimeout(() => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function drainResponseBody(response: Response): Promise<void> {\n try {\n await response.arrayBuffer();\n } catch {\n // ignore\n }\n}\n\n/**\n * Anthropic 配置\n */\nexport interface AnthropicConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n version?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n /**\n * 与 {@link ModelParams.sessionId} 合并进 Messages API 顶层 `metadata`(`sessionId` → `user_id`)。\n * 配置中的键可覆盖 `user_id`。\n */\n metadata?: AnthropicRequestMetadata;\n /**\n * 仅针对**建立连接前**的初次 `POST` 的重试策略,见 {@link AnthropicFetchRetryOptions}。\n * 省略时默认共 2 次尝试(**1** 次自动重试);传入 `fetchRetry: { maxAttempts: 1 }` 可改为只请求 1 次、不重试。\n */\n fetchRetry?: AnthropicFetchRetryOptions;\n}\n\n/**\n * Anthropic 模型适配器\n */\nexport class AnthropicAdapter extends BaseModelAdapter {\n readonly name: string;\n private apiKey: string;\n private baseUrl: string;\n private model: string;\n private version: string;\n private requestMetadata?: AnthropicRequestMetadata;\n private fetchRetry: Required<AnthropicFetchRetryOptions>;\n\n constructor(config: AnthropicConfig = {}) {\n super();\n this.apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY || '';\n this.baseUrl = config.baseUrl || process.env.ANTHROPIC_BASE_URL || 'https://api.anthropic.com';\n this.model = config.model || 'claude-sonnet-4-20250514';\n this.version = config.version || '2023-06-01';\n this.requestMetadata = config.metadata;\n this.fetchRetry = normalizeFetchRetry(config.fetchRetry);\n\n if (!this.apiKey) {\n throw new Error('Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable or pass apiKey in config.');\n }\n\n this.name = `anthropic/${this.model}`;\n\n this.capabilities = config.capabilities ?? DEFAULT_ADAPTER_CAPABILITIES;\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/v1/messages', body, 'stream', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let currentToolCall: { id: string; name: string; input: string } | null = null;\n let currentThinkingBlock: { signature?: string } | null = null;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data:')) continue;\n // 跳过 'data:' 前缀,可能有空格\n let jsonStart = 5;\n if (trimmed.length > 5 && trimmed[5] === ' ') {\n jsonStart = 6;\n }\n const jsonStr = trimmed.slice(jsonStart);\n\n try {\n const data = JSON.parse(jsonStr);\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n switch (data.type) {\n case 'content_block_start':\n if (data.content_block?.type === 'tool_use') {\n currentToolCall = {\n id: data.content_block.id,\n name: data.content_block.name,\n input: ''\n };\n yield {\n type: 'tool_call_start',\n toolCall: {\n id: data.content_block.id,\n name: data.content_block.name,\n arguments: {}\n },\n ...raw\n };\n } else if (data.content_block?.type === 'thinking') {\n currentThinkingBlock = {\n signature: data.content_block.signature\n };\n yield {\n type: 'thinking',\n content: data.content_block.thinking,\n signature: currentThinkingBlock.signature,\n ...raw\n };\n }\n break;\n\n case 'content_block_delta':\n if (data.delta?.type === 'text_delta') {\n yield { type: 'text', content: data.delta.text, ...raw };\n } else if (data.delta?.type === 'thinking_delta') {\n yield {\n type: 'thinking',\n content: data.delta.thinking,\n signature: currentThinkingBlock?.signature,\n ...raw\n };\n } else if (data.delta?.type === 'input_json_delta' && currentToolCall) {\n currentToolCall.input += data.delta.partial_json;\n yield {\n type: 'tool_call_delta',\n content: data.delta.partial_json,\n toolCallId: currentToolCall.id,\n ...raw\n };\n }\n break;\n\n case 'content_block_stop':\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.input)\n },\n ...raw\n };\n currentToolCall = null;\n }\n if (currentThinkingBlock) {\n yield { type: 'thinking_block_end', ...raw };\n currentThinkingBlock = null;\n }\n break;\n\n case 'message_start':\n if (data.message?.usage) {\n const usage = data.message.usage;\n // Anthropic 的 input_tokens 已扣除缓存命中的部分\n // 完整的上下文大小 = input_tokens + cache_read_input_tokens\n const actualInputTokens = usage.input_tokens + (usage.cache_read_input_tokens || 0);\n yield {\n type: 'metadata',\n usagePhase: 'input',\n metadata: {\n usage: {\n promptTokens: actualInputTokens,\n completionTokens: 0,\n totalTokens: actualInputTokens,\n // 传递缓存信息\n cacheReadTokens: usage.cache_read_input_tokens || 0,\n cacheWriteTokens: usage.cache_creation_input_tokens || 0\n }\n },\n ...raw\n };\n }\n break;\n\n case 'message_delta':\n if (data.usage) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: 0,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.output_tokens\n }\n },\n ...raw\n };\n }\n break;\n }\n } catch (error) {\n logModelStreamParseError(\n {\n provider: 'anthropic',\n model: this.model,\n path: '/v1/messages',\n operation: 'stream',\n params\n },\n jsonStr,\n error\n );\n }\n }\n }\n\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/v1/messages', body, 'complete', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const result: CompletionResult = {\n content: ''\n };\n\n // 处理内容块\n const toolCalls: any[] = [];\n for (const block of data.content || []) {\n if (block.type === 'text') {\n result.content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: block.input\n });\n }\n }\n\n if (toolCalls.length > 0) {\n result.toolCalls = toolCalls;\n }\n\n // 处理使用统计\n if (data.usage) {\n const usage = data.usage;\n // Anthropic 的 input_tokens 已扣除缓存命中的部分\n // 完整的上下文大小 = input_tokens + cache_read_input_tokens\n const actualInputTokens = usage.input_tokens + (usage.cache_read_input_tokens || 0);\n result.usage = {\n promptTokens: actualInputTokens,\n completionTokens: usage.output_tokens,\n totalTokens: actualInputTokens + usage.output_tokens\n };\n }\n\n return result;\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const { system, messages } = this.extractSystemMessage(params.messages);\n const transformedMessages = this.transformAnthropicMessages(messages);\n\n const defaultMaxTokens =\n this.capabilities?.maxOutputTokens ?? DEFAULT_ADAPTER_CAPABILITIES.maxOutputTokens;\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: params.maxTokens ?? defaultMaxTokens,\n messages: transformedMessages,\n stream,\n ...(system && { system }),\n ...(params.temperature !== undefined && { temperature: params.temperature })\n };\n\n // 添加工具\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters\n }));\n }\n\n const mergedMetadata = this.mergeAnthropicMetadata(params);\n if (mergedMetadata && Object.keys(mergedMetadata).length > 0) {\n body.metadata = mergedMetadata;\n }\n\n return body;\n }\n\n /**\n * Build Messages API `metadata`: `sessionId` → `user_id`, merged with resolved adapter `metadata` (dict or fn).\n * Config `metadata` keys override `user_id` when duplicated.\n */\n private mergeAnthropicMetadata(params: ModelParams): Record<string, unknown> | undefined {\n const extra = this.resolveMetadataExtra(params);\n const hasSession = params.sessionId !== undefined && params.sessionId !== '';\n if (!hasSession && extra === undefined) {\n return undefined;\n }\n const merged: Record<string, unknown> = {};\n if (hasSession) {\n merged.user_id = params.sessionId;\n }\n if (extra !== undefined) {\n Object.assign(merged, extra);\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n private resolveMetadataExtra(params: ModelParams): Record<string, unknown> | undefined {\n const raw = this.requestMetadata;\n if (raw == null) {\n return undefined;\n }\n if (typeof raw === 'function') {\n const v = raw(params);\n if (\n typeof v !== 'object' ||\n v === null ||\n Array.isArray(v) ||\n Object.keys(v).length === 0\n ) {\n return undefined;\n }\n return { ...v };\n }\n if (typeof raw === 'object' && !Array.isArray(raw) && Object.keys(raw).length > 0) {\n return { ...raw };\n }\n return undefined;\n }\n\n private extractSystemMessage(messages: ModelParams['messages']): {\n system?: string;\n messages: ModelParams['messages'];\n } {\n const systemMessages = messages.filter(m => m.role === 'system');\n const otherMessages = messages.filter(m => m.role !== 'system');\n\n // 合并多条 system 消息为一条\n const combinedSystem = systemMessages.length > 0\n ? systemMessages.map(m => m.content as string).join('\\n\\n')\n : undefined;\n\n return {\n system: combinedSystem,\n messages: otherMessages\n };\n }\n\n private transformAnthropicMessages(messages: ModelParams['messages']): unknown[] {\n return messages.map(msg => {\n const transformed: Record<string, unknown> = {\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n content: []\n };\n\n if (typeof msg.content === 'string') {\n transformed.content = [{ type: 'text', text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n // 处理 ContentPart 数组\n const contentParts: any[] = [];\n for (const part of msg.content) {\n if (part.type === 'thinking') {\n contentParts.push(part);\n } else if (part.type === 'text') {\n contentParts.push({ type: 'text', text: (part as any).text });\n } else {\n contentParts.push(part);\n }\n }\n transformed.content = contentParts;\n\n // 如果过滤后为空,设置空字符串\n if (contentParts.length === 0) {\n transformed.content = '';\n }\n }\n\n // 处理工具调用\n if (msg.toolCalls && msg.role === 'assistant') {\n for (const tc of msg.toolCalls) {\n (transformed.content as any[]).push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments\n });\n }\n }\n\n // 处理工具结果\n if (msg.role === 'tool' && msg.toolCallId) {\n transformed.role = 'user';\n transformed.content = [{\n type: 'tool_result',\n tool_use_id: msg.toolCallId,\n content: msg.content\n }];\n }\n\n return transformed;\n });\n }\n\n /**\n * 发起 POST;按 `fetchRetry` 对网络错误与 429/502/503/504 重试(不含响应体已开始消费后的 SSE 读失败)。\n */\n private async fetch(\n path: string,\n body: unknown,\n operation: 'stream' | 'complete',\n params: ModelParams\n ): Promise<Response> {\n const requestLog = logModelRequestStart(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n body,\n { httpMaxAttempts: this.fetchRetry.maxAttempts }\n );\n const url = `${this.baseUrl}${path}`;\n const init: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.version\n },\n body: JSON.stringify(body),\n signal: params.signal\n };\n\n for (let attempt = 0; attempt < this.fetchRetry.maxAttempts; attempt++) {\n const httpAttemptMeta = {\n httpAttempt: attempt + 1,\n httpMaxAttempts: this.fetchRetry.maxAttempts\n };\n\n if (params.signal?.aborted) {\n logModelRequestFailure(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n new DOMException('The operation was aborted.', 'AbortError'),\n { httpMaxAttempts: this.fetchRetry.maxAttempts }\n );\n throw new DOMException('The operation was aborted.', 'AbortError');\n }\n\n try {\n const response = await globalThis.fetch(url, init);\n if (response.ok) {\n logModelRequestEnd(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n response,\n httpAttemptMeta\n );\n return response;\n }\n\n const canRetryHttp =\n attempt < this.fetchRetry.maxAttempts - 1 && isRetriableHttpStatus(response.status);\n if (canRetryHttp) {\n await drainResponseBody(response);\n const fromHeader = parseRetryAfterMs(response.headers.get('Retry-After'));\n const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);\n const waitMs =\n fromHeader != null\n ? Math.min(fromHeader, this.fetchRetry.maxDelayMs)\n : backoff;\n await delay(waitMs, params.signal);\n continue;\n }\n\n logModelRequestEnd(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n response,\n httpAttemptMeta\n );\n return response;\n } catch (e) {\n if (isAbortError(e) || params.signal?.aborted) {\n logModelRequestFailure(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n e,\n httpAttemptMeta\n );\n throw e;\n }\n if (attempt < this.fetchRetry.maxAttempts - 1 && isRetriableFetchError(e)) {\n const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);\n await delay(backoff, params.signal);\n continue;\n }\n logModelRequestFailure(\n {\n provider: 'anthropic',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n e,\n httpAttemptMeta\n );\n throw e;\n }\n }\n\n throw new Error('Anthropic fetch: unexpected retry loop exit');\n }\n\n private safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n }\n}\n\n/**\n * 创建 Anthropic 适配器\n */\nexport function createAnthropic(config?: AnthropicConfig): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult,\n ContentPart\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { DEFAULT_ADAPTER_CAPABILITIES } from './default-capabilities.js';\nimport {\n logModelRequestEnd,\n logModelRequestFailure,\n logModelRequestStart,\n logModelStreamParseError\n} from './model-request-log.js';\n\n/**\n * Ollama `/api/chat` `think` parameter (see https://docs.ollama.com/capabilities/thinking).\n */\nexport type OllamaThinkOption = boolean | 'low' | 'medium' | 'high';\n\n/**\n * Ollama 配置\n */\nexport interface OllamaConfig {\n baseUrl?: string;\n model?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n /**\n * When set, sent as top-level `think` on `/api/chat`.\n * Omit to use the server default for the model.\n */\n think?: OllamaThinkOption;\n}\n\n/**\n * Map one Ollama `/api/chat` stream JSON object to stream chunks (thinking before text).\n * @internal Exported for unit tests.\n */\nexport function ollamaStreamChunksFromChatData(\n data: Record<string, unknown>,\n parseToolArguments: (args: unknown) => Record<string, unknown>,\n nextToolCallId: () => string\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n const msg = data.message as Record<string, unknown> | undefined;\n if (!msg) return chunks;\n\n const thinking = msg.thinking;\n if (typeof thinking === 'string' && thinking.length > 0) {\n chunks.push({ type: 'thinking', content: thinking });\n }\n\n const content = msg.content;\n if (typeof content === 'string' && content.length > 0) {\n chunks.push({ type: 'text', content });\n }\n\n const toolCalls = msg.tool_calls as unknown[] | undefined;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n const t = tc as Record<string, unknown>;\n const fn = t.function as Record<string, unknown> | undefined;\n chunks.push({\n type: 'tool_call',\n toolCall: {\n id: nextToolCallId(),\n name: (typeof fn?.name === 'string' ? fn.name : '') || '',\n arguments: parseToolArguments(fn?.arguments)\n }\n });\n }\n }\n\n return chunks;\n}\n\n/**\n * Ollama `/api/chat` requires string `content` on each message. The Agent may persist assistant\n * turns as `ContentPart[]` (e.g. thinking + text); replay only `text` parts so the JSON matches\n * Ollama's schema (thinking is not re-sent; the model produces a new trace each request).\n */\nexport function ollamaMessageContentToApiString(content: string | ContentPart[]): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n const texts: string[] = [];\n for (const part of content) {\n if (part.type === 'text') {\n texts.push(part.text);\n }\n }\n return texts.join('\\n\\n');\n}\n\n/** Stable unique id for tool calls in a single adapter response (non-stream complete). */\nfunction uniqueOllamaToolCallId(batchMs: number, index: number): string {\n return `ollama_${batchMs}_${index}_${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Ollama 模型适配器 (本地模型)\n */\nexport class OllamaAdapter extends BaseModelAdapter {\n readonly name: string;\n private baseUrl: string;\n private model: string;\n private readonly think: OllamaThinkOption | undefined;\n\n constructor(config: OllamaConfig = {}) {\n super();\n this.baseUrl = config.baseUrl || process.env.OLLAMA_BASE_URL || 'http://localhost:11434';\n this.model = config.model || 'qwen3.5:0.8b';\n this.think = config.think;\n\n this.name = `ollama/${this.model}`;\n\n this.capabilities = config.capabilities ?? DEFAULT_ADAPTER_CAPABILITIES;\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/api/chat', body, 'stream', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n const nextToolCallId = (): string => `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const data = JSON.parse(trimmed) as Record<string, unknown>;\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n const messageChunks = ollamaStreamChunksFromChatData(\n data,\n (args) => this.parseToolArguments(args),\n nextToolCallId\n );\n for (const chunk of messageChunks) {\n yield { ...chunk, ...raw };\n }\n\n // 处理完成\n if (data.done) {\n if (data.prompt_eval_count || data.eval_count) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: (data.prompt_eval_count as number) || 0,\n completionTokens: (data.eval_count as number) || 0,\n totalTokens:\n ((data.prompt_eval_count as number) || 0) + ((data.eval_count as number) || 0)\n }\n },\n ...raw\n };\n }\n yield { type: 'done', ...raw };\n }\n } catch (error) {\n logModelStreamParseError(\n {\n provider: 'ollama',\n model: this.model,\n path: '/api/chat',\n operation: 'stream',\n params\n },\n trimmed,\n error\n );\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/api/chat', body, 'complete', params);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const result: CompletionResult = {\n content: data.message?.content || ''\n };\n\n const thinking = data.message?.thinking;\n if (typeof thinking === 'string' && thinking.length > 0) {\n result.thinking = thinking;\n }\n\n // 处理工具调用(同一毫秒内多条也需唯一 id)\n if (data.message?.tool_calls) {\n const batchMs = Date.now();\n result.toolCalls = data.message.tool_calls.map((tc: any, index: number) => ({\n id: uniqueOllamaToolCallId(batchMs, index),\n name: tc.function?.name || '',\n arguments: this.parseToolArguments(tc.function?.arguments)\n }));\n }\n\n // 处理使用统计\n if (data.prompt_eval_count || data.eval_count) {\n result.usage = {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n };\n }\n\n return result;\n }\n\n private parseToolArguments(args: unknown): Record<string, unknown> {\n if (args == null) return {};\n if (typeof args === 'object' && !Array.isArray(args)) return args as Record<string, unknown>;\n if (typeof args === 'string') {\n try {\n const parsed = JSON.parse(args);\n return typeof parsed === 'object' && parsed !== null ? parsed : { value: parsed };\n } catch {\n return {};\n }\n }\n return {};\n }\n\n /**\n * Ollama 要求 tool_calls.function.arguments 为对象,而非 JSON 字符串。\n * 工具结果消息使用 tool_name(见 https://docs.ollama.com/capabilities/tool-calling ),非 OpenAI 的 tool_call_id。\n */\n protected override transformMessages(messages: ModelParams['messages']): unknown[] {\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n toolCallIdToName.set(tc.id, tc.name);\n }\n }\n }\n\n return messages.map(msg => {\n if (msg.role === 'tool' && msg.toolCallId) {\n const toolName = toolCallIdToName.get(msg.toolCallId) ?? msg.name;\n return {\n role: 'tool' as const,\n content: ollamaMessageContentToApiString(msg.content as string | ContentPart[]),\n ...(toolName && { tool_name: toolName })\n };\n }\n\n return {\n role: msg.role,\n content: ollamaMessageContentToApiString(msg.content),\n ...(msg.toolCalls && { tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: this.parseToolArguments(tc.arguments)\n }\n }))})\n };\n });\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const defaultMaxTokens =\n this.capabilities?.maxOutputTokens ?? DEFAULT_ADAPTER_CAPABILITIES.maxOutputTokens;\n const options: Record<string, unknown> = {\n num_predict: params.maxTokens ?? defaultMaxTokens\n };\n if (params.temperature !== undefined) {\n options.temperature = params.temperature;\n }\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages: this.transformMessages(params.messages),\n stream,\n options\n };\n\n if (this.think !== undefined) {\n body.think = this.think;\n }\n\n // 与 OpenAI 一致:每项为 { type: 'function', function: { name, description, parameters } }\n // 参见 https://docs.ollama.com/api/chat ToolDefinition\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n type: 'function' as const,\n function: tool\n }));\n }\n\n return body;\n }\n\n private async fetch(\n path: string,\n body: unknown,\n operation: 'stream' | 'complete',\n params: ModelParams\n ): Promise<Response> {\n const requestLog = logModelRequestStart({\n provider: 'ollama',\n model: this.model,\n path,\n operation,\n params\n }, body);\n try {\n const response = await globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body),\n signal: params.signal\n });\n logModelRequestEnd(\n {\n provider: 'ollama',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n response\n );\n return response;\n } catch (error) {\n logModelRequestFailure(\n {\n provider: 'ollama',\n model: this.model,\n path,\n operation,\n params\n },\n requestLog,\n error\n );\n throw error;\n }\n }\n}\n\n/**\n * 创建 Ollama 模型适配器\n */\nexport function createOllama(config?: OllamaConfig): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","/**\n * 当前 `process.env` 中值为 string 的键的快照,再叠 `overrides`(后者覆盖同名键)。\n * 供应用层构造 model(如显式传入 `apiKey`)与 Agent 内部合并 MCP stdio 环境共用。\n *\n * 注意:快照包含当前进程 environ 中的敏感变量;传入 MCP 子进程时由调用方控制 `env` / `overrides`。\n */\nexport function mergeProcessEnv(overrides?: Record<string, string>): Record<string, string> {\n const base: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n base[key] = value;\n }\n }\n return overrides ? { ...base, ...overrides } : base;\n}\n\n/**\n * stdio MCP 子进程环境:`process.env` + 可选 Agent 级 `env` + 可选单服务 `MCPServerConfig.env`(优先级递增)。\n */\nexport function mergeMcpStdioEnv(\n agentEnv?: Record<string, string>,\n serverEnv?: Record<string, string>\n): Record<string, string> {\n const merged = mergeProcessEnv(agentEnv);\n return serverEnv ? { ...merged, ...serverEnv } : merged;\n}\n","// Model adapters\nexport { DEFAULT_ADAPTER_CAPABILITIES } from './default-capabilities.js';\nexport {\n BaseModelAdapter,\n zodToJsonSchema,\n toolsToModelSchema,\n mergeTokenUsage\n} from './base.js';\nexport type { ZodToJsonSchemaOptions } from './base.js';\nexport { OpenAIAdapter, createOpenAI } from './openai.js';\nexport type { OpenAIConfig } from './openai.js';\nexport { AnthropicAdapter, createAnthropic } from './anthropic.js';\nexport type {\n AnthropicConfig,\n AnthropicRequestMetadata,\n AnthropicFetchRetryOptions\n} from './anthropic.js';\nexport { OllamaAdapter, createOllama } from './ollama.js';\nexport type { OllamaConfig, OllamaThinkOption } from './ollama.js';\nexport { ollamaStreamChunksFromChatData, ollamaMessageContentToApiString } from './ollama.js';\n\nimport type { ModelAdapter } from '../core/types.js';\nimport { mergeProcessEnv } from '../core/process-env-merge.js';\nimport { OpenAIAdapter } from './openai.js';\nimport { AnthropicAdapter } from './anthropic.js';\nimport { OllamaAdapter } from './ollama.js';\nimport type { OllamaThinkOption } from './ollama.js';\n\nexport type ModelProvider = 'openai' | 'anthropic' | 'ollama';\n\nexport interface CreateModelConfig {\n provider: ModelProvider;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n /** Ollama only: passed as `think` on `/api/chat`. */\n think?: OllamaThinkOption;\n}\n\n/**\n * 创建模型适配器。\n * 若传入 `agentEnv`,先与当前进程环境合并(`mergeProcessEnv`),再解析各提供商的默认密钥/URL;省略时等价于仅使用 `process.env` 快照。\n */\nexport function createModel(\n modelConfig: CreateModelConfig,\n agentEnv?: Record<string, string>\n): ModelAdapter {\n const merged = mergeProcessEnv(agentEnv);\n switch (modelConfig.provider) {\n case 'openai':\n return new OpenAIAdapter({\n apiKey: modelConfig.apiKey || merged.OPENAI_API_KEY || '',\n baseUrl: modelConfig.baseUrl || merged.OPENAI_BASE_URL,\n model: modelConfig.model,\n organization: merged.OPENAI_ORG_ID\n });\n case 'anthropic':\n return new AnthropicAdapter({\n apiKey: modelConfig.apiKey || merged.ANTHROPIC_API_KEY || '',\n baseUrl: modelConfig.baseUrl || merged.ANTHROPIC_BASE_URL,\n model: modelConfig.model\n });\n case 'ollama':\n return new OllamaAdapter({\n baseUrl: modelConfig.baseUrl || merged.OLLAMA_BASE_URL,\n model: modelConfig.model,\n think: modelConfig.think\n });\n }\n throw new Error(`Unknown model provider: ${(modelConfig as { provider: string }).provider}`);\n}\n"]}
|
|
@@ -261,10 +261,12 @@ var ToolRegistry = class {
|
|
|
261
261
|
outputHandler;
|
|
262
262
|
hookManager = null;
|
|
263
263
|
executionPolicy;
|
|
264
|
+
hookObserver;
|
|
264
265
|
constructor(config) {
|
|
265
266
|
const enableOutputHandler = config?.enableOutputHandler !== false;
|
|
266
267
|
this.outputHandler = enableOutputHandler ? createOutputHandler(config?.userBasePath) : null;
|
|
267
268
|
this.executionPolicy = config?.executionPolicy;
|
|
269
|
+
this.hookObserver = config?.hookObserver;
|
|
268
270
|
}
|
|
269
271
|
/**
|
|
270
272
|
* 工具名是否在 {@link ToolExecutionPolicy.disallowedTools} 中(无策略时为 false)。
|
|
@@ -331,6 +333,14 @@ var ToolRegistry = class {
|
|
|
331
333
|
...extra
|
|
332
334
|
};
|
|
333
335
|
}
|
|
336
|
+
hookObserverCtx(eventType, name, options) {
|
|
337
|
+
return {
|
|
338
|
+
eventType,
|
|
339
|
+
toolName: name,
|
|
340
|
+
toolCallId: options?.toolCallId,
|
|
341
|
+
projectDir: options?.projectDir
|
|
342
|
+
};
|
|
343
|
+
}
|
|
334
344
|
/**
|
|
335
345
|
* 注册工具
|
|
336
346
|
*/
|
|
@@ -401,6 +411,11 @@ var ToolRegistry = class {
|
|
|
401
411
|
}
|
|
402
412
|
const tool = this.tools.get(name);
|
|
403
413
|
if (!tool) {
|
|
414
|
+
if (hookMgr) {
|
|
415
|
+
this.hookObserver?.onHookStart?.(
|
|
416
|
+
this.hookObserverCtx("postToolUseFailure", name, options)
|
|
417
|
+
);
|
|
418
|
+
}
|
|
404
419
|
const ctx = this.buildHookContext("postToolUseFailure", name, rawArgsObj, options, {
|
|
405
420
|
errorMessage: `Tool "${name}" not found`,
|
|
406
421
|
failureKind: "tool_error"
|
|
@@ -416,6 +431,11 @@ var ToolRegistry = class {
|
|
|
416
431
|
const initial = tool.parameters.safeParse(args);
|
|
417
432
|
if (!initial.success) {
|
|
418
433
|
const msg = `Invalid arguments for tool "${name}": ${initial.error.issues.map((i) => i.message).join(", ")}`;
|
|
434
|
+
if (hookMgr) {
|
|
435
|
+
this.hookObserver?.onHookStart?.(
|
|
436
|
+
this.hookObserverCtx("postToolUseFailure", name, options)
|
|
437
|
+
);
|
|
438
|
+
}
|
|
419
439
|
await hookMgr?.executePostToolUseFailure(
|
|
420
440
|
this.buildHookContext("postToolUseFailure", name, rawArgsObj, options, {
|
|
421
441
|
errorMessage: msg,
|
|
@@ -426,9 +446,17 @@ var ToolRegistry = class {
|
|
|
426
446
|
}
|
|
427
447
|
workingInput = initial.data;
|
|
428
448
|
if (hookMgr) {
|
|
449
|
+
this.hookObserver?.onHookStart?.(
|
|
450
|
+
this.hookObserverCtx("preToolUse", name, options)
|
|
451
|
+
);
|
|
429
452
|
const pre = await hookMgr.executePreToolUse(
|
|
430
453
|
this.buildHookContext("preToolUse", name, workingInput, options)
|
|
431
454
|
);
|
|
455
|
+
this.hookObserver?.onHookDecision?.({
|
|
456
|
+
...this.hookObserverCtx("preToolUse", name, options),
|
|
457
|
+
allowed: pre.allowed,
|
|
458
|
+
reason: pre.reason
|
|
459
|
+
});
|
|
432
460
|
if (!pre.allowed) {
|
|
433
461
|
return {
|
|
434
462
|
content: pre.reason ?? "Blocked by hook",
|
|
@@ -438,6 +466,9 @@ var ToolRegistry = class {
|
|
|
438
466
|
const merged = tool.parameters.safeParse(pre.updatedInput ?? workingInput);
|
|
439
467
|
if (!merged.success) {
|
|
440
468
|
const msg = `Invalid arguments after hook merge for tool "${name}": ${merged.error.issues.map((i) => i.message).join(", ")}`;
|
|
469
|
+
this.hookObserver?.onHookStart?.(
|
|
470
|
+
this.hookObserverCtx("postToolUseFailure", name, options)
|
|
471
|
+
);
|
|
441
472
|
await hookMgr.executePostToolUseFailure(
|
|
442
473
|
this.buildHookContext("postToolUseFailure", name, workingInput, options, {
|
|
443
474
|
errorMessage: msg,
|
|
@@ -457,6 +488,11 @@ var ToolRegistry = class {
|
|
|
457
488
|
const result = await tool.handler(handlerArgs, executionContext);
|
|
458
489
|
const toolResultRaw = result;
|
|
459
490
|
if (result.isError) {
|
|
491
|
+
if (hookMgr) {
|
|
492
|
+
this.hookObserver?.onHookStart?.(
|
|
493
|
+
this.hookObserverCtx("postToolUseFailure", name, options)
|
|
494
|
+
);
|
|
495
|
+
}
|
|
460
496
|
await hookMgr?.executePostToolUseFailure(
|
|
461
497
|
this.buildHookContext("postToolUseFailure", name, workingInput, options, {
|
|
462
498
|
errorMessage: result.content,
|
|
@@ -474,6 +510,11 @@ var ToolRegistry = class {
|
|
|
474
510
|
{ args: handlerArgs }
|
|
475
511
|
);
|
|
476
512
|
}
|
|
513
|
+
if (hookMgr) {
|
|
514
|
+
this.hookObserver?.onHookStart?.(
|
|
515
|
+
this.hookObserverCtx("postToolUse", name, options)
|
|
516
|
+
);
|
|
517
|
+
}
|
|
477
518
|
await hookMgr?.executePostToolUse(
|
|
478
519
|
this.buildHookContext("postToolUse", name, workingInput, options, {
|
|
479
520
|
toolResultRaw,
|
|
@@ -483,6 +524,11 @@ var ToolRegistry = class {
|
|
|
483
524
|
return finalResult;
|
|
484
525
|
} catch (error) {
|
|
485
526
|
const msg = `Error executing tool "${name}": ${error instanceof Error ? error.message : String(error)}`;
|
|
527
|
+
if (hookMgr) {
|
|
528
|
+
this.hookObserver?.onHookStart?.(
|
|
529
|
+
this.hookObserverCtx("postToolUseFailure", name, options)
|
|
530
|
+
);
|
|
531
|
+
}
|
|
486
532
|
await hookMgr?.executePostToolUseFailure(
|
|
487
533
|
this.buildHookContext("postToolUseFailure", name, workingInput, options, {
|
|
488
534
|
errorMessage: msg,
|
|
@@ -2143,128 +2189,52 @@ var webSearchTool = createTool({
|
|
|
2143
2189
|
function getWebTools() {
|
|
2144
2190
|
return [webFetchTool, webSearchTool];
|
|
2145
2191
|
}
|
|
2146
|
-
var
|
|
2147
|
-
var
|
|
2148
|
-
|
|
2149
|
-
name: "TaskCreate",
|
|
2192
|
+
var todoStatusEnum = zod.z.enum(["pending", "in_progress", "completed"]);
|
|
2193
|
+
var todoWriteTool = createTool({
|
|
2194
|
+
name: "TodoWrite",
|
|
2150
2195
|
category: "planning",
|
|
2151
|
-
description: `
|
|
2152
|
-
|
|
2153
|
-
## When to Use This Tool
|
|
2196
|
+
description: `MUST USE for multi-step tasks. Creates a structured task list to track progress. Call this tool FIRST before executing any complex task.
|
|
2154
2197
|
|
|
2155
|
-
|
|
2156
|
-
- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations
|
|
2157
|
-
- User explicitly requests todo list - When the user directly asks you to use the task list
|
|
2158
|
-
- User provides multiple tasks - When users provide a list of things to be done
|
|
2198
|
+
Any number of tasks may be "in_progress" when work runs in parallel. Zero in_progress is fine (e.g. all pending or all completed).
|
|
2159
2199
|
|
|
2160
|
-
|
|
2200
|
+
**Before you finish your assistant response for a multi-step request**, call \`TodoWrite\` again so **every** item in the list has status \`completed\`, unless you are explicitly pausing mid-work for a follow-up turn. Do not leave dangling \`pending\` or \`in_progress\` items when the work for this request is done.
|
|
2161
2201
|
|
|
2162
|
-
|
|
2163
|
-
- The task is trivial and tracking it provides no organizational benefit
|
|
2164
|
-
- The task can be completed in less than 3 trivial steps
|
|
2202
|
+
**Replanning:** If execution shows the earlier plan was wrong, incomplete, or no longer fits (wrong order, missing steps, obsolete items), call \`TodoWrite\` anytime with an updated full list\u2014add, remove, merge, or rewrite steps as needed.
|
|
2165
2203
|
|
|
2166
|
-
|
|
2204
|
+
Triggers: multi-step tasks, multiple files/components, user provides task list.
|
|
2205
|
+
Skip: single simple task, informational questions.`,
|
|
2167
2206
|
parameters: zod.z.object({
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
...activeForm && { activeForm }
|
|
2180
|
-
};
|
|
2181
|
-
tasks.set(id, task);
|
|
2182
|
-
return {
|
|
2183
|
-
content: `Task created [${id}]: ${subject}`,
|
|
2184
|
-
metadata: { task }
|
|
2185
|
-
};
|
|
2186
|
-
}
|
|
2187
|
-
});
|
|
2188
|
-
var taskUpdateTool = createTool({
|
|
2189
|
-
name: "TaskUpdate",
|
|
2190
|
-
category: "planning",
|
|
2191
|
-
description: `Use this tool to update a task in the task list.
|
|
2192
|
-
|
|
2193
|
-
## When to Use This Tool
|
|
2194
|
-
|
|
2195
|
-
**Mark tasks as completed:**
|
|
2196
|
-
- When you have completed the work described in a task
|
|
2197
|
-
- IMPORTANT: Always mark your assigned tasks as completed when you finish them
|
|
2198
|
-
|
|
2199
|
-
**Delete tasks:**
|
|
2200
|
-
- When a task is no longer relevant or was created in error
|
|
2201
|
-
|
|
2202
|
-
## Status Workflow
|
|
2203
|
-
|
|
2204
|
-
Status progresses: pending \u2192 in_progress \u2192 completed`,
|
|
2205
|
-
parameters: zod.z.object({
|
|
2206
|
-
taskId: zod.z.string().describe("The ID of the task to update"),
|
|
2207
|
-
status: zod.z.enum(["pending", "in_progress", "completed", "deleted"]).optional().describe("New status for the task"),
|
|
2208
|
-
subject: zod.z.string().optional().describe("New subject for the task"),
|
|
2209
|
-
description: zod.z.string().optional().describe("New description for the task"),
|
|
2210
|
-
activeForm: zod.z.string().optional().describe("Present continuous form shown in spinner when in_progress")
|
|
2207
|
+
todos: zod.z.array(
|
|
2208
|
+
zod.z.object({
|
|
2209
|
+
content: zod.z.string().describe('Brief description of the task in imperative form (e.g., "Run tests")'),
|
|
2210
|
+
activeForm: zod.z.string().optional().describe(
|
|
2211
|
+
'Optional present-continuous label for in-progress UI (e.g., "Running tests"). Omit if not needed.'
|
|
2212
|
+
),
|
|
2213
|
+
status: todoStatusEnum.describe("Task status: pending, in_progress, or completed")
|
|
2214
|
+
})
|
|
2215
|
+
).min(1).describe(
|
|
2216
|
+
"Full updated todo list. Refresh this whenever progress or the plan changes. When finishing the multi-step work, all entries should be completed."
|
|
2217
|
+
)
|
|
2211
2218
|
}),
|
|
2212
|
-
handler: async ({
|
|
2213
|
-
const task = tasks.get(taskId);
|
|
2214
|
-
if (!task) {
|
|
2215
|
-
return {
|
|
2216
|
-
content: `Task ${taskId} not found`,
|
|
2217
|
-
isError: true
|
|
2218
|
-
};
|
|
2219
|
-
}
|
|
2220
|
-
if (status === "deleted") {
|
|
2221
|
-
tasks.delete(taskId);
|
|
2222
|
-
return { content: `Task ${taskId} deleted` };
|
|
2223
|
-
}
|
|
2224
|
-
if (status) task.status = status;
|
|
2225
|
-
if (subject) task.subject = subject;
|
|
2226
|
-
if (description) task.description = description;
|
|
2227
|
-
if (activeForm) task.activeForm = activeForm;
|
|
2228
|
-
const icon = task.status === "completed" ? "x" : task.status === "in_progress" ? ">" : " ";
|
|
2229
|
-
return {
|
|
2230
|
-
content: `Task [${taskId}] updated: [${icon}] ${task.subject}`,
|
|
2231
|
-
metadata: { task }
|
|
2232
|
-
};
|
|
2233
|
-
}
|
|
2234
|
-
});
|
|
2235
|
-
var taskListTool = createTool({
|
|
2236
|
-
name: "TaskList",
|
|
2237
|
-
category: "planning",
|
|
2238
|
-
description: `Use this tool to list all tasks in the task list.
|
|
2239
|
-
|
|
2240
|
-
## Output
|
|
2241
|
-
|
|
2242
|
-
Returns a summary of each task:
|
|
2243
|
-
- id: Task identifier (use with TaskUpdate)
|
|
2244
|
-
- subject: Brief description of the task
|
|
2245
|
-
- status: pending, in_progress, or completed`,
|
|
2246
|
-
parameters: zod.z.object({}),
|
|
2247
|
-
handler: async () => {
|
|
2248
|
-
if (tasks.size === 0) {
|
|
2249
|
-
return { content: "No tasks in the list." };
|
|
2250
|
-
}
|
|
2219
|
+
handler: async ({ todos }) => {
|
|
2251
2220
|
const lines = [];
|
|
2252
|
-
for (const
|
|
2253
|
-
const icon =
|
|
2254
|
-
lines.push(`[${icon}]
|
|
2221
|
+
for (const todo of todos) {
|
|
2222
|
+
const icon = todo.status === "completed" ? "x" : todo.status === "in_progress" ? ">" : " ";
|
|
2223
|
+
lines.push(`[${icon}] ${todo.content}`);
|
|
2255
2224
|
}
|
|
2256
|
-
const pending =
|
|
2257
|
-
const inProgress =
|
|
2258
|
-
const completed =
|
|
2225
|
+
const pending = todos.filter((todo) => todo.status === "pending").length;
|
|
2226
|
+
const inProgress = todos.filter((todo) => todo.status === "in_progress").length;
|
|
2227
|
+
const completed = todos.filter((todo) => todo.status === "completed").length;
|
|
2259
2228
|
return {
|
|
2260
|
-
content: `
|
|
2229
|
+
content: `Task list updated (${completed} completed, ${inProgress} in progress, ${pending} pending):
|
|
2261
2230
|
|
|
2262
|
-
${lines.join("\n")}
|
|
2231
|
+
${lines.join("\n")}`,
|
|
2232
|
+
metadata: { todos }
|
|
2263
2233
|
};
|
|
2264
2234
|
}
|
|
2265
2235
|
});
|
|
2266
|
-
function
|
|
2267
|
-
return [
|
|
2236
|
+
function getPlanningTools() {
|
|
2237
|
+
return [todoWriteTool];
|
|
2268
2238
|
}
|
|
2269
2239
|
var questionsSchema = zod.z.object({
|
|
2270
2240
|
questions: zod.z.array(
|
|
@@ -2475,7 +2445,7 @@ function getAllBuiltinTools(skillRegistry, interactionOptions) {
|
|
|
2475
2445
|
...getShellTools(),
|
|
2476
2446
|
...getGrepTools(),
|
|
2477
2447
|
...getWebTools(),
|
|
2478
|
-
...
|
|
2448
|
+
...getPlanningTools(),
|
|
2479
2449
|
...getInteractionTools(interactionOptions),
|
|
2480
2450
|
...getSubagentTools(),
|
|
2481
2451
|
...getSkillTools(skillRegistry)
|
|
@@ -2914,11 +2884,11 @@ exports.getFileSystemTools = getFileSystemTools;
|
|
|
2914
2884
|
exports.getGlobalRegistry = getGlobalRegistry;
|
|
2915
2885
|
exports.getGrepTools = getGrepTools;
|
|
2916
2886
|
exports.getInteractionTools = getInteractionTools;
|
|
2887
|
+
exports.getPlanningTools = getPlanningTools;
|
|
2917
2888
|
exports.getSafeBuiltinTools = getSafeBuiltinTools;
|
|
2918
2889
|
exports.getShellTools = getShellTools;
|
|
2919
2890
|
exports.getSkillTools = getSkillTools;
|
|
2920
2891
|
exports.getSubagentTools = getSubagentTools;
|
|
2921
|
-
exports.getTaskTools = getTaskTools;
|
|
2922
2892
|
exports.getWebTools = getWebTools;
|
|
2923
2893
|
exports.globTool = globTool;
|
|
2924
2894
|
exports.grepTool = grepTool;
|
|
@@ -2930,12 +2900,10 @@ exports.parseHooksSettingsFile = parseHooksSettingsFile;
|
|
|
2930
2900
|
exports.questionTool = questionTool;
|
|
2931
2901
|
exports.readFileTool = readFileTool;
|
|
2932
2902
|
exports.subagentRequestSchema = subagentRequestSchema;
|
|
2933
|
-
exports.
|
|
2934
|
-
exports.taskListTool = taskListTool;
|
|
2935
|
-
exports.taskUpdateTool = taskUpdateTool;
|
|
2903
|
+
exports.todoWriteTool = todoWriteTool;
|
|
2936
2904
|
exports.truncateMatchLineForDisplay = truncateMatchLineForDisplay;
|
|
2937
2905
|
exports.webFetchTool = webFetchTool;
|
|
2938
2906
|
exports.webSearchTool = webSearchTool;
|
|
2939
2907
|
exports.writeFileTool = writeFileTool;
|
|
2940
|
-
//# sourceMappingURL=chunk-
|
|
2941
|
-
//# sourceMappingURL=chunk-
|
|
2908
|
+
//# sourceMappingURL=chunk-Z45DHTDX.cjs.map
|
|
2909
|
+
//# sourceMappingURL=chunk-Z45DHTDX.cjs.map
|