@enslo/sd-metadata 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ //#region src/types.d.ts
1
2
  /**
2
3
  * PNG text chunk (tEXt or iTXt)
3
4
  */
@@ -6,68 +7,68 @@ type PngTextChunk = TExtChunk | ITXtChunk;
6
7
  * tEXt chunk (Latin-1 encoded text)
7
8
  */
8
9
  interface TExtChunk {
9
- type: 'tEXt';
10
- /** Chunk keyword (e.g., 'parameters', 'Comment') */
11
- keyword: string;
12
- /** Text content */
13
- text: string;
10
+ type: 'tEXt';
11
+ /** Chunk keyword (e.g., 'parameters', 'Comment') */
12
+ keyword: string;
13
+ /** Text content */
14
+ text: string;
14
15
  }
15
16
  /**
16
17
  * iTXt chunk (UTF-8 encoded international text)
17
18
  */
18
19
  interface ITXtChunk {
19
- type: 'iTXt';
20
- /** Chunk keyword */
21
- keyword: string;
22
- /** Compression flag (0=uncompressed, 1=compressed) */
23
- compressionFlag: number;
24
- /** Compression method (0=zlib/deflate) */
25
- compressionMethod: number;
26
- /** Language tag (BCP 47) */
27
- languageTag: string;
28
- /** Translated keyword */
29
- translatedKeyword: string;
30
- /** Text content */
31
- text: string;
20
+ type: 'iTXt';
21
+ /** Chunk keyword */
22
+ keyword: string;
23
+ /** Compression flag (0=uncompressed, 1=compressed) */
24
+ compressionFlag: number;
25
+ /** Compression method (0=zlib/deflate) */
26
+ compressionMethod: number;
27
+ /** Language tag (BCP 47) */
28
+ languageTag: string;
29
+ /** Translated keyword */
30
+ translatedKeyword: string;
31
+ /** Text content */
32
+ text: string;
32
33
  }
33
34
  /**
34
35
  * Source location of a metadata segment.
35
36
  * Used for round-tripping: reading and writing back to the correct location.
36
37
  */
37
38
  type MetadataSegmentSource = {
38
- type: 'exifUserComment';
39
+ type: 'exifUserComment';
39
40
  } | {
40
- type: 'exifImageDescription';
41
- prefix?: string;
41
+ type: 'exifImageDescription';
42
+ prefix?: string;
42
43
  } | {
43
- type: 'exifMake';
44
- prefix?: string;
44
+ type: 'exifMake';
45
+ prefix?: string;
45
46
  } | {
46
- type: 'jpegCom';
47
+ type: 'jpegCom';
47
48
  } | {
48
- type: 'xmpPacket';
49
+ type: 'xmpPacket';
49
50
  };
50
51
  /**
51
52
  * A single metadata segment with source tracking
52
53
  */
53
54
  interface MetadataSegment {
54
- /** Source location of this segment */
55
- source: MetadataSegmentSource;
56
- /** Raw data string */
57
- data: string;
55
+ /** Source location of this segment */
56
+ source: MetadataSegmentSource;
57
+ /** Raw data string */
58
+ data: string;
58
59
  }
59
60
  /**
60
61
  * Raw metadata for write-back (preserves original format)
61
62
  */
62
63
  type RawMetadata = {
63
- format: 'png';
64
- chunks: PngTextChunk[];
64
+ format: 'png';
65
+ chunks: PngTextChunk[];
65
66
  } | {
66
- format: 'jpeg';
67
- segments: MetadataSegment[];
67
+ format: 'jpeg';
68
+ segments: MetadataSegment[];
68
69
  } | {
69
- format: 'webp';
70
- segments: MetadataSegment[];
70
+ format: 'webp';
71
+ segments: MetadataSegment[];
71
72
  };
72
73
  /**
73
74
  * Known AI image generation software
@@ -77,46 +78,46 @@ type GenerationSoftware = 'novelai' | 'comfyui' | 'swarmui' | 'tensorart' | 'sta
77
78
  * Base metadata fields shared by all tools
78
79
  */
