Skip to content

feat: add prev/next navigation to RoutingRuleInfoSheet - #3745

Merged
akshaydeo merged 6 commits into
devfrom
05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet
May 27, 2026
Merged

feat: add prev/next navigation to RoutingRuleInfoSheet#3745
akshaydeo merged 6 commits into
devfrom
05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet

Conversation

@impoiler

@impoiler impoiler commented May 26, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds prev/next navigation to the Routing Rule info sheet, allowing users to move between rules without closing and reopening the sheet.

Changes

  • Added onNavigate, hasPrev, and hasNext props to RoutingRuleInfoSheet to support directional navigation between rules.
  • Integrated useSheetNavigation hook and SheetNavigationButtons component into the sheet header, providing both keyboard shortcut and button-based navigation.
  • In RoutingRulesView, rules are sorted by priority and the current rule's index is tracked so that prev/next state and navigation handler can be derived and passed down to the sheet.
  • Restructured the sheet header layout from a single column to a row with a left-side title/badge group and right-side navigation buttons.

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. Navigate to the Routing Rules page.
  2. Click on any routing rule to open the info sheet.
  3. Use the prev/next navigation buttons in the sheet header to move between rules (ordered by priority).
  4. Verify keyboard shortcuts (as provided by useSheetNavigation) also cycle through rules correctly.
  5. Confirm the prev button is disabled on the first rule and the next button is disabled on the last rule.
cd ui
pnpm i || npm i
pnpm test || npm test
pnpm build || npm run build

Screenshots/Recordings

Add before/after screenshots or a short clip showing the navigation buttons in the sheet header.

Breaking changes

  • Yes
  • No

Related issues

Security considerations

None.

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 May 26, 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 4 minutes and 16 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b57c5f57-e423-451a-9eae-cc8c7c963852

📥 Commits

Reviewing files that changed from the base of the PR and between c8a50a8 and 7e4bc70.

📒 Files selected for processing (2)
  • ui/app/workspace/routing-rules/views/routingRuleInfoSheet.tsx
  • ui/app/workspace/routing-rules/views/routingRulesView.tsx
📝 Walkthrough

Walkthrough

RoutingRuleInfoSheet gains optional navigation props and renders SheetNavigationButtons in the header. RoutingRulesView computes a priority-sorted rule list, derives the selected rule's index, and wires a navigation callback to the sheet for prev/next traversal bounded by list limits.

Changes

Routing rule sheet navigation

Layer / File(s) Summary
Sheet navigation contract
ui/app/workspace/routing-rules/views/routingRuleInfoSheet.tsx
Imports SheetNavigationButtons and useSheetNavigation; extends Props with optional onNavigate, hasPrev, and hasNext fields.
Sheet navigation UI integration
ui/app/workspace/routing-rules/views/routingRuleInfoSheet.tsx
RoutingRuleInfoSheet accepts navigation props, calls useSheetNavigation to compute prevKeys/nextKeys when open, and renders SheetNavigationButtons in the header row layout.
Parent view navigation wiring
ui/app/workspace/routing-rules/views/routingRulesView.tsx
Adds useCallback import; computes priority-sorted rules and selected rule index; creates a bounded prev/next navigation callback; passes navigation props to RoutingRuleInfoSheet.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • akshaydeo

Poem

🐰 Through rules we hop, from left to right,
Navigation buttons, shining bright,
The sorted list guides our bounded flight,
Each prev and next, a pixel's delight! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main feature: adding prev/next navigation to RoutingRuleInfoSheet.
Description check ✅ Passed The description covers all required sections: summary, changes, type of change, affected areas, testing steps, breaking changes, and checklist items are addressed.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet

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

@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from e7b2482 to d3eff99 Compare May 26, 2026 04:55
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 4f13a97 to b1a7dca Compare May 26, 2026 04:55
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from d3eff99 to 43d9d18 Compare May 26, 2026 05:53
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from b1a7dca to 40299f5 Compare May 26, 2026 05:53
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from 43d9d18 to c95e48c Compare May 26, 2026 06:18
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 40299f5 to 15f9989 Compare May 26, 2026 06:18
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from c95e48c to f9fc93c Compare May 26, 2026 07:15
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 15f9989 to 2e13254 Compare May 26, 2026 07:15
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 2e13254 to f2446d3 Compare May 26, 2026 07:50
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from f9fc93c to 782c5fe Compare May 26, 2026 07:50
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from 782c5fe to f987fc9 Compare May 26, 2026 09:44
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 17af2ab to ef1291f Compare May 26, 2026 17:00
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from f987fc9 to 146cab3 Compare May 26, 2026 17:00
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from 146cab3 to ecda73a Compare May 27, 2026 04:06
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from ef1291f to 982ebb5 Compare May 27, 2026 04:06
@impoiler impoiler changed the title feat: adds keyboard navigation in the routing rules sheet feat: add prev/next navigation to RoutingRuleInfoSheet May 27, 2026
@greptile-apps

