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.
Files changed (28) hide show
  1. package/README.md +2 -2
  2. package/build/{auth-HRFQWQMZ.js → auth-Y4GXW376.js} +1 -1
  3. package/build/{browser-auth-KXIO5BHM.js → browser-auth-F62BMD7W.js} +1 -1
  4. package/build/{chunk-TNQ7GJ6Q.js → chunk-7VSK46QO.js} +73 -44
  5. package/build/{chunk-UFTNBCSA.js → chunk-AGM2CIRL.js} +86 -16
  6. package/build/{chunk-AQQAPAER.js → chunk-BDO27NIP.js} +2 -2
  7. package/build/{chunk-GHCYCBA3.js → chunk-GB4XMTDE.js} +2 -2
  8. package/build/{chunk-7DYHWY4Y.js → chunk-SFN772RL.js} +4 -4
  9. package/build/{chunk-AEU43ACS.js → chunk-TVBPCELA.js} +2 -2
  10. package/build/{chunk-TVQJY47C.js → chunk-WF34ZD5I.js} +6 -6
  11. package/build/{chunk-3OZFBWFK.js → chunk-XQPEFCSY.js} +1 -1
  12. package/build/cli.js +43 -29
  13. package/build/{completion-7KBW243H.js → completion-L3TDZ7ZK.js} +1 -1
  14. package/build/{doctor-GHUAUFS2.js → doctor-XG5IQCXK.js} +4 -4
  15. package/build/{init-UCTCUYFA.js → init-COHA3VZI.js} +3 -3
  16. package/build/{init-all-RG542NWG.js → init-all-YTQJLPLR.js} +14 -14
  17. package/build/{mcpServer-D7OXUDU5.js → mcpServer-XHIN5JER.js} +1 -1
  18. package/build/monitor-worker.js +2 -2
  19. package/build/{namespace-L5DGCY7K.js → namespace-XLMRFH5E.js} +1 -1
  20. package/build/release.json +4 -4
  21. package/build/{serve-K3IT7DS4.js → serve-PWMT5IRU.js} +1 -1
  22. package/build/server.js +22 -13
  23. package/build/stdio.js +1 -1
  24. package/build/{tools-D72ZH6P5.js → tools-SIOAOXW6.js} +1 -1
  25. package/build/{uninstall-SAOIPL6K.js → uninstall-TKDP6C4F.js} +7 -7
  26. package/build/{upgrade-4S5XT5JG.js → upgrade-ODPKMIDC.js} +1 -1
  27. package/build/{watch-IOSRSCFE.js → watch-MXJSNGL2.js} +1 -1
  28. 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 615 tools, but that
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.4.0",
112
+ "server_version": "1.5.1",
113
113
  "build_sha": null,
114
114
  "digest_algorithm": "sha256",
115
115
  "input_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
@@ -12,7 +12,7 @@ import {
12
12
  runWhoami,
13
13
  saveProfile,
14
14
  switchProfile
15
- } from "./chunk-TVQJY47C.js";
15
+ } from "./chunk-WF34ZD5I.js";
16
16
  import "./chunk-6PC3HUAK.js";
17
17
  import "./chunk-ILVPOLA7.js";
18
18
  export {
@@ -7,7 +7,7 @@ import {
7
7
  buildCliLoginUrl,
8
8
  exchangeCliCode,
9
9
  parseCliCallback
10
- } from "./chunk-AQQAPAER.js";
10
+ } from "./chunk-BDO27NIP.js";
11
11
  import "./chunk-ILVPOLA7.js";