79
80
  interface BaseMetadata {
80
- /** Positive prompt */
81
- prompt: string;
82
- /** Negative prompt */
83
- negativePrompt: string;
84
- /** Model settings */
85
- model?: ModelSettings;
86
- /** Sampling settings */
87
- sampling?: SamplingSettings;
88
- /** Hires.fix settings (if applied) */
89
- hires?: HiresSettings;
90
- /** Upscale settings (if applied) */
91
- upscale?: UpscaleSettings;
92
- /** Image width */
93
- width: number;
94
- /** Image height */
95
- height: number;
81
+ /** Positive prompt */
82
+ prompt: string;
83
+ /** Negative prompt */
84
+ negativePrompt: string;
85
+ /** Model settings */
86
+ model?: ModelSettings;
87
+ /** Sampling settings */
88
+ sampling?: SamplingSettings;
89
+ /** Hires.fix settings (if applied) */
90
+ hires?: HiresSettings;
91
+ /** Upscale settings (if applied) */
92
+ upscale?: UpscaleSettings;
93
+ /** Image width */
94
+ width: number;
95
+ /** Image height */
96
+ height: number;
96
97
  }
97
98
  /**
98
99
  * NovelAI-specific metadata
99
100
  */
100
101
  interface NovelAIMetadata extends BaseMetadata {
101
- software: 'novelai';
102
- /** V4 character prompts (when using character placement) */
103
- characterPrompts?: CharacterPrompt[];
104
- /** Use character coordinates for placement */
105
- useCoords?: boolean;
106
- /** Use character order */
107
- useOrder?: boolean;
102
+ software: 'novelai';
103
+ /** V4 character prompts (when using character placement) */
104
+ characterPrompts?: CharacterPrompt[];
105
+ /** Use character coordinates for placement */
106
+ useCoords?: boolean;
107
+ /** Use character order */
108
+ useOrder?: boolean;
108
109
  }
109
110
  /**
110
111
  * Character prompt with position (NovelAI V4)
111
112
  */
112
113
  interface CharacterPrompt {
113
- /** Character-specific prompt */
114
- prompt: string;
115
- /** Character position (normalized 0-1) */
116
- center?: {
117
- x: number;
118
- y: number;
119
- };
114
+ /** Character-specific prompt */
115
+ prompt: string;
116
+ /** Character position (normalized 0-1) */
117
+ center?: {
118
+ x: number;
119
+ y: number;
120
+ };
120
121
  }
121
122
  /**
122
123
  * ComfyUI-format metadata (ComfyUI, TensorArt, Stability Matrix)
@@ -138,17 +139,16 @@ type ComfyNodeInputValue = string | number | boolean | ComfyNodeReference | Comf
138
139
  * ComfyUI node structure
139
140
  */
140
141
  interface ComfyNode {
141
- /** Node class type (e.g., "CheckpointLoaderSimple", "KSampler") */
142
- class_type: string;
143
- /** Node inputs */
144
- inputs: Record<string, ComfyNodeInputValue>;
145
- /** Node metadata (ComfyUI only) */
146
- _meta?: {
147
- /** Node title for display */
148
- title?: string;
149
- };
150
- /** Change detection hash (rare, for caching) */
151
- is_changed?: string[] | null;
142
+ /** Node class type (e.g., "CheckpointLoaderSimple", "KSampler") */
143
+ class_type: string;
144
+ /** Node inputs */
145
+ inputs: Record<string, ComfyNodeInputValue>;
146
+ /** Node metadata (ComfyUI only) */
147
+ _meta?: {
148
+ /** Node title for display */title?: string;
149
+ };
150
+ /** Change detection hash (rare, for caching) */
151
+ is_changed?: string[] | null;
152
152
  }
153
153
  /**
154
154
  * ComfyUI node graph
@@ -162,14 +162,14 @@ type ComfyNodeGraph = Record<string, ComfyNode>;
162
162
  * These tools always have nodes in all formats.
163
163
  */
