Skip to content

feat: add clickable links for routing rule, selected key, virtual key, and prompt in log detail views - #4054

Merged
akshaydeo merged 13 commits into
devfrom
06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters
Jun 5, 2026
Merged

feat: add clickable links for routing rule, selected key, virtual key, and prompt in log detail views#4054
akshaydeo merged 13 commits into
devfrom
06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters

Conversation

@impoiler

@impoiler impoiler commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Several metadata fields in the log detail views were plain text with no way to navigate to related records. This PR converts those static values into clickable links that filter or navigate to the relevant views, making it faster to investigate related logs without manually applying filters.

Changes

  • Routing rule name in the log detail header and details section now links to /workspace/logs filtered by that routing rule ID
  • Selected Key in the log detail header and details section now links to /workspace/logs filtered by that key ID
  • Virtual Key in both the LLM log detail view and MCP log detail sheet now links to /workspace/governance/virtual-keys with the key pre-selected
  • Selected Prompt now links to /workspace/prompt-repo
  • Parent Request ID and User links updated to use consistent text-blue-600 styling instead of text-primary
  • MCP log detail sheet: Tool Name links to MCP logs filtered by tool name, Server label links to MCP logs filtered by server label, and LLM Request ID links directly to the corresponding log entry
  • Minor formatting fixes to indentation and empty catch blocks for consistency

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (React)
  • Docs

How to test

  1. Open a log entry in the log detail sheet that has a routing rule, selected key, virtual key, or selected prompt associated with it.
  2. Verify each field renders as a clickable link styled in blue.
  3. Click the routing rule link — confirm the logs view opens filtered to that routing rule.
  4. Click the selected key link — confirm the logs view opens filtered to that key.
  5. Click the virtual key link — confirm navigation to the virtual keys governance page with the key selected.
  6. Open an MCP log detail sheet with a tool name, server label, virtual key, and LLM request ID.
  7. Verify each field is a clickable link navigating to the appropriate filtered view.
cd ui
pnpm i || npm i
pnpm build || npm run build

Screenshots/Recordings

Before: Routing rule, key, and other metadata fields displayed as plain text.
After: All metadata fields are styled blue links that navigate to filtered or related views on click.

Breaking changes

  • Yes
  • No

Related issues

Security considerations

All links use internal TanStack Router navigation with typed search parameters. No external URLs, secrets, or PII are exposed beyond what was already visible in the detail view.

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@impoiler, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 10 minutes and 35 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 13a606d3-3a37-4c04-be92-1e2c59e7dcb8

📥 Commits

Reviewing files that changed from the base of the PR and between 5ac2b1e and 748d230.

📒 Files selected for processing (2)
  • ui/app/workspace/logs/sheets/logDetailView.tsx
  • ui/app/workspace/mcp-logs/views/mcpLogDetailsSheet.tsx
📝 Walkthrough

Walkthrough

LogDetailView and mcpLogDetailsSheet UI components were updated to make various details values navigatable via React Router Links. Header and grid detail items now link to filtered log views with appropriate search parameters. Supporting changes include import reorganization, JSON formatting refactors, token rendering updates, and defensive null-checking for message filtering.

Changes

Log Detail View Navigation Refactor

Layer / File(s) Summary
Utility formatting and defensive filtering
ui/app/workspace/logs/sheets/logDetailView.tsx
Import reorganization for formatCompactNumber, JSON error handling formatting for passthrough parameters and plugin logs, token rendering refactor for reasoning tokens, routing decision logs styling adjustment, and defensive message filtering to skip nullish entries before computing role visibility.
Header navigation elements
ui/app/workspace/logs/sheets/logDetailView.tsx
Routing rule, rule, and key fields in the header converted from static badges to Links to /workspace/logs with appropriate search parameters; parent request ID styling updated with blue underline/hover behavior.
Details grid navigation
ui/app/workspace/logs/sheets/logDetailView.tsx
Selected key, selected prompt, virtual key, and routing rule detail grid values converted from static text/badges to Links with route destinations; user filter link styling updated; all new links include data-testid attributes.
MCP logs request details navigation
ui/app/workspace/mcp-logs/views/mcpLogDetailsSheet.tsx
TanStack Router Link import added; Tool Name, Server, Virtual Key (conditional), and LLM Request ID (conditional) fields in Request Details converted from static displays to navigable links with destinations to /workspace/mcp-logs, /workspace/governance/virtual-keys, and /workspace/logs respectively, including search parameters and data-testids.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • maximhq/bifrost#3336: Overlaps in logDetailView.tsx token and reasoning-token rendering logic, though that PR adds realtime token breakdown while this one refactors the conditional rendering structure.

