@animalabs/membrane 0.5.69 → 0.5.70

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.
@@ -0,0 +1,129 @@
1
+ /**
2
+ * OpenAI Responses API adapter.
3
+ *
4
+ * This is intentionally separate from `openai-responses.ts`. Despite its name,
5
+ * that compatibility-sensitive adapter targets the Images API.
6
+ *
7
+ * This adapter is stateless and provider-native: `ProviderRequest.messages` is
8
+ * sent verbatim as the Responses API `input` item array, and `outputItems`
9
+ * exposes the response's ordered output array verbatim for the next turn.
10
+ */
11
+ import type { ContentBlock, ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks } from '../types/index.js';
12
+ export interface OpenAIResponsesInputItem {
13
+ type?: string;
14
+ id?: string | null;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface OpenAIResponsesOutputItem {
18
+ type: string;
19
+ id?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ export interface OpenAIResponsesAPIRequest {
23
+ model: string;
24
+ input: OpenAIResponsesInputItem[];
25
+ store: false;
26
+ include: string[];
27
+ instructions?: string;
28
+ max_output_tokens?: number;
29
+ temperature?: number;
30
+ top_p?: number;
31
+ tools?: unknown[];
32
+ stream?: boolean;
33
+ [key: string]: unknown;
34
+ }
35
+ export interface OpenAIResponsesAPIResponse {
36
+ id?: string;
37
+ object?: string;
38
+ model?: string;
39
+ output: OpenAIResponsesOutputItem[];
40
+ status?: string;
41
+ incomplete_details?: {
42
+ reason?: string | null;
43
+ } | null;
44
+ error?: {
45
+ code?: string | null;
46
+ message?: string | null;
47
+ } | null;
48
+ usage?: {
49
+ input_tokens?: number;
50
+ output_tokens?: number;
51
+ total_tokens?: number;
52
+ input_tokens_details?: {
53
+ cached_tokens?: number;
54
+ } | null;
55
+ output_tokens_details?: {
56
+ reasoning_tokens?: number;
57
+ } | null;
58
+ } | null;
59
+ [key: string]: unknown;
60
+ }
61
+ export type OpenAIResponsesAPIContentBlock = (ContentBlock & {
62
+ itemId?: string;
63
+ outputIndex: number;
64
+ contentIndex?: number;
65
+ phase?: 'commentary' | 'final_answer' | null;
66
+ rawItem?: OpenAIResponsesOutputItem;
67
+ }) | {
68
+ type: 'compaction';
69
+ id?: string;
70
+ encryptedContent: string;
71
+ createdBy?: string;
72
+ outputIndex: number;
73
+ rawItem: OpenAIResponsesOutputItem;
74
+ } | {
75
+ type: 'openai_response_item';
76
+ itemId?: string;
77
+ itemType: string;
78
+ outputIndex: number;
79
+ rawItem: OpenAIResponsesOutputItem;
80
+ };
81
+ export interface OpenAIResponsesAPIProviderResponse extends Omit<ProviderResponse, 'content' | 'raw'> {
82
+ content: OpenAIResponsesAPIContentBlock[];
83
+ /** Ordered, provider-native output items. Append these verbatim to the next input. */
84
+ outputItems: OpenAIResponsesOutputItem[];
85
+ raw: OpenAIResponsesAPIResponse | Record<string, unknown>;
86
+ }
87
+ export interface OpenAIResponsesAPIAdapterConfig {
88
+ /** API key (defaults to OPENAI_API_KEY). */
89
+ apiKey?: string;
90
+ /** API base URL (default: https://api.openai.com/v1). */
91
+ baseURL?: string;
92
+ /** Optional OpenAI organization ID. */
93
+ organization?: string;
94
+ /** Optional OpenAI project ID. */
95
+ project?: string;
96
+ /** Default maximum output tokens when the request does not provide one. */
97
+ defaultMaxTokens?: number;
98
+ /** Additional HTTP headers. */
99
+ extraHeaders?: Record<string, string>;
100
+ }
101
+ export declare class OpenAIResponsesAPIAdapter implements ProviderAdapter {
102
+ readonly name = "openai-responses-api";
103
+ private readonly apiKey;
104
+ private readonly baseURL;
105
+ private readonly organization?;
106
+ private readonly project?;
107
+ private readonly defaultMaxTokens;
108
+ private readonly extraHeaders;
109
+ constructor(config?: OpenAIResponsesAPIAdapterConfig);
110
+ supportsModel(_modelId: string): boolean;
111
+ complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<OpenAIResponsesAPIProviderResponse>;
112
+ stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<OpenAIResponsesAPIProviderResponse>;
113
+ private getHeaders;
114
+ private buildRequest;
115
+ private mergeEncryptedReasoningInclude;
116
+ private flattenInstructions;
117
+ private convertTools;
118
+ private parseResponse;
119
+ private outputToContent;
120
+ private extractReasoningText;
121
+ private asPhase;
122
+ private getStopReason;
123
+ private applyTextDelta;
124
+ private applyFunctionArgumentsDelta;
125
+ private assertSuccessfulHTTPResponse;
126
+ private assertSuccessfulAPIResponse;
127
+ private handleError;
128
+ }
129
+ //# sourceMappingURL=openai-responses-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-api.d.ts","sourceRoot":"","sources":["../../src/providers/openai-responses-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,475 @@
1
+ /**
2
+ * OpenAI Responses API adapter.
3
+ *
4
+ * This is intentionally separate from `openai-responses.ts`. Despite its name,
5
+ * that compatibility-sensitive adapter targets the Images API.
6
+ *
7
+ * This adapter is stateless and provider-native: `ProviderRequest.messages` is
8
+ * sent verbatim as the Responses API `input` item array, and `outputItems`
9
+ * exposes the response's ordered output array verbatim for the next turn.
10
+ */
11
+ import { MembraneError, abortError, authError, contextLengthError, networkError, rateLimitError, serverError, } from '../types/index.js';
12
+ import { createCombinedSignal, SSELineParser, safeParseJson } from './utils.js';
13
+ // ============================================================================
14
+ // Adapter
15
+ // ============================================================================
16
+ export class OpenAIResponsesAPIAdapter {
17
+ name = 'openai-responses-api';
18
+ apiKey;
19
+ baseURL;
20
+ organization;
21
+ project;
22
+ defaultMaxTokens;
23
+ extraHeaders;
24
+ constructor(config = {}) {
25
+ this.apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? '';
26
+ this.baseURL = (config.baseURL ?? 'https://api.openai.com/v1').replace(/\/$/, '');
27
+ this.organization = config.organization;
28
+ this.project = config.project;
29
+ this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
30
+ this.extraHeaders = config.extraHeaders ?? {};
31
+ if (!this.apiKey) {
32
+ throw new Error('OpenAI API key not provided');
33
+ }
34
+ }
35
+ supportsModel(_modelId) {
36
+ return true;
37
+ }
38
+ async complete(request, options) {
39
+ const responsesRequest = this.buildRequest(request);
40
+ options?.onRequest?.(responsesRequest);
41
+ const { signal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
42
+ try {
43
+ const response = await fetch(`${this.baseURL}/responses`, {
44
+ method: 'POST',
45
+ headers: this.getHeaders(),
46
+ body: JSON.stringify(responsesRequest),
47
+ signal,
48
+ });
49
+ await this.assertSuccessfulHTTPResponse(response);
50
+ const data = (await response.json());
51
+ this.assertSuccessfulAPIResponse(data);
52
+ return this.parseResponse(data, request.model, responsesRequest);
53
+ }
54
+ catch (error) {
55
+ throw this.handleError(error, responsesRequest);
56
+ }
57
+ finally {
58
+ cleanup?.();
59
+ }
60
+ }
61
+ async stream(request, callbacks, options) {
62
+ const responsesRequest = this.buildRequest(request);
63
+ responsesRequest.stream = true;
64
+ options?.onRequest?.(responsesRequest);
65
+ const { signal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
66
+ try {
67
+ const response = await fetch(`${this.baseURL}/responses`, {
68
+ method: 'POST',
69
+ headers: this.getHeaders(),
70
+ body: JSON.stringify(responsesRequest),
71
+ signal,
72
+ });
73
+ await this.assertSuccessfulHTTPResponse(response);
74
+ const reader = response.body?.getReader();
75
+ if (!reader)
76
+ throw new Error('OpenAI Responses API returned no response body');
77
+ const decoder = new TextDecoder();
78
+ const parser = new SSELineParser();
79
+ const events = [];
80
+ const output = [];
81
+ let terminalResponse;
82
+ const processData = (data) => {
83
+ if (!data || data === '[DONE]')
84
+ return;
85
+ let event;
86
+ try {
87
+ event = JSON.parse(data);
88
+ }
89
+ catch {
90
+ return;
91
+ }
92
+ events.push(event);
93
+ if (event.type === 'response.output_text.delta') {
94
+ const delta = typeof event.delta === 'string' ? event.delta : '';
95
+ if (delta)
96
+ callbacks.onChunk(delta);
97
+ this.applyTextDelta(output, event);
98
+ }
99
+ else if (event.type === 'response.function_call_arguments.delta') {
100
+ this.applyFunctionArgumentsDelta(output, event);
101
+ }
102
+ else if (event.type === 'response.output_item.added' ||
103
+ event.type === 'response.output_item.done') {
104
+ if (Number.isInteger(event.output_index) && event.item) {
105
+ output[event.output_index] = event.item;
106
+ }
107
+ }
108
+ else if (event.type === 'response.completed' ||
109
+ event.type === 'response.incomplete') {
110
+ terminalResponse = event.response;
111
+ }
112
+ else if (event.type === 'response.failed') {
113
+ const failed = event.response;
114
+ throw new Error(`OpenAI Responses API error: ${failed?.error?.code ?? 'response_failed'} ` +
115
+ `${failed?.error?.message ?? 'Response failed'}`);
116
+ }
117
+ else if (event.type === 'error') {
118
+ throw new Error(`OpenAI Responses API error: ${event.code ?? 'stream_error'} ` +
119
+ `${event.message ?? 'Streaming request failed'}`);
120
+ }
121
+ };
122
+ while (true) {
123
+ const { done, value } = await reader.read();
124
+ if (done)
125
+ break;
126
+ for (const data of parser.feed(decoder.decode(value, { stream: true }))) {
127
+ processData(data);
128
+ }
129
+ }
130
+ for (const data of parser.feed(decoder.decode()))
131
+ processData(data);
132
+ for (const data of parser.flush())
133
+ processData(data);
134
+ const completed = terminalResponse ?? {
135
+ model: request.model,
136
+ output: output.filter((item) => Boolean(item)),
137
+ status: 'completed',
138
+ stream_events: events,
139
+ };
140
+ this.assertSuccessfulAPIResponse(completed);
141
+ const parsed = this.parseResponse(completed, request.model, responsesRequest);
142
+ parsed.content.forEach((block, index) => callbacks.onContentBlock?.(index, block));
143
+ return parsed;
144
+ }
145
+ catch (error) {
146
+ throw this.handleError(error, responsesRequest);
147
+ }
148
+ finally {
149
+ cleanup?.();
150
+ }
151
+ }
152
+ // --------------------------------------------------------------------------
153
+ // Request construction
154
+ // --------------------------------------------------------------------------
155
+ getHeaders() {
156
+ return {
157
+ Authorization: `Bearer ${this.apiKey}`,
158
+ 'Content-Type': 'application/json',
159
+ ...(this.organization ? { 'OpenAI-Organization': this.organization } : {}),
160
+ ...(this.project ? { 'OpenAI-Project': this.project } : {}),
161
+ ...this.extraHeaders,
162
+ };
163
+ }
164
+ buildRequest(request) {
165
+ if (!Array.isArray(request.messages)) {
166
+ throw new Error('OpenAI Responses API input must be a provider-native input-item array');
167
+ }
168
+ const responsesRequest = {
169
+ model: request.model,
170
+ input: request.messages,
171
+ store: false,
172
+ include: ['reasoning.encrypted_content'],
173
+ max_output_tokens: request.maxTokens || this.defaultMaxTokens,
174
+ };
175
+ const instructions = this.flattenInstructions(request.system);
176
+ if (instructions)
177
+ responsesRequest.instructions = instructions;
178
+ if (request.temperature !== undefined)
179
+ responsesRequest.temperature = request.temperature;
180
+ if (request.topP !== undefined)
181
+ responsesRequest.top_p = request.topP;
182
+ if (request.tools?.length)
183
+ responsesRequest.tools = this.convertTools(request.tools);
184
+ if (request.extra) {
185
+ const { normalizedMessages, prompt, messages, input, store, stream, include, ...extra } = request.extra;
186
+ void normalizedMessages;
187
+ void prompt;
188
+ void messages;
189
+ void input;
190
+ void store;
191
+ void stream;
192
+ Object.assign(responsesRequest, extra);
193
+ responsesRequest.include = this.mergeEncryptedReasoningInclude(include);
194
+ }
195
+ // These invariants define the adapter's stateless native-item contract and
196
+ // cannot be overridden through provider params.
197
+ responsesRequest.input = request.messages;
198
+ responsesRequest.store = false;
199
+ responsesRequest.include = this.mergeEncryptedReasoningInclude(responsesRequest.include);
200
+ return responsesRequest;
201
+ }
202
+ mergeEncryptedReasoningInclude(value) {
203
+ const include = Array.isArray(value)
204
+ ? value.filter((item) => typeof item === 'string')
205
+ : [];
206
+ return include.includes('reasoning.encrypted_content')
207
+ ? include
208
+ : [...include, 'reasoning.encrypted_content'];
209
+ }
210
+ flattenInstructions(system) {
211
+ if (typeof system === 'string')
212
+ return system || undefined;
213
+ if (!Array.isArray(system))
214
+ return undefined;
215
+ const text = system
216
+ .map((block) => block?.type === 'text' || block?.type === 'input_text' ? block.text : undefined)
217
+ .filter((value) => typeof value === 'string' && value.length > 0)
218
+ .join('\n');
219
+ return text || undefined;
220
+ }
221
+ convertTools(tools) {
222
+ return tools.map((rawTool) => {
223
+ if (rawTool?.type && rawTool.type !== 'function')
224
+ return rawTool;
225
+ // Responses function definitions are flat. Accept them verbatim, while
226
+ // also adapting Membrane and Chat Completions function schemas.
227
+ if (rawTool?.type === 'function' && rawTool.name)
228
+ return rawTool;
229
+ if (rawTool?.type === 'function' && rawTool.function) {
230
+ return { type: 'function', ...rawTool.function };
231
+ }
232
+ return {
233
+ type: 'function',
234
+ name: rawTool?.name,
235
+ description: rawTool?.description,
236
+ parameters: rawTool?.parameters ??
237
+ rawTool?.inputSchema ??
238
+ rawTool?.input_schema ??
239
+ { type: 'object', properties: {} },
240
+ ...(rawTool?.strict !== undefined ? { strict: rawTool.strict } : {}),
241
+ };
242
+ });
243
+ }
244
+ // --------------------------------------------------------------------------
245
+ // Response conversion
246
+ // --------------------------------------------------------------------------
247
+ parseResponse(response, requestedModel, rawRequest) {
248
+ const outputItems = Array.isArray(response.output) ? response.output : [];
249
+ const content = this.outputToContent(outputItems);
250
+ const cachedTokens = response.usage?.input_tokens_details?.cached_tokens ?? 0;
251
+ return {
252
+ content,
253
+ outputItems,
254
+ stopReason: this.getStopReason(response, outputItems),
255
+ stopSequence: undefined,
256
+ usage: {
257
+ inputTokens: response.usage?.input_tokens ?? 0,
258
+ outputTokens: response.usage?.output_tokens ?? 0,
259
+ cacheReadTokens: cachedTokens > 0 ? cachedTokens : undefined,
260
+ },
261
+ model: response.model ?? requestedModel,
262
+ rawRequest,
263
+ raw: response,
264
+ };
265
+ }
266
+ outputToContent(items) {
267
+ const content = [];
268
+ items.forEach((item, outputIndex) => {
269
+ if (item.type === 'message') {
270
+ const phase = this.asPhase(item.phase);
271
+ const messageContent = Array.isArray(item.content) ? item.content : [];
272
+ messageContent.forEach((part, contentIndex) => {
273
+ if (part?.type === 'output_text' && typeof part.text === 'string') {
274
+ content.push({
275
+ type: 'text',
276
+ text: part.text,
277
+ itemId: item.id,
278
+ outputIndex,
279
+ contentIndex,
280
+ phase,
281
+ rawItem: item,
282
+ });
283
+ }
284
+ else if (part?.type === 'refusal' && typeof part.refusal === 'string') {
285
+ content.push({
286
+ type: 'text',
287
+ text: part.refusal,
288
+ itemId: item.id,
289
+ outputIndex,
290
+ contentIndex,
291
+ phase,
292
+ rawItem: item,
293
+ });
294
+ }
295
+ });
296
+ }
297
+ else if (item.type === 'reasoning') {
298
+ if (typeof item.encrypted_content === 'string') {
299
+ content.push({
300
+ type: 'redacted_thinking',
301
+ data: item.encrypted_content,
302
+ itemId: item.id,
303
+ outputIndex,
304
+ rawItem: item,
305
+ });
306
+ }
307
+ else {
308
+ const thinking = this.extractReasoningText(item);
309
+ content.push({
310
+ type: 'thinking',
311
+ thinking,
312
+ itemId: item.id,
313
+ outputIndex,
314
+ rawItem: item,
315
+ });
316
+ }
317
+ }
318
+ else if (item.type === 'function_call') {
319
+ const callId = typeof item.call_id === 'string' ? item.call_id : item.id ?? '';
320
+ content.push({
321
+ type: 'tool_use',
322
+ id: callId,
323
+ name: typeof item.name === 'string' ? item.name : '',
324
+ input: safeParseJson(typeof item.arguments === 'string' ? item.arguments : '{}'),
325
+ itemId: item.id,
326
+ outputIndex,
327
+ rawItem: item,
328
+ });
329
+ }
330
+ else if (item.type === 'function_call_output') {
331
+ content.push({
332
+ type: 'tool_result',
333
+ toolUseId: typeof item.call_id === 'string' ? item.call_id : '',
334
+ content: typeof item.output === 'string' ? item.output : JSON.stringify(item.output ?? null),
335
+ itemId: item.id,
336
+ outputIndex,
337
+ rawItem: item,
338
+ });
339
+ }
340
+ else if (item.type === 'compaction' && typeof item.encrypted_content === 'string') {
341
+ content.push({
342
+ type: 'compaction',
343
+ id: item.id,
344
+ encryptedContent: item.encrypted_content,
345
+ ...(typeof item.created_by === 'string' ? { createdBy: item.created_by } : {}),
346
+ outputIndex,
347
+ rawItem: item,
348
+ });
349
+ }
350
+ else {
351
+ content.push({
352
+ type: 'openai_response_item',
353
+ itemId: item.id,
354
+ itemType: item.type,
355
+ outputIndex,
356
+ rawItem: item,
357
+ });
358
+ }
359
+ });
360
+ return content;
361
+ }
362
+ extractReasoningText(item) {
363
+ const values = [item.summary, item.content]
364
+ .filter(Array.isArray)
365
+ .flatMap((parts) => parts)
366
+ .map((part) => part?.text)
367
+ .filter((text) => typeof text === 'string');
368
+ return values.join('\n');
369
+ }
370
+ asPhase(value) {
371
+ return value === 'commentary' || value === 'final_answer' || value === null
372
+ ? value
373
+ : undefined;
374
+ }
375
+ getStopReason(response, output) {
376
+ if (output.some((item) => item.type === 'function_call'))
377
+ return 'tool_use';
378
+ if (output.some((item) => item.type === 'message' &&
379
+ Array.isArray(item.content) &&
380
+ item.content.some((part) => part?.type === 'refusal')))
381
+ return 'refusal';
382
+ const reason = response.incomplete_details?.reason;
383
+ if (response.status === 'incomplete' && reason?.includes('max_output_tokens')) {
384
+ return 'max_tokens';
385
+ }
386
+ return 'end_turn';
387
+ }
388
+ applyTextDelta(output, event) {
389
+ if (!Number.isInteger(event.output_index) || typeof event.delta !== 'string')
390
+ return;
391
+ const outputIndex = event.output_index;
392
+ const contentIndex = Number.isInteger(event.content_index) ? event.content_index : 0;
393
+ const existing = output[outputIndex];
394
+ const message = existing?.type === 'message'
395
+ ? existing
396
+ : {
397
+ type: 'message',
398
+ id: event.item_id,
399
+ role: 'assistant',
400
+ status: 'in_progress',
401
+ content: [],
402
+ };
403
+ const part = message.content[contentIndex] ?? { type: 'output_text', text: '', annotations: [] };
404
+ part.text = `${part.text ?? ''}${event.delta}`;
405
+ message.content[contentIndex] = part;
406
+ output[outputIndex] = message;
407
+ }
408
+ applyFunctionArgumentsDelta(output, event) {
409
+ if (!Number.isInteger(event.output_index) || typeof event.delta !== 'string')
410
+ return;
411
+ const outputIndex = event.output_index;
412
+ const item = output[outputIndex];
413
+ if (item?.type === 'function_call') {
414
+ item.arguments = `${item.arguments ?? ''}${event.delta}`;
415
+ }
416
+ }
417
+ // --------------------------------------------------------------------------
418
+ // Errors
419
+ // --------------------------------------------------------------------------
420
+ async assertSuccessfulHTTPResponse(response) {
421
+ if (response.ok)
422
+ return;
423
+ const errorText = await response.text();
424
+ throw new Error(`OpenAI Responses API error: ${response.status} ${errorText}`);
425
+ }
426
+ assertSuccessfulAPIResponse(response) {
427
+ if (!response.error)
428
+ return;
429
+ throw new Error(`OpenAI Responses API error: ${response.error.code ?? 'api_error'} ` +
430
+ `${response.error.message ?? 'Unknown error'}`);
431
+ }
432
+ handleError(error, rawRequest) {
433
+ if (error instanceof MembraneError)
434
+ return error;
435
+ if (error instanceof Error) {
436
+ const message = error.message;
437
+ if (message.includes('429') || message.includes('rate_limit')) {
438
+ const retryMatch = message.match(/retry after (\d+)/i);
439
+ const retryAfter = retryMatch?.[1] ? Number(retryMatch[1]) * 1000 : undefined;
440
+ return rateLimitError(message, retryAfter, error, rawRequest);
441
+ }
442
+ if (message.includes('401') ||
443
+ message.includes('invalid_api_key') ||
444
+ message.includes('Incorrect API key')) {
445
+ return authError(message, error, rawRequest);
446
+ }
447
+ if (message.includes('context_length') ||
448
+ message.includes('maximum context') ||
449
+ message.includes('too long')) {
450
+ return contextLengthError(message, error, rawRequest);
451
+ }
452
+ if (message.includes('500') ||
453
+ message.includes('502') ||
454
+ message.includes('503') ||
455
+ message.includes('server_error')) {
456
+ return serverError(message, undefined, error, rawRequest);
457
+ }
458
+ if (error.name === 'AbortError')
459
+ return abortError(undefined, rawRequest);
460
+ if (message.includes('network') ||
461
+ message.includes('fetch') ||
462
+ message.includes('ECONNREFUSED')) {
463
+ return networkError(message, error, rawRequest);
464
+ }
465
+ }
466
+ return new MembraneError({
467
+ type: 'unknown',
468
+ message: error instanceof Error ? error.message : String(error),
469
+ retryable: false,
470
+ rawError: error,
471
+ rawRequest,
472
+ });
473
+ }
474
+ }
475
+ //# sourceMappingURL=openai-responses-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-api.js","sourceRoot":"","sources":["../../src/providers/openai-responses-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoGhF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,sBAAsB,CAAC;IAEtB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,YAAY,CAAU;IACtB,OAAO,CAAU;IACjB,gBAAgB,CAAS;IACzB,YAAY,CAAyB;IAEtD,YAAY,SAA0C,EAAE;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACxD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAAwB,EACxB,OAAgC;QAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,EAAE,SAAS,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAEvC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACtC,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC;YACnE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAwB,EACxB,SAA0B,EAC1B,OAAgC;QAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpD,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC;QAC/B,OAAO,EAAE,SAAS,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAEvC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACtC,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAE/E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,MAAM,GAAc,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAgC,EAAE,CAAC;YAC/C,IAAI,gBAAwD,CAAC;YAE7D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAQ,EAAE;gBACzC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;oBAAE,OAAO;gBAEvC,IAAI,KAAU,CAAC;gBACf,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;oBAChD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,IAAI,KAAK;wBAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACpC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,wCAAwC,EAAE,CAAC;oBACnE,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAClD,CAAC;qBAAM,IACL,KAAK,CAAC,IAAI,KAAK,4BAA4B;oBAC3C,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAC1C,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC1C,CAAC;gBACH,CAAC;qBAAM,IACL,KAAK,CAAC,IAAI,KAAK,oBAAoB;oBACnC,KAAK,CAAC,IAAI,KAAK,qBAAqB,EACpC,CAAC;oBACD,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC;gBACpC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAkD,CAAC;oBACxE,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,iBAAiB,GAAG;wBACxE,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,IAAI,iBAAiB,EAAE,CACnD,CAAC;gBACJ,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,IAAI,IAAI,cAAc,GAAG;wBAC5D,GAAG,KAAK,CAAC,OAAO,IAAI,0BAA0B,EAAE,CACnD,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC;YAEF,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;oBACxE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACpE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAErD,MAAM,SAAS,GAA+B,gBAAgB,IAAI;gBAChE,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAqC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjF,MAAM,EAAE,WAAW;gBACnB,aAAa,EAAE,MAAM;aACtB,CAAC;YACF,IAAI,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAC9E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACnF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,uBAAuB;IACvB,6EAA6E;IAErE,UAAU;QAChB,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,IAAI,CAAC,YAAY;SACrB,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,OAAwB;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,gBAAgB,GAA8B;YAClD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,QAAsC;YACrD,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,CAAC,6BAA6B,CAAC;YACxC,iBAAiB,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB;SAC9D,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,YAAY;YAAE,gBAAgB,CAAC,YAAY,GAAG,YAAY,CAAC;QAC/D,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,gBAAgB,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC1F,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,gBAAgB,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;QACtE,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM;YAAE,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAErF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,EACJ,kBAAkB,EAClB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,GAAG,KAAK,EACT,GAAG,OAAO,CAAC,KAAK,CAAC;YAClB,KAAK,kBAAkB,CAAC;YACxB,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QAED,2EAA2E;QAC3E,gDAAgD;QAChD,gBAAgB,CAAC,KAAK,GAAG,OAAO,CAAC,QAAsC,CAAC;QACxE,gBAAgB,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/B,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEO,8BAA8B,CAAC,KAAc;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpD,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,6BAA6B,CAAC,CAAC;IAClD,CAAC;IAEO,mBAAmB,CAAC,MAAiC;QAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,IAAI,SAAS,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM;aAChB,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAClB,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAChF;aACA,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;aACjF,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,IAAI,SAAS,CAAC;IAC3B,CAAC;IAEO,YAAY,CAAC,KAAgB;QACnC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;YAChC,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO,OAAO,CAAC;YAEjE,uEAAuE;YACvE,gEAAgE;YAChE,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC;YACjE,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnD,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,WAAW,EAAE,OAAO,EAAE,WAAW;gBACjC,UAAU,EACR,OAAO,EAAE,UAAU;oBACnB,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,YAAY;oBACrB,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBACpC,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,sBAAsB;IACtB,6EAA6E;IAErE,aAAa,CACnB,QAAoC,EACpC,cAAsB,EACtB,UAAqC;QAErC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,oBAAoB,EAAE,aAAa,IAAI,CAAC,CAAC;QAE9E,OAAO;YACL,OAAO;YACP,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC;YACrD,YAAY,EAAE,SAAS;YACvB,KAAK,EAAE;gBACL,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;gBAC9C,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBAChD,eAAe,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;aAC7D;YACD,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,cAAc;YACvC,UAAU;YACV,GAAG,EAAE,QAAQ;SACd,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,KAAkC;QACxD,MAAM,OAAO,GAAqC,EAAE,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,cAAc,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,YAAoB,EAAE,EAAE;oBACzD,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAClE,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,WAAW;4BACX,YAAY;4BACZ,KAAK;4BACL,OAAO,EAAE,IAAI;yBACd,CAAC,CAAC;oBACL,CAAC;yBAAM,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACxE,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,OAAO;4BAClB,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,WAAW;4BACX,YAAY;4BACZ,KAAK;4BACL,OAAO,EAAE,IAAI;yBACd,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACrC,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;oBAC/C,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,mBAAmB;wBACzB,IAAI,EAAE,IAAI,CAAC,iBAAiB;wBAC5B,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,WAAW;wBACX,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,UAAU;wBAChB,QAAQ;wBACR,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,WAAW;wBACX,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACpD,KAAK,EAAE,aAAa,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;oBAChF,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,WAAW;oBACX,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC/D,OAAO,EACL,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;oBACrF,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,WAAW;oBACX,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;oBACxC,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9E,WAAW;oBACX,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,sBAAsB;oBAC5B,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,WAAW;oBACX,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,oBAAoB,CAAC,IAA+B;QAC1D,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;aACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;aACrB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAkB,CAAC;aACtC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aAC9B,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEO,OAAO,CAAC,KAAc;QAC5B,OAAO,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,IAAI;YACzE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEO,aAAa,CACnB,QAAoC,EACpC,MAAmC;QAEnC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;YAAE,OAAO,UAAU,CAAC;QAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,IAAI,CAAC,IAAI,KAAK,SAAS;YACvB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAC3D;YAAE,OAAO,SAAS,CAAC;QAEpB,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC9E,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,cAAc,CAAC,MAAmC,EAAE,KAAU;QACpE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO;QACrF,MAAM,WAAW,GAAG,KAAK,CAAC,YAAsB,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,KAAK,SAAS;YAC1C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC;gBACE,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,EAAE;aACZ,CAAC;QACN,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACjG,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;QACrC,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IAChC,CAAC;IAEO,2BAA2B,CAAC,MAAmC,EAAE,KAAU;QACjF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO;QACrF,MAAM,WAAW,GAAG,KAAK,CAAC,YAAsB,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAQ,CAAC;QACxC,IAAI,IAAI,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,SAAS;IACT,6EAA6E;IAErE,KAAK,CAAC,4BAA4B,CAAC,QAAkB;QAC3D,IAAI,QAAQ,CAAC,EAAE;YAAE,OAAO;QACxB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACjF,CAAC;IAEO,2BAA2B,CAAC,QAAoC;QACtE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO;QAC5B,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,GAAG;YAClE,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CACjD,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAc,EAAE,UAAoB;QACtD,IAAI,KAAK,YAAY,aAAa;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9E,OAAO,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAChE,CAAC;YACD,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrC,CAAC;gBACD,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;YACD,IACE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC5B,CAAC;gBACD,OAAO,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACxD,CAAC;YACD,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAChC,CAAC;gBACD,OAAO,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC1E,IACE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAChC,CAAC;gBACD,OAAO,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,aAAa,CAAC;YACvB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,UAAU;SACX,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@animalabs/membrane",
3
- "version": "0.5.69",
3
+ "version": "0.5.70",
4
4
  "description": "LLM middleware - a selective boundary that transforms what passes through",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,6 +16,10 @@ export type {
16
16
 
17
17
  export { AnthropicXmlFormatter, type AnthropicXmlFormatterConfig } from './anthropic-xml.js';
18
18
  export { NativeFormatter, type NativeFormatterConfig } from './native.js';
19
+ export {
20
+ OpenAIResponsesFormatter,
21
+ OPENAI_RESPONSES_ITEMS_METADATA_KEY,
22
+ } from './openai-responses.js';
19
23
  export { CompletionsFormatter, type CompletionsFormatterConfig } from './completions.js';
20
24
 
21
25
  export {