@character-foundry/character-foundry 0.4.3 → 0.5.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 (63) hide show
  1. package/dist/app-framework.cjs +12 -3
  2. package/dist/app-framework.cjs.map +1 -1
  3. package/dist/app-framework.d.cts +9 -1
  4. package/dist/app-framework.d.ts +9 -1
  5. package/dist/app-framework.js +12 -3
  6. package/dist/app-framework.js.map +1 -1
  7. package/dist/charx.cjs +85 -52
  8. package/dist/charx.cjs.map +1 -1
  9. package/dist/charx.d.cts +22 -22
  10. package/dist/charx.d.ts +22 -22
  11. package/dist/charx.js +85 -52
  12. package/dist/charx.js.map +1 -1
  13. package/dist/exporter.cjs +104 -54
  14. package/dist/exporter.cjs.map +1 -1
  15. package/dist/exporter.d.cts +19 -19
  16. package/dist/exporter.d.ts +19 -19
  17. package/dist/exporter.js +104 -54
  18. package/dist/exporter.js.map +1 -1
  19. package/dist/federation.cjs +104 -36
  20. package/dist/federation.cjs.map +1 -1
  21. package/dist/federation.d.cts +54 -19
  22. package/dist/federation.d.ts +54 -19
  23. package/dist/federation.js +104 -36
  24. package/dist/federation.js.map +1 -1
  25. package/dist/index.cjs +104 -54
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +29 -29
  28. package/dist/index.d.ts +29 -29
  29. package/dist/index.js +104 -54
  30. package/dist/index.js.map +1 -1
  31. package/dist/loader.cjs +171 -31
  32. package/dist/loader.cjs.map +1 -1
  33. package/dist/loader.d.cts +37 -23
  34. package/dist/loader.d.ts +37 -23
  35. package/dist/loader.js +171 -31
  36. package/dist/loader.js.map +1 -1
  37. package/dist/lorebook.d.cts +23 -23
  38. package/dist/lorebook.d.ts +23 -23
  39. package/dist/normalizer.cjs +72 -18
  40. package/dist/normalizer.cjs.map +1 -1
  41. package/dist/normalizer.d.cts +37 -37
  42. package/dist/normalizer.d.ts +37 -37
  43. package/dist/normalizer.js +72 -18
  44. package/dist/normalizer.js.map +1 -1
  45. package/dist/png.cjs +72 -18
  46. package/dist/png.cjs.map +1 -1
  47. package/dist/png.d.cts +25 -25
  48. package/dist/png.d.ts +25 -25
  49. package/dist/png.js +72 -18
  50. package/dist/png.js.map +1 -1
  51. package/dist/schemas.cjs +80 -23
  52. package/dist/schemas.cjs.map +1 -1
  53. package/dist/schemas.d.cts +85 -67
  54. package/dist/schemas.d.ts +85 -67
  55. package/dist/schemas.js +80 -23
  56. package/dist/schemas.js.map +1 -1
  57. package/dist/voxta.cjs +91 -20
  58. package/dist/voxta.cjs.map +1 -1
  59. package/dist/voxta.d.cts +23 -23
  60. package/dist/voxta.d.ts +23 -23
  61. package/dist/voxta.js +91 -20
  62. package/dist/voxta.js.map +1 -1
  63. package/package.json +24 -24