Suggested reviewers

  • danpiths
  • akshaydeo

Poem

🐰 Details now dance with router's graceful hand,
Links bloom where badges stood in static land,
Filtering flows through filter-friendly seams,
Defensive guards catch nulls in reasoning's dreams,
Navigation sewn with care and curious gleams! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The linked issue #123 is about Files API support for providers, which is completely unrelated to the UI changes for making log detail sheet entities clickable for filtering. Either link the correct issue(s) related to the log detail sheet filtering feature, or remove the unrelated Files API Support issue and clarify the actual requirements this PR addresses.
Out of Scope Changes check ⚠️ Warning The PR changes focus on making log detail entities clickable for filtering in two UI files, which aligns with the PR title, but the linked issue concerns Files API support—a completely different feature domain. Link the correct issue(s) that describe the log filtering feature, or clarify whether all changes are in scope for the Files API Support issue.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main changes: making filterable entities (routing rule, selected key, virtual key, prompt) clickable links in log detail views across both logDetailView and mcpLogDetailsSheet components.
Description check ✅ Passed The PR description comprehensively addresses all required template sections including summary, detailed changes, type of change, affected areas, testing steps, security considerations, and breaking changes confirmation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters

Comment @coderabbitai help to get the list of available commands and usage tips.

impoiler commented Jun 4, 2026

Copy link
Copy Markdown
Contributor Author

@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from bf03ec6 to 6bc8c5f Compare June 4, 2026 12:07
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from a9dd86a to 32760c5 Compare June 4, 2026 12:07
@impoiler impoiler self-assigned this Jun 4, 2026
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from 6bc8c5f to 75b9000 Compare June 4, 2026 13:11
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from 32760c5 to 0bcaf0c Compare June 4, 2026 13:11
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from 75b9000 to 03716d7 Compare June 4, 2026 14:31
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from 0bcaf0c to b8fd252 Compare June 5, 2026 04:53
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch 2 times, most recently from b5e111e to 5ac2b1e Compare June 5, 2026 04:54
@roroghost17
roroghost17 marked this pull request as ready for review June 5, 2026 09:50
@greptile-apps

greptile-apps Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

Safe to merge — changes are purely additive UI links with no mutations, and all target routes and search param names match existing page implementations.

Every new link was verified to use a search param name that the destination page already reads (e.g. routing_rule_ids, selected_key_ids, tool_names, server_labels, selected_vk, selected_log). No existing data-testid attributes are removed — only new ones are added. The selected_key_id nullability edge case was flagged in a prior review thread and is the only non-trivial concern; no new issues were introduced in these changes.

No files require special attention.

Important Files Changed

Filename Overview
ui/app/workspace/logs/sheets/logDetailView.tsx Converts routing rule, selected key, virtual key, and selected prompt text fields to TanStack Router Link components using correct URL search params; adds data-testid attributes; minor formatting fixes
ui/app/workspace/mcp-logs/views/mcpLogDetailsSheet.tsx Converts tool name, server label, virtual key, and LLM request ID fields to Link components; all target routes and search param names verified against route definitions

Reviews (3): Last reviewed commit: "chore: Make the filterable entity in log..." | Re-trigger Greptile

Comment thread ui/app/workspace/logs/sheets/logDetailView.tsx
@impoiler impoiler changed the title chore: Make the filterable entity in log detail sheets clickable for filters feat: add clickable links for routing rule, selected key, virtual key, and prompt in log detail views Jun 5, 2026
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from 3905d3b to d99a1d8 Compare June 5, 2026 13:48
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from 5ac2b1e to 45487db Compare June 5, 2026 13:48
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from 45487db to f239b91 Compare June 5, 2026 13:51
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from d99a1d8 to c5c59b3 Compare June 5, 2026 13:51
@impoiler
impoiler force-pushed the 06-04-fix_governance_pages_layout branch from c5c59b3 to ffefed9 Compare June 5, 2026 13:53
@impoiler
impoiler force-pushed the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch from f239b91 to 748d230 Compare June 5, 2026 13:53
@CLAassistant

CLAassistant commented Jun 5, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

akshaydeo commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Merge activity

  • Jun 5, 2:00 PM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Jun 5, 2:14 PM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo
akshaydeo changed the base branch from 06-04-fix_governance_pages_layout to graphite-base/4054 June 5, 2026 14:13
@akshaydeo
akshaydeo changed the base branch from graphite-base/4054 to dev June 5, 2026 14:13
@akshaydeo
akshaydeo merged commit 2b29a69 into dev Jun 5, 2026
9 of 10 checks passed
@akshaydeo
akshaydeo deleted the 06-04-chore_make_the_filterable_entity_in_log_detail_sheets_clickable_for_filters branch June 5, 2026 14:14
@akshaydeo akshaydeo mentioned this pull request Jun 7, 2026
akshaydeo pushed a commit that referenced this pull request Jun 7, 2026
…, and prompt in log detail views (#4054)

## Summary

Several metadata fields in the log detail views were plain text with no way to navigate to related records. This PR converts those static values into clickable links that filter or navigate to the relevant views, making it faster to investigate related logs without manually applying filters.

## Changes

- Routing rule name in the log detail header and details section now links to `/workspace/logs` filtered by that routing rule ID
- Selected Key in the log detail header and details section now links to `/workspace/logs` filtered by that key ID
- Virtual Key in both the LLM log detail view and MCP log detail sheet now links to `/workspace/governance/virtual-keys` with the key pre-selected
- Selected Prompt now links to `/workspace/prompt-repo`
- Parent Request ID and User links updated to use consistent `text-blue-600` styling instead of `text-primary`
- MCP log detail sheet: Tool Name links to MCP logs filtered by tool name, Server label links to MCP logs filtered by server label, and LLM Request ID links directly to the corresponding log entry
- Minor formatting fixes to indentation and empty catch blocks for consistency

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [x] UI (React)
- [ ] Docs

## How to test

1. Open a log entry in the log detail sheet that has a routing rule, selected key, virtual key, or selected prompt associated with it.
2. Verify each field renders as a clickable link styled in blue.
3. Click the routing rule link — confirm the logs view opens filtered to that routing rule.
4. Click the selected key link — confirm the logs view opens filtered to that key.
5. Click the virtual key link — confirm navigation to the virtual keys governance page with the key selected.
6. Open an MCP log detail sheet with a tool name, server label, virtual key, and LLM request ID.
7. Verify each field is a clickable link navigating to the appropriate filtered view.

```sh
cd ui
pnpm i || npm i
pnpm build || npm run build
```

## Screenshots/Recordings

Before: Routing rule, key, and other metadata fields displayed as plain text.
After: All metadata fields are styled blue links that navigate to filtered or related views on click.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

All links use internal TanStack Router navigation with typed search parameters. No external URLs, secrets, or PII are exposed beyond what was already visible in the detail view.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akshaydeo added a commit that referenced this pull request Jun 7, 2026
## ✨ Features

- **OpenAI Compaction** — Added OpenAI conversation compaction support
across core, framework, logging, and the API surface (#4053)
- **Multi-Customer & Org Hierarchy** — Logs and usage tracking now
support multiple customers, teams, and business units, including
business unit CRUD, team assignment, and governance endpoints in the
OpenAPI spec (#4066, #4041, #4082)
- **Provider-Level Governance** — Budgets & limits are now scope-aware
and can be applied at the virtual-key top level and per provider, wired
from the model configs table, with UI filters for scope and providers
(#3938, #3937, #3939, #3981, #3962)
- **Customer Budgets** — Customers support multiple budgets and
`calendar_aligned` budget windows (#3998, #3997)
- **Virtual Key Attribution & Controls** — Added a `created_by` user
attribution column and a `blacklisted_models` column for virtual key
provider configs (#3672, #3653)
- **Request Header Capture** — OTel and Maxim observability plugins
capture `request_headers` by pattern, with wildcard support (e.g.
`x-custom-*`); logging gained the same wildcard header capture (#4012,
#3958)
- **OTel Content Controls & Collectors** — New `disable_content_logging`
option drops message/tool content from exported spans, plus support for
multiple OTel collectors (#4064, #3894)
- **xAI x_search** — Added xAI `x_search` tool support (#3976)
- **URL Validation** — Added fetch URL validation with private-network
configuration and link-local blocking (#3947, #3991)
- **File Scheme Pricing URLs** — Pricing source URLs now accept the
`file://` scheme for air-gapped and self-hosted deployments (#4045)
- **Paginated Virtual Keys** — Virtual key fetching is paginated to
handle deployments with very large numbers of keys (#3957)
- **Client IP Resolution** — Resolve client IP from
`X-Forwarded-For`/`X-Real-IP` headers
- **SCIM Provisioning** — Added `attributeType`/`attributeValue` SCIM
provisioning fields
- **Helm/Config Schema** — Added `roles` RBAC governance config and
`per_user_oauth` MCP auth to the Helm chart and config schema (#4004,
#4009)
- **Log Navigation UI** — Added a "View logs" menu item to customer,
team, and virtual key tables, clickable links in log detail views, a
customer detail sheet, and a reusable `BudgetDisplay` component (#4073,
#4054, #4026, #4055)
- **Faster First Paint** — Added an inline loading shell to `#root`
before React mounts (#4063)
- **Materialized View Alias** — Added an `alias` column to the
materialized view with filter support (#4078)

## 🐞 Fixed

- **Fetch URL IP Checks** — Hardened fetch URL IP checks against SSRF
(#4092)
- **Mantle Model Matching** — Broadened Mantle model matching to all
`gpt` variants (#4091)
- **Empty Thinking Blocks** — Strip thinking blocks when the signature
is empty (#4079)
- **OpenAI Stream Usage** — Removed usage from the `responses.created`
event in the OpenAI stream (#4080)
- **Prompt Cache Key** — Set the prompt cache key from the Anthropic
integration (#4086)
- **Upstream Failure Status** — Map upstream connection failures to 502
instead of 400 (#3929) (thanks
[@chris-colinsky](https://github.com/chris-colinsky)!)
- **Gemini Schema Constraints** — Accept numeric schema integer
constraints for Gemini (#3994) (thanks
[@yanhao98](https://github.com/yanhao98)!)
- **Files Provider Param** — Accept the `?provider=` query param on `GET
/v1/files` (#3971) (thanks [@alexef](https://github.com/alexef)!)
- **Optional Batch Model** — Made the `model` field optional on `POST
/v1/batches` (#3973) (thanks [@alexef](https://github.com/alexef)!)
- **Helm Azure Config** — Added missing `azure_key_config` fields to the
Helm schema (#3996) (thanks
[@axelray-dev](https://github.com/axelray-dev)!)
- **Text Completion Chunk Model** — Added the missing `Model` field to
`TextCompletionChunkResponse` (#3970) (thanks
[@kuishou68](https://github.com/kuishou68)!)
- **MCP Inline stdio Env** — MCP stdio server configs accept inline
environment variable assignments (#3861) (thanks
[@Shushmitaaaa](https://github.com/Shushmitaaaa)!)
- **Orphaned Tool Results** — Orphaned tool results in the OpenAI to
Anthropic conversion flow are no longer rejected by the Anthropic API
(#3919)
- **Node Usage Reconciliation** — Added a monotonic `inc_number` log
cursor so node usage reconciliation does not skip late async log writes
(#3664)
- **Bedrock Output Assessments** — Corrected the type of
`outputAssessments` in Bedrock responses (#4028)
- **Model Pool Pricing Reloads** — Preserve non-pricing model pool
entries across pricing reloads (#3999)
- **Ghost Node Reconciliation** — Replicate the VK hierarchy flow for
ghost node reconciliation (#4088)
- **VK Double Usage Counting** — Fixed double usage counting when
creating a virtual key (#4070)
- **Model Config Lifecycle** — Cascade deletes for model configs and
removal of stale in-memory model configs (#4051, #4043)
- **FTS Index Cap** — Reduced the FTS index `left()` cap from 800k to
250k chars to stay within the tsvector limit (#4057)
- **Sync Worker Drift** — Reduced the sync worker ticker period to 5m to
prevent threshold drift (#4023)
- **Passthrough** — Fixed passthrough budgets, gated passthrough models
per VK, model extraction for Azure passthrough, and restricted
fallbacks/provider selection to the VK boundary (#3941, #3988, #3983,
#3924)
- **Provider Response Headers** — Strip provider response headers and
add a content-type filter (#3955, #4024)
- **Stream Handling** — Drain non-SSE stream readers and retry stale
connections (#3956, #3967)
- **Azure Claude** — Strip Azure diagnostic property for Claude models
(#3925)
- **Compat max_tokens** — Preserve chat `max_tokens` during param
filtering (#3992)
- **Raw Request Flag** — Removed the raw request flag from providers
that don't support it (#4058)
- **UI Fixes** — Standardized page container layout, virtual key model
configs UI, and dashboard chart tooltips (#4046, #4052, #4044)

## 🔧 Maintenance

- **Dependency Upgrades** — Bumped transitive `golang.org/x`
dependencies (crypto, net, sys, text) for Docker Scout CVE remediation
and `recharts` to 3.8.1; cascaded version bumps across all modules
(#3900, #4003)
@coderabbitai coderabbitai Bot mentioned this pull request Jun 9, 2026
18 tasks
akhsaul pushed a commit to akhsaul/bifrost that referenced this pull request Aug 27, 2026
…, and prompt in log detail views (maximhq#4054)

## Summary

Several metadata fields in the log detail views were plain text with no way to navigate to related records. This PR converts those static values into clickable links that filter or navigate to the relevant views, making it faster to investigate related logs without manually applying filters.

## Changes

- Routing rule name in the log detail header and details section now links to `/workspace/logs` filtered by that routing rule ID
- Selected Key in the log detail header and details section now links to `/workspace/logs` filtered by that key ID
- Virtual Key in both the LLM log detail view and MCP log detail sheet now links to `/workspace/governance/virtual-keys` with the key pre-selected
- Selected Prompt now links to `/workspace/prompt-repo`
- Parent Request ID and User links updated to use consistent `text-blue-600` styling instead of `text-primary`
- MCP log detail sheet: Tool Name links to MCP logs filtered by tool name, Server label links to MCP logs filtered by server label, and LLM Request ID links directly to the corresponding log entry
- Minor formatting fixes to indentation and empty catch blocks for consistency

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [x] UI (React)
- [ ] Docs

## How to test

1. Open a log entry in the log detail sheet that has a routing rule, selected key, virtual key, or selected prompt associated with it.
2. Verify each field renders as a clickable link styled in blue.
3. Click the routing rule link — confirm the logs view opens filtered to that routing rule.
4. Click the selected key link — confirm the logs view opens filtered to that key.
5. Click the virtual key link — confirm navigation to the virtual keys governance page with the key selected.
6. Open an MCP log detail sheet with a tool name, server label, virtual key, and LLM request ID.
7. Verify each field is a clickable link navigating to the appropriate filtered view.

```sh
cd ui
pnpm i || npm i
pnpm build || npm run build
```

## Screenshots/Recordings

Before: Routing rule, key, and other metadata fields displayed as plain text.
After: All metadata fields are styled blue links that navigate to filtered or related views on click.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

All links use internal TanStack Router navigation with typed search parameters. No external URLs, secrets, or PII are exposed beyond what was already visible in the detail view.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akhsaul pushed a commit to akhsaul/bifrost that referenced this pull request Aug 27, 2026
## ✨ Features

- **OpenAI Compaction** — Added OpenAI conversation compaction support
across core, framework, logging, and the API surface (maximhq#4053)
- **Multi-Customer & Org Hierarchy** — Logs and usage tracking now
support multiple customers, teams, and business units, including
business unit CRUD, team assignment, and governance endpoints in the
OpenAPI spec (maximhq#4066, maximhq#4041, maximhq#4082)
- **Provider-Level Governance** — Budgets & limits are now scope-aware
and can be applied at the virtual-key top level and per provider, wired
from the model configs table, with UI filters for scope and providers
(maximhq#3938, maximhq#3937, maximhq#3939, maximhq#3981, maximhq#3962)
- **Customer Budgets** — Customers support multiple budgets and
`calendar_aligned` budget windows (maximhq#3998, maximhq#3997)
- **Virtual Key Attribution & Controls** — Added a `created_by` user
attribution column and a `blacklisted_models` column for virtual key
provider configs (maximhq#3672, maximhq#3653)
- **Request Header Capture** — OTel and Maxim observability plugins
capture `request_headers` by pattern, with wildcard support (e.g.
`x-custom-*`); logging gained the same wildcard header capture (maximhq#4012,
maximhq#3958)
- **OTel Content Controls & Collectors** — New `disable_content_logging`
option drops message/tool content from exported spans, plus support for
multiple OTel collectors (maximhq#4064, maximhq#3894)
- **xAI x_search** — Added xAI `x_search` tool support (maximhq#3976)
- **URL Validation** — Added fetch URL validation with private-network
configuration and link-local blocking (maximhq#3947, maximhq#3991)
- **File Scheme Pricing URLs** — Pricing source URLs now accept the
`file://` scheme for air-gapped and self-hosted deployments (maximhq#4045)
- **Paginated Virtual Keys** — Virtual key fetching is paginated to
handle deployments with very large numbers of keys (maximhq#3957)
- **Client IP Resolution** — Resolve client IP from
`X-Forwarded-For`/`X-Real-IP` headers
- **SCIM Provisioning** — Added `attributeType`/`attributeValue` SCIM
provisioning fields
- **Helm/Config Schema** — Added `roles` RBAC governance config and
`per_user_oauth` MCP auth to the Helm chart and config schema (maximhq#4004,
maximhq#4009)
- **Log Navigation UI** — Added a "View logs" menu item to customer,
team, and virtual key tables, clickable links in log detail views, a
customer detail sheet, and a reusable `BudgetDisplay` component (maximhq#4073,
maximhq#4054, maximhq#4026, maximhq#4055)
- **Faster First Paint** — Added an inline loading shell to `#root`
before React mounts (maximhq#4063)
- **Materialized View Alias** — Added an `alias` column to the
materialized view with filter support (maximhq#4078)

## 🐞 Fixed

- **Fetch URL IP Checks** — Hardened fetch URL IP checks against SSRF
(maximhq#4092)
- **Mantle Model Matching** — Broadened Mantle model matching to all
`gpt` variants (maximhq#4091)
- **Empty Thinking Blocks** — Strip thinking blocks when the signature
is empty (maximhq#4079)
- **OpenAI Stream Usage** — Removed usage from the `responses.created`
event in the OpenAI stream (maximhq#4080)
- **Prompt Cache Key** — Set the prompt cache key from the Anthropic
integration (maximhq#4086)
- **Upstream Failure Status** — Map upstream connection failures to 502
instead of 400 (maximhq#3929) (thanks
[@chris-colinsky](https://github.com/chris-colinsky)!)
- **Gemini Schema Constraints** — Accept numeric schema integer
constraints for Gemini (maximhq#3994) (thanks
[@yanhao98](https://github.com/yanhao98)!)
- **Files Provider Param** — Accept the `?provider=` query param on `GET
/v1/files` (maximhq#3971) (thanks [@alexef](https://github.com/alexef)!)
- **Optional Batch Model** — Made the `model` field optional on `POST
/v1/batches` (maximhq#3973) (thanks [@alexef](https://github.com/alexef)!)
- **Helm Azure Config** — Added missing `azure_key_config` fields to the
Helm schema (maximhq#3996) (thanks
[@axelray-dev](https://github.com/axelray-dev)!)
- **Text Completion Chunk Model** — Added the missing `Model` field to
`TextCompletionChunkResponse` (maximhq#3970) (thanks
[@kuishou68](https://github.com/kuishou68)!)
- **MCP Inline stdio Env** — MCP stdio server configs accept inline
environment variable assignments (maximhq#3861) (thanks
[@Shushmitaaaa](https://github.com/Shushmitaaaa)!)
- **Orphaned Tool Results** — Orphaned tool results in the OpenAI to
Anthropic conversion flow are no longer rejected by the Anthropic API
(maximhq#3919)
- **Node Usage Reconciliation** — Added a monotonic `inc_number` log
cursor so node usage reconciliation does not skip late async log writes
(maximhq#3664)
- **Bedrock Output Assessments** — Corrected the type of
`outputAssessments` in Bedrock responses (maximhq#4028)
- **Model Pool Pricing Reloads** — Preserve non-pricing model pool
entries across pricing reloads (maximhq#3999)
- **Ghost Node Reconciliation** — Replicate the VK hierarchy flow for
ghost node reconciliation (maximhq#4088)
- **VK Double Usage Counting** — Fixed double usage counting when
creating a virtual key (maximhq#4070)
- **Model Config Lifecycle** — Cascade deletes for model configs and
removal of stale in-memory model configs (maximhq#4051, maximhq#4043)
- **FTS Index Cap** — Reduced the FTS index `left()` cap from 800k to
250k chars to stay within the tsvector limit (maximhq#4057)
- **Sync Worker Drift** — Reduced the sync worker ticker period to 5m to
prevent threshold drift (maximhq#4023)
- **Passthrough** — Fixed passthrough budgets, gated passthrough models
per VK, model extraction for Azure passthrough, and restricted
fallbacks/provider selection to the VK boundary (maximhq#3941, maximhq#3988, maximhq#3983,
maximhq#3924)
- **Provider Response Headers** — Strip provider response headers and
add a content-type filter (maximhq#3955, maximhq#4024)
- **Stream Handling** — Drain non-SSE stream readers and retry stale
connections (maximhq#3956, maximhq#3967)
- **Azure Claude** — Strip Azure diagnostic property for Claude models
(maximhq#3925)
- **Compat max_tokens** — Preserve chat `max_tokens` during param
filtering (maximhq#3992)
- **Raw Request Flag** — Removed the raw request flag from providers
that don't support it (maximhq#4058)
- **UI Fixes** — Standardized page container layout, virtual key model
configs UI, and dashboard chart tooltips (maximhq#4046, maximhq#4052, maximhq#4044)

## 🔧 Maintenance

- **Dependency Upgrades** — Bumped transitive `golang.org/x`
dependencies (crypto, net, sys, text) for Docker Scout CVE remediation
and `recharts` to 3.8.1; cascaded version bumps across all modules
(maximhq#3900, maximhq#4003)
occcat pushed a commit to occcat/bifrost that referenced this pull request Sep 2, 2026
…, and prompt in log detail views (maximhq#4054)

## Summary

Several metadata fields in the log detail views were plain text with no way to navigate to related records. This PR converts those static values into clickable links that filter or navigate to the relevant views, making it faster to investigate related logs without manually applying filters.

## Changes

- Routing rule name in the log detail header and details section now links to `/workspace/logs` filtered by that routing rule ID
- Selected Key in the log detail header and details section now links to `/workspace/logs` filtered by that key ID
- Virtual Key in both the LLM log detail view and MCP log detail sheet now links to `/workspace/governance/virtual-keys` with the key pre-selected
- Selected Prompt now links to `/workspace/prompt-repo`
- Parent Request ID and User links updated to use consistent `text-blue-600` styling instead of `text-primary`
- MCP log detail sheet: Tool Name links to MCP logs filtered by tool name, Server label links to MCP logs filtered by server label, and LLM Request ID links directly to the corresponding log entry
- Minor formatting fixes to indentation and empty catch blocks for consistency

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [ ] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [x] UI (React)
- [ ] Docs

## How to test

1. Open a log entry in the log detail sheet that has a routing rule, selected key, virtual key, or selected prompt associated with it.
2. Verify each field renders as a clickable link styled in blue.
3. Click the routing rule link — confirm the logs view opens filtered to that routing rule.
4. Click the selected key link — confirm the logs view opens filtered to that key.
5. Click the virtual key link — confirm navigation to the virtual keys governance page with the key selected.
6. Open an MCP log detail sheet with a tool name, server label, virtual key, and LLM request ID.
7. Verify each field is a clickable link navigating to the appropriate filtered view.

```sh
cd ui
pnpm i || npm i
pnpm build || npm run build
```

## Screenshots/Recordings

Before: Routing rule, key, and other metadata fields displayed as plain text.
After: All metadata fields are styled blue links that navigate to filtered or related views on click.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

All links use internal TanStack Router navigation with typed search parameters. No external URLs, secrets, or PII are exposed beyond what was already visible in the detail view.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
occcat pushed a commit to occcat/bifrost that referenced this pull request Sep 2, 2026
## ✨ Features

- **OpenAI Compaction** — Added OpenAI conversation compaction support
across core, framework, logging, and the API surface (maximhq#4053)
- **Multi-Customer & Org Hierarchy** — Logs and usage tracking now
support multiple customers, teams, and business units, including
business unit CRUD, team assignment, and governance endpoints in the
OpenAPI spec (maximhq#4066, maximhq#4041, maximhq#4082)
- **Provider-Level Governance** — Budgets & limits are now scope-aware
and can be applied at the virtual-key top level and per provider, wired
from the model configs table, with UI filters for scope and providers
(maximhq#3938, maximhq#3937, maximhq#3939, maximhq#3981, maximhq#3962)
- **Customer Budgets** — Customers support multiple budgets and
`calendar_aligned` budget windows (maximhq#3998, maximhq#3997)
- **Virtual Key Attribution & Controls** — Added a `created_by` user
attribution column and a `blacklisted_models` column for virtual key
provider configs (maximhq#3672, maximhq#3653)
- **Request Header Capture** — OTel and Maxim observability plugins
capture `request_headers` by pattern, with wildcard support (e.g.
`x-custom-*`); logging gained the same wildcard header capture (maximhq#4012,
maximhq#3958)
- **OTel Content Controls & Collectors** — New `disable_content_logging`
option drops message/tool content from exported spans, plus support for
multiple OTel collectors (maximhq#4064, maximhq#3894)
- **xAI x_search** — Added xAI `x_search` tool support (maximhq#3976)
- **URL Validation** — Added fetch URL validation with private-network
configuration and link-local blocking (maximhq#3947, maximhq#3991)
- **File Scheme Pricing URLs** — Pricing source URLs now accept the
`file://` scheme for air-gapped and self-hosted deployments (maximhq#4045)
- **Paginated Virtual Keys** — Virtual key fetching is paginated to
handle deployments with very large numbers of keys (maximhq#3957)
- **Client IP Resolution** — Resolve client IP from
`X-Forwarded-For`/`X-Real-IP` headers
- **SCIM Provisioning** — Added `attributeType`/`attributeValue` SCIM
provisioning fields
- **Helm/Config Schema** — Added `roles` RBAC governance config and
`per_user_oauth` MCP auth to the Helm chart and config schema (maximhq#4004,
maximhq#4009)
- **Log Navigation UI** — Added a "View logs" menu item to customer,
team, and virtual key tables, clickable links in log detail views, a
customer detail sheet, and a reusable `BudgetDisplay` component (maximhq#4073,
maximhq#4054, maximhq#4026, maximhq#4055)
- **Faster First Paint** — Added an inline loading shell to `#root`
before React mounts (maximhq#4063)
- **Materialized View Alias** — Added an `alias` column to the
materialized view with filter support (maximhq#4078)

## 🐞 Fixed

- **Fetch URL IP Checks** — Hardened fetch URL IP checks against SSRF
(maximhq#4092)
- **Mantle Model Matching** — Broadened Mantle model matching to all
`gpt` variants (maximhq#4091)
- **Empty Thinking Blocks** — Strip thinking blocks when the signature
is empty (maximhq#4079)
- **OpenAI Stream Usage** — Removed usage from the `responses.created`
event in the OpenAI stream (maximhq#4080)
- **Prompt Cache Key** — Set the prompt cache key from the Anthropic
integration (maximhq#4086)
- **Upstream Failure Status** — Map upstream connection failures to 502
instead of 400 (maximhq#3929) (thanks
[@chris-colinsky](https://github.com/chris-colinsky)!)
- **Gemini Schema Constraints** — Accept numeric schema integer
constraints for Gemini (maximhq#3994) (thanks
[@yanhao98](https://github.com/yanhao98)!)
- **Files Provider Param** — Accept the `?provider=` query param on `GET
/v1/files` (maximhq#3971) (thanks [@alexef](https://github.com/alexef)!)
- **Optional Batch Model** — Made the `model` field optional on `POST
/v1/batches` (maximhq#3973) (thanks [@alexef](https://github.com/alexef)!)
- **Helm Azure Config** — Added missing `azure_key_config` fields to the
Helm schema (maximhq#3996) (thanks
[@axelray-dev](https://github.com/axelray-dev)!)
- **Text Completion Chunk Model** — Added the missing `Model` field to
`TextCompletionChunkResponse` (maximhq#3970) (thanks
[@kuishou68](https://github.com/kuishou68)!)
- **MCP Inline stdio Env** — MCP stdio server configs accept inline
environment variable assignments (maximhq#3861) (thanks
[@Shushmitaaaa](https://github.com/Shushmitaaaa)!)
- **Orphaned Tool Results** — Orphaned tool results in the OpenAI to
Anthropic conversion flow are no longer rejected by the Anthropic API
(maximhq#3919)
- **Node Usage Reconciliation** — Added a monotonic `inc_number` log
cursor so node usage reconciliation does not skip late async log writes
(maximhq#3664)
- **Bedrock Output Assessments** — Corrected the type of
`outputAssessments` in Bedrock responses (maximhq#4028)
- **Model Pool Pricing Reloads** — Preserve non-pricing model pool
entries across pricing reloads (maximhq#3999)
- **Ghost Node Reconciliation** — Replicate the VK hierarchy flow for
ghost node reconciliation (maximhq#4088)
- **VK Double Usage Counting** — Fixed double usage counting when
creating a virtual key (maximhq#4070)
- **Model Config Lifecycle** — Cascade deletes for model configs and
removal of stale in-memory model configs (maximhq#4051, maximhq#4043)
- **FTS Index Cap** — Reduced the FTS index `left()` cap from 800k to
250k chars to stay within the tsvector limit (maximhq#4057)
- **Sync Worker Drift** — Reduced the sync worker ticker period to 5m to
prevent threshold drift (maximhq#4023)
- **Passthrough** — Fixed passthrough budgets, gated passthrough models
per VK, model extraction for Azure passthrough, and restricted
fallbacks/provider selection to the VK boundary (maximhq#3941, maximhq#3988, maximhq#3983,
maximhq#3924)
- **Provider Response Headers** — Strip provider response headers and
add a content-type filter (maximhq#3955, maximhq#4024)
- **Stream Handling** — Drain non-SSE stream readers and retry stale
connections (maximhq#3956, maximhq#3967)
- **Azure Claude** — Strip Azure diagnostic property for Claude models
(maximhq#3925)
- **Compat max_tokens** — Preserve chat `max_tokens` during param
filtering (maximhq#3992)
- **Raw Request Flag** — Removed the raw request flag from providers
that don't support it (maximhq#4058)
- **UI Fixes** — Standardized page container layout, virtual key model
configs UI, and dashboard chart tooltips (maximhq#4046, maximhq#4052, maximhq#4044)

## 🔧 Maintenance

- **Dependency Upgrades** — Bumped transitive `golang.org/x`
dependencies (crypto, net, sys, text) for Docker Scout CVE remediation
and `recharts` to 3.8.1; cascaded version bumps across all modules
(maximhq#3900, maximhq#4003)
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.

4 participants