164
164
  interface BasicComfyUIMetadata extends BaseMetadata {
165
- software: 'comfyui' | 'tensorart' | 'stability-matrix';
166
- /**
167
- * ComfyUI node graph (required)
168
- *
169
- * Always present in all image formats (PNG, JPEG, WebP).
170
- * Structure: Record<nodeId, ComfyNode> where ComfyNode contains inputs and class_type.
171
- */
172
- nodes: ComfyNodeGraph;
165
+ software: 'comfyui' | 'tensorart' | 'stability-matrix';
166
+ /**
167
+ * ComfyUI node graph (required)
168
+ *
169
+ * Always present in all image formats (PNG, JPEG, WebP).
170
+ * Structure: Record<nodeId, ComfyNode> where ComfyNode contains inputs and class_type.
171
+ */
172
+ nodes: ComfyNodeGraph;
173
173
  }
174
174
  /**
175
175
  * SwarmUI-specific metadata
@@ -177,14 +177,14 @@ interface BasicComfyUIMetadata extends BaseMetadata {
177
177
  * SwarmUI uses ComfyUI workflow format but nodes are only present in PNG.
178
178
  */
179
179
  interface SwarmUIMetadata extends BaseMetadata {
180
- software: 'swarmui';
181
- /**
182
- * ComfyUI node graph (optional for SwarmUI)
183
- *
184
- * Only present in PNG format. JPEG/WebP contain SwarmUI parameters only.
185
- * Structure: Record<nodeId, ComfyNode> where ComfyNode contains inputs and class_type.
186
- */
187
- nodes?: ComfyNodeGraph;
180
+ software: 'swarmui';
181
+ /**
182
+ * ComfyUI node graph (optional for SwarmUI)
183
+ *
184
+ * Only present in PNG format. JPEG/WebP contain SwarmUI parameters only.
185
+ * Structure: Record<nodeId, ComfyNode> where ComfyNode contains inputs and class_type.
186
+ */
187
+ nodes?: ComfyNodeGraph;
188
188
  }
189
189
  /**
190
190
  * ComfyUI-format metadata (union of BasicComfyUI and SwarmUI)
@@ -202,7 +202,7 @@ type ComfyUIMetadata = BasicComfyUIMetadata | SwarmUIMetadata;
202
202
  * NovelAI's character prompts or ComfyUI's node graphs.
203
203
  */
204
204
  interface StandardMetadata extends BaseMetadata {
205
- software: 'sd-webui' | 'sd-next' | 'forge' | 'forge-classic' | 'forge-neo' | 'reforge' | 'easy-reforge' | 'invokeai' | 'civitai' | 'hf-space' | 'easydiffusion' | 'fooocus' | 'ruined-fooocus' | 'draw-things';
205
+ software: 'sd-webui' | 'sd-next' | 'forge' | 'forge-classic' | 'forge-neo' | 'reforge' | 'easy-reforge' | 'invokeai' | 'civitai' | 'hf-space' | 'easydiffusion' | 'fooocus' | 'ruined-fooocus' | 'draw-things';
206
206
  }
207
207
  /**
208
208
  * Unified generation metadata (discriminated union)
@@ -230,111 +230,150 @@ type GenerationMetadata = NovelAIMetadata | ComfyUIMetadata | StandardMetadata;
230
230
  * prompts and extras for the settings line.
231
231
  */
232
232
  type EmbedMetadata = BaseMetadata & Pick<NovelAIMetadata, 'characterPrompts'> & {
233
- /** Additional key-value pairs for the settings line */
234
- extras?: Record<string, string | number>;
233
+ /** Additional key-value pairs for the settings line */extras?: Record<string, string | number>;
235
234
  };
236
235
  /**
237
236
  * Model settings
238
237
  */
239
238
  interface ModelSettings {
240
- /** Model name */
241
- name?: string;
242
- /** Model hash */
243
- hash?: string;
244
- /** VAE name */
245
- vae?: string;
239
+ /** Model name */
240
+ name?: string;
241
+ /** Model hash */
242
+ hash?: string;
243
+ /** VAE name */
244
+ vae?: string;
246
245
  }
247
246
  /**
248
247
  * Sampling settings
249
248
  */
