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,250 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ getNoRetry,
4
+ resolveApiKey,
5
+ resolveApiUrl
6
+ } from "./chunk-V77LO4RO.js";
7
+
8
+ // src/cli/api-client.ts
9
+ var MAX_RETRIES = 3;
10
+ var BASE_DELAY_MS = 500;
11
+ var MAX_DELAY_MS = 5e3;
12
+ var TOOL_CATALOG_PAGE_LIMIT = 250;
13
+ var TOOL_CATALOG_MAX_PAGES = 100;
14
+ function isRetryable(status) {
15
+ return status >= 500 || status === 429;
16
+ }
17
+ function isRetryableError(err) {
18
+ if (!(err instanceof Error)) return false;
19
+ const msg = err.message.toLowerCase();
20
+ return err.name === "AbortError" || msg.includes("econnreset") || msg.includes("econnrefused") || msg.includes("etimedout") || msg.includes("fetch failed");
21
+ }
22
+ function delay(ms) {
23
+ return new Promise((resolve) => setTimeout(resolve, ms));
24
+ }
25
+ function computeDelay(attempt, retryAfterHeader) {
26
+ if (retryAfterHeader) {
27
+ const seconds = parseInt(retryAfterHeader, 10);
28
+ if (!isNaN(seconds) && seconds > 0)
29
+ return Math.min(seconds * 1e3, MAX_DELAY_MS);
30
+ }
31
+ const exponential = BASE_DELAY_MS * Math.pow(2, attempt);
32
+ const jitter = exponential * (0.75 + Math.random() * 0.5);
33
+ return Math.min(jitter, MAX_DELAY_MS);
34
+ }
35
+ async function fetchWithRetry(url, init, fetchFn = fetch) {
36
+ const maxRetries = getNoRetry() ? 0 : MAX_RETRIES;
37
+ let lastResponse;
38
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
39
+ try {
40
+ const response = await fetchFn(url, init);
41
+ if (response.ok || !isRetryable(response.status) || attempt === maxRetries) {
42
+ return response;
43
+ }
44
+ lastResponse = response;
45
+ const retryAfter = response.headers?.get?.("retry-after") ?? null;
46
+ const waitMs = computeDelay(attempt, retryAfter);
47
+ await delay(waitMs);
48
+ } catch (err) {
49
+ if (!isRetryableError(err) || attempt === maxRetries) throw err;
50
+ const waitMs = computeDelay(attempt);
51
+ await delay(waitMs);
52
+ }
53
+ }
54
+ return lastResponse;
55
+ }
56
+ function getHeaders(apiKey) {
57
+ const headers = {
58
+ "Content-Type": "application/json",
59
+ "User-Agent": `hive-cli/${process.env.npm_package_version ?? "1.1.3"}`
60
+ };
61
+ if (apiKey) headers.Authorization = `Bearer ${apiKey}`;
62
+ return headers;
63
+ }
64
+ function buildApiUrl(path, query = {}) {
65
+ const base = resolveApiUrl().replace(/\/+$/, "");
66
+ const url = new URL(`${base}${path}`);
67
+ for (const [key, value] of Object.entries(query)) {
68
+ if (value !== void 0) {
69
+ url.searchParams.set(key, String(value));
70
+ }
71
+ }
72
+ return url.toString();
73
+ }
74
+ async function executeRemoteTool(toolName, args, timeoutMs = 3e4) {
75
+ const url = buildApiUrl("/api/v1/execute");
76
+ const apiKey = resolveApiKey();
77
+ const controller = new AbortController();
78
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
79
+ try {
80
+ const response = await fetchWithRetry(url, {
81
+ method: "POST",
82
+ headers: getHeaders(apiKey),
83
+ body: JSON.stringify({ tool: toolName, args }),
84
+ signal: controller.signal
85
+ });
86
+ const data = await response.json();
87
+ return data;
88
+ } catch (error) {
89
+ if (error instanceof Error && error.name === "AbortError") {
90
+ return {
91
+ ok: false,
92
+ error: {
93
+ code: "TIMEOUT",
94
+ message: `Request timed out after ${timeoutMs}ms`,
95
+ suggestion: "Increase with --timeout <ms>"
96
+ },
97
+ meta: { tool: toolName }
98
+ };
99
+ }
100
+ const msg = error instanceof Error ? error.message : String(error);
101
+ return {
102
+ ok: false,
103
+ error: {
104
+ code: "API_ERROR",
105
+ message: `Connection failed: ${msg}`,
106
+ suggestion: `Check HIVE_API_URL (${resolveApiUrl()})`
107
+ },
108
+ meta: { tool: toolName }
109
+ };
110
+ } finally {
111
+ clearTimeout(timer);
112
+ }
113
+ }
114
+ async function fetchToolCatalog() {
115
+ const apiKey = resolveApiKey();
116
+ const tools = [];
117
+ let cursor;
118
+ let lastPage = null;
119
+ for (let page = 0; page < TOOL_CATALOG_MAX_PAGES; page++) {
120
+ const response = await fetchWithRetry(
121
+ buildApiUrl("/api/v1/tools", {
122
+ limit: TOOL_CATALOG_PAGE_LIMIT,
123
+ cursor
124
+ }),
125
+ {
126
+ headers: getHeaders(apiKey)
127
+ }
128
+ );
129
+ const parsed = await response.json();
130
+ lastPage = parsed;
131
+ if (!parsed.ok) return parsed;
132
+ if (!Array.isArray(parsed.data)) {
133
+ return parsed;
134
+ }
135
+ tools.push(...parsed.data);
136
+ if (!parsed.has_more) {
137
+ return {
138
+ ...parsed,
139
+ data: tools,
140
+ has_more: false,
141
+ next_cursor: void 0,
142
+ meta: {
143
+ ...parsed.meta,
144
+ returned: tools.length,
145
+ pages: page + 1
146
+ }
147
+ };
148
+ }
149
+ if (!parsed.next_cursor) {
150
+ return {
151
+ ok: false,
152
+ error: {
153
+ code: "CATALOG_PAGINATION_ERROR",
154
+ message: "Tool catalog page reported more results but did not include next_cursor.",
155
+ suggestion: "Run hive doctor or retry with --no-cache."
156
+ },
157
+ meta: { returned: tools.length, pages: page + 1 }
158
+ };
159
+ }
160
+ cursor = parsed.next_cursor;
161
+ }
162
+ return {
163
+ ok: false,
164
+ error: {
165
+ code: "CATALOG_PAGINATION_ERROR",
166
+ message: `Tool catalog pagination did not finish after ${TOOL_CATALOG_MAX_PAGES} pages.`,
167
+ suggestion: "Run hive doctor or contact support if this persists."
168
+ },
169
+ meta: {
170
+ returned: tools.length,
171
+ pages: TOOL_CATALOG_MAX_PAGES,
172
+ last_cursor: cursor,
173
+ last_page_returned: lastPage?.meta?.returned
174
+ }
175
+ };
176
+ }
177
+ async function authSignup(email, password) {
178
+ const url = buildApiUrl("/auth/signup");
179
+ const response = await fetchWithRetry(url, {
180
+ method: "POST",
181
+ headers: { "Content-Type": "application/json" },
182
+ body: JSON.stringify({ email, password })
183
+ });
184
+ return response.json();
185
+ }
186
+ async function authLogin(email, password) {
187
+ const url = buildApiUrl("/auth/login");
188
+ const response = await fetchWithRetry(url, {
189
+ method: "POST",
190
+ headers: { "Content-Type": "application/json" },
191
+ body: JSON.stringify({ email, password })
192
+ });
193
+ return response.json();
194
+ }
195
+ async function authMe(jwt) {
196
+ const url = buildApiUrl("/auth/me");
197
+ const response = await fetchWithRetry(url, {
198
+ headers: { Authorization: `Bearer ${jwt}` }
199
+ });
200
+ return response.json();
201
+ }
202
+ async function createKey(jwt, name) {
203
+ const url = buildApiUrl("/api/v1/keys");
204
+ const response = await fetchWithRetry(url, {
205
+ method: "POST",
206
+ headers: {
207
+ "Content-Type": "application/json",
208
+ Authorization: `Bearer ${jwt}`
209
+ },
210
+ body: JSON.stringify({ name })
211
+ });
212
+ return response.json();
213
+ }
214
+ async function listKeysApi(jwt) {
215
+ const url = buildApiUrl("/api/v1/keys");
216
+ const response = await fetchWithRetry(url, {
217
+ headers: { Authorization: `Bearer ${jwt}` }
218
+ });
219
+ return response.json();
220
+ }
221
+ async function revokeKeyApi(jwt, keyId) {
222
+ const url = buildApiUrl(`/api/v1/keys/${keyId}`);
223
+ const response = await fetchWithRetry(url, {
224
+ method: "DELETE",
225
+ headers: { Authorization: `Bearer ${jwt}` }
226
+ });
227
+ return response.json();
228
+ }
229
+ async function getUsage() {
230
+ const url = buildApiUrl("/api/v1/usage");
231
+ const apiKey = resolveApiKey();
232
+ const response = await fetchWithRetry(url, {
233
+ headers: getHeaders(apiKey)
234
+ });
235
+ return response.json();
236
+ }
237
+
238
+ export {
239
+ fetchWithRetry,
240
+ executeRemoteTool,
241
+ fetchToolCatalog,
242
+ authSignup,
243
+ authLogin,
244
+ authMe,
245
+ createKey,
246
+ listKeysApi,
247
+ revokeKeyApi,
248
+ getUsage
249
+ };
250
+ //# sourceMappingURL=chunk-IZTN7WFH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/api-client.ts"],"sourcesContent":["import { resolveApiKey, resolveApiUrl, getNoRetry } from \"./config-dir.js\";\n\ninterface ApiResponse {\n ok: boolean;\n data?: unknown;\n error?: { code: string; message: string; suggestion?: string };\n has_more?: boolean;\n next_cursor?: string;\n meta: { tool?: string; duration_ms?: number; [key: string]: unknown };\n}\n\nconst MAX_RETRIES = 3;\nconst BASE_DELAY_MS = 500;\nconst MAX_DELAY_MS = 5000;\nconst TOOL_CATALOG_PAGE_LIMIT = 250;\nconst TOOL_CATALOG_MAX_PAGES = 100;\n\ntype FetchFn = (url: string, init: RequestInit) => Promise<Response>;\n\nfunction isRetryable(status: number): boolean {\n return status >= 500 || status === 429;\n}\n\nfunction isRetryableError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n err.name === \"AbortError\" ||\n msg.includes(\"econnreset\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"etimedout\") ||\n msg.includes(\"fetch failed\")\n );\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction computeDelay(\n attempt: number,\n retryAfterHeader?: string | null,\n): number {\n if (retryAfterHeader) {\n const seconds = parseInt(retryAfterHeader, 10);\n if (!isNaN(seconds) && seconds > 0)\n return Math.min(seconds * 1000, MAX_DELAY_MS);\n }\n const exponential = BASE_DELAY_MS * Math.pow(2, attempt);\n const jitter = exponential * (0.75 + Math.random() * 0.5);\n return Math.min(jitter, MAX_DELAY_MS);\n}\n\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n fetchFn: FetchFn = fetch,\n): Promise<Response> {\n const maxRetries = getNoRetry() ? 0 : MAX_RETRIES;\n let lastResponse: Response | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetchFn(url, init);\n if (\n response.ok ||\n !isRetryable(response.status) ||\n attempt === maxRetries\n ) {\n return response;\n }\n lastResponse = response;\n const retryAfter = response.headers?.get?.(\"retry-after\") ?? null;\n const waitMs = computeDelay(attempt, retryAfter);\n await delay(waitMs);\n } catch (err) {\n if (!isRetryableError(err) || attempt === maxRetries) throw err;\n const waitMs = computeDelay(attempt);\n await delay(waitMs);\n }\n }\n\n return lastResponse!;\n}\n\nfunction getHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `hive-cli/${process.env.npm_package_version ?? \"1.1.3\"}`,\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n return headers;\n}\n\nfunction buildApiUrl(\n path: string,\n query: Record<string, string | number | undefined> = {},\n): string {\n const base = resolveApiUrl().replace(/\\/+$/, \"\");\n const url = new URL(`${base}${path}`);\n\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\nexport async function executeRemoteTool(\n toolName: string,\n args: Record<string, unknown>,\n timeoutMs: number = 30000,\n): Promise<ApiResponse> {\n const url = buildApiUrl(\"/api/v1/execute\");\n const apiKey = resolveApiKey();\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: getHeaders(apiKey),\n body: JSON.stringify({ tool: toolName, args }),\n signal: controller.signal,\n });\n\n const data: ApiResponse = await response.json();\n return data;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n ok: false,\n error: {\n code: \"TIMEOUT\",\n message: `Request timed out after ${timeoutMs}ms`,\n suggestion: \"Increase with --timeout <ms>\",\n },\n meta: { tool: toolName },\n };\n }\n const msg = error instanceof Error ? error.message : String(error);\n return {\n ok: false,\n error: {\n code: \"API_ERROR\",\n message: `Connection failed: ${msg}`,\n suggestion: `Check HIVE_API_URL (${resolveApiUrl()})`,\n },\n meta: { tool: toolName },\n };\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function fetchToolCatalog(): Promise<ApiResponse> {\n const apiKey = resolveApiKey();\n const tools: unknown[] = [];\n let cursor: string | undefined;\n let lastPage: ApiResponse | null = null;\n\n for (let page = 0; page < TOOL_CATALOG_MAX_PAGES; page++) {\n const response = await fetchWithRetry(\n buildApiUrl(\"/api/v1/tools\", {\n limit: TOOL_CATALOG_PAGE_LIMIT,\n cursor,\n }),\n {\n headers: getHeaders(apiKey),\n },\n );\n const parsed = (await response.json()) as ApiResponse;\n lastPage = parsed;\n\n if (!parsed.ok) return parsed;\n\n if (!Array.isArray(parsed.data)) {\n return parsed;\n }\n\n tools.push(...parsed.data);\n\n if (!parsed.has_more) {\n return {\n ...parsed,\n data: tools,\n has_more: false,\n next_cursor: undefined,\n meta: {\n ...parsed.meta,\n returned: tools.length,\n pages: page + 1,\n },\n };\n }\n\n if (!parsed.next_cursor) {\n return {\n ok: false,\n error: {\n code: \"CATALOG_PAGINATION_ERROR\",\n message:\n \"Tool catalog page reported more results but did not include next_cursor.\",\n suggestion: \"Run hive doctor or retry with --no-cache.\",\n },\n meta: { returned: tools.length, pages: page + 1 },\n };\n }\n\n cursor = parsed.next_cursor;\n }\n\n return {\n ok: false,\n error: {\n code: \"CATALOG_PAGINATION_ERROR\",\n message: `Tool catalog pagination did not finish after ${TOOL_CATALOG_MAX_PAGES} pages.`,\n suggestion: \"Run hive doctor or contact support if this persists.\",\n },\n meta: {\n returned: tools.length,\n pages: TOOL_CATALOG_MAX_PAGES,\n last_cursor: cursor,\n last_page_returned: lastPage?.meta?.returned,\n },\n };\n}\n\n// ─── Auth & Key Management API Methods ─────────────────────────────\n\nexport async function authSignup(\n email: string,\n password: string,\n): Promise<ApiResponse> {\n const url = buildApiUrl(\"/auth/signup\");\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, password }),\n });\n return response.json();\n}\n\nexport async function authLogin(\n email: string,\n password: string,\n): Promise<ApiResponse> {\n const url = buildApiUrl(\"/auth/login\");\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, password }),\n });\n return response.json();\n}\n\nexport async function authMe(jwt: string): Promise<ApiResponse> {\n const url = buildApiUrl(\"/auth/me\");\n const response = await fetchWithRetry(url, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n return response.json();\n}\n\nexport async function createKey(\n jwt: string,\n name: string,\n): Promise<ApiResponse> {\n const url = buildApiUrl(\"/api/v1/keys\");\n const response = await fetchWithRetry(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${jwt}`,\n },\n body: JSON.stringify({ name }),\n });\n return response.json();\n}\n\nexport async function listKeysApi(jwt: string): Promise<ApiResponse> {\n const url = buildApiUrl(\"/api/v1/keys\");\n const response = await fetchWithRetry(url, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n return response.json();\n}\n\nexport async function revokeKeyApi(\n jwt: string,\n keyId: string,\n): Promise<ApiResponse> {\n const url = buildApiUrl(`/api/v1/keys/${keyId}`);\n const response = await fetchWithRetry(url, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${jwt}` },\n });\n return response.json();\n}\n\nexport async function getUsage(): Promise<ApiResponse> {\n const url = buildApiUrl(\"/api/v1/usage\");\n const apiKey = resolveApiKey();\n const response = await fetchWithRetry(url, {\n headers: getHeaders(apiKey),\n });\n return response.json();\n}\n"],"mappings":"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","names":[]}
@@ -11,6 +11,9 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
11
11
  if (typeof require !== "undefined") return require.apply(this, arguments);
