autotel-adapters 0.3.19 → 2.0.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.
Files changed (117) hide show
  1. package/README.md +13 -0
  2. package/dist/cloudflare.cjs +44 -29
  3. package/dist/cloudflare.cjs.map +1 -1
  4. package/dist/cloudflare.d.cts +11 -17
  5. package/dist/cloudflare.d.cts.map +1 -1
  6. package/dist/cloudflare.d.ts +11 -17
  7. package/dist/cloudflare.d.ts.map +1 -1
  8. package/dist/cloudflare.js +47 -30
  9. package/dist/cloudflare.js.map +1 -1
  10. package/dist/core.cjs +7 -11
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +7 -11
  13. package/dist/core.d.cts.map +1 -1
  14. package/dist/core.d.ts +6 -10
  15. package/dist/core.d.ts.map +1 -1
  16. package/dist/core.js +7 -12
  17. package/dist/core.js.map +1 -1
  18. package/dist/elysia.cjs +50 -0
  19. package/dist/elysia.cjs.map +1 -0
  20. package/dist/elysia.d.cts +18 -0
  21. package/dist/elysia.d.cts.map +1 -0
  22. package/dist/elysia.d.ts +18 -0
  23. package/dist/elysia.d.ts.map +1 -0
  24. package/dist/elysia.js +44 -0
  25. package/dist/elysia.js.map +1 -0
  26. package/dist/express.cjs +5 -16
  27. package/dist/express.cjs.map +1 -1
  28. package/dist/express.d.cts +6 -15
  29. package/dist/express.d.cts.map +1 -1
  30. package/dist/express.d.ts +6 -15
  31. package/dist/express.d.ts.map +1 -1
  32. package/dist/express.js +7 -16
  33. package/dist/express.js.map +1 -1
  34. package/dist/fastify.cjs +5 -16
  35. package/dist/fastify.cjs.map +1 -1
  36. package/dist/fastify.d.cts +6 -15
  37. package/dist/fastify.d.cts.map +1 -1
  38. package/dist/fastify.d.ts +6 -15
  39. package/dist/fastify.d.ts.map +1 -1
  40. package/dist/fastify.js +7 -16
  41. package/dist/fastify.js.map +1 -1
  42. package/dist/hono.cjs +52 -11
  43. package/dist/hono.cjs.map +1 -1
  44. package/dist/hono.d.cts +12 -5
  45. package/dist/hono.d.cts.map +1 -1
  46. package/dist/hono.d.ts +12 -5
  47. package/dist/hono.d.ts.map +1 -1
  48. package/dist/hono.js +49 -12
  49. package/dist/hono.js.map +1 -1
  50. package/dist/index.cjs +14 -9
  51. package/dist/index.d.cts +12 -9
  52. package/dist/index.d.ts +12 -9
  53. package/dist/index.js +12 -9
  54. package/dist/integration-DI-1RuTh.d.cts +100 -0
  55. package/dist/integration-DI-1RuTh.d.cts.map +1 -0
  56. package/dist/integration-IUpfttGT.js +335 -0
  57. package/dist/integration-IUpfttGT.js.map +1 -0
  58. package/dist/integration-guh7BHTF.cjs +412 -0
  59. package/dist/integration-guh7BHTF.cjs.map +1 -0
  60. package/dist/integration-rYoX8QLk.d.ts +100 -0
  61. package/dist/integration-rYoX8QLk.d.ts.map +1 -0
  62. package/dist/nestjs.cjs +119 -0
  63. package/dist/nestjs.cjs.map +1 -0
  64. package/dist/nestjs.d.cts +42 -0
  65. package/dist/nestjs.d.cts.map +1 -0
  66. package/dist/nestjs.d.ts +42 -0
  67. package/dist/nestjs.d.ts.map +1 -0
  68. package/dist/nestjs.js +114 -0
  69. package/dist/nestjs.js.map +1 -0
  70. package/dist/next.cjs +35 -33
  71. package/dist/next.cjs.map +1 -1
  72. package/dist/next.d.cts +6 -17
  73. package/dist/next.d.cts.map +1 -1
  74. package/dist/next.d.ts +6 -17
  75. package/dist/next.d.ts.map +1 -1
  76. package/dist/next.js +38 -34
  77. package/dist/next.js.map +1 -1
  78. package/dist/nitro.cjs +33 -41
  79. package/dist/nitro.cjs.map +1 -1
  80. package/dist/nitro.d.cts +6 -17
  81. package/dist/nitro.d.cts.map +1 -1
  82. package/dist/nitro.d.ts +6 -17
  83. package/dist/nitro.d.ts.map +1 -1
  84. package/dist/nitro.js +33 -42
  85. package/dist/nitro.js.map +1 -1
  86. package/dist/sveltekit.cjs +48 -0
  87. package/dist/sveltekit.cjs.map +1 -0
  88. package/dist/sveltekit.d.cts +24 -0
  89. package/dist/sveltekit.d.cts.map +1 -0
  90. package/dist/sveltekit.d.ts +24 -0
  91. package/dist/sveltekit.d.ts.map +1 -0
  92. package/dist/sveltekit.js +43 -0
  93. package/dist/sveltekit.js.map +1 -0
  94. package/dist/tanstack.cjs +0 -8
  95. package/dist/tanstack.cjs.map +1 -1
  96. package/dist/tanstack.d.cts +1 -7
  97. package/dist/tanstack.d.cts.map +1 -1
  98. package/dist/tanstack.d.ts +1 -7
  99. package/dist/tanstack.d.ts.map +1 -1
  100. package/dist/tanstack.js +2 -9
  101. package/dist/tanstack.js.map +1 -1
  102. package/dist/toolkit/index.cjs +23 -0
  103. package/dist/toolkit/index.d.cts +42 -0
  104. package/dist/toolkit/index.d.cts.map +1 -0
  105. package/dist/toolkit/index.d.ts +42 -0
  106. package/dist/toolkit/index.d.ts.map +1 -0
  107. package/dist/toolkit/index.js +4 -0
  108. package/dist/toolkit/storage.cjs +35 -0
  109. package/dist/toolkit/storage.cjs.map +1 -0
  110. package/dist/toolkit/storage.d.cts +20 -0
  111. package/dist/toolkit/storage.d.cts.map +1 -0
  112. package/dist/toolkit/storage.d.ts +20 -0
  113. package/dist/toolkit/storage.d.ts.map +1 -0
  114. package/dist/toolkit/storage.js +33 -0
  115. package/dist/toolkit/storage.js.map +1 -0
  116. package/package.json +39 -8
  117. package/skills/autotel-adapters/SKILL.md +42 -34
