Skip to content

Release HyperDX#2378

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

Release HyperDX#2378
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@hyperdx/api@2.29.0

Minor Changes

  • 9119de5: 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.
  • f126d5b: 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

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • ee90738: fix: Add sourceId to MCP Raw SQL Tile schema

  • cdd7ca0: fix(mcp): reduce describe_source timeouts by using rollup tables for map key discovery

  • 8164492: fix(mcp): improve alias field descriptions and examples for readable chart legends

  • a19ba54: 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.

  • 7e7159a: 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.

  • f6bda8c: 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.

  • 750b8af: 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.

  • f113ea3: fix(mcp): add ClickHouse safety settings (max_execution_time, max_result_rows, readonly) for MCP query execution

  • e03971b: 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 ([HDX-1360] feat(app): number tile static 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 [HDX-1360] feat(app): number tile static color picker #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 [HDX-1360] feat(app): number tile static color picker #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.

  • adac913: 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_searchclickstack_search), along with
    descriptions, prompts, error messages, and test references.

  • 81e524c: 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 [998ea5d]

  • Updated dependencies [ee90738]

  • Updated dependencies [89949b1]

  • Updated dependencies [8aad6d6]

  • Updated dependencies [747352f]

  • Updated dependencies [750b8af]

  • Updated dependencies [e03971b]

  • Updated dependencies [adac913]

  • Updated dependencies [81e524c]

    • @hyperdx/common-utils@0.21.0

@hyperdx/app@2.29.0

Minor Changes

  • 9af8cba: 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)
  • e03971b: 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 ([HDX-1360] feat(app): number tile static 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 [HDX-1360] feat(app): number tile static color picker #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 [HDX-1360] feat(app): number tile static color picker #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.

  • 418567f: feat: trace panel inline split detail

Patch Changes

  • 56c5866: fix(search-filters): prevent nested filter dropdowns from disappearing on reopen

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • 20fabc6: 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.

  • 8e52cef: 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.

  • 2130775: 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.

  • 2cecc9f: 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).

  • 750b8af: 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.

  • 9d71399: 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.
  • 538a1c4: 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.

  • d1d91d7: 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.

  • 53e8bd1: fix: Fix height of source select RHS menu

  • 2a68145: feat(source-picker): chip + kebab menu UX

  • f95687b: 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.

  • 81e524c: 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.

  • a6e7dcd: chore: Make error states consistent across chart types

  • Updated dependencies [9119de5]

  • Updated dependencies [998ea5d]

  • Updated dependencies [ee90738]

  • Updated dependencies [cdd7ca0]

  • Updated dependencies [89949b1]

  • Updated dependencies [8aad6d6]

  • Updated dependencies [747352f]

  • Updated dependencies [8164492]

  • Updated dependencies [a19ba54]

  • Updated dependencies [7e7159a]

  • Updated dependencies [f6bda8c]

  • Updated dependencies [750b8af]

  • Updated dependencies [f113ea3]

  • Updated dependencies [f126d5b]

  • Updated dependencies [e03971b]

  • Updated dependencies [adac913]

  • Updated dependencies [81e524c]

    • @hyperdx/api@2.29.0
    • @hyperdx/common-utils@0.21.0

@hyperdx/common-utils@0.21.0

Minor Changes

  • e03971b: 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 ([HDX-1360] feat(app): number tile static 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 [HDX-1360] feat(app): number tile static color picker #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 [HDX-1360] feat(app): number tile static color picker #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

  • 998ea5d: feat: Add option to fit time chart y-axis lower bound

  • ee90738: fix: Add sourceId to MCP Raw SQL Tile schema

  • 89949b1: Adding filters to dashboard exports. Implemented validation on dashboard imports to catch potential issues with generated JSON or manually tweaked JSON.

  • 8aad6d6: fix: unknown lucene field falls through in search

  • 747352f: feat: add direct_read optimization for filters

  • 750b8af: 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.

  • adac913: 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_searchclickstack_search), along with
    descriptions, prompts, error messages, and test references.

  • 81e524c: 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.

@hyperdx/hdx-eval@0.2.0

Minor Changes

  • 5bd1c68: 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.

@hyperdx/otel-collector@2.29.0

@vercel

vercel Bot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyperdx-oss Ready Ready Preview, Comment Jun 11, 2026 8:03am
hyperdx-storybook Ready Ready Preview, Comment Jun 11, 2026 8:03am

Request Review

