@melius-ai/cli 0.10.1 → 0.12.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/README.md CHANGED
@@ -228,6 +228,21 @@ mel template apply <canvasId> <templateId> \
228
228
  mel bulk-run start <canvasId> --node-ids <groupId> --wait
229
229
  ```
230
230
 
231
+ Each `--inputs` entry targets an input `portId` from `mel template list`. Three kinds are supported (`mediaType` is `image`, `video`, `audio`, or `pdf`):
232
+
233
+ | Kind | Shape | Use for |
234
+ | ---------- | --------------------------------- | ------------------------------------------------------------ |
235
+ | `text` | `{kind,portId,text}` | A text prompt/value |
236
+ | `asset` | `{kind,portId,assetId,mediaType}` | A stored library asset (from `mel asset search`) |
237
+ | `assetUrl` | `{kind,portId,url,mediaType}` | A remote media URL — fetched and stored server-side on apply |
238
+
239
+ `assetUrl` lets you wire an image already hosted on your own site (e.g. a product image) without a separate upload round-trip:
240
+
241
+ ```bash
242
+ mel template apply <canvasId> <templateId> \
243
+ --inputs '[{"kind":"assetUrl","portId":"<portId>","url":"https://example.com/image.jpg","mediaType":"image"}]'
244
+ ```
245
+
231
246
  ### Models
232
247
 
233
248
  | Command | Description |
@@ -0,0 +1,93 @@
1
+ # Third-party notices
2
+
3
+ `@melius-ai/cli` is distributed as a bundle: the source of the packages below
4
+ is compiled into `dist` and redistributed inside the npm tarball. Their
5
+ licenses and copyright notices are reproduced here as those licenses require.
6
+
7
+ Generated by `pnpm --filter @melius-ai/cli run notices` from the build output —
8
+ do not edit by hand. `test/bundle-licenses.test.ts` fails when it drifts.
9
+
10
+ ## @ts-rest/core@3.52.1
11
+
12
+ License: MIT
13
+
14
+ ```
15
+ MIT License
16
+
17
+ Copyright (c) 2022 Oliver Butler
18
+
19
+ Permission is hereby granted, free of charge, to any person obtaining a copy
20
+ of this software and associated documentation files (the "Software"), to deal
21
+ in the Software without restriction, including without limitation the rights
22
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23
+ copies of the Software, and to permit persons to whom the Software is
24
+ furnished to do so, subject to the following conditions:
25
+
26
+ The above copyright notice and this permission notice shall be included in all
27
+ copies or substantial portions of the Software.
28
+
29
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35
+ SOFTWARE.
36
+ ```
37
+
38
+ ## commander@13.1.0
39
+
40
+ License: MIT
41
+
42
+ ```
43
+ (The MIT License)
44
+
45
+ Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
46
+
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of this software and associated documentation files (the
49
+ 'Software'), to deal in the Software without restriction, including
50
+ without limitation the rights to use, copy, modify, merge, publish,
51
+ distribute, sublicense, and/or sell copies of the Software, and to
52
+ permit persons to whom the Software is furnished to do so, subject to
53
+ the following conditions:
54
+
55
+ The above copyright notice and this permission notice shall be
56
+ included in all copies or substantial portions of the Software.
57
+
58
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
59
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
61
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
62
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
63
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
64
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
65
+ ```
66
+
67
+ ## zod@3.25.76
68
+
69
+ License: MIT
70
+
71
+ ```
72
+ MIT License
73
+
74
+ Copyright (c) 2025 Colin McDonnell
75
+
76
+ Permission is hereby granted, free of charge, to any person obtaining a copy
77
+ of this software and associated documentation files (the "Software"), to deal
78
+ in the Software without restriction, including without limitation the rights
79
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
80
+ copies of the Software, and to permit persons to whom the Software is
81
+ furnished to do so, subject to the following conditions:
82
+
83
+ The above copyright notice and this permission notice shall be included in all
84
+ copies or substantial portions of the Software.
85
+
86
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
87
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
88
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
89
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
90
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
91
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
92
+ SOFTWARE.
93
+ ```
package/dist/bin/mel.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  printUpgradeNoticeIfNeeded,
8
8
  withDefaultHelp,
9
9
  writeError
10
- } from "../chunk-NNJE574V.js";
10
+ } from "../chunk-2PWVQ3PC.js";
11
11
 
12
12
  // bin/mel.ts
13
13
  var program = createProgram();
@@ -7740,6 +7740,7 @@ var MAX_VARIATIONS = 10;
7740
7740
 
7741
7741
  // ../api-contract/src/common.ts
7742
7742
  var MessageResponseSchema = external_exports.object({ message: external_exports.string() });
7743
+ var ShareVisibilitySchema = external_exports.enum(["team", "anyone"]);
7743
7744
  var CompletedPartSchema = external_exports.object({
7744
7745
  partNumber: external_exports.number().int().positive(),
7745
7746
  etag: external_exports.string()
@@ -7912,7 +7913,7 @@ var FileTypeSchema = external_exports.enum([
7912
7913
  "pdf",
7913
7914
  "text"
7914
7915
  ]);
7915
- var AssetShareModeSchema = external_exports.enum(["team", "anyone"]);
7916
+ var AssetShareModeSchema = ShareVisibilitySchema;
7916
7917
  var TAG_COLOR_PALETTE = [
7917
7918
  "hsl(189deg, 72%, 46%)",
7918
7919
  "hsl(280deg, 60%, 50%)",
@@ -7979,7 +7980,14 @@ var FileCardSchema = external_exports.object({
7979
7980
  var FileGenerationSchema = external_exports.object({
7980
7981
  prompt: external_exports.string().nullable(),
7981
7982
  modelDisplayName: external_exports.string().nullable(),
7982
- aspectRatio: external_exports.string().nullable()
7983
+ aspectRatio: external_exports.string().nullable(),
7984
+ /** The node tool that produced the asset (e.g. `video-background-removal`),
7985
+ * when it came from a tool run rather than a plain model generation. The
7986
+ * viewer labels the row "Tool used" instead of "Model" when set.
7987
+ *
7988
+ * Optional so a client that ships ahead of the server keeps validating —
7989
+ * absent reads the same as "not a tool run". */
7990
+ sourceToolName: external_exports.string().nullable().optional()
7983
7991
  });
7984
7992
  var FileDetailSchema = FileCardSchema.extend({
7985
7993
  width: external_exports.number().int().nullable(),
@@ -8216,6 +8224,18 @@ var CompleteFilesUploadBodySchema = external_exports.object({
8216
8224
  var CompleteFilesUploadResponseSchema = external_exports.object({
8217
8225
  file: FileCardSchema
8218
8226
  });
8227
+ var ImportUploadcareFileBodySchema = external_exports.object({
8228
+ uuid: external_exports.string().uuid(),
8229
+ folderId: external_exports.string().uuid().nullable().optional()
8230
+ });
8231
+ var ImportUploadcareFileResponseSchema = external_exports.object({
8232
+ file: FileCardSchema
8233
+ });
8234
+ var UploadcareUploadSignatureResponseSchema = external_exports.object({
8235
+ signature: external_exports.string(),
8236
+ /** Unix seconds, as a string — the exact bytes that were signed. */
8237
+ expire: external_exports.string()
8238
+ });
8219
8239
  var EmbeddingStorageUsageResponseSchema = external_exports.object({
8220
8240
  usedBytes: external_exports.number(),
8221
8241
  limitBytes: external_exports.number()
@@ -8601,6 +8621,28 @@ var filesContract = c2.router({
8601
8621
  403: ErrorBodySchema
8602
8622
  },
8603
8623
  summary: "Complete a Files upload"
8624
+ },
8625
+ createUploadcareUploadSignature: {
8626
+ method: "POST",
8627
+ path: "/files/import/uploadcare/signature",
8628
+ body: external_exports.object({}),
8629
+ responses: {
8630
+ 200: UploadcareUploadSignatureResponseSchema,
8631
+ 403: ErrorBodySchema
8632
+ },
8633
+ summary: "Mint short-lived credentials for a signed Uploadcare upload"
8634
+ },
8635
+ importUploadcareFile: {
8636
+ method: "POST",
8637
+ path: "/files/import/uploadcare",
8638
+ body: ImportUploadcareFileBodySchema,
8639
+ responses: {
8640
+ 200: ImportUploadcareFileResponseSchema,
8641
+ 400: ErrorBodySchema,
8642
+ 403: ErrorBodySchema,
8643
+ 404: ErrorBodySchema
8644
+ },
8645
+ summary: "Import a file picked from a cloud source through Uploadcare"
8604
8646
  }
8605
8647
  });
8606
8648
 
@@ -8613,7 +8655,12 @@ var AgentMessageFeedbackTypeSchema = external_exports.enum(["positive", "negativ
8613
8655
  var AgentClarificationQuestionSchema = external_exports.object({
8614
8656
  id: external_exports.string().min(1),
8615
8657
  prompt: external_exports.string().min(1),
8616
- suggestedAnswers: external_exports.array(external_exports.string().min(1)).min(1).max(3).optional(),
8658
+ // Tolerates an explicit null and normalizes it to absent: models write
8659
+ // `"suggestedAnswers": null` for no-suggestion questions, and a
8660
+ // present-but-undefined key survives some JSON serializers as null in
8661
+ // persisted metadata. Rejecting it here silently dropped the whole
8662
+ // clarification form for the turn.
8663
+ suggestedAnswers: external_exports.array(external_exports.string().min(1)).min(1).max(3).nullish().transform((value) => value ?? void 0),
8617
8664
  /**
8618
8665
  * Marks the Slack project/canvas routing question so the Slack renderer
8619
8666
  * can offer a "Last used canvas" shortcut + "Select other" instead of a
@@ -8873,7 +8920,22 @@ var agentContract = c3.router({
8873
8920
  enabledSources: external_exports.array(AgentMessageSourceSchema).optional(),
8874
8921
  // Per-turn override for the persisted profile setting.
8875
8922
  // Omitted = use the user's saved preference.
8876
- agentAutoRunOverride: external_exports.boolean().optional()
8923
+ agentAutoRunOverride: external_exports.boolean().optional(),
8924
+ // Plan mode (flag `agent-plan-mode`): run this turn on the
8925
+ // execution model with high reasoning and a read-only toolset
8926
+ // so the agent drafts or refines a plan instead of executing.
8927
+ // Ignored (normal turn) when the flag is off for the caller.
8928
+ planMode: external_exports.boolean().optional(),
8929
+ // First planning send after the member scrapped a plan: the
8930
+ // server skips the current-plan injection so the planning
8931
+ // model drafts fresh instead of reviving the dead plan.
8932
+ // Ignored when `planMode` is not set.
8933
+ discardPlan: external_exports.boolean().optional(),
8934
+ // Execution handoff from plan mode: the server injects the
8935
+ // session's latest agreed plan into this (normal-mode) turn
8936
+ // so the execution model implements exactly what was
8937
+ // approved. Ignored when the flag is off or no plan exists.
8938
+ implementPlan: external_exports.boolean().optional()
8877
8939
  }).refine(
8878
8940
  (b) => b.content.trim().length > 0 || (b.imageUrls?.length ?? 0) > 0 || (b.images?.length ?? 0) > 0 || (b.videoUrls?.length ?? 0) > 0 || (b.videos?.length ?? 0) > 0 || (b.documents?.length ?? 0) > 0,
8879
8941
  {
@@ -9299,6 +9361,29 @@ var audioContract = c5.router({
9299
9361
  }
9300
9362
  });
9301
9363
 
9364
+ // ../api-contract/src/heygen.ts
9365
+ var HeygenAvatarSettingsSchema = external_exports.object({
9366
+ backgroundColor: external_exports.string().regex(/^#[0-9a-f]{6}$/i, "Background color must be a hex color").optional(),
9367
+ removeBackground: external_exports.boolean().optional(),
9368
+ fit: external_exports.enum(["cover", "contain"]).optional(),
9369
+ caption: external_exports.boolean().optional()
9370
+ });
9371
+ var HeygenAvatarVariantSchema = external_exports.object({
9372
+ avatar: external_exports.string().describe(
9373
+ "Raw avatar id. Pass this exact value as modelConfig.heygenAvatar"
9374
+ ),
9375
+ description: external_exports.string().describe("Pose, setting, and framing, e.g. 'Standing office front'")
9376
+ });
9377
+ var HeygenAvatarPersonSchema = external_exports.object({
9378
+ name: external_exports.string().describe("The presenter's first name, e.g. 'Abigail'"),
9379
+ variants: external_exports.array(HeygenAvatarVariantSchema).describe("Every pose available for this presenter")
9380
+ });
9381
+ var HeygenAvatarCatalogSchema = external_exports.object({
9382
+ people: external_exports.array(HeygenAvatarPersonSchema),
9383
+ totalPeople: external_exports.number(),
9384
+ totalAvatars: external_exports.number()
9385
+ });
9386
+
9302
9387
  // ../api-contract/src/auto-model-proxy.ts
9303
9388
  var AUTO_MODEL_REGISTRY = [
9304
9389
  // ── Video ───────────────────────────────────────────────────────────
@@ -9414,6 +9499,12 @@ var AUTO_MODEL_REGISTRY = [
9414
9499
  model: "elevenlabs-sfx",
9415
9500
  variant: "text-to-sfx"
9416
9501
  },
9502
+ {
9503
+ nodeType: "audio",
9504
+ inputPattern: "video-to-sfx",
9505
+ model: "sonilo-video-sfx",
9506
+ variant: "video-to-sfx"
9507
+ },
9417
9508
  {
9418
9509
  nodeType: "audio",
9419
9510
  inputPattern: "text-to-music",
@@ -9656,6 +9747,7 @@ var GENERATION_MODES = [
9656
9747
  "text-to-speech",
9657
9748
  "audio-to-audio",
9658
9749
  "text-to-sfx",
9750
+ "video-to-sfx",
9659
9751
  "text-to-music",
9660
9752
  "speech-to-text",
9661
9753
  "voice-isolator"
@@ -10445,6 +10537,8 @@ var ModelConfigSchema = external_exports.object({
10445
10537
  tier: external_exports.string().nullable().optional(),
10446
10538
  /** HeyGen Avatar V only: the Runware avatar id for this node. */
10447
10539
  heygenAvatar: external_exports.string().optional(),
10540
+ /** HeyGen Avatar V presentation, speech, and output controls. */
10541
+ heygenSettings: HeygenAvatarSettingsSchema.optional(),
10448
10542
  // Magic-resize stores its per-run config here so each version carries the
10449
10543
  // ratios + resolution that produced it.
10450
10544
  ratios: external_exports.array(external_exports.string()).optional(),
@@ -10471,6 +10565,8 @@ var ModelConfigInputSchema = external_exports.object({
10471
10565
  tier: external_exports.string().nullable().optional(),
10472
10566
  /** HeyGen Avatar V only: the Runware avatar id for this node. */
10473
10567
  heygenAvatar: external_exports.string().trim().min(1).optional(),
10568
+ /** HeyGen Avatar V presentation, speech, and output controls. */
10569
+ heygenSettings: HeygenAvatarSettingsSchema.optional(),
10474
10570
  /** better-font-32b only: the font the model renders the requested text in (supplied to the model as a rendered reference image). */
10475
10571
  font: external_exports.object({
10476
10572
  source: external_exports.enum(["custom", "google"]),
@@ -10595,8 +10691,8 @@ var NodeVersionResponseSchema = external_exports.object({
10595
10691
  * back to a kebab/snake → title-case rendering of the key when the
10596
10692
  * model isn't in the registry (newly added or since-removed).
10597
10693
  *
10598
- * Optional + nullable so historical gallery snapshots that pre-date
10599
- * this field keep validating; the gallery viewer falls back to the
10694
+ * Optional + nullable so historical snapshots that pre-date this
10695
+ * field keep validating; the snapshot viewer falls back to the
10600
10696
  * client-side `formatModelLabel` helper when this is missing.
10601
10697
  */
10602
10698
  modelDisplayName: external_exports.string().nullable().optional(),
@@ -10662,6 +10758,8 @@ var NodeResponseSchema = external_exports.object({
10662
10758
  outputResolution: OutputResolutionSchema.nullable().optional(),
10663
10759
  /** Current seed on the node (from CRDT). */
10664
10760
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).nullable().optional(),
10761
+ /** Current variation count on the node (from CRDT). */
10762
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).nullable().optional(),
10665
10763
  /** Current audio toggle on the node (from CRDT). */
10666
10764
  generateAudio: external_exports.boolean().nullable().optional(),
10667
10765
  /** Selected video model supports start/end image inputs (from CRDT). */
@@ -11116,6 +11214,7 @@ var CreateDirectNodeBodyObjectSchema = external_exports.object({
11116
11214
  outputResolution: OutputResolutionSchema.nullable().optional(),
11117
11215
  matchAudioToVideoDuration: external_exports.boolean().nullable().optional(),
11118
11216
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).nullable().optional(),
11217
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).nullable().optional(),
11119
11218
  negativePrompt: external_exports.string().nullable().optional(),
11120
11219
  stitchClipOrder: StitchClipOrderSchema.nullable().optional(),
11121
11220
  stitchScaleFit: StitchScaleFitSchema.nullable().optional(),
@@ -11165,6 +11264,7 @@ var UpdateDirectNodeBodySchema = external_exports.object({
11165
11264
  outputResolution: OutputResolutionSchema.nullable().optional(),
11166
11265
  matchAudioToVideoDuration: external_exports.boolean().nullable().optional(),
11167
11266
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).nullable().optional(),
11267
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).nullable().optional(),
11168
11268
  negativePrompt: external_exports.string().nullable().optional(),
11169
11269
  stitchClipOrder: StitchClipOrderSchema.nullable().optional(),
11170
11270
  stitchScaleFit: StitchScaleFitSchema.nullable().optional(),
@@ -11199,6 +11299,7 @@ var DirectNodeResponseSchema = external_exports.object({
11199
11299
  outputResolution: OutputResolutionSchema.nullable(),
11200
11300
  matchAudioToVideoDuration: external_exports.boolean().nullable().optional(),
11201
11301
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).nullable(),
11302
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).nullable(),
11202
11303
  negativePrompt: external_exports.string().nullable(),
11203
11304
  stitchClipOrder: StitchClipOrderSchema.nullable().optional(),
11204
11305
  stitchScaleFit: StitchScaleFitSchema.nullable().optional(),
@@ -11252,6 +11353,7 @@ var BulkUpdateDirectNodesItemSchema = external_exports.object({
11252
11353
  outputResolution: OutputResolutionSchema.nullable().optional(),
11253
11354
  matchAudioToVideoDuration: external_exports.boolean().nullable().optional(),
11254
11355
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).nullable().optional(),
11356
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).nullable().optional(),
11255
11357
  negativePrompt: external_exports.string().nullable().optional(),
11256
11358
  stitchClipOrder: StitchClipOrderSchema.nullable().optional(),
11257
11359
  stitchScaleFit: StitchScaleFitSchema.nullable().optional(),
@@ -11340,6 +11442,16 @@ var PlaygroundCanvasReferenceSchema = external_exports.object({
11340
11442
  projectId: external_exports.string().uuid(),
11341
11443
  canvasId: external_exports.string().uuid()
11342
11444
  });
11445
+ var PlaygroundCanvasDestinationSchema = external_exports.discriminatedUnion("kind", [
11446
+ external_exports.object({
11447
+ kind: external_exports.literal("existing"),
11448
+ projectId: external_exports.string().uuid()
11449
+ }),
11450
+ external_exports.object({
11451
+ kind: external_exports.literal("new"),
11452
+ projectName: external_exports.string().trim().min(1).max(500)
11453
+ })
11454
+ ]);
11343
11455
  var PlaygroundCanvasPageSchema = external_exports.object({
11344
11456
  projectId: external_exports.string().uuid().nullable(),
11345
11457
  data: external_exports.array(external_exports.object({ id: external_exports.string().uuid() })),
@@ -11349,9 +11461,12 @@ var canvasContract = c7.router({
11349
11461
  createPlaygroundCanvas: {
11350
11462
  method: "POST",
11351
11463
  path: "/playground/canvases",
11352
- body: null,
11464
+ body: external_exports.object({
11465
+ destination: PlaygroundCanvasDestinationSchema.optional()
11466
+ }).optional(),
11353
11467
  responses: {
11354
11468
  201: PlaygroundCanvasReferenceSchema,
11469
+ 404: MessageResponseSchema,
11355
11470
  409: MessageResponseSchema
11356
11471
  }
11357
11472
  },
@@ -11460,8 +11575,8 @@ var canvasContract = c7.router({
11460
11575
  }
11461
11576
  },
11462
11577
  // Returns canvases across every team the authenticated user is a
11463
- // member of. Used by surfaces (e.g. gallery submission) where the
11464
- // active team header should not constrain the picker.
11578
+ // member of, for pickers where the active team header should not
11579
+ // constrain the results.
11465
11580
  listUserCanvases: {
11466
11581
  method: "GET",
11467
11582
  path: "/users/me/canvases",
@@ -11591,6 +11706,30 @@ var canvasContract = c7.router({
11591
11706
  404: MessageResponseSchema
11592
11707
  }
11593
11708
  },
11709
+ // Who can view this node as a shared playground generation. `anyone`
11710
+ // publishes it behind the public `/g/:nodeId` link; `team` (default)
11711
+ // revokes it. Team-scoped like the asset share toggle.
11712
+ getNodeShareMode: {
11713
+ method: "GET",
11714
+ path: "/nodes/:nodeId/share-mode",
11715
+ pathParams: external_exports.object({ nodeId: external_exports.string().uuid() }),
11716
+ responses: {
11717
+ 200: external_exports.object({ shareMode: ShareVisibilitySchema }),
11718
+ 403: MessageResponseSchema,
11719
+ 404: MessageResponseSchema
11720
+ }
11721
+ },
11722
+ setNodeShareMode: {
11723
+ method: "PATCH",
11724
+ path: "/nodes/:nodeId/share-mode",
11725
+ pathParams: external_exports.object({ nodeId: external_exports.string().uuid() }),
11726
+ body: external_exports.object({ shareMode: ShareVisibilitySchema }),
11727
+ responses: {
11728
+ 200: external_exports.object({ shareMode: ShareVisibilitySchema }),
11729
+ 403: MessageResponseSchema,
11730
+ 404: MessageResponseSchema
11731
+ }
11732
+ },
11594
11733
  listNodeVersionAssets: {
11595
11734
  method: "GET",
11596
11735
  path: "/node-versions/:versionId/assets",
@@ -12455,6 +12594,8 @@ var GenerationRunBodySchema = external_exports.object({
12455
12594
  prompt: external_exports.string().trim().min(1).optional(),
12456
12595
  /** Selected avatar id from Runware's HeyGen Avatar V catalog. */
12457
12596
  heygenAvatar: external_exports.string().trim().min(1).optional(),
12597
+ /** HeyGen Avatar V presentation controls. */
12598
+ heygenSettings: HeygenAvatarSettingsSchema.optional(),
12458
12599
  imageUrls: external_exports.array(external_exports.string().url()).optional(),
12459
12600
  endImageUrls: external_exports.array(external_exports.string().url()).optional(),
12460
12601
  referenceImageUrls: external_exports.array(external_exports.string().url()).optional(),
@@ -12575,6 +12716,9 @@ var AutoModelDefaultsCategorySchema = external_exports.object({
12575
12716
  textToSpeech: AutoModelDefaultEntrySchema,
12576
12717
  audioToAudio: AutoModelDefaultEntrySchema,
12577
12718
  textToSfx: AutoModelDefaultEntrySchema,
12719
+ // Optional so deployed clients validating a response from an
12720
+ // older backend (which omits it) keep working.
12721
+ videoToSfx: AutoModelDefaultEntrySchema.optional(),
12578
12722
  textToMusic: AutoModelDefaultEntrySchema,
12579
12723
  speechToText: AutoModelDefaultEntrySchema
12580
12724
  }).optional()
@@ -12745,6 +12889,9 @@ var GenerationHistoryItemSchema = external_exports.object({
12745
12889
  tier: external_exports.string().nullable().optional(),
12746
12890
  status: GenerationJobStatusSchema,
12747
12891
  creditCost: external_exports.number().nullable(),
12892
+ // Whether the debit was reversed — `creditCost` was charged and given back,
12893
+ // so it did not count towards usage. Optional so older clients ignore it.
12894
+ refunded: external_exports.boolean().optional(),
12748
12895
  createdAt: external_exports.string(),
12749
12896
  user: external_exports.object({
12750
12897
  id: external_exports.string(),
@@ -12755,7 +12902,15 @@ var GenerationHistoryItemSchema = external_exports.object({
12755
12902
  id: external_exports.string(),
12756
12903
  title: external_exports.string(),
12757
12904
  archived: external_exports.boolean()
12758
- }).nullable()
12905
+ }).nullable(),
12906
+ // Set when the generation was produced by running a template: the bulk run
12907
+ // it belonged to plus the template's name. Lets a run's per-model rows be
12908
+ // consolidated into one row (see `consolidateTemplateRuns`). Optional so
12909
+ // older clients ignore it and it is absent for non-template generations.
12910
+ templateRun: external_exports.object({
12911
+ runId: external_exports.string(),
12912
+ title: external_exports.string()
12913
+ }).nullable().optional()
12759
12914
  });
12760
12915
  var ListGenerationHistoryResponseSchema = external_exports.object({
12761
12916
  items: external_exports.array(GenerationHistoryItemSchema),
@@ -13125,6 +13280,90 @@ var SharedAssetResponseSchema = external_exports.object({
13125
13280
  height: external_exports.number().int().nullable(),
13126
13281
  durationInMs: external_exports.number().int().nullable()
13127
13282
  });
13283
+ var SharedGenerationMediaTypeSchema = external_exports.enum(["image", "video", "audio"]);
13284
+ var SharedGenerationTypeSchema = external_exports.enum(["text", "image", "video", "audio"]);
13285
+ var SharedGenerationReferenceSchema = external_exports.object({
13286
+ mediaType: SharedGenerationMediaTypeSchema,
13287
+ url: external_exports.string().nullable(),
13288
+ previewUrl: external_exports.string().nullable(),
13289
+ // The input handle the reference was wired to (e.g. starting_image), so the
13290
+ // viewer can render the role. Null when the source used the default slot.
13291
+ targetHandle: external_exports.string().nullable()
13292
+ });
13293
+ var SharedGenerationOutputSchema = external_exports.object({
13294
+ mediaUrl: external_exports.string().nullable(),
13295
+ mediaType: SharedGenerationMediaTypeSchema.nullable(),
13296
+ width: external_exports.number().int().nullable(),
13297
+ height: external_exports.number().int().nullable(),
13298
+ durationInMs: external_exports.number().int().nullable(),
13299
+ // Optional for independent web/core deployments.
13300
+ text: external_exports.string().nullable().optional()
13301
+ });
13302
+ var SharedCreatorSchema = external_exports.object({
13303
+ id: external_exports.string().uuid(),
13304
+ name: external_exports.string(),
13305
+ email: external_exports.string(),
13306
+ avatarUrl: external_exports.string().nullable()
13307
+ });
13308
+ var SharedGenerationResponseSchema = external_exports.object({
13309
+ id: external_exports.string().uuid(),
13310
+ type: SharedGenerationTypeSchema,
13311
+ prompt: external_exports.string(),
13312
+ modelName: external_exports.string().nullable(),
13313
+ modelLabel: external_exports.string().nullable(),
13314
+ tier: external_exports.string().nullable(),
13315
+ aspectRatio: OutputAspectRatioSchema.nullable(),
13316
+ output: SharedGenerationOutputSchema.nullable(),
13317
+ references: external_exports.array(SharedGenerationReferenceSchema),
13318
+ // Display name of the member who created the generation, for the
13319
+ // "Created by …" tag. Null when the creator is unknown/deleted.
13320
+ createdByName: external_exports.string().nullable(),
13321
+ // Optional to support version-skew between web and core deployments.
13322
+ createdByUser: SharedCreatorSchema.nullable().optional(),
13323
+ // Set when the generation was produced by a template — the viewer's "Create
13324
+ // in my playground" then opens that template to try, instead of staging a
13325
+ // plain playground run. Null for playground generations.
13326
+ templateId: external_exports.string().uuid().nullable(),
13327
+ createdAt: external_exports.string().nullable()
13328
+ });
13329
+ var RecreateGenerationReferenceSchema = external_exports.object({
13330
+ assetId: external_exports.string().uuid(),
13331
+ displayName: external_exports.string(),
13332
+ mediaType: SharedGenerationMediaTypeSchema,
13333
+ url: external_exports.string().nullable(),
13334
+ previewUrl: external_exports.string().nullable(),
13335
+ targetHandle: external_exports.string().nullable()
13336
+ });
13337
+ var RecreateGenerationResponseSchema = external_exports.object({
13338
+ type: SharedGenerationTypeSchema,
13339
+ prompt: external_exports.string(),
13340
+ modelName: external_exports.string(),
13341
+ // The model variant the source ran (e.g. image-to-video), so the viewer's
13342
+ // composer can pre-select the matching recipe and wire the references into
13343
+ // its input slots. Null when the source recorded no variant.
13344
+ variant: external_exports.string().nullable(),
13345
+ tier: external_exports.string().nullable(),
13346
+ aspectRatio: OutputAspectRatioSchema.nullable(),
13347
+ resolution: external_exports.string().nullable(),
13348
+ duration: external_exports.number().int().positive().nullable(),
13349
+ references: external_exports.array(RecreateGenerationReferenceSchema),
13350
+ // Display name of the member who created the source generation, for the
13351
+ // "Created by …" tag shown on the recreated example in the viewer's
13352
+ // playground. Null when the creator is unknown/deleted.
13353
+ createdByName: external_exports.string().nullable(),
13354
+ // The owned copy of the shared generation. Optional so a newer web client
13355
+ // continues to accept a response from an already-deployed backend while it
13356
+ // rolls out.
13357
+ recreatedGeneration: external_exports.object({
13358
+ nodeId: external_exports.string().uuid(),
13359
+ projectId: external_exports.string().uuid(),
13360
+ canvasId: external_exports.string().uuid()
13361
+ }).optional()
13362
+ });
13363
+ var SharedGenerationHandoffSchema = RecreateGenerationResponseSchema.extend({
13364
+ modelLabel: external_exports.string().nullable(),
13365
+ output: SharedGenerationOutputSchema.nullable()
13366
+ });
13128
13367
  var ShareCanvasResponseSchema = external_exports.object({
13129
13368
  id: external_exports.string().uuid(),
13130
13369
  projectId: external_exports.string().uuid(),
@@ -13152,12 +13391,7 @@ var ShareProjectInfoResponseSchema = external_exports.object({
13152
13391
  // The user who created the project — used to render "X shared Y" copy in
13153
13392
  // link previews and the owner card on the shared canvas view. Null for
13154
13393
  // legacy projects with no recorded creator.
13155
- createdByUser: external_exports.object({
13156
- id: external_exports.string().uuid(),
13157
- name: external_exports.string(),
13158
- email: external_exports.string(),
13159
- avatarUrl: external_exports.string().nullable()
13160
- }).nullable()
13394
+ createdByUser: SharedCreatorSchema.nullable()
13161
13395
  });
13162
13396
  var shareContract = c12.router({
13163
13397
  // Public endpoint — no auth required
@@ -13193,6 +13427,18 @@ var shareContract = c12.router({
13193
13427
  404: MessageResponseSchema
13194
13428
  }
13195
13429
  },
13430
+ // Public endpoint — no auth required. Resolves one playground generation
13431
+ // (a node) for an anonymous viewer; 404s unless the node's shareMode is
13432
+ // `anyone`.
13433
+ getSharedGeneration: {
13434
+ method: "GET",
13435
+ path: "/share/generations/:nodeId",
13436
+ pathParams: external_exports.object({ nodeId: external_exports.string().uuid() }),
13437
+ responses: {
13438
+ 200: SharedGenerationResponseSchema,
13439
+ 404: MessageResponseSchema
13440
+ }
13441
+ },
13196
13442
  // Public endpoint — no auth required
13197
13443
  getSharedCanvas: {
13198
13444
  method: "GET",
@@ -13225,6 +13471,20 @@ var shareContract = c12.router({
13225
13471
  200: external_exports.object({ shareMode: ShareModeSchema })
13226
13472
  }
13227
13473
  },
13474
+ // Authenticated. Clone a shared generation's referenced assets into the
13475
+ // caller's team + files and return a run-ready payload the client feeds into
13476
+ // the Playground run path. 404s unless the node's shareMode is `anyone`.
13477
+ recreateSharedGeneration: {
13478
+ method: "POST",
13479
+ path: "/share/generations/:nodeId/recreate",
13480
+ pathParams: external_exports.object({ nodeId: external_exports.string().uuid() }),
13481
+ body: external_exports.object({}),
13482
+ responses: {
13483
+ 200: RecreateGenerationResponseSchema,
13484
+ 403: MessageResponseSchema,
13485
+ 404: MessageResponseSchema
13486
+ }
13487
+ },
13228
13488
  copySharedCanvas: {
13229
13489
  method: "POST",
13230
13490
  path: "/share/projects/:projectId/canvases/:canvasId/copy",
@@ -13675,10 +13935,17 @@ var ProjectResponseSchema = external_exports.object({
13675
13935
  updatedAt: external_exports.string().datetime(),
13676
13936
  lastEditAt: external_exports.string().datetime()
13677
13937
  });
13938
+ var ProjectOptionSchema = ProjectResponseSchema.pick({
13939
+ id: true,
13940
+ title: true
13941
+ });
13678
13942
  var ProjectIdParamsSchema = external_exports.object({ projectId: external_exports.string().uuid() });
13679
13943
  var PaginationQuerySchema = external_exports.object(
13680
13944
  paginationQuery({ maxLimit: 100, defaultLimit: 50 })
13681
13945
  );
13946
+ var ProjectOptionsQuerySchema = PaginationQuerySchema.extend({
13947
+ search: external_exports.string().max(500).optional()
13948
+ });
13682
13949
  var IncludePreviewAssetsQuerySchema = external_exports.preprocess((value) => {
13683
13950
  if (value === void 0) return void 0;
13684
13951
  if (value === "true" || value === true) return true;
@@ -13702,6 +13969,10 @@ var PaginatedProjectsResponseSchema = external_exports.object({
13702
13969
  data: external_exports.array(ProjectResponseSchema),
13703
13970
  total: external_exports.number().int()
13704
13971
  });
13972
+ var PaginatedProjectOptionsResponseSchema = external_exports.object({
13973
+ data: external_exports.array(ProjectOptionSchema),
13974
+ total: external_exports.number().int()
13975
+ });
13705
13976
  var ProjectListResponseSchema = external_exports.object({
13706
13977
  data: external_exports.array(ProjectResponseSchema)
13707
13978
  });
@@ -13715,8 +13986,15 @@ var ProjectThumbnailResponseSchema = external_exports.object({
13715
13986
  var ProjectThumbnailsResponseSchema = external_exports.object({
13716
13987
  data: external_exports.array(ProjectThumbnailResponseSchema)
13717
13988
  });
13989
+ var MAX_PROJECT_TITLE_LENGTH = 500;
13990
+ var PROJECT_CONFLICT_CODE = {
13991
+ nameTaken: "PROJECT_NAME_TAKEN"
13992
+ };
13993
+ var ProjectConflictResponseSchema = MessageResponseSchema.extend({
13994
+ code: external_exports.nativeEnum(PROJECT_CONFLICT_CODE).optional()
13995
+ });
13718
13996
  var CreateProjectBodySchema = external_exports.object({
13719
- title: external_exports.string().min(1).max(500).optional(),
13997
+ title: external_exports.string().min(1).max(MAX_PROJECT_TITLE_LENGTH).optional(),
13720
13998
  description: external_exports.string().max(5e3).optional(),
13721
13999
  isPublic: external_exports.boolean().optional(),
13722
14000
  // Folder to create the project in. Omit (or `null`) to create at the team
@@ -13724,7 +14002,7 @@ var CreateProjectBodySchema = external_exports.object({
13724
14002
  folderId: external_exports.string().uuid().nullable().optional()
13725
14003
  });
13726
14004
  var UpdateProjectBodySchema = external_exports.object({
13727
- title: external_exports.string().min(1).max(500).optional(),
14005
+ title: external_exports.string().min(1).max(MAX_PROJECT_TITLE_LENGTH).optional(),
13728
14006
  description: external_exports.string().max(5e3).nullable().optional(),
13729
14007
  isPublic: external_exports.boolean().optional()
13730
14008
  });
@@ -13755,7 +14033,7 @@ var projectContract = c14.router({
13755
14033
  body: CreateProjectBodySchema,
13756
14034
  responses: {
13757
14035
  201: ProjectResponseSchema,
13758
- 409: MessageResponseSchema
14036
+ 409: ProjectConflictResponseSchema
13759
14037
  }
13760
14038
  },
13761
14039
  listDeletedProjects: {
@@ -13764,6 +14042,12 @@ var projectContract = c14.router({
13764
14042
  query: PaginationQuerySchema,
13765
14043
  responses: { 200: PaginatedProjectsResponseSchema }
13766
14044
  },
14045
+ listProjectOptions: {
14046
+ method: "GET",
14047
+ path: "/projects/options",
14048
+ query: ProjectOptionsQuerySchema,
14049
+ responses: { 200: PaginatedProjectOptionsResponseSchema }
14050
+ },
13767
14051
  getProject: {
13768
14052
  method: "GET",
13769
14053
  path: "/projects/:projectId",
@@ -13777,7 +14061,7 @@ var projectContract = c14.router({
13777
14061
  body: UpdateProjectBodySchema,
13778
14062
  responses: {
13779
14063
  200: ProjectResponseSchema,
13780
- 409: MessageResponseSchema
14064
+ 409: ProjectConflictResponseSchema
13781
14065
  }
13782
14066
  },
13783
14067
  deleteProject: {
@@ -13897,18 +14181,31 @@ var projectContract = c14.router({
13897
14181
  });
13898
14182
 
13899
14183
  // ../api-contract/src/template-apply-input.ts
14184
+ var templateApplyTextInput = external_exports.object({
14185
+ kind: external_exports.literal("text"),
14186
+ portId: external_exports.string(),
14187
+ text: external_exports.string().min(1)
14188
+ });
14189
+ var templateApplyAssetInput = external_exports.object({
14190
+ kind: external_exports.literal("asset"),
14191
+ portId: external_exports.string(),
14192
+ assetId: external_exports.string().uuid(),
14193
+ mediaType: external_exports.enum(["image", "video", "audio", "pdf"])
14194
+ });
14195
+ var templateApplyAssetUrlInput = external_exports.object({
14196
+ kind: external_exports.literal("assetUrl"),
14197
+ portId: external_exports.string(),
14198
+ url: external_exports.string().url(),
14199
+ mediaType: external_exports.enum(["image", "video", "audio", "pdf"])
14200
+ });
14201
+ var TemplateApplyLibraryInputSchema = external_exports.discriminatedUnion("kind", [
14202
+ templateApplyTextInput,
14203
+ templateApplyAssetInput
14204
+ ]);
13900
14205
  var TemplateApplyInputSchema = external_exports.discriminatedUnion("kind", [
13901
- external_exports.object({
13902
- kind: external_exports.literal("asset"),
13903
- portId: external_exports.string(),
13904
- assetId: external_exports.string().uuid(),
13905
- mediaType: external_exports.enum(["image", "video", "audio", "pdf"])
13906
- }),
13907
- external_exports.object({
13908
- kind: external_exports.literal("text"),
13909
- portId: external_exports.string(),
13910
- text: external_exports.string().min(1)
13911
- })
14206
+ templateApplyTextInput,
14207
+ templateApplyAssetInput,
14208
+ templateApplyAssetUrlInput
13912
14209
  ]);
13913
14210
 
13914
14211
  // ../api-contract/src/template-public-api.ts
@@ -14409,7 +14706,7 @@ function isMajorUpgrade(current, latest) {
14409
14706
  return l[0] > c17[0];
14410
14707
  }
14411
14708
  function shouldShowUpgradeNotice(ctx = {}) {
14412
- const current = ctx.current ?? "0.10.1";
14709
+ const current = ctx.current ?? "0.12.0";
14413
14710
  const latest = ctx.latest ?? serverLatestVersion;
14414
14711
  const env = ctx.env ?? process.env;
14415
14712
  const isTty = ctx.isTty ?? Boolean(process.stderr.isTTY);
@@ -14430,7 +14727,7 @@ Upgrade: npm install -g @melius-ai/cli@latest (or: brew update && brew upgrade
14430
14727
  function printUpgradeNoticeIfNeeded(ctx = {}) {
14431
14728
  try {
14432
14729
  if (!shouldShowUpgradeNotice(ctx)) return;
14433
- const current = ctx.current ?? "0.10.1";
14730
+ const current = ctx.current ?? "0.12.0";
14434
14731
  const latest = ctx.latest ?? serverLatestVersion;
14435
14732
  process.stderr.write(formatUpgradeNotice(current, latest));
14436
14733
  } catch {
@@ -16629,7 +16926,7 @@ previewSrc, mediaType, generatedText, activeVersionId, voiceId, createdByUserId.
16629
16926
  ID is auto-generated if --id is omitted. Geometry defaults per type (text: 380x200, image: 520x293, audio: 380x280).
16630
16927
  Valid aspect ratios: 21:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:21.
16631
16928
  Resolutions vary per model (e.g. 720p, 1080p, 4k for video; 1K, 2K, 4K for images). Use mel model list to check supportedResolutions.
16632
- Audio modes (set via --variant): text-to-speech (TTS, requires --voice-id), text-to-sfx (5/6/8/10/12/15/20/22 second SFX), text-to-music (10/30/60/90/120/180/240/300 second music), speech-to-text (requires an audio input edge), audio-to-audio (requires an audio input edge and --voice-id). Use mel audio voice list to discover voice ids.
16929
+ Audio modes (set via --variant): text-to-speech (TTS, requires --voice-id), text-to-sfx (5/6/8/10/12/15/20/22 second SFX), video-to-sfx (requires a video input edge; length follows the clip), text-to-music (10/30/60/90/120/180/240/300 second music), speech-to-text (requires an audio input edge), audio-to-audio (requires an audio input edge and --voice-id). Use mel audio voice list to discover voice ids.
16633
16930
  For stitch nodes, use --clip-order with connected source node IDs (video or image) in playback order and --scale-fit to control frame adaptation. Images render as 2-second still frames.
16634
16931
 
16635
16932
  Examples:
@@ -16840,7 +17137,7 @@ Valid node types: text, image, video, audio, file, group, custom_text, stitch.
16840
17137
  Stitch nodes also accept clipOrder (source node IDs \u2014 video or image \u2014 in playback order; images render as 2-second stills) and scaleFit (fit or stretch).
16841
17138
  Valid aspect ratios: 21:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:21.
16842
17139
  Valid edge types: text, image, video, audio, file.
16843
- Audio modes (set via variant): text-to-speech (TTS, requires voiceId), text-to-sfx (5/6/8/10/12/15/20/22 second SFX), text-to-music (10/30/60/90/120/180/240/300 second music), speech-to-text (requires an audio input edge), audio-to-audio (requires an audio input edge and voiceId).
17140
+ Audio modes (set via variant): text-to-speech (TTS, requires voiceId), text-to-sfx (5/6/8/10/12/15/20/22 second SFX), video-to-sfx (requires a video input edge; length follows the clip), text-to-music (10/30/60/90/120/180/240/300 second music), speech-to-text (requires an audio input edge), audio-to-audio (requires an audio input edge and voiceId).
16844
17141
 
16845
17142
  Use mel canvas plan-layout first to compute positions, then pass x/y/w/h into each node.
16846
17143
  Accepts two JSON formats via stdin (or --json):
@@ -18280,7 +18577,7 @@ function registerModelCommands(program2, getOutputOpts) {
18280
18577
  Returns: Array of models, each with name, displayName, provider, variants[], and supportedInputs[].
18281
18578
  Each variant has: mode, supportedAspectRatios[], supportedDurations[], supportedResolutions[], requiredInputs[].
18282
18579
  For text models, supportedInputs lists accepted media types (e.g. ["image", "video"]) \u2014 use these to determine valid edge handles.
18283
- For audio, variants are text-to-speech, text-to-sfx, text-to-music, speech-to-text, and audio-to-audio \u2014 supportedDurations applies to sfx and music only. For text-to-speech and audio-to-audio, also call mel audio voice list to discover voice ids.
18580
+ For audio, variants are text-to-speech, text-to-sfx, video-to-sfx, text-to-music, speech-to-text, and audio-to-audio \u2014 supportedDurations applies to sfx and music only. For text-to-speech and audio-to-audio, also call mel audio voice list to discover voice ids.
18284
18581
  Use this to discover valid --model and --variant values for mel run start and mel node create.
18285
18582
 
18286
18583
  Examples:
@@ -19026,7 +19323,7 @@ function parseInputs(value) {
19026
19323
  "USAGE_ERROR",
19027
19324
  result.error.issues.map((issue) => issue.message).join("; "),
19028
19325
  {
19029
- suggestion: 'Use text inputs {"kind":"text","portId":"<portId>","text":"<text>"} or asset inputs {"kind":"asset","portId":"<portId>","assetId":"<assetId>","mediaType":"image|video|audio|pdf"}'
19326
+ suggestion: 'Use text inputs {"kind":"text","portId":"<portId>","text":"<text>"}, library-asset inputs {"kind":"asset","portId":"<portId>","assetId":"<assetId>","mediaType":"image|video|audio|pdf"}, or image-URL inputs {"kind":"assetUrl","portId":"<portId>","url":"https://...","mediaType":"image|video|audio|pdf"}'
19030
19327
  }
19031
19328
  ),
19032
19329
  EXIT_USAGE_ERROR
@@ -19067,18 +19364,22 @@ Examples:
19067
19364
  "Y center for the template box. Omit for automatic non-overlapping placement"
19068
19365
  ).option(
19069
19366
  "--inputs <json>",
19070
- "JSON array of text or library-asset inputs targeting port IDs from mel template list"
19367
+ "JSON array of text, library-asset, or image-URL inputs targeting port IDs from mel template list"
19071
19368
  ).addHelpText(
19072
19369
  "after",
19073
19370
  `
19074
19371
  Returns: { instanceId, groupId }. Internal workflow node IDs are never returned.
19075
- Input kinds: text {kind,portId,text}; asset {kind,portId,assetId,mediaType} where mediaType is image, video, audio, or pdf.
19372
+ Input kinds (mediaType is image, video, audio, or pdf):
19373
+ text {kind,portId,text}
19374
+ asset {kind,portId,assetId,mediaType} \u2014 a stored library asset (from mel asset search)
19375
+ assetUrl {kind,portId,url,mediaType} \u2014 a remote media URL fetched and stored server-side (e.g. a product image already hosted on your site)
19076
19376
  Omit --center-x/--center-y to place the box automatically. Use mel canvas content <canvasId> afterward to inspect its public ports.
19077
19377
  Run the applied template with mel bulk-run start <canvasId> --node-ids <groupId> --wait.
19078
19378
 
19079
19379
  Examples:
19080
19380
  $ mel template apply <canvasId> <templateId>
19081
19381
  $ mel template apply <canvasId> <templateId> --inputs '[{"kind":"text","portId":"<portId>","text":"A red shoe"}]'
19382
+ $ mel template apply <canvasId> <templateId> --inputs '[{"kind":"assetUrl","portId":"<portId>","url":"https://example.com/image.jpg","mediaType":"image"}]'
19082
19383
  $ mel bulk-run start <canvasId> --node-ids <groupId> --wait`
19083
19384
  ).action(
19084
19385
  async (canvasId, templateId, opts) => {
@@ -19563,7 +19864,7 @@ function withDefaultHelp(args) {
19563
19864
  }
19564
19865
  function createProgram() {
19565
19866
  const program2 = new Command();
19566
- program2.name("mel").description("Mel \u2014 Melius agent CLI").version("0.10.1").showSuggestionAfterError(true).option("--json", "Force JSON output (default)").option("--text", "Human-readable output").option(
19867
+ program2.name("mel").description("Mel \u2014 Melius agent CLI").version("0.12.0").showSuggestionAfterError(true).option("--json", "Force JSON output (default)").option("--text", "Human-readable output").option(
19567
19868
  "--fields <fields>",
19568
19869
  "Select specific output fields (comma-separated)"
19569
19870
  ).option("--quiet", "Suppress output, exit code only").option("--verbose", "Log request/response metadata to stderr").addHelpText(
package/dist/src/index.js CHANGED
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module'; const require = createRequire(impor
2
2
  import {
3
3
  createProgram,
4
4
  withDefaultHelp
5
- } from "../chunk-NNJE574V.js";
5
+ } from "../chunk-2PWVQ3PC.js";
6
6
  export {
7
7
  createProgram,
8
8
  withDefaultHelp
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@melius-ai/cli",
3
- "version": "0.10.1",
3
+ "version": "0.12.0",
4
4
  "description": "The Melius command-line interface — create canvases and run AI image/video generations from your terminal",
5
5
  "keywords": [
6
6
  "ai",
@@ -21,7 +21,8 @@
21
21
  "mel": "./dist/bin/mel.js"
22
22
  },
23
23
  "files": [
24
- "dist"
24
+ "dist",
25
+ "THIRD-PARTY-NOTICES.md"
25
26
  ],
26
27
  "type": "module",
27
28
  "exports": {