greptile-apps Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

A self-contained UI feature addition with no backend changes and no changes to existing behavior paths.

The navigation logic is straightforward — sorting by priority, tracking the selected index, and stepping ±1 — and the guard conditions on hasPrev/hasNext are correct for all boundary cases including an empty list or a missing selection. The only gap (navigation silently capping at page boundaries) was flagged in a prior review thread and is a pre-existing constraint of the paginated data model.

No files require special attention.

Important Files Changed

Filename Overview
ui/app/workspace/routing-rules/views/routingRulesView.tsx Adds sortedRules memo, selectedRuleIndex tracking, and handleRuleNavigate callback; passes hasPrev/hasNext/onNavigate to RoutingRuleInfoSheet. Missing newline at end of file.
ui/app/workspace/routing-rules/views/routingRuleInfoSheet.tsx Accepts onNavigate/hasPrev/hasNext props, integrates useSheetNavigation and SheetNavigationButtons into the header, restructures header layout from single-column to row.

Reviews (3): Last reviewed commit: "feat: adds keyboard navigation in the ro..." | Re-trigger Greptile

Comment thread ui/app/workspace/routing-rules/views/routingRulesView.tsx
Comment thread ui/app/workspace/routing-rules/views/routingRuleInfoSheet.tsx
@coderabbitai
coderabbitai Bot requested a review from akshaydeo May 27, 2026 10:29
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 27, 2026
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from 3e6125e to d4273fe Compare May 27, 2026 12:30
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from d06242e to 4e6f1fa Compare May 27, 2026 12:30
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_for_mcp_sheets branch from 4e6f1fa to d114408 Compare May 27, 2026 13:16
@impoiler
impoiler force-pushed the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch from d4273fe to 7e4bc70 Compare May 27, 2026 13:16

akshaydeo commented May 27, 2026

Copy link
Copy Markdown
Contributor

Merge activity

  • May 27, 1:44 PM UTC: A user started a stack merge that includes this pull request via Graphite.
  • May 27, 1:50 PM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo
akshaydeo changed the base branch from 05-26-feat_adds_keyboard_navigation_for_mcp_sheets to graphite-base/3745 May 27, 2026 13:49
@akshaydeo
akshaydeo changed the base branch from graphite-base/3745 to dev May 27, 2026 13:50
@akshaydeo
akshaydeo dismissed coderabbitai[bot]’s stale review May 27, 2026 13:50

The base branch was changed.

@akshaydeo
akshaydeo merged commit ceb6243 into dev May 27, 2026
10 checks passed
@akshaydeo
akshaydeo deleted the 05-26-feat_adds_keyboard_navigation_in_the_routing_rules_sheet branch May 27, 2026 13:50
akshaydeo pushed a commit that referenced this pull request May 29, 2026
## Summary

Adds prev/next navigation to the Routing Rule info sheet, allowing users to move between rules without closing and reopening the sheet.

## Changes

- Added `onNavigate`, `hasPrev`, and `hasNext` props to `RoutingRuleInfoSheet` to support directional navigation between rules.
- Integrated `useSheetNavigation` hook and `SheetNavigationButtons` component into the sheet header, providing both keyboard shortcut and button-based navigation.
- In `RoutingRulesView`, rules are sorted by priority and the current rule's index is tracked so that prev/next state and navigation handler can be derived and passed down to the sheet.
- Restructured the sheet header layout from a single column to a row with a left-side title/badge group and right-side navigation buttons.

## 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. Navigate to the Routing Rules page.
2. Click on any routing rule to open the info sheet.
3. Use the prev/next navigation buttons in the sheet header to move between rules (ordered by priority).
4. Verify keyboard shortcuts (as provided by `useSheetNavigation`) also cycle through rules correctly.
5. Confirm the prev button is disabled on the first rule and the next button is disabled on the last rule.

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

## Screenshots/Recordings

_Add before/after screenshots or a short clip showing the navigation buttons in the sheet header._

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

None.

## 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 akshaydeo mentioned this pull request May 29, 2026
18 tasks
akshaydeo added a commit that referenced this pull request May 29, 2026
## Summary