250
249
  interface SamplingSettings {
251
- /** Sampler name */
252
- sampler?: string;
253
- /** Scheduler (sometimes included in sampler, sometimes separate) */
254
- scheduler?: string;
255
- /** Sampling steps */
256
- steps?: number;
257
- /** CFG scale */
258
- cfg?: number;
259
- /** Random seed */
260
- seed?: number;
261
- /** CLIP skip layers */
262
- clipSkip?: number;
263
- /** Denoising strength (ComfyUI only, typically 1.0 for txt2img) */
264
- denoise?: number;
250
+ /** Sampler name */
251
+ sampler?: string;
252
+ /** Scheduler (sometimes included in sampler, sometimes separate) */
253
+ scheduler?: string;
254
+ /** Sampling steps */
255
+ steps?: number;
256
+ /** CFG scale */
257
+ cfg?: number;
258
+ /** Random seed */
259
+ seed?: number;
260
+ /** CLIP skip layers */
261
+ clipSkip?: number;
262
+ /** Denoising strength (ComfyUI only, typically 1.0 for txt2img) */
263
+ denoise?: number;
265
264
  }
266
265
  /**
267
266
  * Hires.fix settings
268
267
  */
269
268
  interface HiresSettings {
270
- /** Upscale factor */
271
- scale?: number;
272
- /** Upscaler name */
273
- upscaler?: string;
274
- /** Hires steps */
275
- steps?: number;
276
- /** Hires denoising strength */
277
- denoise?: number;
269
+ /** Upscale factor */
270
+ scale?: number;
271
+ /** Upscaler name */
272
+ upscaler?: string;
273
+ /** Hires steps */
274
+ steps?: number;
275
+ /** Hires denoising strength */
276
+ denoise?: number;
278
277
  }
279
278
  /**
280
279
  * Upscale settings (post-generation)
281
280
  */
282
281
  interface UpscaleSettings {
283
- /** Upscaler name */
284
- upscaler?: string;
285
- /** Scale factor */
286
- scale?: number;
282
+ /** Upscaler name */
283
+ upscaler?: string;
284
+ /** Scale factor */
285
+ scale?: number;
287
286
  }
288
287
  /**
289
- * Parse result with 4-status design
288
+ * Vendor that signed an image's C2PA Content Credentials.
289
+ *
290
+ * Coarse by design: a C2PA manifest identifies the producing vendor but not the
291
+ * specific model (e.g. Imagen and Gemini "Nano Banana" both map to `google`).
292
+ */
293
+ type C2paVendor = 'openai' | 'google' | 'unknown';
294
+ /**
295
+ * Content Credentials (C2PA) read from an image's signed manifest.
296
+ *
297
+ * Unlike {@link GenerationMetadata}, this carries no prompt/sampling/size data:
298
+ * commercial AI tools (ChatGPT, Gemini, ...) embed provenance, not generation
299
+ * parameters. The manifest is read as declared — the cryptographic signature is
300
+ * NOT verified, so presence is not proof of authenticity (the strings are
301
+ * forgeable). Likewise,
302
+ * absence is not proof of human origin: Content Credentials are routinely
303
+ * stripped by screenshots, re-encoding, and social-media re-uploads.
304
+ */
305
+ interface C2paMetadata {
306
+ /**
307
+ * Coarse vendor attribution from the manifest's claim generator / signer.
308
+ * Declared, not cryptographically verified — never treat as proof of origin.
309
+ */
310
+ vendor: C2paVendor;
311
+ /**
312
+ * `true` when the manifest declares a trained-algorithmic (AI-generated) IPTC
313
+ * DigitalSourceType. Camera/scan source types are not flagged. This is the
314
+ * image's *declared*, unverified status: a `false`/absent result is not proof
315
+ * of human origin, and a `true` result is forgeable.
316
+ */
317
+ aiGenerated: boolean;
318
+ /** Raw IPTC DigitalSourceType URI, surfaced verbatim when present. */
319
+ digitalSourceType?: string;
320
+ /** C2PA `claim_generator_info.name`, when present. */
321
+ claimGenerator?: string;
322
+ }
323
+ /**
324
+ * Parse result with 5-status design
290
325
  *
291
- * - `success`: Parsing succeeded, metadata and raw data available
326
+ * - `success`: Generation metadata parsed; metadata and raw data available
327
+ * - `c2pa`: C2PA Content Credentials found (AI provenance, no generation params)
292
328
  * - `empty`: No metadata found in the file
293
329
  * - `unrecognized`: Metadata exists but format is not recognized
294
330
  * - `invalid`: File is corrupted or not a valid image
295
331
  */