12
12
  export {
13
13
  CLI_CALLBACK_PATH,
@@ -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 \u2014 prices, charts, rankings, stablecoins",
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: { flag: "--limit <n>", description: "Number of results" }
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 \u2014 TVL, fees, yields, bridges",
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 bridges",
135
- tool: "defillama_get_bridges"
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 \u2014 balances, DeFi positions, NFTs, history",
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: "get_wallet_balance",
152
+ tool: "get_wallet_balances",
147
153
  args: {
148
- id: {
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: "get_wallet_token_balances",
170
+ tool: "moralis_get_wallet_token_balances",
159
171
  args: {
160
- id: {
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: "get_wallet_defi_positions",
183
+ tool: "moralis_get_wallet_defi_positions",
171
184
  args: {
172
- id: {
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: "get_wallet_nft_collections",
196
+ tool: "moralis_get_wallet_nft_collections",
183
197
  args: {
184
- id: {
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 \u2014 scans, approvals, simulations",
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
- chain_id: {
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
- chain_id: {
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
- contract_addresses: {
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 \u2014 tickers, orderbooks, trades, funding",
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 \u2014 pools, trending pairs, trades, volume",
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: { flag: "--page <n>", description: "Page number" }
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
- pool_address: { flag: "--pool <addr>", description: "Pool address" }
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 \u2014 balances, transfers, transactions, approvals",
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: "goplus_check_approval_security_v2",
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: { flag: "--chain-id <id>", description: "EVM 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 \u2014 collections, markets, trends, holders",
514
+ description: "NFT analytics: collections, markets, trends, holders",
492
515
  commands: [
493
516
  {
494
517
  name: "trending",
495
- description: "Trending NFT collections",
496
- tool: "get_nft_market_trends"
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: "get_nft_collection",
525
+ tool: "get_nft",
502
526
  args: {
503
- slug: { flag: "--slug <name>", description: "Collection slug" }
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: "search_nfts",
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 \u2014 chains, gas, blocks, transactions",
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
- if (!/^(Get|Fetch|Retrieve|Search|Filter|Check|List|Return|Query)/i.test(
81729
- summary
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.slice(0, MAX_CONCISE_TOKENS).map((token) => {
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: token.tokenAddress ?? token.mint ?? token.address ?? null,
86778
- balance: token.balance ?? token.amount ?? token.tokenBalance ?? token.uiAmount ?? null,
86779
- usd_value: token.totalValueUsd ?? token.valueUsd ?? token.usd_value ?? token.totalValueUsdCents ?? null
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: tokens.length,
86786
- tokens: summarized,
86787
- ...tokens.length > MAX_CONCISE_TOKENS ? {
86788
- note: `Showing the first ${MAX_CONCISE_TOKENS} of ${tokens.length} tokens. Use response_format=detailed for the full list.`
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 \u2014 both-sides rollover (borrow_apr_annual) is never sign-comparable with a funding transfer.",
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 \u2014 stocks, pre-IPO names, ETFs, indices, commodities, FX \u2014 across Hyperliquid HIP-3 builder dexes, Ostium, Avantis, Lighter, and Extended: cross-venue funding, mechanism-true carry, open interest, and price-suspect checks.",
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 \u2014 fix the input (check the schema, use a supported value) and retry. This is NOT an outage, auth, rate-limit, or plan issue.",
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 \u2014 provider, fetched_at, runtime_status, _hive.receipt_id \u2014 cite it when answering.`,
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 \u2014 possible CSRF attack. Please try again.");
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 \u2014 Authenticated</title>
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 \u2014 run: npm install -g ${REGISTRY_PACKAGE}@latest
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 \u2014 pull the latest source with git instead.\n"
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 \u2014 routed through the keyless get_token_price hero"
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 \u2014 routed through the keyless check_token_safety hero"
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 \u2014 routed through the keyless get_wallet_portfolio hero"
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 \u2014 run \`hive auth login\` for a full key.`
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 \u2014 tools come over MCP"
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 \u2014 package install may be incomplete"
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 \u2014 Login (profile: ${profileName})
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} \u2014 key may be invalid.
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 \u2014 saving anyway.\n"
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 \u2014 Login (profile: ${profileName})
204
+ Hive CLI: Login (profile: ${profileName})
205
205
  `);
206
206
  try {
207
- const { browserLogin } = await import("./browser-auth-KXIO5BHM.js");
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 \u2014 usage requires a valid account key." : "No API key found \u2014 usage requires an account key.",
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, {});
@@ -7,7 +7,7 @@ import {
7
7
  getSupabaseAdmin,
8
8
  resolveEndpoint,
9
9
  secureLogger
10
- } from "./chunk-UFTNBCSA.js";
10
+ } from "./chunk-AGM2CIRL.js";
11
11
 
12
12
  // src/services/wallet-service.ts
13
13
  async function consumeCredits(args) {