@librechat/agents 3.1.85 → 3.1.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -0
- package/dist/cjs/agents/AgentContext.cjs +7 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/events.cjs +23 -0
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +133 -18
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +251 -53
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +1 -5
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +113 -24
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +3 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +18 -5
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +253 -0
- package/dist/cjs/openai/index.cjs.map +1 -0
- package/dist/cjs/responses/index.cjs +448 -0
- package/dist/cjs/responses/index.cjs.map +1 -0
- package/dist/cjs/run.cjs +108 -7
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +1057 -0
- package/dist/cjs/session/AgentSession.cjs.map +1 -0
- package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
- package/dist/cjs/session/handlers.cjs +221 -0
- package/dist/cjs/session/handlers.cjs.map +1 -0
- package/dist/cjs/session/ids.cjs +22 -0
- package/dist/cjs/session/ids.cjs.map +1 -0
- package/dist/cjs/session/messageSerialization.cjs +179 -0
- package/dist/cjs/session/messageSerialization.cjs.map +1 -0
- package/dist/cjs/stream.cjs +472 -11
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +177 -59
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
- package/dist/cjs/tools/handlers.cjs +1 -1
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +7 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/events.mjs +23 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +133 -18
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +251 -53
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +1 -5
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +113 -25
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +4 -2
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +5 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +246 -0
- package/dist/esm/openai/index.mjs.map +1 -0
- package/dist/esm/responses/index.mjs +440 -0
- package/dist/esm/responses/index.mjs.map +1 -0
- package/dist/esm/run.mjs +108 -7
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +1054 -0
- package/dist/esm/session/AgentSession.mjs.map +1 -0
- package/dist/esm/session/JsonlSessionStore.mjs +422 -0
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
- package/dist/esm/session/handlers.mjs +219 -0
- package/dist/esm/session/handlers.mjs.map +1 -0
- package/dist/esm/session/ids.mjs +17 -0
- package/dist/esm/session/ids.mjs.map +1 -0
- package/dist/esm/session/messageSerialization.mjs +173 -0
- package/dist/esm/session/messageSerialization.mjs.map +1 -0
- package/dist/esm/stream.mjs +473 -12
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +1 -1
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +177 -59
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/eagerEventExecution.mjs +107 -0
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
- package/dist/esm/tools/handlers.mjs +1 -1
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
- package/dist/types/events.d.ts +1 -0
- package/dist/types/graphs/Graph.d.ts +24 -9
- package/dist/types/index.d.ts +1 -0
- package/dist/types/llm/openai/index.d.ts +1 -0
- package/dist/types/openai/index.d.ts +75 -0
- package/dist/types/responses/index.d.ts +97 -0
- package/dist/types/run.d.ts +2 -0
- package/dist/types/session/AgentSession.d.ts +32 -0
- package/dist/types/session/JsonlSessionStore.d.ts +67 -0
- package/dist/types/session/handlers.d.ts +8 -0
- package/dist/types/session/ids.d.ts +4 -0
- package/dist/types/session/index.d.ts +5 -0
- package/dist/types/session/messageSerialization.d.ts +7 -0
- package/dist/types/session/types.d.ts +191 -0
- package/dist/types/tools/ToolNode.d.ts +12 -1
- package/dist/types/tools/eagerEventExecution.d.ts +23 -0
- package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
- package/dist/types/types/hitl.d.ts +4 -0
- package/dist/types/types/run.d.ts +11 -1
- package/dist/types/types/tools.d.ts +36 -0
- package/package.json +19 -2
- package/src/__tests__/stream.eagerEventExecution.test.ts +2458 -0
- package/src/agents/AgentContext.ts +7 -2
- package/src/agents/__tests__/AgentContext.test.ts +254 -5
- package/src/events.ts +29 -0
- package/src/graphs/Graph.ts +224 -50
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
- package/src/index.ts +3 -0
- package/src/llm/anthropic/index.ts +356 -84
- package/src/llm/anthropic/llm.spec.ts +64 -0
- package/src/llm/custom-chat-models.smoke.test.ts +175 -4
- package/src/llm/openai/contentBlocks.test.ts +35 -0
- package/src/llm/openai/deepseek.test.ts +201 -2
- package/src/llm/openai/index.ts +171 -26
- package/src/llm/openai/utils/index.ts +22 -0
- package/src/llm/openrouter/index.ts +4 -2
- package/src/openai/__tests__/openai.test.ts +337 -0
- package/src/openai/index.ts +404 -0
- package/src/responses/__tests__/responses.test.ts +652 -0
- package/src/responses/index.ts +677 -0
- package/src/run.ts +158 -8
- package/src/scripts/compare_pi_vs_ours.ts +592 -173
- package/src/scripts/session_live.ts +548 -0
- package/src/session/AgentSession.ts +1432 -0
- package/src/session/JsonlSessionStore.ts +572 -0
- package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
- package/src/session/__tests__/handlers.test.ts +161 -0
- package/src/session/handlers.ts +272 -0
- package/src/session/ids.ts +17 -0
- package/src/session/index.ts +44 -0
- package/src/session/messageSerialization.ts +207 -0
- package/src/session/types.ts +275 -0
- package/src/specs/custom-event-await.test.ts +89 -0
- package/src/specs/summarization.test.ts +1 -1
- package/src/stream.ts +755 -48
- package/src/summarization/node.ts +1 -1
- package/src/tools/ToolNode.ts +299 -126
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
- package/src/tools/__tests__/handlers.test.ts +2 -1
- package/src/tools/__tests__/hitl.test.ts +206 -110
- package/src/tools/eagerEventExecution.ts +153 -0
- package/src/tools/handlers.ts +8 -4
- package/src/tools/streamedToolCallSeals.ts +57 -0
- package/src/types/hitl.ts +4 -0
- package/src/types/run.ts +11 -0
- package/src/types/tools.ts +36 -0
- package/dist/cjs/llm/text.cjs +0 -69
- package/dist/cjs/llm/text.cjs.map +0 -1
- package/dist/esm/llm/text.mjs +0 -67
- package/dist/esm/llm/text.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/openai/index.ts"],"sourcesContent":["import { GraphEvents } from '@/common';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\n\nexport interface OpenAICompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport interface OpenAIResponseContext {\n requestId: string;\n model: string;\n created: number;\n}\n\nexport interface OpenAICompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface OpenAIChatCompletionChunkChoice {\n index: number;\n delta: {\n role?: 'assistant';\n content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n}\n\nexport interface OpenAIChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: OpenAIChatCompletionChunkChoice[];\n usage?: OpenAICompletionUsage;\n}\n\nexport interface OpenAIStreamTracker {\n hasRole: boolean;\n hasText: boolean;\n hasReasoning: boolean;\n lastChunkKind?: 'text' | 'reasoning' | 'tool_call';\n toolCalls: Map<number, OpenAIToolCall>;\n toolCallsByStep?: Map<string, Map<number, OpenAIToolCall>>;\n usage: {\n promptTokens: number;\n completionTokens: number;\n reasoningTokens: number;\n };\n}\n\nexport interface OpenAIHandlerConfig {\n writer: OpenAICompatibleWriter;\n context: OpenAIResponseContext;\n tracker: OpenAIStreamTracker;\n}\n\ninterface OpenAIToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nexport function createOpenAIStreamTracker(): OpenAIStreamTracker {\n return {\n hasRole: false,\n hasText: false,\n hasReasoning: false,\n toolCalls: new Map(),\n toolCallsByStep: new Map(),\n usage: {\n promptTokens: 0,\n completionTokens: 0,\n reasoningTokens: 0,\n },\n };\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction getReasoningTokenCount(usage: Partial<UsageMetadata>): number {\n return getTokenCount(usage.output_token_details?.reasoning);\n}\n\nfunction getToolCallIndex(\n toolCall: OpenAIToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallName(toolCall: OpenAIToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: OpenAIToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nfunction getStepToolCalls(\n tracker: OpenAIStreamTracker,\n stepId: string\n): Map<number, OpenAIToolCall> {\n const toolCallsByStep = tracker.toolCallsByStep ?? new Map();\n tracker.toolCallsByStep = toolCallsByStep;\n const existing = toolCallsByStep.get(stepId);\n if (existing != null) {\n return existing;\n }\n const stepToolCalls = new Map<number, OpenAIToolCall>();\n toolCallsByStep.set(stepId, stepToolCalls);\n return stepToolCalls;\n}\n\nexport function createChatCompletionChunk(\n context: OpenAIResponseContext,\n delta: OpenAIChatCompletionChunkChoice['delta'],\n finishReason: OpenAIChatCompletionChunkChoice['finish_reason'] = null,\n usage?: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [{ index: 0, delta, finish_reason: finishReason }],\n ...(usage ? { usage } : {}),\n };\n}\n\nexport function createChatCompletionUsageChunk(\n context: OpenAIResponseContext,\n usage: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [],\n usage,\n };\n}\n\nexport async function writeOpenAISSE(\n writer: OpenAICompatibleWriter,\n data: OpenAIChatCompletionChunk | '[DONE]'\n): Promise<void> {\n await writer.write(\n `data: ${data === '[DONE]' ? data : JSON.stringify(data)}\\n\\n`\n );\n}\n\nfunction getTextParts(\n data: t.MessageDeltaEvent | t.ReasoningDeltaEvent\n): string[] {\n const parts = data.delta.content ?? [];\n const text: string[] = [];\n for (const part of parts) {\n if ('text' in part && typeof part.text === 'string') {\n text.push(part.text);\n continue;\n }\n if ('think' in part && typeof part.think === 'string') {\n text.push(part.think);\n }\n }\n return text;\n}\n\nasync function emitAssistantRoleChunk(\n config: OpenAIHandlerConfig\n): Promise<void> {\n if (config.tracker.hasRole) {\n return;\n }\n config.tracker.hasRole = true;\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { role: 'assistant' })\n );\n}\n\nasync function emitToolCallChunk(params: {\n config: OpenAIHandlerConfig;\n stepId: string;\n toolCall: OpenAIToolCallFragment;\n fallbackIndex: number;\n completed: boolean;\n}): Promise<void> {\n const { config, stepId, toolCall, fallbackIndex, completed } = params;\n const index = getToolCallIndex(toolCall, fallbackIndex);\n const stepToolCalls = getStepToolCalls(config.tracker, stepId);\n const existing = stepToolCalls.get(index);\n const current = existing ?? {\n id: toolCall.id ?? '',\n type: 'function' as const,\n function: { name: '', arguments: '' },\n };\n const name = getToolCallName(toolCall);\n const args = getToolCallArguments(toolCall);\n const idChanged =\n toolCall.id != null && toolCall.id !== '' && current.id !== toolCall.id;\n const nameChanged = name !== '' && current.function.name !== name;\n let argumentDelta = '';\n if (completed) {\n if (args !== '' && args !== current.function.arguments) {\n argumentDelta = args.startsWith(current.function.arguments)\n ? args.slice(current.function.arguments.length)\n : args;\n current.function.arguments = args;\n }\n } else if (args !== '') {\n argumentDelta = args;\n current.function.arguments += args;\n }\n if (toolCall.id != null && toolCall.id !== '') {\n current.id = toolCall.id;\n }\n if (name !== '') {\n current.function.name = name;\n }\n stepToolCalls.set(index, current);\n config.tracker.toolCalls.set(index, current);\n if (!idChanged && !nameChanged && argumentDelta === '' && existing) {\n return;\n }\n config.tracker.lastChunkKind = 'tool_call';\n const functionDelta: { name?: string; arguments?: string } = {};\n if (nameChanged || (!existing && current.function.name !== '')) {\n functionDelta.name = current.function.name;\n }\n if (argumentDelta !== '') {\n functionDelta.arguments = argumentDelta;\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {\n tool_calls: [\n {\n index,\n ...(current.id !== '' ? { id: current.id } : {}),\n type: 'function',\n ...(functionDelta.name != null || functionDelta.arguments != null\n ? { function: functionDelta }\n : {}),\n },\n ],\n })\n );\n}\n\nexport function createOpenAIHandlers(\n config: OpenAIHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.MessageDeltaEvent)) {\n config.tracker.hasText = true;\n config.tracker.lastChunkKind = 'text';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { content: text })\n );\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.ReasoningDeltaEvent)) {\n config.tracker.hasReasoning = true;\n config.tracker.lastChunkKind = 'reasoning';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { reasoning: text })\n );\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const delta = runStepDelta.delta;\n if (delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStepDelta.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: false,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStep.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: true,\n });\n }\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.promptTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.completionTokens += getTokenCount(\n usage.output_tokens\n );\n config.tracker.usage.reasoningTokens += getReasoningTokenCount(usage);\n },\n },\n };\n}\n\nexport async function sendOpenAIFinalChunk(\n config: OpenAIHandlerConfig,\n finishReason?: OpenAIChatCompletionChunkChoice['finish_reason']\n): Promise<void> {\n const resolvedFinishReason =\n finishReason ??\n (config.tracker.lastChunkKind === 'tool_call' ? 'tool_calls' : 'stop');\n const usage: OpenAICompletionUsage = {\n prompt_tokens: config.tracker.usage.promptTokens,\n completion_tokens: config.tracker.usage.completionTokens,\n total_tokens:\n config.tracker.usage.promptTokens + config.tracker.usage.completionTokens,\n };\n if (config.tracker.usage.reasoningTokens > 0) {\n usage.completion_tokens_details = {\n reasoning_tokens: config.tracker.usage.reasoningTokens,\n };\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {}, resolvedFinishReason)\n );\n await writeOpenAISSE(\n config.writer,\n createChatCompletionUsageChunk(config.context, usage)\n );\n await writeOpenAISSE(config.writer, '[DONE]');\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { GraphEvents } from '../common/enum.mjs';
|
|
2
|
+
|
|
3
|
+
let responseItemId = 0;
|
|
4
|
+
function createItemId(prefix) {
|
|
5
|
+
return `${prefix}_${Date.now().toString(36)}${(responseItemId++).toString(36)}`;
|
|
6
|
+
}
|
|
7
|
+
function createResponseTracker() {
|
|
8
|
+
const tracker = {
|
|
9
|
+
sequenceNumber: 0,
|
|
10
|
+
items: [],
|
|
11
|
+
message: undefined,
|
|
12
|
+
reasoning: undefined,
|
|
13
|
+
functionCalls: new Map(),
|
|
14
|
+
functionCallsByStep: new Map(),
|
|
15
|
+
responseCreated: false,
|
|
16
|
+
usage: {
|
|
17
|
+
inputTokens: 0,
|
|
18
|
+
outputTokens: 0,
|
|
19
|
+
},
|
|
20
|
+
nextSequence: () => tracker.sequenceNumber++,
|
|
21
|
+
};
|
|
22
|
+
return tracker;
|
|
23
|
+
}
|
|
24
|
+
function getTokenCount(value) {
|
|
25
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : 0;
|
|
26
|
+
}
|
|
27
|
+
function getToolCallIndex(toolCall, fallbackIndex) {
|
|
28
|
+
return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;
|
|
29
|
+
}
|
|
30
|
+
function getToolCallPositionKey(stepId, toolCall, fallbackIndex) {
|
|
31
|
+
const index = getToolCallIndex(toolCall, fallbackIndex);
|
|
32
|
+
if (stepId !== '') {
|
|
33
|
+
return `${stepId}:${index}`;
|
|
34
|
+
}
|
|
35
|
+
return `tool:${index}`;
|
|
36
|
+
}
|
|
37
|
+
function getToolCallIdKey(toolCall) {
|
|
38
|
+
return toolCall.id != null && toolCall.id !== '' ? toolCall.id : undefined;
|
|
39
|
+
}
|
|
40
|
+
function getExistingFunctionCall(config, idKey, positionKey, stepId, toolCall) {
|
|
41
|
+
const keyed = idKey == null
|
|
42
|
+
? undefined
|
|
43
|
+
: (config.tracker.functionCalls.get(idKey) ??
|
|
44
|
+
(positionKey == null
|
|
45
|
+
? undefined
|
|
46
|
+
: config.tracker.functionCalls.get(positionKey)));
|
|
47
|
+
if (keyed != null) {
|
|
48
|
+
return keyed;
|
|
49
|
+
}
|
|
50
|
+
const positioned = positionKey == null
|
|
51
|
+
? undefined
|
|
52
|
+
: config.tracker.functionCalls.get(positionKey);
|
|
53
|
+
if (positioned != null) {
|
|
54
|
+
return positioned;
|
|
55
|
+
}
|
|
56
|
+
if (stepId === '') {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return findFunctionCallByStep(config, stepId, toolCall);
|
|
60
|
+
}
|
|
61
|
+
function findFunctionCallByStep(config, stepId, toolCall) {
|
|
62
|
+
const items = config.tracker.functionCallsByStep.get(stepId);
|
|
63
|
+
if (items == null) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const index = typeof toolCall.index === 'number' ? toolCall.index : undefined;
|
|
67
|
+
if (index != null) {
|
|
68
|
+
return items[index];
|
|
69
|
+
}
|
|
70
|
+
const name = getToolCallName(toolCall);
|
|
71
|
+
let fallback;
|
|
72
|
+
for (const item of items) {
|
|
73
|
+
if (item == null || item.status === 'completed') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (name !== '' && item.name !== name) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (fallback != null) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
fallback = item;
|
|
83
|
+
}
|
|
84
|
+
return fallback;
|
|
85
|
+
}
|
|
86
|
+
function trackFunctionCallKeys(config, item, idKey, positionKey) {
|
|
87
|
+
config.tracker.functionCalls.set(positionKey, item);
|
|
88
|
+
if (idKey != null) {
|
|
89
|
+
config.tracker.functionCalls.set(idKey, item);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function trackFunctionCallStep(config, stepId, item, fallbackIndex) {
|
|
93
|
+
if (stepId === '') {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const items = config.tracker.functionCallsByStep.get(stepId) ?? [];
|
|
97
|
+
items[fallbackIndex] = item;
|
|
98
|
+
config.tracker.functionCallsByStep.set(stepId, items);
|
|
99
|
+
}
|
|
100
|
+
function getToolCallName(toolCall) {
|
|
101
|
+
return toolCall.name ?? toolCall.function?.name ?? '';
|
|
102
|
+
}
|
|
103
|
+
function getToolCallArguments(toolCall) {
|
|
104
|
+
const args = toolCall.args ?? toolCall.function?.arguments;
|
|
105
|
+
if (args == null) {
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
if (typeof args === 'string') {
|
|
109
|
+
return args;
|
|
110
|
+
}
|
|
111
|
+
return JSON.stringify(args);
|
|
112
|
+
}
|
|
113
|
+
async function ensureFunctionCall(config, stepId, toolCall, fallbackIndex) {
|
|
114
|
+
await ensureResponseCreated(config);
|
|
115
|
+
const positionKey = getToolCallPositionKey(stepId, toolCall, fallbackIndex);
|
|
116
|
+
const idKey = getToolCallIdKey(toolCall);
|
|
117
|
+
const existing = getExistingFunctionCall(config, idKey, positionKey, stepId, toolCall);
|
|
118
|
+
const toolCallIndex = getToolCallIndex(toolCall, fallbackIndex);
|
|
119
|
+
const name = getToolCallName(toolCall);
|
|
120
|
+
if (existing) {
|
|
121
|
+
trackFunctionCallKeys(config, existing, idKey, positionKey);
|
|
122
|
+
trackFunctionCallStep(config, stepId, existing, toolCallIndex);
|
|
123
|
+
if (idKey != null) {
|
|
124
|
+
existing.call_id = idKey;
|
|
125
|
+
}
|
|
126
|
+
if (name !== '') {
|
|
127
|
+
existing.name = name;
|
|
128
|
+
}
|
|
129
|
+
return existing;
|
|
130
|
+
}
|
|
131
|
+
const item = {
|
|
132
|
+
type: 'function_call',
|
|
133
|
+
id: createItemId('fc'),
|
|
134
|
+
call_id: idKey ?? positionKey,
|
|
135
|
+
name,
|
|
136
|
+
arguments: '',
|
|
137
|
+
status: 'in_progress',
|
|
138
|
+
};
|
|
139
|
+
trackFunctionCallKeys(config, item, idKey, positionKey);
|
|
140
|
+
trackFunctionCallStep(config, stepId, item, toolCallIndex);
|
|
141
|
+
config.tracker.items.push(item);
|
|
142
|
+
await writeResponseEvent(config.writer, {
|
|
143
|
+
type: 'response.output_item.added',
|
|
144
|
+
sequence_number: config.tracker.nextSequence(),
|
|
145
|
+
output_index: config.tracker.items.length - 1,
|
|
146
|
+
item,
|
|
147
|
+
});
|
|
148
|
+
return item;
|
|
149
|
+
}
|
|
150
|
+
async function emitFunctionCallArgumentsDelta(params) {
|
|
151
|
+
if (params.delta === '') {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
params.item.arguments += params.delta;
|
|
155
|
+
await writeResponseEvent(params.config.writer, {
|
|
156
|
+
type: 'response.function_call_arguments.delta',
|
|
157
|
+
sequence_number: params.config.tracker.nextSequence(),
|
|
158
|
+
item_id: params.item.id,
|
|
159
|
+
output_index: params.config.tracker.items.indexOf(params.item),
|
|
160
|
+
call_id: params.item.call_id,
|
|
161
|
+
delta: params.delta,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async function emitFunctionCallArgumentsDone(config, item) {
|
|
165
|
+
await writeResponseEvent(config.writer, {
|
|
166
|
+
type: 'response.function_call_arguments.done',
|
|
167
|
+
sequence_number: config.tracker.nextSequence(),
|
|
168
|
+
item_id: item.id,
|
|
169
|
+
output_index: config.tracker.items.indexOf(item),
|
|
170
|
+
call_id: item.call_id,
|
|
171
|
+
name: item.name,
|
|
172
|
+
arguments: item.arguments,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async function completeFunctionCall(config, stepId, toolCall) {
|
|
176
|
+
const fallbackIndex = typeof toolCall.index === 'number' ? toolCall.index : undefined;
|
|
177
|
+
const positionKey = fallbackIndex == null
|
|
178
|
+
? undefined
|
|
179
|
+
: getToolCallPositionKey(stepId, toolCall, fallbackIndex);
|
|
180
|
+
const item = getExistingFunctionCall(config, getToolCallIdKey(toolCall), positionKey, stepId, toolCall) ??
|
|
181
|
+
(await ensureFunctionCall(config, stepId, toolCall, fallbackIndex ?? 0));
|
|
182
|
+
if (item.status === 'completed') {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const finalArguments = getToolCallArguments(toolCall);
|
|
186
|
+
if (finalArguments !== '' &&
|
|
187
|
+
finalArguments !== item.arguments &&
|
|
188
|
+
finalArguments.startsWith(item.arguments)) {
|
|
189
|
+
await emitFunctionCallArgumentsDelta({
|
|
190
|
+
config,
|
|
191
|
+
item,
|
|
192
|
+
delta: finalArguments.slice(item.arguments.length),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (finalArguments !== '') {
|
|
196
|
+
item.arguments = finalArguments;
|
|
197
|
+
}
|
|
198
|
+
await emitFunctionCallArgumentsDone(config, item);
|
|
199
|
+
item.status = 'completed';
|
|
200
|
+
await writeResponseEvent(config.writer, {
|
|
201
|
+
type: 'response.output_item.done',
|
|
202
|
+
sequence_number: config.tracker.nextSequence(),
|
|
203
|
+
output_index: config.tracker.items.indexOf(item),
|
|
204
|
+
item,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
function buildResponse(context, tracker, status = 'in_progress') {
|
|
208
|
+
const completed = status === 'completed';
|
|
209
|
+
return {
|
|
210
|
+
id: context.responseId,
|
|
211
|
+
object: 'response',
|
|
212
|
+
created_at: context.createdAt,
|
|
213
|
+
completed_at: completed ? Math.floor(Date.now() / 1000) : null,
|
|
214
|
+
status,
|
|
215
|
+
model: context.model,
|
|
216
|
+
previous_response_id: context.previousResponseId ?? null,
|
|
217
|
+
instructions: context.instructions ?? null,
|
|
218
|
+
output: tracker.items,
|
|
219
|
+
error: null,
|
|
220
|
+
usage: completed
|
|
221
|
+
? {
|
|
222
|
+
input_tokens: tracker.usage.inputTokens,
|
|
223
|
+
output_tokens: tracker.usage.outputTokens,
|
|
224
|
+
total_tokens: tracker.usage.inputTokens + tracker.usage.outputTokens,
|
|
225
|
+
}
|
|
226
|
+
: null,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
async function writeResponseEvent(writer, event) {
|
|
230
|
+
await writer.write(`event: ${event.type}\n`);
|
|
231
|
+
await writer.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
232
|
+
}
|
|
233
|
+
async function writeResponsesDone(writer) {
|
|
234
|
+
await writer.write('data: [DONE]\n\n');
|
|
235
|
+
}
|
|
236
|
+
async function ensureResponseCreated(config) {
|
|
237
|
+
if (config.tracker.responseCreated) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
config.tracker.responseCreated = true;
|
|
241
|
+
await writeResponseEvent(config.writer, {
|
|
242
|
+
type: 'response.created',
|
|
243
|
+
sequence_number: config.tracker.nextSequence(),
|
|
244
|
+
response: buildResponse(config.context, config.tracker),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async function emitOutputContentDone(config, item) {
|
|
248
|
+
const outputIndex = config.tracker.items.indexOf(item);
|
|
249
|
+
if (item.type === 'message') {
|
|
250
|
+
await writeResponseEvent(config.writer, {
|
|
251
|
+
type: 'response.output_text.done',
|
|
252
|
+
sequence_number: config.tracker.nextSequence(),
|
|
253
|
+
item_id: item.id,
|
|
254
|
+
output_index: outputIndex,
|
|
255
|
+
content_index: 0,
|
|
256
|
+
text: item.content[0].text,
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
await writeResponseEvent(config.writer, {
|
|
261
|
+
type: 'response.reasoning_text.done',
|
|
262
|
+
sequence_number: config.tracker.nextSequence(),
|
|
263
|
+
item_id: item.id,
|
|
264
|
+
output_index: outputIndex,
|
|
265
|
+
content_index: 0,
|
|
266
|
+
text: item.content[0].text,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
async function ensureMessage(config) {
|
|
270
|
+
await ensureResponseCreated(config);
|
|
271
|
+
if (config.tracker.message) {
|
|
272
|
+
return config.tracker.message;
|
|
273
|
+
}
|
|
274
|
+
const item = {
|
|
275
|
+
type: 'message',
|
|
276
|
+
id: createItemId('msg'),
|
|
277
|
+
role: 'assistant',
|
|
278
|
+
status: 'in_progress',
|
|
279
|
+
content: [{ type: 'output_text', text: '', annotations: [], logprobs: [] }],
|
|
280
|
+
};
|
|
281
|
+
config.tracker.message = item;
|
|
282
|
+
config.tracker.items.push(item);
|
|
283
|
+
await writeResponseEvent(config.writer, {
|
|
284
|
+
type: 'response.output_item.added',
|
|
285
|
+
sequence_number: config.tracker.nextSequence(),
|
|
286
|
+
output_index: config.tracker.items.length - 1,
|
|
287
|
+
item,
|
|
288
|
+
});
|
|
289
|
+
return item;
|
|
290
|
+
}
|
|
291
|
+
async function ensureReasoning(config) {
|
|
292
|
+
await ensureResponseCreated(config);
|
|
293
|
+
if (config.tracker.reasoning) {
|
|
294
|
+
return config.tracker.reasoning;
|
|
295
|
+
}
|
|
296
|
+
const item = {
|
|
297
|
+
type: 'reasoning',
|
|
298
|
+
id: createItemId('reason'),
|
|
299
|
+
status: 'in_progress',
|
|
300
|
+
content: [{ type: 'reasoning_text', text: '' }],
|
|
301
|
+
summary: [],
|
|
302
|
+
};
|
|
303
|
+
config.tracker.reasoning = item;
|
|
304
|
+
config.tracker.items.push(item);
|
|
305
|
+
await writeResponseEvent(config.writer, {
|
|
306
|
+
type: 'response.output_item.added',
|
|
307
|
+
sequence_number: config.tracker.nextSequence(),
|
|
308
|
+
output_index: config.tracker.items.length - 1,
|
|
309
|
+
item,
|
|
310
|
+
});
|
|
311
|
+
return item;
|
|
312
|
+
}
|
|
313
|
+
function createResponsesEventHandlers(config) {
|
|
314
|
+
return {
|
|
315
|
+
[GraphEvents.ON_MESSAGE_DELTA]: {
|
|
316
|
+
handle: async (_event, data) => {
|
|
317
|
+
const item = await ensureMessage(config);
|
|
318
|
+
for (const part of data.delta.content ?? []) {
|
|
319
|
+
if (!('text' in part) || typeof part.text !== 'string') {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
item.content[0].text += part.text;
|
|
323
|
+
await writeResponseEvent(config.writer, {
|
|
324
|
+
type: 'response.output_text.delta',
|
|
325
|
+
sequence_number: config.tracker.nextSequence(),
|
|
326
|
+
item_id: item.id,
|
|
327
|
+
output_index: config.tracker.items.indexOf(item),
|
|
328
|
+
content_index: 0,
|
|
329
|
+
delta: part.text,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
[GraphEvents.ON_REASONING_DELTA]: {
|
|
335
|
+
handle: async (_event, data) => {
|
|
336
|
+
const item = await ensureReasoning(config);
|
|
337
|
+
for (const part of data.delta.content ??
|
|
338
|
+
[]) {
|
|
339
|
+
let text;
|
|
340
|
+
if ('think' in part && typeof part.think === 'string') {
|
|
341
|
+
text = part.think;
|
|
342
|
+
}
|
|
343
|
+
else if ('text' in part && typeof part.text === 'string') {
|
|
344
|
+
text = part.text;
|
|
345
|
+
}
|
|
346
|
+
if (typeof text !== 'string') {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
item.content[0].text += text;
|
|
350
|
+
await writeResponseEvent(config.writer, {
|
|
351
|
+
type: 'response.reasoning_text.delta',
|
|
352
|
+
sequence_number: config.tracker.nextSequence(),
|
|
353
|
+
item_id: item.id,
|
|
354
|
+
output_index: config.tracker.items.indexOf(item),
|
|
355
|
+
content_index: 0,
|
|
356
|
+
delta: text,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
[GraphEvents.ON_RUN_STEP]: {
|
|
362
|
+
handle: async (_event, data) => {
|
|
363
|
+
const runStep = data;
|
|
364
|
+
if (runStep.stepDetails.type !== 'tool_calls') {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const toolCalls = runStep.stepDetails.tool_calls ?? [];
|
|
368
|
+
for (let index = 0; index < toolCalls.length; index++) {
|
|
369
|
+
await ensureFunctionCall(config, runStep.id, toolCalls[index], index);
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
[GraphEvents.ON_RUN_STEP_DELTA]: {
|
|
374
|
+
handle: async (_event, data) => {
|
|
375
|
+
const runStepDelta = data;
|
|
376
|
+
if (runStepDelta.delta.type !== 'tool_calls') {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const toolCalls = runStepDelta.delta.tool_calls ?? [];
|
|
380
|
+
for (let index = 0; index < toolCalls.length; index++) {
|
|
381
|
+
const item = await ensureFunctionCall(config, runStepDelta.id, toolCalls[index], index);
|
|
382
|
+
await emitFunctionCallArgumentsDelta({
|
|
383
|
+
config,
|
|
384
|
+
item,
|
|
385
|
+
delta: getToolCallArguments(toolCalls[index]),
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
[GraphEvents.ON_RUN_STEP_COMPLETED]: {
|
|
391
|
+
handle: async (_event, data) => {
|
|
392
|
+
const completed = data;
|
|
393
|
+
if (!completed.result?.tool_call) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
await completeFunctionCall(config, completed.result.id ?? '', completed.result.tool_call);
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
[GraphEvents.CHAT_MODEL_END]: {
|
|
400
|
+
handle: (_event, data) => {
|
|
401
|
+
const usage = data?.output?.usage_metadata;
|
|
402
|
+
if (!usage) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
config.tracker.usage.inputTokens += getTokenCount(usage.input_tokens);
|
|
406
|
+
config.tracker.usage.outputTokens += getTokenCount(usage.output_tokens);
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
async function emitResponseCompleted(config) {
|
|
412
|
+
await ensureResponseCreated(config);
|
|
413
|
+
for (const item of config.tracker.items) {
|
|
414
|
+
if (item.status === 'completed') {
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
if (item.type === 'message' || item.type === 'reasoning') {
|
|
418
|
+
await emitOutputContentDone(config, item);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
await emitFunctionCallArgumentsDone(config, item);
|
|
422
|
+
}
|
|
423
|
+
item.status = 'completed';
|
|
424
|
+
await writeResponseEvent(config.writer, {
|
|
425
|
+
type: 'response.output_item.done',
|
|
426
|
+
sequence_number: config.tracker.nextSequence(),
|
|
427
|
+
output_index: config.tracker.items.indexOf(item),
|
|
428
|
+
item,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
await writeResponseEvent(config.writer, {
|
|
432
|
+
type: 'response.completed',
|
|
433
|
+
sequence_number: config.tracker.nextSequence(),
|
|
434
|
+
response: buildResponse(config.context, config.tracker, 'completed'),
|
|
435
|
+
});
|
|
436
|
+
await writeResponsesDone(config.writer);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
export { buildResponse, createResponseTracker, createResponsesEventHandlers, emitResponseCompleted, ensureResponseCreated, writeResponseEvent, writeResponsesDone };
|
|
440
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/responses/index.ts"],"sourcesContent":["import { GraphEvents } from '@/common';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\n\nexport interface ResponsesCompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport type ResponseStatus =\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'incomplete';\nexport type ItemStatus = 'in_progress' | 'incomplete' | 'completed';\n\nexport interface ResponseContext {\n responseId: string;\n model: string;\n createdAt: number;\n previousResponseId?: string;\n instructions?: string;\n}\n\nexport interface ResponseOutputTextContent {\n type: 'output_text';\n text: string;\n annotations: [];\n logprobs: [];\n}\n\nexport interface ResponseMessageItem {\n type: 'message';\n id: string;\n role: 'assistant';\n status: ItemStatus;\n content: ResponseOutputTextContent[];\n}\n\nexport interface ResponseFunctionCallItem {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: ItemStatus;\n}\n\nexport interface ResponseReasoningItem {\n type: 'reasoning';\n id: string;\n status: ItemStatus;\n content: Array<{ type: 'reasoning_text'; text: string }>;\n summary: [];\n}\n\nexport type ResponseOutputItem =\n | ResponseMessageItem\n | ResponseFunctionCallItem\n | ResponseReasoningItem;\n\nexport interface ResponseObject {\n id: string;\n object: 'response';\n created_at: number;\n completed_at: number | null;\n status: ResponseStatus;\n model: string;\n previous_response_id: string | null;\n instructions: string | null;\n output: ResponseOutputItem[];\n error: { type: string; message: string; code?: string } | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface ResponseEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\nexport interface ResponseTracker {\n sequenceNumber: number;\n items: ResponseOutputItem[];\n message: ResponseMessageItem | undefined;\n reasoning: ResponseReasoningItem | undefined;\n functionCalls: Map<string, ResponseFunctionCallItem>;\n functionCallsByStep: Map<string, Array<ResponseFunctionCallItem | undefined>>;\n responseCreated: boolean;\n usage: {\n inputTokens: number;\n outputTokens: number;\n };\n nextSequence(): number;\n}\n\nexport interface ResponsesHandlerConfig {\n writer: ResponsesCompatibleWriter;\n context: ResponseContext;\n tracker: ResponseTracker;\n}\n\nlet responseItemId = 0;\n\nfunction createItemId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}${(responseItemId++).toString(36)}`;\n}\n\nexport function createResponseTracker(): ResponseTracker {\n const tracker: ResponseTracker = {\n sequenceNumber: 0,\n items: [],\n message: undefined,\n reasoning: undefined,\n functionCalls: new Map(),\n functionCallsByStep: new Map(),\n responseCreated: false,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n nextSequence: () => tracker.sequenceNumber++,\n };\n return tracker;\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\ninterface ResponseToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nfunction getToolCallIndex(\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallPositionKey(\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): string {\n const index = getToolCallIndex(toolCall, fallbackIndex);\n if (stepId !== '') {\n return `${stepId}:${index}`;\n }\n return `tool:${index}`;\n}\n\nfunction getToolCallIdKey(\n toolCall: ResponseToolCallFragment\n): string | undefined {\n return toolCall.id != null && toolCall.id !== '' ? toolCall.id : undefined;\n}\n\nfunction getExistingFunctionCall(\n config: ResponsesHandlerConfig,\n idKey: string | undefined,\n positionKey: string | undefined,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const keyed =\n idKey == null\n ? undefined\n : (config.tracker.functionCalls.get(idKey) ??\n (positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey)));\n if (keyed != null) {\n return keyed;\n }\n const positioned =\n positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey);\n if (positioned != null) {\n return positioned;\n }\n if (stepId === '') {\n return undefined;\n }\n return findFunctionCallByStep(config, stepId, toolCall);\n}\n\nfunction findFunctionCallByStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const items = config.tracker.functionCallsByStep.get(stepId);\n if (items == null) {\n return undefined;\n }\n const index = typeof toolCall.index === 'number' ? toolCall.index : undefined;\n if (index != null) {\n return items[index];\n }\n const name = getToolCallName(toolCall);\n let fallback: ResponseFunctionCallItem | undefined;\n for (const item of items) {\n if (item == null || item.status === 'completed') {\n continue;\n }\n if (name !== '' && item.name !== name) {\n continue;\n }\n if (fallback != null) {\n return undefined;\n }\n fallback = item;\n }\n return fallback;\n}\n\nfunction trackFunctionCallKeys(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem,\n idKey: string | undefined,\n positionKey: string\n): void {\n config.tracker.functionCalls.set(positionKey, item);\n if (idKey != null) {\n config.tracker.functionCalls.set(idKey, item);\n }\n}\n\nfunction trackFunctionCallStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n item: ResponseFunctionCallItem,\n fallbackIndex: number\n): void {\n if (stepId === '') {\n return;\n }\n const items = config.tracker.functionCallsByStep.get(stepId) ?? [];\n items[fallbackIndex] = item;\n config.tracker.functionCallsByStep.set(stepId, items);\n}\n\nfunction getToolCallName(toolCall: ResponseToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: ResponseToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nasync function ensureFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): Promise<ResponseFunctionCallItem> {\n await ensureResponseCreated(config);\n const positionKey = getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const idKey = getToolCallIdKey(toolCall);\n const existing = getExistingFunctionCall(\n config,\n idKey,\n positionKey,\n stepId,\n toolCall\n );\n const toolCallIndex = getToolCallIndex(toolCall, fallbackIndex);\n const name = getToolCallName(toolCall);\n if (existing) {\n trackFunctionCallKeys(config, existing, idKey, positionKey);\n trackFunctionCallStep(config, stepId, existing, toolCallIndex);\n if (idKey != null) {\n existing.call_id = idKey;\n }\n if (name !== '') {\n existing.name = name;\n }\n return existing;\n }\n const item: ResponseFunctionCallItem = {\n type: 'function_call',\n id: createItemId('fc'),\n call_id: idKey ?? positionKey,\n name,\n arguments: '',\n status: 'in_progress',\n };\n trackFunctionCallKeys(config, item, idKey, positionKey);\n trackFunctionCallStep(config, stepId, item, toolCallIndex);\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function emitFunctionCallArgumentsDelta(params: {\n config: ResponsesHandlerConfig;\n item: ResponseFunctionCallItem;\n delta: string;\n}): Promise<void> {\n if (params.delta === '') {\n return;\n }\n params.item.arguments += params.delta;\n await writeResponseEvent(params.config.writer, {\n type: 'response.function_call_arguments.delta',\n sequence_number: params.config.tracker.nextSequence(),\n item_id: params.item.id,\n output_index: params.config.tracker.items.indexOf(params.item),\n call_id: params.item.call_id,\n delta: params.delta,\n });\n}\n\nasync function emitFunctionCallArgumentsDone(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem\n): Promise<void> {\n await writeResponseEvent(config.writer, {\n type: 'response.function_call_arguments.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n call_id: item.call_id,\n name: item.name,\n arguments: item.arguments,\n });\n}\n\nasync function completeFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): Promise<void> {\n const fallbackIndex =\n typeof toolCall.index === 'number' ? toolCall.index : undefined;\n const positionKey =\n fallbackIndex == null\n ? undefined\n : getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const item =\n getExistingFunctionCall(\n config,\n getToolCallIdKey(toolCall),\n positionKey,\n stepId,\n toolCall\n ) ??\n (await ensureFunctionCall(config, stepId, toolCall, fallbackIndex ?? 0));\n if (item.status === 'completed') {\n return;\n }\n const finalArguments = getToolCallArguments(toolCall);\n if (\n finalArguments !== '' &&\n finalArguments !== item.arguments &&\n finalArguments.startsWith(item.arguments)\n ) {\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: finalArguments.slice(item.arguments.length),\n });\n } else if (finalArguments !== '') {\n item.arguments = finalArguments;\n }\n await emitFunctionCallArgumentsDone(config, item);\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n}\n\nexport function buildResponse(\n context: ResponseContext,\n tracker: ResponseTracker,\n status: ResponseStatus = 'in_progress'\n): ResponseObject {\n const completed = status === 'completed';\n return {\n id: context.responseId,\n object: 'response',\n created_at: context.createdAt,\n completed_at: completed ? Math.floor(Date.now() / 1000) : null,\n status,\n model: context.model,\n previous_response_id: context.previousResponseId ?? null,\n instructions: context.instructions ?? null,\n output: tracker.items,\n error: null,\n usage: completed\n ? {\n input_tokens: tracker.usage.inputTokens,\n output_tokens: tracker.usage.outputTokens,\n total_tokens: tracker.usage.inputTokens + tracker.usage.outputTokens,\n }\n : null,\n };\n}\n\nexport async function writeResponseEvent(\n writer: ResponsesCompatibleWriter,\n event: ResponseEvent\n): Promise<void> {\n await writer.write(`event: ${event.type}\\n`);\n await writer.write(`data: ${JSON.stringify(event)}\\n\\n`);\n}\n\nexport async function writeResponsesDone(\n writer: ResponsesCompatibleWriter\n): Promise<void> {\n await writer.write('data: [DONE]\\n\\n');\n}\n\nexport async function ensureResponseCreated(\n config: ResponsesHandlerConfig\n): Promise<void> {\n if (config.tracker.responseCreated) {\n return;\n }\n config.tracker.responseCreated = true;\n await writeResponseEvent(config.writer, {\n type: 'response.created',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker),\n });\n}\n\nasync function emitOutputContentDone(\n config: ResponsesHandlerConfig,\n item: ResponseMessageItem | ResponseReasoningItem\n): Promise<void> {\n const outputIndex = config.tracker.items.indexOf(item);\n if (item.type === 'message') {\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n return;\n }\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n}\n\nasync function ensureMessage(\n config: ResponsesHandlerConfig\n): Promise<ResponseMessageItem> {\n await ensureResponseCreated(config);\n if (config.tracker.message) {\n return config.tracker.message;\n }\n const item: ResponseMessageItem = {\n type: 'message',\n id: createItemId('msg'),\n role: 'assistant',\n status: 'in_progress',\n content: [{ type: 'output_text', text: '', annotations: [], logprobs: [] }],\n };\n config.tracker.message = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function ensureReasoning(\n config: ResponsesHandlerConfig\n): Promise<ResponseReasoningItem> {\n await ensureResponseCreated(config);\n if (config.tracker.reasoning) {\n return config.tracker.reasoning;\n }\n const item: ResponseReasoningItem = {\n type: 'reasoning',\n id: createItemId('reason'),\n status: 'in_progress',\n content: [{ type: 'reasoning_text', text: '' }],\n summary: [],\n };\n config.tracker.reasoning = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nexport function createResponsesEventHandlers(\n config: ResponsesHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureMessage(config);\n for (const part of (data as t.MessageDeltaEvent).delta.content ?? []) {\n if (!('text' in part) || typeof part.text !== 'string') {\n continue;\n }\n item.content[0].text += part.text;\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: part.text,\n });\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureReasoning(config);\n for (const part of (data as t.ReasoningDeltaEvent).delta.content ??\n []) {\n let text: string | undefined;\n if ('think' in part && typeof part.think === 'string') {\n text = part.think;\n } else if ('text' in part && typeof part.text === 'string') {\n text = part.text;\n }\n if (typeof text !== 'string') {\n continue;\n }\n item.content[0].text += text;\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: text,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await ensureFunctionCall(config, runStep.id, toolCalls[index], index);\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n if (runStepDelta.delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStepDelta.delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n const item = await ensureFunctionCall(\n config,\n runStepDelta.id,\n toolCalls[index],\n index\n );\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: getToolCallArguments(toolCalls[index]),\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (_event, data): Promise<void> => {\n const completed = data as {\n result?: {\n id?: string;\n index?: number;\n type?: string;\n tool_call?: ResponseToolCallFragment;\n };\n };\n if (!completed.result?.tool_call) {\n return;\n }\n await completeFunctionCall(\n config,\n completed.result.id ?? '',\n completed.result.tool_call\n );\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.inputTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.outputTokens += getTokenCount(usage.output_tokens);\n },\n },\n };\n}\n\nexport async function emitResponseCompleted(\n config: ResponsesHandlerConfig\n): Promise<void> {\n await ensureResponseCreated(config);\n for (const item of config.tracker.items) {\n if (item.status === 'completed') {\n continue;\n }\n if (item.type === 'message' || item.type === 'reasoning') {\n await emitOutputContentDone(config, item);\n } else {\n await emitFunctionCallArgumentsDone(config, item);\n }\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n }\n await writeResponseEvent(config.writer, {\n type: 'response.completed',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker, 'completed'),\n });\n await writeResponsesDone(config.writer);\n}\n"],"names":[],"mappings":";;AAyGA,IAAI,cAAc,GAAG,CAAC;AAEtB,SAAS,YAAY,CAAC,MAAc,EAAA;IAClC,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,EAAG,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA,CAAE;AACjF;SAEgB,qBAAqB,GAAA;AACnC,IAAA,MAAM,OAAO,GAAoB;AAC/B,QAAA,cAAc,EAAE,CAAC;AACjB,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,SAAS,EAAE,SAAS;QACpB,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,mBAAmB,EAAE,IAAI,GAAG,EAAE;AAC9B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,KAAK,EAAE;AACL,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,YAAY,EAAE,CAAC;AAChB,SAAA;AACD,QAAA,YAAY,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE;KAC7C;AACD,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,aAAa,CAAC,KAAgC,EAAA;AACrD,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;AACxE;AAaA,SAAS,gBAAgB,CACvB,QAAkC,EAClC,aAAqB,EAAA;AAErB,IAAA,OAAO,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,aAAa;AAC5E;AAEA,SAAS,sBAAsB,CAC7B,MAAc,EACd,QAAkC,EAClC,aAAqB,EAAA;IAErB,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACvD,IAAA,IAAI,MAAM,KAAK,EAAE,EAAE;AACjB,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,EAAE;IAC7B;IACA,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE;AACxB;AAEA,SAAS,gBAAgB,CACvB,QAAkC,EAAA;IAElC,OAAO,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,EAAE,GAAG,SAAS;AAC5E;AAEA,SAAS,uBAAuB,CAC9B,MAA8B,EAC9B,KAAyB,EACzB,WAA+B,EAC/B,MAAc,EACd,QAAkC,EAAA;AAElC,IAAA,MAAM,KAAK,GACT,KAAK,IAAI;AACP,UAAE;WACC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;aACvC,WAAW,IAAI;AACd,kBAAE;AACF,kBAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACzD,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,UAAU,GACd,WAAW,IAAI;AACb,UAAE;UACA,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;AACnD,IAAA,IAAI,UAAU,IAAI,IAAI,EAAE;AACtB,QAAA,OAAO,UAAU;IACnB;AACA,IAAA,IAAI,MAAM,KAAK,EAAE,EAAE;AACjB,QAAA,OAAO,SAAS;IAClB;IACA,OAAO,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;AACzD;AAEA,SAAS,sBAAsB,CAC7B,MAA8B,EAC9B,MAAc,EACd,QAAkC,EAAA;AAElC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AAC5D,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,MAAM,KAAK,GAAG,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,SAAS;AAC7E,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB;AACA,IAAA,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC;AACtC,IAAA,IAAI,QAA8C;AAClD,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;YAC/C;QACF;QACA,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;YACrC;QACF;AACA,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;QACA,QAAQ,GAAG,IAAI;IACjB;AACA,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,qBAAqB,CAC5B,MAA8B,EAC9B,IAA8B,EAC9B,KAAyB,EACzB,WAAmB,EAAA;IAEnB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;AACnD,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IAC/C;AACF;AAEA,SAAS,qBAAqB,CAC5B,MAA8B,EAC9B,MAAc,EACd,IAA8B,EAC9B,aAAqB,EAAA;AAErB,IAAA,IAAI,MAAM,KAAK,EAAE,EAAE;QACjB;IACF;AACA,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;AAClE,IAAA,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI;IAC3B,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;AACvD;AAEA,SAAS,eAAe,CAAC,QAAkC,EAAA;IACzD,OAAO,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;AACvD;AAEA,SAAS,oBAAoB,CAAC,QAAkC,EAAA;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,SAAS;AAC1D,IAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC7B;AAEA,eAAe,kBAAkB,CAC/B,MAA8B,EAC9B,MAAc,EACd,QAAkC,EAClC,aAAqB,EAAA;AAErB,IAAA,MAAM,qBAAqB,CAAC,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;AAC3E,IAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,uBAAuB,CACtC,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,CACT;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC/D,IAAA,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC;IACtC,IAAI,QAAQ,EAAE;QACZ,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC;QAC3D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;AAC9D,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,QAAQ,CAAC,OAAO,GAAG,KAAK;QAC1B;AACA,QAAA,IAAI,IAAI,KAAK,EAAE,EAAE;AACf,YAAA,QAAQ,CAAC,IAAI,GAAG,IAAI;QACtB;AACA,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,MAAM,IAAI,GAA6B;AACrC,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC;QACtB,OAAO,EAAE,KAAK,IAAI,WAAW;QAC7B,IAAI;AACJ,QAAA,SAAS,EAAE,EAAE;AACb,QAAA,MAAM,EAAE,aAAa;KACtB;IACD,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC;IACvD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC;IAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,4BAA4B;AAClC,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAC7C,IAAI;AACL,KAAA,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEA,eAAe,8BAA8B,CAAC,MAI7C,EAAA;AACC,IAAA,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,EAAE;QACvB;IACF;IACA,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK;AACrC,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AAC7C,QAAA,IAAI,EAAE,wCAAwC;QAC9C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;AACrD,QAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;AACvB,QAAA,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AAC9D,QAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,KAAA,CAAC;AACJ;AAEA,eAAe,6BAA6B,CAC1C,MAA8B,EAC9B,IAA8B,EAAA;AAE9B,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,uCAAuC;AAC7C,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAChD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,KAAA,CAAC;AACJ;AAEA,eAAe,oBAAoB,CACjC,MAA8B,EAC9B,MAAc,EACd,QAAkC,EAAA;AAElC,IAAA,MAAM,aAAa,GACjB,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,SAAS;AACjE,IAAA,MAAM,WAAW,GACf,aAAa,IAAI;AACf,UAAE;UACA,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;AAC7D,IAAA,MAAM,IAAI,GACR,uBAAuB,CACrB,MAAM,EACN,gBAAgB,CAAC,QAAQ,CAAC,EAC1B,WAAW,EACX,MAAM,EACN,QAAQ,CACT;AACD,SAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;AAC1E,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;QAC/B;IACF;AACA,IAAA,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC;IACrD,IACE,cAAc,KAAK,EAAE;QACrB,cAAc,KAAK,IAAI,CAAC,SAAS;QACjC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EACzC;AACA,QAAA,MAAM,8BAA8B,CAAC;YACnC,MAAM;YACN,IAAI;YACJ,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACnD,SAAA,CAAC;IACJ;AAAO,SAAA,IAAI,cAAc,KAAK,EAAE,EAAE;AAChC,QAAA,IAAI,CAAC,SAAS,GAAG,cAAc;IACjC;AACA,IAAA,MAAM,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,IAAA,IAAI,CAAC,MAAM,GAAG,WAAW;AACzB,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,2BAA2B;AACjC,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAChD,IAAI;AACL,KAAA,CAAC;AACJ;AAEM,SAAU,aAAa,CAC3B,OAAwB,EACxB,OAAwB,EACxB,SAAyB,aAAa,EAAA;AAEtC,IAAA,MAAM,SAAS,GAAG,MAAM,KAAK,WAAW;IACxC,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,UAAU;AACtB,QAAA,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,OAAO,CAAC,SAAS;AAC7B,QAAA,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;QAC9D,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,QAAA,oBAAoB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;AACxD,QAAA,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC1C,MAAM,EAAE,OAAO,CAAC,KAAK;AACrB,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,KAAK,EAAE;AACL,cAAE;AACA,gBAAA,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW;AACvC,gBAAA,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY;gBACzC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY;AACrE;AACD,cAAE,IAAI;KACT;AACH;AAEO,eAAe,kBAAkB,CACtC,MAAiC,EACjC,KAAoB,EAAA;IAEpB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;AAC5C,IAAA,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,IAAA,CAAM,CAAC;AAC1D;AAEO,eAAe,kBAAkB,CACtC,MAAiC,EAAA;AAEjC,IAAA,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;AACxC;AAEO,eAAe,qBAAqB,CACzC,MAA8B,EAAA;AAE9B,IAAA,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;QAClC;IACF;AACA,IAAA,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI;AACrC,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;AACxD,KAAA,CAAC;AACJ;AAEA,eAAe,qBAAqB,CAClC,MAA8B,EAC9B,IAAiD,EAAA;AAEjD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AACtD,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;AAC3B,QAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,YAAA,IAAI,EAAE,2BAA2B;AACjC,YAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;AAChB,YAAA,YAAY,EAAE,WAAW;AACzB,YAAA,aAAa,EAAE,CAAC;YAChB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;AAC3B,SAAA,CAAC;QACF;IACF;AACA,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,8BAA8B;AACpC,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;AAChB,QAAA,YAAY,EAAE,WAAW;AACzB,QAAA,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;AAC3B,KAAA,CAAC;AACJ;AAEA,eAAe,aAAa,CAC1B,MAA8B,EAAA;AAE9B,IAAA,MAAM,qBAAqB,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;AAC1B,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO;IAC/B;AACA,IAAA,MAAM,IAAI,GAAwB;AAChC,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,MAAM,EAAE,aAAa;AACrB,QAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5E;AACD,IAAA,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI;IAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,4BAA4B;AAClC,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAC7C,IAAI;AACL,KAAA,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEA,eAAe,eAAe,CAC5B,MAA8B,EAAA;AAE9B,IAAA,MAAM,qBAAqB,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE;AAC5B,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS;IACjC;AACA,IAAA,MAAM,IAAI,GAA0B;AAClC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,EAAE,EAAE,YAAY,CAAC,QAAQ,CAAC;AAC1B,QAAA,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/C,QAAA,OAAO,EAAE,EAAE;KACZ;AACD,IAAA,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI;IAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,4BAA4B;AAClC,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;QAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAC7C,IAAI;AACL,KAAA,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,4BAA4B,CAC1C,MAA8B,EAAA;IAE9B,OAAO;AACL,QAAA,CAAC,WAAW,CAAC,gBAAgB,GAAG;AAC9B,YAAA,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAmB;AAC5C,gBAAA,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC;gBACxC,KAAK,MAAM,IAAI,IAAK,IAA4B,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE;AACpE,oBAAA,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;wBACtD;oBACF;oBACA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;AACjC,oBAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,wBAAA,IAAI,EAAE,4BAA4B;AAClC,wBAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;wBAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;wBAChB,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAChD,wBAAA,aAAa,EAAE,CAAC;wBAChB,KAAK,EAAE,IAAI,CAAC,IAAI;AACjB,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA;AACD,QAAA,CAAC,WAAW,CAAC,kBAAkB,GAAG;AAChC,YAAA,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAmB;AAC5C,gBAAA,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;AAC1C,gBAAA,KAAK,MAAM,IAAI,IAAK,IAA8B,CAAC,KAAK,CAAC,OAAO;AAC9D,oBAAA,EAAE,EAAE;AACJ,oBAAA,IAAI,IAAwB;oBAC5B,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;AACrD,wBAAA,IAAI,GAAG,IAAI,CAAC,KAAK;oBACnB;yBAAO,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1D,wBAAA,IAAI,GAAG,IAAI,CAAC,IAAI;oBAClB;AACA,oBAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;wBAC5B;oBACF;oBACA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI;AAC5B,oBAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,wBAAA,IAAI,EAAE,+BAA+B;AACrC,wBAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;wBAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;wBAChB,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAChD,wBAAA,aAAa,EAAE,CAAC;AAChB,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA;AACD,QAAA,CAAC,WAAW,CAAC,WAAW,GAAG;AACzB,YAAA,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAmB;gBAC5C,MAAM,OAAO,GAAG,IAAiB;gBACjC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE;oBAC7C;gBACF;gBACA,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE;AACtD,gBAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACrD,oBAAA,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBACvE;YACF,CAAC;AACF,SAAA;AACD,QAAA,CAAC,WAAW,CAAC,iBAAiB,GAAG;AAC/B,YAAA,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAmB;gBAC5C,MAAM,YAAY,GAAG,IAA2B;gBAChD,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;oBAC5C;gBACF;gBACA,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE;AACrD,gBAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;AACrD,oBAAA,MAAM,IAAI,GAAG,MAAM,kBAAkB,CACnC,MAAM,EACN,YAAY,CAAC,EAAE,EACf,SAAS,CAAC,KAAK,CAAC,EAChB,KAAK,CACN;AACD,oBAAA,MAAM,8BAA8B,CAAC;wBACnC,MAAM;wBACN,IAAI;AACJ,wBAAA,KAAK,EAAE,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9C,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA;AACD,QAAA,CAAC,WAAW,CAAC,qBAAqB,GAAG;AACnC,YAAA,MAAM,EAAE,OAAO,MAAM,EAAE,IAAI,KAAmB;gBAC5C,MAAM,SAAS,GAAG,IAOjB;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE;oBAChC;gBACF;AACA,gBAAA,MAAM,oBAAoB,CACxB,MAAM,EACN,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EACzB,SAAS,CAAC,MAAM,CAAC,SAAS,CAC3B;YACH,CAAC;AACF,SAAA;AACD,QAAA,CAAC,WAAW,CAAC,cAAc,GAAG;AAC5B,YAAA,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,KAAU;AAC7B,gBAAA,MAAM,KAAK,GAAI,IAAuB,EAAE,MAAM,EAAE,cAEnC;gBACb,IAAI,CAAC,KAAK,EAAE;oBACV;gBACF;AACA,gBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;AACrE,gBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC;YACzE,CAAC;AACF,SAAA;KACF;AACH;AAEO,eAAe,qBAAqB,CACzC,MAA8B,EAAA;AAE9B,IAAA,MAAM,qBAAqB,CAAC,MAAM,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;YAC/B;QACF;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE;AACxD,YAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3C;aAAO;AACL,YAAA,MAAM,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC;QACnD;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW;AACzB,QAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,YAAA,IAAI,EAAE,2BAA2B;AACjC,YAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAChD,IAAI;AACL,SAAA,CAAC;IACJ;AACA,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE;AACtC,QAAA,IAAI,EAAE,oBAAoB;AAC1B,QAAA,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;AAC9C,QAAA,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;AACrE,KAAA,CAAC;AACF,IAAA,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;AACzC;;;;"}
|