296
332
  type ParseResult = {
297
- status: 'success';
298
- metadata: GenerationMetadata;
299
- raw: RawMetadata;
333
+ status: 'success';
334
+ metadata: GenerationMetadata;
335
+ raw: RawMetadata;
336
+ } | {
337
+ status: 'c2pa';
338
+ c2pa: C2paMetadata;
300
339
  } | {
301
- status: 'empty';
340
+ status: 'empty';
302
341
  } | {
303
- status: 'unrecognized';
304
- raw: RawMetadata;
342
+ status: 'unrecognized';
343
+ raw: RawMetadata;
305
344
  } | {
306
- status: 'invalid';
307
- message?: string;
345
+ status: 'invalid';
346
+ message?: string;
308
347
  };
309
348
  /**
310
349
  * Options for the read function
311
350
  */
312
351
  interface ReadOptions {
313
- /**
314
- * When true, dimensions are taken strictly from metadata only.
315
- * When false (default), missing dimensions are extracted from image headers.
316
- * @default false
317
- */
318
- strict?: boolean;
352
+ /**
353
+ * When true, dimensions are taken strictly from metadata only.
354
+ * When false (default), missing dimensions are extracted from image headers.
355
+ * @default false
356
+ */
357
+ strict?: boolean;
319
358
  }
320
359
  /**
321
360
  * Warning types for write operations
322
361
  */
323
362
  type WriteWarning = {
324
- type: 'metadataDropped';
325
- reason: 'unrecognizedCrossFormat';
363
+ type: 'metadataDropped';
364
+ reason: 'unrecognizedCrossFormat';
326
365
  };
327
366
  /**
328
367
  * Error types for write operations
329
368
  */
330
369
  type WriteError = {
331
- type: 'unsupportedFormat';
370
+ type: 'unsupportedFormat';
332
371
  } | {
333
- type: 'conversionFailed';
334
- message: string;
372
+ type: 'conversionFailed';
373
+ message: string;
335
374
  } | {
336
- type: 'writeFailed';
337
- message: string;
375
+ type: 'writeFailed';
376
+ message: string;
338
377
  };
339
378
  /**
340
379
  * Result of the write operation
@@ -342,22 +381,15 @@ type WriteError = {
342
381
  * Success case may include a warning when metadata was intentionally dropped.
343
382
  */
344
383
  type WriteResult = {
345
- ok: true;
346
- value: Uint8Array;
347
- warning?: WriteWarning;
384
+ ok: true;
385
+ value: Uint8Array;
386
+ warning?: WriteWarning;
348
387
  } | {
349
- ok: false;
350
- error: WriteError;
388
+ ok: false;
389
+ error: WriteError;
351
390
  };
352
-
353
- /**
354
- * Embed API for sd-metadata
355
- *
356
- * Write user-created or parsed metadata in A1111 format to PNG, JPEG,
357
- * or WebP images. Accepts both EmbedMetadata (custom metadata composed
358
- * by the user) and GenerationMetadata (parsed output from AI tools).
359
- */
360
-
391
+ //#endregion
392
+ //#region src/api/embed.d.ts
361
393
  /**
362
394
  * Embed metadata into an image
363
395
  *
@@ -402,14 +434,8 @@ type WriteResult = {
402
434
  * ```
403
435
  */
404
436
  declare function embed(input: Uint8Array | ArrayBuffer, metadata: EmbedMetadata | GenerationMetadata): WriteResult;
405
-
406
- /**
407
- * Read API for sd-metadata
408
- *
409
- * Handles reading and parsing metadata from images.
410
- * Automatically detects image format and extracts embedded generation metadata.
411
- */
412
-
437
+ //#endregion
438
+ //#region src/api/read.d.ts
413
439
  /**
414
440
  * Read and parse metadata from an image
415
441
  *
@@ -421,14 +447,8 @@ declare function embed(input: Uint8Array | ArrayBuffer, metadata: EmbedMetadata
421
447
  * @returns Parse result containing metadata and raw data
422
448
  */
