From 49c60401e9324b6ea17c1015d256beed4c3c48bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 03:50:12 +0000 Subject: [PATCH] chore(release): bump HyperDX app/package versions --- .changeset/add-accesskey-index.md | 5 - .changeset/add-hdx-eval-framework.md | 15 -- .changeset/angry-boats-lie.md | 5 - .changeset/breezy-students-clap.md | 7 - .changeset/browser-rum-dashboard-template.md | 12 - .changeset/chilled-drinks-pay.md | 6 - .changeset/connect-your-ai-assistant.md | 11 - .changeset/curvy-foxes-give.md | 5 - .../dashboard-number-tile-font-resize.md | 10 - .../duplicate-series-in-chart-builder.md | 12 - .changeset/eight-phones-protect.md | 5 - .changeset/fix-describe-source-timeout.md | 5 - .changeset/giant-waves-argue.md | 5 - .changeset/good-parents-check.md | 5 - .changeset/good-swans-hammer.md | 5 - .../hdx-4369-mergepath-map-subscript.md | 23 -- .changeset/hdx-4405-trailing-action-hint.md | 5 - .changeset/lazy-load-dashboard-tiles.md | 7 - .changeset/many-comics-rule.md | 5 - .changeset/mcp-alias-descriptions.md | 5 - .changeset/mcp-dashboard-improvements.md | 21 -- .changeset/mcp-error-hints-readonly.md | 16 -- .changeset/mcp-objectid-validation.md | 10 - .changeset/mcp-orderby-alias-quoting.md | 17 -- .changeset/mcp-search-denoise.md | 20 -- .changeset/nasty-crews-shop.md | 5 - .changeset/number-tile-color-external-api.md | 5 - .../page-header-z-index-below-drawers.md | 20 -- .changeset/page-migrate-dashboard.md | 7 - .changeset/polite-moons-give.md | 5 - .changeset/raw-sql-chart-shortcut.md | 5 - .changeset/remove-mcp-max-result-rows.md | 14 -- .changeset/rename-chart-palette-tokens.md | 85 ------- .changeset/rename-mcp-tools-to-clickstack.md | 10 - .../service-map-percentiles-filtering.md | 12 - .changeset/smooth-turkeys-dream.md | 5 - .changeset/source-chip-kebab-menu.md | 5 - .changeset/source-form-dropdown-clipping.md | 5 - .changeset/time-chart-series-limit.md | 7 - .changeset/tough-ads-pay.md | 5 - .changeset/wet-ties-kneel.md | 5 - .env | 4 +- packages/api/CHANGELOG.md | 190 +++++++++++++++ packages/api/package.json | 4 +- packages/app/CHANGELOG.md | 224 ++++++++++++++++++ packages/app/package.json | 4 +- packages/cli/package.json | 2 +- packages/common-utils/CHANGELOG.md | 113 +++++++++ packages/common-utils/package.json | 2 +- packages/hdx-eval/CHANGELOG.md | 21 ++ packages/hdx-eval/package.json | 2 +- packages/otel-collector/CHANGELOG.md | 2 + packages/otel-collector/package.json | 2 +- yarn.lock | 8 +- 54 files changed, 564 insertions(+), 456 deletions(-) delete mode 100644 .changeset/add-accesskey-index.md delete mode 100644 .changeset/add-hdx-eval-framework.md delete mode 100644 .changeset/angry-boats-lie.md delete mode 100644 .changeset/breezy-students-clap.md delete mode 100644 .changeset/browser-rum-dashboard-template.md delete mode 100644 .changeset/chilled-drinks-pay.md delete mode 100644 .changeset/connect-your-ai-assistant.md delete mode 100644 .changeset/curvy-foxes-give.md delete mode 100644 .changeset/dashboard-number-tile-font-resize.md delete mode 100644 .changeset/duplicate-series-in-chart-builder.md delete mode 100644 .changeset/eight-phones-protect.md delete mode 100644 .changeset/fix-describe-source-timeout.md delete mode 100644 .changeset/giant-waves-argue.md delete mode 100644 .changeset/good-parents-check.md delete mode 100644 .changeset/good-swans-hammer.md delete mode 100644 .changeset/hdx-4369-mergepath-map-subscript.md delete mode 100644 .changeset/hdx-4405-trailing-action-hint.md delete mode 100644 .changeset/lazy-load-dashboard-tiles.md delete mode 100644 .changeset/many-comics-rule.md delete mode 100644 .changeset/mcp-alias-descriptions.md delete mode 100644 .changeset/mcp-dashboard-improvements.md delete mode 100644 .changeset/mcp-error-hints-readonly.md delete mode 100644 .changeset/mcp-objectid-validation.md delete mode 100644 .changeset/mcp-orderby-alias-quoting.md delete mode 100644 .changeset/mcp-search-denoise.md delete mode 100644 .changeset/nasty-crews-shop.md delete mode 100644 .changeset/number-tile-color-external-api.md delete mode 100644 .changeset/page-header-z-index-below-drawers.md delete mode 100644 .changeset/page-migrate-dashboard.md delete mode 100644 .changeset/polite-moons-give.md delete mode 100644 .changeset/raw-sql-chart-shortcut.md delete mode 100644 .changeset/remove-mcp-max-result-rows.md delete mode 100644 .changeset/rename-chart-palette-tokens.md delete mode 100644 .changeset/rename-mcp-tools-to-clickstack.md delete mode 100644 .changeset/service-map-percentiles-filtering.md delete mode 100644 .changeset/smooth-turkeys-dream.md delete mode 100644 .changeset/source-chip-kebab-menu.md delete mode 100644 .changeset/source-form-dropdown-clipping.md delete mode 100644 .changeset/time-chart-series-limit.md delete mode 100644 .changeset/tough-ads-pay.md delete mode 100644 .changeset/wet-ties-kneel.md create mode 100644 packages/hdx-eval/CHANGELOG.md diff --git a/.changeset/add-accesskey-index.md b/.changeset/add-accesskey-index.md deleted file mode 100644 index 4a9b44d73c..0000000000 --- a/.changeset/add-accesskey-index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/api": minor ---- - -Add unique MongoDB index on accessKey field in User model to eliminate full collection scans during API key authentication. This could cause startup failures if any existing users share duplicate accessKey values. diff --git a/.changeset/add-hdx-eval-framework.md b/.changeset/add-hdx-eval-framework.md deleted file mode 100644 index 9d7f75966b..0000000000 --- a/.changeset/add-hdx-eval-framework.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@hyperdx/hdx-eval': minor ---- - -feat: add AI eval framework for benchmarking MCP servers - -New `@hyperdx/hdx-eval` package for benchmarking AI agents against -observability MCP servers. Generates deterministic synthetic telemetry -with planted anomalies, spawns Claude Code as an SRE agent, records full -trajectories, and grades answers using programmatic checks and an -LLM-as-judge. - -Includes 5 scenarios (error-root-cause, latency-spike, noisy-signals, -segmented-regression, service-health-check), MCP-agnostic N-way -comparison, blinded judging, and a web viewer for browsing results. diff --git a/.changeset/angry-boats-lie.md b/.changeset/angry-boats-lie.md deleted file mode 100644 index a5e9d5fc74..0000000000 --- a/.changeset/angry-boats-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -fix(search-filters): prevent nested filter dropdowns from disappearing on reopen diff --git a/.changeset/breezy-students-clap.md b/.changeset/breezy-students-clap.md deleted file mode 100644 index 2e08cb5b03..0000000000 --- a/.changeset/breezy-students-clap.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@hyperdx/common-utils": patch -"@hyperdx/api": patch -"@hyperdx/app": patch ---- - -feat: Add option to fit time chart y-axis lower bound diff --git a/.changeset/browser-rum-dashboard-template.md b/.changeset/browser-rum-dashboard-template.md deleted file mode 100644 index fd16b607c6..0000000000 --- a/.changeset/browser-rum-dashboard-template.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@hyperdx/app': minor ---- - -feat: add Browser RUM dashboard template - -- New "Browser RUM" template in the dashboards gallery for browser sessions instrumented with the HyperDX Browser SDK (or any OTel browser instrumentation emitting a `rum.sessionId` resource attribute) -- Performance Overview section: page-view/session/error KPIs, Core Web Vitals (LCP/INP/CLS) p75, median/p75/p90 page-load percentiles, and long-task health -- Page Views Breakdown section: traffic grouped by URL, browser (parsed from the `http.user_agent` the document-load instrumentation emits), country, and device size (derived from `screen.xy`) -- Errors section with tabs for an overview, JS exceptions (by message and by page), and failing API calls -- Five dashboard-level filters: Service, Environment, Service Version, Page URL, and Country -- Top Countries tile and the Country filter populate when the OTel collector's `geoip` processor is enabled (geo can't be derived in the browser) diff --git a/.changeset/chilled-drinks-pay.md b/.changeset/chilled-drinks-pay.md deleted file mode 100644 index d5a8b7d1b9..0000000000 --- a/.changeset/chilled-drinks-pay.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@hyperdx/common-utils": patch -"@hyperdx/api": patch ---- - -fix: Add sourceId to MCP Raw SQL Tile schema diff --git a/.changeset/connect-your-ai-assistant.md b/.changeset/connect-your-ai-assistant.md deleted file mode 100644 index e39775e851..0000000000 --- a/.changeset/connect-your-ai-assistant.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -feat: add a "Connect your AI assistant" section to Team Settings - -A new section on the Team Settings page (Integrations tab, above the API Keys -card) lets a user install the HyperDX MCP server in Claude Code, Cursor, -VS Code + Copilot, Codex CLI, or any MCP-compatible host without hand-rolling -JSON. Per-host snippets carry the user's personal access key so the install -works against the existing `/api/mcp` route without extra setup. diff --git a/.changeset/curvy-foxes-give.md b/.changeset/curvy-foxes-give.md deleted file mode 100644 index 84f55a7ee6..0000000000 --- a/.changeset/curvy-foxes-give.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/api": patch ---- - -fix: Add missing numberFormats, compareToPreviousPeriod fields to MCP Schemas diff --git a/.changeset/dashboard-number-tile-font-resize.md b/.changeset/dashboard-number-tile-font-resize.md deleted file mode 100644 index 1bdcaa5297..0000000000 --- a/.changeset/dashboard-number-tile-font-resize.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat(dashboard): auto-resize font in number tiles to fit container - -Number tiles now automatically scale their font size to fit the available -width, preventing text overflow on narrow tiles and making better use of -space on wide ones. Includes an error boundary so a single broken tile -does not crash the entire dashboard. diff --git a/.changeset/duplicate-series-in-chart-builder.md b/.changeset/duplicate-series-in-chart-builder.md deleted file mode 100644 index 30b38ae6ba..0000000000 --- a/.changeset/duplicate-series-in-chart-builder.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat(chart-explorer): duplicate a series in the chart builder - -Add a Duplicate button to each series row in the chart builder that inserts a -copy of that series directly below it, so building a near-identical variant -(for example avg and p95 of the same column) no longer requires re-entering -every field by hand. "Add Series" still creates a blank series. The copy -starts with an empty alias so it does not collide with the original's alias in -the generated SQL. diff --git a/.changeset/eight-phones-protect.md b/.changeset/eight-phones-protect.md deleted file mode 100644 index 25334b05f4..0000000000 --- a/.changeset/eight-phones-protect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -feat: Use optimistic updates for favorites diff --git a/.changeset/fix-describe-source-timeout.md b/.changeset/fix-describe-source-timeout.md deleted file mode 100644 index 716b355bc0..0000000000 --- a/.changeset/fix-describe-source-timeout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/api": patch ---- - -fix(mcp): reduce describe_source timeouts by using rollup tables for map key discovery diff --git a/.changeset/giant-waves-argue.md b/.changeset/giant-waves-argue.md deleted file mode 100644 index 50974a7279..0000000000 --- a/.changeset/giant-waves-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -fix: Navigate to the dashboard listing page after deleting a dashboard diff --git a/.changeset/good-parents-check.md b/.changeset/good-parents-check.md deleted file mode 100644 index e21e03acf8..0000000000 --- a/.changeset/good-parents-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/hdx-eval': patch ---- - -Support multi-model comparison in eval batches via comma-separated --model flag diff --git a/.changeset/good-swans-hammer.md b/.changeset/good-swans-hammer.md deleted file mode 100644 index a5ba3e0de5..0000000000 --- a/.changeset/good-swans-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/common-utils": patch ---- - -Adding filters to dashboard exports. Implemented validation on dashboard imports to catch potential issues with generated JSON or manually tweaked JSON. diff --git a/.changeset/hdx-4369-mergepath-map-subscript.md b/.changeset/hdx-4369-mergepath-map-subscript.md deleted file mode 100644 index 00c07cd9ba..0000000000 --- a/.changeset/hdx-4369-mergepath-map-subscript.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -fix(row-panel): mergePath now emits string-key subscripts for Map columns, -preventing a crash when expanding rows with numeric-looking attribute keys - -`mergePath` converted numeric path segments to 1-based array subscripts -(`[N+1]`) regardless of whether the parent column was a Map or an Array. -On a `Map(String, String)` column this produced SQL like `LogAttributes[2]`, -which ClickHouse rejects with `Illegal types of arguments: -Map(String, String), UInt8 for function arrayElement`. The grid row -"expand" view failed for any row whose attribute path included a -numeric-looking key under a Map column. - -`mergePath` now accepts a `mapColumns` argument alongside `jsonColumns`. -For Map-typed parents, sub-keys always render as string subscripts -(`Map['1']`) regardless of whether the key looks numeric. The three -callers (`useAutoCompleteOptions`, `DBRowJsonViewer` via the row panels, -`DBSearchPageFilters`) now thread Map-column names from the source -schema. A new `useMapColumns` hook mirrors `useJsonColumns`. - -Fixes HDX-4369. diff --git a/.changeset/hdx-4405-trailing-action-hint.md b/.changeset/hdx-4405-trailing-action-hint.md deleted file mode 100644 index 2dba609e2b..0000000000 --- a/.changeset/hdx-4405-trailing-action-hint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -Dashboard table tiles configured with a row-click action now show a trailing arrow-up-right icon at the right edge of each row, revealed on hover, with a small tooltip that names the destination. Actionable rows get a stronger background highlight on hover to reinforce interactivity before the user sees the arrow fade in. The icon click navigates to the same URL as a row click, with all the standard native browser behaviors (cmd-click new tab, middle-click new tab, right-click context menu). diff --git a/.changeset/lazy-load-dashboard-tiles.md b/.changeset/lazy-load-dashboard-tiles.md deleted file mode 100644 index c1153e9058..0000000000 --- a/.changeset/lazy-load-dashboard-tiles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': minor ---- - -feat: lazy-load dashboard tiles based on viewport visibility - -Dashboard tiles now only run their ClickHouse queries once they scroll into the browser viewport, instead of every tile querying on page load. A tile loads the first time it becomes visible and keeps its data afterward. This significantly reduces the number of queries fired when opening dashboards with many tiles. diff --git a/.changeset/many-comics-rule.md b/.changeset/many-comics-rule.md deleted file mode 100644 index 26eae6d49e..0000000000 --- a/.changeset/many-comics-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/common-utils": patch ---- - -feat: add direct_read optimization for filters diff --git a/.changeset/mcp-alias-descriptions.md b/.changeset/mcp-alias-descriptions.md deleted file mode 100644 index 61cc48e4b8..0000000000 --- a/.changeset/mcp-alias-descriptions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -fix(mcp): improve alias field descriptions and examples for readable chart legends diff --git a/.changeset/mcp-dashboard-improvements.md b/.changeset/mcp-dashboard-improvements.md deleted file mode 100644 index 375224e649..0000000000 --- a/.changeset/mcp-dashboard-improvements.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -feat(mcp): add patch_dashboard, get_dashboard_tile, search_dashboards tools - -Add three new MCP dashboard tools for granular operations: - -- `hyperdx_get_dashboard_tile` — retrieve a single tile by tileId -- `hyperdx_patch_dashboard` — update name/tags and/or replace one tile - without resubmitting the full dashboard -- `hyperdx_search_dashboards` — search by name and/or tags - -Fix empty parameter schema on patch/search tools caused by Zod -`.refine()` wrapping. Document Lucene substring matching limitations -prominently in tool descriptions and query guide prompt. - -**Breaking (minor):** Tile `name` on `hyperdx_save_dashboard` now requires -at least 1 character (`.min(1)`). Previously empty string `""` was accepted -and silently persisted as a blank title. Callers sending `name: ""` will -now receive a validation error. diff --git a/.changeset/mcp-error-hints-readonly.md b/.changeset/mcp-error-hints-readonly.md deleted file mode 100644 index 095316d290..0000000000 --- a/.changeset/mcp-error-hints-readonly.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -fix(mcp): improve error hints and fix readonly mode for query safety settings - -Switch MCP ClickHouse safety settings from readonly=1 to readonly=2 so -max_execution_time and max_result_rows are actually applied (readonly=1 -silently rejects all setting changes). - -Improve DateTime64 cast error hint to recommend parseDateTime64BestEffort() -which works on both DateTime and DateTime64 columns, replacing -toDateTime64() which only works on DateTime64. - -Add error hint for unknown column/identifier errors directing agents to -call describe_source before retrying. diff --git a/.changeset/mcp-objectid-validation.md b/.changeset/mcp-objectid-validation.md deleted file mode 100644 index 6087e50143..0000000000 --- a/.changeset/mcp-objectid-validation.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -refactor(mcp): simplify ObjectId validation with shared helpers and schema-level checks - -Add `mcpError()` and `validateObjectId()` utilities to reduce boilerplate -across MCP tool handlers. Move ObjectId validation into Zod input schemas -for always-required ID fields, eliminating inline checks entirely. Remaining -conditional checks use the new one-liner helper. diff --git a/.changeset/mcp-orderby-alias-quoting.md b/.changeset/mcp-orderby-alias-quoting.md deleted file mode 100644 index 8d8ea67b4c..0000000000 --- a/.changeset/mcp-orderby-alias-quoting.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -fix(mcp): quote multi-word aliases in orderBy and steer event-pattern usage - -Quote resolved aliases that are not bare identifiers (e.g. `"P95 Latency"`) -in `resolveOrderBy` output, in both the direct alias-match and aggFn-match -paths. Previously an unquoted multi-word alias produced SQL-invalid -`ORDER BY` output. Incoming orderBy values are stripped of surrounding -double-quote/backtick quoting before matching, so agents that already quote -the alias resolve correctly without being double-quoted. - -Also document the alias-quoting requirement in the `orderBy` schema -descriptions, and update the `clickstack_event_patterns` tool description to -steer agents toward it (over `clickstack_search` / `clickstack_table`) when -exploring what messages, errors, or events exist. diff --git a/.changeset/mcp-search-denoise.md b/.changeset/mcp-search-denoise.md deleted file mode 100644 index 53b5495980..0000000000 --- a/.changeset/mcp-search-denoise.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@hyperdx/api': patch -'@hyperdx/app': patch -'@hyperdx/common-utils': patch ---- - -feat(mcp): add denoise option to clickstack_search tool - -Add a `denoise` boolean parameter to the MCP `clickstack_search` tool that -automatically filters out high-frequency repetitive event patterns from -search results, mirroring the web app's "Denoise Results" feature. - -When enabled, the tool samples 10k random events, mines patterns using -the Drain algorithm, identifies noisy patterns (>10% of sample), and -filters them out of result rows. Returns filtered rows plus metadata -listing removed patterns with estimated counts. - -Extracts shared denoise constants (`DENOISE_SAMPLE_SIZE`, -`DENOISE_NOISE_THRESHOLD`) into `@hyperdx/common-utils` so the web app -and MCP server use the same values. diff --git a/.changeset/nasty-crews-shop.md b/.changeset/nasty-crews-shop.md deleted file mode 100644 index 0b53ead24f..0000000000 --- a/.changeset/nasty-crews-shop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/api": patch ---- - -fix(mcp): add ClickHouse safety settings (max_execution_time, max_result_rows, readonly) for MCP query execution diff --git a/.changeset/number-tile-color-external-api.md b/.changeset/number-tile-color-external-api.md deleted file mode 100644 index 3739b66c4f..0000000000 --- a/.changeset/number-tile-color-external-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/api": minor ---- - -Support number-tile color authoring through the external dashboards API. The v2 REST API and OpenAPI spec now accept `color` (a palette token) and `colorRules` (ordered conditional color rules, last match wins) on builder number tiles, and `color` on raw SQL number tiles, matching what the in-product number-tile editor persists. Color rules accept the numeric and equality operators the editor offers (`gt`, `gte`, `lt`, `lte`, `between`, `eq`, `neq`). Existing dashboards keep working: tiles saved before the palette was renamed to hue names are normalized to the current token names on read. diff --git a/.changeset/page-header-z-index-below-drawers.md b/.changeset/page-header-z-index-below-drawers.md deleted file mode 100644 index 31d4dd178e..0000000000 --- a/.changeset/page-header-z-index-below-drawers.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix(z-index): keep sticky header below drawers and drawers above the fullscreen tile modal - -Two related z-index regressions: - -- `PageHeader` was pinned at `z-index: 100`, but app drawers opt into a - much lower stack via `ZIndexContext` (`contextZIndex + 10`, so a - top-level drawer renders at `z-index: 10`). The sticky header therefore - floated above the drawer overlay. The header now sits at `z-index: 2` so - drawer overlays reliably cover the page chrome while the header still - wins against normal scrolling content. -- `FullscreenPanelModal` used Mantine's default modal z-index (`200`) and - didn't propagate it through `ZIndexContext`. Clicking a row in a - fullscreen search tile opened a `DBRowSidePanel` drawer at `z-index: 10` - that was hidden behind the modal. The modal now follows the existing - `contextZIndex + 10` pattern and wraps its children in a - `ZIndexContext.Provider`, so child drawers stack on top of it. diff --git a/.changeset/page-migrate-dashboard.md b/.changeset/page-migrate-dashboard.md deleted file mode 100644 index dc70c2ec0a..0000000000 --- a/.changeset/page-migrate-dashboard.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -chore: migrate the custom Dashboard page to shared `PageLayout` / `PageHeader`. Breadcrumbs, the editable dashboard name, dashboard actions (Favorite, Tags, Menu), and the "Created by … Updated …" meta now live in a single page header, while the query toolbar (SQL/Lucene WHERE, time range, granularity, Live, refresh, edit filters, Run) is pinned to the top of the scroll container as a dedicated sticky row — the chrome above scrolls away and only the toolbar follows the user. The "Updated …" meta moves to the right side of the breadcrumbs row instead of sitting as a separate body line. - -`PageHeader` gains a `stickyRow` slot that any page can use to declare a single row that should be the only pinned element, with the rest of the header treated as scrolling chrome. Other pages are unaffected — a `PageHeader` without `stickyRow` keeps the existing fully-sticky behavior. diff --git a/.changeset/polite-moons-give.md b/.changeset/polite-moons-give.md deleted file mode 100644 index 8ee1597d14..0000000000 --- a/.changeset/polite-moons-give.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -feat: add source field suggestions diff --git a/.changeset/raw-sql-chart-shortcut.md b/.changeset/raw-sql-chart-shortcut.md deleted file mode 100644 index 4fb19b88d7..0000000000 --- a/.changeset/raw-sql-chart-shortcut.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -Add Cmd/Ctrl+Enter support for running raw SQL chart queries from the SQL editor. diff --git a/.changeset/remove-mcp-max-result-rows.md b/.changeset/remove-mcp-max-result-rows.md deleted file mode 100644 index 4c5d65505a..0000000000 --- a/.changeset/remove-mcp-max-result-rows.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@hyperdx/api': patch ---- - -fix(mcp): remove max_result_rows from MCP safety settings - -Remove the hardcoded max_result_rows=100000 setting from MCP query -execution. Some ClickHouse connections impose profile constraints that -cap max_result_rows below our default, causing SETTING_CONSTRAINT_VIOLATION -errors. The remaining safety settings (max_execution_time=30, readonly=2) -and trimToolResponse provide sufficient protection. - -Add a SETTING_CONSTRAINT_VIOLATION error hint so constrained settings -surface actionable guidance instead of raw ClickHouse errors. diff --git a/.changeset/rename-chart-palette-tokens.md b/.changeset/rename-chart-palette-tokens.md deleted file mode 100644 index cea4e38ac2..0000000000 --- a/.changeset/rename-chart-palette-tokens.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -'@hyperdx/common-utils': minor -'@hyperdx/app': minor -'@hyperdx/api': patch ---- - -refactor(theme): rename chart palette tokens from chart-1..10 to hue-named -(chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX -and ClickStack - -Stored configs from the initial color picker (#2265) keep working. -`ChartPaletteTokenSchema` stays strict (a plain `z.enum`, so its `z.input` -matches `z.output` — wrapping it in `z.preprocess` would poison -`validateRequest`'s `req.body` inference all the way up to -`Dashboard.tiles[i].config.color`). Migration of legacy `chart-1` .. `chart-10` -happens at five complementary points so no entry or wire-format path can slip -through, all composing over a single shared walker -(`walkRawDashboardTileColors` in `common-utils`) so the per-tile traversal -stays in lockstep: - -- **Fetch-time / write-time (React)**: `normalizeDashboardTileColors` in - `packages/app/src/dashboard.ts` heals dashboards on read - (`useDashboards` / `fetchLocalDashboards` / `fetchDashboards`) and on write - (`useUpdateDashboard` / `useCreateDashboard`). Unresolvable color strings - (stale hexes, hand-edited values, forward-rolled future tokens) are - preserved so the user's chosen value survives a render pass — the strict - server-side schema surfaces a clear error on next save instead of the - normalizer quietly dropping the field. -- **JSON import**: `DBDashboardImportPage` runs - `normalizeRawDashboardTileColors` on the parsed JSON *before* the strict - `DashboardTemplateSchema.safeParse`, so templates exported from a - pre-rename deploy import cleanly. -- **Server-side GET response healing**: `getDashboards` / `getDashboard` in - `packages/api/src/controllers/dashboard.ts` rewrite legacy tile colors on - the way out. Pre-rename Mongo docs are served on the wire as - hue-named tokens so non-React HTTP clients (CI scripts, stale bundle - tabs during a rolling deploy, the external API) can round-trip - GET → PATCH without ever resurrecting `chart-N` through the strict - schema. -- **Server-side write shim**: the dashboards POST / PATCH routes mount - a request-body preprocessor that rewrites legacy tile colors before - `validateRequest` runs `ChartPaletteTokenSchema`. Catches non-React - HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts, - MCP, the upcoming external-API parity work) for a one-release - deprecation window without weakening the schema's input/output equality. - The dashboard provisioner task applies the same shim before parsing - on-disk template files. -- **Render-time (belt-and-suspenders)**: `DBNumberChart` and - `ColorSwatchInput` also call `resolveChartPaletteToken` for tiles - constructed in memory between fetch and save (`ChartEditor` form - state, unit-test fixtures, hand-rolled `Tile` literals). - -The migration preserves the HyperDX slot ordering from #2265 (slot 1 = brand -green, slot 2 = blue, etc.). - -**ClickStack legacy color caveat:** Pre-rename ClickStack used a different slot -ordering than HyperDX (`--color-chart-1` was brand blue `#437eef`, not brand -green). The migration map uses HyperDX slot ordering, so any ClickStack -dashboard saved via #2265 with `color: 'chart-1'` will flip from blue to -Observable green after migration. We chose this trade-off deliberately over -branching the legacy map by active theme: `LEGACY_CHART_PALETTE_TOKEN_MAP` lives -in `common-utils` (shared with the API), and migration is one-shot persisted on -next save — theme-branching would couple common-utils to browser DOM state and -still produce wrong results for users whose active theme changed since the -original pick. Affected users can manually re-pick the desired hue via the (now -hue-labeled) color picker. - -The categorical palette is based on Observable 10, with `chart-blue` swapped to -`#437eef` to match the brand link color -(`--click-global-color-text-link-default`); all other hues are straight from -Observable 10. The palette resolves identically on both themes — picking -`chart-blue` always renders the brand blue. Brand identity for charts moves -entirely into the semantic layer: `--color-chart-success` and `--color-chart-info` -resolve to categorical `chart-green` (`#3ca951`) and `chart-blue` (`#437eef`) on -both HyperDX and ClickStack, so success fills, info-level logs, and the -matching multi-series slots all read consistently across brands. - -Internally, JS (`CATEGORICAL_HEX_BY_TOKEN` in `packages/app/src/utils.ts`) is -the source of truth for categorical hues — `getColorFromCSSVariable` and -`getColorFromCSSToken` skip `getComputedStyle` for categorical tokens since the -palette is unified across themes. The matching `--color-chart-{hue}` CSS vars in -`_tokens.scss` remain as a stylesheet-author affordance (inline `var()` use, -devtools inspection) and a hook for any future per-brand override. Semantic -tokens still resolve through `getComputedStyle` because they genuinely vary per -theme. diff --git a/.changeset/rename-mcp-tools-to-clickstack.md b/.changeset/rename-mcp-tools-to-clickstack.md deleted file mode 100644 index 70347fa33c..0000000000 --- a/.changeset/rename-mcp-tools-to-clickstack.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@hyperdx/api": patch -"@hyperdx/common-utils": patch ---- - -refactor(mcp): rename all MCP tool prefixes from `hyperdx_` to `clickstack_` - -Rename the MCP server name from `hyperdx` to `clickstack` and update all 19 -tool names (e.g. `hyperdx_search` → `clickstack_search`), along with -descriptions, prompts, error messages, and test references. diff --git a/.changeset/service-map-percentiles-filtering.md b/.changeset/service-map-percentiles-filtering.md deleted file mode 100644 index 2e80fab9b0..0000000000 --- a/.changeset/service-map-percentiles-filtering.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat(service-map): server-side filtering, latency percentiles, throughput & focus - -The Service Map gains server-side filtering (Lucene/SQL `where` plus a -service-name multi-select with inbound/outbound neighbor expansion), latency -percentiles (p50/p95/p99) and request throughput (req/s) in node and edge -tooltips, a "Focus" action to scope the map to a service and its immediate -dependencies, and node sizing by total throughput (incoming + outgoing). -Percentiles are computed server-side via a single GROUPING SETS query. diff --git a/.changeset/smooth-turkeys-dream.md b/.changeset/smooth-turkeys-dream.md deleted file mode 100644 index ddfa44ee5a..0000000000 --- a/.changeset/smooth-turkeys-dream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -fix: Fix height of source select RHS menu diff --git a/.changeset/source-chip-kebab-menu.md b/.changeset/source-chip-kebab-menu.md deleted file mode 100644 index 9ec99239ab..0000000000 --- a/.changeset/source-chip-kebab-menu.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat(source-picker): chip + kebab menu UX diff --git a/.changeset/source-form-dropdown-clipping.md b/.changeset/source-form-dropdown-clipping.md deleted file mode 100644 index 08f54d1c83..0000000000 --- a/.changeset/source-form-dropdown-clipping.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -Fix the database, table, and connection dropdowns being clipped inside the source setup modal. The dropdowns now render in a portal, so the full list is visible and scrollable when configuring or editing a source. diff --git a/.changeset/time-chart-series-limit.md b/.changeset/time-chart-series-limit.md deleted file mode 100644 index 27aae22282..0000000000 --- a/.changeset/time-chart-series-limit.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@hyperdx/common-utils": patch -"@hyperdx/app": patch -"@hyperdx/api": patch ---- - -feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector. diff --git a/.changeset/tough-ads-pay.md b/.changeset/tough-ads-pay.md deleted file mode 100644 index 792a3b8c3d..0000000000 --- a/.changeset/tough-ads-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": minor ---- - -feat: trace panel inline split detail diff --git a/.changeset/wet-ties-kneel.md b/.changeset/wet-ties-kneel.md deleted file mode 100644 index 11aa39b0a1..0000000000 --- a/.changeset/wet-ties-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -chore: Make error states consistent across chart types diff --git a/.env b/.env index 6f07a637c7..9137bc988f 100644 --- a/.env +++ b/.env @@ -8,8 +8,8 @@ NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB=clickhouse/clickstack-all-in-one ALL_IN_ONE_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-all-in-one NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB=clickhouse/clickstack-otel-collector OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-otel-collector -CODE_VERSION=2.28.0 -IMAGE_VERSION_SUB_TAG=.28.0 +CODE_VERSION=2.29.0 +IMAGE_VERSION_SUB_TAG=.29.0 IMAGE_VERSION=2 IMAGE_NIGHTLY_TAG=2-nightly IMAGE_LATEST_TAG=latest diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 5f4e8b8e17..add8f8e98b 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,195 @@ # @hyperdx/api +## 2.29.0 + +### Minor Changes + +- 9119de5f: Add unique MongoDB index on accessKey field in User model to eliminate full collection scans during API key authentication. This could cause startup failures if any existing users share duplicate accessKey values. +- f126d5b1: Support number-tile color authoring through the external dashboards API. The v2 REST API and OpenAPI spec now accept `color` (a palette token) and `colorRules` (ordered conditional color rules, last match wins) on builder number tiles, and `color` on raw SQL number tiles, matching what the in-product number-tile editor persists. Color rules accept the numeric and equality operators the editor offers (`gt`, `gte`, `lt`, `lte`, `between`, `eq`, `neq`). Existing dashboards keep working: tiles saved before the palette was renamed to hue names are normalized to the current token names on read. + +### Patch Changes + +- 998ea5d0: feat: Add option to fit time chart y-axis lower bound +- ee907386: fix: Add sourceId to MCP Raw SQL Tile schema +- 9a7e392a: fix: Add missing numberFormats, compareToPreviousPeriod fields to MCP Schemas +- cdd7ca07: fix(mcp): reduce describe_source timeouts by using rollup tables for map key discovery +- 8164492f: fix(mcp): improve alias field descriptions and examples for readable chart legends +- a19ba549: feat(mcp): add patch_dashboard, get_dashboard_tile, search_dashboards tools + + Add three new MCP dashboard tools for granular operations: + + - `hyperdx_get_dashboard_tile` — retrieve a single tile by tileId + - `hyperdx_patch_dashboard` — update name/tags and/or replace one tile + without resubmitting the full dashboard + - `hyperdx_search_dashboards` — search by name and/or tags + + Fix empty parameter schema on patch/search tools caused by Zod + `.refine()` wrapping. Document Lucene substring matching limitations + prominently in tool descriptions and query guide prompt. + + **Breaking (minor):** Tile `name` on `hyperdx_save_dashboard` now requires + at least 1 character (`.min(1)`). Previously empty string `""` was accepted + and silently persisted as a blank title. Callers sending `name: ""` will + now receive a validation error. + +- 7e7159a5: fix(mcp): improve error hints and fix readonly mode for query safety settings + + Switch MCP ClickHouse safety settings from readonly=1 to readonly=2 so + max_execution_time and max_result_rows are actually applied (readonly=1 + silently rejects all setting changes). + + Improve DateTime64 cast error hint to recommend parseDateTime64BestEffort() + which works on both DateTime and DateTime64 columns, replacing + toDateTime64() which only works on DateTime64. + + Add error hint for unknown column/identifier errors directing agents to + call describe_source before retrying. + +- f6bda8c5: refactor(mcp): simplify ObjectId validation with shared helpers and schema-level checks + + Add `mcpError()` and `validateObjectId()` utilities to reduce boilerplate + across MCP tool handlers. Move ObjectId validation into Zod input schemas + for always-required ID fields, eliminating inline checks entirely. Remaining + conditional checks use the new one-liner helper. + +- f326ccf8: fix(mcp): quote multi-word aliases in orderBy and steer event-pattern usage + + Quote resolved aliases that are not bare identifiers (e.g. `"P95 Latency"`) + in `resolveOrderBy` output, in both the direct alias-match and aggFn-match + paths. Previously an unquoted multi-word alias produced SQL-invalid + `ORDER BY` output. Incoming orderBy values are stripped of surrounding + double-quote/backtick quoting before matching, so agents that already quote + the alias resolve correctly without being double-quoted. + + Also document the alias-quoting requirement in the `orderBy` schema + descriptions, and update the `clickstack_event_patterns` tool description to + steer agents toward it (over `clickstack_search` / `clickstack_table`) when + exploring what messages, errors, or events exist. + +- 750b8afe: feat(mcp): add denoise option to clickstack_search tool + + Add a `denoise` boolean parameter to the MCP `clickstack_search` tool that + automatically filters out high-frequency repetitive event patterns from + search results, mirroring the web app's "Denoise Results" feature. + + When enabled, the tool samples 10k random events, mines patterns using + the Drain algorithm, identifies noisy patterns (>10% of sample), and + filters them out of result rows. Returns filtered rows plus metadata + listing removed patterns with estimated counts. + + Extracts shared denoise constants (`DENOISE_SAMPLE_SIZE`, + `DENOISE_NOISE_THRESHOLD`) into `@hyperdx/common-utils` so the web app + and MCP server use the same values. + +- f113ea36: fix(mcp): add ClickHouse safety settings (max_execution_time, max_result_rows, readonly) for MCP query execution +- 60a91e43: fix(mcp): remove max_result_rows from MCP safety settings + + Remove the hardcoded max_result_rows=100000 setting from MCP query + execution. Some ClickHouse connections impose profile constraints that + cap max_result_rows below our default, causing SETTING_CONSTRAINT_VIOLATION + errors. The remaining safety settings (max_execution_time=30, readonly=2) + and trimToolResponse provide sufficient protection. + + Add a SETTING_CONSTRAINT_VIOLATION error hint so constrained settings + surface actionable guidance instead of raw ClickHouse errors. + +- e03971b0: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named + (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX + and ClickStack + + Stored configs from the initial color picker (#2265) keep working. + `ChartPaletteTokenSchema` stays strict (a plain `z.enum`, so its `z.input` + matches `z.output` — wrapping it in `z.preprocess` would poison + `validateRequest`'s `req.body` inference all the way up to + `Dashboard.tiles[i].config.color`). Migration of legacy `chart-1` .. `chart-10` + happens at five complementary points so no entry or wire-format path can slip + through, all composing over a single shared walker + (`walkRawDashboardTileColors` in `common-utils`) so the per-tile traversal + stays in lockstep: + + - **Fetch-time / write-time (React)**: `normalizeDashboardTileColors` in + `packages/app/src/dashboard.ts` heals dashboards on read + (`useDashboards` / `fetchLocalDashboards` / `fetchDashboards`) and on write + (`useUpdateDashboard` / `useCreateDashboard`). Unresolvable color strings + (stale hexes, hand-edited values, forward-rolled future tokens) are + preserved so the user's chosen value survives a render pass — the strict + server-side schema surfaces a clear error on next save instead of the + normalizer quietly dropping the field. + - **JSON import**: `DBDashboardImportPage` runs + `normalizeRawDashboardTileColors` on the parsed JSON _before_ the strict + `DashboardTemplateSchema.safeParse`, so templates exported from a + pre-rename deploy import cleanly. + - **Server-side GET response healing**: `getDashboards` / `getDashboard` in + `packages/api/src/controllers/dashboard.ts` rewrite legacy tile colors on + the way out. Pre-rename Mongo docs are served on the wire as + hue-named tokens so non-React HTTP clients (CI scripts, stale bundle + tabs during a rolling deploy, the external API) can round-trip + GET → PATCH without ever resurrecting `chart-N` through the strict + schema. + - **Server-side write shim**: the dashboards POST / PATCH routes mount + a request-body preprocessor that rewrites legacy tile colors before + `validateRequest` runs `ChartPaletteTokenSchema`. Catches non-React + HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts, + MCP, the upcoming external-API parity work) for a one-release + deprecation window without weakening the schema's input/output equality. + The dashboard provisioner task applies the same shim before parsing + on-disk template files. + - **Render-time (belt-and-suspenders)**: `DBNumberChart` and + `ColorSwatchInput` also call `resolveChartPaletteToken` for tiles + constructed in memory between fetch and save (`ChartEditor` form + state, unit-test fixtures, hand-rolled `Tile` literals). + + The migration preserves the HyperDX slot ordering from #2265 (slot 1 = brand + green, slot 2 = blue, etc.). + + **ClickStack legacy color caveat:** Pre-rename ClickStack used a different slot + ordering than HyperDX (`--color-chart-1` was brand blue `#437eef`, not brand + green). The migration map uses HyperDX slot ordering, so any ClickStack + dashboard saved via #2265 with `color: 'chart-1'` will flip from blue to + Observable green after migration. We chose this trade-off deliberately over + branching the legacy map by active theme: `LEGACY_CHART_PALETTE_TOKEN_MAP` lives + in `common-utils` (shared with the API), and migration is one-shot persisted on + next save — theme-branching would couple common-utils to browser DOM state and + still produce wrong results for users whose active theme changed since the + original pick. Affected users can manually re-pick the desired hue via the (now + hue-labeled) color picker. + + The categorical palette is based on Observable 10, with `chart-blue` swapped to + `#437eef` to match the brand link color + (`--click-global-color-text-link-default`); all other hues are straight from + Observable 10. The palette resolves identically on both themes — picking + `chart-blue` always renders the brand blue. Brand identity for charts moves + entirely into the semantic layer: `--color-chart-success` and `--color-chart-info` + resolve to categorical `chart-green` (`#3ca951`) and `chart-blue` (`#437eef`) on + both HyperDX and ClickStack, so success fills, info-level logs, and the + matching multi-series slots all read consistently across brands. + + Internally, JS (`CATEGORICAL_HEX_BY_TOKEN` in `packages/app/src/utils.ts`) is + the source of truth for categorical hues — `getColorFromCSSVariable` and + `getColorFromCSSToken` skip `getComputedStyle` for categorical tokens since the + palette is unified across themes. The matching `--color-chart-{hue}` CSS vars in + `_tokens.scss` remain as a stylesheet-author affordance (inline `var()` use, + devtools inspection) and a hook for any future per-brand override. Semantic + tokens still resolve through `getComputedStyle` because they genuinely vary per + theme. + +- adac913d: refactor(mcp): rename all MCP tool prefixes from `hyperdx_` to `clickstack_` + + Rename the MCP server name from `hyperdx` to `clickstack` and update all 19 + tool names (e.g. `hyperdx_search` → `clickstack_search`), along with + descriptions, prompts, error messages, and test references. + +- 81e524c2: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector. +- Updated dependencies [998ea5d0] +- Updated dependencies [ee907386] +- Updated dependencies [89949b1b] +- Updated dependencies [747352f3] +- Updated dependencies [750b8afe] +- Updated dependencies [e03971b0] +- Updated dependencies [adac913d] +- Updated dependencies [81e524c2] + - @hyperdx/common-utils@0.21.0 + ## 2.28.0 ### Minor Changes diff --git a/packages/api/package.json b/packages/api/package.json index 9874759096..01d04336b2 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/api", - "version": "2.28.0", + "version": "2.29.0", "license": "MIT", "private": true, "engines": { @@ -11,7 +11,7 @@ "@ai-sdk/openai": "^3.0.47", "@braintree/sanitize-url": "^7.1.1", "@esm2cjs/p-queue": "^7.3.0", - "@hyperdx/common-utils": "^0.20.0", + "@hyperdx/common-utils": "^0.21.0", "@hyperdx/node-opentelemetry": "^0.9.0", "@hyperdx/passport-local-mongoose": "^9.0.1", "@modelcontextprotocol/sdk": "^1.27.1", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index f8c17791c2..3dc43591ab 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,229 @@ # @hyperdx/app +## 2.29.0 + +### Minor Changes + +- 9af8cbab: feat: add Browser RUM dashboard template + + - New "Browser RUM" template in the dashboards gallery for browser sessions instrumented with the HyperDX Browser SDK (or any OTel browser instrumentation emitting a `rum.sessionId` resource attribute) + - Performance Overview section: page-view/session/error KPIs, Core Web Vitals (LCP/INP/CLS) p75, median/p75/p90 page-load percentiles, and long-task health + - Page Views Breakdown section: traffic grouped by URL, browser (parsed from the `http.user_agent` the document-load instrumentation emits), country, and device size (derived from `screen.xy`) + - Errors section with tabs for an overview, JS exceptions (by message and by page), and failing API calls + - Five dashboard-level filters: Service, Environment, Service Version, Page URL, and Country + - Top Countries tile and the Country filter populate when the OTel collector's `geoip` processor is enabled (geo can't be derived in the browser) + +- b6a4b3b3: feat: lazy-load dashboard tiles based on viewport visibility + + Dashboard tiles now only run their ClickHouse queries once they scroll into the browser viewport, instead of every tile querying on page load. A tile loads the first time it becomes visible and keeps its data afterward. This significantly reduces the number of queries fired when opening dashboards with many tiles. + +- e03971b0: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named + (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX + and ClickStack + + Stored configs from the initial color picker (#2265) keep working. + `ChartPaletteTokenSchema` stays strict (a plain `z.enum`, so its `z.input` + matches `z.output` — wrapping it in `z.preprocess` would poison + `validateRequest`'s `req.body` inference all the way up to + `Dashboard.tiles[i].config.color`). Migration of legacy `chart-1` .. `chart-10` + happens at five complementary points so no entry or wire-format path can slip + through, all composing over a single shared walker + (`walkRawDashboardTileColors` in `common-utils`) so the per-tile traversal + stays in lockstep: + + - **Fetch-time / write-time (React)**: `normalizeDashboardTileColors` in + `packages/app/src/dashboard.ts` heals dashboards on read + (`useDashboards` / `fetchLocalDashboards` / `fetchDashboards`) and on write + (`useUpdateDashboard` / `useCreateDashboard`). Unresolvable color strings + (stale hexes, hand-edited values, forward-rolled future tokens) are + preserved so the user's chosen value survives a render pass — the strict + server-side schema surfaces a clear error on next save instead of the + normalizer quietly dropping the field. + - **JSON import**: `DBDashboardImportPage` runs + `normalizeRawDashboardTileColors` on the parsed JSON _before_ the strict + `DashboardTemplateSchema.safeParse`, so templates exported from a + pre-rename deploy import cleanly. + - **Server-side GET response healing**: `getDashboards` / `getDashboard` in + `packages/api/src/controllers/dashboard.ts` rewrite legacy tile colors on + the way out. Pre-rename Mongo docs are served on the wire as + hue-named tokens so non-React HTTP clients (CI scripts, stale bundle + tabs during a rolling deploy, the external API) can round-trip + GET → PATCH without ever resurrecting `chart-N` through the strict + schema. + - **Server-side write shim**: the dashboards POST / PATCH routes mount + a request-body preprocessor that rewrites legacy tile colors before + `validateRequest` runs `ChartPaletteTokenSchema`. Catches non-React + HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts, + MCP, the upcoming external-API parity work) for a one-release + deprecation window without weakening the schema's input/output equality. + The dashboard provisioner task applies the same shim before parsing + on-disk template files. + - **Render-time (belt-and-suspenders)**: `DBNumberChart` and + `ColorSwatchInput` also call `resolveChartPaletteToken` for tiles + constructed in memory between fetch and save (`ChartEditor` form + state, unit-test fixtures, hand-rolled `Tile` literals). + + The migration preserves the HyperDX slot ordering from #2265 (slot 1 = brand + green, slot 2 = blue, etc.). + + **ClickStack legacy color caveat:** Pre-rename ClickStack used a different slot + ordering than HyperDX (`--color-chart-1` was brand blue `#437eef`, not brand + green). The migration map uses HyperDX slot ordering, so any ClickStack + dashboard saved via #2265 with `color: 'chart-1'` will flip from blue to + Observable green after migration. We chose this trade-off deliberately over + branching the legacy map by active theme: `LEGACY_CHART_PALETTE_TOKEN_MAP` lives + in `common-utils` (shared with the API), and migration is one-shot persisted on + next save — theme-branching would couple common-utils to browser DOM state and + still produce wrong results for users whose active theme changed since the + original pick. Affected users can manually re-pick the desired hue via the (now + hue-labeled) color picker. + + The categorical palette is based on Observable 10, with `chart-blue` swapped to + `#437eef` to match the brand link color + (`--click-global-color-text-link-default`); all other hues are straight from + Observable 10. The palette resolves identically on both themes — picking + `chart-blue` always renders the brand blue. Brand identity for charts moves + entirely into the semantic layer: `--color-chart-success` and `--color-chart-info` + resolve to categorical `chart-green` (`#3ca951`) and `chart-blue` (`#437eef`) on + both HyperDX and ClickStack, so success fills, info-level logs, and the + matching multi-series slots all read consistently across brands. + + Internally, JS (`CATEGORICAL_HEX_BY_TOKEN` in `packages/app/src/utils.ts`) is + the source of truth for categorical hues — `getColorFromCSSVariable` and + `getColorFromCSSToken` skip `getComputedStyle` for categorical tokens since the + palette is unified across themes. The matching `--color-chart-{hue}` CSS vars in + `_tokens.scss` remain as a stylesheet-author affordance (inline `var()` use, + devtools inspection) and a hook for any future per-brand override. Semantic + tokens still resolve through `getComputedStyle` because they genuinely vary per + theme. + +- 418567ff: feat: trace panel inline split detail + +### Patch Changes + +- 56c58663: fix(search-filters): prevent nested filter dropdowns from disappearing on reopen +- 998ea5d0: feat: Add option to fit time chart y-axis lower bound +- 20fabc65: feat: add a "Connect your AI assistant" section to Team Settings + + A new section on the Team Settings page (Integrations tab, above the API Keys + card) lets a user install the HyperDX MCP server in Claude Code, Cursor, + VS Code + Copilot, Codex CLI, or any MCP-compatible host without hand-rolling + JSON. Per-host snippets carry the user's personal access key so the install + works against the existing `/api/mcp` route without extra setup. + +- 8e52cef4: feat(dashboard): auto-resize font in number tiles to fit container + + Number tiles now automatically scale their font size to fit the available + width, preventing text overflow on narrow tiles and making better use of + space on wide ones. Includes an error boundary so a single broken tile + does not crash the entire dashboard. + +- 31b87816: feat(chart-explorer): duplicate a series in the chart builder + + Add a Duplicate button to each series row in the chart builder that inserts a + copy of that series directly below it, so building a near-identical variant + (for example avg and p95 of the same column) no longer requires re-entering + every field by hand. "Add Series" still creates a blank series. The copy + starts with an empty alias so it does not collide with the original's alias in + the generated SQL. + +- 7152d2b6: feat: Use optimistic updates for favorites +- 712ba11c: fix: Navigate to the dashboard listing page after deleting a dashboard +- 21307756: fix(row-panel): mergePath now emits string-key subscripts for Map columns, + preventing a crash when expanding rows with numeric-looking attribute keys + + `mergePath` converted numeric path segments to 1-based array subscripts + (`[N+1]`) regardless of whether the parent column was a Map or an Array. + On a `Map(String, String)` column this produced SQL like `LogAttributes[2]`, + which ClickHouse rejects with `Illegal types of arguments: +Map(String, String), UInt8 for function arrayElement`. The grid row + "expand" view failed for any row whose attribute path included a + numeric-looking key under a Map column. + + `mergePath` now accepts a `mapColumns` argument alongside `jsonColumns`. + For Map-typed parents, sub-keys always render as string subscripts + (`Map['1']`) regardless of whether the key looks numeric. The three + callers (`useAutoCompleteOptions`, `DBRowJsonViewer` via the row panels, + `DBSearchPageFilters`) now thread Map-column names from the source + schema. A new `useMapColumns` hook mirrors `useJsonColumns`. + + Fixes HDX-4369. + +- 2cecc9f4: Dashboard table tiles configured with a row-click action now show a trailing arrow-up-right icon at the right edge of each row, revealed on hover, with a small tooltip that names the destination. Actionable rows get a stronger background highlight on hover to reinforce interactivity before the user sees the arrow fade in. The icon click navigates to the same URL as a row click, with all the standard native browser behaviors (cmd-click new tab, middle-click new tab, right-click context menu). +- 750b8afe: feat(mcp): add denoise option to clickstack_search tool + + Add a `denoise` boolean parameter to the MCP `clickstack_search` tool that + automatically filters out high-frequency repetitive event patterns from + search results, mirroring the web app's "Denoise Results" feature. + + When enabled, the tool samples 10k random events, mines patterns using + the Drain algorithm, identifies noisy patterns (>10% of sample), and + filters them out of result rows. Returns filtered rows plus metadata + listing removed patterns with estimated counts. + + Extracts shared denoise constants (`DENOISE_SAMPLE_SIZE`, + `DENOISE_NOISE_THRESHOLD`) into `@hyperdx/common-utils` so the web app + and MCP server use the same values. + +- 9d713999: fix(z-index): keep sticky header below drawers and drawers above the fullscreen tile modal + + Two related z-index regressions: + + - `PageHeader` was pinned at `z-index: 100`, but app drawers opt into a + much lower stack via `ZIndexContext` (`contextZIndex + 10`, so a + top-level drawer renders at `z-index: 10`). The sticky header therefore + floated above the drawer overlay. The header now sits at `z-index: 2` so + drawer overlays reliably cover the page chrome while the header still + wins against normal scrolling content. + - `FullscreenPanelModal` used Mantine's default modal z-index (`200`) and + didn't propagate it through `ZIndexContext`. Clicking a row in a + fullscreen search tile opened a `DBRowSidePanel` drawer at `z-index: 10` + that was hidden behind the modal. The modal now follows the existing + `contextZIndex + 10` pattern and wraps its children in a + `ZIndexContext.Provider`, so child drawers stack on top of it. + +- 538a1c4e: chore: migrate the custom Dashboard page to shared `PageLayout` / `PageHeader`. Breadcrumbs, the editable dashboard name, dashboard actions (Favorite, Tags, Menu), and the "Created by … Updated …" meta now live in a single page header, while the query toolbar (SQL/Lucene WHERE, time range, granularity, Live, refresh, edit filters, Run) is pinned to the top of the scroll container as a dedicated sticky row — the chrome above scrolls away and only the toolbar follows the user. The "Updated …" meta moves to the right side of the breadcrumbs row instead of sitting as a separate body line. + + `PageHeader` gains a `stickyRow` slot that any page can use to declare a single row that should be the only pinned element, with the rest of the header treated as scrolling chrome. Other pages are unaffected — a `PageHeader` without `stickyRow` keeps the existing fully-sticky behavior. + +- e4922804: feat: add source field suggestions +- defbe1f9: Add Cmd/Ctrl+Enter support for running raw SQL chart queries from the SQL editor. +- d1d91d74: feat(service-map): server-side filtering, latency percentiles, throughput & focus + + The Service Map gains server-side filtering (Lucene/SQL `where` plus a + service-name multi-select with inbound/outbound neighbor expansion), latency + percentiles (p50/p95/p99) and request throughput (req/s) in node and edge + tooltips, a "Focus" action to scope the map to a service and its immediate + dependencies, and node sizing by total throughput (incoming + outgoing). + Percentiles are computed server-side via a single GROUPING SETS query. + +- 53e8bd17: fix: Fix height of source select RHS menu +- 2a681456: feat(source-picker): chip + kebab menu UX +- f95687b0: Fix the database, table, and connection dropdowns being clipped inside the source setup modal. The dropdowns now render in a portal, so the full list is visible and scrollable when configuring or editing a source. +- 81e524c2: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector. +- a6e7dcde: chore: Make error states consistent across chart types +- Updated dependencies [9119de5f] +- Updated dependencies [998ea5d0] +- Updated dependencies [ee907386] +- Updated dependencies [9a7e392a] +- Updated dependencies [cdd7ca07] +- Updated dependencies [89949b1b] +- Updated dependencies [747352f3] +- Updated dependencies [8164492f] +- Updated dependencies [a19ba549] +- Updated dependencies [7e7159a5] +- Updated dependencies [f6bda8c5] +- Updated dependencies [f326ccf8] +- Updated dependencies [750b8afe] +- Updated dependencies [f113ea36] +- Updated dependencies [f126d5b1] +- Updated dependencies [60a91e43] +- Updated dependencies [e03971b0] +- Updated dependencies [adac913d] +- Updated dependencies [81e524c2] + - @hyperdx/api@2.29.0 + - @hyperdx/common-utils@0.21.0 + ## 2.28.0 ### Minor Changes diff --git a/packages/app/package.json b/packages/app/package.json index 86edb4b74e..a447ad1f78 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/app", - "version": "2.28.0", + "version": "2.29.0", "private": true, "license": "MIT", "engines": { @@ -38,7 +38,7 @@ "@hookform/resolvers": "^3.9.0", "@hyperdx/api": "workspace:*", "@hyperdx/browser": "^0.22.1", - "@hyperdx/common-utils": "^0.20.0", + "@hyperdx/common-utils": "^0.21.0", "@hyperdx/node-opentelemetry": "^0.9.0", "@mantine/core": "^9.0.0", "@mantine/dates": "^9.0.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 497fc92d9e..441fb579ee 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -41,7 +41,7 @@ "devDependencies": { "@clickhouse/client": "^1.12.1", "@clickhouse/client-common": "^1.12.1", - "@hyperdx/common-utils": "^0.20.0", + "@hyperdx/common-utils": "^0.21.0", "@jest/globals": "^30.2.0", "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.14", diff --git a/packages/common-utils/CHANGELOG.md b/packages/common-utils/CHANGELOG.md index 450dcf1b0e..95b526b262 100644 --- a/packages/common-utils/CHANGELOG.md +++ b/packages/common-utils/CHANGELOG.md @@ -1,5 +1,118 @@ # @hyperdx/common-utils +## 0.21.0 + +### Minor Changes + +- e03971b0: refactor(theme): rename chart palette tokens from chart-1..10 to hue-named + (chart-blue, chart-orange, ...) and unify the categorical palette across HyperDX + and ClickStack + + Stored configs from the initial color picker (#2265) keep working. + `ChartPaletteTokenSchema` stays strict (a plain `z.enum`, so its `z.input` + matches `z.output` — wrapping it in `z.preprocess` would poison + `validateRequest`'s `req.body` inference all the way up to + `Dashboard.tiles[i].config.color`). Migration of legacy `chart-1` .. `chart-10` + happens at five complementary points so no entry or wire-format path can slip + through, all composing over a single shared walker + (`walkRawDashboardTileColors` in `common-utils`) so the per-tile traversal + stays in lockstep: + + - **Fetch-time / write-time (React)**: `normalizeDashboardTileColors` in + `packages/app/src/dashboard.ts` heals dashboards on read + (`useDashboards` / `fetchLocalDashboards` / `fetchDashboards`) and on write + (`useUpdateDashboard` / `useCreateDashboard`). Unresolvable color strings + (stale hexes, hand-edited values, forward-rolled future tokens) are + preserved so the user's chosen value survives a render pass — the strict + server-side schema surfaces a clear error on next save instead of the + normalizer quietly dropping the field. + - **JSON import**: `DBDashboardImportPage` runs + `normalizeRawDashboardTileColors` on the parsed JSON _before_ the strict + `DashboardTemplateSchema.safeParse`, so templates exported from a + pre-rename deploy import cleanly. + - **Server-side GET response healing**: `getDashboards` / `getDashboard` in + `packages/api/src/controllers/dashboard.ts` rewrite legacy tile colors on + the way out. Pre-rename Mongo docs are served on the wire as + hue-named tokens so non-React HTTP clients (CI scripts, stale bundle + tabs during a rolling deploy, the external API) can round-trip + GET → PATCH without ever resurrecting `chart-N` through the strict + schema. + - **Server-side write shim**: the dashboards POST / PATCH routes mount + a request-body preprocessor that rewrites legacy tile colors before + `validateRequest` runs `ChartPaletteTokenSchema`. Catches non-React + HTTP callers (stale-bundle tabs during a rolling deploy, CI scripts, + MCP, the upcoming external-API parity work) for a one-release + deprecation window without weakening the schema's input/output equality. + The dashboard provisioner task applies the same shim before parsing + on-disk template files. + - **Render-time (belt-and-suspenders)**: `DBNumberChart` and + `ColorSwatchInput` also call `resolveChartPaletteToken` for tiles + constructed in memory between fetch and save (`ChartEditor` form + state, unit-test fixtures, hand-rolled `Tile` literals). + + The migration preserves the HyperDX slot ordering from #2265 (slot 1 = brand + green, slot 2 = blue, etc.). + + **ClickStack legacy color caveat:** Pre-rename ClickStack used a different slot + ordering than HyperDX (`--color-chart-1` was brand blue `#437eef`, not brand + green). The migration map uses HyperDX slot ordering, so any ClickStack + dashboard saved via #2265 with `color: 'chart-1'` will flip from blue to + Observable green after migration. We chose this trade-off deliberately over + branching the legacy map by active theme: `LEGACY_CHART_PALETTE_TOKEN_MAP` lives + in `common-utils` (shared with the API), and migration is one-shot persisted on + next save — theme-branching would couple common-utils to browser DOM state and + still produce wrong results for users whose active theme changed since the + original pick. Affected users can manually re-pick the desired hue via the (now + hue-labeled) color picker. + + The categorical palette is based on Observable 10, with `chart-blue` swapped to + `#437eef` to match the brand link color + (`--click-global-color-text-link-default`); all other hues are straight from + Observable 10. The palette resolves identically on both themes — picking + `chart-blue` always renders the brand blue. Brand identity for charts moves + entirely into the semantic layer: `--color-chart-success` and `--color-chart-info` + resolve to categorical `chart-green` (`#3ca951`) and `chart-blue` (`#437eef`) on + both HyperDX and ClickStack, so success fills, info-level logs, and the + matching multi-series slots all read consistently across brands. + + Internally, JS (`CATEGORICAL_HEX_BY_TOKEN` in `packages/app/src/utils.ts`) is + the source of truth for categorical hues — `getColorFromCSSVariable` and + `getColorFromCSSToken` skip `getComputedStyle` for categorical tokens since the + palette is unified across themes. The matching `--color-chart-{hue}` CSS vars in + `_tokens.scss` remain as a stylesheet-author affordance (inline `var()` use, + devtools inspection) and a hook for any future per-brand override. Semantic + tokens still resolve through `getComputedStyle` because they genuinely vary per + theme. + +### Patch Changes + +- 998ea5d0: feat: Add option to fit time chart y-axis lower bound +- ee907386: fix: Add sourceId to MCP Raw SQL Tile schema +- 89949b1b: Adding filters to dashboard exports. Implemented validation on dashboard imports to catch potential issues with generated JSON or manually tweaked JSON. +- 747352f3: feat: add direct_read optimization for filters +- 750b8afe: feat(mcp): add denoise option to clickstack_search tool + + Add a `denoise` boolean parameter to the MCP `clickstack_search` tool that + automatically filters out high-frequency repetitive event patterns from + search results, mirroring the web app's "Denoise Results" feature. + + When enabled, the tool samples 10k random events, mines patterns using + the Drain algorithm, identifies noisy patterns (>10% of sample), and + filters them out of result rows. Returns filtered rows plus metadata + listing removed patterns with estimated counts. + + Extracts shared denoise constants (`DENOISE_SAMPLE_SIZE`, + `DENOISE_NOISE_THRESHOLD`) into `@hyperdx/common-utils` so the web app + and MCP server use the same values. + +- adac913d: refactor(mcp): rename all MCP tool prefixes from `hyperdx_` to `clickstack_` + + Rename the MCP server name from `hyperdx` to `clickstack` and update all 19 + tool names (e.g. `hyperdx_search` → `clickstack_search`), along with + descriptions, prompts, error messages, and test references. + +- 81e524c2: feat(charts): cap group-by time charts to a top-N series limit to prevent browser memory exhaustion on high-cardinality group-bys. The cap defaults to 100 (the number of series rendered) and is configurable per team via a new "Time Chart Series Limit" setting; series beyond the cap remain available in the series selector. + ## 0.20.0 ### Minor Changes diff --git a/packages/common-utils/package.json b/packages/common-utils/package.json index 551601deae..ff00defcd6 100644 --- a/packages/common-utils/package.json +++ b/packages/common-utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperdx/common-utils", "description": "Common utilities for HyperDX application", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "private": true, "files": [ diff --git a/packages/hdx-eval/CHANGELOG.md b/packages/hdx-eval/CHANGELOG.md new file mode 100644 index 0000000000..a3b1fd2d85 --- /dev/null +++ b/packages/hdx-eval/CHANGELOG.md @@ -0,0 +1,21 @@ +# @hyperdx/hdx-eval + +## 0.2.0 + +### Minor Changes + +- 5bd1c681: feat: add AI eval framework for benchmarking MCP servers + + New `@hyperdx/hdx-eval` package for benchmarking AI agents against + observability MCP servers. Generates deterministic synthetic telemetry + with planted anomalies, spawns Claude Code as an SRE agent, records full + trajectories, and grades answers using programmatic checks and an + LLM-as-judge. + + Includes 5 scenarios (error-root-cause, latency-spike, noisy-signals, + segmented-regression, service-health-check), MCP-agnostic N-way + comparison, blinded judging, and a web viewer for browsing results. + +### Patch Changes + +- 6a800318: Support multi-model comparison in eval batches via comma-separated --model flag diff --git a/packages/hdx-eval/package.json b/packages/hdx-eval/package.json index 570971fa95..58cc44c829 100644 --- a/packages/hdx-eval/package.json +++ b/packages/hdx-eval/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/hdx-eval", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", "private": true, "engines": { diff --git a/packages/otel-collector/CHANGELOG.md b/packages/otel-collector/CHANGELOG.md index 82e33e8c74..da6669ec40 100644 --- a/packages/otel-collector/CHANGELOG.md +++ b/packages/otel-collector/CHANGELOG.md @@ -1,5 +1,7 @@ # @hyperdx/otel-collector +## 2.29.0 + ## 2.28.0 ### Minor Changes diff --git a/packages/otel-collector/package.json b/packages/otel-collector/package.json index 61b68c11c9..79c9b67bee 100644 --- a/packages/otel-collector/package.json +++ b/packages/otel-collector/package.json @@ -1,7 +1,7 @@ { "name": "@hyperdx/otel-collector", "description": "HyperDX OpenTelemetry Collector configuration and Docker image", - "version": "2.28.0", + "version": "2.29.0", "license": "MIT", "private": true } diff --git a/yarn.lock b/yarn.lock index ecc5d7d547..4e1f661398 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4360,7 +4360,7 @@ __metadata: "@ai-sdk/openai": "npm:^3.0.47" "@braintree/sanitize-url": "npm:^7.1.1" "@esm2cjs/p-queue": "npm:^7.3.0" - "@hyperdx/common-utils": "npm:^0.20.0" + "@hyperdx/common-utils": "npm:^0.21.0" "@hyperdx/node-opentelemetry": "npm:^0.9.0" "@hyperdx/passport-local-mongoose": "npm:^9.0.1" "@modelcontextprotocol/sdk": "npm:^1.27.1" @@ -4449,7 +4449,7 @@ __metadata: "@hookform/resolvers": "npm:^3.9.0" "@hyperdx/api": "workspace:*" "@hyperdx/browser": "npm:^0.22.1" - "@hyperdx/common-utils": "npm:^0.20.0" + "@hyperdx/common-utils": "npm:^0.21.0" "@hyperdx/node-opentelemetry": "npm:^0.9.0" "@jedmao/location": "npm:^3.0.0" "@mantine/core": "npm:^9.0.0" @@ -4577,7 +4577,7 @@ __metadata: dependencies: "@clickhouse/client": "npm:^1.12.1" "@clickhouse/client-common": "npm:^1.12.1" - "@hyperdx/common-utils": "npm:^0.20.0" + "@hyperdx/common-utils": "npm:^0.21.0" "@jest/globals": "npm:^30.2.0" "@types/crypto-js": "npm:^4.2.2" "@types/jest": "npm:^29.5.14" @@ -4603,7 +4603,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperdx/common-utils@npm:^0.20.0, @hyperdx/common-utils@workspace:packages/common-utils": +"@hyperdx/common-utils@npm:^0.21.0, @hyperdx/common-utils@workspace:packages/common-utils": version: 0.0.0-use.local resolution: "@hyperdx/common-utils@workspace:packages/common-utils" dependencies: