agents 0.17.4 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-tool-types-OhWqAbCp.d.ts → agent-tool-types-BNUGGBzQ.d.ts} +30 -11
- package/dist/agent-tool-types.d.ts +1 -1
- package/dist/{agent-tools-LdNKGZT9.d.ts → agent-tools-BFbzVLFc.d.ts} +2 -2
- package/dist/agent-tools.d.ts +1 -1
- package/dist/browser/tanstack-ai.js +3 -2
- package/dist/browser/tanstack-ai.js.map +1 -1
- package/dist/chat/index.d.ts +29 -9
- package/dist/chat/index.js +32 -42
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.d.ts +25 -1
- package/dist/chat/react.js +249 -93
- package/dist/chat/react.js.map +1 -1
- package/dist/chat-sdk/index.d.ts +1 -1
- package/dist/{client-C7F0MaVz.js → client-CcjiFpTf.js} +176 -42
- package/dist/client-CcjiFpTf.js.map +1 -0
- package/dist/client.d.ts +1 -1
- package/dist/cloudflare-BldFV0Pa.js +117 -0
- package/dist/cloudflare-BldFV0Pa.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +118 -43
- package/dist/index.js.map +1 -1
- package/dist/mcp/client.d.ts +1 -1
- package/dist/mcp/client.js +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/observability/ai/index.d.ts +155 -0
- package/dist/observability/ai/index.js +1848 -0
- package/dist/observability/ai/index.js.map +1 -0
- package/dist/react.d.ts +1 -1
- package/dist/{retries-CvHJwSuh.d.ts → retries-CAvxtG9d.d.ts} +16 -7
- package/dist/retries.d.ts +8 -6
- package/dist/retries.js +20 -2
- package/dist/retries.js.map +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/sub-routing.d.ts +1 -1
- package/dist/vite.d.ts +4 -4
- package/dist/vite.js +4 -2
- package/dist/vite.js.map +1 -1
- package/dist/{wire-types-nflOzNuU.js → wire-types-CU9rLoeS.js} +33 -2
- package/dist/wire-types-CU9rLoeS.js.map +1 -0
- package/dist/workflows.d.ts +1 -1
- package/docs/agent-class.md +9 -1
- package/docs/configuration.md +20 -0
- package/docs/mcp-client.md +13 -4
- package/docs/observability.md +282 -0
- package/package.json +11 -6
- package/dist/client-C7F0MaVz.js.map +0 -1
- package/dist/wire-types-nflOzNuU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["extractFinishReason","record","isAsyncIterable","extractFinishReason","isStreamOperation","metadataValue","isScalarAttributeValue"],"sources":["../../../src/observability/ai/read.ts","../../../src/observability/genai/attributes.ts","../../../src/observability/genai/telemetry.ts","../../../src/observability/ai/v6/extract.ts","../../../src/observability/ai/ai-gateway.ts","../../../src/observability/ai/content.ts","../../../src/observability/ai/v6/streams.ts","../../../src/observability/ai/v6/model.ts","../../../src/observability/ai/v6/tools.ts","../../../src/observability/ai/v6/wrap.ts","../../../src/observability/ai/v7/extract.ts","../../../src/observability/ai/v7/telemetry.ts","../../../src/observability/ai/index.ts"],"sourcesContent":["/** Narrows an unknown value to a string. */\nexport function readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/** Narrows an unknown value to a number. */\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\n/** AI SDK token counts are either a plain number or `{ total?: number, ... }`. */\nexport function readTokenCount(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"object\" && value !== null) {\n // SAFETY: AI SDK nested token count has a numeric total field.\n const total = (value as Record<string, unknown>).total;\n return typeof total === \"number\" ? total : undefined;\n }\n\n return undefined;\n}\n\n/** Reads a numeric sub-field from a nested AI SDK token count object. */\nexport function readNestedTokenField(\n value: unknown,\n key: string\n): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK nested token count has known numeric sub-fields.\n const nested = (value as Record<string, unknown>)[key];\n return typeof nested === \"number\" ? nested : undefined;\n}\n","/**\n * Local trace attribute keys used by the Cloudflare GenAI projection.\n *\n * `gen_ai.*` keys follow OpenTelemetry GenAI semantic conventions where they\n * exist (Development status — tracked so spec churn stays an internal edit;\n * none of these constants are exported from the package). Keys with no\n * semconv home live under the `cloudflare.agents.*` vendor namespace — never\n * bare top-level keys, never `ai.*` (the Vercel AI SDK's de-facto namespace).\n */\nexport const TraceAttribute = {\n Cloudflare: {\n AIGatewayLogID: \"cloudflare.ai_gateway.log.id\",\n CallID: \"cloudflare.agents.call.id\",\n IntegrationName: \"cloudflare.agents.integration.name\",\n MetadataPrefix: \"cloudflare.agents.metadata.\",\n OperationName: \"cloudflare.agents.operation.name\",\n ResponseFinishReason: \"cloudflare.agents.response.finish_reason\",\n ToolApprovalState: \"cloudflare.agents.tool.approval.state\",\n ToolCount: \"cloudflare.agents.tool.count\",\n TurnAdmission: \"cloudflare.agents.turn.admission\",\n TurnChannel: \"cloudflare.agents.turn.channel\",\n TurnContinuation: \"cloudflare.agents.turn.continuation\",\n TurnGeneration: \"cloudflare.agents.turn.generation\",\n TurnRequestID: \"cloudflare.agents.turn.request_id\",\n TurnTrigger: \"cloudflare.agents.turn.trigger\",\n UsageTotalTokens: \"cloudflare.agents.usage.total_tokens\"\n },\n General: {\n UserID: \"user.id\"\n },\n GenAI: {\n AgentID: \"gen_ai.agent.id\",\n AgentName: \"gen_ai.agent.name\",\n AgentVersion: \"gen_ai.agent.version\",\n ConversationID: \"gen_ai.conversation.id\",\n InputMessages: \"gen_ai.input.messages\",\n OperationName: \"gen_ai.operation.name\",\n OperationNameValueChat: \"chat\",\n OperationNameValueExecuteTool: \"execute_tool\",\n OperationNameValueInvokeAgent: \"invoke_agent\",\n OutputMessages: \"gen_ai.output.messages\",\n OutputType: \"gen_ai.output.type\",\n ProviderName: \"gen_ai.provider.name\",\n RequestFrequencyPenalty: \"gen_ai.request.frequency_penalty\",\n RequestMaxTokens: \"gen_ai.request.max_tokens\",\n RequestModel: \"gen_ai.request.model\",\n RequestPresencePenalty: \"gen_ai.request.presence_penalty\",\n RequestSeed: \"gen_ai.request.seed\",\n RequestStream: \"gen_ai.request.stream\",\n RequestTemperature: \"gen_ai.request.temperature\",\n RequestTopK: \"gen_ai.request.top_k\",\n RequestTopP: \"gen_ai.request.top_p\",\n ResponseID: \"gen_ai.response.id\",\n ResponseModel: \"gen_ai.response.model\",\n ResponseTimeToFirstChunk: \"gen_ai.response.time_to_first_chunk\",\n ToolCallArguments: \"gen_ai.tool.call.arguments\",\n ToolCallID: \"gen_ai.tool.call.id\",\n ToolCallResult: \"gen_ai.tool.call.result\",\n ToolName: \"gen_ai.tool.name\",\n ToolType: \"gen_ai.tool.type\",\n UsageCacheCreationInputTokens: \"gen_ai.usage.cache_creation.input_tokens\",\n UsageCacheReadInputTokens: \"gen_ai.usage.cache_read.input_tokens\",\n UsageInputTokens: \"gen_ai.usage.input_tokens\",\n UsageOutputTokens: \"gen_ai.usage.output_tokens\",\n UsageReasoningOutputTokens: \"gen_ai.usage.reasoning.output_tokens\"\n }\n} as const;\n","import { TraceAttribute } from \"./attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n/** Integrations that project into the shared telemetry schema. */\nexport type IntegrationName = \"ai-sdk\" | \"pi-ai\";\n\n/** Canonical token usage shape used by model adapters. */\nexport type TokenUsageSummary = {\n readonly cacheCreationInputTokens?: number | undefined;\n readonly cacheReadInputTokens?: number | undefined;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly reasoningTokens?: number | undefined;\n readonly totalTokens?: number | undefined;\n};\n\n/** Safe request settings that map to scalar GenAI semantic attributes. */\nexport type RequestSummary = {\n readonly frequencyPenalty?: number | undefined;\n readonly maxTokens?: number | undefined;\n readonly outputType?: string | undefined;\n readonly presencePenalty?: number | undefined;\n readonly seed?: number | undefined;\n readonly stream?: boolean | undefined;\n readonly temperature?: number | undefined;\n readonly topK?: number | undefined;\n readonly topP?: number | undefined;\n};\n\n/** Safe response metadata that maps to scalar GenAI semantic attributes. */\nexport type ResponseSummary = {\n readonly id?: string | undefined;\n readonly model?: string | undefined;\n};\n\n/** Safe agent/conversation metadata provided explicitly by callers. */\nexport type SemanticContext = {\n readonly agentId?: string | undefined;\n readonly agentName?: string | undefined;\n readonly agentVersion?: string | undefined;\n readonly conversationId?: string | undefined;\n};\n\n/** Name and initial attributes for a model-operation span. */\nexport type SpanSpec = {\n readonly attributes: TraceAttributes;\n readonly name: string;\n};\n\n/**\n * Builds a semconv-formula span name (`\"{operation} {target}\"`), falling back\n * to the bare operation when the target is unavailable or the combined name\n * exceeds the Workers Observability 64 UTF-8-byte budget. The full target\n * remains available as an attribute; the stable query key is always\n * `gen_ai.operation.name`, never the span name.\n */\nfunction spanName(operation: string, target: string | undefined): string {\n if (!target) {\n return operation;\n }\n\n const name = `${operation} ${target}`;\n return new TextEncoder().encode(name).length <= 64 ? name : operation;\n}\n\n/**\n * Normalizes an AI SDK provider identifier to the semconv\n * `gen_ai.provider.name` enum where a member exists: sub-provider suffixes\n * are stripped (`anthropic.messages` → `anthropic`) and known aliases mapped.\n * Unknown providers pass through verbatim (semconv sanctions custom values).\n */\nfunction normalizeProviderName(\n provider: string | undefined\n): string | undefined {\n if (provider === undefined) {\n return undefined;\n }\n\n const lower = provider.toLowerCase();\n const mappings: ReadonlyArray<readonly [prefix: string, value: string]> = [\n [\"google.vertex\", \"gcp.vertex_ai\"],\n [\"google.generative-ai\", \"gcp.gemini\"],\n [\"google-vertex\", \"gcp.vertex_ai\"],\n [\"amazon-bedrock\", \"aws.bedrock\"],\n [\"azure-openai\", \"azure.ai.openai\"],\n [\"anthropic\", \"anthropic\"],\n [\"openai\", \"openai\"],\n [\"azure\", \"azure.ai.inference\"],\n [\"google\", \"gcp.gemini\"],\n [\"mistral\", \"mistral_ai\"],\n [\"cohere\", \"cohere\"],\n [\"bedrock\", \"aws.bedrock\"],\n [\"groq\", \"groq\"],\n [\"deepseek\", \"deepseek\"],\n [\"perplexity\", \"perplexity\"],\n [\"xai\", \"x_ai\"]\n ];\n\n for (const [prefix, value] of mappings) {\n if (\n lower === prefix ||\n lower.startsWith(`${prefix}.`) ||\n lower.startsWith(`${prefix}-`)\n ) {\n return value;\n }\n }\n\n return provider;\n}\n\n/**\n * Reserved telemetry-metadata keys that map to dedicated attributes on the\n * operation root span. Everything else scalar passes through under\n * `cloudflare.agents.metadata.{key}`; identity keys are consumed by\n * SemanticContext extraction and never passed through.\n */\nconst RESERVED_METADATA_ATTRIBUTES: Readonly<Record<string, string>> = {\n [TraceAttribute.Cloudflare.TurnAdmission]:\n TraceAttribute.Cloudflare.TurnAdmission,\n [TraceAttribute.Cloudflare.TurnChannel]:\n TraceAttribute.Cloudflare.TurnChannel,\n [TraceAttribute.Cloudflare.TurnContinuation]:\n TraceAttribute.Cloudflare.TurnContinuation,\n [TraceAttribute.Cloudflare.TurnGeneration]:\n TraceAttribute.Cloudflare.TurnGeneration,\n [TraceAttribute.Cloudflare.TurnRequestID]:\n TraceAttribute.Cloudflare.TurnRequestID,\n [TraceAttribute.Cloudflare.TurnTrigger]:\n TraceAttribute.Cloudflare.TurnTrigger,\n [TraceAttribute.General.UserID]: TraceAttribute.General.UserID\n};\n\nconst CONSUMED_METADATA_KEYS = new Set([\n \"agentId\",\n \"agentName\",\n \"agentVersion\",\n \"conversationId\",\n \"gen_ai.agent.id\",\n \"gen_ai.agent.name\",\n \"gen_ai.agent.version\",\n \"gen_ai.conversation.id\"\n]);\n\n/**\n * Projects the AI SDK's per-call `experimental_telemetry.metadata` onto root\n * span attributes: reserved keys map to their dedicated attributes, any other\n * SCALAR entry passes through as `cloudflare.agents.metadata.{key}`, and\n * object/array values are dropped (scalar-only attribute rule).\n */\nexport function metadataAttributes(\n metadata: Record<string, unknown> | undefined\n): TraceAttributes {\n if (metadata === undefined) {\n return {};\n }\n\n const attributes: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (CONSUMED_METADATA_KEYS.has(key)) {\n continue;\n }\n if (\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n continue;\n }\n\n const reserved = Object.hasOwn(RESERVED_METADATA_ATTRIBUTES, key)\n ? RESERVED_METADATA_ATTRIBUTES[key]\n : undefined;\n attributes[\n reserved ?? `${TraceAttribute.Cloudflare.MetadataPrefix}${key}`\n ] = value;\n }\n\n return attributes;\n}\n\n/**\n * Cheap root-span name for an agent operation: needs only the agent name (the\n * one value instrumentation may read before the sampling check), never the\n * full attribute spec.\n */\nexport function operationSpanName(agentName: string | undefined): string {\n return spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n agentName\n );\n}\n\n/** Builds the root span for an SDK operation such as generateText or streamText. */\nexport function operationSpan(input: {\n readonly attributes: TraceAttributes | undefined;\n readonly context?: SemanticContext | undefined;\n readonly integration: IntegrationName;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: input.integration,\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.AgentID]: input.context?.agentId,\n [TraceAttribute.GenAI.AgentName]: input.context?.agentName,\n [TraceAttribute.GenAI.AgentVersion]: input.context?.agentVersion,\n [TraceAttribute.GenAI.ConversationID]: input.context?.conversationId,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n input.context?.agentName\n )\n };\n}\n\n/** Builds the child span for an underlying model call. */\nexport function modelCallSpan(input: {\n readonly attributes?: TraceAttributes | undefined;\n readonly integration: IntegrationName;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: input.integration,\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueChat,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(TraceAttribute.GenAI.OperationNameValueChat, input.model)\n };\n}\n\nfunction requestAttributes(\n request: RequestSummary | undefined,\n model: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputType]: request?.outputType,\n [TraceAttribute.GenAI.RequestFrequencyPenalty]: request?.frequencyPenalty,\n [TraceAttribute.GenAI.RequestMaxTokens]: request?.maxTokens,\n [TraceAttribute.GenAI.RequestModel]: model,\n [TraceAttribute.GenAI.RequestPresencePenalty]: request?.presencePenalty,\n [TraceAttribute.GenAI.RequestSeed]: request?.seed,\n // Semconv: gen_ai.request.stream is set if and only if streaming.\n [TraceAttribute.GenAI.RequestStream]:\n request?.stream === true ? true : undefined,\n [TraceAttribute.GenAI.RequestTemperature]: request?.temperature,\n [TraceAttribute.GenAI.RequestTopK]: request?.topK,\n [TraceAttribute.GenAI.RequestTopP]: request?.topP\n };\n}\n\n/** Builds the child span for a tool execution. */\nexport function toolCallSpan(input: {\n readonly integration: IntegrationName;\n readonly operation: string;\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: input.integration,\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n input.toolName\n )\n };\n}\n\n/** Builds a bounded child span for one tool-approval lifecycle segment. */\nexport function toolApprovalSpan(input: {\n readonly state: \"approved\" | \"denied\" | \"requested\";\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: \"tool.approval\",\n [TraceAttribute.Cloudflare.ToolApprovalState]: input.state,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\"tool_approval\", input.toolName)\n };\n}\n\n/** Projects a completed model operation into canonical finish attributes. */\nexport function finishAttributes(input: {\n readonly aiGatewayLogId?: string | undefined;\n readonly finishReason: string | undefined;\n readonly response?: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds?: number | undefined;\n readonly toolCallCount?: number | undefined;\n readonly usage: TokenUsageSummary | undefined;\n}): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: input.aiGatewayLogId,\n [TraceAttribute.Cloudflare.ResponseFinishReason]: input.finishReason,\n [TraceAttribute.Cloudflare.ToolCount]: input.toolCallCount,\n [TraceAttribute.Cloudflare.UsageTotalTokens]: totalTokens(input.usage),\n [TraceAttribute.GenAI.ResponseID]: input.response?.id,\n [TraceAttribute.GenAI.ResponseModel]: input.response?.model,\n [TraceAttribute.GenAI.ResponseTimeToFirstChunk]:\n input.timeToFirstChunkSeconds,\n [TraceAttribute.GenAI.UsageCacheCreationInputTokens]:\n input.usage?.cacheCreationInputTokens,\n [TraceAttribute.GenAI.UsageCacheReadInputTokens]:\n input.usage?.cacheReadInputTokens,\n [TraceAttribute.GenAI.UsageInputTokens]: input.usage?.inputTokens,\n [TraceAttribute.GenAI.UsageOutputTokens]: input.usage?.outputTokens,\n [TraceAttribute.GenAI.UsageReasoningOutputTokens]:\n input.usage?.reasoningTokens\n };\n}\n\n/** Attribute projection for an AI Gateway log reference discovered on error. */\nexport function aiGatewayLogAttributes(\n aiGatewayLogId: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: aiGatewayLogId\n };\n}\n\nfunction totalTokens(usage: TokenUsageSummary | undefined): number | undefined {\n if (usage?.totalTokens !== undefined) {\n return usage.totalTokens;\n }\n return usage?.inputTokens !== undefined && usage.outputTokens !== undefined\n ? usage.inputTokens + usage.outputTokens\n : undefined;\n}\n","import { finishAttributes } from \"../../genai/telemetry\";\nimport type {\n RequestSummary,\n ResponseSummary,\n TokenUsageSummary\n} from \"../../genai/telemetry\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport {\n readNestedTokenField,\n readNumber,\n readString,\n readTokenCount\n} from \"../read\";\n\n/** Identity fields extracted from an AI SDK v6 language model object. */\nexport type ModelInfo = {\n readonly modelId: string | undefined;\n readonly provider: string | undefined;\n};\n\nexport function finishAttributesFromResult(\n result: unknown,\n options: {\n readonly aiGatewayLogId?: string | undefined;\n readonly includeResponse?: boolean;\n } = {}\n): TraceAttributes {\n return finishAttributes({\n aiGatewayLogId: options.aiGatewayLogId,\n finishReason: extractFinishReason(result),\n response: options.includeResponse ? extractResponseInfo(result) : undefined,\n toolCallCount: extractToolCallCount(result),\n usage: extractAISDKv6TokenUsage(result)\n });\n}\n\nexport function extractRequestSummary(\n params: Record<string, unknown>,\n operation: string\n): RequestSummary {\n return {\n frequencyPenalty: readNumber(params.frequencyPenalty),\n maxTokens: readNumber(params.maxOutputTokens ?? params.maxTokens),\n outputType:\n operation === \"generateObject\" || operation === \"streamObject\"\n ? \"json\"\n : \"text\",\n presencePenalty: readNumber(params.presencePenalty),\n seed: readNumber(params.seed),\n stream: operation === \"streamText\" || operation === \"streamObject\",\n temperature: readNumber(params.temperature),\n topK: readNumber(params.topK),\n topP: readNumber(params.topP)\n };\n}\n\n/** Extracts model identity from an AI SDK v6 model object. */\nexport function extractModelInfo(value: unknown): ModelInfo | undefined {\n // Gateway-style string model ids still identify the model.\n if (typeof value === \"string\") {\n return value.length > 0\n ? { modelId: value, provider: undefined }\n : undefined;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK model objects are records; we only read modelId and provider.\n const record = value as Record<string, unknown>;\n const modelId =\n typeof record.modelId === \"string\" ? record.modelId : undefined;\n const provider =\n typeof record.provider === \"string\" ? record.provider : undefined;\n\n if (modelId === undefined && provider === undefined) {\n return undefined;\n }\n\n return { modelId, provider };\n}\n\n/**\n * Extracts token usage from an AI SDK v6 result or stream chunk.\n *\n * AI SDK v6 exposes usage as `{ inputTokens, outputTokens, totalTokens }`\n * where `inputTokens`/`outputTokens` may be plain numbers or nested objects\n * like `{ total, cacheRead, cacheWrite }` / `{ total, reasoning }`.\n */\nexport function extractAISDKv6TokenUsage(\n value: unknown\n): TokenUsageSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result/chunk objects are records with known optional fields.\n const record = value as Record<string, unknown>;\n\n // AI SDK v6 results expose totalUsage (multi-step aggregate) or usage.\n const raw = record.totalUsage ?? record.usage;\n if (typeof raw !== \"object\" || raw === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK v6 usage is a record with inputTokens, outputTokens, totalTokens.\n const usage = raw as Record<string, unknown>;\n\n const inputTokens = readTokenCount(usage.inputTokens);\n const outputTokens = readTokenCount(usage.outputTokens);\n const totalTokens = readNumber(usage.totalTokens);\n // The public result usage keeps details in inputTokenDetails/outputTokenDetails\n // (with deprecated flat fields); provider-level usage nests them on the token\n // counts themselves. Read all shapes.\n const cacheReadInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheReadTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheRead\") ??\n readNumber(usage.cachedInputTokens);\n const cacheCreationInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheWriteTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheWrite\");\n const reasoningTokens =\n readNestedTokenField(usage.outputTokenDetails, \"reasoningTokens\") ??\n readNestedTokenField(usage.outputTokens, \"reasoning\") ??\n readNumber(usage.reasoningTokens);\n\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined &&\n cacheReadInputTokens === undefined &&\n cacheCreationInputTokens === undefined &&\n reasoningTokens === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(cacheCreationInputTokens !== undefined\n ? { cacheCreationInputTokens }\n : {}),\n ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {})\n };\n}\n\nfunction extractToolCallCount(value: unknown): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const toolCalls = (value as Record<string, unknown>).toolCalls;\n return Array.isArray(toolCalls) && toolCalls.length > 0\n ? toolCalls.length\n : undefined;\n}\n\n/**\n * Reads a finish reason from an AI SDK v6 result or `finish`-type stream chunk.\n */\nexport function extractFinishReason(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects are records with an optional finishReason field.\n const record = value as Record<string, unknown>;\n const finishReason = record.finishReason;\n\n if (typeof finishReason === \"string\") {\n return finishReason;\n }\n\n // AI SDK v6 may expose finishReason as { unified: string }.\n if (typeof finishReason === \"object\" && finishReason !== null) {\n // SAFETY: finishReason object has an optional unified string field.\n const unified = (finishReason as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n }\n\n return undefined;\n}\n\nexport function extractResponseInfo(\n value: unknown\n): ResponseSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects may expose a response record with id/model.\n const record = value as Record<string, unknown>;\n\n // Provider-level `response-metadata` stream parts carry id/modelId at the\n // top level (no nested response record).\n if (record.type === \"response-metadata\") {\n const id = readString(record.id);\n const model = readString(record.modelId);\n if (id === undefined && model === undefined) {\n return undefined;\n }\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n }\n\n const response =\n typeof record.response === \"object\" && record.response !== null\n ? (record.response as Record<string, unknown>)\n : undefined;\n const id = readString(record.responseId ?? response?.id);\n const model = readString(\n record.responseModel ?? response?.modelId ?? response?.model\n );\n\n if (id === undefined && model === undefined) {\n return undefined;\n }\n\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n}\n","const MAX_AI_GATEWAY_LOG_ID_BYTES = 256;\nconst AI_GATEWAY_CONTAINER_KEYS = new Set([\n \"aigateway\",\n \"binding\",\n \"cause\",\n \"cloudflare\",\n \"config\",\n \"context\",\n \"error\",\n \"gateway\",\n \"providermetadata\",\n \"rawresponse\",\n \"response\",\n \"workersai\"\n]);\n\n/**\n * Reads an AI Gateway log id from explicit provider surfaces only: response\n * headers, provider metadata, gateway errors, or a Workers AI binding. The\n * walk is bounded and uses data-property descriptors, so telemetry cannot get\n * stuck on cycles or invoke arbitrary application getters. Unknown shapes fail\n * open and simply omit the attribute.\n */\nexport function extractAIGatewayLogId(value: unknown): string | undefined {\n const seen = new Set<object>();\n let visited = 0;\n\n const visit = (\n candidate: unknown,\n depth: number,\n gatewayScoped: boolean,\n providerMetadata: boolean,\n responseScoped: boolean\n ): string | undefined => {\n if (\n candidate === null ||\n candidate === undefined ||\n depth > 6 ||\n (typeof candidate !== \"object\" && typeof candidate !== \"function\") ||\n seen.has(candidate) ||\n visited >= 200\n ) {\n return undefined;\n }\n seen.add(candidate);\n visited += 1;\n\n if (typeof Response !== \"undefined\" && candidate instanceof Response) {\n return readHeaderLogId(candidate.headers);\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(candidate);\n } catch {\n return undefined;\n }\n\n const objectName = dataString(descriptors.name);\n const scopedHere =\n gatewayScoped ||\n (objectName !== undefined && isGatewayKey(normalizeKey(objectName)));\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n\n const normalizedKey = normalizeKey(key);\n if (\n normalizedKey === \"cfaiglogid\" ||\n normalizedKey === \"aigatewaylogid\"\n ) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (\n normalizedKey === \"responseheaders\" ||\n (normalizedKey === \"headers\" && responseScoped)\n ) {\n const logId = readHeaderLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (normalizedKey === \"logid\" && scopedHere) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n }\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n const normalizedKey = normalizeKey(key);\n if (!providerMetadata && !AI_GATEWAY_CONTAINER_KEYS.has(normalizedKey)) {\n continue;\n }\n\n const nested = visit(\n descriptor.value,\n depth + 1,\n scopedHere || isGatewayKey(normalizedKey),\n providerMetadata || normalizedKey === \"providermetadata\",\n normalizedKey === \"response\" || normalizedKey === \"rawresponse\"\n );\n if (nested !== undefined) {\n return nested;\n }\n }\n\n return undefined;\n };\n\n return visit(value, 0, false, false, false);\n}\n\n/** Per-wrapped-model view of a Workers AI binding's latest response log id. */\nexport type AIGatewayLogCapture = {\n readonly model: object;\n get(): string | undefined;\n reset(): void;\n};\n\n/**\n * workers-ai-provider currently exposes the gateway ID on its `Ai` binding,\n * not in the LanguageModel result. Clone only that known runtime shape and\n * proxy `binding.run` so the ID is captured as that call settles instead of\n * reading the binding's mutable latest value later when the span ends.\n */\nexport function captureAIGatewayLogFromModel(\n model: object,\n provider: string | undefined\n): AIGatewayLogCapture {\n let logId: string | undefined;\n const capture = {\n model,\n get: () => logId,\n reset: () => {\n logId = undefined;\n }\n };\n\n if (!provider?.toLowerCase().startsWith(\"workersai\")) {\n return capture;\n }\n\n try {\n const modelDescriptors = Object.getOwnPropertyDescriptors(model);\n const configDescriptor = modelDescriptors.config;\n if (!configDescriptor || !(\"value\" in configDescriptor)) {\n return capture;\n }\n\n const config = configDescriptor.value;\n if (typeof config !== \"object\" || config === null) {\n return capture;\n }\n const configDescriptors = Object.getOwnPropertyDescriptors(config);\n const bindingDescriptor = configDescriptors.binding;\n if (!bindingDescriptor || !(\"value\" in bindingDescriptor)) {\n return capture;\n }\n\n const binding = bindingDescriptor.value;\n if (\n typeof binding !== \"object\" ||\n binding === null ||\n !(\"aiGatewayLogId\" in binding) ||\n typeof (binding as { run?: unknown }).run !== \"function\"\n ) {\n return capture;\n }\n\n const bindingProxy = new Proxy(binding, {\n get(target, property, receiver) {\n if (property !== \"run\") {\n return Reflect.get(target, property, receiver);\n }\n\n return (...args: readonly unknown[]) => {\n const run = Reflect.get(target, property, target) as (\n ...runArgs: readonly unknown[]\n ) => unknown;\n const previousLogId = extractAIGatewayLogId(target);\n logId = undefined;\n const captureResult = (result: unknown): void => {\n const resultLogId = extractAIGatewayLogId(result);\n const currentLogId = extractAIGatewayLogId(target);\n logId =\n resultLogId ??\n (currentLogId !== previousLogId ? currentLogId : undefined);\n };\n try {\n return Promise.resolve(Reflect.apply(run, target, args)).then(\n (result) => {\n captureResult(result);\n return result;\n },\n (cause: unknown) => {\n captureResult(cause);\n throw cause;\n }\n );\n } catch (cause: unknown) {\n captureResult(cause);\n throw cause;\n }\n };\n }\n });\n\n const configClone = Object.create(Object.getPrototypeOf(config), {\n ...configDescriptors,\n binding: { ...bindingDescriptor, value: bindingProxy }\n }) as object;\n capture.model = Object.create(Object.getPrototypeOf(model), {\n ...modelDescriptors,\n config: { ...configDescriptor, value: configClone }\n }) as object;\n } catch {\n // Unknown/frozen/proxied provider shape: keep the original model. Header\n // and provider-metadata extraction still work when the result exposes them.\n }\n\n return capture;\n}\n\nfunction readHeaderLogId(value: unknown): string | undefined {\n if (isHeadersLike(value)) {\n try {\n return boundedAIGatewayLogId(value.get(\"cf-aig-log-id\"));\n } catch {\n return undefined;\n }\n }\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(value);\n } catch {\n return undefined;\n }\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (\"value\" in descriptor && key.toLowerCase() === \"cf-aig-log-id\") {\n return boundedAIGatewayLogId(descriptor.value);\n }\n }\n return undefined;\n}\n\nfunction isHeadersLike(\n value: unknown\n): value is { get(name: string): string | null } {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n try {\n return \"get\" in value && typeof value.get === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isGatewayKey(value: string): boolean {\n return (\n value.includes(\"gateway\") ||\n value.includes(\"aig\") ||\n value.includes(\"workersai\") ||\n value === \"cloudflare\"\n );\n}\n\nfunction normalizeKey(value: string): string {\n return value.toLowerCase().replaceAll(/[-_.]/g, \"\");\n}\n\nfunction dataString(\n descriptor: PropertyDescriptor | undefined\n): string | undefined {\n return descriptor && \"value\" in descriptor\n ? nonEmptyString(descriptor.value)\n : undefined;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction boundedAIGatewayLogId(value: unknown): string | undefined {\n const id = nonEmptyString(value);\n return id !== undefined &&\n new TextEncoder().encode(id).length <= MAX_AI_GATEWAY_LOG_ID_BYTES\n ? id\n : undefined;\n}\n","import { TraceAttribute } from \"../genai/attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n// Two payload attributes plus scalar metadata stay under workerd's 64 KiB cap.\nconst MAX_ATTRIBUTE_BYTES = 28 * 1024;\nconst PROTECTED_HEAD_MESSAGES = 2;\n\ntype GenAIMessagePart = Record<string, unknown>;\ntype GenAIInputMessage = {\n readonly name?: string;\n readonly parts: GenAIMessagePart[];\n readonly role: string;\n};\ntype GenAIOutputMessage = GenAIInputMessage & {\n readonly finish_reason: string;\n};\n\nexport function inputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const messages = Array.isArray(record.prompt)\n ? record.prompt\n : Array.isArray(record.messages)\n ? record.messages\n : typeof record.prompt === \"string\"\n ? [{ role: \"user\", content: record.prompt }]\n : undefined;\n return {\n [TraceAttribute.GenAI.InputMessages]: serializeMessages(\n messages === undefined ? undefined : formatInputMessages(messages)\n )\n };\n}\n\nexport function outputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const parts = outputParts(record);\n const finishReason = readFinishReason(record);\n return outputMessageAttributesFrom(\n parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined\n );\n}\n\nexport function outputMessageAttributesFrom(\n messages: readonly unknown[] | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputMessages]: serializeMessages(messages)\n };\n}\n\nexport function toolInputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallArguments]: serialize(value) }\n : {};\n}\n\nexport function toolOutputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallResult]: serialize(value) }\n : {};\n}\n\nexport function createStreamMessages(): {\n messages(finishReason?: string): unknown[] | undefined;\n observe(chunk: unknown): void;\n} {\n let text = \"\";\n let reasoning = \"\";\n const toolParts: GenAIMessagePart[] = [];\n\n return {\n messages(finishReason) {\n const parts = [\n ...(reasoning\n ? [{ type: \"reasoning\", content: reasoning } as GenAIMessagePart]\n : []),\n ...(text ? [{ type: \"text\", content: text } as GenAIMessagePart] : []),\n ...toolParts\n ];\n return parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined;\n },\n observe(chunk) {\n if (typeof chunk !== \"object\" || chunk === null) return;\n const record = chunk as Record<string, unknown>;\n const delta = record.text ?? record.delta;\n if (record.type === \"text-delta\" && typeof delta === \"string\") {\n text += delta;\n } else if (\n record.type === \"reasoning-delta\" &&\n typeof delta === \"string\"\n ) {\n reasoning += delta;\n } else if (record.type === \"tool-call\" || record.type === \"tool-result\") {\n const part = formatMessagePart(record);\n if (part !== undefined) toolParts.push(part);\n }\n }\n };\n}\n\nfunction formatInputMessages(\n messages: readonly unknown[]\n): GenAIInputMessage[] {\n const formatted: GenAIInputMessage[] = [];\n for (const message of messages) {\n const next = formatInputMessage(message);\n if (next !== undefined) formatted.push(next);\n }\n return formatted;\n}\n\nfunction formatInputMessage(value: unknown): GenAIInputMessage | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const record = value as Record<string, unknown>;\n if (typeof record.role !== \"string\") return undefined;\n\n const rawParts = Array.isArray(record.parts)\n ? record.parts\n : Array.isArray(record.content)\n ? record.content\n : typeof record.content === \"string\"\n ? [record.content]\n : [];\n const parts = rawParts\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n const name = typeof record.name === \"string\" ? record.name : undefined;\n\n return {\n role: record.role,\n parts,\n ...(name !== undefined ? { name } : {})\n };\n}\n\nfunction outputParts(record: Record<string, unknown>): GenAIMessagePart[] {\n if (Array.isArray(record.content)) {\n return record.content\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n }\n\n const parts: GenAIMessagePart[] = [];\n appendReasoningParts(parts, record.reasoning);\n if (typeof record.text === \"string\" && record.text.length > 0) {\n parts.push({ type: \"text\", content: record.text });\n }\n if (Array.isArray(record.toolCalls)) {\n for (const toolCall of record.toolCalls) {\n const part = formatMessagePart(toolCall);\n if (part !== undefined) parts.push(part);\n }\n }\n return parts;\n}\n\nfunction appendReasoningParts(\n parts: GenAIMessagePart[],\n reasoning: unknown\n): void {\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n parts.push({ type: \"reasoning\", content: reasoning });\n return;\n }\n if (!Array.isArray(reasoning)) return;\n\n for (const entry of reasoning) {\n if (typeof entry !== \"object\" || entry === null) continue;\n const text = (entry as Record<string, unknown>).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"reasoning\", content: text });\n }\n }\n}\n\nfunction formatMessagePart(value: unknown): GenAIMessagePart | undefined {\n if (typeof value === \"string\") {\n return { type: \"text\", content: value };\n }\n if (typeof value !== \"object\" || value === null) return undefined;\n\n const record = value as Record<string, unknown>;\n if (typeof record.type !== \"string\") return undefined;\n\n switch (record.type) {\n case \"text\":\n case \"reasoning\": {\n const content = record.content ?? record.text;\n return typeof content === \"string\"\n ? { type: record.type, content }\n : undefined;\n }\n case \"tool-call\":\n case \"tool_call\":\n return formatToolCall(record);\n case \"tool-result\":\n case \"tool_result\":\n case \"tool_call_response\":\n return formatToolCallResponse(record);\n default:\n // The OTel schema permits extensible generic parts. Keep their type but\n // do not leak AI SDK-native property names into known semantic parts.\n return { type: record.type.replaceAll(\"-\", \"_\") };\n }\n}\n\nfunction formatToolCall(\n record: Record<string, unknown>\n): GenAIMessagePart | undefined {\n const name = record.name ?? record.toolName;\n if (typeof name !== \"string\") return undefined;\n const id = record.id ?? record.toolCallId;\n const args = record.arguments ?? record.input;\n\n return {\n type: \"tool_call\",\n ...(typeof id === \"string\" ? { id } : {}),\n name,\n ...(args !== undefined ? { arguments: parseJson(args) } : {})\n };\n}\n\nfunction formatToolCallResponse(\n record: Record<string, unknown>\n): GenAIMessagePart {\n const id = record.id ?? record.toolCallId;\n const rawResponse = record.response ?? record.output ?? record.result ?? null;\n\n return {\n type: \"tool_call_response\",\n ...(typeof id === \"string\" ? { id } : {}),\n response: toolResponse(rawResponse)\n };\n}\n\nfunction toolResponse(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const record = value as Record<string, unknown>;\n switch (record.type) {\n case \"text\":\n case \"error-text\":\n case \"json\":\n case \"error-json\":\n case \"content\":\n return record.value ?? null;\n case \"execution-denied\":\n return {\n denied: true,\n ...(typeof record.reason === \"string\" ? { reason: record.reason } : {})\n };\n default:\n return value;\n }\n}\n\nfunction outputMessage(\n parts: GenAIMessagePart[],\n finishReason: string | undefined\n): GenAIOutputMessage {\n return {\n role: \"assistant\",\n parts,\n // AI SDK normally always reports this. Keep the schema valid if a custom\n // provider omits it rather than emitting an output message without the\n // required field.\n finish_reason: normalizeFinishReason(finishReason ?? \"unknown\")\n };\n}\n\nfunction readFinishReason(record: Record<string, unknown>): string | undefined {\n const value = record.finishReason ?? record.finish_reason;\n if (typeof value === \"string\") return value;\n if (typeof value !== \"object\" || value === null) return undefined;\n const unified = (value as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n}\n\nfunction normalizeFinishReason(value: string): string {\n switch (value) {\n case \"content-filter\":\n return \"content_filter\";\n case \"tool-calls\":\n case \"tool_calls\":\n return \"tool_call\";\n case \"other\":\n case \"unknown\":\n return \"stop\";\n default:\n return value;\n }\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction serializeMessages(\n messages: readonly unknown[] | undefined\n): string | undefined {\n if (messages === undefined) return undefined;\n\n const kept = [...messages];\n while (true) {\n const json = stringify(kept);\n if (json === undefined) return undefined;\n if (byteLength(json) <= MAX_ATTRIBUTE_BYTES) return json;\n if (kept.length <= PROTECTED_HEAD_MESSAGES) return undefined;\n kept.splice(PROTECTED_HEAD_MESSAGES, 1);\n }\n}\n\nfunction serialize(value: unknown): string | undefined {\n const json = stringify(value);\n return json !== undefined && byteLength(json) <= MAX_ATTRIBUTE_BYTES\n ? json\n : undefined;\n}\n\nfunction stringify(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n","import {\n aiGatewayLogAttributes,\n finishAttributes\n} from \"../../genai/telemetry\";\nimport type { ResponseSummary, TokenUsageSummary } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes, AgentSpan } from \"../../tracing/tracer\";\nimport { extractAIGatewayLogId } from \"../ai-gateway\";\nimport { createStreamMessages, outputMessageAttributesFrom } from \"../content\";\nimport {\n extractAISDKv6TokenUsage,\n extractFinishReason,\n extractResponseInfo\n} from \"./extract\";\n\ntype StreamSummary = {\n readonly aiGatewayLogId?: string;\n readonly finishReason?: string;\n readonly outputMessages?: unknown[];\n readonly response?: ResponseSummary;\n readonly toolCallCount?: number;\n readonly timeToFirstChunkSeconds?: number;\n readonly usage?: TokenUsageSummary;\n};\n\nexport function finishWhenStreamCompletes(\n result: unknown,\n span: AgentSpan,\n options: {\n readonly aiGatewayLogId?: string;\n readonly includeAIGatewayLog?: boolean;\n readonly includeResponse?: boolean;\n readonly storeMessages?: boolean;\n readonly startedAtMs?: number;\n } = {}\n): unknown {\n return patchStreamFields(\n result,\n {\n onComplete: (summary) => {\n span.finish(\n finishAttributesFromStreamSummary(\n summary,\n options.includeResponse === true,\n options.includeAIGatewayLog === true,\n options.aiGatewayLogId,\n options.storeMessages === true\n )\n );\n },\n onError: (cause, observedAIGatewayLogId) => {\n if (options.includeAIGatewayLog) {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(\n observedAIGatewayLogId ??\n extractAIGatewayLogId(cause) ??\n options.aiGatewayLogId\n )\n );\n }\n span.fail(cause);\n }\n },\n options.startedAtMs,\n options.includeAIGatewayLog ? options.aiGatewayLogId : undefined,\n options.storeMessages === true\n );\n}\n\nfunction finishAttributesFromStreamSummary(\n summary: StreamSummary | undefined,\n includeResponse: boolean,\n includeAIGatewayLog: boolean,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): TraceAttributes {\n return {\n ...finishAttributes({\n aiGatewayLogId: includeAIGatewayLog\n ? (summary?.aiGatewayLogId ?? initialAIGatewayLogId)\n : undefined,\n finishReason: summary?.finishReason,\n response: includeResponse ? summary?.response : undefined,\n timeToFirstChunkSeconds: summary?.timeToFirstChunkSeconds,\n toolCallCount: summary?.toolCallCount,\n usage: summary?.usage\n }),\n ...outputMessageAttributesFrom(\n storeMessages ? summary?.outputMessages : undefined\n )\n };\n}\n\nfunction patchStreamFields(\n result: unknown,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): unknown {\n if (typeof result !== \"object\" || result === null) {\n hooks.onComplete(undefined);\n return result;\n }\n\n // SAFETY: AI SDK stream results are records with stream fields.\n const record = result as Record<string, unknown>;\n\n let patchedAny = false;\n let closed = false;\n\n const completeOnce = (summary: StreamSummary | undefined) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onComplete(summary);\n };\n\n const errorOnce = (\n cause: unknown,\n observedAIGatewayLogId: string | undefined\n ) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onError(cause, observedAIGatewayLogId);\n };\n\n // Instrumentation must fail open: if the SDK's private stream fields change\n // shape or refuse patching, close the span and return the result untouched\n // rather than breaking an otherwise valid call.\n try {\n if (isReadableStream(record.baseStream)) {\n Object.defineProperty(record, \"baseStream\", {\n configurable: true,\n enumerable: true,\n value: wrapReadableStream(\n record.baseStream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n return result;\n }\n\n const streamField = findStreamField(record, [\n \"partialObjectStream\",\n \"textStream\",\n \"fullStream\",\n \"stream\"\n ]);\n\n if (streamField) {\n Object.defineProperty(record, streamField.field, {\n configurable: true,\n enumerable: true,\n value:\n streamField.kind === \"readable\"\n ? wrapReadableStream(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n )\n : wrapAsyncIterable(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n patchedAny = true;\n }\n } catch {\n patchedAny = false;\n }\n\n if (!patchedAny) {\n hooks.onComplete(undefined);\n return result;\n }\n\n return result;\n}\n\nfunction findStreamField(\n result: Record<string, unknown>,\n candidateFields: readonly string[]\n):\n | {\n readonly field: string;\n readonly kind: \"asyncIterable\";\n readonly stream: AsyncIterable<unknown>;\n }\n | {\n readonly field: string;\n readonly kind: \"readable\";\n readonly stream: ReadableStream<unknown>;\n }\n | undefined {\n for (const field of candidateFields) {\n try {\n const stream = result[field];\n if (isReadableStream(stream)) {\n return { field, kind: \"readable\", stream };\n }\n if (isAsyncIterable(stream)) {\n return { field, kind: \"asyncIterable\", stream };\n }\n } catch {\n // Ignore getter failures.\n }\n }\n\n return undefined;\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): ReadableStream<unknown> {\n let reader: ReadableStreamDefaultReader<unknown> | undefined;\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n\n return new ReadableStream<unknown>({\n async pull(controller) {\n reader ??= stream.getReader();\n try {\n const result = await reader.read();\n if (state.closed) {\n return;\n }\n\n if (result.done) {\n state.complete();\n controller.close();\n releaseReader();\n return;\n }\n\n state.observeChunk(result.value);\n controller.enqueue(result.value);\n } catch (cause: unknown) {\n if (!state.closed) {\n state.fail(cause);\n controller.error(cause);\n }\n releaseReader();\n }\n },\n async cancel(reason) {\n state.cancel();\n try {\n if (reader) {\n await reader.cancel(reason);\n return;\n }\n\n await stream.cancel(reason);\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n releaseReader();\n }\n }\n });\n\n function releaseReader(): void {\n if (!reader) {\n return;\n }\n\n try {\n reader.releaseLock();\n } catch {\n // Ignore lock release failures after stream errors or cancellation.\n } finally {\n reader = undefined;\n }\n }\n}\n\nfunction wrapAsyncIterable(\n stream: AsyncIterable<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n try {\n for await (const chunk of stream) {\n state.observeChunk(chunk);\n yield chunk;\n }\n\n state.complete();\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n state.cancel();\n }\n }\n };\n}\n\nfunction createStreamState(\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined\n ) => void;\n },\n startedAtMs: number | undefined,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): {\n readonly closed: boolean;\n cancel(): void;\n complete(): void;\n fail(cause: unknown): void;\n observeChunk(chunk: unknown): void;\n} {\n let closed = false;\n let aiGatewayLogId = initialAIGatewayLogId;\n let finishReason: string | undefined;\n let toolCallCount = 0;\n let usage: TokenUsageSummary | undefined;\n let response: ResponseSummary | undefined;\n let observedError: { readonly cause: unknown } | undefined;\n let observedAbort = false;\n let firstChunkAtMs: number | undefined;\n const output = createStreamMessages();\n\n const settleObserved = (): boolean => {\n if (observedError) {\n hooks.onError(observedError.cause, aiGatewayLogId);\n return true;\n }\n\n if (observedAbort) {\n // AI SDK v6 signals aborts as an in-band `{ type: \"abort\" }` chunk and\n // completes the stream normally — it never rejects with an AbortError.\n // Surface a structurally AbortError-shaped cause so the tracer\n // classifies the span as canceled instead of a false success.\n hooks.onError({ name: \"AbortError\" }, aiGatewayLogId);\n return true;\n }\n\n return false;\n };\n\n return {\n get closed() {\n return closed;\n },\n cancel() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(undefined);\n },\n complete() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(\n streamSummaryFromParts({\n aiGatewayLogId,\n finishReason,\n outputMessages: storeMessages\n ? output.messages(finishReason)\n : undefined,\n response,\n timeToFirstChunkSeconds:\n firstChunkAtMs === undefined || startedAtMs === undefined\n ? undefined\n : (firstChunkAtMs - startedAtMs) / 1000,\n toolCallCount,\n usage\n })\n );\n },\n fail(cause) {\n if (closed) {\n return;\n }\n\n closed = true;\n hooks.onError(cause, aiGatewayLogId);\n },\n observeChunk(rawChunk) {\n firstChunkAtMs ??= Date.now();\n const chunk = unwrapChunkEnvelope(rawChunk);\n aiGatewayLogId = extractAIGatewayLogId(chunk) ?? aiGatewayLogId;\n if (storeMessages) output.observe(chunk);\n // AI SDK v6 signals mid-stream provider failures as an in-band\n // `{ type: \"error\" }` chunk rather than rejecting the stream, so the\n // stream still reaches normal completion afterward. Record it here and\n // fail the span on completion instead of treating it as a success.\n if (isErrorChunk(chunk)) {\n observedError = { cause: chunk.error };\n }\n if (isAbortChunk(chunk)) {\n observedAbort = true;\n }\n if (isToolCallChunk(chunk)) {\n toolCallCount += 1;\n }\n finishReason = extractFinishReason(chunk) ?? finishReason;\n usage = extractAISDKv6TokenUsage(chunk) ?? usage;\n response = extractResponseInfo(chunk) ?? response;\n }\n };\n}\n\n/**\n * The streamText result's private `baseStream` carries `{ part, partialOutput }`\n * envelopes rather than bare stream parts; `fullStream` and provider-level\n * streams carry bare parts. Unwrap the envelope when present so chunk\n * inspection sees the actual part in both cases.\n */\nfunction unwrapChunkEnvelope(chunk: unknown): unknown {\n if (typeof chunk !== \"object\" || chunk === null) {\n return chunk;\n }\n\n const part = (chunk as Record<string, unknown>).part;\n return typeof part === \"object\" &&\n part !== null &&\n \"type\" in (part as Record<string, unknown>)\n ? part\n : chunk;\n}\n\nfunction isErrorChunk(chunk: unknown): chunk is { readonly error: unknown } {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"error\"\n );\n}\n\nfunction isAbortChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"abort\"\n );\n}\n\nfunction streamSummaryFromParts(input: {\n readonly aiGatewayLogId: string | undefined;\n readonly finishReason: string | undefined;\n readonly outputMessages: unknown[] | undefined;\n readonly response: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds: number | undefined;\n readonly toolCallCount: number;\n readonly usage: TokenUsageSummary | undefined;\n}): StreamSummary {\n return {\n ...(input.aiGatewayLogId !== undefined\n ? { aiGatewayLogId: input.aiGatewayLogId }\n : {}),\n ...(input.finishReason !== undefined\n ? { finishReason: input.finishReason }\n : {}),\n ...(input.outputMessages !== undefined\n ? { outputMessages: input.outputMessages }\n : {}),\n ...(input.response ? { response: input.response } : {}),\n ...(input.timeToFirstChunkSeconds !== undefined\n ? { timeToFirstChunkSeconds: input.timeToFirstChunkSeconds }\n : {}),\n ...(input.toolCallCount > 0 ? { toolCallCount: input.toolCallCount } : {}),\n ...(input.usage ? { usage: input.usage } : {})\n };\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"pipeThrough\" in value &&\n typeof value.pipeThrough === \"function\" &&\n \"getReader\" in value &&\n typeof value.getReader === \"function\"\n );\n}\n\nfunction isToolCallChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"tool-call\"\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof value[Symbol.asyncIterator] === \"function\"\n );\n}\n","import { aiGatewayLogAttributes, modelCallSpan } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\nimport {\n captureAIGatewayLogFromModel,\n extractAIGatewayLogId\n} from \"../ai-gateway\";\nimport { inputMessageAttributes, outputMessageAttributes } from \"../content\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport type { AISDKV6WrapLanguageModel } from \"./types\";\n\nexport function wrapModel(\n tracer: AgentTracer,\n wrapLanguageModel: AISDKV6WrapLanguageModel | undefined,\n model: unknown,\n parentOperation: string,\n storeMessages: boolean\n): unknown {\n if (!wrapLanguageModel) {\n return model;\n }\n\n // Gateway-style string model ids can't take middleware; leave them to the\n // SDK's own resolution (the operation root span still carries the model).\n if (typeof model !== \"object\" || model === null) {\n return model;\n }\n\n const modelInfo = extractModelInfo(model);\n const aiGatewayLog = captureAIGatewayLogFromModel(model, modelInfo?.provider);\n return wrapLanguageModel({\n model: aiGatewayLog.model,\n middleware: {\n wrapGenerate: async ({ doGenerate, params }) => {\n const span = modelCallSpanForModel(\n \"doGenerate\",\n modelInfo,\n params,\n parentOperation,\n storeMessages\n );\n return tracer.withSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const result = await doGenerate();\n modelCall.finish({\n ...finishAttributesFromResult(result, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeResponse: true\n }),\n ...outputMessageAttributes(result, storeMessages)\n });\n return result;\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n throw cause;\n }\n }\n );\n },\n wrapStream: async ({ doStream, params }) => {\n const span = modelCallSpanForModel(\n \"doStream\",\n modelInfo,\n params,\n parentOperation,\n storeMessages\n );\n // The provider call runs INSIDE the activation callback so its work\n // (fetch subrequests, etc.) nests under the chat span; the span stays\n // caller-owned because the stream outlives the callback.\n return tracer.openSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const startedAtMs = Date.now();\n const result = await doStream();\n return finishWhenStreamCompletes(result, modelCall, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeAIGatewayLog: true,\n includeResponse: true,\n storeMessages,\n startedAtMs\n });\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n modelCall.fail(cause);\n throw cause;\n }\n }\n );\n }\n }\n });\n}\n\nfunction recordAIGatewayLogOnError(\n span: AgentSpan,\n cause: unknown,\n capturedLogId: string | undefined\n): void {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(extractAIGatewayLogId(cause) ?? capturedLogId)\n );\n}\n\nfunction modelCallSpanForModel(\n operation: string,\n model: ModelInfo | undefined,\n params: unknown,\n parentOperation: string,\n storeMessages: boolean\n): ReturnType<typeof modelCallSpan> {\n const record =\n typeof params === \"object\" && params !== null\n ? (params as Record<string, unknown>)\n : {};\n const span = modelCallSpan({\n integration: \"ai-sdk\",\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(record, parentOperation)\n });\n return {\n ...span,\n attributes: {\n ...span.attributes,\n ...inputMessageAttributes(record, storeMessages)\n }\n };\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { toolApprovalSpan, toolCallSpan } from \"../../genai/telemetry\";\nimport { toolInputAttributes, toolOutputAttributes } from \"../content\";\nimport { readString } from \"../read\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\n\n/** Context snapshot type returned by AsyncLocalStorage.snapshot(). */\ntype ContextSnapshot = <R>(fn: () => R) => R;\n\nexport function wrapTools(\n tracer: AgentTracer,\n tools: unknown,\n storeTools: boolean\n): unknown {\n if (typeof tools !== \"object\" || tools === null) {\n return tools;\n }\n\n // SAFETY: AI SDK tools are a record of named tool objects.\n const toolRecord = tools as Record<string, unknown>;\n const wrappedTools: Record<string, unknown> = {};\n for (const [toolName, tool] of Object.entries(toolRecord)) {\n wrappedTools[toolName] = wrapTool(tracer, toolName, tool, storeTools);\n }\n return wrappedTools;\n}\n\nfunction wrapTool(\n tracer: AgentTracer,\n toolName: string,\n tool: unknown,\n storeTools: boolean\n): unknown {\n if (typeof tool !== \"object\" || tool === null) {\n return tool;\n }\n\n // SAFETY: AI SDK tool objects have optional execute / needsApproval fields.\n const toolRecord = tool as Record<string, unknown>;\n const hasExecute = typeof toolRecord.execute === \"function\";\n const hasApproval =\n typeof toolRecord.needsApproval === \"boolean\" ||\n typeof toolRecord.needsApproval === \"function\";\n if (!hasExecute && !hasApproval) {\n return tool;\n }\n\n const wrappedTool = Object.assign(\n Object.create(Object.getPrototypeOf(tool)),\n tool\n ) as Record<string, unknown> & {\n execute: (...args: readonly unknown[]) => unknown;\n };\n if (hasApproval) {\n wrapApprovalCheck(tracer, wrappedTool, toolRecord, tool, toolName);\n }\n if (!hasExecute) {\n return wrappedTool;\n }\n\n const execute = toolRecord.execute;\n if (typeof execute !== \"function\") {\n return wrappedTool;\n }\n const originalExecute = execute.bind(tool) as (\n ...args: readonly unknown[]\n ) => unknown;\n\n wrappedTool.execute = (...args) => {\n const span = toolCallSpan({\n integration: \"ai-sdk\",\n operation: \"tool.execute\",\n toolCallId: extractToolCallId(args[1]),\n toolName\n });\n const attributes = {\n ...span.attributes,\n ...toolInputAttributes(args[0], storeTools)\n };\n // The span may outlive this call frame (streaming tools yield after\n // returning), so the wrapper owns the span lifetime via openSpan.\n return tracer.openSpan(span.name, attributes, (toolSpan) => {\n // Captured inside the activation so generator bodies (which resume at\n // the consumer's next() call sites) can be re-entered into the tool\n // span's async context.\n const inSpanContext = AsyncLocalStorage.snapshot() as ContextSnapshot;\n const approval = approvalResponseForOptions(\n args[1],\n extractToolCallId(args[1])\n );\n if (approval?.approved === true) {\n recordApprovalChild(tracer, toolName, approval.toolCallId, \"approved\");\n }\n const result = originalExecute(...args);\n\n if (isPromiseLike(result)) {\n return Promise.resolve(result).then(\n (resolved) =>\n settleToolResult(resolved, toolSpan, inSpanContext, storeTools),\n (cause: unknown) => {\n toolSpan.fail(cause);\n throw cause;\n }\n );\n }\n\n return settleToolResult(result, toolSpan, inSpanContext, storeTools);\n });\n };\n\n return wrappedTool;\n}\n\nfunction wrapApprovalCheck(\n tracer: AgentTracer,\n wrappedTool: Record<string, unknown>,\n toolRecord: Record<string, unknown>,\n tool: object,\n toolName: string\n): void {\n const approval = toolRecord.needsApproval;\n const original =\n typeof approval === \"function\"\n ? (approval.bind(tool) as (...args: readonly unknown[]) => unknown)\n : undefined;\n\n wrappedTool.needsApproval = (...args: readonly unknown[]) => {\n const result = original ? original(...args) : approval;\n const recordRequested = (needed: unknown): unknown => {\n const toolCallId = extractToolCallId(args[1]);\n if (needed === true && !hasApprovalResponse(args[1], toolCallId)) {\n recordApprovalSegment(tracer, toolName, toolCallId, \"requested\");\n }\n return needed;\n };\n\n return isPromiseLike(result)\n ? Promise.resolve(result).then(recordRequested)\n : recordRequested(result);\n };\n}\n\n/** Records denied responses, whose tool never reaches execute(). */\nexport function recordDeniedApprovalResponses(\n tracer: AgentTracer,\n messages: unknown\n): void {\n for (const response of approvalResponses(messages)) {\n if (!response.approved) {\n recordApprovalSegment(\n tracer,\n response.toolName,\n response.toolCallId,\n \"denied\"\n );\n }\n }\n}\n\nfunction recordApprovalSegment(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\"\n): void {\n const tool = toolCallSpan({\n integration: \"ai-sdk\",\n operation: \"tool.approval\",\n toolCallId,\n toolName\n });\n tracer.withSpan(tool.name, tool.attributes, () => {\n recordApprovalChild(tracer, toolName, toolCallId, state);\n });\n}\n\nfunction recordApprovalChild(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\"\n): void {\n const approval = toolApprovalSpan({ state, toolCallId, toolName });\n tracer.withSpan(approval.name, approval.attributes, () => undefined);\n}\n\nfunction hasApprovalResponse(\n options: unknown,\n toolCallId: string | undefined\n): boolean {\n return approvalResponseForOptions(options, toolCallId) !== undefined;\n}\n\nfunction approvalResponseForOptions(\n options: unknown,\n toolCallId: string | undefined\n): ReturnType<typeof approvalResponses>[number] | undefined {\n if (\n toolCallId === undefined ||\n typeof options !== \"object\" ||\n options === null\n ) {\n return undefined;\n }\n return approvalResponses((options as Record<string, unknown>).messages).find(\n (response) => response.toolCallId === toolCallId\n );\n}\n\nfunction approvalResponses(messagesValue: unknown): Array<{\n readonly approved: boolean;\n readonly toolCallId: string;\n readonly toolName: string;\n}> {\n if (!Array.isArray(messagesValue)) {\n return [];\n }\n\n const approvalToTool = new Map<string, string>();\n const toolNames = new Map<string, string>();\n for (const message of messagesValue) {\n if (typeof message !== \"object\" || message === null) continue;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n const type = readString(record.type);\n if (type === \"tool-call\") {\n const toolCallId = readString(record.toolCallId);\n const toolName = readString(record.toolName);\n if (toolCallId && toolName) toolNames.set(toolCallId, toolName);\n } else if (type === \"tool-approval-request\") {\n const approvalId = readString(record.approvalId);\n const toolCallId = readString(record.toolCallId);\n if (approvalId && toolCallId)\n approvalToTool.set(approvalId, toolCallId);\n }\n }\n }\n\n const lastMessage = messagesValue.at(-1);\n const lastContent =\n typeof lastMessage === \"object\" && lastMessage !== null\n ? (lastMessage as Record<string, unknown>).content\n : undefined;\n const decisions: Array<{\n readonly approvalId: string;\n readonly approved: boolean;\n }> = [];\n if (Array.isArray(lastContent)) {\n for (const part of lastContent) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n if (record.type !== \"tool-approval-response\") continue;\n const approvalId = readString(record.approvalId);\n if (approvalId && typeof record.approved === \"boolean\") {\n decisions.push({ approvalId, approved: record.approved });\n }\n }\n }\n\n return decisions.flatMap(({ approvalId, approved }) => {\n const toolCallId = approvalToTool.get(approvalId);\n if (!toolCallId) return [];\n return [\n {\n approved,\n toolCallId,\n toolName: toolNames.get(toolCallId) ?? \"tool\"\n }\n ];\n });\n}\n\n/**\n * Finishes the tool span for a settled result. Streaming tools (async\n * generators) return an iterable whose consumption is the tool's real\n * duration, so the span closes when iteration ends instead of at creation.\n */\nfunction settleToolResult(\n result: unknown,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): unknown {\n if (isAsyncIterable(result)) {\n return finishWhenIterableCompletes(result, span, inSpanContext, storeTools);\n }\n\n span.finish(toolOutputAttributes(result, storeTools));\n return result;\n}\n\nfunction finishWhenIterableCompletes(\n iterable: AsyncIterable<unknown>,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n // Each pull re-enters the tool span's captured async context, so the\n // generator body (which otherwise resumes under the CONSUMER's context)\n // runs — and creates any nested spans — under the tool span.\n const iterator = inSpanContext(() => iterable[Symbol.asyncIterator]());\n let exhausted = false;\n let returnValue: unknown;\n try {\n while (true) {\n const step = await inSpanContext(() => iterator.next());\n if (step.done) {\n exhausted = true;\n returnValue = step.value;\n return step.value;\n }\n yield step.value;\n }\n } catch (cause: unknown) {\n span.fail(cause);\n throw cause;\n } finally {\n if (!exhausted) {\n // Early consumer termination (break/cancel while suspended at\n // yield): forward return() so the tool generator's own finally\n // blocks run, still inside the tool span's context. A no-op when\n // the underlying iterator already settled (e.g. next() threw).\n try {\n await inSpanContext(() => iterator.return?.(undefined));\n } catch {\n // Cleanup failures must not mask the consumer's exit reason.\n }\n }\n // Covers normal completion and early consumer return; a no-op after\n // fail() since span closure is idempotent.\n span.finish(toolOutputAttributes(returnValue, storeTools));\n }\n }\n };\n}\n\n/** Reads the AI SDK tool-call id from the execute options argument. */\nfunction extractToolCallId(options: unknown): string | undefined {\n if (typeof options !== \"object\" || options === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK tool execute options carry a toolCallId string field.\n return readString((options as Record<string, unknown>).toolCallId);\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof (value as Record<PropertyKey, unknown>)[Symbol.asyncIterator] ===\n \"function\"\n );\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n value !== null &&\n value !== undefined &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n","import type {\n AISDKInstrumentationOptions,\n ResolvedAISDKStorageOptions\n} from \"../options\";\nimport { readString } from \"../read\";\nimport {\n metadataAttributes,\n operationSpan,\n operationSpanName\n} from \"../../genai/telemetry\";\nimport type { SemanticContext } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { AgentTracer } from \"../../tracing/tracer\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { wrapModel } from \"./model\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport { recordDeniedApprovalResponses, wrapTools } from \"./tools\";\nimport type {\n AISDKV6CallParams,\n AISDKV6Operation,\n AISDKV6WrapLanguageModel\n} from \"./types\";\n\ntype AISDKV6OperationName =\n | \"generateObject\"\n | \"generateText\"\n | \"streamObject\"\n | \"streamText\";\n\nexport type { AISDKV6Namespace } from \"./types\";\n\n/** Tracing configuration for the AI SDK v6 wrapper. */\nexport type AISDKV6Instrumentation = {\n readonly options?: AISDKInstrumentationOptions;\n readonly tracer: AgentTracer;\n};\n\n/**\n * Wraps an AI SDK namespace object with v6 tracing while preserving its public\n * shape and overloaded call signatures.\n */\nexport function createAISDKV6Wrapper<T extends Record<string, unknown>>(\n ai: T,\n instrumentation: AISDKV6Instrumentation\n): T {\n const target = isModuleNamespace(ai) ? Object.setPrototypeOf({}, ai) : ai;\n // Cache wrappers so repeated property reads return the same function\n // (memoization patterns like `wrapped.streamText === wrapped.streamText`).\n const wrapperCache = new Map<PropertyKey, AISDKV6Operation>();\n\n return new Proxy(target, {\n get(proxyTarget, property, receiver) {\n const original = Reflect.get(proxyTarget, property, receiver) as unknown;\n\n if (isWrappedOperationName(property) && typeof original === \"function\") {\n let wrapper = wrapperCache.get(property);\n if (!wrapper) {\n wrapper = createOperationWrapper(\n property,\n toAISDKV6Operation(original),\n readWrapLanguageModel(ai),\n instrumentation\n );\n wrapperCache.set(property, wrapper);\n }\n return wrapper;\n }\n\n return original;\n }\n }) as T;\n}\n\nfunction readWrapLanguageModel(\n ai: Record<string, unknown>\n): AISDKV6WrapLanguageModel | undefined {\n const value = ai.wrapLanguageModel;\n if (typeof value !== \"function\") {\n return undefined;\n }\n\n // SAFETY: This is a vendored structural contract for the AI SDK v6 adapter;\n // the public wrapper preserves the caller's AI SDK type instead of importing ai.\n return value as AISDKV6WrapLanguageModel;\n}\n\nfunction toAISDKV6Operation(value: unknown): AISDKV6Operation {\n // SAFETY: The proxy only calls this after selecting known AI SDK operation\n // export names. The adapter uses the narrow params fields it reads/replaces.\n return value as AISDKV6Operation;\n}\n\nfunction isModuleNamespace(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n if (value.constructor?.name === \"Module\") {\n return true;\n }\n\n try {\n const keys = Object.keys(value);\n const firstKey = keys[0];\n if (firstKey === undefined) {\n return false;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(value, firstKey);\n return descriptor\n ? !descriptor.configurable && !descriptor.writable\n : false;\n } catch {\n return false;\n }\n}\n\nfunction createOperationWrapper(\n operationName: AISDKV6OperationName,\n operation: AISDKV6Operation,\n wrapLanguageModel: AISDKV6WrapLanguageModel | undefined,\n instrumentation: AISDKV6Instrumentation\n): AISDKV6Operation {\n const storage: ResolvedAISDKStorageOptions = {\n storeMessages: instrumentation.options?.storeMessages === true,\n storeTools: instrumentation.options?.storeTools === true\n };\n\n // Only the span NAME is computed before the sampling check (it is required\n // to open a span at all, and needs a single metadata property the SDK reads\n // anyway). The full attribute spec — metadata enumeration, request fields,\n // context allowlists — is computed lazily, after isTraced confirms someone\n // is listening, so untraced calls never touch caller getters beyond that.\n if (isStreamOperation(operationName)) {\n return (params, ...args) => {\n return instrumentation.tracer.openSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n (operationSpan) => {\n // Untraced invocations take the pristine path: original params, no\n // tool wrapping, no model middleware, no stream patching.\n if (!operationSpan.isTraced) {\n operationSpan.finish();\n return operation(params, ...args);\n }\n\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(\n instrumentation.tracer,\n params.messages\n );\n\n const startedAtMs = Date.now();\n const result = operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage\n ),\n ...args\n );\n const hasModelSpan = canWrapModel(wrapLanguageModel, params.model);\n\n return finishWhenStreamCompletes(result, operationSpan, {\n includeResponse: !hasModelSpan,\n startedAtMs: hasModelSpan ? undefined : startedAtMs\n });\n }\n );\n };\n }\n\n return async (params, ...args) => {\n return instrumentation.tracer.withSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n async (operationSpan) => {\n if (!operationSpan.isTraced) {\n return operation(params, ...args);\n }\n\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(instrumentation.tracer, params.messages);\n\n const result = await operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage\n ),\n ...args\n );\n\n operationSpan.finish(\n finishAttributesFromResult(result, {\n includeResponse: !canWrapModel(wrapLanguageModel, params.model)\n })\n );\n return result;\n }\n );\n };\n}\n\n/**\n * Reads only the agent name (metadata.agentName / gen_ai.agent.name /\n * functionId) for the span name. `functionId` is the AI SDK's canonical\n * projection to `gen_ai.agent.name`; an explicit metadata name takes priority.\n */\nfunction agentNameForCall(params: AISDKV6CallParams): string | undefined {\n const telemetry =\n typeof params.experimental_telemetry === \"object\" &&\n params.experimental_telemetry !== null\n ? (params.experimental_telemetry as Record<string, unknown>)\n : undefined;\n const metadata =\n typeof telemetry?.metadata === \"object\" && telemetry.metadata !== null\n ? (telemetry.metadata as Record<string, unknown>)\n : undefined;\n\n return (\n readString(metadata?.agentName ?? metadata?.[\"gen_ai.agent.name\"]) ??\n readString(telemetry?.functionId)\n );\n}\n\nfunction operationParamsForCall(\n params: AISDKV6CallParams,\n operationName: AISDKV6OperationName,\n wrapLanguageModel: AISDKV6WrapLanguageModel | undefined,\n tracer: AgentTracer,\n storage: ResolvedAISDKStorageOptions\n): AISDKV6CallParams {\n return {\n ...params,\n ...(shouldWrapTools(operationName) && params.tools !== undefined\n ? { tools: wrapTools(tracer, params.tools, storage.storeTools) }\n : {}),\n ...(params.model !== undefined\n ? {\n model: wrapModel(\n tracer,\n wrapLanguageModel,\n params.model,\n operationName,\n storage.storeMessages\n )\n }\n : {})\n };\n}\n\nfunction canWrapModel(\n wrapLanguageModel: AISDKV6WrapLanguageModel | undefined,\n model: unknown\n): boolean {\n return (\n wrapLanguageModel !== undefined &&\n typeof model === \"object\" &&\n model !== null\n );\n}\n\nfunction isStreamOperation(operationName: AISDKV6OperationName): boolean {\n return operationName === \"streamObject\" || operationName === \"streamText\";\n}\n\nfunction shouldWrapTools(operationName: AISDKV6OperationName): boolean {\n return operationName === \"generateText\" || operationName === \"streamText\";\n}\n\nfunction isWrappedOperationName(\n value: PropertyKey\n): value is AISDKV6OperationName {\n return (\n value === \"generateObject\" ||\n value === \"generateText\" ||\n value === \"streamObject\" ||\n value === \"streamText\"\n );\n}\n\nfunction operationSpanForCall(\n operation: string,\n model: ModelInfo | undefined,\n params: AISDKV6CallParams,\n options: AISDKInstrumentationOptions | undefined\n): ReturnType<typeof operationSpan> {\n return operationSpan({\n attributes: {\n ...metadataAttributes(telemetryMetadata(params)),\n ...contextAttributes(params, options)\n },\n context: semanticContext(params),\n integration: \"ai-sdk\",\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(params, operation)\n });\n}\n\n/** Reads the per-call `experimental_telemetry.metadata` record, if present. */\nfunction telemetryMetadata(\n params: AISDKV6CallParams\n): Record<string, unknown> | undefined {\n const telemetry =\n typeof params.experimental_telemetry === \"object\" &&\n params.experimental_telemetry !== null\n ? (params.experimental_telemetry as Record<string, unknown>)\n : undefined;\n\n return typeof telemetry?.metadata === \"object\" && telemetry.metadata !== null\n ? (telemetry.metadata as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * Reads agent/conversation semantic context from the AI SDK's own\n * `experimental_telemetry` fields. The AI SDK maps `functionId` to\n * `gen_ai.agent.name`; explicit `metadata.agentName` / `gen_ai.agent.name`\n * takes priority. Other semantic fields come only from metadata.\n */\nfunction semanticContext(params: AISDKV6CallParams): SemanticContext {\n const telemetry =\n typeof params.experimental_telemetry === \"object\" &&\n params.experimental_telemetry !== null\n ? (params.experimental_telemetry as Record<string, unknown>)\n : undefined;\n const metadata =\n typeof telemetry?.metadata === \"object\" && telemetry.metadata !== null\n ? (telemetry.metadata as Record<string, unknown>)\n : undefined;\n\n return {\n agentId: metadataValue(metadata, \"agentId\", \"gen_ai.agent.id\"),\n agentName:\n metadataValue(metadata, \"agentName\", \"gen_ai.agent.name\") ??\n readString(telemetry?.functionId),\n agentVersion: metadataValue(\n metadata,\n \"agentVersion\",\n \"gen_ai.agent.version\"\n ),\n conversationId: metadataValue(\n metadata,\n \"conversationId\",\n \"gen_ai.conversation.id\"\n )\n };\n}\n\nfunction metadataValue(\n metadata: Record<string, unknown> | undefined,\n key: string,\n semanticKey: string\n): string | undefined {\n return readString(metadata?.[key] ?? metadata?.[semanticKey]);\n}\n\nfunction contextAttributes(\n params: AISDKV6CallParams,\n options: AISDKInstrumentationOptions | undefined\n): Record<string, string | number | boolean> | undefined {\n const attributes: Record<string, string | number | boolean> = {};\n\n const runtimeContext =\n typeof params.experimental_context === \"object\" &&\n params.experimental_context !== null\n ? // SAFETY: AI SDK experimental_context is a user-provided record of scalar values.\n (params.experimental_context as Record<string, unknown>)\n : undefined;\n\n for (const key of options?.includeRuntimeContext ?? []) {\n const value = runtimeContext?.[key];\n if (isScalarAttributeValue(value)) {\n attributes[`cloudflare.agents.runtime_context.${key}`] = value;\n }\n }\n\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n}\n\nfunction isScalarAttributeValue(\n value: unknown\n): value is string | number | boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n","import { TraceAttribute } from \"../../genai/attributes\";\nimport { finishAttributes } from \"../../genai/telemetry\";\nimport type {\n RequestSummary,\n ResponseSummary,\n SemanticContext,\n TokenUsageSummary\n} from \"../../genai/telemetry\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport { extractAIGatewayLogId } from \"../ai-gateway\";\nimport {\n readNestedTokenField,\n readNumber,\n readString,\n readTokenCount\n} from \"../read\";\n\n/** Extracts the safe operation name from an AI SDK v7 operation id. */\nexport function operationNameFromId(operationId: unknown): string {\n const value = readString(operationId);\n if (value === undefined) {\n return \"ai-sdk\";\n }\n\n return value.startsWith(\"ai.\") ? value.slice(\"ai.\".length) : value;\n}\n\n/**\n * Extracts safe GenAI semantic context from an AI SDK v7 event. The AI SDK's\n * canonical OpenTelemetry projection maps `functionId` to agent name. v7 has\n * no telemetry metadata bag, so other identity fields come from the SDK-\n * filtered runtime context only when the caller explicitly includes them.\n */\nexport function semanticContextFromEvent(event: object): SemanticContext {\n const record = eventRecord(event);\n const runtimeContext =\n typeof record.runtimeContext === \"object\" && record.runtimeContext !== null\n ? (record.runtimeContext as Record<string, unknown>)\n : undefined;\n\n return {\n agentId: metadataValue(runtimeContext, \"agentId\", \"gen_ai.agent.id\"),\n agentName:\n metadataValue(runtimeContext, \"agentName\", \"gen_ai.agent.name\") ??\n readString(record.functionId),\n agentVersion: metadataValue(\n runtimeContext,\n \"agentVersion\",\n \"gen_ai.agent.version\"\n ),\n conversationId: metadataValue(\n runtimeContext,\n \"conversationId\",\n \"gen_ai.conversation.id\"\n )\n };\n}\n\n/** Extracts safe request settings from an AI SDK v7 event. */\nexport function requestSummaryFromEvent(\n event: object,\n operationName: string\n): RequestSummary {\n const record = eventRecord(event);\n return {\n frequencyPenalty: readNumber(record.frequencyPenalty),\n maxTokens: readNumber(record.maxOutputTokens ?? record.maxTokens),\n outputType:\n operationName === \"generateObject\" || operationName === \"streamObject\"\n ? \"json\"\n : \"text\",\n presencePenalty: readNumber(record.presencePenalty),\n seed: readNumber(record.seed),\n stream: operationName === \"streamText\" || operationName === \"streamObject\",\n temperature: readNumber(record.temperature),\n topK: readNumber(record.topK),\n topP: readNumber(record.topP)\n };\n}\n\n/** Extracts safe finish attributes from an AI SDK v7 result-like event. */\nexport function finishAttributesFromEvent(\n event: object,\n options: {\n readonly includeAIGatewayLog?: boolean;\n readonly includePerformance?: boolean;\n readonly includeResponse?: boolean;\n } = {}\n): TraceAttributes {\n const record = eventRecord(event);\n return finishAttributes({\n aiGatewayLogId: options.includeAIGatewayLog\n ? extractAIGatewayLogId(record)\n : undefined,\n finishReason: extractFinishReason(record),\n response: options.includeResponse\n ? responseSummaryFromEvent(record)\n : undefined,\n timeToFirstChunkSeconds: options.includePerformance\n ? timeToFirstChunkSeconds(record)\n : undefined,\n usage: tokenUsageFromEvent(record)\n });\n}\n\n/** Builds correlation attributes for AI SDK v7 callback ids. */\nexport function correlationAttributes(input: {\n readonly callId: string;\n readonly toolCallId?: string | undefined;\n}): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.CallID]: input.callId,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId\n };\n}\n\nfunction metadataValue(\n metadata: Record<string, unknown> | undefined,\n key: string,\n semanticKey: string\n): string | undefined {\n return readString(metadata?.[key] ?? metadata?.[semanticKey]);\n}\n\nfunction eventRecord(event: object): Record<string, unknown> {\n return event as Record<string, unknown>;\n}\n\nfunction extractFinishReason(\n event: Record<string, unknown>\n): string | undefined {\n const finishReason = event.finishReason;\n if (typeof finishReason === \"string\") {\n return finishReason;\n }\n\n if (typeof finishReason === \"object\" && finishReason !== null) {\n return readString((finishReason as Record<string, unknown>).unified);\n }\n\n return undefined;\n}\n\nfunction responseSummaryFromEvent(\n event: Record<string, unknown>\n): ResponseSummary | undefined {\n const response =\n typeof event.response === \"object\" && event.response !== null\n ? (event.response as Record<string, unknown>)\n : undefined;\n const id = readString(event.responseId ?? response?.id);\n // Never fall back to event.modelId: v7 carries the requested model there,\n // not the model that actually served the response.\n const model = readString(\n event.responseModel ?? response?.modelId ?? response?.model\n );\n\n if (id === undefined && model === undefined) {\n return undefined;\n }\n\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n}\n\nfunction tokenUsageFromEvent(\n event: Record<string, unknown>\n): TokenUsageSummary | undefined {\n const raw = event.totalUsage ?? event.usage;\n if (typeof raw !== \"object\" || raw === null) {\n return undefined;\n }\n\n const usage = raw as Record<string, unknown>;\n const inputTokens = readTokenCount(usage.inputTokens);\n const outputTokens = readTokenCount(usage.outputTokens);\n // Mirror the v6 extractor: public result shapes keep details in\n // inputTokenDetails/outputTokenDetails (with deprecated flat fields);\n // provider-level usage nests them on the token counts themselves.\n const cacheReadInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheReadTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheRead\") ??\n readNumber(usage.cachedInputTokens);\n const cacheCreationInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheWriteTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheWrite\");\n const reasoningTokens =\n readNestedTokenField(usage.outputTokenDetails, \"reasoningTokens\") ??\n readNestedTokenField(usage.outputTokens, \"reasoning\") ??\n readNumber(usage.reasoningTokens);\n\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n cacheReadInputTokens === undefined &&\n cacheCreationInputTokens === undefined &&\n reasoningTokens === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(cacheCreationInputTokens !== undefined\n ? { cacheCreationInputTokens }\n : {}),\n ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {})\n };\n}\n\nfunction timeToFirstChunkSeconds(\n event: Record<string, unknown>\n): number | undefined {\n const performance =\n typeof event.performance === \"object\" && event.performance !== null\n ? (event.performance as Record<string, unknown>)\n : undefined;\n const milliseconds = readNumber(performance?.timeToFirstOutputMs);\n return milliseconds === undefined ? undefined : milliseconds / 1000;\n}\n","import { extractAIGatewayLogId } from \"../ai-gateway\";\nimport {\n inputMessageAttributes,\n outputMessageAttributes,\n toolInputAttributes,\n toolOutputAttributes\n} from \"../content\";\nimport type { AISDKStorageOptions } from \"../options\";\nimport { readString } from \"../read\";\nimport {\n aiGatewayLogAttributes,\n modelCallSpan,\n operationSpan,\n toolCallSpan\n} from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\nimport {\n correlationAttributes,\n finishAttributesFromEvent,\n operationNameFromId,\n requestSummaryFromEvent,\n semanticContextFromEvent\n} from \"./extract\";\nimport type {\n AISDKV7ExecuteLanguageModelOptions,\n AISDKV7ExecuteToolOptions,\n AISDKV7OperationEvent,\n AISDKV7Telemetry\n} from \"./types\";\n\ntype AISDKV7OperationName =\n | \"generateObject\"\n | \"generateText\"\n | \"streamObject\"\n | \"streamText\";\n\ntype OperationState = {\n readonly callId: string;\n readonly operationName: AISDKV7OperationName;\n readonly span: AgentSpan;\n};\n\ntype ModelState = {\n readonly spanSpec: ReturnType<typeof modelCallSpan>;\n span?: AgentSpan | undefined;\n};\n\ntype ToolState = {\n readonly callId: string;\n readonly spanSpec: ReturnType<typeof toolCallSpan>;\n span?: AgentSpan | undefined;\n};\n\n/** Tracing configuration for the AI SDK v7 telemetry adapter. */\nexport type AISDKV7Instrumentation = {\n readonly options?: AISDKStorageOptions | undefined;\n readonly tracer: AgentTracer;\n};\n\n/**\n * Creates an AI SDK v7 `Telemetry` object that projects callback events into\n * Cloudflare-compatible GenAI spans without recording raw prompts or outputs.\n */\nexport function createAISDKV7Telemetry(\n instrumentation: AISDKV7Instrumentation\n): AISDKV7Telemetry {\n const storeMessages = instrumentation.options?.storeMessages === true;\n const storeTools = instrumentation.options?.storeTools === true;\n const operations = new Map<string, OperationState>();\n const modelSpans = new Map<string, ModelState[]>();\n // Keyed by `${callId}:${toolCallId}` — concurrent operations can reuse a\n // provider tool-call id, and a flat key would let one overwrite/finish the\n // other's span.\n const toolSpans = new Map<string, ToolState>();\n const toolSpanKey = (callId: string, toolCallId: string): string =>\n `${callId}:${toolCallId}`;\n\n const finishOperation = (event: AISDKV7OperationEvent): void => {\n const state = operations.get(event.callId);\n if (!state) {\n return;\n }\n\n finishOpenModelSpans(\n event.callId,\n undefined,\n modelSpans,\n instrumentation.tracer\n );\n finishOpenToolSpans(\n event.callId,\n undefined,\n toolSpans,\n instrumentation.tracer\n );\n state.span.finish(finishAttributesFromEvent(event));\n operations.delete(event.callId);\n };\n\n return {\n onStart(event) {\n const operationName = supportedOperationName(\n operationNameFromId(event.operationId)\n );\n if (!operationName) {\n return;\n }\n\n const span = operationSpan({\n attributes: {\n ...correlationAttributes({ callId: event.callId }),\n ...runtimeContextAttributes(event.runtimeContext)\n },\n context: semanticContextFromEvent(event),\n integration: \"ai-sdk\",\n model: readString(event.modelId),\n operation: operationName,\n provider: readString(event.provider),\n request: requestSummaryFromEvent(event, operationName)\n });\n const operation = instrumentation.tracer.openSpan(\n span.name,\n span.attributes,\n (activeSpan) => activeSpan\n );\n operations.set(event.callId, {\n callId: event.callId,\n operationName,\n span: operation\n });\n },\n\n onLanguageModelCallStart(event) {\n const state = operations.get(event.callId);\n if (!state) {\n return;\n }\n\n const span = modelCallSpan({\n attributes: {\n ...correlationAttributes({ callId: event.callId }),\n ...inputMessageAttributes(event, storeMessages)\n },\n integration: \"ai-sdk\",\n model: readString(event.modelId),\n operation: isStreamOperation(state.operationName)\n ? \"doStream\"\n : \"doGenerate\",\n provider: readString(event.provider),\n request: requestSummaryFromEvent(event, state.operationName)\n });\n const spans = modelSpans.get(event.callId) ?? [];\n spans.push({ spanSpec: span });\n modelSpans.set(event.callId, spans);\n },\n\n onLanguageModelCallEnd(event) {\n const state = shiftModelSpan(modelSpans, event.callId);\n if (!state) {\n return;\n }\n\n const span =\n state.span ??\n instrumentation.tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (activeSpan) => activeSpan\n );\n span.finish({\n ...finishAttributesFromEvent(event, {\n includeAIGatewayLog: true,\n includePerformance: true,\n includeResponse: true\n }),\n ...outputMessageAttributes(event, storeMessages)\n });\n },\n\n onToolExecutionStart(event) {\n const toolCallId = readString(event.toolCall.toolCallId);\n if (toolCallId === undefined || !operations.has(event.callId)) {\n return;\n }\n\n const toolName = readString(event.toolCall.toolName) ?? \"tool\";\n const span = toolCallSpan({\n integration: \"ai-sdk\",\n operation: \"tool.execute\",\n toolName\n });\n toolSpans.set(toolSpanKey(event.callId, toolCallId), {\n callId: event.callId,\n spanSpec: {\n name: span.name,\n attributes: {\n ...span.attributes,\n ...correlationAttributes({ callId: event.callId, toolCallId }),\n ...toolInputAttributes(event.toolCall.input, storeTools),\n ...toolContextAttributes(toolName, event.toolContext)\n }\n }\n });\n },\n\n onToolExecutionEnd(event) {\n const toolCallId = readString(event.toolCall.toolCallId);\n if (toolCallId === undefined) {\n return;\n }\n\n const state = toolSpans.get(toolSpanKey(event.callId, toolCallId));\n if (!state) {\n return;\n }\n\n const span =\n state.span ??\n instrumentation.tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (activeSpan) => activeSpan\n );\n if (event.toolOutput?.type === \"tool-error\") {\n span.fail(event.toolOutput.error);\n } else {\n span.finish(toolOutputAttributes(event.toolOutput?.output, storeTools));\n }\n toolSpans.delete(toolSpanKey(event.callId, toolCallId));\n },\n\n onAbort(event) {\n const cause = { name: \"AbortError\" };\n finishOpenModelSpans(\n event.callId,\n cause,\n modelSpans,\n instrumentation.tracer\n );\n finishOpenToolSpans(\n event.callId,\n cause,\n toolSpans,\n instrumentation.tracer\n );\n\n const state = operations.get(event.callId);\n if (!state) {\n return;\n }\n\n state.span.fail(cause);\n operations.delete(event.callId);\n },\n\n onEnd: finishOperation,\n\n onError(event) {\n const errorEvent = eventObject(event);\n const callId = readString(errorEvent.callId);\n if (callId === undefined) {\n return;\n }\n\n const cause = errorEvent.error ?? event;\n finishOpenModelSpans(callId, cause, modelSpans, instrumentation.tracer);\n finishOpenToolSpans(callId, cause, toolSpans, instrumentation.tracer);\n\n const state = operations.get(callId);\n if (!state) {\n return;\n }\n\n state.span.fail(cause);\n operations.delete(callId);\n },\n\n executeLanguageModelCall<T>(\n options: AISDKV7ExecuteLanguageModelOptions<T>\n ): PromiseLike<T> {\n const states = modelSpans.get(options.callId);\n const state = states?.find((candidate) => candidate.span === undefined);\n if (!state) {\n return options.execute();\n }\n\n return instrumentation.tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (span) => {\n state.span = span;\n try {\n return Promise.resolve(options.execute()).catch(\n (cause: unknown) => {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(extractAIGatewayLogId(cause))\n );\n span.fail(cause);\n removeModelState(modelSpans, options.callId, state);\n throw cause;\n }\n );\n } catch (cause: unknown) {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(extractAIGatewayLogId(cause))\n );\n span.fail(cause);\n removeModelState(modelSpans, options.callId, state);\n throw cause;\n }\n }\n );\n },\n\n executeTool<T>(options: AISDKV7ExecuteToolOptions<T>): PromiseLike<T> {\n const state = toolSpans.get(\n toolSpanKey(options.callId, options.toolCallId)\n );\n if (!state) {\n return options.execute();\n }\n\n return instrumentation.tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (span) => {\n state.span = span;\n try {\n return Promise.resolve(options.execute()).catch(\n (cause: unknown) => {\n span.fail(cause);\n toolSpans.delete(\n toolSpanKey(options.callId, options.toolCallId)\n );\n throw cause;\n }\n );\n } catch (cause: unknown) {\n span.fail(cause);\n toolSpans.delete(toolSpanKey(options.callId, options.toolCallId));\n throw cause;\n }\n }\n );\n }\n };\n}\n\nfunction supportedOperationName(\n operationName: string\n): AISDKV7OperationName | undefined {\n if (\n operationName === \"generateObject\" ||\n operationName === \"generateText\" ||\n operationName === \"streamObject\" ||\n operationName === \"streamText\"\n ) {\n return operationName;\n }\n\n return undefined;\n}\n\nfunction isStreamOperation(operationName: AISDKV7OperationName): boolean {\n return operationName === \"streamObject\" || operationName === \"streamText\";\n}\n\nfunction shiftModelSpan(\n spansByCallId: Map<string, ModelState[]>,\n callId: string\n): ModelState | undefined {\n const spans = spansByCallId.get(callId);\n const span = spans?.shift();\n if (spans && spans.length === 0) {\n spansByCallId.delete(callId);\n }\n\n return span;\n}\n\nfunction removeModelState(\n statesByCallId: Map<string, ModelState[]>,\n callId: string,\n state: ModelState\n): void {\n const states = statesByCallId.get(callId);\n if (!states) {\n return;\n }\n const index = states.indexOf(state);\n if (index !== -1) {\n states.splice(index, 1);\n }\n if (states.length === 0) {\n statesByCallId.delete(callId);\n }\n}\n\nfunction finishOpenModelSpans(\n callId: string,\n cause: unknown,\n spansByCallId: Map<string, ModelState[]>,\n tracer: AgentTracer\n): void {\n const states = spansByCallId.get(callId);\n if (!states) {\n return;\n }\n\n for (const state of states) {\n const span =\n state.span ??\n tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (activeSpan) => activeSpan\n );\n if (cause === undefined) {\n span.finish();\n } else {\n span.fail(cause);\n }\n }\n spansByCallId.delete(callId);\n}\n\nfunction finishOpenToolSpans(\n callId: string,\n cause: unknown,\n spansByToolCallId: Map<string, ToolState>,\n tracer: AgentTracer\n): void {\n for (const [toolCallId, state] of spansByToolCallId) {\n if (state.callId !== callId) {\n continue;\n }\n\n const span =\n state.span ??\n tracer.openSpan(\n state.spanSpec.name,\n state.spanSpec.attributes,\n (activeSpan) => activeSpan\n );\n if (cause === undefined) {\n span.finish();\n } else {\n span.fail(cause);\n }\n spansByToolCallId.delete(toolCallId);\n }\n}\n\nfunction eventObject(event: unknown): Record<string, unknown> {\n return typeof event === \"object\" && event !== null\n ? (event as Record<string, unknown>)\n : {};\n}\n\nconst SEMANTIC_CONTEXT_KEYS = new Set([\n \"agentId\",\n \"agentName\",\n \"agentVersion\",\n \"conversationId\",\n \"gen_ai.agent.id\",\n \"gen_ai.agent.name\",\n \"gen_ai.agent.version\",\n \"gen_ai.conversation.id\"\n]);\n\nfunction runtimeContextAttributes(\n runtimeContextValue: unknown\n): TraceAttributes {\n const attributes: Record<string, string | number | boolean> = {};\n const runtimeContext = recordValue(runtimeContextValue);\n for (const [key, value] of Object.entries(runtimeContext ?? {})) {\n if (!SEMANTIC_CONTEXT_KEYS.has(key) && isScalarAttributeValue(value)) {\n attributes[\n key.startsWith(\"cloudflare.agents.\")\n ? key\n : `cloudflare.agents.runtime_context.${key}`\n ] = value;\n }\n }\n\n return attributes;\n}\n\nfunction toolContextAttributes(\n toolName: string,\n toolContextValue: unknown\n): TraceAttributes {\n const attributes: Record<string, string | number | boolean> = {};\n const toolContext = recordValue(toolContextValue);\n for (const [key, value] of Object.entries(toolContext ?? {})) {\n if (isScalarAttributeValue(value)) {\n attributes[`cloudflare.agents.tool_context.${toolName}.${key}`] = value;\n }\n }\n\n return attributes;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction isScalarAttributeValue(\n value: unknown\n): value is string | number | boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n","import type {\n AISDKInstrumentationOptions,\n AISDKStorageOptions\n} from \"./options\";\nimport { createAISDKV6Wrapper } from \"./v6/wrap\";\nimport { createAISDKV7Telemetry } from \"./v7/telemetry\";\nimport type { AISDKV7Telemetry } from \"./v7/types\";\nimport { tracer } from \"../tracing/cloudflare\";\n\nconst agentsAISDKTelemetryBrand = Symbol.for(\n \"cloudflare.agents.ai-sdk-telemetry\"\n);\n\n/**\n * Wraps an AI SDK namespace with tracing.\n */\nexport function wrapAISDK<T extends Record<string, unknown>>(\n ai: T,\n options: AISDKInstrumentationOptions = {}\n): T {\n return createAISDKV6Wrapper(ai, {\n options,\n tracer\n });\n}\n\n/**\n * Creates an AI SDK v7 telemetry adapter for use with `registerTelemetry` or\n * per-call telemetry configuration.\n */\nexport function createAISDKTelemetry(\n options: AISDKStorageOptions = {}\n): AISDKV7Telemetry {\n const telemetry = createAISDKV7Telemetry({ options, tracer });\n Object.defineProperty(telemetry, agentsAISDKTelemetryBrand, { value: true });\n return telemetry;\n}\n\nexport type {\n AISDKInstrumentationOptions,\n AISDKStorageOptions\n} from \"./options\";\n"],"mappings":";;;;AACA,SAAgB,WAAW,OAAoC;CAC7D,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;;AAGA,SAAgB,WAAW,OAAoC;CAC7D,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;;AAGA,SAAgB,eAAe,OAAoC;CACjE,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAE/C,MAAM,QAAS,MAAkC;EACjD,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;CAC7C;AAGF;;AAGA,SAAgB,qBACd,OACA,KACoB;CACpB,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAIF,MAAM,SAAU,MAAkC;CAClD,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;AAC/C;;;;;;;;;;;;AC5BA,MAAa,iBAAiB;CAC5B,YAAY;EACV,gBAAgB;EAChB,QAAQ;EACR,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;EACf,sBAAsB;EACtB,mBAAmB;EACnB,WAAW;EACX,eAAe;EACf,aAAa;EACb,kBAAkB;EAClB,gBAAgB;EAChB,eAAe;EACf,aAAa;EACb,kBAAkB;CACpB;CACA,SAAS,EACP,QAAQ,UACV;CACA,OAAO;EACL,SAAS;EACT,WAAW;EACX,cAAc;EACd,gBAAgB;EAChB,eAAe;EACf,eAAe;EACf,wBAAwB;EACxB,+BAA+B;EAC/B,+BAA+B;EAC/B,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,yBAAyB;EACzB,kBAAkB;EAClB,cAAc;EACd,wBAAwB;EACxB,aAAa;EACb,eAAe;EACf,oBAAoB;EACpB,aAAa;EACb,aAAa;EACb,YAAY;EACZ,eAAe;EACf,0BAA0B;EAC1B,mBAAmB;EACnB,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,UAAU;EACV,+BAA+B;EAC/B,2BAA2B;EAC3B,kBAAkB;EAClB,mBAAmB;EACnB,4BAA4B;CAC9B;AACF;;;;;;;;;;ACVA,SAAS,SAAS,WAAmB,QAAoC;CACvE,IAAI,CAAC,QACH,OAAO;CAGT,MAAM,OAAO,GAAG,UAAU,GAAG;CAC7B,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO;AAC9D;;;;;;;AAQA,SAAS,sBACP,UACoB;CACpB,IAAI,aAAa,KAAA,GACf;CAGF,MAAM,QAAQ,SAAS,YAAY;CAoBnC,KAAK,MAAM,CAAC,QAAQ,UAAU;EAlB5B,CAAC,iBAAiB,eAAe;EACjC,CAAC,wBAAwB,YAAY;EACrC,CAAC,iBAAiB,eAAe;EACjC,CAAC,kBAAkB,aAAa;EAChC,CAAC,gBAAgB,iBAAiB;EAClC,CAAC,aAAa,WAAW;EACzB,CAAC,UAAU,QAAQ;EACnB,CAAC,SAAS,oBAAoB;EAC9B,CAAC,UAAU,YAAY;EACvB,CAAC,WAAW,YAAY;EACxB,CAAC,UAAU,QAAQ;EACnB,CAAC,WAAW,aAAa;EACzB,CAAC,QAAQ,MAAM;EACf,CAAC,YAAY,UAAU;EACvB,CAAC,cAAc,YAAY;EAC3B,CAAC,OAAO,MAAM;CAGqB,GACnC,IACE,UAAU,UACV,MAAM,WAAW,GAAG,OAAO,EAAE,KAC7B,MAAM,WAAW,GAAG,OAAO,EAAE,GAE7B,OAAO;CAIX,OAAO;AACT;;;;;;;AAQA,MAAM,+BAAiE;EACpE,eAAe,WAAW,gBACzB,eAAe,WAAW;EAC3B,eAAe,WAAW,cACzB,eAAe,WAAW;EAC3B,eAAe,WAAW,mBACzB,eAAe,WAAW;EAC3B,eAAe,WAAW,iBACzB,eAAe,WAAW;EAC3B,eAAe,WAAW,gBACzB,eAAe,WAAW;EAC3B,eAAe,WAAW,cACzB,eAAe,WAAW;EAC3B,eAAe,QAAQ,SAAS,eAAe,QAAQ;AAC1D;AAEA,MAAM,yCAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;AAQD,SAAgB,mBACd,UACiB;CACjB,IAAI,aAAa,KAAA,GACf,OAAO,CAAC;CAGV,MAAM,aAAwD,CAAC;CAC/D,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAAG;EACnD,IAAI,uBAAuB,IAAI,GAAG,GAChC;EAEF,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WAEjB;EAGF,MAAM,WAAW,OAAO,OAAO,8BAA8B,GAAG,IAC5D,6BAA6B,OAC7B,KAAA;EACJ,WACE,YAAY,GAAG,eAAe,WAAW,iBAAiB,SACxD;CACN;CAEA,OAAO;AACT;;;;;;AAOA,SAAgB,kBAAkB,WAAuC;CACvE,OAAO,SACL,eAAe,MAAM,+BACrB,SACF;AACF;;AAGA,SAAgB,cAAc,OAQjB;CACX,OAAO;EACL,YAAY;GACV,GAAG,MAAM;IACR,eAAe,WAAW,kBAAkB,MAAM;IAClD,eAAe,WAAW,gBAAgB,MAAM;IAChD,eAAe,MAAM,UAAU,MAAM,SAAS;IAC9C,eAAe,MAAM,YAAY,MAAM,SAAS;IAChD,eAAe,MAAM,eAAe,MAAM,SAAS;IACnD,eAAe,MAAM,iBAAiB,MAAM,SAAS;IACrD,eAAe,MAAM,gBACpB,eAAe,MAAM;IACtB,eAAe,MAAM,eAAe,sBACnC,MAAM,QACR;GACA,GAAG,kBAAkB,MAAM,SAAS,MAAM,KAAK;EACjD;EACA,MAAM,SACJ,eAAe,MAAM,+BACrB,MAAM,SAAS,SACjB;CACF;AACF;;AAGA,SAAgB,cAAc,OAOjB;CACX,OAAO;EACL,YAAY;GACV,GAAG,MAAM;IACR,eAAe,WAAW,kBAAkB,MAAM;IAClD,eAAe,WAAW,gBAAgB,MAAM;IAChD,eAAe,MAAM,gBACpB,eAAe,MAAM;IACtB,eAAe,MAAM,eAAe,sBACnC,MAAM,QACR;GACA,GAAG,kBAAkB,MAAM,SAAS,MAAM,KAAK;EACjD;EACA,MAAM,SAAS,eAAe,MAAM,wBAAwB,MAAM,KAAK;CACzE;AACF;AAEA,SAAS,kBACP,SACA,OACiB;CACjB,OAAO;GACJ,eAAe,MAAM,aAAa,SAAS;GAC3C,eAAe,MAAM,0BAA0B,SAAS;GACxD,eAAe,MAAM,mBAAmB,SAAS;GACjD,eAAe,MAAM,eAAe;GACpC,eAAe,MAAM,yBAAyB,SAAS;GACvD,eAAe,MAAM,cAAc,SAAS;GAE5C,eAAe,MAAM,gBACpB,SAAS,WAAW,OAAO,OAAO,KAAA;GACnC,eAAe,MAAM,qBAAqB,SAAS;GACnD,eAAe,MAAM,cAAc,SAAS;GAC5C,eAAe,MAAM,cAAc,SAAS;CAC/C;AACF;;AAGA,SAAgB,aAAa,OAKhB;CACX,OAAO;EACL,YAAY;IACT,eAAe,WAAW,kBAAkB,MAAM;IAClD,eAAe,WAAW,gBAAgB,MAAM;IAChD,eAAe,MAAM,gBACpB,eAAe,MAAM;IACtB,eAAe,MAAM,aAAa,MAAM;IACxC,eAAe,MAAM,WAAW,MAAM;IACtC,eAAe,MAAM,WAAW;EACnC;EACA,MAAM,SACJ,eAAe,MAAM,+BACrB,MAAM,QACR;CACF;AACF;;AAGA,SAAgB,iBAAiB,OAIpB;CACX,OAAO;EACL,YAAY;IACT,eAAe,WAAW,kBAAkB;IAC5C,eAAe,WAAW,gBAAgB;IAC1C,eAAe,WAAW,oBAAoB,MAAM;IACpD,eAAe,MAAM,gBACpB,eAAe,MAAM;IACtB,eAAe,MAAM,aAAa,MAAM;IACxC,eAAe,MAAM,WAAW,MAAM;IACtC,eAAe,MAAM,WAAW;EACnC;EACA,MAAM,SAAS,iBAAiB,MAAM,QAAQ;CAChD;AACF;;AAGA,SAAgB,iBAAiB,OAOb;CAClB,OAAO;GACJ,eAAe,WAAW,iBAAiB,MAAM;GACjD,eAAe,WAAW,uBAAuB,MAAM;GACvD,eAAe,WAAW,YAAY,MAAM;GAC5C,eAAe,WAAW,mBAAmB,YAAY,MAAM,KAAK;GACpE,eAAe,MAAM,aAAa,MAAM,UAAU;GAClD,eAAe,MAAM,gBAAgB,MAAM,UAAU;GACrD,eAAe,MAAM,2BACpB,MAAM;GACP,eAAe,MAAM,gCACpB,MAAM,OAAO;GACd,eAAe,MAAM,4BACpB,MAAM,OAAO;GACd,eAAe,MAAM,mBAAmB,MAAM,OAAO;GACrD,eAAe,MAAM,oBAAoB,MAAM,OAAO;GACtD,eAAe,MAAM,6BACpB,MAAM,OAAO;CACjB;AACF;;AAGA,SAAgB,uBACd,gBACiB;CACjB,OAAO,GACJ,eAAe,WAAW,iBAAiB,eAC9C;AACF;AAEA,SAAS,YAAY,OAA0D;CAC7E,IAAI,OAAO,gBAAgB,KAAA,GACzB,OAAO,MAAM;CAEf,OAAO,OAAO,gBAAgB,KAAA,KAAa,MAAM,iBAAiB,KAAA,IAC9D,MAAM,cAAc,MAAM,eAC1B,KAAA;AACN;;;ACrVA,SAAgB,2BACd,QACA,UAGI,CAAC,GACY;CACjB,OAAO,iBAAiB;EACtB,gBAAgB,QAAQ;EACxB,cAAcA,sBAAoB,MAAM;EACxC,UAAU,QAAQ,kBAAkB,oBAAoB,MAAM,IAAI,KAAA;EAClE,eAAe,qBAAqB,MAAM;EAC1C,OAAO,yBAAyB,MAAM;CACxC,CAAC;AACH;AAEA,SAAgB,sBACd,QACA,WACgB;CAChB,OAAO;EACL,kBAAkB,WAAW,OAAO,gBAAgB;EACpD,WAAW,WAAW,OAAO,mBAAmB,OAAO,SAAS;EAChE,YACE,cAAc,oBAAoB,cAAc,iBAC5C,SACA;EACN,iBAAiB,WAAW,OAAO,eAAe;EAClD,MAAM,WAAW,OAAO,IAAI;EAC5B,QAAQ,cAAc,gBAAgB,cAAc;EACpD,aAAa,WAAW,OAAO,WAAW;EAC1C,MAAM,WAAW,OAAO,IAAI;EAC5B,MAAM,WAAW,OAAO,IAAI;CAC9B;AACF;;AAGA,SAAgB,iBAAiB,OAAuC;CAEtE,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,SAAS,IAClB;EAAE,SAAS;EAAO,UAAU,KAAA;CAAU,IACtC,KAAA;CAGN,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAIF,MAAM,SAAS;CACf,MAAM,UACJ,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;CACxD,MAAM,WACJ,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW,KAAA;CAE1D,IAAI,YAAY,KAAA,KAAa,aAAa,KAAA,GACxC;CAGF,OAAO;EAAE;EAAS;CAAS;AAC7B;;;;;;;;AASA,SAAgB,yBACd,OAC+B;CAC/B,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAIF,MAAM,SAAS;CAGf,MAAM,MAAM,OAAO,cAAc,OAAO;CACxC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC;CAIF,MAAM,QAAQ;CAEd,MAAM,cAAc,eAAe,MAAM,WAAW;CACpD,MAAM,eAAe,eAAe,MAAM,YAAY;CACtD,MAAM,cAAc,WAAW,MAAM,WAAW;CAIhD,MAAM,uBACJ,qBAAqB,MAAM,mBAAmB,iBAAiB,KAC/D,qBAAqB,MAAM,aAAa,WAAW,KACnD,WAAW,MAAM,iBAAiB;CACpC,MAAM,2BACJ,qBAAqB,MAAM,mBAAmB,kBAAkB,KAChE,qBAAqB,MAAM,aAAa,YAAY;CACtD,MAAM,kBACJ,qBAAqB,MAAM,oBAAoB,iBAAiB,KAChE,qBAAqB,MAAM,cAAc,WAAW,KACpD,WAAW,MAAM,eAAe;CAElC,IACE,gBAAgB,KAAA,KAChB,iBAAiB,KAAA,KACjB,gBAAgB,KAAA,KAChB,yBAAyB,KAAA,KACzB,6BAA6B,KAAA,KAC7B,oBAAoB,KAAA,GAEpB;CAGF,OAAO;EACL,GAAI,6BAA6B,KAAA,IAC7B,EAAE,yBAAyB,IAC3B,CAAC;EACL,GAAI,yBAAyB,KAAA,IAAY,EAAE,qBAAqB,IAAI,CAAC;EACrE,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACnD,GAAI,iBAAiB,KAAA,IAAY,EAAE,aAAa,IAAI,CAAC;EACrD,GAAI,oBAAoB,KAAA,IAAY,EAAE,gBAAgB,IAAI,CAAC;EAC3D,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;CACrD;AACF;AAEA,SAAS,qBAAqB,OAAoC;CAChE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAEF,MAAM,YAAa,MAAkC;CACrD,OAAO,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS,IAClD,UAAU,SACV,KAAA;AACN;;;;AAKA,SAAgBA,sBAAoB,OAAoC;CACtE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAKF,MAAM,eAAeC,MAAO;CAE5B,IAAI,OAAO,iBAAiB,UAC1B,OAAO;CAIT,IAAI,OAAO,iBAAiB,YAAY,iBAAiB,MAAM;EAE7D,MAAM,UAAW,aAAyC;EAC1D,OAAO,OAAO,YAAY,WAAW,UAAU,KAAA;CACjD;AAGF;AAEA,SAAgB,oBACd,OAC6B;CAC7B,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAIF,MAAM,SAAS;CAIf,IAAI,OAAO,SAAS,qBAAqB;EACvC,MAAM,KAAK,WAAW,OAAO,EAAE;EAC/B,MAAM,QAAQ,WAAW,OAAO,OAAO;EACvC,IAAI,OAAO,KAAA,KAAa,UAAU,KAAA,GAChC;EAEF,OAAO;GACL,GAAI,OAAO,KAAA,IAAY,EAAE,GAAG,IAAI,CAAC;GACjC,GAAI,UAAU,KAAA,IAAY,EAAE,MAAM,IAAI,CAAC;EACzC;CACF;CAEA,MAAM,WACJ,OAAO,OAAO,aAAa,YAAY,OAAO,aAAa,OACtD,OAAO,WACR,KAAA;CACN,MAAM,KAAK,WAAW,OAAO,cAAc,UAAU,EAAE;CACvD,MAAM,QAAQ,WACZ,OAAO,iBAAiB,UAAU,WAAW,UAAU,KACzD;CAEA,IAAI,OAAO,KAAA,KAAa,UAAU,KAAA,GAChC;CAGF,OAAO;EACL,GAAI,OAAO,KAAA,IAAY,EAAE,GAAG,IAAI,CAAC;EACjC,GAAI,UAAU,KAAA,IAAY,EAAE,MAAM,IAAI,CAAC;CACzC;AACF;;;ACnOA,MAAM,8BAA8B;AACpC,MAAM,4CAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;AASD,SAAgB,sBAAsB,OAAoC;CACxE,MAAM,uBAAO,IAAI,IAAY;CAC7B,IAAI,UAAU;CAEd,MAAM,SACJ,WACA,OACA,eACA,kBACA,mBACuB;EACvB,IACE,cAAc,QACd,cAAc,KAAA,KACd,QAAQ,KACP,OAAO,cAAc,YAAY,OAAO,cAAc,cACvD,KAAK,IAAI,SAAS,KAClB,WAAW,KAEX;EAEF,KAAK,IAAI,SAAS;EAClB,WAAW;EAEX,IAAI,OAAO,aAAa,eAAe,qBAAqB,UAC1D,OAAO,gBAAgB,UAAU,OAAO;EAG1C,IAAI;EACJ,IAAI;GACF,cAAc,OAAO,0BAA0B,SAAS;EAC1D,QAAQ;GACN;EACF;EAEA,MAAM,aAAa,WAAW,YAAY,IAAI;EAC9C,MAAM,aACJ,iBACC,eAAe,KAAA,KAAa,aAAa,aAAa,UAAU,CAAC;EAEpE,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,WAAW,GAAG;GAC3D,IAAI,EAAE,WAAW,aACf;GAGF,MAAM,gBAAgB,aAAa,GAAG;GACtC,IACE,kBAAkB,gBAClB,kBAAkB,kBAClB;IACA,MAAM,QAAQ,sBAAsB,WAAW,KAAK;IACpD,IAAI,UAAU,KAAA,GACZ,OAAO;GAEX;GAEA,IACE,kBAAkB,qBACjB,kBAAkB,aAAa,gBAChC;IACA,MAAM,QAAQ,gBAAgB,WAAW,KAAK;IAC9C,IAAI,UAAU,KAAA,GACZ,OAAO;GAEX;GAEA,IAAI,kBAAkB,WAAW,YAAY;IAC3C,MAAM,QAAQ,sBAAsB,WAAW,KAAK;IACpD,IAAI,UAAU,KAAA,GACZ,OAAO;GAEX;EACF;EAEA,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,WAAW,GAAG;GAC3D,IAAI,EAAE,WAAW,aACf;GAEF,MAAM,gBAAgB,aAAa,GAAG;GACtC,IAAI,CAAC,oBAAoB,CAAC,0BAA0B,IAAI,aAAa,GACnE;GAGF,MAAM,SAAS,MACb,WAAW,OACX,QAAQ,GACR,cAAc,aAAa,aAAa,GACxC,oBAAoB,kBAAkB,oBACtC,kBAAkB,cAAc,kBAAkB,aACpD;GACA,IAAI,WAAW,KAAA,GACb,OAAO;EAEX;CAGF;CAEA,OAAO,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK;AAC5C;;;;;;;AAeA,SAAgB,6BACd,OACA,UACqB;CACrB,IAAI;CACJ,MAAM,UAAU;EACd;EACA,WAAW;EACX,aAAa;GACX,QAAQ,KAAA;EACV;CACF;CAEA,IAAI,CAAC,UAAU,YAAY,CAAC,CAAC,WAAW,WAAW,GACjD,OAAO;CAGT,IAAI;EACF,MAAM,mBAAmB,OAAO,0BAA0B,KAAK;EAC/D,MAAM,mBAAmB,iBAAiB;EAC1C,IAAI,CAAC,oBAAoB,EAAE,WAAW,mBACpC,OAAO;EAGT,MAAM,SAAS,iBAAiB;EAChC,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;EAET,MAAM,oBAAoB,OAAO,0BAA0B,MAAM;EACjE,MAAM,oBAAoB,kBAAkB;EAC5C,IAAI,CAAC,qBAAqB,EAAE,WAAW,oBACrC,OAAO;EAGT,MAAM,UAAU,kBAAkB;EAClC,IACE,OAAO,YAAY,YACnB,YAAY,QACZ,EAAE,oBAAoB,YACtB,OAAQ,QAA8B,QAAQ,YAE9C,OAAO;EAGT,MAAM,eAAe,IAAI,MAAM,SAAS,EACtC,IAAI,QAAQ,UAAU,UAAU;GAC9B,IAAI,aAAa,OACf,OAAO,QAAQ,IAAI,QAAQ,UAAU,QAAQ;GAG/C,QAAQ,GAAG,SAA6B;IACtC,MAAM,MAAM,QAAQ,IAAI,QAAQ,UAAU,MAAM;IAGhD,MAAM,gBAAgB,sBAAsB,MAAM;IAClD,QAAQ,KAAA;IACR,MAAM,iBAAiB,WAA0B;KAC/C,MAAM,cAAc,sBAAsB,MAAM;KAChD,MAAM,eAAe,sBAAsB,MAAM;KACjD,QACE,gBACC,iBAAiB,gBAAgB,eAAe,KAAA;IACrD;IACA,IAAI;KACF,OAAO,QAAQ,QAAQ,QAAQ,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MACtD,WAAW;MACV,cAAc,MAAM;MACpB,OAAO;KACT,IACC,UAAmB;MAClB,cAAc,KAAK;MACnB,MAAM;KACR,CACF;IACF,SAAS,OAAgB;KACvB,cAAc,KAAK;KACnB,MAAM;IACR;GACF;EACF,EACF,CAAC;EAED,MAAM,cAAc,OAAO,OAAO,OAAO,eAAe,MAAM,GAAG;GAC/D,GAAG;GACH,SAAS;IAAE,GAAG;IAAmB,OAAO;GAAa;EACvD,CAAC;EACD,QAAQ,QAAQ,OAAO,OAAO,OAAO,eAAe,KAAK,GAAG;GAC1D,GAAG;GACH,QAAQ;IAAE,GAAG;IAAkB,OAAO;GAAY;EACpD,CAAC;CACH,QAAQ,CAGR;CAEA,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAoC;CAC3D,IAAI,cAAc,KAAK,GACrB,IAAI;EACF,OAAO,sBAAsB,MAAM,IAAI,eAAe,CAAC;CACzD,QAAQ;EACN;CACF;CAEF,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAGF,IAAI;CACJ,IAAI;EACF,cAAc,OAAO,0BAA0B,KAAK;CACtD,QAAQ;EACN;CACF;CACA,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,WAAW,GACxD,IAAI,WAAW,cAAc,IAAI,YAAY,MAAM,iBACjD,OAAO,sBAAsB,WAAW,KAAK;AAInD;AAEA,SAAS,cACP,OAC+C;CAC/C,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAET,IAAI;EACF,OAAO,SAAS,SAAS,OAAO,MAAM,QAAQ;CAChD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,aAAa,OAAwB;CAC5C,OACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,WAAW,KAC1B,UAAU;AAEd;AAEA,SAAS,aAAa,OAAuB;CAC3C,OAAO,MAAM,YAAY,CAAC,CAAC,WAAW,UAAU,EAAE;AACpD;AAEA,SAAS,WACP,YACoB;CACpB,OAAO,cAAc,WAAW,aAC5B,eAAe,WAAW,KAAK,IAC/B,KAAA;AACN;AAEA,SAAS,eAAe,OAAoC;CAC1D,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ,KAAA;AACjE;AAEA,SAAS,sBAAsB,OAAoC;CACjE,MAAM,KAAK,eAAe,KAAK;CAC/B,OAAO,OAAO,KAAA,KACZ,IAAI,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,8BACrC,KACA,KAAA;AACN;;;AC7SA,MAAM,sBAAsB,KAAK;AACjC,MAAM,0BAA0B;AAYhC,SAAgB,uBACd,OACA,SACiB;CACjB,IAAI,CAAC,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,CAAC;CACrE,MAAM,SAAS;CACf,MAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,IACxC,OAAO,SACP,MAAM,QAAQ,OAAO,QAAQ,IAC3B,OAAO,WACP,OAAO,OAAO,WAAW,WACvB,CAAC;EAAE,MAAM;EAAQ,SAAS,OAAO;CAAO,CAAC,IACzC,KAAA;CACR,OAAO,GACJ,eAAe,MAAM,gBAAgB,kBACpC,aAAa,KAAA,IAAY,KAAA,IAAY,oBAAoB,QAAQ,CACnE,EACF;AACF;AAEA,SAAgB,wBACd,OACA,SACiB;CACjB,IAAI,CAAC,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,CAAC;CACrE,MAAM,SAAS;CACf,MAAM,QAAQ,YAAY,MAAM;CAChC,MAAM,eAAe,iBAAiB,MAAM;CAC5C,OAAO,4BACL,MAAM,SAAS,KAAK,iBAAiB,KAAA,IACjC,CAAC,cAAc,OAAO,YAAY,CAAC,IACnC,KAAA,CACN;AACF;AAEA,SAAgB,4BACd,UACiB;CACjB,OAAO,GACJ,eAAe,MAAM,iBAAiB,kBAAkB,QAAQ,EACnE;AACF;AAEA,SAAgB,oBACd,OACA,SACiB;CACjB,OAAO,UACH,GAAG,eAAe,MAAM,oBAAoB,UAAU,KAAK,EAAE,IAC7D,CAAC;AACP;AAEA,SAAgB,qBACd,OACA,SACiB;CACjB,OAAO,UACH,GAAG,eAAe,MAAM,iBAAiB,UAAU,KAAK,EAAE,IAC1D,CAAC;AACP;AAEA,SAAgB,uBAGd;CACA,IAAI,OAAO;CACX,IAAI,YAAY;CAChB,MAAM,YAAgC,CAAC;CAEvC,OAAO;EACL,SAAS,cAAc;GACrB,MAAM,QAAQ;IACZ,GAAI,YACA,CAAC;KAAE,MAAM;KAAa,SAAS;IAAU,CAAqB,IAC9D,CAAC;IACL,GAAI,OAAO,CAAC;KAAE,MAAM;KAAQ,SAAS;IAAK,CAAqB,IAAI,CAAC;IACpE,GAAG;GACL;GACA,OAAO,MAAM,SAAS,KAAK,iBAAiB,KAAA,IACxC,CAAC,cAAc,OAAO,YAAY,CAAC,IACnC,KAAA;EACN;EACA,QAAQ,OAAO;GACb,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;GACjD,MAAM,SAAS;GACf,MAAM,QAAQ,OAAO,QAAQ,OAAO;GACpC,IAAI,OAAO,SAAS,gBAAgB,OAAO,UAAU,UACnD,QAAQ;QACH,IACL,OAAO,SAAS,qBAChB,OAAO,UAAU,UAEjB,aAAa;QACR,IAAI,OAAO,SAAS,eAAe,OAAO,SAAS,eAAe;IACvE,MAAM,OAAO,kBAAkB,MAAM;IACrC,IAAI,SAAS,KAAA,GAAW,UAAU,KAAK,IAAI;GAC7C;EACF;CACF;AACF;AAEA,SAAS,oBACP,UACqB;CACrB,MAAM,YAAiC,CAAC;CACxC,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,OAAO,mBAAmB,OAAO;EACvC,IAAI,SAAS,KAAA,GAAW,UAAU,KAAK,IAAI;CAC7C;CACA,OAAO;AACT;AAEA,SAAS,mBAAmB,OAA+C;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,KAAA;CACxD,MAAM,SAAS;CACf,IAAI,OAAO,OAAO,SAAS,UAAU,OAAO,KAAA;CAS5C,MAAM,SAPW,MAAM,QAAQ,OAAO,KAAK,IACvC,OAAO,QACP,MAAM,QAAQ,OAAO,OAAO,IAC1B,OAAO,UACP,OAAO,OAAO,YAAY,WACxB,CAAC,OAAO,OAAO,IACf,CAAC,EAAA,CAEN,IAAI,iBAAiB,CAAC,CACtB,QAAQ,SAAmC,SAAS,KAAA,CAAS;CAChE,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,KAAA;CAE7D,OAAO;EACL,MAAM,OAAO;EACb;EACA,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;CACvC;AACF;AAEA,SAAS,YAAY,QAAqD;CACxE,IAAI,MAAM,QAAQ,OAAO,OAAO,GAC9B,OAAO,OAAO,QACX,IAAI,iBAAiB,CAAC,CACtB,QAAQ,SAAmC,SAAS,KAAA,CAAS;CAGlE,MAAM,QAA4B,CAAC;CACnC,qBAAqB,OAAO,OAAO,SAAS;CAC5C,IAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,GAC1D,MAAM,KAAK;EAAE,MAAM;EAAQ,SAAS,OAAO;CAAK,CAAC;CAEnD,IAAI,MAAM,QAAQ,OAAO,SAAS,GAChC,KAAK,MAAM,YAAY,OAAO,WAAW;EACvC,MAAM,OAAO,kBAAkB,QAAQ;EACvC,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,IAAI;CACzC;CAEF,OAAO;AACT;AAEA,SAAS,qBACP,OACA,WACM;CACN,IAAI,OAAO,cAAc,YAAY,UAAU,SAAS,GAAG;EACzD,MAAM,KAAK;GAAE,MAAM;GAAa,SAAS;EAAU,CAAC;EACpD;CACF;CACA,IAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;CAE/B,KAAK,MAAM,SAAS,WAAW;EAC7B,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EACjD,MAAM,OAAQ,MAAkC;EAChD,IAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAC5C,MAAM,KAAK;GAAE,MAAM;GAAa,SAAS;EAAK,CAAC;CAEnD;AACF;AAEA,SAAS,kBAAkB,OAA8C;CACvE,IAAI,OAAO,UAAU,UACnB,OAAO;EAAE,MAAM;EAAQ,SAAS;CAAM;CAExC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,KAAA;CAExD,MAAM,SAAS;CACf,IAAI,OAAO,OAAO,SAAS,UAAU,OAAO,KAAA;CAE5C,QAAQ,OAAO,MAAf;EACE,KAAK;EACL,KAAK,aAAa;GAChB,MAAM,UAAU,OAAO,WAAW,OAAO;GACzC,OAAO,OAAO,YAAY,WACtB;IAAE,MAAM,OAAO;IAAM;GAAQ,IAC7B,KAAA;EACN;EACA,KAAK;EACL,KAAK,aACH,OAAO,eAAe,MAAM;EAC9B,KAAK;EACL,KAAK;EACL,KAAK,sBACH,OAAO,uBAAuB,MAAM;EACtC,SAGE,OAAO,EAAE,MAAM,OAAO,KAAK,WAAW,KAAK,GAAG,EAAE;CACpD;AACF;AAEA,SAAS,eACP,QAC8B;CAC9B,MAAM,OAAO,OAAO,QAAQ,OAAO;CACnC,IAAI,OAAO,SAAS,UAAU,OAAO,KAAA;CACrC,MAAM,KAAK,OAAO,MAAM,OAAO;CAC/B,MAAM,OAAO,OAAO,aAAa,OAAO;CAExC,OAAO;EACL,MAAM;EACN,GAAI,OAAO,OAAO,WAAW,EAAE,GAAG,IAAI,CAAC;EACvC;EACA,GAAI,SAAS,KAAA,IAAY,EAAE,WAAW,UAAU,IAAI,EAAE,IAAI,CAAC;CAC7D;AACF;AAEA,SAAS,uBACP,QACkB;CAClB,MAAM,KAAK,OAAO,MAAM,OAAO;CAC/B,MAAM,cAAc,OAAO,YAAY,OAAO,UAAU,OAAO,UAAU;CAEzE,OAAO;EACL,MAAM;EACN,GAAI,OAAO,OAAO,WAAW,EAAE,GAAG,IAAI,CAAC;EACvC,UAAU,aAAa,WAAW;CACpC;AACF;AAEA,SAAS,aAAa,OAAyB;CAC7C,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,SAAS;CACf,QAAQ,OAAO,MAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO,OAAO,SAAS;EACzB,KAAK,oBACH,OAAO;GACL,QAAQ;GACR,GAAI,OAAO,OAAO,WAAW,WAAW,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;EACvE;EACF,SACE,OAAO;CACX;AACF;AAEA,SAAS,cACP,OACA,cACoB;CACpB,OAAO;EACL,MAAM;EACN;EAIA,eAAe,sBAAsB,gBAAgB,SAAS;CAChE;AACF;AAEA,SAAS,iBAAiB,QAAqD;CAC7E,MAAM,QAAQ,OAAO,gBAAgB,OAAO;CAC5C,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,KAAA;CACxD,MAAM,UAAW,MAAkC;CACnD,OAAO,OAAO,YAAY,WAAW,UAAU,KAAA;AACjD;AAEA,SAAS,sBAAsB,OAAuB;CACpD,QAAQ,OAAR;EACE,KAAK,kBACH,OAAO;EACT,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,WACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,UAAU,OAAyB;CAC1C,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,kBACP,UACoB;CACpB,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;CAEnC,MAAM,OAAO,CAAC,GAAG,QAAQ;CACzB,OAAO,MAAM;EACX,MAAM,OAAO,UAAU,IAAI;EAC3B,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;EAC/B,IAAI,WAAW,IAAI,KAAK,qBAAqB,OAAO;EACpD,IAAI,KAAK,UAAU,yBAAyB,OAAO,KAAA;EACnD,KAAK,OAAO,yBAAyB,CAAC;CACxC;AACF;AAEA,SAAS,UAAU,OAAoC;CACrD,MAAM,OAAO,UAAU,KAAK;CAC5B,OAAO,SAAS,KAAA,KAAa,WAAW,IAAI,KAAK,sBAC7C,OACA,KAAA;AACN;AAEA,SAAS,UAAU,OAAoC;CACrD,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN;CACF;AACF;AAEA,SAAS,WAAW,OAAuB;CACzC,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC;AACzC;;;ACvUA,SAAgB,0BACd,QACA,MACA,UAMI,CAAC,GACI;CACT,OAAO,kBACL,QACA;EACE,aAAa,YAAY;GACvB,KAAK,OACH,kCACE,SACA,QAAQ,oBAAoB,MAC5B,QAAQ,wBAAwB,MAChC,QAAQ,gBACR,QAAQ,kBAAkB,IAC5B,CACF;EACF;EACA,UAAU,OAAO,2BAA2B;GAC1C,IAAI,QAAQ,qBACV,oBACE,MACA,uBACE,0BACE,sBAAsB,KAAK,KAC3B,QAAQ,cACZ,CACF;GAEF,KAAK,KAAK,KAAK;EACjB;CACF,GACA,QAAQ,aACR,QAAQ,sBAAsB,QAAQ,iBAAiB,KAAA,GACvD,QAAQ,kBAAkB,IAC5B;AACF;AAEA,SAAS,kCACP,SACA,iBACA,qBACA,uBACA,eACiB;CACjB,OAAO;EACL,GAAG,iBAAiB;GAClB,gBAAgB,sBACX,SAAS,kBAAkB,wBAC5B,KAAA;GACJ,cAAc,SAAS;GACvB,UAAU,kBAAkB,SAAS,WAAW,KAAA;GAChD,yBAAyB,SAAS;GAClC,eAAe,SAAS;GACxB,OAAO,SAAS;EAClB,CAAC;EACD,GAAG,4BACD,gBAAgB,SAAS,iBAAiB,KAAA,CAC5C;CACF;AACF;AAEA,SAAS,kBACP,QACA,OAOA,aACA,gBACA,eACS;CACT,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;EACjD,MAAM,WAAW,KAAA,CAAS;EAC1B,OAAO;CACT;CAGA,MAAM,SAAS;CAEf,IAAI,aAAa;CACjB,IAAI,SAAS;CAEb,MAAM,gBAAgB,YAAuC;EAC3D,IAAI,QACF;EAEF,SAAS;EACT,MAAM,WAAW,OAAO;CAC1B;CAEA,MAAM,aACJ,OACA,2BACG;EACH,IAAI,QACF;EAEF,SAAS;EACT,MAAM,QAAQ,OAAO,sBAAsB;CAC7C;CAKA,IAAI;EACF,IAAI,iBAAiB,OAAO,UAAU,GAAG;GACvC,OAAO,eAAe,QAAQ,cAAc;IAC1C,cAAc;IACd,YAAY;IACZ,OAAO,mBACL,OAAO,YACP;KACE,YAAY;KACZ,SAAS;IACX,GACA,aACA,gBACA,aACF;IACA,UAAU;GACZ,CAAC;GACD,OAAO;EACT;EAEA,MAAM,cAAc,gBAAgB,QAAQ;GAC1C;GACA;GACA;GACA;EACF,CAAC;EAED,IAAI,aAAa;GACf,OAAO,eAAe,QAAQ,YAAY,OAAO;IAC/C,cAAc;IACd,YAAY;IACZ,OACE,YAAY,SAAS,aACjB,mBACE,YAAY,QACZ;KACE,YAAY;KACZ,SAAS;IACX,GACA,aACA,gBACA,aACF,IACA,kBACE,YAAY,QACZ;KACE,YAAY;KACZ,SAAS;IACX,GACA,aACA,gBACA,aACF;IACN,UAAU;GACZ,CAAC;GACD,aAAa;EACf;CACF,QAAQ;EACN,aAAa;CACf;CAEA,IAAI,CAAC,YAAY;EACf,MAAM,WAAW,KAAA,CAAS;EAC1B,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,gBACP,QACA,iBAYY;CACZ,KAAK,MAAM,SAAS,iBAClB,IAAI;EACF,MAAM,SAAS,OAAO;EACtB,IAAI,iBAAiB,MAAM,GACzB,OAAO;GAAE;GAAO,MAAM;GAAY;EAAO;EAE3C,IAAIC,kBAAgB,MAAM,GACxB,OAAO;GAAE;GAAO,MAAM;GAAiB;EAAO;CAElD,QAAQ,CAER;AAIJ;AAEA,SAAS,mBACP,QACA,OAOA,aACA,gBACA,eACyB;CACzB,IAAI;CACJ,MAAM,QAAQ,kBACZ,OACA,aACA,gBACA,aACF;CAEA,OAAO,IAAI,eAAwB;EACjC,MAAM,KAAK,YAAY;GACrB,WAAW,OAAO,UAAU;GAC5B,IAAI;IACF,MAAM,SAAS,MAAM,OAAO,KAAK;IACjC,IAAI,MAAM,QACR;IAGF,IAAI,OAAO,MAAM;KACf,MAAM,SAAS;KACf,WAAW,MAAM;KACjB,cAAc;KACd;IACF;IAEA,MAAM,aAAa,OAAO,KAAK;IAC/B,WAAW,QAAQ,OAAO,KAAK;GACjC,SAAS,OAAgB;IACvB,IAAI,CAAC,MAAM,QAAQ;KACjB,MAAM,KAAK,KAAK;KAChB,WAAW,MAAM,KAAK;IACxB;IACA,cAAc;GAChB;EACF;EACA,MAAM,OAAO,QAAQ;GACnB,MAAM,OAAO;GACb,IAAI;IACF,IAAI,QAAQ;KACV,MAAM,OAAO,OAAO,MAAM;KAC1B;IACF;IAEA,MAAM,OAAO,OAAO,MAAM;GAC5B,SAAS,OAAgB;IACvB,MAAM,KAAK,KAAK;IAChB,MAAM;GACR,UAAU;IACR,cAAc;GAChB;EACF;CACF,CAAC;CAED,SAAS,gBAAsB;EAC7B,IAAI,CAAC,QACH;EAGF,IAAI;GACF,OAAO,YAAY;EACrB,QAAQ,CAER,UAAU;GACR,SAAS,KAAA;EACX;CACF;AACF;AAEA,SAAS,kBACP,QACA,OAOA,aACA,gBACA,eACwB;CACxB,OAAO,EACL,QAAQ,OAAO,iBAAiB;EAC9B,MAAM,QAAQ,kBACZ,OACA,aACA,gBACA,aACF;EACA,IAAI;GACF,WAAW,MAAM,SAAS,QAAQ;IAChC,MAAM,aAAa,KAAK;IACxB,MAAM;GACR;GAEA,MAAM,SAAS;EACjB,SAAS,OAAgB;GACvB,MAAM,KAAK,KAAK;GAChB,MAAM;EACR,UAAU;GACR,MAAM,OAAO;EACf;CACF,EACF;AACF;AAEA,SAAS,kBACP,OAOA,aACA,uBACA,eAOA;CACA,IAAI,SAAS;CACb,IAAI,iBAAiB;CACrB,IAAI;CACJ,IAAI,gBAAgB;CACpB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,gBAAgB;CACpB,IAAI;CACJ,MAAM,SAAS,qBAAqB;CAEpC,MAAM,uBAAgC;EACpC,IAAI,eAAe;GACjB,MAAM,QAAQ,cAAc,OAAO,cAAc;GACjD,OAAO;EACT;EAEA,IAAI,eAAe;GAKjB,MAAM,QAAQ,EAAE,MAAM,aAAa,GAAG,cAAc;GACpD,OAAO;EACT;EAEA,OAAO;CACT;CAEA,OAAO;EACL,IAAI,SAAS;GACX,OAAO;EACT;EACA,SAAS;GACP,IAAI,QACF;GAGF,SAAS;GACT,IAAI,eAAe,GACjB;GAGF,MAAM,WAAW,KAAA,CAAS;EAC5B;EACA,WAAW;GACT,IAAI,QACF;GAGF,SAAS;GACT,IAAI,eAAe,GACjB;GAGF,MAAM,WACJ,uBAAuB;IACrB;IACA;IACA,gBAAgB,gBACZ,OAAO,SAAS,YAAY,IAC5B,KAAA;IACJ;IACA,yBACE,mBAAmB,KAAA,KAAa,gBAAgB,KAAA,IAC5C,KAAA,KACC,iBAAiB,eAAe;IACvC;IACA;GACF,CAAC,CACH;EACF;EACA,KAAK,OAAO;GACV,IAAI,QACF;GAGF,SAAS;GACT,MAAM,QAAQ,OAAO,cAAc;EACrC;EACA,aAAa,UAAU;GACrB,mBAAmB,KAAK,IAAI;GAC5B,MAAM,QAAQ,oBAAoB,QAAQ;GAC1C,iBAAiB,sBAAsB,KAAK,KAAK;GACjD,IAAI,eAAe,OAAO,QAAQ,KAAK;GAKvC,IAAI,aAAa,KAAK,GACpB,gBAAgB,EAAE,OAAO,MAAM,MAAM;GAEvC,IAAI,aAAa,KAAK,GACpB,gBAAgB;GAElB,IAAI,gBAAgB,KAAK,GACvB,iBAAiB;GAEnB,eAAeC,sBAAoB,KAAK,KAAK;GAC7C,QAAQ,yBAAyB,KAAK,KAAK;GAC3C,WAAW,oBAAoB,KAAK,KAAK;EAC3C;CACF;AACF;;;;;;;AAQA,SAAS,oBAAoB,OAAyB;CACpD,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,OAAQ,MAAkC;CAChD,OAAO,OAAO,SAAS,YACrB,SAAS,QACT,UAAW,OACT,OACA;AACN;AAEA,SAAS,aAAa,OAAsD;CAC1E,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAkC,SAAS;AAEhD;AAEA,SAAS,aAAa,OAAyB;CAC7C,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAkC,SAAS;AAEhD;AAEA,SAAS,uBAAuB,OAQd;CAChB,OAAO;EACL,GAAI,MAAM,mBAAmB,KAAA,IACzB,EAAE,gBAAgB,MAAM,eAAe,IACvC,CAAC;EACL,GAAI,MAAM,iBAAiB,KAAA,IACvB,EAAE,cAAc,MAAM,aAAa,IACnC,CAAC;EACL,GAAI,MAAM,mBAAmB,KAAA,IACzB,EAAE,gBAAgB,MAAM,eAAe,IACvC,CAAC;EACL,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;EACrD,GAAI,MAAM,4BAA4B,KAAA,IAClC,EAAE,yBAAyB,MAAM,wBAAwB,IACzD,CAAC;EACL,GAAI,MAAM,gBAAgB,IAAI,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;EACxE,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;CAC9C;AACF;AAEA,SAAS,iBAAiB,OAAkD;CAC1E,OACE,OAAO,UAAU,YACjB,UAAU,QACV,iBAAiB,SACjB,OAAO,MAAM,gBAAgB,cAC7B,eAAe,SACf,OAAO,MAAM,cAAc;AAE/B;AAEA,SAAS,gBAAgB,OAAyB;CAChD,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAkC,SAAS;AAEhD;AAEA,SAASD,kBAAgB,OAAiD;CACxE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB,SACxB,OAAO,MAAM,OAAO,mBAAmB;AAE3C;;;AC1iBA,SAAgB,UACd,QACA,mBACA,OACA,iBACA,eACS;CACT,IAAI,CAAC,mBACH,OAAO;CAKT,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,YAAY,iBAAiB,KAAK;CACxC,MAAM,eAAe,6BAA6B,OAAO,WAAW,QAAQ;CAC5E,OAAO,kBAAkB;EACvB,OAAO,aAAa;EACpB,YAAY;GACV,cAAc,OAAO,EAAE,YAAY,aAAa;IAC9C,MAAM,OAAO,sBACX,cACA,WACA,QACA,iBACA,aACF;IACA,OAAO,OAAO,SACZ,KAAK,MACL,KAAK,YACL,OAAO,cAAc;KACnB,aAAa,MAAM;KACnB,IAAI;MACF,MAAM,SAAS,MAAM,WAAW;MAChC,UAAU,OAAO;OACf,GAAG,2BAA2B,QAAQ;QACpC,gBACE,sBAAsB,MAAM,KAAK,aAAa,IAAI;QACpD,iBAAiB;OACnB,CAAC;OACD,GAAG,wBAAwB,QAAQ,aAAa;MAClD,CAAC;MACD,OAAO;KACT,SAAS,OAAgB;MACvB,0BAA0B,WAAW,OAAO,aAAa,IAAI,CAAC;MAC9D,MAAM;KACR;IACF,CACF;GACF;GACA,YAAY,OAAO,EAAE,UAAU,aAAa;IAC1C,MAAM,OAAO,sBACX,YACA,WACA,QACA,iBACA,aACF;IAIA,OAAO,OAAO,SACZ,KAAK,MACL,KAAK,YACL,OAAO,cAAc;KACnB,aAAa,MAAM;KACnB,IAAI;MACF,MAAM,cAAc,KAAK,IAAI;MAC7B,MAAM,SAAS,MAAM,SAAS;MAC9B,OAAO,0BAA0B,QAAQ,WAAW;OAClD,gBACE,sBAAsB,MAAM,KAAK,aAAa,IAAI;OACpD,qBAAqB;OACrB,iBAAiB;OACjB;OACA;MACF,CAAC;KACH,SAAS,OAAgB;MACvB,0BAA0B,WAAW,OAAO,aAAa,IAAI,CAAC;MAC9D,UAAU,KAAK,KAAK;MACpB,MAAM;KACR;IACF,CACF;GACF;EACF;CACF,CAAC;AACH;AAEA,SAAS,0BACP,MACA,OACA,eACM;CACN,oBACE,MACA,uBAAuB,sBAAsB,KAAK,KAAK,aAAa,CACtE;AACF;AAEA,SAAS,sBACP,WACA,OACA,QACA,iBACA,eACkC;CAClC,MAAM,SACJ,OAAO,WAAW,YAAY,WAAW,OACpC,SACD,CAAC;CACP,MAAM,OAAO,cAAc;EACzB,aAAa;EACb,OAAO,OAAO;EACd;EACA,UAAU,OAAO;EACjB,SAAS,sBAAsB,QAAQ,eAAe;CACxD,CAAC;CACD,OAAO;EACL,GAAG;EACH,YAAY;GACV,GAAG,KAAK;GACR,GAAG,uBAAuB,QAAQ,aAAa;EACjD;CACF;AACF;;;ACxIA,SAAgB,UACd,QACA,OACA,YACS;CACT,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAIT,MAAM,aAAa;CACnB,MAAM,eAAwC,CAAC;CAC/C,KAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,UAAU,GACtD,aAAa,YAAY,SAAS,QAAQ,UAAU,MAAM,UAAU;CAEtE,OAAO;AACT;AAEA,SAAS,SACP,QACA,UACA,MACA,YACS;CACT,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAO;CAIT,MAAM,aAAa;CACnB,MAAM,aAAa,OAAO,WAAW,YAAY;CACjD,MAAM,cACJ,OAAO,WAAW,kBAAkB,aACpC,OAAO,WAAW,kBAAkB;CACtC,IAAI,CAAC,cAAc,CAAC,aAClB,OAAO;CAGT,MAAM,cAAc,OAAO,OACzB,OAAO,OAAO,OAAO,eAAe,IAAI,CAAC,GACzC,IACF;CAGA,IAAI,aACF,kBAAkB,QAAQ,aAAa,YAAY,MAAM,QAAQ;CAEnE,IAAI,CAAC,YACH,OAAO;CAGT,MAAM,UAAU,WAAW;CAC3B,IAAI,OAAO,YAAY,YACrB,OAAO;CAET,MAAM,kBAAkB,QAAQ,KAAK,IAAI;CAIzC,YAAY,WAAW,GAAG,SAAS;EACjC,MAAM,OAAO,aAAa;GACxB,aAAa;GACb,WAAW;GACX,YAAY,kBAAkB,KAAK,EAAE;GACrC;EACF,CAAC;EACD,MAAM,aAAa;GACjB,GAAG,KAAK;GACR,GAAG,oBAAoB,KAAK,IAAI,UAAU;EAC5C;EAGA,OAAO,OAAO,SAAS,KAAK,MAAM,aAAa,aAAa;GAI1D,MAAM,gBAAgB,kBAAkB,SAAS;GACjD,MAAM,WAAW,2BACf,KAAK,IACL,kBAAkB,KAAK,EAAE,CAC3B;GACA,IAAI,UAAU,aAAa,MACzB,oBAAoB,QAAQ,UAAU,SAAS,YAAY,UAAU;GAEvE,MAAM,SAAS,gBAAgB,GAAG,IAAI;GAEtC,IAAI,cAAc,MAAM,GACtB,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,MAC5B,aACC,iBAAiB,UAAU,UAAU,eAAe,UAAU,IAC/D,UAAmB;IAClB,SAAS,KAAK,KAAK;IACnB,MAAM;GACR,CACF;GAGF,OAAO,iBAAiB,QAAQ,UAAU,eAAe,UAAU;EACrE,CAAC;CACH;CAEA,OAAO;AACT;AAEA,SAAS,kBACP,QACA,aACA,YACA,MACA,UACM;CACN,MAAM,WAAW,WAAW;CAC5B,MAAM,WACJ,OAAO,aAAa,aACf,SAAS,KAAK,IAAI,IACnB,KAAA;CAEN,YAAY,iBAAiB,GAAG,SAA6B;EAC3D,MAAM,SAAS,WAAW,SAAS,GAAG,IAAI,IAAI;EAC9C,MAAM,mBAAmB,WAA6B;GACpD,MAAM,aAAa,kBAAkB,KAAK,EAAE;GAC5C,IAAI,WAAW,QAAQ,CAAC,oBAAoB,KAAK,IAAI,UAAU,GAC7D,sBAAsB,QAAQ,UAAU,YAAY,WAAW;GAEjE,OAAO;EACT;EAEA,OAAO,cAAc,MAAM,IACvB,QAAQ,QAAQ,MAAM,CAAC,CAAC,KAAK,eAAe,IAC5C,gBAAgB,MAAM;CAC5B;AACF;;AAGA,SAAgB,8BACd,QACA,UACM;CACN,KAAK,MAAM,YAAY,kBAAkB,QAAQ,GAC/C,IAAI,CAAC,SAAS,UACZ,sBACE,QACA,SAAS,UACT,SAAS,YACT,QACF;AAGN;AAEA,SAAS,sBACP,QACA,UACA,YACA,OACM;CACN,MAAM,OAAO,aAAa;EACxB,aAAa;EACb,WAAW;EACX;EACA;CACF,CAAC;CACD,OAAO,SAAS,KAAK,MAAM,KAAK,kBAAkB;EAChD,oBAAoB,QAAQ,UAAU,YAAY,KAAK;CACzD,CAAC;AACH;AAEA,SAAS,oBACP,QACA,UACA,YACA,OACM;CACN,MAAM,WAAW,iBAAiB;EAAE;EAAO;EAAY;CAAS,CAAC;CACjE,OAAO,SAAS,SAAS,MAAM,SAAS,kBAAkB,KAAA,CAAS;AACrE;AAEA,SAAS,oBACP,SACA,YACS;CACT,OAAO,2BAA2B,SAAS,UAAU,MAAM,KAAA;AAC7D;AAEA,SAAS,2BACP,SACA,YAC0D;CAC1D,IACE,eAAe,KAAA,KACf,OAAO,YAAY,YACnB,YAAY,MAEZ;CAEF,OAAO,kBAAmB,QAAoC,QAAQ,CAAC,CAAC,MACrE,aAAa,SAAS,eAAe,UACxC;AACF;AAEA,SAAS,kBAAkB,eAIxB;CACD,IAAI,CAAC,MAAM,QAAQ,aAAa,GAC9B,OAAO,CAAC;CAGV,MAAM,iCAAiB,IAAI,IAAoB;CAC/C,MAAM,4BAAY,IAAI,IAAoB;CAC1C,KAAK,MAAM,WAAW,eAAe;EACnC,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM;EACrD,MAAM,UAAW,QAAoC;EACrD,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;EAC7B,KAAK,MAAM,QAAQ,SAAS;GAC1B,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;GAC/C,MAAM,SAAS;GACf,MAAM,OAAO,WAAW,OAAO,IAAI;GACnC,IAAI,SAAS,aAAa;IACxB,MAAM,aAAa,WAAW,OAAO,UAAU;IAC/C,MAAM,WAAW,WAAW,OAAO,QAAQ;IAC3C,IAAI,cAAc,UAAU,UAAU,IAAI,YAAY,QAAQ;GAChE,OAAO,IAAI,SAAS,yBAAyB;IAC3C,MAAM,aAAa,WAAW,OAAO,UAAU;IAC/C,MAAM,aAAa,WAAW,OAAO,UAAU;IAC/C,IAAI,cAAc,YAChB,eAAe,IAAI,YAAY,UAAU;GAC7C;EACF;CACF;CAEA,MAAM,cAAc,cAAc,GAAG,EAAE;CACvC,MAAM,cACJ,OAAO,gBAAgB,YAAY,gBAAgB,OAC9C,YAAwC,UACzC,KAAA;CACN,MAAM,YAGD,CAAC;CACN,IAAI,MAAM,QAAQ,WAAW,GAC3B,KAAK,MAAM,QAAQ,aAAa;EAC9B,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;EAC/C,MAAM,SAAS;EACf,IAAI,OAAO,SAAS,0BAA0B;EAC9C,MAAM,aAAa,WAAW,OAAO,UAAU;EAC/C,IAAI,cAAc,OAAO,OAAO,aAAa,WAC3C,UAAU,KAAK;GAAE;GAAY,UAAU,OAAO;EAAS,CAAC;CAE5D;CAGF,OAAO,UAAU,SAAS,EAAE,YAAY,eAAe;EACrD,MAAM,aAAa,eAAe,IAAI,UAAU;EAChD,IAAI,CAAC,YAAY,OAAO,CAAC;EACzB,OAAO,CACL;GACE;GACA;GACA,UAAU,UAAU,IAAI,UAAU,KAAK;EACzC,CACF;CACF,CAAC;AACH;;;;;;AAOA,SAAS,iBACP,QACA,MACA,eACA,YACS;CACT,IAAI,gBAAgB,MAAM,GACxB,OAAO,4BAA4B,QAAQ,MAAM,eAAe,UAAU;CAG5E,KAAK,OAAO,qBAAqB,QAAQ,UAAU,CAAC;CACpD,OAAO;AACT;AAEA,SAAS,4BACP,UACA,MACA,eACA,YACwB;CACxB,OAAO,EACL,QAAQ,OAAO,iBAAiB;EAI9B,MAAM,WAAW,oBAAoB,SAAS,OAAO,cAAc,CAAC,CAAC;EACrE,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI;GACF,OAAO,MAAM;IACX,MAAM,OAAO,MAAM,oBAAoB,SAAS,KAAK,CAAC;IACtD,IAAI,KAAK,MAAM;KACb,YAAY;KACZ,cAAc,KAAK;KACnB,OAAO,KAAK;IACd;IACA,MAAM,KAAK;GACb;EACF,SAAS,OAAgB;GACvB,KAAK,KAAK,KAAK;GACf,MAAM;EACR,UAAU;GACR,IAAI,CAAC,WAKH,IAAI;IACF,MAAM,oBAAoB,SAAS,SAAS,KAAA,CAAS,CAAC;GACxD,QAAQ,CAER;GAIF,KAAK,OAAO,qBAAqB,aAAa,UAAU,CAAC;EAC3D;CACF,EACF;AACF;;AAGA,SAAS,kBAAkB,SAAsC;CAC/D,IAAI,OAAO,YAAY,YAAY,YAAY,MAC7C;CAIF,OAAO,WAAY,QAAoC,UAAU;AACnE;AAEA,SAAS,gBAAgB,OAAiD;CACxE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB,SACxB,OAAQ,MAAuC,OAAO,mBACpD;AAEN;AAEA,SAAS,cAAiB,OAAoD;CAC5E,OACE,UAAU,QACV,UAAU,KAAA,MACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,UAAU,SACV,OAAO,MAAM,SAAS;AAE1B;;;;;;;ACnUA,SAAgB,qBACd,IACA,iBACG;CACH,MAAM,SAAS,kBAAkB,EAAE,IAAI,OAAO,eAAe,CAAC,GAAG,EAAE,IAAI;CAGvE,MAAM,+BAAe,IAAI,IAAmC;CAE5D,OAAO,IAAI,MAAM,QAAQ,EACvB,IAAI,aAAa,UAAU,UAAU;EACnC,MAAM,WAAW,QAAQ,IAAI,aAAa,UAAU,QAAQ;EAE5D,IAAI,uBAAuB,QAAQ,KAAK,OAAO,aAAa,YAAY;GACtE,IAAI,UAAU,aAAa,IAAI,QAAQ;GACvC,IAAI,CAAC,SAAS;IACZ,UAAU,uBACR,UACA,mBAAmB,QAAQ,GAC3B,sBAAsB,EAAE,GACxB,eACF;IACA,aAAa,IAAI,UAAU,OAAO;GACpC;GACA,OAAO;EACT;EAEA,OAAO;CACT,EACF,CAAC;AACH;AAEA,SAAS,sBACP,IACsC;CACtC,MAAM,QAAQ,GAAG;CACjB,IAAI,OAAO,UAAU,YACnB;CAKF,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAkC;CAG5D,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAyB;CAClD,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,IAAI,MAAM,aAAa,SAAS,UAC9B,OAAO;CAGT,IAAI;EAEF,MAAM,WADO,OAAO,KAAK,KACL,CAAC,CAAC;EACtB,IAAI,aAAa,KAAA,GACf,OAAO;EAGT,MAAM,aAAa,OAAO,yBAAyB,OAAO,QAAQ;EAClE,OAAO,aACH,CAAC,WAAW,gBAAgB,CAAC,WAAW,WACxC;CACN,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,uBACP,eACA,WACA,mBACA,iBACkB;CAClB,MAAM,UAAuC;EAC3C,eAAe,gBAAgB,SAAS,kBAAkB;EAC1D,YAAY,gBAAgB,SAAS,eAAe;CACtD;CAOA,IAAIE,oBAAkB,aAAa,GACjC,QAAQ,QAAQ,GAAG,SAAS;EAC1B,OAAO,gBAAgB,OAAO,SAC5B,kBAAkB,iBAAiB,MAAM,CAAC,GAC1C,CAAC,IACA,kBAAkB;GAGjB,IAAI,CAAC,cAAc,UAAU;IAC3B,cAAc,OAAO;IACrB,OAAO,UAAU,QAAQ,GAAG,IAAI;GAClC;GAQA,oBAAoB,eANP,qBACX,eACA,iBAAiB,OAAO,KAAK,GAC7B,QACA,gBAAgB,OAEoB,CAAC,CAAC,UAAU;GAClD,8BACE,gBAAgB,QAChB,OAAO,QACT;GAEA,MAAM,cAAc,KAAK,IAAI;GAC7B,MAAM,SAAS,UACb,uBACE,QACA,eACA,mBACA,gBAAgB,QAChB,OACF,GACA,GAAG,IACL;GACA,MAAM,eAAe,aAAa,mBAAmB,OAAO,KAAK;GAEjE,OAAO,0BAA0B,QAAQ,eAAe;IACtD,iBAAiB,CAAC;IAClB,aAAa,eAAe,KAAA,IAAY;GAC1C,CAAC;EACH,CACF;CACF;CAGF,OAAO,OAAO,QAAQ,GAAG,SAAS;EAChC,OAAO,gBAAgB,OAAO,SAC5B,kBAAkB,iBAAiB,MAAM,CAAC,GAC1C,CAAC,GACD,OAAO,kBAAkB;GACvB,IAAI,CAAC,cAAc,UACjB,OAAO,UAAU,QAAQ,GAAG,IAAI;GASlC,oBAAoB,eANP,qBACX,eACA,iBAAiB,OAAO,KAAK,GAC7B,QACA,gBAAgB,OAEoB,CAAC,CAAC,UAAU;GAClD,8BAA8B,gBAAgB,QAAQ,OAAO,QAAQ;GAErE,MAAM,SAAS,MAAM,UACnB,uBACE,QACA,eACA,mBACA,gBAAgB,QAChB,OACF,GACA,GAAG,IACL;GAEA,cAAc,OACZ,2BAA2B,QAAQ,EACjC,iBAAiB,CAAC,aAAa,mBAAmB,OAAO,KAAK,EAChE,CAAC,CACH;GACA,OAAO;EACT,CACF;CACF;AACF;;;;;;AAOA,SAAS,iBAAiB,QAA+C;CACvE,MAAM,YACJ,OAAO,OAAO,2BAA2B,YACzC,OAAO,2BAA2B,OAC7B,OAAO,yBACR,KAAA;CACN,MAAM,WACJ,OAAO,WAAW,aAAa,YAAY,UAAU,aAAa,OAC7D,UAAU,WACX,KAAA;CAEN,OACE,WAAW,UAAU,aAAa,WAAW,oBAAoB,KACjE,WAAW,WAAW,UAAU;AAEpC;AAEA,SAAS,uBACP,QACA,eACA,mBACA,QACA,SACmB;CACnB,OAAO;EACL,GAAG;EACH,GAAI,gBAAgB,aAAa,KAAK,OAAO,UAAU,KAAA,IACnD,EAAE,OAAO,UAAU,QAAQ,OAAO,OAAO,QAAQ,UAAU,EAAE,IAC7D,CAAC;EACL,GAAI,OAAO,UAAU,KAAA,IACjB,EACE,OAAO,UACL,QACA,mBACA,OAAO,OACP,eACA,QAAQ,aACV,EACF,IACA,CAAC;CACP;AACF;AAEA,SAAS,aACP,mBACA,OACS;CACT,OACE,sBAAsB,KAAA,KACtB,OAAO,UAAU,YACjB,UAAU;AAEd;AAEA,SAASA,oBAAkB,eAA8C;CACvE,OAAO,kBAAkB,kBAAkB,kBAAkB;AAC/D;AAEA,SAAS,gBAAgB,eAA8C;CACrE,OAAO,kBAAkB,kBAAkB,kBAAkB;AAC/D;AAEA,SAAS,uBACP,OAC+B;CAC/B,OACE,UAAU,oBACV,UAAU,kBACV,UAAU,kBACV,UAAU;AAEd;AAEA,SAAS,qBACP,WACA,OACA,QACA,SACkC;CAClC,OAAO,cAAc;EACnB,YAAY;GACV,GAAG,mBAAmB,kBAAkB,MAAM,CAAC;GAC/C,GAAG,kBAAkB,QAAQ,OAAO;EACtC;EACA,SAAS,gBAAgB,MAAM;EAC/B,aAAa;EACb,OAAO,OAAO;EACd;EACA,UAAU,OAAO;EACjB,SAAS,sBAAsB,QAAQ,SAAS;CAClD,CAAC;AACH;;AAGA,SAAS,kBACP,QACqC;CACrC,MAAM,YACJ,OAAO,OAAO,2BAA2B,YACzC,OAAO,2BAA2B,OAC7B,OAAO,yBACR,KAAA;CAEN,OAAO,OAAO,WAAW,aAAa,YAAY,UAAU,aAAa,OACpE,UAAU,WACX,KAAA;AACN;;;;;;;AAQA,SAAS,gBAAgB,QAA4C;CACnE,MAAM,YACJ,OAAO,OAAO,2BAA2B,YACzC,OAAO,2BAA2B,OAC7B,OAAO,yBACR,KAAA;CACN,MAAM,WACJ,OAAO,WAAW,aAAa,YAAY,UAAU,aAAa,OAC7D,UAAU,WACX,KAAA;CAEN,OAAO;EACL,SAASC,gBAAc,UAAU,WAAW,iBAAiB;EAC7D,WACEA,gBAAc,UAAU,aAAa,mBAAmB,KACxD,WAAW,WAAW,UAAU;EAClC,cAAcA,gBACZ,UACA,gBACA,sBACF;EACA,gBAAgBA,gBACd,UACA,kBACA,wBACF;CACF;AACF;AAEA,SAASA,gBACP,UACA,KACA,aACoB;CACpB,OAAO,WAAW,WAAW,QAAQ,WAAW,YAAY;AAC9D;AAEA,SAAS,kBACP,QACA,SACuD;CACvD,MAAM,aAAwD,CAAC;CAE/D,MAAM,iBACJ,OAAO,OAAO,yBAAyB,YACvC,OAAO,yBAAyB,OAE3B,OAAO,uBACR,KAAA;CAEN,KAAK,MAAM,OAAO,SAAS,yBAAyB,CAAC,GAAG;EACtD,MAAM,QAAQ,iBAAiB;EAC/B,IAAIC,yBAAuB,KAAK,GAC9B,WAAW,qCAAqC,SAAS;CAE7D;CAEA,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,IAAI,aAAa,KAAA;AAC3D;AAEA,SAASA,yBACP,OACoC;CACpC,OACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU;AAErB;;;;AC1YA,SAAgB,oBAAoB,aAA8B;CAChE,MAAM,QAAQ,WAAW,WAAW;CACpC,IAAI,UAAU,KAAA,GACZ,OAAO;CAGT,OAAO,MAAM,WAAW,KAAK,IAAI,MAAM,MAAM,CAAY,IAAI;AAC/D;;;;;;;AAQA,SAAgB,yBAAyB,OAAgC;CACvE,MAAM,SAAS,YAAY,KAAK;CAChC,MAAM,iBACJ,OAAO,OAAO,mBAAmB,YAAY,OAAO,mBAAmB,OAClE,OAAO,iBACR,KAAA;CAEN,OAAO;EACL,SAAS,cAAc,gBAAgB,WAAW,iBAAiB;EACnE,WACE,cAAc,gBAAgB,aAAa,mBAAmB,KAC9D,WAAW,OAAO,UAAU;EAC9B,cAAc,cACZ,gBACA,gBACA,sBACF;EACA,gBAAgB,cACd,gBACA,kBACA,wBACF;CACF;AACF;;AAGA,SAAgB,wBACd,OACA,eACgB;CAChB,MAAM,SAAS,YAAY,KAAK;CAChC,OAAO;EACL,kBAAkB,WAAW,OAAO,gBAAgB;EACpD,WAAW,WAAW,OAAO,mBAAmB,OAAO,SAAS;EAChE,YACE,kBAAkB,oBAAoB,kBAAkB,iBACpD,SACA;EACN,iBAAiB,WAAW,OAAO,eAAe;EAClD,MAAM,WAAW,OAAO,IAAI;EAC5B,QAAQ,kBAAkB,gBAAgB,kBAAkB;EAC5D,aAAa,WAAW,OAAO,WAAW;EAC1C,MAAM,WAAW,OAAO,IAAI;EAC5B,MAAM,WAAW,OAAO,IAAI;CAC9B;AACF;;AAGA,SAAgB,0BACd,OACA,UAII,CAAC,GACY;CACjB,MAAM,SAAS,YAAY,KAAK;CAChC,OAAO,iBAAiB;EACtB,gBAAgB,QAAQ,sBACpB,sBAAsB,MAAM,IAC5B,KAAA;EACJ,cAAc,oBAAoB,MAAM;EACxC,UAAU,QAAQ,kBACd,yBAAyB,MAAM,IAC/B,KAAA;EACJ,yBAAyB,QAAQ,qBAC7B,wBAAwB,MAAM,IAC9B,KAAA;EACJ,OAAO,oBAAoB,MAAM;CACnC,CAAC;AACH;;AAGA,SAAgB,sBAAsB,OAGlB;CAClB,OAAO;GACJ,eAAe,WAAW,SAAS,MAAM;GACzC,eAAe,MAAM,aAAa,MAAM;CAC3C;AACF;AAEA,SAAS,cACP,UACA,KACA,aACoB;CACpB,OAAO,WAAW,WAAW,QAAQ,WAAW,YAAY;AAC9D;AAEA,SAAS,YAAY,OAAwC;CAC3D,OAAO;AACT;AAEA,SAAS,oBACP,OACoB;CACpB,MAAM,eAAe,MAAM;CAC3B,IAAI,OAAO,iBAAiB,UAC1B,OAAO;CAGT,IAAI,OAAO,iBAAiB,YAAY,iBAAiB,MACvD,OAAO,WAAY,aAAyC,OAAO;AAIvE;AAEA,SAAS,yBACP,OAC6B;CAC7B,MAAM,WACJ,OAAO,MAAM,aAAa,YAAY,MAAM,aAAa,OACpD,MAAM,WACP,KAAA;CACN,MAAM,KAAK,WAAW,MAAM,cAAc,UAAU,EAAE;CAGtD,MAAM,QAAQ,WACZ,MAAM,iBAAiB,UAAU,WAAW,UAAU,KACxD;CAEA,IAAI,OAAO,KAAA,KAAa,UAAU,KAAA,GAChC;CAGF,OAAO;EACL,GAAI,OAAO,KAAA,IAAY,EAAE,GAAG,IAAI,CAAC;EACjC,GAAI,UAAU,KAAA,IAAY,EAAE,MAAM,IAAI,CAAC;CACzC;AACF;AAEA,SAAS,oBACP,OAC+B;CAC/B,MAAM,MAAM,MAAM,cAAc,MAAM;CACtC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC;CAGF,MAAM,QAAQ;CACd,MAAM,cAAc,eAAe,MAAM,WAAW;CACpD,MAAM,eAAe,eAAe,MAAM,YAAY;CAItD,MAAM,uBACJ,qBAAqB,MAAM,mBAAmB,iBAAiB,KAC/D,qBAAqB,MAAM,aAAa,WAAW,KACnD,WAAW,MAAM,iBAAiB;CACpC,MAAM,2BACJ,qBAAqB,MAAM,mBAAmB,kBAAkB,KAChE,qBAAqB,MAAM,aAAa,YAAY;CACtD,MAAM,kBACJ,qBAAqB,MAAM,oBAAoB,iBAAiB,KAChE,qBAAqB,MAAM,cAAc,WAAW,KACpD,WAAW,MAAM,eAAe;CAElC,IACE,gBAAgB,KAAA,KAChB,iBAAiB,KAAA,KACjB,yBAAyB,KAAA,KACzB,6BAA6B,KAAA,KAC7B,oBAAoB,KAAA,GAEpB;CAGF,OAAO;EACL,GAAI,6BAA6B,KAAA,IAC7B,EAAE,yBAAyB,IAC3B,CAAC;EACL,GAAI,yBAAyB,KAAA,IAAY,EAAE,qBAAqB,IAAI,CAAC;EACrE,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACnD,GAAI,iBAAiB,KAAA,IAAY,EAAE,aAAa,IAAI,CAAC;EACrD,GAAI,oBAAoB,KAAA,IAAY,EAAE,gBAAgB,IAAI,CAAC;CAC7D;AACF;AAEA,SAAS,wBACP,OACoB;CAKpB,MAAM,eAAe,YAHnB,OAAO,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,OAC1D,MAAM,cACP,KAAA,EAAA,EACuC,mBAAmB;CAChE,OAAO,iBAAiB,KAAA,IAAY,KAAA,IAAY,eAAe;AACjE;;;;;;;AC9JA,SAAgB,uBACd,iBACkB;CAClB,MAAM,gBAAgB,gBAAgB,SAAS,kBAAkB;CACjE,MAAM,aAAa,gBAAgB,SAAS,eAAe;CAC3D,MAAM,6BAAa,IAAI,IAA4B;CACnD,MAAM,6BAAa,IAAI,IAA0B;CAIjD,MAAM,4BAAY,IAAI,IAAuB;CAC7C,MAAM,eAAe,QAAgB,eACnC,GAAG,OAAO,GAAG;CAEf,MAAM,mBAAmB,UAAuC;EAC9D,MAAM,QAAQ,WAAW,IAAI,MAAM,MAAM;EACzC,IAAI,CAAC,OACH;EAGF,qBACE,MAAM,QACN,KAAA,GACA,YACA,gBAAgB,MAClB;EACA,oBACE,MAAM,QACN,KAAA,GACA,WACA,gBAAgB,MAClB;EACA,MAAM,KAAK,OAAO,0BAA0B,KAAK,CAAC;EAClD,WAAW,OAAO,MAAM,MAAM;CAChC;CAEA,OAAO;EACL,QAAQ,OAAO;GACb,MAAM,gBAAgB,uBACpB,oBAAoB,MAAM,WAAW,CACvC;GACA,IAAI,CAAC,eACH;GAGF,MAAM,OAAO,cAAc;IACzB,YAAY;KACV,GAAG,sBAAsB,EAAE,QAAQ,MAAM,OAAO,CAAC;KACjD,GAAG,yBAAyB,MAAM,cAAc;IAClD;IACA,SAAS,yBAAyB,KAAK;IACvC,aAAa;IACb,OAAO,WAAW,MAAM,OAAO;IAC/B,WAAW;IACX,UAAU,WAAW,MAAM,QAAQ;IACnC,SAAS,wBAAwB,OAAO,aAAa;GACvD,CAAC;GACD,MAAM,YAAY,gBAAgB,OAAO,SACvC,KAAK,MACL,KAAK,aACJ,eAAe,UAClB;GACA,WAAW,IAAI,MAAM,QAAQ;IAC3B,QAAQ,MAAM;IACd;IACA,MAAM;GACR,CAAC;EACH;EAEA,yBAAyB,OAAO;GAC9B,MAAM,QAAQ,WAAW,IAAI,MAAM,MAAM;GACzC,IAAI,CAAC,OACH;GAGF,MAAM,OAAO,cAAc;IACzB,YAAY;KACV,GAAG,sBAAsB,EAAE,QAAQ,MAAM,OAAO,CAAC;KACjD,GAAG,uBAAuB,OAAO,aAAa;IAChD;IACA,aAAa;IACb,OAAO,WAAW,MAAM,OAAO;IAC/B,WAAW,kBAAkB,MAAM,aAAa,IAC5C,aACA;IACJ,UAAU,WAAW,MAAM,QAAQ;IACnC,SAAS,wBAAwB,OAAO,MAAM,aAAa;GAC7D,CAAC;GACD,MAAM,QAAQ,WAAW,IAAI,MAAM,MAAM,KAAK,CAAC;GAC/C,MAAM,KAAK,EAAE,UAAU,KAAK,CAAC;GAC7B,WAAW,IAAI,MAAM,QAAQ,KAAK;EACpC;EAEA,uBAAuB,OAAO;GAC5B,MAAM,QAAQ,eAAe,YAAY,MAAM,MAAM;GACrD,IAAI,CAAC,OACH;GAUF,CANE,MAAM,QACN,gBAAgB,OAAO,SACrB,MAAM,SAAS,MACf,MAAM,SAAS,aACd,eAAe,UAClB,EAAA,CACG,OAAO;IACV,GAAG,0BAA0B,OAAO;KAClC,qBAAqB;KACrB,oBAAoB;KACpB,iBAAiB;IACnB,CAAC;IACD,GAAG,wBAAwB,OAAO,aAAa;GACjD,CAAC;EACH;EAEA,qBAAqB,OAAO;GAC1B,MAAM,aAAa,WAAW,MAAM,SAAS,UAAU;GACvD,IAAI,eAAe,KAAA,KAAa,CAAC,WAAW,IAAI,MAAM,MAAM,GAC1D;GAGF,MAAM,WAAW,WAAW,MAAM,SAAS,QAAQ,KAAK;GACxD,MAAM,OAAO,aAAa;IACxB,aAAa;IACb,WAAW;IACX;GACF,CAAC;GACD,UAAU,IAAI,YAAY,MAAM,QAAQ,UAAU,GAAG;IACnD,QAAQ,MAAM;IACd,UAAU;KACR,MAAM,KAAK;KACX,YAAY;MACV,GAAG,KAAK;MACR,GAAG,sBAAsB;OAAE,QAAQ,MAAM;OAAQ;MAAW,CAAC;MAC7D,GAAG,oBAAoB,MAAM,SAAS,OAAO,UAAU;MACvD,GAAG,sBAAsB,UAAU,MAAM,WAAW;KACtD;IACF;GACF,CAAC;EACH;EAEA,mBAAmB,OAAO;GACxB,MAAM,aAAa,WAAW,MAAM,SAAS,UAAU;GACvD,IAAI,eAAe,KAAA,GACjB;GAGF,MAAM,QAAQ,UAAU,IAAI,YAAY,MAAM,QAAQ,UAAU,CAAC;GACjE,IAAI,CAAC,OACH;GAGF,MAAM,OACJ,MAAM,QACN,gBAAgB,OAAO,SACrB,MAAM,SAAS,MACf,MAAM,SAAS,aACd,eAAe,UAClB;GACF,IAAI,MAAM,YAAY,SAAS,cAC7B,KAAK,KAAK,MAAM,WAAW,KAAK;QAEhC,KAAK,OAAO,qBAAqB,MAAM,YAAY,QAAQ,UAAU,CAAC;GAExE,UAAU,OAAO,YAAY,MAAM,QAAQ,UAAU,CAAC;EACxD;EAEA,QAAQ,OAAO;GACb,MAAM,QAAQ,EAAE,MAAM,aAAa;GACnC,qBACE,MAAM,QACN,OACA,YACA,gBAAgB,MAClB;GACA,oBACE,MAAM,QACN,OACA,WACA,gBAAgB,MAClB;GAEA,MAAM,QAAQ,WAAW,IAAI,MAAM,MAAM;GACzC,IAAI,CAAC,OACH;GAGF,MAAM,KAAK,KAAK,KAAK;GACrB,WAAW,OAAO,MAAM,MAAM;EAChC;EAEA,OAAO;EAEP,QAAQ,OAAO;GACb,MAAM,aAAa,YAAY,KAAK;GACpC,MAAM,SAAS,WAAW,WAAW,MAAM;GAC3C,IAAI,WAAW,KAAA,GACb;GAGF,MAAM,QAAQ,WAAW,SAAS;GAClC,qBAAqB,QAAQ,OAAO,YAAY,gBAAgB,MAAM;GACtE,oBAAoB,QAAQ,OAAO,WAAW,gBAAgB,MAAM;GAEpE,MAAM,QAAQ,WAAW,IAAI,MAAM;GACnC,IAAI,CAAC,OACH;GAGF,MAAM,KAAK,KAAK,KAAK;GACrB,WAAW,OAAO,MAAM;EAC1B;EAEA,yBACE,SACgB;GAEhB,MAAM,QADS,WAAW,IAAI,QAAQ,MACnB,CAAC,EAAE,MAAM,cAAc,UAAU,SAAS,KAAA,CAAS;GACtE,IAAI,CAAC,OACH,OAAO,QAAQ,QAAQ;GAGzB,OAAO,gBAAgB,OAAO,SAC5B,MAAM,SAAS,MACf,MAAM,SAAS,aACd,SAAS;IACR,MAAM,OAAO;IACb,IAAI;KACF,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CAAC,OACvC,UAAmB;MAClB,oBACE,MACA,uBAAuB,sBAAsB,KAAK,CAAC,CACrD;MACA,KAAK,KAAK,KAAK;MACf,iBAAiB,YAAY,QAAQ,QAAQ,KAAK;MAClD,MAAM;KACR,CACF;IACF,SAAS,OAAgB;KACvB,oBACE,MACA,uBAAuB,sBAAsB,KAAK,CAAC,CACrD;KACA,KAAK,KAAK,KAAK;KACf,iBAAiB,YAAY,QAAQ,QAAQ,KAAK;KAClD,MAAM;IACR;GACF,CACF;EACF;EAEA,YAAe,SAAuD;GACpE,MAAM,QAAQ,UAAU,IACtB,YAAY,QAAQ,QAAQ,QAAQ,UAAU,CAChD;GACA,IAAI,CAAC,OACH,OAAO,QAAQ,QAAQ;GAGzB,OAAO,gBAAgB,OAAO,SAC5B,MAAM,SAAS,MACf,MAAM,SAAS,aACd,SAAS;IACR,MAAM,OAAO;IACb,IAAI;KACF,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CAAC,OACvC,UAAmB;MAClB,KAAK,KAAK,KAAK;MACf,UAAU,OACR,YAAY,QAAQ,QAAQ,QAAQ,UAAU,CAChD;MACA,MAAM;KACR,CACF;IACF,SAAS,OAAgB;KACvB,KAAK,KAAK,KAAK;KACf,UAAU,OAAO,YAAY,QAAQ,QAAQ,QAAQ,UAAU,CAAC;KAChE,MAAM;IACR;GACF,CACF;EACF;CACF;AACF;AAEA,SAAS,uBACP,eACkC;CAClC,IACE,kBAAkB,oBAClB,kBAAkB,kBAClB,kBAAkB,kBAClB,kBAAkB,cAElB,OAAO;AAIX;AAEA,SAAS,kBAAkB,eAA8C;CACvE,OAAO,kBAAkB,kBAAkB,kBAAkB;AAC/D;AAEA,SAAS,eACP,eACA,QACwB;CACxB,MAAM,QAAQ,cAAc,IAAI,MAAM;CACtC,MAAM,OAAO,OAAO,MAAM;CAC1B,IAAI,SAAS,MAAM,WAAW,GAC5B,cAAc,OAAO,MAAM;CAG7B,OAAO;AACT;AAEA,SAAS,iBACP,gBACA,QACA,OACM;CACN,MAAM,SAAS,eAAe,IAAI,MAAM;CACxC,IAAI,CAAC,QACH;CAEF,MAAM,QAAQ,OAAO,QAAQ,KAAK;CAClC,IAAI,UAAU,IACZ,OAAO,OAAO,OAAO,CAAC;CAExB,IAAI,OAAO,WAAW,GACpB,eAAe,OAAO,MAAM;AAEhC;AAEA,SAAS,qBACP,QACA,OACA,eACA,QACM;CACN,MAAM,SAAS,cAAc,IAAI,MAAM;CACvC,IAAI,CAAC,QACH;CAGF,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OACJ,MAAM,QACN,OAAO,SACL,MAAM,SAAS,MACf,MAAM,SAAS,aACd,eAAe,UAClB;EACF,IAAI,UAAU,KAAA,GACZ,KAAK,OAAO;OAEZ,KAAK,KAAK,KAAK;CAEnB;CACA,cAAc,OAAO,MAAM;AAC7B;AAEA,SAAS,oBACP,QACA,OACA,mBACA,QACM;CACN,KAAK,MAAM,CAAC,YAAY,UAAU,mBAAmB;EACnD,IAAI,MAAM,WAAW,QACnB;EAGF,MAAM,OACJ,MAAM,QACN,OAAO,SACL,MAAM,SAAS,MACf,MAAM,SAAS,aACd,eAAe,UAClB;EACF,IAAI,UAAU,KAAA,GACZ,KAAK,OAAO;OAEZ,KAAK,KAAK,KAAK;EAEjB,kBAAkB,OAAO,UAAU;CACrC;AACF;AAEA,SAAS,YAAY,OAAyC;CAC5D,OAAO,OAAO,UAAU,YAAY,UAAU,OACzC,QACD,CAAC;AACP;AAEA,MAAM,wCAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,yBACP,qBACiB;CACjB,MAAM,aAAwD,CAAC;CAC/D,MAAM,iBAAiB,YAAY,mBAAmB;CACtD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,kBAAkB,CAAC,CAAC,GAC5D,IAAI,CAAC,sBAAsB,IAAI,GAAG,KAAK,uBAAuB,KAAK,GACjE,WACE,IAAI,WAAW,oBAAoB,IAC/B,MACA,qCAAqC,SACvC;CAIR,OAAO;AACT;AAEA,SAAS,sBACP,UACA,kBACiB;CACjB,MAAM,aAAwD,CAAC;CAC/D,MAAM,cAAc,YAAY,gBAAgB;CAChD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,eAAe,CAAC,CAAC,GACzD,IAAI,uBAAuB,KAAK,GAC9B,WAAW,kCAAkC,SAAS,GAAG,SAAS;CAItE,OAAO;AACT;AAEA,SAAS,YAAY,OAAqD;CACxE,OAAO,OAAO,UAAU,YAAY,UAAU,OACzC,QACD,KAAA;AACN;AAEA,SAAS,uBACP,OACoC;CACpC,OACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU;AAErB;;;AChgBA,MAAM,4BAA4B,OAAO,IACvC,oCACF;;;;AAKA,SAAgB,UACd,IACA,UAAuC,CAAC,GACrC;CACH,OAAO,qBAAqB,IAAI;EAC9B;EACA;CACF,CAAC;AACH;;;;;AAMA,SAAgB,qBACd,UAA+B,CAAC,GACd;CAClB,MAAM,YAAY,uBAAuB;EAAE;EAAS;CAAO,CAAC;CAC5D,OAAO,eAAe,WAAW,2BAA2B,EAAE,OAAO,KAAK,CAAC;CAC3E,OAAO;AACT"}
|
package/dist/react.d.ts
CHANGED
|
@@ -75,6 +75,12 @@ declare function isErrorRetryable(err: unknown): boolean;
|
|
|
75
75
|
* invocation, which runs the new code and succeeds.
|
|
76
76
|
*/
|
|
77
77
|
declare function isDurableObjectCodeUpdateReset(error: unknown): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Whether an error (or anything in its `cause` chain) carries the exact
|
|
80
|
+
* Durable Object storage-reset platform fragment. Generic SQL/internal errors
|
|
81
|
+
* deliberately do not qualify.
|
|
82
|
+
*/
|
|
83
|
+
declare function isDurableObjectStorageReset(error: unknown): boolean;
|
|
78
84
|
/**
|
|
79
85
|
* Whether an error (or anything in its `cause` chain, or a raw error-message
|
|
80
86
|
* string) is a Durable Object memory-limit reset — see
|
|
@@ -95,7 +101,9 @@ declare function isDurableObjectMemoryLimitReset(error: unknown): boolean;
|
|
|
95
101
|
* - "Network connection lost." — the storage/stub connection dropped. The
|
|
96
102
|
* CF `retryable` flag does not survive error wrappers (e.g. `SqlError`
|
|
97
103
|
* copies only the message + `cause`) and is absent in some local-dev
|
|
98
|
-
* shapes, so the verbatim message is matched as well
|
|
104
|
+
* shapes, so the verbatim message is matched as well;
|
|
105
|
+
* - the exact "Internal error in Durable Object storage caused object to be
|
|
106
|
+
* reset" platform fragment. Generic internal and SQL errors remain fatal.
|
|
99
107
|
*
|
|
100
108
|
* Used to decide whether failed work should be RE-RUN LATER (platform
|
|
101
109
|
* transient — the same work succeeds once the platform recovers, typically
|
|
@@ -106,13 +114,14 @@ declare function isDurableObjectMemoryLimitReset(error: unknown): boolean;
|
|
|
106
114
|
declare function isPlatformTransientError(error: unknown): boolean;
|
|
107
115
|
//#endregion
|
|
108
116
|
export {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
117
|
+
isErrorRetryable as a,
|
|
118
|
+
tryN as c,
|
|
119
|
+
isDurableObjectStorageReset as i,
|
|
120
|
+
validateRetryOptions as l,
|
|
112
121
|
isDurableObjectCodeUpdateReset as n,
|
|
113
|
-
|
|
122
|
+
isPlatformTransientError as o,
|
|
114
123
|
isDurableObjectMemoryLimitReset as r,
|
|
115
|
-
|
|
124
|
+
jitterBackoff as s,
|
|
116
125
|
RetryOptions as t
|
|
117
126
|
};
|
|
118
|
-
//# sourceMappingURL=retries-
|
|
127
|
+
//# sourceMappingURL=retries-CAvxtG9d.d.ts.map
|
package/dist/retries.d.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
|
-
a as
|
|
3
|
-
c as
|
|
4
|
-
i as
|
|
2
|
+
a as isErrorRetryable,
|
|
3
|
+
c as tryN,
|
|
4
|
+
i as isDurableObjectStorageReset,
|
|
5
|
+
l as validateRetryOptions,
|
|
5
6
|
n as isDurableObjectCodeUpdateReset,
|
|
6
|
-
o as
|
|
7
|
+
o as isPlatformTransientError,
|
|
7
8
|
r as isDurableObjectMemoryLimitReset,
|
|
8
|
-
s as
|
|
9
|
+
s as jitterBackoff,
|
|
9
10
|
t as RetryOptions
|
|
10
|
-
} from "./retries-
|
|
11
|
+
} from "./retries-CAvxtG9d.js";
|
|
11
12
|
export {
|
|
12
13
|
RetryOptions,
|
|
13
14
|
isDurableObjectCodeUpdateReset,
|
|
14
15
|
isDurableObjectMemoryLimitReset,
|
|
16
|
+
isDurableObjectStorageReset,
|
|
15
17
|
isErrorRetryable,
|
|
16
18
|
isPlatformTransientError,
|
|
17
19
|
jitterBackoff,
|
package/dist/retries.js
CHANGED
|
@@ -108,6 +108,12 @@ const SUPERSEDED_ISOLATE_PATTERN = /reset because its code was updated|this scri
|
|
|
108
108
|
*/
|
|
109
109
|
const CONNECTION_LOST_PATTERN = /network connection lost/i;
|
|
110
110
|
/**
|
|
111
|
+
* The exact Durable Object storage-reset platform signal. Keep this narrow:
|
|
112
|
+
* ordinary SQL and generic internal errors are application failures. This is a
|
|
113
|
+
* transient storage reset, not a memory-limit poison pill.
|
|
114
|
+
*/
|
|
115
|
+
const STORAGE_RESET_PATTERN = /Internal error in Durable Object storage caused object to be reset/i;
|
|
116
|
+
/**
|
|
111
117
|
* The Durable Object memory-limit reset — the isolate exceeded its 128 MB limit
|
|
112
118
|
* and was reset by the platform (workerd surfaces this verbatim as
|
|
113
119
|
* "Durable Object's isolate exceeded its memory limit and was reset."; the D1
|
|
@@ -166,6 +172,15 @@ function isDurableObjectCodeUpdateReset(error) {
|
|
|
166
172
|
return false;
|
|
167
173
|
}
|
|
168
174
|
/**
|
|
175
|
+
* Whether an error (or anything in its `cause` chain) carries the exact
|
|
176
|
+
* Durable Object storage-reset platform fragment. Generic SQL/internal errors
|
|
177
|
+
* deliberately do not qualify.
|
|
178
|
+
*/
|
|
179
|
+
function isDurableObjectStorageReset(error) {
|
|
180
|
+
for (const e of selfAndCauses(error)) if (STORAGE_RESET_PATTERN.test(errorMessageOf(e))) return true;
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
169
184
|
* Whether an error (or anything in its `cause` chain, or a raw error-message
|
|
170
185
|
* string) is a Durable Object memory-limit reset — see
|
|
171
186
|
* {@link MEMORY_LIMIT_RESET_PATTERN}. Unlike {@link isPlatformTransientError},
|
|
@@ -188,7 +203,9 @@ function isDurableObjectMemoryLimitReset(error) {
|
|
|
188
203
|
* - "Network connection lost." — the storage/stub connection dropped. The
|
|
189
204
|
* CF `retryable` flag does not survive error wrappers (e.g. `SqlError`
|
|
190
205
|
* copies only the message + `cause`) and is absent in some local-dev
|
|
191
|
-
* shapes, so the verbatim message is matched as well
|
|
206
|
+
* shapes, so the verbatim message is matched as well;
|
|
207
|
+
* - the exact "Internal error in Durable Object storage caused object to be
|
|
208
|
+
* reset" platform fragment. Generic internal and SQL errors remain fatal.
|
|
192
209
|
*
|
|
193
210
|
* Used to decide whether failed work should be RE-RUN LATER (platform
|
|
194
211
|
* transient — the same work succeeds once the platform recovers, typically
|
|
@@ -201,11 +218,12 @@ function isPlatformTransientError(error) {
|
|
|
201
218
|
const message = errorMessageOf(e);
|
|
202
219
|
if (SUPERSEDED_ISOLATE_PATTERN.test(message)) return true;
|
|
203
220
|
if (CONNECTION_LOST_PATTERN.test(message)) return true;
|
|
221
|
+
if (STORAGE_RESET_PATTERN.test(message)) return true;
|
|
204
222
|
if (isErrorRetryable(e)) return true;
|
|
205
223
|
}
|
|
206
224
|
return false;
|
|
207
225
|
}
|
|
208
226
|
//#endregion
|
|
209
|
-
export { isDurableObjectCodeUpdateReset, isDurableObjectMemoryLimitReset, isErrorRetryable, isPlatformTransientError, jitterBackoff, tryN, validateRetryOptions };
|
|
227
|
+
export { isDurableObjectCodeUpdateReset, isDurableObjectMemoryLimitReset, isDurableObjectStorageReset, isErrorRetryable, isPlatformTransientError, jitterBackoff, tryN, validateRetryOptions };
|
|
210
228
|
|
|
211
229
|
//# sourceMappingURL=retries.js.map
|
package/dist/retries.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retries.js","names":[],"sources":["../src/retries.ts"],"sourcesContent":["/**\n * Retry options for schedule(), scheduleEvery(), queue(), and this.retry().\n */\nexport interface RetryOptions {\n /** Max number of attempts (including the first). Default: 3 */\n maxAttempts?: number;\n /** Base delay in ms for exponential backoff. Default: 100 */\n baseDelayMs?: number;\n /** Max delay cap in ms. Default: 3000 */\n maxDelayMs?: number;\n}\n\n/**\n * Internal options for tryN -- extends RetryOptions with a shouldRetry predicate.\n */\ninterface TryNOptions extends RetryOptions {\n /**\n * Predicate to determine if an error should be retried.\n * Receives the error and the next attempt number (so callers can\n * make attempt-aware decisions).\n * If not provided, all errors are retried.\n */\n shouldRetry?: (err: unknown, nextAttempt: number) => boolean;\n}\n\n/**\n * Validate retry options eagerly so invalid config fails at enqueue/schedule time\n * rather than at execution time. Checks individual field ranges, enforces integer\n * maxAttempts, and validates cross-field constraints after resolving against\n * defaults when provided.\n */\nexport function validateRetryOptions(\n options: RetryOptions,\n defaults?: Required<RetryOptions>\n): void {\n if (options.maxAttempts !== undefined) {\n if (!Number.isFinite(options.maxAttempts) || options.maxAttempts < 1) {\n throw new Error(\"retry.maxAttempts must be >= 1\");\n }\n if (!Number.isInteger(options.maxAttempts)) {\n throw new Error(\"retry.maxAttempts must be an integer\");\n }\n }\n if (options.baseDelayMs !== undefined) {\n if (!Number.isFinite(options.baseDelayMs) || options.baseDelayMs <= 0) {\n throw new Error(\"retry.baseDelayMs must be > 0\");\n }\n }\n if (options.maxDelayMs !== undefined) {\n if (!Number.isFinite(options.maxDelayMs) || options.maxDelayMs <= 0) {\n throw new Error(\"retry.maxDelayMs must be > 0\");\n }\n }\n\n // Resolve against defaults (when provided) so that cross-field checks\n // catch e.g. { baseDelayMs: 5000 } against default maxDelayMs: 3000.\n const resolvedBase = options.baseDelayMs ?? defaults?.baseDelayMs;\n const resolvedMax = options.maxDelayMs ?? defaults?.maxDelayMs;\n if (\n resolvedBase !== undefined &&\n resolvedMax !== undefined &&\n resolvedBase > resolvedMax\n ) {\n throw new Error(\"retry.baseDelayMs must be <= retry.maxDelayMs\");\n }\n}\n\n/**\n * Returns the number of milliseconds to wait before retrying a request.\n * Uses the \"Full Jitter\" approach from\n * https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/\n *\n * @param attempt The current attempt number (1-indexed).\n * @param baseDelayMs Base delay multiplier in ms.\n * @param maxDelayMs Maximum delay cap in ms.\n * @returns Milliseconds to wait before retrying.\n */\nexport function jitterBackoff(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const upperBoundMs = Math.min(2 ** attempt * baseDelayMs, maxDelayMs);\n return Math.floor(Math.random() * upperBoundMs);\n}\n\n/**\n * Retry an async function up to `n` total attempts with jittered exponential backoff.\n *\n * @param n Total number of attempts (must be a finite integer >= 1).\n * @param fn The async function to retry. Receives the current attempt number (1-indexed).\n * @param options Retry configuration.\n * @returns The result of `fn` on success.\n * @throws The last error if all attempts fail or `shouldRetry` returns false.\n */\nexport async function tryN<T>(\n n: number,\n fn: (attempt: number) => Promise<T>,\n options?: TryNOptions\n): Promise<T> {\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(\"retry.maxAttempts must be >= 1\");\n }\n n = Math.floor(n);\n\n const rawBase = options?.baseDelayMs ?? 100;\n const rawMax = options?.maxDelayMs ?? 3000;\n\n if (!Number.isFinite(rawBase) || rawBase <= 0) {\n throw new Error(\"retry.baseDelayMs must be > 0\");\n }\n if (!Number.isFinite(rawMax) || rawMax <= 0) {\n throw new Error(\"retry.maxDelayMs must be > 0\");\n }\n\n const baseDelayMs = Math.floor(rawBase);\n const maxDelayMs = Math.floor(rawMax);\n\n if (baseDelayMs > maxDelayMs) {\n throw new Error(\"retry.baseDelayMs must be <= retry.maxDelayMs\");\n }\n\n let attempt = 1;\n while (true) {\n try {\n return await fn(attempt);\n } catch (err) {\n const nextAttempt = attempt + 1;\n if (\n nextAttempt > n ||\n (options?.shouldRetry && !options.shouldRetry(err, nextAttempt))\n ) {\n throw err;\n }\n const delay = jitterBackoff(attempt, baseDelayMs, maxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delay));\n attempt = nextAttempt;\n }\n }\n}\n\n/**\n * Returns true if the given error is retryable according to Durable Object error handling.\n * See https://developers.cloudflare.com/durable-objects/best-practices/error-handling/\n *\n * An error is retryable if it has `retryable: true` but is NOT an overloaded error.\n */\nexport function isErrorRetryable(err: unknown): boolean {\n if (typeof err !== \"object\" || err === null) {\n return false;\n }\n const msg = String(err);\n const typed = err as { retryable?: boolean; overloaded?: boolean };\n return (\n Boolean(typed.retryable) &&\n !typed.overloaded &&\n !msg.includes(\"Durable Object is overloaded\")\n );\n}\n\n/**\n * The \"superseded isolate\" platform messages — the invocation is running on an\n * isolate the platform has replaced with a new version (a deploy / code\n * update). For the rest of that invocation every operation throws the same\n * error (code never reloads mid-invocation), so in-process retries are futile;\n * but the next fresh invocation runs the new code and succeeds.\n *\n * workerd surfaces this as a plain `Error` with one of a few messages, all the\n * same failure class — a message match is the only signal:\n * - \"Durable Object reset because its code was updated.\" (DO storage op on a\n * superseded isolate / deploy bounce)\n * - \"This script has been upgraded. Please send a new request to connect to\n * the new version.\" (a stub/connection to a superseded script; the message\n * literally instructs the caller to retry on the new version)\n *\n * The match stays close to the verbatim platform strings (rather than a loose\n * \"upgraded\"/\"reset\" substring) so an ordinary application error that happens\n * to mention those words is NOT misclassified as a supersede.\n */\nconst SUPERSEDED_ISOLATE_PATTERN =\n /reset because its code was updated|this script has been upgraded/i;\n\n/**\n * The \"Network connection lost.\" platform transient — the connection between\n * the isolate and its storage (or another DO) dropped. Unlike a supersede this\n * MAY succeed on an in-process retry (a momentary blip), so it must not skip\n * the in-process retry budget — but during a deploy-reset window it never\n * succeeds in-process and surfaces interleaved with the supersede messages\n * (SQL ops throw `SqlError: SQL query failed: Network connection lost.` while\n * KV ops throw the reset message), so on retry exhaustion it must be treated\n * as the platform's failure, not the callback's.\n */\nconst CONNECTION_LOST_PATTERN = /network connection lost/i;\n\n/**\n * The Durable Object memory-limit reset — the isolate exceeded its 128 MB limit\n * and was reset by the platform (workerd surfaces this verbatim as\n * \"Durable Object's isolate exceeded its memory limit and was reset.\"; the D1\n * sibling is \"D1 DB's isolate exceeded its memory limit and was reset.\").\n *\n * The match is the broad shared fragment \"exceeded its memory limit\" rather than\n * the full \"...and was reset\" sentence: real-world surfacings truncate or reword\n * the tail (some log pipelines clip the message; D1/storage wrappers re-prefix\n * it), and a customer-reported loop (#1825) showed lines carrying only the\n * \"exceeded its memory limit\" fragment. Missing a surfacing here means the\n * circuit breaker never engages, so we err toward the broader match — and even a\n * false positive is fail-safe (a tightly-bounded retry-then-seal, not data loss).\n *\n * This is DELIBERATELY a separate class from `SUPERSEDED_ISOLATE_PATTERN` /\n * {@link isPlatformTransientError}, and is NOT folded into them. A supersede or\n * connection-lost transient means \"re-run the same work and it succeeds on a\n * healthy isolate\" — those classes can be deferred and retried *indefinitely*. A\n * memory-limit reset is the opposite: re-running the SAME memory-heavy work\n * deterministically re-OOMs (the footprint, not the platform, is the cause), so\n * deferring it indefinitely would PRESERVE the one-shot row and re-run the\n * doomed work forever (amplifying the loop and cost — see #1825). It is a\n * poison-pill signal: callers must bound retries tightly and then SEAL.\n *\n * Accordingly the schedule executor (`_executeScheduleCallback`) and the\n * alarm-boundary circuit breaker (`Agent.alarm`) treat it as its OWN class: a\n * memory-limit reset is re-thrown (row preserved) so it reaches the breaker,\n * which tolerates a few strikes (`maxAlarmMemoryLimitStrikes`) and then seals +\n * purges the looping row — i.e. *bounded* deferral, never the unbounded deferral\n * the transient classes get.\n */\nconst MEMORY_LIMIT_RESET_PATTERN = /exceeded its memory limit/i;\n\nfunction errorMessageOf(error: unknown): string {\n return error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"\";\n}\n\n/**\n * Iterate an error and its `cause` chain (depth-limited so a cyclic chain\n * can't spin). Wrappers like `SqlError` carry the original platform error in\n * `cause` and may not propagate signal properties (e.g. the CF `retryable`\n * flag), so classification must look through them.\n */\nfunction* selfAndCauses(error: unknown): Generator<unknown> {\n let current = error;\n for (let depth = 0; depth < 8 && current != null; depth++) {\n yield current;\n current =\n typeof current === \"object\"\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n}\n\n/**\n * Whether an error (or anything in its `cause` chain) is a transient\n * \"superseded isolate\" failure — see `SUPERSEDED_ISOLATE_PATTERN`. In-process\n * retries are futile for this class; the work must be deferred to a fresh\n * invocation, which runs the new code and succeeds.\n */\nexport function isDurableObjectCodeUpdateReset(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n if (SUPERSEDED_ISOLATE_PATTERN.test(errorMessageOf(e))) return true;\n }\n return false;\n}\n\n/**\n * Whether an error (or anything in its `cause` chain, or a raw error-message\n * string) is a Durable Object memory-limit reset — see\n * {@link MEMORY_LIMIT_RESET_PATTERN}. Unlike {@link isPlatformTransientError},\n * re-running the same work re-OOMs deterministically, so callers must NOT defer\n * it like a transient; they should bound retries tightly and then seal (#1825).\n */\nexport function isDurableObjectMemoryLimitReset(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n if (MEMORY_LIMIT_RESET_PATTERN.test(errorMessageOf(e))) return true;\n }\n return false;\n}\n\n/**\n * Whether an error (or anything in its `cause` chain) is a transient failure\n * of the PLATFORM rather than of the code that threw it:\n *\n * - a superseded-isolate reset (\"reset because its code was updated\" /\n * \"this script has been upgraded\") — a deploy replaced the isolate;\n * - an error the platform itself flags `retryable: true` (excluding\n * overloaded errors, where retrying the same object won't help) — see\n * `isErrorRetryable`;\n * - \"Network connection lost.\" — the storage/stub connection dropped. The\n * CF `retryable` flag does not survive error wrappers (e.g. `SqlError`\n * copies only the message + `cause`) and is absent in some local-dev\n * shapes, so the verbatim message is matched as well.\n *\n * Used to decide whether failed work should be RE-RUN LATER (platform\n * transient — the same work succeeds once the platform recovers, typically\n * seconds after a deploy) versus ABANDONED as genuinely failing (application\n * error — re-running yields the same failure). A genuine application error\n * carries none of these signals, so it is never misclassified by this check.\n */\nexport function isPlatformTransientError(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n const message = errorMessageOf(e);\n if (SUPERSEDED_ISOLATE_PATTERN.test(message)) return true;\n if (CONNECTION_LOST_PATTERN.test(message)) return true;\n if (isErrorRetryable(e)) return true;\n }\n return false;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"retries.js","names":[],"sources":["../src/retries.ts"],"sourcesContent":["/**\n * Retry options for schedule(), scheduleEvery(), queue(), and this.retry().\n */\nexport interface RetryOptions {\n /** Max number of attempts (including the first). Default: 3 */\n maxAttempts?: number;\n /** Base delay in ms for exponential backoff. Default: 100 */\n baseDelayMs?: number;\n /** Max delay cap in ms. Default: 3000 */\n maxDelayMs?: number;\n}\n\n/**\n * Internal options for tryN -- extends RetryOptions with a shouldRetry predicate.\n */\ninterface TryNOptions extends RetryOptions {\n /**\n * Predicate to determine if an error should be retried.\n * Receives the error and the next attempt number (so callers can\n * make attempt-aware decisions).\n * If not provided, all errors are retried.\n */\n shouldRetry?: (err: unknown, nextAttempt: number) => boolean;\n}\n\n/**\n * Validate retry options eagerly so invalid config fails at enqueue/schedule time\n * rather than at execution time. Checks individual field ranges, enforces integer\n * maxAttempts, and validates cross-field constraints after resolving against\n * defaults when provided.\n */\nexport function validateRetryOptions(\n options: RetryOptions,\n defaults?: Required<RetryOptions>\n): void {\n if (options.maxAttempts !== undefined) {\n if (!Number.isFinite(options.maxAttempts) || options.maxAttempts < 1) {\n throw new Error(\"retry.maxAttempts must be >= 1\");\n }\n if (!Number.isInteger(options.maxAttempts)) {\n throw new Error(\"retry.maxAttempts must be an integer\");\n }\n }\n if (options.baseDelayMs !== undefined) {\n if (!Number.isFinite(options.baseDelayMs) || options.baseDelayMs <= 0) {\n throw new Error(\"retry.baseDelayMs must be > 0\");\n }\n }\n if (options.maxDelayMs !== undefined) {\n if (!Number.isFinite(options.maxDelayMs) || options.maxDelayMs <= 0) {\n throw new Error(\"retry.maxDelayMs must be > 0\");\n }\n }\n\n // Resolve against defaults (when provided) so that cross-field checks\n // catch e.g. { baseDelayMs: 5000 } against default maxDelayMs: 3000.\n const resolvedBase = options.baseDelayMs ?? defaults?.baseDelayMs;\n const resolvedMax = options.maxDelayMs ?? defaults?.maxDelayMs;\n if (\n resolvedBase !== undefined &&\n resolvedMax !== undefined &&\n resolvedBase > resolvedMax\n ) {\n throw new Error(\"retry.baseDelayMs must be <= retry.maxDelayMs\");\n }\n}\n\n/**\n * Returns the number of milliseconds to wait before retrying a request.\n * Uses the \"Full Jitter\" approach from\n * https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/\n *\n * @param attempt The current attempt number (1-indexed).\n * @param baseDelayMs Base delay multiplier in ms.\n * @param maxDelayMs Maximum delay cap in ms.\n * @returns Milliseconds to wait before retrying.\n */\nexport function jitterBackoff(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const upperBoundMs = Math.min(2 ** attempt * baseDelayMs, maxDelayMs);\n return Math.floor(Math.random() * upperBoundMs);\n}\n\n/**\n * Retry an async function up to `n` total attempts with jittered exponential backoff.\n *\n * @param n Total number of attempts (must be a finite integer >= 1).\n * @param fn The async function to retry. Receives the current attempt number (1-indexed).\n * @param options Retry configuration.\n * @returns The result of `fn` on success.\n * @throws The last error if all attempts fail or `shouldRetry` returns false.\n */\nexport async function tryN<T>(\n n: number,\n fn: (attempt: number) => Promise<T>,\n options?: TryNOptions\n): Promise<T> {\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(\"retry.maxAttempts must be >= 1\");\n }\n n = Math.floor(n);\n\n const rawBase = options?.baseDelayMs ?? 100;\n const rawMax = options?.maxDelayMs ?? 3000;\n\n if (!Number.isFinite(rawBase) || rawBase <= 0) {\n throw new Error(\"retry.baseDelayMs must be > 0\");\n }\n if (!Number.isFinite(rawMax) || rawMax <= 0) {\n throw new Error(\"retry.maxDelayMs must be > 0\");\n }\n\n const baseDelayMs = Math.floor(rawBase);\n const maxDelayMs = Math.floor(rawMax);\n\n if (baseDelayMs > maxDelayMs) {\n throw new Error(\"retry.baseDelayMs must be <= retry.maxDelayMs\");\n }\n\n let attempt = 1;\n while (true) {\n try {\n return await fn(attempt);\n } catch (err) {\n const nextAttempt = attempt + 1;\n if (\n nextAttempt > n ||\n (options?.shouldRetry && !options.shouldRetry(err, nextAttempt))\n ) {\n throw err;\n }\n const delay = jitterBackoff(attempt, baseDelayMs, maxDelayMs);\n await new Promise((resolve) => setTimeout(resolve, delay));\n attempt = nextAttempt;\n }\n }\n}\n\n/**\n * Returns true if the given error is retryable according to Durable Object error handling.\n * See https://developers.cloudflare.com/durable-objects/best-practices/error-handling/\n *\n * An error is retryable if it has `retryable: true` but is NOT an overloaded error.\n */\nexport function isErrorRetryable(err: unknown): boolean {\n if (typeof err !== \"object\" || err === null) {\n return false;\n }\n const msg = String(err);\n const typed = err as { retryable?: boolean; overloaded?: boolean };\n return (\n Boolean(typed.retryable) &&\n !typed.overloaded &&\n !msg.includes(\"Durable Object is overloaded\")\n );\n}\n\n/**\n * The \"superseded isolate\" platform messages — the invocation is running on an\n * isolate the platform has replaced with a new version (a deploy / code\n * update). For the rest of that invocation every operation throws the same\n * error (code never reloads mid-invocation), so in-process retries are futile;\n * but the next fresh invocation runs the new code and succeeds.\n *\n * workerd surfaces this as a plain `Error` with one of a few messages, all the\n * same failure class — a message match is the only signal:\n * - \"Durable Object reset because its code was updated.\" (DO storage op on a\n * superseded isolate / deploy bounce)\n * - \"This script has been upgraded. Please send a new request to connect to\n * the new version.\" (a stub/connection to a superseded script; the message\n * literally instructs the caller to retry on the new version)\n *\n * The match stays close to the verbatim platform strings (rather than a loose\n * \"upgraded\"/\"reset\" substring) so an ordinary application error that happens\n * to mention those words is NOT misclassified as a supersede.\n */\nconst SUPERSEDED_ISOLATE_PATTERN =\n /reset because its code was updated|this script has been upgraded/i;\n\n/**\n * The \"Network connection lost.\" platform transient — the connection between\n * the isolate and its storage (or another DO) dropped. Unlike a supersede this\n * MAY succeed on an in-process retry (a momentary blip), so it must not skip\n * the in-process retry budget — but during a deploy-reset window it never\n * succeeds in-process and surfaces interleaved with the supersede messages\n * (SQL ops throw `SqlError: SQL query failed: Network connection lost.` while\n * KV ops throw the reset message), so on retry exhaustion it must be treated\n * as the platform's failure, not the callback's.\n */\nconst CONNECTION_LOST_PATTERN = /network connection lost/i;\n\n/**\n * The exact Durable Object storage-reset platform signal. Keep this narrow:\n * ordinary SQL and generic internal errors are application failures. This is a\n * transient storage reset, not a memory-limit poison pill.\n */\nconst STORAGE_RESET_PATTERN =\n /Internal error in Durable Object storage caused object to be reset/i;\n\n/**\n * The Durable Object memory-limit reset — the isolate exceeded its 128 MB limit\n * and was reset by the platform (workerd surfaces this verbatim as\n * \"Durable Object's isolate exceeded its memory limit and was reset.\"; the D1\n * sibling is \"D1 DB's isolate exceeded its memory limit and was reset.\").\n *\n * The match is the broad shared fragment \"exceeded its memory limit\" rather than\n * the full \"...and was reset\" sentence: real-world surfacings truncate or reword\n * the tail (some log pipelines clip the message; D1/storage wrappers re-prefix\n * it), and a customer-reported loop (#1825) showed lines carrying only the\n * \"exceeded its memory limit\" fragment. Missing a surfacing here means the\n * circuit breaker never engages, so we err toward the broader match — and even a\n * false positive is fail-safe (a tightly-bounded retry-then-seal, not data loss).\n *\n * This is DELIBERATELY a separate class from `SUPERSEDED_ISOLATE_PATTERN` /\n * {@link isPlatformTransientError}, and is NOT folded into them. A supersede or\n * connection-lost transient means \"re-run the same work and it succeeds on a\n * healthy isolate\" — those classes can be deferred and retried *indefinitely*. A\n * memory-limit reset is the opposite: re-running the SAME memory-heavy work\n * deterministically re-OOMs (the footprint, not the platform, is the cause), so\n * deferring it indefinitely would PRESERVE the one-shot row and re-run the\n * doomed work forever (amplifying the loop and cost — see #1825). It is a\n * poison-pill signal: callers must bound retries tightly and then SEAL.\n *\n * Accordingly the schedule executor (`_executeScheduleCallback`) and the\n * alarm-boundary circuit breaker (`Agent.alarm`) treat it as its OWN class: a\n * memory-limit reset is re-thrown (row preserved) so it reaches the breaker,\n * which tolerates a few strikes (`maxAlarmMemoryLimitStrikes`) and then seals +\n * purges the looping row — i.e. *bounded* deferral, never the unbounded deferral\n * the transient classes get.\n */\nconst MEMORY_LIMIT_RESET_PATTERN = /exceeded its memory limit/i;\n\nfunction errorMessageOf(error: unknown): string {\n return error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"\";\n}\n\n/**\n * Iterate an error and its `cause` chain (depth-limited so a cyclic chain\n * can't spin). Wrappers like `SqlError` carry the original platform error in\n * `cause` and may not propagate signal properties (e.g. the CF `retryable`\n * flag), so classification must look through them.\n */\nfunction* selfAndCauses(error: unknown): Generator<unknown> {\n let current = error;\n for (let depth = 0; depth < 8 && current != null; depth++) {\n yield current;\n current =\n typeof current === \"object\"\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n}\n\n/**\n * Whether an error (or anything in its `cause` chain) is a transient\n * \"superseded isolate\" failure — see `SUPERSEDED_ISOLATE_PATTERN`. In-process\n * retries are futile for this class; the work must be deferred to a fresh\n * invocation, which runs the new code and succeeds.\n */\nexport function isDurableObjectCodeUpdateReset(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n if (SUPERSEDED_ISOLATE_PATTERN.test(errorMessageOf(e))) return true;\n }\n return false;\n}\n\n/**\n * Whether an error (or anything in its `cause` chain) carries the exact\n * Durable Object storage-reset platform fragment. Generic SQL/internal errors\n * deliberately do not qualify.\n */\nexport function isDurableObjectStorageReset(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n if (STORAGE_RESET_PATTERN.test(errorMessageOf(e))) return true;\n }\n return false;\n}\n\n/**\n * Whether an error (or anything in its `cause` chain, or a raw error-message\n * string) is a Durable Object memory-limit reset — see\n * {@link MEMORY_LIMIT_RESET_PATTERN}. Unlike {@link isPlatformTransientError},\n * re-running the same work re-OOMs deterministically, so callers must NOT defer\n * it like a transient; they should bound retries tightly and then seal (#1825).\n */\nexport function isDurableObjectMemoryLimitReset(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n if (MEMORY_LIMIT_RESET_PATTERN.test(errorMessageOf(e))) return true;\n }\n return false;\n}\n\n/**\n * Whether an error (or anything in its `cause` chain) is a transient failure\n * of the PLATFORM rather than of the code that threw it:\n *\n * - a superseded-isolate reset (\"reset because its code was updated\" /\n * \"this script has been upgraded\") — a deploy replaced the isolate;\n * - an error the platform itself flags `retryable: true` (excluding\n * overloaded errors, where retrying the same object won't help) — see\n * `isErrorRetryable`;\n * - \"Network connection lost.\" — the storage/stub connection dropped. The\n * CF `retryable` flag does not survive error wrappers (e.g. `SqlError`\n * copies only the message + `cause`) and is absent in some local-dev\n * shapes, so the verbatim message is matched as well;\n * - the exact \"Internal error in Durable Object storage caused object to be\n * reset\" platform fragment. Generic internal and SQL errors remain fatal.\n *\n * Used to decide whether failed work should be RE-RUN LATER (platform\n * transient — the same work succeeds once the platform recovers, typically\n * seconds after a deploy) versus ABANDONED as genuinely failing (application\n * error — re-running yields the same failure). A genuine application error\n * carries none of these signals, so it is never misclassified by this check.\n */\nexport function isPlatformTransientError(error: unknown): boolean {\n for (const e of selfAndCauses(error)) {\n const message = errorMessageOf(e);\n if (SUPERSEDED_ISOLATE_PATTERN.test(message)) return true;\n if (CONNECTION_LOST_PATTERN.test(message)) return true;\n if (STORAGE_RESET_PATTERN.test(message)) return true;\n if (isErrorRetryable(e)) return true;\n }\n return false;\n}\n"],"mappings":"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"}
|
package/dist/serializable.d.ts
CHANGED