@melius-ai/cli 0.8.0 → 0.9.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
@@ -265,7 +265,7 @@ Requires the Pro or Enterprise plan.
265
265
  | `mel asset folders` | List the library's folders (`id`, `name`, `path`, `fileCount`) so you can resolve a folder name to an id for `--folder-id` |
266
266
  | `mel asset place <canvasId> <assetIds...>` | Place existing library assets onto a canvas by id — references the **original** asset (no duplicate) |
267
267
 
268
- `mel asset search` searches by meaning (semantic), with exact filename/title matches ranked first, so query with a filename or a description of the content. It returns `{ query, total, results: [{ assetId, filename, fileType, previewUrl, ... }] }`. Filter with `--file-type <image|video|audio|pdf|text>` and `--limit <1-20>`; page deeper with `--offset <n>` (skip the first N matches — page until the running count reaches `total`); scope to one canvas with `--canvas-id` (omit to search the whole team library).
268
+ `mel asset search` searches by meaning (semantic), with exact filename/title matches ranked first, so query with a filename or a description of the content. Pass an exact filename verbatim, including its extension. It returns `{ query, total, results: [{ assetId, filename, fileType, previewUrl, ... }] }`. Filter by origin with `--source <upload|generated>`, by media type with `--file-type <image|video|audio|pdf|text>`, and by page size with `--limit <1-20>`; page deeper with `--offset <n>` (skip the first N matches — page until the running count reaches `total`); scope to one canvas with `--canvas-id` (omit to search the whole team library).
269
269
 
270
270
  Scope to a **folder** with `--folder-id` (from `mel asset folders`): with a query it filters within that folder and its subfolders; **omit the query** to bring in the _whole_ folder (every asset in it). `mel asset folders` returns each folder's root-relative `path` (e.g. `Brand / Logos`) to disambiguate same-named folders.
271
271
 
