stow-cli 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/app-Q6EW7VSM.js +249 -0
  2. package/dist/backfill-EVZT7RH6.js +67 -0
  3. package/dist/backfill-JCNPLFJU.js +67 -0
  4. package/dist/backfill-VAORMLMY.js +67 -0
  5. package/dist/buckets-AFNX7FV3.js +137 -0
  6. package/dist/buckets-VYI2QVLO.js +137 -0
  7. package/dist/buckets-ZHP3LBLC.js +137 -0
  8. package/dist/chunk-3BLL5SQJ.js +27 -0
  9. package/dist/chunk-5BVMPHKH.js +147 -0
  10. package/dist/chunk-5IX3ASXH.js +153 -0
  11. package/dist/chunk-FZGOTXTE.js +45 -0
  12. package/dist/chunk-P2BKGBQE.js +136 -0
  13. package/dist/chunk-PLZFHPLC.js +52 -0
  14. package/dist/cli.js +80 -53
  15. package/dist/delete-YEXSMG4I.js +34 -0
  16. package/dist/describe-CU5FBHZS.js +79 -0
  17. package/dist/describe-HSEHMJVD.js +79 -0
  18. package/dist/describe-J4ZMUXK7.js +79 -0
  19. package/dist/drops-5VIEW3XZ.js +39 -0
  20. package/dist/files-CFOTEASC.js +206 -0
  21. package/dist/files-UQODXWNT.js +206 -0
  22. package/dist/files-XU6MDPP4.js +206 -0
  23. package/dist/health-RICGWQGN.js +61 -0
  24. package/dist/health-SH6T6DZS.js +61 -0
  25. package/dist/health-YLNNKAFP.js +61 -0
  26. package/dist/jobs-PTV2W5PJ.js +102 -0
  27. package/dist/jobs-RMRGXLAA.js +90 -0
  28. package/dist/jobs-ROJFRPMR.js +90 -0
  29. package/dist/jobs-TND5AHCL.js +102 -0
  30. package/dist/jobs-TOLVGN6K.js +102 -0
  31. package/dist/jobs-ZWSEXNFA.js +90 -0
  32. package/dist/maintenance-6XNJ56LL.js +79 -0
  33. package/dist/maintenance-V2TXPXQE.js +79 -0
  34. package/dist/maintenance-ZJW2ES4L.js +79 -0
  35. package/dist/profiles-CHBGKQOE.js +53 -0
  36. package/dist/profiles-MB3TZQE4.js +53 -0
  37. package/dist/profiles-NVCJCYXR.js +53 -0
  38. package/dist/queues-AUGTAFBT.js +61 -0
  39. package/dist/queues-EZ2VZGXQ.js +61 -0
  40. package/dist/queues-NR25TGT7.js +61 -0
  41. package/dist/search-ETC2EXKM.js +135 -0
  42. package/dist/search-ICJO264J.js +135 -0
  43. package/dist/search-TRTPX2SQ.js +135 -0
  44. package/dist/tags-75SSHS26.js +90 -0
  45. package/dist/tags-TBFPDHIQ.js +90 -0
  46. package/dist/tags-VH44BGQL.js +90 -0
  47. package/dist/upload-OS6Q6LW5.js +126 -0
  48. package/dist/whoami-TVRKBM74.js +28 -0
  49. package/package.json +1 -1
