Commit graph

929 commits

Author SHA1 Message Date
github-actions[bot]
0325416235
Release HyperDX (#1224)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-22 16:13:54 +02:00
Mike Shi
5d50e0ad12
fix: dont show ai assistant if no anthropic api key exists (#1286)
<img width="1446" height="339" alt="image" src="https://github.com/user-attachments/assets/a0dbaff7-1238-4522-8d9b-56ce1501021a" />
2025-10-22 12:04:21 +00:00
Warren
131a1c1edb
revert: api esbuild (#1280)
This PR reverts https://github.com/hyperdxio/hyperdx/pull/937

Ref: HDX-2620
2025-10-21 09:27:47 +00:00
Nguyen Dat
b806116d73
feat: add subpath config (#1236)
Co-authored-by: Warren <5959690+wrn14897@users.noreply.github.com>
2025-10-17 14:43:58 -07:00
Tom Alexander
658728318b
fix: Preserve original select from time chart event selection (#1277)
FIxes: HDX-2606
2025-10-17 16:57:01 +00:00
Drew Davis
6262ced8ce
fix: Fix crash when navigating away from chart explorer search page (#1278) 2025-10-17 11:16:47 -04:00
Tom Alexander
065cabdb47
fix: Update "Copy Object" in line viewer to work with nested objects and arrays (#1274)
Fixes: HDX-2617
2025-10-16 16:55:22 +00:00
Drew Davis
4cfbd7579c
chore: Cleanup warnings in unit tests (#1273)
This PR fixes the following warnings from our unit tests, which were cluttering up the output:

- The regex warning is fixed by removing the /g global flag from element selectors
- The deprecation warning is fixed by the package upgrade

<img width="1156" height="184" alt="Screenshot 2025-10-16 at 9 06 57 AM" src="https://github.com/user-attachments/assets/37b6c408-e453-4fb8-baf9-323bbd79e53c" />
<img width="1445" height="191" alt="Screenshot 2025-10-16 at 9 06 50 AM" src="https://github.com/user-attachments/assets/71388182-5e4f-42c1-ae18-026c8d963e1f" />
2025-10-16 16:48:48 +00:00
Drew Davis
3c8f3b54c7
fix: Include connectionId in metadata cache key (#1272)
Closes HDX-2573

This PR adds connection ID to the metadata cache key, to ensure that metadata is not shared across tables with the same name in different connections.

For example, previously when switching between otel_logs tables in different connections, filter values would not reload:

https://github.com/user-attachments/assets/d3edb243-4564-438f-9fec-c400fdfbd5b3

Now they will:

https://github.com/user-attachments/assets/19b0f022-8e30-412e-8a06-3d9812794219
2025-10-16 15:39:49 +00:00
Tom Alexander
3d832ad787
chore: Update claude gh action to encourage shorter reviews (#1275) 2025-10-16 15:02:23 +00:00
Drew Davis
2d27fe27c1
fix: Support JSON keys in dashboard filters (#1271) 2025-10-16 08:14:57 -04:00
Drew Davis
2dc0079b08
feat: Sort dashboard filter values (#1270)
Closes HDX-2581

Dashboard filter options are now sorted alphabetically.
2025-10-15 19:13:31 +00:00
Warren
348a4044e8
migration: migrate to Pino (logger) (#1269)
Summary

  Migrates the HyperDX API and related services from Winston to Pino for standardized,
  faster, and more structured logging with improved OpenTelemetry integration.

Changes

  Core Migration

  - Replaced Winston with Pino across all logging infrastructure
  - Upgraded @hyperdx/node-opentelemetry from v0.8.2 to v0.9.0 to support Pino
  transport
  - Removed deprecated dependencies:
    - winston and express-winston
    - @opentelemetry/host-metrics and @opentelemetry/sdk-metrics (consolidated into
  newer OTel SDK)
  - Added new dependencies:
    - pino and pino-http for core logging
    - pino-pretty for development console output

  Logger Configuration (packages/api/src/utils/logger.ts)

  Production:
  - Outputs stringified JSON to stdout via pino/file transport
  - Maintains HyperDX transport integration when API key is configured
  - Includes full OpenTelemetry trace context (trace_id, span_id, trace_flags)
 
<img width="830" height="184" alt="Screenshot 2025-10-14 at 4 31 36 PM" src="https://github.com/user-attachments/assets/82e60919-5c4d-4688-a6f5-d54632aef749" />


  Development:
  - Uses pino-pretty for human-readable, colorized console output
  - Hides verbose fields from console: pid, hostname, trace_id, span_id, trace_flags
  - HTTP request/response objects excluded from logs via custom serializers

<img width="825" height="350" alt="image" src="https://github.com/user-attachments/assets/64b293d8-bc95-4715-931a-dbf73483d247" />

  HTTP Logging:
  - Replaced express-winston with pino-http
  - Custom log levels based on HTTP status codes (warn for 4xx, error for 5xx+)
  - Simplified log messages: HTTP {method} {url}

  Error Logging Updates

  Updated error logging patterns throughout the codebase to follow Pino's structured
  logging conventions:

  // Before (Winston)
  logger.error('Error message:', error);

  // After (Pino)
  logger.error({ err: error }, 'Error message');


Ref: HDX-2588

This PR should also address issue: https://github.com/hyperdxio/hyperdx/issues/1035
2025-10-15 17:15:46 +00:00
Warren
43e32aafc7
feat: revisit Otel metrics semantic convention migration logics (#1267)
Since users can still switch to the new metric name using feature gate

Follow up https://github.com/hyperdxio/hyperdx/pull/1248
2025-10-14 22:06:31 +00:00
Tom Alexander
79af32e576
chore: Update claude.md with more linting instrucitons (#1268) 2025-10-14 21:32:55 +00:00
Drew Davis
c428d98412
fix: Set team and connection attributes on span instead of trace (#1266)
Closes HDX-2506

`setTraceAttributes` is not working (see HDX-2599), so for now we will replace it with span attributes, to ensure that we have some way of correlating alert job logs to teams.

<img width="492" height="209" alt="Screenshot 2025-10-14 at 4 07 36 PM" src="https://github.com/user-attachments/assets/46f9391e-e4c9-4a12-bc6b-a37d53ecadf6" />
2025-10-14 20:29:57 +00:00
Brandon Pereira
3332d5eaf5
Event Deltas Heatmap Customization (#1246)
Introduces the ability to edit the y, count, and group by values on the search event deltas heatmap allowing for deeper analysis

https://github.com/user-attachments/assets/1f4d7ca2-86be-424a-84de-23eccaf02a68

Fixes HDX-2422
2025-10-14 17:59:34 +00:00
Drew Davis
2f49f9be37
fix: ignore max_rows_to_read for filter values distribution (#1259) 2025-10-10 13:05:07 -04:00
Brandon Pereira
05ca6cebcb
chore: attempt to make claude update last comment instead of a new one (#1255) 2025-10-10 11:56:13 -04:00
Drew Davis
eef3cb54d2
fix: Keep k8s dashboard params up to date with defaulted sources (#1258) 2025-10-10 11:42:59 -04:00
Brandon Pereira
ec2ea566af
Improve Support for Dynamic and JSON(<parameters>) Types (#1251)
1. Improves getJSONColumnNames to support JSON type with arguments
2. Improves useRowWhere to support arrays and JSON types

How I tested this:
1. Created a new table and setup various types of formats (`JSON, JSON(max_dynamic_paths = 3, test_key String), Dynamic, Array(Tuple(test_key String, test_value Dynamic)), Map(String, Dynamic)`)
2. Reproduced exact scenario from tickt and fixed (`getJSONColumnNames`)
4. Clicked around the app with various other types, observed that `Dynamic` fields could not be clicked if they had JSON or Array formats. Fixed that (`useRowWhere`)
5. Added tests for changes, ensured existing tests worked for `Dynamuc` useRowWhere by reproducing them in app 

Fixes HDX-2523
2025-10-10 14:57:57 +00:00
Elizabet Oliveira
eaff49293c
Add copy-to-clipboard buttons in RawLogTable for log line data and URLs (#1227)
Co-authored-by: Mike Shi <mike@hyperdx.io>
2025-10-10 15:50:34 +01:00
Aaron Knudtson
dbf16827a3
feat: add refresh to existing preset dashboards (#1249)
Closes HDX-2046

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-09 20:18:20 +00:00
Drew Davis
daffcf3594
feat: Add percentages to filter values (#1250)
# Summary

Closes HDX-1960

This PR adds a button to our search filters component which can be used to show the _approximate_ percentage of rows which have each filter value.

https://github.com/user-attachments/assets/2dba1b28-d2b9-4414-986c-0c515d252c89

Notes:
- The percentages are based on a sample of 100k rows. The sampling is done similarly to how EE version samples logs for patterns.
- We only fetch the most common 100 values in the sample. All other values are assumed to represent <1% of the data.
- The percentages represent the distribution within the dataset after it has been filtered by the selected filters and the where clause.
- This is a potentially expensive query, even with sampling, so the percentages are only queried if they're toggled on for a particular filter, and do not refresh in live mode. They do refresh if the search or date ranges changes (outside of live mode).
2025-10-09 19:26:39 +00:00
Drew Davis
13b191c8a0
feat: Allow selection of log and metric source on K8s dashboard (#1245)
Closes HDX-1887

This change allows the user to select which log and metric sources the k8s dashboard should show. Previously, the user could only select a connection, and the first log and metric source in that connection would be used.

<img width="1756" height="1121" alt="Screenshot 2025-10-07 at 2 50 34 PM" src="https://github.com/user-attachments/assets/f6e4f375-1f8d-486c-8940-4ee2ac38b94d" />
2025-10-09 19:15:21 +00:00
Tom Alexander
4949748f99
chore: Add Claude Code GitHub Workflow (#1252)
## 🤖 Installing Claude Code GitHub App

This PR adds a GitHub Actions workflow that enables Claude Code integration in our repository.

### What is Claude Code?

[Claude Code](https://claude.ai/code) is an AI coding agent that can help with:
- Bug fixes and improvements  
- Documentation updates
- Implementing new features
- Code reviews and suggestions
- Writing tests
- And more!

### How it works

Once this PR is merged, we'll be able to interact with Claude by mentioning @claude in a pull request or issue comment.
Once the workflow is triggered, Claude will analyze the comment and surrounding context, and execute on the request in a GitHub action.

### Important Notes

- **This workflow won't take effect until this PR is merged**
- **@claude mentions won't work until after the merge is complete**
- The workflow runs automatically whenever Claude is mentioned in PR or issue comments
- Claude gets access to the entire PR or issue context including files, diffs, and previous comments

### Security

- Our Anthropic API key is securely stored as a GitHub Actions secret
- Only users with write access to the repository can trigger the workflow
- All Claude runs are stored in the GitHub Actions run history
- Claude's default tools are limited to reading/writing files and interacting with our repo by creating comments, branches, and commits.
- We can add more allowed tools by adding them to the workflow file like:

```
allowed_tools: Bash(npm install),Bash(npm run build),Bash(npm run lint),Bash(npm run test)
```

There's more information in the [Claude Code action repo](https://github.com/anthropics/claude-code-action).

After merging this PR, let's try mentioning @claude in a comment on any PR to get started!
2025-10-09 14:20:48 +00:00
Brandon Pereira
0cf179fa68
small typo fix in type (#1242)
Noticed this when resolving a conflict, should be `Chart` not `Chat` :P 

Fixes HDX-2553
2025-10-09 14:09:04 +00:00
Warren
5efa2ffa0d
feat: handle k8s metrics semantic convention updates (#1248)
Handle OpenTelemetry semantic versions based on the ScopeVersion field (metrics)
Related to [changes](https://opentelemetry.io/blog/2025/kubeletstats-receiver-metrics-deprecation/)

Old (switched to v0.137.0)
<img width="818" height="317" alt="image" src="https://github.com/user-attachments/assets/ceea52c6-ad06-4295-afae-a44f21b2e962" />

New (be able to handle multiple versions)
<img width="568" height="329" alt="image" src="https://github.com/user-attachments/assets/d2e282b2-cfd7-490a-a64d-502881a360a2" />


Ref: HDX-2322, HDX-2562
2025-10-08 21:04:40 +00:00
Dan Hable
c90a93e6c3
fix(alerts): bump cron package to pick up stalled job fix (#1244)
Ref: https://github.com/kelektiv/node-cron/issues/962
2025-10-07 21:39:48 +00:00
Mike Shi
b8efb4924c
chart ai assistant (#1243) 2025-10-07 14:47:10 -04:00
Brandon Pereira
b34480411e
Log Results Sorting (#1232) 2025-10-07 09:35:42 -06:00
Drew Davis
b46ae2f204
fix: Fix sidebar when selecting JSON property (#1231)
Closes HDX-2042
Closes HDX-2524
Closes HDX-2307
Closes #1010

# Summary

This PR fixes errors that occurred when attempting to open the sidebar by clicking a log table row using a JSON logs table schema.

The error was caused by `node-sql-parser` throwing exceptions when parsing SQL with JSON Expressions, resulting in HyperDX being unable to extract aliases from the SQL. In the long term, we'll want to have a true ClickHouse SQL parser. In the short term, this is fixed by:

1. Finding and replacing all JSON expressions in the sql with placeholder tokens, prior to parsing with node-sql-parser
2. Parsing with node-sql-parser to find aliases correctly
3. Replacing the placeholder tokens with the original JSON expressions

## Testing

(All of the following use a JSON schema)

### Before

<details>
<summary>When selecting a JSON column with an alias</summary>
<img width="1126" height="96" alt="Screenshot 2025-10-01 at 2 28 19 PM" src="https://github.com/user-attachments/assets/c35ed870-9986-4b30-9890-e1ca8ff6c92c" />
<img width="372" height="142" alt="Screenshot 2025-10-01 at 2 28 06 PM" src="https://github.com/user-attachments/assets/d65fdce4-6625-4308-b5d0-6f845a0f2f05" />
</details>

<details>
<summary>When filtering by a JSON column and using an alias on a non-JSON property</summary>
<img width="800" height="103" alt="Screenshot 2025-10-01 at 2 29 44 PM" src="https://github.com/user-attachments/assets/aa7faabb-316b-4103-8840-74ac08519efb" />
<img width="372" height="142" alt="Screenshot 2025-10-01 at 2 28 06 PM" src="https://github.com/user-attachments/assets/eb86cce5-eee4-40f9-af93-2451bff32444" />
</details>

### After


<details>
<summary>When selecting a JSON column with an alias</summary>
<img width="1126" height="96" alt="Screenshot 2025-10-01 at 2 28 19 PM" src="https://github.com/user-attachments/assets/678ba290-5215-4cc5-8fee-1bf67955aaa2" />
<img width="725" height="696" alt="Screenshot 2025-10-01 at 2 30 42 PM" src="https://github.com/user-attachments/assets/5da48109-a0cd-4b5f-a5e3-bd700116d81b" />
</details>

<details>
<summary>When filtering by a JSON column and using an alias on a non-JSON property</summary>
<img width="800" height="103" alt="Screenshot 2025-10-01 at 2 29 44 PM" src="https://github.com/user-attachments/assets/715de816-639e-4ffd-9e09-341bd0b2ee4a" />
<img width="1271" height="888" alt="Screenshot 2025-10-01 at 2 30 24 PM" src="https://github.com/user-attachments/assets/b3b766de-be70-4161-b9ca-8aae9330b5f2" />
</details>
2025-10-06 20:52:55 +00:00
Dan Hable
f4c352393d
feat(alert): allow defining ClickHouse request timeout (#1239)
Provides support for defining the ClickHouse client request timeout from a command line arg. Uses a default value of 30 seconds if the argument is not defined.

Refactors the task arg validation and parsing to leverage zod now that we have more than a few parameters.
2025-10-06 17:47:25 +00:00
Brandon Pereira
1ed32e432e
fix issue where new lines are not persisted to url params correctly (#1229)
If I try to create a multi-line where statement in the UI, it does not persist the new line character, which leads to errors as well.

Fixes HDX-2527
2025-10-06 15:18:32 +00:00
Brandon Pereira
b68a4c9b16
ensure that only one limit is used on query (#1221) 2025-10-06 08:51:37 -06:00
Drew Davis
62eddcf20a
fix: Prevent non-windowed searches from querying infinitely (#1235)
Fixes HDX-2548

This PR fixes an issue causing non-windowed searches to query the entire date range infinitely.

## Before

https://github.com/user-attachments/assets/13daed15-b862-4b12-95d4-43a88ecabade

## After

https://github.com/user-attachments/assets/058e6da8-1b2a-47e4-80ac-70ce76615a2f
2025-10-03 02:14:05 +00:00
Aaron Knudtson
5210bb86a4
refactor: table connections standardized and single by default. Special case for dashboard (#1195)
Closes HDX-2469
2025-10-02 21:33:53 +00:00
Brandon Pereira
1cda1485ed
Fixes inability to scroll in the TimePicker component (#1234) 2025-10-02 14:59:54 -06:00
Drew Davis
35c4222263
fix: Improve parsing of complex table keys (#1226)
Closes HDX-2528

# Summary

This PR fixes errors caused by naive parsing of complex partition and primary keys. With this change, we parse primary and partition keys using node-sql-parser to extract lists of referenced columns, rather than splitting on commas.

## Testing

Beyond the unit tests, I also tested with the following table in ClickHouse

<details>
<summary>Table Schema</summary>

```sql
CREATE TABLE default.otel_logs_complex_pk
(
    `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)),
    `TimestampTime` DateTime DEFAULT toDateTime(Timestamp),
    `TraceId` String CODEC(ZSTD(1)),
    `SpanId` String CODEC(ZSTD(1)),
    `TraceFlags` UInt8,
    `SeverityText` LowCardinality(String) CODEC(ZSTD(1)),
    `SeverityNumber` UInt8,
    `ServiceName` LowCardinality(String) CODEC(ZSTD(1)),
    `Body` String CODEC(ZSTD(1)),
    `ResourceSchemaUrl` LowCardinality(String) CODEC(ZSTD(1)),
    `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `ScopeSchemaUrl` LowCardinality(String) CODEC(ZSTD(1)),
    `ScopeName` String CODEC(ZSTD(1)),
    `ScopeVersion` LowCardinality(String) CODEC(ZSTD(1)),
    `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.cluster.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.cluster.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.container.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.container.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.deployment.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.deployment.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.namespace.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.namespace.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.node.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.node.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.pod.name` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.pod.name'] CODEC(ZSTD(1)),
    `__hdx_materialized_k8s.pod.uid` LowCardinality(String) MATERIALIZED ResourceAttributes['k8s.pod.uid'] CODEC(ZSTD(1)),
    `__hdx_materialized_deployment.environment.name` LowCardinality(String) MATERIALIZED ResourceAttributes['deployment.environment.name'] CODEC(ZSTD(1)),
    INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1,
    INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_lower_body lower(Body) TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 8
)
ENGINE = MergeTree
PARTITION BY toStartOfInterval(Timestamp, toIntervalDay(3))
PRIMARY KEY (toStartOfInterval(Timestamp, toIntervalDay(3)), TimestampTime, dateDiff('day', Timestamp, Timestamp + toIntervalDay(1)))
ORDER BY (toStartOfInterval(Timestamp, toIntervalDay(3)), TimestampTime, dateDiff('day', Timestamp, Timestamp + toIntervalDay(1)))
SETTINGS index_granularity = 8192;
```

</details>

 The search page loads
 The timestamp column is inferred when adding the source
 rowWhere / row selection works and is persisted in the URL
2025-10-01 18:19:51 +00:00
Brandon Pereira
e032af5509
attempt to ensure otel collector logs go to stdout (#1228) 2025-10-01 11:51:24 -06:00
Drew Davis
bd940f300f
style: Improve dashboard filter modal UX (#1215)
Closes HDX-2502

# Summary

This PR improves the Dashboard Filter Modal UX.

## Before

https://github.com/user-attachments/assets/39a6f17e-fc76-42fc-a288-8a1c2d1949fa

## After

https://github.com/user-attachments/assets/8d6f0183-9de9-4401-be99-902293b86878



Co-authored-by: Elizabet Oliveira <2750668+elizabetdev@users.noreply.github.com>
2025-09-30 14:43:04 +00:00
Elizabet Oliveira
730325a5cc
feat: enhance SourceSchemaPreview button integration in select components (#1223) 2025-09-30 15:22:45 +01:00
github-actions[bot]
fb1b035630
Release HyperDX (#1197)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-29 16:05:02 -07:00
Drew Davis
77d0e56f5c
chore: Add spans for alert processing (#1219)
Closes HDX-2506

# Summary

This PR adds a span for each task (of any kind) and each alert processing loop (one per connection), with provider, team, and connection span attributes. When ported to Cloud, this will allow us to more easily determine which team logs are coming from.

<img width="1492" height="105" alt="Screenshot 2025-09-29 at 1 04 20 PM" src="https://github.com/user-attachments/assets/2eed25fc-32b3-48b2-b7f0-24ffe0beab18" />
<img width="1449" height="148" alt="Screenshot 2025-09-29 at 1 04 17 PM" src="https://github.com/user-attachments/assets/1b8d6acc-df90-4048-96db-2b2dc2bc2d63" />
<img width="515" height="213" alt="Screenshot 2025-09-29 at 1 04 12 PM" src="https://github.com/user-attachments/assets/061f366f-24ac-4195-9b72-3f1b5a871e36" />
2025-09-29 20:20:36 +00:00
Dan Hable
1ed4fbf864
fix: simplify alert provider load logic (#1220)
Dynamic module resolution causes issues in builds that use tools like esbuild; resulting paths are often not the same as they would in the source tree. Instead we can simplify the loading logic to use a defined object map of names to constructor functions. The mapping object should be small enough that merge conflicts with forks should be easy to resolve.
2025-09-29 19:30:02 +00:00
Dan Hable
270c6b4f96
chore: additional logging around task execution (#1217) 2025-09-29 15:59:58 +00:00
Tom Alexander
7837a621d8
fix: Multiline support for WHERE Input boxes (#1208)
Co-authored-by: Brandon Pereira <brandon-pereira@users.noreply.github.com>
2025-09-29 09:55:14 -06:00
Aaron Knudtson
a8418f691b
fix: broken query due to semicolon in subquery (#1216)
Fixes HDX-2515
2025-09-29 15:18:34 +00:00
Mike Shi
54d30b92f5
feat: Add support for filter by parsed JSON string (#1213)
Resolves HDX-1983

<img width="646" height="242" alt="image" src="https://github.com/user-attachments/assets/376c0e02-73b9-49e3-96f8-ebb3475a7e82" />
2025-09-27 16:14:03 +00:00
Drew Davis
6c8efbcb56
feat: Add Dashboard filters (#1207)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2025-09-26 14:08:57 -04:00