hive-intelligence 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +232 -379
- package/agent-skills/.claude-plugin/plugin.json +105 -0
- package/{LICENSE → agent-skills/LICENSE} +1 -1
- package/agent-skills/README.md +146 -0
- package/agent-skills/SKILL.md +68 -0
- package/agent-skills/evals/README.md +20 -0
- package/agent-skills/evals/trigger-queries.json +194 -0
- package/agent-skills/package.json +49 -0
- package/agent-skills/packs/hive-build/SKILL.md +327 -0
- package/agent-skills/packs/hive-build/evals/evals.json +28 -0
- package/agent-skills/packs/hive-build-onboarding/SKILL.md +137 -0
- package/agent-skills/packs/hive-build-onboarding/evals/evals.json +27 -0
- package/agent-skills/packs/hive-cli/SKILL.md +141 -0
- package/agent-skills/packs/hive-cli/evals/evals.json +27 -0
- package/agent-skills/packs/hive-defi-research/SKILL.md +42 -0
- package/agent-skills/packs/hive-defi-research/evals/evals.json +27 -0
- package/agent-skills/packs/hive-defi-research/references/workflow.md +41 -0
- package/agent-skills/packs/hive-dex-pool-analysis/SKILL.md +41 -0
- package/agent-skills/packs/hive-dex-pool-analysis/evals/evals.json +27 -0
- package/agent-skills/packs/hive-dex-pool-analysis/references/workflow.md +42 -0
- package/agent-skills/packs/hive-market-research/SKILL.md +45 -0
- package/agent-skills/packs/hive-market-research/evals/evals.json +27 -0
- package/agent-skills/packs/hive-market-research/references/workflow.md +47 -0
- package/agent-skills/packs/hive-mcp/SKILL.md +224 -0
- package/agent-skills/packs/hive-mcp/evals/evals.json +38 -0
- package/agent-skills/packs/hive-mcp/references/client-install-matrix.md +83 -0
- package/agent-skills/packs/hive-network-infrastructure/SKILL.md +44 -0
- package/agent-skills/packs/hive-network-infrastructure/evals/evals.json +27 -0
- package/agent-skills/packs/hive-network-infrastructure/references/workflow.md +41 -0
- package/agent-skills/packs/hive-nft-research/SKILL.md +41 -0
- package/agent-skills/packs/hive-nft-research/evals/evals.json +27 -0
- package/agent-skills/packs/hive-nft-research/references/workflow.md +42 -0
- package/agent-skills/packs/hive-prediction-markets/SKILL.md +44 -0
- package/agent-skills/packs/hive-prediction-markets/evals/evals.json +27 -0
- package/agent-skills/packs/hive-prediction-markets/references/workflow.md +42 -0
- package/agent-skills/packs/hive-query/SKILL.md +98 -0
- package/agent-skills/packs/hive-query/evals/evals.json +38 -0
- package/agent-skills/packs/hive-query/references/root-mcp-workflow.md +54 -0
- package/agent-skills/packs/hive-security-risk/SKILL.md +42 -0
- package/agent-skills/packs/hive-security-risk/evals/evals.json +27 -0
- package/agent-skills/packs/hive-security-risk/references/workflow.md +46 -0
- package/agent-skills/packs/hive-solana-analysis/SKILL.md +42 -0
- package/agent-skills/packs/hive-solana-analysis/evals/evals.json +27 -0
- package/agent-skills/packs/hive-solana-analysis/references/workflow.md +42 -0
- package/agent-skills/packs/hive-token-diligence/SKILL.md +44 -0
- package/agent-skills/packs/hive-token-diligence/evals/evals.json +27 -0
- package/agent-skills/packs/hive-token-diligence/references/workflow.md +45 -0
- package/agent-skills/packs/hive-tool-discovery/SKILL.md +49 -0
- package/agent-skills/packs/hive-tool-discovery/evals/evals.json +38 -0
- package/agent-skills/packs/hive-tool-discovery/references/discovery-surfaces.md +62 -0
- package/agent-skills/packs/hive-wallet-investigation/SKILL.md +42 -0
- package/agent-skills/packs/hive-wallet-investigation/evals/evals.json +27 -0
- package/agent-skills/packs/hive-wallet-investigation/references/workflow.md +45 -0
- package/agent-skills/references/agents-routing.md +49 -0
- package/agent-skills/scripts/validate-agent-skills-package.mjs +178 -0
- package/agent-skills/skills.sh.json +40 -0
- package/bin/hive-mcp.js +33 -0
- package/build/{alias-INGXWFCG.js → alias-CZ3DEYHF.js} +3 -3
- package/build/api-client-I23XLSHU.js +28 -0
- package/build/auth-KKINNBXT.js +40 -0
- package/build/browser-auth-EEFGRHWY.js +9 -0
- package/build/{cache-US4LSZPI.js → cache-EGNMENNA.js} +3 -3
- package/build/chunk-2MYMHMBF.js +340 -0
- package/build/chunk-2MYMHMBF.js.map +1 -0
- package/build/chunk-2X3U4DFK.js +77369 -0
- package/build/chunk-2X3U4DFK.js.map +1 -0
- package/build/chunk-B6G222LS.js +265 -0
- package/build/chunk-B6G222LS.js.map +1 -0
- package/build/{chunk-WKVZVQTG.js → chunk-DYJBTKNR.js} +4 -4
- package/build/chunk-DYJBTKNR.js.map +1 -0
- package/build/chunk-IDZD2NVG.js +247 -0
- package/build/chunk-IDZD2NVG.js.map +1 -0
- package/build/chunk-IZTN7WFH.js +250 -0
- package/build/chunk-IZTN7WFH.js.map +1 -0
- package/build/{chunk-QMRVH5ZP.js → chunk-KBVPIZS4.js} +10 -2
- package/build/chunk-KGYBTXIN.js +86 -0
- package/build/chunk-KGYBTXIN.js.map +1 -0
- package/build/{chunk-CGXVV6WR.js → chunk-MPIUUE3T.js} +87 -105
- package/build/chunk-MPIUUE3T.js.map +1 -0
- package/build/chunk-PGBVNMNZ.js +127 -0
- package/build/chunk-PGBVNMNZ.js.map +1 -0
- package/build/chunk-QNCI4DEB.js +88 -0
- package/build/chunk-QNCI4DEB.js.map +1 -0
- package/build/chunk-RKICZ6DZ.js +497 -0
- package/build/chunk-RKICZ6DZ.js.map +1 -0
- package/build/chunk-UKHZIVDT.js +44 -0
- package/build/chunk-UKHZIVDT.js.map +1 -0
- package/build/{chunk-XQJ6PB2L.js → chunk-V77LO4RO.js} +1 -1
- package/build/chunk-V77LO4RO.js.map +1 -0
- package/build/{chunk-CP3FXEQA.js → chunk-XYBEFFZ3.js} +5 -6
- package/build/chunk-XYBEFFZ3.js.map +1 -0
- package/build/cli.js +133 -122
- package/build/cli.js.map +1 -1
- package/build/{completion-J6HFY6PS.js → completion-BELZL7ND.js} +55 -50
- package/build/completion-BELZL7ND.js.map +1 -0
- package/build/config-TDX4VUGW.js +58 -0
- package/build/{config-dir-IEOID7Q6.js → config-dir-V43W2WIA.js} +3 -3
- package/build/{doctor-7WZMCQC7.js → doctor-5K5UWHNX.js} +13 -13
- package/build/doctor-5K5UWHNX.js.map +1 -0
- package/build/{errors-U6UZWVSD.js → errors-E6MVUBNA.js} +3 -3
- package/build/format-TSFSI2K7.js +43 -0
- package/build/format-TSFSI2K7.js.map +1 -0
- package/build/{init-CAVIFVSH.js → init-YQ5NBICF.js} +2 -2
- package/build/init-all-6OWEQALB.js +274 -0
- package/build/init-all-6OWEQALB.js.map +1 -0
- package/build/mcpServer-AEX3RQ4U.js +20 -0
- package/build/mcpServer-AEX3RQ4U.js.map +1 -0
- package/build/{namespace-7JWWBWBL.js → namespace-PVHBFDW2.js} +3 -3
- package/build/namespace-PVHBFDW2.js.map +1 -0
- package/build/{open-FUXYIHFO.js → open-YUIJP37F.js} +6 -6
- package/build/open-YUIJP37F.js.map +1 -0
- package/build/{output-7PGQWJY2.js → output-IYJBFCYK.js} +3 -3
- package/build/output-IYJBFCYK.js.map +1 -0
- package/build/serve-KWNJK6EY.js +44 -0
- package/build/serve-KWNJK6EY.js.map +1 -0
- package/build/server.js +4749 -14124
- package/build/server.js.map +1 -1
- package/build/setup-YTUKMPNP.js +136 -0
- package/build/setup-YTUKMPNP.js.map +1 -0
- package/build/stdio.js +31 -0
- package/build/stdio.js.map +1 -0
- package/build/{telemetry-KNWMQURH.js → telemetry-5IPRKZBL.js} +4 -4
- package/build/telemetry-5IPRKZBL.js.map +1 -0
- package/build/{tools-VRRMBCZQ.js → tools-PJHWFCAG.js} +15 -15
- package/build/uninstall-HWXEIP6K.js +115 -0
- package/build/uninstall-HWXEIP6K.js.map +1 -0
- package/build/{watch-A75SVIQ6.js → watch-KZ5EDZK3.js} +7 -7
- package/package.json +118 -52
- package/bin/hive.js +0 -25
- package/build/auth-77MKFFBQ.js +0 -233
- package/build/auth-77MKFFBQ.js.map +0 -1
- package/build/chunk-CGXVV6WR.js.map +0 -1
- package/build/chunk-CP3FXEQA.js.map +0 -1
- package/build/chunk-DTUDM6HX.js +0 -3108
- package/build/chunk-DTUDM6HX.js.map +0 -1
- package/build/chunk-LBTLYTZS.js +0 -115
- package/build/chunk-LBTLYTZS.js.map +0 -1
- package/build/chunk-OK3LSM73.js +0 -22
- package/build/chunk-OK3LSM73.js.map +0 -1
- package/build/chunk-RRI526CJ.js +0 -212
- package/build/chunk-RRI526CJ.js.map +0 -1
- package/build/chunk-WKVZVQTG.js.map +0 -1
- package/build/chunk-XQJ6PB2L.js.map +0 -1
- package/build/completion-J6HFY6PS.js.map +0 -1
- package/build/config-ANFERP7A.js +0 -99
- package/build/config-ANFERP7A.js.map +0 -1
- package/build/doctor-7WZMCQC7.js.map +0 -1
- package/build/format-CVLLK6GD.js +0 -75
- package/build/format-CVLLK6GD.js.map +0 -1
- package/build/open-FUXYIHFO.js.map +0 -1
- package/build/version-3TZ3U4IR.js +0 -9
- /package/build/{alias-INGXWFCG.js.map → alias-CZ3DEYHF.js.map} +0 -0
- /package/build/{chunk-QMRVH5ZP.js.map → api-client-I23XLSHU.js.map} +0 -0
- /package/build/{config-dir-IEOID7Q6.js.map → auth-KKINNBXT.js.map} +0 -0
- /package/build/{errors-U6UZWVSD.js.map → browser-auth-EEFGRHWY.js.map} +0 -0
- /package/build/{cache-US4LSZPI.js.map → cache-EGNMENNA.js.map} +0 -0
- /package/build/{namespace-7JWWBWBL.js.map → chunk-KBVPIZS4.js.map} +0 -0
- /package/build/{output-7PGQWJY2.js.map → config-TDX4VUGW.js.map} +0 -0
- /package/build/{telemetry-KNWMQURH.js.map → config-dir-V43W2WIA.js.map} +0 -0
- /package/build/{version-3TZ3U4IR.js.map → errors-E6MVUBNA.js.map} +0 -0
- /package/build/{init-CAVIFVSH.js.map → init-YQ5NBICF.js.map} +0 -0
- /package/build/{tools-VRRMBCZQ.js.map → tools-PJHWFCAG.js.map} +0 -0
- /package/build/{watch-A75SVIQ6.js.map → watch-KZ5EDZK3.js.map} +0 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
ensureConfigDir,
|
|
4
|
+
getConfig,
|
|
5
|
+
getCredentials,
|
|
6
|
+
saveConfig,
|
|
7
|
+
saveCredentials
|
|
8
|
+
} from "./chunk-V77LO4RO.js";
|
|
9
|
+
|
|
10
|
+
// src/cli/auth.ts
|
|
11
|
+
import { createInterface } from "readline";
|
|
12
|
+
function maskKey(key) {
|
|
13
|
+
if (!key) return "(empty)";
|
|
14
|
+
const visible = Math.min(8, key.length - 1);
|
|
15
|
+
return key.slice(0, visible) + "...";
|
|
16
|
+
}
|
|
17
|
+
function saveProfile(name, apiKey, apiUrl) {
|
|
18
|
+
ensureConfigDir();
|
|
19
|
+
const creds = getCredentials();
|
|
20
|
+
creds.profiles[name] = {
|
|
21
|
+
apiKey,
|
|
22
|
+
apiUrl,
|
|
23
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
24
|
+
};
|
|
25
|
+
saveCredentials(creds);
|
|
26
|
+
const config = getConfig();
|
|
27
|
+
config.activeProfile = name;
|
|
28
|
+
saveConfig(config);
|
|
29
|
+
}
|
|
30
|
+
function removeProfile(name) {
|
|
31
|
+
const creds = getCredentials();
|
|
32
|
+
delete creds.profiles[name];
|
|
33
|
+
saveCredentials(creds);
|
|
34
|
+
const config = getConfig();
|
|
35
|
+
if (config.activeProfile === name) {
|
|
36
|
+
const remaining = Object.keys(creds.profiles);
|
|
37
|
+
config.activeProfile = remaining[0] ?? "default";
|
|
38
|
+
saveConfig(config);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getActiveProfile() {
|
|
42
|
+
const config = getConfig();
|
|
43
|
+
const creds = getCredentials();
|
|
44
|
+
const profile = creds.profiles[config.activeProfile];
|
|
45
|
+
if (!profile) return null;
|
|
46
|
+
return { name: config.activeProfile, ...profile, isActive: true };
|
|
47
|
+
}
|
|
48
|
+
function listProfiles() {
|
|
49
|
+
const config = getConfig();
|
|
50
|
+
const creds = getCredentials();
|
|
51
|
+
return Object.entries(creds.profiles).map(([name, p]) => ({
|
|
52
|
+
name,
|
|
53
|
+
...p,
|
|
54
|
+
isActive: name === config.activeProfile
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
function switchProfile(name) {
|
|
58
|
+
const creds = getCredentials();
|
|
59
|
+
if (!creds.profiles[name]) {
|
|
60
|
+
throw new Error(`Profile "${name}" not found`);
|
|
61
|
+
}
|
|
62
|
+
const config = getConfig();
|
|
63
|
+
config.activeProfile = name;
|
|
64
|
+
saveConfig(config);
|
|
65
|
+
}
|
|
66
|
+
var ask = (rl, q) => new Promise((resolve) => rl.question(q, resolve));
|
|
67
|
+
function askSecret(prompt) {
|
|
68
|
+
if (!process.stdin.isTTY) {
|
|
69
|
+
const rl = createInterface({
|
|
70
|
+
input: process.stdin,
|
|
71
|
+
output: process.stderr
|
|
72
|
+
});
|
|
73
|
+
return new Promise(
|
|
74
|
+
(resolve) => rl.question(prompt, (ans) => {
|
|
75
|
+
rl.close();
|
|
76
|
+
resolve(ans);
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
process.stderr.write(prompt);
|
|
82
|
+
const chunks = [];
|
|
83
|
+
const stdin = process.stdin;
|
|
84
|
+
const wasRaw = stdin.isRaw;
|
|
85
|
+
if (typeof stdin.setRawMode === "function") {
|
|
86
|
+
stdin.setRawMode(true);
|
|
87
|
+
}
|
|
88
|
+
stdin.resume();
|
|
89
|
+
stdin.setEncoding("utf-8");
|
|
90
|
+
const onData = (ch) => {
|
|
91
|
+
const c = ch.toString();
|
|
92
|
+
if (c === "\n" || c === "\r" || c === "") {
|
|
93
|
+
stdin.removeListener("data", onData);
|
|
94
|
+
if (typeof stdin.setRawMode === "function") {
|
|
95
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
96
|
+
}
|
|
97
|
+
stdin.pause();
|
|
98
|
+
process.stderr.write("\n");
|
|
99
|
+
resolve(chunks.join(""));
|
|
100
|
+
} else if (c === "") {
|
|
101
|
+
process.exit(130);
|
|
102
|
+
} else if (c === "\x7F" || c === "\b") {
|
|
103
|
+
if (chunks.length > 0) {
|
|
104
|
+
chunks.pop();
|
|
105
|
+
process.stderr.write("\b \b");
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
chunks.push(c);
|
|
109
|
+
process.stderr.write("*");
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
stdin.on("data", onData);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async function runLogin(opts) {
|
|
116
|
+
const profileName = opts.profile ?? "default";
|
|
117
|
+
if (opts.manual) {
|
|
118
|
+
process.stderr.write(`
|
|
119
|
+
Hive CLI \u2014 Login (profile: ${profileName})
|
|
120
|
+
|
|
121
|
+
`);
|
|
122
|
+
let apiKey;
|
|
123
|
+
let apiUrl;
|
|
124
|
+
if (process.stdin.isTTY) {
|
|
125
|
+
apiKey = (await askSecret("API Key: ")).trim();
|
|
126
|
+
if (!apiKey) {
|
|
127
|
+
process.stderr.write("No API key provided. Aborting.\n");
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
const rl = createInterface({
|
|
131
|
+
input: process.stdin,
|
|
132
|
+
output: process.stderr
|
|
133
|
+
});
|
|
134
|
+
const urlInput = await ask(
|
|
135
|
+
rl,
|
|
136
|
+
`API URL [https://mcp.hiveintelligence.xyz]: `
|
|
137
|
+
);
|
|
138
|
+
rl.close();
|
|
139
|
+
apiUrl = urlInput.trim() || "https://mcp.hiveintelligence.xyz";
|
|
140
|
+
} else {
|
|
141
|
+
const lines = await new Promise((resolve) => {
|
|
142
|
+
const collected = [];
|
|
143
|
+
const rl = createInterface({
|
|
144
|
+
input: process.stdin,
|
|
145
|
+
output: process.stderr
|
|
146
|
+
});
|
|
147
|
+
process.stderr.write("API Key: ");
|
|
148
|
+
rl.on("line", (line) => {
|
|
149
|
+
collected.push(line);
|
|
150
|
+
if (collected.length === 1) {
|
|
151
|
+
process.stderr.write(
|
|
152
|
+
`API URL [https://mcp.hiveintelligence.xyz]: `
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if (collected.length >= 2) {
|
|
156
|
+
rl.close();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
rl.on("close", () => resolve(collected));
|
|
160
|
+
});
|
|
161
|
+
apiKey = (lines[0] ?? "").trim();
|
|
162
|
+
if (!apiKey) {
|
|
163
|
+
process.stderr.write("No API key provided. Aborting.\n");
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
apiUrl = (lines[1] ?? "").trim() || "https://mcp.hiveintelligence.xyz";
|
|
167
|
+
}
|
|
168
|
+
process.stderr.write(`
|
|
169
|
+
Validating against ${apiUrl}...
|
|
170
|
+
`);
|
|
171
|
+
try {
|
|
172
|
+
const controller = new AbortController();
|
|
173
|
+
const timer = setTimeout(() => controller.abort(), 1e4);
|
|
174
|
+
const resp = await fetch(`${apiUrl}/ping`, {
|
|
175
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
176
|
+
signal: controller.signal
|
|
177
|
+
});
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
if (resp.ok) {
|
|
180
|
+
process.stderr.write("Key validated successfully.\n");
|
|
181
|
+
} else if (resp.status === 401 || resp.status === 403) {
|
|
182
|
+
process.stderr.write(
|
|
183
|
+
`Warning: Server returned ${resp.status} \u2014 key may be invalid.
|
|
184
|
+
`
|
|
185
|
+
);
|
|
186
|
+
} else {
|
|
187
|
+
process.stderr.write(`Warning: Server returned ${resp.status}.
|
|
188
|
+
`);
|
|
189
|
+
}
|
|
190
|
+
} catch {
|
|
191
|
+
process.stderr.write(
|
|
192
|
+
"Warning: Could not reach server \u2014 saving anyway.\n"
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
saveProfile(profileName, apiKey, apiUrl);
|
|
196
|
+
process.stderr.write(
|
|
197
|
+
`
|
|
198
|
+
Profile "${profileName}" saved. Key: ${maskKey(apiKey)}
|
|
199
|
+
`
|
|
200
|
+
);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
process.stderr.write(`
|
|
204
|
+
Hive CLI \u2014 Login (profile: ${profileName})
|
|
205
|
+
`);
|
|
206
|
+
try {
|
|
207
|
+
const { browserLogin } = await import("./browser-auth-EEFGRHWY.js");
|
|
208
|
+
const apiUrl = process.env.HIVE_API_URL || "https://mcp.hiveintelligence.xyz";
|
|
209
|
+
const websiteUrl = process.env.HIVE_WEBSITE_URL || "https://hiveintelligence.xyz";
|
|
210
|
+
const result = await browserLogin({ baseUrl: websiteUrl });
|
|
211
|
+
saveProfile(profileName, result.key, apiUrl);
|
|
212
|
+
if (result.email) {
|
|
213
|
+
const creds = getCredentials();
|
|
214
|
+
if (creds.profiles[profileName]) {
|
|
215
|
+
creds.profiles[profileName].email = result.email;
|
|
216
|
+
saveCredentials(creds);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
process.stderr.write(`
|
|
220
|
+
Authenticated as ${result.email || "unknown"}
|
|
221
|
+
`);
|
|
222
|
+
process.stderr.write(`API Key: ${maskKey(result.key)}
|
|
223
|
+
`);
|
|
224
|
+
process.stderr.write(`Profile "${profileName}" saved.
|
|
225
|
+
|
|
226
|
+
`);
|
|
227
|
+
process.stderr.write(
|
|
228
|
+
`Next: run 'hive setup' to configure your AI client.
|
|
229
|
+
`
|
|
230
|
+
);
|
|
231
|
+
} catch (err) {
|
|
232
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
233
|
+
process.stderr.write(`
|
|
234
|
+
Login failed: ${msg}
|
|
235
|
+
`);
|
|
236
|
+
process.stderr.write(
|
|
237
|
+
`Fallback: run 'hive auth login --manual' to paste your key.
|
|
238
|
+
`
|
|
239
|
+
);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function runLogout() {
|
|
244
|
+
const config = getConfig();
|
|
245
|
+
const profile = config.activeProfile;
|
|
246
|
+
removeProfile(profile);
|
|
247
|
+
process.stderr.write(`Logged out of profile "${profile}".
|
|
248
|
+
`);
|
|
249
|
+
}
|
|
250
|
+
async function runWhoami() {
|
|
251
|
+
const profile = getActiveProfile();
|
|
252
|
+
if (!profile) {
|
|
253
|
+
process.stderr.write("Not logged in. Run: hive auth login\n");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
process.stderr.write(
|
|
257
|
+
`
|
|
258
|
+
Profile: ${profile.name}${profile.isActive ? " (active)" : ""}
|
|
259
|
+
`
|
|
260
|
+
);
|
|
261
|
+
process.stderr.write(`API Key: ${maskKey(profile.apiKey)}
|
|
262
|
+
`);
|
|
263
|
+
process.stderr.write(`API URL: ${profile.apiUrl}
|
|
264
|
+
`);
|
|
265
|
+
process.stderr.write(`Created: ${profile.createdAt}
|
|
266
|
+
|
|
267
|
+
`);
|
|
268
|
+
}
|
|
269
|
+
async function runProfiles() {
|
|
270
|
+
const profiles = listProfiles();
|
|
271
|
+
if (profiles.length === 0) {
|
|
272
|
+
process.stderr.write("No profiles configured. Run: hive auth login\n");
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
for (const p of profiles) {
|
|
276
|
+
const marker = p.isActive ? " *" : "";
|
|
277
|
+
process.stderr.write(
|
|
278
|
+
` ${p.name}${marker} ${maskKey(p.apiKey)} ${p.apiUrl}
|
|
279
|
+
`
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
process.stderr.write("\n");
|
|
283
|
+
}
|
|
284
|
+
async function runSwitch(name) {
|
|
285
|
+
try {
|
|
286
|
+
switchProfile(name);
|
|
287
|
+
process.stderr.write(`Switched to profile "${name}".
|
|
288
|
+
`);
|
|
289
|
+
} catch (err) {
|
|
290
|
+
process.stderr.write(
|
|
291
|
+
(err instanceof Error ? err.message : String(err)) + "\n"
|
|
292
|
+
);
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async function runSignup(opts) {
|
|
297
|
+
const { authSignup } = await import("./api-client-I23XLSHU.js");
|
|
298
|
+
const profileName = opts.profile ?? "default";
|
|
299
|
+
process.stderr.write(`
|
|
300
|
+
Hive CLI \u2014 Signup (profile: ${profileName})
|
|
301
|
+
|
|
302
|
+
`);
|
|
303
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
304
|
+
const email = await ask(rl, "Email: ");
|
|
305
|
+
rl.close();
|
|
306
|
+
const password = await askSecret("Password: ");
|
|
307
|
+
if (!email.trim() || !password.trim()) {
|
|
308
|
+
process.stderr.write("Email and password are required. Aborting.\n");
|
|
309
|
+
process.exit(1);
|
|
310
|
+
}
|
|
311
|
+
process.stderr.write("\nCreating account...\n");
|
|
312
|
+
const result = await authSignup(email.trim(), password.trim());
|
|
313
|
+
if (!result.ok) {
|
|
314
|
+
const errMsg = result.error?.message ?? "Signup failed";
|
|
315
|
+
process.stderr.write(`Error: ${errMsg}
|
|
316
|
+
`);
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
const apiKey = result.data?.api_key;
|
|
320
|
+
const keyValue = apiKey?.key;
|
|
321
|
+
const apiUrl = process.env.HIVE_API_URL || "https://mcp.hiveintelligence.xyz";
|
|
322
|
+
if (keyValue) {
|
|
323
|
+
saveProfile(profileName, keyValue, apiUrl);
|
|
324
|
+
process.stderr.write(`
|
|
325
|
+
Account created successfully!
|
|
326
|
+
`);
|
|
327
|
+
process.stderr.write(`API Key: ${keyValue}
|
|
328
|
+
`);
|
|
329
|
+
process.stderr.write(
|
|
330
|
+
`WARNING: Save this key \u2014 it will not be shown again.
|
|
331
|
+
`
|
|
332
|
+
);
|
|
333
|
+
process.stderr.write(`
|
|
334
|
+
Profile "${profileName}" saved.
|
|
335
|
+
`);
|
|
336
|
+
} else {
|
|
337
|
+
process.stderr.write(`
|
|
338
|
+
Account created but no API key was generated.
|
|
339
|
+
`);
|
|
340
|
+
process.stderr.write(`Run: hive keys create
|
|
341
|
+
`);
|
|
342
|
+
}
|
|
343
|
+
const resultData = result.data;
|
|
344
|
+
const session = resultData?.session;
|
|
345
|
+
if (session?.access_token) {
|
|
346
|
+
const creds = getCredentials();
|
|
347
|
+
creds.profiles[profileName] = {
|
|
348
|
+
...creds.profiles[profileName],
|
|
349
|
+
jwt: session.access_token
|
|
350
|
+
};
|
|
351
|
+
saveCredentials(creds);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async function runKeysList() {
|
|
355
|
+
const { listKeysApi } = await import("./api-client-I23XLSHU.js");
|
|
356
|
+
const creds = getCredentials();
|
|
357
|
+
const config = getConfig();
|
|
358
|
+
const jwt = creds.profiles[config.activeProfile]?.jwt;
|
|
359
|
+
if (!jwt) {
|
|
360
|
+
process.stderr.write(
|
|
361
|
+
"No session token. Run: hive auth signup or hive auth login\n"
|
|
362
|
+
);
|
|
363
|
+
process.exit(1);
|
|
364
|
+
}
|
|
365
|
+
const result = await listKeysApi(jwt);
|
|
366
|
+
if (!result.ok) {
|
|
367
|
+
process.stderr.write("Failed to list keys. Try logging in again.\n");
|
|
368
|
+
process.exit(1);
|
|
369
|
+
}
|
|
370
|
+
const keys = result.data;
|
|
371
|
+
if (!keys || keys.length === 0) {
|
|
372
|
+
process.stderr.write("No API keys found. Run: hive keys create\n");
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
process.stderr.write(`
|
|
376
|
+
${"KEY".padEnd(20)} ${"NAME".padEnd(15)} STATUS
|
|
377
|
+
`);
|
|
378
|
+
process.stderr.write(
|
|
379
|
+
` ${"\u2500".repeat(20)} ${"\u2500".repeat(15)} ${"\u2500".repeat(10)}
|
|
380
|
+
`
|
|
381
|
+
);
|
|
382
|
+
for (const k of keys) {
|
|
383
|
+
const prefix = k.prefix || "???";
|
|
384
|
+
const name = k.name || "Unnamed";
|
|
385
|
+
const enabled = k.enabled ? "active" : "disabled";
|
|
386
|
+
process.stderr.write(
|
|
387
|
+
` ${(prefix + "...").padEnd(20)} ${name.padEnd(15)} ${enabled}
|
|
388
|
+
`
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
process.stderr.write("\n");
|
|
392
|
+
}
|
|
393
|
+
async function runKeysCreate(opts) {
|
|
394
|
+
const { createKey } = await import("./api-client-I23XLSHU.js");
|
|
395
|
+
const creds = getCredentials();
|
|
396
|
+
const config = getConfig();
|
|
397
|
+
const jwt = creds.profiles[config.activeProfile]?.jwt;
|
|
398
|
+
if (!jwt) {
|
|
399
|
+
process.stderr.write(
|
|
400
|
+
"No session token. Run: hive auth signup or hive auth login\n"
|
|
401
|
+
);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
const name = opts.name ?? "CLI Key";
|
|
405
|
+
process.stderr.write(`Creating API key "${name}"...
|
|
406
|
+
`);
|
|
407
|
+
const result = await createKey(jwt, name);
|
|
408
|
+
if (!result.ok) {
|
|
409
|
+
const errMsg = result.error?.message ?? "Key creation failed";
|
|
410
|
+
process.stderr.write(`Error: ${errMsg}
|
|
411
|
+
`);
|
|
412
|
+
process.exit(1);
|
|
413
|
+
}
|
|
414
|
+
const data = result.data;
|
|
415
|
+
process.stderr.write(`
|
|
416
|
+
API Key: ${data.key}
|
|
417
|
+
`);
|
|
418
|
+
process.stderr.write(`Key ID: ${data.key_id}
|
|
419
|
+
`);
|
|
420
|
+
process.stderr.write(
|
|
421
|
+
`WARNING: Save this key \u2014 it will not be shown again.
|
|
422
|
+
|
|
423
|
+
`
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
async function runKeysRevoke(keyId) {
|
|
427
|
+
const { revokeKeyApi } = await import("./api-client-I23XLSHU.js");
|
|
428
|
+
const creds = getCredentials();
|
|
429
|
+
const config = getConfig();
|
|
430
|
+
const jwt = creds.profiles[config.activeProfile]?.jwt;
|
|
431
|
+
if (!jwt) {
|
|
432
|
+
process.stderr.write(
|
|
433
|
+
"No session token. Run: hive auth signup or hive auth login\n"
|
|
434
|
+
);
|
|
435
|
+
process.exit(1);
|
|
436
|
+
}
|
|
437
|
+
process.stderr.write(`Revoking key ${keyId}...
|
|
438
|
+
`);
|
|
439
|
+
const result = await revokeKeyApi(jwt, keyId);
|
|
440
|
+
if (result.ok) {
|
|
441
|
+
process.stderr.write("Key revoked.\n");
|
|
442
|
+
} else {
|
|
443
|
+
process.stderr.write("Failed to revoke key.\n");
|
|
444
|
+
process.exit(1);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
async function runUsage() {
|
|
448
|
+
const { getUsage } = await import("./api-client-I23XLSHU.js");
|
|
449
|
+
const result = await getUsage();
|
|
450
|
+
if (!result.ok) {
|
|
451
|
+
process.stderr.write("Failed to fetch usage. Check your API key.\n");
|
|
452
|
+
process.exit(1);
|
|
453
|
+
}
|
|
454
|
+
const data = result.data;
|
|
455
|
+
const plan = data.plan;
|
|
456
|
+
const keys = data.keys;
|
|
457
|
+
process.stderr.write(`
|
|
458
|
+
Plan: ${plan.name ?? plan.id}
|
|
459
|
+
`);
|
|
460
|
+
process.stderr.write(` Rate: ${plan.rate_limit_per_min}/min
|
|
461
|
+
`);
|
|
462
|
+
process.stderr.write(` Quota: ${plan.monthly_credits}/month
|
|
463
|
+
`);
|
|
464
|
+
process.stderr.write(` Keys: ${data.total_keys}
|
|
465
|
+
|
|
466
|
+
`);
|
|
467
|
+
if (keys && keys.length > 0) {
|
|
468
|
+
for (const k of keys) {
|
|
469
|
+
const remaining = k.credits_remaining ?? "unlimited";
|
|
470
|
+
process.stderr.write(
|
|
471
|
+
` ${k.prefix}... ${k.name} credits: ${remaining}
|
|
472
|
+
`
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
process.stderr.write("\n");
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export {
|
|
480
|
+
maskKey,
|
|
481
|
+
saveProfile,
|
|
482
|
+
removeProfile,
|
|
483
|
+
getActiveProfile,
|
|
484
|
+
listProfiles,
|
|
485
|
+
switchProfile,
|
|
486
|
+
runLogin,
|
|
487
|
+
runLogout,
|
|
488
|
+
runWhoami,
|
|
489
|
+
runProfiles,
|
|
490
|
+
runSwitch,
|
|
491
|
+
runSignup,
|
|
492
|
+
runKeysList,
|
|
493
|
+
runKeysCreate,
|
|
494
|
+
runKeysRevoke,
|
|
495
|
+
runUsage
|
|
496
|
+
};
|
|
497
|
+
//# sourceMappingURL=chunk-RKICZ6DZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/auth.ts"],"sourcesContent":["import { createInterface } from \"node:readline\";\nimport {\n ensureConfigDir,\n getConfig,\n saveConfig,\n getCredentials,\n saveCredentials,\n} from \"./config-dir.js\";\n\ninterface ProfileInfo {\n name: string;\n apiKey: string;\n apiUrl: string;\n createdAt: string;\n isActive: boolean;\n}\n\nexport function maskKey(key: string): string {\n if (!key) return \"(empty)\";\n const visible = Math.min(8, key.length - 1);\n return key.slice(0, visible) + \"...\";\n}\n\nexport function saveProfile(\n name: string,\n apiKey: string,\n apiUrl: string,\n): void {\n ensureConfigDir();\n const creds = getCredentials();\n creds.profiles[name] = {\n apiKey,\n apiUrl,\n createdAt: new Date().toISOString(),\n };\n saveCredentials(creds);\n const config = getConfig();\n config.activeProfile = name;\n saveConfig(config);\n}\n\nexport function removeProfile(name: string): void {\n const creds = getCredentials();\n delete creds.profiles[name];\n saveCredentials(creds);\n const config = getConfig();\n if (config.activeProfile === name) {\n const remaining = Object.keys(creds.profiles);\n config.activeProfile = remaining[0] ?? \"default\";\n saveConfig(config);\n }\n}\n\nexport function getActiveProfile(): ProfileInfo | null {\n const config = getConfig();\n const creds = getCredentials();\n const profile = creds.profiles[config.activeProfile];\n if (!profile) return null;\n return { name: config.activeProfile, ...profile, isActive: true };\n}\n\nexport function listProfiles(): ProfileInfo[] {\n const config = getConfig();\n const creds = getCredentials();\n return Object.entries(creds.profiles).map(([name, p]) => ({\n name,\n ...p,\n isActive: name === config.activeProfile,\n }));\n}\n\nexport function switchProfile(name: string): void {\n const creds = getCredentials();\n if (!creds.profiles[name]) {\n throw new Error(`Profile \"${name}\" not found`);\n }\n const config = getConfig();\n config.activeProfile = name;\n saveConfig(config);\n}\n\nconst ask = (\n rl: ReturnType<typeof createInterface>,\n q: string,\n): Promise<string> => new Promise((resolve) => rl.question(q, resolve));\n\n/** Prompt for sensitive input with echo suppressed (shows asterisks) */\nfunction askSecret(prompt: string): Promise<string> {\n // Non-TTY: fall back to regular readline (no masking possible)\n if (!process.stdin.isTTY) {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n return new Promise((resolve) =>\n rl.question(prompt, (ans) => {\n rl.close();\n resolve(ans);\n }),\n );\n }\n\n return new Promise((resolve) => {\n process.stderr.write(prompt);\n const chunks: string[] = [];\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(true);\n }\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n const onData = (ch: string) => {\n const c = ch.toString();\n if (c === \"\\n\" || c === \"\\r\" || c === \"\\u0004\") {\n stdin.removeListener(\"data\", onData);\n if (typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(wasRaw ?? false);\n }\n stdin.pause();\n process.stderr.write(\"\\n\");\n resolve(chunks.join(\"\"));\n } else if (c === \"\\u0003\") {\n // Ctrl+C\n process.exit(130);\n } else if (c === \"\\u007f\" || c === \"\\b\") {\n // Backspace\n if (chunks.length > 0) {\n chunks.pop();\n process.stderr.write(\"\\b \\b\");\n }\n } else {\n chunks.push(c);\n process.stderr.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n });\n}\n\nexport async function runLogin(opts: {\n profile?: string;\n manual?: boolean;\n}): Promise<void> {\n const profileName = opts.profile ?? \"default\";\n\n if (opts.manual) {\n // Manual flow: paste API key directly\n process.stderr.write(`\\nHive CLI — Login (profile: ${profileName})\\n\\n`);\n\n let apiKey: string;\n let apiUrl: string;\n\n if (process.stdin.isTTY) {\n // TTY: use masked input for key, separate readline for URL\n apiKey = (await askSecret(\"API Key: \")).trim();\n if (!apiKey) {\n process.stderr.write(\"No API key provided. Aborting.\\n\");\n process.exit(1);\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n const urlInput = await ask(\n rl,\n `API URL [https://mcp.hiveintelligence.xyz]: `,\n );\n rl.close();\n apiUrl = urlInput.trim() || \"https://mcp.hiveintelligence.xyz\";\n } else {\n // Non-TTY (piped): collect lines via 'line' event — rl.question()\n // does not work reliably with piped stdin for sequential prompts\n const lines = await new Promise<string[]>((resolve) => {\n const collected: string[] = [];\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n process.stderr.write(\"API Key: \");\n rl.on(\"line\", (line) => {\n collected.push(line);\n if (collected.length === 1) {\n process.stderr.write(\n `API URL [https://mcp.hiveintelligence.xyz]: `,\n );\n }\n if (collected.length >= 2) {\n rl.close();\n }\n });\n rl.on(\"close\", () => resolve(collected));\n });\n apiKey = (lines[0] ?? \"\").trim();\n if (!apiKey) {\n process.stderr.write(\"No API key provided. Aborting.\\n\");\n process.exit(1);\n }\n apiUrl = (lines[1] ?? \"\").trim() || \"https://mcp.hiveintelligence.xyz\";\n }\n\n process.stderr.write(`\\nValidating against ${apiUrl}...\\n`);\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n const resp = await fetch(`${apiUrl}/ping`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n clearTimeout(timer);\n if (resp.ok) {\n process.stderr.write(\"Key validated successfully.\\n\");\n } else if (resp.status === 401 || resp.status === 403) {\n process.stderr.write(\n `Warning: Server returned ${resp.status} — key may be invalid.\\n`,\n );\n } else {\n process.stderr.write(`Warning: Server returned ${resp.status}.\\n`);\n }\n } catch {\n process.stderr.write(\n \"Warning: Could not reach server — saving anyway.\\n\",\n );\n }\n\n saveProfile(profileName, apiKey, apiUrl);\n process.stderr.write(\n `\\nProfile \"${profileName}\" saved. Key: ${maskKey(apiKey)}\\n`,\n );\n return;\n }\n\n // Browser-based flow (default)\n process.stderr.write(`\\nHive CLI — Login (profile: ${profileName})\\n`);\n\n try {\n const { browserLogin } = await import(\"./browser-auth.js\");\n const apiUrl =\n process.env.HIVE_API_URL || \"https://mcp.hiveintelligence.xyz\";\n const websiteUrl =\n process.env.HIVE_WEBSITE_URL || \"https://hiveintelligence.xyz\";\n\n const result = await browserLogin({ baseUrl: websiteUrl });\n\n saveProfile(profileName, result.key, apiUrl);\n\n // Persist email alongside the profile credentials\n if (result.email) {\n const creds = getCredentials();\n if (creds.profiles[profileName]) {\n creds.profiles[profileName].email = result.email;\n saveCredentials(creds);\n }\n }\n\n process.stderr.write(`\\nAuthenticated as ${result.email || \"unknown\"}\\n`);\n process.stderr.write(`API Key: ${maskKey(result.key)}\\n`);\n process.stderr.write(`Profile \"${profileName}\" saved.\\n\\n`);\n process.stderr.write(\n `Next: run 'hive setup' to configure your AI client.\\n`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`\\nLogin failed: ${msg}\\n`);\n process.stderr.write(\n `Fallback: run 'hive auth login --manual' to paste your key.\\n`,\n );\n process.exit(1);\n }\n}\n\nexport async function runLogout(): Promise<void> {\n const config = getConfig();\n const profile = config.activeProfile;\n removeProfile(profile);\n process.stderr.write(`Logged out of profile \"${profile}\".\\n`);\n}\n\nexport async function runWhoami(): Promise<void> {\n const profile = getActiveProfile();\n if (!profile) {\n process.stderr.write(\"Not logged in. Run: hive auth login\\n\");\n return;\n }\n process.stderr.write(\n `\\nProfile: ${profile.name}${profile.isActive ? \" (active)\" : \"\"}\\n`,\n );\n process.stderr.write(`API Key: ${maskKey(profile.apiKey)}\\n`);\n process.stderr.write(`API URL: ${profile.apiUrl}\\n`);\n process.stderr.write(`Created: ${profile.createdAt}\\n\\n`);\n}\n\nexport async function runProfiles(): Promise<void> {\n const profiles = listProfiles();\n if (profiles.length === 0) {\n process.stderr.write(\"No profiles configured. Run: hive auth login\\n\");\n return;\n }\n for (const p of profiles) {\n const marker = p.isActive ? \" *\" : \"\";\n process.stderr.write(\n ` ${p.name}${marker} ${maskKey(p.apiKey)} ${p.apiUrl}\\n`,\n );\n }\n process.stderr.write(\"\\n\");\n}\n\nexport async function runSwitch(name: string): Promise<void> {\n try {\n switchProfile(name);\n process.stderr.write(`Switched to profile \"${name}\".\\n`);\n } catch (err) {\n process.stderr.write(\n (err instanceof Error ? err.message : String(err)) + \"\\n\",\n );\n process.exit(1);\n }\n}\n\nexport async function runSignup(opts: { profile?: string }): Promise<void> {\n const { authSignup } = await import(\"./api-client.js\");\n const profileName = opts.profile ?? \"default\";\n process.stderr.write(`\\nHive CLI — Signup (profile: ${profileName})\\n\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n const email = await ask(rl, \"Email: \");\n rl.close();\n\n const password = await askSecret(\"Password: \");\n if (!email.trim() || !password.trim()) {\n process.stderr.write(\"Email and password are required. Aborting.\\n\");\n process.exit(1);\n }\n\n process.stderr.write(\"\\nCreating account...\\n\");\n const result = await authSignup(email.trim(), password.trim());\n\n if (!result.ok) {\n const errMsg = result.error?.message ?? \"Signup failed\";\n process.stderr.write(`Error: ${errMsg}\\n`);\n process.exit(1);\n }\n\n const apiKey = (result.data as Record<string, unknown> | undefined)\n ?.api_key as Record<string, string> | undefined;\n const keyValue = apiKey?.key;\n const apiUrl = process.env.HIVE_API_URL || \"https://mcp.hiveintelligence.xyz\";\n\n if (keyValue) {\n saveProfile(profileName, keyValue, apiUrl);\n process.stderr.write(`\\nAccount created successfully!\\n`);\n process.stderr.write(`API Key: ${keyValue}\\n`);\n process.stderr.write(\n `WARNING: Save this key — it will not be shown again.\\n`,\n );\n process.stderr.write(`\\nProfile \"${profileName}\" saved.\\n`);\n } else {\n process.stderr.write(`\\nAccount created but no API key was generated.\\n`);\n process.stderr.write(`Run: hive keys create\\n`);\n }\n\n // Store JWT for key management commands\n const resultData = result.data as Record<string, unknown> | undefined;\n const session = resultData?.session as Record<string, string> | null;\n if (session?.access_token) {\n const creds = getCredentials();\n creds.profiles[profileName] = {\n ...creds.profiles[profileName],\n jwt: session.access_token,\n };\n saveCredentials(creds);\n }\n}\n\nexport async function runKeysList(): Promise<void> {\n const { listKeysApi } = await import(\"./api-client.js\");\n const creds = getCredentials();\n const config = getConfig();\n const jwt = creds.profiles[config.activeProfile]?.jwt;\n\n if (!jwt) {\n process.stderr.write(\n \"No session token. Run: hive auth signup or hive auth login\\n\",\n );\n process.exit(1);\n }\n\n const result = await listKeysApi(jwt);\n if (!result.ok) {\n process.stderr.write(\"Failed to list keys. Try logging in again.\\n\");\n process.exit(1);\n }\n\n const keys = result.data as Array<Record<string, unknown>>;\n if (!keys || keys.length === 0) {\n process.stderr.write(\"No API keys found. Run: hive keys create\\n\");\n return;\n }\n\n process.stderr.write(`\\n ${\"KEY\".padEnd(20)} ${\"NAME\".padEnd(15)} STATUS\\n`);\n process.stderr.write(\n ` ${\"─\".repeat(20)} ${\"─\".repeat(15)} ${\"─\".repeat(10)}\\n`,\n );\n for (const k of keys) {\n const prefix = (k.prefix as string) || \"???\";\n const name = (k.name as string) || \"Unnamed\";\n const enabled = k.enabled ? \"active\" : \"disabled\";\n process.stderr.write(\n ` ${(prefix + \"...\").padEnd(20)} ${name.padEnd(15)} ${enabled}\\n`,\n );\n }\n process.stderr.write(\"\\n\");\n}\n\nexport async function runKeysCreate(opts: { name?: string }): Promise<void> {\n const { createKey } = await import(\"./api-client.js\");\n const creds = getCredentials();\n const config = getConfig();\n const jwt = creds.profiles[config.activeProfile]?.jwt;\n\n if (!jwt) {\n process.stderr.write(\n \"No session token. Run: hive auth signup or hive auth login\\n\",\n );\n process.exit(1);\n }\n\n const name = opts.name ?? \"CLI Key\";\n process.stderr.write(`Creating API key \"${name}\"...\\n`);\n\n const result = await createKey(jwt, name);\n if (!result.ok) {\n const errMsg = result.error?.message ?? \"Key creation failed\";\n process.stderr.write(`Error: ${errMsg}\\n`);\n process.exit(1);\n }\n\n const data = result.data as Record<string, string>;\n process.stderr.write(`\\nAPI Key: ${data.key}\\n`);\n process.stderr.write(`Key ID: ${data.key_id}\\n`);\n process.stderr.write(\n `WARNING: Save this key — it will not be shown again.\\n\\n`,\n );\n}\n\nexport async function runKeysRevoke(keyId: string): Promise<void> {\n const { revokeKeyApi } = await import(\"./api-client.js\");\n const creds = getCredentials();\n const config = getConfig();\n const jwt = creds.profiles[config.activeProfile]?.jwt;\n\n if (!jwt) {\n process.stderr.write(\n \"No session token. Run: hive auth signup or hive auth login\\n\",\n );\n process.exit(1);\n }\n\n process.stderr.write(`Revoking key ${keyId}...\\n`);\n const result = await revokeKeyApi(jwt, keyId);\n if (result.ok) {\n process.stderr.write(\"Key revoked.\\n\");\n } else {\n process.stderr.write(\"Failed to revoke key.\\n\");\n process.exit(1);\n }\n}\n\nexport async function runUsage(): Promise<void> {\n const { getUsage } = await import(\"./api-client.js\");\n const result = await getUsage();\n\n if (!result.ok) {\n process.stderr.write(\"Failed to fetch usage. Check your API key.\\n\");\n process.exit(1);\n }\n\n const data = result.data as Record<string, unknown>;\n const plan = data.plan as Record<string, unknown>;\n const keys = data.keys as Array<Record<string, unknown>>;\n\n process.stderr.write(`\\n Plan: ${plan.name ?? plan.id}\\n`);\n process.stderr.write(` Rate: ${plan.rate_limit_per_min}/min\\n`);\n process.stderr.write(` Quota: ${plan.monthly_credits}/month\\n`);\n process.stderr.write(` Keys: ${data.total_keys}\\n\\n`);\n\n if (keys && keys.length > 0) {\n for (const k of keys) {\n const remaining = k.credits_remaining ?? \"unlimited\";\n process.stderr.write(\n ` ${k.prefix}... ${k.name} credits: ${remaining}\\n`,\n );\n }\n process.stderr.write(\"\\n\");\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
trackCommand
|
|
4
|
+
} from "./chunk-DYJBTKNR.js";
|
|
5
|
+
import {
|
|
6
|
+
executeRemoteTool
|
|
7
|
+
} from "./chunk-IZTN7WFH.js";
|
|
8
|
+
import {
|
|
9
|
+
debug,
|
|
10
|
+
shouldOutputJson,
|
|
11
|
+
writeOutput
|
|
12
|
+
} from "./chunk-XYBEFFZ3.js";
|
|
13
|
+
|
|
14
|
+
// src/cli/execute.ts
|
|
15
|
+
import ora from "ora";
|
|
16
|
+
async function executeTool(toolName, args, timeoutMs = 3e4) {
|
|
17
|
+
debug(`Executing ${toolName} remotely`);
|
|
18
|
+
const showSpinner = !shouldOutputJson() && !!process.stderr.isTTY;
|
|
19
|
+
const spinner = showSpinner ? ora({ text: `Calling ${toolName}...`, stream: process.stderr }).start() : null;
|
|
20
|
+
const startMs = Date.now();
|
|
21
|
+
let response;
|
|
22
|
+
try {
|
|
23
|
+
response = await executeRemoteTool(toolName, args, timeoutMs);
|
|
24
|
+
spinner?.succeed(`${toolName} (${Date.now() - startMs}ms)`);
|
|
25
|
+
} catch (err) {
|
|
26
|
+
spinner?.fail(`${toolName} failed (${Date.now() - startMs}ms)`);
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
29
|
+
trackCommand(
|
|
30
|
+
toolName,
|
|
31
|
+
Date.now() - startMs,
|
|
32
|
+
response.ok ? void 0 : response.error?.code
|
|
33
|
+
);
|
|
34
|
+
await writeOutput(response);
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const exitCode = response.error?.code === "TOOL_NOT_FOUND" ? 3 : response.error?.code === "PROVIDER_UNAVAILABLE" ? 5 : response.error?.code === "RATE_LIMITED" ? 6 : response.error?.code === "TIMEOUT" ? 124 : 4;
|
|
37
|
+
process.exit(exitCode);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
executeTool
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=chunk-UKHZIVDT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/execute.ts"],"sourcesContent":["import ora from \"ora\";\nimport { executeRemoteTool } from \"./api-client.js\";\nimport { writeOutput, debug, shouldOutputJson } from \"./output.js\";\nimport type { Envelope } from \"./output.js\";\nimport { trackCommand } from \"./telemetry.js\";\n\nexport async function executeTool(\n toolName: string,\n args: Record<string, unknown>,\n timeoutMs: number = 30000,\n): Promise<void> {\n debug(`Executing ${toolName} remotely`);\n\n // Spinner only when stderr is a TTY and output is not JSON (stdout is reserved for data)\n const showSpinner = !shouldOutputJson() && !!process.stderr.isTTY;\n const spinner = showSpinner\n ? ora({ text: `Calling ${toolName}...`, stream: process.stderr }).start()\n : null;\n\n const startMs = Date.now();\n let response: Awaited<ReturnType<typeof executeRemoteTool>>;\n try {\n response = await executeRemoteTool(toolName, args, timeoutMs);\n spinner?.succeed(`${toolName} (${Date.now() - startMs}ms)`);\n } catch (err) {\n spinner?.fail(`${toolName} failed (${Date.now() - startMs}ms)`);\n throw err;\n }\n\n trackCommand(\n toolName,\n Date.now() - startMs,\n response.ok ? undefined : response.error?.code,\n );\n\n await writeOutput(response as Envelope);\n\n if (!response.ok) {\n const exitCode =\n response.error?.code === \"TOOL_NOT_FOUND\"\n ? 3\n : response.error?.code === \"PROVIDER_UNAVAILABLE\"\n ? 5\n : response.error?.code === \"RATE_LIMITED\"\n ? 6\n : response.error?.code === \"TIMEOUT\"\n ? 124\n : 4;\n process.exit(exitCode);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAMhB,eAAsB,YACpB,UACA,MACA,YAAoB,KACL;AACf,QAAM,aAAa,QAAQ,WAAW;AAGtC,QAAM,cAAc,CAAC,iBAAiB,KAAK,CAAC,CAAC,QAAQ,OAAO;AAC5D,QAAM,UAAU,cACZ,IAAI,EAAE,MAAM,WAAW,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC,EAAE,MAAM,IACtE;AAEJ,QAAM,UAAU,KAAK,IAAI;AACzB,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,kBAAkB,UAAU,MAAM,SAAS;AAC5D,aAAS,QAAQ,GAAG,QAAQ,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK;AAAA,EAC5D,SAAS,KAAK;AACZ,aAAS,KAAK,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,OAAO,KAAK;AAC9D,UAAM;AAAA,EACR;AAEA;AAAA,IACE;AAAA,IACA,KAAK,IAAI,IAAI;AAAA,IACb,SAAS,KAAK,SAAY,SAAS,OAAO;AAAA,EAC5C;AAEA,QAAM,YAAY,QAAoB;AAEtC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,WACJ,SAAS,OAAO,SAAS,mBACrB,IACA,SAAS,OAAO,SAAS,yBACvB,IACA,SAAS,OAAO,SAAS,iBACvB,IACA,SAAS,OAAO,SAAS,YACvB,MACA;AACZ,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/config-dir.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface HiveConfig {\n activeProfile: string;\n aliases: Record<string, string>;\n telemetry: boolean;\n}\n\nexport interface HiveCredentials {\n profiles: Record<\n string,\n {\n apiKey: string;\n apiUrl: string;\n createdAt: string;\n jwt?: string;\n email?: string;\n }\n >;\n}\n\nconst DEFAULT_CONFIG: HiveConfig = {\n activeProfile: \"default\",\n aliases: {},\n telemetry: false,\n};\n\nconst DEFAULT_CREDENTIALS: HiveCredentials = { profiles: {} };\n\n/** Module-level overrides set by CLI flags (highest priority) */\nlet _flagApiKey: string | undefined;\nlet _flagNoRetry = false;\n\nexport function setCliFlags(opts: {\n apiKey?: string;\n noRetry?: boolean;\n}): void {\n _flagApiKey = opts.apiKey;\n _flagNoRetry = opts.noRetry ?? false;\n}\n\nexport function getNoRetry(): boolean {\n return _flagNoRetry;\n}\n\nexport function getConfigDir(): string {\n return process.env.HIVE_CONFIG_DIR || join(homedir(), \".config\", \"hive\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const cacheDir = join(dir, \"cache\");\n if (!existsSync(cacheDir)) mkdirSync(cacheDir, { recursive: true });\n}\n\nexport function readJsonFile<T>(filePath: string): T | null {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function writeJsonFile(filePath: string, data: unknown): void {\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nexport function getConfig(): HiveConfig {\n const filePath = join(getConfigDir(), \"config.json\");\n return readJsonFile<HiveConfig>(filePath) ?? { ...DEFAULT_CONFIG };\n}\n\nexport function saveConfig(config: HiveConfig): void {\n ensureConfigDir();\n const filePath = join(getConfigDir(), \"config.json\");\n writeJsonFile(filePath, config);\n}\n\nexport function getCredentials(): HiveCredentials {\n const filePath = join(getConfigDir(), \"credentials.json\");\n return (\n readJsonFile<HiveCredentials>(filePath) ?? {\n ...DEFAULT_CREDENTIALS,\n profiles: {},\n }\n );\n}\n\nexport function saveCredentials(creds: HiveCredentials): void {\n ensureConfigDir();\n const filePath = join(getConfigDir(), \"credentials.json\");\n writeJsonFile(filePath, creds);\n}\n\n/** Resolve API key from: CLI flag > env var > active profile */\nexport function resolveApiKey(flagKey?: string): string | undefined {\n if (flagKey) return flagKey;\n if (_flagApiKey) return _flagApiKey;\n if (process.env.HIVE_API_KEY) return process.env.HIVE_API_KEY;\n const config = getConfig();\n const creds = getCredentials();\n return creds.profiles[config.activeProfile]?.apiKey;\n}\n\n/** Resolve API URL from: env var > active profile > default */\nexport function resolveApiUrl(): string {\n if (process.env.HIVE_API_URL) return process.env.HIVE_API_URL;\n const config = getConfig();\n const creds = getCredentials();\n return (\n creds.profiles[config.activeProfile]?.apiUrl ||\n \"https://mcp.hiveintelligence.xyz\"\n );\n}\n"],"mappings":";;;AAAA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AAqBxB,IAAM,iBAA6B;AAAA,EACjC,eAAe;AAAA,EACf,SAAS,CAAC;AAAA,EACV,WAAW;AACb;AAEA,IAAM,sBAAuC,EAAE,UAAU,CAAC,EAAE;AAG5D,IAAI;AACJ,IAAI,eAAe;AAEZ,SAAS,YAAY,MAGnB;AACP,gBAAc,KAAK;AACnB,iBAAe,KAAK,WAAW;AACjC;AAEO,SAAS,aAAsB;AACpC,SAAO;AACT;AAEO,SAAS,eAAuB;AACrC,SAAO,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,GAAG,WAAW,MAAM;AACzE;AAEO,SAAS,kBAAwB;AACtC,QAAM,MAAM,aAAa;AACzB,MAAI,CAAC,WAAW,GAAG,EAAG,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,WAAW,KAAK,KAAK,OAAO;AAClC,MAAI,CAAC,WAAW,QAAQ,EAAG,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACpE;AAEO,SAAS,aAAgB,UAA4B;AAC1D,MAAI;AACF,UAAM,MAAM,aAAa,UAAU,OAAO;AAC1C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,UAAkB,MAAqB;AACnE,gBAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM;AAAA,IAC5D,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,YAAwB;AACtC,QAAM,WAAW,KAAK,aAAa,GAAG,aAAa;AACnD,SAAO,aAAyB,QAAQ,KAAK,EAAE,GAAG,eAAe;AACnE;AAEO,SAAS,WAAW,QAA0B;AACnD,kBAAgB;AAChB,QAAM,WAAW,KAAK,aAAa,GAAG,aAAa;AACnD,gBAAc,UAAU,MAAM;AAChC;AAEO,SAAS,iBAAkC;AAChD,QAAM,WAAW,KAAK,aAAa,GAAG,kBAAkB;AACxD,SACE,aAA8B,QAAQ,KAAK;AAAA,IACzC,GAAG;AAAA,IACH,UAAU,CAAC;AAAA,EACb;AAEJ;AAEO,SAAS,gBAAgB,OAA8B;AAC5D,kBAAgB;AAChB,QAAM,WAAW,KAAK,aAAa,GAAG,kBAAkB;AACxD,gBAAc,UAAU,KAAK;AAC/B;AAGO,SAAS,cAAc,SAAsC;AAClE,MAAI,QAAS,QAAO;AACpB,MAAI,YAAa,QAAO;AACxB,MAAI,QAAQ,IAAI,aAAc,QAAO,QAAQ,IAAI;AACjD,QAAM,SAAS,UAAU;AACzB,QAAM,QAAQ,eAAe;AAC7B,SAAO,MAAM,SAAS,OAAO,aAAa,GAAG;AAC/C;AAGO,SAAS,gBAAwB;AACtC,MAAI,QAAQ,IAAI,aAAc,QAAO,QAAQ,IAAI;AACjD,QAAM,SAAS,UAAU;AACzB,QAAM,QAAQ,eAAe;AAC7B,SACE,MAAM,SAAS,OAAO,aAAa,GAAG,UACtC;AAEJ;","names":[]}
|
|
@@ -187,7 +187,7 @@ async function writeOutput(envelope) {
|
|
|
187
187
|
}
|
|
188
188
|
if (globalOpts.csv && envelope.ok && Array.isArray(envelope.data)) {
|
|
189
189
|
process.stdout.write(
|
|
190
|
-
|
|
190
|
+
formatCsv(envelope.data) + "\n"
|
|
191
191
|
);
|
|
192
192
|
return;
|
|
193
193
|
}
|
|
@@ -206,7 +206,7 @@ async function writeOutput(envelope) {
|
|
|
206
206
|
}
|
|
207
207
|
if (envelope.ok && envelope.data != null) {
|
|
208
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-
|
|
209
|
+
const { formatTable } = await import("./format-TSFSI2K7.js");
|
|
210
210
|
process.stdout.write(
|
|
211
211
|
formatTable(envelope.data) + "\n"
|
|
212
212
|
);
|
|
@@ -246,12 +246,11 @@ function debug(msg) {
|
|
|
246
246
|
function isCI() {
|
|
247
247
|
return !!(process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.JENKINS_URL || process.env.HIVE_CI);
|
|
248
248
|
}
|
|
249
|
-
|
|
249
|
+
function formatCsv(data) {
|
|
250
250
|
if (data.length === 0) return "";
|
|
251
|
-
const { formatCell } = await import("./format-CVLLK6GD.js");
|
|
252
251
|
const keys = [...new Set(data.flatMap((row) => Object.keys(row)))];
|
|
253
252
|
const escape = (val) => {
|
|
254
|
-
const str =
|
|
253
|
+
const str = val == null ? "" : String(val);
|
|
255
254
|
return str.includes(",") || str.includes('"') || str.includes("\n") ? `"${str.replace(/"/g, '""')}"` : str;
|
|
256
255
|
};
|
|
257
256
|
const header = keys.join(",");
|
|
@@ -278,4 +277,4 @@ export {
|
|
|
278
277
|
isCI,
|
|
279
278
|
formatCsv
|
|
280
279
|
};
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
280
|
+
//# sourceMappingURL=chunk-XYBEFFZ3.js.map
|