@standardagents/openai 0.14.1 → 0.15.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/index.js CHANGED
@@ -197,22 +197,43 @@ ${msg.content}` : msg.content;
197
197
  }
198
198
  return { input, instructions };
199
199
  }
200
+ function isRecord(value) {
201
+ return typeof value === "object" && value !== null && !Array.isArray(value);
202
+ }
203
+ function isObjectJsonSchema(schema) {
204
+ const type = schema.type;
205
+ return type === "object" || Array.isArray(type) && type.includes("object");
206
+ }
207
+ function normalizeStrictFunctionSchema(value) {
208
+ if (Array.isArray(value)) {
209
+ return value.map((item) => normalizeStrictFunctionSchema(item));
210
+ }
211
+ if (!isRecord(value)) {
212
+ return value;
213
+ }
214
+ const normalized = {};
215
+ for (const [key, child] of Object.entries(value)) {
216
+ normalized[key] = normalizeStrictFunctionSchema(child);
217
+ }
218
+ if (isObjectJsonSchema(normalized)) {
219
+ const properties = isRecord(normalized.properties) ? normalized.properties : {};
220
+ normalized.properties = properties;
221
+ normalized.required = Object.keys(properties);
222
+ normalized.additionalProperties = false;
223
+ }
224
+ return normalized;
225
+ }
226
+ function normalizeStrictFunctionParameters(inputParams) {
227
+ const schema = isRecord(inputParams) ? inputParams : {
228
+ type: "object",
229
+ properties: {}
230
+ };
231
+ const normalized = normalizeStrictFunctionSchema(schema);
232
+ return isRecord(normalized) ? normalized : { type: "object", properties: {}, required: [], additionalProperties: false };
233
+ }
200
234
  function transformTool(tool) {
201
235
  const inputParams = tool.function.parameters;
202
- let parameters;
203
- if (inputParams && typeof inputParams === "object") {
204
- parameters = {
205
- ...inputParams,
206
- additionalProperties: false
207
- };
208
- } else {
209
- parameters = {
210
- type: "object",
211
- properties: {},
212
- required: [],
213
- additionalProperties: false
214
- };
215
- }
236
+ const parameters = normalizeStrictFunctionParameters(inputParams);
216
237
  return {
217
238
  type: "function",
218
239
  name: tool.function.name,
@@ -337,6 +358,115 @@ function extractProviderImages(output) {
337
358
  }
338
359
  return images.length > 0 ? images : void 0;
339
360
  }
361
+ function normalizeProviderToolStatus(status) {
362
+ if (status === "completed") return "completed";
363
+ if (status === "failed" || status === "incomplete") return "failed";
364
+ return "in_progress";
365
+ }
366
+ function getStringValue(record, key) {
367
+ const value = record[key];
368
+ return typeof value === "string" ? value : void 0;
369
+ }
370
+ function extractOpenAIWebSearchActions(item) {
371
+ if (!isRecord(item)) return void 0;
372
+ const action = item.action;
373
+ if (!isRecord(action)) return void 0;
374
+ const type = getStringValue(action, "type") ?? "search";
375
+ const query = getStringValue(action, "query");
376
+ const url = getStringValue(action, "url");
377
+ const pattern = getStringValue(action, "pattern");
378
+ const rawSources = action.sources;
379
+ const sources = Array.isArray(rawSources) ? rawSources.filter(isRecord).map((source) => ({
380
+ type: getStringValue(source, "type"),
381
+ url: getStringValue(source, "url") ?? "",
382
+ title: getStringValue(source, "title")
383
+ })).filter((source) => source.url) : void 0;
384
+ return {
385
+ actions: [{
386
+ type,
387
+ ...query ? { query } : {},
388
+ ...url ? { url } : {},
389
+ ...pattern ? { pattern } : {},
390
+ ...sources && sources.length > 0 ? { sources } : {}
391
+ }]
392
+ };
393
+ }
394
+ function extractOpenAIFileSearchResult(item) {
395
+ if (!isRecord(item)) return void 0;
396
+ const queries = item.queries;
397
+ const results = item.results;
398
+ return {
399
+ ...Array.isArray(queries) ? { input: { queries } } : {},
400
+ ...Array.isArray(results) ? { results } : {}
401
+ };
402
+ }
403
+ function extractOpenAICodeInterpreterResult(item) {
404
+ if (!isRecord(item)) return void 0;
405
+ const code = getStringValue(item, "code");
406
+ const containerId = getStringValue(item, "container_id");
407
+ const outputs = item.outputs;
408
+ const logs = Array.isArray(outputs) ? outputs.filter(isRecord).map((output) => getStringValue(output, "logs")).filter((value) => typeof value === "string").join("\n") : "";
409
+ return {
410
+ ...code || containerId ? { input: { ...code ? { code } : {}, ...containerId ? { containerId } : {} } } : {},
411
+ ...logs ? { output: logs } : {},
412
+ ...Array.isArray(outputs) ? { results: outputs } : {}
413
+ };
414
+ }
415
+ function providerToolResult(name, id, status, result) {
416
+ return {
417
+ name,
418
+ type: name,
419
+ provider: "openai",
420
+ id,
421
+ status: normalizeProviderToolStatus(status),
422
+ ...result ? { result } : {}
423
+ };
424
+ }
425
+ function extractProviderToolResults(output) {
426
+ const providerTools = [];
427
+ for (const item of output) {
428
+ if (!isRecord(item)) continue;
429
+ const type = getStringValue(item, "type");
430
+ const id = getStringValue(item, "id");
431
+ if (!type || !id) continue;
432
+ if (type === "web_search_call") {
433
+ providerTools.push(providerToolResult(
434
+ "web_search",
435
+ id,
436
+ getStringValue(item, "status"),
437
+ extractOpenAIWebSearchActions(item)
438
+ ));
439
+ } else if (type === "image_generation_call") {
440
+ providerTools.push(providerToolResult(
441
+ "image_generation",
442
+ id,
443
+ getStringValue(item, "status"),
444
+ {
445
+ artifacts: [{
446
+ type: "image",
447
+ id,
448
+ mediaType: "image/png"
449
+ }]
450
+ }
451
+ ));
452
+ } else if (type === "file_search_call") {
453
+ providerTools.push(providerToolResult(
454
+ "file_search",
455
+ id,
456
+ getStringValue(item, "status"),
457
+ extractOpenAIFileSearchResult(item)
458
+ ));
459
+ } else if (type === "code_interpreter_call") {
460
+ providerTools.push(providerToolResult(
461
+ "code_interpreter",
462
+ id,
463
+ getStringValue(item, "status"),
464
+ extractOpenAICodeInterpreterResult(item)
465
+ ));
466
+ }
467
+ }
468
+ return providerTools.length > 0 ? providerTools : void 0;
469
+ }
340
470
  function transformUsage(usage) {
341
471
  if (!usage) {
342
472
  return {
@@ -358,12 +488,14 @@ function transformResponse(response) {
358
488
  const { reasoning, reasoningDetails } = extractReasoningContent(response.output);
359
489
  const toolCalls = extractToolCalls(response.output);
360
490
  const images = extractProviderImages(response.output);
491
+ const providerTools = extractProviderToolResults(response.output);
361
492
  return {
362
493
  content,
363
494
  reasoning,
364
495
  reasoningDetails,
365
496
  toolCalls,
366
497
  images,
498
+ providerTools,
367
499
  finishReason: mapFinishReason(response),
368
500
  usage: transformUsage(response.usage),
369
501
  metadata: {
@@ -467,6 +599,7 @@ function buildCreateParams(request, reasoningLevels = DEFAULT_REASONING_LEVELS)
467
599
  function createStreamState() {
468
600
  return {
469
601
  toolCalls: /* @__PURE__ */ new Map(),
602
+ toolCallIdsByItemId: /* @__PURE__ */ new Map(),
470
603
  imageGenerations: /* @__PURE__ */ new Map(),
471
604
  webSearches: /* @__PURE__ */ new Map(),
472
605
  reasoningContent: "",
@@ -476,8 +609,39 @@ function createStreamState() {
476
609
  imageIndex: 0
477
610
  };
478
611
  }
612
+ function isCurrentReasoningDeltaEvent(event) {
613
+ return isRecord(event) && event.type === "response.reasoning.delta" && typeof event.delta === "string";
614
+ }
615
+ function resolveToolCallId(state, itemId) {
616
+ return state.toolCallIdsByItemId.get(itemId) ?? itemId;
617
+ }
618
+ function getToolCallForItem(state, itemId) {
619
+ return state.toolCalls.get(resolveToolCallId(state, itemId));
620
+ }
621
+ function parseToolCallArguments(argumentsJson) {
622
+ try {
623
+ const parsed = argumentsJson ? JSON.parse(argumentsJson) : {};
624
+ return isRecord(parsed) ? parsed : {};
625
+ } catch {
626
+ return {};
627
+ }
628
+ }
629
+ function getFunctionCallItemField(event, field) {
630
+ if (!isRecord(event) || !isRecord(event.item)) {
631
+ return void 0;
632
+ }
633
+ const value = event.item[field];
634
+ return typeof value === "string" ? value : void 0;
635
+ }
479
636
  function processStreamEvent(event, state) {
480
637
  const chunks = [];
638
+ const rawEvent = event;
639
+ if (isCurrentReasoningDeltaEvent(rawEvent)) {
640
+ state.hasReasoning = true;
641
+ state.reasoningContent += rawEvent.delta;
642
+ chunks.push({ type: "reasoning-delta", delta: rawEvent.delta });
643
+ return chunks;
644
+ }
481
645
  switch (event.type) {
482
646
  // Text content streaming
483
647
  case "response.output_text.delta":
@@ -489,18 +653,23 @@ function processStreamEvent(event, state) {
489
653
  // Reasoning streaming
490
654
  case "response.reasoning_text.delta":
491
655
  state.hasReasoning = true;
492
- state.reasoningContent += event.delta;
493
- chunks.push({ type: "reasoning-delta", delta: event.delta });
656
+ if (isRecord(event) && typeof event.delta === "string") {
657
+ state.reasoningContent += event.delta;
658
+ chunks.push({ type: "reasoning-delta", delta: event.delta });
659
+ }
494
660
  break;
495
661
  case "response.reasoning_text.done":
496
662
  break;
497
663
  // Function call and image generation streaming
498
664
  case "response.output_item.added":
499
665
  if (event.item.type === "function_call") {
666
+ const itemId = event.item.id ?? event.item.call_id;
667
+ state.toolCallIdsByItemId.set(itemId, event.item.call_id);
668
+ state.toolCallIdsByItemId.set(event.item.call_id, event.item.call_id);
500
669
  state.toolCalls.set(event.item.call_id, {
501
670
  id: event.item.call_id,
502
671
  name: event.item.name,
503
- arguments: ""
672
+ arguments: event.item.arguments ?? ""
504
673
  });
505
674
  chunks.push({
506
675
  type: "tool-call-start",
@@ -521,6 +690,21 @@ function processStreamEvent(event, state) {
521
690
  break;
522
691
  case "response.output_item.done":
523
692
  if (event.item.type === "image_generation_call") {
693
+ chunks.push({
694
+ type: "provider-tool-done",
695
+ tool: providerToolResult(
696
+ "image_generation",
697
+ event.item.id,
698
+ event.item.status,
699
+ event.item.result ? {
700
+ artifacts: [{
701
+ type: "image",
702
+ id: event.item.id,
703
+ mediaType: "image/png"
704
+ }]
705
+ } : void 0
706
+ )
707
+ });
524
708
  if (event.item.result) {
525
709
  const imageIndex = state.imageIndex;
526
710
  state.imageIndex++;
@@ -550,20 +734,39 @@ function processStreamEvent(event, state) {
550
734
  });
551
735
  }
552
736
  chunks.push({
553
- type: "web-search-done",
554
- result: {
555
- id: event.item.id,
556
- status: event.item.status,
557
- actions: actions.length > 0 ? actions : void 0
558
- }
737
+ type: "provider-tool-done",
738
+ tool: providerToolResult(
739
+ "web_search",
740
+ event.item.id,
741
+ event.item.status,
742
+ actions.length > 0 ? { actions } : void 0
743
+ )
559
744
  });
560
745
  state.webSearches.delete(event.item.id);
746
+ } else if (event.item.type === "file_search_call") {
747
+ chunks.push({
748
+ type: "provider-tool-done",
749
+ tool: providerToolResult(
750
+ "file_search",
751
+ event.item.id,
752
+ event.item.status,
753
+ extractOpenAIFileSearchResult(event.item)
754
+ )
755
+ });
756
+ } else if (event.item.type === "code_interpreter_call") {
757
+ chunks.push({
758
+ type: "provider-tool-done",
759
+ tool: providerToolResult(
760
+ "code_interpreter",
761
+ event.item.id,
762
+ event.item.status,
763
+ extractOpenAICodeInterpreterResult(event.item)
764
+ )
765
+ });
561
766
  }
562
767
  break;
563
768
  case "response.function_call_arguments.delta": {
564
- const deltaToolCall = Array.from(state.toolCalls.values()).find(
565
- (tc) => tc.id === event.item_id
566
- );
769
+ const deltaToolCall = getToolCallForItem(state, event.item_id);
567
770
  if (deltaToolCall) {
568
771
  deltaToolCall.arguments += event.delta;
569
772
  chunks.push({
@@ -575,15 +778,11 @@ function processStreamEvent(event, state) {
575
778
  break;
576
779
  }
577
780
  case "response.function_call_arguments.done": {
578
- const doneToolCall = Array.from(state.toolCalls.values()).find(
579
- (tc) => tc.id === event.item_id
580
- );
781
+ const doneToolCall = getToolCallForItem(state, event.item_id);
581
782
  if (doneToolCall) {
582
- let parsedArgs = {};
583
- try {
584
- parsedArgs = doneToolCall.arguments ? JSON.parse(doneToolCall.arguments) : {};
585
- } catch {
586
- }
783
+ const finalArguments = event.arguments || getFunctionCallItemField(rawEvent, "arguments") || doneToolCall.arguments;
784
+ doneToolCall.arguments = finalArguments;
785
+ const parsedArgs = parseToolCallArguments(finalArguments);
587
786
  chunks.push({
588
787
  type: "tool-call-done",
589
788
  id: doneToolCall.id,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/OpenAIProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n processStreamEvent,\n createErrorChunk,\n DEFAULT_REASONING_LEVELS,\n truncateBase64,\n} from './transformers';\nimport { getOpenAIIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\n/**\n * OpenAI model info from their API\n */\ninterface OpenAIModelInfo {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\n/**\n * OpenAI provider implementation for Standard Agents\n *\n * Uses the Responses API for all requests (stateless mode).\n * Supports: gpt-4o, gpt-4-turbo, gpt-3.5-turbo, o1, o3, o4-mini, etc.\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n readonly specificationVersion = '1' as const;\n\n private client: OpenAI | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: OpenAIModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<OpenAI> {\n if (!this.client) {\n const { default: OpenAI } = await import('openai');\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith('gpt-') ||\n modelId.startsWith('o1') ||\n modelId.startsWith('o3') ||\n modelId.startsWith('o4') ||\n modelId.startsWith('dall-e') ||\n modelId.startsWith('chatgpt-')\n );\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the OpenAI icon since all models are from OpenAI.\n */\n getIcon(_modelId?: string): string {\n return getOpenAIIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Hardcoded capability mappings for OpenAI models.\n * OpenAI doesn't provide a capabilities API, so these are manually maintained.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'gpt-4o': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4o-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4-turbo': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 4096,\n },\n 'gpt-4': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n },\n 'gpt-3.5-turbo': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 16385,\n maxOutputTokens: 4096,\n },\n 'o1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-preview': {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 32768,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-mini': {\n supportsImages: false,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 65536,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o3-mini': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o4-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n };\n\n /**\n * Get capabilities for a specific model.\n * Uses hardcoded mappings since OpenAI doesn't provide a capabilities API.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n // Exact match first\n if (OpenAIProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...OpenAIProvider.MODEL_CAPABILITIES[modelId] };\n }\n\n // Prefix match (e.g., 'gpt-4o-2024-11-20' matches 'gpt-4o')\n for (const [prefix, caps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix)) {\n return { ...caps };\n }\n }\n\n // Default capabilities for unknown OpenAI models\n return {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n };\n }\n\n /**\n * Human-readable names and descriptions for models.\n * Used to enrich API response data.\n */\n private static readonly MODEL_METADATA: Record<string, { name: string; description: string }> = {\n 'gpt-4o': { name: 'GPT-4o', description: 'Most capable GPT-4 model with vision' },\n 'gpt-4o-mini': { name: 'GPT-4o Mini', description: 'Fast and affordable GPT-4o variant' },\n 'gpt-4-turbo': { name: 'GPT-4 Turbo', description: 'GPT-4 Turbo with vision' },\n 'gpt-4': { name: 'GPT-4', description: 'Original GPT-4 model' },\n 'gpt-3.5-turbo': { name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },\n 'o1': { name: 'o1', description: 'Advanced reasoning model' },\n 'o1-preview': { name: 'o1 Preview', description: 'Preview reasoning model' },\n 'o1-mini': { name: 'o1 Mini', description: 'Smaller reasoning model' },\n 'o3-mini': { name: 'o3 Mini', description: 'Latest compact reasoning model' },\n 'o4-mini': { name: 'o4 Mini', description: 'Next-gen compact reasoning model' },\n 'chatgpt-4o-latest': { name: 'ChatGPT-4o Latest', description: 'Latest ChatGPT model' },\n };\n\n /**\n * Prefixes for chat-capable models (filter out embeddings, tts, whisper, dall-e, etc.)\n */\n private static readonly CHAT_MODEL_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-'];\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are OpenAI's built-in tools that execute on OpenAI's servers.\n * The execute function is a no-op since execution is handled by the provider.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n searchContextSize: z.enum(['low', 'medium', 'high']).default('medium').describe('Amount of context to gather'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by OpenAI - this is a passthrough\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n userLocation: z.string().optional().describe('User location for relevant results'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n file_search: defineTool({\n description: 'Search through uploaded files using vector embeddings',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n vectorStoreId: z.string().describe('OpenAI Vector Store ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n code_interpreter: defineTool({\n description: 'Execute Python code in a sandboxed environment',\n args: z.object({\n code: z.string().describe('Python code to execute'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n containerId: z.string().optional().describe('Code interpreter container ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n image_generation: defineTool({\n description: 'Generate images using GPT-image-1',\n args: z.object({\n prompt: z.string().describe('Image generation prompt'),\n quality: z.enum(['standard', 'hd']).default('standard').describe('Image quality'),\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).default('1024x1024').describe('Image size'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n };\n\n /**\n * Which tools are available for each model.\n */\n private static readonly MODEL_TOOLS: Record<string, string[]> = {\n 'gpt-4o': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n 'gpt-4o-mini': ['web_search', 'file_search', 'code_interpreter'],\n 'o1': ['web_search', 'code_interpreter'],\n 'o3-mini': ['web_search', 'code_interpreter'],\n 'o4-mini': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n };\n\n /**\n * Get tools embedded in this provider.\n * These are OpenAI's built-in tools with tenv requirements.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n // For OpenAI, return all tools by default - most modern models support all provider tools\n // If a specific model has restrictions, we can filter, but default to returning all\n if (!modelId) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n // Check if we have model-specific restrictions\n let toolNames = OpenAIProvider.MODEL_TOOLS[modelId];\n if (!toolNames) {\n for (const [prefix, tools] of Object.entries(OpenAIProvider.MODEL_TOOLS)) {\n if (modelId.startsWith(prefix)) {\n toolNames = tools;\n break;\n }\n }\n }\n\n // If no specific mapping found, return all tools (OpenAI default)\n if (!toolNames) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n const result: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {};\n for (const name of toolNames) {\n if (OpenAIProvider.TOOLS[name]) {\n result[name] = OpenAIProvider.TOOLS[name];\n }\n }\n return result;\n }\n\n /**\n * Fetch models from OpenAI API with caching.\n */\n private async fetchModelsWithCache(): Promise<OpenAIModelInfo[]> {\n const now = Date.now();\n\n // Return cached data if still valid\n if (\n OpenAIProvider.modelsCache &&\n now - OpenAIProvider.modelsCacheTime < OpenAIProvider.CACHE_TTL\n ) {\n return OpenAIProvider.modelsCache;\n }\n\n // Fetch from OpenAI API\n const client = await this.getClient();\n const response = await client.models.list();\n\n // Convert to array (the response is a Page object)\n const models: OpenAIModelInfo[] = [];\n for await (const model of response) {\n models.push(model as OpenAIModelInfo);\n }\n\n OpenAIProvider.modelsCache = models;\n OpenAIProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Check if a model ID is a chat-capable model.\n */\n private isChatModel(modelId: string): boolean {\n return OpenAIProvider.CHAT_MODEL_PREFIXES.some((prefix) => modelId.startsWith(prefix));\n }\n\n /**\n * Get human-readable name for a model.\n */\n private getModelName(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].name;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return `${meta.name} (${modelId.slice(prefix.length + 1)})`;\n }\n }\n\n // Fallback: format the ID nicely\n return modelId\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n }\n\n /**\n * Get description for a model.\n */\n private getModelDescription(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].description;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return meta.description;\n }\n }\n\n return '';\n }\n\n /**\n * Map OpenAI model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: OpenAIModelInfo): ProviderModelInfo {\n // Get capabilities for context length\n const caps = OpenAIProvider.MODEL_CAPABILITIES[model.id];\n let contextLength = caps?.maxContextTokens;\n\n // If no exact match, try prefix match\n if (!contextLength) {\n for (const [prefix, prefixCaps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (model.id.startsWith(prefix)) {\n contextLength = prefixCaps.maxContextTokens;\n break;\n }\n }\n }\n\n return {\n id: model.id,\n name: this.getModelName(model.id),\n description: this.getModelDescription(model.id),\n contextLength,\n iconId: this.getIcon(model.id),\n };\n }\n\n /**\n * Get list of available models from OpenAI.\n * Fetches from the OpenAI API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n // Filter to chat models only and map to ProviderModelInfo\n let models = rawModels\n .filter((m) => this.isChatModel(m.id))\n .map((m) => this.mapToProviderModelInfo(m))\n .sort((a, b) => {\n // Sort by name for consistent ordering\n return a.name.localeCompare(b.name);\n });\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter) ||\n (m.description && m.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from OpenAI:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n const response = await client.responses.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n\n const stream = await client.responses.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as any;\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status);\n }\n if (status === 400) {\n return new ProviderError(error.message, 'invalid_request', status);\n }\n if (status >= 500) {\n return new ProviderError(error.message, 'server_error', status);\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout');\n }\n\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to OpenAI Responses API format for inspection.\n * Returns the exact request body that would be sent to OpenAI, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n return {\n body: truncateBase64(params as unknown as Record<string, unknown>),\n messagesPath: 'input',\n metadata: {\n endpoint: 'responses.create',\n },\n };\n }\n}\n","/**\n * Discrete transformer functions for OpenAI Responses API provider.\n * These functions convert between Standard Agent types and OpenAI Responses API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ImageUrlPart,\n ProviderReasoningDetail,\n ProviderGeneratedImage,\n} from '@standardagents/spec';\nimport { mapReasoningLevel } from '@standardagents/spec';\nimport type OpenAI from 'openai';\n\n// ============================================================================\n// Type aliases for OpenAI Responses API types\n// ============================================================================\n\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem;\ntype ResponseInput = OpenAI.Responses.ResponseInput;\ntype ResponseOutputItem = OpenAI.Responses.ResponseOutputItem;\ntype FunctionTool = OpenAI.Responses.FunctionTool;\ntype ResponseCreateParams = OpenAI.Responses.ResponseCreateParams;\ntype ResponseIncludable = OpenAI.Responses.ResponseIncludable;\ntype Response = OpenAI.Responses.Response;\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent;\n\n/**\n * Content type for function call output with multimodal content.\n * Note: The OpenAI API accepts arrays here, but the SDK types only allow strings.\n * We serialize this to JSON for type safety.\n */\ntype FunctionCallOutputContent =\n | { type: 'input_text'; text: string }\n | { type: 'input_image'; image_url: string; detail?: 'auto' | 'low' | 'high' };\n\n/** Default reasoning level mapping for OpenAI o-series models */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * OpenAI built-in tool names that are executed by OpenAI on their side.\n * These should NOT be sent as function_call items - their results come back\n * as native response types (e.g., image_generation_call, web_search_call).\n */\nexport const OPENAI_NATIVE_TOOLS = new Set([\n 'image_generation',\n 'web_search',\n 'code_interpreter',\n 'file_search',\n]);\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Transform a single content part to Responses API input format.\n */\nexport function transformContentPart(\n part: ContentPart\n): OpenAI.Responses.ResponseInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image') {\n // Guard against undefined data (e.g., file not loaded)\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n return {\n type: 'input_image',\n image_url: imageUrl,\n detail: part.detail || 'auto',\n };\n }\n // Handle image_url format (stored format uses this instead of 'image')\n if (part.type === 'image_url') {\n // TypeScript narrows to ImageUrlPart here\n const url = part.image_url?.url || '';\n const detail = part.image_url?.detail || 'auto';\n // If URL is a path (not data URI or http), it needs to be loaded separately\n // For now, just pass through - the inspect endpoint should load the data\n return {\n type: 'input_image',\n image_url: url,\n detail,\n };\n }\n // File parts\n // Guard against undefined data\n const fileData = part.data || '';\n return {\n type: 'input_file',\n filename: part.filename,\n file_data: fileData.startsWith('data:')\n ? fileData\n : `data:${part.mediaType || 'application/octet-stream'};base64,${fileData}`,\n };\n}\n\n/**\n * Transform message content (string or parts array) to Responses API format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | OpenAI.Responses.ResponseInputContent[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform a user message to Responses API input item.\n */\nexport function transformUserMessage(\n msg: ProviderMessage & { role: 'user' }\n): OpenAI.Responses.EasyInputMessage {\n const content = transformMessageContent(msg.content);\n return {\n role: 'user',\n content: typeof content === 'string' ? content : content,\n };\n}\n\n/**\n * Transform an assistant message to Responses API input item.\n * Assistant messages from previous turns need special handling.\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): ResponseInputItem[] {\n const items: ResponseInputItem[] = [];\n\n // Add assistant message if there's content OR if there are tool calls\n // The assistant message helps the model understand turn structure\n const hasToolCalls = msg.toolCalls && msg.toolCalls.length > 0;\n if (msg.content || hasToolCalls) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: msg.content\n ? [{ type: 'output_text', text: msg.content }]\n : [], // Empty content array when only tool calls\n } as OpenAI.Responses.ResponseOutputMessage);\n }\n\n // Add reasoning if present\n // OpenAI expects each reasoning item to be passed back EXACTLY as received.\n // Multiple reasoning items can exist with different IDs - we must group by ID\n // and create separate ResponseReasoningItem for each.\n if (msg.reasoning || msg.reasoningDetails) {\n // Group reasoning details by ID - each unique ID becomes a separate reasoning item\n const reasoningItemsById = new Map<string, OpenAI.Responses.ResponseReasoningItem>();\n\n // Default ID for details without explicit IDs - all such details go into one item\n const defaultId = `rs_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n\n // Get or create a reasoning item for a given ID\n const getOrCreateItem = (id: string): OpenAI.Responses.ResponseReasoningItem => {\n let item = reasoningItemsById.get(id);\n if (!item) {\n item = {\n id,\n type: 'reasoning',\n summary: [],\n };\n reasoningItemsById.set(id, item);\n }\n return item;\n };\n\n // Process reasoning details - group by ID\n if (msg.reasoningDetails) {\n for (const detail of msg.reasoningDetails) {\n // Use explicit ID if provided, otherwise use the shared default ID\n // This ensures details without IDs all go into the same reasoning item\n const itemId = detail.id || defaultId;\n const item = getOrCreateItem(itemId);\n\n if (detail.type === 'encrypted' && detail.data) {\n // Each reasoning item gets its own encrypted_content\n item.encrypted_content = detail.data;\n } else if (detail.type === 'summary' && detail.text) {\n item.summary.push({ type: 'summary_text', text: detail.text });\n } else if (detail.type === 'text' && detail.text) {\n // Text-based reasoning details are added to summary\n item.summary.push({ type: 'summary_text', text: detail.text });\n }\n }\n }\n\n // Handle legacy msg.reasoning field (string) - associate with first item or create new\n if (msg.reasoning && typeof msg.reasoning === 'string') {\n if (reasoningItemsById.size > 0) {\n // Add to the first existing item\n const firstItem = reasoningItemsById.values().next().value;\n if (firstItem) {\n firstItem.summary.unshift({ type: 'summary_text', text: msg.reasoning });\n }\n } else {\n // No existing items - create a new one with the default ID\n const newItem = getOrCreateItem(defaultId);\n newItem.summary = [{ type: 'summary_text', text: msg.reasoning }];\n }\n }\n\n // Push all reasoning items - preserves each item's ID and encrypted_content\n for (const item of reasoningItemsById.values()) {\n items.push(item);\n }\n }\n\n // Add tool calls if present\n // Note: image_generation is included as function_call for history reconstruction,\n // even though OpenAI executes it. This allows us to return the result as\n // function_call_output with the image, which the model can \"see\" in stateless mode.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n // Skip other native OpenAI tools (web_search, code_interpreter, etc.)\n // but include image_generation as a pseudo-function-call\n if (OPENAI_NATIVE_TOOLS.has(tc.name) && tc.name !== 'image_generation') {\n continue;\n }\n items.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n } as OpenAI.Responses.ResponseFunctionToolCall);\n }\n }\n\n return items;\n}\n\n/**\n * Transform a tool result message to Responses API input items.\n *\n * For image_generation (OpenAI's native tool), we treat it as a pseudo-function-call\n * in history reconstruction. This allows us to return the generated image as a\n * function_call_output with input_image content, which the model can \"see\" in\n * stateless mode. (The actual image_generation_call format requires stored IDs.)\n *\n * For other tools, returns standard function_call_output.\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ResponseInputItem[] {\n // Standard function call output\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n // Handle image attachments from any tool (not just image_generation)\n // OpenAI API accepts function_call_output with array content including images.\n // See: https://platform.openai.com/docs/guides/function-calling#formatting-results\n if (msg.attachments?.length) {\n const imageAttachments = msg.attachments.filter(a => a.type === 'image' && a.data);\n if (imageAttachments.length > 0) {\n const outputContent: FunctionCallOutputContent[] = [];\n\n // Add text content first (ResponseInputText format)\n if (output) {\n outputContent.push({\n type: 'input_text',\n text: output,\n });\n }\n\n // Add image content (ResponseInputImage format)\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n outputContent.push({\n type: 'input_image',\n image_url: imageData,\n detail: 'auto',\n });\n }\n\n // Return array content directly - OpenAI API supports this for multimodal output\n // The SDK types are narrower than what the API accepts, so we use type assertion\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: outputContent as unknown as string,\n }];\n }\n }\n\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output,\n }];\n}\n\n/**\n * Transform an array of ProviderMessages to Responses API input format.\n * Returns both the input items and extracted system instructions.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n input: ResponseInput;\n instructions: string | undefined;\n} {\n let instructions: string | undefined;\n const input: ResponseInput = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n // System messages become instructions\n instructions = instructions\n ? `${instructions}\\n\\n${msg.content}`\n : msg.content;\n break;\n\n case 'user':\n input.push(transformUserMessage(msg));\n break;\n\n case 'assistant':\n input.push(...transformAssistantMessage(msg));\n break;\n\n case 'tool':\n input.push(...transformToolMessage(msg));\n break;\n }\n }\n\n return { input, instructions };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\n/**\n * Native OpenAI tool types for the Responses API.\n */\ntype NativeToolType = OpenAI.Responses.Tool;\n\n/**\n * Transform a single ProviderTool to Responses API function tool.\n */\nexport function transformTool(tool: ProviderTool): FunctionTool {\n // OpenAI requires additionalProperties: false in all function schemas with strict: true\n // Ensure we always have a valid schema, even for tools with no parameters\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n let parameters: Record<string, unknown>;\n if (inputParams && typeof inputParams === 'object') {\n // Add additionalProperties: false to existing schema\n parameters = {\n ...inputParams,\n additionalProperties: false,\n };\n } else {\n // Tools with no parameters need a valid empty schema\n parameters = {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n }\n\n return {\n type: 'function',\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters,\n strict: true,\n };\n}\n\n/**\n * Transform an array of ProviderTools to Responses API format.\n * Separates function tools (for local execution) from native tools (executed by OpenAI).\n *\n * @returns Object with functionTools (regular tools) and nativeTools (OpenAI built-ins)\n */\nexport function transformTools(tools: ProviderTool[]): {\n functionTools: FunctionTool[];\n nativeTools: NativeToolType[];\n} {\n const functionTools: FunctionTool[] = [];\n const nativeTools: NativeToolType[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n // Check if this is an OpenAI native tool\n if (tool.executionMode === 'provider' && OPENAI_NATIVE_TOOLS.has(toolName)) {\n // Add as native tool type\n nativeTools.push({ type: toolName } as NativeToolType);\n } else {\n // Regular function tool\n functionTools.push(transformTool(tool));\n }\n }\n\n return { functionTools, nativeTools };\n}\n\n/**\n * Legacy function for backward compatibility - transforms all tools as function tools.\n * @deprecated Use transformTools() which properly handles native tools\n */\nexport function transformToolsLegacy(tools: ProviderTool[]): FunctionTool[] {\n return tools.map(transformTool);\n}\n\n/**\n * Transform tool choice option to Responses API format.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice']\n): ResponseCreateParams['tool_choice'] {\n if (choice === 'auto') {\n return 'auto';\n }\n if (choice === 'none') {\n return 'none';\n }\n if (choice === 'required') {\n return 'required';\n }\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', name: choice.name };\n }\n return 'auto';\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map Responses API status/incomplete_details to Provider finish reason.\n */\nexport function mapFinishReason(response: Response): ProviderFinishReason {\n if (response.status === 'failed') {\n return 'error';\n }\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'length';\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'content_filter';\n }\n }\n\n // Check if there are function calls in the output\n const hasToolCalls = response.output.some(\n (item) => item.type === 'function_call'\n );\n if (hasToolCalls) {\n return 'tool_calls';\n }\n\n return 'stop';\n}\n\n/**\n * Extract text content from response output items.\n */\nexport function extractTextContent(output: ResponseOutputItem[]): string | null {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === 'message' && item.role === 'assistant') {\n for (const content of item.content) {\n if (content.type === 'output_text') {\n textParts.push(content.text);\n }\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning content from response output items.\n */\nexport function extractReasoningContent(output: ResponseOutputItem[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const item of output) {\n if (item.type === 'reasoning') {\n // Capture the original reasoning ID for multi-turn context (OpenAI uses rs_xxx format)\n const reasoningId = item.id;\n\n // Extract summary text\n if (item.summary && item.summary.length > 0) {\n const summaryText = item.summary\n .map((s) => s.text)\n .join('\\n');\n reasoning = reasoning ? `${reasoning}\\n${summaryText}` : summaryText;\n reasoningDetails.push({ type: 'summary', id: reasoningId, text: summaryText });\n }\n\n // Note: ResponseReasoningItem from OpenAI SDK only exposes summary and encrypted_content\n // There's no public `content` array in the SDK type - text reasoning comes via streaming events\n\n // Extract encrypted content for stateless multi-turn\n if (item.encrypted_content) {\n reasoningDetails.push({ type: 'encrypted', id: reasoningId, data: item.encrypted_content });\n }\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract tool calls from response output items.\n */\nexport function extractToolCalls(\n output: ResponseOutputItem[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const item of output) {\n if (item.type === 'function_call') {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = item.arguments ? JSON.parse(item.arguments) : {};\n } catch {\n // Keep empty object on parse failure\n }\n\n toolCalls.push({\n id: item.call_id,\n name: item.name,\n arguments: parsedArgs,\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\n/**\n * Extract generated images from image_generation_call output items.\n */\nexport function extractProviderImages(\n output: ResponseOutputItem[]\n): ProviderGeneratedImage[] | undefined {\n const images: ProviderGeneratedImage[] = [];\n\n for (const item of output) {\n if (item.type === 'image_generation_call' && item.result) {\n images.push({\n id: item.id,\n toolName: 'image_generation',\n data: item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n });\n }\n }\n\n return images.length > 0 ? images : undefined;\n}\n\n/**\n * Transform Responses API usage to Provider usage format.\n */\nexport function transformUsage(\n usage: Response['usage'] | undefined\n): ProviderUsage {\n if (!usage) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n }\n\n return {\n promptTokens: usage.input_tokens || 0,\n completionTokens: usage.output_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens,\n cachedTokens: usage.input_tokens_details?.cached_tokens,\n };\n}\n\n/**\n * Transform a complete Responses API response to ProviderResponse.\n */\nexport function transformResponse(response: Response): ProviderResponse {\n const content = extractTextContent(response.output);\n const { reasoning, reasoningDetails } = extractReasoningContent(response.output);\n const toolCalls = extractToolCalls(response.output);\n const images = extractProviderImages(response.output);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n images,\n finishReason: mapFinishReason(response),\n usage: transformUsage(response.usage),\n metadata: {\n model: response.model,\n provider: 'openai',\n requestId: response.id,\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Build a Responses API create request from a ProviderRequest.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS\n): ResponseCreateParams {\n const { input, instructions } = transformMessages(request.messages);\n\n const params: ResponseCreateParams = {\n model: request.model,\n input,\n store: false, // Always stateless\n };\n\n if (instructions) {\n params.instructions = instructions;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n const { functionTools, nativeTools } = transformTools(request.tools);\n\n // Check if any native tools were already used in this conversation\n // If so, exclude them from the tools list to avoid confusing the model\n // (The model sees them as function_call/function_call_output in history,\n // but having them also available as native tools causes regeneration loops)\n const usedNativeTools = new Set<string>();\n for (const msg of request.messages) {\n if (msg.role === 'tool' && msg.toolName && OPENAI_NATIVE_TOOLS.has(msg.toolName)) {\n usedNativeTools.add(msg.toolName);\n }\n }\n\n // Filter out native tools that were already used\n const availableNativeTools = nativeTools.filter(tool => {\n const toolType = (tool as { type: string }).type;\n return !usedNativeTools.has(toolType);\n });\n\n // Combine function tools and native OpenAI tools\n // Native tools (image_generation, web_search, etc.) must be added as their native types\n params.tools = [\n ...functionTools,\n ...availableNativeTools,\n ];\n\n // Include web search results if web_search tool is available\n const hasWebSearch = availableNativeTools.some(\n tool => (tool as { type: string }).type === 'web_search'\n );\n if (hasWebSearch) {\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('web_search_call.results')) {\n includeList.push('web_search_call.results');\n }\n params.include = includeList;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = transformToolChoice(request.toolChoice);\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n // Generation parameters\n if (request.maxOutputTokens !== undefined) {\n params.max_output_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // Reasoning (o-series models)\n if (request.reasoning?.level !== undefined) {\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.reasoning = {\n effort: effort as 'low' | 'medium' | 'high',\n summary: 'auto',\n };\n\n // Include encrypted reasoning for stateless multi-turn\n // Note: reasoning.summary is not a valid include value - summaries come by default\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('reasoning.encrypted_content')) {\n includeList.push('reasoning.encrypted_content');\n }\n params.include = includeList;\n }\n }\n\n // Response format\n if (request.responseFormat) {\n if (request.responseFormat.type === 'json') {\n if (request.responseFormat.schema) {\n params.text = {\n format: {\n type: 'json_schema',\n name: 'response',\n schema: request.responseFormat.schema,\n strict: true,\n },\n };\n } else {\n params.text = {\n format: { type: 'json_object' },\n };\n }\n }\n }\n\n // Merge provider-specific options (but don't let them override our managed include array)\n if (request.providerOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { include: _providerInclude, ...otherOptions } = request.providerOptions as Record<string, unknown>;\n Object.assign(params, otherOptions);\n // Note: We intentionally ignore providerOptions.include - the include array is managed\n // by buildCreateParams based on reasoning settings. User-provided include values like\n // 'reasoning.summary' are invalid and would cause API errors.\n }\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\nexport interface StreamState {\n toolCalls: Map<string, { id: string; name: string; arguments: string }>;\n imageGenerations: Map<string, { id: string; status: string }>;\n webSearches: Map<string, { id: string; status: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n currentItemId: string | null;\n imageIndex: number;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCalls: new Map(),\n imageGenerations: new Map(),\n webSearches: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n currentItemId: null,\n imageIndex: 0,\n };\n}\n\n/**\n * Process a stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: ResponseStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n\n switch (event.type) {\n // Text content streaming\n case 'response.output_text.delta':\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: event.delta });\n break;\n\n case 'response.output_text.done':\n // Content done is emitted at the end\n break;\n\n // Reasoning streaming\n case 'response.reasoning_text.delta':\n state.hasReasoning = true;\n // ResponseReasoningTextDeltaEvent has `delta` property\n state.reasoningContent += event.delta;\n chunks.push({ type: 'reasoning-delta', delta: event.delta });\n break;\n\n case 'response.reasoning_text.done':\n // Reasoning done is emitted at the end\n break;\n\n // Function call and image generation streaming\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n state.toolCalls.set(event.item.call_id, {\n id: event.item.call_id,\n name: event.item.name,\n arguments: '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: event.item.call_id,\n name: event.item.name,\n });\n } else if (event.item.type === 'image_generation_call') {\n // Track image generation for when it completes\n state.imageGenerations.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n } else if (event.item.type === 'web_search_call') {\n // Track web search for when it completes\n state.webSearches.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n }\n break;\n\n case 'response.output_item.done':\n // Handle completed image generation\n if (event.item.type === 'image_generation_call') {\n // Emit image when we have result data - don't require status to be 'completed'\n // OpenAI may return status='generating' even when the result is ready\n if (event.item.result) {\n const imageIndex = state.imageIndex;\n state.imageIndex++;\n chunks.push({\n type: 'image-done',\n index: imageIndex,\n image: {\n id: event.item.id,\n toolName: 'image_generation',\n data: event.item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n },\n });\n }\n // Clean up tracking\n state.imageGenerations.delete(event.item.id);\n } else if (event.item.type === 'web_search_call') {\n // Handle completed web search\n // Extract search actions if available (requires include: ['web_search_call.results'])\n const webSearchItem = event.item as any; // Type assertion needed as SDK types may not include action\n const actions: Array<{\n type: 'search' | 'open_page' | 'find';\n query?: string;\n url?: string;\n pattern?: string;\n sources?: Array<{ type: 'url'; url: string; title?: string }>;\n }> = [];\n\n if (webSearchItem.action) {\n actions.push({\n type: webSearchItem.action.type,\n query: webSearchItem.action.query,\n url: webSearchItem.action.url,\n pattern: webSearchItem.action.pattern,\n sources: webSearchItem.action.sources,\n });\n }\n\n chunks.push({\n type: 'web-search-done',\n result: {\n id: event.item.id,\n status: event.item.status,\n actions: actions.length > 0 ? actions : undefined,\n },\n });\n\n // Clean up tracking\n state.webSearches.delete(event.item.id);\n }\n break;\n\n case 'response.function_call_arguments.delta': {\n // SDK uses item_id, not call_id - find by iterating tracked tool calls\n const deltaToolCall = Array.from(state.toolCalls.values()).find(\n (tc) => tc.id === event.item_id\n );\n if (deltaToolCall) {\n deltaToolCall.arguments += event.delta;\n chunks.push({\n type: 'tool-call-delta',\n id: deltaToolCall.id,\n argumentsDelta: event.delta,\n });\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n // SDK uses item_id, not call_id - find by iterating tracked tool calls\n const doneToolCall = Array.from(state.toolCalls.values()).find(\n (tc) => tc.id === event.item_id\n );\n if (doneToolCall) {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = doneToolCall.arguments\n ? JSON.parse(doneToolCall.arguments)\n : {};\n } catch {\n // Keep empty object on parse failure\n }\n chunks.push({\n type: 'tool-call-done',\n id: doneToolCall.id,\n arguments: parsedArgs,\n });\n }\n break;\n }\n\n // Response completion\n case 'response.completed': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details (including encrypted content) for multi-turn continuity\n const { reasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage),\n reasoningDetails,\n });\n break;\n }\n\n case 'response.failed':\n chunks.push({\n type: 'error',\n error: event.response.error?.message || 'Response generation failed',\n code: event.response.error?.code,\n });\n break;\n\n case 'response.incomplete': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details even for incomplete responses\n const { reasoningDetails: incompleteReasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage),\n reasoningDetails: incompleteReasoningDetails,\n });\n break;\n }\n\n // Ignore other events\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n * Matches data URIs and long strings with base64-like character patterns.\n */\nfunction isBase64Like(str: string): boolean {\n // Data URIs (data:image/png;base64,...)\n if (str.startsWith('data:')) return true;\n\n // Very long strings (>200 chars) that look like base64\n // Base64 only contains A-Z, a-z, 0-9, +, /, and = for padding\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n // Check first 200 chars to avoid regex on huge strings\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\n/**\n * Truncate a base64 string for display, preserving the start and showing length.\n */\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n * Detects base64 strings (data URIs and long base64-like strings) and truncates them.\n *\n * @param obj - The object to process\n * @param maxLength - Maximum length for base64 preview (default 50)\n * @returns A new object with base64 data truncated\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle strings\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n // Return primitives as-is\n return obj;\n}\n","import OPENAI_ICON_FILE from './vendor-icons/openai.svg';\n\n/**\n * OpenAI icon asset.\n */\nexport const OPENAI_ICON = OPENAI_ICON_FILE;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the OpenAI icon as a data URI.\n */\nexport function getOpenAIIconDataUri(): string {\n return normalizeIcon(OPENAI_ICON);\n}\n","/**\n * OpenAI provider options schema.\n *\n * Defines typed providerOptions for OpenAI models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.openai.com/docs/api-reference/chat/create\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * OpenAI provider options schema.\n *\n * These options are passed directly to the OpenAI API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'default',\n * user: 'user-123',\n * seed: 42,\n * }\n * ```\n */\nexport const openaiProviderOptions = z.object({\n /** Service tier for request: 'auto', 'default', or 'flex' */\n service_tier: z.enum(['auto', 'default', 'flex']).optional(),\n\n /** User identifier for abuse monitoring */\n user: z.string().optional(),\n\n /** Seed for deterministic outputs (beta feature) */\n seed: z.number().int().optional(),\n\n /** Frequency penalty (-2.0 to 2.0) - reduces repetition of tokens */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Presence penalty (-2.0 to 2.0) - encourages new topics */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Whether to return log probabilities of output tokens */\n logprobs: z.boolean().optional(),\n\n /** Number of most likely tokens to return at each position (0-20) */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Whether to store the completion for future reference */\n store: z.boolean().optional(),\n\n /** Metadata for stored completions */\n metadata: z.record(z.string(), z.string()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for OpenAI provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type OpenAIProviderOptions = z.infer<typeof openaiProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig } from '@standardagents/spec';\nimport { OpenAIProvider } from './OpenAIProvider';\nimport { openaiProviderOptions } from './providerOptions';\n\n/**\n * OpenAI provider factory for Standard Agents\n *\n * Includes typed providerOptions for OpenAI-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { openai } from '@standardagents/openai';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: openai,\n * model: 'gpt-4o',\n * inputPrice: 2.5,\n * outputPrice: 10,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 128000,\n * },\n * providerOptions: {\n * service_tier: 'default',\n * },\n * });\n * ```\n */\nexport const openai: ProviderFactoryWithOptions<typeof openaiProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new OpenAIProvider(config),\n { providerOptions: openaiProviderOptions }\n );\n\n// Re-export the provider options schema and types\nexport { openaiProviderOptions, type OpenAIProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { OpenAIProvider } from './OpenAIProvider';\n"],"mappings":"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","names":["z"]}
