From 66a83c9b297680913b770e6417fac1f608a7d9b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Oct 2026 03:32:30 +0000 Subject: [PATCH] chore: sync public mirror from internal --- .repository-projection.json | 6 +- packages/runtime-gateway-rs/src/tests.rs | 78 +----------------- .../src/tests/a2a_rejection.rs | 82 +++++++++++++++++++ packages/tui-rs/tests/pty_e2e.rs | 27 +++++- 4 files changed, 111 insertions(+), 82 deletions(-) create mode 100644 packages/runtime-gateway-rs/src/tests/a2a_rejection.rs diff --git a/.repository-projection.json b/.repository-projection.json index 848834c89..966f7a75a 100644 --- a/.repository-projection.json +++ b/.repository-projection.json @@ -3,11 +3,11 @@ "projection": "deixic-code", "projectionSchemaVersion": 1, "sourceRepository": "dx-corp/mono", - "sourceSha": "db6b98afdef142af1024b21c7c6014329dee17a4", + "sourceSha": "de2c24eb54f696843ccd61a60bced5ca39860a6e", "destinationRepository": "dx-corp/code", - "priorProjectedBase": "7f2d8d6a9f39609055da5793d525a3226e341233", + "priorProjectedBase": "63e975db238b59b2fd281ee8cc76eb458e1f4f3f", "definitionDigest": "cb9d429542ebb0a2de9b42a7aad60d9d8696a648ceba47c30f05c0b285ca0db7", "toolDigest": "f6d8b2a0b6f867d1db845a086635357eed196054b6a47f0695e49fdde616d6e6", - "contentDigest": "b0b525fb563e288920995306519c45d31b8847effbec7cf1bc006fc8ef4f6077", + "contentDigest": "cce615766ed887df61c04a774e5af7fcccfbcc19ba9f99277f6e8273e587b95e", "publicationEligible": true } diff --git a/packages/runtime-gateway-rs/src/tests.rs b/packages/runtime-gateway-rs/src/tests.rs index 076a4ed94..04b88957a 100644 --- a/packages/runtime-gateway-rs/src/tests.rs +++ b/packages/runtime-gateway-rs/src/tests.rs @@ -4876,82 +4876,8 @@ async fn a2a_subagent_request_rejects_invalid_task_capsule_before_claim() { } } -#[tokio::test(flavor = "current_thread")] -async fn unsupported_a2a_subagent_lane_rejects_before_task_persistence() { - let subagent_request = valid_browser_qa_capsule(); - let body = serde_json::json!({ - "message": { - "messageId": "msg-unsupported-lane", - "contextId": "ctx-unsupported-lane", - "role": "ROLE_USER", - "parts": [{ - "text": "run browser QA", - "mediaType": "text/plain" - }] - }, - "configuration": { - "returnImmediately": true - }, - "metadata": { - "evalops.subagentRequest": subagent_request - } - }) - .to_string(); - let request = format!( - "POST /message:send HTTP/1.1\r\nHost: localhost\r\nx-maestro-api-key: api-key\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{body}", - body.len() - ); - let mut initial = request.into_bytes(); - let head = parse_request_head(&initial).expect("request should parse"); - let (_client, mut server) = tcp_stream_pair().await; - let state = test_app_state_with_sessions(HashMap::new()); - - let response = - response_json(handle_a2a_endpoint(&mut server, &mut initial, head, &state).await); - - assert_eq!(response["error"]["code"], "INVALID_REQUEST"); - assert_eq!(state.a2a_tasks.lock().await.len(), 0); - assert_eq!(state.a2a_cancel_senders.lock().await.len(), 0); -} - -#[tokio::test(flavor = "current_thread")] -async fn unexecutable_a2a_capsule_rejects_before_task_persistence() { - let mut subagent_request = valid_code_writer_capsule(); - subagent_request["capsule"]["acceptanceChecks"] = serde_json::json!(["cat /etc/passwd"]); - let body = serde_json::json!({ - "message": { - "messageId": "msg-unexecutable", - "contextId": "ctx-unexecutable", - "role": "ROLE_USER", - "parts": [{ - "text": "run an unsafe check", - "mediaType": "text/plain" - }] - }, - "configuration": { - "returnImmediately": true - }, - "metadata": { - "evalops.subagentRequest": subagent_request - } - }) - .to_string(); - let request = format!( - "POST /message:send HTTP/1.1\r\nHost: localhost\r\nx-maestro-api-key: api-key\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{body}", - body.len() - ); - let mut initial = request.into_bytes(); - let head = parse_request_head(&initial).expect("request should parse"); - let (_client, mut server) = tcp_stream_pair().await; - let state = test_app_state_with_sessions(HashMap::new()); - - let response = - response_json(handle_a2a_endpoint(&mut server, &mut initial, head, &state).await); - - assert_eq!(response["error"]["code"], "INVALID_REQUEST"); - assert_eq!(state.a2a_tasks.lock().await.len(), 0); - assert_eq!(state.a2a_cancel_senders.lock().await.len(), 0); -} +#[path = "tests/a2a_rejection.rs"] +mod a2a_rejection; #[test] fn detects_platform_a2a_push_callback_route() { diff --git a/packages/runtime-gateway-rs/src/tests/a2a_rejection.rs b/packages/runtime-gateway-rs/src/tests/a2a_rejection.rs new file mode 100644 index 000000000..c84bb4663 --- /dev/null +++ b/packages/runtime-gateway-rs/src/tests/a2a_rejection.rs @@ -0,0 +1,82 @@ +use super::*; + +#[tokio::test(flavor = "current_thread")] +async fn unsupported_a2a_subagent_lane_rejects_before_task_persistence() { + // Authentication reads the hosted-profile environment changed by sibling tests. + let _guard = ENV_LOCK.lock().await; + let subagent_request = valid_browser_qa_capsule(); + let body = serde_json::json!({ + "message": { + "messageId": "msg-unsupported-lane", + "contextId": "ctx-unsupported-lane", + "role": "ROLE_USER", + "parts": [{ + "text": "run browser QA", + "mediaType": "text/plain" + }] + }, + "configuration": { + "returnImmediately": true + }, + "metadata": { + "evalops.subagentRequest": subagent_request + } + }) + .to_string(); + let request = format!( + "POST /message:send HTTP/1.1\r\nHost: localhost\r\nx-maestro-api-key: api-key\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{body}", + body.len() + ); + let mut initial = request.into_bytes(); + let head = parse_request_head(&initial).expect("request should parse"); + let (_client, mut server) = tcp_stream_pair().await; + let state = test_app_state_with_sessions(HashMap::new()); + + let response = + response_json(handle_a2a_endpoint(&mut server, &mut initial, head, &state).await); + + assert_eq!(response["error"]["code"], "INVALID_REQUEST", "{response}"); + assert_eq!(state.a2a_tasks.lock().await.len(), 0); + assert_eq!(state.a2a_cancel_senders.lock().await.len(), 0); +} + +#[tokio::test(flavor = "current_thread")] +async fn unexecutable_a2a_capsule_rejects_before_task_persistence() { + // Authentication reads the hosted-profile environment changed by sibling tests. + let _guard = ENV_LOCK.lock().await; + let mut subagent_request = valid_code_writer_capsule(); + subagent_request["capsule"]["acceptanceChecks"] = serde_json::json!(["cat /etc/passwd"]); + let body = serde_json::json!({ + "message": { + "messageId": "msg-unexecutable", + "contextId": "ctx-unexecutable", + "role": "ROLE_USER", + "parts": [{ + "text": "run an unsafe check", + "mediaType": "text/plain" + }] + }, + "configuration": { + "returnImmediately": true + }, + "metadata": { + "evalops.subagentRequest": subagent_request + } + }) + .to_string(); + let request = format!( + "POST /message:send HTTP/1.1\r\nHost: localhost\r\nx-maestro-api-key: api-key\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{body}", + body.len() + ); + let mut initial = request.into_bytes(); + let head = parse_request_head(&initial).expect("request should parse"); + let (_client, mut server) = tcp_stream_pair().await; + let state = test_app_state_with_sessions(HashMap::new()); + + let response = + response_json(handle_a2a_endpoint(&mut server, &mut initial, head, &state).await); + + assert_eq!(response["error"]["code"], "INVALID_REQUEST", "{response}"); + assert_eq!(state.a2a_tasks.lock().await.len(), 0); + assert_eq!(state.a2a_cancel_senders.lock().await.len(), 0); +} diff --git a/packages/tui-rs/tests/pty_e2e.rs b/packages/tui-rs/tests/pty_e2e.rs index 20b2ee759..0b1699601 100644 --- a/packages/tui-rs/tests/pty_e2e.rs +++ b/packages/tui-rs/tests/pty_e2e.rs @@ -418,6 +418,9 @@ impl PtySession { } } command.env("TERM", "xterm-256color"); + // Bash scenarios need an executable shell independent of the runner's login shell. + // Scenario-specific extra_env below retains its explicit override. + command.env("SHELL", "/bin/bash"); command.env("HOME", workdir); command.env("MAESTRO_HOME", &maestro_home); command.env("MAESTRO_TELEMETRY", "0"); @@ -1865,9 +1868,27 @@ fn pty_grouped_model_menu_opens_selector_and_escape_returns_to_chat() { session.wait_for_text("PTY_GROUPED_MODEL_MENU_READY", READY_TIMEOUT); session.submit_prompt("/model"); - session.wait_for_text("Model and effort", TURN_TIMEOUT); - session.wait_for_text("Choose model", TURN_TIMEOUT); - let grouped_menu = session.screen_text(); + let deadline = Instant::now() + TURN_TIMEOUT; + let grouped_menu = loop { + let frame = session + .output + .lock() + .unwrap_or_else(|error| error.into_inner()) + .completed_current_text(); + if let Some(frame) = frame.filter(|frame| { + frame.contains("Model and effort") + && frame.contains("Choose model") + && frame.contains("Effort") + }) { + break frame; + } + assert!( + Instant::now() < deadline, + "grouped model menu never completed its labels:\n{}", + session.screen_text() + ); + std::thread::sleep(Duration::from_millis(50)); + }; assert!( grouped_menu.contains("Model and effort") && grouped_menu.contains("Choose model")