@ddlqhd/agent-sdk 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +2 -1
  2. package/dist/{chunk-742JTNYI.js → chunk-D3UZNLZO.js} +570 -77
  3. package/dist/chunk-D3UZNLZO.js.map +1 -0
  4. package/dist/{chunk-AJD3DTL7.cjs → chunk-JXAJQGV5.cjs} +756 -107
  5. package/dist/chunk-JXAJQGV5.cjs.map +1 -0
  6. package/dist/{chunk-DQFTAD3I.cjs → chunk-NYZD3THB.cjs} +573 -76
  7. package/dist/chunk-NYZD3THB.cjs.map +1 -0
  8. package/dist/{chunk-Q3L4GIBG.cjs → chunk-P2X3AMDK.cjs} +115 -117
  9. package/dist/chunk-P2X3AMDK.cjs.map +1 -0
  10. package/dist/{chunk-THKEF32L.js → chunk-TKUPLTGJ.js} +110 -114
  11. package/dist/chunk-TKUPLTGJ.js.map +1 -0
  12. package/dist/{chunk-DXMVWGLJ.js → chunk-UHENMHUS.js} +744 -100
  13. package/dist/chunk-UHENMHUS.js.map +1 -0
  14. package/dist/cli/index.cjs +40 -31
  15. package/dist/cli/index.cjs.map +1 -1
  16. package/dist/cli/index.js +14 -5
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/{index-DGPDMbW5.d.cts → index-CnrY1ZA2.d.ts} +36 -14
  19. package/dist/{index-nEfayAzD.d.ts → index-DzBt4ewK.d.cts} +36 -14
  20. package/dist/index.cjs +128 -88
  21. package/dist/index.d.cts +42 -22
  22. package/dist/index.d.ts +42 -22
  23. package/dist/index.js +3 -3
  24. package/dist/models/index.cjs +14 -10
  25. package/dist/models/index.d.cts +7 -2
  26. package/dist/models/index.d.ts +7 -2
  27. package/dist/models/index.js +1 -1
  28. package/dist/tools/index.cjs +65 -57
  29. package/dist/tools/index.d.cts +3 -3
  30. package/dist/tools/index.d.ts +3 -3
  31. package/dist/tools/index.js +1 -1
  32. package/dist/{types-BLf9IqRs.d.cts → types-BUwjMwNH.d.cts} +279 -13
  33. package/dist/{types-BLf9IqRs.d.ts → types-BUwjMwNH.d.ts} +279 -13
  34. package/package.json +11 -11
  35. package/dist/chunk-742JTNYI.js.map +0 -1
  36. package/dist/chunk-AJD3DTL7.cjs.map +0 -1
  37. package/dist/chunk-DQFTAD3I.cjs.map +0 -1
  38. package/dist/chunk-DXMVWGLJ.js.map +0 -1
  39. package/dist/chunk-Q3L4GIBG.cjs.map +0 -1
  40. package/dist/chunk-THKEF32L.js.map +0 -1
@@ -178,6 +178,179 @@ interface Compressor {
178
178
  compress(messages: Message[], targetTokens: number): Promise<Message[]>;
179
179
  }
180
180
 
181
+ /**
182
+ * Agent lifecycle callbacks — **observation only**.
183
+ *
184
+ * Use these for UI, tracing, auditing, and metrics. They must not change execution outcomes.
185
+ * **Interception** (block tool calls, rewrite inputs, policy) belongs to {@link HookManager}
186
+ * and {@link ToolRegistry} execution policy, not to these callbacks.
187
+ *
188
+ * @module
189
+ */
190
+
191
+ /** Shared fields on run-level observation contexts */
192
+ interface AgentRunContext {
193
+ sessionId?: string;
194
+ cwd?: string;
195
+ }
196
+ interface AgentRunStartContext extends AgentRunContext {
197
+ /** Original user input length before skill processing */
198
+ inputLength: number;
199
+ /** Input length after skill / template processing */
200
+ processedInputLength: number;
201
+ /** Session id from {@link StreamOptions.sessionId} when resuming */
202
+ resumeSessionId?: string;
203
+ }
204
+ type AgentRunEndReason = 'complete' | 'aborted' | 'error' | 'max_iterations';
205
+ interface AgentRunEndContext extends AgentRunContext {
206
+ reason: AgentRunEndReason;
207
+ iterations: number;
208
+ usage?: TokenUsage;
209
+ error?: Error;
210
+ }
211
+ type SystemMessageSource = 'default_prompt' | 'runtime_prompt' | 'memory';
212
+ type UserMessageSource = 'raw_input' | 'processed_input' | 'interruption_marker';
213
+ interface MessageObservationContext extends AgentRunContext {
214
+ iteration?: number;
215
+ }
216
+ interface ModelRequestStartContext extends AgentRunContext {
217
+ iteration: number;
218
+ messageCount: number;
219
+ toolCount: number;
220
+ temperature?: number;
221
+ maxTokens?: number;
222
+ includeRawStreamEvents?: boolean;
223
+ }
224
+ /** Base context for tool execution observation (Agent layer) */
225
+ interface ToolExecutionBaseContext extends AgentRunContext {
226
+ iteration: number;
227
+ toolCallId: string;
228
+ toolName: string;
229
+ arguments: unknown;
230
+ projectDir?: string;
231
+ agentDepth?: number;
232
+ }
233
+ interface ToolExecutionEndContext extends ToolExecutionBaseContext {
234
+ durationMs: number;
235
+ isError: boolean;
236
+ /** Set when the tool handler threw (distinct from `isError` result) */
237
+ executionError?: Error;
238
+ }
239
+ interface ToolResultObservationContext extends ToolExecutionEndContext {
240
+ result: ToolResult;
241
+ }
242
+ /**
243
+ * Observation callbacks for the tool hook pipeline inside {@link ToolRegistry}.
244
+ * Does not replace {@link HookManager}; it only surfaces what happened.
245
+ */
246
+ interface ToolHookObserver {
247
+ /** Invoked immediately before a hook pipeline step runs for the given event type */
248
+ onHookStart?: (ctx: HookObservationContext) => void;
249
+ /** Invoked after `preToolUse` with the aggregate allow/deny decision */
250
+ onHookDecision?: (ctx: HookDecisionContext) => void;
251
+ /**
252
+ * Reserved for hook pipeline failures surfaced as `Error` (e.g. future hook instrumentation).
253
+ * Tool handler errors use {@link AgentLifecycleCallbacks.onToolExecutionError}.
254
+ */
255
+ onHookError?: (error: Error, ctx: HookObservationContext) => void;
256
+ }
257
+ interface HookObservationContext {
258
+ eventType: HookEventType;
259
+ toolName: string;
260
+ toolCallId?: string;
261
+ projectDir?: string;
262
+ }
263
+ interface HookDecisionContext extends HookObservationContext {
264
+ allowed: boolean;
265
+ reason?: string;
266
+ }
267
+ /** Optional second argument to {@link AgentCallbacks.onError} and lifecycle error hooks */
268
+ interface AgentErrorContext {
269
+ phase: 'run' | 'model' | 'tool' | 'hook' | 'persistence' | 'lifecycle_callback';
270
+ iteration?: number;
271
+ toolName?: string;
272
+ toolCallId?: string;
273
+ cause?: unknown;
274
+ }
275
+ /**
276
+ * Structured lifecycle callbacks for {@link Agent}.
277
+ *
278
+ * Prefer these over ad-hoc parsing of {@link StreamEvent} when you need stable, typed observation points.
279
+ */
280
+ interface AgentLifecycleCallbacks {
281
+ onRunStart?: (ctx: AgentRunStartContext) => void;
282
+ onRunEnd?: (ctx: AgentRunEndContext) => void;
283
+ onRunAbort?: (ctx: AgentRunContext & {
284
+ iteration?: number;
285
+ }) => void;
286
+ onSessionCreate?: (ctx: {
287
+ sessionId?: string;
288
+ }) => void;
289
+ onSessionResume?: (ctx: {
290
+ sessionId: string;
291
+ messageCount: number;
292
+ }) => void;
293
+ onIterationStart?: (ctx: {
294
+ iteration: number;
295
+ messageCount: number;
296
+ toolCount: number;
297
+ } & AgentRunContext) => void;
298
+ onIterationEnd?: (ctx: {
299
+ iteration: number;
300
+ hadToolCalls: boolean;
301
+ } & AgentRunContext) => void;
302
+ onContextCompressed?: (ctx: {
303
+ iteration: number;
304
+ stats: {
305
+ originalMessageCount: number;
306
+ compressedMessageCount: number;
307
+ durationMs: number;
308
+ };
309
+ } & AgentRunContext) => void;
310
+ onSystemMessage?: (message: Message, source: SystemMessageSource, ctx?: MessageObservationContext) => void;
311
+ onUserMessage?: (message: Message, source: UserMessageSource, ctx?: MessageObservationContext) => void;
312
+ onAssistantMessage?: (message: Message, ctx?: MessageObservationContext & {
313
+ iteration: number;
314
+ }) => void;
315
+ onToolMessage?: (message: Message, ctx?: MessageObservationContext & {
316
+ iteration: number;
317
+ toolCallId: string;
318
+ }) => void;
319
+ onMessagePersist?: (ctx: {
320
+ messageCount: number;
321
+ } & AgentRunContext) => void;
322
+ onModelRequestStart?: (ctx: ModelRequestStartContext) => void;
323
+ /**
324
+ * Fired for stream events that originate from the model adapter (see `isModelStreamEventType` / `MODEL_STREAM_EVENT_TYPES`).
325
+ * The same events are also delivered to {@link AgentCallbacks.onEvent}; subscribe to one or dedupe if both are set.
326
+ */
327
+ onModelEvent?: (event: StreamEvent) => void;
328
+ onModelUsage?: (ctx: {
329
+ usage: TokenUsage;
330
+ iteration?: number;
331
+ phase?: 'input' | 'output';
332
+ } & AgentRunContext) => void;
333
+ /** After the model stream for this iteration is fully flushed, before the assistant message is appended */
334
+ onModelRequestEnd?: (ctx: {
335
+ iteration: number;
336
+ } & AgentRunContext) => void;
337
+ /** When the model stream terminates with {@link StreamEvent} `end` and `reason: 'error'` */
338
+ onModelRequestError?: (error: Error, ctx: AgentErrorContext & {
339
+ iteration: number;
340
+ }) => void;
341
+ onToolCallPlanned?: (toolCall: ToolCall, ctx: {
342
+ iteration: number;
343
+ } & AgentRunContext) => void;
344
+ onToolExecutionStart?: (ctx: ToolExecutionBaseContext) => void;
345
+ onToolExecutionEnd?: (ctx: ToolExecutionEndContext) => void;
346
+ onToolResult?: (ctx: ToolResultObservationContext) => void;
347
+ onToolExecutionError?: (error: Error, ctx: AgentErrorContext) => void;
348
+ /** Bridges to {@link ToolRegistry} hook observation */
349
+ hooks?: ToolHookObserver;
350
+ /** Non-fatal agent-level errors (e.g. stream failure) */
351
+ onAgentError?: (error: Error, ctx: AgentErrorContext) => void;
352
+ }
353
+
181
354
  /**
182
355
  * 文本内容部分
183
356
  */
