pixelkiln 0.89.6 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1358,7 +1358,10 @@ declare const CharacterAnimationSchema$1: z.ZodEffects<z.ZodObject<{
1358
1358
  * `src/loop-directions.ts`.
1359
1359
  */
1360
1360
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
1361
- /** Frames to generate without a template (v3). Even, 4 to 16. */
1361
+ /**
1362
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
1363
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
1364
+ */
1362
1365
  frames: z.ZodOptional<z.ZodNumber>;
1363
1366
  /** Playback rate recorded with the frames; PixelLab does not store one. */
1364
1367
  fps: z.ZodDefault<z.ZodNumber>;
@@ -1366,8 +1369,10 @@ declare const CharacterAnimationSchema$1: z.ZodEffects<z.ZodObject<{
1366
1369
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
1367
1370
  /**
1368
1371
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
1369
- * poses a template with PixelLab's skeleton model instead; `pro` for the
1370
- * sequential high-quality engine.
1372
+ * poses a template with PixelLab's skeleton model instead, or, with no
1373
+ * template, animates the asset's prompt as a sentence written into one 3D
1374
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
1375
+ * high-quality engine.
1371
1376
  */
1372
1377
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
1373
1378
  /**
@@ -4800,7 +4805,10 @@ declare const AssetSchema: z.ZodEffects<z.ZodObject<{
4800
4805
  * `src/loop-directions.ts`.
4801
4806
  */
4802
4807
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
4803
- /** Frames to generate without a template (v3). Even, 4 to 16. */
4808
+ /**
4809
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
4810
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
4811
+ */
4804
4812
  frames: z.ZodOptional<z.ZodNumber>;
4805
4813
  /** Playback rate recorded with the frames; PixelLab does not store one. */
4806
4814
  fps: z.ZodDefault<z.ZodNumber>;
@@ -4808,8 +4816,10 @@ declare const AssetSchema: z.ZodEffects<z.ZodObject<{
4808
4816
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
4809
4817
  /**
4810
4818
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
4811
- * poses a template with PixelLab's skeleton model instead; `pro` for the
4812
- * sequential high-quality engine.
4819
+ * poses a template with PixelLab's skeleton model instead, or, with no
4820
+ * template, animates the asset's prompt as a sentence written into one 3D
4821
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
4822
+ * high-quality engine.
4813
4823
  */
4814
4824
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
4815
4825
  /**
@@ -7162,7 +7172,10 @@ declare const ManifestSchema: z.ZodObject<{
7162
7172
  * `src/loop-directions.ts`.
7163
7173
  */
7164
7174
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
7165
- /** Frames to generate without a template (v3). Even, 4 to 16. */
7175
+ /**
7176
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
7177
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
7178
+ */
7166
7179
  frames: z.ZodOptional<z.ZodNumber>;
7167
7180
  /** Playback rate recorded with the frames; PixelLab does not store one. */
7168
7181
  fps: z.ZodDefault<z.ZodNumber>;
@@ -7170,8 +7183,10 @@ declare const ManifestSchema: z.ZodObject<{
7170
7183
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
7171
7184
  /**
7172
7185
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
7173
- * poses a template with PixelLab's skeleton model instead; `pro` for the
7174
- * sequential high-quality engine.
7186
+ * poses a template with PixelLab's skeleton model instead, or, with no
7187
+ * template, animates the asset's prompt as a sentence written into one 3D
7188
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
7189
+ * high-quality engine.
7175
7190
  */
7176
7191
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
7177
7192
  /**
@@ -10353,7 +10368,10 @@ declare const ManifestInputSchema: z.ZodObject<{
10353
10368
  * `src/loop-directions.ts`.
10354
10369
  */
10355
10370
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
10356
- /** Frames to generate without a template (v3). Even, 4 to 16. */
10371
+ /**
10372
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
10373
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
10374
+ */
10357
10375
  frames: z.ZodOptional<z.ZodNumber>;
10358
10376
  /** Playback rate recorded with the frames; PixelLab does not store one. */
10359
10377
  fps: z.ZodDefault<z.ZodNumber>;
@@ -10361,8 +10379,10 @@ declare const ManifestInputSchema: z.ZodObject<{
10361
10379
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
10362
10380
  /**
10363
10381
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
10364
- * poses a template with PixelLab's skeleton model instead; `pro` for the
10365
- * sequential high-quality engine.
10382
+ * poses a template with PixelLab's skeleton model instead, or, with no
10383
+ * template, animates the asset's prompt as a sentence written into one 3D
10384
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
10385
+ * high-quality engine.
10366
10386
  */
10367
10387
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
10368
10388
  /**
@@ -15830,7 +15850,10 @@ declare class PixelLabClient {
15830
15850
  * Every mode but skeleton-v3 goes to `/animate-character`, the path whose
15831
15851
  * shapes were measured live. skeleton-v3 is documented only on
15832
15852
  * `/characters/animations`, which takes the same request and answers with
15833
- * the same job list (plus an `animation_group_id`).
15853
+ * the same job list (plus an `animation_group_id`). With no `template` it
15854
+ * animates `actionDescription` as a sentence, 3 to 15 `frameCount` frames
15855
+ * written into one 3D motion; measured on a v3 character (8 frames, 64px:
15856
+ * 3 generations, frames back at 96x96).
15834
15857
  */
15835
15858
  animateCharacter(args: {
15836
15859
  characterId: string;
package/dist/index.d.ts CHANGED
@@ -1358,7 +1358,10 @@ declare const CharacterAnimationSchema$1: z.ZodEffects<z.ZodObject<{
1358
1358
  * `src/loop-directions.ts`.
1359
1359
  */
1360
1360
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
1361
- /** Frames to generate without a template (v3). Even, 4 to 16. */
1361
+ /**
1362
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
1363
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
1364
+ */
1362
1365
  frames: z.ZodOptional<z.ZodNumber>;
1363
1366
  /** Playback rate recorded with the frames; PixelLab does not store one. */
1364
1367
  fps: z.ZodDefault<z.ZodNumber>;
@@ -1366,8 +1369,10 @@ declare const CharacterAnimationSchema$1: z.ZodEffects<z.ZodObject<{
1366
1369
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
1367
1370
  /**
1368
1371
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
1369
- * poses a template with PixelLab's skeleton model instead; `pro` for the
1370
- * sequential high-quality engine.
1372
+ * poses a template with PixelLab's skeleton model instead, or, with no
1373
+ * template, animates the asset's prompt as a sentence written into one 3D
1374
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
1375
+ * high-quality engine.
1371
1376
  */
1372
1377
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
1373
1378
  /**
@@ -4800,7 +4805,10 @@ declare const AssetSchema: z.ZodEffects<z.ZodObject<{
4800
4805
  * `src/loop-directions.ts`.
4801
4806
  */
4802
4807
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
4803
- /** Frames to generate without a template (v3). Even, 4 to 16. */
4808
+ /**
4809
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
4810
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
4811
+ */
4804
4812
  frames: z.ZodOptional<z.ZodNumber>;
4805
4813
  /** Playback rate recorded with the frames; PixelLab does not store one. */
4806
4814
  fps: z.ZodDefault<z.ZodNumber>;
@@ -4808,8 +4816,10 @@ declare const AssetSchema: z.ZodEffects<z.ZodObject<{
4808
4816
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
4809
4817
  /**
4810
4818
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
4811
- * poses a template with PixelLab's skeleton model instead; `pro` for the
4812
- * sequential high-quality engine.
4819
+ * poses a template with PixelLab's skeleton model instead, or, with no
4820
+ * template, animates the asset's prompt as a sentence written into one 3D
4821
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
4822
+ * high-quality engine.
4813
4823
  */
4814
4824
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
4815
4825
  /**
@@ -7162,7 +7172,10 @@ declare const ManifestSchema: z.ZodObject<{
7162
7172
  * `src/loop-directions.ts`.
7163
7173
  */
7164
7174
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
7165
- /** Frames to generate without a template (v3). Even, 4 to 16. */
7175
+ /**
7176
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
7177
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
7178
+ */
7166
7179
  frames: z.ZodOptional<z.ZodNumber>;
7167
7180
  /** Playback rate recorded with the frames; PixelLab does not store one. */
7168
7181
  fps: z.ZodDefault<z.ZodNumber>;
@@ -7170,8 +7183,10 @@ declare const ManifestSchema: z.ZodObject<{
7170
7183
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
7171
7184
  /**
7172
7185
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
7173
- * poses a template with PixelLab's skeleton model instead; `pro` for the
7174
- * sequential high-quality engine.
7186
+ * poses a template with PixelLab's skeleton model instead, or, with no
7187
+ * template, animates the asset's prompt as a sentence written into one 3D
7188
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
7189
+ * high-quality engine.
7175
7190
  */
7176
7191
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
7177
7192
  /**
@@ -10353,7 +10368,10 @@ declare const ManifestInputSchema: z.ZodObject<{
10353
10368
  * `src/loop-directions.ts`.
10354
10369
  */
10355
10370
  directions: z.ZodOptional<z.ZodArray<z.ZodEnum<["south", "south-east", "east", "north-east", "north", "north-west", "west", "south-west"]>, "many">>;
10356
- /** Frames to generate without a template (v3). Even, 4 to 16. */
10371
+ /**
10372
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
10373
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
10374
+ */
10357
10375
  frames: z.ZodOptional<z.ZodNumber>;
10358
10376
  /** Playback rate recorded with the frames; PixelLab does not store one. */
10359
10377
  fps: z.ZodDefault<z.ZodNumber>;
@@ -10361,8 +10379,10 @@ declare const ManifestInputSchema: z.ZodObject<{
10361
10379
  keepFirstFrame: z.ZodDefault<z.ZodBoolean>;
10362
10380
  /**
10363
10381
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
10364
- * poses a template with PixelLab's skeleton model instead; `pro` for the
10365
- * sequential high-quality engine.
10382
+ * poses a template with PixelLab's skeleton model instead, or, with no
10383
+ * template, animates the asset's prompt as a sentence written into one 3D
10384
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
10385
+ * high-quality engine.
10366
10386
  */
10367
10387
  mode: z.ZodOptional<z.ZodEnum<["template", "skeleton-v3", "v3", "pro"]>>;
10368
10388
  /**
@@ -15830,7 +15850,10 @@ declare class PixelLabClient {
15830
15850
  * Every mode but skeleton-v3 goes to `/animate-character`, the path whose
15831
15851
  * shapes were measured live. skeleton-v3 is documented only on
15832
15852
  * `/characters/animations`, which takes the same request and answers with
15833
- * the same job list (plus an `animation_group_id`).
15853
+ * the same job list (plus an `animation_group_id`). With no `template` it
15854
+ * animates `actionDescription` as a sentence, 3 to 15 `frameCount` frames
15855
+ * written into one 3D motion; measured on a v3 character (8 frames, 64px:
15856
+ * 3 generations, frames back at 96x96).
15834
15857
  */
15835
15858
  animateCharacter(args: {
15836
15859
  characterId: string;
package/dist/index.js CHANGED
@@ -310,16 +310,21 @@ var CharacterAnimationSchema = z.object({
310
310
  * `src/loop-directions.ts`.
311
311
  */
312
312
  directions: z.array(CharacterDirectionSchema).min(1).optional(),
313
- /** Frames to generate without a template (v3). Even, 4 to 16. */
314
- frames: z.number().int().min(4).max(16).optional(),
313
+ /**
314
+ * Frames to generate without a template. A v3 loop takes an even 4 to 16;
315
+ * a sentence loop (`mode: "skeleton-v3"` with no `template`) takes 3 to 15.
316
+ */
317
+ frames: z.number().int().min(3).max(16).optional(),
315
318
  /** Playback rate recorded with the frames; PixelLab does not store one. */
316
319
  fps: z.number().int().min(1).max(60).default(8),
317
320
  /** v3 only: keep the resting pose as frame 0, so `frames` generated frames land as `frames + 1` files. */
318
321
  keepFirstFrame: z.boolean().default(true),
319
322
  /**
320
323
  * `template` when a template is named, otherwise `v3`; `skeleton-v3`
321
- * poses a template with PixelLab's skeleton model instead; `pro` for the
322
- * sequential high-quality engine.
324
+ * poses a template with PixelLab's skeleton model instead, or, with no
325
+ * template, animates the asset's prompt as a sentence written into one 3D
326
+ * motion (a v3 base; 3-15 `frames`); `pro` for the sequential
327
+ * high-quality engine.
323
328
  */
324
329
  mode: CharacterAnimationModeSchema.optional(),
325
330
  /**
@@ -349,15 +354,23 @@ var CharacterAnimationSchema = z.object({
349
354
  path: ["directions"]
350
355
  });
351
356
  }
352
- if (animation.frames !== void 0 && animation.frames % 2 !== 0) {
353
- context.addIssue({ code: z.ZodIssueCode.custom, message: "frames must be even", path: ["frames"] });
357
+ const sentence = animation.mode === "skeleton-v3" && !animation.template;
358
+ if (animation.frames !== void 0 && !sentence) {
359
+ if (animation.frames % 2 !== 0) {
360
+ context.addIssue({ code: z.ZodIssueCode.custom, message: "frames must be even", path: ["frames"] });
361
+ } else if (animation.frames < 4) {
362
+ context.addIssue({ code: z.ZodIssueCode.custom, message: "frames must be 4 to 16", path: ["frames"] });
363
+ }
364
+ }
365
+ if (animation.frames !== void 0 && sentence && animation.frames > 15) {
366
+ context.addIssue({ code: z.ZodIssueCode.custom, message: "a skeleton-v3 loop from a sentence takes 3 to 15 frames", path: ["frames"] });
354
367
  }
355
368
  const mode2 = animation.mode ?? (animation.template ? "template" : "v3");
356
369
  for (const key of ["startFrame", "endFrame", "enhancePrompt"]) {
357
370
  if (animation[key] !== void 0 && mode2 !== "v3") {
358
371
  context.addIssue({
359
372
  code: z.ZodIssueCode.custom,
360
- message: `${key} is for v3 loops; a ${mode2} loop ${mode2 === "template" || mode2 === "skeleton-v3" ? "starts from the character's rotation and follows its template" : "takes neither"}`,
373
+ message: `${key} is for v3 loops; a ${mode2} loop ${mode2 === "template" || mode2 === "skeleton-v3" ? `starts from the character's rotation and ${animation.template ? "follows its template" : "animates its sentence"}` : "takes neither"}`,
361
374
  path: [key]
362
375
  });
363
376
  }
@@ -381,8 +394,11 @@ var CharacterAnimationSchema = z.object({
381
394
  path: ["frames"]
382
395
  });
383
396
  }
384
- if (!animation.template && (animation.mode === "template" || animation.mode === "skeleton-v3")) {
385
- context.addIssue({ code: z.ZodIssueCode.custom, message: `${animation.mode} mode needs a template`, path: ["template"] });
397
+ if (!animation.template && animation.mode === "template") {
398
+ context.addIssue({ code: z.ZodIssueCode.custom, message: "template mode needs a template", path: ["template"] });
399
+ }
400
+ if (sentence && animation.subject !== void 0) {
401
+ context.addIssue({ code: z.ZodIssueCode.custom, message: "subject does not apply to a skeleton-v3 loop from a sentence; describe the motion in the prompt", path: ["subject"] });
386
402
  }
387
403
  });
388
404
  var RevisionDitheringSchema = z.enum(["none", "2x2", "4x4", "8x8"]);
@@ -2610,7 +2626,10 @@ var PixelLabClient = class {
2610
2626
  * Every mode but skeleton-v3 goes to `/animate-character`, the path whose
2611
2627
  * shapes were measured live. skeleton-v3 is documented only on
2612
2628
  * `/characters/animations`, which takes the same request and answers with
2613
- * the same job list (plus an `animation_group_id`).
2629
+ * the same job list (plus an `animation_group_id`). With no `template` it
2630
+ * animates `actionDescription` as a sentence, 3 to 15 `frameCount` frames
2631
+ * written into one 3D motion; measured on a v3 character (8 frames, 64px:
2632
+ * 3 generations, frames back at 96x96).
2614
2633
  */
2615
2634
  async animateCharacter(args) {
2616
2635
  const encode = (image) => ({ type: "base64", base64: image.base64, format: image.format });
@@ -2625,7 +2644,8 @@ var PixelLabClient = class {
2625
2644
  ...args.template ? { template_animation_id: args.template } : {},
2626
2645
  ...args.actionDescription ? { action_description: args.actionDescription } : {},
2627
2646
  ...args.description ? { description: args.description } : {},
2628
- ...args.mode === "v3" && args.frameCount ? { frame_count: args.frameCount } : {},
2647
+ // A template fixes its own frame count; v3 and a skeleton-v3 sentence take one.
2648
+ ...(args.mode === "v3" || args.mode === "skeleton-v3" && !args.template) && args.frameCount ? { frame_count: args.frameCount } : {},
2629
2649
  ...args.mode === "v3" && args.keepFirstFrame === false ? { keep_first_frame: false } : {},
2630
2650
  ...args.mode === "v3" && args.startFrame ? { custom_start_frame: encode(args.startFrame) } : {},
2631
2651
  ...args.mode === "v3" && args.endFrame ? { end_frame: encode(args.endFrame) } : {},
@@ -5277,6 +5297,16 @@ var PixelLabProvider = class _PixelLabProvider {
5277
5297
  if (skeletonTemplate && !CHARACTER_TEMPLATES.includes(skeletonTemplate)) {
5278
5298
  throw new Error(`PixelLab animate-skeleton template "${skeletonTemplate}" is not one of ${CHARACTER_TEMPLATES.join(", ")}`);
5279
5299
  }
5300
+ if (!spec.revision.description?.trim()) {
5301
+ throw new Error(
5302
+ `${spec.styleId}/${spec.assetId}: an animate-skeleton revision needs revision.description, what the character looks like (for example "a knight in steel armour holding a sword"); PixelLab refuses the request without it`
5303
+ );
5304
+ }
5305
+ if (!spec.prompt.trim()) {
5306
+ throw new Error(
5307
+ `${spec.styleId}/${spec.assetId}: an animate-skeleton revision needs a prompt, a short motion label (for example "swinging the sword")`
5308
+ );
5309
+ }
5280
5310
  }
5281
5311
  if (spec.revision?.mode === "animate" || spec.revision?.mode === "animate-pixminimax") {
5282
5312
  const { sourceWidth: width, sourceHeight: height, mode: mode2, frames, lastFrameWidth, lastFrameHeight } = spec.revision;
@@ -5680,12 +5710,18 @@ var PixelLabProvider = class _PixelLabProvider {
5680
5710
  `${spec.styleId}/${spec.assetId} animates "${character.animation.direction}", but its character has ${character.directions} directions: ${allowed.join(", ")}`
5681
5711
  );
5682
5712
  }
5683
- if (character.animation.mode !== "template" && character.animation.mode !== "skeleton-v3" && !spec.prompt.trim()) {
5684
- throw new Error(`${spec.styleId}/${spec.assetId} needs a prompt describing the motion, or a template`);
5713
+ const sentence = character.animation.mode === "skeleton-v3" && !character.animation.template;
5714
+ if (character.animation.mode !== "template" && (character.animation.mode !== "skeleton-v3" || sentence) && !spec.prompt.trim()) {
5715
+ throw new Error(
5716
+ `${spec.styleId}/${spec.assetId} needs a prompt describing the motion, or a template` + (sentence ? ' (a skeleton-v3 loop with no template animates its prompt, e.g. "swinging a sword in a wide arc")' : "")
5717
+ );
5718
+ }
5719
+ if (sentence && (character.animation.frames < 3 || character.animation.frames > 15)) {
5720
+ throw new Error(`${spec.styleId}/${spec.assetId}: a skeleton-v3 loop from a sentence takes 3 to 15 frames; ${character.animation.frames} is out of range`);
5685
5721
  }
5686
5722
  if (character.animation.mode === "skeleton-v3" && character.mode === "standard") {
5687
5723
  throw new Error(
5688
- `${spec.styleId}/${spec.assetId}: skeleton-v3 poses a template onto a 3D skeleton, which a ${character.mode} character has none of; use a v3 base (style mode: "v3"), or mode: "template" for this loop`
5724
+ sentence ? `${spec.styleId}/${spec.assetId}: a skeleton-v3 loop from a sentence writes the motion onto a 3D skeleton, which a ${character.mode} character has none of; use a v3 base (style mode: "v3"), or mode: "template" with a template for this loop` : `${spec.styleId}/${spec.assetId}: skeleton-v3 poses a template onto a 3D skeleton, which a ${character.mode} character has none of; use a v3 base (style mode: "v3"), or mode: "template" for this loop`
5689
5725
  );
5690
5726
  }
5691
5727
  }
@@ -18066,7 +18102,8 @@ var SkeletonAnimationRequestSchema = z12.object({
18066
18102
  /** The motion, sent as PixelLab's `action`. */
18067
18103
  prompt: z12.string().min(1),
18068
18104
  direction: CharacterDirectionSchema,
18069
- description: z12.string().min(1).optional(),
18105
+ /** What the character looks like; PixelLab refuses the request without it. */
18106
+ description: z12.string().min(1),
18070
18107
  skeletonTemplate: z12.string().min(1).optional(),
18071
18108
  /** Manifest-relative JSON path inside the project. */
18072
18109
  keypointsFile: z12.string().min(1),
@@ -18116,7 +18153,7 @@ async function createSkeletonAnimation(manifestPath, request) {
18116
18153
  from: request.from,
18117
18154
  keypointsFile: relative.split(path32.sep).join("/"),
18118
18155
  direction: request.direction,
18119
- ...request.description ? { description: request.description } : {},
18156
+ description: request.description,
18120
18157
  ...request.skeletonTemplate ? { skeletonTemplate: request.skeletonTemplate } : {}
18121
18158
  }
18122
18159
  }