hive-intelligence 1.1.0 → 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.
Files changed (163) hide show
  1. package/README.md +243 -166
  2. package/agent-skills/.claude-plugin/plugin.json +105 -0
  3. package/{LICENSE → agent-skills/LICENSE} +1 -1
  4. package/agent-skills/README.md +146 -0
  5. package/agent-skills/SKILL.md +68 -0
  6. package/agent-skills/evals/README.md +20 -0
  7. package/agent-skills/evals/trigger-queries.json +194 -0
  8. package/agent-skills/package.json +49 -0
  9. package/agent-skills/packs/hive-build/SKILL.md +327 -0
  10. package/agent-skills/packs/hive-build/evals/evals.json +28 -0
  11. package/agent-skills/packs/hive-build-onboarding/SKILL.md +137 -0
  12. package/agent-skills/packs/hive-build-onboarding/evals/evals.json +27 -0
  13. package/agent-skills/packs/hive-cli/SKILL.md +141 -0
  14. package/agent-skills/packs/hive-cli/evals/evals.json +27 -0
  15. package/agent-skills/packs/hive-defi-research/SKILL.md +42 -0
  16. package/agent-skills/packs/hive-defi-research/evals/evals.json +27 -0
  17. package/agent-skills/packs/hive-defi-research/references/workflow.md +41 -0
  18. package/agent-skills/packs/hive-dex-pool-analysis/SKILL.md +41 -0
  19. package/agent-skills/packs/hive-dex-pool-analysis/evals/evals.json +27 -0
  20. package/agent-skills/packs/hive-dex-pool-analysis/references/workflow.md +42 -0
  21. package/agent-skills/packs/hive-market-research/SKILL.md +45 -0
  22. package/agent-skills/packs/hive-market-research/evals/evals.json +27 -0
  23. package/agent-skills/packs/hive-market-research/references/workflow.md +47 -0
  24. package/agent-skills/packs/hive-mcp/SKILL.md +224 -0
  25. package/agent-skills/packs/hive-mcp/evals/evals.json +38 -0
  26. package/agent-skills/packs/hive-mcp/references/client-install-matrix.md +83 -0
  27. package/agent-skills/packs/hive-network-infrastructure/SKILL.md +44 -0
  28. package/agent-skills/packs/hive-network-infrastructure/evals/evals.json +27 -0
  29. package/agent-skills/packs/hive-network-infrastructure/references/workflow.md +41 -0
  30. package/agent-skills/packs/hive-nft-research/SKILL.md +41 -0
  31. package/agent-skills/packs/hive-nft-research/evals/evals.json +27 -0
  32. package/agent-skills/packs/hive-nft-research/references/workflow.md +42 -0
  33. package/agent-skills/packs/hive-prediction-markets/SKILL.md +44 -0
  34. package/agent-skills/packs/hive-prediction-markets/evals/evals.json +27 -0
  35. package/agent-skills/packs/hive-prediction-markets/references/workflow.md +42 -0
  36. package/agent-skills/packs/hive-query/SKILL.md +98 -0
  37. package/agent-skills/packs/hive-query/evals/evals.json +38 -0
  38. package/agent-skills/packs/hive-query/references/root-mcp-workflow.md +54 -0
  39. package/agent-skills/packs/hive-security-risk/SKILL.md +42 -0
  40. package/agent-skills/packs/hive-security-risk/evals/evals.json +27 -0
  41. package/agent-skills/packs/hive-security-risk/references/workflow.md +46 -0
  42. package/agent-skills/packs/hive-solana-analysis/SKILL.md +42 -0
  43. package/agent-skills/packs/hive-solana-analysis/evals/evals.json +27 -0
  44. package/agent-skills/packs/hive-solana-analysis/references/workflow.md +42 -0
  45. package/agent-skills/packs/hive-token-diligence/SKILL.md +44 -0
  46. package/agent-skills/packs/hive-token-diligence/evals/evals.json +27 -0
  47. package/agent-skills/packs/hive-token-diligence/references/workflow.md +45 -0
  48. package/agent-skills/packs/hive-tool-discovery/SKILL.md +49 -0
  49. package/agent-skills/packs/hive-tool-discovery/evals/evals.json +38 -0
  50. package/agent-skills/packs/hive-tool-discovery/references/discovery-surfaces.md +62 -0
  51. package/agent-skills/packs/hive-wallet-investigation/SKILL.md +42 -0
  52. package/agent-skills/packs/hive-wallet-investigation/evals/evals.json +27 -0
  53. package/agent-skills/packs/hive-wallet-investigation/references/workflow.md +45 -0
  54. package/agent-skills/references/agents-routing.md +49 -0
  55. package/agent-skills/scripts/validate-agent-skills-package.mjs +178 -0
  56. package/agent-skills/skills.sh.json +40 -0
  57. package/bin/hive-mcp.js +33 -0
  58. package/build/{alias-INGXWFCG.js → alias-CZ3DEYHF.js} +3 -3
  59. package/build/api-client-I23XLSHU.js +28 -0
  60. package/build/auth-KKINNBXT.js +40 -0
  61. package/build/browser-auth-EEFGRHWY.js +9 -0
  62. package/build/{cache-US4LSZPI.js → cache-EGNMENNA.js} +3 -3
  63. package/build/chunk-2MYMHMBF.js +340 -0
  64. package/build/chunk-2MYMHMBF.js.map +1 -0
  65. package/build/chunk-2X3U4DFK.js +77369 -0
  66. package/build/chunk-2X3U4DFK.js.map +1 -0
  67. package/build/chunk-B6G222LS.js +265 -0
  68. package/build/chunk-B6G222LS.js.map +1 -0
  69. package/build/{chunk-WKVZVQTG.js → chunk-DYJBTKNR.js} +4 -4
  70. package/build/chunk-DYJBTKNR.js.map +1 -0
  71. package/build/chunk-IDZD2NVG.js +247 -0
  72. package/build/chunk-IDZD2NVG.js.map +1 -0
  73. package/build/chunk-IZTN7WFH.js +250 -0
  74. package/build/chunk-IZTN7WFH.js.map +1 -0
  75. package/build/{chunk-QMRVH5ZP.js → chunk-KBVPIZS4.js} +10 -2
  76. package/build/chunk-KGYBTXIN.js +86 -0
  77. package/build/chunk-KGYBTXIN.js.map +1 -0
  78. package/build/{chunk-X7ETBCBP.js → chunk-MPIUUE3T.js} +60 -272
  79. package/build/chunk-MPIUUE3T.js.map +1 -0
  80. package/build/chunk-PGBVNMNZ.js +127 -0
  81. package/build/chunk-PGBVNMNZ.js.map +1 -0
  82. package/build/chunk-QNCI4DEB.js +88 -0
  83. package/build/chunk-QNCI4DEB.js.map +1 -0
  84. package/build/chunk-RKICZ6DZ.js +497 -0
  85. package/build/chunk-RKICZ6DZ.js.map +1 -0
  86. package/build/chunk-UKHZIVDT.js +44 -0
  87. package/build/chunk-UKHZIVDT.js.map +1 -0
  88. package/build/{chunk-XQJ6PB2L.js → chunk-V77LO4RO.js} +1 -1
  89. package/build/chunk-V77LO4RO.js.map +1 -0
  90. package/build/{chunk-CP3FXEQA.js → chunk-XYBEFFZ3.js} +5 -6
  91. package/build/chunk-XYBEFFZ3.js.map +1 -0
  92. package/build/cli.js +134 -122
  93. package/build/cli.js.map +1 -1
  94. package/build/{completion-SBTSXTR3.js → completion-BELZL7ND.js} +55 -50
  95. package/build/completion-BELZL7ND.js.map +1 -0
  96. package/build/config-TDX4VUGW.js +58 -0
  97. package/build/{config-dir-IEOID7Q6.js → config-dir-V43W2WIA.js} +3 -3
  98. package/build/{doctor-7WZMCQC7.js → doctor-5K5UWHNX.js} +13 -13
  99. package/build/doctor-5K5UWHNX.js.map +1 -0
  100. package/build/{errors-U6UZWVSD.js → errors-E6MVUBNA.js} +3 -3
  101. package/build/format-TSFSI2K7.js +43 -0
  102. package/build/format-TSFSI2K7.js.map +1 -0
  103. package/build/{init-CAVIFVSH.js → init-YQ5NBICF.js} +2 -2
  104. package/build/init-all-6OWEQALB.js +274 -0
  105. package/build/init-all-6OWEQALB.js.map +1 -0
  106. package/build/mcpServer-AEX3RQ4U.js +20 -0
  107. package/build/mcpServer-AEX3RQ4U.js.map +1 -0
  108. package/build/{namespace-7SBV4G7R.js → namespace-PVHBFDW2.js} +3 -3
  109. package/build/namespace-PVHBFDW2.js.map +1 -0
  110. package/build/{open-FUXYIHFO.js → open-YUIJP37F.js} +6 -6
  111. package/build/open-YUIJP37F.js.map +1 -0
  112. package/build/{output-7PGQWJY2.js → output-IYJBFCYK.js} +3 -3
  113. package/build/output-IYJBFCYK.js.map +1 -0
  114. package/build/serve-KWNJK6EY.js +44 -0
  115. package/build/serve-KWNJK6EY.js.map +1 -0
  116. package/build/server.js +4749 -14332
  117. package/build/server.js.map +1 -1
  118. package/build/setup-YTUKMPNP.js +136 -0
  119. package/build/setup-YTUKMPNP.js.map +1 -0
  120. package/build/stdio.js +31 -0
  121. package/build/stdio.js.map +1 -0
  122. package/build/{telemetry-KNWMQURH.js → telemetry-5IPRKZBL.js} +4 -4
  123. package/build/telemetry-5IPRKZBL.js.map +1 -0
  124. package/build/{tools-XEGCLA4I.js → tools-PJHWFCAG.js} +15 -15
  125. package/build/uninstall-HWXEIP6K.js +115 -0
  126. package/build/uninstall-HWXEIP6K.js.map +1 -0
  127. package/build/{watch-A75SVIQ6.js → watch-KZ5EDZK3.js} +7 -7
  128. package/package.json +124 -24
  129. package/bin/hive.js +0 -25
  130. package/build/auth-77MKFFBQ.js +0 -233
  131. package/build/auth-77MKFFBQ.js.map +0 -1
  132. package/build/chunk-CP3FXEQA.js.map +0 -1
  133. package/build/chunk-DTUDM6HX.js +0 -3108
  134. package/build/chunk-DTUDM6HX.js.map +0 -1
  135. package/build/chunk-LBTLYTZS.js +0 -115
  136. package/build/chunk-LBTLYTZS.js.map +0 -1
  137. package/build/chunk-OK3LSM73.js +0 -22
  138. package/build/chunk-OK3LSM73.js.map +0 -1
  139. package/build/chunk-RRI526CJ.js +0 -212
  140. package/build/chunk-RRI526CJ.js.map +0 -1
  141. package/build/chunk-WKVZVQTG.js.map +0 -1
  142. package/build/chunk-X7ETBCBP.js.map +0 -1
  143. package/build/chunk-XQJ6PB2L.js.map +0 -1
  144. package/build/completion-SBTSXTR3.js.map +0 -1
  145. package/build/config-2VDB2ZHE.js +0 -100
  146. package/build/config-2VDB2ZHE.js.map +0 -1
  147. package/build/doctor-7WZMCQC7.js.map +0 -1
  148. package/build/format-CVLLK6GD.js +0 -75
  149. package/build/format-CVLLK6GD.js.map +0 -1
  150. package/build/open-FUXYIHFO.js.map +0 -1
  151. package/build/version-3TZ3U4IR.js +0 -9
  152. /package/build/{alias-INGXWFCG.js.map → alias-CZ3DEYHF.js.map} +0 -0
  153. /package/build/{chunk-QMRVH5ZP.js.map → api-client-I23XLSHU.js.map} +0 -0
  154. /package/build/{config-dir-IEOID7Q6.js.map → auth-KKINNBXT.js.map} +0 -0
  155. /package/build/{errors-U6UZWVSD.js.map → browser-auth-EEFGRHWY.js.map} +0 -0
  156. /package/build/{cache-US4LSZPI.js.map → cache-EGNMENNA.js.map} +0 -0
  157. /package/build/{namespace-7SBV4G7R.js.map → chunk-KBVPIZS4.js.map} +0 -0
  158. /package/build/{output-7PGQWJY2.js.map → config-TDX4VUGW.js.map} +0 -0
  159. /package/build/{telemetry-KNWMQURH.js.map → config-dir-V43W2WIA.js.map} +0 -0
  160. /package/build/{version-3TZ3U4IR.js.map → errors-E6MVUBNA.js.map} +0 -0
  161. /package/build/{init-CAVIFVSH.js.map → init-YQ5NBICF.js.map} +0 -0
  162. /package/build/{tools-XEGCLA4I.js.map → tools-PJHWFCAG.js.map} +0 -0
  163. /package/build/{watch-A75SVIQ6.js.map → watch-KZ5EDZK3.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/browser-auth.ts"],"sourcesContent":["import { createServer } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { platform } from \"node:os\";\n\ninterface AuthResult {\n key: string;\n email: string;\n state: string;\n}\n\n/** Open a URL in the default browser using execFile (no shell injection risk) */\nfunction openBrowser(url: string): void {\n const plat = platform();\n let cmd: string;\n let args: string[];\n\n if (plat === \"darwin\") {\n cmd = \"open\";\n args = [url];\n } else if (plat === \"win32\") {\n cmd = \"cmd\";\n args = [\"/c\", \"start\", \"\", url];\n } else {\n cmd = \"xdg-open\";\n args = [url];\n }\n\n execFile(cmd, args, (err) => {\n if (err) process.stderr.write(`\\nOpen this URL manually:\\n ${url}\\n\\n`);\n });\n}\n\n/** Start a temporary local HTTP server and wait for the auth callback */\nexport async function browserLogin(opts: {\n baseUrl?: string;\n timeout?: number;\n}): Promise<AuthResult> {\n const baseUrl = opts.baseUrl || \"https://hiveintelligence.xyz\";\n const timeout = opts.timeout || 300_000; // 5 minutes\n const state = randomBytes(16).toString(\"hex\");\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const server = createServer((req, res) => {\n const url = new URL(req.url || \"/\", `http://localhost`);\n\n if (url.pathname !== \"/callback\") {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n // Ignore duplicate requests (favicon probes, browser retries)\n if (settled) {\n res.writeHead(200);\n res.end();\n return;\n }\n\n const key = url.searchParams.get(\"key\");\n const email = url.searchParams.get(\"email\");\n const returnedState = url.searchParams.get(\"state\");\n\n if (returnedState !== state) {\n res.writeHead(403);\n res.end(\"State mismatch — possible CSRF attack. Please try again.\");\n return;\n }\n\n if (!key) {\n res.writeHead(400);\n res.end(\"Missing API key in callback\");\n return;\n }\n\n settled = true;\n\n // Send a success HTML page the user can close\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`<!DOCTYPE html>\n<html>\n<head><title>Hive CLI — Authenticated</title>\n<style>\n body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #0a0a0a; color: #fafafa; }\n .card { text-align: center; padding: 2rem; }\n h1 { font-size: 1.5rem; margin-bottom: 0.5rem; }\n p { color: #888; }\n</style>\n</head>\n<body>\n <div class=\"card\">\n <h1>Authenticated</h1>\n <p>You can close this tab and return to the terminal.</p>\n </div>\n</body>\n</html>`);\n\n clearTimeout(timer);\n server.close();\n resolve({ key, email: email || \"\", state: returnedState });\n });\n\n // Listen on a random available port\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start local server\"));\n return;\n }\n const port = addr.port;\n const loginUrl = new URL(\"/auth/cli\", baseUrl);\n loginUrl.searchParams.set(\"callback_port\", String(port));\n loginUrl.searchParams.set(\"state\", state);\n\n process.stderr.write(`\\nOpening browser to sign in...\\n`);\n process.stderr.write(\n `If the browser doesn't open, visit:\\n ${loginUrl.toString()}\\n\\n`,\n );\n openBrowser(loginUrl.toString());\n });\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n server.close();\n reject(\n new Error(\n \"Login timed out after 5 minutes. Run: hive auth login --manual\",\n ),\n );\n }, timeout);\n\n server.on(\"error\", (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(err);\n });\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,88 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ SERVER_VERSION
4
+ } from "./chunk-2X3U4DFK.js";
5
+ import {
6
+ ensureConfigDir,
7
+ getConfigDir,
8
+ readJsonFile,
9
+ writeJsonFile
10
+ } from "./chunk-V77LO4RO.js";
11
+
12
+ // src/cli/update-check.ts
13
+ import { join } from "path";
14
+ var CACHE_TTL_MS = 864e5;
15
+ var REGISTRY_PACKAGE = "hive-intelligence";
16
+ function getCachePath() {
17
+ return join(getConfigDir(), "cache", "update-check.json");
18
+ }
19
+ async function checkForUpdates() {
20
+ if (shouldSkipUpdateCheck(process.argv, process.env)) {
21
+ return;
22
+ }
23
+ const cached = readJsonFile(getCachePath());
24
+ if (cached?.checkedAt) {
25
+ const age = Date.now() - new Date(cached.checkedAt).getTime();
26
+ if (age < CACHE_TTL_MS) {
27
+ if (cached.latestVersion && isNewerVersion(cached.latestVersion, SERVER_VERSION)) {
28
+ showUpdateMessage(cached.latestVersion);
29
+ }
30
+ return;
31
+ }
32
+ }
33
+ try {
34
+ const controller = new AbortController();
35
+ const timeout = setTimeout(() => controller.abort(), 3e3);
36
+ const res = await fetch(
37
+ `https://registry.npmjs.org/${REGISTRY_PACKAGE}/latest`,
38
+ {
39
+ signal: controller.signal
40
+ }
41
+ );
42
+ clearTimeout(timeout);
43
+ if (!res.ok) return;
44
+ const data = await res.json();
45
+ ensureConfigDir();
46
+ writeJsonFile(getCachePath(), {
47
+ checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
48
+ latestVersion: data.version ?? null
49
+ });
50
+ if (!data.version || !isNewerVersion(data.version, SERVER_VERSION)) return;
51
+ showUpdateMessage(data.version);
52
+ } catch {
53
+ }
54
+ }
55
+ function shouldSkipUpdateCheck(argv = process.argv, env = process.env) {
56
+ if (env.CI || env.HIVE_NO_UPDATE_CHECK) return true;
57
+ if (env.NODE_ENV === "test" || env.VITEST || env.VITEST_WORKER_ID) {
58
+ return true;
59
+ }
60
+ return argv.some(
61
+ (arg) => ["--help", "-h", "--version", "-V"].includes(arg)
62
+ );
63
+ }
64
+ function isNewerVersion(candidate, current) {
65
+ const parse = (version) => version.replace(/^[^\d]*/, "").split(/[.-]/).slice(0, 3).map((part) => Number.parseInt(part, 10) || 0);
66
+ const a = parse(candidate);
67
+ const b = parse(current);
68
+ for (let i = 0; i < 3; i++) {
69
+ if (a[i] > b[i]) return true;
70
+ if (a[i] < b[i]) return false;
71
+ }
72
+ return false;
73
+ }
74
+ function showUpdateMessage(newVersion) {
75
+ process.stderr.write(
76
+ `
77
+ Update available: ${SERVER_VERSION} \u2192 ${newVersion}
78
+ npm: npm update -g hive-intelligence
79
+ npx: npx -y -p hive-intelligence@latest hive
80
+
81
+ `
82
+ );
83
+ }
84
+
85
+ export {
86
+ checkForUpdates
87
+ };
88
+ //# sourceMappingURL=chunk-QNCI4DEB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/update-check.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { SERVER_VERSION } from \"../mcpServer.js\";\nimport {\n getConfigDir,\n ensureConfigDir,\n readJsonFile,\n writeJsonFile,\n} from \"./config-dir.js\";\n\nconst CACHE_TTL_MS = 86_400_000; // 24 hours\nconst REGISTRY_PACKAGE = \"hive-intelligence\";\n\ninterface UpdateCache {\n checkedAt: string;\n latestVersion: string | null;\n}\n\nfunction getCachePath(): string {\n return join(getConfigDir(), \"cache\", \"update-check.json\");\n}\n\nexport async function checkForUpdates(): Promise<void> {\n if (shouldSkipUpdateCheck(process.argv, process.env)) {\n return;\n }\n\n const cached = readJsonFile<UpdateCache>(getCachePath());\n if (cached?.checkedAt) {\n const age = Date.now() - new Date(cached.checkedAt).getTime();\n if (age < CACHE_TTL_MS) {\n if (\n cached.latestVersion &&\n isNewerVersion(cached.latestVersion, SERVER_VERSION)\n ) {\n showUpdateMessage(cached.latestVersion);\n }\n return;\n }\n }\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n\n const res = await fetch(\n `https://registry.npmjs.org/${REGISTRY_PACKAGE}/latest`,\n {\n signal: controller.signal,\n },\n );\n clearTimeout(timeout);\n\n if (!res.ok) return;\n const data = (await res.json()) as { version?: string };\n\n ensureConfigDir();\n writeJsonFile(getCachePath(), {\n checkedAt: new Date().toISOString(),\n latestVersion: data.version ?? null,\n });\n\n if (!data.version || !isNewerVersion(data.version, SERVER_VERSION)) return;\n showUpdateMessage(data.version);\n } catch {\n // Silently ignore — never block CLI on update check failures\n }\n}\n\nexport function shouldSkipUpdateCheck(\n argv: readonly string[] = process.argv,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n if (env.CI || env.HIVE_NO_UPDATE_CHECK) return true;\n if (env.NODE_ENV === \"test\" || env.VITEST || env.VITEST_WORKER_ID) {\n return true;\n }\n\n return argv.some((arg) =>\n [\"--help\", \"-h\", \"--version\", \"-V\"].includes(arg),\n );\n}\n\nexport function isNewerVersion(candidate: string, current: string): boolean {\n const parse = (version: string) =>\n version\n .replace(/^[^\\d]*/, \"\")\n .split(/[.-]/)\n .slice(0, 3)\n .map((part) => Number.parseInt(part, 10) || 0);\n\n const a = parse(candidate);\n const b = parse(current);\n for (let i = 0; i < 3; i++) {\n if (a[i] > b[i]) return true;\n if (a[i] < b[i]) return false;\n }\n return false;\n}\n\nfunction showUpdateMessage(newVersion: string): void {\n process.stderr.write(\n `\\nUpdate available: ${SERVER_VERSION} → ${newVersion}\\n` +\n ` npm: npm update -g hive-intelligence\\n` +\n ` npx: npx -y -p hive-intelligence@latest hive\\n\\n`,\n );\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,YAAY;AASrB,IAAM,eAAe;AACrB,IAAM,mBAAmB;AAOzB,SAAS,eAAuB;AAC9B,SAAO,KAAK,aAAa,GAAG,SAAS,mBAAmB;AAC1D;AAEA,eAAsB,kBAAiC;AACrD,MAAI,sBAAsB,QAAQ,MAAM,QAAQ,GAAG,GAAG;AACpD;AAAA,EACF;AAEA,QAAM,SAAS,aAA0B,aAAa,CAAC;AACvD,MAAI,QAAQ,WAAW;AACrB,UAAM,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,SAAS,EAAE,QAAQ;AAC5D,QAAI,MAAM,cAAc;AACtB,UACE,OAAO,iBACP,eAAe,OAAO,eAAe,cAAc,GACnD;AACA,0BAAkB,OAAO,aAAa;AAAA,MACxC;AACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEzD,UAAM,MAAM,MAAM;AAAA,MAChB,8BAA8B,gBAAgB;AAAA,MAC9C;AAAA,QACE,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AACA,iBAAa,OAAO;AAEpB,QAAI,CAAC,IAAI,GAAI;AACb,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,oBAAgB;AAChB,kBAAc,aAAa,GAAG;AAAA,MAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,eAAe,KAAK,WAAW;AAAA,IACjC,CAAC;AAED,QAAI,CAAC,KAAK,WAAW,CAAC,eAAe,KAAK,SAAS,cAAc,EAAG;AACpE,sBAAkB,KAAK,OAAO;AAAA,EAChC,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,sBACd,OAA0B,QAAQ,MAClC,MAAyB,QAAQ,KACxB;AACT,MAAI,IAAI,MAAM,IAAI,qBAAsB,QAAO;AAC/C,MAAI,IAAI,aAAa,UAAU,IAAI,UAAU,IAAI,kBAAkB;AACjE,WAAO;AAAA,EACT;AAEA,SAAO,KAAK;AAAA,IAAK,CAAC,QAChB,CAAC,UAAU,MAAM,aAAa,IAAI,EAAE,SAAS,GAAG;AAAA,EAClD;AACF;AAEO,SAAS,eAAe,WAAmB,SAA0B;AAC1E,QAAM,QAAQ,CAAC,YACb,QACG,QAAQ,WAAW,EAAE,EACrB,MAAM,MAAM,EACZ,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,KAAK,CAAC;AAEjD,QAAM,IAAI,MAAM,SAAS;AACzB,QAAM,IAAI,MAAM,OAAO;AACvB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAG,QAAO;AACxB,QAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAG,QAAO;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,YAA0B;AACnD,UAAQ,OAAO;AAAA,IACb;AAAA,oBAAuB,cAAc,WAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAGvD;AACF;","names":[]}
@@ -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":[]}