@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.
- package/dist/index.js +195 -42
- 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
|
-
|
|
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:
|
|
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
|
-
/**
|
|
29101
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
/**
|
|
34471
|
-
|
|
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 = {}) =>
|
|
39229
|
-
|
|
39230
|
-
|
|
39231
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
/**
|
|
43477
|
-
|
|
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.
|
|
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.
|
|
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/
|
|
31
|
-
"@usenaive-sdk/
|
|
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",
|