@typecaast/schema 0.1.0 → 0.2.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.cjs CHANGED
@@ -8,6 +8,7 @@ var sizeSchema = zod.z.object({
8
8
  height: zod.z.number().int().positive()
9
9
  });
10
10
  var fitModeSchema = zod.z.enum(["reflow", "scale", "fixed"]);
11
+ var composerModeSchema = zod.z.enum(["auto", "always", "never"]);
11
12
  var themeModeSchema = zod.z.enum(["light", "dark", "auto"]);
12
13
  var assetModeSchema = zod.z.enum(["inline", "url"]);
13
14
  var skinRefSchema = zod.z.object({
@@ -25,7 +26,15 @@ var metaSchema = zod.z.object({
25
26
  seed: zod.z.number().int().default(42),
26
27
  /** Canvas background: `"transparent"` or any CSS color. */
27
28
  background: zod.z.string().default("transparent"),
28
- assets: assetModeSchema.default("inline")
29
+ assets: assetModeSchema.default("inline"),
30
+ /** Reply-box visibility (see `composerModeSchema`). */
31
+ composer: composerModeSchema.default("auto"),
32
+ /**
33
+ * Auto-replay when the timeline reaches the end. Honored by the builder
34
+ * preview and by `<Typecaast>` when the consumer doesn't pass an explicit
35
+ * `loop` prop.
36
+ */
37
+ loop: zod.z.boolean().default(false)
29
38
  });
30
39
  var participantKindSchema = zod.z.enum(["person", "app"]);
31
40
  var participantSchema = zod.z.object({
@@ -46,10 +55,6 @@ var pacingSchema = zod.z.object({
46
55
  readingWpm: zod.z.number().positive().default(240),
47
56
  /** Chars/sec for composer typing + sender typing duration. */
48
57
  typingCps: zod.z.number().positive().default(14),
49
- /** Lag between a message and a reaction landing. */
50
- reactionDelayMs: zod.z.number().nonnegative().default(700),
51
- /** Baseline beat between messages. */
52
- interMessageGapMs: zod.z.number().nonnegative().default(900),
53
58
  /** ±fraction of seeded jitter so pacing doesn't feel robotic (0–1). */
54
59
  humanize: zod.z.number().min(0).max(1).default(0.15),
55
60
  /** Delay before the first event. */
@@ -176,12 +181,8 @@ function toContentNodes(body) {
176
181
  var stepBaseShape = {
177
182
  /** Optional id so reactions/edits/deletes can target this step's message. */
178
183
  id: zod.z.string().optional(),
179
- /** Override the computed gap before this step (ms, relative to the prior). */
180
- delay: zod.z.number().optional(),
181
184
  /** Reveal with no animation and no computed delay. */
182
- instant: zod.z.boolean().optional(),
183
- /** Extra pause held after this step completes (ms). */
184
- holdAfter: zod.z.number().nonnegative().optional()
185
+ instant: zod.z.boolean().optional()
185
186
  };
186
187
  var imageSugarSchema = zod.z.object({
187
188
  src: zod.z.string(),
@@ -207,9 +208,14 @@ var messageStepSchema = zod.z.object({
207
208
  });
208
209
  var reactionStepSchema = zod.z.object({
209
210
  type: zod.z.literal("reaction"),
210
- target: zod.z.string(),
211
+ /** Message id to react to. Defaults to `$prev` (the most-recent message). */
212
+ target: zod.z.string().optional(),
211
213
  emoji: zod.z.string(),
214
+ /** Emoji shortcode without colons, e.g. `"eyes"` — shown in skin tooltips. */
215
+ shortcode: zod.z.string().optional(),
212
216
  from: zod.z.string().optional(),
217
+ /** Gap from when the target appears, before the reaction lands (ms). */
218
+ delay: zod.z.number().nonnegative().optional(),
213
219
  ...stepBaseShape
214
220
  });
215
221
  var typingStepSchema = zod.z.object({
@@ -233,13 +239,15 @@ var sendStepSchema = zod.z.object({
233
239
  });
234
240
  var editStepSchema = zod.z.object({
235
241
  type: zod.z.literal("edit"),
236
- target: zod.z.string(),
242
+ /** Message id to edit. Defaults to `$prev` (the most-recent message). */
243
+ target: zod.z.string().optional(),
237
244
  ...bodyShape,
238
245
  ...stepBaseShape
239
246
  });
240
247
  var deleteStepSchema = zod.z.object({
241
248
  type: zod.z.literal("delete"),
242
- target: zod.z.string(),
249
+ /** Message id to delete. Defaults to `$prev` (the most-recent message). */
250
+ target: zod.z.string().optional(),
243
251
  ...stepBaseShape
244
252
  });
245
253
  var readReceiptStepSchema = zod.z.object({
@@ -253,12 +261,25 @@ var systemStepSchema = zod.z.object({
253
261
  from: zod.z.string().optional(),
254
262
  /** Named card variant the skin renders, e.g. `"pr-opened"`. */
255
263
  card: zod.z.string().optional(),
256
- actions: zod.z.array(zod.z.object({ label: zod.z.string(), href: zod.z.string().optional() })).optional(),
264
+ /**
265
+ * Buttons rendered alongside the system message. When `href` is set the
266
+ * skin should render the button as a link that opens in a new tab; when
267
+ * absent it should be visibly inert (e.g. `cursor: not-allowed`). `variant`
268
+ * controls visual emphasis; if omitted the first action defaults to
269
+ * `"primary"` and the rest to `"secondary"`.
270
+ */
271
+ actions: zod.z.array(
272
+ zod.z.object({
273
+ label: zod.z.string(),
274
+ href: zod.z.string().optional(),
275
+ variant: zod.z.enum(["primary", "secondary"]).optional()
276
+ })
277
+ ).optional(),
257
278
  ...bodyShape,
258
279
  ...stepBaseShape
259
280
  });
260
- var beatStepSchema = zod.z.object({
261
- type: zod.z.literal("beat"),
281
+ var delayStepSchema = zod.z.object({
282
+ type: zod.z.literal("delay"),
262
283
  duration: zod.z.number().nonnegative(),
263
284
  ...stepBaseShape
264
285
  });
@@ -272,7 +293,7 @@ var timelineStepSchema = zod.z.discriminatedUnion("type", [
272
293
  deleteStepSchema,
273
294
  readReceiptStepSchema,
274
295
  systemStepSchema,
275
- beatStepSchema
296
+ delayStepSchema
276
297
  ]);
277
298
  var timelineSchema = zod.z.array(timelineStepSchema);
278
299
  var STEP_TYPES = [
@@ -285,7 +306,7 @@ var STEP_TYPES = [
285
306
  "delete",
286
307
  "readReceipt",
287
308
  "system",
288
- "beat"
309
+ "delay"
289
310
  ];
290
311
  var CONFIG_VERSION = 1;
291
312
  var configSchema = zod.z.object({
@@ -400,14 +421,14 @@ function validateConfig(raw) {
400
421
  }
401
422
  if (step.type === "reaction" || step.type === "edit" || step.type === "delete") {
402
423
  const target = step.target;
403
- if (target === "$prev") {
424
+ if (!target || target === "$prev") {
404
425
  if (priorMessages === 0) {
405
426
  diagnostics.push({
406
427
  code: "W_NO_PREV",
407
428
  severity: "warning",
408
- message: '"$prev" target has no preceding message.',
429
+ message: "Default target has no preceding message.",
409
430
  location: `${loc}.target`,
410
- hint: "Place this after a message, or target a message id."
431
+ hint: "Place this after a message, or set a target message id."
411
432
  });
412
433
  }
413
434
  } else if (!messageIds.has(target)) {
@@ -428,13 +449,14 @@ function validateConfig(raw) {
428
449
  exports.CONFIG_VERSION = CONFIG_VERSION;
429
450
  exports.STEP_TYPES = STEP_TYPES;
430
451
  exports.assetModeSchema = assetModeSchema;
431
- exports.beatStepSchema = beatStepSchema;
432
452
  exports.buildContentNodeSchema = buildContentNodeSchema;
453
+ exports.composerModeSchema = composerModeSchema;
433
454
  exports.composerTypeStepSchema = composerTypeStepSchema;
434
455
  exports.configJsonSchema = configJsonSchema;
435
456
  exports.configSchema = configSchema;
436
457
  exports.contentNodeSchema = contentNodeSchema;
437
458
  exports.contentSchema = contentSchema;
459
+ exports.delayStepSchema = delayStepSchema;
438
460
  exports.deleteStepSchema = deleteStepSchema;
439
461
  exports.editStepSchema = editStepSchema;
440
462
  exports.fitModeSchema = fitModeSchema;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/meta.ts","../src/participants.ts","../src/pacing.ts","../src/content-nodes.ts","../src/content-registry.ts","../src/content-sugar.ts","../src/timeline.ts","../src/config.ts","../src/validate.ts"],"names":["z"],"mappings":";;;;;AAGO,IAAM,UAAA,GAAaA,MAAE,MAAA,CAAO;AAAA,EACjC,OAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACjC,QAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA;AAC3B,CAAC;AASM,IAAM,gBAAgBA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC;AAQzD,IAAM,kBAAkBA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAC;AAQxD,IAAM,kBAAkBA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,KAAK,CAAC;AAIhD,IAAM,aAAA,GAAgBA,MAAE,MAAA,CAAO;AAAA,EACpC,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,OAAA,EAASA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC7C,CAAC;AAIM,IAAM,UAAA,GAAaA,MAAE,MAAA,CAAO;AAAA;AAAA,EAEjC,MAAA,EAAQ,UAAA;AAAA,EACR,GAAA,EAAKA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC3C,GAAA,EAAK,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACnC,KAAA,EAAO,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AAAA,EACrC,IAAA,EAAM,aAAA;AAAA;AAAA,EAEN,MAAMA,KAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAEjC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,aAAa,CAAA;AAAA,EAC5C,MAAA,EAAQ,eAAA,CAAgB,OAAA,CAAQ,QAAQ;AAC1C,CAAC;ACnDM,IAAM,wBAAwBA,KAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,KAAK,CAAC;AAItD,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA;AAAA,EAExC,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA,EAEtB,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE5B,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE3B,MAAA,EAAQA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7B,IAAA,EAAM,qBAAA,CAAsB,OAAA,CAAQ,QAAQ;AAC9C,CAAC;AAIM,IAAM,kBAAA,GAAqBA,KAAAA,CAAE,KAAA,CAAM,iBAAiB;ACfpD,IAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA;AAAA,EAEnC,YAAYA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,EAE7C,WAAWA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAE3C,iBAAiBA,KAAAA,CAAE,MAAA,GAAS,WAAA,EAAY,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,EAErD,mBAAmBA,KAAAA,CAAE,MAAA,GAAS,WAAA,EAAY,CAAE,QAAQ,GAAG,CAAA;AAAA;AAAA,EAEvD,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA;AAAA,EAE/C,cAAcA,KAAAA,CAAE,MAAA,GAAS,WAAA,EAAY,CAAE,QAAQ,GAAG;AACpD,CAAC;ACZM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,KAAA,EAAOA,MAAE,MAAA;AACX,CAAC;AACM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,KAAA,EAAOA,MAAE,MAAA;AACX,CAAC;AACM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC;AACM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA;AAAA,EAEzB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEhB,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACjB,CAAC;AACM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA;AAAA,EAEvB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEhB,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC;AAEM,IAAM,gBAAA,GAAmBA,KAAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC3D,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAM,gBAAgB;AACjC,CAAC;AAIM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvB,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtC,QAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAChC,CAAC;AC1CD,IAAM,QAAA,uBAAe,GAAA,CAA0B;AAAA,EAC7C,CAAC,QAAQ,cAAc,CAAA;AAAA,EACvB,CAAC,SAAS,eAAe;AAC3B,CAAC,CAAA;AAGM,SAAS,uBAAA,CACd,MACA,MAAA,EACM;AACN,EAAA,QAAA,CAAS,GAAA,CAAI,MAAM,MAAM,CAAA;AAC3B;AAGO,SAAS,qBAAA,GAAkC;AAChD,EAAA,OAAO,CAAC,GAAG,QAAA,CAAS,IAAA,EAAM,CAAA;AAC5B;AAEO,SAAS,uBAAuB,IAAA,EAAuB;AAC5D,EAAA,OAAO,QAAA,CAAS,IAAI,IAAI,CAAA;AAC1B;AAGA,IAAM,2BAA2BA,KAAAA,CAC9B,WAAA,CAAY,EAAE,IAAA,EAAMA,KAAAA,CAAE,QAAO,EAAG,CAAA,CAChC,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,SAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,EAC1C,OAAA,EAAS;AACX,CAAC,CAAA;AAOI,SAAS,sBAAA,GAAiD;AAC/D,EAAA,OAAOA,MAAE,KAAA,CAAM;AAAA,IACb,GAAG,SAAS,MAAA,EAAO;AAAA,IACnB;AAAA,GACD,CAAA;AACH;AAGO,IAAM,oBAAoB,sBAAA;AAG1B,IAAM,aAAA,GAAgBA,KAAAA,CAAE,KAAA,CAAM,iBAAiB;;;ACnDtD,IAAM,YAAA,GAAe,uDAAA;AAOd,SAAS,YAAY,IAAA,EAA4B;AACtD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAC9C,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AACvC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,CAAC,GAAG,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,EAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,CAAC,GAAG,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,EAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,KAAA,CAAM,CAAC,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,SAAA,GAAY,KAAA,CAAM,QAAQ,SAAA,CAAU,MAAA;AAAA,EACtC;AACA,EAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AAWO,SAAS,kBAAkB,IAAA,EAAwB;AACxD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,WAAA,CAAY,IAAI,CAAA,EAAE;AAClD;AAGO,SAAS,mBAAmB,KAAA,EAA8B;AAC/D,EAAA,MAAM,OAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,MAAM,GAAA,EAAI;AACxD,EAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AACpD,EAAA,OAAO,IAAA;AACT;AAiBO,SAAS,eAAe,IAAA,EAAuC;AACpE,EAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAC9B,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,MAAA,QAAc,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,KAAA;AACT;ACpFA,IAAM,aAAA,GAAgB;AAAA;AAAA,EAEpB,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAExB,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE3B,OAAA,EAASA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA,EAE9B,WAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,WAAA,GAAc,QAAA;AACtC,CAAA;AAGO,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtC,QAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAChC,CAAC;AAGD,IAAM,SAAA,GAAY;AAAA,EAChB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQA,KAAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA,EAC3C,OAAA,EAAS,cAAc,QAAA;AACzB,CAAA;AAGA,IAAM,mBAAA,GAAsBA,MAAE,KAAA,CAAM;AAAA,EAClCA,MAAE,OAAA,EAAQ;AAAA,EACVA,KAAAA,CAAE,MAAA,CAAO,EAAE,aAAA,EAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY,CAAE,QAAA,EAAS,EAAG;AACjE,CAAC,CAAA;AAGM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,MAAA,EAAQ,oBAAoB,QAAA,EAAS;AAAA,EACrC,GAAG,SAAA;AAAA,EACH,GAAG;AACL,CAAC;AAGM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,GAAG;AACL,CAAC;AAGM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,eAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EACjD,GAAG;AACL,CAAC;AAGM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,EAC9B,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEf,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAClD,GAAG;AACL,CAAC;AAGM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,GAAG;AACL,CAAC;AAGM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,GAAG,SAAA;AAAA,EACH,GAAG;AACL,CAAC;AAGM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,GAAG;AACL,CAAC;AAGM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,EAC7B,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxB,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,GAAG;AACL,CAAC;AAGM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAASA,KAAAA,CACN,KAAA,CAAMA,MAAE,MAAA,CAAO,EAAE,OAAOA,KAAAA,CAAE,MAAA,IAAU,IAAA,EAAMA,KAAAA,CAAE,QAAO,CAAE,QAAA,IAAY,CAAC,EAClE,QAAA,EAAS;AAAA,EACZ,GAAG,SAAA;AAAA,EACH,GAAG;AACL,CAAC;AAGM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY;AAAA,EACjC,GAAG;AACL,CAAC;AAEM,IAAM,kBAAA,GAAqBA,KAAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC7D,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,cAAA,GAAiBA,KAAAA,CAAE,KAAA,CAAM,kBAAkB;AAGjD,IAAM,UAAA,GAAa;AAAA,EACxB,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AC/IO,IAAM,cAAA,GAAiB;AAGvB,IAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA,EACnC,OAAA,EAASA,KAAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,EACjC,IAAA,EAAM,UAAA;AAAA,EACN,YAAA,EAAc,kBAAA;AAAA;AAAA,EAEd,MAAA,EAAQ,aAAa,OAAA,CAAQ,MAAM,aAAa,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACzD,QAAA,EAAU;AACZ,CAAC;AAaM,SAAS,gBAAA,GAA4C;AAC1D,EAAA,OAAOA,KAAAA,CAAE,aAAa,YAAA,EAAc;AAAA,IAClC,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;;;ACrBA,SAAS,WAAW,IAAA,EAA0C;AAC5D,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,GAAA,IAAO,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,SAAA,IAClC,GAAA,KAAQ,EAAA,EAAI,GAAA,IAAO,MAAA,CAAO,GAAG,CAAA;AAAA,SACjC,GAAA,IAAO,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,KAAA,CAAM,MAAe,GAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAS,KAAiC,GAAG,CAAA;AACnD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AASO,SAAS,eAAe,GAAA,EAA4B;AACzD,EAAA,MAAM,cAA4B,EAAC;AAEnC,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,aAAa,GAAA,EAAK;AACtD,IAAA,MAAM,UAAW,GAAA,CAA6B,OAAA;AAC9C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,GAAU,cAAA,EAAgB;AAC3D,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,OAAA,EAAS,CAAA,eAAA,EAAkB,OAAO,CAAA,0CAAA,EAA6C,cAAc,CAAA,EAAA,CAAA;AAAA,UAC7F,QAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAM;AAAA;AACR,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,CAAU,GAAG,CAAA;AACzC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,OAAA;AAAA,QACV,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,QAAA,EAAU,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,IAAK;AAAA,OACrC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA;AAGtB,EAAA,MAAM,MAAM,MAAA,CAAO,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,GAAA,CAAI,GAAA,CAAI,OAAO,CAAC,EAAA,EAAI,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG;AACvE,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,mBAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,6BAA6B,GAAG,CAAA,EAAA,CAAA;AAAA,MACzC,QAAA,EAAU,cAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAU,MAAA,CAAO,YAAA,CAAa,KAAK,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACxD,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACnC,IAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA,CAAA,CAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAC/B,IAAA,IAAI,SAAS,MAAA,IAAa,CAAC,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA,EAAM,mBAAA;AAAA,QACN,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,wCAAwC,IAAI,CAAA,EAAA,CAAA;AAAA,QACrD,QAAA,EAAU,GAAG,GAAG,CAAA,KAAA,CAAA;AAAA,QAChB,IAAA,EAAM,8BAA8B,IAAI,CAAA,uBAAA;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC3B,MAAA,IAAI,OAAO,MAAA,IAAa,CAAC,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG;AACtC,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAM,mBAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,OAAA,EAAS,gDAAgD,EAAE,CAAA,EAAA,CAAA;AAAA,UAC3D,QAAA,EAAU,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,UAChB,IAAA,EAAM,8BAA8B,EAAE,CAAA,uBAAA;AAAA,SACvC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CACG,IAAA,CAAK,SAAS,cAAA,IAAkB,IAAA,CAAK,SAAS,MAAA,KAC/C,CAAC,OAAA,IACD,CAAC,YAAA,EACD;AACA,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA,EAAM,WAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS,4DAAA;AAAA,QACT,QAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CACG,IAAA,CAAK,SAAS,SAAA,IAAa,IAAA,CAAK,SAAS,QAAA,KAC1C,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,EACnB;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IACxB;AAEA,IAAA,IACE,IAAA,CAAK,SAAS,UAAA,IACd,IAAA,CAAK,SAAS,MAAA,IACd,IAAA,CAAK,SAAS,QAAA,EACd;AACA,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,IAAA,EAAM,WAAA;AAAA,YACN,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,0CAAA;AAAA,YACT,QAAA,EAAU,GAAG,GAAG,CAAA,OAAA,CAAA;AAAA,YAChB,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,EAAG;AAClC,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAS,WAAW,MAAM,CAAA,kCAAA,CAAA;AAAA,UAC1B,QAAA,EAAU,GAAG,GAAG,CAAA,OAAA,CAAA;AAAA,UAChB,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,SAAS,QAAA,EAAU,aAAA,EAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,OAAO,WAAA;AACT","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\n/** A pixel dimension pair (authoring reference; the exact frame for video). */\nexport const sizeSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n});\nexport type Size = z.infer<typeof sizeSchema>;\n\n/**\n * How the rendered conversation fills its container.\n * - `reflow`: container queries + ResizeObserver; bubbles re-wrap on small screens.\n * - `scale`: CSS transform scale-to-fit, preserves exact layout.\n * - `fixed`: clip to canvas.\n */\nexport const fitModeSchema = z.enum([\"reflow\", \"scale\", \"fixed\"]);\nexport type FitMode = z.infer<typeof fitModeSchema>;\n\n/**\n * Color theme. `auto` inherits the host page's `prefers-color-scheme` (live\n * preview) and falls back to `light`; video export resolves `auto` to a\n * concrete mode and defaults to `light` when unspecified.\n */\nexport const themeModeSchema = z.enum([\"light\", \"dark\", \"auto\"]);\nexport type ThemeMode = z.infer<typeof themeModeSchema>;\n\n/**\n * Asset resolution strategy.\n * - `inline`: embed images as data URLs (self-contained config; default).\n * - `url`: reference hosted images (smaller config; user hosts their own).\n */\nexport const assetModeSchema = z.enum([\"inline\", \"url\"]);\nexport type AssetMode = z.infer<typeof assetModeSchema>;\n\n/** Reference to a skin plus its skin-specific options (validated by the skin). */\nexport const skinRefSchema = z.object({\n id: z.string().min(1),\n options: z.record(z.string(), z.unknown()).optional(),\n});\nexport type SkinRef = z.infer<typeof skinRefSchema>;\n\n/** Top-level rendering/authoring metadata. */\nexport const metaSchema = z.object({\n /** Authoring reference size; fixed frame for video. */\n canvas: sizeSchema,\n fps: z.number().int().positive().default(30),\n fit: fitModeSchema.default(\"reflow\"),\n theme: themeModeSchema.default(\"auto\"),\n skin: skinRefSchema,\n /** Seed for all deterministic jitter (no `Math.random`). */\n seed: z.number().int().default(42),\n /** Canvas background: `\"transparent\"` or any CSS color. */\n background: z.string().default(\"transparent\"),\n assets: assetModeSchema.default(\"inline\"),\n});\n\n/** `meta` as it appears after parsing (defaults applied). */\nexport type Meta = z.infer<typeof metaSchema>;\n/** `meta` as authored (fields with defaults are optional). */\nexport type MetaInput = z.input<typeof metaSchema>;\n","import { z } from \"zod\";\n\n/** Whether a participant is a human or an app/bot (changes how skins render it). */\nexport const participantKindSchema = z.enum([\"person\", \"app\"]);\nexport type ParticipantKind = z.infer<typeof participantKindSchema>;\n\n/** A speaker in the conversation. */\nexport const participantSchema = z.object({\n /** Stable id referenced by timeline steps (`from`, `target`, …). */\n id: z.string().min(1),\n name: z.string().min(1),\n /** Avatar asset (data URL or referenced URL per `meta.assets`). */\n avatar: z.string().optional(),\n /** Accent color (CSS color) some skins use for the author. */\n color: z.string().optional(),\n /** The viewer — rendered as the \"self\" side and the composer's author. */\n isSelf: z.boolean().optional(),\n kind: participantKindSchema.default(\"person\"),\n});\nexport type Participant = z.infer<typeof participantSchema>;\nexport type ParticipantInput = z.input<typeof participantSchema>;\n\nexport const participantsSchema = z.array(participantSchema);\n","import { z } from \"zod\";\n\n/**\n * Global auto-pacing defaults. Every value is overridable per step in the\n * timeline; the engine computes delays/durations from these and bakes in\n * seeded, deterministic jitter (`humanize`).\n */\nexport const pacingSchema = z.object({\n /** Gap before an incoming message ≈ reading time of the prior message. */\n readingWpm: z.number().positive().default(240),\n /** Chars/sec for composer typing + sender typing duration. */\n typingCps: z.number().positive().default(14),\n /** Lag between a message and a reaction landing. */\n reactionDelayMs: z.number().nonnegative().default(700),\n /** Baseline beat between messages. */\n interMessageGapMs: z.number().nonnegative().default(900),\n /** ±fraction of seeded jitter so pacing doesn't feel robotic (0–1). */\n humanize: z.number().min(0).max(1).default(0.15),\n /** Delay before the first event. */\n startDelayMs: z.number().nonnegative().default(400),\n});\nexport type Pacing = z.infer<typeof pacingSchema>;\nexport type PacingInput = z.input<typeof pacingSchema>;\n","import { z } from \"zod\";\n\n/**\n * Inline marks inside a text node. `text` runs carry plain content; the others\n * are the recognized marks (`code`, `link`, `mention`, `emoji`). The set is\n * intentionally small in v1 — new marks can be added without a schema-version\n * bump (unknown content node types are handled leniently; see the registry).\n */\nexport const inlineTextSchema = z.object({\n type: z.literal(\"text\"),\n value: z.string(),\n});\nexport const inlineCodeSchema = z.object({\n type: z.literal(\"code\"),\n value: z.string(),\n});\nexport const inlineLinkSchema = z.object({\n type: z.literal(\"link\"),\n href: z.string(),\n label: z.string().optional(),\n});\nexport const inlineMentionSchema = z.object({\n type: z.literal(\"mention\"),\n /** Display label as authored, e.g. `\"@PostHog\"`. */\n label: z.string(),\n /** Resolved participant id, filled when the mention binds to a participant. */\n id: z.string().optional(),\n});\nexport const inlineEmojiSchema = z.object({\n type: z.literal(\"emoji\"),\n /** The rendered glyph, e.g. `\"🦔\"`. */\n value: z.string(),\n /** Optional shortcode, e.g. `\"hedgehog\"`. */\n shortcode: z.string().optional(),\n});\n\nexport const inlineNodeSchema = z.discriminatedUnion(\"type\", [\n inlineTextSchema,\n inlineCodeSchema,\n inlineLinkSchema,\n inlineMentionSchema,\n inlineEmojiSchema,\n]);\nexport type InlineNode = z.infer<typeof inlineNodeSchema>;\n\n/** A block of inline content. */\nexport const textNodeSchema = z.object({\n type: z.literal(\"text\"),\n spans: z.array(inlineNodeSchema),\n});\nexport type TextNode = z.infer<typeof textNodeSchema>;\n\n/** An in-message image (same hosting model as avatars, per `meta.assets`). */\nexport const imageNodeSchema = z.object({\n type: z.literal(\"image\"),\n src: z.string(),\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\nexport type ImageNode = z.infer<typeof imageNodeSchema>;\n\n/**\n * A content node whose `type` the runtime doesn't recognize. It validates\n * leniently (only `type` is required) and is skipped by skins that don't handle\n * it — so future node types (`attachment`, `linkPreview`, …) slot in without\n * breaking older runtimes or bumping the schema version.\n */\nexport interface UnknownContentNode {\n type: string;\n [key: string]: unknown;\n}\n\n/** The body of a message: an ordered list of content nodes. */\nexport type ContentNode = TextNode | ImageNode | UnknownContentNode;\n","import { z } from \"zod\";\nimport {\n imageNodeSchema,\n textNodeSchema,\n type ContentNode,\n} from \"./content-nodes.js\";\n\n/**\n * The content-type registry. Each message body node has a `type` resolved\n * through here. v1 registers `text` and `image`; additional types can be\n * registered (with their own strict schema) without a schema-version bump.\n *\n * Nodes whose `type` is **not** registered validate leniently (only `type` is\n * required) and are skipped by skins that don't handle them. Nodes whose `type`\n * **is** registered must satisfy that type's schema — so a malformed `text`\n * node is an error rather than silently passing through the lenient path.\n */\nconst registry = new Map<string, z.ZodTypeAny>([\n [\"text\", textNodeSchema],\n [\"image\", imageNodeSchema],\n]);\n\n/** Register (or override) the strict schema for a content node type. */\nexport function registerContentNodeType(\n type: string,\n schema: z.ZodTypeAny,\n): void {\n registry.set(type, schema);\n}\n\n/** The content node types the runtime validates strictly. */\nexport function knownContentNodeTypes(): string[] {\n return [...registry.keys()];\n}\n\nexport function isKnownContentNodeType(type: string): boolean {\n return registry.has(type);\n}\n\n/** Accepts any object with a string `type` that isn't a registered type. */\nconst lenientUnknownNodeSchema = z\n .looseObject({ type: z.string() })\n .refine((node) => !registry.has(node.type), {\n message: \"malformed content node for a registered type\",\n });\n\n/**\n * Build a content-node schema from the current registry state. Call this after\n * registering a new type to pick it up; `contentNodeSchema` below is the\n * default built from the v1 registry (`text` + `image`).\n */\nexport function buildContentNodeSchema(): z.ZodType<ContentNode> {\n return z.union([\n ...registry.values(),\n lenientUnknownNodeSchema,\n ]) as unknown as z.ZodType<ContentNode>;\n}\n\n/** Default content-node schema (text + image + lenient unknown). */\nexport const contentNodeSchema = buildContentNodeSchema();\n\n/** A message body: an ordered array of content nodes. */\nexport const contentSchema = z.array(contentNodeSchema);\n","import type {\n ContentNode,\n ImageNode,\n InlineNode,\n TextNode,\n} from \"./content-nodes.js\";\n\n/**\n * Matches an inline mark: a backtick code span, an http(s) link, or an\n * `@mention`. Everything else becomes plain text runs.\n */\nconst INLINE_TOKEN = /`([^`]+)`|(https?:\\/\\/[^\\s]+)|(@[A-Za-z0-9_][\\w.-]*)/g;\n\n/**\n * Parse a plain authoring string into inline nodes, extracting inline `code`,\n * links, and `@mentions`. Emoji are left inside text runs in v1 (they render\n * fine and a dedicated emoji mark can be authored explicitly).\n */\nexport function parseInline(text: string): InlineNode[] {\n if (text.length === 0) return [];\n const spans: InlineNode[] = [];\n const re = new RegExp(INLINE_TOKEN.source, \"g\");\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n const matchText = match[0] ?? \"\";\n if (match.index > lastIndex) {\n spans.push({ type: \"text\", value: text.slice(lastIndex, match.index) });\n }\n if (match[1] !== undefined) {\n spans.push({ type: \"code\", value: match[1] });\n } else if (match[2] !== undefined) {\n spans.push({ type: \"link\", href: match[2] });\n } else if (match[3] !== undefined) {\n spans.push({ type: \"mention\", label: match[3] });\n }\n lastIndex = match.index + matchText.length;\n }\n if (lastIndex < text.length) {\n spans.push({ type: \"text\", value: text.slice(lastIndex) });\n }\n return spans;\n}\n\n/** Convenience shape for authoring an in-message image. */\nexport interface ImageSugar {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\n/** `text` string → a single text content node. */\nexport function textToContentNode(text: string): TextNode {\n return { type: \"text\", spans: parseInline(text) };\n}\n\n/** `image` sugar → an image content node (drops undefined optionals). */\nexport function imageToContentNode(image: ImageSugar): ImageNode {\n const node: ImageNode = { type: \"image\", src: image.src };\n if (image.alt !== undefined) node.alt = image.alt;\n if (image.width !== undefined) node.width = image.width;\n if (image.height !== undefined) node.height = image.height;\n return node;\n}\n\n/** The sugar fields a message may carry instead of explicit `content`. */\nexport interface MessageBodySugar {\n /** Authored text (parsed into inline marks). */\n text?: string;\n /** In-message images, rendered after the text. */\n images?: ImageSugar[];\n /** Explicit content nodes; when present, wins over `text`/`images`. */\n content?: ContentNode[];\n}\n\n/**\n * Resolve a message's body sugar to content nodes. Explicit `content` is\n * authoritative; otherwise the text node (if any) comes first, then images —\n * matching the \"here's the toast: [image]\" ordering in the spec example.\n */\nexport function toContentNodes(body: MessageBodySugar): ContentNode[] {\n if (body.content) return body.content;\n const nodes: ContentNode[] = [];\n if (body.text !== undefined && body.text.length > 0) {\n nodes.push(textToContentNode(body.text));\n }\n if (body.images) {\n for (const image of body.images) nodes.push(imageToContentNode(image));\n }\n return nodes;\n}\n","import { z } from \"zod\";\nimport { contentSchema } from \"./content-registry.js\";\n\n/**\n * Per-step overrides shared by every step. The engine computes timing from the\n * pacing model; these win over the computed values.\n */\nconst stepBaseShape = {\n /** Optional id so reactions/edits/deletes can target this step's message. */\n id: z.string().optional(),\n /** Override the computed gap before this step (ms, relative to the prior). */\n delay: z.number().optional(),\n /** Reveal with no animation and no computed delay. */\n instant: z.boolean().optional(),\n /** Extra pause held after this step completes (ms). */\n holdAfter: z.number().nonnegative().optional(),\n};\n\n/** Authoring sugar for an in-message image (compiled to an image node). */\nexport const imageSugarSchema = z.object({\n src: z.string(),\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\n\n/** Message-body sugar fields; `content` (explicit nodes) wins when present. */\nconst bodyShape = {\n text: z.string().optional(),\n images: z.array(imageSugarSchema).optional(),\n content: contentSchema.optional(),\n};\n\n/** Optional typing indicator preceding a message. */\nconst messageTypingSchema = z.union([\n z.boolean(),\n z.object({ showTypingFor: z.number().nonnegative().optional() }),\n]);\n\n/** An incoming message, optionally preceded by a typing indicator. */\nexport const messageStepSchema = z.object({\n type: z.literal(\"message\"),\n from: z.string(),\n typing: messageTypingSchema.optional(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** A reaction landing on a target message (`$prev` or a message id). */\nexport const reactionStepSchema = z.object({\n type: z.literal(\"reaction\"),\n target: z.string(),\n emoji: z.string(),\n from: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** A standalone typing indicator (no message necessarily follows). */\nexport const typingStepSchema = z.object({\n type: z.literal(\"typing\"),\n from: z.string(),\n showTypingFor: z.number().nonnegative().optional(),\n ...stepBaseShape,\n});\n\n/** The self participant typing into the composer, char by char. */\nexport const composerTypeStepSchema = z.object({\n type: z.literal(\"composerType\"),\n from: z.string(),\n text: z.string(),\n /** Override the computed typing duration (ms). */\n typingDuration: z.number().nonnegative().optional(),\n ...stepBaseShape,\n});\n\n/** Commit the composer's current text to the thread. */\nexport const sendStepSchema = z.object({\n type: z.literal(\"send\"),\n from: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** Edit a previously sent message's body. */\nexport const editStepSchema = z.object({\n type: z.literal(\"edit\"),\n target: z.string(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** Delete a previously sent message. */\nexport const deleteStepSchema = z.object({\n type: z.literal(\"delete\"),\n target: z.string(),\n ...stepBaseShape,\n});\n\n/** A read receipt (optionally by a participant, optionally up to a message). */\nexport const readReceiptStepSchema = z.object({\n type: z.literal(\"readReceipt\"),\n by: z.string().optional(),\n target: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** An app/system card (e.g. \"Pull request opened\" with action buttons). */\nexport const systemStepSchema = z.object({\n type: z.literal(\"system\"),\n from: z.string().optional(),\n /** Named card variant the skin renders, e.g. `\"pr-opened\"`. */\n card: z.string().optional(),\n actions: z\n .array(z.object({ label: z.string(), href: z.string().optional() }))\n .optional(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** An explicit pause in the timeline. */\nexport const beatStepSchema = z.object({\n type: z.literal(\"beat\"),\n duration: z.number().nonnegative(),\n ...stepBaseShape,\n});\n\nexport const timelineStepSchema = z.discriminatedUnion(\"type\", [\n messageStepSchema,\n reactionStepSchema,\n typingStepSchema,\n composerTypeStepSchema,\n sendStepSchema,\n editStepSchema,\n deleteStepSchema,\n readReceiptStepSchema,\n systemStepSchema,\n beatStepSchema,\n]);\nexport type TimelineStep = z.infer<typeof timelineStepSchema>;\nexport type TimelineStepInput = z.input<typeof timelineStepSchema>;\n\nexport const timelineSchema = z.array(timelineStepSchema);\n\n/** The discriminant values of every timeline step. */\nexport const STEP_TYPES = [\n \"message\",\n \"reaction\",\n \"typing\",\n \"composerType\",\n \"send\",\n \"edit\",\n \"delete\",\n \"readReceipt\",\n \"system\",\n \"beat\",\n] as const;\nexport type StepType = (typeof STEP_TYPES)[number];\n","import { z } from \"zod\";\nimport { metaSchema } from \"./meta.js\";\nimport { participantsSchema } from \"./participants.js\";\nimport { pacingSchema } from \"./pacing.js\";\nimport { timelineSchema } from \"./timeline.js\";\n\n/**\n * The config schema version. Distinct from the `@typecaast/schema` package\n * version (related but versioned independently — see PLAN §22). A config newer\n * than the installed runtime fails parsing with a clear error.\n */\nexport const CONFIG_VERSION = 1;\n\n/** The complete Typecaast config: the single source of truth for a simulation. */\nexport const configSchema = z.object({\n version: z.literal(CONFIG_VERSION),\n meta: metaSchema,\n participants: participantsSchema,\n /** Optional; omitted pacing resolves to the full default model. */\n pacing: pacingSchema.default(() => pacingSchema.parse({})),\n timeline: timelineSchema,\n});\n\n/** A parsed config (defaults applied). */\nexport type Config = z.infer<typeof configSchema>;\n/** A config as authored (fields with defaults are optional). */\nexport type ConfigInput = z.input<typeof configSchema>;\n\n/**\n * Generate the JSON Schema for a Typecaast config (for editor autocomplete and\n * `$schema` references). Lazy so importing the package never eagerly runs the\n * conversion. Refinements (e.g. the lenient content-node guard) are not\n * representable in JSON Schema and are dropped.\n */\nexport function configJsonSchema(): Record<string, unknown> {\n return z.toJSONSchema(configSchema, {\n unrepresentable: \"any\",\n target: \"draft-7\",\n }) as Record<string, unknown>;\n}\n","import { CONFIG_VERSION, configSchema } from \"./config.js\";\n\n/** Diagnostic severity tiers (PLAN §23). */\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\n/**\n * A single validation finding. Every diagnostic carries a stable `code`, the\n * offending `location` (step/message/path), and a `hint` for remediation.\n */\nexport interface Diagnostic {\n code: string;\n severity: Severity;\n message: string;\n /** Dotted/indexed path, e.g. `timeline[3].from` or `meta.canvas.width`. */\n location?: string;\n hint?: string;\n}\n\nfunction formatPath(path: ReadonlyArray<PropertyKey>): string {\n let out = \"\";\n for (const key of path) {\n if (typeof key === \"number\") out += `[${key}]`;\n else if (out === \"\") out += String(key);\n else out += `.${String(key)}`;\n }\n return out;\n}\n\n/** Read an optional `from`/`by`/`target` field off any step shape. */\nfunction field(step: unknown, key: string): string | undefined {\n const value = (step as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Validate a parsed config value (already JSON-decoded). Returns all\n * diagnostics — schema errors, then semantic checks (reference integrity,\n * target resolution). Reusable by the CLI and the builder's lint panel.\n *\n * A version newer than the runtime short-circuits with a single hard error.\n */\nexport function validateConfig(raw: unknown): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n if (raw && typeof raw === \"object\" && \"version\" in raw) {\n const version = (raw as { version: unknown }).version;\n if (typeof version === \"number\" && version > CONFIG_VERSION) {\n return [\n {\n code: \"E_VERSION\",\n severity: \"error\",\n message: `Config version ${version} is newer than this runtime supports (max ${CONFIG_VERSION}).`,\n location: \"version\",\n hint: \"Upgrade Typecaast (e.g. `npm i @typecaast/cli@latest`).\",\n },\n ];\n }\n }\n\n const result = configSchema.safeParse(raw);\n if (!result.success) {\n for (const issue of result.error.issues) {\n diagnostics.push({\n code: \"E_SCHEMA\",\n severity: \"error\",\n message: issue.message,\n location: formatPath(issue.path) || undefined,\n });\n }\n return diagnostics;\n }\n\n const config = result.data;\n\n // Duplicate participant ids.\n const ids = config.participants.map((p) => p.id);\n const idSet = new Set(ids);\n for (const dup of new Set(ids.filter((id, i) => ids.indexOf(id) !== i))) {\n diagnostics.push({\n code: \"E_DUP_PARTICIPANT\",\n severity: \"error\",\n message: `Duplicate participant id \"${dup}\".`,\n location: \"participants\",\n hint: \"Participant ids must be unique.\",\n });\n }\n\n const hasSelf = config.participants.some((p) => p.isSelf);\n let warnedNoSelf = false;\n const messageIds = new Set<string>();\n let priorMessages = 0;\n\n config.timeline.forEach((step, i) => {\n const loc = `timeline[${i}]`;\n\n const from = field(step, \"from\");\n if (from !== undefined && !idSet.has(from)) {\n diagnostics.push({\n code: \"E_REF_PARTICIPANT\",\n severity: \"error\",\n message: `Step references unknown participant \"${from}\".`,\n location: `${loc}.from`,\n hint: `Add a participant with id \"${from}\" or fix the reference.`,\n });\n }\n\n if (step.type === \"readReceipt\") {\n const by = field(step, \"by\");\n if (by !== undefined && !idSet.has(by)) {\n diagnostics.push({\n code: \"E_REF_PARTICIPANT\",\n severity: \"error\",\n message: `Read receipt references unknown participant \"${by}\".`,\n location: `${loc}.by`,\n hint: `Add a participant with id \"${by}\" or fix the reference.`,\n });\n }\n }\n\n if (\n (step.type === \"composerType\" || step.type === \"send\") &&\n !hasSelf &&\n !warnedNoSelf\n ) {\n warnedNoSelf = true;\n diagnostics.push({\n code: \"W_NO_SELF\",\n severity: \"warning\",\n message: \"The composer is used but no participant is marked as self.\",\n location: loc,\n hint: 'Mark a participant with `\"isSelf\": true`.',\n });\n }\n\n if (\n (step.type === \"message\" || step.type === \"system\") &&\n typeof step.id === \"string\"\n ) {\n messageIds.add(step.id);\n }\n\n if (\n step.type === \"reaction\" ||\n step.type === \"edit\" ||\n step.type === \"delete\"\n ) {\n const target = step.target;\n if (target === \"$prev\") {\n if (priorMessages === 0) {\n diagnostics.push({\n code: \"W_NO_PREV\",\n severity: \"warning\",\n message: '\"$prev\" target has no preceding message.',\n location: `${loc}.target`,\n hint: \"Place this after a message, or target a message id.\",\n });\n }\n } else if (!messageIds.has(target)) {\n diagnostics.push({\n code: \"W_TARGET\",\n severity: \"warning\",\n message: `Target \"${target}\" matches no preceding message id.`,\n location: `${loc}.target`,\n hint: 'Give the target message an `\"id\"`, or check the reference.',\n });\n }\n }\n\n if (step.type === \"message\" || step.type === \"system\") priorMessages++;\n });\n\n return diagnostics;\n}\n"]}
1
+ {"version":3,"sources":["../src/meta.ts","../src/participants.ts","../src/pacing.ts","../src/content-nodes.ts","../src/content-registry.ts","../src/content-sugar.ts","../src/timeline.ts","../src/config.ts","../src/validate.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\n/** A pixel dimension pair (authoring reference; the exact frame for video). */\nexport const sizeSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n});\nexport type Size = z.infer<typeof sizeSchema>;\n\n/**\n * How the rendered conversation fills its container.\n * - `reflow`: container queries + ResizeObserver; bubbles re-wrap on small screens.\n * - `scale`: CSS transform scale-to-fit, preserves exact layout.\n * - `fixed`: clip to canvas.\n */\nexport const fitModeSchema = z.enum([\"reflow\", \"scale\", \"fixed\"]);\nexport type FitMode = z.infer<typeof fitModeSchema>;\n\n/**\n * Reply-box (composer) visibility:\n * - `auto`: shown only while someone is typing/sending (default).\n * - `always`: keep the message input visible the whole time.\n * - `never`: never show it.\n */\nexport const composerModeSchema = z.enum([\"auto\", \"always\", \"never\"]);\nexport type ComposerMode = z.infer<typeof composerModeSchema>;\n\n/**\n * Color theme. `auto` inherits the host page's `prefers-color-scheme` (live\n * preview) and falls back to `light`; video export resolves `auto` to a\n * concrete mode and defaults to `light` when unspecified.\n */\nexport const themeModeSchema = z.enum([\"light\", \"dark\", \"auto\"]);\nexport type ThemeMode = z.infer<typeof themeModeSchema>;\n\n/**\n * Asset resolution strategy.\n * - `inline`: embed images as data URLs (self-contained config; default).\n * - `url`: reference hosted images (smaller config; user hosts their own).\n */\nexport const assetModeSchema = z.enum([\"inline\", \"url\"]);\nexport type AssetMode = z.infer<typeof assetModeSchema>;\n\n/** Reference to a skin plus its skin-specific options (validated by the skin). */\nexport const skinRefSchema = z.object({\n id: z.string().min(1),\n options: z.record(z.string(), z.unknown()).optional(),\n});\nexport type SkinRef = z.infer<typeof skinRefSchema>;\n\n/** Top-level rendering/authoring metadata. */\nexport const metaSchema = z.object({\n /** Authoring reference size; fixed frame for video. */\n canvas: sizeSchema,\n fps: z.number().int().positive().default(30),\n fit: fitModeSchema.default(\"reflow\"),\n theme: themeModeSchema.default(\"auto\"),\n skin: skinRefSchema,\n /** Seed for all deterministic jitter (no `Math.random`). */\n seed: z.number().int().default(42),\n /** Canvas background: `\"transparent\"` or any CSS color. */\n background: z.string().default(\"transparent\"),\n assets: assetModeSchema.default(\"inline\"),\n /** Reply-box visibility (see `composerModeSchema`). */\n composer: composerModeSchema.default(\"auto\"),\n /**\n * Auto-replay when the timeline reaches the end. Honored by the builder\n * preview and by `<Typecaast>` when the consumer doesn't pass an explicit\n * `loop` prop.\n */\n loop: z.boolean().default(false),\n});\n\n/** `meta` as it appears after parsing (defaults applied). */\nexport type Meta = z.infer<typeof metaSchema>;\n/** `meta` as authored (fields with defaults are optional). */\nexport type MetaInput = z.input<typeof metaSchema>;\n","import { z } from \"zod\";\n\n/** Whether a participant is a human or an app/bot (changes how skins render it). */\nexport const participantKindSchema = z.enum([\"person\", \"app\"]);\nexport type ParticipantKind = z.infer<typeof participantKindSchema>;\n\n/** A speaker in the conversation. */\nexport const participantSchema = z.object({\n /** Stable id referenced by timeline steps (`from`, `target`, …). */\n id: z.string().min(1),\n name: z.string().min(1),\n /** Avatar asset (data URL or referenced URL per `meta.assets`). */\n avatar: z.string().optional(),\n /** Accent color (CSS color) some skins use for the author. */\n color: z.string().optional(),\n /** The viewer — rendered as the \"self\" side and the composer's author. */\n isSelf: z.boolean().optional(),\n kind: participantKindSchema.default(\"person\"),\n});\nexport type Participant = z.infer<typeof participantSchema>;\nexport type ParticipantInput = z.input<typeof participantSchema>;\n\nexport const participantsSchema = z.array(participantSchema);\n","import { z } from \"zod\";\n\n/**\n * Global auto-pacing defaults. Every value is overridable per step in the\n * timeline; the engine computes delays/durations from these and bakes in\n * seeded, deterministic jitter (`humanize`).\n */\nexport const pacingSchema = z.object({\n /** Gap before an incoming message ≈ reading time of the prior message. */\n readingWpm: z.number().positive().default(240),\n /** Chars/sec for composer typing + sender typing duration. */\n typingCps: z.number().positive().default(14),\n /** ±fraction of seeded jitter so pacing doesn't feel robotic (0–1). */\n humanize: z.number().min(0).max(1).default(0.15),\n /** Delay before the first event. */\n startDelayMs: z.number().nonnegative().default(400),\n});\nexport type Pacing = z.infer<typeof pacingSchema>;\nexport type PacingInput = z.input<typeof pacingSchema>;\n","import { z } from \"zod\";\n\n/**\n * Inline marks inside a text node. `text` runs carry plain content; the others\n * are the recognized marks (`code`, `link`, `mention`, `emoji`). The set is\n * intentionally small in v1 — new marks can be added without a schema-version\n * bump (unknown content node types are handled leniently; see the registry).\n */\nexport const inlineTextSchema = z.object({\n type: z.literal(\"text\"),\n value: z.string(),\n});\nexport const inlineCodeSchema = z.object({\n type: z.literal(\"code\"),\n value: z.string(),\n});\nexport const inlineLinkSchema = z.object({\n type: z.literal(\"link\"),\n href: z.string(),\n label: z.string().optional(),\n});\nexport const inlineMentionSchema = z.object({\n type: z.literal(\"mention\"),\n /** Display label as authored, e.g. `\"@PostHog\"`. */\n label: z.string(),\n /** Resolved participant id, filled when the mention binds to a participant. */\n id: z.string().optional(),\n});\nexport const inlineEmojiSchema = z.object({\n type: z.literal(\"emoji\"),\n /** The rendered glyph, e.g. `\"🦔\"`. */\n value: z.string(),\n /** Optional shortcode, e.g. `\"hedgehog\"`. */\n shortcode: z.string().optional(),\n});\n\nexport const inlineNodeSchema = z.discriminatedUnion(\"type\", [\n inlineTextSchema,\n inlineCodeSchema,\n inlineLinkSchema,\n inlineMentionSchema,\n inlineEmojiSchema,\n]);\nexport type InlineNode = z.infer<typeof inlineNodeSchema>;\n\n/** A block of inline content. */\nexport const textNodeSchema = z.object({\n type: z.literal(\"text\"),\n spans: z.array(inlineNodeSchema),\n});\nexport type TextNode = z.infer<typeof textNodeSchema>;\n\n/** An in-message image (same hosting model as avatars, per `meta.assets`). */\nexport const imageNodeSchema = z.object({\n type: z.literal(\"image\"),\n src: z.string(),\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\nexport type ImageNode = z.infer<typeof imageNodeSchema>;\n\n/**\n * A content node whose `type` the runtime doesn't recognize. It validates\n * leniently (only `type` is required) and is skipped by skins that don't handle\n * it — so future node types (`attachment`, `linkPreview`, …) slot in without\n * breaking older runtimes or bumping the schema version.\n */\nexport interface UnknownContentNode {\n type: string;\n [key: string]: unknown;\n}\n\n/** The body of a message: an ordered list of content nodes. */\nexport type ContentNode = TextNode | ImageNode | UnknownContentNode;\n","import { z } from \"zod\";\nimport {\n imageNodeSchema,\n textNodeSchema,\n type ContentNode,\n} from \"./content-nodes.js\";\n\n/**\n * The content-type registry. Each message body node has a `type` resolved\n * through here. v1 registers `text` and `image`; additional types can be\n * registered (with their own strict schema) without a schema-version bump.\n *\n * Nodes whose `type` is **not** registered validate leniently (only `type` is\n * required) and are skipped by skins that don't handle them. Nodes whose `type`\n * **is** registered must satisfy that type's schema — so a malformed `text`\n * node is an error rather than silently passing through the lenient path.\n */\nconst registry = new Map<string, z.ZodTypeAny>([\n [\"text\", textNodeSchema],\n [\"image\", imageNodeSchema],\n]);\n\n/** Register (or override) the strict schema for a content node type. */\nexport function registerContentNodeType(\n type: string,\n schema: z.ZodTypeAny,\n): void {\n registry.set(type, schema);\n}\n\n/** The content node types the runtime validates strictly. */\nexport function knownContentNodeTypes(): string[] {\n return [...registry.keys()];\n}\n\nexport function isKnownContentNodeType(type: string): boolean {\n return registry.has(type);\n}\n\n/** Accepts any object with a string `type` that isn't a registered type. */\nconst lenientUnknownNodeSchema = z\n .looseObject({ type: z.string() })\n .refine((node) => !registry.has(node.type), {\n message: \"malformed content node for a registered type\",\n });\n\n/**\n * Build a content-node schema from the current registry state. Call this after\n * registering a new type to pick it up; `contentNodeSchema` below is the\n * default built from the v1 registry (`text` + `image`).\n */\nexport function buildContentNodeSchema(): z.ZodType<ContentNode> {\n return z.union([\n ...registry.values(),\n lenientUnknownNodeSchema,\n ]) as unknown as z.ZodType<ContentNode>;\n}\n\n/** Default content-node schema (text + image + lenient unknown). */\nexport const contentNodeSchema = buildContentNodeSchema();\n\n/** A message body: an ordered array of content nodes. */\nexport const contentSchema = z.array(contentNodeSchema);\n","import type {\n ContentNode,\n ImageNode,\n InlineNode,\n TextNode,\n} from \"./content-nodes.js\";\n\n/**\n * Matches an inline mark: a backtick code span, an http(s) link, or an\n * `@mention`. Everything else becomes plain text runs.\n */\nconst INLINE_TOKEN = /`([^`]+)`|(https?:\\/\\/[^\\s]+)|(@[A-Za-z0-9_][\\w.-]*)/g;\n\n/**\n * Parse a plain authoring string into inline nodes, extracting inline `code`,\n * links, and `@mentions`. Emoji are left inside text runs in v1 (they render\n * fine and a dedicated emoji mark can be authored explicitly).\n */\nexport function parseInline(text: string): InlineNode[] {\n if (text.length === 0) return [];\n const spans: InlineNode[] = [];\n const re = new RegExp(INLINE_TOKEN.source, \"g\");\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = re.exec(text)) !== null) {\n const matchText = match[0] ?? \"\";\n if (match.index > lastIndex) {\n spans.push({ type: \"text\", value: text.slice(lastIndex, match.index) });\n }\n if (match[1] !== undefined) {\n spans.push({ type: \"code\", value: match[1] });\n } else if (match[2] !== undefined) {\n spans.push({ type: \"link\", href: match[2] });\n } else if (match[3] !== undefined) {\n spans.push({ type: \"mention\", label: match[3] });\n }\n lastIndex = match.index + matchText.length;\n }\n if (lastIndex < text.length) {\n spans.push({ type: \"text\", value: text.slice(lastIndex) });\n }\n return spans;\n}\n\n/** Convenience shape for authoring an in-message image. */\nexport interface ImageSugar {\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\n/** `text` string → a single text content node. */\nexport function textToContentNode(text: string): TextNode {\n return { type: \"text\", spans: parseInline(text) };\n}\n\n/** `image` sugar → an image content node (drops undefined optionals). */\nexport function imageToContentNode(image: ImageSugar): ImageNode {\n const node: ImageNode = { type: \"image\", src: image.src };\n if (image.alt !== undefined) node.alt = image.alt;\n if (image.width !== undefined) node.width = image.width;\n if (image.height !== undefined) node.height = image.height;\n return node;\n}\n\n/** The sugar fields a message may carry instead of explicit `content`. */\nexport interface MessageBodySugar {\n /** Authored text (parsed into inline marks). */\n text?: string;\n /** In-message images, rendered after the text. */\n images?: ImageSugar[];\n /** Explicit content nodes; when present, wins over `text`/`images`. */\n content?: ContentNode[];\n}\n\n/**\n * Resolve a message's body sugar to content nodes. Explicit `content` is\n * authoritative; otherwise the text node (if any) comes first, then images —\n * matching the \"here's the toast: [image]\" ordering in the spec example.\n */\nexport function toContentNodes(body: MessageBodySugar): ContentNode[] {\n if (body.content) return body.content;\n const nodes: ContentNode[] = [];\n if (body.text !== undefined && body.text.length > 0) {\n nodes.push(textToContentNode(body.text));\n }\n if (body.images) {\n for (const image of body.images) nodes.push(imageToContentNode(image));\n }\n return nodes;\n}\n","import { z } from \"zod\";\nimport { contentSchema } from \"./content-registry.js\";\n\n/**\n * Per-step overrides shared by every step. The engine computes timing from the\n * pacing model; these win over the computed values. Use a dedicated `delay`\n * step type to insert explicit pauses on the timeline.\n */\nconst stepBaseShape = {\n /** Optional id so reactions/edits/deletes can target this step's message. */\n id: z.string().optional(),\n /** Reveal with no animation and no computed delay. */\n instant: z.boolean().optional(),\n};\n\n/** Authoring sugar for an in-message image (compiled to an image node). */\nexport const imageSugarSchema = z.object({\n src: z.string(),\n alt: z.string().optional(),\n width: z.number().positive().optional(),\n height: z.number().positive().optional(),\n});\n\n/** Message-body sugar fields; `content` (explicit nodes) wins when present. */\nconst bodyShape = {\n text: z.string().optional(),\n images: z.array(imageSugarSchema).optional(),\n content: contentSchema.optional(),\n};\n\n/** Optional typing indicator preceding a message. */\nconst messageTypingSchema = z.union([\n z.boolean(),\n z.object({ showTypingFor: z.number().nonnegative().optional() }),\n]);\n\n/** An incoming message, optionally preceded by a typing indicator. */\nexport const messageStepSchema = z.object({\n type: z.literal(\"message\"),\n from: z.string(),\n typing: messageTypingSchema.optional(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** A reaction landing on a target message (`$prev` or a message id). */\nexport const reactionStepSchema = z.object({\n type: z.literal(\"reaction\"),\n /** Message id to react to. Defaults to `$prev` (the most-recent message). */\n target: z.string().optional(),\n emoji: z.string(),\n /** Emoji shortcode without colons, e.g. `\"eyes\"` — shown in skin tooltips. */\n shortcode: z.string().optional(),\n from: z.string().optional(),\n /** Gap from when the target appears, before the reaction lands (ms). */\n delay: z.number().nonnegative().optional(),\n ...stepBaseShape,\n});\n\n/** A standalone typing indicator (no message necessarily follows). */\nexport const typingStepSchema = z.object({\n type: z.literal(\"typing\"),\n from: z.string(),\n showTypingFor: z.number().nonnegative().optional(),\n ...stepBaseShape,\n});\n\n/** The self participant typing into the composer, char by char. */\nexport const composerTypeStepSchema = z.object({\n type: z.literal(\"composerType\"),\n from: z.string(),\n text: z.string(),\n /** Override the computed typing duration (ms). */\n typingDuration: z.number().nonnegative().optional(),\n ...stepBaseShape,\n});\n\n/** Commit the composer's current text to the thread. */\nexport const sendStepSchema = z.object({\n type: z.literal(\"send\"),\n from: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** Edit a previously sent message's body. */\nexport const editStepSchema = z.object({\n type: z.literal(\"edit\"),\n /** Message id to edit. Defaults to `$prev` (the most-recent message). */\n target: z.string().optional(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** Delete a previously sent message. */\nexport const deleteStepSchema = z.object({\n type: z.literal(\"delete\"),\n /** Message id to delete. Defaults to `$prev` (the most-recent message). */\n target: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** A read receipt (optionally by a participant, optionally up to a message). */\nexport const readReceiptStepSchema = z.object({\n type: z.literal(\"readReceipt\"),\n by: z.string().optional(),\n target: z.string().optional(),\n ...stepBaseShape,\n});\n\n/** An app/system card (e.g. \"Pull request opened\" with action buttons). */\nexport const systemStepSchema = z.object({\n type: z.literal(\"system\"),\n from: z.string().optional(),\n /** Named card variant the skin renders, e.g. `\"pr-opened\"`. */\n card: z.string().optional(),\n /**\n * Buttons rendered alongside the system message. When `href` is set the\n * skin should render the button as a link that opens in a new tab; when\n * absent it should be visibly inert (e.g. `cursor: not-allowed`). `variant`\n * controls visual emphasis; if omitted the first action defaults to\n * `\"primary\"` and the rest to `\"secondary\"`.\n */\n actions: z\n .array(\n z.object({\n label: z.string(),\n href: z.string().optional(),\n variant: z.enum([\"primary\", \"secondary\"]).optional(),\n }),\n )\n .optional(),\n ...bodyShape,\n ...stepBaseShape,\n});\n\n/** An explicit pause in the timeline (formerly `beat`). */\nexport const delayStepSchema = z.object({\n type: z.literal(\"delay\"),\n duration: z.number().nonnegative(),\n ...stepBaseShape,\n});\n\nexport const timelineStepSchema = z.discriminatedUnion(\"type\", [\n messageStepSchema,\n reactionStepSchema,\n typingStepSchema,\n composerTypeStepSchema,\n sendStepSchema,\n editStepSchema,\n deleteStepSchema,\n readReceiptStepSchema,\n systemStepSchema,\n delayStepSchema,\n]);\nexport type TimelineStep = z.infer<typeof timelineStepSchema>;\nexport type TimelineStepInput = z.input<typeof timelineStepSchema>;\n\nexport const timelineSchema = z.array(timelineStepSchema);\n\n/** The discriminant values of every timeline step. */\nexport const STEP_TYPES = [\n \"message\",\n \"reaction\",\n \"typing\",\n \"composerType\",\n \"send\",\n \"edit\",\n \"delete\",\n \"readReceipt\",\n \"system\",\n \"delay\",\n] as const;\nexport type StepType = (typeof STEP_TYPES)[number];\n","import { z } from \"zod\";\nimport { metaSchema } from \"./meta.js\";\nimport { participantsSchema } from \"./participants.js\";\nimport { pacingSchema } from \"./pacing.js\";\nimport { timelineSchema } from \"./timeline.js\";\n\n/**\n * The config schema version. Distinct from the `@typecaast/schema` package\n * version (related but versioned independently — see PLAN §22). A config newer\n * than the installed runtime fails parsing with a clear error.\n */\nexport const CONFIG_VERSION = 1;\n\n/** The complete Typecaast config: the single source of truth for a simulation. */\nexport const configSchema = z.object({\n version: z.literal(CONFIG_VERSION),\n meta: metaSchema,\n participants: participantsSchema,\n /** Optional; omitted pacing resolves to the full default model. */\n pacing: pacingSchema.default(() => pacingSchema.parse({})),\n timeline: timelineSchema,\n});\n\n/** A parsed config (defaults applied). */\nexport type Config = z.infer<typeof configSchema>;\n/** A config as authored (fields with defaults are optional). */\nexport type ConfigInput = z.input<typeof configSchema>;\n\n/**\n * Generate the JSON Schema for a Typecaast config (for editor autocomplete and\n * `$schema` references). Lazy so importing the package never eagerly runs the\n * conversion. Refinements (e.g. the lenient content-node guard) are not\n * representable in JSON Schema and are dropped.\n */\nexport function configJsonSchema(): Record<string, unknown> {\n return z.toJSONSchema(configSchema, {\n unrepresentable: \"any\",\n target: \"draft-7\",\n }) as Record<string, unknown>;\n}\n","import { CONFIG_VERSION, configSchema } from \"./config.js\";\n\n/** Diagnostic severity tiers (PLAN §23). */\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\n/**\n * A single validation finding. Every diagnostic carries a stable `code`, the\n * offending `location` (step/message/path), and a `hint` for remediation.\n */\nexport interface Diagnostic {\n code: string;\n severity: Severity;\n message: string;\n /** Dotted/indexed path, e.g. `timeline[3].from` or `meta.canvas.width`. */\n location?: string;\n hint?: string;\n}\n\nfunction formatPath(path: ReadonlyArray<PropertyKey>): string {\n let out = \"\";\n for (const key of path) {\n if (typeof key === \"number\") out += `[${key}]`;\n else if (out === \"\") out += String(key);\n else out += `.${String(key)}`;\n }\n return out;\n}\n\n/** Read an optional `from`/`by`/`target` field off any step shape. */\nfunction field(step: unknown, key: string): string | undefined {\n const value = (step as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Validate a parsed config value (already JSON-decoded). Returns all\n * diagnostics — schema errors, then semantic checks (reference integrity,\n * target resolution). Reusable by the CLI and the builder's lint panel.\n *\n * A version newer than the runtime short-circuits with a single hard error.\n */\nexport function validateConfig(raw: unknown): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n if (raw && typeof raw === \"object\" && \"version\" in raw) {\n const version = (raw as { version: unknown }).version;\n if (typeof version === \"number\" && version > CONFIG_VERSION) {\n return [\n {\n code: \"E_VERSION\",\n severity: \"error\",\n message: `Config version ${version} is newer than this runtime supports (max ${CONFIG_VERSION}).`,\n location: \"version\",\n hint: \"Upgrade Typecaast (e.g. `npm i @typecaast/cli@latest`).\",\n },\n ];\n }\n }\n\n const result = configSchema.safeParse(raw);\n if (!result.success) {\n for (const issue of result.error.issues) {\n diagnostics.push({\n code: \"E_SCHEMA\",\n severity: \"error\",\n message: issue.message,\n location: formatPath(issue.path) || undefined,\n });\n }\n return diagnostics;\n }\n\n const config = result.data;\n\n // Duplicate participant ids.\n const ids = config.participants.map((p) => p.id);\n const idSet = new Set(ids);\n for (const dup of new Set(ids.filter((id, i) => ids.indexOf(id) !== i))) {\n diagnostics.push({\n code: \"E_DUP_PARTICIPANT\",\n severity: \"error\",\n message: `Duplicate participant id \"${dup}\".`,\n location: \"participants\",\n hint: \"Participant ids must be unique.\",\n });\n }\n\n const hasSelf = config.participants.some((p) => p.isSelf);\n let warnedNoSelf = false;\n const messageIds = new Set<string>();\n let priorMessages = 0;\n\n config.timeline.forEach((step, i) => {\n const loc = `timeline[${i}]`;\n\n const from = field(step, \"from\");\n if (from !== undefined && !idSet.has(from)) {\n diagnostics.push({\n code: \"E_REF_PARTICIPANT\",\n severity: \"error\",\n message: `Step references unknown participant \"${from}\".`,\n location: `${loc}.from`,\n hint: `Add a participant with id \"${from}\" or fix the reference.`,\n });\n }\n\n if (step.type === \"readReceipt\") {\n const by = field(step, \"by\");\n if (by !== undefined && !idSet.has(by)) {\n diagnostics.push({\n code: \"E_REF_PARTICIPANT\",\n severity: \"error\",\n message: `Read receipt references unknown participant \"${by}\".`,\n location: `${loc}.by`,\n hint: `Add a participant with id \"${by}\" or fix the reference.`,\n });\n }\n }\n\n if (\n (step.type === \"composerType\" || step.type === \"send\") &&\n !hasSelf &&\n !warnedNoSelf\n ) {\n warnedNoSelf = true;\n diagnostics.push({\n code: \"W_NO_SELF\",\n severity: \"warning\",\n message: \"The composer is used but no participant is marked as self.\",\n location: loc,\n hint: 'Mark a participant with `\"isSelf\": true`.',\n });\n }\n\n if (\n (step.type === \"message\" || step.type === \"system\") &&\n typeof step.id === \"string\"\n ) {\n messageIds.add(step.id);\n }\n\n if (\n step.type === \"reaction\" ||\n step.type === \"edit\" ||\n step.type === \"delete\"\n ) {\n const target = step.target;\n // Blank/`$prev` both mean \"the most-recent message\".\n if (!target || target === \"$prev\") {\n if (priorMessages === 0) {\n diagnostics.push({\n code: \"W_NO_PREV\",\n severity: \"warning\",\n message: \"Default target has no preceding message.\",\n location: `${loc}.target`,\n hint: \"Place this after a message, or set a target message id.\",\n });\n }\n } else if (!messageIds.has(target)) {\n diagnostics.push({\n code: \"W_TARGET\",\n severity: \"warning\",\n message: `Target \"${target}\" matches no preceding message id.`,\n location: `${loc}.target`,\n hint: 'Give the target message an `\"id\"`, or check the reference.',\n });\n }\n }\n\n if (step.type === \"message\" || step.type === \"system\") priorMessages++;\n });\n\n return diagnostics;\n}\n"]}