hive-intelligence 0.1.1 → 0.3.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/LICENSE +21 -0
- package/README.md +112 -77
- package/bin/hive.js +25 -0
- package/build/alias-INGXWFCG.js +41 -0
- package/build/alias-INGXWFCG.js.map +1 -0
- package/build/auth-PVT4GTAD.js +233 -0
- package/build/auth-PVT4GTAD.js.map +1 -0
- package/build/cache-US4LSZPI.js +52 -0
- package/build/cache-US4LSZPI.js.map +1 -0
- package/build/chunk-FAFUYZQS.js +280 -0
- package/build/chunk-FAFUYZQS.js.map +1 -0
- package/build/chunk-IWBWPHYY.js +212 -0
- package/build/chunk-IWBWPHYY.js.map +1 -0
- package/build/chunk-LBTLYTZS.js +115 -0
- package/build/chunk-LBTLYTZS.js.map +1 -0
- package/build/chunk-N43VRMVB.js +3108 -0
- package/build/chunk-N43VRMVB.js.map +1 -0
- package/build/chunk-NEKSTV6P.js +911 -0
- package/build/chunk-NEKSTV6P.js.map +1 -0
- package/build/chunk-OK3LSM73.js +22 -0
- package/build/chunk-OK3LSM73.js.map +1 -0
- package/build/chunk-QMRVH5ZP.js +44 -0
- package/build/chunk-QMRVH5ZP.js.map +1 -0
- package/build/chunk-WKVZVQTG.js +66 -0
- package/build/chunk-WKVZVQTG.js.map +1 -0
- package/build/chunk-XQJ6PB2L.js +95 -0
- package/build/chunk-XQJ6PB2L.js.map +1 -0
- package/build/cli.js +3858 -0
- package/build/cli.js.map +1 -0
- package/build/completion-N35TWBLT.js +274 -0
- package/build/completion-N35TWBLT.js.map +1 -0
- package/build/config-2VDB2ZHE.js +100 -0
- package/build/config-2VDB2ZHE.js.map +1 -0
- package/build/config-dir-IEOID7Q6.js +31 -0
- package/build/config-dir-IEOID7Q6.js.map +1 -0
- package/build/doctor-GYP6IHPP.js +231 -0
- package/build/doctor-GYP6IHPP.js.map +1 -0
- package/build/errors-HRGXEUZR.js +17 -0
- package/build/errors-HRGXEUZR.js.map +1 -0
- package/build/format-4OIUGZKY.js +43 -0
- package/build/format-4OIUGZKY.js.map +1 -0
- package/build/init-YOJK6CH2.js +102 -0
- package/build/init-YOJK6CH2.js.map +1 -0
- package/build/namespace-GWTS6U6J.js +13 -0
- package/build/namespace-GWTS6U6J.js.map +1 -0
- package/build/open-FUXYIHFO.js +37 -0
- package/build/open-FUXYIHFO.js.map +1 -0
- package/build/output-6TJ3JTZ7.js +41 -0
- package/build/output-6TJ3JTZ7.js.map +1 -0
- package/build/server.js +14763 -0
- package/build/server.js.map +1 -0
- package/build/telemetry-KNWMQURH.js +18 -0
- package/build/telemetry-KNWMQURH.js.map +1 -0
- package/build/tools-4W3GGCUC.js +178 -0
- package/build/tools-4W3GGCUC.js.map +1 -0
- package/build/version-3TZ3U4IR.js +9 -0
- package/build/version-3TZ3U4IR.js.map +1 -0
- package/build/watch-P2QWGFYV.js +67 -0
- package/build/watch-P2QWGFYV.js.map +1 -0
- package/package.json +56 -15
- package/.env,example +0 -1
- package/dist/client.d.ts +0 -7
- package/dist/client.js +0 -52
- package/dist/errors.d.ts +0 -7
- package/dist/errors.js +0 -15
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -20
- package/dist/types.d.ts +0 -19
- package/dist/types.js +0 -2
- package/example.ts +0 -35
- package/jest.config.js +0 -7
- package/src/client.js +0 -52
- package/src/client.ts +0 -42
- package/src/errors.js +0 -15
- package/src/errors.ts +0 -11
- package/src/index.js +0 -20
- package/src/index.ts +0 -5
- package/src/types.js +0 -2
- package/src/types.ts +0 -21
- package/tests/client.test.js +0 -28
- package/tests/client.test.ts +0 -18
- package/tests/hive.test.js +0 -69
- package/tests/hive.test.ts +0 -63
- package/tsconfig.json +0 -117
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/cli/jq.ts
|
|
4
|
+
function jqEval(data, expr) {
|
|
5
|
+
const trimmed = expr.trim();
|
|
6
|
+
if (trimmed === ".") return data;
|
|
7
|
+
if (trimmed.includes(" | ")) {
|
|
8
|
+
const parts = trimmed.split(" | ");
|
|
9
|
+
let result = data;
|
|
10
|
+
for (const part of parts) {
|
|
11
|
+
result = jqEval(result, part.trim());
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
const selectMatch = trimmed.match(
|
|
16
|
+
/^select\(\.(\w[\w.]*)\s*(>|<|>=|<=|==|!=)\s*(.+)\)$/
|
|
17
|
+
);
|
|
18
|
+
if (selectMatch) {
|
|
19
|
+
const [, field, op, rawVal] = selectMatch;
|
|
20
|
+
if (!Array.isArray(data)) return data;
|
|
21
|
+
const val = parseValue(rawVal);
|
|
22
|
+
return data.filter((item) => {
|
|
23
|
+
const fieldVal = extractPath(item, field);
|
|
24
|
+
return compare(fieldVal, op, val);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(data) && trimmed.startsWith(".") && !trimmed.includes("[")) {
|
|
28
|
+
const path = trimmed.slice(1);
|
|
29
|
+
if (path && !path.includes(" ")) {
|
|
30
|
+
return data.map((item) => extractPath(item, path));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (trimmed === ".[]") {
|
|
34
|
+
if (Array.isArray(data)) return data;
|
|
35
|
+
if (typeof data === "object" && data !== null) return Object.values(data);
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
const indexMatch = trimmed.match(/^\.\[(\d+)\]$/);
|
|
39
|
+
if (indexMatch) {
|
|
40
|
+
const idx = parseInt(indexMatch[1], 10);
|
|
41
|
+
if (Array.isArray(data)) return data[idx];
|
|
42
|
+
return void 0;
|
|
43
|
+
}
|
|
44
|
+
if (trimmed.startsWith(".")) {
|
|
45
|
+
const path = trimmed.slice(1);
|
|
46
|
+
return extractPath(data, path);
|
|
47
|
+
}
|
|
48
|
+
return extractPath(data, trimmed);
|
|
49
|
+
}
|
|
50
|
+
function extractPath(data, path) {
|
|
51
|
+
if (!path) return data;
|
|
52
|
+
const parts = [];
|
|
53
|
+
let current = "";
|
|
54
|
+
for (let i = 0; i < path.length; i++) {
|
|
55
|
+
if (path[i] === "." && path[i + 1] === "[" && path[i + 2] === "]") {
|
|
56
|
+
if (current) parts.push(current);
|
|
57
|
+
parts.push("[]");
|
|
58
|
+
current = "";
|
|
59
|
+
i += 2;
|
|
60
|
+
} else if (path[i] === "." && current) {
|
|
61
|
+
parts.push(current);
|
|
62
|
+
current = "";
|
|
63
|
+
} else if (path[i] !== "." || current) {
|
|
64
|
+
current += path[i];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (current) parts.push(current);
|
|
68
|
+
let result = data;
|
|
69
|
+
for (const part of parts) {
|
|
70
|
+
if (result == null) return void 0;
|
|
71
|
+
if (part === "[]") {
|
|
72
|
+
if (Array.isArray(result)) return result;
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
if (typeof result === "object" && result !== null) {
|
|
76
|
+
result = result[part];
|
|
77
|
+
} else {
|
|
78
|
+
return void 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
function parseValue(raw) {
|
|
84
|
+
const trimmed = raw.trim();
|
|
85
|
+
if (trimmed === "true") return true;
|
|
86
|
+
if (trimmed === "false") return false;
|
|
87
|
+
if (/^".*"$/.test(trimmed)) return trimmed.slice(1, -1);
|
|
88
|
+
const num = Number(trimmed);
|
|
89
|
+
if (!isNaN(num)) return num;
|
|
90
|
+
return trimmed;
|
|
91
|
+
}
|
|
92
|
+
function compare(a, op, b) {
|
|
93
|
+
switch (op) {
|
|
94
|
+
case "==":
|
|
95
|
+
return a === b;
|
|
96
|
+
case "!=":
|
|
97
|
+
return a !== b;
|
|
98
|
+
case ">":
|
|
99
|
+
return typeof a === "number" && typeof b === "number" && a > b;
|
|
100
|
+
case "<":
|
|
101
|
+
return typeof a === "number" && typeof b === "number" && a < b;
|
|
102
|
+
case ">=":
|
|
103
|
+
return typeof a === "number" && typeof b === "number" && a >= b;
|
|
104
|
+
case "<=":
|
|
105
|
+
return typeof a === "number" && typeof b === "number" && a <= b;
|
|
106
|
+
default:
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/cli/output.ts
|
|
112
|
+
process.on("SIGPIPE", () => process.exit(0));
|
|
113
|
+
var globalOpts = {};
|
|
114
|
+
function setOutputOptions(opts) {
|
|
115
|
+
globalOpts = opts;
|
|
116
|
+
}
|
|
117
|
+
function shouldOutputJson() {
|
|
118
|
+
if (globalOpts.json) return true;
|
|
119
|
+
if (globalOpts.pretty) return false;
|
|
120
|
+
return !process.stdout.isTTY;
|
|
121
|
+
}
|
|
122
|
+
function colorEnabled() {
|
|
123
|
+
if (globalOpts.noColor) return false;
|
|
124
|
+
if (process.env.NO_COLOR) return false;
|
|
125
|
+
if (process.env.FORCE_COLOR) return true;
|
|
126
|
+
return !!process.stdout.isTTY;
|
|
127
|
+
}
|
|
128
|
+
function red(s) {
|
|
129
|
+
return colorEnabled() ? `\x1B[31m${s}\x1B[0m` : s;
|
|
130
|
+
}
|
|
131
|
+
function green(s) {
|
|
132
|
+
return colorEnabled() ? `\x1B[32m${s}\x1B[0m` : s;
|
|
133
|
+
}
|
|
134
|
+
function yellow(s) {
|
|
135
|
+
return colorEnabled() ? `\x1B[33m${s}\x1B[0m` : s;
|
|
136
|
+
}
|
|
137
|
+
function dim(s) {
|
|
138
|
+
return colorEnabled() ? `\x1B[2m${s}\x1B[0m` : s;
|
|
139
|
+
}
|
|
140
|
+
function bold(s) {
|
|
141
|
+
return colorEnabled() ? `\x1B[1m${s}\x1B[0m` : s;
|
|
142
|
+
}
|
|
143
|
+
function successEnvelope(data, meta) {
|
|
144
|
+
return { ok: true, data, meta };
|
|
145
|
+
}
|
|
146
|
+
function errorEnvelope(err, meta) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
error: {
|
|
150
|
+
code: err.code,
|
|
151
|
+
message: err.message,
|
|
152
|
+
...err.suggestion && { suggestion: err.suggestion }
|
|
153
|
+
},
|
|
154
|
+
meta
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function applyFields(data, fields) {
|
|
158
|
+
if (!fields) return data;
|
|
159
|
+
const keys = fields.split(",").map((f) => f.trim());
|
|
160
|
+
if (Array.isArray(data)) {
|
|
161
|
+
return data.map((item) => pick(item, keys));
|
|
162
|
+
}
|
|
163
|
+
if (typeof data === "object" && data !== null) {
|
|
164
|
+
return pick(data, keys);
|
|
165
|
+
}
|
|
166
|
+
return data;
|
|
167
|
+
}
|
|
168
|
+
function pick(obj, keys) {
|
|
169
|
+
if (typeof obj !== "object" || obj === null) return obj;
|
|
170
|
+
const result = {};
|
|
171
|
+
for (const key of keys) {
|
|
172
|
+
if (key in obj) {
|
|
173
|
+
result[key] = obj[key];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
async function writeOutput(envelope) {
|
|
179
|
+
if (globalOpts.fields && envelope.data) {
|
|
180
|
+
envelope = {
|
|
181
|
+
...envelope,
|
|
182
|
+
data: applyFields(envelope.data, globalOpts.fields)
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (globalOpts.jq && envelope.data != null) {
|
|
186
|
+
envelope = { ...envelope, data: jqEval(envelope.data, globalOpts.jq) };
|
|
187
|
+
}
|
|
188
|
+
if (globalOpts.csv && envelope.ok && Array.isArray(envelope.data)) {
|
|
189
|
+
process.stdout.write(
|
|
190
|
+
formatCsv(envelope.data) + "\n"
|
|
191
|
+
);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (shouldOutputJson()) {
|
|
195
|
+
const output = JSON.stringify(envelope, null, 2);
|
|
196
|
+
process.stdout.write(output + "\n");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (!globalOpts.quiet && envelope.meta.tool) {
|
|
200
|
+
const status = envelope.ok ? green(`\u2713 ${envelope.meta.tool}`) : red(`\u2717 ${envelope.meta.tool}`);
|
|
201
|
+
const provider = envelope.meta.provider ? dim(` (${envelope.meta.provider})`) : "";
|
|
202
|
+
const timing = envelope.meta.duration_ms != null ? dim(` ${envelope.meta.duration_ms}ms`) : "";
|
|
203
|
+
process.stderr.write(`${status}${provider}${timing}
|
|
204
|
+
|
|
205
|
+
`);
|
|
206
|
+
}
|
|
207
|
+
if (envelope.ok && envelope.data != null) {
|
|
208
|
+
if (Array.isArray(envelope.data) && envelope.data.length > 0 && typeof envelope.data[0] === "object" && envelope.data[0] !== null) {
|
|
209
|
+
const { formatTable } = await import("./format-4OIUGZKY.js");
|
|
210
|
+
process.stdout.write(
|
|
211
|
+
formatTable(envelope.data) + "\n"
|
|
212
|
+
);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const text = typeof envelope.data === "string" ? envelope.data : JSON.stringify(envelope.data, null, 2);
|
|
216
|
+
process.stdout.write(text + "\n");
|
|
217
|
+
}
|
|
218
|
+
if (!envelope.ok && envelope.error) {
|
|
219
|
+
process.stderr.write(red(`Error: ${envelope.error.message}
|
|
220
|
+
`));
|
|
221
|
+
if (envelope.error.suggestion) {
|
|
222
|
+
process.stderr.write(
|
|
223
|
+
yellow(` Suggestion: ${envelope.error.suggestion}
|
|
224
|
+
`)
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async function outputSuccess(data, meta) {
|
|
230
|
+
await writeOutput(successEnvelope(data, meta));
|
|
231
|
+
}
|
|
232
|
+
async function outputError(err, meta) {
|
|
233
|
+
await writeOutput(errorEnvelope(err, meta));
|
|
234
|
+
process.exit(err.exitCode);
|
|
235
|
+
}
|
|
236
|
+
function info(msg) {
|
|
237
|
+
if (!globalOpts.quiet) {
|
|
238
|
+
process.stderr.write(msg + "\n");
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function debug(msg) {
|
|
242
|
+
if (globalOpts.verbose) {
|
|
243
|
+
process.stderr.write(dim(`[debug] ${msg}`) + "\n");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function isCI() {
|
|
247
|
+
return !!(process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.JENKINS_URL || process.env.HIVE_CI);
|
|
248
|
+
}
|
|
249
|
+
function formatCsv(data) {
|
|
250
|
+
if (data.length === 0) return "";
|
|
251
|
+
const keys = [...new Set(data.flatMap((row) => Object.keys(row)))];
|
|
252
|
+
const escape = (val) => {
|
|
253
|
+
const str = val == null ? "" : String(val);
|
|
254
|
+
return str.includes(",") || str.includes('"') || str.includes("\n") ? `"${str.replace(/"/g, '""')}"` : str;
|
|
255
|
+
};
|
|
256
|
+
const header = keys.join(",");
|
|
257
|
+
const rows = data.map((row) => keys.map((k) => escape(row[k])).join(","));
|
|
258
|
+
return [header, ...rows].join("\n");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export {
|
|
262
|
+
setOutputOptions,
|
|
263
|
+
shouldOutputJson,
|
|
264
|
+
colorEnabled,
|
|
265
|
+
red,
|
|
266
|
+
green,
|
|
267
|
+
yellow,
|
|
268
|
+
dim,
|
|
269
|
+
bold,
|
|
270
|
+
successEnvelope,
|
|
271
|
+
errorEnvelope,
|
|
272
|
+
writeOutput,
|
|
273
|
+
outputSuccess,
|
|
274
|
+
outputError,
|
|
275
|
+
info,
|
|
276
|
+
debug,
|
|
277
|
+
isCI,
|
|
278
|
+
formatCsv
|
|
279
|
+
};
|
|
280
|
+
//# sourceMappingURL=chunk-FAFUYZQS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// node_modules/fastest-levenshtein/esm/mod.js
|
|
4
|
+
var peq = new Uint32Array(65536);
|
|
5
|
+
var myers_32 = (a, b) => {
|
|
6
|
+
const n = a.length;
|
|
7
|
+
const m = b.length;
|
|
8
|
+
const lst = 1 << n - 1;
|
|
9
|
+
let pv = -1;
|
|
10
|
+
let mv = 0;
|
|
11
|
+
let sc = n;
|
|
12
|
+
let i = n;
|
|
13
|
+
while (i--) {
|
|
14
|
+
peq[a.charCodeAt(i)] |= 1 << i;
|
|
15
|
+
}
|
|
16
|
+
for (i = 0; i < m; i++) {
|
|
17
|
+
let eq = peq[b.charCodeAt(i)];
|
|
18
|
+
const xv = eq | mv;
|
|
19
|
+
eq |= (eq & pv) + pv ^ pv;
|
|
20
|
+
mv |= ~(eq | pv);
|
|
21
|
+
pv &= eq;
|
|
22
|
+
if (mv & lst) {
|
|
23
|
+
sc++;
|
|
24
|
+
}
|
|
25
|
+
if (pv & lst) {
|
|
26
|
+
sc--;
|
|
27
|
+
}
|
|
28
|
+
mv = mv << 1 | 1;
|
|
29
|
+
pv = pv << 1 | ~(xv | mv);
|
|
30
|
+
mv &= xv;
|
|
31
|
+
}
|
|
32
|
+
i = n;
|
|
33
|
+
while (i--) {
|
|
34
|
+
peq[a.charCodeAt(i)] = 0;
|
|
35
|
+
}
|
|
36
|
+
return sc;
|
|
37
|
+
};
|
|
38
|
+
var myers_x = (b, a) => {
|
|
39
|
+
const n = a.length;
|
|
40
|
+
const m = b.length;
|
|
41
|
+
const mhc = [];
|
|
42
|
+
const phc = [];
|
|
43
|
+
const hsize = Math.ceil(n / 32);
|
|
44
|
+
const vsize = Math.ceil(m / 32);
|
|
45
|
+
for (let i = 0; i < hsize; i++) {
|
|
46
|
+
phc[i] = -1;
|
|
47
|
+
mhc[i] = 0;
|
|
48
|
+
}
|
|
49
|
+
let j = 0;
|
|
50
|
+
for (; j < vsize - 1; j++) {
|
|
51
|
+
let mv2 = 0;
|
|
52
|
+
let pv2 = -1;
|
|
53
|
+
const start2 = j * 32;
|
|
54
|
+
const vlen2 = Math.min(32, m) + start2;
|
|
55
|
+
for (let k = start2; k < vlen2; k++) {
|
|
56
|
+
peq[b.charCodeAt(k)] |= 1 << k;
|
|
57
|
+
}
|
|
58
|
+
for (let i = 0; i < n; i++) {
|
|
59
|
+
const eq = peq[a.charCodeAt(i)];
|
|
60
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
61
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
62
|
+
const xv = eq | mv2;
|
|
63
|
+
const xh = ((eq | mb) & pv2) + pv2 ^ pv2 | eq | mb;
|
|
64
|
+
let ph = mv2 | ~(xh | pv2);
|
|
65
|
+
let mh = pv2 & xh;
|
|
66
|
+
if (ph >>> 31 ^ pb) {
|
|
67
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
68
|
+
}
|
|
69
|
+
if (mh >>> 31 ^ mb) {
|
|
70
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
71
|
+
}
|
|
72
|
+
ph = ph << 1 | pb;
|
|
73
|
+
mh = mh << 1 | mb;
|
|
74
|
+
pv2 = mh | ~(xv | ph);
|
|
75
|
+
mv2 = ph & xv;
|
|
76
|
+
}
|
|
77
|
+
for (let k = start2; k < vlen2; k++) {
|
|
78
|
+
peq[b.charCodeAt(k)] = 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
let mv = 0;
|
|
82
|
+
let pv = -1;
|
|
83
|
+
const start = j * 32;
|
|
84
|
+
const vlen = Math.min(32, m - start) + start;
|
|
85
|
+
for (let k = start; k < vlen; k++) {
|
|
86
|
+
peq[b.charCodeAt(k)] |= 1 << k;
|
|
87
|
+
}
|
|
88
|
+
let score = m;
|
|
89
|
+
for (let i = 0; i < n; i++) {
|
|
90
|
+
const eq = peq[a.charCodeAt(i)];
|
|
91
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
92
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
93
|
+
const xv = eq | mv;
|
|
94
|
+
const xh = ((eq | mb) & pv) + pv ^ pv | eq | mb;
|
|
95
|
+
let ph = mv | ~(xh | pv);
|
|
96
|
+
let mh = pv & xh;
|
|
97
|
+
score += ph >>> m - 1 & 1;
|
|
98
|
+
score -= mh >>> m - 1 & 1;
|
|
99
|
+
if (ph >>> 31 ^ pb) {
|
|
100
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
101
|
+
}
|
|
102
|
+
if (mh >>> 31 ^ mb) {
|
|
103
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
104
|
+
}
|
|
105
|
+
ph = ph << 1 | pb;
|
|
106
|
+
mh = mh << 1 | mb;
|
|
107
|
+
pv = mh | ~(xv | ph);
|
|
108
|
+
mv = ph & xv;
|
|
109
|
+
}
|
|
110
|
+
for (let k = start; k < vlen; k++) {
|
|
111
|
+
peq[b.charCodeAt(k)] = 0;
|
|
112
|
+
}
|
|
113
|
+
return score;
|
|
114
|
+
};
|
|
115
|
+
var distance = (a, b) => {
|
|
116
|
+
if (a.length < b.length) {
|
|
117
|
+
const tmp = b;
|
|
118
|
+
b = a;
|
|
119
|
+
a = tmp;
|
|
120
|
+
}
|
|
121
|
+
if (b.length === 0) {
|
|
122
|
+
return a.length;
|
|
123
|
+
}
|
|
124
|
+
if (a.length <= 32) {
|
|
125
|
+
return myers_32(a, b);
|
|
126
|
+
}
|
|
127
|
+
return myers_x(a, b);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// src/cli/errors.ts
|
|
131
|
+
var ExitCode = {
|
|
132
|
+
SUCCESS: 0,
|
|
133
|
+
GENERAL_ERROR: 1,
|
|
134
|
+
INVALID_ARGS: 2,
|
|
135
|
+
TOOL_NOT_FOUND: 3,
|
|
136
|
+
API_ERROR: 4,
|
|
137
|
+
AUTH_FAILURE: 5,
|
|
138
|
+
RATE_LIMITED: 6,
|
|
139
|
+
TIMEOUT: 124
|
|
140
|
+
};
|
|
141
|
+
var ERROR_CODE_TO_EXIT = {
|
|
142
|
+
GENERAL_ERROR: ExitCode.GENERAL_ERROR,
|
|
143
|
+
INVALID_ARGS: ExitCode.INVALID_ARGS,
|
|
144
|
+
TOOL_NOT_FOUND: ExitCode.TOOL_NOT_FOUND,
|
|
145
|
+
API_ERROR: ExitCode.API_ERROR,
|
|
146
|
+
PROVIDER_UNAVAILABLE: ExitCode.AUTH_FAILURE,
|
|
147
|
+
RATE_LIMITED: ExitCode.RATE_LIMITED,
|
|
148
|
+
TIMEOUT: ExitCode.TIMEOUT,
|
|
149
|
+
VALIDATION_ERROR: ExitCode.INVALID_ARGS
|
|
150
|
+
};
|
|
151
|
+
var ERROR_DOC_URLS = {
|
|
152
|
+
RATE_LIMITED: "https://docs.hiveintelligence.xyz/errors/rate-limited",
|
|
153
|
+
TIMEOUT: "https://docs.hiveintelligence.xyz/errors/timeout",
|
|
154
|
+
PROVIDER_UNAVAILABLE: "https://docs.hiveintelligence.xyz/errors/provider-unavailable",
|
|
155
|
+
TOOL_NOT_FOUND: "https://docs.hiveintelligence.xyz/errors/tool-not-found"
|
|
156
|
+
};
|
|
157
|
+
var CliError = class extends Error {
|
|
158
|
+
code;
|
|
159
|
+
exitCode;
|
|
160
|
+
suggestion;
|
|
161
|
+
docUrl;
|
|
162
|
+
constructor(code, message, suggestion, docUrl) {
|
|
163
|
+
super(message);
|
|
164
|
+
this.name = "CliError";
|
|
165
|
+
this.code = code;
|
|
166
|
+
this.exitCode = ERROR_CODE_TO_EXIT[code] ?? ExitCode.GENERAL_ERROR;
|
|
167
|
+
this.suggestion = suggestion;
|
|
168
|
+
this.docUrl = docUrl ?? ERROR_DOC_URLS[code];
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
function classifyError(error, toolName) {
|
|
172
|
+
if (error instanceof CliError) return error;
|
|
173
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
174
|
+
const lower = msg.toLowerCase();
|
|
175
|
+
if (lower.includes("timed out") || lower.includes("timeout")) {
|
|
176
|
+
return new CliError("TIMEOUT", msg, "Increase timeout with --timeout <ms>");
|
|
177
|
+
}
|
|
178
|
+
if (lower.includes("rate limit") || lower.includes("429")) {
|
|
179
|
+
return new CliError(
|
|
180
|
+
"RATE_LIMITED",
|
|
181
|
+
msg,
|
|
182
|
+
"Wait and retry, or reduce request frequency"
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
if (lower.includes("api key") || lower.includes("unauthorized") || lower.includes("not configured") || lower.includes("unavailable")) {
|
|
186
|
+
return new CliError(
|
|
187
|
+
"PROVIDER_UNAVAILABLE",
|
|
188
|
+
msg,
|
|
189
|
+
"Run: hive-mcp auth login"
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (lower.includes("not found") && toolName) {
|
|
193
|
+
return new CliError(
|
|
194
|
+
"TOOL_NOT_FOUND",
|
|
195
|
+
msg,
|
|
196
|
+
`Run: hive-mcp tools search "${toolName}"`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
return new CliError("API_ERROR", msg);
|
|
200
|
+
}
|
|
201
|
+
function suggestSimilarTools(input, toolNames, maxDistance = 3) {
|
|
202
|
+
return toolNames.map((name) => ({ name, dist: distance(input, name) })).filter((entry) => entry.dist <= maxDistance).sort((a, b) => a.dist - b.dist).slice(0, 3).map((entry) => entry.name);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export {
|
|
206
|
+
ExitCode,
|
|
207
|
+
ERROR_DOC_URLS,
|
|
208
|
+
CliError,
|
|
209
|
+
classifyError,
|
|
210
|
+
suggestSimilarTools
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=chunk-IWBWPHYY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/fastest-levenshtein/esm/mod.js","../src/cli/errors.ts"],"sourcesContent":["const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","import { distance } from \"fastest-levenshtein\";\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n INVALID_ARGS: 2,\n TOOL_NOT_FOUND: 3,\n API_ERROR: 4,\n AUTH_FAILURE: 5,\n RATE_LIMITED: 6,\n TIMEOUT: 124,\n} as const;\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode];\n\nexport type ErrorCode =\n | \"GENERAL_ERROR\"\n | \"INVALID_ARGS\"\n | \"TOOL_NOT_FOUND\"\n | \"API_ERROR\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"RATE_LIMITED\"\n | \"TIMEOUT\"\n | \"VALIDATION_ERROR\";\n\nconst ERROR_CODE_TO_EXIT: Record<ErrorCode, ExitCodeValue> = {\n GENERAL_ERROR: ExitCode.GENERAL_ERROR,\n INVALID_ARGS: ExitCode.INVALID_ARGS,\n TOOL_NOT_FOUND: ExitCode.TOOL_NOT_FOUND,\n API_ERROR: ExitCode.API_ERROR,\n PROVIDER_UNAVAILABLE: ExitCode.AUTH_FAILURE,\n RATE_LIMITED: ExitCode.RATE_LIMITED,\n TIMEOUT: ExitCode.TIMEOUT,\n VALIDATION_ERROR: ExitCode.INVALID_ARGS,\n};\n\nexport const ERROR_DOC_URLS: Partial<Record<ErrorCode, string>> = {\n RATE_LIMITED: \"https://docs.hiveintelligence.xyz/errors/rate-limited\",\n TIMEOUT: \"https://docs.hiveintelligence.xyz/errors/timeout\",\n PROVIDER_UNAVAILABLE:\n \"https://docs.hiveintelligence.xyz/errors/provider-unavailable\",\n TOOL_NOT_FOUND: \"https://docs.hiveintelligence.xyz/errors/tool-not-found\",\n};\n\nexport class CliError extends Error {\n public readonly code: ErrorCode;\n public readonly exitCode: ExitCodeValue;\n public readonly suggestion?: string;\n public readonly docUrl?: string;\n\n constructor(\n code: ErrorCode,\n message: string,\n suggestion?: string,\n docUrl?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = ERROR_CODE_TO_EXIT[code] ?? ExitCode.GENERAL_ERROR;\n this.suggestion = suggestion;\n this.docUrl = docUrl ?? ERROR_DOC_URLS[code];\n }\n}\n\nexport function classifyError(error: unknown, toolName?: string): CliError {\n if (error instanceof CliError) return error;\n\n const msg = error instanceof Error ? error.message : String(error);\n const lower = msg.toLowerCase();\n\n if (lower.includes(\"timed out\") || lower.includes(\"timeout\")) {\n return new CliError(\"TIMEOUT\", msg, \"Increase timeout with --timeout <ms>\");\n }\n if (lower.includes(\"rate limit\") || lower.includes(\"429\")) {\n return new CliError(\n \"RATE_LIMITED\",\n msg,\n \"Wait and retry, or reduce request frequency\",\n );\n }\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"not configured\") ||\n lower.includes(\"unavailable\")\n ) {\n return new CliError(\n \"PROVIDER_UNAVAILABLE\",\n msg,\n \"Run: hive-mcp auth login\",\n );\n }\n if (lower.includes(\"not found\") && toolName) {\n return new CliError(\n \"TOOL_NOT_FOUND\",\n msg,\n `Run: hive-mcp tools search \"${toolName}\"`,\n );\n }\n\n return new CliError(\"API_ERROR\", msg);\n}\n\nexport function suggestSimilarTools(\n input: string,\n toolNames: string[],\n maxDistance: number = 3,\n): string[] {\n return toolNames\n .map((name) => ({ name, dist: distance(input, name) }))\n .filter((entry) => entry.dist <= maxDistance)\n .sort((a, b) => a.dist - b.dist)\n .slice(0, 3)\n .map((entry) => entry.name);\n}\n"],"mappings":"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","names":["mv","pv","start","vlen"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
getNoRetry,
|
|
4
|
+
resolveApiKey,
|
|
5
|
+
resolveApiUrl
|
|
6
|
+
} from "./chunk-XQJ6PB2L.js";
|
|
7
|
+
|
|
8
|
+
// src/cli/api-client.ts
|
|
9
|
+
var MAX_RETRIES = 3;
|
|
10
|
+
var BASE_DELAY_MS = 500;
|
|
11
|
+
var MAX_DELAY_MS = 5e3;
|
|
12
|
+
function isRetryable(status) {
|
|
13
|
+
return status >= 500 || status === 429;
|
|
14
|
+
}
|
|
15
|
+
function isRetryableError(err) {
|
|
16
|
+
if (!(err instanceof Error)) return false;
|
|
17
|
+
const msg = err.message.toLowerCase();
|
|
18
|
+
return err.name === "AbortError" || msg.includes("econnreset") || msg.includes("econnrefused") || msg.includes("etimedout") || msg.includes("fetch failed");
|
|
19
|
+
}
|
|
20
|
+
function delay(ms) {
|
|
21
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
}
|
|
23
|
+
function computeDelay(attempt, retryAfterHeader) {
|
|
24
|
+
if (retryAfterHeader) {
|
|
25
|
+
const seconds = parseInt(retryAfterHeader, 10);
|
|
26
|
+
if (!isNaN(seconds) && seconds > 0)
|
|
27
|
+
return Math.min(seconds * 1e3, MAX_DELAY_MS);
|
|
28
|
+
}
|
|
29
|
+
const exponential = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
30
|
+
const jitter = exponential * (0.75 + Math.random() * 0.5);
|
|
31
|
+
return Math.min(jitter, MAX_DELAY_MS);
|
|
32
|
+
}
|
|
33
|
+
async function fetchWithRetry(url, init, fetchFn = fetch) {
|
|
34
|
+
const maxRetries = getNoRetry() ? 0 : MAX_RETRIES;
|
|
35
|
+
let lastResponse;
|
|
36
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetchFn(url, init);
|
|
39
|
+
if (response.ok || !isRetryable(response.status) || attempt === maxRetries) {
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
lastResponse = response;
|
|
43
|
+
const retryAfter = response.headers?.get?.("retry-after") ?? null;
|
|
44
|
+
const waitMs = computeDelay(attempt, retryAfter);
|
|
45
|
+
await delay(waitMs);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
if (!isRetryableError(err) || attempt === maxRetries) throw err;
|
|
48
|
+
const waitMs = computeDelay(attempt);
|
|
49
|
+
await delay(waitMs);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return lastResponse;
|
|
53
|
+
}
|
|
54
|
+
function getHeaders(apiKey) {
|
|
55
|
+
const headers = {
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
"User-Agent": `hive-cli/${process.env.npm_package_version ?? "0.1.2"}`
|
|
58
|
+
};
|
|
59
|
+
if (apiKey) headers.Authorization = `Bearer ${apiKey}`;
|
|
60
|
+
return headers;
|
|
61
|
+
}
|
|
62
|
+
async function executeRemoteTool(toolName, args, timeoutMs = 3e4) {
|
|
63
|
+
const url = `${resolveApiUrl()}/api/v1/execute`;
|
|
64
|
+
const apiKey = resolveApiKey();
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetchWithRetry(url, {
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: getHeaders(apiKey),
|
|
71
|
+
body: JSON.stringify({ tool: toolName, args }),
|
|
72
|
+
signal: controller.signal
|
|
73
|
+
});
|
|
74
|
+
const data = await response.json();
|
|
75
|
+
return data;
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
error: {
|
|
81
|
+
code: "TIMEOUT",
|
|
82
|
+
message: `Request timed out after ${timeoutMs}ms`,
|
|
83
|
+
suggestion: "Increase with --timeout <ms>"
|
|
84
|
+
},
|
|
85
|
+
meta: { tool: toolName }
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
error: {
|
|
92
|
+
code: "API_ERROR",
|
|
93
|
+
message: `Connection failed: ${msg}`,
|
|
94
|
+
suggestion: `Check HIVE_API_URL (${resolveApiUrl()})`
|
|
95
|
+
},
|
|
96
|
+
meta: { tool: toolName }
|
|
97
|
+
};
|
|
98
|
+
} finally {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function fetchToolCatalog() {
|
|
103
|
+
const url = `${resolveApiUrl()}/api/v1/tools`;
|
|
104
|
+
const apiKey = resolveApiKey();
|
|
105
|
+
const response = await fetchWithRetry(url, {
|
|
106
|
+
headers: getHeaders(apiKey)
|
|
107
|
+
});
|
|
108
|
+
return response.json();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
executeRemoteTool,
|
|
113
|
+
fetchToolCatalog
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=chunk-LBTLYTZS.js.map
|