hive-intelligence 1.0.0 → 1.1.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.
Files changed (29) hide show
  1. package/build/{auth-PVT4GTAD.js → auth-77MKFFBQ.js} +3 -3
  2. package/build/{auth-PVT4GTAD.js.map → auth-77MKFFBQ.js.map} +1 -1
  3. package/build/{chunk-FAFUYZQS.js → chunk-CP3FXEQA.js} +6 -5
  4. package/build/chunk-CP3FXEQA.js.map +1 -0
  5. package/build/{chunk-N43VRMVB.js → chunk-DTUDM6HX.js} +2 -2
  6. package/build/{chunk-IWBWPHYY.js → chunk-RRI526CJ.js} +3 -3
  7. package/build/{chunk-IWBWPHYY.js.map → chunk-RRI526CJ.js.map} +1 -1
  8. package/build/cli.js +39 -20
  9. package/build/cli.js.map +1 -1
  10. package/build/{doctor-A76Q4U4K.js → doctor-7WZMCQC7.js} +4 -4
  11. package/build/{errors-HRGXEUZR.js → errors-U6UZWVSD.js} +2 -2
  12. package/build/format-CVLLK6GD.js +75 -0
  13. package/build/format-CVLLK6GD.js.map +1 -0
  14. package/build/{init-YOJK6CH2.js → init-CAVIFVSH.js} +2 -2
  15. package/build/{init-YOJK6CH2.js.map → init-CAVIFVSH.js.map} +1 -1
  16. package/build/{output-6TJ3JTZ7.js → output-7PGQWJY2.js} +2 -2
  17. package/build/{tools-WYOZZHHG.js → tools-XEGCLA4I.js} +11 -11
  18. package/build/tools-XEGCLA4I.js.map +1 -0
  19. package/build/{watch-P2QWGFYV.js → watch-A75SVIQ6.js} +3 -3
  20. package/package.json +1 -1
  21. package/build/chunk-FAFUYZQS.js.map +0 -1
  22. package/build/format-4OIUGZKY.js +0 -43
  23. package/build/format-4OIUGZKY.js.map +0 -1
  24. package/build/tools-WYOZZHHG.js.map +0 -1
  25. /package/build/{chunk-N43VRMVB.js.map → chunk-DTUDM6HX.js.map} +0 -0
  26. /package/build/{doctor-A76Q4U4K.js.map → doctor-7WZMCQC7.js.map} +0 -0
  27. /package/build/{errors-HRGXEUZR.js.map → errors-U6UZWVSD.js.map} +0 -0
  28. /package/build/{output-6TJ3JTZ7.js.map → output-7PGQWJY2.js.map} +0 -0
  29. /package/build/{watch-P2QWGFYV.js.map → watch-A75SVIQ6.js.map} +0 -0
@@ -8,7 +8,7 @@ import {
8
8
  shouldOutputJson,
9
9
  successEnvelope,
10
10
  writeOutput
11
- } from "./chunk-FAFUYZQS.js";
11
+ } from "./chunk-CP3FXEQA.js";
12
12
  import "./chunk-XQJ6PB2L.js";
13
13
  import "./chunk-QMRVH5ZP.js";
14
14
 
@@ -163,7 +163,7 @@ async function runDoctor(opts) {
163
163
  if (fails > 0) process.exit(1);
164
164
  return;
165
165
  }
166
- const { table } = await import("./format-4OIUGZKY.js");
166
+ const { table } = await import("./format-CVLLK6GD.js");
167
167
  info("\nHive MCP Doctor\n");
