Skip to content

feat: add optional gRPC port to bifrost cluster deployment and service - #3617

Merged
akshaydeo merged 24 commits into
devfrom
05-20-chore_expose_grpc_service_port_if_mentioned
May 25, 2026
Merged

feat: add optional gRPC port to bifrost cluster deployment and service#3617
akshaydeo merged 24 commits into
devfrom
05-20-chore_expose_grpc_service_port_if_mentioned

Conversation

@BearTS

@BearTS BearTS commented May 20, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds optional gRPC port support to the Bifrost Helm chart, allowing the cluster to expose a gRPC endpoint when configured.

Changes

  • Added a conditional gRPC container port (TCP) to the deployment template, rendered only when bifrost.cluster.grpc is defined in values
  • Added a corresponding conditional gRPC service port to the service template, targeting the named grpc port

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

Set the following in your Helm values and confirm the deployment and service include the gRPC port:

bifrost:
  cluster:
    grpc:
      port: 50051
helm template ./helm-charts/bifrost | grep -A 4 grpc

Expected output should include the grpc port entry in both the deployment container ports and the service spec.

Breaking changes

  • Yes
  • No

Related issues

Security considerations

The gRPC port is only exposed when explicitly configured. No authentication or TLS is configured at the Helm chart level; ensure appropriate network policies or ingress controls are in place when enabling this port.

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 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Rate limit exceeded

@BearTS has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 18 minutes and 12 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, 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 have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 930eec5b-36bb-498c-94dd-cd51b76e77c1

📥 Commits

Reviewing files that changed from the base of the PR and between 8d84eb7 and 490e6ad.

📒 Files selected for processing (2)
  • helm-charts/bifrost/templates/deployment.yaml
  • helm-charts/bifrost/templates/service.yaml
📝 Walkthrough

Walkthrough

The PR conditionally exposes a gRPC TCP port when bifrost.cluster.grpc is enabled: the Deployment's container ports gains a grpc entry using bifrost.cluster.grpc.port, and the Service's spec.ports gains a matching named grpc port mapping to targetPort: grpc.

Changes

gRPC Port Exposure

Layer / File(s) Summary
gRPC Port Exposure
helm-charts/bifrost/templates/deployment.yaml, helm-charts/bifrost/templates/service.yaml
Deployment adds conditional gRPC container port using bifrost.cluster.grpc.port. Service adds matching conditional gRPC port mapping that routes to the grpc named targetPort. Both gated on the bifrost.cluster.grpc enabled flag.
sequenceDiagram
  participant Client
  participant Service
  participant Pod
  Client->>Service: TCP gRPC request to Service 'grpc' port
  Service->>Pod: forwards to targetPort 'grpc' on Pod
Loading

🎯 2 (Simple) | ⏱️ ~8 minutes


I’m a rabbit in the charted land,
I nudged a grpc port with my hand,
When the flag is true, connections hum,
Services route and pods become,
A quiet tunnel for the tum-tum. 🐇✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: adding optional gRPC port support to Bifrost Helm chart deployment and service templates.
Description check ✅ Passed The description covers all major template sections with sufficient detail. It includes Summary, Changes, Type of change, Affected areas, How to test, Breaking changes, Security considerations, and Checklist, though some checklist items are unmarked.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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-20-chore_expose_grpc_service_port_if_mentioned

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

@BearTS
BearTS force-pushed the 05-20-chore_add_timeout_example_in_providers_yaml_file branch from 06e985b to f4a7c96 Compare May 20, 2026 10:56
@BearTS
BearTS force-pushed the 05-20-chore_expose_grpc_service_port_if_mentioned branch from 5405e4c to 36a1311 Compare May 20, 2026 10:56
@BearTS BearTS changed the title chore: expose grpc service port if mentioned feat: add optional gRPC port to bifrost cluster deployment and service May 20, 2026
@BearTS
BearTS marked this pull request as ready for review May 20, 2026 10:58
@BearTS
BearTS requested a review from a team as a code owner May 20, 2026 10:58
@greptile-apps

greptile-apps Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 5/5

The changes are additive Helm template conditionals with correct syntax and no effect on existing deployments that don't set the grpc key.

