Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5f7d5ad
Remove the remote agent message board client README (#49266)
jif-oai Sep 29, 2026
68e1a42
Support remote agent message boards in multi-agent sessions (#49267)
jif-oai Sep 29, 2026
0b1b78a
Preserve thread overrides and cloud policy validity during config rel…
nicksteele-oai Sep 29, 2026
677b07e
Isolate realtime conversation tests from Responses prewarm connection…
felixxia-oai Sep 29, 2026
4994306
Enable enterprise MCP sign-in and account-scoped grant cleanup (#49276)
nicksteele-oai Sep 29, 2026
d515b2f
Avoid a turn teardown race in the Guardian agent message test (#49277)
felixxia-oai Sep 29, 2026
18194bf
Restrict capability roots to captured turn environments (#49280)
miz-openai Sep 29, 2026
65c3f40
Model exec-server session attachment state as an enum (#49286)
jif-oai Sep 29, 2026
4773a13
Add `/mcp login <name>` to the TUI (#49290)
nicksteele-oai Sep 29, 2026
d79a95b
Record Guardian context mode in review and classification telemetry (…
felixxia-oai Sep 29, 2026
cf12c86
Simplify configuration fingerprint canonicalization (#49295)
jif-oai Sep 29, 2026
d5e6526
Scan the session index backwards for batch thread name lookups (#49297)
jif-oai Sep 29, 2026
a6f0939
Compact the inline hidden tag buffer once per chunk (#49300)
jif-oai Sep 29, 2026
c2837d8
Batch metadata reads when resolving thread names (#49305)
jif-oai Sep 29, 2026
50d9c5d
Run piped legacy Windows sandbox processes without a console (#49308)
etraut-openai Sep 29, 2026
6347513
Notify parent agents when Guardian stops a subagent (#49312)
jif-oai Sep 29, 2026
193632d
Bump taiki-e/install-action to v2.87.21 in CI setup (#49316)
jgershen-oai Sep 29, 2026
b1e7296
Add GPT-6.1 Sol as the default catalog model (#49318)
andrewgu-oai Sep 29, 2026
26dd19e
Retry Windows sandbox runner logon once on error 1056 (#49325)
zm-oai Sep 29, 2026
5937592
Keep remote control reconnect backoff capped during sustained failure…
yansenzhou-oai Sep 29, 2026
ed9e5a2
Clean up canceled exec-server RPC requests immediately (#49332)
jif-oai Sep 29, 2026
a6e9eaa
Add GPT-6.1 Sol to Bedrock catalogs and make it the default (#49339)
celia-oai Sep 29, 2026
8ffd91e
Enable multi-agent V2 and Ultra reasoning on Amazon Bedrock (#49345)
celia-oai Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/setup-ci/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ runs:
CURL_HOME: ${{ runner.temp }}/dotslash-curl

- name: Install just
uses: taiki-e/install-action@44c6d64aa62cd779e873306675c7a58e86d6d532 # v2.62.49
uses: taiki-e/install-action@4cef1412cce204788f482e778a0b9187f9626a29 # v2.87.21
with:
tool: just@1.51.0

Expand Down
4 changes: 4 additions & 0 deletions codex-rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions codex-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ codex-websocket-client = { path = "websocket-client" }
codex-config = { path = "config" }
codex-connectors = { path = "connectors" }
codex-agent-extension = { path = "ext/agent" }
codex-agent-message-board-client = { path = "agent-message-board-client" }
codex-agent-message-board-extension = { path = "ext/agent-message-board" }
codex-connectors-extension = { path = "ext/connectors" }
codex-context-fragments = { path = "context-fragments" }
Expand Down
20 changes: 0 additions & 20 deletions codex-rs/agent-message-board-client/README.md

This file was deleted.

4 changes: 4 additions & 0 deletions codex-rs/analytics/src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ pub enum GuardianReviewedAction {

#[derive(Clone, Serialize)]
pub struct GuardianReviewEventParams {
pub guardian_context_mode: Option<&'static str>,
pub thread_id: String,
pub turn_id: String,
pub review_id: String,
Expand Down Expand Up @@ -479,6 +480,7 @@ impl GuardianReviewTrackContext {
completed_at_ms: u64,
) -> GuardianReviewEventParams {
GuardianReviewEventParams {
guardian_context_mode: result.guardian_context_mode,
thread_id: self.thread_id.clone(),
turn_id: self.turn_id.clone(),
review_id: self.review_id.clone(),
Expand Down Expand Up @@ -531,6 +533,7 @@ impl GuardianReviewTrackContext {

#[derive(Debug)]
pub struct GuardianReviewAnalyticsResult {
pub guardian_context_mode: Option<&'static str>,
pub decision: GuardianReviewDecision,
pub terminal_status: GuardianReviewTerminalStatus,
pub failure_reason: Option<GuardianReviewFailureReason>,
Expand All @@ -556,6 +559,7 @@ pub struct GuardianReviewAnalyticsResult {
impl GuardianReviewAnalyticsResult {
pub fn without_session() -> Self {
Self {
guardian_context_mode: None,
decision: GuardianReviewDecision::Denied,
terminal_status: GuardianReviewTerminalStatus::FailedClosed,
failure_reason: None,
Expand Down
1 change: 1 addition & 0 deletions codex-rs/analytics/src/guardian_v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub struct GuardianV2Event {
#[serde(untagged)]
pub enum GuardianV2EventKind {
Classification {
guardian_context_mode: &'static str,
outcome: &'static str,
risk_level: Option<&'static str>,
duration_ms: u64,
Expand Down
1 change: 1 addition & 0 deletions codex-rs/analytics/src/tests/suite/approvals_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ async fn guardian_review_event_ingests_custom_fact_with_optional_target_item() {
.ingest(
AnalyticsFact::Custom(CustomAnalyticsFact::GuardianReview(Box::new(
GuardianReviewEventParams {
guardian_context_mode: None,
thread_id: "thread-guardian".to_string(),
turn_id: "turn-guardian".to_string(),
review_id: "review-guardian".to_string(),
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file not shown.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 13 additions & 5 deletions codex-rs/app-server-protocol/src/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2193,6 +2193,12 @@ mod tests {
.ok_or_else(|| anyhow::anyhow!("missing account usage response fixture"))?,
)?;
assert!(account_usage_response_ts.contains("threadUsage?: ThreadUsage | null"));
let mcp_login_completion_ts = std::str::from_utf8(
fixture_tree
.get(Path::new("v2/McpServerOauthLoginCompletedNotification.ts"))
.ok_or_else(|| anyhow::anyhow!("missing MCP login completion fixture"))?,
)?;
assert!(mcp_login_completion_ts.contains("loginId?: string | null"));
let server_request_ts = std::str::from_utf8(
fixture_tree
.get(Path::new("ServerRequest.ts"))
Expand Down Expand Up @@ -2386,14 +2392,16 @@ mod tests {

// If the last non-whitespace before ':' is '?', then this is an
// optional field with a nullable type (i.e., "?: T | null").
// These are only allowed in *Params types, except the additive stable usage
// response field, which older servers omit and newer servers return as null.
let legacy_account_usage_response = path
// These are only allowed in *Params types, except additive stable fields
// that older servers omit and newer servers may return as null.
let legacy_optional_nullable_field = (path
== Path::new("v2/GetAccountTokenUsageResponse.ts")
&& field_prefix.trim() == "threadUsage?";
&& field_prefix.trim() == "threadUsage?")
|| (path == Path::new("v2/McpServerOauthLoginCompletedNotification.ts")
&& field_prefix.trim() == "loginId?");
if field_prefix.chars().rev().find(|c| !c.is_whitespace()) == Some('?')
&& !allow_optional_nullable
&& !legacy_account_usage_response
&& !legacy_optional_nullable_field
{
let line_number =
contents[..abs_idx].chars().filter(|c| *c == '\n').count() + 1;
Expand Down
8 changes: 8 additions & 0 deletions codex-rs/app-server-protocol/src/protocol/v2/mcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,11 @@ pub enum McpServerOauthClientRegistration {
#[ts(export_to = "v2/")]
pub struct McpServerOauthLoginResponse {
pub authorization_url: String,
/// Identifies this login attempt across the response and completion notification.
/// Older servers omit this field; current servers always return it.
#[serde(default)]
#[ts(optional)]
pub login_id: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
Expand All @@ -338,6 +343,9 @@ pub struct McpToolCallProgressNotification {
pub struct McpServerOauthLoginCompletedNotification {
pub name: String,
pub thread_id: Option<String>,
/// Identifies the explicit login attempt. Older servers omit this field.
#[ts(optional, as = "Option<Option<String>>")]
pub login_id: Option<String>,
pub success: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional)]
Expand Down
16 changes: 16 additions & 0 deletions codex-rs/app-server-protocol/src/protocol/v2/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,22 @@ fn managed_hooks_requirements_default_interrupt_to_empty() {
assert_eq!(parsed.interrupt, Vec::new());
}

#[test]
fn mcp_oauth_login_response_accepts_older_servers_without_login_id() {
let response = serde_json::from_value::<McpServerOauthLoginResponse>(json!({
"authorizationUrl": "https://example.com/authorize",
}))
.expect("older login response should deserialize");

assert_eq!(
response,
McpServerOauthLoginResponse {
authorization_url: "https://example.com/authorize".to_string(),
login_id: None,
}
);
}

#[test]
fn external_agent_config_detect_response_defaults_connectors_for_older_servers() {
let response = serde_json::from_value::<ExternalAgentConfigDetectResponse>(json!({
Expand Down
Loading
Loading