168
168
  info(
169
169
  table(
@@ -181,7 +181,7 @@ ${fails === 0 ? "All checks passed" : `${fails} issues found`}${warns ? ` (${war
181
181
  async function runStatus() {
182
182
  const { CLI_VERSION: SERVER_VERSION } = await import("./version-3TZ3U4IR.js");
183
183
  const { resolveApiKey, resolveApiUrl } = await import("./config-dir-IEOID7Q6.js");
184
- const { getActiveProfile, maskKey } = await import("./auth-PVT4GTAD.js");
184
+ const { getActiveProfile, maskKey } = await import("./auth-77MKFFBQ.js");
185
185
  const apiUrl = resolveApiUrl();
186
186
  const apiKey = resolveApiKey();
187
187
  const profile = getActiveProfile();
@@ -228,4 +228,4 @@ export {
228
228
  runDoctor,
229
229
  runStatus
230
230
  };
231
- //# sourceMappingURL=doctor-A76Q4U4K.js.map
231
+ //# sourceMappingURL=doctor-7WZMCQC7.js.map
@@ -5,7 +5,7 @@ import {
5
5
  ExitCode,
6
6
  classifyError,
7
7
  suggestSimilarTools
8
- } from "./chunk-IWBWPHYY.js";
8
+ } from "./chunk-RRI526CJ.js";
9
9
  import "./chunk-QMRVH5ZP.js";
10
10
  export {
11
11
  CliError,
@@ -14,4 +14,4 @@ export {
14
14
  classifyError,
15
15
  suggestSimilarTools
16
16
  };
17
- //# sourceMappingURL=errors-HRGXEUZR.js.map
17
+ //# sourceMappingURL=errors-U6UZWVSD.js.map
@@ -0,0 +1,75 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import "./chunk-QMRVH5ZP.js";
3
+
4
+ // src/cli/format.ts
5
+ function pad(str, width) {
6
+ return str.length >= width ? str.slice(0, width) : str + " ".repeat(width - str.length);
7
+ }
8
+ function table(headers, rows) {
9
+ const widths = headers.map(
10
+ (h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || "").length)) + 2
11
+ );
12
+ const headerLine = headers.map((h, i) => pad(h, widths[i])).join("");
13
+ const separator = widths.map((w) => "-".repeat(w)).join("");
14
+ const dataLines = rows.map(
15
+ (row) => row.map((cell, i) => pad(cell, widths[i])).join("")
16
+ );
17
+ return [headerLine, separator, ...dataLines].join("\n");
18
+ }
19
+ var LABEL_KEYS = ["name", "title", "slug", "symbol", "label", "id"];
20
+ function pickLabel(obj) {
21
+ for (const k of LABEL_KEYS) {
22
+ const v = obj[k];
23
+ if (typeof v === "string" && v) return v;
24
+ if (typeof v === "number" || typeof v === "boolean") return String(v);
25
+ }
26
+ return null;
27
+ }
28
+ function formatCell(v) {
29
+ if (v == null) return "";
30
+ if (typeof v === "string") return v;
31
+ if (typeof v === "number" || typeof v === "boolean") return String(v);
32
+ if (Array.isArray(v)) {
33
+ if (v.length === 0) return "";
34
+ if (v.every((x) => x == null || typeof x !== "object")) {
35
+ return v.map((x) => x == null ? "" : String(x)).join(", ");
36
+ }
37
+ const labels = v.map(
38
+ (x) => x && typeof x === "object" ? pickLabel(x) : null
39
+ ).filter((x) => x !== null);
40
+ if (labels.length === v.length) return labels.join(", ");
41
+ return `[${v.length} items]`;
42
+ }
43
+ if (typeof v === "object") {
44
+ const label = pickLabel(v);
45
+ if (label) return label;
46
+ return `{${Object.keys(v).length} keys}`;
47
+ }
48
+ return String(v);
49
+ }
50
+ function formatTable(data) {
51
+ if (data.length === 0) return "(empty result)";
52
+ const maxCols = 8;
53
+ const maxWidth = 40;
54
+ const allKeys = [...new Set(data.flatMap(Object.keys))];
55
+ const cols = allKeys.slice(0, maxCols);
56
+ const cells = data.map(
57
+ (row) => cols.map((col) => formatCell(row[col]).slice(0, maxWidth))
58
+ );
59
+ const widths = cols.map(
60
+ (col, i) => Math.max(col.length, ...cells.map((r) => r[i].length))
61
+ );
62
+ const header = cols.map((col, i) => col.padEnd(widths[i])).join(" ");
63
+ const separator = widths.map((w) => "-".repeat(w)).join(" ");
64
+ const rows = cells.map(
65
+ (row) => row.map((cell, i) => cell.padEnd(widths[i])).join(" ")
66
+ );
67
+ return [header, separator, ...rows].join("\n");
68
+ }
69
+ export {
70
+ formatCell,
71
+ formatTable,
72
+ pad,
73
+ table
74
+ };
75
+ //# sourceMappingURL=format-CVLLK6GD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/format.ts"],"sourcesContent":["export function pad(str: string, width: number): string {\n return str.length >= width\n ? str.slice(0, width)\n : str + \" \".repeat(width - str.length);\n}\n\nexport function table(headers: string[], rows: string[][]): string {\n const widths = headers.map(\n (h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || \"\").length)) + 2,\n );\n const headerLine = headers.map((h, i) => pad(h, widths[i])).join(\"\");\n const separator = widths.map((w) => \"-\".repeat(w)).join(\"\");\n const dataLines = rows.map((row) =>\n row.map((cell, i) => pad(cell, widths[i])).join(\"\"),\n );\n return [headerLine, separator, ...dataLines].join(\"\\n\");\n}\n\nconst LABEL_KEYS = [\"name\", \"title\", \"slug\", \"symbol\", \"label\", \"id\"];\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const k of LABEL_KEYS) {\n const v = obj[k];\n if (typeof v === \"string\" && v) return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n }\n return null;\n}\n\n/** Render any value to a compact cell string — avoids \"[object Object]\". */\nexport function formatCell(v: unknown): string {\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) {\n if (v.length === 0) return \"\";\n if (v.every((x) => x == null || typeof x !== \"object\")) {\n return v.map((x) => (x == null ? \"\" : String(x))).join(\", \");\n }\n const labels = v\n .map((x) =>\n x && typeof x === \"object\"\n ? pickLabel(x as Record<string, unknown>)\n : null,\n )\n .filter((x): x is string => x !== null);\n if (labels.length === v.length) return labels.join(\", \");\n return `[${v.length} items]`;\n }\n if (typeof v === \"object\") {\n const label = pickLabel(v as Record<string, unknown>);\n if (label) return label;\n return `{${Object.keys(v as object).length} keys}`;\n }\n return String(v);\n}\n\n/** Auto-format an array of objects as a fixed-width table. */\nexport function formatTable(data: Record<string, unknown>[]): string {\n if (data.length === 0) return \"(empty result)\";\n\n const maxCols = 8;\n const maxWidth = 40;\n\n const allKeys = [...new Set(data.flatMap(Object.keys))];\n const cols = allKeys.slice(0, maxCols);\n\n const cells = data.map((row) =>\n cols.map((col) => formatCell(row[col]).slice(0, maxWidth)),\n );\n\n const widths = cols.map((col, i) =>\n Math.max(col.length, ...cells.map((r) => r[i].length)),\n );\n\n const header = cols.map((col, i) => col.padEnd(widths[i])).join(\" \");\n const separator = widths.map((w) => \"-\".repeat(w)).join(\" \");\n const rows = cells.map((row) =>\n row.map((cell, i) => cell.padEnd(widths[i])).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -94,9 +94,9 @@ Validating API key against ${baseUrl}...`);
94
94
  }
95
95
  writeFileSync(envPath, lines + "\n", "utf-8");
96
96
  console.log(`.env written to ${envPath}`);
97
- console.log("Run: hive-mcp doctor to verify connectivity\n");
97
+ console.log("Run: hive doctor to verify connectivity\n");
98
98
  }
99
99
  export {
100
100
  runInit
101
101
  };
