core: add a monitor tool for event-driven background watches#2
Draft
yaanfpv wants to merge 12 commits into
Draft
core: add a monitor tool for event-driven background watches#2yaanfpv wants to merge 12 commits into
yaanfpv wants to merge 12 commits into
Conversation
## Why `compile_scoped_filesystem_pattern()` accepted a `_policy_cwd` parameter even though scoped glob compilation no longer uses the policy working directory. Keeping that unused argument forced the surrounding permissions compilation path to keep forwarding `policy_cwd` through call sites that did not need it, making the API look more dependent on cwd resolution than it is. ## What changed Removed the unused cwd parameter from `compile_scoped_filesystem_pattern()` and the callers that only forwarded it: `compile_filesystem_permission()`, `compile_permission_profile()`, and `compile_permission_profile_selection()`. Workspace root resolution still keeps `policy_cwd`, because that path still resolves relative roots against the active policy cwd. Relevant code: [`codex-rs/core/src/config/permissions.rs`](https://github.com/openai/codex/blob/b8b9816102e064dae4488ec130cf560f63c1ab78/codex-rs/core/src/config/permissions.rs#L346). ## Verification - `just test -p codex-core config::permissions` - `just test -p codex-core` was also run after building `test_stdio_server`; it passed the touched permissions coverage but still reported unrelated existing failures in `cli_stream` and shell snapshot tests.
## Summary Stacked on openai#26706. Adds the shared auth/system-proxy contract that later platform resolver PRs plug into. This PR moves Codex-owned auth and startup HTTP clients through a common route-aware boundary, but does not yet add Windows or macOS system proxy resolution. The default path remains unchanged when `respect_system_proxy` is absent or disabled. ## Implementation - Adds `codex-client/src/outbound_proxy.rs` with the shared route-selection model: - `OutboundProxyConfig`; - `ClientRouteClass`; - `RouteFailureClass`; - `build_reqwest_client_for_route`. - Preserves the existing reqwest/default-client behavior when no route config is supplied. - Uses the fixed MVP routing policy when route config is supplied: platform system/PAC/WPAD discovery, then explicit env proxy variables, then direct connection. - Keeps platform-specific system discovery behind the shared client boundary. This PR provides the contract and fallback behavior; later resolver PRs plug in Windows and macOS discovery. - Adds `login::AuthRouteConfig` so auth call sites depend on a small policy type instead of platform resolver details. - Maps the resolved `Config.respect_system_proxy` boolean into `AuthRouteConfig` for auth-owned clients. - Wires the route config through browser login, device-code login, access-token login, login status, logout/revoke, token refresh, API-key exchange, app-server account login, TUI/app startup, cloud-config bootstrap, cloud tasks, plugin auth, and exec startup config loading. ## End-user behavior - No behavior changes by default. - When `respect_system_proxy = true`, auth-owned clients opt into the shared route-aware client path. - On platforms without a resolver implementation in this PR, system discovery is unavailable and the route-aware path falls back to explicit env proxy handling, then direct connection. - Custom CA handling remains separate from proxy route selection and still runs through the shared client builder. - No proxy URLs, PAC contents, or resolved platform details are exposed through the public config surface introduced here. ## Tests Adds or updates coverage for: - preserving default auth-client fallback behavior when no route config is provided; - injected environment-proxy fallback without mutating process environment; - existing login-server E2E flows using explicit `auth_route_config: None` to guard unchanged default behavior; - updated auth manager, login, logout, cloud-config, startup, and plugin-auth call sites passing route config explicitly.
# Summary Codex required every ChatGPT account to have an email address. A service-account personal access token can return valid account metadata without one, so PAT login failed while decoding the metadata response. This change makes email optional in the account metadata type that owns it and preserves that absence through authentication, provider account state, the app-server API, generated clients, and TUI bootstrap. Existing accounts with email addresses keep the same behavior. ## Behavior-changing call sites | Call site | Behavior after this change | | --- | --- | | `login/src/auth/personal_access_token.rs` | PAT metadata accepts a missing or null email and retains `None`. | | `agent-identity/src/lib.rs` | Agent Identity JWT claims accept an omitted email. | | `login/src/auth/storage.rs` and `login/src/auth/agent_identity.rs` | Stored and managed Agent Identity records carry `Option<String>`. Deserialization maps the legacy empty-string sentinel to `None`. | | `login/src/auth/manager.rs` | `get_account_email` returns the stored option, and managed identity bootstrap no longer converts `None` to an empty string. | | `model-provider/src/provider.rs` and `protocol/src/account.rs` | A ChatGPT provider account requires a plan type but may carry no email. | | `app-server-protocol/src/protocol/v2/account.rs` | `account/read` keeps the `email` field on the wire and returns `null` when the account has no email. Generated TypeScript and JSON schemas describe a required, nullable field. | | `sdk/python/src/openai_codex/generated/v2_all.py` | The generated Python `ChatgptAccount` model accepts `None` for email. | | `tui/src/app_server_session.rs` | Email-less ChatGPT accounts bootstrap normally, keep external feedback routing, omit account-email telemetry, and display the plan in account status. | ## Design decisions - Missing email remains `None` at every layer. The code never uses an empty string as a substitute. - The app-server response includes `"email": null` instead of omitting the field. Clients retain a stable response shape. - Plan type remains required for provider account state. This change relaxes only the email assumption. ## Testing Tests: affected test targets compile, scoped Clippy and formatting pass, a focused TUI snapshot covers plan-only account status, real before/after PAT login smoke covers metadata without email, app-server smoke covers `account/read` with `email: null`, and a regression smoke covers an existing email-bearing PAT. Unit tests run in CI. ## Evidence Visual smoke evidence will be attached here.
## Summary
Instead of:
reminder_interval_tokens = 65_536
allow users to configure explicit remaining-token reminder thresholds:
reminder_at_remaining_tokens = [65_536, 32_768, 16_384, 8_192, 4_096,
2_048, 1_024, 512]
## Validation
- CARGO_INCREMENTAL=0 just test -p codex-core rollout_budget: 9 passed
- just fix -p codex-core
- just fmt
## Why `permissionProfile/list` currently advertises every built-in and configured profile even when effective enterprise requirements prevent selecting it. That forces each client to reconstruct policy from lower-level requirement fields, which is easy to miss and difficult to keep consistent. The catalog should remain complete so clients can explain that an option was disabled by an administrator, while also reporting whether each profile is selectable. ## What - Add an `allowed` field to each permission profile summary. - Build a shared catalog from the effective config and current requirements, including `allowed_sandbox_modes`, `allowed_permissions`, and filesystem restrictions. - Use the shared catalog in app-server and the TUI so disallowed profiles remain visible but cannot be selected. - Use the canonical `:danger-full-access` profile ID in the TUI. - Update the app-server schemas, API documentation, behavioral tests, and TUI snapshots. ## Scope This PR targets `main` directly and is independent of openai#24852. It preserves the current behavior where built-in profiles are constrained by sandbox-mode requirements and `allowed_permissions` applies to configured profiles. ## Testing - `just test -p codex-core permission_profile_catalog_marks_profiles_disallowed_by_requirements` - `just test -p codex-app-server permission_profile_list` - `just test -p codex-app-server-protocol` - `just test -p codex-tui profile_permissions` - `just fix -p codex-core` - `just fix -p codex-app-server-protocol` - `just fix -p codex-app-server` - `just fix -p codex-tui` - `just fmt` --------- Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Joey Trasatti <joey.trasatti@openai.com>
…9476) ## Why `codex-app-server-test-client` previously treated `item/tool/requestUserInput` as an unsupported server request and terminated the connection. That made it impossible to use the client for end-to-end testing of interactive turns: an operator could observe the request, but could not answer it and confirm that the same turn resumed. ## What changed - Handle `ToolRequestUserInput` server requests in the test client's central request dispatcher. - Render numbered terminal choices, accept exact option labels, support free-form `Other` and text-only questions, and collect multiple answers. - Send a protocol-native `ToolRequestUserInputResponse` and continue streaming the active turn. - Fail clearly when interactive input is requested without a terminal. - Document the interactive behavior and add focused tests for option selection, free-form answers, multiple questions, and invalid-selection retries. ## Testing - `just test -p codex-app-server-test-client` - `just bazel-lock-check` - Manually exercised the app-server flow, selected `TUI`, observed `serverRequest/resolved`, and verified that the same turn completed with the selected answer.
## Summary - rename `Config::permission_profile_allowed` to `is_permission_profile_allowed` - use `BUILT_IN_PERMISSION_PROFILE_DANGER_FULL_ACCESS` in the TUI and its assertion - follow up on the late review comments from openai#26678 The previous `:danger-no-sandbox` value was an invalid built-in profile ID. openai#26678 corrected it to `:danger-full-access`; this PR centralizes the value to prevent future drift. ## Testing - Not run per request; `cargo fmt` only Co-authored-by: Codex <noreply@openai.com>
## Why When Codex starts with a custom CA override such as `SSL_CERT_FILE=/path/to/corp-ca.pem codex`, `rustls-native-certs` treats that override as a replacement for the platform trust store. The managed proxy then rewrites child CA variables to its generated bundle, so the custom root or the ordinary platform roots can be lost. The proxy's upstream TLS connector must trust the same roots or private and corporate upstream certificates still fail after interception. ## What - load platform-native roots without consulting inherited CA override variables - append certificates from the existing curated startup CA file variables and `SSL_CERT_DIR` - share those platform and startup roots with the MITM upstream rustls connector - exclude the Codex managed MITM CA from upstream trust - normalize OpenSSL `TRUSTED CERTIFICATE` blocks while dropping trailing trust metadata - skip an inherited current Codex-managed bundle so nested launches do not duplicate it - append the Codex managed MITM CA to the child-facing bundle - copy certificate material only, so a private key or unrelated text colocated in a startup file is never exposed through the public bundle This is intentionally limited to CA paths present when Codex starts. It does not parse inline shell assignments or add per-command bundle materialization. This changes only `codex-network-proxy` and dependency metadata; it does not touch `codex-core` or sandbox orchestration. ## Validation - `just test -p codex-network-proxy` - includes an end-to-end upstream TLS test using a server trusted only by the startup custom CA - `just fix -p codex-network-proxy` - `just bazel-lock-check`
## Why `openai-oss-forks/tokio-tungstenite` now includes the updated `tungstenite` fork revision from [openai-oss-forks/tokio-tungstenite#3](openai-oss-forks/tokio-tungstenite#3). Codex should consume the merged fork commit and resolve its direct and transitive `tungstenite` dependencies to the same revision instead of retaining the older pins. ## What Changed - Advanced the `tokio-tungstenite` git pin to `0e5b2d73aa18dd9f0a50ee9ff199d5aef7594186`. - Advanced the `tungstenite` fork pin to `4fffad30fe373adbdcffab9545e9e9bf4f2fc19f` and adjusted the patch source so the transitive dependency resolves to that revision. - Updated `Cargo.lock` and `MODULE.bazel.lock` to match the dependency graph.
## This PR
Remote plugin analytics cannot rely only on the in-memory
installed-plugin snapshot because that snapshot is refreshed
asynchronously after startup. This PR persists the authoritative backend
identity alongside each cached remote plugin bundle so later consumers
can resolve it without a network request.
### Behavior
- Store Codex-owned remote installation metadata in an atomic
`.codex-remote-plugin-install.json` sidecar under the plugin cache root.
- Use a versioned, snake_case schema:
```json
{
"schema_version": 1,
"remote_plugin_id": "plugins~Plugin_..."
}
```
- Write the metadata during remote bundle installation.
- Backfill it when bundle sync finds an already-current cached bundle.
- Clear it when a generic/local install replaces the cache.
- Let existing uninstall and stale-cache removal delete it with the
plugin cache root.
- Reject unsupported schema versions rather than silently misreading
future formats.
This PR does not change analytics serialization or event behavior.
### Review surface
The implementation is limited to four `codex-core-plugins` files:
- `store.rs`: owns the versioned sidecar read/write/remove lifecycle.
- `remote_bundle.rs`: persists the backend ID after a remote bundle
install.
- `remote/remote_installed_plugin_sync.rs`: backfills metadata for an
already-current cached bundle.
- Tests cover the storage lifecycle and both remote write paths.
## Testing / Validation
### Automated
- `just test -p codex-core-plugins` (268 tests passed)
- `just fix -p codex-core-plugins` passes with one pre-existing
`large_enum_variant` warning in `manifest.rs`.
- Coverage verifies the exact filename and JSON schema, identity
replacement, local reinstall clearing, uninstall cleanup, remote bundle
installation, unsupported schema rejection, and installed-plugin sync
backfill.
### Live manual validation
Validated the production app-server RPC path with an isolated temporary
`CODEX_HOME` and the PR-built Codex binary. The app-server communicated
over stdio and did not bind a port.
Test plugin: `plugins~Plugin_b80dd84519148191a409cde181c9b3d6`
(`build-macos-apps@openai-curated-remote`).
1. Confirmed `plugin/read` initially reported the plugin uninstalled.
2. Installed it through `plugin/install` and confirmed version `0.1.4`
was cached.
3. Verified
`$CODEX_HOME/plugins/cache/openai-curated-remote/build-macos-apps/.codex-remote-plugin-install.json`
was created beside the `0.1.4/` bundle directory with mode `0600` and
the expected contents:
```json
{
"schema_version": 1,
"remote_plugin_id": "plugins~Plugin_b80dd84519148191a409cde181c9b3d6"
}
```
4. Deleted only the sidecar, restarted the app-server, and confirmed
installed-plugin startup sync recreated it with the same contents.
5. Uninstalled through `plugin/uninstall`, confirmed `plugin/read`
returned `installed: false`, and verified the local plugin cache root
was removed.
6. Restored the account's original uninstalled state and removed the
isolated home and copied credentials.
## Split Overview
```text
main
├── openai#27093 Debug analytics capture merged
│ └── openai#27099 Non-mutating plugin smoke merged
│ └── openai#27100 Remote install/uninstall smoke merged
└── openai#27102 Plugin telemetry metadata refactor merged
└── openai#27669 Persist remote plugin identity ← this PR
Next:
└── Final PR: add explicit local and remote IDs to plugin analytics
```
This PR is based directly on `main`; prerequisite
[openai#27102](openai#27102) has merged. The
original combined [openai#26281](openai#26281)
remains the aggregate reference until the final replacement PR is
published.
- `/usage` can now show and redeem earned usage-limit reset credits, with confirmation, retry, and refreshed availability states. (openai#28154, openai#28793) - `/plugins` now organizes remote plugins into OpenAI Curated, Workspace, and Shared with me sections, while eligible turns can recommend and install relevant plugins. (openai#26703, openai#28399, openai#28400, openai#27704, openai#28403) - Configurable rollout token budgets track usage across agent threads, provide remaining-budget reminders, and abort turns when exhausted. (openai#28746, openai#28494, openai#28707, openai#29423) - App-server clients can configure multi-agent delegation as disabled, explicit-request-only, or proactive at the thread and turn level. (openai#28685, openai#28792, openai#29324) - Added an indexed web-search mode that permits live searches while restricting direct page access to server-approved URLs. (openai#28489) - Codex can now receive scheduled UTC time reminders and query the current time directly, including through client-provided app-server clocks. (openai#28822, openai#28824, openai#28835, openai#29011) ## Bug Fixes - Restored reliable Linux TUI rendering after suspending with `Ctrl+Z` and resuming with `fg`. (openai#28342) - Exec-server processes and stdio MCP sessions now survive transient disconnects, including signed-URL refresh and retry-safe stdin writes. (openai#28512, openai#28374, openai#28546, openai#28895) - Remote environments now preserve executor-native paths, shells, `AGENTS.md` discovery, and sandbox behavior across operating systems. (openai#28146, openai#28152, openai#28958, openai#28983, openai#29099, openai#29108, openai#29113, openai#29424) - Plugin loading and installation now handle root marketplace layouts, manifest fallbacks, multiple skill paths, actionable download errors, and immediate tool refreshes. (openai#28771, openai#28789, openai#28790, openai#28863, openai#28951) - Parent agents now receive terminal subagent errors instead of seeing failed work as an empty successful completion. (openai#28375) - Goal-first threads are once again persisted and returned by `thread/list` and `thread/search`. (openai#28808) ## Chores - Reduced startup and session latency by deferring unnecessary DNS work, warming the model cache, reusing parsed plugin skills, parallelizing skill metadata reads, and skipping redundant catalog synchronization. (openai#28542, openai#28699, openai#28844, openai#29326, openai#29005) - Reduced persistent-log churn by removing per-event WebSocket payload logging and filtering duplicated telemetry records. (openai#29432, openai#29457) ## Changelog Full Changelog: openai/codex@rust-v0.141.0...rust-v0.142.0 - openai#28396 [codex] Record external agent import results @charlesgong-openai - openai#27751 [codex] expose Bedrock credential source in account/read @celia-oai - openai#28338 [codex] Compress cold active rollouts @jif-oai - openai#28368 feat: render typed envelopes for multi-agent v2 messages @jif-oai - openai#28508 [tests] Keep Apps out of generic core test harness @jif-oai - openai#28472 [codex] Clarify plugin load and runtime capability stages @xl-openai - openai#28375 core: surface terminal subagent errors to parent agents @jif-oai - openai#28542 perf(config): defer remote sandbox hostname lookup @fcoury-oai - openai#28473 path-uri: clarify invalid host path errors @anp-oai - openai#28342 fix(tui): restore TUI after suspend @fcoury-oai - openai#28354 [codex] exec-server: stream files in chunks @pakrym-oai - openai#28553 chore: side prompt @jif-oai - openai#27099 [codex-app-server-test-client & codex-app-server] Plugin Usage Analytics Smoke Test @jameswt-oai - openai#28554 fix(tui): highlight C++ module files @fcoury-oai - openai#28467 [codex] Warn clearly when code mode output is truncated @aibrahim-oai - openai#27750 [codex] Add incremental thread history changes @wiltzius-openai - openai#28154 feat(tui): add rate-limit reset redemption to /usage @jayp-oai - openai#28562 ci: run code-mode unit tests on all bazel targets @cconger - openai#27923 [codex] Route MCP file uploads through environment filesystem @pakrym-oai - openai#27100 [codex-app-server-test-client] Plugin Install/Uninstall Analytics Smoke Test @jameswt-oai - openai#28581 [codex] re-enable absolute workdir integration test @anp-oai - openai#28468 code-mode: extend test coverage to lock in cell lifecycle @cconger - openai#28587 [codex] test exec relative additional permissions @anp-oai - openai#28577 Clarify model-generated and legacy app path types @anp-oai - openai#28589 Record invariants for path migration. @anp-oai - openai#28146 app-server: preserve target-native environment cwd @anp-oai - openai#28595 Tell codex about PathUri serde compat. @anp-oai - openai#28399 [codex] [1/4] Add recommended plugin endpoint cache @adaley-openai - openai#28400 [codex] [2/4] Generalize plugin suggestion presentation @adaley-openai - openai#27704 [codex] [3/4] Activate endpoint plugin recommendations @adaley-openai - openai#28152 core: render remote environment cwd natively @anp-oai - openai#28403 [codex] [4/4] Simplify recommended plugin install schema @adaley-openai - openai#26706 PAC 1 - Add system proxy feature config surface @canvrno-oai - openai#27910 Add thread recencyAt for sidebar ordering @nornagon-openai - openai#28627 Revert "Tell codex about PathUri serde compat. (openai#28595)" @anp-oai - openai#28625 [codex] Gate remote plugin catalog by auth @xl-openai - openai#28629 [codex] core: restore absolute turn context cwd @anp-oai - openai#28642 thread-store: fix response fixture compilation @pakrym-oai - openai#28580 [codex] Support object-valued plugin MCP manifests @charlesgong-openai - openai#28599 code-mode: move cell state into library actor @cconger - openai#28471 [codex] Test code-mode variable truncation @aibrahim-oai - openai#28655 Revert thread recencyAt for sidebar ordering @pakrym-oai - openai#28638 core: remove redundant TurnContext and Prompt fields @pakrym-oai - openai#28656 [codex] Persist built-in image results reported as generating @won-openai - openai#28512 Resume exec-server sessions after disconnect @jif-oai - openai#28546 Back off registry retries during exec recovery @jif-oai - openai#28561 Add join key for MAv2 inter-agent messages @jif-oai - openai#28699 app-server: keep the model cache warm @jif-oai - openai#28705 Replace SkillsManager with SkillsService @jif-oai - openai#27965 [ez][codex-rs] Support apps._default.default_tools_approval_mode @zamoshchin-openai - openai#28359 Run fs helper through Windows sandbox wrapper @iceweasel-oai - openai#28628 [codex] Repair invalid skill frontmatter scalars @charlesgong-openai - openai#28632 Tell codex to avoid changing rollout format. @anp-oai - openai#28738 Scope command approvals by execution environment @jif-oai - openai#19047 feat: add run task identity primitives @adrian-openai - openai#28671 [codex] Restore thread recency with compatible migration history @nornagon-openai - openai#28768 Extract TUI plugin catalog rendering @canvrno-oai - openai#28389 [codex] Use compact OpenAI docs search queries @kkahadze-oai - openai#28681 unified-exec: preserve PathUri through exec-server @anp-oai - openai#28731 [codex] Track plugin install and import telemetry failures @charlesgong-openai - openai#28651 exec-server: expose environment registry payloads @viyatb-oai - openai#28771 fix(plugins): support root local marketplace plugins @caseychow-oai - openai#28791 bazel: refresh expired macOS SDK pin @anp-oai - openai#28782 [codex] trace tools build latency @owenlin0 - openai#28778 path-uri: decouple native path parsing @anp-oai - openai#28774 feat(exec-server): add Noise rendezvous environment @apanasenko-oai - openai#28812 [codex] Add optional IDs to response items @pakrym-oai - openai#28784 fix(install): support older awk checksum parsing @fcoury-oai - openai#28826 [codex] Use unique IDs for realtime-routed turns @guinness-oai - openai#27986 [codex] control automatic realtime handoff delivery @jiayuhuang-openai - openai#28836 [codex] Support assistant realtime append text @guinness-oai - openai#28374 Refresh signed exec-server URLs on reconnect @apanasenko-oai - openai#28825 Expose selecte namespaces as direct model tools @won-openai - openai#28790 [codex] Support plugin manifest path lists @charlesgong-openai - openai#28851 Record more path migration guidance for codex. @anp-oai - openai#28780 unified-exec: retain PathUri in command events @anp-oai - openai#28605 [codex] Split plugin and skill warmup tracing @mzeng-openai - openai#28608 [codex] Pass plugin namespace into skill loading @mzeng-openai - openai#28746 [codex] add rollout token budget configuration (1/N) @rka-oai - openai#28766 Add network environment ID plumbing @jif-oai - openai#28915 Avoid sandbox helper in apply_patch approval tests @jif-oai - openai#28813 Pause active goals before TUI interrupts @etraut-openai - openai#28895 Recover exec process stdin writes @jif-oai - openai#28940 Pin Windows argument lint to Windows 2022 @rka-oai - openai#28914 Scope MCP sandbox metadata to server environment @jif-oai - openai#28911 Add turn-scoped context contributions @jif-oai - openai#28808 Fix goal-first live threads missing from thread/list @etraut-openai - openai#25019 [codex] Initialize exec-server OpenTelemetry at startup @starr-openai - openai#28943 [codex] Fix Windows sandbox runtime ACL refresh @iceweasel-oai - openai#28946 Synchronize realtime notification test requests @rka-oai - openai#28822 Add Config for Time Reminders (1/n) @rka-oai - openai#28494 [codex] rollout budget implementation (2/N) @rka-oai - openai#27500 Support `openai/form` extended form elicitations @gpeal - openai#28949 [codex] Make thread store turn filter optional @wiltzius-openai - openai#28824 current time reminders impl for system clock (2/n) @rka-oai - openai#27812 [codex] Cache plugin metadata for tool suggestions @mzeng-openai - openai#28854 apply-patch: carry paths as PathUri @anp-oai - openai#28835 Add app-server current-time impl (3/n) @rka-oai - openai#26496 Make auto-review on-request prompt more proactive @maja-openai - openai#28947 [codex] Remove hardcoded app ID filters @ericning-o - openai#28959 TUI: improve unified mention selection visibility @canvrno-oai - openai#27132 Emit Trusted MCP App Identity on Tool-Call Items @martinauyeung-oai - openai#19049 feat: opt ChatGPT auth into agent identity @adrian-openai - openai#28770 [connectors] Ignore synthetic links for app accessibility @adaley-openai - openai#28863 [codex] Preserve remote plugin download status errors @xl-openai - openai#28958 core: load AGENTS.md from foreign environments @anp-oai - openai#28789 [codex] Support marketplace plugin manifest fallback @charlesgong-openai - openai#28993 [codex] Remove child AGENTS.md prompt experiment @pakrym-oai - openai#28989 core: log AGENTS.md paths as URIs @anp-oai - openai#28983 core: keep remote exec on reported shell @anp-oai - openai#28844 [codex] Reuse parsed plugin skills during session startup @xl-openai - openai#28953 core: add UUIDv7 context window IDs @pakrym-oai - openai#28951 [plugins] Refresh plugin and tool caches after remote install @adaley-openai - openai#28856 Always use AVAS for realtime WebRTC calls @bakks - openai#28814 [codex] Assign response item IDs when recording history @pakrym-oai - openai#29005 [codex] Skip curated repo sync for remote plugins @xl-openai - openai#29011 [codex] add clock current-time tool @rka-oai - openai#29012 core: assign item IDs to compacted replacement history @pakrym-oai - openai#29022 [codex] Support protected resource OAuth discovery @xl-openai - openai#28674 [1/3] core: add remote environment connection lifecycle @sayan-oai - openai#28683 [2/3] core: track starting environments in snapshots @sayan-oai - openai#29025 [3/3] app-server: configure environment connection timeout @sayan-oai - openai#28685 Add per-turn multi-agent mode @shijie-oai - openai#28792 Expose thread-level multi-agent mode @shijie-oai - openai#28707 [codex] abort turns when rollout budgets expire (token budget 3/3) @rka-oai - openai#28899 Scope network approvals by environment @jif-oai - openai#29086 Document raw response item compatibility @jif-oai - openai#28489 Add indexed web search mode @winston-openai - openai#28942 Add config toggles for orchestrator skills and MCP @jif-oai - openai#29099 Keep remote exec commands native to the executor @jif-oai - openai#29095 Use cached and live web access terminology @winston-openai - openai#29042 [codex] trace pre-sampling skill and persistence latency @rphilizaire-openai - openai#29132 chore(deps): advance tokio-tungstenite @apanasenko-oai - openai#29006 [codex] Preserve skill descriptions outside model context @charlesgong-openai - openai#29154 Allow resume and settings commands during tasks and MCP startup @etraut-openai - openai#29256 core: add context window lineage IDs @pakrym-oai - openai#29259 [codex] prototype mcp_history thread hint injection @pakrym-oai - openai#29255 [codex] add configurable token budget compaction reminder @pakrym-oai - openai#29295 [codex] simplify token budget context @pakrym-oai - openai#29108 Carry sandbox intent to remote exec servers @jif-oai - openai#29325 Test pipelined scalar exec-server requests @jif-oai - openai#29326 Parallelize skill metadata stats @jif-oai - openai#29329 Use controlled time for remote initialization timeout test @jif-oai - openai#29170 code-mode: define transport-neutral runtime types @cconger - openai#29285 code-mode: move session ownership into runtime @cconger - openai#29286 code-mode: linearize cell terminal state @cconger - openai#29287 code-mode: make session shutdown authoritative @cconger - openai#29301 [prompting] updated plan mode prompt @rhan-oai - openai#29288 code-mode: preserve dropped observation output @cconger - openai#29289 code-mode: preserve initial yield at completion @cconger - openai#28260 [codex] Add internal auto-compaction opt-out @rhan-oai - openai#29371 Propagate safety buffering events to app-server clients @fc-oai - openai#29393 chore: fix merge race (auto-compaction feature access) @sayan-oai - openai#29327 Persist session IDs across thread resume @jif-oai - openai#29324 Simplify multi-agent mode controls @jif-oai - openai#29113 Apply sandbox intent inside remote exec servers @jif-oai - openai#29001 Add workspace messages app-server API @xli-oai - openai#29432 Stop logging every Responses WebSocket event @jif-oai - openai#29073 core: refresh environment context before sampling @sayan-oai - openai#29455 fix(core): restore thread_source in x-codex-turn-metadata @owenlin0 - openai#29457 Filter noisy targets from persistent logs @jif-oai - openai#29429 remove flag for image preparation @rka-oai - openai#29143 ci: restore custom Windows runner with hermetic LLVM 0.7.9 @anp-oai - openai#27102 [codex] Centralize Plugin Analytics Metadata @jameswt-oai - openai#26703 TUI Plugin Sharing 3 - render remote plugin catalog sections @canvrno-oai - openai#29424 Report remote sandbox denials semantically @jif-oai - openai#28968 core: rename metadata -> internal_chat_message_metadata_passthrough @owenlin0 - openai#29464 [sdk/python] Stop advertising HTTP image URLs @rka-oai - openai#28793 [codex] Fix usage-limit reset copy and state @jayp-oai - openai#27982 [codex] Start the guardian child session when parent session is started @jgershen-oai - openai#29468 core: remove unused permissions cwd plumbing @bolinfest - openai#26707 PAC 2 - Add shared auth system proxy contract @canvrno-oai - openai#28991 Allow ChatGPT accounts without email @efrazer-oai - openai#29423 [codex] configure rollout budget reminder thresholds @rka-oai - openai#26678 permission profiles: expose availability to clients @viyatb-oai - openai#29476 [codex] handle request_user_input in app-server test client @celia-oai - openai#29479 fix(config): address permission profile review follow-ups @viyatb-oai - openai#29014 Honor startup custom CA bundles with managed MITM @winston-openai - openai#29480 chore: advance tungstenite fork pins @apanasenko-oai - openai#27669 [codex-core-plugins] Remote Plugin ID Persisted to File @jameswt-oai
Adds a `monitor` tool (gated behind the Monitor feature) that runs a shell command as a long-lived background process and delivers each line it prints (stdout or stderr) back to the model as a notification, so the agent can react to events without polling: a log line appearing, a file changing under `fswatch`, a CI check landing, a build going green. It reuses the existing unified_exec machinery rather than adding its own. The command is spawned through the same process manager, so it lives in the shared process store and is reaped at session shutdown with everything else. A delivery task subscribes as a second consumer of the process output broadcast, coalesces lines within a 200ms window, and wakes an idle session through `try_start_turn_if_idle` (the existing gate for extension-initiated idle work). A flood guard auto-stops a runaway command. action=start returns a monitor id, action=stop ends one watch, and action=list shows what's running. Covered by an end-to-end test in core/tests/suite/monitor.rs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Draft / work in progress.
Reference implementation of an agent-callable
monitortool for codex-core: the model runs a shell command as a long-lived background watcher, and each output line wakes the idle session so the agent can react to background events without polling.Kept on the fork as the reference diff for an upstream feature request. Not yet ready to propose: a few code-review items are still pending.