@@ -228,6 +401,56 @@ interface Message {
228
401
  name?: string;
229
402
  timestamp?: number;
230
403
  }
404
+ /**
405
+ * SDK 日志级别
406
+ */
407
+ type SDKLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
408
+ /**
409
+ * SDK 结构化日志事件
410
+ */
411
+ interface LogEvent {
412
+ /** 固定来源标识,便于宿主应用统一过滤 */
413
+ source: 'agent-sdk';
414
+ component: 'agent' | 'model' | 'streaming' | 'tooling' | 'memory';
415
+ event: string;
416
+ message?: string;
417
+ provider?: string;
418
+ model?: string;
419
+ operation?: 'stream' | 'complete' | 'compress' | 'tool_call';
420
+ sessionId?: string;
421
+ iteration?: number;
422
+ toolName?: string;
423
+ toolCallId?: string;
424
+ requestId?: string;
425
+ clientRequestId?: string;
426
+ statusCode?: number;
427
+ durationMs?: number;
428
+ errorName?: string;
429
+ errorMessage?: string;
430
+ metadata?: Record<string, unknown>;
431
+ }
432
+ /**
433
+ * SDK Logger 接口。宿主应用可将其桥接到 pino / winston / OTel 等实现。
434
+ */
435
+ interface SDKLogger {
436
+ debug?(event: LogEvent): void;
437
+ info?(event: LogEvent): void;
438
+ warn?(event: LogEvent): void;
439
+ error?(event: LogEvent): void;
440
+ }
441
+ /**
442
+ * 日志脱敏与输出控制
443
+ */
444
+ interface LogRedactionConfig {
445
+ /** 是否记录请求/响应 body,默认 false */
446
+ includeBodies?: boolean;
447
+ /** 是否记录工具调用参数,默认 false */
448
+ includeToolArguments?: boolean;
449
+ /** 单个字符串字段最大保留字符数,默认 4000 */
450
+ maxBodyChars?: number;
451
+ /** 额外需要脱敏的键名(大小写不敏感) */
452
+ redactKeys?: string[];
453
+ }
231
454
  /**
232
455
  * 系统消息
233
456
  */
@@ -274,11 +497,19 @@ interface ModelParams {
274
497
  includeRawStreamEvents?: boolean;
275
498
  /** 会话标识;Agent 会在每次模型请求中填入,各适配器自行决定是否映射到 HTTP 请求。 */
276
499
  sessionId?: string;
500
+ /** 当前请求使用的 SDK logger。 */
501
+ logger?: SDKLogger;
502
+ /** 当前请求使用的 SDK 日志级别。 */
503
+ logLevel?: SDKLogLevel;
504
+ /** 当前请求使用的日志脱敏策略。 */
505
+ redaction?: LogRedactionConfig;
277
506
  }
278
507
  /**
279
508
  * 流式块类型
280
509
  */
281
- type StreamChunkType = 'text' | 'tool_call' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'thinking' | 'error' | 'done' | 'metadata';
510
+ type StreamChunkType = 'text' | 'tool_call' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'thinking'
511
+ /** Adapters emit when a discrete thinking block ends (e.g. Anthropic content_block_stop). */
512
+ | 'thinking_block_end' | 'error' | 'done' | 'metadata';
282
513
  /**
283
514
  * 流式块
284
515
  */
