Skip to content

protocol: report session permission profiles#18282

Merged
bolinfest merged 1 commit into
mainfrom
pr18282
Apr 23, 2026
Merged

protocol: report session permission profiles#18282
bolinfest merged 1 commit into
mainfrom
pr18282

Conversation

@bolinfest
Copy link
Copy Markdown
Collaborator

@bolinfest bolinfest commented Apr 17, 2026

Why

Clients that observe SessionConfigured need the same canonical permission view that app-server thread responses provide. Reporting the profile in protocol events lets clients keep their local state synchronized without reinterpreting legacy sandbox fields.

What changed

This adds permission_profile to SessionConfigured and propagates it through core, exec JSON output, MCP server messages, and TUI history/widget handling.

Verification

  • cargo test -p codex-tui permissions -- --nocapture
  • cargo test -p codex-core --test all permissions_messages -- --nocapture

Stack created with Sapling. Best reviewed with ReviewStack.

@bolinfest bolinfest force-pushed the pr18282 branch 2 times, most recently from b675c8c to 6e24a28 Compare April 17, 2026 19:33
@bolinfest bolinfest force-pushed the pr18281 branch 2 times, most recently from 6d6a825 to 010d66d Compare April 20, 2026 17:10
@bolinfest bolinfest requested a review from a team as a code owner April 20, 2026 17:10
@bolinfest bolinfest force-pushed the pr18282 branch 2 times, most recently from 51dd74b to 1047754 Compare April 20, 2026 18:35
bolinfest added a commit that referenced this pull request Apr 22, 2026
## Why

`Permissions` should not store a separate `PermissionProfile` that can
drift from the constrained `SandboxPolicy` and network settings. The
active profile needs to be derived from the same constrained values that
already honor `requirements.toml`.

## What changed

This adds derivation of the active `PermissionProfile` from the
constrained runtime permission settings and exposes that derived value
through config snapshots and thread state. The app-server can then
report the active profile without introducing a second source of truth.

## Verification

- `cargo test -p codex-core --test all permissions_messages --
--nocapture`
- `cargo test -p codex-core --test all request_permissions --
--nocapture`



























---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/18277).
* #18288
* #18287
* #18286
* #18285
* #18284
* #18283
* #18282
* #18281
* #18280
* #18279
* #18278
* __->__ #18277
@bolinfest bolinfest force-pushed the pr18282 branch 3 times, most recently from f482e60 to c95e702 Compare April 22, 2026 17:53
@bolinfest bolinfest force-pushed the pr18282 branch 2 times, most recently from cf96acd to 99782a9 Compare April 22, 2026 19:56
bolinfest added a commit that referenced this pull request Apr 22, 2026
## Why

`PermissionProfile` is becoming the canonical permissions shape shared
by core and app-server. After app-server responses expose the active
profile, clients need to be able to send that same shape back when
starting, resuming, forking, or overriding a turn instead of translating
through the legacy `sandbox`/`sandboxPolicy` shorthands.

This still needs to preserve the existing requirements/platform
enforcement model. A profile-shaped request can be downgraded or
rejected by constraints, but the server should keep the user's
elevated-access intent for project trust decisions. Turn-level profile
overrides also need to retain existing read protections, including
deny-read entries and bounded glob-scan metadata, so a permission
override cannot accidentally drop configured protections such as
`**/*.env = deny`.

## What changed

- Adds optional `permissionProfile` request fields to `thread/start`,
`thread/resume`, `thread/fork`, and `turn/start`.
- Rejects ambiguous requests that specify both `permissionProfile` and
the legacy `sandbox`/`sandboxPolicy` fields, including running-thread
resume requests.
- Converts profile-shaped overrides into core runtime filesystem/network
permissions while continuing to derive the constrained legacy sandbox
projection used by existing execution paths.
- Preserves project-trust intent for profile overrides that are
equivalent to workspace-write or full-access sandbox requests.
- Preserves existing deny-read entries and `globScanMaxDepth` when
applying turn-level `permissionProfile` overrides.
- Updates app-server docs plus generated JSON/TypeScript schema fixtures
and regression coverage.

## Verification

- `cargo test -p codex-app-server-protocol schema_fixtures`
- `cargo test -p codex-core
session_configuration_apply_permission_profile_preserves_existing_deny_read_entries`







---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/18279).
* #18288
* #18287
* #18286
* #18285
* #18284
* #18283
* #18282
* #18281
* #18280
* __->__ #18279
Comment thread codex-rs/core/src/session/session.rs Outdated
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

2 participants