@aexol/spectral 0.9.251 → 0.9.254
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/generated/zeus/const.d.ts.map +1 -1
- package/dist/generated/zeus/const.js +48 -6
- package/dist/generated/zeus/index.d.ts +266 -36
- package/dist/generated/zeus/index.d.ts.map +1 -1
- package/dist/mcp/mcp-auth-flow.d.ts +4 -0
- package/dist/mcp/mcp-auth-flow.d.ts.map +1 -1
- package/dist/mcp/mcp-auth-flow.js +7 -4
- package/dist/memory/commands/status.d.ts.map +1 -1
- package/dist/memory/commands/status.js +2 -1
- package/dist/memory/hooks/compaction-trigger.d.ts +14 -1
- package/dist/memory/hooks/compaction-trigger.d.ts.map +1 -1
- package/dist/memory/hooks/compaction-trigger.js +31 -4
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +4 -47
- package/dist/relay/routing.d.ts +1 -1
- package/dist/relay/routing.d.ts.map +1 -1
- package/dist/relay/routing.js +9 -0
- package/dist/sdk/ai/utils/image-source.d.ts +26 -11
- package/dist/sdk/ai/utils/image-source.d.ts.map +1 -1
- package/dist/sdk/ai/utils/image-source.js +184 -47
- package/dist/sdk/ai/utils/transient-error.d.ts +4 -0
- package/dist/sdk/ai/utils/transient-error.d.ts.map +1 -1
- package/dist/sdk/ai/utils/transient-error.js +15 -0
- package/dist/sdk/coding-agent/core/compaction/policy.d.ts +2 -0
- package/dist/sdk/coding-agent/core/compaction/policy.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/compaction/policy.js +2 -0
- package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.js +4 -0
- package/dist/sdk/coding-agent/core/tools/read.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/read.js +14 -7
- package/dist/sdk/coding-agent/index.d.ts +1 -1
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +1 -1
- package/dist/sdk/coding-agent/utils/image-resize.d.ts +25 -11
- package/dist/sdk/coding-agent/utils/image-resize.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/image-resize.js +54 -36
- package/dist/sdk/coding-agent/utils/photon.d.ts.map +1 -1
- package/dist/sdk/coding-agent/utils/photon.js +11 -2
- package/dist/server/agent-bridge.d.ts +32 -0
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +59 -9
- package/dist/server/handlers/mcp-auth.d.ts +25 -0
- package/dist/server/handlers/mcp-auth.d.ts.map +1 -0
- package/dist/server/handlers/mcp-auth.js +106 -0
- package/dist/server/handlers/mcp-status.d.ts +8 -2
- package/dist/server/handlers/mcp-status.d.ts.map +1 -1
- package/dist/server/handlers/mcp-status.js +15 -3
- package/dist/server/preset-chain.d.ts +0 -13
- package/dist/server/preset-chain.d.ts.map +1 -1
- package/dist/server/preset-chain.js +0 -25
- package/dist/server/session-stream/memory.d.ts.map +1 -1
- package/dist/server/session-stream/memory.js +8 -1
- package/dist/server/session-stream.d.ts +15 -56
- package/dist/server/session-stream.d.ts.map +1 -1
- package/dist/server/session-stream.js +41 -271
- package/dist/server/wire.d.ts +18 -32
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -14,12 +14,19 @@
|
|
|
14
14
|
* as a base64 data URI — OpenRouter's server-side
|
|
15
15
|
* media fetcher gets HTTP 400 from S3 on
|
|
16
16
|
* presigned urls, so the raw presigned url must
|
|
17
|
-
* never reach the provider. If the
|
|
18
|
-
* fails
|
|
19
|
-
*
|
|
17
|
+
* never reach the provider. If the download
|
|
18
|
+
* fails the image is dropped — a presigned url
|
|
19
|
+
* is never sent as a fallback.
|
|
20
20
|
* (`/generated-images/<id>` is what the backend
|
|
21
21
|
* returns; it is AUTH-GATED, so handing it to a
|
|
22
22
|
* provider only yields a 401)
|
|
23
|
+
* - `url` S3 presigned -> STALE/EXPIRED signatures must never reach the
|
|
24
|
+
* provider ("Failed to fetch media from URL ...
|
|
25
|
+
* parameter=image_url" + 8x retry spam in old
|
|
26
|
+
* sessions): presigned sources are mapped back
|
|
27
|
+
* to the hosted ref (`/generated-images/<id>`)
|
|
28
|
+
* and re-signed fresh, else fetched + inlined
|
|
29
|
+
* directly, else DROPPED.
|
|
23
30
|
* - `url` relative -> resolved against the backend base url first
|
|
24
31
|
* - `url` local/private -> fetched and inlined **at send time only**
|
|
25
32
|
*
|
|
@@ -101,6 +108,77 @@ export function resolveImageUrlAgainstBase(rawUrl, baseUrl) {
|
|
|
101
108
|
return trimmed;
|
|
102
109
|
}
|
|
103
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Query parameter names AWS SigV4 presigned urls carry in their query string.
|
|
113
|
+
* A url carrying any of these is a signed S3 GET that stops working the
|
|
114
|
+
* moment its (typically 3600s) signature expires.
|
|
115
|
+
*/
|
|
116
|
+
const S3_PRESIGNED_QUERY_PARAMS = ["x-amz-algorithm", "x-amz-signature", "x-amz-date"];
|
|
117
|
+
/**
|
|
118
|
+
* True when `rawUrl` is an AWS S3 presigned GET (SigV4): its query string
|
|
119
|
+
* carries `X-Amz-Algorithm`/`X-Amz-Signature`/`X-Amz-Date` (case-insensitive
|
|
120
|
+
* per the SigV4 spec). Such urls are short-lived — a stale one sitting in
|
|
121
|
+
* persisted session history would fail every provider request forever.
|
|
122
|
+
*/
|
|
123
|
+
export function isS3PresignedUrl(rawUrl) {
|
|
124
|
+
const trimmed = typeof rawUrl === "string" ? rawUrl.trim() : "";
|
|
125
|
+
if (!trimmed)
|
|
126
|
+
return false;
|
|
127
|
+
let url;
|
|
128
|
+
try {
|
|
129
|
+
url = new URL(trimmed);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
135
|
+
return false;
|
|
136
|
+
const present = new Set();
|
|
137
|
+
url.searchParams.forEach((_value, key) => present.add(key.toLowerCase()));
|
|
138
|
+
return S3_PRESIGNED_QUERY_PARAMS.some((param) => present.has(param));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Conversation-image key convention on S3:
|
|
142
|
+
* `<ownerPrefix>/images/<uuid>.<ext>` — the uuid is the final path segment.
|
|
143
|
+
*/
|
|
144
|
+
const PRESIGNED_S3_IMAGE_PATH_RE = /\/images\/([^/?#]+)$/;
|
|
145
|
+
/**
|
|
146
|
+
* Stable backend-hosted reference (`/generated-images/<uuid>`) for a
|
|
147
|
+
* presigned S3 url whose key follows the conversation-image convention
|
|
148
|
+
* (`<ownerPrefix>/images/<uuid>.<ext>`), or `null` when the path does not
|
|
149
|
+
* match. Resolving the hosted ref lets a request re-sign a FRESH presigned
|
|
150
|
+
* url — and rewrite the stale/expired signature out of the request entirely.
|
|
151
|
+
*/
|
|
152
|
+
export function hostedRefFromPresignedUrl(rawUrl) {
|
|
153
|
+
if (typeof rawUrl !== "string")
|
|
154
|
+
return null;
|
|
155
|
+
const trimmed = rawUrl.trim();
|
|
156
|
+
if (!trimmed)
|
|
157
|
+
return null;
|
|
158
|
+
let url;
|
|
159
|
+
try {
|
|
160
|
+
url = new URL(trimmed);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const raw = url.pathname.match(PRESIGNED_S3_IMAGE_PATH_RE)?.[1];
|
|
166
|
+
if (!raw)
|
|
167
|
+
return null;
|
|
168
|
+
// Strip an optional extension (`<uuid>.png`) — the id is the first part.
|
|
169
|
+
const dot = raw.lastIndexOf(".");
|
|
170
|
+
let id = dot > 0 ? raw.slice(0, dot) : raw;
|
|
171
|
+
try {
|
|
172
|
+
id = decodeURIComponent(id);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Malformed percent-encoding: keep the raw segment.
|
|
176
|
+
}
|
|
177
|
+
// Mirror the backend id shape (`HOSTED_IMAGE_ID`): [A-Za-z0-9_-]{1,64}.
|
|
178
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(id))
|
|
179
|
+
return null;
|
|
180
|
+
return `/generated-images/${id}`;
|
|
181
|
+
}
|
|
104
182
|
/**
|
|
105
183
|
* Loopback / unique-local (fc00::/7) / link-local (fe80::/10) IPv6 are
|
|
106
184
|
* unreachable for a provider; every other literal (e.g. `2001:4860::8888`)
|
|
@@ -257,12 +335,97 @@ function normalizeMimeType(value, fallback) {
|
|
|
257
335
|
const base = value.split(";")[0].trim().toLowerCase();
|
|
258
336
|
return base || fallback || "image/png";
|
|
259
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* Download `downloadUrl`, apply the size guards and inline the bytes as a
|
|
340
|
+
* base64 data URI. Throws on any failure — the caller decides whether to
|
|
341
|
+
* fall back, pass the url through or drop the image.
|
|
342
|
+
*/
|
|
343
|
+
async function fetchAndInlineImage(downloadUrl, image, requestHeaders, options) {
|
|
344
|
+
const doFetch = options.fetchImpl ?? fetch;
|
|
345
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_INLINE_FETCH_TIMEOUT_MS;
|
|
346
|
+
const maxInlineBytes = options.maxInlineBytes ?? DEFAULT_MAX_INLINE_BYTES;
|
|
347
|
+
const controller = new AbortController();
|
|
348
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
349
|
+
const onAbort = () => controller.abort();
|
|
350
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
351
|
+
try {
|
|
352
|
+
// An already-aborted signal never fires the listener above.
|
|
353
|
+
if (options.signal?.aborted)
|
|
354
|
+
throw new Error("aborted");
|
|
355
|
+
// `requestHeaders` is only set when the url resolves to the backend
|
|
356
|
+
// origin — a url on any other host is fetched anonymously, so the JWT
|
|
357
|
+
// cannot leak to a third party.
|
|
358
|
+
const response = await doFetch(downloadUrl, requestHeaders
|
|
359
|
+
? { signal: controller.signal, headers: requestHeaders }
|
|
360
|
+
: { signal: controller.signal });
|
|
361
|
+
if (!response.ok)
|
|
362
|
+
throw new Error(`HTTP ${response.status}`);
|
|
363
|
+
// Reject oversized payloads from the declared length BEFORE reading
|
|
364
|
+
// the body — otherwise the whole payload lands in memory first.
|
|
365
|
+
const declaredLength = response.headers?.get?.("content-length");
|
|
366
|
+
if (declaredLength !== null && declaredLength !== undefined) {
|
|
367
|
+
const declared = Number(declaredLength);
|
|
368
|
+
if (Number.isFinite(declared) && declared > maxInlineBytes) {
|
|
369
|
+
throw new Error(`image too large to inline (${declared} bytes)`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const buffer = await response.arrayBuffer();
|
|
373
|
+
if (buffer.byteLength > maxInlineBytes) {
|
|
374
|
+
throw new Error(`image too large to inline (${buffer.byteLength} bytes)`);
|
|
375
|
+
}
|
|
376
|
+
const mimeType = normalizeMimeType(response.headers?.get?.("content-type"), image.mimeType);
|
|
377
|
+
const data = bytesToBase64(new Uint8Array(buffer));
|
|
378
|
+
return {
|
|
379
|
+
url: dataUriForImage(data, mimeType),
|
|
380
|
+
inlined: true,
|
|
381
|
+
mimeType,
|
|
382
|
+
data,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
clearTimeout(timer);
|
|
387
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Resolve an S3 presigned SOURCE url (typically a stale/expired one persisted
|
|
392
|
+
* in session history). A presigned url must NEVER reach the provider as
|
|
393
|
+
* `image_url`: once its signature expires every request fails with
|
|
394
|
+
* "Failed to fetch media from URL ... parameter=image_url" and the agent loop
|
|
395
|
+
* retries the doomed request 8x per turn. Order of attempts:
|
|
396
|
+
*
|
|
397
|
+
* 1. Map back to the stable hosted ref (`/generated-images/<id>`) and run the
|
|
398
|
+
* hosted path — it re-signs a FRESH presigned url and inlines the bytes.
|
|
399
|
+
* 2. Else fetch + inline the presigned bytes directly (the signature may
|
|
400
|
+
* still be valid).
|
|
401
|
+
* 3. Else DROP the image — never fall back to sending the presigned url.
|
|
402
|
+
*/
|
|
403
|
+
async function resolvePresignedSourceImage(url, image, options) {
|
|
404
|
+
const hostedRef = hostedRefFromPresignedUrl(url);
|
|
405
|
+
if (hostedRef) {
|
|
406
|
+
const hosted = await resolveImageForProvider({ type: "image", url: hostedRef, mimeType: image.mimeType }, options);
|
|
407
|
+
// Only an INLINED result counts: the hosted path can also return the
|
|
408
|
+
// hosted url verbatim (auth-gated — the provider would get a 401),
|
|
409
|
+
// which is just as doomed as the expired presigned url.
|
|
410
|
+
if (hosted?.inlined)
|
|
411
|
+
return hosted;
|
|
412
|
+
}
|
|
413
|
+
try {
|
|
414
|
+
return await fetchAndInlineImage(url, image, undefined, options);
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
418
|
+
options.onWarn?.(`Dropping image with stale/expired presigned url (${reason})`);
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
260
422
|
/**
|
|
261
423
|
* Resolve an image block into a provider-sendable url.
|
|
262
424
|
*
|
|
263
425
|
* Returns `null` when the block carries neither data nor url (nothing sendable).
|
|
264
426
|
* Local/private urls are fetched and inlined; failures fall back to the raw
|
|
265
427
|
* url so the caller still emits *something* rather than dropping the image.
|
|
428
|
+
* S3 presigned urls are never sent as-is — see `resolvePresignedSourceImage`.
|
|
266
429
|
*/
|
|
267
430
|
export async function resolveImageForProvider(image, options = {}) {
|
|
268
431
|
if (hasInlineImageData(image)) {
|
|
@@ -279,6 +442,12 @@ export async function resolveImageForProvider(image, options = {}) {
|
|
|
279
442
|
let url = typeof image.url === "string" ? image.url.trim() : "";
|
|
280
443
|
if (!url)
|
|
281
444
|
return null;
|
|
445
|
+
// A presigned S3 url must NEVER reach the provider as `image_url` — route
|
|
446
|
+
// it through the hosted-ref path (fresh signature + inline) and drop the
|
|
447
|
+
// image when that fails too. See `resolvePresignedSourceImage`.
|
|
448
|
+
if (isS3PresignedUrl(url)) {
|
|
449
|
+
return resolvePresignedSourceImage(url, image, options);
|
|
450
|
+
}
|
|
282
451
|
// Resolve the backend base url lazily, and ONLY when the url even looks
|
|
283
452
|
// hosted (path-wise): public cdn urls must not pay for a config/machine
|
|
284
453
|
// store read. The base url doubles as the origin an absolute url has to
|
|
@@ -349,59 +518,21 @@ export async function resolveImageForProvider(image, options = {}) {
|
|
|
349
518
|
return { url, inlined: false, mimeType: image.mimeType };
|
|
350
519
|
}
|
|
351
520
|
const requestHeaders = authenticated ? authHeaders : undefined;
|
|
352
|
-
const doFetch = options.fetchImpl ?? fetch;
|
|
353
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_INLINE_FETCH_TIMEOUT_MS;
|
|
354
|
-
const maxInlineBytes = options.maxInlineBytes ?? DEFAULT_MAX_INLINE_BYTES;
|
|
355
|
-
const controller = new AbortController();
|
|
356
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
357
|
-
const onAbort = () => controller.abort();
|
|
358
|
-
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
359
521
|
try {
|
|
360
|
-
|
|
361
|
-
if (options.signal?.aborted)
|
|
362
|
-
throw new Error("aborted");
|
|
363
|
-
// `requestHeaders` is only set when the (possibly rewritten) url still
|
|
364
|
-
// resolves to the backend origin — a url on any other host is fetched
|
|
365
|
-
// anonymously, so the JWT cannot leak to a third party.
|
|
366
|
-
const response = await doFetch(downloadUrl, requestHeaders ? { signal: controller.signal, headers: requestHeaders } : { signal: controller.signal });
|
|
367
|
-
if (!response.ok)
|
|
368
|
-
throw new Error(`HTTP ${response.status}`);
|
|
369
|
-
// Reject oversized payloads from the declared length BEFORE reading
|
|
370
|
-
// the body — otherwise the whole payload lands in memory first.
|
|
371
|
-
const declaredLength = response.headers?.get?.("content-length");
|
|
372
|
-
if (declaredLength !== null && declaredLength !== undefined) {
|
|
373
|
-
const declared = Number(declaredLength);
|
|
374
|
-
if (Number.isFinite(declared) && declared > maxInlineBytes) {
|
|
375
|
-
throw new Error(`image too large to inline (${declared} bytes)`);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
const buffer = await response.arrayBuffer();
|
|
379
|
-
if (buffer.byteLength > maxInlineBytes) {
|
|
380
|
-
throw new Error(`image too large to inline (${buffer.byteLength} bytes)`);
|
|
381
|
-
}
|
|
382
|
-
const mimeType = normalizeMimeType(response.headers?.get?.("content-type"), image.mimeType);
|
|
383
|
-
const data = bytesToBase64(new Uint8Array(buffer));
|
|
384
|
-
return {
|
|
385
|
-
url: dataUriForImage(data, mimeType),
|
|
386
|
-
inlined: true,
|
|
387
|
-
mimeType,
|
|
388
|
-
data,
|
|
389
|
-
};
|
|
522
|
+
return await fetchAndInlineImage(downloadUrl, image, requestHeaders, options);
|
|
390
523
|
}
|
|
391
524
|
catch (error) {
|
|
392
525
|
const reason = error instanceof Error ? error.message : String(error);
|
|
393
526
|
options.onWarn?.(`Could not inline image ${presignedResolved ? downloadUrl : url} (${reason}); sending url as-is${hosted && !presignedResolved ? " — the provider may not be able to fetch it (auth required)" : ""}`);
|
|
394
527
|
if (presignedResolved) {
|
|
395
|
-
//
|
|
396
|
-
//
|
|
397
|
-
|
|
528
|
+
// A presigned url — stale, expired or freshly minted — must NEVER be
|
|
529
|
+
// handed to the provider: OpenRouter's server-side media fetcher
|
|
530
|
+
// answers HTTP 400 on presigned urls and the agent loop retries the
|
|
531
|
+
// doomed request 8x per turn. Drop the image instead.
|
|
532
|
+
return null;
|
|
398
533
|
}
|
|
399
534
|
return { url, inlined: false, mimeType: image.mimeType };
|
|
400
535
|
}
|
|
401
|
-
finally {
|
|
402
|
-
clearTimeout(timer);
|
|
403
|
-
options.signal?.removeEventListener("abort", onAbort);
|
|
404
|
-
}
|
|
405
536
|
}
|
|
406
537
|
function inlineImageContentBlock(block, resolved) {
|
|
407
538
|
const image = block;
|
|
@@ -525,5 +656,11 @@ export function imageSourceUrlForProvider(image, baseUrl) {
|
|
|
525
656
|
// something it can never fetch.
|
|
526
657
|
if (isRelativeImageUrl(url))
|
|
527
658
|
return undefined;
|
|
659
|
+
// A stale/expired S3 presigned url is unfetchable for the provider
|
|
660
|
+
// (HTTP 400 "parameter=image_url" on every request). The
|
|
661
|
+
// `resolveImagesForContext` pre-pass should have replaced it with inline
|
|
662
|
+
// bytes; if one still lands here, drop the block.
|
|
663
|
+
if (isS3PresignedUrl(url))
|
|
664
|
+
return undefined;
|
|
528
665
|
return url;
|
|
529
666
|
}
|
|
@@ -23,6 +23,10 @@ export { isRateLimitError } from "./rate-limit-retry.js";
|
|
|
23
23
|
*
|
|
24
24
|
* Rate limits (429) are intentionally NOT matched here; call sites must
|
|
25
25
|
* check `isRateLimitError` first so they keep their own long schedule.
|
|
26
|
+
*
|
|
27
|
+
* Media-fetch failures ("Failed to fetch media from URL ...",
|
|
28
|
+
* "parameter=image_url") are classified NON-transient: the provider fails
|
|
29
|
+
* the same way on every retry, so the request must fail fast.
|
|
26
30
|
*/
|
|
27
31
|
export declare function isTransientApiError(message: string): boolean;
|
|
28
32
|
//# sourceMappingURL=transient-error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transient-error.d.ts","sourceRoot":"","sources":["../../../../src/sdk/ai/utils/transient-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"transient-error.d.ts","sourceRoot":"","sources":["../../../../src/sdk/ai/utils/transient-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAwCzD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG5D"}
|
|
@@ -42,6 +42,15 @@ export { isRateLimitError } from "./rate-limit-retry.js";
|
|
|
42
42
|
* "rate limit" / "too many requests".
|
|
43
43
|
*/
|
|
44
44
|
const TRANSIENT_API_ERROR_RE = /overloaded|\b529\b|timeout|timed?.?out|network|econnreset|fetch failed|socket connection was closed|connection.?closed|connection.?reset|connection.?error|connection.?refused|connection.?lost|socket hang up|websocket.?closed|websocket.?error|other side closed|reset before headers|upstream.?connect|http2 request did not get a response|provider.?returned.?error|ended without|stream ended before message_stop|terminated|retry delay|\b5(?:00|02|03|04)\b|unavailable|temporarily|internal.?error|server.?error/i;
|
|
45
|
+
/**
|
|
46
|
+
* Provider media-fetch failures are PERMANENT, not transient: a provider that
|
|
47
|
+
* cannot fetch a media url (stale/expired S3 presigned url, 401-gated backend
|
|
48
|
+
* ref, ...) fails the SAME way on every retry — retrying only burns 8 rounds
|
|
49
|
+
* per turn ("[Retrying after transient error (N/8): ...]" spam in old/long
|
|
50
|
+
* sessions). Classified as non-transient so a doomed image request fails
|
|
51
|
+
* fast once instead of being retried.
|
|
52
|
+
*/
|
|
53
|
+
const NON_TRANSIENT_MEDIA_ERROR_RE = /failed to fetch media|parameter=image_url/i;
|
|
45
54
|
/**
|
|
46
55
|
* Check whether an error message (which may embed a raw provider JSON blob)
|
|
47
56
|
* describes a transient API failure worth retrying — overload, HTTP 5xx,
|
|
@@ -49,7 +58,13 @@ const TRANSIENT_API_ERROR_RE = /overloaded|\b529\b|timeout|timed?.?out|network|e
|
|
|
49
58
|
*
|
|
50
59
|
* Rate limits (429) are intentionally NOT matched here; call sites must
|
|
51
60
|
* check `isRateLimitError` first so they keep their own long schedule.
|
|
61
|
+
*
|
|
62
|
+
* Media-fetch failures ("Failed to fetch media from URL ...",
|
|
63
|
+
* "parameter=image_url") are classified NON-transient: the provider fails
|
|
64
|
+
* the same way on every retry, so the request must fail fast.
|
|
52
65
|
*/
|
|
53
66
|
export function isTransientApiError(message) {
|
|
67
|
+
if (NON_TRANSIENT_MEDIA_ERROR_RE.test(message))
|
|
68
|
+
return false;
|
|
54
69
|
return TRANSIENT_API_ERROR_RE.test(message);
|
|
55
70
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Built-in fraction of the model context window that triggers compaction/pruning. */
|
|
2
2
|
export declare const CONTEXT_LIMIT_RATIO = 0.8;
|
|
3
|
+
/** Ceiling (fraction of the model context window) for the post-run auto-compaction threshold. */
|
|
4
|
+
export declare const AUTO_COMPACTION_WINDOW_RATIO = 0.92;
|
|
3
5
|
export interface ConversationCompactionPolicy {
|
|
4
6
|
enabled: boolean;
|
|
5
7
|
reserveTokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/compaction/policy.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/compaction/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** Built-in fraction of the model context window that triggers compaction/pruning. */
|
|
2
2
|
export const CONTEXT_LIMIT_RATIO = 0.8;
|
|
3
|
+
/** Ceiling (fraction of the model context window) for the post-run auto-compaction threshold. */
|
|
4
|
+
export const AUTO_COMPACTION_WINDOW_RATIO = 0.92;
|
|
3
5
|
export const DEFAULT_COMPACTION_POLICY = {
|
|
4
6
|
conversation: {
|
|
5
7
|
enabled: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAwN3E"}
|
|
@@ -41,6 +41,7 @@ export function buildSystemPrompt(options) {
|
|
|
41
41
|
const hasApplyPatch = tools.includes("apply_patch");
|
|
42
42
|
const hasSubagent = tools.includes("subagent");
|
|
43
43
|
const hasMemoryTools = tools.includes("read_project_observations");
|
|
44
|
+
const hasWebFetch = tools.includes("web_fetch");
|
|
44
45
|
// File exploration guidelines
|
|
45
46
|
if (hasBash && !hasGrep && !hasLs) {
|
|
46
47
|
addGuideline("Use bash for file operations like ls, rg, find");
|
|
@@ -76,6 +77,9 @@ export function buildSystemPrompt(options) {
|
|
|
76
77
|
}
|
|
77
78
|
addGuideline("When creating new files, maintain a tree-like directory structure. Place files in semantically meaningful subdirectories (e.g. `handlers/auth/`, `utils/string/`) rather than dumping them at the project root or in shallow flat folders. Group related files into dedicated folders, prefer `feature/module/file.ts` over `feature-file.ts` at root. Avoid creating files directly in root unless they are truly project-wide (e.g. config, package.json). Keep folder depth reasonable (max 5–6 levels) but prefer nesting over flattening — tree-like structure improves LLM navigability and agentic coding efficiency.");
|
|
78
79
|
addGuideline("When editing code, first inspect nearby files and existing patterns; follow the codebase’s conventions and libraries");
|
|
80
|
+
if (hasWebFetch) {
|
|
81
|
+
addGuideline("When writing code that uses a library, if you are not at least 80% confident about the API usage (function signatures, arguments, version-specific behavior), use web_fetch to pull the library's official documentation and verify the usage before writing the code.");
|
|
82
|
+
}
|
|
79
83
|
// Some models (notably via OpenRouter) emit antml-style XML tool calls in
|
|
80
84
|
// plain text instead of using the native tool-call mechanism. The provider
|
|
81
85
|
// parses those as a fallback, but the native path is strictly better
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AAkID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AAkID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CAsLhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
|
|
@@ -4,7 +4,7 @@ import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
|
|
|
4
4
|
import { Type } from "typebox";
|
|
5
5
|
import { getReadmePath } from "../../config.js";
|
|
6
6
|
import { getLanguageFromPath, highlightCode } from "../theme.js";
|
|
7
|
-
import { formatDimensionNote,
|
|
7
|
+
import { formatDimensionNote, resizeImageOutcome } from "../../utils/image-resize.js";
|
|
8
8
|
import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
|
|
9
9
|
import { formatPathRelativeToCwdOrAbsolute } from "../../utils/paths.js";
|
|
10
10
|
import { resolveReadPath } from "./path-utils.js";
|
|
@@ -165,16 +165,23 @@ export function createReadToolDefinition(cwd, options) {
|
|
|
165
165
|
const base64 = buffer.toString("base64");
|
|
166
166
|
if (autoResizeImages) {
|
|
167
167
|
// Resize image if needed before sending it back to the model.
|
|
168
|
-
const
|
|
169
|
-
if (!
|
|
170
|
-
|
|
168
|
+
const outcome = await resizeImageOutcome({ type: "image", data: base64, mimeType });
|
|
169
|
+
if (!outcome.ok) {
|
|
170
|
+
// Distinguish a missing image pipeline (e.g. the photon WASM
|
|
171
|
+
// is not shipped with a standalone binary) from a genuine
|
|
172
|
+
// size failure — blaming the size limit for both hides the
|
|
173
|
+
// actual cause from the model.
|
|
174
|
+
const omittedNote = outcome.reason === "pipeline-unavailable"
|
|
175
|
+
? "[Image omitted: image pipeline unavailable — failed to load photon WASM]"
|
|
176
|
+
: "[Image omitted: could not be resized below the inline image size limit.]";
|
|
177
|
+
let textNote = `Read image file [${mimeType}]\n${omittedNote}`;
|
|
171
178
|
if (nonVisionImageNote)
|
|
172
179
|
textNote += `\n${nonVisionImageNote}`;
|
|
173
180
|
content = [{ type: "text", text: textNote }];
|
|
174
181
|
}
|
|
175
182
|
else {
|
|
176
|
-
const dimensionNote = formatDimensionNote(
|
|
177
|
-
let textNote = `Read image file [${
|
|
183
|
+
const dimensionNote = formatDimensionNote(outcome.image);
|
|
184
|
+
let textNote = `Read image file [${outcome.image.mimeType}]`;
|
|
178
185
|
if (dimensionNote)
|
|
179
186
|
textNote += `\n${dimensionNote}`;
|
|
180
187
|
if (nonVisionImageNote) {
|
|
@@ -184,7 +191,7 @@ export function createReadToolDefinition(cwd, options) {
|
|
|
184
191
|
else {
|
|
185
192
|
content = [
|
|
186
193
|
{ type: "text", text: textNote },
|
|
187
|
-
{ type: "image", data:
|
|
194
|
+
{ type: "image", data: outcome.image.data, mimeType: outcome.image.mimeType },
|
|
188
195
|
];
|
|
189
196
|
}
|
|
190
197
|
}
|
|
@@ -28,6 +28,6 @@ export { runPrintMode } from "./modes/print-mode.js";
|
|
|
28
28
|
export { getLanguageFromPath, highlightCode, loadThemeFromPath, type Theme } from "./core/theme.js";
|
|
29
29
|
export { copyToClipboard } from "./utils/clipboard.js";
|
|
30
30
|
export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
|
|
31
|
-
export { formatDimensionNote, type
|
|
31
|
+
export { formatDimensionNote, type ImageResizeFailureReason, type ImageResizeOutcome, resizeImage, resizeImageOutcome, type ResizedImage, } from "./utils/image-resize.js";
|
|
32
32
|
export { getShellConfig } from "./utils/shell.js";
|
|
33
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/coding-agent/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/coding-agent/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,6 @@ export { getLanguageFromPath, highlightCode, loadThemeFromPath } from "./core/th
|
|
|
45
45
|
// Clipboard utilities
|
|
46
46
|
export { copyToClipboard } from "./utils/clipboard.js";
|
|
47
47
|
export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
|
|
48
|
-
export { formatDimensionNote, resizeImage } from "./utils/image-resize.js";
|
|
48
|
+
export { formatDimensionNote, resizeImage, resizeImageOutcome, } from "./utils/image-resize.js";
|
|
49
49
|
// Shell utilities
|
|
50
50
|
export { getShellConfig } from "./utils/shell.js";
|
|
@@ -14,23 +14,37 @@ export interface ResizedImage {
|
|
|
14
14
|
height: number;
|
|
15
15
|
wasResized: boolean;
|
|
16
16
|
}
|
|
17
|
+
/** Why a resize attempt produced no image. */
|
|
18
|
+
export type ImageResizeFailureReason = "no-data" | "pipeline-unavailable" | "too-large";
|
|
19
|
+
/**
|
|
20
|
+
* Outcome of a resize attempt: either a ready-to-send image, or the reason
|
|
21
|
+
* none was produced. Callers use the reason to emit an accurate omission
|
|
22
|
+
* message instead of blaming the size limit for every failure.
|
|
23
|
+
*/
|
|
24
|
+
export type ImageResizeOutcome = {
|
|
25
|
+
ok: true;
|
|
26
|
+
image: ResizedImage;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
reason: ImageResizeFailureReason;
|
|
30
|
+
};
|
|
17
31
|
/**
|
|
18
32
|
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
19
|
-
* Returns
|
|
20
|
-
*
|
|
21
|
-
* Uses Photon (Rust/WASM) for image processing. If Photon is not available,
|
|
22
|
-
* returns null.
|
|
23
|
-
*
|
|
24
|
-
* Strategy for staying under maxBytes:
|
|
25
|
-
* 1. First resize to maxWidth/maxHeight
|
|
26
|
-
* 2. Try both PNG and JPEG formats, pick the smaller one
|
|
27
|
-
* 3. If still too large, try JPEG with decreasing quality
|
|
28
|
-
* 4. If still too large, progressively reduce dimensions until 1x1
|
|
33
|
+
* Returns a failure reason when no image can be produced (see ImageResizeOutcome).
|
|
29
34
|
*/
|
|
30
|
-
export declare function
|
|
35
|
+
export declare function resizeImageOutcome(img: ImageContent, options?: ImageResizeOptions): Promise<ImageResizeOutcome>;
|
|
31
36
|
/**
|
|
32
37
|
* Format a dimension note for resized images.
|
|
33
38
|
* This helps the model understand the coordinate mapping.
|
|
34
39
|
*/
|
|
35
40
|
export declare function formatDimensionNote(result: ResizedImage): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Resize an image to fit within the specified max dimensions and encoded file size.
|
|
43
|
+
* Returns null if the image cannot be resized below maxBytes.
|
|
44
|
+
*
|
|
45
|
+
* Backward-compatible wrapper around resizeImageOutcome for callers that only
|
|
46
|
+
* care about the image (or nothing). Prefer resizeImageOutcome when the failure
|
|
47
|
+
* reason must be observable.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resizeImage(img: ImageContent, options?: ImageResizeOptions): Promise<ResizedImage | null>;
|
|
36
50
|
//# sourceMappingURL=image-resize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-resize.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/image-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"image-resize.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/utils/image-resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,MAAM,wBAAwB,GACjC,SAAS,GACT,sBAAsB,GACtB,WAAW,CAAC;AAEf;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AA2BrH;;;GAGG;AACH,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA2H7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO5E;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG/G"}
|