@aexol/spectral 0.9.250 → 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.
Files changed (61) hide show
  1. package/dist/agent/index.d.ts +2 -1
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +10 -3
  4. package/dist/generated/zeus/const.d.ts.map +1 -1
  5. package/dist/generated/zeus/const.js +51 -6
  6. package/dist/generated/zeus/index.d.ts +278 -36
  7. package/dist/generated/zeus/index.d.ts.map +1 -1
  8. package/dist/mcp/mcp-auth-flow.d.ts +4 -0
  9. package/dist/mcp/mcp-auth-flow.d.ts.map +1 -1
  10. package/dist/mcp/mcp-auth-flow.js +7 -4
  11. package/dist/memory/commands/status.d.ts.map +1 -1
  12. package/dist/memory/commands/status.js +2 -1
  13. package/dist/memory/hooks/compaction-trigger.d.ts +14 -1
  14. package/dist/memory/hooks/compaction-trigger.d.ts.map +1 -1
  15. package/dist/memory/hooks/compaction-trigger.js +31 -4
  16. package/dist/relay/dispatcher.d.ts.map +1 -1
  17. package/dist/relay/dispatcher.js +4 -47
  18. package/dist/relay/routing.d.ts +1 -1
  19. package/dist/relay/routing.d.ts.map +1 -1
  20. package/dist/relay/routing.js +9 -0
  21. package/dist/sdk/ai/utils/image-source.d.ts +26 -11
  22. package/dist/sdk/ai/utils/image-source.d.ts.map +1 -1
  23. package/dist/sdk/ai/utils/image-source.js +184 -47
  24. package/dist/sdk/ai/utils/transient-error.d.ts +4 -0
  25. package/dist/sdk/ai/utils/transient-error.d.ts.map +1 -1
  26. package/dist/sdk/ai/utils/transient-error.js +15 -0
  27. package/dist/sdk/coding-agent/core/compaction/policy.d.ts +2 -0
  28. package/dist/sdk/coding-agent/core/compaction/policy.d.ts.map +1 -1
  29. package/dist/sdk/coding-agent/core/compaction/policy.js +2 -0
  30. package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
  31. package/dist/sdk/coding-agent/core/system-prompt.js +4 -0
  32. package/dist/sdk/coding-agent/core/tools/read.d.ts.map +1 -1
  33. package/dist/sdk/coding-agent/core/tools/read.js +14 -7
  34. package/dist/sdk/coding-agent/index.d.ts +1 -1
  35. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  36. package/dist/sdk/coding-agent/index.js +1 -1
  37. package/dist/sdk/coding-agent/utils/image-resize.d.ts +25 -11
  38. package/dist/sdk/coding-agent/utils/image-resize.d.ts.map +1 -1
  39. package/dist/sdk/coding-agent/utils/image-resize.js +54 -36
  40. package/dist/sdk/coding-agent/utils/photon.d.ts.map +1 -1
  41. package/dist/sdk/coding-agent/utils/photon.js +11 -2
  42. package/dist/server/agent-bridge.d.ts +32 -0
  43. package/dist/server/agent-bridge.d.ts.map +1 -1
  44. package/dist/server/agent-bridge.js +59 -9
  45. package/dist/server/handlers/mcp-auth.d.ts +25 -0
  46. package/dist/server/handlers/mcp-auth.d.ts.map +1 -0
  47. package/dist/server/handlers/mcp-auth.js +106 -0
  48. package/dist/server/handlers/mcp-status.d.ts +8 -2
  49. package/dist/server/handlers/mcp-status.d.ts.map +1 -1
  50. package/dist/server/handlers/mcp-status.js +15 -3
  51. package/dist/server/preset-chain.d.ts +0 -13
  52. package/dist/server/preset-chain.d.ts.map +1 -1
  53. package/dist/server/preset-chain.js +0 -25
  54. package/dist/server/session-stream/memory.d.ts.map +1 -1
  55. package/dist/server/session-stream/memory.js +8 -1
  56. package/dist/server/session-stream.d.ts +15 -56
  57. package/dist/server/session-stream.d.ts.map +1 -1
  58. package/dist/server/session-stream.js +41 -271
  59. package/dist/server/wire.d.ts +18 -32
  60. package/dist/server/wire.d.ts.map +1 -1
  61. 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 S3 download
18
- * fails, the presigned url is sent as a fallback
19
- * instead of dropping the image.
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
- // An already-aborted signal never fires the listener above.
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
- // The S3 download failed — degrade to the old verbatim behavior
396
- // (send the presigned url) rather than dropping the image.
397
- return { url: downloadUrl, inlined: false, mimeType: image.mimeType, hostedResolved: true };
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;AA8BzD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D"}
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":"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"}
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,CAkN3E"}
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,CA8KhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
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, resizeImage } from "../../utils/image-resize.js";
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 resized = await resizeImage({ type: "image", data: base64, mimeType });
169
- if (!resized) {
170
- let textNote = `Read image file [${mimeType}]\n[Image omitted: could not be resized below the inline image size limit.]`;
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(resized);
177
- let textNote = `Read image file [${resized.mimeType}]`;
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: resized.data, mimeType: resized.mimeType },
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 ResizedImage, resizeImage } from "./utils/image-resize.js";
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 null if the image cannot be resized below maxBytes.
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 resizeImage(img: ImageContent, options?: ImageResizeOptions): Promise<ResizedImage | null>;
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;AA2BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0G/G;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO5E"}
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"}