@@ -0,0 +1,412 @@
1
+ const require_toolkit_storage = require('./toolkit/storage.cjs');
2
+ let autotel = require("autotel");
3
+ let autotel_edge = require("autotel-edge");
4
+
5
+ //#region src/toolkit/deferred-drain.ts
6
+ /**
7
+ * Extend drain lifetime on serverless runtimes without blocking the HTTP response.
8
+ *
9
+ * The drain always runs in the background (its rejection is logged, never
10
+ * thrown). When `waitUntil` is provided, the promise is also handed to the
11
+ * platform so the isolate stays alive until the drain settles. When it is
12
+ * omitted there is no keep-alive guarantee: on a freezing runtime the drain may
13
+ * not finish, so callers that need delivery must supply `waitUntil`.
14
+ */
15
+ function extendDeferredDrain(drainPromise, waitUntil) {
16
+ drainPromise.catch((err) => {
17
+ console.error("[autotel-adapters] background drain failed:", err);
18
+ });
19
+ if (typeof waitUntil === "function") waitUntil(drainPromise);
20
+ }
21
+
22
+ //#endregion
23
+ //#region src/toolkit/stream-response.ts
24
+ function isStreamingResponse(response) {
25
+ return response.body !== null;
26
+ }
27
+ /**
28
+ * Whether framework integrations should defer wide-event emit until the response
29
+ * body finishes. Static string/JSON bodies are excluded even though they use a
30
+ * ReadableStream under the hood in the Fetch API.
31
+ */
32
+ function shouldDeferEmitForResponse(response) {
33
+ if (!response.body) return false;
34
+ const contentType = (response.headers.get("content-type") ?? "").toLowerCase();
35
+ if (contentType.includes("text/event-stream")) return true;
36
+ if (contentType.includes("application/x-ndjson")) return true;
37
+ if (response.headers.has("x-vercel-ai-ui-message-stream")) return true;
38
+ if (response.headers.get("transfer-encoding")?.toLowerCase().includes("chunked")) return true;
39
+ return false;
40
+ }
41
+ function toError(value) {
42
+ return value instanceof Error ? value : new Error(String(value));
43
+ }
44
+ function createObservedBody(body, onDone, onError) {
45
+ if (body.locked) {
46
+ Promise.resolve(onError(/* @__PURE__ */ new TypeError("stream is already locked"))).catch((err) => {
47
+ console.error("[autotel-adapters] stream error handling failed:", err);
48
+ });
49
+ return null;
50
+ }
51
+ const reader = body.getReader();
52
+ let settled = false;
53
+ const settle = (fn) => {
54
+ if (settled) return;
55
+ settled = true;
56
+ Promise.resolve(fn()).catch((err) => {
57
+ console.error("[autotel-adapters] stream completion handling failed:", err);
58
+ });
59
+ };
60
+ return new ReadableStream({
61
+ async pull(controller) {
62
+ try {
63
+ const { done, value } = await reader.read();
64
+ if (done) {
65
+ settle(onDone);
66
+ controller.close();
67
+ return;
68
+ }
69
+ controller.enqueue(value);
70
+ } catch (err) {
71
+ settle(() => onError(err));
72
+ controller.error(err);
73
+ }
74
+ },
75
+ async cancel(reason) {
76
+ try {
77
+ await reader.cancel(reason);
78
+ } finally {
79
+ settle(onDone);
80
+ }
81
+ }
82
+ });
83
+ }
84
+ /**
85
+ * Observe a streaming Response body and invoke `onComplete` once when the body
86
+ * closes, errors, or is cancelled.
87
+ */
88
+ function bindStreamingResponseLifecycle(response, onComplete) {
89
+ if (!response.body) {
90
+ Promise.resolve(onComplete({ status: response.status })).catch((err) => {
91
+ console.error("[autotel-adapters] stream completion handling failed:", err);
92
+ });
93
+ return response;
94
+ }
95
+ const body = createObservedBody(response.body, () => onComplete({ status: response.status }), (err) => onComplete({
96
+ status: response.status,
97
+ error: toError(err)
98
+ }));
99
+ if (!body) return response;
100
+ return new Response(body, {
101
+ status: response.status,
102
+ statusText: response.statusText,
103
+ headers: response.headers
104
+ });
105
+ }
106
+
107
+ //#endregion
108
+ //#region src/toolkit/middleware.ts
109
+ const noopResult = {
110
+ logger: (0, autotel.createNoopRequestLogger)(),
111
+ finish: () => Promise.resolve(null),
112
+ finishResponse: (response) => Promise.resolve(response),
113
+ skipped: true
114
+ };
115
+ function mergeRequestLoggerOptions(base, waitUntil) {
116
+ if (!waitUntil) return base;
117
+ const userOnEmit = base?.onEmit;
118
+ return {
119
+ ...base,
120
+ onEmit: (snapshot) => {
121
+ extendDeferredDrain(userOnEmit ? Promise.resolve(userOnEmit(snapshot)) : Promise.resolve(), waitUntil);
122
+ }
123
+ };
124
+ }
125
+ async function performFinish(logger, options, startedAt, opts) {
126
+ const { status, error, overrides } = opts ?? {};
127
+ if (error) {
128
+ logger.error(error);
129
+ logger.set({
130
+ "http.response.status_code": status ?? 500,
131
+ error_message: error.message
132
+ });
133
+ } else if (status !== void 0) logger.set({ "http.response.status_code": status });
134
+ const durationMs = Date.now() - startedAt;
135
+ logger.set({ duration_ms: durationMs });
136
+ const tailCtx = {
137
+ status: status ?? logger.getContext()["http.response.status_code"],
138
+ durationMs,
139
+ path: options.path,
140
+ method: options.method,
141
+ context: logger.getContext(),
142
+ shouldKeep: false
143
+ };
144
+ if (options.keep) await options.keep(tailCtx);
145
+ if (options.onFinish) try {
146
+ await options.onFinish({
147
+ logger,
148
+ method: options.method,
149
+ path: options.path,
150
+ status: tailCtx.status,
151
+ durationMs
152
+ });
153
+ } catch (err) {
154
+ console.error("[autotel-adapters] onFinish failed:", err);
155
+ }
156
+ const mergedOverrides = {
157
+ ...overrides ?? {},
158
+ ...tailCtx.shouldKeep ? { "autotel.sampling.tail.keep": true } : {}
159
+ };
160
+ return logger.emitNow(Object.keys(mergedOverrides).length > 0 ? mergedOverrides : void 0);
161
+ }
162
+ /**
163
+ * Create a request logger handle for use inside an active autotel trace span.
164
+ * Call `finish()` or `finishResponse()` when the request completes.
165
+ */
166
+ function createMiddlewareLogger(logger, options) {
167
+ if (!(0, autotel_edge.shouldInstrumentPath)(options.path, options)) return noopResult;
168
+ const routeService = (0, autotel_edge.getServiceForPath)(options.path, options.routes);
169
+ if (routeService) logger.set({ service: routeService });
170
+ if (options.requestId) logger.set({ "http.request.id": options.requestId });
171
+ const startedAt = Date.now();
172
+ return {
173
+ logger,
174
+ skipped: false,
175
+ finish: (opts) => performFinish(logger, options, startedAt, opts),
176
+ finishResponse: async (response, opts) => {
177
+ const status = opts?.status ?? response.status;
178
+ if (!shouldDeferEmitForResponse(response)) {
179
+ await performFinish(logger, options, startedAt, {
180
+ status,
181
+ overrides: opts?.overrides
182
+ });
183
+ return response;
184
+ }
185
+ return bindStreamingResponseLifecycle(response, async (meta) => {
186
+ await performFinish(logger, options, startedAt, {
187
+ status: meta.status ?? status,
188
+ error: meta.error,
189
+ overrides: opts?.overrides
190
+ });
191
+ });
192
+ }
193
+ };
194
+ }
195
+
196
+ //#endregion
197
+ //#region src/toolkit/fork.ts
198
+ /**
199
+ * Wrap an existing request logger's `fork()` so adapter lifecycle hooks run
200
+ * for background work spawned after the response returns.
201
+ */
202
+ function attachForkToLogger(logger, lifecycle) {
203
+ const originalFork = logger.fork.bind(logger);
204
+ logger.fork = (label, fn, options) => {
205
+ originalFork(label, fn, { lifecycle: {
206
+ onChildEnter: (child) => {
207
+ lifecycle.onChildEnter?.(child);
208
+ options?.lifecycle?.onChildEnter?.(child);
209
+ },
210
+ onChildExit: (child) => {
211
+ lifecycle.onChildExit?.(child);
212
+ options?.lifecycle?.onChildExit?.(child);
213
+ }
214
+ } });
215
+ };
216
+ }
217
+
218
+ //#endregion
219
+ //#region src/toolkit/integration.ts
220
+ function applyLoggerEnrichment(logger, ...attributeSets) {
221
+ for (const attrs of attributeSets) if (attrs && Object.keys(attrs).length > 0) logger.set(attrs);
222
+ }
223
+ async function completeIntegratedRequest(handle, options, result) {
224
+ if (handle.skipped || options?.autoEmit === false) return result;
225
+ if (result instanceof Response) return handle.finishResponse(result);
226
+ await handle.finish({});
227
+ return result;
228
+ }
229
+ async function runWithIntegratedHandle(handle, options, fn) {
230
+ if (handle.skipped) return handle.runWith(fn);
231
+ try {
232
+ return completeIntegratedRequest(handle, options, await handle.runWith(fn));
233
+ } catch (error) {
234
+ if (options?.autoEmit !== false) await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
235
+ throw error;
236
+ }
237
+ }
238
+ function toRouteAdapterOptions(options) {
239
+ if (!options) return {};
240
+ const { include, exclude, routes, waitUntil, keep, requestLoggerOptions } = options;
241
+ return {
242
+ include,
243
+ exclude,
244
+ routes,
245
+ waitUntil,
246
+ keep,
247
+ requestLoggerOptions
248
+ };
249
+ }
250
+ function buildTracedOptions(options, spanName) {
251
+ return {
252
+ ...toRouteAdapterOptions(options),
253
+ requestLoggerOptions: options?.requestLoggerOptions,
254
+ autoEmit: options?.autoEmit,
255
+ spanName
256
+ };
257
+ }
258
+ function resolveSpanName(spec, ctx, request) {
259
+ if (typeof spec.spanName === "function") return spec.spanName(ctx, request);
260
+ if (typeof spec.spanName === "string") return spec.spanName;
261
+ return `http.${request.method.toLowerCase() || "request"}`;
262
+ }
263
+ function buildHandle(spec, ctx, traceCtx, options = {}) {
264
+ const extracted = spec.extractRequest(ctx);
265
+ const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);
266
+ const middlewareOptions = {
267
+ method: extracted.method,
268
+ path: extracted.path,
269
+ requestId: extracted.requestId,
270
+ ...toRouteAdapterOptions(options),
271
+ waitUntil,
272
+ requestLoggerOptions: mergeRequestLoggerOptions(options.requestLoggerOptions, waitUntil)
273
+ };
274
+ const log = (0, autotel.getRequestLogger)(traceCtx, middlewareOptions.requestLoggerOptions);
275
+ log.set({
276
+ "http.request.method": extracted.method,
277
+ "http.route": extracted.path,
278
+ ...extracted.requestId ? { "http.request.id": extracted.requestId } : {}
279
+ });
280
+ if (spec.storage) attachForkToLogger(log, spec.forkLifecycle ?? require_toolkit_storage.createStorageForkLifecycle(spec.storage));
281
+ spec.attachLogger(ctx, log);
282
+ const result = createMiddlewareLogger(log, middlewareOptions);
283
+ const storage = spec.storage;
284
+ return {
285
+ ...result,
286
+ middlewareOptions,
287
+ runWith: async (fn) => {
288
+ if (!storage || result.skipped) return fn();
289
+ return storage.run(log, fn);
290
+ }
291
+ };
292
+ }
293
+ function buildSkippedHandle(spec, ctx, extracted, options = {}) {
294
+ const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);
295
+ const middlewareOptions = {
296
+ method: extracted.method,
297
+ path: extracted.path,
298
+ requestId: extracted.requestId,
299
+ ...toRouteAdapterOptions(options),
300
+ waitUntil
301
+ };
302
+ const logger = (0, autotel.createNoopRequestLogger)();
303
+ spec.attachLogger(ctx, logger);
304
+ return {
305
+ logger,
306
+ middlewareOptions,
307
+ skipped: true,
308
+ finish: async () => null,
309
+ finishResponse: async (response) => response,
310
+ runWith: async (fn) => {
311
+ if (!spec.storage) return fn();
312
+ return spec.storage.run(logger, fn);
313
+ }
314
+ };
315
+ }
316
+ function defineFrameworkIntegration(spec) {
317
+ return {
318
+ begin(traceCtx, ctx, options = {}) {
319
+ const extracted = spec.extractRequest(ctx);
320
+ if (!(0, autotel_edge.shouldInstrumentPath)(extracted.path, toRouteAdapterOptions(options))) return buildSkippedHandle(spec, ctx, extracted, options);
321
+ return buildHandle(spec, ctx, traceCtx, options);
322
+ },
323
+ runTraced(ctx, options, handler) {
324
+ const extracted = spec.extractRequest(ctx);
325
+ if (!(0, autotel_edge.shouldInstrumentPath)(extracted.path, toRouteAdapterOptions(options))) return handler(buildSkippedHandle(spec, ctx, extracted, options));
326
+ return (0, autotel.withTracing)({ name: options?.spanName ?? resolveSpanName(spec, ctx, extracted) })((traceCtx) => async () => {
327
+ return handler(buildHandle(spec, ctx, traceCtx, options ?? {}));
328
+ })();
329
+ }
330
+ };
331
+ }
332
+
333
+ //#endregion
334
+ Object.defineProperty(exports, 'applyLoggerEnrichment', {
335
+ enumerable: true,
336
+ get: function () {
337
+ return applyLoggerEnrichment;
338
+ }
339
+ });
340
+ Object.defineProperty(exports, 'attachForkToLogger', {
341
+ enumerable: true,
342
+ get: function () {
343
+ return attachForkToLogger;
344
+ }
345
+ });
346
+ Object.defineProperty(exports, 'bindStreamingResponseLifecycle', {
347
+ enumerable: true,
348
+ get: function () {
349
+ return bindStreamingResponseLifecycle;
350
+ }
351
+ });
352
+ Object.defineProperty(exports, 'buildTracedOptions', {
353
+ enumerable: true,
354
+ get: function () {
355
+ return buildTracedOptions;
356
+ }
357
+ });
358
+ Object.defineProperty(exports, 'completeIntegratedRequest', {
359
+ enumerable: true,
360
+ get: function () {
361
+ return completeIntegratedRequest;
362
+ }
363
+ });
364
+ Object.defineProperty(exports, 'createMiddlewareLogger', {
365
+ enumerable: true,
366
+ get: function () {
367
+ return createMiddlewareLogger;
368
+ }
369
+ });
370
+ Object.defineProperty(exports, 'defineFrameworkIntegration', {
371
+ enumerable: true,
372
+ get: function () {
373
+ return defineFrameworkIntegration;
374
+ }
375
+ });
376
+ Object.defineProperty(exports, 'extendDeferredDrain', {
377
+ enumerable: true,
378
+ get: function () {
379
+ return extendDeferredDrain;
380
+ }
381
+ });
382
+ Object.defineProperty(exports, 'isStreamingResponse', {
383
+ enumerable: true,
384
+ get: function () {
385
+ return isStreamingResponse;
386
+ }
387
+ });
388
+ Object.defineProperty(exports, 'mergeRequestLoggerOptions', {
389
+ enumerable: true,
390
+ get: function () {
391
+ return mergeRequestLoggerOptions;
392
+ }
393
+ });
394
+ Object.defineProperty(exports, 'runWithIntegratedHandle', {
395
+ enumerable: true,
396
+ get: function () {
397
+ return runWithIntegratedHandle;
398
+ }
399
+ });
400
+ Object.defineProperty(exports, 'shouldDeferEmitForResponse', {
401
+ enumerable: true,
402
+ get: function () {
403
+ return shouldDeferEmitForResponse;
404
+ }
405
+ });
406
+ Object.defineProperty(exports, 'toRouteAdapterOptions', {
407
+ enumerable: true,
408
+ get: function () {
409
+ return toRouteAdapterOptions;
410
+ }
411
+ });
412
+ //# sourceMappingURL=integration-guh7BHTF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-guh7BHTF.cjs","names":["createStorageForkLifecycle"],"sources":["../src/toolkit/deferred-drain.ts","../src/toolkit/stream-response.ts","../src/toolkit/middleware.ts","../src/toolkit/fork.ts","../src/toolkit/integration.ts"],"sourcesContent":["/**\n * Extend drain lifetime on serverless runtimes without blocking the HTTP response.\n *\n * The drain always runs in the background (its rejection is logged, never\n * thrown). When `waitUntil` is provided, the promise is also handed to the\n * platform so the isolate stays alive until the drain settles. When it is\n * omitted there is no keep-alive guarantee: on a freezing runtime the drain may\n * not finish, so callers that need delivery must supply `waitUntil`.\n */\nexport function extendDeferredDrain(\n drainPromise: Promise<unknown>,\n waitUntil?: (promise: Promise<unknown>) => void,\n): void {\n void drainPromise.catch((err) => {\n console.error('[autotel-adapters] background drain failed:', err);\n });\n if (typeof waitUntil === 'function') {\n waitUntil(drainPromise);\n }\n}\n","export interface StreamCompleteMeta {\n status: number;\n error?: Error;\n}\n\nexport function isStreamingResponse(response: Response): boolean {\n return response.body !== null;\n}\n\n/**\n * Whether framework integrations should defer wide-event emit until the response\n * body finishes. Static string/JSON bodies are excluded even though they use a\n * ReadableStream under the hood in the Fetch API.\n */\nexport function shouldDeferEmitForResponse(response: Response): boolean {\n if (!response.body) return false;\n\n const contentType = (\n response.headers.get('content-type') ?? ''\n ).toLowerCase();\n\n if (contentType.includes('text/event-stream')) return true;\n if (contentType.includes('application/x-ndjson')) return true;\n if (response.headers.has('x-vercel-ai-ui-message-stream')) return true;\n if (\n response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction createObservedBody(\n body: ReadableStream<Uint8Array>,\n onDone: () => void | Promise<void>,\n onError: (error: unknown) => void | Promise<void>,\n): ReadableStream<Uint8Array> | null {\n if (body.locked) {\n void Promise.resolve(\n onError(new TypeError('stream is already locked')),\n ).catch((err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\n });\n return null;\n }\n\n const reader = body.getReader();\n let settled = false;\n\n const settle = (fn: () => void | Promise<void>) => {\n if (settled) return;\n settled = true;\n void Promise.resolve(fn()).catch((err: unknown) => {\n console.error(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\n });\n };\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n settle(onDone);\n controller.close();\n return;\n }\n controller.enqueue(value);\n } catch (err) {\n settle(() => onError(err));\n controller.error(err);\n }\n },\n\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n settle(onDone);\n }\n },\n });\n}\n\n/**\n * Observe a streaming Response body and invoke `onComplete` once when the body\n * closes, errors, or is cancelled.\n */\nexport function bindStreamingResponseLifecycle(\n response: Response,\n onComplete: (meta: StreamCompleteMeta) => void | Promise<void>,\n): Response {\n if (!response.body) {\n void Promise.resolve(onComplete({ status: response.status })).catch(\n (err: unknown) => {\n console.error(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\n },\n );\n return response;\n }\n\n const body = createObservedBody(\n response.body,\n () => onComplete({ status: response.status }),\n (err) => onComplete({ status: response.status, error: toError(err) }),\n );\n if (!body) return response;\n\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n} from 'autotel';\nimport { createNoopRequestLogger } from 'autotel';\nimport type { RouteFilterOptions, RouteServiceConfig } from 'autotel-edge';\nimport {\n getServiceForPath,\n matchesRoutePattern,\n shouldInstrumentPath,\n} from 'autotel-edge';\nimport { extendDeferredDrain } from './deferred-drain';\nimport {\n bindStreamingResponseLifecycle,\n shouldDeferEmitForResponse,\n} from './stream-response';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport type { RouteFilterOptions, RouteServiceConfig };\nexport { getServiceForPath, matchesRoutePattern, shouldInstrumentPath };\n\nexport interface RouteAdapterOptions {\n include?: string[];\n exclude?: string[];\n routes?: Record<string, RouteServiceConfig>;\n waitUntil?: (promise: Promise<unknown>) => void;\n keep?: (ctx: TailSamplingContext) => Awaitable<void>;\n requestLoggerOptions?: RequestLoggerOptions;\n}\n\n/** @deprecated Use {@link RouteAdapterOptions}. */\nexport type BaseAdapterOptions = RouteAdapterOptions;\n\nexport interface TailSamplingContext {\n status?: number;\n durationMs: number;\n path: string;\n method: string;\n context: Record<string, unknown>;\n shouldKeep: boolean;\n}\n\nexport interface MiddlewareLoggerOptions extends RouteAdapterOptions {\n onFinish?: (ctx: {\n logger: RequestLogger;\n method: string;\n path: string;\n status?: number;\n durationMs: number;\n }) => Awaitable<void>;\n method: string;\n path: string;\n requestId?: string;\n}\n\nexport interface MiddlewareLoggerResult {\n logger: RequestLogger;\n finish: (opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n }) => Promise<RequestLogSnapshot | null>;\n finishResponse: (\n response: Response,\n opts?: { status?: number; overrides?: Record<string, unknown> },\n ) => Promise<Response>;\n skipped: boolean;\n}\n\nconst noopResult: MiddlewareLoggerResult = {\n logger: createNoopRequestLogger(),\n finish: () => Promise.resolve(null),\n finishResponse: (response) => Promise.resolve(response),\n skipped: true,\n};\n\nexport function mergeRequestLoggerOptions(\n base: RequestLoggerOptions | undefined,\n waitUntil?: (promise: Promise<unknown>) => void,\n): RequestLoggerOptions | undefined {\n if (!waitUntil) return base;\n\n const userOnEmit = base?.onEmit;\n return {\n ...base,\n onEmit: (snapshot) => {\n const drain = userOnEmit\n ? Promise.resolve(userOnEmit(snapshot))\n : Promise.resolve();\n extendDeferredDrain(drain, waitUntil);\n },\n };\n}\n\nasync function performFinish(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n startedAt: number,\n opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n },\n): Promise<RequestLogSnapshot | null> {\n const { status, error, overrides } = opts ?? {};\n\n if (error) {\n logger.error(error);\n logger.set({\n 'http.response.status_code': status ?? 500,\n error_message: error.message,\n });\n } else if (status !== undefined) {\n logger.set({ 'http.response.status_code': status });\n }\n\n const durationMs = Date.now() - startedAt;\n logger.set({ duration_ms: durationMs });\n\n const tailCtx: TailSamplingContext = {\n status:\n status ??\n (logger.getContext()['http.response.status_code'] as number | undefined),\n durationMs,\n path: options.path,\n method: options.method,\n context: logger.getContext(),\n shouldKeep: false,\n };\n\n if (options.keep) {\n await options.keep(tailCtx);\n }\n\n if (options.onFinish) {\n try {\n await options.onFinish({\n logger,\n method: options.method,\n path: options.path,\n status: tailCtx.status,\n durationMs,\n });\n } catch (err) {\n console.error('[autotel-adapters] onFinish failed:', err);\n }\n }\n\n const mergedOverrides = {\n ...(overrides ?? {}),\n ...(tailCtx.shouldKeep ? { 'autotel.sampling.tail.keep': true } : {}),\n };\n\n return logger.emitNow(\n Object.keys(mergedOverrides).length > 0 ? mergedOverrides : undefined,\n );\n}\n\n/**\n * Create a request logger handle for use inside an active autotel trace span.\n * Call `finish()` or `finishResponse()` when the request completes.\n */\nexport function createMiddlewareLogger(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n): MiddlewareLoggerResult {\n if (!shouldInstrumentPath(options.path, options)) {\n return noopResult;\n }\n\n const routeService = getServiceForPath(options.path, options.routes);\n if (routeService) {\n logger.set({ service: routeService });\n }\n\n if (options.requestId) {\n logger.set({ 'http.request.id': options.requestId });\n }\n\n const startedAt = Date.now();\n\n return {\n logger,\n skipped: false,\n finish: (opts) => performFinish(logger, options, startedAt, opts),\n finishResponse: async (response, opts) => {\n const status = opts?.status ?? response.status;\n if (!shouldDeferEmitForResponse(response)) {\n await performFinish(logger, options, startedAt, {\n status,\n overrides: opts?.overrides,\n });\n return response;\n }\n\n return bindStreamingResponseLifecycle(response, async (meta) => {\n await performFinish(logger, options, startedAt, {\n status: meta.status ?? status,\n error: meta.error,\n overrides: opts?.overrides,\n });\n });\n },\n };\n}\n\nexport type { ForkLifecycle };\n","import type { ForkLifecycle, RequestLogger } from 'autotel';\n\n/**\n * Wrap an existing request logger's `fork()` so adapter lifecycle hooks run\n * for background work spawned after the response returns.\n */\nexport function attachForkToLogger(\n logger: RequestLogger,\n lifecycle: ForkLifecycle,\n): void {\n const originalFork = logger.fork.bind(logger);\n logger.fork = (\n label: string,\n fn: () => void | Promise<void>,\n options?: { lifecycle?: ForkLifecycle },\n ) => {\n originalFork(label, fn, {\n lifecycle: {\n onChildEnter: (child) => {\n lifecycle.onChildEnter?.(child);\n options?.lifecycle?.onChildEnter?.(child);\n },\n onChildExit: (child) => {\n lifecycle.onChildExit?.(child);\n options?.lifecycle?.onChildExit?.(child);\n },\n },\n });\n };\n}\n","import type { AsyncLocalStorage } from 'node:async_hooks';\nimport type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n TraceContext,\n} from 'autotel';\nimport {\n createNoopRequestLogger,\n getRequestLogger,\n withTracing,\n} from 'autotel';\nimport { attachForkToLogger } from './fork';\nimport { createStorageForkLifecycle } from './storage';\nimport {\n createMiddlewareLogger,\n mergeRequestLoggerOptions,\n shouldInstrumentPath,\n type MiddlewareLoggerOptions,\n type MiddlewareLoggerResult,\n type RouteAdapterOptions,\n} from './middleware';\n\nexport interface ExtractedRequest {\n method: string;\n path: string;\n headers?:\n | Headers\n | Record<string, string | string[] | undefined>\n | { get(name: string): string | null };\n requestId?: string;\n}\n\nexport interface IntegratedCompletionOptions {\n autoEmit?: boolean;\n}\n\nexport type TracedOptionInput = RouteAdapterOptions & {\n requestLoggerOptions?: RequestLoggerOptions;\n autoEmit?: boolean;\n};\n\nexport interface FrameworkHandlerOptions extends TracedOptionInput {\n spanName?: string;\n}\n\nexport interface FrameworkIntegrationSpec<TCtx> {\n name: string;\n extractRequest: (ctx: TCtx) => ExtractedRequest;\n attachLogger: (ctx: TCtx, logger: RequestLogger) => void;\n storage?: AsyncLocalStorage<RequestLogger>;\n forkLifecycle?: ForkLifecycle;\n extractWaitUntil?: (\n ctx: TCtx,\n ) => ((promise: Promise<unknown>) => void) | undefined;\n spanName?: string | ((ctx: TCtx, request: ExtractedRequest) => string);\n}\n\nexport interface FrameworkRequestHandle extends MiddlewareLoggerResult {\n middlewareOptions: MiddlewareLoggerOptions;\n runWith: <T>(fn: () => T | Promise<T>) => Promise<T>;\n}\n\nexport interface FrameworkIntegrationHelpers<TCtx> {\n begin: (\n traceCtx: TraceContext,\n ctx: TCtx,\n options?: FrameworkHandlerOptions,\n ) => FrameworkRequestHandle;\n runTraced: <T>(\n ctx: TCtx,\n options: FrameworkHandlerOptions | undefined,\n handler: (handle: FrameworkRequestHandle) => Promise<T>,\n ) => Promise<T>;\n}\n\nexport function applyLoggerEnrichment(\n logger: RequestLogger,\n ...attributeSets: Array<Record<string, unknown> | undefined | null>\n): void {\n for (const attrs of attributeSets) {\n if (attrs && Object.keys(attrs).length > 0) {\n logger.set(attrs);\n }\n }\n}\n\nexport async function completeIntegratedRequest<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n result: T,\n): Promise<T> {\n if (handle.skipped || options?.autoEmit === false) {\n return result;\n }\n\n if (result instanceof Response) {\n return handle.finishResponse(result) as unknown as T;\n }\n\n await handle.finish({});\n return result;\n}\n\nexport async function runWithIntegratedHandle<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n fn: () => T | Promise<T>,\n): Promise<T> {\n if (handle.skipped) {\n return handle.runWith(fn);\n }\n\n try {\n const result = await handle.runWith(fn);\n return completeIntegratedRequest(handle, options, result);\n } catch (error) {\n if (options?.autoEmit !== false) {\n await handle.finish({\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n throw error;\n }\n}\n\nexport function toRouteAdapterOptions(\n options?: Pick<\n FrameworkHandlerOptions,\n keyof RouteAdapterOptions | 'requestLoggerOptions'\n >,\n): RouteAdapterOptions {\n if (!options) return {};\n const { include, exclude, routes, waitUntil, keep, requestLoggerOptions } =\n options;\n return { include, exclude, routes, waitUntil, keep, requestLoggerOptions };\n}\n\nexport function buildTracedOptions(\n options: TracedOptionInput | undefined,\n spanName: string,\n): FrameworkHandlerOptions {\n return {\n ...toRouteAdapterOptions(options),\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n spanName,\n };\n}\n\nfunction resolveSpanName<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n request: ExtractedRequest,\n): string {\n if (typeof spec.spanName === 'function') {\n return spec.spanName(ctx, request);\n }\n if (typeof spec.spanName === 'string') {\n return spec.spanName;\n }\n return `http.${request.method.toLowerCase() || 'request'}`;\n}\n\nfunction buildHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n traceCtx: TraceContext,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const extracted = spec.extractRequest(ctx);\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n requestLoggerOptions: mergeRequestLoggerOptions(\n options.requestLoggerOptions,\n waitUntil,\n ),\n };\n\n const log = getRequestLogger(\n traceCtx,\n middlewareOptions.requestLoggerOptions,\n );\n log.set({\n 'http.request.method': extracted.method,\n 'http.route': extracted.path,\n ...(extracted.requestId ? { 'http.request.id': extracted.requestId } : {}),\n });\n\n if (spec.storage) {\n attachForkToLogger(\n log,\n spec.forkLifecycle ?? createStorageForkLifecycle(spec.storage),\n );\n }\n\n spec.attachLogger(ctx, log);\n\n const result = createMiddlewareLogger(log, middlewareOptions);\n const storage = spec.storage;\n\n return {\n ...result,\n middlewareOptions,\n runWith: async (fn) => {\n if (!storage || result.skipped) return fn();\n return storage.run(log, fn);\n },\n };\n}\n\nfunction buildSkippedHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n extracted: ExtractedRequest,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n };\n\n const logger = createNoopRequestLogger();\n spec.attachLogger(ctx, logger);\n\n return {\n logger,\n middlewareOptions,\n skipped: true,\n finish: async () => null,\n finishResponse: async (response) => response,\n runWith: async (fn) => {\n if (!spec.storage) return fn();\n return spec.storage.run(logger, fn);\n },\n };\n}\n\nexport function defineFrameworkIntegration<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n): FrameworkIntegrationHelpers<TCtx> {\n return {\n begin(traceCtx, ctx, options = {}) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return buildSkippedHandle(spec, ctx, extracted, options);\n }\n return buildHandle(spec, ctx, traceCtx, options);\n },\n\n runTraced(ctx, options, handler) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return handler(buildSkippedHandle(spec, ctx, extracted, options));\n }\n\n const spanName =\n options?.spanName ?? resolveSpanName(spec, ctx, extracted);\n\n // The wrapped factory is async, so the call always yields a Promise.\n return withTracing({ name: spanName })((traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n })() as ReturnType<typeof handler>;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { ForkLifecycle, ForkLifecycle as ForkLifecycle$1, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, TraceContext } from "autotel";
2
+ import { RouteFilterOptions, RouteServiceConfig, getServiceForPath, matchesRoutePattern, shouldInstrumentPath } from "autotel-edge";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
4
+ //#region src/toolkit/middleware.d.ts
5
+ type Awaitable<T> = T | Promise<T>;
6
+ interface RouteAdapterOptions {
7
+ include?: string[];
8
+ exclude?: string[];
9
+ routes?: Record<string, RouteServiceConfig>;
10
+ waitUntil?: (promise: Promise<unknown>) => void;
11
+ keep?: (ctx: TailSamplingContext) => Awaitable<void>;
12
+ requestLoggerOptions?: RequestLoggerOptions;
13
+ }
14
+ /** @deprecated Use {@link RouteAdapterOptions}. */
15
+ type BaseAdapterOptions = RouteAdapterOptions;
16
+ interface TailSamplingContext {
17
+ status?: number;
18
+ durationMs: number;
19
+ path: string;
20
+ method: string;
21
+ context: Record<string, unknown>;
22
+ shouldKeep: boolean;
23
+ }
24
+ interface MiddlewareLoggerOptions extends RouteAdapterOptions {
25
+ onFinish?: (ctx: {
26
+ logger: RequestLogger;
27
+ method: string;
28
+ path: string;
29
+ status?: number;
30
+ durationMs: number;
31
+ }) => Awaitable<void>;
32
+ method: string;
33
+ path: string;
34
+ requestId?: string;
35
+ }
36
+ interface MiddlewareLoggerResult {
37
+ logger: RequestLogger;
38
+ finish: (opts?: {
39
+ status?: number;
40
+ error?: Error;
41
+ overrides?: Record<string, unknown>;
42
+ }) => Promise<RequestLogSnapshot | null>;
43
+ finishResponse: (response: Response, opts?: {
44
+ status?: number;
45
+ overrides?: Record<string, unknown>;
46
+ }) => Promise<Response>;
47
+ skipped: boolean;
48
+ }
49
+ declare function mergeRequestLoggerOptions(base: RequestLoggerOptions | undefined, waitUntil?: (promise: Promise<unknown>) => void): RequestLoggerOptions | undefined;
50
+ /**
51
+ * Create a request logger handle for use inside an active autotel trace span.
52
+ * Call `finish()` or `finishResponse()` when the request completes.
53
+ */
54
+ declare function createMiddlewareLogger(logger: RequestLogger, options: MiddlewareLoggerOptions): MiddlewareLoggerResult;
55
+ //#endregion
56
+ //#region src/toolkit/integration.d.ts
57
+ interface ExtractedRequest {
58
+ method: string;
59
+ path: string;
60
+ headers?: Headers | Record<string, string | string[] | undefined> | {
61
+ get(name: string): string | null;
62
+ };
63
+ requestId?: string;
64
+ }
65
+ interface IntegratedCompletionOptions {
66
+ autoEmit?: boolean;
67
+ }
68
+ type TracedOptionInput = RouteAdapterOptions & {
69
+ requestLoggerOptions?: RequestLoggerOptions;
70
+ autoEmit?: boolean;
71
+ };
72
+ interface FrameworkHandlerOptions extends TracedOptionInput {
73
+ spanName?: string;
74
+ }
75
+ interface FrameworkIntegrationSpec<TCtx> {
76
+ name: string;
77
+ extractRequest: (ctx: TCtx) => ExtractedRequest;
78
+ attachLogger: (ctx: TCtx, logger: RequestLogger) => void;
79
+ storage?: AsyncLocalStorage<RequestLogger>;
80
+ forkLifecycle?: ForkLifecycle;
81
+ extractWaitUntil?: (ctx: TCtx) => ((promise: Promise<unknown>) => void) | undefined;
82
+ spanName?: string | ((ctx: TCtx, request: ExtractedRequest) => string);
83
+ }
84
+ interface FrameworkRequestHandle extends MiddlewareLoggerResult {
85
+ middlewareOptions: MiddlewareLoggerOptions;
86
+ runWith: <T>(fn: () => T | Promise<T>) => Promise<T>;
87
+ }
88
+ interface FrameworkIntegrationHelpers<TCtx> {
89
+ begin: (traceCtx: TraceContext, ctx: TCtx, options?: FrameworkHandlerOptions) => FrameworkRequestHandle;
90
+ runTraced: <T>(ctx: TCtx, options: FrameworkHandlerOptions | undefined, handler: (handle: FrameworkRequestHandle) => Promise<T>) => Promise<T>;
91
+ }
92
+ declare function applyLoggerEnrichment(logger: RequestLogger, ...attributeSets: Array<Record<string, unknown> | undefined | null>): void;
93
+ declare function completeIntegratedRequest<T>(handle: FrameworkRequestHandle, options: IntegratedCompletionOptions | undefined, result: T): Promise<T>;
94
+ declare function runWithIntegratedHandle<T>(handle: FrameworkRequestHandle, options: IntegratedCompletionOptions | undefined, fn: () => T | Promise<T>): Promise<T>;
95
+ declare function toRouteAdapterOptions(options?: Pick<FrameworkHandlerOptions, keyof RouteAdapterOptions | 'requestLoggerOptions'>): RouteAdapterOptions;
96
+ declare function buildTracedOptions(options: TracedOptionInput | undefined, spanName: string): FrameworkHandlerOptions;
97
+ declare function defineFrameworkIntegration<TCtx>(spec: FrameworkIntegrationSpec<TCtx>): FrameworkIntegrationHelpers<TCtx>;
98
+ //#endregion
99
+ export { matchesRoutePattern as C, getServiceForPath as S, shouldInstrumentPath as T, RouteAdapterOptions as _, FrameworkRequestHandle as a, TailSamplingContext as b, buildTracedOptions as c, runWithIntegratedHandle as d, toRouteAdapterOptions as f, MiddlewareLoggerResult as g, MiddlewareLoggerOptions as h, FrameworkIntegrationSpec as i, completeIntegratedRequest as l, ForkLifecycle$1 as m, FrameworkHandlerOptions as n, IntegratedCompletionOptions as o, BaseAdapterOptions as p, FrameworkIntegrationHelpers as r, applyLoggerEnrichment as s, ExtractedRequest as t, defineFrameworkIntegration as u, RouteFilterOptions as v, mergeRequestLoggerOptions as w, createMiddlewareLogger as x, RouteServiceConfig as y };
100
+ //# sourceMappingURL=integration-rYoX8QLk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-rYoX8QLk.d.ts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":";;;;KAmBY,UAAU,KAAK,IAAI,QAAQ;UAKtB;EACf;EACA;EACA,SAAS,eAAe;EACxB,aAAa,SAAS;EACtB,QAAQ,KAAK,wBAAwB;EACrC,uBAAuB;;;KAIb,qBAAqB;UAEhB;EACf;EACA;EACA;EACA;EACA,SAAS;EACT;;UAGe,gCAAgC;EAC/C,YAAY;IACV,QAAQ;IACR;IACA;IACA;IACA;QACI;EACN;EACA;EACA;;UAGe;EACf,QAAQ;EACR,SAAS;IACP;IACA,QAAQ;IACR,YAAY;QACR,QAAQ;EACd,iBACE,UAAU,UACV;IAAS;IAAiB,YAAY;QACnC,QAAQ;EACb;;iBAUc,0BACd,MAAM,kCACN,aAAa,SAAS,4BACrB;;;;;iBAmFa,uBACd,QAAQ,eACR,SAAS,0BACR;;;UCjJc;EACf;EACA;EACA,UACI,UACA;IACE,IAAI;;EACV;;UAGe;EACf;;KAGU,oBAAoB;EAC9B,uBAAuB;EACvB;;UAGe,gCAAgC;EAC/C;;UAGe,yBAAyB;EACxC;EACA,iBAAiB,KAAK,SAAS;EAC/B,eAAe,KAAK,MAAM,QAAQ;EAClC,UAAU,kBAAkB;EAC5B,gBAAgB;EAChB,oBACE,KAAK,WACA,SAAS;EAChB,sBAAsB,KAAK,MAAM,SAAS;;UAG3B,+BAA+B;EAC9C,mBAAmB;EACnB,UAAU,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;UAGnC,4BAA4B;EAC3C,QACE,UAAU,cACV,KAAK,MACL,UAAU,4BACP;EACL,YAAY,GACV,KAAK,MACL,SAAS,qCACT,UAAU,QAAQ,2BAA2B,QAAQ,OAClD,QAAQ;;iBAGC,sBACd,QAAQ,kBACL,eAAe,MAAM;iBASJ,0BAA0B,GAC9C,QAAQ,wBACR,SAAS,yCACT,QAAQ,IACP,QAAQ;iBAaW,wBAAwB,GAC5C,QAAQ,wBACR,SAAS,yCACT,UAAU,IAAI,QAAQ,KACrB,QAAQ;iBAkBK,sBACd,UAAU,KACR,+BACM,gDAEP;iBAOa,mBACd,SAAS,+BACT,mBACC;iBA0Ga,2BAA2B,MACzC,MAAM,yBAAyB,QAC9B,4BAA4B"}