Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
e197521
Replace direct ryu usage with zmij
Copilot Mar 18, 2026
01d5be7
Add router-level in-flight GraphQL request deduplication (#849)
kamilkisiela Mar 24, 2026
d2e46f4
Add patch changeset for zmij migration
Copilot Mar 24, 2026
46be1a1
fix(ci): use another supergraph for graphql-over-http audit (#877)
dotansimha Mar 25, 2026
51c001f
chore: add inbound dedupe benchmark scenario (#878)
kamilkisiela Mar 26, 2026
a34896d
fix(disable_introspection): allow to query `__typename` when introspe…
dotansimha Mar 26, 2026
1ae81ec
chore(release): router crates and artifacts (#874)
knope-bot[bot] Mar 26, 2026
1c2d384
fix(router): fix null field handling in entity request projection and…
kamilkisiela Mar 29, 2026
225587c
chore(release): router crates and artifacts (#883)
knope-bot[bot] Mar 29, 2026
9637749
fix(qp): preserve client aliases in mismatch output rewrites (#870)
gonzo-32 Mar 31, 2026
bbc8f75
chore(release): router crates and artifacts (#885)
knope-bot[bot] Mar 31, 2026
a109ad8
chore(node-addon): changeset for the fixes in the query planner (#886)
ardatan Apr 1, 2026
bfd41c2
chore(release): router crates and artifacts (#887)
knope-bot[bot] Apr 1, 2026
5630f43
Replace graphiql with laboratory (#791)
mskorokhodov Apr 1, 2026
4f1be62
chore: refactor install script for better UX (#892)
kamilkisiela Apr 3, 2026
fc1b728
fix(deps): update ntex and its code, retry e2e tests before failing c…
enisdenjo Apr 12, 2026
5c78153
chore(release): router crates and artifacts (#890)
knope-bot[bot] Apr 12, 2026
fd4955a
fix(release): fix workspace root discovery issues in build script
dotansimha Apr 12, 2026
70006ff
fix(router): move build script to the right place to avoid publish
dotansimha Apr 13, 2026
bbbb50e
fix(query-planner): planning for conditional inline fragments and fie…
kamilkisiela Apr 12, 2026
c789b62
fix(executor): correct timeout error message (#901)
ardatan Apr 12, 2026
9ef2f80
chore(bump): added missing changeset to bump release flow
dotansimha Apr 13, 2026
1623897
chore: added missing changeset
dotansimha Apr 13, 2026
1d12661
chore(release): router crates and artifacts (#904)
knope-bot[bot] Apr 13, 2026
6e026f9
fix: release issues with build.rs
dotansimha Apr 13, 2026
f427bf1
chore(release): remove `scopes` from knope in order to use changeset
dotansimha Apr 13, 2026
ab28d3a
fix: configure knope to ignore conventional_commits
dotansimha Apr 13, 2026
bd27177
chore(release): relax knope bot check config
dotansimha Apr 13, 2026
9e668d6
chore: More deflakeify of E2Es (#907)
enisdenjo Apr 13, 2026
3e51da4
chore(deps): bump rand from 0.10.0 to 0.10.1 in the cargo group acros…
dependabot[bot] Apr 14, 2026
83b1543
Subscriptions (#620)
enisdenjo Apr 14, 2026
e4a8080
Prevent hang in multiple_subscriptions_in_parallel test (#912)
enisdenjo Apr 14, 2026
d71e02b
enhance(query-planner): use less Into and From traits, to have a clea…
ardatan Apr 15, 2026
dd2a640
chore(release): router crates and artifacts (#911)
knope-bot[bot] Apr 15, 2026
6fbbcc1
fix(release): correct changesets
dotansimha Apr 15, 2026
33f545f
chore(release): router crates and artifacts (#914)
knope-bot[bot] Apr 15, 2026
e8d206f
chore: move apollo-router-hive-fork to router repo (#723)
ardatan Apr 15, 2026
e610471
chore(deps): bump the cargo group across 1 directory with 5 updates (…
dependabot[bot] Apr 15, 2026
20fe850
fix(node-addon): TypeScript types for `Subscription.primary` (#916)
ardatan Apr 15, 2026
06e5e23
chore(release): router crates and artifacts (#917)
knope-bot[bot] Apr 15, 2026
dce2112
fix(node-addon): `Subscription.primary` type is `FetchNode` (#918)
ardatan Apr 15, 2026
2223fc3
chore(release): router crates and artifacts (#919)
knope-bot[bot] Apr 15, 2026
43c494b
Update pull request reviewing guidelines (#925)
kamilkisiela Apr 16, 2026
7bb097f
Persisted Documents (#868)
kamilkisiela Apr 17, 2026
2831a0f
enhance(plugins): introduce `EarlyHTTPResponse` for a better API to r…
ardatan Apr 17, 2026
d8c1db0
fix(query-planner): handle both `@skip` and `@include` directives on …
ardatan Apr 17, 2026
00ed4ce
Add GraphiQL feature flag (#928)
kamilkisiela Apr 17, 2026
c7f9144
chore(fork): fix compilation error in apollo plugin (#930)
kamilkisiela Apr 17, 2026
1ec4086
feat(router): TLS support (#810)
ardatan Apr 17, 2026
79e94de
fix(changes): indent level
dotansimha Apr 19, 2026
4005fad
fix(changeset): fix title
dotansimha Apr 19, 2026
152fc7b
fix(ci): fixes for apollo-router-fork build (#920)
dotansimha Apr 20, 2026
e32e390
fix(ci): fix path for apollo-router-fork cargo file
dotansimha Apr 20, 2026
d9a0b6b
fix(ci): correct workflow name
dotansimha Apr 20, 2026
4ab5dd9
fix(ci): run apollo-router test command only when needed
dotansimha Apr 20, 2026
3601edc
fix(release): changesets adjustments
dotansimha Apr 20, 2026
42ba7d4
fix(release): node-addon is now released when query-planner changes
dotansimha Apr 20, 2026
032884f
chore(release): router crates and artifacts (#929)
knope-bot[bot] Apr 20, 2026
e71415d
Test HTTP/2 Support and add a flag for H2C to subgraphs (#933)
ardatan Apr 27, 2026
b009c22
chore(deps): bump the cargo group across 2 directories with 2 updates…
dependabot[bot] Apr 27, 2026
1b7fcbe
chore(deps-dev): bump the npm_and_yarn group across 1 directory with …
dependabot[bot] Apr 27, 2026
4cbd0cc
fix(release): adjust changeset for h2c
dotansimha Apr 27, 2026
34a9040
chore(release): router crates and artifacts (#943)
knope-bot[bot] Apr 27, 2026
93b0f3a
chore: migrate tests to `nextest` (#931)
kamilkisiela Apr 28, 2026
1616475
enhancement(router): update lab to 0.1.6 (#934)
mskorokhodov Apr 28, 2026
a79f3b1
fix(query-planner): added missing `isRepeatable` on `type __Directive…
dotansimha May 1, 2026
5743db7
Add OTel client and peer network attributes (#941)
kamilkisiela May 4, 2026
3fc3c51
Replace Docker-based Redis with mock rust server (#954)
kamilkisiela May 4, 2026
ac67bb9
avoid propagating @include/@skip conditions to unconditional fetches …
kamilkisiela May 4, 2026
b870e9a
chore: replace k6 benchmark validation with wrk + JSON hash compariso…
Copilot May 4, 2026
9bb5c33
Fix multiple inline fragments on same concrete type within interface …
Copilot May 5, 2026
0e041e2
Coprocessors (#927)
kamilkisiela May 5, 2026
6c7df68
uuid upgrade (#955)
kamilkisiela May 5, 2026
b970b92
fix fragment spread normalization across field boundaries and preserv…
kamilkisiela May 5, 2026
1654191
feat(hive-console-sdk): dynamic exclusions via VRL expressions (#932)
ardatan May 5, 2026
d69f110
Update dynamic-exclusions.md
kamilkisiela May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
router = "run --package hive-router"
dev = "run --package qp-dev-cli"
subgraphs = "run --package subgraphs"
test_qp = "test --package hive-router-query-planner"
test_all = "test --workspace --exclude e2e --exclude *-plugin-example"
test_e2e = "test --package e2e -- --test-threads=5"
test_qpe = "test --package hive-router-plan-executor"
test_plugin_examples = "test --package *-plugin-example -- --test-threads=5"
test_qp = "nextest run --package hive-router-query-planner"
test_all = "nextest run --workspace --exclude e2e --exclude *-plugin-example"
test_e2e = "nextest run --package e2e --test-threads 5"
test_qpe = "nextest run --package hive-router-plan-executor"
test_plugin_examples = "nextest run --package *-plugin-example --test-threads 5"
"clippy:fix" = "clippy --all --fix --allow-dirty --allow-staged"
"router-config" = "run --release -p hive-router-config router-config.schema.json"
12 changes: 12 additions & 0 deletions .changeset/added_missing_isrepeatable_on_type_directive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
hive-router-query-planner: patch
hive-router-plan-executor: patch
hive-router: patch
node-addon: patch
---

# Added missing `isRepeatable` on `type __Directive`

The router's introspection schema was resolving `isRepeatable`, but it did not appear in the public (consumer) schema, leading to validation errors when introspection schema was executed through Laboratory.

This change adds the missing `isRepeatable: Boolean!` to `type __Directive`, according to the [GraphQL introspection spec](https://github.com/graphql/graphql-spec/blob/main/spec/Section%204%20--%20Introspection.md).
13 changes: 13 additions & 0 deletions .changeset/avoid-include-skip-condition-propagation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
hive-router-query-planner: patch
hive-router-plan-executor: patch
hive-router: patch
node-addon: patch
---

# Avoid propagating `@include`/`@skip` conditions to unconditional fetches

Fixed query planner condition propagation logic to avoid wrapping unconditional fetches
in conditional blocks when merging steps. This ensures that fields without directives are
not incorrectly gated by conditions from other steps, allowing for correct execution of
queries with mixed conditional and unconditional selections.
31 changes: 31 additions & 0 deletions .changeset/clever-pandas-tickle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
hive-router-internal: minor
hive-router-plan-executor: minor
hive-router: minor
---

## Improve HTTP server request OTel tracing with client and peer network attributes.

The `http.server` span now includes:
- `client.address` and `client.port` from a configurable request header
- `network.peer.address` and `network.peer.port` from the address of the incoming connection

```yaml
telemetry:
client_identification:
# Default - use socket peer only
ip_header: null

# Header name - use the left-most valid IP from the header
ip_header: x-forwarded-for

# Trusted proxies - only trust the header when the socket peer is trusted
ip_header:
name: x-forwarded-for
trusted_proxies:
- 10.0.0.0/8
- 192.168.0.0/16
```

In trusted proxies scenario, the Router scans the configured header from right to left, skips trusted proxy IP ranges, and records the first non-trusted IP as `client.address`.
If no valid client IP can be resolved, the Router falls back to the socket peer address.
37 changes: 37 additions & 0 deletions .changeset/coprocessors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
hive-router: minor
hive-router-internal: minor
hive-router-plan-executor: minor
hive-router-config: minor
---

## Coprocessors

Introduces Coprocessors as language agnostic way to extend Hive Router.

**Supports coprocessor stages:**
- `router.request`
- `router.response`
- `graphql.request`
- `graphql.analysis`
- `graphql.response`

**Stage capabilities:**
- include selected request/response fields in stage payloads (headers, body, context, and optional SDL depending on stage config)
- mutate request body/headers/context for downstream pipeline execution
- short-circuit and return an immediate HTTP response from a stage

**Transport and endpoint support:**
- `http://` and `unix://` (unix socket domain) endpoints
- http/1, http/2 and h2c protocols

**Error handling:**
- coprocessor failures map to server-side failures (500)
- client-facing GraphQL errors are masked as Internal server error
- structured error codes are preserved in GraphQL extensions.code
- detailed coprocessor failure reasons remain in server logs/telemetry only

**Adds coprocessor metrics:**
- hive.router.coprocessor.requests_total
- hive.router.coprocessor.duration
- hive.router.coprocessor.errors_total
45 changes: 45 additions & 0 deletions .changeset/dynamic-exclusions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
hive-router: minor
hive-console-sdk: minor
hive-apollo-router-plugin: minor
hive-router-internal: patch
hive-router-plan-executor: patch
---

# Dynamic Exclusions

## Dynamic Exclusions in Hive Router

Hive Router now supports dynamic exclusions, allowing you to exclude specific requests from usage reporting based on custom logic. This feature is useful for scenarios where you want to skip telemetry for certain requests, such as health checks or specific endpoints.

The previous operation-name list format is still supported for backward compatibility.

### Usage
```diff
- exclude: ['ExcludedOp']
+ exclude:
+ expression: '.request.operation.name == "ExcludedOp"'
```

Both of the following are valid and supported:

```yaml
# legacy format
exclude:
- ExcludedOp

# dynamic expression format
exclude:
expression: '.request.operation.name == "ExcludedOp"'
```

The details about expression context is documented in the [Hive Router documentation](https://the-guild.dev/graphql/hive/docs/router/configuration/expressions).

## Dynamic Exclusions in Apollo Router

As in Hive Router, Apollo Router used to support only operation name based exclusions. With the new dynamic exclusions feature, you can now specify custom logic to exclude requests from usage reporting.


# New `add_report_with_request` method in Hive Console SDK

In order to support exclusions based on request properties, a new method `add_report_with_request` has been added to the Hive Console SDK. This method allows you to include the request information in the report, which can then be used in the dynamic exclusion logic.
9 changes: 9 additions & 0 deletions .changeset/enhancement_update_lab_to_016.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
hive-router: patch
---

# enhancement: update lab to 0.1.6

#934 by @mskorokhodov

Update hive lab to 0.1.6 to support new query plan visualization + fetch settings
25 changes: 25 additions & 0 deletions .changeset/fix_fragments_dropped_in_interface.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
hive-router-query-planner: patch
hive-router-plan-executor: patch
node-addon: patch
hive-router: patch
---

Fix fragments being dropped when multiple inline fragments target the same concrete type within an abstract type fragment.

Previously, when a query contained two or more inline fragments on the same concrete type nested inside an interface or union fragment, only the first fragment's fields were included in the query plan — all subsequent ones were silently dropped.

**Example query that previously returned only `title`:**

```graphql
query {
films {
... on Node {
... on Film { title }
... on Film { director }
}
}
}
```

Both fields are now correctly returned.
5 changes: 5 additions & 0 deletions .changeset/lab_upgrade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
hive-router: patch
---

# Upgrade Laboratory to v0.1.7
10 changes: 10 additions & 0 deletions .changeset/norm_fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
hive-router-query-planner: patch
hive-router-plan-executor: patch
hive-router: patch
node-addon: patch
---

# Fix fragment handling

Fix fragment handling for some queries that use reusable fragments with conditional directives
9 changes: 9 additions & 0 deletions .changeset/operation_kind_enum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
hive-router-plan-executor: patch
hive-router-internal: patch
hive-router-query-planner: patch
hive-router: patch
node-addon: patch
---

## Adjustments in operation's kind being Enum and not &'static str
68 changes: 42 additions & 26 deletions .changeset/release-sync.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ set -e

CHANGESET_DIR=".changeset"

# Define your list of target directories here (space-separated)
# You can also override this by passing arguments to the script: TARGET_DIRS="${@:-.}"
TARGET_DIRS=". ./apollo-router-workspace"

# Function to extract package names and their corresponding filenames
get_pkg_file_pairs() {
grep -rE "^[^:]+: (patch|minor|major)" "$CHANGESET_DIR"/*.md 2>/dev/null | \
Expand All @@ -11,40 +15,52 @@ get_pkg_file_pairs() {

echo "🔍 Cascading changes (scoped per file)..."

METADATA=$(cargo metadata --format-version 1 --no-deps)
for DIR in $TARGET_DIRS; do
echo "📂 Processing workspace: $DIR"

MANIFEST_PATH="$DIR/Cargo.toml"

if [ ! -f "$MANIFEST_PATH" ]; then
echo "⚠️ No Cargo.toml found at $MANIFEST_PATH. Skipping..."
continue
fi

# Fetch metadata for the specific directory
METADATA=$(cargo metadata --manifest-path "$MANIFEST_PATH" --format-version 1 --no-deps)

while true; do
PAIRS=$(get_pkg_file_pairs)
NEW_CHANGE_FOUND=false
while true; do
PAIRS=$(get_pkg_file_pairs)
NEW_CHANGE_FOUND=false

for PAIR in $PAIRS; do
PKG=$(echo "$PAIR" | cut -d: -f1)
FILE=$(echo "$PAIR" | cut -d: -f2)
for PAIR in $PAIRS; do
PKG=$(echo "$PAIR" | cut -d: -f1)
FILE=$(echo "$PAIR" | cut -d: -f2)

# Find publishable packages that depend on $PKG
DEPENDENTS=$(echo "$METADATA" | jq -r ".packages[] |
select(.dependencies[].name == \"$PKG\") |
select(.publish == null or (.publish | length > 0)) |
.name")
# Find publishable packages that depend on $PKG
DEPENDENTS=$(echo "$METADATA" | jq -r ".packages[] |
select(.dependencies[].name == \"$PKG\") |
select(.publish == null or (.publish | length > 0)) |
.name")

for DEP in $DEPENDENTS; do
# SCOPED CHECK: Only check if the dependency is missing FROM THIS SPECIFIC FILE
if ! grep -qE "^$DEP:" "$FILE" 2>/dev/null; then
echo "🔗 In $FILE: $DEP depends on $PKG. Adding..."
for DEP in $DEPENDENTS; do
# SCOPED CHECK: Only check if the dependency is missing FROM THIS SPECIFIC FILE
if ! grep -qE "^$DEP:" "$FILE" 2>/dev/null; then
echo "🔗 In $FILE: $DEP depends on $PKG. Adding..."

# macOS/BSD compatible sed insertion
sed -i '' "2,\$s/^---$/$DEP: patch\\
# macOS/BSD compatible sed insertion
sed -i '' "2,\$s/^---$/$DEP: patch\\
---/" "$FILE"

NEW_CHANGE_FOUND=true
fi
NEW_CHANGE_FOUND=true
fi
done
done
done

# If no files were modified in this pass, we are done
if [ "$NEW_CHANGE_FOUND" = false ]; then
break
fi
# If no files were modified in this pass for this directory, break the while loop
if [ "$NEW_CHANGE_FOUND" = false ]; then
break
fi
done
done

echo "✅ All changesets internally consistent."
echo "✅ All changesets internally consistent across all directories."
7 changes: 7 additions & 0 deletions .changeset/replace-ryu-with-zmij.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
graphql-tools: patch
hive-router-plan-executor: patch
---

Replace direct `ryu` usage with `zmij` for float formatting in `graphql-tools` and `hive-router-plan-executor`.

12 changes: 12 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Minimum recommended version
nextest-version = "0.9.133"

[profile.default]
# Show output (stdout/stderr) of failed tests
failure-output = "immediate"
# Show output of successful tests only when --no-capture is passed
success-output = "never"
# Don't stop on the first failure
fail-fast = false
# Mark as slow test after 10s and terminate after 3 retries
slow-timeout = { period = "10s", terminate-after = 3 }
45 changes: 45 additions & 0 deletions .gemini/styleguide.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,48 @@ We are using `knope` with changesets for declaring changes.
If you detect a new file in a PR under `.changeset/` directory, please confirm the following rules:

- If a PR touches `config` crate and adds/changes to the `HiveRouterConfig` struct, it must have a `router` changeset that contains a YAML example on how the configuration needs to be used.

---

## Pull Request Reviewing


### What to Look For

Code that looks wrong in isolation may be correct given surrounding logic—and vice versa.
Read the full file to understand existing patterns, control flow, and error handling.

**Bugs** - Your primary focus.
- Logic errors, off-by-one mistakes, incorrect conditionals
- If-else guards: missing guards, incorrect branching, unreachable code paths
- Edge cases: null/empty/undefined inputs, error conditions, race conditions
- Security issues: injection, auth bypass, data exposure
- Broken error handling that swallows failures, throws unexpectedly or returns error types that are not caught.

**Structure** - Does the code fit the codebase?
- Does it follow existing patterns and conventions?
- Are there established abstractions it should use but doesn't?
- Excessive nesting that could be flattened with early returns or extraction

**Performance** - Only flag if obviously problematic.
- O(n²) on unbounded data, N+1 queries, blocking I/O on hot paths

**Behavior Changes** - If a behavioral change is introduced, raise it (especially if it's possibly unintentional).

---

### Before You Flag Something

**Be certain.** If you're going to call something a bug, you need to be confident it actually is one.

- Only review the changes - do not review pre-existing code that wasn't modified
- Don't flag something as a bug if you're unsure - investigate first
- Don't invent hypothetical problems - if an edge case matters, explain the realistic scenario where it breaks
- If you need more context to be sure, use the tools below to get it

**Don't be a zealot about style.** When checking code against conventions:

- Verify the code is *actually* in violation. Don't complain about else statements if early returns are already being used correctly.
- Some "violations" are acceptable when they're the simplest option.
- Excessive nesting is a legitimate concern regardless of other style choices.
- Don't flag style preferences as issues unless they clearly violate established project conventions.
Loading
Loading