@@ -276,6 +276,8 @@ Filter by **tag** with `--tags <names>` (comma-separated, case-insensitive): ass
276
276
  ```bash
277
277
  # Find an asset, then bring it onto a canvas and wire it
278
278
  mel asset search "black jacket shot" --file-type image
279
+ mel asset search "Product_Shot_05.PNG" --source upload
280
+ mel asset search "shark close-up" --source generated
279
281
  mel asset place <canvasId> <assetId1> <assetId2>
280
282
 
281
283
  # Bring in a whole folder: resolve the folder, then search it with no query
package/dist/bin/mel.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  printUpgradeNoticeIfNeeded,
8
8
  withDefaultHelp,
9
9
  writeError
10
- } from "../chunk-3PBGQVUH.js";
10
+ } from "../chunk-24FW76XZ.js";
11
11
 
12
12
  // bin/mel.ts
13
13
  var program = createProgram();
@@ -7736,6 +7736,7 @@ var MAX_INPUT_VIDEOS = 3;
7736
7736
  var MAX_INPUT_DOCUMENTS = 5;
7737
7737
  var MAX_AGENT_MESSAGE_CONTENT_LENGTH = 5e4;
7738
7738
  var MAX_SEED = 2147483647;
7739
+ var MAX_VARIATIONS = 10;
7739
7740
 
7740
7741
  // ../api-contract/src/common.ts
7741
7742
  var MessageResponseSchema = external_exports.object({ message: external_exports.string() });
@@ -8041,6 +8042,9 @@ var BulkDownloadFilesResponseSchema = external_exports.object({
8041
8042
  var BulkHideFilesBodySchema = external_exports.object({
8042
8043
  assetIds: BulkFileAssetIdsSchema
8043
8044
  });
8045
+ var BulkDeleteFilesBodySchema = external_exports.object({
8046
+ assetIds: BulkFileAssetIdsSchema
8047
+ });
8044
8048
  var BulkUnhideFilesBodySchema = external_exports.object({
8045
8049
  assetIds: BulkFileAssetIdsSchema
8046
8050
  });
@@ -8125,16 +8129,18 @@ var FileTabCountsResponseSchema = external_exports.object({
8125
8129
  var AGENT_ASSET_SEARCH_PAGE_SIZE = 20;
8126
8130
  var AgentAssetSearchQuerySchema = external_exports.object({
8127
8131
  query: external_exports.string().trim().min(1).max(500).optional().describe(
8128
- 'The semantic search query \u2014 a filename or a description of the asset (e.g. "red logo", "the shark photo"). Provide it to FIND specific assets. OMIT it entirely to bring in EVERY asset from a folder: when the member says "bring in all my assets from the X folder" / "add everything in X to the canvas", resolve the folder with list_asset_folders and call asset_search with just that `folderId` and NO query. Never invent a query when the member asked for everything in a folder \u2014 a query filters and will drop assets they wanted. Omitting the query requires a `folderId`.'
8132
+ 'The semantic search query \u2014 an exact filename or a description of the asset (e.g. "Product_Shot_05.png", "red logo", "the shark photo"). When the member gives an exact filename, pass it verbatim, including its extension; exact matches rank first. Provide a query to FIND specific assets. OMIT it entirely to bring in EVERY asset from a folder: when the member says "bring in all my assets from the X folder" / "add everything in X to the canvas", resolve the folder with list_asset_folders and call asset_search with just that `folderId` and NO query. Never invent a query when the member asked for everything in a folder \u2014 a query filters and will drop assets they wanted. Omitting the query requires a `folderId`.'
8129
8133
  ),
8130
8134
  limit: external_exports.coerce.number().int().min(1).max(AGENT_ASSET_SEARCH_PAGE_SIZE).default(AGENT_ASSET_SEARCH_PAGE_SIZE),
8131
- source: FileSourceSchema.optional(),
8135
+ source: FileSourceSchema.optional().describe(
8136
+ "Optional. Filter by where the asset came from: `upload` for files uploaded by a member, or `generated` for media created in Melius. Set this only when the member explicitly asks for uploads or generations; omit it to search both."
8137
+ ),
8132
8138
  fileType: FileTypeSchema.optional(),
8133
8139
  canvasId: external_exports.string().uuid().optional().describe(
8134
8140
  'Optional. Omit to search the whole team library \u2014 this is the default and what nearly every request wants (e.g. "use the asset I have"). Only set this to scope to a DIFFERENT canvas the member explicitly names ("search my other canvas"), resolving the id from canvas_list. Do NOT pass the canvas the chat is currently on (its assets are already visible via canvas_content, and scoping there hides whole-library matches), and never guess an id.'
8135
8141
  ),
8136
8142
  folderId: external_exports.string().uuid().optional().describe(
8137
- 'Optional. Scope to one Files folder AND its subfolders. Omit to search the whole team library \u2014 the default, and what nearly every request wants. Set it when the member names a specific folder \u2014 either to FILTER within it (pass `folderId` + `query`, e.g. "find the shark shot in my ocean folder") or to bring in EVERYTHING in it (pass `folderId` and OMIT `query`, e.g. "add all my assets from the ocean folder"). Resolve the id with list_asset_folders (match by name; if several plausibly match, ask which one); never guess a folder id.'
8143
+ 'Optional. Scope to one Files folder AND its subfolders. Omit to search the whole team library \u2014 the default, and what nearly every request wants. Set it when the member names a specific folder \u2014 either to FILTER within it (pass `folderId` + `query`, e.g. "find the shark shot in my ocean folder") or to bring in EVERYTHING in it (pass `folderId` and OMIT `query`, e.g. "add all my assets from the ocean folder"). Resolve the id with list_asset_folders: prefer a case-insensitive exact name or path before considering partial matches; if several exact or partial matches remain, ask which one. Never guess a folder id.'
8138
8144
  ),
8139
8145
  tags: external_exports.string().trim().optional().describe(
8140
8146
  'Optional. Filter to assets carrying ALL of these tags (AND). Pass a tag name ONLY when the member explicitly asks to filter by a tag (e.g. "find my assets tagged brand", "my hero tag") \u2014 never infer one from ordinary words in their request. Comma-separated (e.g. "brand" or "brand,hero"), case-insensitive. Combine with `query` to search within tagged assets, or omit `query` (with tags and/or a folderId) to bring in every asset carrying them. An unknown or misspelled tag name matches nothing, so pass only tags the member actually named.'
@@ -8436,6 +8442,17 @@ var filesContract = c2.router({
8436
8442
  },
8437
8443
  summary: "Hide files from Files"
8438
8444
  },
8445
+ bulkDeleteFiles: {
8446
+ method: "POST",
8447
+ path: "/files/bulk/delete",
8448
+ body: BulkDeleteFilesBodySchema,
8449
+ responses: {
8450
+ 200: BulkFileActionResponseSchema,
8451
+ 403: ErrorBodySchema,
8452
+ 404: ErrorBodySchema
8453
+ },
8454
+ summary: "Delete files from Files"
8455
+ },
8439
8456
  hideFile: {
8440
8457
  method: "POST",
8441
8458
  path: "/files/:assetId/hide",
@@ -8448,6 +8465,18 @@ var filesContract = c2.router({
8448
8465
  },
8449
8466
  summary: "Hide a file from Files"
8450
8467
  },
8468
+ deleteFile: {
8469
+ method: "DELETE",
8470
+ path: "/files/:assetId",
8471
+ pathParams: FileAssetIdParamsSchema,
8472
+ body: null,
8473
+ responses: {
8474
+ 204: c2.noBody(),
8475
+ 403: ErrorBodySchema,
8476
+ 404: ErrorBodySchema
8477
+ },
8478
+ summary: "Delete a file from Files"
8479
+ },
8451
8480
  bulkUnhideFiles: {
8452
8481
  method: "POST",
8453
8482
  path: "/files/bulk/unhide",
@@ -9390,10 +9419,7 @@ var AutoModelProxy = class {
9390
9419
  resolve(input) {
9391
9420
  switch (input.nodeType) {
9392
9421
  case "video":
9393
- return this.resolveVideo(
9394
- input.connectedInputs,
9395
- input.canvasVideoInputRoutingEnabled === true
9396
- );
9422
+ return this.resolveVideo(input.connectedInputs);
9397
9423
  case "image":
9398
9424
  return this.resolveImage(input.connectedInputs);
9399
9425
  case "text":
@@ -9412,7 +9438,7 @@ var AutoModelProxy = class {
9412
9438
  return this.registry;
9413
9439
  }
9414
9440
  // ── Private resolvers ───────────────────────────────────────────────
9415
- resolveVideo(ci, canvasVideoInputRoutingEnabled) {
9441
+ resolveVideo(ci) {
9416
9442
  const hasAnyImage = ci.hasImage || ci.hasStartingImage || ci.hasEndImage || ci.hasReferenceImage;
9417
9443
  if (ci.hasVideo && hasAnyImage) {
9418
9444
  if (ci.hasEndImage) {
@@ -9445,11 +9471,7 @@ var AutoModelProxy = class {
9445
9471
  return this.lookupRoute("video", "video-with-audio");
9446
9472
  }
9447
9473
  if (ci.hasAudio && (ci.hasStartingImage || ci.hasImage) && ci.hasEndImage) {
9448
- return canvasVideoInputRoutingEnabled ? this.lookupRoute("video", "frames-with-audio") : {
9449
- valid: true,
9450
- model: "ltx-2.3-audio",
9451
- variant: "image-to-video"
9452
- };
9474
+ return this.lookupRoute("video", "frames-with-audio");
9453
9475
  }
9454
9476
  if (ci.hasAudio && hasAnyImage) {
9455
9477
  return this.lookupRoute("video", "image-with-audio");
@@ -10502,6 +10524,16 @@ var NodeVersionResponseSchema = external_exports.object({
10502
10524
  */
10503
10525
  modelDisplayName: external_exports.string().nullable().optional(),
10504
10526
  asset: AssetResponseSchema.nullable(),
10527
+ /**
10528
+ * For a version produced by a node tool (background removal, subtitles,
10529
+ * GIF, upscale — i.e. `sourceToolName` is set), the source asset the tool
10530
+ * transformed. A tool runs in place on a file node, so the input lives on
10531
+ * an earlier version that the bulk content response does not ship; this
10532
+ * surfaces it so consumers (e.g. Playground history) can show what the tool
10533
+ * ran on without re-fetching the node's full version list. Populated only
10534
+ * when the caller opts in via `includeToolInputReferences`.
10535
+ */
10536
+ toolInputAsset: AssetResponseSchema.nullable().optional(),
10505
10537
  pdfExtraction: PdfExtractionSchema.nullable().optional(),
10506
10538
  /** Present when an active node run exists for this version (e.g. PDF extraction in progress). */
10507
10539
  nodeRunId: external_exports.string().uuid().nullable().optional(),
@@ -10524,7 +10556,12 @@ var MagicResizeOutputSchema = external_exports.object({
10524
10556
  assetId: external_exports.string().nullable(),
10525
10557
  assetUrl: external_exports.string().nullable(),
10526
10558
  previewUrl: external_exports.string().nullable(),
10527
- failed: external_exports.boolean().optional()
10559
+ failed: external_exports.boolean().optional(),
10560
+ // User-facing failure reason for a `failed` layer, mirroring the error
10561
+ // message + severity a regular media node shows (e.g. a provider error vs.
10562
+ // a content-moderation warning). Absent on successful layers.
10563
+ errorMessage: external_exports.string().nullish(),
10564
+ errorSeverity: external_exports.enum(["error", "warning"]).nullish()
10528
10565
  });
10529
10566
  var NodeResponseSchema = external_exports.object({
10530
10567
  id: external_exports.string().uuid(),
@@ -10586,6 +10623,8 @@ var NodeResponseSchema = external_exports.object({
10586
10623
  childNodeIds: external_exports.array(external_exports.string().uuid()).optional(),
10587
10624
  /** Per-ratio outputs for magic-resize nodes (from CRDT); one per variant. */
10588
10625
  magicResizeOutputs: external_exports.array(MagicResizeOutputSchema).nullable().optional(),
10626
+ /** User id of the team member who created the node, or null when unknown. */
10627
+ createdByUserId: external_exports.string().uuid().nullable().optional(),
10589
10628
  versions: external_exports.array(NodeVersionResponseSchema),
10590
10629
  createdAt: external_exports.string().datetime(),
10591
10630
  updatedAt: external_exports.string().datetime()
@@ -10606,7 +10645,7 @@ var CanvasMediaPresetSchema = external_exports.object({
10606
10645
  aspectRatio: OutputAspectRatioSchema.optional(),
10607
10646
  resolution: OutputResolutionSchema.optional(),
10608
10647
  fast: external_exports.boolean().optional(),
10609
- numVariations: external_exports.number().int().min(1).max(10).optional()
10648
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional()
10610
10649
  }).optional(),
10611
10650
  video: external_exports.object({
10612
10651
  model: external_exports.string().optional(),
@@ -10615,13 +10654,13 @@ var CanvasMediaPresetSchema = external_exports.object({
10615
10654
  resolution: OutputResolutionSchema.optional(),
10616
10655
  duration: external_exports.number().int().positive().optional(),
10617
10656
  fast: external_exports.boolean().optional(),
10618
- numVariations: external_exports.number().int().min(1).max(10).optional()
10657
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional()
10619
10658
  }).optional(),
10620
10659
  text: external_exports.object({
10621
10660
  model: external_exports.string().optional(),
10622
10661
  mode: external_exports.string().optional(),
10623
10662
  fast: external_exports.boolean().optional(),
10624
- numVariations: external_exports.number().int().min(1).max(10).optional()
10663
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional()
10625
10664
  }).optional(),
10626
10665
  audio: external_exports.object({
10627
10666
  model: external_exports.string().optional(),
@@ -10663,7 +10702,24 @@ var CanvasContentQuerySchema = external_exports.object({
10663
10702
  * so the model reads the summary instead of a URL. The web app does
10664
10703
  * not set this, so it always receives URLs.
10665
10704
  */
10666
- mediaSummaries: QueryBooleanSchema.optional()
10705
+ mediaSummaries: QueryBooleanSchema.optional(),
10706
+ /**
10707
+ * Opt-in: resolve the source asset each node-tool version transformed
10708
+ * onto `version.toolInputAsset` (see that field). Off by default so the
10709
+ * common canvas/agent/MCP reads never pay the extra version lookup; the
10710
+ * Playground history loader sets it to restore tool-run input previews.
10711
+ */
10712
+ includeToolInputReferences: QueryBooleanSchema.optional(),
10713
+ /**
10714
+ * Opt-in: ship EVERY asset-bearing version for generation nodes
10715
+ * (image/video/audio) with more than one output, so a
10716
+ * native-variations node (one node, N output versions) can rebuild
10717
+ * its full output set from a bulk read. Resolved in a bounded batched
10718
+ * pass like `includeToolInputReferences`; off by default so common
10719
+ * reads pay nothing. Unlike `includeAllVersions` it needs no nodeId
10720
+ * scoping.
10721
+ */
10722
+ includeVariationVersions: QueryBooleanSchema.optional()
10667
10723
  }).refine(
10668
10724
  (query) => query.includeAllVersions !== true || query.nodeId !== void 0,
10669
10725
  {
@@ -10698,7 +10754,7 @@ var RunNodeBodySchema = external_exports.object({
10698
10754
  outputDuration: external_exports.number().int().positive().optional(),
10699
10755
  outputResolution: OutputResolutionSchema.optional(),
10700
10756
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).optional(),
10701
- numVariations: external_exports.number().int().min(1).max(10).optional(),
10757
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional(),
10702
10758
  /**
10703
10759
  * Dev-only: force a specific generation provider for the run. When set,
10704
10760
  * `prepareGenerationRequest` restricts variant selection to the named
@@ -10772,7 +10828,7 @@ var RunImageToolBodySchema = external_exports.object({
10772
10828
  canvasId: external_exports.string().uuid().optional(),
10773
10829
  toolName: external_exports.string().trim().min(1),
10774
10830
  toolConfig: external_exports.record(external_exports.unknown()).optional(),
10775
- numVariations: external_exports.number().int().min(1).max(10).optional(),
10831
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional(),
10776
10832
  /** Base64-encoded PNG mask image for inpainting (white = areas to regenerate). */
10777
10833
  maskImageBase64: external_exports.string().optional()
10778
10834
  });
@@ -11446,7 +11502,12 @@ var canvasContract = c7.router({
11446
11502
  failedLayers: external_exports.array(
11447
11503
  external_exports.object({
11448
11504
  layerIndex: external_exports.number().int(),
11449
- ratio: external_exports.string()
11505
+ ratio: external_exports.string(),
11506
+ // User-facing failure reason + severity (mirrors a
11507
+ // regular media node's error/warning). Optional so
11508
+ // a new client tolerates an older backend.
11509
+ errorMessage: external_exports.string().nullish(),
11510
+ errorSeverity: external_exports.enum(["error", "warning"]).nullish()
11450
11511
  })
11451
11512
  ).nullish()
11452
11513
  }),
@@ -11775,7 +11836,7 @@ var canvasContract = c7.router({
11775
11836
  * every intermediate node — see `BulkNodeRunService`. Used by the
11776
11837
  * template box's variation stepper. Defaults to 1 when omitted.
11777
11838
  */
11778
- numVariations: external_exports.number().int().min(1).max(10).optional(),
11839
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional(),
11779
11840
  /**
11780
11841
  * Node ids whose audio-to-video duration should be matched to
11781
11842
  * connected generated audio after upstream audio nodes finish.
@@ -12306,7 +12367,7 @@ var GenerationRunBodySchema = external_exports.object({
12306
12367
  duration: external_exports.number().int().positive().optional(),
12307
12368
  resolution: OutputResolutionSchema.optional(),
12308
12369
  seed: external_exports.number().int().nonnegative().max(MAX_SEED).optional(),
12309
- numVariations: external_exports.number().int().min(1).max(10).optional(),
12370
+ numVariations: external_exports.number().int().min(1).max(MAX_VARIATIONS).optional(),
12310
12371
  /**
12311
12372
  * Whether the variant should generate audio. Only honored on variants
12312
12373
  * whose registry entry declares `falAudioField`. Defaults to `true`.
@@ -12573,6 +12634,10 @@ var GenerationHistoryItemSchema = external_exports.object({
12573
12634
  id: external_exports.string(),
12574
12635
  type: external_exports.enum(["media", "text"]),
12575
12636
  model: external_exports.string(),
12637
+ // Speed tier (e.g. "fast") the job ran at, when it ran at a non-standard
12638
+ // one. Optional so older clients ignore it and the field is absent for
12639
+ // standard-tier and text generations.
12640
+ tier: external_exports.string().nullable().optional(),
12576
12641
  status: GenerationJobStatusSchema,
12577
12642
  creditCost: external_exports.number().nullable(),
12578
12643
  createdAt: external_exports.string(),
@@ -12631,6 +12696,15 @@ var generationContract = c9.router({
12631
12696
  200: ListGenerativeModelsResponseSchema
12632
12697
  }
12633
12698
  },
12699
+ listPublicGenerativeModels: {
12700
+ method: "GET",
12701
+ path: "/generation/models/public",
12702
+ query: external_exports.object({ category: ModelCategorySchema }),
12703
+ responses: {
12704
+ 200: ListGenerativeModelsResponseSchema
12705
+ },
12706
+ summary: "List generally-available models without authentication (logged-out home)"
12707
+ },
12634
12708
  listHeygenAvatarVAvatars: {
12635
12709
  method: "GET",
12636
12710
  path: "/generation/heygen-avatar-v-avatars",
@@ -12645,6 +12719,14 @@ var generationContract = c9.router({
12645
12719
  200: AutoModelDefaultsResponseSchema
12646
12720
  }
12647
12721
  },
12722
+ getPublicAutoModelDefaults: {
12723
+ method: "GET",
12724
+ path: "/generation/auto-model-defaults/public",
12725
+ responses: {
12726
+ 200: AutoModelDefaultsResponseSchema
12727
+ },
12728
+ summary: "Auto-model defaults without authentication (logged-out home)"
12729
+ },
12648
12730
  listGenerationHistory: {
12649
12731
  method: "GET",
12650
12732
  path: "/generation/history",
@@ -14138,7 +14220,7 @@ function isMajorUpgrade(current, latest) {
14138
14220
  return l[0] > c17[0];
14139
14221
  }
14140
14222
  function shouldShowUpgradeNotice(ctx = {}) {
14141
- const current = ctx.current ?? "0.8.0";
14223
+ const current = ctx.current ?? "0.9.0";
14142
14224
  const latest = ctx.latest ?? serverLatestVersion;
14143
14225
  const env = ctx.env ?? process.env;
14144
14226
  const isTty = ctx.isTty ?? Boolean(process.stderr.isTTY);
@@ -14159,7 +14241,7 @@ Upgrade: npm install -g @melius-ai/cli@latest (or: brew update && brew upgrade
14159
14241
  function printUpgradeNoticeIfNeeded(ctx = {}) {
14160
14242
  try {
14161
14243
  if (!shouldShowUpgradeNotice(ctx)) return;
14162
- const current = ctx.current ?? "0.8.0";
14244
+ const current = ctx.current ?? "0.9.0";
14163
14245
  const latest = ctx.latest ?? serverLatestVersion;
14164
14246
  process.stderr.write(formatUpgradeNotice(current, latest));
14165
14247
  } catch {
@@ -18843,10 +18925,10 @@ function registerAssetCommands(program2, getOutputOpts) {
18843
18925
  "Search and place the team's Files (DAM) library assets. Requires a Pro or Enterprise plan"
18844
18926
  );
18845
18927
  asset.command("search").description(
18846
- "Search the team's Files/DAM library (uploads + past generations) by meaning (semantic), with exact filename/title matches ranked first. Returns up to 20 relevant matches per page. Scope to a folder with --folder-id; filter by tag with --tags; omit the query and pass --folder-id or --tags to bring in the whole folder / all tagged assets"
18928
+ "Search the team's Files/DAM library (uploads + past generations) by meaning (semantic), with exact filename/title matches ranked first. Returns up to 20 relevant matches per page. Filter by asset source with --source, scope to a folder with --folder-id, or filter by tag with --tags; omit the query and pass --folder-id or --tags to bring in the whole folder / all tagged assets"
18847
18929
  ).argument(
18848
18930
  "[query]",
18849
- 'Search terms \u2014 a filename or a description of the content, e.g. "Product_Shot_05" or "black jacket shot". Optional: OMIT it and pass --folder-id to list EVERY asset in that folder'
18931
+ 'Search terms \u2014 an exact filename (including its extension) or a description of the content, e.g. "Product_Shot_05.png" or "black jacket shot". Optional: OMIT it and pass --folder-id to list EVERY asset in that folder'
18850
18932
  ).option("--limit <n>", "Max results per page (1-20, default 20)", "20").option(
18851
18933
  "--offset <n>",
18852
18934
  "Skip the first N matches to page deeper (default 0). Page with --limit until the running count reaches the response's total",
@@ -18854,6 +18936,9 @@ function registerAssetCommands(program2, getOutputOpts) {
18854
18936
  ).option(
18855
18937
  "--file-type <type>",
18856
18938
  "Filter by media type: image, video, audio, pdf, or text"
18939
+ ).option(
18940
+ "--source <source>",
18941
+ "Filter by asset source: upload (member-uploaded files) or generated (media created in Melius)"
18857
18942
  ).option(
18858
18943
  "--canvas-id <canvasId>",
18859
18944
  "Scope to one canvas's assets (a filename match within that canvas). Omit to search the whole team library by meaning, exact matches first (the default)"
@@ -18873,6 +18958,8 @@ Resolve a folder name to an id with mel asset folders first.
18873
18958
 
18874
18959
  Examples:
18875
18960
  $ mel asset search "black jacket shot"
18961
+ $ mel asset search "Product_Shot_05.PNG" --source upload
18962
+ $ mel asset search "shark close-up" --source generated
18876
18963
  $ mel asset search "logo" --file-type image --limit 10
18877
18964
  $ mel asset search "logo" --limit 20 --offset 20
18878
18965
  $ mel asset search "shark" --folder-id <folderId> # find within a folder
@@ -18902,6 +18989,9 @@ Examples:
18902
18989
  ...opts.fileType !== void 0 && {
18903
18990
  fileType: opts.fileType
18904
18991
  },
18992
+ ...opts.source !== void 0 && {
18993
+ source: opts.source
18994
+ },
18905
18995
  ...opts.canvasId !== void 0 && {
18906
18996
  canvasId: opts.canvasId
18907
18997
  },
@@ -19115,7 +19205,7 @@ function withDefaultHelp(args) {
19115
19205
  }
19116
19206
  function createProgram() {
19117
19207
  const program2 = new Command();
19118
- program2.name("mel").description("Mel \u2014 Melius agent CLI").version("0.8.0").showSuggestionAfterError(true).option("--json", "Force JSON output (default)").option("--text", "Human-readable output").option(
19208
+ program2.name("mel").description("Mel \u2014 Melius agent CLI").version("0.9.0").showSuggestionAfterError(true).option("--json", "Force JSON output (default)").option("--text", "Human-readable output").option(
19119
19209
  "--fields <fields>",
19120
19210
  "Select specific output fields (comma-separated)"
19121
19211
  ).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-3PBGQVUH.js";
5
+ } from "../chunk-24FW76XZ.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.8.0",
3
+ "version": "0.9.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",