12
12
  throw Error('Dynamic require of "' + x + '" is not supported');
13
13
  });
14
+ var __esm = (fn, res) => function __init() {
15
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
16
+ };
14
17
  var __commonJS = (cb, mod) => function __require2() {
15
18
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
19
  };
@@ -26,6 +29,7 @@ var __copyProps = (to, from, except, desc) => {
26
29
  }
27
30
  return to;
28
31
  };
32
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
29
33
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
30
34
  // If the importer is in node compatibility mode or this is not an ESM
31
35
  // file that has been converted to a CommonJS file using a Babel-
@@ -34,11 +38,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
34
38
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
35
39
  mod
36
40
  ));
41
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
42
 
38
43
  export {
39
44
  __require,
45
+ __esm,
40
46
  __commonJS,
41
47
  __export,
42
- __toESM
48
+ __reExport,
49
+ __toESM,
50
+ __toCommonJS
43
51
  };
44
- //# sourceMappingURL=chunk-QMRVH5ZP.js.map
52
+ //# sourceMappingURL=chunk-KBVPIZS4.js.map
@@ -0,0 +1,86 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+
3
+ // src/cli/errors.ts
4
+ import { distance } from "fastest-levenshtein";
5
+ var ExitCode = {
6
+ SUCCESS: 0,
7
+ GENERAL_ERROR: 1,
8
+ INVALID_ARGS: 2,
9
+ TOOL_NOT_FOUND: 3,
10
+ API_ERROR: 4,
11
+ AUTH_FAILURE: 5,
12
+ RATE_LIMITED: 6,
13
+ TIMEOUT: 124
14
+ };
15
+ var ERROR_CODE_TO_EXIT = {
16
+ GENERAL_ERROR: ExitCode.GENERAL_ERROR,
17
+ INVALID_ARGS: ExitCode.INVALID_ARGS,
18
+ TOOL_NOT_FOUND: ExitCode.TOOL_NOT_FOUND,
19
+ API_ERROR: ExitCode.API_ERROR,
20
+ PROVIDER_UNAVAILABLE: ExitCode.AUTH_FAILURE,
21
+ RATE_LIMITED: ExitCode.RATE_LIMITED,
22
+ TIMEOUT: ExitCode.TIMEOUT,
23
+ VALIDATION_ERROR: ExitCode.INVALID_ARGS
24
+ };
25
+ var ERROR_DOC_URLS = {
26
+ RATE_LIMITED: "https://www.hiveintelligence.xyz/errors#rate-limited",
27
+ TIMEOUT: "https://www.hiveintelligence.xyz/errors#timeout",
28
+ PROVIDER_UNAVAILABLE: "https://www.hiveintelligence.xyz/errors#provider-unavailable",
29
+ TOOL_NOT_FOUND: "https://www.hiveintelligence.xyz/errors#tool-not-found"
30
+ };
31
+ var CliError = class extends Error {
32
+ code;
33
+ exitCode;
34
+ suggestion;
35
+ docUrl;
36
+ constructor(code, message, suggestion, docUrl) {
37
+ super(message);
38
+ this.name = "CliError";
39
+ this.code = code;
40
+ this.exitCode = ERROR_CODE_TO_EXIT[code] ?? ExitCode.GENERAL_ERROR;
41
+ this.suggestion = suggestion;
42
+ this.docUrl = docUrl ?? ERROR_DOC_URLS[code];
43
+ }
44
+ };
45
+ function classifyError(error, toolName) {
46
+ if (error instanceof CliError) return error;
47
+ const msg = error instanceof Error ? error.message : String(error);
48
+ const lower = msg.toLowerCase();
49
+ if (lower.includes("timed out") || lower.includes("timeout")) {
50
+ return new CliError("TIMEOUT", msg, "Increase timeout with --timeout <ms>");
51
+ }
52
+ if (lower.includes("rate limit") || lower.includes("429")) {
53
+ return new CliError(
54
+ "RATE_LIMITED",
55
+ msg,
56
+ "Wait and retry, or reduce request frequency"
57
+ );
58
+ }
59
+ if (lower.includes("api key") || lower.includes("unauthorized") || lower.includes("not configured") || lower.includes("unavailable")) {
60
+ return new CliError(
61
+ "PROVIDER_UNAVAILABLE",
62
+ msg,
63
+ "Run: hive auth login"
64
+ );
65
+ }
66
+ if (lower.includes("not found") && toolName) {
67
+ return new CliError(
68
+ "TOOL_NOT_FOUND",
69
+ msg,
70
+ `Run: hive tools search "${toolName}"`
71
+ );
72
+ }
73
+ return new CliError("API_ERROR", msg);
74
+ }
75
+ function suggestSimilarTools(input, toolNames, maxDistance = 3) {
76
+ return toolNames.map((name) => ({ name, dist: distance(input, name) })).filter((entry) => entry.dist <= maxDistance).sort((a, b) => a.dist - b.dist).slice(0, 3).map((entry) => entry.name);
77
+ }
78
+
79
+ export {
80
+ ExitCode,
81
+ ERROR_DOC_URLS,
82
+ CliError,
83
+ classifyError,
84
+ suggestSimilarTools
85
+ };
86
+ //# sourceMappingURL=chunk-KGYBTXIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/errors.ts"],"sourcesContent":["import { distance } from \"fastest-levenshtein\";\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n INVALID_ARGS: 2,\n TOOL_NOT_FOUND: 3,\n API_ERROR: 4,\n AUTH_FAILURE: 5,\n RATE_LIMITED: 6,\n TIMEOUT: 124,\n} as const;\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode];\n\nexport type ErrorCode =\n | \"GENERAL_ERROR\"\n | \"INVALID_ARGS\"\n | \"TOOL_NOT_FOUND\"\n | \"API_ERROR\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"RATE_LIMITED\"\n | \"TIMEOUT\"\n | \"VALIDATION_ERROR\";\n\nconst ERROR_CODE_TO_EXIT: Record<ErrorCode, ExitCodeValue> = {\n GENERAL_ERROR: ExitCode.GENERAL_ERROR,\n INVALID_ARGS: ExitCode.INVALID_ARGS,\n TOOL_NOT_FOUND: ExitCode.TOOL_NOT_FOUND,\n API_ERROR: ExitCode.API_ERROR,\n PROVIDER_UNAVAILABLE: ExitCode.AUTH_FAILURE,\n RATE_LIMITED: ExitCode.RATE_LIMITED,\n TIMEOUT: ExitCode.TIMEOUT,\n VALIDATION_ERROR: ExitCode.INVALID_ARGS,\n};\n\nexport const ERROR_DOC_URLS: Partial<Record<ErrorCode, string>> = {\n RATE_LIMITED: \"https://www.hiveintelligence.xyz/errors#rate-limited\",\n TIMEOUT: \"https://www.hiveintelligence.xyz/errors#timeout\",\n PROVIDER_UNAVAILABLE:\n \"https://www.hiveintelligence.xyz/errors#provider-unavailable\",\n TOOL_NOT_FOUND: \"https://www.hiveintelligence.xyz/errors#tool-not-found\",\n};\n\nexport class CliError extends Error {\n public readonly code: ErrorCode;\n public readonly exitCode: ExitCodeValue;\n public readonly suggestion?: string;\n public readonly docUrl?: string;\n\n constructor(\n code: ErrorCode,\n message: string,\n suggestion?: string,\n docUrl?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = ERROR_CODE_TO_EXIT[code] ?? ExitCode.GENERAL_ERROR;\n this.suggestion = suggestion;\n this.docUrl = docUrl ?? ERROR_DOC_URLS[code];\n }\n}\n\nexport function classifyError(error: unknown, toolName?: string): CliError {\n if (error instanceof CliError) return error;\n\n const msg = error instanceof Error ? error.message : String(error);\n const lower = msg.toLowerCase();\n\n if (lower.includes(\"timed out\") || lower.includes(\"timeout\")) {\n return new CliError(\"TIMEOUT\", msg, \"Increase timeout with --timeout <ms>\");\n }\n if (lower.includes(\"rate limit\") || lower.includes(\"429\")) {\n return new CliError(\n \"RATE_LIMITED\",\n msg,\n \"Wait and retry, or reduce request frequency\",\n );\n }\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"not configured\") ||\n lower.includes(\"unavailable\")\n ) {\n return new CliError(\n \"PROVIDER_UNAVAILABLE\",\n msg,\n \"Run: hive auth login\",\n );\n }\n if (lower.includes(\"not found\") && toolName) {\n return new CliError(\n \"TOOL_NOT_FOUND\",\n msg,\n `Run: hive tools search \"${toolName}\"`,\n );\n }\n\n return new CliError(\"API_ERROR\", msg);\n}\n\nexport function suggestSimilarTools(\n input: string,\n toolNames: string[],\n maxDistance: number = 3,\n): string[] {\n return toolNames\n .map((name) => ({ name, dist: distance(input, name) }))\n .filter((entry) => entry.dist <= maxDistance)\n .sort((a, b) => a.dist - b.dist)\n .slice(0, 3)\n .map((entry) => entry.name);\n}\n"],"mappings":";;;AAAA,SAAS,gBAAgB;AAElB,IAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,SAAS;AACX;AAcA,IAAM,qBAAuD;AAAA,EAC3D,eAAe,SAAS;AAAA,EACxB,cAAc,SAAS;AAAA,EACvB,gBAAgB,SAAS;AAAA,EACzB,WAAW,SAAS;AAAA,EACpB,sBAAsB,SAAS;AAAA,EAC/B,cAAc,SAAS;AAAA,EACvB,SAAS,SAAS;AAAA,EAClB,kBAAkB,SAAS;AAC7B;AAEO,IAAM,iBAAqD;AAAA,EAChE,cAAc;AAAA,EACd,SAAS;AAAA,EACT,sBACE;AAAA,EACF,gBAAgB;AAClB;AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YACE,MACA,SACA,YACA,QACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,WAAW,mBAAmB,IAAI,KAAK,SAAS;AACrD,SAAK,aAAa;AAClB,SAAK,SAAS,UAAU,eAAe,IAAI;AAAA,EAC7C;AACF;AAEO,SAAS,cAAc,OAAgB,UAA6B;AACzE,MAAI,iBAAiB,SAAU,QAAO;AAEtC,QAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,QAAM,QAAQ,IAAI,YAAY;AAE9B,MAAI,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,SAAS,GAAG;AAC5D,WAAO,IAAI,SAAS,WAAW,KAAK,sCAAsC;AAAA,EAC5E;AACA,MAAI,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,KAAK,GAAG;AACzD,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,cAAc,KAC7B,MAAM,SAAS,gBAAgB,KAC/B,MAAM,SAAS,aAAa,GAC5B;AACA,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,SAAS,WAAW,KAAK,UAAU;AAC3C,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA,2BAA2B,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,IAAI,SAAS,aAAa,GAAG;AACtC;AAEO,SAAS,oBACd,OACA,WACA,cAAsB,GACZ;AACV,SAAO,UACJ,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,SAAS,OAAO,IAAI,EAAE,EAAE,EACrD,OAAO,CAAC,UAAU,MAAM,QAAQ,WAAW,EAC3C,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAC9B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9B;","names":[]}