Both templates follow the exact same guard pattern already used in stateful.yaml and service-headless.yaml for the same feature. The port values, protocol, and named targetPort reference are all consistent. No existing behavior is altered.

No files require special attention.

Important Files Changed

Filename Overview
helm-charts/bifrost/templates/deployment.yaml Adds conditional gRPC container port to the cluster ports block; syntax is correct and consistent with the existing gossip port pattern.
helm-charts/bifrost/templates/service.yaml Adds conditional gRPC service port entry targeting the named grpc container port; mirrors the same guard and structure used in the headless service.

Reviews (6): Last reviewed commit: "chore: expose grpc service port if menti..." | Re-trigger Greptile

Comment thread helm-charts/bifrost/templates/deployment.yaml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
helm-charts/bifrost/templates/deployment.yaml (1)

79-83: ⚡ Quick win

Consider validating that the port value exists.

The conditional checks if .Values.bifrost.cluster.grpc is truthy but then accesses .Values.bifrost.cluster.grpc.port without verifying the port field exists. If a user sets bifrost.cluster.grpc: {} or defines grpc configuration without the port field, the template will fail with an unclear error during rendering.

While this follows the existing pattern used for gossip ports (lines 73-78), consider one of these approaches for better user experience:

-{{- if .Values.bifrost.cluster.grpc }}
+{{- if .Values.bifrost.cluster.grpc.port }}

or with an explicit validation message:

-{{- if .Values.bifrost.cluster.grpc }}
 - name: grpc
-  containerPort: {{ .Values.bifrost.cluster.grpc.port }}
+  containerPort: {{ .Values.bifrost.cluster.grpc.port | required "bifrost.cluster.grpc.port is required when grpc is enabled" }}
   protocol: TCP
