fix(runtime): isolate agent state by project (#101)

This commit is contained in:
2026-07-25 22:14:02 +02:00
parent 6a87c4635f
commit 6e98fd89f7
52 changed files with 1894 additions and 805 deletions

View File

@ -1415,9 +1415,7 @@ mod mcp_tests {
#[test]
fn opencode_provider_config_rejects_empty_fields() {
let secret_ref = crate::ports::SecretRef::new("secret-1");
assert!(
OpenCodeProviderConfig::new("", "claude-sonnet-5", secret_ref.clone()).is_err()
);
assert!(OpenCodeProviderConfig::new("", "claude-sonnet-5", secret_ref.clone()).is_err());
assert!(OpenCodeProviderConfig::new("anthropic", "", secret_ref).is_err());
}
@ -1448,7 +1446,12 @@ mod mcp_tests {
#[test]
fn profile_with_opencode_provider_round_trips_camelcase() {
let provider = OpenCodeProviderConfig::new("anthropic", "claude-sonnet-5", crate::ports::SecretRef::new("secret-anthropic")).unwrap();
let provider = OpenCodeProviderConfig::new(
"anthropic",
"claude-sonnet-5",
crate::ports::SecretRef::new("secret-anthropic"),
)
.unwrap();
let profile = profile_without_mcp()
.with_structured_adapter(StructuredAdapter::OpenCode)
.with_opencode_provider(provider.clone());
@ -1469,7 +1472,12 @@ mod mcp_tests {
None,
)
.unwrap();
let cloud = OpenCodeProviderConfig::new("anthropic", "claude-sonnet-5", crate::ports::SecretRef::new("secret-cloud")).unwrap();
let cloud = OpenCodeProviderConfig::new(
"anthropic",
"claude-sonnet-5",
crate::ports::SecretRef::new("secret-cloud"),
)
.unwrap();
let only_local = profile_without_mcp()
.with_structured_adapter(StructuredAdapter::OpenCode)
@ -1504,7 +1512,12 @@ mod mcp_tests {
None,
)
.unwrap();
let cloud = OpenCodeProviderConfig::new("anthropic", "claude-sonnet-5", crate::ports::SecretRef::new("secret-cloud")).unwrap();
let cloud = OpenCodeProviderConfig::new(
"anthropic",
"claude-sonnet-5",
crate::ports::SecretRef::new("secret-cloud"),
)
.unwrap();
// Setting the cloud provider clears a previously-set local one.
let cloud_wins = profile_without_mcp()
@ -1513,7 +1526,10 @@ mod mcp_tests {
.with_opencode_provider(cloud.clone());
assert!(cloud_wins.opencode_backend_is_consistent());
assert!(cloud_wins.opencode.is_none(), "stale local backend dropped");
assert_eq!(cloud_wins.opencode_provider.as_ref().unwrap().provider_id, "anthropic");
assert_eq!(
cloud_wins.opencode_provider.as_ref().unwrap().provider_id,
"anthropic"
);
// Setting the local provider clears a previously-set cloud one.
let local_wins = profile_without_mcp()
@ -1521,13 +1537,21 @@ mod mcp_tests {
.with_opencode_provider(cloud)
.with_opencode(local);
assert!(local_wins.opencode_backend_is_consistent());
assert!(local_wins.opencode_provider.is_none(), "stale cloud backend dropped");
assert!(
local_wins.opencode_provider.is_none(),
"stale cloud backend dropped"
);
assert!(local_wins.opencode.is_some());
}
#[test]
fn opencode_provider_config_serialises_no_local_model_server_id_leak() {
let config = OpenCodeProviderConfig::new("openrouter", "some-model", crate::ports::SecretRef::new("secret-openrouter")).unwrap();
let config = OpenCodeProviderConfig::new(
"openrouter",
"some-model",
crate::ports::SecretRef::new("secret-openrouter"),
)
.unwrap();
let json = serde_json::to_string(&config).expect("serialise");
assert!(!json.contains("localModelServerId"));
assert!(!json.contains("baseURL"));