package/dist/png.d.cts CHANGED
@@ -31,8 +31,8 @@ declare const CCv3DataSchema: z.ZodObject<{
31
31
  character_book: z.ZodNullable<z.ZodOptional<z.ZodObject<{
32
32
  name: z.ZodOptional<z.ZodString>;
33
33
  description: z.ZodOptional<z.ZodString>;
34
- scan_depth: z.ZodOptional<z.ZodNumber>;
35
- token_budget: z.ZodOptional<z.ZodNumber>;
34
+ scan_depth: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
35
+ token_budget: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
36
36
  recursive_scanning: z.ZodOptional<z.ZodBoolean>;
37
37
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
38
38
  entries: z.ZodArray<z.ZodObject<{
@@ -268,14 +268,14 @@ declare const CCv3DataSchema: z.ZodObject<{
268
268
  }, z.ZodTypeAny, "passthrough">[];
269
269
  name?: string | undefined;
270
270
  description?: string | undefined;
271
- scan_depth?: number | undefined;
272
- token_budget?: number | undefined;
271
+ scan_depth?: unknown;
272
+ token_budget?: unknown;
273
273
  recursive_scanning?: boolean | undefined;
274
274
  extensions?: Record<string, unknown> | undefined;
275
275
  }>>>;
276
276
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
277
277
  assets: z.ZodOptional<z.ZodArray<z.ZodObject<{
278
- type: z.ZodEnum<[
278
+ type: z.ZodEffects<z.ZodEnum<[
279
279
  "icon",
280
280
  "background",
281
281
  "emotion",
@@ -284,7 +284,7 @@ declare const CCv3DataSchema: z.ZodObject<{
284
284
  "video",
285
285
  "custom",
286
286
  "x-risu-asset"
287
- ]>;
287
+ ]>, "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset", unknown>;
288
288
  uri: z.ZodString;
289
289
  name: z.ZodString;
290
290
  ext: z.ZodString;
@@ -295,15 +295,15 @@ declare const CCv3DataSchema: z.ZodObject<{
295
295
  ext: string;
296
296
  }, {
297
297
  name: string;
298
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
299
298
  uri: string;
300
299
  ext: string;
300
+ type?: unknown;
301
301
  }>, "many">>;
302
302
  nickname: z.ZodOptional<z.ZodString>;
303
303
  creator_notes_multilingual: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
304
304
  source: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
305
- creation_date: z.ZodOptional<z.ZodNumber>;
306
- modification_date: z.ZodOptional<z.ZodNumber>;
305
+ creation_date: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
306
+ modification_date: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
307
307
  }, "strip", z.ZodTypeAny, {
308
308
  name: string;
309
309
  description: string;
@@ -444,8 +444,8 @@ declare const CCv3DataSchema: z.ZodObject<{
444
444
  }, z.ZodTypeAny, "passthrough">[];
445
445
  name?: string | undefined;
446
446
  description?: string | undefined;
447
- scan_depth?: number | undefined;
448
- token_budget?: number | undefined;
447
+ scan_depth?: unknown;
448
+ token_budget?: unknown;
449
449
  recursive_scanning?: boolean | undefined;
450
450
  extensions?: Record<string, unknown> | undefined;
451
451
  } | null | undefined;
@@ -455,15 +455,15 @@ declare const CCv3DataSchema: z.ZodObject<{
455
455
  group_only_greetings?: string[] | undefined;
456
456
  assets?: {
457
457
  name: string;
458
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
459
458
  uri: string;
460
459
  ext: string;
460
+ type?: unknown;
461
461
  }[] | undefined;
462
462
  nickname?: string | undefined;
463
463
  creator_notes_multilingual?: Record<string, string> | undefined;
464
464
  source?: string[] | undefined;
465
- creation_date?: number | undefined;
466
- modification_date?: number | undefined;
465
+ creation_date?: unknown;
466
+ modification_date?: unknown;
467
467
  }>;
468
468
  }, "strip", z.ZodTypeAny, {
469
469
  data: {
@@ -610,8 +610,8 @@ declare const CCv3DataSchema: z.ZodObject<{
610
610
  }, z.ZodTypeAny, "passthrough">[];
611
611
  name?: string | undefined;
612
612
  description?: string | undefined;
613
- scan_depth?: number | undefined;
614
- token_budget?: number | undefined;
613
+ scan_depth?: unknown;
614
+ token_budget?: unknown;
615
615
  recursive_scanning?: boolean | undefined;
616
616
  extensions?: Record<string, unknown> | undefined;
617
617
  } | null | undefined;
@@ -621,15 +621,15 @@ declare const CCv3DataSchema: z.ZodObject<{
621
621
  group_only_greetings?: string[] | undefined;
622
622
  assets?: {
623
623
  name: string;
624
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
625
624
  uri: string;
626
625
  ext: string;
626
+ type?: unknown;
627
627
  }[] | undefined;
628
628
  nickname?: string | undefined;
629
629
  creator_notes_multilingual?: Record<string, string> | undefined;
630
630
  source?: string[] | undefined;
631
- creation_date?: number | undefined;
632
- modification_date?: number | undefined;
631
+ creation_date?: unknown;
632
+ modification_date?: unknown;
633
633
  };
634
634
  spec: "chara_card_v3";
635
635
  spec_version: "3.0";
@@ -660,8 +660,8 @@ declare const CCv2DataSchema: z.ZodObject<{
660
660
  character_book: z.ZodNullable<z.ZodOptional<z.ZodObject<{
661
661
  name: z.ZodOptional<z.ZodString>;
662
662
  description: z.ZodOptional<z.ZodString>;
663
- scan_depth: z.ZodOptional<z.ZodNumber>;
664
- token_budget: z.ZodOptional<z.ZodNumber>;
663
+ scan_depth: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
664
+ token_budget: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
665
665
  recursive_scanning: z.ZodOptional<z.ZodBoolean>;
666
666
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
667
667
  entries: z.ZodArray<z.ZodObject<{
@@ -792,8 +792,8 @@ declare const CCv2DataSchema: z.ZodObject<{
792
792
  }, z.ZodTypeAny, "passthrough">[];
793
793
  name?: string | undefined;
794
794
  description?: string | undefined;
795
- scan_depth?: number | undefined;
796
- token_budget?: number | undefined;
795
+ scan_depth?: unknown;
796
+ token_budget?: unknown;
797
797
  recursive_scanning?: boolean | undefined;
798
798
  extensions?: Record<string, unknown> | undefined;
799
799
  }>>>;
@@ -887,8 +887,8 @@ declare const CCv2DataSchema: z.ZodObject<{
887
887
  }, z.ZodTypeAny, "passthrough">[];
888
888
  name?: string | undefined;
889
889
  description?: string | undefined;
890
- scan_depth?: number | undefined;
891
- token_budget?: number | undefined;
890
+ scan_depth?: unknown;
891
+ token_budget?: unknown;
892
892
  recursive_scanning?: boolean | undefined;
893
893
  extensions?: Record<string, unknown> | undefined;
894
894
  } | null | undefined;
package/dist/png.d.ts CHANGED
@@ -31,8 +31,8 @@ declare const CCv3DataSchema: z.ZodObject<{
31
31
  character_book: z.ZodNullable<z.ZodOptional<z.ZodObject<{
32
32
  name: z.ZodOptional<z.ZodString>;
33
33
  description: z.ZodOptional<z.ZodString>;
34
- scan_depth: z.ZodOptional<z.ZodNumber>;
35
- token_budget: z.ZodOptional<z.ZodNumber>;
34
+ scan_depth: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
35
+ token_budget: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
36
36
  recursive_scanning: z.ZodOptional<z.ZodBoolean>;
37
37
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
38
38
  entries: z.ZodArray<z.ZodObject<{
@@ -268,14 +268,14 @@ declare const CCv3DataSchema: z.ZodObject<{
268
268
  }, z.ZodTypeAny, "passthrough">[];
269
269
  name?: string | undefined;
270
270
  description?: string | undefined;
271
- scan_depth?: number | undefined;
272
- token_budget?: number | undefined;
271
+ scan_depth?: unknown;
272
+ token_budget?: unknown;
273
273
  recursive_scanning?: boolean | undefined;
274
274
  extensions?: Record<string, unknown> | undefined;
275
275
  }>>>;
276
276
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
277
277
  assets: z.ZodOptional<z.ZodArray<z.ZodObject<{
278
- type: z.ZodEnum<[
278
+ type: z.ZodEffects<z.ZodEnum<[
279
279
  "icon",
280
280
  "background",
281
281
  "emotion",
@@ -284,7 +284,7 @@ declare const CCv3DataSchema: z.ZodObject<{
284
284
  "video",
285
285
  "custom",
286
286
  "x-risu-asset"
287
- ]>;
287
+ ]>, "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset", unknown>;
288
288
  uri: z.ZodString;
289
289
  name: z.ZodString;
290
290
  ext: z.ZodString;
@@ -295,15 +295,15 @@ declare const CCv3DataSchema: z.ZodObject<{
295
295
  ext: string;
296
296
  }, {
297
297
  name: string;
298
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
299
298
  uri: string;
300
299
  ext: string;
300
+ type?: unknown;
301
301
  }>, "many">>;
302
302
  nickname: z.ZodOptional<z.ZodString>;
303
303
  creator_notes_multilingual: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
304
304
  source: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
305
- creation_date: z.ZodOptional<z.ZodNumber>;
306
- modification_date: z.ZodOptional<z.ZodNumber>;
305
+ creation_date: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
306
+ modification_date: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
307
307
  }, "strip", z.ZodTypeAny, {
308
308
  name: string;
309
309
  description: string;
@@ -444,8 +444,8 @@ declare const CCv3DataSchema: z.ZodObject<{
444
444
  }, z.ZodTypeAny, "passthrough">[];
445
445
  name?: string | undefined;
446
446
  description?: string | undefined;
447
- scan_depth?: number | undefined;
448
- token_budget?: number | undefined;
447
+ scan_depth?: unknown;
448
+ token_budget?: unknown;
449
449
  recursive_scanning?: boolean | undefined;
450
450
  extensions?: Record<string, unknown> | undefined;
451
451
  } | null | undefined;
@@ -455,15 +455,15 @@ declare const CCv3DataSchema: z.ZodObject<{
455
455
  group_only_greetings?: string[] | undefined;
456
456
  assets?: {
457
457
  name: string;
458
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
459
458
  uri: string;
460
459
  ext: string;
460
+ type?: unknown;
461
461
  }[] | undefined;
462
462
  nickname?: string | undefined;
463
463
  creator_notes_multilingual?: Record<string, string> | undefined;
464
464
  source?: string[] | undefined;
465
- creation_date?: number | undefined;
466
- modification_date?: number | undefined;
465
+ creation_date?: unknown;
466
+ modification_date?: unknown;
467
467
  }>;
468
468
  }, "strip", z.ZodTypeAny, {
469
469
  data: {
@@ -610,8 +610,8 @@ declare const CCv3DataSchema: z.ZodObject<{
610
610
  }, z.ZodTypeAny, "passthrough">[];
611
611
  name?: string | undefined;
612
612
  description?: string | undefined;
613
- scan_depth?: number | undefined;
614
- token_budget?: number | undefined;
613
+ scan_depth?: unknown;
614
+ token_budget?: unknown;
615
615
  recursive_scanning?: boolean | undefined;
616
616
  extensions?: Record<string, unknown> | undefined;
617
617
  } | null | undefined;
@@ -621,15 +621,15 @@ declare const CCv3DataSchema: z.ZodObject<{
621
621
  group_only_greetings?: string[] | undefined;
622
622
  assets?: {
623
623
  name: string;
624
- type: "custom" | "icon" | "background" | "emotion" | "user_icon" | "sound" | "video" | "x-risu-asset";
625
624
  uri: string;
626
625
  ext: string;
626
+ type?: unknown;
627
627
  }[] | undefined;
628
628
  nickname?: string | undefined;
629
629
  creator_notes_multilingual?: Record<string, string> | undefined;
630
630
  source?: string[] | undefined;
631
- creation_date?: number | undefined;
632
- modification_date?: number | undefined;
631
+ creation_date?: unknown;
632
+ modification_date?: unknown;
633
633
  };
634
634
  spec: "chara_card_v3";
635
635
  spec_version: "3.0";
@@ -660,8 +660,8 @@ declare const CCv2DataSchema: z.ZodObject<{
660
660
  character_book: z.ZodNullable<z.ZodOptional<z.ZodObject<{
661
661
  name: z.ZodOptional<z.ZodString>;
662
662
  description: z.ZodOptional<z.ZodString>;
663
- scan_depth: z.ZodOptional<z.ZodNumber>;
664
- token_budget: z.ZodOptional<z.ZodNumber>;
663
+ scan_depth: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
664
+ token_budget: z.ZodEffects<z.ZodOptional<z.ZodNumber>, number | undefined, unknown>;
665
665
  recursive_scanning: z.ZodOptional<z.ZodBoolean>;
666
666
  extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
667
667
  entries: z.ZodArray<z.ZodObject<{
@@ -792,8 +792,8 @@ declare const CCv2DataSchema: z.ZodObject<{
792
792
  }, z.ZodTypeAny, "passthrough">[];
793
793
  name?: string | undefined;
794
794
  description?: string | undefined;
795
- scan_depth?: number | undefined;
796
- token_budget?: number | undefined;
795
+ scan_depth?: unknown;
796
+ token_budget?: unknown;
797
797
  recursive_scanning?: boolean | undefined;
798
798
  extensions?: Record<string, unknown> | undefined;
799
799
  }>>>;
@@ -887,8 +887,8 @@ declare const CCv2DataSchema: z.ZodObject<{
887
887
  }, z.ZodTypeAny, "passthrough">[];
888
888
  name?: string | undefined;
889
889
  description?: string | undefined;
890
- scan_depth?: number | undefined;
891
- token_budget?: number | undefined;
890
+ scan_depth?: unknown;
891
+ token_budget?: unknown;
892
892
  recursive_scanning?: boolean | undefined;
893
893
  extensions?: Record<string, unknown> | undefined;
894
894
  } | null | undefined;
package/dist/png.js CHANGED
@@ -135,6 +135,58 @@ import { z } from "zod";
135
135
  import { z as z2 } from "zod";
136
136
  import { z as z3 } from "zod";
137
137
  import "zod";
138
+ function preprocessTimestamp(val) {
139
+ if (val === null || val === void 0) return void 0;
140
+ let num;
141
+ if (typeof val === "number") {
142
+ num = val;
143
+ } else if (typeof val === "string") {
144
+ const trimmed = val.trim();
145
+ if (!trimmed) return void 0;
146
+ const parsed = Number(trimmed);
147
+ if (!isNaN(parsed)) {
148
+ num = parsed;
149
+ } else {
150
+ const date = new Date(trimmed);
151
+ if (isNaN(date.getTime())) return void 0;
152
+ num = Math.floor(date.getTime() / 1e3);
153
+ }
154
+ } else {
155
+ return void 0;
156
+ }
157
+ if (num > 1e10) {
158
+ num = Math.floor(num / 1e3);
159
+ }
160
+ if (num < 0) return void 0;
161
+ return num;
162
+ }
163
+ function preprocessNumeric(val) {
164
+ if (val === null || val === void 0) return void 0;
165
+ if (typeof val === "number") {
166
+ return isNaN(val) ? void 0 : val;
167
+ }
168
+ if (typeof val === "string") {
169
+ const trimmed = val.trim();
170
+ if (!trimmed) return void 0;
171
+ const parsed = Number(trimmed);
172
+ return isNaN(parsed) ? void 0 : parsed;
173
+ }
174
+ return void 0;
175
+ }
176
+ var KNOWN_ASSET_TYPES = /* @__PURE__ */ new Set([
177
+ "icon",
178
+ "background",
179
+ "emotion",
180
+ "user_icon",
181
+ "sound",
182
+ "video",
183
+ "custom",
184
+ "x-risu-asset"
185
+ ]);
186
+ function preprocessAssetType(val) {
187
+ if (typeof val !== "string") return "custom";
188
+ return KNOWN_ASSET_TYPES.has(val) ? val : "custom";
189
+ }
138
190
  var ISO8601Schema = z.string().datetime();
139
191
  var UUIDSchema = z.string().uuid();
140
192
  var SpecSchema = z.enum(["v2", "v3"]);
@@ -157,16 +209,19 @@ var SourceFormatSchema = z.enum([
157
209
  // VoxPkg format
158
210
  ]);
159
211
  var OriginalShapeSchema = z.enum(["wrapped", "unwrapped", "legacy"]);
160
- var AssetTypeSchema = z.enum([
161
- "icon",
162
- "background",
163
- "emotion",
164
- "user_icon",
165
- "sound",
166
- "video",
167
- "custom",
168
- "x-risu-asset"
169
- ]);
212
+ var AssetTypeSchema = z.preprocess(
213
+ preprocessAssetType,
214
+ z.enum([
215
+ "icon",
216
+ "background",
217
+ "emotion",
218
+ "user_icon",
219
+ "sound",
220
+ "video",
221
+ "custom",
222
+ "x-risu-asset"
223
+ ])
224
+ );
170
225
  var AssetDescriptorSchema = z.object({
171
226
  type: AssetTypeSchema,
172
227
  uri: z.string(),
@@ -200,8 +255,8 @@ var CCv2LorebookEntrySchema = z2.object({
200
255
  var CCv2CharacterBookSchema = z2.object({
201
256
  name: z2.string().optional(),
202
257
  description: z2.string().optional(),
203
- scan_depth: z2.number().int().nonnegative().optional(),
204
- token_budget: z2.number().int().nonnegative().optional(),
258
+ scan_depth: z2.preprocess(preprocessNumeric, z2.number().int().nonnegative().optional()),
259
+ token_budget: z2.preprocess(preprocessNumeric, z2.number().int().nonnegative().optional()),
205
260
  recursive_scanning: z2.boolean().optional(),
206
261
  extensions: z2.record(z2.unknown()).optional(),
207
262
  entries: z2.array(CCv2LorebookEntrySchema)
@@ -264,8 +319,8 @@ var CCv3LorebookEntrySchema = z3.object({
264
319
  var CCv3CharacterBookSchema = z3.object({
265
320
  name: z3.string().optional(),
266
321
  description: z3.string().optional(),
267
- scan_depth: z3.number().int().nonnegative().optional(),
268
- token_budget: z3.number().int().nonnegative().optional(),
322
+ scan_depth: z3.preprocess(preprocessNumeric, z3.number().int().nonnegative().optional()),
323
+ token_budget: z3.preprocess(preprocessNumeric, z3.number().int().nonnegative().optional()),
269
324
  recursive_scanning: z3.boolean().optional(),
270
325
  extensions: z3.record(z3.unknown()).optional(),
271
326
  entries: z3.array(CCv3LorebookEntrySchema)
@@ -297,10 +352,9 @@ var CCv3DataInnerSchema = z3.object({
297
352
  nickname: z3.string().optional(),
298
353
  creator_notes_multilingual: z3.record(z3.string()).optional(),
299
354
  source: z3.array(z3.string()).optional(),
300
- creation_date: z3.number().int().nonnegative().optional(),
301
- // Unix timestamp in seconds
302
- modification_date: z3.number().int().nonnegative().optional()
303
- // Unix timestamp in seconds
355
+ // Unix timestamps - preprocess to handle ISO strings, numeric strings, milliseconds
356
+ creation_date: z3.preprocess(preprocessTimestamp, z3.number().int().nonnegative().optional()),
357
+ modification_date: z3.preprocess(preprocessTimestamp, z3.number().int().nonnegative().optional())
304
358
  });
305
359
  var CCv3DataSchema = z3.object({
306
360
  spec: z3.literal("chara_card_v3"),