-{{- end }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@helm-charts/bifrost/templates/deployment.yaml` around lines 79 - 83, The
template currently checks .Values.bifrost.cluster.grpc but dereferences
.Values.bifrost.cluster.grpc.port which can be missing; update the deployment
template to validate that the port field exists (e.g., check both
.Values.bifrost.cluster.grpc and .Values.bifrost.cluster.grpc.port or use
default/required logic) before rendering the grpc containerPort, and provide a
clear error or fallback value if port is absent; locate the grpc block in the
deployment template (the conditional using .Values.bifrost.cluster.grpc and the
reference to .Values.bifrost.cluster.grpc.port) and adjust the conditional or
add a validation message so the template won’t fail when grpc is defined without
a port.
helm-charts/bifrost/templates/service.yaml (1)

28-33: ⚡ Quick win

Consider validating that the port value exists.

The conditional checks if .Values.bifrost.cluster.grpc is truthy but then accesses .Values.bifrost.cluster.grpc.port without verifying the port field exists. This mirrors the same concern in the deployment template and could lead to unclear template rendering errors if misconfigured.

For consistency with the deployment template fix, consider the same validation approach:

-{{- if .Values.bifrost.cluster.grpc }}
+{{- if .Values.bifrost.cluster.grpc.port }}

or with an explicit validation message:

-{{- if .Values.bifrost.cluster.grpc }}
-- port: {{ .Values.bifrost.cluster.grpc.port }}
+- port: {{ .Values.bifrost.cluster.grpc.port | required "bifrost.cluster.grpc.port is required when grpc is enabled" }}
   targetPort: grpc
   protocol: TCP
   name: grpc
-{{- end }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@helm-charts/bifrost/templates/service.yaml` around lines 28 - 33, The service
template uses .Values.bifrost.cluster.grpc.port without ensuring the port field
exists; update the conditional around the grpc port block in service.yaml to
only render when both .Values.bifrost.cluster.grpc and
.Values.bifrost.cluster.grpc.port are present (or explicitly fail with a clear
message), so the port/targetPort/name grpc stanza is omitted or validated if
port is missing; target the .Values.bifrost.cluster.grpc and
.Values.bifrost.cluster.grpc.port symbols and the grpc port block when making
the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@helm-charts/bifrost/templates/deployment.yaml`:
- Around line 79-83: The template currently checks .Values.bifrost.cluster.grpc
but dereferences .Values.bifrost.cluster.grpc.port which can be missing; update
the deployment template to validate that the port field exists (e.g., check both
.Values.bifrost.cluster.grpc and .Values.bifrost.cluster.grpc.port or use
default/required logic) before rendering the grpc containerPort, and provide a
clear error or fallback value if port is absent; locate the grpc block in the
deployment template (the conditional using .Values.bifrost.cluster.grpc and the
reference to .Values.bifrost.cluster.grpc.port) and adjust the conditional or
add a validation message so the template won’t fail when grpc is defined without
a port.

In `@helm-charts/bifrost/templates/service.yaml`:
- Around line 28-33: The service template uses .Values.bifrost.cluster.grpc.port
without ensuring the port field exists; update the conditional around the grpc
port block in service.yaml to only render when both .Values.bifrost.cluster.grpc
and .Values.bifrost.cluster.grpc.port are present (or explicitly fail with a
clear message), so the port/targetPort/name grpc stanza is omitted or validated
if port is missing; target the .Values.bifrost.cluster.grpc and
.Values.bifrost.cluster.grpc.port symbols and the grpc port block when making
the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e4c5f43c-5a7b-40d6-9e52-721e99a93b1c

📥 Commits

Reviewing files that changed from the base of the PR and between f4a7c96 and 36a1311.

📒 Files selected for processing (2)
  • helm-charts/bifrost/templates/deployment.yaml
  • helm-charts/bifrost/templates/service.yaml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@helm-charts/bifrost/templates/deployment.yaml`:
- Around line 79-82: The template uses .Values.bifrost.cluster.grpc.port without
ensuring it exists; update the deployment template so that when
.Values.bifrost.cluster.grpc is truthy you require the port value (use Helm's
required function or an explicit check) before rendering the containerPort
stanza; specifically, guard or replace references to
.Values.bifrost.cluster.grpc.port (the grpc port lookup) with a
required("bifrost.cluster.grpc.port is required when bifrost.cluster.grpc is
configured", .Values.bifrost.cluster.grpc.port) call or an if/else that throws a
clear error so Helm fails fast with a meaningful message instead of producing an
invalid manifest.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2ac42691-fc86-4301-ad34-fd72b5e8915e

📥 Commits

Reviewing files that changed from the base of the PR and between 36a1311 and de7044b.

📒 Files selected for processing (2)
  • helm-charts/bifrost/templates/deployment.yaml
  • helm-charts/bifrost/templates/service.yaml
✅ Files skipped from review due to trivial changes (1)
  • helm-charts/bifrost/templates/service.yaml

Comment thread helm-charts/bifrost/templates/deployment.yaml
@BearTS
BearTS force-pushed the 05-20-chore_add_timeout_example_in_providers_yaml_file branch from 0c421c0 to d7856f0 Compare May 20, 2026 12:04
@BearTS
BearTS force-pushed the 05-20-chore_expose_grpc_service_port_if_mentioned branch from de7044b to 55c8715 Compare May 20, 2026 12:04
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 20, 2026
@BearTS
BearTS force-pushed the 05-20-chore_add_timeout_example_in_providers_yaml_file branch from d7856f0 to ce2345a Compare May 20, 2026 17:50
@BearTS
BearTS force-pushed the 05-20-chore_expose_grpc_service_port_if_mentioned branch from 55c8715 to bcb28db Compare May 20, 2026 17:50
Madhuvod and others added 4 commits May 22, 2026 04:45
## Summary

Briefly explain the purpose of this PR and the problem it solves.

## Changes

- What was changed and why
- Any notable design decisions or trade-offs

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

Describe the steps to validate this change. Include commands and expected outcomes.

```sh
# Core/Transports
go version
go test ./...

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

If adding new configs or environment variables, document them here.

## Screenshots/Recordings

If UI changes, add before/after screenshots or short clips.

## Breaking changes

- [ ] Yes
- [ ] No

If yes, describe impact and migration instructions.

## Related issues

Link related issues and discussions. Example: Closes #123

## Security considerations

Note any security implications (auth, secrets, PII, sandboxing, etc.).

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

Removes the hardcoded `type: "custom"` field that was being set by default for Anthropic tools during conversion. It is an optional field based on Anthropic docs and with this, can also support Deepseek as custom provider

## Changes

- Removed the automatic assignment of `AnthropicToolTypeCustom` when initializing `AnthropicTool` in `convertBifrostToolToAnthropic`, allowing the tool type to be determined by subsequent logic rather than being overridden at construction time.

## Type of change

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

## Affected areas

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

## How to test

Send a request to the Anthropic provider with tools that are not of the custom type and verify they are correctly passed through without being overridden to `type: "custom"`.

```sh
go test ./core/providers/anthropic/...
```

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

When performing keyless `ListModels` requests, provider implementations were passing an empty `schemas.Key{}`, which caused model filtering to behave incorrectly — returning no models instead of all available models. This fix ensures keyless requests use a wildcard whitelist so all models are returned as expected.

## Changes

- Replaced `schemas.Key{}` with `schemas.Key{Models: schemas.WhiteList{"*"}}` in the keyless `ListModels` path for Anthropic, Cohere, Gemini, HuggingFace, and OpenAI providers.
- The wildcard `"*"` entry signals that all models should be allowed through the whitelist filter, matching the intended behavior for keyless configurations.

## Type of change

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

## Affected areas

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

## How to test

Call `ListModels` against a provider configured with `IsKeyLess: true` and verify that the response includes the full list of available models rather than an empty result.

```sh
go test ./...
```

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

- Resolves #3607

## Security considerations

No security implications. The wildcard whitelist only affects model listing behavior in explicitly keyless provider configurations.

## 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)
- [ ] I verified the CI pipeline passes locally if applicable
…ms (#3647)

## Summary

When navigating between sidebar pages that support time filtering, the selected time range (start/end time or period) is lost. This PR preserves the active time filter parameters when clicking sidebar sub-items, so users don't have to re-select their time range after switching between time-filter-enabled pages.

## Changes

- When navigating from one `TimeFilterPages` page to another via a sidebar sub-item, the current `start_time`, `end_time`, and `period` query parameters are carried over to the destination URL.
- If the current or destination page is not in `TimeFilterPages`, navigation behaves as before with no parameter forwarding.

## Type of change

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

## Affected areas

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

## How to test

1. Navigate to a page that supports time filtering (e.g., a metrics or logs page).
2. Set a custom time range or period using the time filter.
3. Click a different sidebar sub-item that also supports time filtering.
4. Verify the time range is preserved in the URL and the view reflects the same time window.
5. Navigate to a sidebar sub-item that does **not** support time filtering and verify no time parameters are appended.

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

## Screenshots/Recordings

N/A

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

No security implications. Only query parameters already present in the current URL are forwarded.

## 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 and others added 12 commits May 22, 2026 04:45
## Summary

UI updates

## Changes

- What was changed and why
- Any notable design decisions or trade-offs

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

Describe the steps to validate this change. Include commands and expected outcomes.

```sh
# Core/Transports
go version
go test ./...

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

If adding new configs or environment variables, document them here.

## Screenshots/Recordings

If UI changes, add before/after screenshots or short clips.

## Breaking changes

- [ ] Yes
- [ ] No

If yes, describe impact and migration instructions.

## Related issues

Link related issues and discussions. Example: Closes #123

## Security considerations

Note any security implications (auth, secrets, PII, sandboxing, etc.).

## 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
…ss profile assignment (#3560)" (#3669)

## Summary

Briefly explain the purpose of this PR and the problem it solves.

## Changes

- What was changed and why
- Any notable design decisions or trade-offs

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

Describe the steps to validate this change. Include commands and expected outcomes.

```sh
# Core/Transports
go version
go test ./...

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

If adding new configs or environment variables, document them here.

## Screenshots/Recordings

If UI changes, add before/after screenshots or short clips.

## Breaking changes

- [ ] Yes
- [ ] No

If yes, describe impact and migration instructions.

## Related issues

Link related issues and discussions. Example: Closes #123

## Security considerations

Note any security implications (auth, secrets, PII, sandboxing, etc.).

## 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
…#3670)

## Summary

This PR removes the `access_profile_id` column and its associated index from the `governance_virtual_keys` table, reverting the previously applied `migrationAddVKAccessProfileIDColumn` migration.

## Changes

- Added a new migration `migrationDropVKAccessProfileIDColumn` that drops the `idx_governance_virtual_keys_access_profile_id` index and the `access_profile_id` column from `governance_virtual_keys`, if they exist.
- Registered the new migration in `triggerMigrations` immediately after the migration that originally added the column, ensuring correct ordering.

## Type of change

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

## Affected areas

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

## How to test

```sh
go test ./...
```

Verify that after running migrations, the `governance_virtual_keys` table no longer contains the `access_profile_id` column or its index. Confirm that the migration runs cleanly on both fresh and existing databases where the column may or may not already be present.

## Screenshots/Recordings

N/A

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

None. This change removes an unused column and index with no impact on authentication, secrets, or PII handling.

## 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
…ns, OAuth schema refactor, and new columns (#3671)

## Summary

Extends the migration test script to cover v1.5.3 schema changes, including new tables (`feature_flags`, `temp_tokens`) and new columns added across config store and log store tables. Also refactors the per-user OAuth insert generation to handle both the legacy v1.5.0-prerelease4 schema and the v1.5.3 refactored schema, where `oauth_per_user_*` tables were dropped and `oauth_user_sessions`/`oauth_user_tokens` were restructured.

## Changes

- Added `generate_feature_flags_insert_postgres` and `generate_feature_flags_insert_sqlite` functions to seed the `feature_flags` table introduced in v1.5.3 via `migrationAddFeatureFlagsTable`.
- Added `generate_temp_tokens_insert_postgres` and `generate_temp_tokens_insert_sqlite` functions to seed the `temp_tokens` table introduced in v1.5.3 via `migrationAddTempTokensTable`.
- Both new insert generators are wired into `append_dynamic_mcp_clients_insert` for both PostgreSQL and SQLite paths.
- Added v1.5.3 dynamic column UPDATE blocks for both PostgreSQL and SQLite covering:
  - `config_client.metadata_json`
  - `framework_configs.model_parameters_url` and `config_hash`
  - `governance_teams.source_id` and `calendar_aligned`
  - `governance_virtual_keys.access_profile_id`
  - `logs.cluster_node_id`, `budget_ids`, and `rate_limit_ids`
  - `mcp_tool_logs.user_id`, `team_id`, `customer_id`, and `business_unit_id`
- Refactored `generate_per_user_oauth_tables_insert_postgres` and extracted a new `generate_per_user_oauth_tables_insert_sqlite` function. Both now branch on schema version: if `oauth_per_user_clients` exists, the prerelease4 schema is used; if `oauth_user_sessions.session_id` exists, the v1.5.3 refactored schema (using `session_id` + `flow_mode` instead of `session_token`/`gateway_session_id`) is used instead.

## Type of change

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

## Affected areas

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

## How to test

Run the migration test workflow against a deployment that includes v1.5.3 migrations and verify that the test script seeds all new tables and columns without errors. Also run against a pre-v1.5.3 schema to confirm the conditional guards correctly skip missing tables and columns.

```sh
bash .github/workflows/scripts/run-migration-tests.sh
```

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

Covers migration test coverage for v1.5.3 schema additions.

## Security considerations

No new secrets or auth flows are introduced. Test data uses placeholder tokens and hashes that are not used in production.

## Checklist

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

This PR addresses two independent improvements: preventing reads on already-closed streaming connections, and tracking which user created a virtual key.

## Changes

- Added a `ctx` field to `idleTimeoutReader` so that it can check the `BifrostContextKeyConnectionClosed` flag before attempting a `Read()`. If the connection is already marked as closed, the read returns immediately with `(0, nil)` instead of blocking or erroring.
- Added a `CreatedBy` field (`*string`) to `TableVirtualKey` with a database index (`idx_virtual_key_created_by`) to record the creator of each virtual key.

## Type of change

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

## Affected areas

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

## How to test

```sh
# Core/Transports
go version
go test ./...
```

- To validate the idle timeout reader fix: establish a streaming connection, close it, and confirm no further reads are attempted on the closed stream.
- To validate the `CreatedBy` field: create a virtual key and confirm the `created_by` column is populated and indexed in the database.

## Screenshots/Recordings

N/A

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

N/A

## Security considerations

The `CreatedBy` field stores a user identifier on virtual keys. Ensure that this value is not populated with sensitive PII beyond what is already stored in the system, and that access controls on virtual key records remain enforced.

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

Fixes an issue where toast notifications were unclickable when a modal was open. Radix UI's `react-remove-scroll` sets `pointer-events: none` on elements outside the modal, which inadvertently blocked interaction with Sonner toasts.

## Changes

- Added a CSS rule to force `pointer-events: auto` on `[data-sonner-toaster]`, ensuring toasts remain interactive even when a modal overlay is active.

## Type of change

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

## Affected areas

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

## How to test

1. Open any modal dialog in the UI.
2. Trigger a toast notification while the modal is open.
3. Verify the toast is visible and can be clicked/dismissed without closing the modal first.

## Screenshots/Recordings

Before: Toasts displayed behind/blocked by modal overlay and could not be clicked.
After: Toasts remain fully interactive while a modal is open.

## 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
…rule and virtual key sheets (#3675)

## Summary

Cleans up the routing rule sheet UI by removing icon decorations from action buttons and fixing layout issues where the form content doesn't grow to fill available space in both the routing rule and virtual key sheets.

## Changes

- Removed the `X` and `Save` icons from the Cancel and Save/Update buttons in the routing rule sheet, leaving text-only labels
- Added `grow` and `flex flex-col` classes to the routing rule sheet form and its inner container so the form expands to fill the sheet height correctly
- Added `grow` to the virtual key sheet's inner content div for consistent layout behavior
- Moved the `RbacOperation`, `RbacResource`, and `useRbac` import to be grouped with other non-local imports

## 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 the routing rules sheet (create or edit a rule) and verify the form content fills the full height of the sheet without collapsing.
2. Confirm the Cancel and Save/Update buttons display text only, without icons.
3. Open the virtual key sheet and verify the form content similarly fills the available height.

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

## Screenshots/Recordings

Before/after screenshots showing the button label changes and corrected sheet layout are recommended.

## 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
… and scrollable body (#3676)

## Summary

Fixes the Virtual Keys table layout so it fills the available viewport height and scrolls internally, rather than causing the entire page to scroll. The table header remains sticky at the top while the body scrolls, and the pinned action column z-indices are corrected to prevent overlap issues.

## Changes

- Converted the outer container to a flex column layout with `grow` and `overflow-hidden` so the table section expands to fill remaining space without overflowing the page.
- Added `shrink-0` to the header/toolbar rows so they don't compress when space is constrained.
- Made the table container use `min-h-0 grow overflow-hidden` and passed `containerClassName="h-full overflow-auto"` so scrolling is scoped to the table body.
- Made `TableHeader` sticky (`sticky top-0 z-20`) with a background so column headers remain visible during vertical scroll.
- Adjusted z-index on the pinned right-side `TableHead` to `z-30` (above the sticky header row) and the pinned `TableCell` to `z-20` to maintain correct stacking order.
- Reduced pagination text to `text-xs` for visual 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. Navigate to the Virtual Keys page with enough keys to require scrolling.
2. Verify the page itself does not scroll — only the table body scrolls.
3. Verify the column headers remain visible (sticky) as you scroll down.
4. Verify the pinned actions column on the right does not disappear behind the sticky header.
5. Verify row hover states on the pinned actions cell render correctly.

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

## Screenshots/Recordings

Before/after screenshots showing the table scrolling within its container rather than the full page scrolling are recommended.

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

`idleTimeoutReader` had several correctness issues: the cleanup function could return before an in-flight timer callback finished closing the body stream, panics from the underlying reader during a timeout-triggered close were unhandled, a nil context caused a panic, and a closed connection returned `nil` instead of a meaningful error.

## Changes

- Added a `timerDone` channel and `timerDoneOnce`/`cleanupOnce` guards so that `cleanup()` blocks until any concurrently running timer callback has fully completed, preventing races between cleanup and the idle timeout close path.
- Added a `recover()` deferred in `Read()` that catches panics from the underlying reader (e.g. reads on a closed pipe after timeout) and converts them into `ErrStreamIdleTimeout` or `ErrStreamClosed` rather than crashing.
- Extracted `connectionClosed()` and `closedReadError()` helpers to centralise nil-context safety and consistent error selection logic.
- Changed the connection-closed early-return in `Read()` to return `ErrStreamClosed` instead of `(0, nil)`, giving callers a clear signal.
- Introduced `ErrStreamClosed` as a named sentinel error for streams closed by cancellation or cleanup before a read begins.
- Added four new tests covering: nil context safety, closed-context returning `ErrStreamClosed`, panic recovery after timeout, and cleanup blocking until the timer callback finishes.

## Type of change

- [x] Bug fix

## Affected areas

- [x] Core (Go)

## How to test

```sh
go test ./core/providers/utils/... -v -race
```

All four new tests should pass, including `TestIdleTimeoutReader_CleanupWaitsForRunningTimerCallback` which validates the synchronisation behaviour under the race detector.

## Breaking changes

- [ ] Yes
- [x] No

## Security considerations

None. The changes are scoped to internal stream lifecycle management with no impact on auth, secrets, or PII handling.

## Checklist

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

MCP tool log entries were not being stamped with DAC (Data Access Control) governance ownership fields (`user_id`, `team_id`, `customer_id`, `business_unit_id`) from the request context. This meant MCP logs could not be attributed to the correct organizational entities for governance and auditing purposes.

## Changes

- Introduced `applyMCPGovernanceFieldsToEntry`, a helper that reads governance identity fields from the `BifrostContext` and stamps them onto an `MCPToolLog` entry.
- Called this helper in both `PreMCPHook` and `PostMCPHook` so that governance fields are applied regardless of whether the log entry originates from a normal pre/post flow or the post-hook fallback path (where no pending pre-hook entry exists).
- Added `assertMCPLogGovernanceFields` as a shared test helper to validate all four governance fields on a log entry.
- Extended `TestMCPHooksDeferDBWriteUntilPostHookBatch` to set governance context values and assert they are persisted correctly.
- Added `TestPostMCPHookFallbackStampsGovernanceFields` to verify that fallback-created MCP log entries (post-hook only, no prior pre-hook) also carry the correct governance fields.

## Type of change

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

## Affected areas

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

## How to test

```sh
go test ./plugins/logging/... -run TestMCPHooksDeferDBWriteUntilPostHookBatch
go test ./plugins/logging/... -run TestPostMCPHookFallbackStampsGovernanceFields
go test ./plugins/logging/...
```

Both tests should pass. Verify that after a `PreMCPHook` or `PostMCPHook` call with governance context values set, the resulting `MCPToolLog` entry in the store has non-nil `UserID`, `TeamID`, `CustomerID`, and `BusinessUnitID` matching the values placed in the context.

## Screenshots/Recordings

N/A

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

N/A

## Security considerations

Governance ownership fields (`user_id`, `team_id`, `customer_id`, `business_unit_id`) are sourced exclusively from the authenticated request context and are only written when non-empty, ensuring no unintended data leakage or field overwriting occurs.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [x] 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
@BearTS
BearTS force-pushed the 05-20-chore_add_timeout_example_in_providers_yaml_file branch from ce2345a to ed73d93 Compare May 22, 2026 08:20
@BearTS
BearTS force-pushed the 05-20-chore_expose_grpc_service_port_if_mentioned branch from bcb28db to 8d84eb7 Compare May 22, 2026 08:20
@BearTS
BearTS force-pushed the 05-20-chore_add_timeout_example_in_providers_yaml_file branch from ed73d93 to 73494ef Compare May 22, 2026 09:41
@BearTS
BearTS force-pushed the 05-20-chore_expose_grpc_service_port_if_mentioned branch from 8d84eb7 to 490e6ad Compare May 22, 2026 09:41

akshaydeo commented May 25, 2026

Copy link
Copy Markdown
Contributor

Merge activity

  • May 25, 6:33 AM UTC: A user started a stack merge that includes this pull request via Graphite.
  • May 25, 6:34 AM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo
akshaydeo changed the base branch from 05-20-chore_add_timeout_example_in_providers_yaml_file to graphite-base/3617 May 25, 2026 06:33
@akshaydeo
akshaydeo changed the base branch from graphite-base/3617 to dev May 25, 2026 06:33
@akshaydeo
akshaydeo dismissed coderabbitai[bot]’s stale review May 25, 2026 06:33

The base branch was changed.

@akshaydeo
akshaydeo merged commit c298143 into dev May 25, 2026
9 checks passed
@akshaydeo
akshaydeo deleted the 05-20-chore_expose_grpc_service_port_if_mentioned branch May 25, 2026 06:34
akshaydeo pushed a commit that referenced this pull request May 25, 2026
#3617)

## Summary

Adds optional gRPC port support to the Bifrost Helm chart, allowing the cluster to expose a gRPC endpoint when configured.

## Changes

- Added a conditional gRPC container port (`TCP`) to the deployment template, rendered only when `bifrost.cluster.grpc` is defined in values
- Added a corresponding conditional gRPC service port to the service template, targeting the named `grpc` port

## Type of change

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

## Affected areas

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

## How to test

Set the following in your Helm values and confirm the deployment and service include the gRPC port:

```yaml
bifrost:
  cluster:
    grpc:
      port: 50051
```

```sh
helm template ./helm-charts/bifrost | grep -A 4 grpc
```

Expected output should include the `grpc` port entry in both the deployment container ports and the service spec.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

The gRPC port is only exposed when explicitly configured. No authentication or TLS is configured at the Helm chart level; ensure appropriate network policies or ingress controls are in place when enabling this port.

## 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
Vaibhav701161 pushed a commit that referenced this pull request May 26, 2026
#3617)

## Summary

Adds optional gRPC port support to the Bifrost Helm chart, allowing the cluster to expose a gRPC endpoint when configured.

## Changes

- Added a conditional gRPC container port (`TCP`) to the deployment template, rendered only when `bifrost.cluster.grpc` is defined in values
- Added a corresponding conditional gRPC service port to the service template, targeting the named `grpc` port

## Type of change

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

## Affected areas

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

## How to test

Set the following in your Helm values and confirm the deployment and service include the gRPC port:

```yaml
bifrost:
  cluster:
    grpc:
      port: 50051
```

```sh
helm template ./helm-charts/bifrost | grep -A 4 grpc
```

Expected output should include the `grpc` port entry in both the deployment container ports and the service spec.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

The gRPC port is only exposed when explicitly configured. No authentication or TLS is configured at the Helm chart level; ensure appropriate network policies or ingress controls are in place when enabling this port.

## 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 pushed a commit that referenced this pull request May 26, 2026
#3617)

## Summary

Adds optional gRPC port support to the Bifrost Helm chart, allowing the cluster to expose a gRPC endpoint when configured.

## Changes

- Added a conditional gRPC container port (`TCP`) to the deployment template, rendered only when `bifrost.cluster.grpc` is defined in values
- Added a corresponding conditional gRPC service port to the service template, targeting the named `grpc` port

## Type of change

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

## Affected areas

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

## How to test

Set the following in your Helm values and confirm the deployment and service include the gRPC port:

```yaml
bifrost:
  cluster:
    grpc:
      port: 50051
```

```sh
helm template ./helm-charts/bifrost | grep -A 4 grpc
```

Expected output should include the `grpc` port entry in both the deployment container ports and the service spec.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

The gRPC port is only exposed when explicitly configured. No authentication or TLS is configured at the Helm chart level; ensure appropriate network policies or ingress controls are in place when enabling this port.

## 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
maximhq#3617)

## Summary

Adds optional gRPC port support to the Bifrost Helm chart, allowing the cluster to expose a gRPC endpoint when configured.

## Changes

- Added a conditional gRPC container port (`TCP`) to the deployment template, rendered only when `bifrost.cluster.grpc` is defined in values
- Added a corresponding conditional gRPC service port to the service template, targeting the named `grpc` port

## Type of change

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

## Affected areas

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

## How to test

Set the following in your Helm values and confirm the deployment and service include the gRPC port:

```yaml
bifrost:
  cluster:
    grpc:
      port: 50051
```

```sh
helm template ./helm-charts/bifrost | grep -A 4 grpc
```

Expected output should include the `grpc` port entry in both the deployment container ports and the service spec.

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

## Security considerations

The gRPC port is only exposed when explicitly configured. No authentication or TLS is configured at the Helm chart level; ensure appropriate network policies or ingress controls are in place when enabling this port.

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

8 participants