@@ -460,7 +691,7 @@ interface StorageAdapter {
460
691
  /**
461
692
  * 流式事件类型
462
693
  */
463
- type StreamEventType = 'text_delta' | 'text_start' | 'text_end' | 'tool_call' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'tool_result' | 'tool_error' | 'thinking' | 'start' | 'end' | 'model_usage' | 'session_summary' | 'context_compressed';
694
+ type StreamEventType = 'text_delta' | 'text_start' | 'text_end' | 'tool_call' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'tool_result' | 'tool_error' | 'thinking' | 'thinking_start' | 'thinking_end' | 'start' | 'end' | 'model_usage' | 'session_summary' | 'context_compressed';
464
695
  /**
465
696
  * Optional fields on any stream event (observability, Claude-style correlation).
466
697
  */
@@ -513,10 +744,16 @@ type StreamEvent = ({
513
744
  type: 'tool_error';
514
745
  toolCallId: string;
515
746
  error: Error;
747
+ } | {
748
+ type: 'thinking_start';
749
+ signature?: string;
516
750
  } | {
517
751
  type: 'thinking';
518
752
  content: string;
519
753
  signature?: string;
754
+ } | {
755
+ type: 'thinking_end';
756
+ content?: string;
520
757
  } | {
521
758
  type: 'model_usage';
522
759
  usage: TokenUsage;
@@ -526,6 +763,7 @@ type StreamEvent = ({
526
763
  type: 'session_summary';
527
764
  /** Authoritative cumulative usage for the completed run (prefer over end.usage when both exist). */
528
765
  usage: TokenUsage;
766
+ /** Number of model rounds completed in this stream call (not message count). */
529
767
  iterations: number;
530
768
  } | {
531
769
  type: 'end';
@@ -534,8 +772,8 @@ type StreamEvent = ({
534
772
  * Optional usage (e.g. aborted mid-stream). When a session_summary event was emitted, use its usage for totals.
535
773
  */
536
774
  usage?: TokenUsage;
537
- /** Omitted or `complete` = normal completion */
538
- reason?: 'complete' | 'aborted' | 'error';
775
+ /** Omitted or `complete` = normal completion; `max_iterations` = hit `AgentConfig.maxIterations`. */
776
+ reason?: 'complete' | 'aborted' | 'error' | 'max_iterations';
539
777
  error?: Error;
540
778
  partialContent?: string;
541
779
  } | {
@@ -546,6 +784,16 @@ type StreamEvent = ({
546
784
  durationMs: number;
547
785
  };
548
786
  }) & StreamEventAnnotations;
787
+ /**
788
+ * 模型适配器在一次请求中可能产出的流式事件类型(与 {@link isModelStreamEventType} 共用此列表,避免与 `switch` 双处维护)。
789
+ * 新增 `StreamEvent` 变体时:若属于模型流,请在此数组中追加对应 `type` 字符串。
790
+ */
791
+ declare const MODEL_STREAM_EVENT_TYPES: readonly ["text_start", "text_delta", "text_end", "tool_call_start", "tool_call_delta", "tool_call", "tool_call_end", "thinking_start", "thinking", "thinking_end", "model_usage"];
792
+ /**
793
+ * 是否为由模型适配器流式产生的事件类型(用于 `lifecycle.onModelEvent` 过滤)。
794
+ * 排除 `start` / `end` / `session_summary` / `context_compressed` / `tool_result` / `tool_error` 等。
795
+ */
796
+ declare function isModelStreamEventType(type: StreamEventType): boolean;
549
797
  /**
550
798
  * MCP 服务器配置
551
799
  */
@@ -558,6 +806,12 @@ interface MCPServerConfig {
558
806
  command?: string;
559
807
  args?: string[];
560
808
  env?: Record<string, string>;
809
+ /**
810
+ * stdio 子进程工作目录(仅 `transport === 'stdio'` 时生效)。
811
+ * 经 `Agent.connectMCP` 且未设置或仅空白时,使用 `AgentConfig.cwd`,再否则为当前进程的 `process.cwd()`。
812
+ * 直接使用 `MCPClient` 且未设置时,spawn 不传 `cwd`,子进程继承父进程工作目录(通常即当时的 `process.cwd()`)。
813
+ */
814
+ cwd?: string;
561
815
  /** HTTP 配置 */
562
816
  url?: string;
563
817
  headers?: Record<string, string>;
@@ -752,6 +1006,12 @@ interface AgentConfig {
752
1006
  sessionId?: string;
753
1007
  /** 回调函数 */
754
1008
  callbacks?: AgentCallbacks;
1009
+ /** SDK logger;由宿主应用决定最终输出位置。 */
1010
+ logger?: SDKLogger;
1011
+ /** SDK 日志级别;省略时可由环境变量控制。 */
1012
+ logLevel?: SDKLogLevel;
1013
+ /** 日志脱敏与 body 输出控制。 */
1014
+ redaction?: LogRedactionConfig;
755
1015
  /** 是否启用长期记忆 */
756
1016
  memory?: boolean;
757
1017
  /** 记忆配置 */
@@ -784,6 +1044,11 @@ interface AgentConfig {
784
1044
  allowDangerousTools?: boolean;
785
1045
  /** 子代理默认允许工具列表(为空时自动使用安全工具) */
786
1046
  defaultAllowedTools?: string[];
1047
+ /**
1048
+ * 按 subagent 类型(general-purpose / explore)覆盖内置追加 system 片段;未设置的类型仍用内置文案。
1049
+ * 设为空字符串表示该类型不追加片段。
1050
+ */
1051
+ subagentTypePrompts?: Partial<Record<'general-purpose' | 'explore', string>>;
787
1052
  };
788
1053
  }
789
1054
  /**
@@ -805,17 +1070,18 @@ interface SkillConfig {
805
1070
  additionalPaths?: string[];
806
1071
  }
807
1072
  /**
808
- * Agent 回调
1073
+ * Agent 回调:流式事件 + 可选的结构化生命周期观察。
1074
+ *
1075
+ * - **观察**:`onEvent`、`lifecycle` — 不改变执行结果。
1076
+ * - **拦截**:工具策略与 Hook 见 {@link AgentConfig.hookManager} / `hookConfigDir` 与 {@link ToolRegistry}。
809
1077
  */
810
1078
  interface AgentCallbacks {
811
- /** 流式事件回调 */
1079
+ /** 流式事件回调(与 {@link AgentLifecycleCallbacks.onModelEvent} 互补:后者仅模型侧子集) */
812
1080
  onEvent?: (event: StreamEvent) => void;
813
- /** 工具执行前回调 */
814
- beforeToolCall?: (toolCall: ToolCall) => Promise<boolean | void>;
815
- /** 工具执行后回调 */
816
- afterToolCall?: (toolCall: ToolCall, result: ToolResult) => void;
817
- /** 错误回调 */
818
- onError?: (error: Error) => void;
1081
+ /** 结构化生命周期观察 */
1082
+ lifecycle?: AgentLifecycleCallbacks;
1083
+ /** 错误回调;`context` 为可选扩展信息 */
1084
+ onError?: (error: Error, context?: AgentErrorContext) => void;
819
1085
  }
820
1086
  /**
821
1087
  * Agent 执行结果
@@ -899,4 +1165,4 @@ interface SkillOptions {
899
1165
  path?: string;
900
1166
  }
901
1167
 
902
- export { type StreamChunkType as $, type AgentConfig as A, type HookEventType as B, type CLIConfig as C, type HookGroupConfig as D, HookManager as E, type FlatCommandHookEntry as F, type HookResult as G, type HookContext as H, type HooksSettings as I, type HooksSettingsFile as J, type ImageContent as K, type MCPOptions as L, type Message as M, type MCPPromptArgument as N, type MCPResourceContent as O, type ParsedSkill as P, type MessageRole as Q, type ModelCapabilities as R, type StorageConfig as S, type ToolResult as T, type ModelParams as U, type RunOptions as V, type SessionListOptions as W, type SkillConfig as X, type SkillDefinition as Y, type SkillMetadata as Z, type SkillOptions as _, type SessionInfo as a, type StreamEventAnnotations as a0, type StreamEventType as a1, type SystemMessage as a2, type SystemPromptConfig as a3, type TextContent as a4, type ThinkingContent as a5, type ToolCall as a6, type ToolExecutionContext as a7, type ToolExecutionPolicy as a8, type ToolHandler as a9, type ToolListOptions as aa, type ToolMessage as ab, type ToolResultMetadata as ac, type ToolSchema as ad, type UserMessage as ae, buildHookEnv as af, createAskUserQuestionTool as ag, createFunctionHook as ah, formatAnswerSummary as ai, formatAskUserQuestionPrompt as aj, getInteractionTools as ak, matchTool as al, mergeCommandHookLayers as am, questionTool as an, type StorageAdapter as b, type ToolDefinition as c, type SystemPrompt as d, type StreamEvent as e, type AgentResult as f, type ModelAdapter as g, type MCPServerConfig as h, type SessionTokenUsage as i, type TokenUsage as j, type StreamChunk as k, type MemoryConfig as l, type AgentCallbacks as m, type AgentModelConfig as n, type AskUserQuestionAnswer as o, type AskUserQuestionItem as p, type AskUserQuestionResolver as q, type AssistantMessage as r, type CanUseToolCallback as s, type ChatOptions as t, type CommandHookConfig as u, type CompletionResult as v, type ContentPart as w, type ContextManagerConfig as x, type CreateAskUserQuestionToolOptions as y, type FunctionHook as z };
1168
+ export { type MCPPromptArgument as $, type AgentConfig as A, type ChatOptions as B, type CLIConfig as C, type CommandHookConfig as D, type CompletionResult as E, type ContentPart as F, type ContextManagerConfig as G, type CreateAskUserQuestionToolOptions as H, type FlatCommandHookEntry as I, type FunctionHook as J, type HookContext as K, type LogEvent as L, type Message as M, type HookDecisionContext as N, type HookEventType as O, type ParsedSkill as P, type HookGroupConfig as Q, HookManager as R, type StorageConfig as S, type ToolResult as T, type HookObservationContext as U, type HookResult as V, type HooksSettings as W, type HooksSettingsFile as X, type ImageContent as Y, type LogRedactionConfig as Z, type MCPOptions as _, type SessionInfo as a, type MCPResourceContent as a0, MODEL_STREAM_EVENT_TYPES as a1, type MessageObservationContext as a2, type MessageRole as a3, type ModelCapabilities as a4, type ModelParams as a5, type ModelRequestStartContext as a6, type RunOptions as a7, type SDKLogLevel as a8, type SessionListOptions as a9, buildHookEnv as aA, createAskUserQuestionTool as aB, createFunctionHook as aC, formatAnswerSummary as aD, formatAskUserQuestionPrompt as aE, getInteractionTools as aF, isModelStreamEventType as aG, matchTool as aH, mergeCommandHookLayers as aI, questionTool as aJ, type SkillConfig as aa, type SkillDefinition as ab, type SkillMetadata as ac, type SkillOptions as ad, type StreamChunkType as ae, type StreamEventAnnotations as af, type StreamEventType as ag, type SystemMessage as ah, type SystemMessageSource as ai, type SystemPromptConfig as aj, type TextContent as ak, type ThinkingContent as al, type ToolCall as am, type ToolExecutionBaseContext as an, type ToolExecutionContext as ao, type ToolExecutionEndContext as ap, type ToolExecutionPolicy as aq, type ToolHandler as ar, type ToolHookObserver as as, type ToolListOptions as at, type ToolMessage as au, type ToolResultMetadata as av, type ToolResultObservationContext as aw, type ToolSchema as ax, type UserMessage as ay, type UserMessageSource as az, type StorageAdapter as b, type MCPServerConfig as c, type ToolDefinition as d, type SystemPrompt as e, type StreamEvent as f, type AgentResult as g, type ModelAdapter as h, type SessionTokenUsage as i, type SDKLogger as j, type TokenUsage as k, type StreamChunk as l, type MemoryConfig as m, type AgentCallbacks as n, type AgentErrorContext as o, type AgentLifecycleCallbacks as p, type AgentModelConfig as q, type AgentRunContext as r, type AgentRunEndContext as s, type AgentRunEndReason as t, type AgentRunStartContext as u, type AskUserQuestionAnswer as v, type AskUserQuestionItem as w, type AskUserQuestionResolver as x, type AssistantMessage as y, type CanUseToolCallback as z };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.1.1",
6
+ "version": "0.2.1",
7
7
  "description": "A TypeScript Agent SDK with multi-model support, MCP integration, skill system, and streaming",
8
8
  "type": "module",
9
9
  "main": "./dist/index.cjs",
@@ -27,19 +27,11 @@
27
27
  }
28
28
  },
29
29
  "bin": {
30
- "agent-sdk": "./dist/cli/index.js"
30
+ "agent-sdk": "dist/cli/index.js"
31
31
  },
32
32
  "files": [
33
33
  "dist"
34
34
  ],
35
- "scripts": {
36
- "build": "tsup",
37
- "dev": "tsup --watch",
38
- "test": "vitest",
39
- "test:run": "vitest run",
40
- "lint": "tsc --noEmit",
41
- "clean": "rm -rf dist"
42
- },
43
35
  "keywords": [
44
36
  "agent",
45
37
  "ai",
@@ -87,5 +79,13 @@
87
79
  },
88
80
  "engines": {
89
81
  "node": ">=18.0.0"
82
+ },
83
+ "scripts": {
84
+ "build": "tsup",
85
+ "dev": "tsup --watch",
86
+ "test": "vitest",
87
+ "test:run": "vitest run",
88
+ "lint": "tsc --noEmit",
89
+ "clean": "rm -rf dist"
90
90
  }
91
- }
91
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/models/request-debug.ts","../src/models/openai.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/core/process-env-merge.ts","../src/models/index.ts"],"names":[],"mappings":";;;;AAKA,IAAM,MAAA,GAAS,iBAAA;AAER,SAAS,0BAAA,GAAsC;AACpD,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,6BAAA;AACxB,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,EAAA,EAAI;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,CAAE,MAAM,CAAA;AACvC;AAOO,SAAS,wBAAA,CAAyB,QAAA,EAAkB,IAAA,EAAc,IAAA,EAAqB;AAC5F,EAAA,IAAI,CAAC,4BAA2B,EAAG;AACjC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,CAAA,2BAAA,EAA8B,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GACJ,IAAA,KAAS,IAAA,IAAQ,OAAO,SAAS,QAAA,GAC7B,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAC5B,IAAA,CAAK,UAAU,IAAI,CAAA;AACzB,IAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,MAAM;AAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAC5B;AACF;;;ACtBA,IAAM,mBAAA,GAAyD;AAAA,EAC7D,QAAA,EAAU,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,KAAA,EAAO;AAAA,EAC5D,aAAA,EAAe,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,KAAA,EAAO;AAAA,EACjE,aAAA,EAAe,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,IAAA,EAAM;AAAA,EAChE,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAO,iBAAiB,IAAA,EAAM;AAAA,EACxD,eAAA,EAAiB,EAAE,aAAA,EAAe,KAAA,EAAQ,iBAAiB,IAAA;AAC7D,CAAA;AAiBO,IAAM,aAAA,GAAN,cAA4B,gBAAA,CAAiB;AAAA,EACzC,IAAA;AAAA,EACD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACrC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,cAAA,IAAkB,EAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,OAAA,CAAQ,IAAI,eAAA,IAAmB,2BAAA;AAChE,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,QAAA;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,OAAA,CAAQ,GAAA,CAAI,aAAA;AAEvD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,+FAA+F,CAAA;AAAA,IACjH;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAGhC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IACtB,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA,IAC9B,EAAE,aAAA,EAAe,KAAA,EAAS,eAAA,EAAiB,IAAA,EAAM;AAAA,EACxD;AAAA,EAEA,OAAO,OAAO,MAAA,EAAiD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAM,mBAAA,EAAqB,IAAA,EAAM,OAAO,MAAM,CAAA;AAE1E,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,eAAA,GAA0E,IAAA;AAE9E,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAA,CAAO,MAAA,EAAO;AACd,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,cAAA,EAAgB;AAC5C,UAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAEnC,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AACxC,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAC/B,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,MAAM,MAAM,MAAA,CAAO,sBAAA,GAAyB,EAAE,WAAA,EAAa,IAAA,KAAoB,EAAC;AAGhF,YAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,cAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA,EAAS,GAAG,GAAA,EAAI;AAAA,YAC9D;AAGA,YAAA,IAAI,MAAA,CAAO,OAAO,UAAA,EAAY;AAC5B,cAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AAC9C,gBAAA,IAAI,QAAA,CAAS,UAAU,KAAA,CAAA,EAAW;AAEhC,kBAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,QAAA,EAAU,IAAA,EAAM;AAC1C,oBAAA,IAAI,eAAA,EAAiB;AACnB,sBAAA,MAAM;AAAA,wBACJ,IAAA,EAAM,WAAA;AAAA,wBACN,QAAA,EAAU;AAAA,0BACR,IAAI,eAAA,CAAgB,EAAA;AAAA,0BACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,0BACtB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,SAAS;AAAA,yBACzD;AAAA,wBACA,GAAG;AAAA,uBACL;AAAA,oBACF;AACA,oBAAA,eAAA,GAAkB;AAAA,sBAChB,IAAI,QAAA,CAAS,EAAA;AAAA,sBACb,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,sBACxB,SAAA,EAAW,QAAA,CAAS,QAAA,CAAS,SAAA,IAAa;AAAA,qBAC5C;AACA,oBAAA,MAAM;AAAA,sBACJ,IAAA,EAAM,iBAAA;AAAA,sBACN,OAAA,EAAS,SAAS,QAAA,CAAS,IAAA;AAAA,sBAC3B,YAAY,QAAA,CAAS,EAAA;AAAA,sBACrB,GAAG;AAAA,qBACL;AAAA,kBACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,EAAU,SAAA,IAAa,eAAA,EAAiB;AAC1D,oBAAA,eAAA,CAAgB,SAAA,IAAa,SAAS,QAAA,CAAS,SAAA;AAC/C,oBAAA,MAAM;AAAA,sBACJ,IAAA,EAAM,iBAAA;AAAA,sBACN,OAAA,EAAS,SAAS,QAAA,CAAS,SAAA;AAAA,sBAC3B,YAAY,eAAA,CAAgB,EAAA;AAAA,sBAC5B,GAAG;AAAA,qBACL;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,YAAA,IAAgB,eAAA,EAAiB;AAC5D,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,WAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,IAAI,eAAA,CAAgB,EAAA;AAAA,kBACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,kBACtB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,SAAS;AAAA,iBACzD;AAAA,gBACA,GAAG;AAAA,eACL;AACA,cAAA,eAAA,GAAkB,IAAA;AAAA,YACpB;AAGA,YAAA,IAAI,KAAK,KAAA,EAAO;AACd,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,UAAA;AAAA,gBACN,UAAA,EAAY,QAAA;AAAA,gBACZ,QAAA,EAAU;AAAA,kBACR,KAAA,EAAO;AAAA,oBACL,YAAA,EAAc,KAAK,KAAA,CAAM,aAAA;AAAA,oBACzB,gBAAA,EAAkB,KAAK,KAAA,CAAM,iBAAA;AAAA,oBAC7B,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA;AAC1B,iBACF;AAAA,gBACA,GAAG;AAAA,eACL;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,IAAI,eAAA,CAAgB,EAAA;AAAA,YACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,YACtB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,SAAS;AAAA,WACzD;AAAA,UACA,GAAI,MAAA,CAAO,sBAAA,GAAyB,EAAE,WAAA,EAAa,EAAE,QAAA,EAAU,IAAA,EAAK,EAAE,GAAI;AAAC,SAC7E;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAA,EAAgD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,qBAAqB,IAAI,CAAA;AAE3D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW;AAAA,KACtC;AAGA,IAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAA,CAAO,YAAY,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,MAAa;AAAA,QAC7D,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,QAClB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,SAAS,SAAS;AAAA,OACrD,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,QACb,YAAA,EAAc,KAAK,KAAA,CAAM,aAAA;AAAA,QACzB,gBAAA,EAAkB,KAAK,KAAA,CAAM,iBAAA;AAAA,QAC7B,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA,OAC1B;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,CAAiB,QAAqB,MAAA,EAA0B;AACtE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAI,MAAA,IAAU,EAAE,gBAAgB,EAAE,aAAA,EAAe,MAAK,EAAE;AAAA,MACxD,GAAI,MAAA,CAAO,WAAA,KAAgB,UAAa,EAAE,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,MAC1E,GAAI,MAAA,CAAO,SAAA,KAAc,UAAa,EAAE,UAAA,EAAY,OAAO,SAAA,EAAU;AAAA,MACrE,GAAI,MAAA,CAAO,aAAA,IAAiB,EAAE,IAAA,EAAM,OAAO,aAAA;AAAc,KAC3D;AAGA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAQ,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,QACzD,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACZ,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,KAAA,CAAM,IAAA,EAAc,IAAA,EAAe,MAAA,EAAyC;AACxF,IAAA,wBAAA,CAAyB,QAAA,EAAU,MAAM,IAAI,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,KACxC;AAEA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,qBAAqB,IAAI,IAAA,CAAK,YAAA;AAAA,IACxC;AAEA,IAAA,OAAO,WAAW,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,cAAc,GAAA,EAAsB;AAC1C,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,aAAa,MAAA,EAAsC;AACjE,EAAA,OAAO,IAAI,cAAc,MAAM,CAAA;AACjC;;;AC1QA,IAAM,mBAAA,GAA4D;AAAA,EAChE,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,oBAAoB,OAAA,EAA4E;AACvG,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,EAAE,GAAG,mBAAA,EAAoB;AAAA,EAClC;AACA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,OAAA,CAAQ,WAAA,IAAe,mBAAA,CAAoB,WAAW,CAAC,CAAA;AAClG,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,WAAA,IAAe,oBAAoB,WAAW,CAAA;AACtF,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,aAAa,OAAA,CAAQ,UAAA,IAAc,oBAAoB,UAAU,CAAA;AAC7F,EAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,UAAA,EAAW;AAChD;AAEA,SAAS,aAAa,CAAA,EAAqB;AACzC,EAAA,IAAI,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,YAAA,EAAc;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAS,EAAwB,IAAA,KAAS,YAAA;AAClF;AAEA,SAAS,sBAAsB,CAAA,EAAqB;AAClD,EAAA,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,IAAQ,OAAA,IAAW,CAAA,GAC3D,CAAA,CAAoC,KAAA,GACrC,MAAA;AACJ,EAAA,MAAM,OAAO,KAAA,EAAO,IAAA;AACpB,EAAA,OACE,SAAS,YAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,WACT,IAAA,KAAS,gBAAA;AAEb;AAEA,SAAS,sBAAsB,MAAA,EAAyB;AACtD,EAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,KAAW,GAAA;AAC1E;AAGA,SAAS,kBAAkB,MAAA,EAA2C;AACpE,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,MAAA,KAAW,EAAA,EAAI;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AACxC,IAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,EACjB;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI;AAChC,IAAA,OAAO,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CACP,YAAA,EACA,WAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,WAAA,GAAc,KAAK,YAAY,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AACrC,EAAA,OAAO,KAAK,GAAA,CAAI,UAAA,EAAY,KAAK,KAAA,CAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACtD;AAEA,eAAe,KAAA,CAAM,IAAY,MAAA,EAAqC;AACpE,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAC,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,WAAW,MAAM;AAC1B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,MAC7C;AACA,MAAA,OAAA,EAAQ;AAAA,IACV,GAAG,EAAE,CAAA;AACL,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAC,CAAA;AAAA,IACrE,CAAA;AACA,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;AAEA,eAAe,kBAAkB,QAAA,EAAmC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,WAAA,EAAY;AAAA,EAC7B,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAKA,IAAM,sBAAA,GAA4D;AAAA,EAChE,0BAAA,EAA4B,EAAE,aAAA,EAAe,GAAA,EAAS,iBAAiB,KAAA,EAAO;AAAA,EAC9E,cAAA,EAAgB,EAAE,aAAA,EAAe,GAAA,EAAS,iBAAiB,IAAA,EAAM;AAAA,EACjE,4BAAA,EAA8B,EAAE,aAAA,EAAe,GAAA,EAAS,iBAAiB,IAAA,EAAM;AAAA,EAC/E,yBAAA,EAA2B,EAAE,aAAA,EAAe,GAAA,EAAS,iBAAiB,IAAA;AACxE,CAAA;AA2BO,IAAM,gBAAA,GAAN,cAA+B,gBAAA,CAAiB;AAAA,EAC5C,IAAA;AAAA,EACD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG;AACxC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAChE,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,OAAA,CAAQ,IAAI,kBAAA,IAAsB,2BAAA;AACnE,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,0BAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,YAAA;AACjC,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,mBAAA,CAAoB,MAAA,CAAO,UAAU,CAAA;AAEvD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,qGAAqG,CAAA;AAAA,IACvH;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,CAAA;AAGnC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IACtB,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA,IACjC,EAAE,aAAA,EAAe,GAAA,EAAS,eAAA,EAAiB,IAAA,EAAM;AAAA,EACxD;AAAA,EAEA,OAAO,OAAO,MAAA,EAAiD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAM,cAAA,EAAgB,IAAA,EAAM,OAAO,MAAM,CAAA;AAErE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,eAAA,GAAsE,IAAA;AAC1E,IAAA,IAAI,oBAAA,GAAsD,IAAA;AAE1D,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAA,CAAO,MAAA,EAAO;AACd,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAE9C,UAAA,IAAI,SAAA,GAAY,CAAA;AAChB,UAAA,IAAI,QAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,CAAC,MAAM,GAAA,EAAK;AAC5C,YAAA,SAAA,GAAY,CAAA;AAAA,UACd;AACA,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AAEvC,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,YAAA,MAAM,MAAM,MAAA,CAAO,sBAAA,GAAyB,EAAE,WAAA,EAAa,IAAA,KAAoB,EAAC;AAEhF,YAAA,QAAQ,KAAK,IAAA;AAAM,cACjB,KAAK,qBAAA;AACH,gBAAA,IAAI,IAAA,CAAK,aAAA,EAAe,IAAA,KAAS,UAAA,EAAY;AAC3C,kBAAA,eAAA,GAAkB;AAAA,oBAChB,EAAA,EAAI,KAAK,aAAA,CAAc,EAAA;AAAA,oBACvB,IAAA,EAAM,KAAK,aAAA,CAAc,IAAA;AAAA,oBACzB,KAAA,EAAO;AAAA,mBACT;AACA,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,iBAAA;AAAA,oBACN,QAAA,EAAU;AAAA,sBACR,EAAA,EAAI,KAAK,aAAA,CAAc,EAAA;AAAA,sBACvB,IAAA,EAAM,KAAK,aAAA,CAAc,IAAA;AAAA,sBACzB,WAAW;AAAC,qBACd;AAAA,oBACA,GAAG;AAAA,mBACL;AAAA,gBACF,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,EAAe,IAAA,KAAS,UAAA,EAAY;AAClD,kBAAA,oBAAA,GAAuB;AAAA,oBACrB,SAAA,EAAW,KAAK,aAAA,CAAc;AAAA,mBAChC;AACA,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,UAAA;AAAA,oBACN,OAAA,EAAS,KAAK,aAAA,CAAc,QAAA;AAAA,oBAC5B,WAAW,oBAAA,CAAqB,SAAA;AAAA,oBAChC,GAAG;AAAA,mBACL;AAAA,gBACF;AACA,gBAAA;AAAA,cAEF,KAAK,qBAAA;AACH,gBAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,KAAS,YAAA,EAAc;AACrC,kBAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,KAAK,KAAA,CAAM,IAAA,EAAM,GAAG,GAAA,EAAI;AAAA,gBACzD,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,EAAO,IAAA,KAAS,gBAAA,EAAkB;AAChD,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,UAAA;AAAA,oBACN,OAAA,EAAS,KAAK,KAAA,CAAM,QAAA;AAAA,oBACpB,WAAW,oBAAA,EAAsB,SAAA;AAAA,oBACjC,GAAG;AAAA,mBACL;AAAA,gBACF,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,EAAO,IAAA,KAAS,sBAAsB,eAAA,EAAiB;AACrE,kBAAA,eAAA,CAAgB,KAAA,IAAS,KAAK,KAAA,CAAM,YAAA;AACpC,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,iBAAA;AAAA,oBACN,OAAA,EAAS,KAAK,KAAA,CAAM,YAAA;AAAA,oBACpB,YAAY,eAAA,CAAgB,EAAA;AAAA,oBAC5B,GAAG;AAAA,mBACL;AAAA,gBACF;AACA,gBAAA;AAAA,cAEF,KAAK,oBAAA;AACH,gBAAA,IAAI,eAAA,EAAiB;AACnB,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,WAAA;AAAA,oBACN,QAAA,EAAU;AAAA,sBACR,IAAI,eAAA,CAAgB,EAAA;AAAA,sBACpB,MAAM,eAAA,CAAgB,IAAA;AAAA,sBACtB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,KAAK;AAAA,qBACrD;AAAA,oBACA,GAAG;AAAA,mBACL;AACA,kBAAA,eAAA,GAAkB,IAAA;AAAA,gBACpB;AACA,gBAAA,IAAI,oBAAA,EAAsB;AACxB,kBAAA,oBAAA,GAAuB,IAAA;AAAA,gBACzB;AACA,gBAAA;AAAA,cAEF,KAAK,eAAA;AACH,gBAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,kBAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAG3B,kBAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,uBAAA,IAA2B,CAAA,CAAA;AACjF,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,UAAA;AAAA,oBACN,UAAA,EAAY,OAAA;AAAA,oBACZ,QAAA,EAAU;AAAA,sBACR,KAAA,EAAO;AAAA,wBACL,YAAA,EAAc,iBAAA;AAAA,wBACd,gBAAA,EAAkB,CAAA;AAAA,wBAClB,WAAA,EAAa,iBAAA;AAAA;AAAA,wBAEb,eAAA,EAAiB,MAAM,uBAAA,IAA2B,CAAA;AAAA,wBAClD,gBAAA,EAAkB,MAAM,2BAAA,IAA+B;AAAA;AACzD,qBACF;AAAA,oBACA,GAAG;AAAA,mBACL;AAAA,gBACF;AACA,gBAAA;AAAA,cAEF,KAAK,eAAA;AACH,gBAAA,IAAI,KAAK,KAAA,EAAO;AACd,kBAAA,MAAM;AAAA,oBACJ,IAAA,EAAM,UAAA;AAAA,oBACN,UAAA,EAAY,QAAA;AAAA,oBACZ,QAAA,EAAU;AAAA,sBACR,KAAA,EAAO;AAAA,wBACL,YAAA,EAAc,CAAA;AAAA,wBACd,gBAAA,EAAkB,KAAK,KAAA,CAAM,aAAA;AAAA,wBAC7B,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA;AAC1B,qBACF;AAAA,oBACA,GAAG;AAAA,mBACL;AAAA,gBACF;AACA,gBAAA;AAAA;AACJ,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,IACvB,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAA,EAAgD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAgB,IAAI,CAAA;AAEtD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,MAAM,YAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG;AACtC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAA,CAAO,WAAW,KAAA,CAAM,IAAA;AAAA,MAC1B,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,SAAA,GAAY,SAAA;AAAA,IACrB;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,uBAAA,IAA2B,CAAA,CAAA;AACjF,MAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,QACb,YAAA,EAAc,iBAAA;AAAA,QACd,kBAAkB,KAAA,CAAM,aAAA;AAAA,QACxB,WAAA,EAAa,oBAAoB,KAAA,CAAM;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,CAAiB,QAAqB,MAAA,EAA0B;AACtE,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,KAAa,IAAA,CAAK,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AACtE,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,0BAAA,CAA2B,QAAQ,CAAA;AAEpE,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,MAChC,QAAA,EAAU,mBAAA;AAAA,MACV,MAAA;AAAA,MACA,GAAI,MAAA,IAAU,EAAE,MAAA,EAAO;AAAA,MACvB,GAAI,MAAA,CAAO,WAAA,KAAgB,UAAa,EAAE,WAAA,EAAa,OAAO,WAAA;AAAY,KAC5E;AAGA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAQ,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,QACzD,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,cAAc,IAAA,CAAK;AAAA,OACrB,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,MAAM,CAAA;AACzD,IAAA,IAAI,kBAAkB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5D,MAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAAA,IAClB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,MAAA,EAA0D;AACvF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,KAAc,MAAA,IAAa,OAAO,SAAA,KAAc,EAAA;AAC1E,IAAA,IAAI,CAAC,UAAA,IAAc,KAAA,KAAU,MAAA,EAAW;AACtC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,UAAU,MAAA,CAAO,SAAA;AAAA,IAC1B;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAAA,EACnD;AAAA,EAEQ,qBAAqB,MAAA,EAA0D;AACrF,IAAA,MAAM,MAAM,IAAA,CAAK,eAAA;AACjB,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,CAAA,GAAI,IAAI,MAAM,CAAA;AACpB,MAAA,IACE,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,QACN,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,WAAW,CAAA,EAC1B;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,IAChB;AACA,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA,EAAG;AACjF,MAAA,OAAO,EAAE,GAAG,GAAA,EAAI;AAAA,IAClB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,QAAA,EAG3B;AACA,IAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC/D,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAG9D,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,MAAA,GAAS,CAAA,GAC3C,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAiB,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,GACxD,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,cAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,2BAA2B,QAAA,EAA8C;AAC/E,IAAA,OAAO,QAAA,CAAS,IAAI,CAAA,GAAA,KAAO;AACzB,MAAA,MAAM,WAAA,GAAuC;AAAA,QAC3C,IAAA,EAAM,GAAA,CAAI,IAAA,KAAS,WAAA,GAAc,WAAA,GAAc,MAAA;AAAA,QAC/C,SAAS;AAAC,OACZ;AAEA,MAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,QAAA,WAAA,CAAY,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAAA,MAC5D,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAErC,QAAA,MAAM,eAAsB,EAAC;AAC7B,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,OAAA,EAAS;AAC9B,UAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,YAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,UACxB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,YAAA,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAO,IAAA,CAAa,MAAM,CAAA;AAAA,UAC9D,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,WAAA,CAAY,OAAA,GAAU,YAAA;AAGtB,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA,WAAA,CAAY,OAAA,GAAU,EAAA;AAAA,QACxB;AAAA,MACF;AAGA,MAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AAC7C,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,SAAA,EAAW;AAC9B,UAAC,WAAA,CAAY,QAAkB,IAAA,CAAK;AAAA,YAClC,IAAA,EAAM,UAAA;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,OAAO,EAAA,CAAG;AAAA,WACX,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,UAAA,EAAY;AACzC,QAAA,WAAA,CAAY,IAAA,GAAO,MAAA;AACnB,QAAA,WAAA,CAAY,UAAU,CAAC;AAAA,UACrB,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,UAAA;AAAA,UACjB,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KAAA,CAAM,IAAA,EAAc,IAAA,EAAe,MAAA,EAAyC;AACxF,IAAA,wBAAA,CAAyB,WAAA,EAAa,MAAM,IAAI,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAClC,IAAA,MAAM,IAAA,GAAoB;AAAA,MACxB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAa,IAAA,CAAK,MAAA;AAAA,QAClB,qBAAqB,IAAA,CAAK;AAAA,OAC5B;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,aAAa,OAAA,EAAA,EAAW;AACtE,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAM,IAAI,YAAA,CAAa,4BAAA,EAA8B,YAAY,CAAA;AAAA,MACnE;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,KAAA,CAAM,KAAK,IAAI,CAAA;AACjD,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,OAAO,QAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,GACJ,UAAU,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,IAAK,qBAAA,CAAsB,SAAS,MAAM,CAAA;AACpF,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,kBAAkB,QAAQ,CAAA;AAChC,UAAA,MAAM,aAAa,iBAAA,CAAkB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AACxE,UAAA,MAAM,OAAA,GAAU,iBAAiB,OAAA,EAAS,IAAA,CAAK,WAAW,WAAA,EAAa,IAAA,CAAK,WAAW,UAAU,CAAA;AACjG,UAAA,MAAM,MAAA,GACJ,cAAc,IAAA,GACV,IAAA,CAAK,IAAI,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,GAC/C,OAAA;AACN,UAAA,MAAM,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC1B,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,YAAA,CAAa,CAAC,CAAA,IAAK,MAAA,EAAQ,OAAA,EAAS;AACtC,UAAA,MAAM,CAAA;AAAA,QACR;AACA,QAAA,IAAI,UAAU,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,IAAK,qBAAA,CAAsB,CAAC,CAAA,EAAG;AACzE,UAAA,MAAM,OAAA,GAAU,iBAAiB,OAAA,EAAS,IAAA,CAAK,WAAW,WAAA,EAAa,IAAA,CAAK,WAAW,UAAU,CAAA;AACjG,UAAA,MAAM,KAAA,CAAM,SAAS,MAAM,CAAA;AAC3B,UAAA;AAAA,QACF;AACA,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AAAA,EAEQ,cAAc,GAAA,EAAsB;AAC1C,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,MAAA,EAA4C;AAC1E,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;AC9mBA,IAAM,mBAAA,GAAyD;AAAA,EAC7D,cAAA,EAAgB,EAAE,aAAA,EAAe,KAAA,EAAQ,iBAAiB,IAAA,EAAM;AAAA,EAChE,oBAAA,EAAsB,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,KAAA,EAAO;AAAA,EACxE,wBAAA,EAA0B,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,KAAA,EAAO;AAAA,EAC5E,aAAA,EAAe,EAAE,aAAA,EAAe,KAAA,EAAS,iBAAiB,KAAA;AAC5D,CAAA;AAqBO,SAAS,8BAAA,CACd,IAAA,EACA,kBAAA,EACA,cAAA,EACe;AACf,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,UAAA;AACtB,EAAA,IAAI,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzC,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,CAAA,GAAI,EAAA;AACV,MAAA,MAAM,KAAK,CAAA,CAAE,QAAA;AACb,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,IAAI,cAAA,EAAe;AAAA,UACnB,OAAO,OAAO,EAAA,EAAI,SAAS,QAAA,GAAW,EAAA,CAAG,OAAO,EAAA,KAAO,EAAA;AAAA,UACvD,SAAA,EAAW,kBAAA,CAAmB,EAAA,EAAI,SAAS;AAAA;AAC7C,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,gCAAgC,OAAA,EAAyC;AACvF,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,GAAG,OAAO,EAAA;AACpC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC1B;AAGA,SAAS,sBAAA,CAAuB,SAAiB,KAAA,EAAuB;AACtE,EAAA,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,EAAI,KAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9E;AAKO,IAAM,aAAA,GAAN,cAA4B,gBAAA,CAAiB;AAAA,EACzC,IAAA;AAAA,EACD,OAAA;AAAA,EACA,KAAA;AAAA,EACS,KAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACrC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,OAAA,CAAQ,IAAI,eAAA,IAAmB,wBAAA;AAChE,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,cAAA;AAC7B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AAEpB,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAGhC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,IACtB,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA,IAC9B,EAAE,aAAA,EAAe,IAAA,EAAO,eAAA,EAAiB,IAAA,EAAM;AAAA,EACtD;AAAA,EAEA,OAAO,OAAO,MAAA,EAAiD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAM,WAAA,EAAa,IAAA,EAAM,OAAO,MAAM,CAAA;AAElE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,MAAM,iBAAiB,MAAc,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEnG,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAA,CAAO,MAAA,EAAO;AACd,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,EAAS;AAEd,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,YAAA,MAAM,MAAM,MAAA,CAAO,sBAAA,GAAyB,EAAE,WAAA,EAAa,IAAA,KAAoB,EAAC;AAEhF,YAAA,MAAM,aAAA,GAAgB,8BAAA;AAAA,cACpB,IAAA;AAAA,cACA,CAAC,IAAA,KAAS,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACtC;AAAA,aACF;AACA,YAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,cAAA,MAAM,EAAE,GAAG,KAAA,EAAO,GAAG,GAAA,EAAI;AAAA,YAC3B;AAGA,YAAA,IAAI,KAAK,IAAA,EAAM;AACb,cAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,UAAA;AAAA,kBACN,UAAA,EAAY,QAAA;AAAA,kBACZ,QAAA,EAAU;AAAA,oBACR,KAAA,EAAO;AAAA,sBACL,YAAA,EAAe,KAAK,iBAAA,IAAgC,CAAA;AAAA,sBACpD,gBAAA,EAAmB,KAAK,UAAA,IAAyB,CAAA;AAAA,sBACjD,WAAA,EAAA,CACI,IAAA,CAAK,iBAAA,IAAgC,CAAA,KAAO,KAAK,UAAA,IAAyB,CAAA;AAAA;AAChF,mBACF;AAAA,kBACA,GAAG;AAAA,iBACL;AAAA,cACF;AACA,cAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,GAAA,EAAI;AAAA,YAC/B;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAA,EAAgD;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,aAAa,IAAI,CAAA;AAEnD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW;AAAA,KACpC;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAS,QAAA;AAC/B,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,IACpB;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,MAAA,MAAA,CAAO,YAAY,IAAA,CAAK,OAAA,CAAQ,WAAW,GAAA,CAAI,CAAC,IAAS,KAAA,MAAmB;AAAA,QAC1E,EAAA,EAAI,sBAAA,CAAuB,OAAA,EAAS,KAAK,CAAA;AAAA,QACzC,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,QAC3B,SAAA,EAAW,IAAA,CAAK,kBAAA,CAAmB,EAAA,CAAG,UAAU,SAAS;AAAA,OAC3D,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,MAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,QACb,YAAA,EAAc,KAAK,iBAAA,IAAqB,CAAA;AAAA,QACxC,gBAAA,EAAkB,KAAK,UAAA,IAAc,CAAA;AAAA,QACrC,WAAA,EAAA,CAAc,IAAA,CAAK,iBAAA,IAAqB,CAAA,KAAM,KAAK,UAAA,IAAc,CAAA;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,IAAA,EAAwC;AACjE,IAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAC1B,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA;AAC7D,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,QAAA,OAAO,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,OAAO,MAAA,GAAS,EAAE,OAAO,MAAA,EAAO;AAAA,MAClF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMmB,kBAAkB,QAAA,EAA8C;AACjF,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,SAAA,EAAW;AAC7C,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,SAAA,EAAW;AAC9B,UAAA,gBAAA,CAAiB,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,IAAI,CAAA,GAAA,KAAO;AACzB,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,UAAA,EAAY;AACzC,QAAA,MAAM,WAAW,gBAAA,CAAiB,GAAA,CAAI,GAAA,CAAI,UAAU,KAAK,GAAA,CAAI,IAAA;AAC7D,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,+BAAA,CAAgC,GAAA,CAAI,OAAiC,CAAA;AAAA,UAC9E,GAAI,QAAA,IAAY,EAAE,SAAA,EAAW,QAAA;AAAS,SACxC;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAA,EAAS,+BAAA,CAAgC,GAAA,CAAI,OAAO,CAAA;AAAA,QACpD,GAAI,IAAI,SAAA,IAAa,EAAE,YAAY,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAA,MAAO;AAAA,UAC1D,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,SAAA,EAAW,IAAA,CAAK,kBAAA,CAAmB,EAAA,CAAG,SAAS;AAAA;AACjD,UACA,CAAA;AAAC,OACL;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CAAiB,QAAqB,MAAA,EAA0B;AACtE,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAAA,MAChD,MAAA;AAAA,MACA,GAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,IAAa,EAAE,SAAS,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAAE,KACzF;AAEA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,IACpB;AAIA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAQ,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,QACzD,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACZ,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,KAAA,CAAM,IAAA,EAAc,IAAA,EAAe,MAAA,EAAyC;AACxF,IAAA,wBAAA,CAAyB,QAAA,EAAU,MAAM,IAAI,CAAA;AAC7C,IAAA,OAAO,WAAW,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB;AAAA,KACD,CAAA;AAAA,EACH;AACF;AAKO,SAAS,aAAa,MAAA,EAAsC;AACjE,EAAA,OAAO,IAAI,cAAc,MAAM,CAAA;AACjC;;;AChVO,SAAS,gBAAgB,SAAA,EAA4D;AAC1F,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,YAAY,EAAE,GAAG,IAAA,EAAM,GAAG,WAAU,GAAI,IAAA;AACjD;AAKO,SAAS,gBAAA,CACd,UACA,SAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,gBAAgB,QAAQ,CAAA;AACvC,EAAA,OAAO,YAAY,EAAE,GAAG,MAAA,EAAQ,GAAG,WAAU,GAAI,MAAA;AACnD;;;ACiBO,SAAS,WAAA,CACd,aACA,QAAA,EACc;AACd,EAAA,MAAM,MAAA,GAAS,gBAAgB,QAAQ,CAAA;AACvC,EAAA,QAAQ,YAAY,QAAA;AAAU,IAC5B,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,aAAA,CAAc;AAAA,QACvB,MAAA,EAAQ,WAAA,CAAY,MAAA,IAAU,MAAA,CAAO,cAAA,IAAkB,EAAA;AAAA,QACvD,OAAA,EAAS,WAAA,CAAY,OAAA,IAAW,MAAA,CAAO,eAAA;AAAA,QACvC,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAO,IAAI,gBAAA,CAAiB;AAAA,QAC1B,MAAA,EAAQ,WAAA,CAAY,MAAA,IAAU,MAAA,CAAO,iBAAA,IAAqB,EAAA;AAAA,QAC1D,OAAA,EAAS,WAAA,CAAY,OAAA,IAAW,MAAA,CAAO,kBAAA;AAAA,QACvC,OAAO,WAAA,CAAY;AAAA,OACpB,CAAA;AAAA,IACH,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,aAAA,CAAc;AAAA,QACvB,OAAA,EAAS,WAAA,CAAY,OAAA,IAAW,MAAA,CAAO,eAAA;AAAA,QACvC,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,OAAO,WAAA,CAAY;AAAA,OACpB,CAAA;AAAA;AAEL,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA4B,WAAA,CAAqC,QAAQ,CAAA,CAAE,CAAA;AAC7F","file":"chunk-742JTNYI.js","sourcesContent":["/**\n * When `AGENT_SDK_DEBUG_MODEL_REQUEST` is set to `1`, `true`, or `yes` (case-insensitive),\n * model adapters log the JSON request body to stderr before each HTTP call.\n * Use this to verify tools / JSON Schema sent to the provider.\n */\nconst TRUTHY = /^(1|true|yes)$/i;\n\nexport function isModelRequestDebugEnabled(): boolean {\n const raw = process.env.AGENT_SDK_DEBUG_MODEL_REQUEST;\n if (raw === undefined || raw === '') {\n return false;\n }\n return TRUTHY.test(String(raw).trim());\n}\n\n/**\n * @param provider - e.g. `openai`, `anthropic`, `ollama`\n * @param path - request path (e.g. `/chat/completions`)\n * @param body - object that will be JSON.stringify’d for the request\n */\nexport function debugLogModelRequestBody(provider: string, path: string, body: unknown): void {\n if (!isModelRequestDebugEnabled()) {\n return;\n }\n const prefix = `[agent-sdk][model-request][${provider}] ${path}`;\n try {\n const json =\n body !== null && typeof body === 'object'\n ? JSON.stringify(body, null, 2)\n : JSON.stringify(body);\n console.error(`${prefix}\\n${json}`);\n } catch {\n console.error(prefix, body);\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 { debugLogModelRequestBody } from './request-debug.js';\n\n/**\n * OpenAI 模型能力映射\n */\nconst OPENAI_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'gpt-4o': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'gpt-4o-mini': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'gpt-4-turbo': { contextLength: 128_000, maxOutputTokens: 4_096 },\n 'gpt-4': { contextLength: 8_192, maxOutputTokens: 4_096 },\n 'gpt-3.5-turbo': { contextLength: 16_385, maxOutputTokens: 4_096 },\n};\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 // 设置模型能力\n this.capabilities = config.capabilities\n ?? OPENAI_CAPABILITIES[this.model]\n ?? { contextLength: 128_000, maxOutputTokens: 4_096 };\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, params.signal);\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 {\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);\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 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 ...(params.maxTokens !== undefined && { max_tokens: params.maxTokens }),\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(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('openai', path, body);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n return globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal\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 { debugLogModelRequestBody } from './request-debug.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 */\nconst ANTHROPIC_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'claude-sonnet-4-20250514': { contextLength: 200_000, maxOutputTokens: 16_384 },\n 'claude-haiku': { contextLength: 200_000, maxOutputTokens: 8_192 },\n 'claude-3-5-sonnet-20241022': { contextLength: 200_000, maxOutputTokens: 8_192 },\n 'claude-3-haiku-20240307': { contextLength: 200_000, maxOutputTokens: 4_096 },\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 // 设置模型能力\n this.capabilities = config.capabilities\n ?? ANTHROPIC_CAPABILITIES[this.model]\n ?? { contextLength: 200_000, maxOutputTokens: 4_096 };\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, params.signal);\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 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 {\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);\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 body: Record<string, unknown> = {\n model: this.model,\n max_tokens: params.maxTokens || 4096,\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(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('anthropic', path, body);\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\n };\n\n for (let attempt = 0; attempt < this.fetchRetry.maxAttempts; attempt++) {\n if (signal?.aborted) {\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 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, signal);\n continue;\n }\n\n return response;\n } catch (e) {\n if (isAbortError(e) || signal?.aborted) {\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, signal);\n continue;\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 { debugLogModelRequestBody } from './request-debug.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 */\nconst OLLAMA_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'qwen3.5:0.8b': { contextLength: 32_768, maxOutputTokens: 4_096 },\n 'minimax-m2.7:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'nemotron-3-super:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'glm-5:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n};\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 // 设置模型能力 (Ollama 默认使用较小的上下文)\n this.capabilities = config.capabilities\n ?? OLLAMA_CAPABILITIES[this.model]\n ?? { contextLength: 4_096, maxOutputTokens: 2_048 };\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, params.signal);\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 {\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);\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 body: Record<string, unknown> = {\n model: this.model,\n messages: this.transformMessages(params.messages),\n stream,\n ...(params.temperature !== undefined && { options: { temperature: params.temperature } })\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(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('ollama', path, body);\n return globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body),\n signal\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 {\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"]}