hive-intelligence 1.5.2 → 1.5.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.
@@ -7,7 +7,7 @@ import {
7
7
  getSupabaseAdmin,
8
8
  resolveEndpoint,
9
9
  secureLogger
10
- } from "./chunk-LFNLT3YW.js";
10
+ } from "./chunk-Y5XA3SFY.js";
11
11
 
12
12
  // src/services/wallet-service.ts
13
13
  async function consumeCredits(args) {
@@ -133,6 +133,7 @@ async function executeToolByName(toolName, args, options) {
133
133
  transport: "rest",
134
134
  requestId: options?.requestId,
135
135
  clients: getSharedClients(),
136
+ analytics: options?.analytics,
136
137
  beforeExecution: options?.beforeExecution
137
138
  });
138
139
  if (result.validationErrors) {
@@ -62904,11 +62904,30 @@ function getCircuitBreaker(serviceName) {
62904
62904
  state: "CLOSED" /* CLOSED */,
62905
62905
  failures: 0,
62906
62906
  lastFailureTime: 0,
62907
+ lastErrorMessage: null,
62907
62908
  serviceName
62908
62909
  });
62909
62910
  }
62910
62911
  return circuitBreakers.get(serviceName);
62911
62912
  }
62913
+ function failureMessage(error) {
62914
+ let message = "";
62915
+ if (error instanceof AxiosError) {
62916
+ const data = error.response?.data;
62917
+ const fromBody = [
62918
+ data?.message,
62919
+ data?.error,
62920
+ data?.status?.error_message
62921
+ ].find((value) => typeof value === "string" && value.trim());
62922
+ message = typeof fromBody === "string" ? fromBody : error.message;
62923
+ } else if (error instanceof Error) {
62924
+ message = error.message;
62925
+ } else if (error) {
62926
+ message = String(error);
62927
+ }
62928
+ const compact = message.replace(/\s+/g, " ").trim();
62929
+ return compact ? compact.slice(0, 240) : null;
62930
+ }
62912
62931
  function isRetryableError(error) {
62913
62932
  if (!error.response) {
62914
62933
  const retryableCodes = [
@@ -63004,7 +63023,7 @@ var ResilientHttpClient = class {
63004
63023
  );
63005
63024
  } else {
63006
63025
  throw new Error(
63007
- `Circuit breaker OPEN for ${this.config.serviceName}. Service has failed ${breaker.failures} consecutive times. Will retry in ${Math.ceil((this.config.circuitBreakerResetTimeout - (now - breaker.lastFailureTime)) / 1e3)}s`
63026
+ `Circuit breaker OPEN for ${this.config.serviceName}. Service has failed ${breaker.failures} consecutive times. Will retry in ${Math.ceil((this.config.circuitBreakerResetTimeout - (now - breaker.lastFailureTime)) / 1e3)}s` + (breaker.lastErrorMessage ? `. Last error: ${breaker.lastErrorMessage}` : "")
63008
63027
  );
63009
63028
  }
63010
63029
  break;
@@ -63034,11 +63053,13 @@ var ResilientHttpClient = class {
63034
63053
  /**
63035
63054
  * Record a failed request (may open circuit breaker)
63036
63055
  */
63037
- recordFailure() {
63056
+ recordFailure(error) {
63038
63057
  if (!this.config.enableCircuitBreaker) return;
63039
63058
  const breaker = this.circuitBreaker;
63040
63059
  breaker.failures++;
63041
63060
  breaker.lastFailureTime = Date.now();
63061
+ const message = failureMessage(error);
63062
+ if (message) breaker.lastErrorMessage = message;
63042
63063
  if (breaker.state === "HALF_OPEN" /* HALF_OPEN */) {
63043
63064
  breaker.state = "OPEN" /* OPEN */;
63044
63065
  secureLogger.warn(
@@ -63068,7 +63089,7 @@ var ResilientHttpClient = class {
63068
63089
  } catch (error) {
63069
63090
  lastError = error;
63070
63091
  if (error instanceof AxiosError && isRetryableError(error)) {
63071
- this.recordFailure();
63092
+ this.recordFailure(error);
63072
63093
  if (attempt < maxRetries) {
63073
63094
  const delay2 = calculateBackoffDelay(
63074
63095
  attempt,
@@ -63091,7 +63112,7 @@ var ResilientHttpClient = class {
63091
63112
  if (error instanceof AxiosError) {
63092
63113
  const status = error.response?.status ?? 0;
63093
63114
  if (!status || status >= 500 || status === 429) {
63094
- this.recordFailure();
63115
+ this.recordFailure(error);
63095
63116
  }
63096
63117
  }
63097
63118
  }
@@ -84857,7 +84878,8 @@ var ERROR_SUGGESTIONS = {
84857
84878
  };
84858
84879
  function createErrorResponse7(code, message, additionalContext) {
84859
84880
  const suggestion = ERROR_SUGGESTIONS[code] || ERROR_SUGGESTIONS.API_ERROR;
84860
- let errorText = `**Error:** ${message}
84881
+ const bareMessage = message.replace(/^(?:\s*\*\*Error:\*\*\s*)+/, "");
84882
+ let errorText = `**Error:** ${bareMessage}
84861
84883
 
84862
84884
  **Code:** ${code}
84863
84885
 
@@ -86659,6 +86681,14 @@ function isSolanaChain(chain, address) {
86659
86681
  if (chain) return SOLANA_CHAIN_NAMES.has(normalizeChain(chain));
86660
86682
  return !address.trim().toLowerCase().startsWith("0x");
86661
86683
  }
86684
+ function looksLikeNameService(address) {
86685
+ return /\.[a-z]{2,}$/i.test(address.trim());
86686
+ }
86687
+ function nameServiceError(address) {
86688
+ return errorResult3(
86689
+ `"${address}" looks like an ENS or name-service name, which isn't supported yet. Pass a 0x address (EVM) or a base58 address (Solana).`
86690
+ );
86691
+ }
86662
86692
  function errorResult3(message) {
86663
86693
  return {
86664
86694
  content: [{ type: "text", text: JSON.stringify({ error: message }) }],
@@ -86749,7 +86779,12 @@ function heroTools(endpoints, options = {}) {
86749
86779
  change_24h_percent: value[`${vsCurrency}_24h_change`] ?? null
86750
86780
  };
86751
86781
  }
86752
- return { token: query, vs_currency: vsCurrency, ...payload };
86782
+ const tokenExists = Object.keys(payload).some((key) => key !== "_hive");
86783
+ return {
86784
+ token: query,
86785
+ vs_currency: vsCurrency,
86786
+ note: tokenExists ? `No ${vsCurrency} price available for "${query}". The quote currency may be unsupported; try vs_currency "usd".` : `No price found for "${query}". Verify the CoinGecko id or symbol, or pass chain + address for a contract token.`
86787
+ };
86753
86788
  };
86754
86789
  const trimOnchainPrice = (address) => (payload) => {
86755
86790
  const data = payload.data;
@@ -86765,7 +86800,10 @@ function heroTools(endpoints, options = {}) {
86765
86800
  };
86766
86801
  }
86767
86802
  }
86768
- return { address, ...payload };
86803
+ return {
86804
+ address,
86805
+ note: `No onchain price found for ${address} on this network. Verify the contract address and chain.`
86806
+ };
86769
86807
  };
86770
86808
  const getTokenPrice = {
86771
86809
  metadata: {
@@ -86792,6 +86830,7 @@ function heroTools(endpoints, options = {}) {
86792
86830
  const vsCurrency = (parsed.data.vs_currency ?? "usd").toLowerCase();
86793
86831
  const format = parsed.data.response_format ?? "concise";
86794
86832
  if (address) {
86833
+ if (looksLikeNameService(address)) return nameServiceError(address);
86795
86834
  const network = GECKO_NETWORKS[normalizeChain(chain)] ?? normalizeChain(chain);
86796
86835
  const result3 = await executeUnderlying("get_onchain_token_price", {
86797
86836
  network,
@@ -86891,6 +86930,7 @@ function heroTools(endpoints, options = {}) {
86891
86930
  }
86892
86931
  const { address, chain } = parsed.data;
86893
86932
  const format = parsed.data.response_format ?? "concise";
86933
+ if (looksLikeNameService(address)) return nameServiceError(address);
86894
86934
  if (isSolanaChain(chain, address)) {
86895
86935
  const result3 = await executeUnderlying("get_solana_token_security", {
86896
86936
  contract_address: address
@@ -87039,6 +87079,7 @@ function heroTools(endpoints, options = {}) {
87039
87079
  }
87040
87080
  const { address, chain } = parsed.data;
87041
87081
  const format = parsed.data.response_format ?? "concise";
87082
+ if (looksLikeNameService(address)) return nameServiceError(address);
87042
87083
  if (isSolanaChain(chain, address)) {
87043
87084
  const result3 = await executeUnderlying("helius_get_wallet_balances", {
87044
87085
  wallet: address
@@ -97537,8 +97578,9 @@ var PROVIDER_AVAILABILITY_TTL_MS = 6e4;
97537
97578
  var AVAILABILITY_SEVERITY = {
97538
97579
  ok: 0,
97539
97580
  degraded: 1,
97540
- missing_key: 2,
97541
- failing: 3
97581
+ plan_required: 2,
97582
+ missing_key: 3,
97583
+ failing: 4
97542
97584
  };
97543
97585
  function availabilityFromRuntimeStatus(status) {
97544
97586
  switch (status) {
@@ -97549,7 +97591,11 @@ function availabilityFromRuntimeStatus(status) {
97549
97591
  return "ok";
97550
97592
  case "missing_key":
97551
97593
  return "missing_key";
97594
+ // A lapsed or exhausted upstream plan fails deterministically until the
97595
+ // account changes, unlike a transient rate limit or wobble, so it demotes
97596
+ // like a missing key instead of staying ranked as merely degraded.
97552
97597
  case "plan_required":
97598
+ return "plan_required";
97553
97599
  case "rate_limited":
97554
97600
  case "degraded":
97555
97601
  return "degraded";
@@ -97558,7 +97604,7 @@ function availabilityFromRuntimeStatus(status) {
97558
97604
  }
97559
97605
  }
97560
97606
  function isUnavailable(availability) {
97561
- return availability === "missing_key" || availability === "failing";
97607
+ return availability === "missing_key" || availability === "plan_required" || availability === "failing";
97562
97608
  }
97563
97609
  function worseOf(left, right) {
97564
97610
  return AVAILABILITY_SEVERITY[right] > AVAILABILITY_SEVERITY[left] ? right : left;
@@ -98322,7 +98368,8 @@ function singularizeToken(token) {
98322
98368
  return token;
98323
98369
  }
98324
98370
  function parseSearchTokens(query) {
98325
- return query.toLowerCase().replace(/0x[a-f0-9]{20,}/g, " ").replace(/[1-9A-HJ-NP-Za-km-z]{32,}/g, " ").replace(/https?:\/\/\S+/g, " ").replace(/[\?¿!¡"'`()\[\]{}:;|/\\]+/g, " ").replace(/[-_]+/g, " ").split(/[\s,]+/).map(normalizeSearchToken).filter((token) => token.length > 1).filter((token) => !SEARCH_STOPWORDS.has(token)).map(singularizeToken);
98371
+ const tokens = query.toLowerCase().replace(/0x[a-f0-9]{20,}/g, " ").replace(/[1-9A-HJ-NP-Za-km-z]{32,}/g, " ").replace(/https?:\/\/\S+/g, " ").replace(/[\?¿!¡"'`()\[\]{}:;|/\\]+/g, " ").replace(/[-_]+/g, " ").split(/[\s,]+/).map(normalizeSearchToken).filter((token) => token.length > 1).filter((token) => !SEARCH_STOPWORDS.has(token)).map(singularizeToken);
98372
+ return [...new Set(tokens)];
98326
98373
  }
98327
98374
  function searchTokenVariants(token) {
98328
98375
  const normalized = singularizeToken(normalizeSearchToken(token));
@@ -98359,9 +98406,12 @@ function queryMatchScore(entry, query) {
98359
98406
  entry.provider,
98360
98407
  entry.summary
98361
98408
  ].join(" ").toLowerCase();
98409
+ const nameTitleTokenSet = new Set(parseSearchTokens(nameTitleText));
98410
+ const coreTextTokenSet = new Set(parseSearchTokens(coreText));
98362
98411
  const score = tokens.reduce((total, token) => {
98363
- if (exactTextMatchesSearchToken(nameTitleText, token)) return total + 24;
98364
- if (exactTextMatchesSearchToken(coreText, token)) return total + 14;
98412
+ const exactToken = singularizeToken(normalizeSearchToken(token));
98413
+ if (nameTitleTokenSet.has(exactToken)) return total + 24;
98414
+ if (coreTextTokenSet.has(exactToken)) return total + 14;
98365
98415
  if (textMatchesSearchToken(nameTitleText, token)) return total + 12;
98366
98416
  if (textMatchesSearchToken(entry.summary, token)) return total + 6;
98367
98417
  if (textMatchesSearchToken(coreText, token)) return total + 4;
@@ -98603,13 +98653,13 @@ function dynamicTools(endpoints, options = {}) {
98603
98653
  (toolset) => toolsetCatalogEntry(toolset, providerByToolName)
98604
98654
  );
98605
98655
  const searchToolsSchema = z17.object({
98606
- query: z17.string().optional().describe(
98656
+ query: z17.string().max(512).optional().describe(
98607
98657
  "Search text matched against tool name, title, category, provider, and summary."
98608
98658
  ),
98609
- provider: z17.string().optional().describe(
98659
+ provider: z17.string().max(128).optional().describe(
98610
98660
  "Optional provider filter such as CoinGecko, Moralis, Tenderly, Helius, GoPlus, CCXT, Codex, Alchemy, DeFiLlama, Hyperliquid, or Open Data Fetch."
98611
98661
  ),
98612
- category: z17.string().optional().describe("Optional category filter, for example Portfolio & Wallet."),
98662
+ category: z17.string().max(128).optional().describe("Optional category filter, for example Portfolio & Wallet."),
98613
98663
  limit: z17.number().int().min(1).max(MAX_SEARCH_LIMIT).optional().describe(`Maximum tools to return. Default ${DEFAULT_SEARCH_LIMIT}.`),
98614
98664
  cursor: z17.string().optional().describe("Pagination cursor from the previous response."),
98615
98665
  toolset_id: z17.string().max(100).optional().describe(
@@ -99509,7 +99559,7 @@ function buildServerInstructions(scope) {
99509
99559
  `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.`,
99510
99560
  `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).`,
99511
99561
  `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.`,
99512
- `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.`
99562
+ `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 and cursor on search_tools, and limit/page/per_page/offset on data endpoints, to keep responses small; a material execution costs 1 credit on the hosted service.`
99513
99563
  ].join(" ");
99514
99564
  }
99515
99565
  function compactCanaryRun(run) {
@@ -99853,7 +99903,11 @@ var HiveMCPServer = class {
99853
99903
  }
99854
99904
  }
99855
99905
  getProviderStatusCatalog() {
99856
- return getProviderStatusCatalog();
99906
+ const snapshot = getProviderAvailabilitySnapshot();
99907
+ return getProviderStatusCatalog().map((provider) => {
99908
+ const observed = snapshot.byProviderName[provider.name];
99909
+ return provider.status === "ok" && observed && observed !== "ok" ? { ...provider, status: observed } : provider;
99910
+ });
99857
99911
  }
99858
99912
  setupHandlers() {
99859
99913
  this.server.server.oninitialized = () => {
@@ -99964,6 +100018,8 @@ var HiveMCPServer = class {
99964
100018
  note: `Root /mcp exposes ${ROOT_META_TOOL_COUNT} meta-tools optimized for LLM agents. Use category endpoints (/hive_*/mcp) only for specialized integrations requiring direct tool access.`,
99965
100019
  runtimeStatuses: TASK_TOOLSET_RUNTIME_STATUSES,
99966
100020
  runtimeStatusSemantics: RUNTIME_STATUS_SEMANTICS,
100021
+ availability_source: getProviderAvailabilitySnapshot().source,
100022
+ canary_observed_at: getProviderAvailabilitySnapshot().canaryObservedAt,
99967
100023
  providers
99968
100024
  },
99969
100025
  null,
package/build/cli.js CHANGED
@@ -3440,7 +3440,7 @@ program2.hook("preAction", (thisCommand) => {
3440
3440
  setCliFlags({ apiKey: opts.apiKey, noRetry: opts.retry === false });
3441
3441
  });
3442
3442
  program2.action(async () => {
3443
- const { startStdio } = await import("./serve-YFFG2432.js");
3443
+ const { startStdio } = await import("./serve-NCMFZSMB.js");
3444
3444
  await startStdio(program2.opts().envFile);
3445
3445
  });
3446
3446
  program2.command("serve").description("Start the MCP server").option("--http", "Start HTTP server instead of stdio").option("--port <number>", "HTTP server port", "8080").action(async (opts) => {
@@ -3453,10 +3453,10 @@ program2.command("serve").description("Start the MCP server").option("--http", "
3453
3453
  );
3454
3454
  process.exit(ExitCode.INVALID_ARGS);
3455
3455
  }
3456
- const { startHttp } = await import("./serve-YFFG2432.js");
3456
+ const { startHttp } = await import("./serve-NCMFZSMB.js");
3457
3457
  await startHttp(port, program2.opts().envFile);
3458
3458
  } else {
3459
- const { startStdio } = await import("./serve-YFFG2432.js");
3459
+ const { startStdio } = await import("./serve-NCMFZSMB.js");
3460
3460
  await startStdio(program2.opts().envFile);
3461
3461
  }
3462
3462
  });
@@ -3666,7 +3666,7 @@ program2.command("uninstall").description(
3666
3666
  if (exitCode !== 0) process.exit(exitCode);
3667
3667
  });
3668
3668
  program2.command("doctor").description("Diagnose environment and server connectivity").option("--probe", "Run live API probes (slower)").action(async (opts) => {
3669
- const { runDoctor } = await import("./doctor-NLSZB27R.js");
3669
+ const { runDoctor } = await import("./doctor-VRZYKQGL.js");
3670
3670
  await runDoctor(opts);
3671
3671
  });
3672
3672
  program2.command("upgrade").description("Update Hive to the latest published version").action(async () => {
@@ -3714,7 +3714,7 @@ program2.command("usage").description("Show your API usage and plan limits").act
3714
3714
  await runUsage();
3715
3715
  });
3716
3716
  program2.command("status").description("Quick health and version check").action(async () => {
3717
- const { runStatus } = await import("./doctor-NLSZB27R.js");
3717
+ const { runStatus } = await import("./doctor-VRZYKQGL.js");
3718
3718
  await runStatus();
3719
3719
  });
3720
3720
  program2.command("open [target]").description("Open Hive dashboard, docs, status, or GitHub in browser").action(async (target) => {
@@ -204,7 +204,7 @@ ${fails === 0 ? "All checks passed" : `${fails} issues found`}${warns ? ` (${war
204
204
  if (fails > 0) process.exit(1);
205
205
  }
206
206
  async function runStatus() {
207
- const { SERVER_VERSION } = await import("./mcpServer-IWKTX2ZQ.js");
207
+ const { SERVER_VERSION } = await import("./mcpServer-DARSGHUH.js");
208
208
  const { resolveApiKey, resolveApiUrl } = await import("./config-dir-5IH7MOOT.js");
209
209
  const { getActiveProfile, maskKey } = await import("./auth-Y4GXW376.js");
210
210
  const apiUrl = resolveApiUrl();
@@ -9,7 +9,7 @@ import {
9
9
  getToolsForScope,
10
10
  memoizedJsonSchemaToZodInputSchema,
11
11
  memoizedJsonSchemaToZodOutputSchema
12
- } from "./chunk-LFNLT3YW.js";
12
+ } from "./chunk-Y5XA3SFY.js";
13
13
  import "./chunk-L326MQZP.js";
14
14
  import "./chunk-EPF36Q3Z.js";
15
15
  import {
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module'; const require = createRequire(impor
2
2
  import {
3
3
  consumeCredits,
4
4
  executeToolByName
5
- } from "./chunk-MWYPLBIN.js";
5
+ } from "./chunk-VZBDTSWA.js";
6
6
  import {
7
7
  HyperliquidAPI,
8
8
  MIN_MONITOR_CADENCE_MS,
@@ -15,7 +15,7 @@ import {
15
15
  monitorCadenceIntervalMs,
16
16
  runScheduledHealthCanaries,
17
17
  secureLogger
18
- } from "./chunk-LFNLT3YW.js";
18
+ } from "./chunk-Y5XA3SFY.js";
19
19
  import "./chunk-L326MQZP.js";
20
20
  import "./chunk-EPF36Q3Z.js";
21
21
  import "./chunk-ZXKFJQDE.js";
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "package": "hive-intelligence",
3
- "version": "1.5.2",
4
- "buildSha": "d978faa93aff11daff471ee34773a8354535bb32",
5
- "imageDigest": "sha256:89a2aef7b9ac0a804f08f46c264c4487d2c3a02c9cce27613afb478a24fc81a1",
3
+ "version": "1.5.3",
4
+ "buildSha": "0adb32f0c05315fa9381d143b9f2d0e89514ce63",
5
+ "imageDigest": "sha256:4ab4777877e1be050153bca1c1be9d72b5a7fe7d68e5439d7aabcccaa63c9806",
6
6
  "deployedUrl": "https://mcp.hiveintelligence.xyz",
7
- "manifest": "https://raw.githubusercontent.com/hive-intel/hive-sdk/v1.5.2/releases/v1.5.2.json"
7
+ "manifest": "https://raw.githubusercontent.com/hive-intel/hive-sdk/v1.5.3/releases/v1.5.3.json"
8
8
  }
@@ -7,7 +7,7 @@ async function startStdio(envFile) {
7
7
  dotenv.config({ path: envFile || ".env", quiet: true });
8
8
  console.log = (...args) => console.error("[LOG]", ...args);
9
9
  const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
10
- const { createHiveMcpServer, SERVER_NAME, SERVER_VERSION } = await import("./mcpServer-IWKTX2ZQ.js");
10
+ const { createHiveMcpServer, SERVER_NAME, SERVER_VERSION } = await import("./mcpServer-DARSGHUH.js");
11
11
  const { getPendingUpdateVersion } = await import("./update-check-IEXPOYYR.js");
12
12
  const transport = new StdioServerTransport();
13
13
  const pendingUpdate = getPendingUpdateVersion();
package/build/server.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  ensureWallet,
7
7
  executeToolByName,
8
8
  getWalletStatus
9
- } from "./chunk-MWYPLBIN.js";
9
+ } from "./chunk-VZBDTSWA.js";
10
10
  import {
11
11
  CategoryEndpoints,
12
12
  HERO_TOOL_NAMES,
@@ -95,7 +95,7 @@ import {
95
95
  validateEndpointArgs,
96
96
  verifyApiKey,
97
97
  waitForRedisAvailability
98
- } from "./chunk-LFNLT3YW.js";
98
+ } from "./chunk-Y5XA3SFY.js";
99
99
  import {
100
100
  HIVE_AGENT_SKILLS
101
101
  } from "./chunk-L326MQZP.js";
@@ -8202,6 +8202,13 @@ app.post(
8202
8202
  authReq.hiveSubjectContext,
8203
8203
  () => executeToolByName(executionToolName, endpointArgs, {
8204
8204
  requestId: req.requestId,
8205
+ // Same identity context the hero branch passes — without it every
8206
+ // non-hero keyed REST call wrote a NULL-principal analytics row.
8207
+ analytics: {
8208
+ principalRaw: authReq.userId,
8209
+ authLane: "api_key",
8210
+ isInternal: isMonitorSecretRequest(req)
8211
+ },
8205
8212
  beforeExecution: keyedBeforeExecution
8206
8213
  })
8207
8214
  );
package/build/stdio.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  createHiveMcpServer,
8
8
  secureLogger
9
- } from "./chunk-LFNLT3YW.js";
9
+ } from "./chunk-Y5XA3SFY.js";
10
10
  import "./chunk-L326MQZP.js";
11
11
  import "./chunk-EPF36Q3Z.js";
12
12
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hive-intelligence",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "description": "Evidence-backed crypto due diligence for AI agents, with sources, freshness, and a runtime receipt on every call.",
5
5
  "mcpName": "xyz.hiveintelligence/mcp",
6
6
  "type": "module",
@@ -169,10 +169,10 @@
169
169
  "express-rate-limit": "8.5.2"
170
170
  },
171
171
  "esbuild": "0.28.1",
172
- "fast-uri": "3.1.5",
172
+ "fast-uri": "3.1.7",
173
173
  "hono": "4.12.34",
174
174
  "ip-address": "10.5.0",
175
- "qs": "6.15.3"
175
+ "qs": "6.16.0"
176
176
  },
177
177
  "devDependencies": {
178
178
  "@types/cors": "^2.8.19",