Synced from monorepo
Changes: - Classify clipboard delivery confidence - Add durable session update append - Scope the xAI session bearer to first-party memory embedding endpoints - Persist subagent outputs to disk and bound long-lived agent state - Add MiniSweAgent:bash for mini-swe-agent parity - Revert taking local sessions off the persistent shell - Contextual tip recommending grok wrap on SSH sessions - Voice STT bearer from model BYOK env_key/api_key - Define exact website policies for sandbox - Gate unsafe shell environments - Shared pin hoist; single require_sha gate for marketplace plugins - Server-signed is-managed claim (closes sidecar-removal downgrade) - Optional require_sha pin for remote plugin installs - Show session title and last exchange in the exit resume hint - Gate shell output redirects - Warn when fail_closed is present but not a boolean - Add canonical text editing core (ratatui-textarea) - Keep execution state out of goal scratch - Add acknowledged persistence primitives - Inherit child network restrictions in sandbox - Fail closed when hook matchers fail to recompile - Add MCP setup preferences for plugin MCPs - Gate sourced shell scripts - Gate file-typed project hooks - grok wrap: restore terminal modes on child death - Harden owner-only permissions on auth and MCP credentials - Create crash dump files with owner-only permissions - Write the agent_id cache owner-only (0600) - SessionMetrics mode skips Mixpanel profile sync - Dashboard: slim live-tail peek - Yank full queued prompt text, not (+N lines) - Defeat clock-rollback on the signed managed-config cache - Stop early session/cancel from overtaking the prompt and wedging the turn slot - Self-heal a diverged agent entrypoint on startup - Add matched inference expectations in test-support - Add AuthSingleFlight cancel/successor gap tests - Remove consumer from external OTEL allowlist and pin scrub coverage - Enable /copy in minimal mode - Surface capacity and API-key detail on 429 errors - Single-flight interactive auth - Fix PageUp/PageDown skipping lines behind sticky prompt header
This commit is contained in:
parent
8adf9013a0
commit
98c3b2438a
225 changed files with 18836 additions and 7156 deletions
|
|
@ -30,3 +30,79 @@ mod paste_ctrl_v_image_keeps_ui_responsive_windows;
|
|||
mod paste_ctrl_v_text_echoes_fast_macos;
|
||||
#[path = "pty_e2e/paste_ctrl_v_text_echoes_fast_windows.rs"]
|
||||
mod paste_ctrl_v_text_echoes_fast_windows;
|
||||
|
||||
use common::*;
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
#[ignore = "PTY e2e; exercises real copy output and /terminal-setup"]
|
||||
async fn unknown_ssh_clipboard_delivery_is_unverified() {
|
||||
let content = ContentController::start().await.expect("start content");
|
||||
content.set_response(format!(
|
||||
"{MOCK_RESPONSE_SENTINEL} clipboard delivery sentinel"
|
||||
));
|
||||
let binary = pager_binary().expect("resolve pager binary");
|
||||
let mut env = content.env_for_pager();
|
||||
env.push((
|
||||
"SSH_CONNECTION".into(),
|
||||
"scripted-test 1 127.0.0.1 2".into(),
|
||||
));
|
||||
let env_refs: Vec<(&str, &str)> = env
|
||||
.iter()
|
||||
.map(|(key, value)| (key.as_str(), value.as_str()))
|
||||
.collect();
|
||||
let mut harness = PtyHarness::new_in_dir(&binary, 60, 80, &[], &env_refs, Some(content.home()))
|
||||
.expect("spawn pager");
|
||||
|
||||
harness
|
||||
.wait_for_text(WELCOME_SCREEN_SENTINEL, WELCOME_TIMEOUT)
|
||||
.expect("welcome");
|
||||
harness
|
||||
.inject_keys(format!("{PROMPT}\r").as_bytes())
|
||||
.expect("submit prompt");
|
||||
harness
|
||||
.wait_for_text(MOCK_RESPONSE_SENTINEL, Duration::from_secs(30))
|
||||
.expect("response");
|
||||
harness
|
||||
.wait_for_text("Worked for", Duration::from_secs(20))
|
||||
.expect("turn completion marker before /copy");
|
||||
inject_keys_paced(&mut harness, b"/copy 1");
|
||||
harness
|
||||
.wait_for_text("/copy 1", Duration::from_secs(10))
|
||||
.expect("/copy command ready");
|
||||
let raw_before_copy = harness.raw_output().len();
|
||||
harness.inject_keys(b"\r").expect("run /copy");
|
||||
|
||||
let copy_deadline = Instant::now() + Duration::from_secs(10);
|
||||
let payloads = loop {
|
||||
harness.update(Duration::from_millis(200));
|
||||
let payloads = decode_osc52_payloads(&harness.raw_output()[raw_before_copy..]);
|
||||
if !payloads.is_empty() || Instant::now() >= copy_deadline {
|
||||
break payloads;
|
||||
}
|
||||
};
|
||||
assert!(
|
||||
payloads
|
||||
.iter()
|
||||
.any(|payload| payload.contains("clipboard delivery sentinel")),
|
||||
"copy must still emit the response through OSC 52: {payloads:?}"
|
||||
);
|
||||
harness
|
||||
.wait_for_text("Copy sent", Duration::from_secs(10))
|
||||
.expect("unverified copy result visible at 80 columns");
|
||||
assert!(!harness.contains_text("Copy failed"));
|
||||
assert!(!harness.contains_text("Copied!"));
|
||||
|
||||
harness
|
||||
.inject_keys(b"/terminal-setup\r")
|
||||
.expect("run /terminal-setup");
|
||||
harness
|
||||
.wait_for_text("status unverified", Duration::from_secs(10))
|
||||
.expect("unverified clipboard status");
|
||||
harness
|
||||
.wait_for_text("grok wrap <ssh command>", Duration::from_secs(10))
|
||||
.expect("wrapped SSH guidance");
|
||||
assert!(!harness.contains_text("Copy failed"));
|
||||
assert!(!harness.contains_text("panicked"));
|
||||
|
||||
harness.quit().expect("clean quit");
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue