@usenaive-sdk/cli 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +195 -42
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -28590,6 +28590,10 @@ var PayoutDetailsSchema = external_exports.object({
28590
28590
  var CreatorStatusSchema = external_exports.enum(["active", "suspended", "archived"]);
28591
28591
  var CreatorSourceSchema = external_exports.enum(["youtube", "channel_license", "doomscroll"]);
28592
28592
  var CreatorStudioBudgetSchema = MicroUsdField.positive().max(1e10);
28593
+ var CreatorModeSchema = external_exports.enum(["ai_clips", "sports_clips", "movie_clips", "dance_clips"]);
28594
+ var VIDEO_CREATOR_MODES = ["sports_clips", "movie_clips", "dance_clips"];
28595
+ var VideoCreatorModeSchema = external_exports.enum(VIDEO_CREATOR_MODES);
28596
+ var CreatorModesSchema = external_exports.array(CreatorModeSchema).min(1, "keep at least one account type").refine((modes) => new Set(modes).size === modes.length, "each account type at most once");
28593
28597
  var CreatorSchema = external_exports.object({
28594
28598
  id: idOf("crt"),
28595
28599
  object: external_exports.literal("creator"),
@@ -28603,6 +28607,8 @@ var CreatorSchema = external_exports.object({
28603
28607
  clicks: external_exports.number().int().nonnegative(),
28604
28608
  /** This creator's per-draft studio cap, overriding `CREATOR_PROGRAM.studio`; `null` = the default. */
28605
28609
  studio_budget_micro_usd: CreatorStudioBudgetSchema.nullable(),
28610
+ /** Its campaign modes (migration 0181); a row read before it parses as `ai_clips` only. */
28611
+ modes: CreatorModesSchema.default(["ai_clips"]),
28606
28612
  created_at: Timestamp,
28607
28613
  updated_at: Timestamp
28608
28614
  });
@@ -28715,7 +28721,9 @@ var CREATOR_PROGRAM = {
28715
28721
  review_check_budget_micro_usd: 5e6,
28716
28722
  /** A `video` origin build (§42.14): one raw clip and its characters, recast by Mira. */
28717
28723
  video: {
28718
- min_seconds: 3,
28724
+ /** The object swap refuses a clip under 4 s (§42.15). */
28725
+ min_seconds: 4,
28726
+ /** The longest part of a clip a render uses: a longer upload is taken and cut to its first 15 s (ADR-2204). */
28719
28727
  max_seconds: 15,
28720
28728
  video_max_bytes: 95 * 1024 * 1024,
28721
28729
  image_max_bytes: 10 * 1024 * 1024,
@@ -28723,8 +28731,8 @@ var CREATOR_PROGRAM = {
28723
28731
  characters_max: 3,
28724
28732
  /** After the first render. A refused or failed render does not use one up. */
28725
28733
  revisions: 5,
28726
- /** Per doomscroll account, until one of its templates is approved. */
28727
- unapproved_templates: 2,
28734
+ /** Per doomscroll account, until one of its templates is approved. Only drafts that rendered a video count. */
28735
+ unapproved_templates: 5,
28728
28736
  /** Upload tickets a doomscroll account may ask for, per template. */
28729
28737
  upload_tickets: 20,
28730
28738
  /** A draft never submitted loses its source and character bytes this long after `updated_at`. */
@@ -28852,8 +28860,11 @@ var StudioCharacterSchema = external_exports.object({
28852
28860
  file_id: external_exports.string().nullable(),
28853
28861
  bytes: external_exports.number().int().positive().max(CREATOR_PROGRAM.studio.video.image_max_bytes),
28854
28862
  content_type: StudioImageContentTypeSchema,
28855
- filename: external_exports.string().min(1).max(200)
28863
+ filename: external_exports.string().min(1).max(200),
28864
+ /** Who this is in the clip, in the creator's words ("the driver"): the render is told which photo is whom. */
28865
+ label: external_exports.string().min(1).max(80).optional()
28856
28866
  });
28867
+ var StudioEditModeSchema = external_exports.enum(["edit", "motion_transfer"]);
28857
28868
  var CreatorStudioSchema = external_exports.object({
28858
28869
  uploads: external_exports.array(StudioUploadSchema).max(CREATOR_PROGRAM.studio.uploads).default([]),
28859
28870
  /** `links`: built from 1–3 reel links (`imports`), prompts optional; `upload`: the creator's three videos; `video`: one raw clip recast by Mira (§42.14). */
@@ -28872,7 +28883,11 @@ var CreatorStudioSchema = external_exports.object({
28872
28883
  /** A `video` origin's raw clip, its characters, and the round submitted (§42.14). */
28873
28884
  source_video: StudioSourceVideoSchema.nullable().default(null),
28874
28885
  characters: external_exports.array(StudioCharacterSchema).max(CREATOR_PROGRAM.studio.video.characters_max).default([]),
28875
- chosen_round: external_exports.number().int().positive().nullable().default(null)
28886
+ chosen_round: external_exports.number().int().positive().nullable().default(null),
28887
+ /** A `video` origin's campaign mode (§42.15); absent on a draft made before modes, which reads as generic. */
28888
+ mode: VideoCreatorModeSchema.optional(),
28889
+ /** A `video` origin's kind of Mira edit (ADR-2410); absent is `edit`. Not `mode`, which is the campaign mode. */
28890
+ edit_mode: StudioEditModeSchema.optional()
28876
28891
  });
28877
28892
  var CreatorTemplateListingSchema = external_exports.object({
28878
28893
  listed: external_exports.boolean(),
@@ -29044,19 +29059,28 @@ var CreatorAnalyticsSchema = external_exports.object({
29044
29059
  var CreatorTemplateCreateKindSchema = external_exports.object({
29045
29060
  kind: CreatorTemplateKindSchema.default("crew"),
29046
29061
  /** `video` makes a draft built from one raw clip (§42.14); it needs `kind: niche`. */
29047
- origin: external_exports.literal("video").optional()
29062
+ origin: external_exports.literal("video").optional(),
29063
+ /** Required with `origin: "video"`: one of the creator's video modes (§42.15). */
29064
+ mode: VideoCreatorModeSchema.optional(),
29065
+ /** Only with `origin: "video"`: how its rounds are made on Mira (ADR-2410); absent is `edit`. */
29066
+ edit_mode: StudioEditModeSchema.optional()
29048
29067
  });
29049
29068
  var StudioUploadCreateSchema = external_exports.object({
29050
29069
  purpose: external_exports.enum(["source", "character"]).optional(),
29051
29070
  position: UploadPosition.optional(),
29052
29071
  filename: external_exports.string().min(1).max(200),
29053
29072
  content_type: external_exports.union([StudioUploadContentTypeSchema, StudioImageContentTypeSchema]),
29054
- bytes: external_exports.number().int().positive()
29073
+ bytes: external_exports.number().int().positive(),
29074
+ /** A `source` only: its length as the browser read it. Prices the render, held to the program's 4–15 s (§42.15). */
29075
+ seconds: external_exports.number().positive().max(600).optional(),
29076
+ /** A `character` only: who it is in the clip. */
29077
+ label: external_exports.string().trim().min(1).max(80).optional()
29055
29078
  }).superRefine((body2, ctx) => {
29056
29079
  const { video, upload_max_bytes } = CREATOR_PROGRAM.studio;
29057
29080
  const character2 = body2.purpose === "character";
29058
29081
  const issue2 = (path, message4) => ctx.addIssue({ code: "custom", path: [path], message: message4 });
29059
29082
  if (body2.purpose !== "source" && body2.position === void 0) issue2("position", "position is required");
29083
+ if (body2.label !== void 0 && !character2) issue2("label", "only a character takes a label");
29060
29084
  if (character2 !== StudioImageContentTypeSchema.safeParse(body2.content_type).success) {
29061
29085
  issue2("content_type", character2 ? "a character must be a PNG, JPEG or WebP image" : "this upload must be an MP4, MOV or WebM video");
29062
29086
  }
@@ -29097,8 +29121,16 @@ var CreatorStudioViewSchema = external_exports.object({
29097
29121
  studio: CreatorStudioSchema.extend({
29098
29122
  source_video: StudioSourceVideoSchema.extend({ url: external_exports.string().nullable().optional() }).nullable().default(null)
29099
29123
  }),
29100
- /** Newest first. A `video` round also carries a signed `sample_url`. */
29101
- rounds: external_exports.array(CreatorTemplateRoundSchema.extend({ sample_url: external_exports.string().nullable().optional() })),
29124
+ /**
29125
+ * Newest first. A `video` round also carries a signed `sample_url`; a `motion_transfer` build's ended
29126
+ * round carries `rendered_as`, how Mira made it (`edit` when the motion could not be copied, ADR-2410).
29127
+ */
29128
+ rounds: external_exports.array(
29129
+ CreatorTemplateRoundSchema.extend({
29130
+ sample_url: external_exports.string().nullable().optional(),
29131
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().optional()
29132
+ })
29133
+ ),
29102
29134
  budget: StudioBudgetSchema
29103
29135
  });
29104
29136
  var NicheSubmitSchema = external_exports.object({
@@ -30948,7 +30980,9 @@ var MusicGenerationSchema = external_exports.object({
30948
30980
  duration_seconds: Seconds2.nullable(),
30949
30981
  cost_micro_usd: MicroUsdField
30950
30982
  });
30951
- var EditModeSchema = external_exports.enum(["scene", "outfit_or_object", "person_swap", "recast"]);
30983
+ var EditModeSchema = external_exports.enum(["edit", "scene", "outfit_or_object", "person_swap", "recast", "motion_transfer"]).describe(
30984
+ `What kind of edit. "edit" (the default): the regular editor, reading what to do from the prompt. "scene", "outfit_or_object", "person_swap" and "recast" narrow it. "motion_transfer": copy the clip's exact motion onto the characters in the reference photos (fil_ images, at most 3 used), keeping the place; best for 5-15 s fights and dances; with 2-3 photos, start the prompt with <Character1>who photo 1 replaces<Character2>who photo 2 replaces and a new line. A clip it cannot take is made by the regular editor.`
30985
+ );
30952
30986
  var EditRequestSchema = external_exports.object({
30953
30987
  video: external_exports.string().min(1),
30954
30988
  prompt: external_exports.string().min(1).max(1e3),
@@ -30964,6 +30998,12 @@ var EditJobSchema = external_exports.object({
30964
30998
  prompt: external_exports.string(),
30965
30999
  references: external_exports.array(external_exports.string()),
30966
31000
  mode: EditModeSchema.nullable(),
31001
+ /**
31002
+ * How the finished edit was made: `motion_transfer` when the motion was copied, `edit` when the regular
31003
+ * editor made it (every other mode, or a motion transfer that fell back). `null` until it is completed, and
31004
+ * from a server older than the field.
31005
+ */
31006
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().default(null).describe("How the finished edit was made: motion_transfer, or edit (the regular editor). null until completed."),
30967
31007
  result: external_exports.object({ file_id: external_exports.string().startsWith("fil_") }).nullable(),
30968
31008
  error: external_exports.object({ code: EditFailureCodeSchema, message: external_exports.string() }).nullable(),
30969
31009
  cost_micro_usd: MicroUsdField.nullable(),
@@ -33960,6 +34000,10 @@ var PayoutDetailsSchema2 = external_exports.object({
33960
34000
  var CreatorStatusSchema2 = external_exports.enum(["active", "suspended", "archived"]);
33961
34001
  var CreatorSourceSchema2 = external_exports.enum(["youtube", "channel_license", "doomscroll"]);
33962
34002
  var CreatorStudioBudgetSchema2 = MicroUsdField2.positive().max(1e10);
34003
+ var CreatorModeSchema2 = external_exports.enum(["ai_clips", "sports_clips", "movie_clips", "dance_clips"]);
34004
+ var VIDEO_CREATOR_MODES2 = ["sports_clips", "movie_clips", "dance_clips"];
34005
+ var VideoCreatorModeSchema2 = external_exports.enum(VIDEO_CREATOR_MODES2);
34006
+ var CreatorModesSchema2 = external_exports.array(CreatorModeSchema2).min(1, "keep at least one account type").refine((modes) => new Set(modes).size === modes.length, "each account type at most once");
33963
34007
  var CreatorSchema2 = external_exports.object({
33964
34008
  id: idOf2("crt"),
33965
34009
  object: external_exports.literal("creator"),
@@ -33973,6 +34017,8 @@ var CreatorSchema2 = external_exports.object({
33973
34017
  clicks: external_exports.number().int().nonnegative(),
33974
34018
  /** This creator's per-draft studio cap, overriding `CREATOR_PROGRAM.studio`; `null` = the default. */
33975
34019
  studio_budget_micro_usd: CreatorStudioBudgetSchema2.nullable(),
34020
+ /** Its campaign modes (migration 0181); a row read before it parses as `ai_clips` only. */
34021
+ modes: CreatorModesSchema2.default(["ai_clips"]),
33976
34022
  created_at: Timestamp2,
33977
34023
  updated_at: Timestamp2
33978
34024
  });
@@ -34085,7 +34131,9 @@ var CREATOR_PROGRAM2 = {
34085
34131
  review_check_budget_micro_usd: 5e6,
34086
34132
  /** A `video` origin build (§42.14): one raw clip and its characters, recast by Mira. */
34087
34133
  video: {
34088
- min_seconds: 3,
34134
+ /** The object swap refuses a clip under 4 s (§42.15). */
34135
+ min_seconds: 4,
34136
+ /** The longest part of a clip a render uses: a longer upload is taken and cut to its first 15 s (ADR-2204). */
34089
34137
  max_seconds: 15,
34090
34138
  video_max_bytes: 95 * 1024 * 1024,
34091
34139
  image_max_bytes: 10 * 1024 * 1024,
@@ -34093,8 +34141,8 @@ var CREATOR_PROGRAM2 = {
34093
34141
  characters_max: 3,
34094
34142
  /** After the first render. A refused or failed render does not use one up. */
34095
34143
  revisions: 5,
34096
- /** Per doomscroll account, until one of its templates is approved. */
34097
- unapproved_templates: 2,
34144
+ /** Per doomscroll account, until one of its templates is approved. Only drafts that rendered a video count. */
34145
+ unapproved_templates: 5,
34098
34146
  /** Upload tickets a doomscroll account may ask for, per template. */
34099
34147
  upload_tickets: 20,
34100
34148
  /** A draft never submitted loses its source and character bytes this long after `updated_at`. */
@@ -34222,8 +34270,11 @@ var StudioCharacterSchema2 = external_exports.object({
34222
34270
  file_id: external_exports.string().nullable(),
34223
34271
  bytes: external_exports.number().int().positive().max(CREATOR_PROGRAM2.studio.video.image_max_bytes),
34224
34272
  content_type: StudioImageContentTypeSchema2,
34225
- filename: external_exports.string().min(1).max(200)
34273
+ filename: external_exports.string().min(1).max(200),
34274
+ /** Who this is in the clip, in the creator's words ("the driver"): the render is told which photo is whom. */
34275
+ label: external_exports.string().min(1).max(80).optional()
34226
34276
  });
34277
+ var StudioEditModeSchema2 = external_exports.enum(["edit", "motion_transfer"]);
34227
34278
  var CreatorStudioSchema2 = external_exports.object({
34228
34279
  uploads: external_exports.array(StudioUploadSchema2).max(CREATOR_PROGRAM2.studio.uploads).default([]),
34229
34280
  /** `links`: built from 1–3 reel links (`imports`), prompts optional; `upload`: the creator's three videos; `video`: one raw clip recast by Mira (§42.14). */
@@ -34242,7 +34293,11 @@ var CreatorStudioSchema2 = external_exports.object({
34242
34293
  /** A `video` origin's raw clip, its characters, and the round submitted (§42.14). */
34243
34294
  source_video: StudioSourceVideoSchema2.nullable().default(null),
34244
34295
  characters: external_exports.array(StudioCharacterSchema2).max(CREATOR_PROGRAM2.studio.video.characters_max).default([]),
34245
- chosen_round: external_exports.number().int().positive().nullable().default(null)
34296
+ chosen_round: external_exports.number().int().positive().nullable().default(null),
34297
+ /** A `video` origin's campaign mode (§42.15); absent on a draft made before modes, which reads as generic. */
34298
+ mode: VideoCreatorModeSchema2.optional(),
34299
+ /** A `video` origin's kind of Mira edit (ADR-2410); absent is `edit`. Not `mode`, which is the campaign mode. */
34300
+ edit_mode: StudioEditModeSchema2.optional()
34246
34301
  });
34247
34302
  var CreatorTemplateListingSchema2 = external_exports.object({
34248
34303
  listed: external_exports.boolean(),
@@ -34414,19 +34469,28 @@ var CreatorAnalyticsSchema2 = external_exports.object({
34414
34469
  var CreatorTemplateCreateKindSchema2 = external_exports.object({
34415
34470
  kind: CreatorTemplateKindSchema2.default("crew"),
34416
34471
  /** `video` makes a draft built from one raw clip (§42.14); it needs `kind: niche`. */
34417
- origin: external_exports.literal("video").optional()
34472
+ origin: external_exports.literal("video").optional(),
34473
+ /** Required with `origin: "video"`: one of the creator's video modes (§42.15). */
34474
+ mode: VideoCreatorModeSchema2.optional(),
34475
+ /** Only with `origin: "video"`: how its rounds are made on Mira (ADR-2410); absent is `edit`. */
34476
+ edit_mode: StudioEditModeSchema2.optional()
34418
34477
  });
34419
34478
  var StudioUploadCreateSchema2 = external_exports.object({
34420
34479
  purpose: external_exports.enum(["source", "character"]).optional(),
34421
34480
  position: UploadPosition2.optional(),
34422
34481
  filename: external_exports.string().min(1).max(200),
34423
34482
  content_type: external_exports.union([StudioUploadContentTypeSchema2, StudioImageContentTypeSchema2]),
34424
- bytes: external_exports.number().int().positive()
34483
+ bytes: external_exports.number().int().positive(),
34484
+ /** A `source` only: its length as the browser read it. Prices the render, held to the program's 4–15 s (§42.15). */
34485
+ seconds: external_exports.number().positive().max(600).optional(),
34486
+ /** A `character` only: who it is in the clip. */
34487
+ label: external_exports.string().trim().min(1).max(80).optional()
34425
34488
  }).superRefine((body2, ctx) => {
34426
34489
  const { video, upload_max_bytes } = CREATOR_PROGRAM2.studio;
34427
34490
  const character2 = body2.purpose === "character";
34428
34491
  const issue2 = (path, message4) => ctx.addIssue({ code: "custom", path: [path], message: message4 });
34429
34492
  if (body2.purpose !== "source" && body2.position === void 0) issue2("position", "position is required");
34493
+ if (body2.label !== void 0 && !character2) issue2("label", "only a character takes a label");
34430
34494
  if (character2 !== StudioImageContentTypeSchema2.safeParse(body2.content_type).success) {
34431
34495
  issue2("content_type", character2 ? "a character must be a PNG, JPEG or WebP image" : "this upload must be an MP4, MOV or WebM video");
34432
34496
  }
@@ -34467,8 +34531,16 @@ var CreatorStudioViewSchema2 = external_exports.object({
34467
34531
  studio: CreatorStudioSchema2.extend({
34468
34532
  source_video: StudioSourceVideoSchema2.extend({ url: external_exports.string().nullable().optional() }).nullable().default(null)
34469
34533
  }),
34470
- /** Newest first. A `video` round also carries a signed `sample_url`. */
34471
- rounds: external_exports.array(CreatorTemplateRoundSchema2.extend({ sample_url: external_exports.string().nullable().optional() })),
34534
+ /**
34535
+ * Newest first. A `video` round also carries a signed `sample_url`; a `motion_transfer` build's ended
34536
+ * round carries `rendered_as`, how Mira made it (`edit` when the motion could not be copied, ADR-2410).
34537
+ */
34538
+ rounds: external_exports.array(
34539
+ CreatorTemplateRoundSchema2.extend({
34540
+ sample_url: external_exports.string().nullable().optional(),
34541
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().optional()
34542
+ })
34543
+ ),
34472
34544
  budget: StudioBudgetSchema2
34473
34545
  });
34474
34546
  var NicheSubmitSchema2 = external_exports.object({
@@ -36275,7 +36347,9 @@ var MusicGenerationSchema2 = external_exports.object({
36275
36347
  duration_seconds: Seconds22.nullable(),
36276
36348
  cost_micro_usd: MicroUsdField2
36277
36349
  });
36278
- var EditModeSchema2 = external_exports.enum(["scene", "outfit_or_object", "person_swap", "recast"]);
36350
+ var EditModeSchema2 = external_exports.enum(["edit", "scene", "outfit_or_object", "person_swap", "recast", "motion_transfer"]).describe(
36351
+ `What kind of edit. "edit" (the default): the regular editor, reading what to do from the prompt. "scene", "outfit_or_object", "person_swap" and "recast" narrow it. "motion_transfer": copy the clip's exact motion onto the characters in the reference photos (fil_ images, at most 3 used), keeping the place; best for 5-15 s fights and dances; with 2-3 photos, start the prompt with <Character1>who photo 1 replaces<Character2>who photo 2 replaces and a new line. A clip it cannot take is made by the regular editor.`
36352
+ );
36279
36353
  var EditRequestSchema2 = external_exports.object({
36280
36354
  video: external_exports.string().min(1),
36281
36355
  prompt: external_exports.string().min(1).max(1e3),
@@ -36291,6 +36365,12 @@ var EditJobSchema2 = external_exports.object({
36291
36365
  prompt: external_exports.string(),
36292
36366
  references: external_exports.array(external_exports.string()),
36293
36367
  mode: EditModeSchema2.nullable(),
36368
+ /**
36369
+ * How the finished edit was made: `motion_transfer` when the motion was copied, `edit` when the regular
36370
+ * editor made it (every other mode, or a motion transfer that fell back). `null` until it is completed, and
36371
+ * from a server older than the field.
36372
+ */
36373
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().default(null).describe("How the finished edit was made: motion_transfer, or edit (the regular editor). null until completed."),
36294
36374
  result: external_exports.object({ file_id: external_exports.string().startsWith("fil_") }).nullable(),
36295
36375
  error: external_exports.object({ code: EditFailureCodeSchema2, message: external_exports.string() }).nullable(),
36296
36376
  cost_micro_usd: MicroUsdField2.nullable(),
@@ -39216,6 +39296,21 @@ var ExecResultSchema = external_exports.object({
39216
39296
  truncated: external_exports.boolean().optional()
39217
39297
  });
39218
39298
  var DirectorySchema = external_exports.object({ entries: external_exports.array(FileEntrySchema2) });
39299
+ async function* untilExit(path, frames2) {
39300
+ let exited = false;
39301
+ for await (const frame of frames2) {
39302
+ if ("exit" in frame) exited = true;
39303
+ yield frame;
39304
+ }
39305
+ if (!exited) {
39306
+ throw new ApiError(502, {
39307
+ type: "api_error",
39308
+ code: "internal_error",
39309
+ message: `POST ${path} ended without an exit frame; the command may have run \u2014 check GET \u2026/commands before re-running it`,
39310
+ request_id: ""
39311
+ });
39312
+ }
39313
+ }
39219
39314
  var workspace = (config2) => ({
39220
39315
  /** The name, and nothing else (§41.5). */
39221
39316
  update: (id, body2) => request(config2, ComputerSchema2, { method: "PATCH", path: `/v1/computers/${encodeURIComponent(id)}`, body: body2 }),
@@ -39225,11 +39320,14 @@ var workspace = (config2) => ({
39225
39320
  * The same run as `exec`, frame by frame (§41.2): `{stdout}`/`{stderr}` as they arrive, then one
39226
39321
  * `{exit}` naming the `computer_command` row it was recorded as. One connection, no resume.
39227
39322
  */
39228
- execStream: (id, command, opts = {}) => streamFrames(config2, ExecStreamFrameSchema2, {
39229
- method: "POST",
39230
- path: `/v1/computers/${encodeURIComponent(id)}/exec/stream`,
39231
- body: { command, ...opts.timeoutMs === void 0 ? {} : { timeout_ms: opts.timeoutMs } }
39232
- }),
39323
+ execStream: (id, command, opts = {}) => {
39324
+ const body2 = { command, ...opts.timeoutMs === void 0 ? {} : { timeout_ms: opts.timeoutMs } };
39325
+ return untilExit(`/v1/computers/${encodeURIComponent(id)}/exec/stream`, streamFrames(config2, ExecStreamFrameSchema2, {
39326
+ method: "POST",
39327
+ path: `/v1/computers/${encodeURIComponent(id)}/exec/stream`,
39328
+ body: body2
39329
+ }));
39330
+ },
39233
39331
  /** What has been run on the box, newest first (§41.3). */
39234
39332
  commands: (id, query2 = {}) => request(config2, page(ComputerCommandSchema2), {
39235
39333
  method: "GET",
@@ -42966,6 +43064,10 @@ var PayoutDetailsSchema3 = external_exports.object({
42966
43064
  var CreatorStatusSchema3 = external_exports.enum(["active", "suspended", "archived"]);
42967
43065
  var CreatorSourceSchema3 = external_exports.enum(["youtube", "channel_license", "doomscroll"]);
42968
43066
  var CreatorStudioBudgetSchema3 = MicroUsdField3.positive().max(1e10);
43067
+ var CreatorModeSchema3 = external_exports.enum(["ai_clips", "sports_clips", "movie_clips", "dance_clips"]);
43068
+ var VIDEO_CREATOR_MODES3 = ["sports_clips", "movie_clips", "dance_clips"];
43069
+ var VideoCreatorModeSchema3 = external_exports.enum(VIDEO_CREATOR_MODES3);
43070
+ var CreatorModesSchema3 = external_exports.array(CreatorModeSchema3).min(1, "keep at least one account type").refine((modes) => new Set(modes).size === modes.length, "each account type at most once");
42969
43071
  var CreatorSchema3 = external_exports.object({
42970
43072
  id: idOf3("crt"),
42971
43073
  object: external_exports.literal("creator"),
@@ -42979,6 +43081,8 @@ var CreatorSchema3 = external_exports.object({
42979
43081
  clicks: external_exports.number().int().nonnegative(),
42980
43082
  /** This creator's per-draft studio cap, overriding `CREATOR_PROGRAM.studio`; `null` = the default. */
42981
43083
  studio_budget_micro_usd: CreatorStudioBudgetSchema3.nullable(),
43084
+ /** Its campaign modes (migration 0181); a row read before it parses as `ai_clips` only. */
43085
+ modes: CreatorModesSchema3.default(["ai_clips"]),
42982
43086
  created_at: Timestamp3,
42983
43087
  updated_at: Timestamp3
42984
43088
  });
@@ -43091,7 +43195,9 @@ var CREATOR_PROGRAM3 = {
43091
43195
  review_check_budget_micro_usd: 5e6,
43092
43196
  /** A `video` origin build (§42.14): one raw clip and its characters, recast by Mira. */
43093
43197
  video: {
43094
- min_seconds: 3,
43198
+ /** The object swap refuses a clip under 4 s (§42.15). */
43199
+ min_seconds: 4,
43200
+ /** The longest part of a clip a render uses: a longer upload is taken and cut to its first 15 s (ADR-2204). */
43095
43201
  max_seconds: 15,
43096
43202
  video_max_bytes: 95 * 1024 * 1024,
43097
43203
  image_max_bytes: 10 * 1024 * 1024,
@@ -43099,8 +43205,8 @@ var CREATOR_PROGRAM3 = {
43099
43205
  characters_max: 3,
43100
43206
  /** After the first render. A refused or failed render does not use one up. */
43101
43207
  revisions: 5,
43102
- /** Per doomscroll account, until one of its templates is approved. */
43103
- unapproved_templates: 2,
43208
+ /** Per doomscroll account, until one of its templates is approved. Only drafts that rendered a video count. */
43209
+ unapproved_templates: 5,
43104
43210
  /** Upload tickets a doomscroll account may ask for, per template. */
43105
43211
  upload_tickets: 20,
43106
43212
  /** A draft never submitted loses its source and character bytes this long after `updated_at`. */
@@ -43228,8 +43334,11 @@ var StudioCharacterSchema3 = external_exports.object({
43228
43334
  file_id: external_exports.string().nullable(),
43229
43335
  bytes: external_exports.number().int().positive().max(CREATOR_PROGRAM3.studio.video.image_max_bytes),
43230
43336
  content_type: StudioImageContentTypeSchema3,
43231
- filename: external_exports.string().min(1).max(200)
43337
+ filename: external_exports.string().min(1).max(200),
43338
+ /** Who this is in the clip, in the creator's words ("the driver"): the render is told which photo is whom. */
43339
+ label: external_exports.string().min(1).max(80).optional()
43232
43340
  });
43341
+ var StudioEditModeSchema3 = external_exports.enum(["edit", "motion_transfer"]);
43233
43342
  var CreatorStudioSchema3 = external_exports.object({
43234
43343
  uploads: external_exports.array(StudioUploadSchema3).max(CREATOR_PROGRAM3.studio.uploads).default([]),
43235
43344
  /** `links`: built from 1–3 reel links (`imports`), prompts optional; `upload`: the creator's three videos; `video`: one raw clip recast by Mira (§42.14). */
@@ -43248,7 +43357,11 @@ var CreatorStudioSchema3 = external_exports.object({
43248
43357
  /** A `video` origin's raw clip, its characters, and the round submitted (§42.14). */
43249
43358
  source_video: StudioSourceVideoSchema3.nullable().default(null),
43250
43359
  characters: external_exports.array(StudioCharacterSchema3).max(CREATOR_PROGRAM3.studio.video.characters_max).default([]),
43251
- chosen_round: external_exports.number().int().positive().nullable().default(null)
43360
+ chosen_round: external_exports.number().int().positive().nullable().default(null),
43361
+ /** A `video` origin's campaign mode (§42.15); absent on a draft made before modes, which reads as generic. */
43362
+ mode: VideoCreatorModeSchema3.optional(),
43363
+ /** A `video` origin's kind of Mira edit (ADR-2410); absent is `edit`. Not `mode`, which is the campaign mode. */
43364
+ edit_mode: StudioEditModeSchema3.optional()
43252
43365
  });
43253
43366
  var CreatorTemplateListingSchema3 = external_exports.object({
43254
43367
  listed: external_exports.boolean(),
@@ -43420,19 +43533,28 @@ var CreatorAnalyticsSchema3 = external_exports.object({
43420
43533
  var CreatorTemplateCreateKindSchema3 = external_exports.object({
43421
43534
  kind: CreatorTemplateKindSchema3.default("crew"),
43422
43535
  /** `video` makes a draft built from one raw clip (§42.14); it needs `kind: niche`. */
43423
- origin: external_exports.literal("video").optional()
43536
+ origin: external_exports.literal("video").optional(),
43537
+ /** Required with `origin: "video"`: one of the creator's video modes (§42.15). */
43538
+ mode: VideoCreatorModeSchema3.optional(),
43539
+ /** Only with `origin: "video"`: how its rounds are made on Mira (ADR-2410); absent is `edit`. */
43540
+ edit_mode: StudioEditModeSchema3.optional()
43424
43541
  });
43425
43542
  var StudioUploadCreateSchema3 = external_exports.object({
43426
43543
  purpose: external_exports.enum(["source", "character"]).optional(),
43427
43544
  position: UploadPosition3.optional(),
43428
43545
  filename: external_exports.string().min(1).max(200),
43429
43546
  content_type: external_exports.union([StudioUploadContentTypeSchema3, StudioImageContentTypeSchema3]),
43430
- bytes: external_exports.number().int().positive()
43547
+ bytes: external_exports.number().int().positive(),
43548
+ /** A `source` only: its length as the browser read it. Prices the render, held to the program's 4–15 s (§42.15). */
43549
+ seconds: external_exports.number().positive().max(600).optional(),
43550
+ /** A `character` only: who it is in the clip. */
43551
+ label: external_exports.string().trim().min(1).max(80).optional()
43431
43552
  }).superRefine((body2, ctx) => {
43432
43553
  const { video, upload_max_bytes } = CREATOR_PROGRAM3.studio;
43433
43554
  const character2 = body2.purpose === "character";
43434
43555
  const issue2 = (path, message32) => ctx.addIssue({ code: "custom", path: [path], message: message32 });
43435
43556
  if (body2.purpose !== "source" && body2.position === void 0) issue2("position", "position is required");
43557
+ if (body2.label !== void 0 && !character2) issue2("label", "only a character takes a label");
43436
43558
  if (character2 !== StudioImageContentTypeSchema3.safeParse(body2.content_type).success) {
43437
43559
  issue2("content_type", character2 ? "a character must be a PNG, JPEG or WebP image" : "this upload must be an MP4, MOV or WebM video");
43438
43560
  }
@@ -43473,8 +43595,16 @@ var CreatorStudioViewSchema3 = external_exports.object({
43473
43595
  studio: CreatorStudioSchema3.extend({
43474
43596
  source_video: StudioSourceVideoSchema3.extend({ url: external_exports.string().nullable().optional() }).nullable().default(null)
43475
43597
  }),
43476
- /** Newest first. A `video` round also carries a signed `sample_url`. */
43477
- rounds: external_exports.array(CreatorTemplateRoundSchema3.extend({ sample_url: external_exports.string().nullable().optional() })),
43598
+ /**
43599
+ * Newest first. A `video` round also carries a signed `sample_url`; a `motion_transfer` build's ended
43600
+ * round carries `rendered_as`, how Mira made it (`edit` when the motion could not be copied, ADR-2410).
43601
+ */
43602
+ rounds: external_exports.array(
43603
+ CreatorTemplateRoundSchema3.extend({
43604
+ sample_url: external_exports.string().nullable().optional(),
43605
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().optional()
43606
+ })
43607
+ ),
43478
43608
  budget: StudioBudgetSchema3
43479
43609
  });
43480
43610
  var NicheSubmitSchema3 = external_exports.object({
@@ -45287,7 +45417,9 @@ var MusicGenerationSchema3 = external_exports.object({
45287
45417
  duration_seconds: Seconds23.nullable(),
45288
45418
  cost_micro_usd: MicroUsdField3
45289
45419
  });
45290
- var EditModeSchema3 = external_exports.enum(["scene", "outfit_or_object", "person_swap", "recast"]);
45420
+ var EditModeSchema3 = external_exports.enum(["edit", "scene", "outfit_or_object", "person_swap", "recast", "motion_transfer"]).describe(
45421
+ `What kind of edit. "edit" (the default): the regular editor, reading what to do from the prompt. "scene", "outfit_or_object", "person_swap" and "recast" narrow it. "motion_transfer": copy the clip's exact motion onto the characters in the reference photos (fil_ images, at most 3 used), keeping the place; best for 5-15 s fights and dances; with 2-3 photos, start the prompt with <Character1>who photo 1 replaces<Character2>who photo 2 replaces and a new line. A clip it cannot take is made by the regular editor.`
45422
+ );
45291
45423
  var EditRequestSchema3 = external_exports.object({
45292
45424
  video: external_exports.string().min(1),
45293
45425
  prompt: external_exports.string().min(1).max(1e3),
@@ -45303,6 +45435,12 @@ var EditJobSchema3 = external_exports.object({
45303
45435
  prompt: external_exports.string(),
45304
45436
  references: external_exports.array(external_exports.string()),
45305
45437
  mode: EditModeSchema3.nullable(),
45438
+ /**
45439
+ * How the finished edit was made: `motion_transfer` when the motion was copied, `edit` when the regular
45440
+ * editor made it (every other mode, or a motion transfer that fell back). `null` until it is completed, and
45441
+ * from a server older than the field.
45442
+ */
45443
+ rendered_as: external_exports.enum(["edit", "motion_transfer"]).nullable().default(null).describe("How the finished edit was made: motion_transfer, or edit (the regular editor). null until completed."),
45306
45444
  result: external_exports.object({ file_id: external_exports.string().startsWith("fil_") }).nullable(),
45307
45445
  error: external_exports.object({ code: EditFailureCodeSchema3, message: external_exports.string() }).nullable(),
45308
45446
  cost_micro_usd: MicroUsdField3.nullable(),
@@ -48955,12 +49093,11 @@ var media6 = {
48955
49093
  ...args.bool("loop") ? { loop: true } : {}
48956
49094
  })
48957
49095
  }),
48958
- // §55: `naive media edit "<prompt>" --video <fil_|url>`. `--wait` follows the edit job.
49096
+ // §55: `naive media edit "<prompt>" --video <fil_|url>`. `--wait` follows the edit job. `--mode` is
49097
+ // `edit` (the default) or a narrower mode, or `motion_transfer`, which copies the clip's exact motion onto
49098
+ // the characters in the `--reference` photos (ADR-2410).
48959
49099
  edit: async ({ client, args }) => {
48960
- const mode = args.str("mode");
48961
- if (mode !== void 0 && mode !== "scene" && mode !== "outfit_or_object" && mode !== "person_swap" && mode !== "recast") {
48962
- throw new UsageError("--mode must be scene, outfit_or_object, person_swap or recast");
48963
- }
49100
+ const mode = editMode(args.str("mode"));
48964
49101
  const references = args.list("reference");
48965
49102
  let job = await client.media.edits.create({
48966
49103
  video: args.need("video"),
@@ -48996,6 +49133,13 @@ var media6 = {
48996
49133
  })
48997
49134
  })
48998
49135
  };
49136
+ var EDIT_MODES = ["edit", "scene", "outfit_or_object", "person_swap", "recast", "motion_transfer"];
49137
+ function editMode(mode) {
49138
+ if (mode === void 0) return void 0;
49139
+ const known = EDIT_MODES.find((value) => value === mode);
49140
+ if (known !== void 0) return known;
49141
+ throw new UsageError("--mode must be edit, scene, outfit_or_object, person_swap, recast or motion_transfer");
49142
+ }
48999
49143
  function jobKind(kind) {
49000
49144
  if (kind === void 0 || kind === "video" || kind === "clip" || kind === "transcription" || kind === "mesh")
49001
49145
  return kind;
@@ -51479,7 +51623,8 @@ var FLAGS = {
51479
51623
  "sound-effect": "seconds loop",
51480
51624
  // core-gaps: U12-music — prompt is the positional; `--seconds` (3–300) and `--instrumental` are optional.
51481
51625
  music: "seconds instrumental",
51482
- // §55: a Mira edit. Prompt is the positional; `--video` is the clip, `--reference` repeats.
51626
+ // §55: a Mira edit. Prompt is the positional; `--video` is the clip, `--reference` repeats; `--mode` is
51627
+ // edit (default), scene, outfit_or_object, person_swap, recast or motion_transfer (ADR-2410).
51483
51628
  edit: "video reference mode wait",
51484
51629
  show: "",
51485
51630
  list: "kind status session limit after"
@@ -51875,7 +52020,7 @@ var ALIASES = {
51875
52020
  };
51876
52021
 
51877
52022
  // src/cli.ts
51878
- var VERSION = true ? "1.0.2" : "0.0.0-dev";
52023
+ var VERSION = true ? "1.0.4" : "0.0.0-dev";
51879
52024
  var GLOBAL_FLAGS_HELP = "global flags: --json (default) --human --profile <name> --api-key <key> --org <org_id> --api-base-url <url>";
51880
52025
  function usage() {
51881
52026
  const groups = [...Object.keys(GROUPS), ...Object.keys(ALIASES)].sort().join(", ");
@@ -51949,9 +52094,13 @@ function clients(deps2, baseUrl) {
51949
52094
  const fetch = namingHost(deps2.fetch, baseUrl);
51950
52095
  return (apiKey) => createClient({ baseUrl, apiKey, fetch, idempotencyKey: deps2.idempotencyKey });
51951
52096
  }
52097
+ function argvKeyWarning(flag) {
52098
+ return `warning: ${flag} leaves the key in shell history and, under npx, in ~/.npm/_logs; pipe it on stdin (read -rs KEY && printf '%s\\n' "$KEY" | naive login) or set NAIVE_API_KEY`;
52099
+ }
51952
52100
  async function run(argv, deps2) {
51953
52101
  const parsed = parseLine(argv);
51954
52102
  const first = parsed.words[0] ?? "";
52103
+ let argvKey;
51955
52104
  try {
51956
52105
  if (parsed.args(2).bool("version")) {
51957
52106
  deps2.io.out(`naive ${VERSION} (api ${API_VERSION})`);
@@ -51972,6 +52121,8 @@ async function run(argv, deps2) {
51972
52121
  const args = parsed.args(sub2 ? 3 : alias ? 1 : 2);
51973
52122
  rejectUnknownFlags(args.names(), group, command);
51974
52123
  const config2 = resolveConfig(args, deps2.env, deps2.readConfig, { login: group === "auth" && command === "login" });
52124
+ const claimKey = group === "naive" && command === "claim" && args.str("key") !== void 0;
52125
+ argvKey = args.str("api-key") !== void 0 ? "--api-key" : claimKey ? "--key" : void 0;
51975
52126
  if (config2.apiKey === "" && group !== "auth" && group !== "naive") throw new UsageError(NO_API_KEY);
51976
52127
  const withApiKey = clients(deps2, config2.baseUrl);
51977
52128
  const human2 = args.bool("human");
@@ -51988,6 +52139,8 @@ async function run(argv, deps2) {
51988
52139
  } catch (cause) {
51989
52140
  deps2.io.err(describeError(cause));
51990
52141
  return exitForError(cause);
52142
+ } finally {
52143
+ if (argvKey !== void 0) deps2.io.err(argvKeyWarning(argvKey));
51991
52144
  }
51992
52145
  }
51993
52146
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usenaive-sdk/cli",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Naive Managed Agents command line — create agents, run sessions, watch events, see cost.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,8 +27,8 @@
27
27
  "esbuild": "0.28.2",
28
28
  "yaml": "^2.9.0",
29
29
  "@vetta/core": "0.0.0",
30
- "@usenaive-sdk/managed-agents": "0.12.2",
31
- "@usenaive-sdk/blueprints": "0.18.0"
30
+ "@usenaive-sdk/blueprints": "0.18.0",
31
+ "@usenaive-sdk/managed-agents": "0.12.4"
32
32
  },
33
33
  "scripts": {
34
34
  "build": "node build.mjs",