hive-intelligence 1.4.0 → 1.5.1
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 +2 -2
- package/build/{auth-HRFQWQMZ.js → auth-Y4GXW376.js} +1 -1
- package/build/{browser-auth-KXIO5BHM.js → browser-auth-F62BMD7W.js} +1 -1
- package/build/{chunk-TNQ7GJ6Q.js → chunk-7VSK46QO.js} +73 -44
- package/build/{chunk-UFTNBCSA.js → chunk-AGM2CIRL.js} +86 -16
- package/build/{chunk-AQQAPAER.js → chunk-BDO27NIP.js} +2 -2
- package/build/{chunk-GHCYCBA3.js → chunk-GB4XMTDE.js} +2 -2
- package/build/{chunk-7DYHWY4Y.js → chunk-SFN772RL.js} +4 -4
- package/build/{chunk-AEU43ACS.js → chunk-TVBPCELA.js} +2 -2
- package/build/{chunk-TVQJY47C.js → chunk-WF34ZD5I.js} +6 -6
- package/build/{chunk-3OZFBWFK.js → chunk-XQPEFCSY.js} +1 -1
- package/build/cli.js +43 -29
- package/build/{completion-7KBW243H.js → completion-L3TDZ7ZK.js} +1 -1
- package/build/{doctor-GHUAUFS2.js → doctor-XG5IQCXK.js} +4 -4
- package/build/{init-UCTCUYFA.js → init-COHA3VZI.js} +3 -3
- package/build/{init-all-RG542NWG.js → init-all-YTQJLPLR.js} +14 -14
- package/build/{mcpServer-D7OXUDU5.js → mcpServer-XHIN5JER.js} +1 -1
- package/build/monitor-worker.js +2 -2
- package/build/{namespace-L5DGCY7K.js → namespace-XLMRFH5E.js} +1 -1
- package/build/release.json +4 -4
- package/build/{serve-K3IT7DS4.js → serve-PWMT5IRU.js} +1 -1
- package/build/server.js +22 -13
- package/build/stdio.js +1 -1
- package/build/{tools-D72ZH6P5.js → tools-SIOAOXW6.js} +1 -1
- package/build/{uninstall-SAOIPL6K.js → uninstall-TKDP6C4F.js} +7 -7
- package/build/{upgrade-4S5XT5JG.js → upgrade-ODPKMIDC.js} +1 -1
- package/build/{watch-IOSRSCFE.js → watch-MXJSNGL2.js} +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ client setup, self-hosting, or provider-key experiments.
|
|
|
41
41
|
- Bundled agent skills that teach assistants the right Hive workflow:
|
|
42
42
|
discovery -> schema lookup -> bounded execution -> evidence receipt.
|
|
43
43
|
- A broad provider catalog remains available behind discovery for agents that
|
|
44
|
-
need a long-tail endpoint. The current catalog contains
|
|
44
|
+
need a long-tail endpoint. The current catalog contains 607 tools, but that
|
|
45
45
|
coverage is not the primary product contract.
|
|
46
46
|
|
|
47
47
|
## Quickstart
|
|
@@ -109,7 +109,7 @@ Expected output shape:
|
|
|
109
109
|
"source": "live",
|
|
110
110
|
"receipt_id": "00000000-0000-4000-8000-000000000000",
|
|
111
111
|
"receipt_version": "1.0",
|
|
112
|
-
"server_version": "1.
|
|
112
|
+
"server_version": "1.5.1",
|
|
113
113
|
"build_sha": null,
|
|
114
114
|
"digest_algorithm": "sha256",
|
|
115
115
|
"input_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
@@ -4,7 +4,7 @@ import { createRequire } from 'node:module'; const require = createRequire(impor
|
|
|
4
4
|
var NAMESPACE = [
|
|
5
5
|
{
|
|
6
6
|
name: "market",
|
|
7
|
-
description: "Crypto market data
|
|
7
|
+
description: "Crypto market data: prices, charts, rankings, stablecoins",
|
|
8
8
|
commands: [
|
|
9
9
|
{
|
|
10
10
|
name: "price",
|
|
@@ -33,7 +33,11 @@ var NAMESPACE = [
|
|
|
33
33
|
description: "Quote currency",
|
|
34
34
|
required: true
|
|
35
35
|
},
|
|
36
|
-
per_page: {
|
|
36
|
+
per_page: {
|
|
37
|
+
flag: "--limit <n>",
|
|
38
|
+
description: "Number of results",
|
|
39
|
+
type: "number"
|
|
40
|
+
}
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
43
|
{ name: "trending", description: "Trending coins", tool: "get_trending" },
|
|
@@ -68,12 +72,14 @@ var NAMESPACE = [
|
|
|
68
72
|
from: {
|
|
69
73
|
flag: "--from <timestamp>",
|
|
70
74
|
description: "Start UNIX timestamp",
|
|
71
|
-
required: true
|
|
75
|
+
required: true,
|
|
76
|
+
type: "number"
|
|
72
77
|
},
|
|
73
78
|
to: {
|
|
74
79
|
flag: "--to <timestamp>",
|
|
75
80
|
description: "End UNIX timestamp",
|
|
76
|
-
required: true
|
|
81
|
+
required: true,
|
|
82
|
+
type: "number"
|
|
77
83
|
}
|
|
78
84
|
}
|
|
79
85
|
},
|
|
@@ -92,7 +98,7 @@ var NAMESPACE = [
|
|
|
92
98
|
},
|
|
93
99
|
{
|
|
94
100
|
name: "defi",
|
|
95
|
-
description: "DeFi protocol analytics
|
|
101
|
+
description: "DeFi protocol analytics: TVL, fees, yields, bridges",
|
|
96
102
|
commands: [
|
|
97
103
|
{
|
|
98
104
|
name: "tvl",
|
|
@@ -131,61 +137,70 @@ var NAMESPACE = [
|
|
|
131
137
|
{ name: "chains", description: "Chain TVL rankings", tool: "get_chains" },
|
|
132
138
|
{
|
|
133
139
|
name: "bridges",
|
|
134
|
-
description: "Cross-chain
|
|
135
|
-
tool: "
|
|
140
|
+
description: "Cross-chain bridge aggregator volumes",
|
|
141
|
+
tool: "defillama_get_bridge_aggregator_volumes"
|
|
136
142
|
}
|
|
137
143
|
]
|
|
138
144
|
},
|
|
139
145
|
{
|
|
140
146
|
name: "portfolio",
|
|
141
|
-
description: "Wallet portfolios
|
|
147
|
+
description: "Wallet portfolios: balances, DeFi positions, NFTs, history",
|
|
142
148
|
commands: [
|
|
143
149
|
{
|
|
144
150
|
name: "balance",
|
|
145
151
|
description: "Wallet total balance",
|
|
146
|
-
tool: "
|
|
152
|
+
tool: "get_wallet_balances",
|
|
147
153
|
args: {
|
|
148
|
-
|
|
154
|
+
walletAddress: {
|
|
149
155
|
flag: "--address <addr>",
|
|
150
156
|
description: "Wallet address",
|
|
151
157
|
required: true
|
|
158
|
+
},
|
|
159
|
+
networkId: {
|
|
160
|
+
flag: "--network-id <id>",
|
|
161
|
+
description: "EVM chain ID",
|
|
162
|
+
required: true,
|
|
163
|
+
type: "number"
|
|
152
164
|
}
|
|
153
165
|
}
|
|
154
166
|
},
|
|
155
167
|
{
|
|
156
168
|
name: "tokens",
|
|
157
169
|
description: "Token holdings",
|
|
158
|
-
tool: "
|
|
170
|
+
tool: "moralis_get_wallet_token_balances",
|
|
159
171
|
args: {
|
|
160
|
-
|
|
172
|
+
address: {
|
|
161
173
|
flag: "--address <addr>",
|
|
162
174
|
description: "Wallet address",
|
|
163
175
|
required: true
|
|
164
|
-
}
|
|
176
|
+
},
|
|
177
|
+
chain: { flag: "--chain <name>", description: "Chain name" }
|
|
165
178
|
}
|
|
166
179
|
},
|
|
167
180
|
{
|
|
168
181
|
name: "positions",
|
|
169
182
|
description: "DeFi positions",
|
|
170
|
-
tool: "
|
|
183
|
+
tool: "moralis_get_wallet_defi_positions",
|
|
171
184
|
args: {
|
|
172
|
-
|
|
185
|
+
address: {
|
|
173
186
|
flag: "--address <addr>",
|
|
174
187
|
description: "Wallet address",
|
|
175
188
|
required: true
|
|
176
|
-
}
|
|
189
|
+
},
|
|
190
|
+
chain: { flag: "--chain <name>", description: "Chain name" }
|
|
177
191
|
}
|
|
178
192
|
},
|
|
179
193
|
{
|
|
180
194
|
name: "nfts",
|
|
181
195
|
description: "NFT holdings",
|
|
182
|
-
tool: "
|
|
196
|
+
tool: "moralis_get_wallet_nft_collections",
|
|
183
197
|
args: {
|
|
184
|
-
|
|
198
|
+
address: {
|
|
185
199
|
flag: "--address <addr>",
|
|
186
200
|
description: "Wallet address",
|
|
187
201
|
required: true
|
|
188
|
-
}
|
|
202
|
+
},
|
|
203
|
+
chain: { flag: "--chain <name>", description: "Chain name" }
|
|
189
204
|
}
|
|
190
205
|
},
|
|
191
206
|
{
|
|
@@ -204,14 +219,14 @@ var NAMESPACE = [
|
|
|
204
219
|
},
|
|
205
220
|
{
|
|
206
221
|
name: "security",
|
|
207
|
-
description: "Token and contract security
|
|
222
|
+
description: "Token and contract security: scans, approvals, simulations",
|
|
208
223
|
commands: [
|
|
209
224
|
{
|
|
210
225
|
name: "scan",
|
|
211
226
|
description: "Token security analysis",
|
|
212
227
|
tool: "get_token_security",
|
|
213
228
|
args: {
|
|
214
|
-
|
|
229
|
+
chainId: {
|
|
215
230
|
flag: "--chain <id>",
|
|
216
231
|
description: "Chain ID (1=ETH, 56=BSC)",
|
|
217
232
|
required: true
|
|
@@ -228,7 +243,7 @@ var NAMESPACE = [
|
|
|
228
243
|
description: "Audit token approvals",
|
|
229
244
|
tool: "check_approval_security",
|
|
230
245
|
args: {
|
|
231
|
-
|
|
246
|
+
chainId: {
|
|
232
247
|
flag: "--chain <id>",
|
|
233
248
|
description: "Chain ID",
|
|
234
249
|
required: true
|
|
@@ -277,23 +292,18 @@ var NAMESPACE = [
|
|
|
277
292
|
description: "Chain ID",
|
|
278
293
|
required: true
|
|
279
294
|
},
|
|
280
|
-
|
|
295
|
+
contract_address: {
|
|
281
296
|
flag: "--address <addr>",
|
|
282
297
|
description: "Contract",
|
|
283
298
|
required: true
|
|
284
299
|
}
|
|
285
300
|
}
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
name: "hacks",
|
|
289
|
-
description: "Recent DeFi hacks",
|
|
290
|
-
tool: "defillama_get_hacks"
|
|
291
301
|
}
|
|
292
302
|
]
|
|
293
303
|
},
|
|
294
304
|
{
|
|
295
305
|
name: "exchange",
|
|
296
|
-
description: "Centralized exchange data
|
|
306
|
+
description: "Centralized exchange data: tickers, orderbooks, trades, funding",
|
|
297
307
|
commands: [
|
|
298
308
|
{
|
|
299
309
|
name: "ticker",
|
|
@@ -372,7 +382,7 @@ var NAMESPACE = [
|
|
|
372
382
|
},
|
|
373
383
|
{
|
|
374
384
|
name: "dex",
|
|
375
|
-
description: "DEX analytics
|
|
385
|
+
description: "DEX analytics: pools, trending pairs, trades, volume",
|
|
376
386
|
commands: [
|
|
377
387
|
{
|
|
378
388
|
name: "trending",
|
|
@@ -389,7 +399,11 @@ var NAMESPACE = [
|
|
|
389
399
|
description: "Network (eth, bsc, solana)",
|
|
390
400
|
required: true
|
|
391
401
|
},
|
|
392
|
-
page: {
|
|
402
|
+
page: {
|
|
403
|
+
flag: "--page <n>",
|
|
404
|
+
description: "Page number",
|
|
405
|
+
type: "number"
|
|
406
|
+
}
|
|
393
407
|
}
|
|
394
408
|
},
|
|
395
409
|
{
|
|
@@ -399,9 +413,14 @@ var NAMESPACE = [
|
|
|
399
413
|
args: {
|
|
400
414
|
network: {
|
|
401
415
|
flag: "--network <name>",
|
|
402
|
-
description: "Network (eth, bsc, solana)"
|
|
416
|
+
description: "Network (eth, bsc, solana)",
|
|
417
|
+
required: true
|
|
403
418
|
},
|
|
404
|
-
|
|
419
|
+
token_address: {
|
|
420
|
+
flag: "--address <addr>",
|
|
421
|
+
description: "Token contract address",
|
|
422
|
+
required: true
|
|
423
|
+
}
|
|
405
424
|
}
|
|
406
425
|
},
|
|
407
426
|
{
|
|
@@ -430,7 +449,7 @@ var NAMESPACE = [
|
|
|
430
449
|
},
|
|
431
450
|
{
|
|
432
451
|
name: "wallet",
|
|
433
|
-
description: "On-chain wallet data
|
|
452
|
+
description: "On-chain wallet data: balances, transfers, transactions, approvals",
|
|
434
453
|
commands: [
|
|
435
454
|
{
|
|
436
455
|
name: "balances",
|
|
@@ -474,33 +493,42 @@ var NAMESPACE = [
|
|
|
474
493
|
{
|
|
475
494
|
name: "approvals",
|
|
476
495
|
description: "Token approval audit",
|
|
477
|
-
tool: "
|
|
496
|
+
tool: "check_approval_security_v2",
|
|
478
497
|
args: {
|
|
479
498
|
address: {
|
|
480
499
|
flag: "--address <addr>",
|
|
481
500
|
description: "Wallet address",
|
|
482
501
|
required: true
|
|
483
502
|
},
|
|
484
|
-
chain_id: {
|
|
503
|
+
chain_id: {
|
|
504
|
+
flag: "--chain-id <id>",
|
|
505
|
+
description: "EVM chain ID",
|
|
506
|
+
required: true
|
|
507
|
+
}
|
|
485
508
|
}
|
|
486
509
|
}
|
|
487
510
|
]
|
|
488
511
|
},
|
|
489
512
|
{
|
|
490
513
|
name: "nft",
|
|
491
|
-
description: "NFT analytics
|
|
514
|
+
description: "NFT analytics: collections, markets, trends, holders",
|
|
492
515
|
commands: [
|
|
493
516
|
{
|
|
494
517
|
name: "trending",
|
|
495
|
-
description: "Trending NFT collections",
|
|
496
|
-
tool: "
|
|
518
|
+
description: "Trending NFT collections, by 24h volume",
|
|
519
|
+
tool: "get_nft_markets",
|
|
520
|
+
fixedArgs: { order: "h24_volume_usd_desc" }
|
|
497
521
|
},
|
|
498
522
|
{
|
|
499
523
|
name: "collection",
|
|
500
524
|
description: "Collection details",
|
|
501
|
-
tool: "
|
|
525
|
+
tool: "get_nft",
|
|
502
526
|
args: {
|
|
503
|
-
|
|
527
|
+
id: {
|
|
528
|
+
flag: "--slug <name>",
|
|
529
|
+
description: "Collection slug",
|
|
530
|
+
required: true
|
|
531
|
+
}
|
|
504
532
|
}
|
|
505
533
|
},
|
|
506
534
|
{
|
|
@@ -511,20 +539,21 @@ var NAMESPACE = [
|
|
|
511
539
|
{
|
|
512
540
|
name: "search",
|
|
513
541
|
description: "Search NFT collections",
|
|
514
|
-
tool: "
|
|
542
|
+
tool: "alchemy_search_contract_metadata",
|
|
515
543
|
args: {
|
|
516
544
|
query: {
|
|
517
545
|
flag: "--query <text>",
|
|
518
546
|
description: "Search term",
|
|
519
547
|
required: true
|
|
520
|
-
}
|
|
548
|
+
},
|
|
549
|
+
network: { flag: "--network <name>", description: "Alchemy network" }
|
|
521
550
|
}
|
|
522
551
|
}
|
|
523
552
|
]
|
|
524
553
|
},
|
|
525
554
|
{
|
|
526
555
|
name: "network",
|
|
527
|
-
description: "Blockchain infrastructure
|
|
556
|
+
description: "Blockchain infrastructure: chains, gas, blocks, transactions",
|
|
528
557
|
commands: [
|
|
529
558
|
{
|
|
530
559
|
name: "chains",
|
|
@@ -81725,9 +81725,16 @@ function generateStructuredDescription(toolName, existingDescription, inputSchem
|
|
|
81725
81725
|
}
|
|
81726
81726
|
function buildSummary(toolName, existing) {
|
|
81727
81727
|
let summary = existing.replace(/\*\*/g, "").trim();
|
|
81728
|
-
|
|
81729
|
-
|
|
81730
|
-
|
|
81728
|
+
const boilerplate = /^this endpoint (?:allows you to|lets you|is used to|can be used to)\s+/i;
|
|
81729
|
+
if (boilerplate.test(summary)) {
|
|
81730
|
+
summary = summary.replace(boilerplate, "");
|
|
81731
|
+
summary = summary.charAt(0).toUpperCase() + summary.slice(1);
|
|
81732
|
+
} else if (
|
|
81733
|
+
// Ensure it starts with a verb
|
|
81734
|
+
!/^(Get|Fetch|Retrieve|Search|Filter|Check|List|Return|Query)/i.test(
|
|
81735
|
+
summary
|
|
81736
|
+
)
|
|
81737
|
+
) {
|
|
81731
81738
|
const verb = inferVerb(toolName);
|
|
81732
81739
|
summary = `${verb} ${summary.charAt(0).toLowerCase()}${summary.slice(1)}`;
|
|
81733
81740
|
}
|
|
@@ -86755,6 +86762,54 @@ function heroTools(endpoints, options = {}) {
|
|
|
86755
86762
|
response_format: RESPONSE_FORMAT
|
|
86756
86763
|
});
|
|
86757
86764
|
const MAX_CONCISE_TOKENS = 15;
|
|
86765
|
+
const NATIVE_SYMBOLS = {
|
|
86766
|
+
eth: "ETH",
|
|
86767
|
+
ethereum: "ETH",
|
|
86768
|
+
mainnet: "ETH",
|
|
86769
|
+
base: "ETH",
|
|
86770
|
+
polygon: "POL",
|
|
86771
|
+
matic: "POL",
|
|
86772
|
+
arbitrum: "ETH",
|
|
86773
|
+
arb: "ETH",
|
|
86774
|
+
optimism: "ETH",
|
|
86775
|
+
opt: "ETH",
|
|
86776
|
+
bsc: "BNB",
|
|
86777
|
+
bnb: "BNB",
|
|
86778
|
+
avalanche: "AVAX",
|
|
86779
|
+
avax: "AVAX",
|
|
86780
|
+
solana: "SOL"
|
|
86781
|
+
};
|
|
86782
|
+
const decodeBalance = (raw, decimals) => {
|
|
86783
|
+
if (raw == null) return null;
|
|
86784
|
+
if (typeof raw === "number")
|
|
86785
|
+
return Number.isFinite(raw) ? String(raw) : null;
|
|
86786
|
+
if (typeof raw !== "string") return null;
|
|
86787
|
+
const text = raw.trim();
|
|
86788
|
+
if (!text) return null;
|
|
86789
|
+
let units;
|
|
86790
|
+
try {
|
|
86791
|
+
units = BigInt(text);
|
|
86792
|
+
} catch {
|
|
86793
|
+
return text;
|
|
86794
|
+
}
|
|
86795
|
+
const scale = typeof decimals === "number" && Number.isInteger(decimals) && decimals > 0 ? decimals : 0;
|
|
86796
|
+
if (scale === 0) return units.toString();
|
|
86797
|
+
const base = 10n ** BigInt(scale);
|
|
86798
|
+
const whole = units / base;
|
|
86799
|
+
const frac = (units % base).toString().padStart(scale, "0").replace(/0+$/, "");
|
|
86800
|
+
return frac ? `${whole}.${frac.slice(0, 8)}` : whole.toString();
|
|
86801
|
+
};
|
|
86802
|
+
const usdFromPrices = (token, balance) => {
|
|
86803
|
+
if (!Array.isArray(token.tokenPrices)) return null;
|
|
86804
|
+
const usd = token.tokenPrices.find(
|
|
86805
|
+
(price) => isRecord3(price) && price.currency === "usd"
|
|
86806
|
+
);
|
|
86807
|
+
const rate = usd && isRecord3(usd) ? Number(usd.value) : NaN;
|
|
86808
|
+
const quantity = balance == null ? NaN : Number(balance);
|
|
86809
|
+
const value = rate * quantity;
|
|
86810
|
+
if (!Number.isFinite(value)) return null;
|
|
86811
|
+
return value >= 0.01 ? Math.round(value * 100) / 100 : value;
|
|
86812
|
+
};
|
|
86758
86813
|
const firstArray = (payload, keys) => {
|
|
86759
86814
|
for (const key of keys) {
|
|
86760
86815
|
const direct = payload[key];
|
|
@@ -86767,25 +86822,40 @@ function heroTools(endpoints, options = {}) {
|
|
|
86767
86822
|
return [];
|
|
86768
86823
|
};
|
|
86769
86824
|
const trimWalletPortfolio = (address, chainLabel) => (payload) => {
|
|
86825
|
+
const walletLower = address.trim().toLowerCase();
|
|
86770
86826
|
const tokens = firstArray(payload, ["tokens", "items", "balances"]);
|
|
86771
|
-
const summarized = tokens.
|
|
86827
|
+
const summarized = tokens.map((token) => {
|
|
86772
86828
|
if (!isRecord3(token)) return token;
|
|
86773
86829
|
const metadata93 = isRecord3(token.tokenMetadata) ? token.tokenMetadata : isRecord3(token.token) ? token.token : void 0;
|
|
86830
|
+
const fallbackAddress = typeof token.address === "string" && token.address.trim().toLowerCase() === walletLower ? null : token.address ?? null;
|
|
86831
|
+
const tokenAddress = token.tokenAddress ?? token.mint ?? fallbackAddress;
|
|
86832
|
+
const isNative = tokenAddress == null;
|
|
86833
|
+
const rawDecimals = token.decimals ?? metadata93?.decimals;
|
|
86834
|
+
const decimals = typeof rawDecimals === "number" ? rawDecimals : isNative ? 18 : void 0;
|
|
86835
|
+
const balance = decodeBalance(
|
|
86836
|
+
token.balance ?? token.amount ?? token.tokenBalance ?? token.uiAmount ?? null,
|
|
86837
|
+
decimals
|
|
86838
|
+
);
|
|
86774
86839
|
return {
|
|
86775
|
-
symbol: token.symbol ?? metadata93?.symbol ?? token.tokenSymbol ?? null,
|
|
86840
|
+
symbol: token.symbol ?? metadata93?.symbol ?? token.tokenSymbol ?? (isNative ? NATIVE_SYMBOLS[chainLabel] ?? null : null),
|
|
86776
86841
|
name: token.name ?? metadata93?.name ?? null,
|
|
86777
|
-
address:
|
|
86778
|
-
balance
|
|
86779
|
-
usd_value: token.totalValueUsd ?? token.valueUsd ?? token.usd_value ?? token.totalValueUsdCents
|
|
86842
|
+
address: tokenAddress,
|
|
86843
|
+
balance,
|
|
86844
|
+
usd_value: token.totalValueUsd ?? token.valueUsd ?? token.usd_value ?? (typeof token.totalValueUsdCents === "number" ? token.totalValueUsdCents / 100 : usdFromPrices(token, balance))
|
|
86780
86845
|
};
|
|
86781
86846
|
});
|
|
86847
|
+
const held = summarized.filter(
|
|
86848
|
+
(token) => !isRecord3(token) || token.balance !== "0"
|
|
86849
|
+
);
|
|
86782
86850
|
return {
|
|
86783
86851
|
address,
|
|
86784
86852
|
chain: chainLabel,
|
|
86785
|
-
token_count:
|
|
86786
|
-
tokens:
|
|
86787
|
-
...
|
|
86788
|
-
note: `Showing the first ${MAX_CONCISE_TOKENS} of ${
|
|
86853
|
+
token_count: held.length,
|
|
86854
|
+
tokens: held.slice(0, MAX_CONCISE_TOKENS),
|
|
86855
|
+
...held.length > MAX_CONCISE_TOKENS ? {
|
|
86856
|
+
note: `Showing the first ${MAX_CONCISE_TOKENS} of ${held.length} held tokens (zero balances omitted). Use response_format=detailed for the full provider payload.`
|
|
86857
|
+
} : summarized.length > held.length ? {
|
|
86858
|
+
note: `${summarized.length - held.length} zero-balance tokens omitted. Use response_format=detailed for the full provider payload.`
|
|
86789
86859
|
} : {}
|
|
86790
86860
|
};
|
|
86791
86861
|
};
|
|
@@ -87635,7 +87705,7 @@ var TASK_TOOLSET_ROUTES = {
|
|
|
87635
87705
|
steps: [
|
|
87636
87706
|
step(
|
|
87637
87707
|
"funding",
|
|
87638
|
-
"Read normalized funding across all five RWA venues with per-venue runtime status; respect funding_mechanism
|
|
87708
|
+
"Read normalized funding across all five RWA venues with per-venue runtime status; respect funding_mechanism, since both-sides rollover (borrow_apr_annual) is never sign-comparable with a funding transfer.",
|
|
87639
87709
|
"rwa_get_funding_rates",
|
|
87640
87710
|
"rwa_get_hyperliquid_dex_perps",
|
|
87641
87711
|
`${PROVIDER_FALLBACK} The flagship builder dexes carry the deepest RWA books when the full fan-out is unavailable.`
|
|
@@ -88557,7 +88627,7 @@ var TASK_TOOLSET_CATALOG = [
|
|
|
88557
88627
|
id: "rwa_perp_analysis",
|
|
88558
88628
|
kind: "product",
|
|
88559
88629
|
label: "RWA Perp Analysis",
|
|
88560
|
-
purpose: "Analyze tokenized real-world-asset perps
|
|
88630
|
+
purpose: "Analyze tokenized real-world-asset perps (stocks, pre-IPO names, ETFs, indices, commodities, FX) across Hyperliquid HIP-3 builder dexes, Ostium, Avantis, Lighter, and Extended: cross-venue funding, mechanism-true carry, open interest, and price-suspect checks.",
|
|
88561
88631
|
outcome: "A cross-venue RWA perp report with normalized funding (raw + annualized per venue mechanism), asset-class and delisted/price-suspect flags on every row, per-venue runtime status, and receipts.",
|
|
88562
88632
|
requiredIdentifiers: ["underlying ticker, venue, or asset class"],
|
|
88563
88633
|
optionalIdentifiers: ["builder dex name", "time range"],
|
|
@@ -90309,7 +90379,7 @@ var HIVE_RESOURCES = [
|
|
|
90309
90379
|
];
|
|
90310
90380
|
var RUNTIME_STATUS_SEMANTICS = {
|
|
90311
90381
|
ok: "Provider call is expected to work with current configuration.",
|
|
90312
|
-
invalid_input: "The arguments failed validation or named an unsupported venue/method. The provider was not the problem
|
|
90382
|
+
invalid_input: "The arguments failed validation or named an unsupported venue/method. The provider was not the problem: fix the input (check the schema, use a supported value) and retry. This is NOT an outage, auth, rate-limit, or plan issue.",
|
|
90313
90383
|
missing_key: "Provider credentials are not configured for this runtime.",
|
|
90314
90384
|
plan_required: "The tool exists but the upstream account plan, quota, or credits prevent execution.",
|
|
90315
90385
|
rate_limited: "The upstream or Hive rate limit was hit. Retry after backoff or Retry-After.",
|
|
@@ -99279,7 +99349,7 @@ function buildServerInstructions(scope) {
|
|
|
99279
99349
|
].join(" ");
|
|
99280
99350
|
}
|
|
99281
99351
|
return [
|
|
99282
|
-
`Hive serves live crypto market data to AI agents over a compact ${ROOT_META_TOOL_COUNT}-tool root. Loop: search_tools -> get_api_endpoint_schema -> ${READ_ENDPOINT_INVOKER} for reads (${STATEFUL_WRITE_ENDPOINT_INVOKER} only after explicit user approval; validate_task_result before structured answers). Every material response carries a _hive receipt
|
|
99352
|
+
`Hive serves live crypto market data to AI agents over a compact ${ROOT_META_TOOL_COUNT}-tool root. Loop: search_tools -> get_api_endpoint_schema -> ${READ_ENDPOINT_INVOKER} for reads (${STATEFUL_WRITE_ENDPOINT_INVOKER} only after explicit user approval; validate_task_result before structured answers). Every material response carries a _hive receipt (provider, fetched_at, runtime_status, _hive.receipt_id); cite it when answering.`,
|
|
99283
99353
|
`For the three dominant intents call the hero tools directly: get_token_price, check_token_safety, get_wallet_portfolio (response_format "concise" default, "detailed" available).`,
|
|
99284
99354
|
`Degraded providers are reported, not hidden: search_tools marks each tool's availability, and unavailable tools return runtime_status with cause and next_action instead of data. Follow next_action; never retry an unchanged failing call in a loop.`,
|
|
99285
99355
|
`Discovery is free and cheap: resources hive://toolsets, hive://providers, hive://tools; the ${UNDERLYING_TOOL_COUNT}-tool catalog stays reachable through search_tools or scoped category endpoints. Use limit/page/per_page to keep responses small; a material execution costs 1 credit on the hosted service.`
|
|
@@ -91,7 +91,7 @@ async function browserLogin(opts) {
|
|
|
91
91
|
}
|
|
92
92
|
if (outcome.kind === "state-mismatch") {
|
|
93
93
|
res.writeHead(403);
|
|
94
|
-
res.end("State mismatch
|
|
94
|
+
res.end("State mismatch (possible CSRF attack). Please try again.");
|
|
95
95
|
return;
|
|
96
96
|
}
|
|
97
97
|
if (outcome.kind === "legacy-key") {
|
|
@@ -125,7 +125,7 @@ async function browserLogin(opts) {
|
|
|
125
125
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
126
126
|
res.end(`<!DOCTYPE html>
|
|
127
127
|
<html>
|
|
128
|
-
<head><title>Hive CLI
|
|
128
|
+
<head><title>Hive CLI: Authenticated</title>
|
|
129
129
|
<style>
|
|
130
130
|
body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #0a0a0a; color: #fafafa; }
|
|
131
131
|
.card { text-align: center; padding: 2rem; }
|
|
@@ -146,7 +146,7 @@ Update available: ${SERVER_VERSION} -> ${latest}
|
|
|
146
146
|
if (mode === "global") {
|
|
147
147
|
info(
|
|
148
148
|
actions.includes("updated global install") ? `Updated global hive-intelligence to ${latest}.
|
|
149
|
-
` : `Global update failed
|
|
149
|
+
` : `Global update failed. Run: npm install -g ${REGISTRY_PACKAGE}@latest
|
|
150
150
|
`
|
|
151
151
|
);
|
|
152
152
|
}
|
|
@@ -156,7 +156,7 @@ Update available: ${SERVER_VERSION} -> ${latest}
|
|
|
156
156
|
}
|
|
157
157
|
if (mode === "local") {
|
|
158
158
|
info(
|
|
159
|
-
"Running from a local checkout
|
|
159
|
+
"Running from a local checkout; pull the latest source with git instead.\n"
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
info(
|
|
@@ -50,7 +50,7 @@ function remapForKeylessHero(toolName, args) {
|
|
|
50
50
|
return {
|
|
51
51
|
tool: "get_token_price",
|
|
52
52
|
args: { token, vs_currency: vsCurrency },
|
|
53
|
-
note: "no API key
|
|
53
|
+
note: "no API key; routed through the keyless get_token_price hero"
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
if (toolName === "get_token_security") {
|
|
@@ -61,7 +61,7 @@ function remapForKeylessHero(toolName, args) {
|
|
|
61
61
|
return {
|
|
62
62
|
tool: "check_token_safety",
|
|
63
63
|
args: chain ? { address, chain } : { address },
|
|
64
|
-
note: "no API key
|
|
64
|
+
note: "no API key; routed through the keyless check_token_safety hero"
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
if (toolName === "alchemy_get_tokens_by_wallet") {
|
|
@@ -72,7 +72,7 @@ function remapForKeylessHero(toolName, args) {
|
|
|
72
72
|
return {
|
|
73
73
|
tool: "get_wallet_portfolio",
|
|
74
74
|
args: chain ? { address, chain } : { address },
|
|
75
|
-
note: "no API key
|
|
75
|
+
note: "no API key; routed through the keyless get_wallet_portfolio hero"
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
78
|
return null;
|
|
@@ -110,7 +110,7 @@ async function executeTool(toolName, args, timeoutMs = 3e4) {
|
|
|
110
110
|
if (typeof quotaRemaining === "number" && !resolveApiKey() && !shouldOutputJson()) {
|
|
111
111
|
process.stderr.write(
|
|
112
112
|
dim(
|
|
113
|
-
`${quotaRemaining} free call${quotaRemaining === 1 ? "" : "s"} left today
|
|
113
|
+
`${quotaRemaining} free call${quotaRemaining === 1 ? "" : "s"} left today. Run \`hive auth login\` for a full key.`
|
|
114
114
|
) + "\n"
|
|
115
115
|
);
|
|
116
116
|
}
|
|
@@ -212,7 +212,7 @@ function installSkillsForClient(client) {
|
|
|
212
212
|
installed: [],
|
|
213
213
|
skipped: [...SKILL_PACK_NAMES],
|
|
214
214
|
destination: null,
|
|
215
|
-
reason: "Client has no native skills directory
|
|
215
|
+
reason: "Client has no native skills directory; tools come over MCP"
|
|
216
216
|
};
|
|
217
217
|
}
|
|
218
218
|
const packsRoot = findBundledPacksDir();
|
|
@@ -222,7 +222,7 @@ function installSkillsForClient(client) {
|
|
|
222
222
|
installed: [],
|
|
223
223
|
skipped: [...SKILL_PACK_NAMES],
|
|
224
224
|
destination: dest,
|
|
225
|
-
reason: "Bundled skill packs not found
|
|
225
|
+
reason: "Bundled skill packs not found; the package install may be incomplete"
|
|
226
226
|
};
|
|
227
227
|
}
|
|
228
228
|
if (!existsSync2(dest)) mkdirSync(dest, { recursive: true });
|
|
@@ -116,7 +116,7 @@ async function runLogin(opts) {
|
|
|
116
116
|
const profileName = opts.profile ?? "default";
|
|
117
117
|
if (opts.manual) {
|
|
118
118
|
process.stderr.write(`
|
|
119
|
-
Hive CLI
|
|
119
|
+
Hive CLI: Login (profile: ${profileName})
|
|
120
120
|
|
|
121
121
|
`);
|
|
122
122
|
let apiKey;
|
|
@@ -180,7 +180,7 @@ Validating against ${apiUrl}...
|
|
|
180
180
|
process.stderr.write("Key validated successfully.\n");
|
|
181
181
|
} else if (resp.status === 401 || resp.status === 403) {
|
|
182
182
|
process.stderr.write(
|
|
183
|
-
`Warning: Server returned ${resp.status}
|
|
183
|
+
`Warning: Server returned ${resp.status}; the key may be invalid.
|
|
184
184
|
`
|
|
185
185
|
);
|
|
186
186
|
} else {
|
|
@@ -189,7 +189,7 @@ Validating against ${apiUrl}...
|
|
|
189
189
|
}
|
|
190
190
|
} catch {
|
|
191
191
|
process.stderr.write(
|
|
192
|
-
"Warning: Could not reach server
|
|
192
|
+
"Warning: Could not reach the server; saving anyway.\n"
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
saveProfile(profileName, apiKey, apiUrl);
|
|
@@ -201,10 +201,10 @@ Profile "${profileName}" saved. Key: ${maskKey(apiKey)}
|
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
203
|
process.stderr.write(`
|
|
204
|
-
Hive CLI
|
|
204
|
+
Hive CLI: Login (profile: ${profileName})
|
|
205
205
|
`);
|
|
206
206
|
try {
|
|
207
|
-
const { browserLogin } = await import("./browser-auth-
|
|
207
|
+
const { browserLogin } = await import("./browser-auth-F62BMD7W.js");
|
|
208
208
|
const apiUrl = process.env.HIVE_API_URL || "https://mcp.hiveintelligence.xyz";
|
|
209
209
|
const websiteUrl = process.env.HIVE_WEBSITE_URL || "https://hiveintelligence.xyz";
|
|
210
210
|
const result = await browserLogin({ baseUrl: websiteUrl });
|
|
@@ -302,7 +302,7 @@ async function runUsage() {
|
|
|
302
302
|
const code = result.error?.code;
|
|
303
303
|
const err = code === "AUTH_REQUIRED" || code === "INVALID_TOKEN" ? new CliError(
|
|
304
304
|
"AUTH_REQUIRED",
|
|
305
|
-
code === "INVALID_TOKEN" ? "API key was rejected
|
|
305
|
+
code === "INVALID_TOKEN" ? "API key was rejected; usage requires a valid account key." : "No API key found; usage requires an account key.",
|
|
306
306
|
"Run: hive auth login (or set HIVE_API_KEY)"
|
|
307
307
|
) : classifyError(result.error?.message ?? "Failed to fetch usage");
|
|
308
308
|
await outputError(err, {});
|