423
449
  declare function read(input: Uint8Array | ArrayBuffer, options?: ReadOptions): ParseResult;
424
-
425
- /**
426
- * Unified metadata stringification
427
- *
428
- * Builds A1111-format plain text from metadata and provides the stringify()
429
- * public API for converting any metadata type to a human-readable string.
430
- */
431
-
450
+ //#endregion
451
+ //#region src/api/stringify.d.ts
432
452
  /**
433
453
  * Build A1111-format text from EmbedMetadata
434
454
  *
@@ -488,14 +508,8 @@ declare function formatRaw(raw: RawMetadata): string;
488
508
  * ```
489
509
  */
490
510
  declare function stringify(input: ParseResult | EmbedMetadata | GenerationMetadata): string;
491
-
492
- /**
493
- * Write API for sd-metadata
494
- *
495
- * Handles writing metadata to images with automatic format conversion.
496
- * Supports PNG, JPEG, and WebP formats.
497
- */
498
-
511
+ //#endregion
512
+ //#region src/api/write.d.ts
499
513
  /**
500
514
  * Write metadata to an image
501
515
  *
@@ -508,7 +522,8 @@ declare function stringify(input: ParseResult | EmbedMetadata | GenerationMetada
508
522
  * @returns New image data with embedded metadata (or warning if metadata was dropped)
509
523
  */
510
524
  declare function write(input: Uint8Array | ArrayBuffer, metadata: ParseResult): WriteResult;
511
-
525
+ //#endregion
526
+ //#region src/constants.d.ts
512
527
  /**
513
528
  * Human-readable display labels for each generation software identifier.
514
529
  *
@@ -524,5 +539,21 @@ declare function write(input: Uint8Array | ArrayBuffer, metadata: ParseResult):
524
539
  * ```
525
540
  */
526
541
  declare const softwareLabels: Readonly<Record<GenerationSoftware, string>>;
527
-
528
- export { type BaseMetadata, type CharacterPrompt, type ComfyNode, type ComfyNodeGraph, type ComfyNodeInputValue, type ComfyNodeReference, type EmbedMetadata, type GenerationMetadata, type GenerationSoftware, type HiresSettings, type ITXtChunk, type MetadataSegment, type MetadataSegmentSource, type ModelSettings, type ParseResult, type PngTextChunk, type RawMetadata, type ReadOptions, type SamplingSettings, type TExtChunk, type UpscaleSettings, type WriteResult, type WriteWarning, embed, buildEmbedText as formatAsWebUI, formatRaw, read, softwareLabels, stringify, write, embed as writeAsWebUI };
542
+ /**
543
+ * Human-readable display labels for each C2PA Content Credentials vendor.
544
+ *
545
+ * @example
546
+ * ```typescript
547
+ * import { c2paVendorLabels } from '@enslo/sd-metadata';
548
+ *
549
+ * const result = read(imageData);
550
+ * if (result.status === 'c2pa') {
551
+ * console.log(c2paVendorLabels[result.c2pa.vendor]);
552
+ * // => "OpenAI (ChatGPT)", "Google (Gemini)", ...
553
+ * }
554
+ * ```
555
+ */
556
+ declare const c2paVendorLabels: Readonly<Record<C2paVendor, string>>;
557
+ //#endregion
558
+ export { type BaseMetadata, type C2paMetadata, type C2paVendor, type CharacterPrompt, type ComfyNode, type ComfyNodeGraph, type ComfyNodeInputValue, type ComfyNodeReference, type EmbedMetadata, type GenerationMetadata, type GenerationSoftware, type HiresSettings, type ITXtChunk, type MetadataSegment, type MetadataSegmentSource, type ModelSettings, type ParseResult, type PngTextChunk, type RawMetadata, type ReadOptions, type SamplingSettings, type TExtChunk, type UpscaleSettings, type WriteResult, type WriteWarning, c2paVendorLabels, embed, embed as writeAsWebUI, buildEmbedText as formatAsWebUI, formatRaw, read, softwareLabels, stringify, write };
559
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/api/embed.ts","../src/api/read.ts","../src/api/stringify.ts","../src/api/write.ts","../src/constants.ts"],"mappings":"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"}