102
- //# sourceMappingURL=init-YOJK6CH2.js.map
102
+ //# sourceMappingURL=init-CAVIFVSH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/init.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nconst DEFAULT_API_URL =\n \"https://mcp.hiveintelligence.xyz\";\n\nconst rl = createInterface({ input: process.stdin, output: process.stdout });\nconst ask = (q: string): Promise<string> =>\n new Promise((resolve) => rl.question(q, resolve));\n\nexport async function runInit(opts: {\n minimal?: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n console.log(\"\\nHive MCP Setup\\n\");\n\n const envPath = join(process.cwd(), \".env\");\n const existing: Record<string, string> = {};\n\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.+)$/);\n if (match) existing[match[1]] = match[2];\n }\n console.log(\n `Found existing .env with ${Object.keys(existing).length} keys.\\n`,\n );\n }\n\n let apiKey = existing.HIVE_API_KEY || process.env.HIVE_API_KEY || \"\";\n let apiUrl = existing.HIVE_API_URL || process.env.HIVE_API_URL || \"\";\n\n if (opts.minimal) {\n // Minimal mode: just write defaults without prompts\n if (!apiKey) {\n console.log(\n \"Warning: HIVE_API_KEY not set. Set it manually or re-run without --minimal.\\n\",\n );\n }\n } else {\n // Interactive: ask for API key\n const currentKeyTag = apiKey ? ` [current: ${apiKey.slice(0, 6)}...]` : \"\";\n const keyInput = await ask(\n `HIVE_API_KEY${currentKeyTag}\\n Your Hive Intelligence API key: `,\n );\n if (keyInput.trim()) {\n apiKey = keyInput.trim();\n }\n\n // Ask for API URL (optional)\n const currentUrlTag = apiUrl\n ? ` [current: ${apiUrl}]`\n : ` [default: ${DEFAULT_API_URL}]`;\n const urlInput = await ask(\n `\\nHIVE_API_URL${currentUrlTag}\\n Server URL (press Enter for default): `,\n );\n if (urlInput.trim()) {\n apiUrl = urlInput.trim();\n }\n }\n\n rl.close();\n\n // Update env vars\n if (apiKey) existing.HIVE_API_KEY = apiKey;\n if (apiUrl) existing.HIVE_API_URL = apiUrl;\n\n // Validate the key by hitting the server health endpoint\n if (apiKey) {\n const baseUrl = apiUrl || DEFAULT_API_URL;\n console.log(`\\nValidating API key against ${baseUrl}...`);\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n const resp = await fetch(`${baseUrl}/health`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n clearTimeout(timer);\n\n if (resp.ok) {\n console.log(\"API key validated successfully.\\n\");\n } else if (resp.status === 401 || resp.status === 403) {\n console.log(\n `Warning: Server returned ${resp.status} — key may be invalid.\\n`,\n );\n } else {\n console.log(\n `Warning: Server returned ${resp.status} ${resp.statusText}.\\n`,\n );\n }\n } catch {\n console.log(\n `Warning: Could not reach ${baseUrl} — check the URL and try again.\\n`,\n );\n }\n }\n\n // Build env content\n const lines = Object.entries(existing)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"\\n\");\n\n if (opts.dryRun) {\n console.log(\"Dry run — would write to .env:\\n\");\n console.log(lines);\n console.log(\"\");\n return;\n }\n\n writeFileSync(envPath, lines + \"\\n\", \"utf-8\");\n console.log(`.env written to ${envPath}`);\n console.log(\"Run: hive-mcp doctor to verify connectivity\\n\");\n}\n"],"mappings":";;;;AAAA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAEhC,IAAM,kBACJ;AAEF,IAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,IAAM,MAAM,CAAC,MACX,IAAI,QAAQ,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAElD,eAAsB,QAAQ,MAGZ;AAChB,UAAQ,IAAI,oBAAoB;AAEhC,QAAM,UAAU,KAAK,QAAQ,IAAI,GAAG,MAAM;AAC1C,QAAM,WAAmC,CAAC;AAE1C,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,QAAQ,KAAK,MAAM,2BAA2B;AACpD,UAAI,MAAO,UAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;AAAA,IACzC;AACA,YAAQ;AAAA,MACN,4BAA4B,OAAO,KAAK,QAAQ,EAAE,MAAM;AAAA;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,gBAAgB,QAAQ,IAAI,gBAAgB;AAClE,MAAI,SAAS,SAAS,gBAAgB,QAAQ,IAAI,gBAAgB;AAElE,MAAI,KAAK,SAAS;AAEhB,QAAI,CAAC,QAAQ;AACX,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,gBAAgB,SAAS,cAAc,OAAO,MAAM,GAAG,CAAC,CAAC,SAAS;AACxE,UAAM,WAAW,MAAM;AAAA,MACrB,eAAe,aAAa;AAAA;AAAA,IAC9B;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,eAAS,SAAS,KAAK;AAAA,IACzB;AAGA,UAAM,gBAAgB,SAClB,cAAc,MAAM,MACpB,cAAc,eAAe;AACjC,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,cAAiB,aAAa;AAAA;AAAA,IAChC;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,eAAS,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,KAAG,MAAM;AAGT,MAAI,OAAQ,UAAS,eAAe;AACpC,MAAI,OAAQ,UAAS,eAAe;AAGpC,MAAI,QAAQ;AACV,UAAM,UAAU,UAAU;AAC1B,YAAQ,IAAI;AAAA,6BAAgC,OAAO,KAAK;AACxD,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAK;AACxD,YAAM,OAAO,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,QAC5C,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,QAC7C,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,mBAAa,KAAK;AAElB,UAAI,KAAK,IAAI;AACX,gBAAQ,IAAI,mCAAmC;AAAA,MACjD,WAAW,KAAK,WAAW,OAAO,KAAK,WAAW,KAAK;AACrD,gBAAQ;AAAA,UACN,4BAA4B,KAAK,MAAM;AAAA;AAAA,QACzC;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN,4BAA4B,KAAK,MAAM,IAAI,KAAK,UAAU;AAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,QAAQ;AACN,cAAQ;AAAA,QACN,4BAA4B,OAAO;AAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,OAAO,QAAQ,QAAQ,EAClC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AAEZ,MAAI,KAAK,QAAQ;AACf,YAAQ,IAAI,uCAAkC;AAC9C,YAAQ,IAAI,KAAK;AACjB,YAAQ,IAAI,EAAE;AACd;AAAA,EACF;AAEA,gBAAc,SAAS,QAAQ,MAAM,OAAO;AAC5C,UAAQ,IAAI,mBAAmB,OAAO,EAAE;AACxC,UAAQ,IAAI,gDAAgD;AAC9D;","names":[]}
1
+ {"version":3,"sources":["../src/cli/init.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nconst DEFAULT_API_URL =\n \"https://mcp.hiveintelligence.xyz\";\n\nconst rl = createInterface({ input: process.stdin, output: process.stdout });\nconst ask = (q: string): Promise<string> =>\n new Promise((resolve) => rl.question(q, resolve));\n\nexport async function runInit(opts: {\n minimal?: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n console.log(\"\\nHive MCP Setup\\n\");\n\n const envPath = join(process.cwd(), \".env\");\n const existing: Record<string, string> = {};\n\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.+)$/);\n if (match) existing[match[1]] = match[2];\n }\n console.log(\n `Found existing .env with ${Object.keys(existing).length} keys.\\n`,\n );\n }\n\n let apiKey = existing.HIVE_API_KEY || process.env.HIVE_API_KEY || \"\";\n let apiUrl = existing.HIVE_API_URL || process.env.HIVE_API_URL || \"\";\n\n if (opts.minimal) {\n // Minimal mode: just write defaults without prompts\n if (!apiKey) {\n console.log(\n \"Warning: HIVE_API_KEY not set. Set it manually or re-run without --minimal.\\n\",\n );\n }\n } else {\n // Interactive: ask for API key\n const currentKeyTag = apiKey ? ` [current: ${apiKey.slice(0, 6)}...]` : \"\";\n const keyInput = await ask(\n `HIVE_API_KEY${currentKeyTag}\\n Your Hive Intelligence API key: `,\n );\n if (keyInput.trim()) {\n apiKey = keyInput.trim();\n }\n\n // Ask for API URL (optional)\n const currentUrlTag = apiUrl\n ? ` [current: ${apiUrl}]`\n : ` [default: ${DEFAULT_API_URL}]`;\n const urlInput = await ask(\n `\\nHIVE_API_URL${currentUrlTag}\\n Server URL (press Enter for default): `,\n );\n if (urlInput.trim()) {\n apiUrl = urlInput.trim();\n }\n }\n\n rl.close();\n\n // Update env vars\n if (apiKey) existing.HIVE_API_KEY = apiKey;\n if (apiUrl) existing.HIVE_API_URL = apiUrl;\n\n // Validate the key by hitting the server health endpoint\n if (apiKey) {\n const baseUrl = apiUrl || DEFAULT_API_URL;\n console.log(`\\nValidating API key against ${baseUrl}...`);\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n const resp = await fetch(`${baseUrl}/health`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n clearTimeout(timer);\n\n if (resp.ok) {\n console.log(\"API key validated successfully.\\n\");\n } else if (resp.status === 401 || resp.status === 403) {\n console.log(\n `Warning: Server returned ${resp.status} — key may be invalid.\\n`,\n );\n } else {\n console.log(\n `Warning: Server returned ${resp.status} ${resp.statusText}.\\n`,\n );\n }\n } catch {\n console.log(\n `Warning: Could not reach ${baseUrl} — check the URL and try again.\\n`,\n );\n }\n }\n\n // Build env content\n const lines = Object.entries(existing)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"\\n\");\n\n if (opts.dryRun) {\n console.log(\"Dry run — would write to .env:\\n\");\n console.log(lines);\n console.log(\"\");\n return;\n }\n\n writeFileSync(envPath, lines + \"\\n\", \"utf-8\");\n console.log(`.env written to ${envPath}`);\n console.log(\"Run: hive doctor to verify connectivity\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -17,7 +17,7 @@ import {
17
17
  successEnvelope,
18
18
  writeOutput,
19
19
  yellow
20
- } from "./chunk-FAFUYZQS.js";
20
+ } from "./chunk-CP3FXEQA.js";
21
21
  import "./chunk-QMRVH5ZP.js";