@@ -0,0 +1,136 @@
1
+ // src/lib/sanitize-response.ts
2
+ var INJECTION_PATTERNS = [
3
+ // Direct instruction injection
4
+ /\b(?:ignore|disregard|forget)\b.*\b(?:previous|above|prior)\b.*\b(?:instructions?|rules?|context)\b/i,
5
+ // System prompt extraction attempts
6
+ /\b(?:reveal|show|print|output|display)\b.*\b(?:system\s*prompt|instructions?|rules?)\b/i,
7
+ // Role hijacking
8
+ /\byou\s+are\s+(?:now|a)\b/i,
9
+ // Tool/action injection
10
+ /\b(?:execute|run|call)\b.*\b(?:command|tool|function|bash|shell)\b/i,
11
+ // Markdown/XML injection that could affect agent parsing
12
+ /<\/?(?:system|user|assistant|tool_use|tool_result)\b/i
13
+ ];
14
+ var USER_CONTENT_FIELDS = /* @__PURE__ */ new Set([
15
+ "originalFilename",
16
+ "filename",
17
+ "name",
18
+ "description",
19
+ "label",
20
+ "text",
21
+ "slug",
22
+ "webhookUrl"
23
+ ]);
24
+ function detectInjection(value) {
25
+ return INJECTION_PATTERNS.some((pattern) => pattern.test(value));
26
+ }
27
+ function sanitizeValue(value) {
28
+ if (detectInjection(value)) {
29
+ return `[FLAGGED: potential prompt injection] ${value}`;
30
+ }
31
+ return value;
32
+ }
33
+ function sanitizeResponse(data) {
34
+ if (data === null || data === void 0) return data;
35
+ if (typeof data === "string") {
36
+ return sanitizeValue(data);
37
+ }
38
+ if (Array.isArray(data)) {
39
+ return data.map((item) => sanitizeResponse(item));
40
+ }
41
+ if (typeof data === "object") {
42
+ const result = {};
43
+ for (const [key, value] of Object.entries(
44
+ data
45
+ )) {
46
+ if (USER_CONTENT_FIELDS.has(key) && typeof value === "string") {
47
+ result[key] = sanitizeValue(value);
48
+ } else if (typeof value === "object" && value !== null) {
49
+ result[key] = sanitizeResponse(value);
50
+ } else {
51
+ result[key] = value;
52
+ }
53
+ }
54
+ return result;
55
+ }
56
+ return data;
57
+ }
58
+
59
+ // src/lib/output.ts
60
+ var _forceHuman = false;
61
+ var _globalFields;
62
+ var _globalNdjson = false;
63
+ function setForceHuman(value) {
64
+ _forceHuman = value;
65
+ }
66
+ function setGlobalFields(fields) {
67
+ _globalFields = fields;
68
+ }
69
+ function setGlobalNdjson(value) {
70
+ _globalNdjson = value;
71
+ }
72
+ function isJsonOutput() {
73
+ if (_forceHuman) return false;
74
+ return !process.stdout.isTTY;
75
+ }
76
+ function output(data, humanFormatter, options) {
77
+ const sanitized = sanitizeResponse(data);
78
+ const masked = applyFieldMask(sanitized, _globalFields);
79
+ if (_globalNdjson && Array.isArray(masked)) {
80
+ outputNdjson(masked);
81
+ return;
82
+ }
83
+ if (options?.json || isJsonOutput()) {
84
+ console.log(JSON.stringify(masked, null, 2));
85
+ } else if (humanFormatter && !_globalFields) {
86
+ console.log(humanFormatter());
87
+ } else {
88
+ console.log(JSON.stringify(masked, null, 2));
89
+ }
90
+ }
91
+ function outputError(error, code, details) {
92
+ if (isJsonOutput()) {
93
+ console.error(
94
+ JSON.stringify({ error, ...code ? { code } : {}, ...details })
95
+ );
96
+ } else {
97
+ console.error(`Error: ${error}`);
98
+ }
99
+ process.exit(1);
100
+ }
101
+ function outputNdjson(items) {
102
+ for (const item of items) {
103
+ const sanitized = sanitizeResponse(item);
104
+ console.log(JSON.stringify(sanitized));
105
+ }
106
+ }
107
+ function applyFieldMask(data, fields) {
108
+ if (!fields) return data;
109
+ const fieldSet = new Set(fields.split(",").map((f) => f.trim()));
110
+ if (Array.isArray(data)) {
111
+ return data.map((item) => pickFields(item, fieldSet));
112
+ }
113
+ if (typeof data === "object" && data !== null) {
114
+ return pickFields(data, fieldSet);
115
+ }
116
+ return data;
117
+ }
118
+ function pickFields(obj, fieldSet) {
119
+ if (typeof obj !== "object" || obj === null) return {};
120
+ const result = {};
121
+ for (const [key, value] of Object.entries(obj)) {
122
+ if (fieldSet.has(key)) {
123
+ result[key] = value;
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+
129
+ export {
130
+ setForceHuman,
131
+ setGlobalFields,
132
+ setGlobalNdjson,
133
+ isJsonOutput,
134
+ output,
135
+ outputError
136
+ };
@@ -0,0 +1,52 @@
1
+ // src/lib/validate-input.ts
2
+ import path from "path";
3
+ var InputValidationError = class extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "InputValidationError";
7
+ }
8
+ };
9
+ function validateInput(value, context) {
10
+ if (value.includes("../") || value.includes("..\\")) {
11
+ throw new InputValidationError(`${context}: path traversal not allowed`);
12
+ }
13
+ if (context !== "url" && value.includes("?")) {
14
+ throw new InputValidationError(
15
+ `${context}: embedded query parameters not allowed`
16
+ );
17
+ }
18
+ if (/[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(value)) {
19
+ throw new InputValidationError(
20
+ `${context}: control characters not allowed`
21
+ );
22
+ }
23
+ if (/%25/.test(value)) {
24
+ throw new InputValidationError(
25
+ `${context}: double-encoded values not allowed`
26
+ );
27
+ }
28
+ if (/%2[fF]/.test(value) || /%2[eE]/.test(value)) {
29
+ throw new InputValidationError(
30
+ `${context}: percent-encoded path characters not allowed`
31
+ );
32
+ }
33
+ if (context !== "url" && value.includes("#")) {
34
+ throw new InputValidationError(
35
+ `${context}: embedded hash fragments not allowed`
36
+ );
37
+ }
38
+ return value;
39
+ }
40
+ function validateBucketName(name) {
41
+ return validateInput(name, "bucket name");
42
+ }
43
+ function validateFileKey(key) {
44
+ return validateInput(key, "file key");
45
+ }
46
+
47
+ export {
48
+ InputValidationError,
49
+ validateInput,
50
+ validateBucketName,
51
+ validateFileKey
52
+ };
package/dist/cli.js CHANGED
@@ -3,26 +3,53 @@ import {
3
3
  CLI_DOCS,
4
4
  renderCommandHelp
5
5
  } from "./chunk-XJDK2CBE.js";
6
+ import {
7
+ InputValidationError
8
+ } from "./chunk-PLZFHPLC.js";
9
+ import {
10
+ outputError,
11
+ setForceHuman,
12
+ setGlobalFields,
13
+ setGlobalNdjson
14
+ } from "./chunk-5IX3ASXH.js";
6
15
 
7
16
  // src/cli.ts
17
+ import { createRequire } from "module";
8
18
  import { StowError } from "@howells/stow-server";
9
19
  import { Command } from "commander";
10
- var VERSION = "1.0.0";
20
+ var require2 = createRequire(import.meta.url);
21
+ var { version: VERSION } = require2("../package.json");
11
22
  function handleError(err) {
12
23
  if (err instanceof StowError) {
13
- console.error(`Error: ${err.message}`);
24
+ outputError(err.message, err.code, { status: err.status });
25
+ } else if (err instanceof InputValidationError) {
26
+ outputError(err.message, "INPUT_VALIDATION");
14
27
  } else if (err instanceof Error) {
15
- console.error(`Error: ${err.message}`);
28
+ outputError(err.message);
16
29
  } else {
17
- console.error(`Error: ${err}`);
30
+ outputError(String(err));
18
31
  }
19
- process.exit(1);
20
32
  }
21
33
  var program = new Command();
22
- program.name("stow").description(CLI_DOCS.root.description).version(VERSION).addHelpText("after", renderCommandHelp("root"));
34
+ program.name("stow").description(CLI_DOCS.root.description).version(VERSION).option("--human", "Force human-readable output (default when TTY)").option(
35
+ "--fields <fields>",
36
+ "Comma-separated fields to include in output (e.g. key,similarity)"
37
+ ).option("--ndjson", "Output as newline-delimited JSON (one object per line)").addHelpText("after", renderCommandHelp("root"));
38
+ program.hook("preAction", () => {
39
+ const opts2 = program.opts();
40
+ if (opts2.human) {
41
+ setForceHuman(true);
42
+ }
43
+ if (opts2.fields) {
44
+ setGlobalFields(opts2.fields);
45
+ }
46
+ if (opts2.ndjson) {
47
+ setGlobalNdjson(true);
48
+ }
49
+ });
23
50
  program.command("drop").description(CLI_DOCS.drop.description).argument("<file>", "File to upload").option("-q, --quiet", "Only output the URL").addHelpText("after", renderCommandHelp("drop")).action(async (file, options) => {
24
51
  try {
25
- const { uploadDrop } = await import("./upload-5TAWJU5N.js");
52
+ const { uploadDrop } = await import("./upload-OS6Q6LW5.js");
26
53
  await uploadDrop(file, options);
27
54
  } catch (err) {
28
55
  handleError(err);
@@ -31,7 +58,7 @@ program.command("drop").description(CLI_DOCS.drop.description).argument("<file>"
31
58
  program.command("upload").description(CLI_DOCS.upload.description).argument("<file>", "File to upload").option("-b, --bucket <name>", "Bucket name or ID").option("-q, --quiet", "Only output the URL").option("--dry-run", "Preview without uploading").addHelpText("after", renderCommandHelp("upload")).action(
32
59
  async (file, options) => {
33
60
  try {
34
- const { uploadFile } = await import("./upload-5TAWJU5N.js");
61
+ const { uploadFile } = await import("./upload-OS6Q6LW5.js");
35
62
  await uploadFile(file, options);
36
63
  } catch (err) {
37
64
  handleError(err);
@@ -40,26 +67,26 @@ program.command("upload").description(CLI_DOCS.upload.description).argument("<fi
40
67
  );
41
68
  var bucketsCmd = program.command("buckets").description(CLI_DOCS.buckets.description).addHelpText("after", renderCommandHelp("buckets")).action(async () => {
42
69
  try {
43
- const { listBuckets } = await import("./buckets-ESAOL6CH.js");
70
+ const { listBuckets } = await import("./buckets-AFNX7FV3.js");
44
71
  await listBuckets();
45
72
  } catch (err) {
46
73
  handleError(err);
47
74
  }
48
75
  });
49
- bucketsCmd.command("create").description(CLI_DOCS.bucketsCreate.description).argument("<name>", "Bucket name").option("-d, --description <text>", "Bucket description").option("--public", "Make bucket public").option("--dry-run", "Preview without creating").addHelpText("after", renderCommandHelp("bucketsCreate")).action(
76
+ bucketsCmd.command("create").description(CLI_DOCS.bucketsCreate.description).argument("<name>", "Bucket name").option("-d, --description <text>", "Bucket description").option("--public", "Make bucket public").option("--dry-run", "Preview without creating").option("--input-json <json>", "Raw JSON payload").addHelpText("after", renderCommandHelp("bucketsCreate")).action(
50
77
  async (name, options) => {
51
78
  try {
52
- const { createBucket } = await import("./buckets-ESAOL6CH.js");
79
+ const { createBucket } = await import("./buckets-AFNX7FV3.js");
53
80
  await createBucket(name, options);
54
81
  } catch (err) {
55
82
  handleError(err);
56
83
  }
57
84
  }
58
85
  );
59
- bucketsCmd.command("rename").description(CLI_DOCS.bucketsRename.description).argument("<name>", "Current bucket name").argument("<new-name>", "New bucket name").option("-y, --yes", "Skip confirmation warning").option("--dry-run", "Preview without renaming").addHelpText("after", renderCommandHelp("bucketsRename")).action(
86
+ bucketsCmd.command("rename").description(CLI_DOCS.bucketsRename.description).argument("<name>", "Current bucket name").argument("<new-name>", "New bucket name").option("-y, --yes", "Skip confirmation warning").option("--dry-run", "Preview without renaming").option("--input-json <json>", "Raw JSON payload").addHelpText("after", renderCommandHelp("bucketsRename")).action(
60
87
  async (name, newName, options) => {
61
88
  try {
62
- const { renameBucket } = await import("./buckets-ESAOL6CH.js");
89
+ const { renameBucket } = await import("./buckets-AFNX7FV3.js");
63
90
  await renameBucket(name, newName, options);
64
91
  } catch (err) {
65
92
  handleError(err);
@@ -68,7 +95,7 @@ bucketsCmd.command("rename").description(CLI_DOCS.bucketsRename.description).arg
68
95
  );
69
96
  bucketsCmd.command("delete").description(CLI_DOCS.bucketsDelete.description).argument("<id>", "Bucket ID").option("--dry-run", "Preview without deleting").addHelpText("after", renderCommandHelp("bucketsDelete")).action(async (id, options) => {
70
97
  try {
71
- const { deleteBucket } = await import("./buckets-ESAOL6CH.js");
98
+ const { deleteBucket } = await import("./buckets-AFNX7FV3.js");
72
99
  await deleteBucket(id, options);
73
100
  } catch (err) {
74
101
  handleError(err);
@@ -81,7 +108,7 @@ var filesCmd = program.command("files").description(CLI_DOCS.files.description).
81
108
  return;
82
109
  }
83
110
  try {
84
- const { listFiles } = await import("./files-TDIGJDN3.js");
111
+ const { listFiles } = await import("./files-XU6MDPP4.js");
85
112
  await listFiles(bucket, options);
86
113
  } catch (err) {
87
114
  handleError(err);
@@ -90,16 +117,16 @@ var filesCmd = program.command("files").description(CLI_DOCS.files.description).
90
117
  );
91
118
  filesCmd.command("get").description(CLI_DOCS.filesGet.description).argument("<bucket>", "Bucket name").argument("<key>", "File key").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("filesGet")).action(async (bucket, key, options) => {
92
119
  try {
93
- const { getFile } = await import("./files-TDIGJDN3.js");
120
+ const { getFile } = await import("./files-XU6MDPP4.js");
94
121
  await getFile(bucket, key, options);
95
122
  } catch (err) {
96
123
  handleError(err);
97
124
  }
98
125
  });
99
- filesCmd.command("update").description(CLI_DOCS.filesUpdate.description).argument("<bucket>", "Bucket name").argument("<key>", "File key").option("-m, --metadata <kv...>", "Metadata key=value pairs").option("--json", "Output as JSON").option("--dry-run", "Preview without updating").addHelpText("after", renderCommandHelp("filesUpdate")).action(
126
+ filesCmd.command("update").description(CLI_DOCS.filesUpdate.description).argument("<bucket>", "Bucket name").argument("<key>", "File key").option("-m, --metadata <kv...>", "Metadata key=value pairs").option("--json", "Output as JSON").option("--dry-run", "Preview without updating").option("--input-json <json>", "Raw JSON payload").addHelpText("after", renderCommandHelp("filesUpdate")).action(
100
127
  async (bucket, key, options) => {
101
128
  try {
102
- const { updateFile } = await import("./files-TDIGJDN3.js");
129
+ const { updateFile } = await import("./files-XU6MDPP4.js");
103
130
  await updateFile(bucket, key, options);
104
131
  } catch (err) {
105
132
  handleError(err);
@@ -108,7 +135,7 @@ filesCmd.command("update").description(CLI_DOCS.filesUpdate.description).argumen
108
135
  );
109
136
  filesCmd.command("enrich").description(CLI_DOCS.filesEnrich.description).argument("<bucket>", "Bucket name").argument("<key>", "File key").addHelpText("after", renderCommandHelp("filesEnrich")).action(async (bucket, key) => {
110
137
  try {
111
- const { enrichFile } = await import("./files-TDIGJDN3.js");
138
+ const { enrichFile } = await import("./files-XU6MDPP4.js");
112
139
  await enrichFile(bucket, key);
113
140
  } catch (err) {
114
141
  handleError(err);
@@ -117,7 +144,7 @@ filesCmd.command("enrich").description(CLI_DOCS.filesEnrich.description).argumen
117
144
  filesCmd.command("missing").description(CLI_DOCS.filesMissing.description).argument("<bucket>", "Bucket name").argument("<type>", "dimensions | embeddings | colors").option("-l, --limit <count>", "Max files to return").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("filesMissing")).action(
118
145
  async (bucket, type, options) => {
119
146
  try {
120
- const { listMissing } = await import("./files-TDIGJDN3.js");
147
+ const { listMissing } = await import("./files-XU6MDPP4.js");
121
148
  await listMissing(bucket, type, options);
122
149
  } catch (err) {
123
150
  handleError(err);
@@ -126,7 +153,7 @@ filesCmd.command("missing").description(CLI_DOCS.filesMissing.description).argum
126
153
  );
127
154
  var dropsCmd = program.command("drops").description(CLI_DOCS.drops.description).addHelpText("after", renderCommandHelp("drops")).action(async () => {
128
155
  try {
129
- const { listDrops } = await import("./drops-RD55IDZ4.js");
156
+ const { listDrops } = await import("./drops-5VIEW3XZ.js");
130
157
  await listDrops();
131
158
  } catch (err) {
132
159
  handleError(err);
@@ -134,7 +161,7 @@ var dropsCmd = program.command("drops").description(CLI_DOCS.drops.description).
134
161
  });
135
162
  dropsCmd.command("delete").description(CLI_DOCS.dropsDelete.description).argument("<id>", "Drop ID").addHelpText("after", renderCommandHelp("dropsDelete")).action(async (id) => {
136
163
  try {
137
- const { deleteDrop } = await import("./drops-RD55IDZ4.js");
164
+ const { deleteDrop } = await import("./drops-5VIEW3XZ.js");
138
165
  await deleteDrop(id);
139
166
  } catch (err) {
140
167
  handleError(err);
@@ -144,7 +171,7 @@ var searchCmd = program.command("search").description(CLI_DOCS.search.descriptio
144
171
  searchCmd.command("text").description(CLI_DOCS.searchText.description).argument("<query>", "Search query").option("-b, --bucket <name>", "Bucket name").option("-l, --limit <count>", "Max results").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("searchText")).action(
145
172
  async (query, options) => {
146
173
  try {
147
- const { textSearch } = await import("./search-DV4VV62L.js");
174
+ const { textSearch } = await import("./search-ETC2EXKM.js");
148
175
  await textSearch(query, options);
149
176
  } catch (err) {
150
177
  handleError(err);
@@ -154,7 +181,7 @@ searchCmd.command("text").description(CLI_DOCS.searchText.description).argument(
154
181
  searchCmd.command("similar").description(CLI_DOCS.searchSimilar.description).requiredOption("--file <key>", "File key to search from").option("-b, --bucket <name>", "Bucket name").option("-l, --limit <count>", "Max results").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("searchSimilar")).action(
155
182
  async (options) => {
156
183
  try {
157
- const { similarSearch } = await import("./search-DV4VV62L.js");
184
+ const { similarSearch } = await import("./search-ETC2EXKM.js");
158
185
  await similarSearch(options);
159
186
  } catch (err) {
160
187
  handleError(err);
@@ -164,7 +191,7 @@ searchCmd.command("similar").description(CLI_DOCS.searchSimilar.description).req
164
191
  searchCmd.command("color").description(CLI_DOCS.searchColor.description).requiredOption("--hex <color>", "Hex color code").option("-b, --bucket <name>", "Bucket name").option("-l, --limit <count>", "Max results").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("searchColor")).action(
165
192
  async (options) => {
166
193
  try {
167
- const { colorSearch } = await import("./search-DV4VV62L.js");
194
+ const { colorSearch } = await import("./search-ETC2EXKM.js");
168
195
  await colorSearch(options);
169
196
  } catch (err) {
170
197
  handleError(err);
@@ -174,7 +201,7 @@ searchCmd.command("color").description(CLI_DOCS.searchColor.description).require
174
201
  searchCmd.command("diverse").description(CLI_DOCS.searchDiverse.description).option("-b, --bucket <name>", "Bucket name").option("-l, --limit <count>", "Max results").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("searchDiverse")).action(
175
202
  async (options) => {
176
203
  try {
177
- const { diverseSearch } = await import("./search-DV4VV62L.js");
204
+ const { diverseSearch } = await import("./search-ETC2EXKM.js");
178
205
  await diverseSearch(options);
179
206
  } catch (err) {
180
207
  handleError(err);
@@ -183,16 +210,16 @@ searchCmd.command("diverse").description(CLI_DOCS.searchDiverse.description).opt
183
210
  );
184
211
  var tagsCmd = program.command("tags").description(CLI_DOCS.tags.description).option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("tags")).action(async (options) => {
185
212
  try {
186
- const { listTags } = await import("./tags-MCFL5M2J.js");
213
+ const { listTags } = await import("./tags-TBFPDHIQ.js");
187
214
  await listTags(options);
188
215
  } catch (err) {
189
216
  handleError(err);
190
217
  }
191
218
  });
192
- tagsCmd.command("create").description(CLI_DOCS.tagsCreate.description).argument("<name>", "Tag name").option("--color <hex>", "Tag color (hex)").option("--json", "Output as JSON").option("--dry-run", "Preview without creating").addHelpText("after", renderCommandHelp("tagsCreate")).action(
219
+ tagsCmd.command("create").description(CLI_DOCS.tagsCreate.description).argument("<name>", "Tag name").option("--color <hex>", "Tag color (hex)").option("--json", "Output as JSON").option("--dry-run", "Preview without creating").option("--input-json <json>", "Raw JSON payload").addHelpText("after", renderCommandHelp("tagsCreate")).action(
193
220
  async (name, options) => {
194
221
  try {
195
- const { createTag } = await import("./tags-MCFL5M2J.js");
222
+ const { createTag } = await import("./tags-TBFPDHIQ.js");
196
223
  await createTag(name, options);
197
224
  } catch (err) {
198
225
  handleError(err);
@@ -201,7 +228,7 @@ tagsCmd.command("create").description(CLI_DOCS.tagsCreate.description).argument(
201
228
  );
202
229
  tagsCmd.command("delete").description(CLI_DOCS.tagsDelete.description).argument("<id>", "Tag ID").option("--dry-run", "Preview without deleting").addHelpText("after", renderCommandHelp("tagsDelete")).action(async (id, options) => {
203
230
  try {
204
- const { deleteTag } = await import("./tags-MCFL5M2J.js");
231
+ const { deleteTag } = await import("./tags-TBFPDHIQ.js");
205
232
  await deleteTag(id, options);
206
233
  } catch (err) {
207
234
  handleError(err);
@@ -211,7 +238,7 @@ var profilesCmd = program.command("profiles").description(CLI_DOCS.profiles.desc
211
238
  profilesCmd.command("create").description(CLI_DOCS.profilesCreate.description).requiredOption("--name <name>", "Profile name").option("-b, --bucket <id>", "Bucket ID").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("profilesCreate")).action(
212
239
  async (options) => {
213
240
  try {
214
- const { createProfile } = await import("./profiles-C6SCFXS6.js");
241
+ const { createProfile } = await import("./profiles-MB3TZQE4.js");
215
242
  await createProfile(options);
216
243
  } catch (err) {
217
244
  handleError(err);
@@ -220,7 +247,7 @@ profilesCmd.command("create").description(CLI_DOCS.profilesCreate.description).r
220
247
  );
221
248
  profilesCmd.command("get").description(CLI_DOCS.profilesGet.description).argument("<id>", "Profile ID").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("profilesGet")).action(async (id, options) => {
222
249
  try {
223
- const { getProfile } = await import("./profiles-C6SCFXS6.js");
250
+ const { getProfile } = await import("./profiles-MB3TZQE4.js");
224
251
  await getProfile(id, options);
225
252
  } catch (err) {
226
253
  handleError(err);
@@ -228,7 +255,7 @@ profilesCmd.command("get").description(CLI_DOCS.profilesGet.description).argumen
228
255
  });
229
256
  profilesCmd.command("delete").description(CLI_DOCS.profilesDelete.description).argument("<id>", "Profile ID").addHelpText("after", renderCommandHelp("profilesDelete")).action(async (id) => {
230
257
  try {
231
- const { deleteProfile } = await import("./profiles-C6SCFXS6.js");
258
+ const { deleteProfile } = await import("./profiles-MB3TZQE4.js");
232
259
  await deleteProfile(id);
233
260
  } catch (err) {
234
261
  handleError(err);
@@ -237,7 +264,7 @@ profilesCmd.command("delete").description(CLI_DOCS.profilesDelete.description).a
237
264
  var jobsCmd = program.command("jobs").description(CLI_DOCS.jobs.description).requiredOption("-b, --bucket <id>", "Bucket ID (required)").option("-s, --status <status>", "Filter by status").option("-q, --queue <name>", "Filter by queue name").option("-l, --limit <count>", "Max jobs to return").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("jobs")).action(
238
265
  async (options) => {
239
266
  try {
240
- const { listJobs } = await import("./jobs-CLXYKZ3B.js");
267
+ const { listJobs } = await import("./jobs-TND5AHCL.js");
241
268
  await listJobs(options.bucket, options);
242
269
  } catch (err) {
243
270
  handleError(err);
@@ -246,7 +273,7 @@ var jobsCmd = program.command("jobs").description(CLI_DOCS.jobs.description).req
246
273
  );
247
274
  jobsCmd.command("retry").description(CLI_DOCS.jobsRetry.description).argument("<id>", "Job ID").requiredOption("-q, --queue <name>", "Queue name").requiredOption("-b, --bucket <id>", "Bucket ID").addHelpText("after", renderCommandHelp("jobsRetry")).action(async (id, options) => {
248
275
  try {
249
- const { retryJob } = await import("./jobs-CLXYKZ3B.js");
276
+ const { retryJob } = await import("./jobs-TND5AHCL.js");
250
277
  await retryJob(id, options);
251
278
  } catch (err) {
252
279
  handleError(err);
@@ -254,7 +281,7 @@ jobsCmd.command("retry").description(CLI_DOCS.jobsRetry.description).argument("<
254
281
  });
255
282
  jobsCmd.command("delete").description(CLI_DOCS.jobsDelete.description).argument("<id>", "Job ID").requiredOption("-q, --queue <name>", "Queue name").requiredOption("-b, --bucket <id>", "Bucket ID").addHelpText("after", renderCommandHelp("jobsDelete")).action(async (id, options) => {
256
283
  try {
257
- const { deleteJob } = await import("./jobs-CLXYKZ3B.js");
284
+ const { deleteJob } = await import("./jobs-TND5AHCL.js");
258
285
  await deleteJob(id, options);
259
286
  } catch (err) {
260
287
  handleError(err);
@@ -263,7 +290,7 @@ jobsCmd.command("delete").description(CLI_DOCS.jobsDelete.description).argument(
263
290
  var adminCmd = program.command("admin").description(CLI_DOCS.admin.description).addHelpText("after", renderCommandHelp("admin"));
264
291
  adminCmd.command("health").description(CLI_DOCS.adminHealth.description).option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminHealth")).action(async (options) => {
265
292
  try {
266
- const { health } = await import("./health-6LWM7KAT.js");
293
+ const { health } = await import("./health-SH6T6DZS.js");
267
294
  await health(options);
268
295
  } catch (err) {
269
296
  handleError(err);
@@ -273,7 +300,7 @@ var backfillCmd = adminCmd.command("backfill").description(CLI_DOCS.adminBackfil
273
300
  backfillCmd.command("dimensions").description("Backfill image dimensions").option("--bucket <id>", "Bucket ID").option("-l, --limit <count>", "Max files to enqueue").option("--dry-run", "Preview without enqueuing").option("--json", "Output as JSON").action(
274
301
  async (options) => {
275
302
  try {
276
- const { backfillDimensions } = await import("./backfill-G57M2BRA.js");
303
+ const { backfillDimensions } = await import("./backfill-VAORMLMY.js");
277
304
  await backfillDimensions(options);
278
305
  } catch (err) {
279
306
  handleError(err);
@@ -283,7 +310,7 @@ backfillCmd.command("dimensions").description("Backfill image dimensions").optio
283
310
  backfillCmd.command("colors").description("Backfill color extraction").option("--bucket <id>", "Bucket ID").option("-l, --limit <count>", "Max files to enqueue").option("--dry-run", "Preview without enqueuing").option("--json", "Output as JSON").action(
284
311
  async (options) => {
285
312
  try {
286
- const { backfillColors } = await import("./backfill-G57M2BRA.js");
313
+ const { backfillColors } = await import("./backfill-VAORMLMY.js");
287
314
  await backfillColors(options);
288
315
  } catch (err) {
289
316
  handleError(err);
@@ -293,7 +320,7 @@ backfillCmd.command("colors").description("Backfill color extraction").option("-
293
320
  backfillCmd.command("embeddings").description("Backfill embedding generation").option("--bucket <id>", "Bucket ID").option("-l, --limit <count>", "Max files to enqueue").option("--dry-run", "Preview without enqueuing").option("--json", "Output as JSON").action(
294
321
  async (options) => {
295
322
  try {
296
- const { backfillEmbeddings } = await import("./backfill-G57M2BRA.js");
323
+ const { backfillEmbeddings } = await import("./backfill-VAORMLMY.js");
297
324
  await backfillEmbeddings(options);
298
325
  } catch (err) {
299
326
  handleError(err);
@@ -303,7 +330,7 @@ backfillCmd.command("embeddings").description("Backfill embedding generation").o
303
330
  adminCmd.command("cleanup-drops").description(CLI_DOCS.adminCleanupDrops.description).option("--max-age-hours <hours>", "Max age in hours").option("--dry-run", "Preview without deleting").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminCleanupDrops")).action(
304
331
  async (options) => {
305
332
  try {
306
- const { cleanupDrops } = await import("./maintenance-7LOAGG6J.js");
333
+ const { cleanupDrops } = await import("./maintenance-V2TXPXQE.js");
307
334
  await cleanupDrops(options);
308
335
  } catch (err) {
309
336
  handleError(err);
@@ -312,7 +339,7 @@ adminCmd.command("cleanup-drops").description(CLI_DOCS.adminCleanupDrops.descrip
312
339
  );
313
340
  adminCmd.command("purge-events").description(CLI_DOCS.adminPurgeEvents.description).option("--dry-run", "Preview without deleting").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminPurgeEvents")).action(async (options) => {
314
341
  try {
315
- const { purgeEvents } = await import("./maintenance-7LOAGG6J.js");
342
+ const { purgeEvents } = await import("./maintenance-V2TXPXQE.js");
316
343
  await purgeEvents(options);
317
344
  } catch (err) {
318
345
  handleError(err);
@@ -321,7 +348,7 @@ adminCmd.command("purge-events").description(CLI_DOCS.adminPurgeEvents.descripti
321
348
  adminCmd.command("reconcile-files").description(CLI_DOCS.adminReconcileFiles.description).requiredOption("--bucket <id>", "Bucket ID").option("--dry-run", "Preview without reconciling").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminReconcileFiles")).action(
322
349
  async (options) => {
323
350
  try {
324
- const { reconcileFiles } = await import("./maintenance-7LOAGG6J.js");
351
+ const { reconcileFiles } = await import("./maintenance-V2TXPXQE.js");
325
352
  await reconcileFiles(options);
326
353
  } catch (err) {
327
354
  handleError(err);
@@ -330,7 +357,7 @@ adminCmd.command("reconcile-files").description(CLI_DOCS.adminReconcileFiles.des
330
357
  );
331
358
  adminCmd.command("retry-sync-failures").description(CLI_DOCS.adminRetrySyncFailures.description).option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminRetrySyncFailures")).action(async (options) => {
332
359
  try {
333
- const { retrySyncFailures } = await import("./maintenance-7LOAGG6J.js");
360
+ const { retrySyncFailures } = await import("./maintenance-V2TXPXQE.js");
334
361
  await retrySyncFailures(options);
335
362
  } catch (err) {
336
363
  handleError(err);
@@ -339,7 +366,7 @@ adminCmd.command("retry-sync-failures").description(CLI_DOCS.adminRetrySyncFailu
339
366
  var adminJobsCmd = adminCmd.command("jobs").description(CLI_DOCS.adminJobs.description).option("--org <id>", "Filter by org ID").option("--bucket <id>", "Filter by bucket ID").option("-s, --status <status>", "Filter by status").option("-q, --queue <name>", "Filter by queue name").option("-l, --limit <count>", "Max jobs to return").option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminJobs")).action(
340
367
  async (options) => {
341
368
  try {
342
- const { listAdminJobs } = await import("./jobs-K3LTNETU.js");
369
+ const { listAdminJobs } = await import("./jobs-ROJFRPMR.js");
343
370
  await listAdminJobs(options);
344
371
  } catch (err) {
345
372
  handleError(err);
@@ -348,7 +375,7 @@ var adminJobsCmd = adminCmd.command("jobs").description(CLI_DOCS.adminJobs.descr
348
375
  );
349
376
  adminJobsCmd.command("retry").description(CLI_DOCS.adminJobsRetry.description).argument("<id>", "Job ID").requiredOption("-q, --queue <name>", "Queue name").addHelpText("after", renderCommandHelp("adminJobsRetry")).action(async (id, options) => {
350
377
  try {
351
- const { retryAdminJob } = await import("./jobs-K3LTNETU.js");
378
+ const { retryAdminJob } = await import("./jobs-ROJFRPMR.js");
352
379
  await retryAdminJob(id, options);
353
380
  } catch (err) {
354
381
  handleError(err);
@@ -356,7 +383,7 @@ adminJobsCmd.command("retry").description(CLI_DOCS.adminJobsRetry.description).a
356
383
  });
357
384
  adminJobsCmd.command("delete").description(CLI_DOCS.adminJobsDelete.description).argument("<id>", "Job ID").requiredOption("-q, --queue <name>", "Queue name").addHelpText("after", renderCommandHelp("adminJobsDelete")).action(async (id, options) => {
358
385
  try {
359
- const { deleteAdminJob } = await import("./jobs-K3LTNETU.js");
386
+ const { deleteAdminJob } = await import("./jobs-ROJFRPMR.js");
360
387
  await deleteAdminJob(id, options);
361
388
  } catch (err) {
362
389
  handleError(err);
@@ -364,7 +391,7 @@ adminJobsCmd.command("delete").description(CLI_DOCS.adminJobsDelete.description)
364
391
  });
365
392
  var adminQueuesCmd = adminCmd.command("queues").description(CLI_DOCS.adminQueues.description).option("--json", "Output as JSON").addHelpText("after", renderCommandHelp("adminQueues")).action(async (options) => {
366
393
  try {
367
- const { listQueues } = await import("./queues-2GJAMMNF.js");
394
+ const { listQueues } = await import("./queues-NR25TGT7.js");
368
395
  await listQueues(options);
369
396
  } catch (err) {
370
397
  handleError(err);
@@ -373,7 +400,7 @@ var adminQueuesCmd = adminCmd.command("queues").description(CLI_DOCS.adminQueues
373
400
  adminQueuesCmd.command("clean").description(CLI_DOCS.adminQueuesClean.description).argument("<name>", "Queue name").option("--failed", "Clean failed jobs").option("--completed", "Clean completed jobs").option("--grace <seconds>", "Grace period in seconds").addHelpText("after", renderCommandHelp("adminQueuesClean")).action(
374
401
  async (name, options) => {
375
402
  try {
376
- const { cleanQueue } = await import("./queues-2GJAMMNF.js");
403
+ const { cleanQueue } = await import("./queues-NR25TGT7.js");
377
404
  await cleanQueue(name, options);
378
405
  } catch (err) {
379
406
  handleError(err);
@@ -383,7 +410,7 @@ adminQueuesCmd.command("clean").description(CLI_DOCS.adminQueuesClean.descriptio
383
410
  program.command("delete").description(CLI_DOCS.delete.description).argument("<bucket>", "Bucket name").argument("<key>", "File key").option("--dry-run", "Preview without deleting").addHelpText("after", renderCommandHelp("delete")).action(
384
411
  async (bucket, key, options) => {
385
412
  try {
386
- const { deleteFile } = await import("./delete-4JSVNETO.js");
413
+ const { deleteFile } = await import("./delete-YEXSMG4I.js");
387
414
  await deleteFile(bucket, key, options);
388
415
  } catch (err) {
389
416
  handleError(err);
@@ -392,7 +419,7 @@ program.command("delete").description(CLI_DOCS.delete.description).argument("<bu
392
419
  );
393
420
  program.command("whoami").description(CLI_DOCS.whoami.description).addHelpText("after", renderCommandHelp("whoami")).action(async () => {
394
421
  try {
395
- const { whoami } = await import("./whoami-5IYRZKWS.js");
422
+ const { whoami } = await import("./whoami-TVRKBM74.js");
396
423
  await whoami();
397
424
  } catch (err) {
398
425
  handleError(err);
@@ -408,7 +435,7 @@ program.command("open").description(CLI_DOCS.open.description).argument("<bucket
408
435
  });
409
436
  program.command("describe").argument("[command]", "Command path (dot notation, e.g. search.text)").description("Show command schema for AI agents").action(async (command) => {
410
437
  try {
411
- const { describeCommand } = await import("./describe-UFMXNNUB.js");
438
+ const { describeCommand } = await import("./describe-HSEHMJVD.js");
412
439
  describeCommand(command ?? "");
413
440
  } catch (err) {
414
441
  handleError(err);
@@ -427,5 +454,5 @@ program.parse();
427
454
  var opts = program.opts();
428
455
  var args = process.argv.slice(2);
429
456
  if (args.length === 0 || args.length === 1 && opts.interactive) {
430
- import("./app-DTW2LNXW.js").then(({ startInteractive }) => startInteractive()).catch(handleError);
457
+ import("./app-Q6EW7VSM.js").then(({ startInteractive }) => startInteractive()).catch(handleError);
431
458
  }