This PR releases **core v1.5.14**, **framework v1.3.14**, **transports v1.5.6**, and bumps all dependent plugins to their respective `.14` patch versions. It delivers a broad set of new capabilities across MCP authentication, key rotation, OTel metrics, Bedrock/Anthropic compatibility, and UI improvements, alongside a number of targeted bug fixes and refactors.

## Changes

- **Direct API Key Header** — Providers can now receive an API key passed directly via a request header (#3817)
- **MCP Per-User Auth** — Introduced `MCPCredentialStore` abstraction, per-user MCP credential reconciliation, and a new per-user header auth type with lazy-auth submission flow (#3656, #3702, #3703, #3704, #3705)
- **MCP TLS Configuration** — Added configurable TLS (`insecureSkipVerify`, `caCertPem`) for HTTP/SSE MCP client connections (#3779, #3783)
- **MCP Sessions Management** — Filter, search, and pagination on the MCP sessions list API and table, plus a `can_reauth` identity gate (#3823, #3824, #3825)
- **Key Rotation** — Keys now rotate on 401/402/403 responses; returns `502 upstream_credentials_exhausted` when all keys are permanently exhausted. Added `triggered_rotation` to `KeyAttemptRecord` and tightened `bifrost_key_rotation_events_total` semantics (#3430, #3491)
- **OTel Metrics** — Added OTel spec-compatible metrics (backward compatible) with provider cache and semantic cache attributes in metrics export (#3865, #3816)
- **Opus 4.8 Support** — System message handling and general compatibility for Opus 4.8 (#3868, #3878)
- **Dimension Rankings** — New `GetDimensionRankings` API and dashboard tabs for team, customer, BU, and user rankings (#3766)
- **Model Pricing Attributes** — `additional_attributes` field on model pricing rows with management API and UI editor (#3829)
- **Prompt Cache Retention** — Added prompt cache retention parameter on responses requests (#3810)
- **Tool Call Execution UI** — Inline tool-call execution, stop streaming, bulk execute/submit, and a redesigned tool-call UI (#3837, #3843)
- **Sheet Navigation** — Prev/next keyboard navigation and URL state across virtual key, MCP client, and routing rule sheets (#3739, #3740, #3744, #3745)
- **Bedrock Tool Name Truncation** — Truncate Bedrock function/tool names to the provider length limit
- **Bedrock Guardrails** — Set guardrail config in Bedrock requests built from responses (#3862)
- **Anthropic Tool Use** — Default `tool_use` input to `{}` when arguments are absent (#3880)
- **Responses Streaming** — Fixed responses stream events (#3838)
- **Compat Flow** — Fixed missing parameter parsing on the compat flow (#3881)
- **Passthrough API Version** — Set a default API version in passthrough requests as a fallback (#3853)
- **Virtual Key Updates** — Avoid overriding optional fields during virtual key update (#3855)
- **User-Mode Flows** — Gate user-mode flows on caller `user_id`, skip temp token mint, and unify flow/credential kind filtering for pending flows (#3841, #3859)
- **Partial Tool Calls** — Handle partial tool call execution failures and return successful results (#3849)
- **URL Query Escaping** — Support escaped characters in URL query parameters (#3826)
- **MCP Auth Errors** — Inline banner and retry support for MCP auth-required errors (#3856)
- **Renamed Resolvers** — `staticHeadersResolver`/`serverOAuthResolver` renamed to `sharedHeadersResolver`/`sharedOAuthResolver` (#3840)
- **Starlark Nested Tool Calls** — Exposed `RunWithPluginPipeline` on `ClientManager` and routed Starlark nested tool calls through the canonical plugin gate (#3794)
- **Deferred-Fill OAuth Removed** — Removed deferred-fill user-mode OAuth flow support (#3839)
- **Go 1.26.3** — Upgraded toolchain to Go 1.26.3 (#3782)

## Type of change

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

## Affected areas

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

## How to test

```sh
# Core/Transports
go version  # should report go1.26.3
go test ./...

# UI
cd ui
pnpm i || npm i
pnpm test || npm test
pnpm build || npm run build
```

- Validate MCP per-user auth by configuring a per-user header auth type and confirming credentials are stored and reconciled on virtual key and MCP client changes.
- Validate key rotation by triggering a 401/402/403 from an upstream provider and confirming rotation occurs; exhaust all keys and confirm a `502 upstream_credentials_exhausted` is returned.
- Validate OTel metrics output includes `provider_cache` and `semantic_cache` attributes.
- Validate Bedrock requests with tool names exceeding the provider limit are truncated correctly.
- Validate Opus 4.8 system message handling by sending a request with a system message to an Opus 4.8 endpoint.

## Breaking changes

- [x] Yes
- [ ] No

The deferred-fill user-mode OAuth flow has been removed (#3839). Any integrations relying on that flow must migrate to the new per-user credential store approach. The `staticHeadersResolver` and `serverOAuthResolver` identifiers have been renamed to `sharedHeadersResolver` and `sharedOAuthResolver` respectively (#3840); any direct references must be updated.

## Related issues

#3817, #3656, #3702, #3703, #3704, #3705, #3779, #3783, #3823, #3824, #3825, #3430, #3491, #3865, #3816, #3868, #3878, #3766, #3829, #3810, #3837, #3843, #3739, #3740, #3744, #3745, #3862, #3880, #3838, #3881, #3853, #3855, #3841, #3859, #3849, #3826, #3856, #3840, #3794, #3839, #3782, #3724, #3814, #3836, #3869, #3886

## Security considerations

- MCP per-user credentials are stored via the new `MCPCredentialStore` abstraction; ensure the backing store is appropriately access-controlled and that credential values are encrypted at rest.
- The direct API key header feature passes provider secrets via HTTP headers; ensure TLS is enforced on all ingress paths and that headers are not logged in plaintext.
- User-mode flows are now gated on `caller user_id` and temp token minting is skipped where appropriate, reducing the surface for privilege escalation.
- TLS configuration for MCP HTTP/SSE connections supports `insecureSkipVerify`; this should only be enabled in controlled environments.

## Checklist

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

- **Direct API Key Header** - Pass a provider API key directly via
request header (#3817)
- **MCP Per-User Authentication** - New per-user header auth type with
credential storage
  and lazy-auth submission flow (#3703, #3704, #3705)
- **MCP TLS Configuration** - Configurable TLS (insecureSkipVerify,
caCertPem) for HTTP/SSE
  MCP client connections (#3779, #3783)
- **MCP Sessions Management** - Filter, search, and pagination on the
MCP sessions list API
  and table, plus a can_reauth identity gate (#3823, #3824, #3825)
- **Tool Call Execution UI** - Inline tool-call execution, stop
streaming, bulk
  execute/submit, and a redesigned tool-call UI (#3837, #3843)
- **Dimension Rankings Dashboard** - New dashboard tabs for team,
customer, BU, and user
  rankings, backed by a GetDimensionRankings API (#3766)
- **Model Pricing Attributes** - additional_attributes on model pricing
rows with management
  API and UI editor (#3829)
- **Prompt Cache Retention** - Prompt cache retention parameter on
responses requests
  (#3810)
- **Opus 4.8 Support** - System message handling and compatibility for
Opus 4.8 (#3878,
  #3868)
  - **Key Rotation** - Rotate keys on 401/402/403 and return 502
upstream_credentials_exhausted when all keys are permanently dead
(#3491)
- **OTel Metrics** - OTel spec compatible metrics plus provider and
semantic cache
  attributes in metrics export (#3865, #3816)
- **Sheet Navigation** - Prev/next keyboard navigation and URL state
across virtual key, MCP
  client, and routing rule sheets (#3739, #3740, #3744, #3745)
  - **Go 1.26.3** - Upgraded toolchain to Go 1.26.3 (#3782)

  ## 🐞 Fixed

- **Bedrock Tool Names** - Truncate Bedrock function/tool names to the
provider length limit
- **Bedrock Guardrails** - Set guardrail config in Bedrock request built
from responses
  (#3862)
- **Anthropic Tool Use** - Default Anthropic tool_use input to {} when
arguments are absent
  (#3880)
  - **Responses Streaming** - Fixed responses stream events (#3838)
- **Compat Flow** - Fixed missing parameter parsing on the compat flow
(#3881)
- **Passthrough API Version** - Set a default API version in passthrough
requests as a
  fallback (#3853)
- **Virtual Key Updates** - Avoid overriding optional fields during
virtual key update
  (#3855)
- **User-Mode Flows** - Gate user-mode flows on caller user_id, skip
temp token mint, and
  unify flow/credential kind filtering for pending flows (#3841, #3859)
- **Partial Tool Calls** - Handle partial tool call execution failures
and return successful
  results (#3849)
- **URL Query Escaping** - Support escaped characters in URL query
parameters (#3826)
- **MCP Auth Errors** - Inline banner and retry support for MCP
auth-required errors (#3856)
- **JSON Editor Height** - Cap JSON editor max height at 400px in
message views (#3842)
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.

2 participants