1
+ {"version":3,"sources":["../src/OpenAIProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n processStreamEvent,\n createErrorChunk,\n DEFAULT_REASONING_LEVELS,\n truncateBase64,\n} from './transformers';\nimport { getOpenAIIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\n/**\n * OpenAI model info from their API\n */\ninterface OpenAIModelInfo {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n}\n\n/**\n * OpenAI provider implementation for Standard Agents\n *\n * Uses the Responses API for all requests (stateless mode).\n * Supports: gpt-4o, gpt-4-turbo, gpt-3.5-turbo, o1, o3, o4-mini, etc.\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n readonly specificationVersion = '1' as const;\n\n private client: OpenAI | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: OpenAIModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<OpenAI> {\n if (!this.client) {\n const { default: OpenAI } = await import('openai');\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith('gpt-') ||\n modelId.startsWith('o1') ||\n modelId.startsWith('o3') ||\n modelId.startsWith('o4') ||\n modelId.startsWith('dall-e') ||\n modelId.startsWith('chatgpt-')\n );\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the OpenAI icon since all models are from OpenAI.\n */\n getIcon(_modelId?: string): string {\n return getOpenAIIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Hardcoded capability mappings for OpenAI models.\n * OpenAI doesn't provide a capabilities API, so these are manually maintained.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'gpt-4o': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4o-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 16384,\n },\n 'gpt-4-turbo': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 4096,\n },\n 'gpt-4': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n },\n 'gpt-3.5-turbo': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 16385,\n maxOutputTokens: 4096,\n },\n 'o1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-preview': {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 32768,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o1-mini': {\n supportsImages: false,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 128000,\n maxOutputTokens: 65536,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o3-mini': {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n 'o4-mini': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 100000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n };\n\n /**\n * Get capabilities for a specific model.\n * Uses hardcoded mappings since OpenAI doesn't provide a capabilities API.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n // Exact match first\n if (OpenAIProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...OpenAIProvider.MODEL_CAPABILITIES[modelId] };\n }\n\n // Prefix match (e.g., 'gpt-4o-2024-11-20' matches 'gpt-4o')\n for (const [prefix, caps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix)) {\n return { ...caps };\n }\n }\n\n // Default capabilities for unknown OpenAI models\n return {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 8192,\n maxOutputTokens: 4096,\n };\n }\n\n /**\n * Human-readable names and descriptions for models.\n * Used to enrich API response data.\n */\n private static readonly MODEL_METADATA: Record<string, { name: string; description: string }> = {\n 'gpt-4o': { name: 'GPT-4o', description: 'Most capable GPT-4 model with vision' },\n 'gpt-4o-mini': { name: 'GPT-4o Mini', description: 'Fast and affordable GPT-4o variant' },\n 'gpt-4-turbo': { name: 'GPT-4 Turbo', description: 'GPT-4 Turbo with vision' },\n 'gpt-4': { name: 'GPT-4', description: 'Original GPT-4 model' },\n 'gpt-3.5-turbo': { name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },\n 'o1': { name: 'o1', description: 'Advanced reasoning model' },\n 'o1-preview': { name: 'o1 Preview', description: 'Preview reasoning model' },\n 'o1-mini': { name: 'o1 Mini', description: 'Smaller reasoning model' },\n 'o3-mini': { name: 'o3 Mini', description: 'Latest compact reasoning model' },\n 'o4-mini': { name: 'o4 Mini', description: 'Next-gen compact reasoning model' },\n 'chatgpt-4o-latest': { name: 'ChatGPT-4o Latest', description: 'Latest ChatGPT model' },\n };\n\n /**\n * Prefixes for chat-capable models (filter out embeddings, tts, whisper, dall-e, etc.)\n */\n private static readonly CHAT_MODEL_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-'];\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are OpenAI's built-in tools that execute on OpenAI's servers.\n * The execute function is a no-op since execution is handled by the provider.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n searchContextSize: z.enum(['low', 'medium', 'high']).default('medium').describe('Amount of context to gather'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by OpenAI - this is a passthrough\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n userLocation: z.string().optional().describe('User location for relevant results'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n file_search: defineTool({\n description: 'Search through uploaded files using vector embeddings',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n vectorStoreId: z.string().describe('OpenAI Vector Store ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n code_interpreter: defineTool({\n description: 'Execute Python code in a sandboxed environment',\n args: z.object({\n code: z.string().describe('Python code to execute'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n tenvs: z.object({\n containerId: z.string().optional().describe('Code interpreter container ID'),\n }),\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n\n image_generation: defineTool({\n description: 'Generate images using GPT-image-1',\n args: z.object({\n prompt: z.string().describe('Image generation prompt'),\n quality: z.enum(['standard', 'hd']).default('standard').describe('Image quality'),\n size: z.enum(['1024x1024', '1792x1024', '1024x1792']).default('1024x1024').describe('Image size'),\n }),\n execute: async (_state, _args) => {\n return { status: 'success', result: 'Handled by OpenAI' };\n },\n executionMode: 'provider',\n executionProvider: 'openai',\n }),\n };\n\n /**\n * Which tools are available for each model.\n */\n private static readonly MODEL_TOOLS: Record<string, string[]> = {\n 'gpt-4o': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n 'gpt-4o-mini': ['web_search', 'file_search', 'code_interpreter'],\n 'o1': ['web_search', 'code_interpreter'],\n 'o3-mini': ['web_search', 'code_interpreter'],\n 'o4-mini': ['web_search', 'file_search', 'code_interpreter', 'image_generation'],\n };\n\n /**\n * Get tools embedded in this provider.\n * These are OpenAI's built-in tools with tenv requirements.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n // For OpenAI, return all tools by default - most modern models support all provider tools\n // If a specific model has restrictions, we can filter, but default to returning all\n if (!modelId) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n // Check if we have model-specific restrictions\n let toolNames = OpenAIProvider.MODEL_TOOLS[modelId];\n if (!toolNames) {\n for (const [prefix, tools] of Object.entries(OpenAIProvider.MODEL_TOOLS)) {\n if (modelId.startsWith(prefix)) {\n toolNames = tools;\n break;\n }\n }\n }\n\n // If no specific mapping found, return all tools (OpenAI default)\n if (!toolNames) {\n return { ...OpenAIProvider.TOOLS };\n }\n\n const result: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {};\n for (const name of toolNames) {\n if (OpenAIProvider.TOOLS[name]) {\n result[name] = OpenAIProvider.TOOLS[name];\n }\n }\n return result;\n }\n\n /**\n * Fetch models from OpenAI API with caching.\n */\n private async fetchModelsWithCache(): Promise<OpenAIModelInfo[]> {\n const now = Date.now();\n\n // Return cached data if still valid\n if (\n OpenAIProvider.modelsCache &&\n now - OpenAIProvider.modelsCacheTime < OpenAIProvider.CACHE_TTL\n ) {\n return OpenAIProvider.modelsCache;\n }\n\n // Fetch from OpenAI API\n const client = await this.getClient();\n const response = await client.models.list();\n\n // Convert to array (the response is a Page object)\n const models: OpenAIModelInfo[] = [];\n for await (const model of response) {\n models.push(model as OpenAIModelInfo);\n }\n\n OpenAIProvider.modelsCache = models;\n OpenAIProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Check if a model ID is a chat-capable model.\n */\n private isChatModel(modelId: string): boolean {\n return OpenAIProvider.CHAT_MODEL_PREFIXES.some((prefix) => modelId.startsWith(prefix));\n }\n\n /**\n * Get human-readable name for a model.\n */\n private getModelName(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].name;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return `${meta.name} (${modelId.slice(prefix.length + 1)})`;\n }\n }\n\n // Fallback: format the ID nicely\n return modelId\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n }\n\n /**\n * Get description for a model.\n */\n private getModelDescription(modelId: string): string {\n // Check exact match first\n if (OpenAIProvider.MODEL_METADATA[modelId]) {\n return OpenAIProvider.MODEL_METADATA[modelId].description;\n }\n\n // Check prefix match\n for (const [prefix, meta] of Object.entries(OpenAIProvider.MODEL_METADATA)) {\n if (modelId.startsWith(prefix + '-')) {\n return meta.description;\n }\n }\n\n return '';\n }\n\n /**\n * Map OpenAI model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: OpenAIModelInfo): ProviderModelInfo {\n // Get capabilities for context length\n const caps = OpenAIProvider.MODEL_CAPABILITIES[model.id];\n let contextLength = caps?.maxContextTokens;\n\n // If no exact match, try prefix match\n if (!contextLength) {\n for (const [prefix, prefixCaps] of Object.entries(OpenAIProvider.MODEL_CAPABILITIES)) {\n if (model.id.startsWith(prefix)) {\n contextLength = prefixCaps.maxContextTokens;\n break;\n }\n }\n }\n\n return {\n id: model.id,\n name: this.getModelName(model.id),\n description: this.getModelDescription(model.id),\n contextLength,\n iconId: this.getIcon(model.id),\n };\n }\n\n /**\n * Get list of available models from OpenAI.\n * Fetches from the OpenAI API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n // Filter to chat models only and map to ProviderModelInfo\n let models = rawModels\n .filter((m) => this.isChatModel(m.id))\n .map((m) => this.mapToProviderModelInfo(m))\n .sort((a, b) => {\n // Sort by name for consistent ordering\n return a.name.localeCompare(b.name);\n });\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter) ||\n (m.description && m.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from OpenAI:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n const response = await client.responses.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n\n const stream = await client.responses.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as any;\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status);\n }\n if (status === 400) {\n return new ProviderError(error.message, 'invalid_request', status);\n }\n if (status >= 500) {\n return new ProviderError(error.message, 'server_error', status);\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout');\n }\n\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to OpenAI Responses API format for inspection.\n * Returns the exact request body that would be sent to OpenAI, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(request, DEFAULT_REASONING_LEVELS);\n\n return {\n body: truncateBase64(params as unknown as Record<string, unknown>),\n messagesPath: 'input',\n metadata: {\n endpoint: 'responses.create',\n },\n };\n }\n}\n","/**\n * Discrete transformer functions for OpenAI Responses API provider.\n * These functions convert between Standard Agent types and OpenAI Responses API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ImageUrlPart,\n ProviderReasoningDetail,\n ProviderGeneratedImage,\n ProviderExecutedToolResult,\n} from '@standardagents/spec';\nimport { mapReasoningLevel } from '@standardagents/spec';\nimport type OpenAI from 'openai';\n\n// ============================================================================\n// Type aliases for OpenAI Responses API types\n// ============================================================================\n\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem;\ntype ResponseInput = OpenAI.Responses.ResponseInput;\ntype ResponseOutputItem = OpenAI.Responses.ResponseOutputItem;\ntype FunctionTool = OpenAI.Responses.FunctionTool;\ntype ResponseCreateParams = OpenAI.Responses.ResponseCreateParams;\ntype ResponseIncludable = OpenAI.Responses.ResponseIncludable;\ntype Response = OpenAI.Responses.Response;\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent;\n\n/**\n * Content type for function call output with multimodal content.\n * Note: The OpenAI API accepts arrays here, but the SDK types only allow strings.\n * We serialize this to JSON for type safety.\n */\ntype FunctionCallOutputContent =\n | { type: 'input_text'; text: string }\n | { type: 'input_image'; image_url: string; detail?: 'auto' | 'low' | 'high' };\n\n/** Default reasoning level mapping for OpenAI o-series models */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * OpenAI built-in tool names that are executed by OpenAI on their side.\n * These should NOT be sent as function_call items - their results come back\n * as native response types (e.g., image_generation_call, web_search_call).\n */\nexport const OPENAI_NATIVE_TOOLS = new Set([\n 'image_generation',\n 'web_search',\n 'code_interpreter',\n 'file_search',\n]);\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Transform a single content part to Responses API input format.\n */\nexport function transformContentPart(\n part: ContentPart\n): OpenAI.Responses.ResponseInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image') {\n // Guard against undefined data (e.g., file not loaded)\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n return {\n type: 'input_image',\n image_url: imageUrl,\n detail: part.detail || 'auto',\n };\n }\n // Handle image_url format (stored format uses this instead of 'image')\n if (part.type === 'image_url') {\n // TypeScript narrows to ImageUrlPart here\n const url = part.image_url?.url || '';\n const detail = part.image_url?.detail || 'auto';\n // If URL is a path (not data URI or http), it needs to be loaded separately\n // For now, just pass through - the inspect endpoint should load the data\n return {\n type: 'input_image',\n image_url: url,\n detail,\n };\n }\n // File parts\n // Guard against undefined data\n const fileData = part.data || '';\n return {\n type: 'input_file',\n filename: part.filename,\n file_data: fileData.startsWith('data:')\n ? fileData\n : `data:${part.mediaType || 'application/octet-stream'};base64,${fileData}`,\n };\n}\n\n/**\n * Transform message content (string or parts array) to Responses API format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | OpenAI.Responses.ResponseInputContent[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform a user message to Responses API input item.\n */\nexport function transformUserMessage(\n msg: ProviderMessage & { role: 'user' }\n): OpenAI.Responses.EasyInputMessage {\n const content = transformMessageContent(msg.content);\n return {\n role: 'user',\n content: typeof content === 'string' ? content : content,\n };\n}\n\n/**\n * Transform an assistant message to Responses API input item.\n * Assistant messages from previous turns need special handling.\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): ResponseInputItem[] {\n const items: ResponseInputItem[] = [];\n\n // Add assistant message if there's content OR if there are tool calls\n // The assistant message helps the model understand turn structure\n const hasToolCalls = msg.toolCalls && msg.toolCalls.length > 0;\n if (msg.content || hasToolCalls) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: msg.content\n ? [{ type: 'output_text', text: msg.content }]\n : [], // Empty content array when only tool calls\n } as OpenAI.Responses.ResponseOutputMessage);\n }\n\n // Add reasoning if present\n // OpenAI expects each reasoning item to be passed back EXACTLY as received.\n // Multiple reasoning items can exist with different IDs - we must group by ID\n // and create separate ResponseReasoningItem for each.\n if (msg.reasoning || msg.reasoningDetails) {\n // Group reasoning details by ID - each unique ID becomes a separate reasoning item\n const reasoningItemsById = new Map<string, OpenAI.Responses.ResponseReasoningItem>();\n\n // Default ID for details without explicit IDs - all such details go into one item\n const defaultId = `rs_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n\n // Get or create a reasoning item for a given ID\n const getOrCreateItem = (id: string): OpenAI.Responses.ResponseReasoningItem => {\n let item = reasoningItemsById.get(id);\n if (!item) {\n item = {\n id,\n type: 'reasoning',\n summary: [],\n };\n reasoningItemsById.set(id, item);\n }\n return item;\n };\n\n // Process reasoning details - group by ID\n if (msg.reasoningDetails) {\n for (const detail of msg.reasoningDetails) {\n // Use explicit ID if provided, otherwise use the shared default ID\n // This ensures details without IDs all go into the same reasoning item\n const itemId = detail.id || defaultId;\n const item = getOrCreateItem(itemId);\n\n if (detail.type === 'encrypted' && detail.data) {\n // Each reasoning item gets its own encrypted_content\n item.encrypted_content = detail.data;\n } else if (detail.type === 'summary' && detail.text) {\n item.summary.push({ type: 'summary_text', text: detail.text });\n } else if (detail.type === 'text' && detail.text) {\n // Text-based reasoning details are added to summary\n item.summary.push({ type: 'summary_text', text: detail.text });\n }\n }\n }\n\n // Handle legacy msg.reasoning field (string) - associate with first item or create new\n if (msg.reasoning && typeof msg.reasoning === 'string') {\n if (reasoningItemsById.size > 0) {\n // Add to the first existing item\n const firstItem = reasoningItemsById.values().next().value;\n if (firstItem) {\n firstItem.summary.unshift({ type: 'summary_text', text: msg.reasoning });\n }\n } else {\n // No existing items - create a new one with the default ID\n const newItem = getOrCreateItem(defaultId);\n newItem.summary = [{ type: 'summary_text', text: msg.reasoning }];\n }\n }\n\n // Push all reasoning items - preserves each item's ID and encrypted_content\n for (const item of reasoningItemsById.values()) {\n items.push(item);\n }\n }\n\n // Add tool calls if present\n // Note: image_generation is included as function_call for history reconstruction,\n // even though OpenAI executes it. This allows us to return the result as\n // function_call_output with the image, which the model can \"see\" in stateless mode.\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n // Skip other native OpenAI tools (web_search, code_interpreter, etc.)\n // but include image_generation as a pseudo-function-call\n if (OPENAI_NATIVE_TOOLS.has(tc.name) && tc.name !== 'image_generation') {\n continue;\n }\n items.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n } as OpenAI.Responses.ResponseFunctionToolCall);\n }\n }\n\n return items;\n}\n\n/**\n * Transform a tool result message to Responses API input items.\n *\n * For image_generation (OpenAI's native tool), we treat it as a pseudo-function-call\n * in history reconstruction. This allows us to return the generated image as a\n * function_call_output with input_image content, which the model can \"see\" in\n * stateless mode. (The actual image_generation_call format requires stored IDs.)\n *\n * For other tools, returns standard function_call_output.\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ResponseInputItem[] {\n // Standard function call output\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n // Handle image attachments from any tool (not just image_generation)\n // OpenAI API accepts function_call_output with array content including images.\n // See: https://platform.openai.com/docs/guides/function-calling#formatting-results\n if (msg.attachments?.length) {\n const imageAttachments = msg.attachments.filter(a => a.type === 'image' && a.data);\n if (imageAttachments.length > 0) {\n const outputContent: FunctionCallOutputContent[] = [];\n\n // Add text content first (ResponseInputText format)\n if (output) {\n outputContent.push({\n type: 'input_text',\n text: output,\n });\n }\n\n // Add image content (ResponseInputImage format)\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n outputContent.push({\n type: 'input_image',\n image_url: imageData,\n detail: 'auto',\n });\n }\n\n // Return array content directly - OpenAI API supports this for multimodal output\n // The SDK types are narrower than what the API accepts, so we use type assertion\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: outputContent as unknown as string,\n }];\n }\n }\n\n return [{\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output,\n }];\n}\n\n/**\n * Transform an array of ProviderMessages to Responses API input format.\n * Returns both the input items and extracted system instructions.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n input: ResponseInput;\n instructions: string | undefined;\n} {\n let instructions: string | undefined;\n const input: ResponseInput = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n // System messages become instructions\n instructions = instructions\n ? `${instructions}\\n\\n${msg.content}`\n : msg.content;\n break;\n\n case 'user':\n input.push(transformUserMessage(msg));\n break;\n\n case 'assistant':\n input.push(...transformAssistantMessage(msg));\n break;\n\n case 'tool':\n input.push(...transformToolMessage(msg));\n break;\n }\n }\n\n return { input, instructions };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\n/**\n * Native OpenAI tool types for the Responses API.\n */\ntype NativeToolType = OpenAI.Responses.Tool;\n\n/**\n * Transform a single ProviderTool to Responses API function tool.\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isObjectJsonSchema(schema: Record<string, unknown>): boolean {\n const type = schema.type;\n return type === 'object' || (Array.isArray(type) && type.includes('object'));\n}\n\nfunction normalizeStrictFunctionSchema(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeStrictFunctionSchema(item));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n normalized[key] = normalizeStrictFunctionSchema(child);\n }\n\n if (isObjectJsonSchema(normalized)) {\n const properties = isRecord(normalized.properties) ? normalized.properties : {};\n normalized.properties = properties;\n normalized.required = Object.keys(properties);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictFunctionParameters(inputParams: unknown): Record<string, unknown> {\n const schema = isRecord(inputParams)\n ? inputParams\n : {\n type: 'object',\n properties: {},\n };\n const normalized = normalizeStrictFunctionSchema(schema);\n return isRecord(normalized) ? normalized : { type: 'object', properties: {}, required: [], additionalProperties: false };\n}\n\nexport function transformTool(tool: ProviderTool): FunctionTool {\n // OpenAI strict mode requires every object schema to reject additional\n // properties and mark every declared property as required.\n // Ensure we always have a valid schema, even for tools with no parameters\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n const parameters = normalizeStrictFunctionParameters(inputParams);\n\n return {\n type: 'function',\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters,\n strict: true,\n };\n}\n\n/**\n * Transform an array of ProviderTools to Responses API format.\n * Separates function tools (for local execution) from native tools (executed by OpenAI).\n *\n * @returns Object with functionTools (regular tools) and nativeTools (OpenAI built-ins)\n */\nexport function transformTools(tools: ProviderTool[]): {\n functionTools: FunctionTool[];\n nativeTools: NativeToolType[];\n} {\n const functionTools: FunctionTool[] = [];\n const nativeTools: NativeToolType[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n // Check if this is an OpenAI native tool\n if (tool.executionMode === 'provider' && OPENAI_NATIVE_TOOLS.has(toolName)) {\n // Add as native tool type\n nativeTools.push({ type: toolName } as NativeToolType);\n } else {\n // Regular function tool\n functionTools.push(transformTool(tool));\n }\n }\n\n return { functionTools, nativeTools };\n}\n\n/**\n * Legacy function for backward compatibility - transforms all tools as function tools.\n * @deprecated Use transformTools() which properly handles native tools\n */\nexport function transformToolsLegacy(tools: ProviderTool[]): FunctionTool[] {\n return tools.map(transformTool);\n}\n\n/**\n * Transform tool choice option to Responses API format.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice']\n): ResponseCreateParams['tool_choice'] {\n if (choice === 'auto') {\n return 'auto';\n }\n if (choice === 'none') {\n return 'none';\n }\n if (choice === 'required') {\n return 'required';\n }\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', name: choice.name };\n }\n return 'auto';\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map Responses API status/incomplete_details to Provider finish reason.\n */\nexport function mapFinishReason(response: Response): ProviderFinishReason {\n if (response.status === 'failed') {\n return 'error';\n }\n if (response.status === 'incomplete') {\n if (response.incomplete_details?.reason === 'max_output_tokens') {\n return 'length';\n }\n if (response.incomplete_details?.reason === 'content_filter') {\n return 'content_filter';\n }\n }\n\n // Check if there are function calls in the output\n const hasToolCalls = response.output.some(\n (item) => item.type === 'function_call'\n );\n if (hasToolCalls) {\n return 'tool_calls';\n }\n\n return 'stop';\n}\n\n/**\n * Extract text content from response output items.\n */\nexport function extractTextContent(output: ResponseOutputItem[]): string | null {\n const textParts: string[] = [];\n\n for (const item of output) {\n if (item.type === 'message' && item.role === 'assistant') {\n for (const content of item.content) {\n if (content.type === 'output_text') {\n textParts.push(content.text);\n }\n }\n }\n }\n\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning content from response output items.\n */\nexport function extractReasoningContent(output: ResponseOutputItem[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const item of output) {\n if (item.type === 'reasoning') {\n // Capture the original reasoning ID for multi-turn context (OpenAI uses rs_xxx format)\n const reasoningId = item.id;\n\n // Extract summary text\n if (item.summary && item.summary.length > 0) {\n const summaryText = item.summary\n .map((s) => s.text)\n .join('\\n');\n reasoning = reasoning ? `${reasoning}\\n${summaryText}` : summaryText;\n reasoningDetails.push({ type: 'summary', id: reasoningId, text: summaryText });\n }\n\n // Note: ResponseReasoningItem from OpenAI SDK only exposes summary and encrypted_content\n // There's no public `content` array in the SDK type - text reasoning comes via streaming events\n\n // Extract encrypted content for stateless multi-turn\n if (item.encrypted_content) {\n reasoningDetails.push({ type: 'encrypted', id: reasoningId, data: item.encrypted_content });\n }\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract tool calls from response output items.\n */\nexport function extractToolCalls(\n output: ResponseOutputItem[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const item of output) {\n if (item.type === 'function_call') {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = item.arguments ? JSON.parse(item.arguments) : {};\n } catch {\n // Keep empty object on parse failure\n }\n\n toolCalls.push({\n id: item.call_id,\n name: item.name,\n arguments: parsedArgs,\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\n/**\n * Extract generated images from image_generation_call output items.\n */\nexport function extractProviderImages(\n output: ResponseOutputItem[]\n): ProviderGeneratedImage[] | undefined {\n const images: ProviderGeneratedImage[] = [];\n\n for (const item of output) {\n if (item.type === 'image_generation_call' && item.result) {\n images.push({\n id: item.id,\n toolName: 'image_generation',\n data: item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n });\n }\n }\n\n return images.length > 0 ? images : undefined;\n}\n\nfunction normalizeProviderToolStatus(status: unknown): ProviderExecutedToolResult['status'] {\n if (status === 'completed') return 'completed';\n if (status === 'failed' || status === 'incomplete') return 'failed';\n return 'in_progress';\n}\n\nfunction getStringValue(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction extractOpenAIWebSearchActions(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const action = item.action;\n if (!isRecord(action)) return undefined;\n\n const type = getStringValue(action, 'type') ?? 'search';\n const query = getStringValue(action, 'query');\n const url = getStringValue(action, 'url');\n const pattern = getStringValue(action, 'pattern');\n const rawSources = action.sources;\n const sources = Array.isArray(rawSources)\n ? rawSources\n .filter(isRecord)\n .map((source) => ({\n type: getStringValue(source, 'type'),\n url: getStringValue(source, 'url') ?? '',\n title: getStringValue(source, 'title'),\n }))\n .filter((source) => source.url)\n : undefined;\n\n return {\n actions: [{\n type,\n ...(query ? { query } : {}),\n ...(url ? { url } : {}),\n ...(pattern ? { pattern } : {}),\n ...(sources && sources.length > 0 ? { sources } : {}),\n }],\n };\n}\n\nfunction extractOpenAIFileSearchResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const queries = item.queries;\n const results = item.results;\n return {\n ...(Array.isArray(queries) ? { input: { queries } } : {}),\n ...(Array.isArray(results) ? { results } : {}),\n };\n}\n\nfunction extractOpenAICodeInterpreterResult(item: unknown): ProviderExecutedToolResult['result'] {\n if (!isRecord(item)) return undefined;\n const code = getStringValue(item, 'code');\n const containerId = getStringValue(item, 'container_id');\n const outputs = item.outputs;\n const logs = Array.isArray(outputs)\n ? outputs\n .filter(isRecord)\n .map((output) => getStringValue(output, 'logs'))\n .filter((value): value is string => typeof value === 'string')\n .join('\\n')\n : '';\n\n return {\n ...(code || containerId ? { input: { ...(code ? { code } : {}), ...(containerId ? { containerId } : {}) } } : {}),\n ...(logs ? { output: logs } : {}),\n ...(Array.isArray(outputs) ? { results: outputs } : {}),\n };\n}\n\nfunction providerToolResult(\n name: string,\n id: string,\n status: unknown,\n result?: ProviderExecutedToolResult['result']\n): ProviderExecutedToolResult {\n return {\n name,\n type: name,\n provider: 'openai',\n id,\n status: normalizeProviderToolStatus(status),\n ...(result ? { result } : {}),\n };\n}\n\nexport function extractProviderToolResults(\n output: unknown[]\n): ProviderExecutedToolResult[] | undefined {\n const providerTools: ProviderExecutedToolResult[] = [];\n\n for (const item of output) {\n if (!isRecord(item)) continue;\n\n const type = getStringValue(item, 'type');\n const id = getStringValue(item, 'id');\n if (!type || !id) continue;\n\n if (type === 'web_search_call') {\n providerTools.push(providerToolResult(\n 'web_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIWebSearchActions(item)\n ));\n } else if (type === 'image_generation_call') {\n providerTools.push(providerToolResult(\n 'image_generation',\n id,\n getStringValue(item, 'status'),\n {\n artifacts: [{\n type: 'image',\n id,\n mediaType: 'image/png',\n }],\n }\n ));\n } else if (type === 'file_search_call') {\n providerTools.push(providerToolResult(\n 'file_search',\n id,\n getStringValue(item, 'status'),\n extractOpenAIFileSearchResult(item)\n ));\n } else if (type === 'code_interpreter_call') {\n providerTools.push(providerToolResult(\n 'code_interpreter',\n id,\n getStringValue(item, 'status'),\n extractOpenAICodeInterpreterResult(item)\n ));\n }\n }\n\n return providerTools.length > 0 ? providerTools : undefined;\n}\n\n/**\n * Transform Responses API usage to Provider usage format.\n */\nexport function transformUsage(\n usage: Response['usage'] | undefined\n): ProviderUsage {\n if (!usage) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n }\n\n return {\n promptTokens: usage.input_tokens || 0,\n completionTokens: usage.output_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n reasoningTokens: usage.output_tokens_details?.reasoning_tokens,\n cachedTokens: usage.input_tokens_details?.cached_tokens,\n };\n}\n\n/**\n * Transform a complete Responses API response to ProviderResponse.\n */\nexport function transformResponse(response: Response): ProviderResponse {\n const content = extractTextContent(response.output);\n const { reasoning, reasoningDetails } = extractReasoningContent(response.output);\n const toolCalls = extractToolCalls(response.output);\n const images = extractProviderImages(response.output);\n const providerTools = extractProviderToolResults(response.output);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n images,\n providerTools,\n finishReason: mapFinishReason(response),\n usage: transformUsage(response.usage),\n metadata: {\n model: response.model,\n provider: 'openai',\n requestId: response.id,\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Build a Responses API create request from a ProviderRequest.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS\n): ResponseCreateParams {\n const { input, instructions } = transformMessages(request.messages);\n\n const params: ResponseCreateParams = {\n model: request.model,\n input,\n store: false, // Always stateless\n };\n\n if (instructions) {\n params.instructions = instructions;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n const { functionTools, nativeTools } = transformTools(request.tools);\n\n // Check if any native tools were already used in this conversation\n // If so, exclude them from the tools list to avoid confusing the model\n // (The model sees them as function_call/function_call_output in history,\n // but having them also available as native tools causes regeneration loops)\n const usedNativeTools = new Set<string>();\n for (const msg of request.messages) {\n if (msg.role === 'tool' && msg.toolName && OPENAI_NATIVE_TOOLS.has(msg.toolName)) {\n usedNativeTools.add(msg.toolName);\n }\n }\n\n // Filter out native tools that were already used\n const availableNativeTools = nativeTools.filter(tool => {\n const toolType = (tool as { type: string }).type;\n return !usedNativeTools.has(toolType);\n });\n\n // Combine function tools and native OpenAI tools\n // Native tools (image_generation, web_search, etc.) must be added as their native types\n params.tools = [\n ...functionTools,\n ...availableNativeTools,\n ];\n\n // Include web search results if web_search tool is available\n const hasWebSearch = availableNativeTools.some(\n tool => (tool as { type: string }).type === 'web_search'\n );\n if (hasWebSearch) {\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('web_search_call.results')) {\n includeList.push('web_search_call.results');\n }\n params.include = includeList;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = transformToolChoice(request.toolChoice);\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n // Generation parameters\n if (request.maxOutputTokens !== undefined) {\n params.max_output_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // Reasoning (o-series models)\n if (request.reasoning?.level !== undefined) {\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.reasoning = {\n effort: effort as 'low' | 'medium' | 'high',\n summary: 'auto',\n };\n\n // Include encrypted reasoning for stateless multi-turn\n // Note: reasoning.summary is not a valid include value - summaries come by default\n const includeList: ResponseIncludable[] = params.include || [];\n if (!includeList.includes('reasoning.encrypted_content')) {\n includeList.push('reasoning.encrypted_content');\n }\n params.include = includeList;\n }\n }\n\n // Response format\n if (request.responseFormat) {\n if (request.responseFormat.type === 'json') {\n if (request.responseFormat.schema) {\n params.text = {\n format: {\n type: 'json_schema',\n name: 'response',\n schema: request.responseFormat.schema,\n strict: true,\n },\n };\n } else {\n params.text = {\n format: { type: 'json_object' },\n };\n }\n }\n }\n\n // Merge provider-specific options (but don't let them override our managed include array)\n if (request.providerOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { include: _providerInclude, ...otherOptions } = request.providerOptions as Record<string, unknown>;\n Object.assign(params, otherOptions);\n // Note: We intentionally ignore providerOptions.include - the include array is managed\n // by buildCreateParams based on reasoning settings. User-provided include values like\n // 'reasoning.summary' are invalid and would cause API errors.\n }\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\nexport interface StreamState {\n toolCalls: Map<string, { id: string; name: string; arguments: string }>;\n toolCallIdsByItemId: Map<string, string>;\n imageGenerations: Map<string, { id: string; status: string }>;\n webSearches: Map<string, { id: string; status: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n currentItemId: string | null;\n imageIndex: number;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCalls: new Map(),\n toolCallIdsByItemId: new Map(),\n imageGenerations: new Map(),\n webSearches: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n currentItemId: null,\n imageIndex: 0,\n };\n}\n\ninterface CurrentReasoningDeltaEvent {\n type: 'response.reasoning.delta';\n delta: string;\n}\n\nfunction isCurrentReasoningDeltaEvent(event: unknown): event is CurrentReasoningDeltaEvent {\n return isRecord(event) && event.type === 'response.reasoning.delta' && typeof event.delta === 'string';\n}\n\nfunction resolveToolCallId(state: StreamState, itemId: string): string {\n return state.toolCallIdsByItemId.get(itemId) ?? itemId;\n}\n\nfunction getToolCallForItem(\n state: StreamState,\n itemId: string\n): { id: string; name: string; arguments: string } | undefined {\n return state.toolCalls.get(resolveToolCallId(state, itemId));\n}\n\nfunction parseToolCallArguments(argumentsJson: string): Record<string, unknown> {\n try {\n const parsed: unknown = argumentsJson ? JSON.parse(argumentsJson) : {};\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction getFunctionCallItemField(event: unknown, field: string): string | undefined {\n if (!isRecord(event) || !isRecord(event.item)) {\n return undefined;\n }\n const value = event.item[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Process a stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: ResponseStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n const rawEvent: unknown = event;\n\n if (isCurrentReasoningDeltaEvent(rawEvent)) {\n state.hasReasoning = true;\n state.reasoningContent += rawEvent.delta;\n chunks.push({ type: 'reasoning-delta', delta: rawEvent.delta });\n return chunks;\n }\n\n switch (event.type) {\n // Text content streaming\n case 'response.output_text.delta':\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: event.delta });\n break;\n\n case 'response.output_text.done':\n // Content done is emitted at the end\n break;\n\n // Reasoning streaming\n case 'response.reasoning_text.delta':\n state.hasReasoning = true;\n if (isRecord(event) && typeof event.delta === 'string') {\n state.reasoningContent += event.delta;\n chunks.push({ type: 'reasoning-delta', delta: event.delta });\n }\n break;\n\n case 'response.reasoning_text.done':\n // Reasoning done is emitted at the end\n break;\n\n // Function call and image generation streaming\n case 'response.output_item.added':\n if (event.item.type === 'function_call') {\n const itemId = event.item.id ?? event.item.call_id;\n state.toolCallIdsByItemId.set(itemId, event.item.call_id);\n state.toolCallIdsByItemId.set(event.item.call_id, event.item.call_id);\n state.toolCalls.set(event.item.call_id, {\n id: event.item.call_id,\n name: event.item.name,\n arguments: event.item.arguments ?? '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: event.item.call_id,\n name: event.item.name,\n });\n } else if (event.item.type === 'image_generation_call') {\n // Track image generation for when it completes\n state.imageGenerations.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n } else if (event.item.type === 'web_search_call') {\n // Track web search for when it completes\n state.webSearches.set(event.item.id, {\n id: event.item.id,\n status: event.item.status,\n });\n }\n break;\n\n case 'response.output_item.done':\n // Handle completed image generation\n if (event.item.type === 'image_generation_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'image_generation',\n event.item.id,\n event.item.status,\n event.item.result\n ? {\n artifacts: [{\n type: 'image',\n id: event.item.id,\n mediaType: 'image/png',\n }],\n }\n : undefined\n ),\n });\n\n // Emit image when we have result data - don't require status to be 'completed'\n // OpenAI may return status='generating' even when the result is ready\n if (event.item.result) {\n const imageIndex = state.imageIndex;\n state.imageIndex++;\n chunks.push({\n type: 'image-done',\n index: imageIndex,\n image: {\n id: event.item.id,\n toolName: 'image_generation',\n data: event.item.result,\n mediaType: 'image/png',\n // Note: OpenAI SDK ImageGenerationCall doesn't expose revised_prompt\n },\n });\n }\n // Clean up tracking\n state.imageGenerations.delete(event.item.id);\n } else if (event.item.type === 'web_search_call') {\n // Handle completed web search\n // Extract search actions if available (requires include: ['web_search_call.results'])\n const webSearchItem = event.item as any; // Type assertion needed as SDK types may not include action\n const actions: Array<{\n type: 'search' | 'open_page' | 'find';\n query?: string;\n url?: string;\n pattern?: string;\n sources?: Array<{ type: 'url'; url: string; title?: string }>;\n }> = [];\n\n if (webSearchItem.action) {\n actions.push({\n type: webSearchItem.action.type,\n query: webSearchItem.action.query,\n url: webSearchItem.action.url,\n pattern: webSearchItem.action.pattern,\n sources: webSearchItem.action.sources,\n });\n }\n\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'web_search',\n event.item.id,\n event.item.status,\n actions.length > 0 ? { actions } : undefined\n ),\n });\n\n // Clean up tracking\n state.webSearches.delete(event.item.id);\n } else if (event.item.type === 'file_search_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'file_search',\n event.item.id,\n event.item.status,\n extractOpenAIFileSearchResult(event.item)\n ),\n });\n } else if (event.item.type === 'code_interpreter_call') {\n chunks.push({\n type: 'provider-tool-done',\n tool: providerToolResult(\n 'code_interpreter',\n event.item.id,\n event.item.status,\n extractOpenAICodeInterpreterResult(event.item)\n ),\n });\n }\n break;\n\n case 'response.function_call_arguments.delta': {\n const deltaToolCall = getToolCallForItem(state, event.item_id);\n if (deltaToolCall) {\n deltaToolCall.arguments += event.delta;\n chunks.push({\n type: 'tool-call-delta',\n id: deltaToolCall.id,\n argumentsDelta: event.delta,\n });\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n const doneToolCall = getToolCallForItem(state, event.item_id);\n if (doneToolCall) {\n const finalArguments =\n event.arguments ||\n getFunctionCallItemField(rawEvent, 'arguments') ||\n doneToolCall.arguments;\n doneToolCall.arguments = finalArguments;\n const parsedArgs = parseToolCallArguments(finalArguments);\n chunks.push({\n type: 'tool-call-done',\n id: doneToolCall.id,\n arguments: parsedArgs,\n });\n }\n break;\n }\n\n // Response completion\n case 'response.completed': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details (including encrypted content) for multi-turn continuity\n const { reasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage),\n reasoningDetails,\n });\n break;\n }\n\n case 'response.failed':\n chunks.push({\n type: 'error',\n error: event.response.error?.message || 'Response generation failed',\n code: event.response.error?.code,\n });\n break;\n\n case 'response.incomplete': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n // Extract reasoning details even for incomplete responses\n const { reasoningDetails: incompleteReasoningDetails } = extractReasoningContent(event.response.output);\n\n chunks.push({\n type: 'finish',\n finishReason: mapFinishReason(event.response),\n usage: transformUsage(event.response.usage),\n reasoningDetails: incompleteReasoningDetails,\n });\n break;\n }\n\n // Ignore other events\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n * Matches data URIs and long strings with base64-like character patterns.\n */\nfunction isBase64Like(str: string): boolean {\n // Data URIs (data:image/png;base64,...)\n if (str.startsWith('data:')) return true;\n\n // Very long strings (>200 chars) that look like base64\n // Base64 only contains A-Z, a-z, 0-9, +, /, and = for padding\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n // Check first 200 chars to avoid regex on huge strings\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\n/**\n * Truncate a base64 string for display, preserving the start and showing length.\n */\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n * Detects base64 strings (data URIs and long base64-like strings) and truncates them.\n *\n * @param obj - The object to process\n * @param maxLength - Maximum length for base64 preview (default 50)\n * @returns A new object with base64 data truncated\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle strings\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n // Return primitives as-is\n return obj;\n}\n","import OPENAI_ICON_FILE from './vendor-icons/openai.svg';\n\n/**\n * OpenAI icon asset.\n */\nexport const OPENAI_ICON = OPENAI_ICON_FILE;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the OpenAI icon as a data URI.\n */\nexport function getOpenAIIconDataUri(): string {\n return normalizeIcon(OPENAI_ICON);\n}\n","/**\n * OpenAI provider options schema.\n *\n * Defines typed providerOptions for OpenAI models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.openai.com/docs/api-reference/chat/create\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * OpenAI provider options schema.\n *\n * These options are passed directly to the OpenAI API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'default',\n * user: 'user-123',\n * seed: 42,\n * }\n * ```\n */\nexport const openaiProviderOptions = z.object({\n /** Service tier for request: 'auto', 'default', or 'flex' */\n service_tier: z.enum(['auto', 'default', 'flex']).optional(),\n\n /** User identifier for abuse monitoring */\n user: z.string().optional(),\n\n /** Seed for deterministic outputs (beta feature) */\n seed: z.number().int().optional(),\n\n /** Frequency penalty (-2.0 to 2.0) - reduces repetition of tokens */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Presence penalty (-2.0 to 2.0) - encourages new topics */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Whether to return log probabilities of output tokens */\n logprobs: z.boolean().optional(),\n\n /** Number of most likely tokens to return at each position (0-20) */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Whether to store the completion for future reference */\n store: z.boolean().optional(),\n\n /** Metadata for stored completions */\n metadata: z.record(z.string(), z.string()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for OpenAI provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type OpenAIProviderOptions = z.infer<typeof openaiProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig } from '@standardagents/spec';\nimport { OpenAIProvider } from './OpenAIProvider';\nimport { openaiProviderOptions } from './providerOptions';\n\n/**\n * OpenAI provider factory for Standard Agents\n *\n * Includes typed providerOptions for OpenAI-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { openai } from '@standardagents/openai';\n *\n * export default defineModel({\n * name: 'gpt-4o',\n * provider: openai,\n * model: 'gpt-4o',\n * inputPrice: 2.5,\n * outputPrice: 10,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 128000,\n * },\n * providerOptions: {\n * service_tier: 'default',\n * },\n * });\n * ```\n */\nexport const openai: ProviderFactoryWithOptions<typeof openaiProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new OpenAIProvider(config),\n { providerOptions: openaiProviderOptions }\n );\n\n// Re-export the provider options schema and types\nexport { openaiProviderOptions, type OpenAIProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { OpenAIProvider } from './OpenAIProvider';\n"],"mappings":";AAcA,SAAS,eAAe,kBAAkB;AAC1C,SAAS,SAAS;;;ACMlB,SAAS,yBAAyB;AA0B3B,IAAM,2BAA0D;AAAA,EACrE,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP;AAOO,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,SAAS,qBACd,MACuC;AACvC,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,EAAE,MAAM,cAAc,MAAM,KAAK,KAAK;AAAA,EAC/C;AACA,MAAI,KAAK,SAAS,SAAS;AAEzB,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,WAAW,KAAK,WAAW,OAAO,IACpC,OACA,QAAQ,KAAK,aAAa,WAAW,WAAW,IAAI;AACxD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,aAAa;AAE7B,UAAM,MAAM,KAAK,WAAW,OAAO;AACnC,UAAM,SAAS,KAAK,WAAW,UAAU;AAGzC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,QAAQ;AAC9B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,KAAK;AAAA,IACf,WAAW,SAAS,WAAW,OAAO,IAClC,WACA,QAAQ,KAAK,aAAa,0BAA0B,WAAW,QAAQ;AAAA,EAC7E;AACF;AAKO,SAAS,wBACd,SACkD;AAClD,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,IAAI,oBAAoB;AACzC;AASO,SAAS,qBACd,KACmC;AACnC,QAAM,UAAU,wBAAwB,IAAI,OAAO;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,YAAY,WAAW,UAAU;AAAA,EACnD;AACF;AAMO,SAAS,0BACd,KACqB;AACrB,QAAM,QAA6B,CAAC;AAIpC,QAAM,eAAe,IAAI,aAAa,IAAI,UAAU,SAAS;AAC7D,MAAI,IAAI,WAAW,cAAc;AAC/B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,IAAI,UACT,CAAC,EAAE,MAAM,eAAe,MAAM,IAAI,QAAQ,CAAC,IAC3C,CAAC;AAAA;AAAA,IACP,CAA2C;AAAA,EAC7C;AAMA,MAAI,IAAI,aAAa,IAAI,kBAAkB;AAEzC,UAAM,qBAAqB,oBAAI,IAAoD;AAGnF,UAAM,YAAY,MAAM,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAG1E,UAAM,kBAAkB,CAAC,OAAuD;AAC9E,UAAI,OAAO,mBAAmB,IAAI,EAAE;AACpC,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,CAAC;AAAA,QACZ;AACA,2BAAmB,IAAI,IAAI,IAAI;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AAGA,QAAI,IAAI,kBAAkB;AACxB,iBAAW,UAAU,IAAI,kBAAkB;AAGzC,cAAM,SAAS,OAAO,MAAM;AAC5B,cAAM,OAAO,gBAAgB,MAAM;AAEnC,YAAI,OAAO,SAAS,eAAe,OAAO,MAAM;AAE9C,eAAK,oBAAoB,OAAO;AAAA,QAClC,WAAW,OAAO,SAAS,aAAa,OAAO,MAAM;AACnD,eAAK,QAAQ,KAAK,EAAE,MAAM,gBAAgB,MAAM,OAAO,KAAK,CAAC;AAAA,QAC/D,WAAW,OAAO,SAAS,UAAU,OAAO,MAAM;AAEhD,eAAK,QAAQ,KAAK,EAAE,MAAM,gBAAgB,MAAM,OAAO,KAAK,CAAC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAGA,QAAI,IAAI,aAAa,OAAO,IAAI,cAAc,UAAU;AACtD,UAAI,mBAAmB,OAAO,GAAG;AAE/B,cAAM,YAAY,mBAAmB,OAAO,EAAE,KAAK,EAAE;AACrD,YAAI,WAAW;AACb,oBAAU,QAAQ,QAAQ,EAAE,MAAM,gBAAgB,MAAM,IAAI,UAAU,CAAC;AAAA,QACzE;AAAA,MACF,OAAO;AAEL,cAAM,UAAU,gBAAgB,SAAS;AACzC,gBAAQ,UAAU,CAAC,EAAE,MAAM,gBAAgB,MAAM,IAAI,UAAU,CAAC;AAAA,MAClE;AAAA,IACF;AAGA,eAAW,QAAQ,mBAAmB,OAAO,GAAG;AAC9C,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAMA,MAAI,IAAI,aAAa,IAAI,UAAU,SAAS,GAAG;AAC7C,eAAW,MAAM,IAAI,WAAW;AAG9B,UAAI,oBAAoB,IAAI,GAAG,IAAI,KAAK,GAAG,SAAS,oBAAoB;AACtE;AAAA,MACF;AACA,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAAS,GAAG;AAAA,QACZ,MAAM,GAAG;AAAA,QACT,WAAW,KAAK,UAAU,GAAG,SAAS;AAAA,MACxC,CAA8C;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AACT;AAYO,SAAS,qBACd,KACqB;AAErB,MAAI;AAEJ,MAAI,OAAO,IAAI,YAAY,UAAU;AACnC,aAAS,IAAI;AAAA,EACf,WAAW,UAAU,IAAI,SAAS;AAChC,QAAI,IAAI,QAAQ,SAAS,QAAQ;AAC/B,eAAS,IAAI,QAAQ;AAAA,IACvB,WAAW,IAAI,QAAQ,SAAS,SAAS;AACvC,eAAS,UAAU,IAAI,QAAQ,KAAK;AAAA,IACtC,OAAO;AACL,eAAS,KAAK,UAAU,IAAI,OAAO;AAAA,IACrC;AAAA,EACF,OAAO;AACL,aAAS,KAAK,UAAU,IAAI,OAAO;AAAA,EACrC;AAKA,MAAI,IAAI,aAAa,QAAQ;AAC3B,UAAM,mBAAmB,IAAI,YAAY,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE,IAAI;AACjF,QAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAM,gBAA6C,CAAC;AAGpD,UAAI,QAAQ;AACV,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAGA,iBAAW,cAAc,kBAAkB;AACzC,cAAM,iBAAiB,WAAW,QAAQ;AAC1C,cAAM,YAAY,eAAe,WAAW,OAAO,IAC/C,iBACA,QAAQ,WAAW,aAAa,WAAW,WAAW,cAAc;AAExE,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAIA,aAAO,CAAC;AAAA,QACN,MAAM;AAAA,QACN,SAAS,IAAI;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,CAAC;AAAA,IACN,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAMO,SAAS,kBAAkB,UAGhC;AACA,MAAI;AACJ,QAAM,QAAuB,CAAC;AAE9B,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AAEH,uBAAe,eACX,GAAG,YAAY;AAAA;AAAA,EAAO,IAAI,OAAO,KACjC,IAAI;AACR;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,qBAAqB,GAAG,CAAC;AACpC;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,GAAG,0BAA0B,GAAG,CAAC;AAC5C;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,GAAG,qBAAqB,GAAG,CAAC;AACvC;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,aAAa;AAC/B;AAcA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,QAA0C;AACpE,QAAM,OAAO,OAAO;AACpB,SAAO,SAAS,YAAa,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ;AAC5E;AAEA,SAAS,8BAA8B,OAAyB;AAC9D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,8BAA8B,IAAI,CAAC;AAAA,EAChE;AAEA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,eAAW,GAAG,IAAI,8BAA8B,KAAK;AAAA,EACvD;AAEA,MAAI,mBAAmB,UAAU,GAAG;AAClC,UAAM,aAAa,SAAS,WAAW,UAAU,IAAI,WAAW,aAAa,CAAC;AAC9E,eAAW,aAAa;AACxB,eAAW,WAAW,OAAO,KAAK,UAAU;AAC5C,eAAW,uBAAuB;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,kCAAkC,aAA+C;AACxF,QAAM,SAAS,SAAS,WAAW,IAC/B,cACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,EACf;AACJ,QAAM,aAAa,8BAA8B,MAAM;AACvD,SAAO,SAAS,UAAU,IAAI,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,UAAU,CAAC,GAAG,sBAAsB,MAAM;AACzH;AAEO,SAAS,cAAc,MAAkC;AAI9D,QAAM,cAAc,KAAK,SAAS;AAElC,QAAM,aAAa,kCAAkC,WAAW;AAEhE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK,SAAS;AAAA,IACpB,aAAa,KAAK,SAAS,eAAe;AAAA,IAC1C;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAQO,SAAS,eAAe,OAG7B;AACA,QAAM,gBAAgC,CAAC;AACvC,QAAM,cAAgC,CAAC;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,SAAS;AAG/B,QAAI,KAAK,kBAAkB,cAAc,oBAAoB,IAAI,QAAQ,GAAG;AAE1E,kBAAY,KAAK,EAAE,MAAM,SAAS,CAAmB;AAAA,IACvD,OAAO;AAEL,oBAAc,KAAK,cAAc,IAAI,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,YAAY;AACtC;AAaO,SAAS,oBACd,QACqC;AACrC,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,YAAY;AACzB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,YAAY,UAAU,QAAQ;AAClD,WAAO,EAAE,MAAM,YAAY,MAAM,OAAO,KAAK;AAAA,EAC/C;AACA,SAAO;AACT;AASO,SAAS,gBAAgB,UAA0C;AACxE,MAAI,SAAS,WAAW,UAAU;AAChC,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,cAAc;AACpC,QAAI,SAAS,oBAAoB,WAAW,qBAAqB;AAC/D,aAAO;AAAA,IACT;AACA,QAAI,SAAS,oBAAoB,WAAW,kBAAkB;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,eAAe,SAAS,OAAO;AAAA,IACnC,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B;AACA,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,QAA6C;AAC9E,QAAM,YAAsB,CAAC;AAE7B,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa;AACxD,iBAAW,WAAW,KAAK,SAAS;AAClC,YAAI,QAAQ,SAAS,eAAe;AAClC,oBAAU,KAAK,QAAQ,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI;AACrD;AAKO,SAAS,wBAAwB,QAGtC;AACA,MAAI,YAA2B;AAC/B,QAAM,mBAA8C,CAAC;AAErD,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,aAAa;AAE7B,YAAM,cAAc,KAAK;AAGzB,UAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,cAAM,cAAc,KAAK,QACtB,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AACZ,oBAAY,YAAY,GAAG,SAAS;AAAA,EAAK,WAAW,KAAK;AACzD,yBAAiB,KAAK,EAAE,MAAM,WAAW,IAAI,aAAa,MAAM,YAAY,CAAC;AAAA,MAC/E;AAMA,UAAI,KAAK,mBAAmB;AAC1B,yBAAiB,KAAK,EAAE,MAAM,aAAa,IAAI,aAAa,MAAM,KAAK,kBAAkB,CAAC;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,EACrE;AACF;AAKO,SAAS,iBACd,QACoC;AACpC,QAAM,YAAoC,CAAC;AAE3C,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,iBAAiB;AACjC,UAAI,aAAsC,CAAC;AAC3C,UAAI;AACF,qBAAa,KAAK,YAAY,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAC9D,QAAQ;AAAA,MAER;AAEA,gBAAU,KAAK;AAAA,QACb,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAKO,SAAS,sBACd,QACsC;AACtC,QAAM,SAAmC,CAAC;AAE1C,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,2BAA2B,KAAK,QAAQ;AACxD,aAAO,KAAK;AAAA,QACV,IAAI,KAAK;AAAA,QACT,UAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,WAAW;AAAA;AAAA,MAEb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,4BAA4B,QAAuD;AAC1F,MAAI,WAAW,YAAa,QAAO;AACnC,MAAI,WAAW,YAAY,WAAW,aAAc,QAAO;AAC3D,SAAO;AACT;AAEA,SAAS,eAAe,QAAiC,KAAiC;AACxF,QAAM,QAAQ,OAAO,GAAG;AACxB,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,8BAA8B,MAAqD;AAC1F,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAE9B,QAAM,OAAO,eAAe,QAAQ,MAAM,KAAK;AAC/C,QAAM,QAAQ,eAAe,QAAQ,OAAO;AAC5C,QAAM,MAAM,eAAe,QAAQ,KAAK;AACxC,QAAM,UAAU,eAAe,QAAQ,SAAS;AAChD,QAAM,aAAa,OAAO;AAC1B,QAAM,UAAU,MAAM,QAAQ,UAAU,IACpC,WACG,OAAO,QAAQ,EACf,IAAI,CAAC,YAAY;AAAA,IAChB,MAAM,eAAe,QAAQ,MAAM;AAAA,IACnC,KAAK,eAAe,QAAQ,KAAK,KAAK;AAAA,IACtC,OAAO,eAAe,QAAQ,OAAO;AAAA,EACvC,EAAE,EACD,OAAO,CAAC,WAAW,OAAO,GAAG,IAChC;AAEJ,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,MACR;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,MACrB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,8BAA8B,MAAqD;AAC1F,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,UAAU,KAAK;AACrB,QAAM,UAAU,KAAK;AACrB,SAAO;AAAA,IACL,GAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,IACvD,GAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9C;AACF;AAEA,SAAS,mCAAmC,MAAqD;AAC/F,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,OAAO,eAAe,MAAM,MAAM;AACxC,QAAM,cAAc,eAAe,MAAM,cAAc;AACvD,QAAM,UAAU,KAAK;AACrB,QAAM,OAAO,MAAM,QAAQ,OAAO,IAC9B,QACG,OAAO,QAAQ,EACf,IAAI,CAAC,WAAW,eAAe,QAAQ,MAAM,CAAC,EAC9C,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,KAAK,IAAI,IACZ;AAEJ,SAAO;AAAA,IACL,GAAI,QAAQ,cAAc,EAAE,OAAO,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC,EAAG,EAAE,IAAI,CAAC;AAAA,IAC/G,GAAI,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/B,GAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,SAAS,QAAQ,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,mBACP,MACA,IACA,QACA,QAC4B;AAC5B,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,QAAQ,4BAA4B,MAAM;AAAA,IAC1C,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;AAEO,SAAS,2BACd,QAC0C;AAC1C,QAAM,gBAA8C,CAAC;AAErD,aAAW,QAAQ,QAAQ;AACzB,QAAI,CAAC,SAAS,IAAI,EAAG;AAErB,UAAM,OAAO,eAAe,MAAM,MAAM;AACxC,UAAM,KAAK,eAAe,MAAM,IAAI;AACpC,QAAI,CAAC,QAAQ,CAAC,GAAI;AAElB,QAAI,SAAS,mBAAmB;AAC9B,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,eAAe,MAAM,QAAQ;AAAA,QAC7B,8BAA8B,IAAI;AAAA,MACpC,CAAC;AAAA,IACH,WAAW,SAAS,yBAAyB;AAC3C,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,eAAe,MAAM,QAAQ;AAAA,QAC7B;AAAA,UACE,WAAW,CAAC;AAAA,YACV,MAAM;AAAA,YACN;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,WAAW,SAAS,oBAAoB;AACtC,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,eAAe,MAAM,QAAQ;AAAA,QAC7B,8BAA8B,IAAI;AAAA,MACpC,CAAC;AAAA,IACH,WAAW,SAAS,yBAAyB;AAC3C,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,eAAe,MAAM,QAAQ;AAAA,QAC7B,mCAAmC,IAAI;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,cAAc,SAAS,IAAI,gBAAgB;AACpD;AAKO,SAAS,eACd,OACe;AACf,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,MAAM,gBAAgB;AAAA,IACpC,kBAAkB,MAAM,iBAAiB;AAAA,IACzC,aAAa,MAAM,gBAAgB;AAAA,IACnC,iBAAiB,MAAM,uBAAuB;AAAA,IAC9C,cAAc,MAAM,sBAAsB;AAAA,EAC5C;AACF;AAKO,SAAS,kBAAkB,UAAsC;AACtE,QAAM,UAAU,mBAAmB,SAAS,MAAM;AAClD,QAAM,EAAE,WAAW,iBAAiB,IAAI,wBAAwB,SAAS,MAAM;AAC/E,QAAM,YAAY,iBAAiB,SAAS,MAAM;AAClD,QAAM,SAAS,sBAAsB,SAAS,MAAM;AACpD,QAAM,gBAAgB,2BAA2B,SAAS,MAAM;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,gBAAgB,QAAQ;AAAA,IACtC,OAAO,eAAe,SAAS,KAAK;AAAA,IACpC,UAAU;AAAA,MACR,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,MACV,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AACF;AASO,SAAS,kBACd,SACA,kBAAiD,0BAC3B;AACtB,QAAM,EAAE,OAAO,aAAa,IAAI,kBAAkB,QAAQ,QAAQ;AAElE,QAAM,SAA+B;AAAA,IACnC,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,OAAO;AAAA;AAAA,EACT;AAEA,MAAI,cAAc;AAChB,WAAO,eAAe;AAAA,EACxB;AAGA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,UAAM,EAAE,eAAe,YAAY,IAAI,eAAe,QAAQ,KAAK;AAMnE,UAAM,kBAAkB,oBAAI,IAAY;AACxC,eAAW,OAAO,QAAQ,UAAU;AAClC,UAAI,IAAI,SAAS,UAAU,IAAI,YAAY,oBAAoB,IAAI,IAAI,QAAQ,GAAG;AAChF,wBAAgB,IAAI,IAAI,QAAQ;AAAA,MAClC;AAAA,IACF;AAGA,UAAM,uBAAuB,YAAY,OAAO,UAAQ;AACtD,YAAM,WAAY,KAA0B;AAC5C,aAAO,CAAC,gBAAgB,IAAI,QAAQ;AAAA,IACtC,CAAC;AAID,WAAO,QAAQ;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAGA,UAAM,eAAe,qBAAqB;AAAA,MACxC,UAAS,KAA0B,SAAS;AAAA,IAC9C;AACA,QAAI,cAAc;AAChB,YAAM,cAAoC,OAAO,WAAW,CAAC;AAC7D,UAAI,CAAC,YAAY,SAAS,yBAAyB,GAAG;AACpD,oBAAY,KAAK,yBAAyB;AAAA,MAC5C;AACA,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,QAAQ,eAAe,QAAW;AACpC,aAAO,cAAc,oBAAoB,QAAQ,UAAU;AAAA,IAC7D;AAEA,QAAI,QAAQ,sBAAsB,QAAW;AAC3C,aAAO,sBAAsB,QAAQ;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,QAAQ,oBAAoB,QAAW;AACzC,WAAO,oBAAoB,QAAQ;AAAA,EACrC;AAEA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO,cAAc,QAAQ;AAAA,EAC/B;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAGA,MAAI,QAAQ,WAAW,UAAU,QAAW;AAC1C,UAAM,SAAS,kBAAkB,QAAQ,UAAU,OAAO,eAAe;AACzE,QAAI,QAAQ;AACV,aAAO,YAAY;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,MACX;AAIA,YAAM,cAAoC,OAAO,WAAW,CAAC;AAC7D,UAAI,CAAC,YAAY,SAAS,6BAA6B,GAAG;AACxD,oBAAY,KAAK,6BAA6B;AAAA,MAChD;AACA,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,QAAQ,gBAAgB;AAC1B,QAAI,QAAQ,eAAe,SAAS,QAAQ;AAC1C,UAAI,QAAQ,eAAe,QAAQ;AACjC,eAAO,OAAO;AAAA,UACZ,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,QAAQ,QAAQ,eAAe;AAAA,YAC/B,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,OAAO;AAAA,UACZ,QAAQ,EAAE,MAAM,cAAc;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,iBAAiB;AAE3B,UAAM,EAAE,SAAS,kBAAkB,GAAG,aAAa,IAAI,QAAQ;AAC/D,WAAO,OAAO,QAAQ,YAAY;AAAA,EAIpC;AAEA,SAAO;AACT;AAkBO,SAAS,oBAAiC;AAC/C,SAAO;AAAA,IACL,WAAW,oBAAI,IAAI;AAAA,IACnB,qBAAqB,oBAAI,IAAI;AAAA,IAC7B,kBAAkB,oBAAI,IAAI;AAAA,IAC1B,aAAa,oBAAI,IAAI;AAAA,IACrB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe;AAAA,IACf,YAAY;AAAA,EACd;AACF;AAOA,SAAS,6BAA6B,OAAqD;AACzF,SAAO,SAAS,KAAK,KAAK,MAAM,SAAS,8BAA8B,OAAO,MAAM,UAAU;AAChG;AAEA,SAAS,kBAAkB,OAAoB,QAAwB;AACrE,SAAO,MAAM,oBAAoB,IAAI,MAAM,KAAK;AAClD;AAEA,SAAS,mBACP,OACA,QAC6D;AAC7D,SAAO,MAAM,UAAU,IAAI,kBAAkB,OAAO,MAAM,CAAC;AAC7D;AAEA,SAAS,uBAAuB,eAAgD;AAC9E,MAAI;AACF,UAAM,SAAkB,gBAAgB,KAAK,MAAM,aAAa,IAAI,CAAC;AACrE,WAAO,SAAS,MAAM,IAAI,SAAS,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,yBAAyB,OAAgB,OAAmC;AACnF,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,IAAI,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAKO,SAAS,mBACd,OACA,OACuB;AACvB,QAAM,SAAgC,CAAC;AACvC,QAAM,WAAoB;AAE1B,MAAI,6BAA6B,QAAQ,GAAG;AAC1C,UAAM,eAAe;AACrB,UAAM,oBAAoB,SAAS;AACnC,WAAO,KAAK,EAAE,MAAM,mBAAmB,OAAO,SAAS,MAAM,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,MAAM;AAAA;AAAA,IAElB,KAAK;AACH,YAAM,aAAa;AACnB,aAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,MAAM,MAAM,CAAC;AACzD;AAAA,IAEF,KAAK;AAEH;AAAA;AAAA,IAGF,KAAK;AACH,YAAM,eAAe;AACrB,UAAI,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,UAAU;AACtD,cAAM,oBAAoB,MAAM;AAChC,eAAO,KAAK,EAAE,MAAM,mBAAmB,OAAO,MAAM,MAAM,CAAC;AAAA,MAC7D;AACA;AAAA,IAEF,KAAK;AAEH;AAAA;AAAA,IAGF,KAAK;AACH,UAAI,MAAM,KAAK,SAAS,iBAAiB;AACvC,cAAM,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK;AAC3C,cAAM,oBAAoB,IAAI,QAAQ,MAAM,KAAK,OAAO;AACxD,cAAM,oBAAoB,IAAI,MAAM,KAAK,SAAS,MAAM,KAAK,OAAO;AACpE,cAAM,UAAU,IAAI,MAAM,KAAK,SAAS;AAAA,UACtC,IAAI,MAAM,KAAK;AAAA,UACf,MAAM,MAAM,KAAK;AAAA,UACjB,WAAW,MAAM,KAAK,aAAa;AAAA,QACrC,CAAC;AACD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,MAAM,KAAK;AAAA,UACf,MAAM,MAAM,KAAK;AAAA,QACnB,CAAC;AAAA,MACH,WAAW,MAAM,KAAK,SAAS,yBAAyB;AAEtD,cAAM,iBAAiB,IAAI,MAAM,KAAK,IAAI;AAAA,UACxC,IAAI,MAAM,KAAK;AAAA,UACf,QAAQ,MAAM,KAAK;AAAA,QACrB,CAAC;AAAA,MACH,WAAW,MAAM,KAAK,SAAS,mBAAmB;AAEhD,cAAM,YAAY,IAAI,MAAM,KAAK,IAAI;AAAA,UACnC,IAAI,MAAM,KAAK;AAAA,UACf,QAAQ,MAAM,KAAK;AAAA,QACrB,CAAC;AAAA,MACH;AACA;AAAA,IAEF,KAAK;AAEH,UAAI,MAAM,KAAK,SAAS,yBAAyB;AAC/C,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,YACX,MAAM,KAAK,SACP;AAAA,cACE,WAAW,CAAC;AAAA,gBACV,MAAM;AAAA,gBACN,IAAI,MAAM,KAAK;AAAA,gBACf,WAAW;AAAA,cACb,CAAC;AAAA,YACH,IACA;AAAA,UACN;AAAA,QACF,CAAC;AAID,YAAI,MAAM,KAAK,QAAQ;AACrB,gBAAM,aAAa,MAAM;AACzB,gBAAM;AACN,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,IAAI,MAAM,KAAK;AAAA,cACf,UAAU;AAAA,cACV,MAAM,MAAM,KAAK;AAAA,cACjB,WAAW;AAAA;AAAA,YAEb;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,iBAAiB,OAAO,MAAM,KAAK,EAAE;AAAA,MAC7C,WAAW,MAAM,KAAK,SAAS,mBAAmB;AAGhD,cAAM,gBAAgB,MAAM;AAC5B,cAAM,UAMD,CAAC;AAEN,YAAI,cAAc,QAAQ;AACxB,kBAAQ,KAAK;AAAA,YACX,MAAM,cAAc,OAAO;AAAA,YAC3B,OAAO,cAAc,OAAO;AAAA,YAC5B,KAAK,cAAc,OAAO;AAAA,YAC1B,SAAS,cAAc,OAAO;AAAA,YAC9B,SAAS,cAAc,OAAO;AAAA,UAChC,CAAC;AAAA,QACH;AAEA,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,YACX,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI;AAAA,UACrC;AAAA,QACF,CAAC;AAGD,cAAM,YAAY,OAAO,MAAM,KAAK,EAAE;AAAA,MACxC,WAAW,MAAM,KAAK,SAAS,oBAAoB;AACjD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,YACX,8BAA8B,MAAM,IAAI;AAAA,UAC1C;AAAA,QACF,CAAC;AAAA,MACH,WAAW,MAAM,KAAK,SAAS,yBAAyB;AACtD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,YACX,mCAAmC,MAAM,IAAI;AAAA,UAC/C;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IAEF,KAAK,0CAA0C;AAC7C,YAAM,gBAAgB,mBAAmB,OAAO,MAAM,OAAO;AAC7D,UAAI,eAAe;AACjB,sBAAc,aAAa,MAAM;AACjC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,cAAc;AAAA,UAClB,gBAAgB,MAAM;AAAA,QACxB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAAA,IAEA,KAAK,yCAAyC;AAC5C,YAAM,eAAe,mBAAmB,OAAO,MAAM,OAAO;AAC5D,UAAI,cAAc;AAChB,cAAM,iBACJ,MAAM,aACN,yBAAyB,UAAU,WAAW,KAC9C,aAAa;AACf,qBAAa,YAAY;AACzB,cAAM,aAAa,uBAAuB,cAAc;AACxD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,aAAa;AAAA,UACjB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAAA;AAAA,IAGA,KAAK,sBAAsB;AACzB,UAAI,MAAM,YAAY;AACpB,eAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA,MACtC;AACA,UAAI,MAAM,cAAc;AACtB,eAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAAA,MACxC;AAGA,YAAM,EAAE,iBAAiB,IAAI,wBAAwB,MAAM,SAAS,MAAM;AAE1E,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,cAAc,gBAAgB,MAAM,QAAQ;AAAA,QAC5C,OAAO,eAAe,MAAM,SAAS,KAAK;AAAA,QAC1C;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,OAAO,MAAM,SAAS,OAAO,WAAW;AAAA,QACxC,MAAM,MAAM,SAAS,OAAO;AAAA,MAC9B,CAAC;AACD;AAAA,IAEF,KAAK,uBAAuB;AAC1B,UAAI,MAAM,YAAY;AACpB,eAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA,MACtC;AACA,UAAI,MAAM,cAAc;AACtB,eAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAAA,MACxC;AAGA,YAAM,EAAE,kBAAkB,2BAA2B,IAAI,wBAAwB,MAAM,SAAS,MAAM;AAEtG,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,cAAc,gBAAgB,MAAM,QAAQ;AAAA,QAC5C,OAAO,eAAe,MAAM,SAAS,KAAK;AAAA,QAC1C,kBAAkB;AAAA,MACpB,CAAC;AACD;AAAA,IACF;AAAA;AAAA,IAGA;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAKO,SAAS,iBAAiB,OAAe,MAAoC;AAClF,SAAO,EAAE,MAAM,SAAS,OAAO,KAAK;AACtC;AAUA,SAAS,aAAa,KAAsB;AAE1C,MAAI,IAAI,WAAW,OAAO,EAAG,QAAO;AAIpC,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,gBAAgB;AAEtB,WAAO,cAAc,KAAK,IAAI,UAAU,GAAG,GAAG,CAAC;AAAA,EACjD;AAEA,SAAO;AACT;AAKA,SAAS,qBAAqB,KAAa,YAAoB,IAAY;AACzE,MAAI,IAAI,UAAU,UAAW,QAAO;AAEpC,QAAM,UAAU,IAAI,UAAU,GAAG,SAAS;AAC1C,SAAO,GAAG,OAAO,kBAAkB,IAAI,OAAO,eAAe,CAAC;AAChE;AAUO,SAAS,eAAkB,KAAQ,YAAoB,IAAO;AACnE,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,aAAa,GAAG,GAAG;AACrB,aAAO,qBAAqB,KAAK,SAAS;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,UAAQ,eAAe,MAAM,SAAS,CAAC;AAAA,EACxD;AAGA,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,aAAO,GAAG,IAAI,eAAe,OAAO,SAAS;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAGA,SAAO;AACT;A;;;;;ACt1CO,IAAM,cAAc;AAKpB,SAAS,aAAa,KAAqB;AAChD,QAAM,UAAU,mBAAmB,GAAG,EACnC,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,KAAK;AACtB,SAAO,sBAAsB,OAAO;AACtC;AAEA,SAAS,cAAc,MAAsB;AAC3C,MAAI,KAAK,WAAW,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,SAAO,aAAa,IAAI;AAC1B;AAKO,SAAS,uBAA+B;AAC7C,SAAO,cAAc,WAAW;AAClC;;;AFiBO,IAAM,iBAAN,MAAM,gBAAmC;AAAA,EACrC,OAAO;AAAA,EACP,uBAAuB;AAAA,EAExB,SAAwB;AAAA,EACxB;AAAA;AAAA,EAGR,OAAe,cAAwC;AAAA,EACvD,OAAe,kBAAkB;AAAA,EACjC,OAAwB,YAAY,IAAI,KAAK;AAAA;AAAA,EAE7C,YAAY,QAA+B;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,YAA6B;AACzC,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,QAAQ;AACjD,WAAK,SAAS,IAAI,OAAO;AAAA,QACvB,QAAQ,KAAK,OAAO;AAAA,QACpB,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK,OAAO;AAAA,MACvB,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,SAA0B;AACtC,WACE,QAAQ,WAAW,MAAM,KACzB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,QAAQ,KAC3B,QAAQ,WAAW,UAAU;AAAA,EAEjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,UAA2B;AACjC,WAAO,qBAAqB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAwB,qBAAwD;AAAA,IAC9E,UAAU;AAAA,MACR,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IACA,eAAe;AAAA,MACb,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IACA,eAAe;AAAA,MACb,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,UAAU,KAAK,OAAO;AAAA,IACnE;AAAA,IACA,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,UAAU,KAAK,OAAO;AAAA,IACnE;AAAA,IACA,WAAW;AAAA,MACT,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,UAAU,KAAK,OAAO;AAAA,IACnE;AAAA,IACA,WAAW;AAAA,MACT,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,UAAU,KAAK,OAAO;AAAA,IACnE;AAAA,IACA,WAAW;AAAA,MACT,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,UAAU,KAAK,OAAO;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,SAAoD;AAE7E,QAAI,gBAAe,mBAAmB,OAAO,GAAG;AAC9C,aAAO,EAAE,GAAG,gBAAe,mBAAmB,OAAO,EAAE;AAAA,IACzD;AAGA,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,gBAAe,kBAAkB,GAAG;AAC9E,UAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB;AAAA,IACF;AAGA,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAwB,iBAAwE;AAAA,IAC9F,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IAChF,eAAe,EAAE,MAAM,eAAe,aAAa,qCAAqC;AAAA,IACxF,eAAe,EAAE,MAAM,eAAe,aAAa,0BAA0B;AAAA,IAC7E,SAAS,EAAE,MAAM,SAAS,aAAa,uBAAuB;AAAA,IAC9D,iBAAiB,EAAE,MAAM,iBAAiB,aAAa,0BAA0B;AAAA,IACjF,MAAM,EAAE,MAAM,MAAM,aAAa,2BAA2B;AAAA,IAC5D,cAAc,EAAE,MAAM,cAAc,aAAa,0BAA0B;AAAA,IAC3E,WAAW,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,IACrE,WAAW,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IAC5E,WAAW,EAAE,MAAM,WAAW,aAAa,mCAAmC;AAAA,IAC9E,qBAAqB,EAAE,MAAM,qBAAqB,aAAa,uBAAuB;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAwB,sBAAsB,CAAC,QAAQ,MAAM,MAAM,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnF,OAAwB,QAAgF;AAAA,IACtG,YAAY,WAAW;AAAA,MACrB,aAAa;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,QACb,OAAO,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,QACzC,mBAAmB,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,6BAA6B;AAAA,MAC/G,CAAC;AAAA,MACD,SAAS,OAAO,QAAQ,UAAU;AAEhC,eAAO,EAAE,QAAQ,WAAW,QAAQ,oBAAoB;AAAA,MAC1D;AAAA,MACA,OAAO,EAAE,OAAO;AAAA,QACd,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,MACnF,CAAC;AAAA,MACD,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AAAA,IAED,aAAa,WAAW;AAAA,MACtB,aAAa;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,QACb,OAAO,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,MAC3C,CAAC;AAAA,MACD,SAAS,OAAO,QAAQ,UAAU;AAChC,eAAO,EAAE,QAAQ,WAAW,QAAQ,oBAAoB;AAAA,MAC1D;AAAA,MACA,OAAO,EAAE,OAAO;AAAA,QACd,eAAe,EAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,MAC7D,CAAC;AAAA,MACD,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AAAA,IAED,kBAAkB,WAAW;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,QACb,MAAM,EAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,MACpD,CAAC;AAAA,MACD,SAAS,OAAO,QAAQ,UAAU;AAChC,eAAO,EAAE,QAAQ,WAAW,QAAQ,oBAAoB;AAAA,MAC1D;AAAA,MACA,OAAO,EAAE,OAAO;AAAA,QACd,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MAC7E,CAAC;AAAA,MACD,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AAAA,IAED,kBAAkB,WAAW;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,QACb,QAAQ,EAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,QACrD,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,QAAQ,UAAU,EAAE,SAAS,eAAe;AAAA,QAChF,MAAM,EAAE,KAAK,CAAC,aAAa,aAAa,WAAW,CAAC,EAAE,QAAQ,WAAW,EAAE,SAAS,YAAY;AAAA,MAClG,CAAC;AAAA,MACD,SAAS,OAAO,QAAQ,UAAU;AAChC,eAAO,EAAE,QAAQ,WAAW,QAAQ,oBAAoB;AAAA,MAC1D;AAAA,MACA,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAwB,cAAwC;AAAA,IAC9D,UAAU,CAAC,cAAc,eAAe,oBAAoB,kBAAkB;AAAA,IAC9E,eAAe,CAAC,cAAc,eAAe,kBAAkB;AAAA,IAC/D,MAAM,CAAC,cAAc,kBAAkB;AAAA,IACvC,WAAW,CAAC,cAAc,kBAAkB;AAAA,IAC5C,WAAW,CAAC,cAAc,eAAe,oBAAoB,kBAAkB;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,SAA0F;AAGjG,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,GAAG,gBAAe,MAAM;AAAA,IACnC;AAGA,QAAI,YAAY,gBAAe,YAAY,OAAO;AAClD,QAAI,CAAC,WAAW;AACd,iBAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,gBAAe,WAAW,GAAG;AACxE,YAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,sBAAY;AACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,GAAG,gBAAe,MAAM;AAAA,IACnC;AAEA,UAAM,SAAiF,CAAC;AACxF,eAAW,QAAQ,WAAW;AAC5B,UAAI,gBAAe,MAAM,IAAI,GAAG;AAC9B,eAAO,IAAI,IAAI,gBAAe,MAAM,IAAI;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAmD;AAC/D,UAAM,MAAM,KAAK,IAAI;AAGrB,QACE,gBAAe,eACf,MAAM,gBAAe,kBAAkB,gBAAe,WACtD;AACA,aAAO,gBAAe;AAAA,IACxB;AAGA,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,MAAM,OAAO,OAAO,KAAK;AAG1C,UAAM,SAA4B,CAAC;AACnC,qBAAiB,SAAS,UAAU;AAClC,aAAO,KAAK,KAAwB;AAAA,IACtC;AAEA,oBAAe,cAAc;AAC7B,oBAAe,kBAAkB;AAEjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAA0B;AAC5C,WAAO,gBAAe,oBAAoB,KAAK,CAAC,WAAW,QAAQ,WAAW,MAAM,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAAyB;AAE5C,QAAI,gBAAe,eAAe,OAAO,GAAG;AAC1C,aAAO,gBAAe,eAAe,OAAO,EAAE;AAAA,IAChD;AAGA,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,gBAAe,cAAc,GAAG;AAC1E,UAAI,QAAQ,WAAW,SAAS,GAAG,GAAG;AACpC,eAAO,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,MAC1D;AAAA,IACF;AAGA,WAAO,QACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,SAAyB;AAEnD,QAAI,gBAAe,eAAe,OAAO,GAAG;AAC1C,aAAO,gBAAe,eAAe,OAAO,EAAE;AAAA,IAChD;AAGA,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,gBAAe,cAAc,GAAG;AAC1E,UAAI,QAAQ,WAAW,SAAS,GAAG,GAAG;AACpC,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAA2C;AAExE,UAAM,OAAO,gBAAe,mBAAmB,MAAM,EAAE;AACvD,QAAI,gBAAgB,MAAM;AAG1B,QAAI,CAAC,eAAe;AAClB,iBAAW,CAAC,QAAQ,UAAU,KAAK,OAAO,QAAQ,gBAAe,kBAAkB,GAAG;AACpF,YAAI,MAAM,GAAG,WAAW,MAAM,GAAG;AAC/B,0BAAgB,WAAW;AAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM,KAAK,aAAa,MAAM,EAAE;AAAA,MAChC,aAAa,KAAK,oBAAoB,MAAM,EAAE;AAAA,MAC9C;AAAA,MACA,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,QAA+C;AAC7D,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,qBAAqB;AAGlD,UAAI,SAAS,UACV,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,EAAE,CAAC,EACpC,IAAI,CAAC,MAAM,KAAK,uBAAuB,CAAC,CAAC,EACzC,KAAK,CAAC,GAAG,MAAM;AAEd,eAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,MACpC,CAAC;AAEH,UAAI,QAAQ;AACV,cAAM,cAAc,OAAO,YAAY;AACvC,iBAAS,OAAO;AAAA,UACd,CAAC,MACC,EAAE,GAAG,YAAY,EAAE,SAAS,WAAW,KACvC,EAAE,KAAK,YAAY,EAAE,SAAS,WAAW,KACxC,EAAE,eAAe,EAAE,YAAY,YAAY,EAAE,SAAS,WAAW;AAAA,QACtE;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAC1D,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,SAAqD;AAClE,UAAM,SAAS,MAAM,KAAK,UAAU;AAEpC,QAAI;AACF,YAAM,SAAS,kBAAkB,SAAS,wBAAwB;AAElE,YAAM,WAAW,MAAM,OAAO,UAAU;AAAA,QACtC,EAAE,GAAG,QAAQ,QAAQ,MAAM;AAAA,QAC3B,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC3B;AAEA,aAAO,kBAAkB,QAAQ;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAuE;AAClF,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,OAAO;AAEb,QAAI;AACF,YAAM,SAAS,kBAAkB,SAAS,wBAAwB;AAGlE,YAAM,SAAS,MAAM,OAAO,UAAU;AAAA,QACpC,EAAE,GAAG,QAAQ,QAAQ,KAAK;AAAA,QAC1B,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,gBAAM,QAAQ,kBAAkB;AAEhC,cAAI;AACF,6BAAiB,SAAS,QAAQ;AAChC,oBAAM,SAAS,mBAAmB,OAAO,KAAK;AAC9C,yBAAW,SAAS,QAAQ;AAC1B,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,gBAAgB,KAAK,gBAAgB,KAAK;AAChD,kBAAM,iBAAiB,cAAc,SAAS,cAAc,IAAI;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,OAA+B;AACrD,QAAI,iBAAiB,eAAe;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,OAAO;AAC1B,YAAM,WAAW;AACjB,YAAM,SAAS,SAAS,UAAU,SAAS;AAC3C,YAAM,aAAa,SAAS,UAAU,aAAa,IAC/C,SAAS,SAAS,QAAQ,aAAa,GAAG,EAAE,IAC5C;AAEJ,UAAI,WAAW,KAAK;AAClB,eAAO,IAAI,cAAc,MAAM,SAAS,cAAc,QAAQ,UAAU;AAAA,MAC1E;AACA,UAAI,WAAW,OAAO,WAAW,KAAK;AACpC,eAAO,IAAI,cAAc,MAAM,SAAS,cAAc,MAAM;AAAA,MAC9D;AACA,UAAI,WAAW,KAAK;AAClB,eAAO,IAAI,cAAc,MAAM,SAAS,mBAAmB,MAAM;AAAA,MACnE;AACA,UAAI,UAAU,KAAK;AACjB,eAAO,IAAI,cAAc,MAAM,SAAS,gBAAgB,MAAM;AAAA,MAChE;AACA,UAAI,MAAM,SAAS,gBAAgB,SAAS,SAAS,aAAa;AAChE,eAAO,IAAI,cAAc,MAAM,SAAS,SAAS;AAAA,MACnD;AAEA,aAAO,IAAI,cAAc,MAAM,SAAS,WAAW,MAAM;AAAA,IAC3D;AAEA,WAAO,IAAI,cAAc,OAAO,KAAK,GAAG,SAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe,SAAqD;AACxE,UAAM,SAAS,kBAAkB,SAAS,wBAAwB;AAElE,WAAO;AAAA,MACL,MAAM,eAAe,MAA4C;AAAA,MACjE,cAAc;AAAA,MACd,UAAU;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;AG/lBA,SAAS,KAAAA,UAAS;AAiBX,IAAM,wBAAwBA,GAAE,OAAO;AAAA;AAAA,EAE5C,cAAcA,GAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA,EAG3D,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG1B,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAGhC,mBAAmBA,GAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAGtD,kBAAkBA,GAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAGrD,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAG/B,cAAcA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA,EAGvD,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAG5B,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACtD,CAAC,EAAE,YAAY;;;ACtBR,IAAM,SACX,OAAO;AAAA,EACL,CAAC,WAAkC,IAAI,eAAe,MAAM;AAAA,EAC5D,EAAE,iBAAiB,sBAAsB;AAC3C;","names":["z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standardagents/openai",
3
- "version": "0.14.1",
3
+ "version": "0.15.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "restricted",
@@ -30,7 +30,7 @@
30
30
  "devDependencies": {
31
31
  "tsup": "^8.3.5",
32
32
  "typescript": "^5.9.0",
33
- "@standardagents/spec": "0.14.1"
33
+ "@standardagents/spec": "0.15.0"
34
34
  },
35
35
  "keywords": [
36
36
  "standardagents",