22
22
  export {
23
23
  bold,
@@ -38,4 +38,4 @@ export {
38
38
  writeOutput,
39
39
  yellow
40
40
  };
41
- //# sourceMappingURL=output-6TJ3JTZ7.js.map
41
+ //# sourceMappingURL=output-7PGQWJY2.js.map
@@ -7,7 +7,7 @@ import {
7
7
  shouldOutputJson,
8
8
  successEnvelope,
9
9
  writeOutput
10
- } from "./chunk-FAFUYZQS.js";
10
+ } from "./chunk-CP3FXEQA.js";
11
11
  import "./chunk-XQJ6PB2L.js";
12
12
  import "./chunk-QMRVH5ZP.js";
13
13
 
@@ -19,10 +19,10 @@ async function loadToolCatalog() {
19
19
  const response = await fetchToolCatalog();
20
20
  if (!response.ok) {
21
21
  const msg = response.error && typeof response.error === "object" && "message" in response.error ? String(response.error.message) : "Failed to fetch tool catalog";
22
- const { CliError } = await import("./errors-HRGXEUZR.js");
23
- const { outputError } = await import("./output-6TJ3JTZ7.js");
22
+ const { CliError } = await import("./errors-U6UZWVSD.js");
23
+ const { outputError } = await import("./output-7PGQWJY2.js");
24
24
  await outputError(
25
- new CliError("API_ERROR", msg, "Check: hive-mcp doctor"),
25
+ new CliError("API_ERROR", msg, "Check: hive doctor"),
26
26
  {}
27
27
  );
28
28
  return [];
@@ -73,7 +73,7 @@ async function listTools(opts) {
73
73
  await writeOutput(successEnvelope(data, {}));
74
74
  return;
75
75
  }
76
- const { table } = await import("./format-4OIUGZKY.js");
76
+ const { table } = await import("./format-CVLLK6GD.js");
77
77
  const rangeStart = totalFiltered === 0 ? 0 : offset + 1;
78
78
  const rangeEnd = offset + items.length;
79
79
  info(`
@@ -102,7 +102,7 @@ async function searchTools(query) {
102
102
  await writeOutput(successEnvelope(data, {}));
103
103
  return;
104
104
  }
105
- const { table } = await import("./format-4OIUGZKY.js");
105
+ const { table } = await import("./format-CVLLK6GD.js");
106
106
  info(`
107
107
  ${matches.length} matches for "${query}"
108
108
  `);
@@ -121,13 +121,13 @@ async function toolInfo(name) {
121
121
  const allTools = await loadToolCatalog();
122
122
  const tool = allTools.find((t2) => t2.name === name);
123
123
  if (!tool) {
124
- const { CliError, suggestSimilarTools } = await import("./errors-HRGXEUZR.js");
125
- const { outputError } = await import("./output-6TJ3JTZ7.js");
124
+ const { CliError, suggestSimilarTools } = await import("./errors-U6UZWVSD.js");
125
+ const { outputError } = await import("./output-7PGQWJY2.js");
126
126
  const similar = suggestSimilarTools(
127
127
  name,
128
128
  allTools.map((t2) => t2.name)
129
129
  );
130
- const suggestion = similar.length > 0 ? `Did you mean: ${similar.join(", ")}?` : `Run: hive-mcp tools search "${name}"`;
130
+ const suggestion = similar.length > 0 ? `Did you mean: ${similar.join(", ")}?` : `Run: hive tools search "${name}"`;
131
131
  await outputError(
132
132
  new CliError("TOOL_NOT_FOUND", `Tool "${name}" not found`, suggestion),
133
133
  { tool: name }
@@ -162,7 +162,7 @@ ${t.description}
162
162
  }
163
163
  async function refreshTools() {
164
164
  const { clearCache } = await import("./cache-US4LSZPI.js");
165
- const { info: printInfo } = await import("./output-6TJ3JTZ7.js");
165
+ const { info: printInfo } = await import("./output-7PGQWJY2.js");
166
166
  clearCache();
167
167
  printInfo("Cache cleared. Fetching fresh tool catalog...\n");
168
168
  const tools = await loadToolCatalog();
@@ -175,4 +175,4 @@ export {
175
175
  searchTools,
176
176
  toolInfo
177
177
  };
178
- //# sourceMappingURL=tools-WYOZZHHG.js.map
178
+ //# sourceMappingURL=tools-XEGCLA4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/tools.ts"],"sourcesContent":["import {\n shouldOutputJson,\n writeOutput,\n successEnvelope,\n info,\n} from \"./output.js\";\nimport { fetchToolCatalog } from \"./api-client.js\";\n\ninterface ToolEntry {\n name: string;\n title?: string;\n description?: string;\n inputSchema?: unknown;\n annotations?: Record<string, unknown>;\n provider?: string;\n}\n\nasync function loadToolCatalog(): Promise<ToolEntry[]> {\n const { getCachedTools, setCachedTools } = await import(\"./cache.js\");\n const cached = getCachedTools();\n if (cached) return cached as ToolEntry[];\n\n const response = await fetchToolCatalog();\n if (!response.ok) {\n const msg =\n response.error &&\n typeof response.error === \"object\" &&\n \"message\" in response.error\n ? String(response.error.message)\n : \"Failed to fetch tool catalog\";\n const { CliError } = await import(\"./errors.js\");\n const { outputError } = await import(\"./output.js\");\n await outputError(\n new CliError(\"API_ERROR\", msg, \"Check: hive doctor\"),\n {},\n );\n return [];\n }\n const data = response.data as\n | { totalCount?: number; tools?: ToolEntry[] }\n | ToolEntry[];\n const tools = Array.isArray(data)\n ? data\n : data &&\n typeof data === \"object\" &&\n \"tools\" in data &&\n Array.isArray(data.tools)\n ? data.tools\n : [];\n\n setCachedTools(tools);\n return tools;\n}\n\nexport async function listTools(opts: {\n category?: string;\n provider?: string;\n limit?: string;\n offset?: string;\n}): Promise<void> {\n let tools = await loadToolCatalog();\n\n if (opts.provider) {\n const prefix = opts.provider.toLowerCase();\n tools = tools.filter((t) => t.name.toLowerCase().startsWith(prefix + \"_\"));\n }\n\n if (opts.category) {\n const { NAMESPACE } = await import(\"./namespace.js\");\n const cat = opts.category.toLowerCase();\n const ns = NAMESPACE.find(\n (d) => d.name === cat || d.description.toLowerCase().includes(cat),\n );\n if (ns) {\n const categoryTools = new Set(ns.commands.map((cmd) => cmd.tool));\n tools = tools.filter((t) => categoryTools.has(t.name));\n } else {\n // Fallback: substring match on name/provider for unknown categories\n tools = tools.filter(\n (t) =>\n (t.provider ?? \"\").toLowerCase().includes(cat) ||\n (t.name ?? \"\").toLowerCase().includes(cat),\n );\n }\n }\n\n const totalFiltered = tools.length;\n const limit = Math.max(1, parseInt(opts.limit ?? \"50\", 10) || 50);\n const offset = Math.max(0, parseInt(opts.offset ?? \"0\", 10) || 0);\n tools = tools.slice(offset, offset + limit);\n\n const items = tools.map((t) => ({\n name: t.name,\n title: t.title,\n description:\n t.description && t.description.length > 120\n ? t.description.slice(0, 117) + \"...\"\n : t.description,\n }));\n\n const data = {\n totalCount: totalFiltered,\n offset,\n limit,\n showing: items.length,\n tools: items,\n };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, {}));\n return;\n }\n\n const { table } = await import(\"./format.js\");\n const rangeStart = totalFiltered === 0 ? 0 : offset + 1;\n const rangeEnd = offset + items.length;\n info(`\\nShowing ${rangeStart}-${rangeEnd} of ${totalFiltered} tools\\n`);\n info(\n table(\n [\"Name\", \"Title\"],\n items.map((t) => [t.name, t.title ?? \"\"]),\n ),\n );\n}\n\nexport async function searchTools(query: string): Promise<void> {\n const allTools = await loadToolCatalog();\n const q = query.toLowerCase();\n\n const matches = allTools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n (t.description ?? \"\").toLowerCase().includes(q) ||\n (t.title ?? \"\").toLowerCase().includes(q),\n );\n\n const items = matches.map((t) => ({\n name: t.name,\n title: t.title,\n description:\n t.description && t.description.length > 120\n ? t.description.slice(0, 117) + \"...\"\n : t.description,\n }));\n\n const data = { totalCount: items.length, query, tools: items };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, {}));\n return;\n }\n\n const { table } = await import(\"./format.js\");\n info(`\\n${matches.length} matches for \"${query}\"\\n`);\n if (matches.length === 0) {\n info(\"No tools found. Try a broader search term.\\n\");\n return;\n }\n info(\n table(\n [\"Name\", \"Title\"],\n matches.map((t) => [t.name, t.title ?? \"\"]),\n ),\n );\n}\n\nexport async function toolInfo(name: string): Promise<void> {\n const allTools = await loadToolCatalog();\n const tool = allTools.find((t) => t.name === name);\n\n if (!tool) {\n const { CliError, suggestSimilarTools } = await import(\"./errors.js\");\n const { outputError } = await import(\"./output.js\");\n const similar = suggestSimilarTools(\n name,\n allTools.map((t) => t.name),\n );\n const suggestion =\n similar.length > 0\n ? `Did you mean: ${similar.join(\", \")}?`\n : `Run: hive tools search \"${name}\"`;\n await outputError(\n new CliError(\"TOOL_NOT_FOUND\", `Tool \"${name}\" not found`, suggestion),\n { tool: name },\n );\n }\n\n // After outputError (which calls process.exit), this is unreachable,\n // but TypeScript doesn't know that. The non-null assertion is safe.\n const t = tool!;\n\n const data = {\n name: t.name,\n title: t.title,\n provider: t.provider ?? null,\n readOnly: t.annotations?.readOnlyHint ?? null,\n description: t.description,\n inputSchema: t.inputSchema,\n };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, { tool: name }));\n return;\n }\n\n info(`\\n${t.title ?? t.name}`);\n info(`Name: ${t.name}`);\n if (t.provider) info(`Provider: ${t.provider}`);\n info(`Read-only: ${t.annotations?.readOnlyHint ?? \"unknown\"}`);\n info(`\\nDescription:\\n${t.description}\\n`);\n if (t.inputSchema) {\n info(\"Input Schema:\");\n info(JSON.stringify(t.inputSchema, null, 2));\n }\n}\n\nexport async function refreshTools(): Promise<void> {\n const { clearCache } = await import(\"./cache.js\");\n const { info: printInfo } = await import(\"./output.js\");\n clearCache();\n printInfo(\"Cache cleared. Fetching fresh tool catalog...\\n\");\n const tools = await loadToolCatalog();\n printInfo(`${tools.length} tools loaded.\\n`);\n}\n"],"mappings":"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","names":["t"]}
@@ -1,10 +1,10 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
2
  import {
3
3
  executeTool
4
- } from "./chunk-N43VRMVB.js";
4
+ } from "./chunk-DTUDM6HX.js";
5
5
  import "./chunk-WKVZVQTG.js";
