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.
- package/README.md +243 -166
- 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-X7ETBCBP.js → chunk-MPIUUE3T.js} +60 -272
- 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 +134 -122
- package/build/cli.js.map +1 -1
- package/build/{completion-SBTSXTR3.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-7SBV4G7R.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 -14332
- 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-XEGCLA4I.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 +124 -24
- package/bin/hive.js +0 -25
- package/build/auth-77MKFFBQ.js +0 -233
- package/build/auth-77MKFFBQ.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-X7ETBCBP.js.map +0 -1
- package/build/chunk-XQJ6PB2L.js.map +0 -1
- package/build/completion-SBTSXTR3.js.map +0 -1
- package/build/config-2VDB2ZHE.js +0 -100
- package/build/config-2VDB2ZHE.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-7SBV4G7R.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-XEGCLA4I.js.map → tools-PJHWFCAG.js.map} +0 -0
- /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
|
-
|
|
48
|
+
__reExport,
|
|
49
|
+
__toESM,
|
|
50
|
+
__toCommonJS
|
|
43
51
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
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":[]}
|