@github-actions github-actions Bot force-pushed the changeset-release/main branch 2 times, most recently from 905736a to e55a29b Compare June 1, 2026 11:56
@github-actions github-actions Bot force-pushed the changeset-release/main branch from e55a29b to 3483c9b Compare June 1, 2026 12:57
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 3483c9b to 61212e6 Compare June 1, 2026 15:49
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 61212e6 to 8a6b93d Compare June 1, 2026 17:45
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 8a6b93d to dae12c6 Compare June 1, 2026 21:00
@github-actions github-actions Bot force-pushed the changeset-release/main branch from dae12c6 to c6c4bc4 Compare June 2, 2026 13:50
@github-actions github-actions Bot force-pushed the changeset-release/main branch from c6c4bc4 to 78ced46 Compare June 2, 2026 14:25
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 78ced46 to 47a828b Compare June 2, 2026 16:46
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 47a828b to d3f337e Compare June 2, 2026 18:06
@github-actions github-actions Bot force-pushed the changeset-release/main branch from b382b22 to 5b2430f Compare June 3, 2026 17:07
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 5b2430f to 3174214 Compare June 4, 2026 12:24
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 3174214 to 96b87f1 Compare June 4, 2026 15:01
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 96b87f1 to 4c6a220 Compare June 4, 2026 15:12
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 4c6a220 to e45fa2f Compare June 4, 2026 17:38
@github-actions github-actions Bot force-pushed the changeset-release/main branch from e45fa2f to 904049f Compare June 4, 2026 18:21
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 904049f to eac40dc Compare June 4, 2026 19:16
@github-actions github-actions Bot force-pushed the changeset-release/main branch from eac40dc to 49af301 Compare June 4, 2026 20:30
@github-actions github-actions Bot force-pushed the changeset-release/main branch from 49af301 to 6f70379 Compare June 4, 2026 21:56
@greptile-apps

greptile-apps Bot commented Jun 5, 2026

Copy link
Copy Markdown

Greptile Summary

This is an automated Changesets release PR bumping @hyperdx/api, @hyperdx/app, and @hyperdx/otel-collector from 2.28.02.29.0, @hyperdx/common-utils from 0.20.00.21.0, and @hyperdx/hdx-eval from 0.1.00.2.0. All .changeset/*.md files are consumed, CHANGELOGs updated, and the CODE_VERSION/IMAGE_VERSION_SUB_TAG in .env updated to match.

  • Version bumps: package.json, yarn.lock, and .env all updated consistently to 2.29.0/0.21.0/0.2.0 with no stray mismatches.
  • Notable included changes: MongoDB unique index on accessKey (potential startup risk on duplicate data), MCP tool rename from hyperdx_clickstack_, chart palette token rename, new Browser RUM dashboard template, and several MCP tooling improvements.
  • No source code is modified in this PR — only release metadata files.

Confidence Score: 5/5

Safe to merge — all changes are release metadata generated by Changesets with no source code modifications.

The PR contains only version bumps, CHANGELOG entries, consumed changeset files, a .env version tag update, and a yarn.lock refresh. All version numbers are consistent across package.json, yarn.lock, and .env. No application logic is changed here.

No files require special attention. The MongoDB unique-index caveat noted in the api CHANGELOG was already flagged in a prior review thread.

Important Files Changed

Filename Overview
.env Version tags updated from 2.28.0 → 2.29.0; no secrets or sensitive values present
packages/api/package.json Version bumped to 2.29.0; common-utils dependency updated to ^0.21.0
packages/app/package.json Version bumped to 2.29.0; common-utils dependency updated to ^0.21.0
packages/common-utils/package.json Version bumped from 0.20.0 to 0.21.0
packages/api/CHANGELOG.md New 2.29.0 changelog entries generated by Changesets; documents all included minor/patch changes
packages/app/CHANGELOG.md New 2.29.0 changelog entries for app package covering UI, MCP, and chart changes
yarn.lock common-utils version range references updated from ^0.20.0 to ^0.21.0 consistently across all workspace consumers

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    CS[Changesets Action] --> PR[Release PR #2378]
    PR --> V[Version Bumps]
    PR --> CL[CHANGELOG Updates]
    PR --> DEL[Delete .changeset files]

    V --> API[api 2.28.0 → 2.29.0]
    V --> APP[app 2.28.0 → 2.29.0]
    V --> CU[common-utils 0.20.0 → 0.21.0]
    V --> EVAL[hdx-eval 0.1.0 → 0.2.0]
    V --> OTEL[otel-collector 2.28.0 → 2.29.0]
    V --> ENV[.env CODE_VERSION 2.28.0 → 2.29.0]

    API --> NPM[npm publish]
    APP --> NPM
    CU --> NPM
    EVAL --> NPM
Loading

Reviews (17): Last reviewed commit: "chore(release): bump HyperDX app/package..." | Re-trigger Greptile

Comment thread packages/api/CHANGELOG.md

### 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing pre-upgrade mitigation guidance for MongoDB unique index

The changelog correctly warns that adding a unique index on accessKey in the User model "could cause startup failures if any existing users share duplicate accessKey values," but it provides no remediation path. Operators upgrading a production instance with duplicate accessKey documents in MongoDB will experience a hard startup failure with no documented way to recover (e.g., no shell command to detect duplicates beforehand or deduplicate them). Consider adding a pre-upgrade check command — something like db.users.aggregate([{$group:{_id:"$accessKey",count:{$sum:1}}},{$match:{count:{$gt:1}}}]) — to the release notes or a migration guide so operators can verify their data before applying this version.

Fix in Claude Code Fix in Conductor Fix in Cursor Fix in Codex

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants