Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 7 additions & 5 deletions adapters/t3code/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,17 @@ 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
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.
24 changes: 18 additions & 6 deletions crates/microbridged/src/t3code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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],
),
);
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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);
}

Expand Down
Loading