Skip to content

feat(proto): support typed message metadata (#1645) - #1976

Open
vishalsahare wants to merge 65 commits into
agntcy:mainfrom
vishalsahare:typed-message-metadata
Open

vishalsahare wants to merge 65 commits into
agntcy:mainfrom
vishalsahare:typed-message-metadata

Conversation

@vishalsahare

Copy link
Copy Markdown
  • This update changes SLIM message metadata from a string-only Protobuf map to google.protobuf.Struct, enabling typed metadata values.

  • Metadata APIs

    • Updated ProtoMessage and its builder to:
    • Create metadata lazily with get_or_insert_default().
    • Insert values implementing Into<prost_types::Value>.
    • Get and remove typed Protobuf values.
    • Set or retrieve the complete metadata Struct.
    • Represent absent metadata as None.
  • Compatibility conversions

    • These preserve existing string-only interfaces in session, RPC, and language bindings. When converting back to a string map, non-string values are intentionally omitted
  • Dependencies

    • Added prost-types dependencies to crates that now access Protobuf Struct and Value directly.
  • Tests

    • Added or updated tests covering:
    • String metadata insertion.
    • Typed metadata values.
    • Nested and list values.
    • Null values.
    • Protobuf encode/decode round trips.
    • Session publishing with metadata.
    • Targeted verification passed:
      • Proto message tests: 19 passed
      • Session metadata test: 1 passed
      • Formatting check: passed
  • Bugfix

  • New Feature

  • Breaking Change

  • Refactor

  • Documentation

  • Other (please describe)

  • I have read the contributing guidelines

  • Existing issues have been referenced (where applicable)

  • I have verified this change is not present in other open pull requests

  • Functionality is documented

  • All code style checks pass

  • New code contribution is covered by automated tests

  • All new and existing tests pass

@vishalsahare
vishalsahare requested a review from a team as a code owner August 12, 2026 16:00
@msardara

Copy link
Copy Markdown
Member

Hello @vishalsahare! Thanks a lot for your contribution 🙏

I see there are a bit of merge conflicts. Would you please rebase your branch on top of latest main?

@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch from ee0d7bf to 061517f Compare August 13, 2026 18:57
@vsahare-gh

Copy link
Copy Markdown

I have resolved conflicts. Thank you.

@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch from 061517f to 1a2cfe9 Compare August 14, 2026 04:11

@msardara msardara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for your PR @vishalsahare!

With this change we are breaking the protobuf compatibility, and as we are not going to release a v3 soon, the PR cannot be merged as it is.

We should introduce a parallel metadata field supporting google Struct to be used in parallel with the current one, and when we will upgrade to v3 we can remove the old map<string, string> metadata.

So in the protobuf, we should have:

map<string, string> metadata = 4;
google.protobuf.Struct metadata_v3 = 5;

And then we can offer an additional API allowing to set/get generic metadata (so not only string -> string).

@vsahare-gh

Copy link
Copy Markdown

Thanks for your PR @vishalsahare!

With this change we are breaking the protobuf compatibility, and as we are not going to release a v3 soon, the PR cannot be merged as it is.

We should introduce a parallel metadata field supporting google Struct to be used in parallel with the current one, and when we will upgrade to v3 we can remove the old map<string, string> metadata.

So in the protobuf, we should have:

map<string, string> metadata = 4;
google.protobuf.Struct metadata_v3 = 5;

And then we can offer an additional API allowing to set/get generic metadata (so not only string -> string).

Reply: 5 is used for link message hence using 7

@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch from 031362d to e87336f Compare September 3, 2026 14:18
@vishalsahare

vishalsahare commented Sep 4, 2026

Copy link
Copy Markdown
Author

ci-buf: All jobs have failed => I have created vishalsahare login in buf.build. agntcy is not listed. Getting suggestion as follows "ask an AGNTCY organization administrator to grant access. A token from an account without write permission cannot push to buf.build/agntcy/slim." https://github.com/vishalsahare/slim/actions/runs/33795311152 reference for error. Can you please help me in this.

@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch 2 times, most recently from 305c419 to 4288c83 Compare September 4, 2026 14:21
janosSarusiKis and others added 19 commits September 4, 2026 20:07
…ayload (agntcy#1961)

# Description

is_eos() treated any Ok message with an empty payload as end-of-stream,
and send_response_stream stamped slimrpc-code = Ok onto every response
data frame. A response that encodes to zero bytes was therefore
indistinguishable from the terminator and got consumed as one —
Channel::unary returned Internal: "No response received".

This hits every RPC returning google.protobuf.Empty, and any response
with no fields set (an empty list result, for example). It surfaced in
the A2A Go SDK, where DeleteTaskPushNotificationConfig fails on every
successful delete.

Response data frames no longer carry a status, so the presence of the
status header is the terminal signal — matching gRPC's grpc-status
trailer, and matching what the client side already did via
first_msg_metadata / continuation_metadata. is_eos() keeps the
empty-payload check alongside the status-presence check: presence alone
would make a client on this version read the first data frame from an
older server as EOS, since those stamp Ok on every frame. With both
clauses, behaviour against older peers is unchanged rather than broken —
no wire break.

Also updates the demux filter in server.rs, which identified echoed
server responses by status presence; it now keys off RPC_DIR_KEY
directly, which is what it meant.

Adds regression coverage for zero-byte unary and streamed responses, and
extends test_request_stream to cover all four frame shapes including a
legacy-style data frame carrying both a status and a payload.

## Type of Change

- [ ] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [ ] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [ ] Existing issues have been referenced (where applicable)
- [ ] I have verified this change is not present in other open pull
requests
- [ ] Functionality is documented
- [ ] All code style checks pass
- [ ] New code contribution is covered by automated tests
- [ ] All new and existing tests pass

---------

Signed-off-by: Janos Sarusi-Kis <janossk@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
# Description

This PR fixes the GitHub Good First Issues link so it only shows the
open issues.

## Type of Change

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [ ] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [ ] Functionality is documented
- [ ] All code style checks pass
- [ ] New code contribution is covered by automated tests
- [ ] All new and existing tests pass

Signed-off-by: Aron Kerekes <arkereke@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
agntcy#1971)

# Description

Two processes sharing the same `refresh_token_file` could both read the
same refresh token and send it to the IdP concurrently. The first
succeeds and rotates the token; the second gets `invalid_grant` and its
background renewal loop exits permanently.

# Changes
- Add `lock_and_reload` callback to `RefreshTokenProviderConfig` that
acquires an exclusive lock and returns the current tokens from the
backing store
- In `fetch_new_token`, acquire the lock before the IdP call and hold it
until `persist_credentials` completes
- Skip the IdP call if the access token from disk is still fresh (within
the first 2/3 of its lifetime), consistent with the background task's
refresh threshold
- Add `extract_exp_iat_claims_unsafe` to the JWT module for the
freshness check
- Wire up the `lock_and_reload` closure in the `refresh_token_file`
branch of `get_client_layer`, using a companion `.lock` file as the
locking target so `write_secret_file` can open the token file freely
without a re-entrant lock
- Use `fs2::FileExt::lock_exclusive` for cross-platform file locking
without unsafe
- Add a test verifying that concurrent callers of the lock closure are
serialized and read distinct tokens

## Type of Change

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [ ] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [ ] Existing issues have been referenced (where applicable)
- [ ] I have verified this change is not present in other open pull
requests
- [ ] Functionality is documented
- [ ] All code style checks pass
- [ ] New code contribution is covered by automated tests
- [ ] All new and existing tests pass

---------

Signed-off-by: Mark Marton <mark.p.marton@gmail.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
## 🤖 New release

* `agntcy-slim-version`: 2.0.0 -> 2.1.0
* `agntcy-slim-auth`: 0.14.6 -> 0.15.0 (⚠ API breaking changes)
* `agntcy-slim-config`: 0.14.5 -> 0.15.0 (⚠ API breaking changes)
* `agntcy-slim-datapath`: 0.18.2 -> 0.18.3 (✓ API compatible changes)
* `agntcy-slim`: 2.0.0 -> 2.1.0
* `agntcy-slim-channel-manager`: 2.0.0 -> 2.1.0
* `agntcy-slim-control-plane`: 2.0.0 -> 2.1.0 (✓ API compatible changes)
* `agntcy-slim-bindings`: 2.0.0 -> 2.1.0 (✓ API compatible changes)
* `agntcy-slim-rpc`: 2.0.0 -> 2.1.0 (✓ API compatible changes)
* `agntcy-slimctl`: 2.0.0 -> 2.1.0
* `agntcy-slim-proto`: 0.5.6 -> 0.5.7
* `agntcy-slim-tracing`: 0.4.15 -> 0.4.16
* `agntcy-slim-mls`: 0.3.5 -> 0.3.6
* `agntcy-slim-session`: 0.7.6 -> 0.7.7
* `agntcy-slim-signal`: 0.1.21 -> 0.1.22
* `agntcy-slim-controller`: 0.12.6 -> 0.12.7
* `agntcy-slim-service`: 0.12.6 -> 0.12.7

### ⚠ `agntcy-slim-auth` breaking changes

```text
--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_variant_added.ron

Failed in:
  variant AuthError:OidcDiscoveryMissingIssuer in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:44
  variant AuthError:OidcDiscoveryIssuerMismatch in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:46
  variant AuthError:OidcDiscoveryUrlOriginMismatch in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:48
  variant AuthError:OidcInsecureIssuerUrl in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:50
  variant AuthError:RefreshTokenRevoked in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:64
  variant AuthError:PolicyCompile in /tmp/.tmp180Cii/slim/crates/auth/src/errors.rs:179
```

### ⚠ `agntcy-slim-config` breaking changes

```text
--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field Config.refresh_token in /tmp/.tmp180Cii/slim/crates/config/src/auth/oidc.rs:49
  field Config.refresh_token_file in /tmp/.tmp180Cii/slim/crates/config/src/auth/oidc.rs:65
  field Config.access_token_file in /tmp/.tmp180Cii/slim/crates/config/src/auth/oidc.rs:74
  field Config.claim_cache_ttl in /tmp/.tmp180Cii/slim/crates/config/src/auth/oidc.rs:97
  field Config.policy in /tmp/.tmp180Cii/slim/crates/config/src/auth/oidc.rs:104

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_variant_added.ron

Failed in:
  variant AuthenticationConfig:Oidc in /tmp/.tmp180Cii/slim/crates/config/src/client.rs:133
  variant AuthenticationConfig:Oidc in /tmp/.tmp180Cii/slim/crates/config/src/client.rs:133
  variant AuthenticationConfig:Oidc in /tmp/.tmp180Cii/slim/crates/config/src/server.rs:76
  variant AuthenticationConfig:Oidc in /tmp/.tmp180Cii/slim/crates/config/src/server.rs:76
```

<details><summary><i><b>Changelog</b></i></summary><p>

## `agntcy-slim-version`

<blockquote>

##
[1.3.0](https://github.com/agntcy/slim/releases/tag/slim-version-v1.3.0)
- 2026-03-20

### Added

- add agntcy-slim-version crate as single source of truth for version
and build info ([agntcy#1360](agntcy#1360))
</blockquote>

## `agntcy-slim-auth`

<blockquote>

##
[0.15.0](agntcy/slim@slim-auth-v0.14.6...slim-auth-v0.15.0)
- 2026-08-12

### Added

- *(slimctl)* OIDC token refresh for long-lived nodes
([agntcy#1960](agntcy#1960))
- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))

### Fixed

- *(auth)* serialize concurrent refresh-token exchanges with file lock
([agntcy#1971](agntcy#1971))
- *(auth)* await the rotated-credential persist instead of detaching it
([agntcy#1967](agntcy#1967))
</blockquote>

## `agntcy-slim-config`

<blockquote>

##
[0.15.0](agntcy/slim@slim-config-v0.14.5...slim-config-v0.15.0)
- 2026-08-12

### Added

- *(slimctl)* record login credentials in the connection config
([agntcy#1965](agntcy#1965))
- *(slimctl)* OIDC token refresh for long-lived nodes
([agntcy#1960](agntcy#1960))
- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))

### Fixed

- *(auth)* serialize concurrent refresh-token exchanges with file lock
([agntcy#1971](agntcy#1971))

### Other

- *(config)* use DurationString for timeout and jwks_ttl in OIDC config
([agntcy#1964](agntcy#1964))
</blockquote>

## `agntcy-slim-datapath`

<blockquote>

##
[0.18.3](agntcy/slim@slim-datapath-v0.18.2...slim-datapath-v0.18.3)
- 2026-08-12

### Added

- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))
</blockquote>

## `agntcy-slim`

<blockquote>

##
[2.0.0](agntcy/slim@slim-v2.0.0...slim-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-channel-manager`

<blockquote>

##
[2.0.0](agntcy/slim@slim-channel-manager-v2.0.0...slim-channel-manager-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-control-plane`

<blockquote>

##
[2.1.0](agntcy/slim@slim-control-plane-v2.0.0...slim-control-plane-v2.1.0)
- 2026-08-12

### Added

- *(control-plane)* support multiple northbound and southbound listeners
([agntcy#1966](agntcy#1966))
</blockquote>

## `agntcy-slim-bindings`

<blockquote>

##
[2.1.0](agntcy/slim@slim-bindings-v2.0.0...slim-bindings-v2.1.0)
- 2026-08-12

### Added

- *(slimctl)* OIDC token refresh for long-lived nodes
([agntcy#1960](agntcy#1960))
- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))
</blockquote>

## `agntcy-slim-rpc`

<blockquote>

##
[2.1.0](agntcy/slim@slim-rpc-v2.0.0...slim-rpc-v2.1.0)
- 2026-08-12

### Fixed

- *(rpc)* signal end-of-stream with the status header, not an empty
payload ([agntcy#1961](agntcy#1961))
</blockquote>

## `agntcy-slimctl`

<blockquote>

##
[2.1.0](agntcy/slim@slimctl-v2.0.0...slimctl-v2.1.0)
- 2026-08-12

### Added

- *(slimctl)* record login credentials in the connection config
([agntcy#1965](agntcy#1965))
- *(slimctl)* OIDC token refresh for long-lived nodes
([agntcy#1960](agntcy#1960))
- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))
- *(slimctl)* add login subcommand with OIDC auth code flow and PKCE
([agntcy#1955](agntcy#1955))
</blockquote>

## `agntcy-slim-proto`

<blockquote>

##
[0.5.7](agntcy/slim@slim-proto-v0.5.6...slim-proto-v0.5.7)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-tracing`

<blockquote>

##
[0.4.16](agntcy/slim@slim-tracing-v0.4.15...slim-tracing-v0.4.16)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-mls`

<blockquote>

##
[0.3.6](agntcy/slim@slim-mls-v0.3.5...slim-mls-v0.3.6)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

## `agntcy-slim-session`

<blockquote>

##
[0.7.7](agntcy/slim@slim-session-v0.7.6...slim-session-v0.7.7)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-datapath, agntcy-slim-mls
</blockquote>

## `agntcy-slim-signal`

<blockquote>

##
[0.1.22](agntcy/slim@slim-signal-v0.1.21...slim-signal-v0.1.22)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version
</blockquote>

## `agntcy-slim-controller`

<blockquote>

##
[0.12.7](agntcy/slim@slim-controller-v0.12.6...slim-controller-v0.12.7)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-datapath,
agntcy-slim-proto, agntcy-slim-tracing, agntcy-slim-session,
agntcy-slim-signal
</blockquote>

## `agntcy-slim-service`

<blockquote>

##
[0.12.7](agntcy/slim@slim-service-v0.12.6...slim-service-v0.12.7)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-datapath,
agntcy-slim-mls, agntcy-slim-session, agntcy-slim-controller
</blockquote>

</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
- This update changes SLIM message metadata from a string-only Protobuf map to
  google.protobuf.Struct, enabling typed metadata values.
- Metadata APIs
  *  Updated ProtoMessage and its builder to:
  *  Create metadata lazily with get_or_insert_default().
  *  Insert values implementing Into<prost_types::Value>.
  *  Get and remove typed Protobuf values.
  *  Set or retrieve the complete metadata Struct.
  *  Represent absent metadata as None.
- Compatibility conversions
  *  These preserve existing string-only interfaces in session, RPC, and language bindings.
     When converting back to a string map, non-string values are intentionally omitted
- Dependencies
  *  Added prost-types dependencies to crates that now access Protobuf Struct and Value directly.
- Tests
  *  Added or updated tests covering:
  *  String metadata insertion.
  *  Typed metadata values.
  *  Nested and list values.
  *  Null values.
  *  Protobuf encode/decode round trips.
  *  Session publishing with metadata.
  - Targeted verification passed:
    *  Proto message tests: 19 passed
    *  Session metadata test: 1 passed
    *  Formatting check: passed

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [ ] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [ ] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

---------

Signed-off-by: Vishal Sahare <vishal.sahare@gmail.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
    Added metadata protobuf api version v3

    - [x] Bugfix
    - [ ] New Feature
    - [ ] Breaking Change
    - [ ] Refactor
    - [ ] Documentation
    - [ ] Other (please describe)

    - [x] I have read the [contributing
    guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
    - [ ] Existing issues have been referenced (where applicable)
    - [x] I have verified this change is not present in other open pull
    requests
    - [ ] Functionality is documented
    - [x] All code style checks pass
    - [x] New code contribution is covered by automated tests
    - [x] All new and existing tests pass

    ---------

    Signed-off-by: Vishal Sahare <vishal.sahare@gmail.com>
    Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
# Description

Upgrade all images to version v2.1.0

## Type of Change

- [ ] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [x] Release

## Checklist

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---

##
[2.1.0](agntcy/slim@helm-slim-v2.0.0...helm-slim-v2.1.0)
(2026-08-12)

### Features

* upgrade helm chart to latest image version
([agntcy#1973](agntcy#1973))
([ad183e9](agntcy@ad183e9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: Agntcy Build Bot <build@agntcy.io>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---

##
[2.1.0](agntcy/slim@helm-slim-channel-manager-v2.0.0...helm-slim-channel-manager-v2.1.0)
(2026-08-12)

### Features

* upgrade helm chart to latest image version
([agntcy#1973](agntcy#1973))
([ad183e9](agntcy@ad183e9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: Agntcy Build Bot <build@agntcy.io>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---

##
[2.1.0](agntcy/slim@helm-slim-control-plane-v2.0.0...helm-slim-control-plane-v2.1.0)
(2026-08-12)

### Features

* **control-plane:** support multiple northbound and southbound
listeners ([agntcy#1966](agntcy#1966))
([1c140dc](agntcy@1c140dc))
* upgrade helm chart to latest image version
([agntcy#1973](agntcy#1973))
([ad183e9](agntcy@ad183e9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: Agntcy Build Bot <build@agntcy.io>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
# Description

Fix build on windows due to an issue of the file mode not available
there.

## Type of Change

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
# Description

Fix windows build failure due to Spire not available.

## Type of Change

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

---------

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
## 🤖 New release

* `agntcy-slim-version`: 2.1.0 -> 2.1.1
* `agntcy-slim`: 2.1.0 -> 2.1.1
* `agntcy-slim-channel-manager`: 2.1.0 -> 2.1.1
* `agntcy-slim-control-plane`: 2.1.0 -> 2.1.1 (✓ API compatible changes)
* `agntcy-slim-bindings`: 2.1.0 -> 2.1.1
* `agntcy-slim-rpc`: 2.1.0 -> 2.1.1
* `agntcy-slimctl`: 2.1.0 -> 2.1.1
* `agntcy-slim-auth`: 0.15.0 -> 0.15.1
* `agntcy-slim-config`: 0.15.0 -> 0.15.1
* `agntcy-slim-proto`: 0.5.7 -> 0.5.8
* `agntcy-slim-tracing`: 0.4.16 -> 0.4.17
* `agntcy-slim-datapath`: 0.18.3 -> 0.18.4
* `agntcy-slim-mls`: 0.3.6 -> 0.3.7
* `agntcy-slim-session`: 0.7.7 -> 0.7.8
* `agntcy-slim-signal`: 0.1.22 -> 0.1.23
* `agntcy-slim-controller`: 0.12.7 -> 0.12.8
* `agntcy-slim-service`: 0.12.7 -> 0.12.8

<details><summary><i><b>Changelog</b></i></summary><p>

## `agntcy-slim-version`

<blockquote>

##
[1.3.0](https://github.com/agntcy/slim/releases/tag/slim-version-v1.3.0)
- 2026-03-20

### Added

- add agntcy-slim-version crate as single source of truth for version
and build info ([agntcy#1360](agntcy#1360))
</blockquote>

## `agntcy-slim`

<blockquote>

##
[2.0.0](agntcy/slim@slim-v2.0.0...slim-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-channel-manager`

<blockquote>

##
[2.0.0](agntcy/slim@slim-channel-manager-v2.0.0...slim-channel-manager-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-control-plane`

<blockquote>

##
[2.1.1](agntcy/slim@slim-control-plane-v2.1.0...slim-control-plane-v2.1.1)
- 2026-08-12

### Fixed

- windows build ([agntcy#1978](agntcy#1978))
</blockquote>

## `agntcy-slim-bindings`

<blockquote>

##
[2.1.0](agntcy/slim@slim-bindings-v2.0.0...slim-bindings-v2.1.0)
- 2026-08-12

### Added

- *(slimctl)* OIDC token refresh for long-lived nodes
([agntcy#1960](agntcy#1960))
- *(auth)* OIDC and static JWT validation with claim-based access
control ([agntcy#1957](agntcy#1957))
</blockquote>

## `agntcy-slim-rpc`

<blockquote>

##
[2.1.0](agntcy/slim@slim-rpc-v2.0.0...slim-rpc-v2.1.0)
- 2026-08-12

### Fixed

- *(rpc)* signal end-of-stream with the status header, not an empty
payload ([agntcy#1961](agntcy#1961))
</blockquote>

## `agntcy-slimctl`

<blockquote>

##
[2.1.1](agntcy/slim@slimctl-v2.1.0...slimctl-v2.1.1)
- 2026-08-12

### Fixed

- windows build ([agntcy#1978](agntcy#1978))
- windows build ([agntcy#1977](agntcy#1977))
</blockquote>

## `agntcy-slim-auth`

<blockquote>

##
[0.15.1](agntcy/slim@slim-auth-v0.15.0...slim-auth-v0.15.1)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version
</blockquote>

## `agntcy-slim-config`

<blockquote>

##
[0.15.1](agntcy/slim@slim-config-v0.15.0...slim-config-v0.15.1)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

## `agntcy-slim-proto`

<blockquote>

##
[0.5.8](agntcy/slim@slim-proto-v0.5.7...slim-proto-v0.5.8)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-tracing`

<blockquote>

##
[0.4.17](agntcy/slim@slim-tracing-v0.4.16...slim-tracing-v0.4.17)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-datapath`

<blockquote>

##
[0.18.4](agntcy/slim@slim-datapath-v0.18.3...slim-datapath-v0.18.4)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config, agntcy-slim-proto, agntcy-slim-tracing
</blockquote>

## `agntcy-slim-mls`

<blockquote>

##
[0.3.7](agntcy/slim@slim-mls-v0.3.6...slim-mls-v0.3.7)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

## `agntcy-slim-session`

<blockquote>

##
[0.7.8](agntcy/slim@slim-session-v0.7.7...slim-session-v0.7.8)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-datapath, agntcy-slim-mls
</blockquote>

## `agntcy-slim-signal`

<blockquote>

##
[0.1.23](agntcy/slim@slim-signal-v0.1.22...slim-signal-v0.1.23)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version
</blockquote>

## `agntcy-slim-controller`

<blockquote>

##
[0.12.8](agntcy/slim@slim-controller-v0.12.7...slim-controller-v0.12.8)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-proto,
agntcy-slim-tracing, agntcy-slim-datapath, agntcy-slim-session,
agntcy-slim-signal
</blockquote>

## `agntcy-slim-service`

<blockquote>

##
[0.12.8](agntcy/slim@slim-service-v0.12.7...slim-service-v0.12.8)
- 2026-08-12

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-datapath,
agntcy-slim-mls, agntcy-slim-session, agntcy-slim-controller
</blockquote>

</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Update Homebrew cask to reflect release changes

Release: slimctl-v2.1.1

Co-authored-by: build-agntcy <198542035+build-agntcy@users.noreply.github.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
…cy#1982)

## Summary

- Add `OidcConfig` record (mirrors `slim_config::auth::oidc::Config`)
with all fields: `issuer_url`, `client_id`, `client_secret`, `audience`,
`refresh_token`, `refresh_token_file`, `access_token_file`, `scope`,
`timeout`, `jwks_ttl`, `claim_cache_ttl`, `policy`
- Add `OidcPolicyConfig` enum (mirrors
`slim_config::auth::PolicyConfig`) with `Rego`, `RegoFile`, and `Cel`
variants
- Add `Oidc { config: OidcConfig }` variant to
`ClientAuthenticationConfig` and `ServerAuthenticationConfig`
- Fix the placeholder that silently returned `None` for OIDC client auth
and the `unimplemented!()` panic for OIDC server auth

## Test plan

- [ ] `cargo test -p agntcy-slim-bindings` passes (all 303 tests pass
locally)
- [ ] Build succeeds on all platforms
- [ ] Verify OIDC client-credentials flow works from Go/Swift/Kotlin
bindings
- [ ] Verify OIDC refresh-token flow works from bindings
- [ ] Verify OIDC server-side verification (JWKS) works from bindings

---------

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
## 🤖 New release

* `agntcy-slim-version`: 2.1.1 -> 2.2.0
* `agntcy-slim`: 2.1.1 -> 2.2.0
* `agntcy-slim-channel-manager`: 2.1.1 -> 2.2.0
* `agntcy-slim-control-plane`: 2.1.1 -> 2.2.0
* `agntcy-slim-bindings`: 2.1.1 -> 2.2.0 (✓ API compatible changes)
* `agntcy-slim-rpc`: 2.1.1 -> 2.2.0
* `agntcy-slimctl`: 2.1.1 -> 2.2.0
* `agntcy-slim-auth`: 0.15.1 -> 0.15.2
* `agntcy-slim-config`: 0.15.1 -> 0.15.2
* `agntcy-slim-proto`: 0.5.8 -> 0.5.9
* `agntcy-slim-tracing`: 0.4.17 -> 0.4.18
* `agntcy-slim-datapath`: 0.18.4 -> 0.18.5
* `agntcy-slim-mls`: 0.3.7 -> 0.3.8
* `agntcy-slim-session`: 0.7.8 -> 0.7.9
* `agntcy-slim-signal`: 0.1.23 -> 0.1.24
* `agntcy-slim-controller`: 0.12.8 -> 0.12.9
* `agntcy-slim-service`: 0.12.8 -> 0.12.9

<details><summary><i><b>Changelog</b></i></summary><p>

## `agntcy-slim-version`

<blockquote>

##
[1.3.0](https://github.com/agntcy/slim/releases/tag/slim-version-v1.3.0)
- 2026-03-20

### Added

- add agntcy-slim-version crate as single source of truth for version
and build info ([agntcy#1360](agntcy#1360))
</blockquote>

## `agntcy-slim`

<blockquote>

##
[2.0.0](agntcy/slim@slim-v2.0.0...slim-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-channel-manager`

<blockquote>

##
[2.0.0](agntcy/slim@slim-channel-manager-v2.0.0...slim-channel-manager-v2.0.0)
- 2026-08-04

### Other

- update Cargo.lock dependencies
</blockquote>

## `agntcy-slim-control-plane`

<blockquote>

##
[2.1.1](agntcy/slim@slim-control-plane-v2.1.0...slim-control-plane-v2.1.1)
- 2026-08-12

### Fixed

- windows build ([agntcy#1978](agntcy#1978))
</blockquote>

## `agntcy-slim-bindings`

<blockquote>

##
[2.2.0](agntcy/slim@slim-bindings-v2.1.1...slim-bindings-v2.2.0)
- 2026-08-13

### Added

- *(bindings)* expose OIDC authentication in language bindings
([agntcy#1982](agntcy#1982))
</blockquote>

## `agntcy-slim-rpc`

<blockquote>

##
[2.1.0](agntcy/slim@slim-rpc-v2.0.0...slim-rpc-v2.1.0)
- 2026-08-12

### Fixed

- *(rpc)* signal end-of-stream with the status header, not an empty
payload ([agntcy#1961](agntcy#1961))
</blockquote>

## `agntcy-slimctl`

<blockquote>

##
[2.1.1](agntcy/slim@slimctl-v2.1.0...slimctl-v2.1.1)
- 2026-08-12

### Fixed

- windows build ([agntcy#1978](agntcy#1978))
- windows build ([agntcy#1977](agntcy#1977))
</blockquote>

## `agntcy-slim-auth`

<blockquote>

##
[0.15.2](agntcy/slim@slim-auth-v0.15.1...slim-auth-v0.15.2)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version
</blockquote>

## `agntcy-slim-config`

<blockquote>

##
[0.15.2](agntcy/slim@slim-config-v0.15.1...slim-config-v0.15.2)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

## `agntcy-slim-proto`

<blockquote>

##
[0.5.9](agntcy/slim@slim-proto-v0.5.8...slim-proto-v0.5.9)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-tracing`

<blockquote>

##
[0.4.18](agntcy/slim@slim-tracing-v0.4.17...slim-tracing-v0.4.18)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

## `agntcy-slim-datapath`

<blockquote>

##
[0.18.5](agntcy/slim@slim-datapath-v0.18.4...slim-datapath-v0.18.5)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config, agntcy-slim-proto, agntcy-slim-tracing
</blockquote>

## `agntcy-slim-mls`

<blockquote>

##
[0.3.8](agntcy/slim@slim-mls-v0.3.7...slim-mls-v0.3.8)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

## `agntcy-slim-session`

<blockquote>

##
[0.7.9](agntcy/slim@slim-session-v0.7.8...slim-session-v0.7.9)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-datapath, agntcy-slim-mls
</blockquote>

## `agntcy-slim-signal`

<blockquote>

##
[0.1.24](agntcy/slim@slim-signal-v0.1.23...slim-signal-v0.1.24)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version
</blockquote>

## `agntcy-slim-controller`

<blockquote>

##
[0.12.9](agntcy/slim@slim-controller-v0.12.8...slim-controller-v0.12.9)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-proto,
agntcy-slim-tracing, agntcy-slim-datapath, agntcy-slim-session,
agntcy-slim-signal
</blockquote>

## `agntcy-slim-service`

<blockquote>

##
[0.12.9](agntcy/slim@slim-service-v0.12.8...slim-service-v0.12.9)
- 2026-08-13

### Other

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth, agntcy-slim-config, agntcy-slim-datapath,
agntcy-slim-mls, agntcy-slim-session, agntcy-slim-controller
</blockquote>

</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
)

## Summary

- `RequiredAuthMethod` lacked an `Oidc` variant, causing OIDC client
configs to be silently folded into `Jwt` in `from_client_config`, with
no matching arm in `merge_server_requirements`
- `diff_connections` had no access to `controller.clients` credentials
as a fallback when no `outbound_clients` entry matched the CP-assigned
endpoint
- `RequiredAuthMethod::None` was wiping local auth (`self.auth = None`),
so any locally configured OIDC credentials were destroyed when the CP
sent `None` for the auth method — which it does whenever it doesn't
model the auth explicitly
- The proto `AuthMethod` enum and `model::AuthMethod` had no `Oidc`
variant, so the CP could never signal OIDC to nodes

## Changes

**`crates/config/src/client.rs`**
- Add `RequiredAuthMethod::Oidc`; fix `from_client_config` to map
`AuthenticationConfig::Oidc` → `RequiredAuthMethod::Oidc` (was `Jwt`)
- Add `RequiredAuthMethod::Oidc => {}` arm to
`merge_server_requirements` (preserves local auth, matching `Jwt`
behaviour)
- Change `RequiredAuthMethod::None` arm from `self.auth = None` to a
no-op — `None` means "no auth required", not "force no auth", so locally
configured credentials survive

**`crates/controller/src/service.rs`**
- Store `controller.clients` on `ControllerServiceInternal` for auth
fallback
- `diff_connections` inherits auth from the first non-`None` `clients`
entry when no `outbound_clients` entry matches the CP-assigned endpoint
- Credential guard updated to cover `Oidc` and check post-merge
`client_config.auth` instead of `outbound_clients` membership

**`crates/control-plane/`**
- Add `AUTH_METHOD_OIDC = 4` to the controller proto enum and regenerate
bindings
- Add `model::AuthMethod::Oidc` with full southbound (proto→model) and
northbound (model→proto) round-trip
- Wire `model::AuthMethod::Oidc → RequiredAuthMethod::Oidc` in
`generate_config_data`

## Test plan

- [ ] Build `agntcy-slim-config`, `agntcy-slim-controller`, and
`agntcy-slim-control-plane` with no errors
- [ ] All 261+ `agntcy-slim-config` tests pass
- [ ] Node configured with OIDC in `controller.clients` can establish
CP-managed outbound links without a duplicate `outbound_clients` entry
- [ ] Node with explicit `outbound_clients` entries continues to use
those credentials (fallback not triggered)
- [ ] Node with `auth_method: None` on a link no longer has its local
OIDC credentials wiped
- [ ] CP registered with `auth_method: oidc` correctly sends
`RequiredAuthMethod::Oidc` to nodes

---------

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
## Summary

- On every reconnect cycle, the span hierarchy grew by two levels:
`process_stream → reconnect → process_stream → reconnect → …`
- `#[tracing::instrument]` on `reconnect` creates its span
**synchronously when the function is called**, making it a child of the
current `process_stream` span before `.instrument(Span::none())` at the
call site could have any effect
- The new `process_stream` spawned inside `reconnect` then inherited
that span as its parent, and its own reconnect loop continued the chain

## Fix

Remove `#[tracing::instrument]` from `reconnect` and create the span
manually **inside the async body**. Code inside `async fn` runs when the
future is first polled, not when the function is called. The call site
wraps the future with `.instrument(Span::none())`, so `Span::none()` is
the active context at poll time — any span created inside the body
becomes a root span.

Result: every reconnect cycle starts a fresh `reconnect` root span.
Depth is capped at `reconnect → process_stream` regardless of how many
cycles occur.

## Before / After

**Before** (after 11 reconnects):
```
process_stream:reconnect:process_stream:reconnect:process_stream:reconnect:…:reconnect: connection re-established
```

**After** (any number of reconnects):
```
reconnect{conn_index=0}: connection re-established
```

## Test plan

- [ ] Build `agntcy-slim-datapath` with no errors
- [ ] Run a node against a peer that repeatedly drops — confirm log
spans stay flat (`reconnect{…}: …`) and do not accumulate nesting

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
…llback (agntcy#1989)

## Summary

- Fix `from_server_config` so `AuthenticationConfig::Oidc` maps to
`AuthMethod::Oidc` instead of falling through to `None`, ensuring the CP
stores and forwards the correct auth method after node registration.
- Fix `merge_server_requirements` so `RequiredAuthMethod::None` from the
CP no longer wipes local OIDC credentials (now a no-op).
- In `diff_connections`, after failing to find credentials in
`outbound_clients` (exact endpoint match or empty-endpoint default),
fall back to the node's own `dataplane.clients` by endpoint. This means
a node that already authenticates to an endpoint via `dataplane.clients`
(e.g. with OIDC) does not need to duplicate those credentials under
`controller.outbound_clients` to satisfy CP-managed Remote links to the
same endpoint.
- Normalize endpoints before comparison (`https://host` and
`https://host:443` are treated as equivalent) so the fallback lookup
matches even when the CP records an explicit port but the local config
omits it.

## Test plan

- Build passes (`cargo build --bin slim`).
- All existing unit tests pass.
- Manually verified: CP-ordered Remote link to an endpoint that is
already reachable via `dataplane.clients` with OIDC now inherits those
credentials and connects successfully without duplicating config.

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
muscariello and others added 16 commits September 4, 2026 20:07
Adds an OpenSSF Scorecard workflow so the project gets a published
security score.

- Runs weekly, on push to main, on branch protection changes, and via
manual dispatch
- Publishes results to securityscorecards.dev (enables badge)
- Uploads SARIF results to GitHub code scanning

Validation: `actionlint .github/workflows/scorecard.yaml` passes with no
errors.

---------

Signed-off-by: Luca Muscariello <muscariello@ieee.org>
Co-authored-by: Árpád Csepi <21104922+arpad-csepi@users.noreply.github.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Bumps action pins in the Scorecard workflow to the latest releases.

- actions/checkout to v7.0.1 (3d3c42e5aac5ba805825da76410c181273ba90b1)
- github/codeql-action/upload-sarif to v4.37.9
(cdf488f595d80d6e07e03d4674febd5ab45fa938)

Validation: `actionlint .github/workflows/scorecard.yaml` passes with no
errors.

---------

Signed-off-by: Luca Muscariello <muscariello@ieee.org>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Addresses several open GitHub code scanning alerts (CodeQL, zizmor,
Scorecard).

- auth: enforce HTTPS on issuer_url in refresh_token.rs before token
exchange (matches oidc.rs's existing guard) — closes a
cleartext-transmission gap
- Suppress CodeQL hard-coded-cryptographic-value false positives on
test-only fixture credentials
- zizmor: fix template-injection in trigger-integrations action (env
vars instead of inline script interpolation)
- zizmor: replace superfluous softprops/action-gh-release with gh CLI
- zizmor: switch ad-hoc npm install to a lockfile-backed npm ci for the
CVE-issue-creation script (also fixes a real glob advisory)
- zizmor: justified ignore comments for dangerous-triggers and
github-app findings
- Scorecard: add explicit top-level permissions to workflows missing one

Validation: `actionlint`, `zizmor --offline` (0 high/medium findings),
and `cargo check --tests` all pass for the affected crates/workflows.

---------

Signed-off-by: Luca Muscariello <muscariello@ieee.org>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Continues addressing open Scorecard code scanning alerts.

- Pin all Docker FROM images in Dockerfile and Dockerfile.mock-agent to
sha256 digests (Pinned-Dependencies)
- reusable-docs.yml: move contents:write to job-level, top-level set to
contents:read (Token-Permissions)

Validation: digests resolved via `docker buildx imagetools inspect` and
verified with `docker pull`; `actionlint` passes.

Signed-off-by: Luca Muscariello <muscariello@ieee.org>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Adds a `cargo publish --dry-run` step so OpenSSF Scorecard's Packaging
check can detect our Rust publishing workflow (it doesn't recognize
`release-plz/action` as a publishing pattern).

- Runs on every push to `main` in `release-crates-pr`
- Safe to run repeatedly: cargo warns (doesn't fail) if the version
already shipped, only fails on real packaging/build problems

Validation: ran locally, exits 0 with just a warning since
`agntcy-slim-version` is already published; `actionlint` passes.

Signed-off-by: Luca Muscariello <muscariello@ieee.org>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
        Fixed Formatting

        ---------

        Signed-off-by: Vishal Sahare <vishal.sahare@gmail.com>
        Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
- This update changes SLIM message metadata from a string-only Protobuf map to
  google.protobuf.Struct, enabling typed metadata values.
- Metadata APIs
  *  Updated ProtoMessage and its builder to:
  *  Create metadata lazily with get_or_insert_default().
  *  Insert values implementing Into<prost_types::Value>.
  *  Get and remove typed Protobuf values.
  *  Set or retrieve the complete metadata Struct.
  *  Represent absent metadata as None.
- Compatibility conversions
  *  These preserve existing string-only interfaces in session, RPC, and language bindings.
     When converting back to a string map, non-string values are intentionally omitted
- Dependencies
  *  Added prost-types dependencies to crates that now access Protobuf Struct and Value directly.
- Tests
  *  Added or updated tests covering:
  *  String metadata insertion.
  *  Typed metadata values.
  *  Nested and list values.
  *  Null values.
  *  Protobuf encode/decode round trips.
  *  Session publishing with metadata.
  - Targeted verification passed:
    *  Proto message tests: 19 passed
    *  Session metadata test: 1 passed
    *  Formatting check: passed

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [ ] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [ ] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

---------

Signed-off-by: Vishal Sahare <vishal.sahare@gmail.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
    Added metadata protobuf api version v3

    - [x] Bugfix
    - [ ] New Feature
    - [ ] Breaking Change
    - [ ] Refactor
    - [ ] Documentation
    - [ ] Other (please describe)

    - [x] I have read the [contributing
    guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
    - [ ] Existing issues have been referenced (where applicable)
    - [x] I have verified this change is not present in other open pull
    requests
    - [ ] Functionality is documented
    - [x] All code style checks pass
    - [x] New code contribution is covered by automated tests
    - [x] All new and existing tests pass

    ---------

    Signed-off-by: Vishal Sahare <vishal.sahare@gmail.com>
    Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Upgrade all images to version v2.1.0

- [ ] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [x] Release

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---

[2.1.0](agntcy/slim@helm-slim-control-plane-v2.0.0...helm-slim-control-plane-v2.1.0)
(2026-08-12)

* **control-plane:** support multiple northbound and southbound
listeners ([agntcy#1966](agntcy#1966))
([1c140dc](agntcy@1c140dc))
* upgrade helm chart to latest image version
([agntcy#1973](agntcy#1973))
([ad183e9](agntcy@ad183e9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: Agntcy Build Bot <build@agntcy.io>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
Fix build on windows due to an issue of the file mode not available
there.

- [x] Bugfix
- [ ] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
)

- `RequiredAuthMethod` lacked an `Oidc` variant, causing OIDC client
configs to be silently folded into `Jwt` in `from_client_config`, with
no matching arm in `merge_server_requirements`
- `diff_connections` had no access to `controller.clients` credentials
as a fallback when no `outbound_clients` entry matched the CP-assigned
endpoint
- `RequiredAuthMethod::None` was wiping local auth (`self.auth = None`),
so any locally configured OIDC credentials were destroyed when the CP
sent `None` for the auth method — which it does whenever it doesn't
model the auth explicitly
- The proto `AuthMethod` enum and `model::AuthMethod` had no `Oidc`
variant, so the CP could never signal OIDC to nodes

**`crates/config/src/client.rs`**
- Add `RequiredAuthMethod::Oidc`; fix `from_client_config` to map
`AuthenticationConfig::Oidc` → `RequiredAuthMethod::Oidc` (was `Jwt`)
- Add `RequiredAuthMethod::Oidc => {}` arm to
`merge_server_requirements` (preserves local auth, matching `Jwt`
behaviour)
- Change `RequiredAuthMethod::None` arm from `self.auth = None` to a
no-op — `None` means "no auth required", not "force no auth", so locally
configured credentials survive

**`crates/controller/src/service.rs`**
- Store `controller.clients` on `ControllerServiceInternal` for auth
fallback
- `diff_connections` inherits auth from the first non-`None` `clients`
entry when no `outbound_clients` entry matches the CP-assigned endpoint
- Credential guard updated to cover `Oidc` and check post-merge
`client_config.auth` instead of `outbound_clients` membership

**`crates/control-plane/`**
- Add `AUTH_METHOD_OIDC = 4` to the controller proto enum and regenerate
bindings
- Add `model::AuthMethod::Oidc` with full southbound (proto→model) and
northbound (model→proto) round-trip
- Wire `model::AuthMethod::Oidc → RequiredAuthMethod::Oidc` in
`generate_config_data`

- [ ] Build `agntcy-slim-config`, `agntcy-slim-controller`, and
`agntcy-slim-control-plane` with no errors
- [ ] All 261+ `agntcy-slim-config` tests pass
- [ ] Node configured with OIDC in `controller.clients` can establish
CP-managed outbound links without a duplicate `outbound_clients` entry
- [ ] Node with explicit `outbound_clients` entries continues to use
those credentials (fallback not triggered)
- [ ] Node with `auth_method: None` on a link no longer has its local
OIDC credentials wiped
- [ ] CP registered with `auth_method: oidc` correctly sends
`RequiredAuthMethod::Oidc` to nodes

---------

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
…llback (agntcy#1989)

## Summary

- Fix `from_server_config` so `AuthenticationConfig::Oidc` maps to
`AuthMethod::Oidc` instead of falling through to `None`, ensuring the CP
stores and forwards the correct auth method after node registration.
- Fix `merge_server_requirements` so `RequiredAuthMethod::None` from the
CP no longer wipes local OIDC credentials (now a no-op).
- In `diff_connections`, after failing to find credentials in
`outbound_clients` (exact endpoint match or empty-endpoint default),
fall back to the node's own `dataplane.clients` by endpoint. This means
a node that already authenticates to an endpoint via `dataplane.clients`
(e.g. with OIDC) does not need to duplicate those credentials under
`controller.outbound_clients` to satisfy CP-managed Remote links to the
same endpoint.
- Normalize endpoints before comparison (`https://host` and
`https://host:443` are treated as equivalent) so the fallback lookup
matches even when the CP records an explicit port but the local config
omits it.

## Test plan

- Build passes (`cargo build --bin slim`).
- All existing unit tests pass.
- Manually verified: CP-ordered Remote link to an endpoint that is
already reachable via `dataplane.clients` with OIDC now inherits those
credentials and connects successfully without duplicating config.

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
* `agntcy-slim-version`: 2.2.0 -> 2.3.0
* `agntcy-slim-config`: 0.15.2 -> 0.16.0 (⚠ API breaking changes)
* `agntcy-slim-proto`: 0.5.9 -> 0.6.0 (⚠ API breaking changes)
* `agntcy-slim-datapath`: 0.18.5 -> 0.18.6 (✓ API compatible changes)
* `agntcy-slim-controller`: 0.12.9 -> 0.13.0 (⚠ API breaking changes)
* `agntcy-slim-service`: 0.12.9 -> 0.12.10 (✓ API compatible changes)
* `agntcy-slim`: 2.2.0 -> 2.3.0
* `agntcy-slim-channel-manager`: 2.2.0 -> 2.3.0
* `agntcy-slim-control-plane`: 2.2.0 -> 2.3.0 (⚠ API breaking changes)
* `agntcy-slim-bindings`: 2.2.0 -> 2.3.0
* `agntcy-slim-rpc`: 2.2.0 -> 2.3.0
* `agntcy-slimctl`: 2.2.0 -> 2.3.0
* `agntcy-slim-auth`: 0.15.2 -> 0.15.3
* `agntcy-slim-tracing`: 0.4.18 -> 0.4.19
* `agntcy-slim-mls`: 0.3.8 -> 0.3.9
* `agntcy-slim-session`: 0.7.9 -> 0.7.10
* `agntcy-slim-signal`: 0.1.24 -> 0.1.25

```text
--- failure enum_no_repr_variant_discriminant_changed: enum variant had its discriminant change value ---

Description:
The enum's variant had its discriminant value change. This breaks downstream code that used its value via a numeric cast like `as isize`.
        ref: https://doc.rust-lang.org/reference/items/enumerations.html#assigning-discriminant-values
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_no_repr_variant_discriminant_changed.ron

Failed in:
  variant RequiredAuthMethod::Spire 3 -> 4 in /tmp/.tmp8XqivK/slim/crates/config/src/client.rs:636

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_variant_added.ron

Failed in:
  variant RequiredAuthMethod:Oidc in /tmp/.tmp8XqivK/slim/crates/config/src/client.rs:634
```

```text
--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_variant_added.ron

Failed in:
  variant AuthMethod:Oidc in /tmp/.tmp8XqivK/slim/crates/proto/src/gen/controller.proto.v1.rs:283
```

```text
--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ControlPlaneSettings.dataplane_clients in /tmp/.tmp8XqivK/slim/crates/controller/src/service.rs:76

--- failure method_parameter_count_changed: pub method parameter count changed ---

Description:
A publicly-visible method now takes a different number of parameters, not counting the receiver (self) parameter.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#fn-change-arity
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/method_parameter_count_changed.ron

Failed in:
  slim_controller::config::Config::into_service now takes 6 parameters instead of 5, in /tmp/.tmp8XqivK/slim/crates/controller/src/config.rs:123
```

```text
--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.46.0/src/lints/enum_variant_added.ron

Failed in:
  variant AuthMethod:Oidc in /tmp/.tmp8XqivK/slim/crates/control-plane/src/db/model.rs:163
  variant AuthMethod:Oidc in /tmp/.tmp8XqivK/slim/crates/control-plane/src/db/model.rs:163
```

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

[1.3.0](https://github.com/agntcy/slim/releases/tag/slim-version-v1.3.0)
- 2026-03-20

- add agntcy-slim-version crate as single source of truth for version
and build info ([agntcy#1360](agntcy#1360))
</blockquote>

<blockquote>

[0.16.0](agntcy/slim@slim-config-v0.15.2...slim-config-v0.16.0)
- 2026-08-13

- propagate OIDC auth through merge and diff_connections
([agntcy#1983](agntcy#1983))
</blockquote>

<blockquote>

[0.6.0](agntcy/slim@slim-proto-v0.5.9...slim-proto-v0.6.0)
- 2026-08-13

- propagate OIDC auth through merge and diff_connections
([agntcy#1983](agntcy#1983))
</blockquote>

<blockquote>

[0.18.6](agntcy/slim@slim-datapath-v0.18.5...slim-datapath-v0.18.6)
- 2026-08-13

- prevent unbounded span nesting on reconnect cycles
([agntcy#1986](agntcy#1986))
</blockquote>

<blockquote>

[0.13.0](agntcy/slim@slim-controller-v0.12.9...slim-controller-v0.13.0)
- 2026-08-13

- OIDC credentials for CP-managed links using dataplane.clients fallback
([agntcy#1989](agntcy#1989))
- propagate OIDC auth through merge and diff_connections
([agntcy#1983](agntcy#1983))
</blockquote>

<blockquote>

[0.12.10](agntcy/slim@slim-service-v0.12.9...slim-service-v0.12.10)
- 2026-08-13

- OIDC credentials for CP-managed links using dataplane.clients fallback
([agntcy#1989](agntcy#1989))
</blockquote>

<blockquote>

[2.0.0](agntcy/slim@slim-v2.0.0...slim-v2.0.0)
- 2026-08-04

- update Cargo.lock dependencies
</blockquote>

<blockquote>

[2.0.0](agntcy/slim@slim-channel-manager-v2.0.0...slim-channel-manager-v2.0.0)
- 2026-08-04

- update Cargo.lock dependencies
</blockquote>

<blockquote>

[2.3.0](agntcy/slim@slim-control-plane-v2.2.0...slim-control-plane-v2.3.0)
- 2026-08-13

- propagate OIDC auth through merge and diff_connections
([agntcy#1983](agntcy#1983))
</blockquote>

<blockquote>

[2.2.0](agntcy/slim@slim-bindings-v2.1.1...slim-bindings-v2.2.0)
- 2026-08-13

- *(bindings)* expose OIDC authentication in language bindings
([agntcy#1982](agntcy#1982))
</blockquote>

<blockquote>

[2.1.0](agntcy/slim@slim-rpc-v2.0.0...slim-rpc-v2.1.0)
- 2026-08-12

- *(rpc)* signal end-of-stream with the status header, not an empty
payload ([agntcy#1961](agntcy#1961))
</blockquote>

<blockquote>

[2.1.1](agntcy/slim@slimctl-v2.1.0...slimctl-v2.1.1)
- 2026-08-12

- windows build ([agntcy#1978](agntcy#1978))
- windows build ([agntcy#1977](agntcy#1977))
</blockquote>

<blockquote>

[0.15.3](agntcy/slim@slim-auth-v0.15.2...slim-auth-v0.15.3)
- 2026-08-13

- updated the following local packages: agntcy-slim-version
</blockquote>

<blockquote>

[0.4.19](agntcy/slim@slim-tracing-v0.4.18...slim-tracing-v0.4.19)
- 2026-08-13

- updated the following local packages: agntcy-slim-version,
agntcy-slim-config
</blockquote>

<blockquote>

[0.3.9](agntcy/slim@slim-mls-v0.3.8...slim-mls-v0.3.9)
- 2026-08-13

- updated the following local packages: agntcy-slim-version,
agntcy-slim-auth
</blockquote>

<blockquote>

[0.7.10](agntcy/slim@slim-session-v0.7.9...slim-session-v0.7.10)
- 2026-08-13

- updated the following local packages: agntcy-slim-version,
agntcy-slim-datapath, agntcy-slim-auth, agntcy-slim-mls
</blockquote>

<blockquote>

[0.1.25](agntcy/slim@slim-signal-v0.1.24...slim-signal-v0.1.25)
- 2026-08-13

- updated the following local packages: agntcy-slim-version
</blockquote>

</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

---------

Co-authored-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
# Description

Upgrade image version to 2.3.0

## Type of Change

- [ ] Bugfix
- [x] New Feature
- [ ] Breaking Change
- [ ] Refactor
- [ ] Documentation
- [ ] Other (please describe)

## Checklist

- [x] I have read the [contributing
guidelines](/agntcy/repo-template/blob/main/CONTRIBUTING.md)
- [x] Existing issues have been referenced (where applicable)
- [x] I have verified this change is not present in other open pull
requests
- [x] Functionality is documented
- [x] All code style checks pass
- [x] New code contribution is covered by automated tests
- [x] All new and existing tests pass

Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
🤖 I have created a release *beep* *boop*
---

##
[2.2.0](agntcy/slim@helm-slim-control-plane-v2.1.0...helm-slim-control-plane-v2.2.0)
(2026-08-13)

### Features

* **charts/control-plane:** upgrade image version to 2.3.0
([agntcy#1990](agntcy#1990))
([cd81796](agntcy@cd81796))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: Agntcy Build Bot <build@agntcy.io>
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch from 4288c83 to d822131 Compare September 4, 2026 16:01
Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
@vishalsahare

Copy link
Copy Markdown
Author

@msardara can you please check this PR and provide your comments

@msardara msardara left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hey @vishalsahare! looks good overall, but I see many changes that should not be partof this PR. I think we should open a new PR for them.

Comment thread crates/proto/src/impls.rs Outdated
    Fixed comment

    Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>

Signed-off-by: Vishal Sahare <6853259+vishalsahare@users.noreply.github.com>
@vishalsahare
vishalsahare force-pushed the typed-message-metadata branch 2 times, most recently from 951647f to 0dc43ed Compare September 11, 2026 17:59
@vsahare-gh

Copy link
Copy Markdown

Hi Mark, fixed comment. Could you please check and merge now.

@vsahare-gh

Copy link
Copy Markdown

Can you please heck and approve?

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.

9 participants