6
6
  import "./chunk-LBTLYTZS.js";
7
- import "./chunk-FAFUYZQS.js";
7
+ import "./chunk-CP3FXEQA.js";
8
8
  import "./chunk-XQJ6PB2L.js";
9
9
  import "./chunk-QMRVH5ZP.js";
10
10
 
@@ -64,4 +64,4 @@ Aborting watch: ${MAX_CONSECUTIVE_FAILURES} consecutive failures.
64
64
  export {
65
65
  runWatch
66
66
  };
67
- //# sourceMappingURL=watch-P2QWGFYV.js.map
67
+ //# sourceMappingURL=watch-A75SVIQ6.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hive-intelligence",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "MCP server and CLI for Hive Intelligence — crypto, DeFi, stocks, forex, and macro data",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/jq.ts","../src/cli/output.ts"],"sourcesContent":["/**\n * Minimal jq-like evaluator for CLI --jq flag.\n * Supports: .field, .a.b, .[N], .[] | .field, .[] | select(.field op val)\n */\nexport function jqEval(data: unknown, expr: string): unknown {\n const trimmed = expr.trim();\n if (trimmed === \".\") return data;\n\n // Handle pipe: split on \" | \" and chain\n if (trimmed.includes(\" | \")) {\n const parts = trimmed.split(\" | \");\n let result = data;\n for (const part of parts) {\n result = jqEval(result, part.trim());\n }\n return result;\n }\n\n // Handle select(.field op value)\n const selectMatch = trimmed.match(\n /^select\\(\\.(\\w[\\w.]*)\\s*(>|<|>=|<=|==|!=)\\s*(.+)\\)$/,\n );\n if (selectMatch) {\n const [, field, op, rawVal] = selectMatch;\n if (!Array.isArray(data)) return data;\n const val = parseValue(rawVal);\n return data.filter((item) => {\n const fieldVal = extractPath(item, field);\n return compare(fieldVal, op, val);\n });\n }\n\n // If data is an array and expression is a plain field access, map over elements.\n // Exclude bracket expressions like .[1] or .[] to avoid false-positive mapping.\n if (\n Array.isArray(data) &&\n trimmed.startsWith(\".\") &&\n !trimmed.includes(\"[\")\n ) {\n const path = trimmed.slice(1);\n if (path && !path.includes(\" \")) {\n return data.map((item) => extractPath(item, path));\n }\n }\n\n // Handle .[] (iterate array)\n if (trimmed === \".[]\") {\n if (Array.isArray(data)) return data;\n if (typeof data === \"object\" && data !== null) return Object.values(data);\n return data;\n }\n\n // Handle .[N] (array index)\n const indexMatch = trimmed.match(/^\\.\\[(\\d+)\\]$/);\n if (indexMatch) {\n const idx = parseInt(indexMatch[1], 10);\n if (Array.isArray(data)) return data[idx];\n return undefined;\n }\n\n // Handle .field or .a.b.c — may include .[] in path\n if (trimmed.startsWith(\".\")) {\n const path = trimmed.slice(1);\n return extractPath(data, path);\n }\n\n return extractPath(data, trimmed);\n}\n\nfunction extractPath(data: unknown, path: string): unknown {\n if (!path) return data;\n\n const parts: string[] = [];\n let current = \"\";\n for (let i = 0; i < path.length; i++) {\n if (path[i] === \".\" && path[i + 1] === \"[\" && path[i + 2] === \"]\") {\n if (current) parts.push(current);\n parts.push(\"[]\");\n current = \"\";\n i += 2;\n } else if (path[i] === \".\" && current) {\n parts.push(current);\n current = \"\";\n } else if (path[i] !== \".\" || current) {\n current += path[i];\n }\n }\n if (current) parts.push(current);\n\n let result: unknown = data;\n for (const part of parts) {\n if (result == null) return undefined;\n if (part === \"[]\") {\n if (Array.isArray(result)) return result;\n return undefined;\n }\n if (typeof result === \"object\" && result !== null) {\n result = (result as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return result;\n}\n\nfunction parseValue(raw: string): string | number | boolean {\n const trimmed = raw.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (/^\".*\"$/.test(trimmed)) return trimmed.slice(1, -1);\n const num = Number(trimmed);\n if (!isNaN(num)) return num;\n return trimmed;\n}\n\nfunction compare(a: unknown, op: string, b: unknown): boolean {\n switch (op) {\n case \"==\":\n return a === b;\n case \"!=\":\n return a !== b;\n case \">\":\n return typeof a === \"number\" && typeof b === \"number\" && a > b;\n case \"<\":\n return typeof a === \"number\" && typeof b === \"number\" && a < b;\n case \">=\":\n return typeof a === \"number\" && typeof b === \"number\" && a >= b;\n case \"<=\":\n return typeof a === \"number\" && typeof b === \"number\" && a <= b;\n default:\n return false;\n }\n}\n","import { CliError, type ErrorCode, ExitCode } from \"./errors.js\";\nimport { jqEval } from \"./jq.js\";\n\n// SIGPIPE — clean exit when piping to `head`, `less`, etc.\nprocess.on(\"SIGPIPE\", () => process.exit(0));\n\n/** Global output options set from CLI flags. */\nexport interface OutputOptions {\n json?: boolean;\n pretty?: boolean;\n fields?: string;\n quiet?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n jq?: string;\n csv?: boolean;\n}\n\nlet globalOpts: OutputOptions = {};\n\nexport function setOutputOptions(opts: OutputOptions): void {\n globalOpts = opts;\n}\n\n/** Whether to emit JSON (non-TTY default, or --json flag). */\nexport function shouldOutputJson(): boolean {\n if (globalOpts.json) return true;\n if (globalOpts.pretty) return false;\n return !process.stdout.isTTY;\n}\n\n/** Whether color is enabled. */\nexport function colorEnabled(): boolean {\n if (globalOpts.noColor) return false;\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return !!process.stdout.isTTY;\n}\n\n/** Apply ANSI color if enabled. */\nexport function red(s: string): string {\n return colorEnabled() ? `\\x1b[31m${s}\\x1b[0m` : s;\n}\nexport function green(s: string): string {\n return colorEnabled() ? `\\x1b[32m${s}\\x1b[0m` : s;\n}\nexport function yellow(s: string): string {\n return colorEnabled() ? `\\x1b[33m${s}\\x1b[0m` : s;\n}\nexport function dim(s: string): string {\n return colorEnabled() ? `\\x1b[2m${s}\\x1b[0m` : s;\n}\nexport function bold(s: string): string {\n return colorEnabled() ? `\\x1b[1m${s}\\x1b[0m` : s;\n}\n\n/** The standard envelope for all CLI output. */\nexport interface Envelope<T = unknown> {\n ok: boolean;\n data?: T;\n error?: {\n code: ErrorCode;\n message: string;\n suggestion?: string;\n };\n meta: {\n tool?: string;\n provider?: string;\n duration_ms?: number;\n };\n}\n\n/** Build a success envelope. */\nexport function successEnvelope<T>(\n data: T,\n meta: Envelope[\"meta\"],\n): Envelope<T> {\n return { ok: true, data, meta };\n}\n\n/** Build an error envelope. */\nexport function errorEnvelope(err: CliError, meta: Envelope[\"meta\"]): Envelope {\n return {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n ...(err.suggestion && { suggestion: err.suggestion }),\n },\n meta,\n };\n}\n\n/** Apply --fields filtering to data. */\nfunction applyFields<T>(data: T, fields: string | undefined): T {\n if (!fields) return data;\n const keys = fields.split(\",\").map((f) => f.trim());\n if (Array.isArray(data)) {\n return data.map((item) => pick(item, keys)) as T;\n }\n if (typeof data === \"object\" && data !== null) {\n return pick(data, keys) as T;\n }\n return data;\n}\n\nfunction pick(obj: unknown, keys: string[]): unknown {\n if (typeof obj !== \"object\" || obj === null) return obj;\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (key in (obj as Record<string, unknown>)) {\n result[key] = (obj as Record<string, unknown>)[key];\n }\n }\n return result;\n}\n\n/** Write an envelope to stdout. Handles JSON vs human mode. */\nexport async function writeOutput(envelope: Envelope): Promise<void> {\n if (globalOpts.fields && envelope.data) {\n envelope = {\n ...envelope,\n data: applyFields(envelope.data, globalOpts.fields),\n };\n }\n\n // Apply --jq filter\n if (globalOpts.jq && envelope.data != null) {\n envelope = { ...envelope, data: jqEval(envelope.data, globalOpts.jq) };\n }\n\n // CSV output mode\n if (globalOpts.csv && envelope.ok && Array.isArray(envelope.data)) {\n process.stdout.write(\n formatCsv(envelope.data as Record<string, unknown>[]) + \"\\n\",\n );\n return;\n }\n\n if (shouldOutputJson()) {\n const output = JSON.stringify(envelope, null, 2);\n process.stdout.write(output + \"\\n\");\n return;\n }\n\n // Human-readable mode\n if (!globalOpts.quiet && envelope.meta.tool) {\n const status = envelope.ok\n ? green(`✓ ${envelope.meta.tool}`)\n : red(`✗ ${envelope.meta.tool}`);\n const provider = envelope.meta.provider\n ? dim(` (${envelope.meta.provider})`)\n : \"\";\n const timing =\n envelope.meta.duration_ms != null\n ? dim(` ${envelope.meta.duration_ms}ms`)\n : \"\";\n process.stderr.write(`${status}${provider}${timing}\\n\\n`);\n }\n\n if (envelope.ok && envelope.data != null) {\n // Auto-table: array of objects renders as a fixed-width table\n if (\n Array.isArray(envelope.data) &&\n envelope.data.length > 0 &&\n typeof envelope.data[0] === \"object\" &&\n envelope.data[0] !== null\n ) {\n const { formatTable } = await import(\"./format.js\");\n process.stdout.write(\n formatTable(envelope.data as Record<string, unknown>[]) + \"\\n\",\n );\n return;\n }\n\n const text =\n typeof envelope.data === \"string\"\n ? envelope.data\n : JSON.stringify(envelope.data, null, 2);\n process.stdout.write(text + \"\\n\");\n }\n\n if (!envelope.ok && envelope.error) {\n process.stderr.write(red(`Error: ${envelope.error.message}\\n`));\n if (envelope.error.suggestion) {\n process.stderr.write(\n yellow(` Suggestion: ${envelope.error.suggestion}\\n`),\n );\n }\n }\n}\n\n/** Write a data envelope and exit. */\nexport async function outputSuccess<T>(\n data: T,\n meta: Envelope[\"meta\"],\n): Promise<void> {\n await writeOutput(successEnvelope(data, meta));\n}\n\n/** Write an error envelope and exit with the appropriate code. */\nexport async function outputError(\n err: CliError,\n meta: Envelope[\"meta\"],\n): Promise<never> {\n await writeOutput(errorEnvelope(err, meta));\n process.exit(err.exitCode);\n}\n\n/** Log to stderr (only when not --quiet). */\nexport function info(msg: string): void {\n if (!globalOpts.quiet) {\n process.stderr.write(msg + \"\\n\");\n }\n}\n\n/** Log to stderr (only when --verbose). */\nexport function debug(msg: string): void {\n if (globalOpts.verbose) {\n process.stderr.write(dim(`[debug] ${msg}`) + \"\\n\");\n }\n}\n\n/** Detect CI environment. */\nexport function isCI(): boolean {\n return !!(\n process.env.CI ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.JENKINS_URL ||\n process.env.HIVE_CI\n );\n}\n\n/** Format array of objects as RFC 4180 CSV. */\nexport function formatCsv(data: Record<string, unknown>[]): string {\n if (data.length === 0) return \"\";\n const keys = [...new Set(data.flatMap((row) => Object.keys(row)))];\n const escape = (val: unknown): string => {\n const str = val == null ? \"\" : String(val);\n return str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")\n ? `\"${str.replace(/\"/g, '\"\"')}\"`\n : str;\n };\n const header = keys.join(\",\");\n const rows = data.map((row) => keys.map((k) => escape(row[k])).join(\",\"));\n return [header, ...rows].join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -1,43 +0,0 @@
1
- import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import "./chunk-QMRVH5ZP.js";
3
-
4
- // src/cli/format.ts
5
- function pad(str, width) {
6
- return str.length >= width ? str.slice(0, width) : str + " ".repeat(width - str.length);
7
- }
8
- function table(headers, rows) {
9
- const widths = headers.map(
10
- (h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || "").length)) + 2
11
- );
12
- const headerLine = headers.map((h, i) => pad(h, widths[i])).join("");
13
- const separator = widths.map((w) => "-".repeat(w)).join("");
14
- const dataLines = rows.map(
15
- (row) => row.map((cell, i) => pad(cell, widths[i])).join("")
16
- );
17
- return [headerLine, separator, ...dataLines].join("\n");
18
- }
19
- function formatTable(data) {
20
- if (data.length === 0) return "(empty result)";
21
- const maxCols = 8;
22
- const maxWidth = 40;
23
- const allKeys = [...new Set(data.flatMap(Object.keys))];
24
- const cols = allKeys.slice(0, maxCols);
25
- const widths = cols.map((col) => {
26
- const values = data.map((row) => String(row[col] ?? "").slice(0, maxWidth));
27
- return Math.max(col.length, ...values.map((v) => v.length));
28
- });
29
- const header = cols.map((col, i) => col.padEnd(widths[i])).join(" ");
30
- const separator = widths.map((w) => "-".repeat(w)).join(" ");
31
- const rows = data.map(
32
- (row) => cols.map(
33
- (col, i) => String(row[col] ?? "").slice(0, maxWidth).padEnd(widths[i])
34
- ).join(" ")
35
- );
36
- return [header, separator, ...rows].join("\n");
37
- }
38
- export {
39
- formatTable,
40
- pad,
41
- table
42
- };
43
- //# sourceMappingURL=format-4OIUGZKY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/format.ts"],"sourcesContent":["export function pad(str: string, width: number): string {\n return str.length >= width\n ? str.slice(0, width)\n : str + \" \".repeat(width - str.length);\n}\n\nexport function table(headers: string[], rows: string[][]): string {\n const widths = headers.map(\n (h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || \"\").length)) + 2,\n );\n const headerLine = headers.map((h, i) => pad(h, widths[i])).join(\"\");\n const separator = widths.map((w) => \"-\".repeat(w)).join(\"\");\n const dataLines = rows.map((row) =>\n row.map((cell, i) => pad(cell, widths[i])).join(\"\"),\n );\n return [headerLine, separator, ...dataLines].join(\"\\n\");\n}\n\n/** Auto-format an array of objects as a fixed-width table. */\nexport function formatTable(data: Record<string, unknown>[]): string {\n if (data.length === 0) return \"(empty result)\";\n\n const maxCols = 8;\n const maxWidth = 40;\n\n const allKeys = [...new Set(data.flatMap(Object.keys))];\n const cols = allKeys.slice(0, maxCols);\n\n const widths = cols.map((col) => {\n const values = data.map((row) => String(row[col] ?? \"\").slice(0, maxWidth));\n return Math.max(col.length, ...values.map((v) => v.length));\n });\n\n const header = cols.map((col, i) => col.padEnd(widths[i])).join(\" \");\n const separator = widths.map((w) => \"-\".repeat(w)).join(\" \");\n const rows = data.map((row) =>\n cols\n .map((col, i) =>\n String(row[col] ?? \"\")\n .slice(0, maxWidth)\n .padEnd(widths[i]),\n )\n .join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n"],"mappings":";;;;AAAO,SAAS,IAAI,KAAa,OAAuB;AACtD,SAAO,IAAI,UAAU,QACjB,IAAI,MAAM,GAAG,KAAK,IAClB,MAAM,IAAI,OAAO,QAAQ,IAAI,MAAM;AACzC;AAEO,SAAS,MAAM,SAAmB,MAA0B;AACjE,QAAM,SAAS,QAAQ;AAAA,IACrB,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;AAAA,EAC1E;AACA,QAAM,aAAa,QAAQ,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;AACnE,QAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC1D,QAAM,YAAY,KAAK;AAAA,IAAI,CAAC,QAC1B,IAAI,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,EACpD;AACA,SAAO,CAAC,YAAY,WAAW,GAAG,SAAS,EAAE,KAAK,IAAI;AACxD;AAGO,SAAS,YAAY,MAAyC;AACnE,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,UAAU;AAChB,QAAM,WAAW;AAEjB,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,KAAK,QAAQ,OAAO,IAAI,CAAC,CAAC;AACtD,QAAM,OAAO,QAAQ,MAAM,GAAG,OAAO;AAErC,QAAM,SAAS,KAAK,IAAI,CAAC,QAAQ;AAC/B,UAAM,SAAS,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,GAAG,KAAK,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC;AAC1E,WAAO,KAAK,IAAI,IAAI,QAAQ,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EAC5D,CAAC;AAED,QAAM,SAAS,KAAK,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AACpE,QAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC5D,QAAM,OAAO,KAAK;AAAA,IAAI,CAAC,QACrB,KACG;AAAA,MAAI,CAAC,KAAK,MACT,OAAO,IAAI,GAAG,KAAK,EAAE,EAClB,MAAM,GAAG,QAAQ,EACjB,OAAO,OAAO,CAAC,CAAC;AAAA,IACrB,EACC,KAAK,IAAI;AAAA,EACd;AAEA,SAAO,CAAC,QAAQ,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI;AAC/C;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/tools.ts"],"sourcesContent":["import {\n shouldOutputJson,\n writeOutput,\n successEnvelope,\n info,\n} from \"./output.js\";\nimport { fetchToolCatalog } from \"./api-client.js\";\n\ninterface ToolEntry {\n name: string;\n title?: string;\n description?: string;\n inputSchema?: unknown;\n annotations?: Record<string, unknown>;\n provider?: string;\n}\n\nasync function loadToolCatalog(): Promise<ToolEntry[]> {\n const { getCachedTools, setCachedTools } = await import(\"./cache.js\");\n const cached = getCachedTools();\n if (cached) return cached as ToolEntry[];\n\n const response = await fetchToolCatalog();\n if (!response.ok) {\n const msg =\n response.error &&\n typeof response.error === \"object\" &&\n \"message\" in response.error\n ? String(response.error.message)\n : \"Failed to fetch tool catalog\";\n const { CliError } = await import(\"./errors.js\");\n const { outputError } = await import(\"./output.js\");\n await outputError(\n new CliError(\"API_ERROR\", msg, \"Check: hive-mcp doctor\"),\n {},\n );\n return [];\n }\n const data = response.data as\n | { totalCount?: number; tools?: ToolEntry[] }\n | ToolEntry[];\n const tools = Array.isArray(data)\n ? data\n : data &&\n typeof data === \"object\" &&\n \"tools\" in data &&\n Array.isArray(data.tools)\n ? data.tools\n : [];\n\n setCachedTools(tools);\n return tools;\n}\n\nexport async function listTools(opts: {\n category?: string;\n provider?: string;\n limit?: string;\n offset?: string;\n}): Promise<void> {\n let tools = await loadToolCatalog();\n\n if (opts.provider) {\n const prefix = opts.provider.toLowerCase();\n tools = tools.filter((t) => t.name.toLowerCase().startsWith(prefix + \"_\"));\n }\n\n if (opts.category) {\n const { NAMESPACE } = await import(\"./namespace.js\");\n const cat = opts.category.toLowerCase();\n const ns = NAMESPACE.find(\n (d) => d.name === cat || d.description.toLowerCase().includes(cat),\n );\n if (ns) {\n const categoryTools = new Set(ns.commands.map((cmd) => cmd.tool));\n tools = tools.filter((t) => categoryTools.has(t.name));\n } else {\n // Fallback: substring match on name/provider for unknown categories\n tools = tools.filter(\n (t) =>\n (t.provider ?? \"\").toLowerCase().includes(cat) ||\n (t.name ?? \"\").toLowerCase().includes(cat),\n );\n }\n }\n\n const totalFiltered = tools.length;\n const limit = Math.max(1, parseInt(opts.limit ?? \"50\", 10) || 50);\n const offset = Math.max(0, parseInt(opts.offset ?? \"0\", 10) || 0);\n tools = tools.slice(offset, offset + limit);\n\n const items = tools.map((t) => ({\n name: t.name,\n title: t.title,\n description:\n t.description && t.description.length > 120\n ? t.description.slice(0, 117) + \"...\"\n : t.description,\n }));\n\n const data = {\n totalCount: totalFiltered,\n offset,\n limit,\n showing: items.length,\n tools: items,\n };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, {}));\n return;\n }\n\n const { table } = await import(\"./format.js\");\n const rangeStart = totalFiltered === 0 ? 0 : offset + 1;\n const rangeEnd = offset + items.length;\n info(`\\nShowing ${rangeStart}-${rangeEnd} of ${totalFiltered} tools\\n`);\n info(\n table(\n [\"Name\", \"Title\"],\n items.map((t) => [t.name, t.title ?? \"\"]),\n ),\n );\n}\n\nexport async function searchTools(query: string): Promise<void> {\n const allTools = await loadToolCatalog();\n const q = query.toLowerCase();\n\n const matches = allTools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n (t.description ?? \"\").toLowerCase().includes(q) ||\n (t.title ?? \"\").toLowerCase().includes(q),\n );\n\n const items = matches.map((t) => ({\n name: t.name,\n title: t.title,\n description:\n t.description && t.description.length > 120\n ? t.description.slice(0, 117) + \"...\"\n : t.description,\n }));\n\n const data = { totalCount: items.length, query, tools: items };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, {}));\n return;\n }\n\n const { table } = await import(\"./format.js\");\n info(`\\n${matches.length} matches for \"${query}\"\\n`);\n if (matches.length === 0) {\n info(\"No tools found. Try a broader search term.\\n\");\n return;\n }\n info(\n table(\n [\"Name\", \"Title\"],\n matches.map((t) => [t.name, t.title ?? \"\"]),\n ),\n );\n}\n\nexport async function toolInfo(name: string): Promise<void> {\n const allTools = await loadToolCatalog();\n const tool = allTools.find((t) => t.name === name);\n\n if (!tool) {\n const { CliError, suggestSimilarTools } = await import(\"./errors.js\");\n const { outputError } = await import(\"./output.js\");\n const similar = suggestSimilarTools(\n name,\n allTools.map((t) => t.name),\n );\n const suggestion =\n similar.length > 0\n ? `Did you mean: ${similar.join(\", \")}?`\n : `Run: hive-mcp tools search \"${name}\"`;\n await outputError(\n new CliError(\"TOOL_NOT_FOUND\", `Tool \"${name}\" not found`, suggestion),\n { tool: name },\n );\n }\n\n // After outputError (which calls process.exit), this is unreachable,\n // but TypeScript doesn't know that. The non-null assertion is safe.\n const t = tool!;\n\n const data = {\n name: t.name,\n title: t.title,\n provider: t.provider ?? null,\n readOnly: t.annotations?.readOnlyHint ?? null,\n description: t.description,\n inputSchema: t.inputSchema,\n };\n\n if (shouldOutputJson()) {\n await writeOutput(successEnvelope(data, { tool: name }));\n return;\n }\n\n info(`\\n${t.title ?? t.name}`);\n info(`Name: ${t.name}`);\n if (t.provider) info(`Provider: ${t.provider}`);\n info(`Read-only: ${t.annotations?.readOnlyHint ?? \"unknown\"}`);\n info(`\\nDescription:\\n${t.description}\\n`);\n if (t.inputSchema) {\n info(\"Input Schema:\");\n info(JSON.stringify(t.inputSchema, null, 2));\n }\n}\n\nexport async function refreshTools(): Promise<void> {\n const { clearCache } = await import(\"./cache.js\");\n const { info: printInfo } = await import(\"./output.js\");\n clearCache();\n printInfo(\"Cache cleared. Fetching fresh tool catalog...\\n\");\n const tools = await loadToolCatalog();\n printInfo(`${tools.length} tools loaded.\\n`);\n}\n"],"mappings":"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","names":["t"]}