diff --git a/adapters/t3code/README.md b/adapters/t3code/README.md index c1ece3e..9194d5f 100644 --- a/adapters/t3code/README.md +++ b/adapters/t3code/README.md @@ -21,8 +21,9 @@ Microbridge uses T3 Code's authenticated public endpoints: It never reads T3 Code databases, bootstrap credentials, or desktop internals. -The compatibility suite is pinned to T3 server `0.0.28` and upstream contract -commit `ebe8afb1df357423a0e036b388af3e739d640205`. Other server versions are +The compatibility suite is pinned to T3 server bases `0.0.28` and `0.0.29` +(including `*-nightly.…` builds of those bases) against upstream contract +commit `5d34f9ff235115d43a6cb4b4561d10badf218b87`. Other server versions are reported as **Incompatible** until Microbridge verifies and ships their contract. The adapter opens threads with T3 Code's semantic deep link. Reasoning effort stays disabled because the current paired HTTP snapshot includes the selected @@ -30,6 +31,7 @@ value but not the provider/model option descriptors needed to choose the next valid level safely. Microbridge does not fake this with key presses or private desktop state. -The compatibility target is the contract present in `pingdotgg/t3code` as of -July 18, 2026. Authentication failures return to **Needs setup**; transport -failures show **Connecting** and retry with the existing paired credential. +The compatibility target is the orchestration shell/dispatch contract present +in `pingdotgg/t3code` as of July 20, 2026. Authentication failures return to +**Needs setup**; transport failures show **Connecting** and retry with the +existing paired credential. diff --git a/crates/microbridged/src/t3code.rs b/crates/microbridged/src/t3code.rs index c4b2ec8..2ba8efe 100644 --- a/crates/microbridged/src/t3code.rs +++ b/crates/microbridged/src/t3code.rs @@ -24,8 +24,11 @@ pub const T3_OWNER: u64 = u64::MAX - 1; const KEYCHAIN_SERVICE: &str = "ai.microbridge.t3code"; #[cfg(target_os = "macos")] const KEYCHAIN_ACCOUNT: &str = "paired-environment"; -const SUPPORTED_SERVER_VERSION: &str = "0.0.28"; -const PINNED_CONTRACT_COMMIT: &str = "ebe8afb1df357423a0e036b388af3e739d640205"; +/// Base server versions whose paired HTTP orchestration contract Microbridge +/// has verified. Nightly builds of these bases (`0.0.29-nightly.…`) are also +/// accepted — T3 ships nightlies with the same shell/dispatch surface. +const SUPPORTED_SERVER_VERSIONS: &[&str] = &["0.0.28", "0.0.29"]; +const PINNED_CONTRACT_COMMIT: &str = "5d34f9ff235115d43a6cb4b4561d10badf218b87"; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct T3Credential { @@ -327,7 +330,7 @@ pub fn spawn( format!( "T3 Code server {} is incompatible with Microbridge's pinned {} contract ({}). Update Microbridge before reconnecting.", descriptor.server_version, - SUPPORTED_SERVER_VERSION, + SUPPORTED_SERVER_VERSIONS.join(" / "), &PINNED_CONTRACT_COMMIT[..12], ), ); @@ -427,7 +430,12 @@ async fn fetch_descriptor( } fn contract_is_supported(server_version: &str) -> bool { - server_version == SUPPORTED_SERVER_VERSION + SUPPORTED_SERVER_VERSIONS.iter().any(|base| { + server_version == *base + || server_version + .strip_prefix(base) + .is_some_and(|rest| rest.starts_with("-nightly.")) + }) } async fn fetch_shell( @@ -728,9 +736,13 @@ mod tests { #[test] fn pins_the_supported_t3_contract_version() { assert!(contract_is_supported("0.0.28")); - assert!(!contract_is_supported("0.0.28-nightly.1")); + assert!(contract_is_supported("0.0.28-nightly.1")); + assert!(contract_is_supported("0.0.29")); + assert!(contract_is_supported("0.0.29-nightly.20260720.859")); assert!(!contract_is_supported("0.0.27")); - assert!(!contract_is_supported("0.0.29")); + assert!(!contract_is_supported("0.0.30")); + assert!(!contract_is_supported("0.0.290")); + assert!(!contract_is_supported("0.0.29-beta.1")); assert_eq!(PINNED_CONTRACT_COMMIT.len(), 40); }