clanka 0.5.2 → 0.6.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 (76) hide show
  1. package/dist/Acp.d.ts.map +1 -1
  2. package/dist/Acp.js +195 -16
  3. package/dist/Acp.js.map +1 -1
  4. package/dist/AcpImage.test.d.ts +2 -0
  5. package/dist/AcpImage.test.d.ts.map +1 -0
  6. package/dist/AcpImage.test.js +470 -0
  7. package/dist/AcpImage.test.js.map +1 -0
  8. package/dist/Agent.d.ts +9 -2
  9. package/dist/Agent.d.ts.map +1 -1
  10. package/dist/Agent.js +43 -6
  11. package/dist/Agent.js.map +1 -1
  12. package/dist/AgentExecutor.d.ts +27 -5
  13. package/dist/AgentExecutor.d.ts.map +1 -1
  14. package/dist/AgentExecutor.js +29 -4
  15. package/dist/AgentExecutor.js.map +1 -1
  16. package/dist/AgentExecutorImage.test.d.ts +2 -0
  17. package/dist/AgentExecutorImage.test.d.ts.map +1 -0
  18. package/dist/AgentExecutorImage.test.js +63 -0
  19. package/dist/AgentExecutorImage.test.js.map +1 -0
  20. package/dist/AgentImage.test.d.ts +2 -0
  21. package/dist/AgentImage.test.d.ts.map +1 -0
  22. package/dist/AgentImage.test.js +176 -0
  23. package/dist/AgentImage.test.js.map +1 -0
  24. package/dist/AgentTools.d.ts +25 -5
  25. package/dist/AgentTools.d.ts.map +1 -1
  26. package/dist/AgentTools.js +40 -4
  27. package/dist/AgentTools.js.map +1 -1
  28. package/dist/AgentToolsImage.test.d.ts +2 -0
  29. package/dist/AgentToolsImage.test.d.ts.map +1 -0
  30. package/dist/AgentToolsImage.test.js +158 -0
  31. package/dist/AgentToolsImage.test.js.map +1 -0
  32. package/dist/Codex.js +6 -1
  33. package/dist/Codex.js.map +1 -1
  34. package/dist/Compaction.d.ts.map +1 -1
  35. package/dist/Compaction.js +16 -1
  36. package/dist/Compaction.js.map +1 -1
  37. package/dist/CompactionImage.test.d.ts +2 -0
  38. package/dist/CompactionImage.test.d.ts.map +1 -0
  39. package/dist/CompactionImage.test.js +105 -0
  40. package/dist/CompactionImage.test.js.map +1 -0
  41. package/dist/Copilot.d.ts.map +1 -1
  42. package/dist/Copilot.js +5 -1
  43. package/dist/Copilot.js.map +1 -1
  44. package/dist/Image.d.ts +192 -0
  45. package/dist/Image.d.ts.map +1 -0
  46. package/dist/Image.js +586 -0
  47. package/dist/Image.js.map +1 -0
  48. package/dist/Image.test.d.ts +2 -0
  49. package/dist/Image.test.d.ts.map +1 -0
  50. package/dist/Image.test.js +142 -0
  51. package/dist/Image.test.js.map +1 -0
  52. package/dist/fixtures/TestImages.d.ts +73 -0
  53. package/dist/fixtures/TestImages.d.ts.map +1 -0
  54. package/dist/fixtures/TestImages.js +263 -0
  55. package/dist/fixtures/TestImages.js.map +1 -0
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -0
  59. package/dist/index.js.map +1 -1
  60. package/package.json +2 -1
  61. package/src/Acp.ts +274 -21
  62. package/src/AcpImage.test.ts +676 -0
  63. package/src/Agent.ts +69 -7
  64. package/src/AgentExecutor.ts +51 -3
  65. package/src/AgentExecutorImage.test.ts +103 -0
  66. package/src/AgentImage.test.ts +295 -0
  67. package/src/AgentTools.ts +78 -7
  68. package/src/AgentToolsImage.test.ts +302 -0
  69. package/src/Codex.ts +6 -1
  70. package/src/Compaction.ts +16 -1
  71. package/src/CompactionImage.test.ts +142 -0
  72. package/src/Copilot.ts +5 -1
  73. package/src/Image.test.ts +220 -0
  74. package/src/Image.ts +704 -0
  75. package/src/fixtures/TestImages.ts +287 -0
  76. package/src/index.ts +5 -0
package/dist/Image.js ADDED
@@ -0,0 +1,586 @@
1
+ /**
2
+ * Image handling shared by ACP prompt ingest and the `readFile` tool.
3
+ *
4
+ * - Media type detection by extension and by magic bytes.
5
+ * - The size limits every image goes through before it reaches a model
6
+ * (OpenCode's numbers): 2000x2000 pixels and 5MB of base64. Images inside
7
+ * the limits pass through untouched; larger ones are resized with Photon
8
+ * (Lanczos3), re-encoded as PNG then JPEG at decreasing quality, shrunk and
9
+ * retried, and rejected when they still do not fit.
10
+ * - Prompt helpers for models that cannot take images: strip the parts and
11
+ * leave an explicit `[image: <name> omitted]` note.
12
+ *
13
+ * @since 1.0.0
14
+ */
15
+ import * as Photon from "@silvia-odwyer/photon-node";
16
+ import * as Effect from "effect/Effect";
17
+ import * as Encoding from "effect/Encoding";
18
+ import * as Option from "effect/Option";
19
+ import * as Schema from "effect/Schema";
20
+ import * as Stream from "effect/Stream";
21
+ import * as Prompt from "effect/unstable/ai/Prompt";
22
+ /**
23
+ * @since 1.0.0
24
+ * @category Models
25
+ */
26
+ export const ImageMediaType = Schema.Literals([
27
+ "image/png",
28
+ "image/jpeg",
29
+ "image/gif",
30
+ "image/webp",
31
+ ]);
32
+ /**
33
+ * @since 1.0.0
34
+ * @category Errors
35
+ */
36
+ export class ImageError extends Schema.TaggedError()("ImageError", {
37
+ reason: Schema.Literals(["TooLarge", "Decode"]),
38
+ message: Schema.String,
39
+ }) {
40
+ }
41
+ // =============================================================================
42
+ // Limits
43
+ // =============================================================================
44
+ /**
45
+ * Maximum width and height, in pixels.
46
+ *
47
+ * @since 1.0.0
48
+ * @category Limits
49
+ */
50
+ export const maxDimension = 2000;
51
+ /**
52
+ * Maximum size of the base64-encoded image, in bytes.
53
+ *
54
+ * @since 1.0.0
55
+ * @category Limits
56
+ */
57
+ export const maxBytes = 5 * 1024 * 1024;
58
+ /**
59
+ * Maximum encoded input size before decoding.
60
+ * @since 1.0.0
61
+ * @category Limits
62
+ */
63
+ export const maxInputBytes = 20 * 1024 * 1024;
64
+ /**
65
+ * Maximum declared canvas or frame area before allocating decoder buffers.
66
+ * @since 1.0.0
67
+ * @category Limits
68
+ */
69
+ export const maxInputPixels = 50_000_000;
70
+ /**
71
+ * Stat first, then bound the actual read independently of file growth.
72
+ * @since 1.0.0
73
+ * @category Input
74
+ */
75
+ export const readBoundedFile = Effect.fnUntraced(function* (fs, path) {
76
+ const tooLarge = () => new ImageError({
77
+ reason: "TooLarge",
78
+ message: `Image ${path} exceeds the ${maxInputBytes} byte input limit`,
79
+ });
80
+ const stat = yield* fs.stat(path);
81
+ if (stat.size > maxInputBytes)
82
+ return yield* tooLarge();
83
+ // The extra byte detects growth past the ceiling without reading the rest.
84
+ return yield* collectInput(fs.stream(path, {
85
+ chunkSize: 64 * 1024,
86
+ bytesToRead: maxInputBytes + 1,
87
+ }), tooLarge);
88
+ });
89
+ /**
90
+ * Collect image input, rejecting overflow before retaining the next chunk.
91
+ * @since 1.0.0
92
+ * @category Input
93
+ */
94
+ export const collectInput = Effect.fnUntraced(function* (stream, tooLarge) {
95
+ const chunks = [];
96
+ let size = 0;
97
+ yield* Stream.runForEach(stream, (chunk) => {
98
+ if (chunk.length > maxInputBytes - size)
99
+ return Effect.fail(tooLarge());
100
+ size += chunk.length;
101
+ chunks.push(chunk);
102
+ return Effect.void;
103
+ });
104
+ const bytes = new Uint8Array(size);
105
+ let offset = 0;
106
+ for (const chunk of chunks) {
107
+ bytes.set(chunk, offset);
108
+ offset += chunk.length;
109
+ }
110
+ return bytes;
111
+ });
112
+ const defaultLimits = { maxDimension, maxBytes };
113
+ /** JPEG qualities tried, in order, when the PNG re-encode is too large. */
114
+ const jpegQualities = [85, 70, 55, 40];
115
+ /** Scale applied on every shrink-and-retry round. */
116
+ const shrinkFactor = 0.75;
117
+ /** Shrink rounds attempted before giving up. */
118
+ const maxShrinkRounds = 6;
119
+ // =============================================================================
120
+ // Media type detection
121
+ // =============================================================================
122
+ const extensions = {
123
+ png: "image/png",
124
+ jpg: "image/jpeg",
125
+ jpeg: "image/jpeg",
126
+ gif: "image/gif",
127
+ webp: "image/webp",
128
+ };
129
+ /**
130
+ * Media type from a file extension. SVG and every non-raster extension is
131
+ * `None`, so those files keep being read as text.
132
+ *
133
+ * @since 1.0.0
134
+ * @category Detection
135
+ */
136
+ export const mediaTypeFromPath = (path) => {
137
+ const base = path.slice(Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\")) + 1);
138
+ const dot = base.lastIndexOf(".");
139
+ if (dot <= 0)
140
+ return Option.none();
141
+ return Option.fromNullishOr(extensions[base.slice(dot + 1).toLowerCase()]);
142
+ };
143
+ const startsWith = (bytes, prefix, offset = 0) => bytes.length >= offset + prefix.length &&
144
+ prefix.every((byte, i) => bytes[offset + i] === byte);
145
+ const ascii = (text) => Array.from(text, (char) => char.charCodeAt(0));
146
+ /**
147
+ * Media type from the magic bytes at the start of the data.
148
+ *
149
+ * @since 1.0.0
150
+ * @category Detection
151
+ */
152
+ export const mediaTypeFromBytes = (bytes) => {
153
+ if (startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {
154
+ return Option.some("image/png");
155
+ }
156
+ if (startsWith(bytes, [0xff, 0xd8, 0xff])) {
157
+ return Option.some("image/jpeg");
158
+ }
159
+ if (startsWith(bytes, ascii("GIF87a")) ||
160
+ startsWith(bytes, ascii("GIF89a"))) {
161
+ return Option.some("image/gif");
162
+ }
163
+ if (startsWith(bytes, ascii("RIFF")) && startsWith(bytes, ascii("WEBP"), 8)) {
164
+ return Option.some("image/webp");
165
+ }
166
+ return Option.none();
167
+ };
168
+ const validDimensions = (width, height) => width > 0 && height > 0 ? Option.some({ width, height }) : Option.none();
169
+ /**
170
+ * Read conservative dimension bounds without decoding pixels, including inner
171
+ * frames in container formats. Truncated or malformed headers are rejected
172
+ * before they can reach Photon; over-budget dimensions stop parsing early.
173
+ * @since 1.0.0
174
+ * @category Detection
175
+ */
176
+ export const dimensions = (bytes) => {
177
+ const type = mediaTypeFromBytes(bytes);
178
+ if (Option.isNone(type))
179
+ return Option.none();
180
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
181
+ switch (type.value) {
182
+ case "image/png":
183
+ if (bytes.length < 33 ||
184
+ view.getUint32(8) !== 13 ||
185
+ !startsWith(bytes, ascii("IHDR"), 12))
186
+ return Option.none();
187
+ return validDimensions(view.getUint32(16), view.getUint32(20));
188
+ case "image/gif": {
189
+ if (bytes.length < 13)
190
+ return Option.none();
191
+ let width = view.getUint16(6, true);
192
+ let height = view.getUint16(8, true);
193
+ if (width === 0 || height === 0)
194
+ return Option.none();
195
+ if (width * height > maxInputPixels)
196
+ return validDimensions(width, height);
197
+ let offset = 13;
198
+ const skipColorTable = (packed) => {
199
+ if (packed & 0x80)
200
+ offset += 3 * (1 << ((packed & 7) + 1));
201
+ return offset <= bytes.length;
202
+ };
203
+ const skipSubBlocks = () => {
204
+ while (offset < bytes.length) {
205
+ const length = view.getUint8(offset++);
206
+ if (length === 0)
207
+ return true;
208
+ if (length > bytes.length - offset)
209
+ return false;
210
+ offset += length;
211
+ }
212
+ return false;
213
+ };
214
+ if (!skipColorTable(view.getUint8(10)))
215
+ return Option.none();
216
+ let hasFrame = false;
217
+ while (offset < bytes.length) {
218
+ const tag = view.getUint8(offset++);
219
+ if (tag === 0x3b) {
220
+ return hasFrame ? validDimensions(width, height) : Option.none();
221
+ }
222
+ if (tag === 0x21) {
223
+ // Extension label followed by length-prefixed sub-blocks.
224
+ if (offset >= bytes.length)
225
+ return Option.none();
226
+ offset++;
227
+ if (!skipSubBlocks())
228
+ return Option.none();
229
+ continue;
230
+ }
231
+ if (tag !== 0x2c || bytes.length - offset < 9)
232
+ return Option.none();
233
+ const frameWidth = view.getUint16(offset + 4, true);
234
+ const frameHeight = view.getUint16(offset + 6, true);
235
+ if (frameWidth === 0 || frameHeight === 0)
236
+ return Option.none();
237
+ // The decoder allocates the frame independently of the logical screen.
238
+ width = Math.max(width, frameWidth);
239
+ height = Math.max(height, frameHeight);
240
+ if (width * height > maxInputPixels)
241
+ return validDimensions(width, height);
242
+ const packed = view.getUint8(offset + 8);
243
+ offset += 9;
244
+ if (!skipColorTable(packed) || offset >= bytes.length)
245
+ return Option.none();
246
+ offset++; // LZW minimum code size; pixel decoding validates its value.
247
+ if (!skipSubBlocks())
248
+ return Option.none();
249
+ hasFrame = true;
250
+ }
251
+ return Option.none();
252
+ }
253
+ case "image/jpeg": {
254
+ let offset = 2;
255
+ while (offset < bytes.length) {
256
+ if (view.getUint8(offset++) !== 0xff)
257
+ return Option.none();
258
+ // JPEG permits padding FF bytes before a marker.
259
+ while (offset < bytes.length && view.getUint8(offset) === 0xff)
260
+ offset++;
261
+ if (offset >= bytes.length)
262
+ return Option.none();
263
+ const marker = view.getUint8(offset++);
264
+ if (marker === 0xda ||
265
+ marker === 0xd9 ||
266
+ marker === 0 ||
267
+ marker === 0xd8) {
268
+ return Option.none();
269
+ }
270
+ if (marker === 1 || (marker >= 0xd0 && marker <= 0xd7))
271
+ continue;
272
+ if (offset + 2 > bytes.length)
273
+ return Option.none();
274
+ const length = view.getUint16(offset);
275
+ if (length < 2 || length > bytes.length - offset)
276
+ return Option.none();
277
+ if (marker >= 0xc0 &&
278
+ marker <= 0xcf &&
279
+ marker !== 0xc4 &&
280
+ marker !== 0xc8 &&
281
+ marker !== 0xcc) {
282
+ if (length < 8 ||
283
+ view.getUint8(offset + 7) === 0 ||
284
+ length !== 8 + 3 * view.getUint8(offset + 7))
285
+ return Option.none();
286
+ return validDimensions(view.getUint16(offset + 5), view.getUint16(offset + 3));
287
+ }
288
+ offset += length;
289
+ }
290
+ return Option.none();
291
+ }
292
+ case "image/webp": {
293
+ if (bytes.length < 20)
294
+ return Option.none();
295
+ const end = view.getUint32(4, true) + 8;
296
+ if (end < 20 || end > bytes.length)
297
+ return Option.none();
298
+ const u24 = (offset) => view.getUint8(offset) |
299
+ (view.getUint8(offset + 1) << 8) |
300
+ (view.getUint8(offset + 2) << 16);
301
+ let width = 0;
302
+ let height = 0;
303
+ let hasFrame = false;
304
+ const include = (w, h) => {
305
+ if (w === 0 || h === 0)
306
+ return false;
307
+ width = Math.max(width, w);
308
+ height = Math.max(height, h);
309
+ return true;
310
+ };
311
+ // Only one level of nesting is legal: ANMF contains frame chunks, not ANMF.
312
+ const scan = (start, limit, inFrame) => {
313
+ let offset = start;
314
+ while (offset < limit) {
315
+ if (limit - offset < 8)
316
+ return false;
317
+ const length = view.getUint32(offset + 4, true);
318
+ const data = offset + 8;
319
+ const paddedLength = length + (length & 1);
320
+ if (paddedLength > limit - data)
321
+ return false;
322
+ if (startsWith(bytes, ascii("VP8X"), offset)) {
323
+ if (inFrame || offset !== 12 || length !== 10)
324
+ return false;
325
+ include(u24(data + 4) + 1, u24(data + 7) + 1);
326
+ }
327
+ else if (startsWith(bytes, ascii("VP8L"), offset)) {
328
+ if (length < 5 ||
329
+ view.getUint8(data) !== 0x2f ||
330
+ view.getUint8(data + 4) >> 5 !== 0)
331
+ return false;
332
+ include((view.getUint8(data + 1) |
333
+ ((view.getUint8(data + 2) & 0x3f) << 8)) +
334
+ 1, ((view.getUint8(data + 2) >> 6) |
335
+ (view.getUint8(data + 3) << 2) |
336
+ ((view.getUint8(data + 4) & 0x0f) << 10)) +
337
+ 1);
338
+ hasFrame = true;
339
+ }
340
+ else if (startsWith(bytes, ascii("VP8 "), offset)) {
341
+ if (length < 10 ||
342
+ (view.getUint8(data) & 1) !== 0 ||
343
+ !startsWith(bytes, [0x9d, 0x01, 0x2a], data + 3) ||
344
+ !include(view.getUint16(data + 6, true) & 0x3fff, view.getUint16(data + 8, true) & 0x3fff))
345
+ return false;
346
+ hasFrame = true;
347
+ }
348
+ else if (startsWith(bytes, ascii("ANMF"), offset)) {
349
+ if (inFrame || length < 16)
350
+ return false;
351
+ include(u24(data + 6) + 1, u24(data + 9) + 1);
352
+ if (width * height > maxInputPixels)
353
+ return true;
354
+ if (!scan(data + 16, data + length, true))
355
+ return false;
356
+ }
357
+ // Reject over-budget headers even if the pixel payload is incomplete.
358
+ if (width * height > maxInputPixels)
359
+ return true;
360
+ offset = data + paddedLength;
361
+ }
362
+ return true;
363
+ };
364
+ if (!scan(12, end, false))
365
+ return Option.none();
366
+ return hasFrame || width * height > maxInputPixels
367
+ ? validDimensions(width, height)
368
+ : Option.none();
369
+ }
370
+ }
371
+ };
372
+ /**
373
+ * Whether a declared mime type is one of the supported image types.
374
+ *
375
+ * @since 1.0.0
376
+ * @category Detection
377
+ */
378
+ export const isImageMediaType = Schema.is(ImageMediaType);
379
+ // =============================================================================
380
+ // Resize
381
+ // =============================================================================
382
+ const base64Length = (byteLength) => Math.ceil(byteLength / 3) * 4;
383
+ const fits = (bytes, limits) => base64Length(bytes.length) <= limits.maxBytes;
384
+ const decode = (data) => Effect.try({
385
+ try: () => {
386
+ const image = Photon.PhotonImage.new_from_byteslice(data);
387
+ // Photon returns an empty image rather than throwing for some inputs.
388
+ if (image.get_width() === 0 || image.get_height() === 0) {
389
+ image.free();
390
+ throw new Error("Image has no pixels");
391
+ }
392
+ return image;
393
+ },
394
+ catch: (cause) => new ImageError({
395
+ reason: "Decode",
396
+ message: `Could not decode image: ${cause instanceof Error ? cause.message : String(cause)}`,
397
+ }),
398
+ });
399
+ /** Encode as PNG, then JPEG at decreasing quality; `None` if nothing fits. */
400
+ const encodeWithin = (image, limits) => {
401
+ const png = image.get_bytes();
402
+ if (fits(png, limits))
403
+ return Option.some({ data: png, mediaType: "image/png" });
404
+ for (const quality of jpegQualities) {
405
+ const jpeg = image.get_bytes_jpeg(quality);
406
+ if (fits(jpeg, limits)) {
407
+ return Option.some({ data: jpeg, mediaType: "image/jpeg" });
408
+ }
409
+ }
410
+ return Option.none();
411
+ };
412
+ /**
413
+ * Bring an image inside the limits.
414
+ *
415
+ * Images already within `limits` are returned unchanged, byte for byte.
416
+ * Otherwise the image is decoded, scaled down to fit the dimension cap with
417
+ * Lanczos3, and re-encoded as PNG, then as JPEG at decreasing quality. If it
418
+ * is still over the byte cap it is shrunk by 25% and the encoding is retried,
419
+ * up to a fixed number of rounds, after which it is rejected.
420
+ *
421
+ * `limits` exists so tests can exercise the reject path with a small fixture.
422
+ * It is not a user-facing setting.
423
+ *
424
+ * @since 1.0.0
425
+ * @category Resize
426
+ */
427
+ export const prepare = Effect.fnUntraced(function* (options) {
428
+ const limits = options.limits ?? defaultLimits;
429
+ if (options.data.length > maxInputBytes) {
430
+ return yield* new ImageError({
431
+ reason: "TooLarge",
432
+ message: `Image exceeds the ${maxInputBytes} byte input limit`,
433
+ });
434
+ }
435
+ const size = dimensions(options.data);
436
+ if (Option.isNone(size)) {
437
+ return yield* new ImageError({
438
+ reason: "Decode",
439
+ message: "Invalid or truncated image header",
440
+ });
441
+ }
442
+ if (size.value.width * size.value.height > maxInputPixels) {
443
+ return yield* new ImageError({
444
+ reason: "TooLarge",
445
+ message: `Image exceeds the ${maxInputPixels} pixel input limit`,
446
+ });
447
+ }
448
+ const image = yield* decode(options.data);
449
+ let current = image;
450
+ try {
451
+ const width = image.get_width();
452
+ const height = image.get_height();
453
+ const withinDimensions = width <= limits.maxDimension && height <= limits.maxDimension;
454
+ if (withinDimensions && fits(options.data, limits)) {
455
+ return { data: options.data, mediaType: options.mediaType };
456
+ }
457
+ let scale = Math.min(1, limits.maxDimension / width, limits.maxDimension / height);
458
+ for (let round = 0; round <= maxShrinkRounds; round++) {
459
+ const targetWidth = Math.max(1, Math.round(width * scale));
460
+ const targetHeight = Math.max(1, Math.round(height * scale));
461
+ if (targetWidth !== current.get_width() ||
462
+ targetHeight !== current.get_height()) {
463
+ const resized = Photon.resize(image, targetWidth, targetHeight, Photon.SamplingFilter.Lanczos3);
464
+ if (current !== image)
465
+ current.free();
466
+ current = resized;
467
+ }
468
+ const encoded = encodeWithin(current, limits);
469
+ if (Option.isSome(encoded))
470
+ return encoded.value;
471
+ scale *= shrinkFactor;
472
+ }
473
+ return yield* new ImageError({
474
+ reason: "TooLarge",
475
+ message: `Image is still over ${limits.maxBytes} bytes of base64 after resizing`,
476
+ });
477
+ }
478
+ finally {
479
+ if (current !== image)
480
+ current.free();
481
+ image.free();
482
+ }
483
+ });
484
+ // =============================================================================
485
+ // Prompt helpers
486
+ // =============================================================================
487
+ /**
488
+ * The text left in place of a stripped image part.
489
+ *
490
+ * @since 1.0.0
491
+ * @category Prompt
492
+ */
493
+ export const omittedText = (fileName) => `[image: ${fileName ?? "unnamed"} omitted]`;
494
+ /**
495
+ * Whether a prompt part is an image `file` part.
496
+ *
497
+ * @since 1.0.0
498
+ * @category Prompt
499
+ */
500
+ export const isImagePart = (part) => part.type === "file" && part.mediaType.startsWith("image/");
501
+ /**
502
+ * Whether any user message in the prompt carries an image part.
503
+ *
504
+ * @since 1.0.0
505
+ * @category Prompt
506
+ */
507
+ export const hasImages = (prompt) => prompt.content.some((message) => message.role === "user" && message.content.some(isImagePart));
508
+ /**
509
+ * Replace every image part with an `omittedText` text part, so a model that
510
+ * cannot take images still sees that one was there.
511
+ *
512
+ * @since 1.0.0
513
+ * @category Prompt
514
+ */
515
+ export const stripImages = (prompt) => {
516
+ if (!hasImages(prompt))
517
+ return prompt;
518
+ return Prompt.fromMessages(prompt.content.map((message) => {
519
+ if (message.role !== "user" || !message.content.some(isImagePart)) {
520
+ return message;
521
+ }
522
+ return Prompt.makeMessage("user", {
523
+ content: message.content.map((part) => isImagePart(part)
524
+ ? Prompt.makePart("text", { text: omittedText(part.fileName) })
525
+ : part),
526
+ options: message.options,
527
+ });
528
+ }));
529
+ };
530
+ /**
531
+ * Build a user message carrying image parts.
532
+ *
533
+ * @since 1.0.0
534
+ * @category Prompt
535
+ */
536
+ export const userMessage = (images) => Prompt.makeMessage("user", {
537
+ content: images.map((image) => Prompt.makePart("file", {
538
+ mediaType: image.mediaType,
539
+ fileName: image.fileName,
540
+ data: image.data,
541
+ })),
542
+ });
543
+ /**
544
+ * Bytes of a `file` part, whichever representation it carries. Byte arrays
545
+ * come back from persistence as base64 strings.
546
+ *
547
+ * @since 1.0.0
548
+ * @category Prompt
549
+ */
550
+ export const partBytes = (part) => {
551
+ if (part.data instanceof Uint8Array)
552
+ return Option.some(part.data);
553
+ if (part.data instanceof URL)
554
+ return Option.none();
555
+ const base64 = part.data.startsWith("data:")
556
+ ? part.data.slice(part.data.indexOf(",") + 1)
557
+ : part.data;
558
+ const decoded = Encoding.decodeBase64(base64);
559
+ return decoded._tag === "Success"
560
+ ? Option.some(decoded.success)
561
+ : Option.none();
562
+ };
563
+ // =============================================================================
564
+ // Provider errors
565
+ // =============================================================================
566
+ const unsupportedImagePattern = /image[^.]{0,80}(only supported|not supported|unsupported|does not support|cannot|can't|invalid)|(only supported|not supported|unsupported|does not support|cannot|can't|invalid)[^.]{0,80}image/i;
567
+ /**
568
+ * Whether a provider error looks like a rejection of image input, so the
569
+ * turn can be retried once without the images.
570
+ *
571
+ * @since 1.0.0
572
+ * @category Provider errors
573
+ */
574
+ export const isUnsupportedImageError = (error) => {
575
+ const reason = error.reason;
576
+ switch (reason._tag) {
577
+ case "InvalidRequestError":
578
+ case "UnknownError":
579
+ case "InternalProviderError":
580
+ return (reason.description !== undefined &&
581
+ unsupportedImagePattern.test(reason.description));
582
+ default:
583
+ return false;
584
+ }
585
+ };
586
+ //# sourceMappingURL=Image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.js","sourceRoot":"","sources":["../src/Image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Image.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.test.d.ts","sourceRoot":"","sources":["../src/Image.test.ts"],"names":[],"mappings":""}