diff --git a/crates/openshell-cli/src/run.rs b/crates/openshell-cli/src/run.rs index ba31f35d87..fdb112c399 100644 --- a/crates/openshell-cli/src/run.rs +++ b/crates/openshell-cli/src/run.rs @@ -723,10 +723,17 @@ pub async fn sandbox_create( Err(status) => return Err(miette::miette!(status.to_string())), }; let response = response.into_inner(); + let application_service_urls = response.application_service_urls; let service_urls = response .service_urls .into_iter() - .map(|(service, url)| (service, service_url_for_gateway(&url, &effective_server))) + .map(|(service, url)| { + let url = application_service_urls + .get(&service) + .cloned() + .unwrap_or_else(|| service_url_for_gateway(&url, &effective_server)); + (service, url) + }) .collect::>(); let sandbox = response .sandbox @@ -1115,10 +1122,7 @@ pub async fn sandbox_create( "\u{2713}".green().bold(), ); if let Some(url) = service_urls.get("").filter(|url| !url.is_empty()) { - eprintln!( - " Access at: {}", - service_url_for_gateway(url, &effective_server) - ); + eprintln!(" Access at: {url}"); } } @@ -4361,7 +4365,7 @@ pub async fn service_expose( ); } if !response.url.is_empty() { - let url = service_url_for_gateway(&response.url, server); + let url = preferred_service_url(&response, server); println!(" URL: {}", url.cyan()); } Ok(()) @@ -4574,7 +4578,7 @@ fn print_service_endpoint_table( let url = if response.url.is_empty() { String::new() } else { - service_url_for_gateway(&response.url, gateway_endpoint) + preferred_service_url(response, gateway_endpoint) }; Some(( workspace.to_string(), @@ -4665,7 +4669,7 @@ fn service_endpoint_to_json( let url = if response.url.is_empty() { String::new() } else { - service_url_for_gateway(&response.url, gateway_endpoint) + preferred_service_url(response, gateway_endpoint) }; Some(serde_json::json!({ @@ -4675,6 +4679,8 @@ fn service_endpoint_to_json( "target_port": endpoint.target_port, "authorization_mode": service_authorization_mode_name(endpoint.authorization_mode), "url": url, + "application_url": response.application_url, + "gateway_url": service_url_for_gateway(&response.gateway_url, gateway_endpoint), })) } @@ -4689,13 +4695,16 @@ fn service_authorization_mode_name(mode: i32) -> &'static str { } } -/// Read gcloud Application Default Credentials from disk. -/// -/// Returns `(client_id, client_secret, refresh_token)`. -/// -/// Checks `GOOGLE_APPLICATION_CREDENTIALS` first; falls back to -/// `$CLOUDSDK_CONFIG/application_default_credentials.json` when set, then to -/// `~/.config/gcloud/application_default_credentials.json`. +/// Application origins are independent of the gateway transport. Only legacy +/// gateway URLs inherit a caller's external gateway port. +fn preferred_service_url(response: &ServiceEndpointResponse, gateway: &str) -> String { + if response.application_url.is_empty() { + service_url_for_gateway(&response.url, gateway) + } else { + response.application_url.clone() + } +} + fn service_url_for_gateway(service_url: &str, gateway_endpoint: &str) -> String { let (Ok(mut service_url), Ok(gateway_endpoint)) = ( url::Url::parse(service_url), @@ -7324,6 +7333,8 @@ mod tests { #[test] fn service_endpoint_json_has_raw_fields_and_normalized_url() { let response = ServiceEndpointResponse { + application_url: String::new(), + gateway_url: String::new(), endpoint: Some(ServiceEndpoint { metadata: Some(ObjectMeta { workspace: "team-a".to_string(), @@ -7349,6 +7360,8 @@ mod tests { "target_port": 8080, "authorization_mode": "bearer_passthrough", "url": "https://api.openshell.localhost:17670/", + "application_url": "", + "gateway_url": "", }) ); assert!(service_endpoint_to_json(&ServiceEndpointResponse::default(), "unused").is_none()); @@ -8108,6 +8121,20 @@ mod tests { assert!(rootfs_tar_sources_supported_for_gateway(None)); } + #[test] + fn application_origin_is_preserved_when_gateway_uses_a_port_forward() { + let response = ServiceEndpointResponse { + application_url: "https://default--demo--web.services.example.com:10443/".into(), + gateway_url: "https://default--demo--web.api.example.com:8080/".into(), + url: "https://default--demo--web.services.example.com:10443/".into(), + ..Default::default() + }; + assert_eq!( + super::preferred_service_url(&response, "https://localhost:29092"), + response.application_url + ); + } + #[test] fn service_url_for_gateway_uses_external_gateway_port() { assert_eq!( diff --git a/crates/openshell-cli/tests/provider_commands_integration.rs b/crates/openshell-cli/tests/provider_commands_integration.rs index f14805f17d..35e86d3124 100644 --- a/crates/openshell-cli/tests/provider_commands_integration.rs +++ b/crates/openshell-cli/tests/provider_commands_integration.rs @@ -378,6 +378,8 @@ impl OpenShell for TestOpenShell { let name = request.name; // Return a minimal sandbox with metadata for CAS operations Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(Sandbox { metadata: Some(openshell_core::proto::datamodel::v1::ObjectMeta { id: format!("sb-{name}"), diff --git a/crates/openshell-cli/tests/sandbox_create_lifecycle_integration.rs b/crates/openshell-cli/tests/sandbox_create_lifecycle_integration.rs index 762ec13561..3cd1e99d6b 100644 --- a/crates/openshell-cli/tests/sandbox_create_lifecycle_integration.rs +++ b/crates/openshell-cli/tests/sandbox_create_lifecycle_integration.rs @@ -237,6 +237,8 @@ impl OpenShell for TestOpenShell { }, ); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls, })) @@ -291,6 +293,8 @@ impl OpenShell for TestOpenShell { }; sandbox.set_phase(SandboxPhase::Ready as i32); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -527,6 +531,8 @@ impl OpenShell for TestOpenShell { .push(request.into_inner()); Ok(Response::new( openshell_core::proto::ServiceEndpointResponse { + application_url: String::new(), + gateway_url: String::new(), url: "https://default--sandbox.openshell.localhost:17670/".to_string(), ..Default::default() }, @@ -539,6 +545,8 @@ impl OpenShell for TestOpenShell { ) -> Result, Status> { Ok(Response::new( openshell_core::proto::ServiceEndpointResponse { + application_url: String::new(), + gateway_url: String::new(), url: "https://default--sandbox.openshell.localhost:17670/".to_string(), ..Default::default() }, diff --git a/crates/openshell-cli/tests/sandbox_exec_streaming_integration.rs b/crates/openshell-cli/tests/sandbox_exec_streaming_integration.rs index 4238254ed4..6c27aa325d 100644 --- a/crates/openshell-cli/tests/sandbox_exec_streaming_integration.rs +++ b/crates/openshell-cli/tests/sandbox_exec_streaming_integration.rs @@ -188,6 +188,8 @@ macro_rules! mock_gateway { async fn get_sandbox(&self, _: Request) -> Result, Status> { self.calls.lock().unwrap().lookups += 1; Ok(Response::new(proto::SandboxResponse { +application_service_urls: std::collections::HashMap::new(), +gateway_service_urls: std::collections::HashMap::new(), sandbox: Some(proto::Sandbox { metadata: Some(proto::datamodel::v1::ObjectMeta { id: "test-id".to_string(), diff --git a/crates/openshell-cli/tests/sandbox_name_fallback_integration.rs b/crates/openshell-cli/tests/sandbox_name_fallback_integration.rs index c218a7fcb7..238750d04f 100644 --- a/crates/openshell-cli/tests/sandbox_name_fallback_integration.rs +++ b/crates/openshell-cli/tests/sandbox_name_fallback_integration.rs @@ -187,6 +187,8 @@ impl OpenShell for TestOpenShell { let name = request.name.clone(); *self.state.last_get_name.lock().await = Some(name.clone()); Ok(Response::new(SandboxResponse { + application_service_urls: std::collections::HashMap::new(), + gateway_service_urls: std::collections::HashMap::new(), sandbox: Some(Sandbox { metadata: Some(openshell_core::proto::datamodel::v1::ObjectMeta { id: "test-id".to_string(), diff --git a/crates/openshell-core/src/app_listener.rs b/crates/openshell-core/src/app_listener.rs index bece387213..f71fc7bde6 100644 --- a/crates/openshell-core/src/app_listener.rs +++ b/crates/openshell-core/src/app_listener.rs @@ -13,6 +13,8 @@ pub struct AppListenerConfig { pub enabled: bool, pub port: u16, pub domain: String, + /// Public HTTPS origin, independently of the supervisor's listener port. + pub public_url: Option, } impl Default for AppListenerConfig { @@ -21,6 +23,7 @@ impl Default for AppListenerConfig { enabled: false, port: 8443, domain: String::new(), + public_url: None, } } } @@ -28,6 +31,9 @@ impl Default for AppListenerConfig { impl AppListenerConfig { pub fn validate(&self) -> Result<(), String> { if !self.enabled { + if self.public_url.is_some() { + return Err("supervisor.app_listener.public_url requires enabled = true".into()); + } return Ok(()); } if self.port < 1024 { @@ -46,8 +52,40 @@ impl AppListenerConfig { { return Err("supervisor.app_listener.domain must be a lowercase DNS name".into()); } + if let Some(origin) = &self.public_url { + let parsed = url::Url::parse(origin) + .map_err(|_| "supervisor.app_listener.public_url must be an HTTPS origin")?; + if parsed.scheme() != "https" + || parsed.host_str() != Some(self.domain.as_str()) + || !parsed.username().is_empty() + || parsed.password().is_some() + || parsed.path() != "/" + || parsed.query().is_some() + || parsed.fragment().is_some() + || parsed.port() == Some(0) + { + return Err("supervisor.app_listener.public_url must be an HTTPS origin matching domain, without credentials, path, query, or fragment".into()); + } + } Ok(()) } + + /// Configured address only; this does not imply installation or readiness. + pub fn service_url(&self, workspace: &str, sandbox: &str, service: &str) -> Option { + if !self.enabled { + return None; + } + let mut origin = url::Url::parse(self.public_url.as_deref()?).ok()?; + let label = if service.is_empty() { + format!("{workspace}--{sandbox}") + } else { + format!("{workspace}--{sandbox}--{service}") + }; + origin + .set_host(Some(&format!("{label}.{}", self.domain))) + .ok()?; + Some(origin.into()) + } } /// A synchronous view of installed ingress, evaluated on the sandbox instance @@ -60,6 +98,43 @@ pub type InstallationSource = std::sync::Arc< mod tests { use super::*; + #[test] + fn public_origin_is_explicit_https_and_matches_listener_domain() { + let mut config = AppListenerConfig { + enabled: true, + domain: "services.example.com".into(), + public_url: Some("https://services.example.com:10443".into()), + ..Default::default() + }; + config.validate().unwrap(); + assert_eq!( + config.service_url("default", "demo", "web").as_deref(), + Some("https://default--demo--web.services.example.com:10443/") + ); + config.public_url = Some("https://services.example.com:443/".into()); + assert_eq!( + config.service_url("default", "demo", "").as_deref(), + Some("https://default--demo.services.example.com/") + ); + for bad in [ + "http://services.example.com", + "https://other.example.com", + "https://user:password@services.example.com", + "https://services.example.com/path", + "https://services.example.com/?query", + "https://services.example.com/#fragment", + "https://services.example.com:0", + "not-a-url", + ] { + config.public_url = Some(bad.into()); + assert!(config.validate().is_err(), "{bad}"); + } + config.public_url = Some("https://services.example.com".into()); + config.enabled = false; + assert!(config.validate().is_err()); + assert!(config.service_url("default", "demo", "web").is_none()); + } + #[test] fn only_explicit_enablement_requires_a_valid_endpoint() { assert!(!AppListenerConfig::default().enabled); diff --git a/crates/openshell-driver-kubernetes/src/app_listener.rs b/crates/openshell-driver-kubernetes/src/app_listener.rs index 738296f9a7..a01ba6f3d5 100644 --- a/crates/openshell-driver-kubernetes/src/app_listener.rs +++ b/crates/openshell-driver-kubernetes/src/app_listener.rs @@ -255,6 +255,7 @@ mod tests { let config = KubernetesAppListenerConfig { create_service: true, common: openshell_core::app_listener::AppListenerConfig { + public_url: None, enabled, port: 9443, domain: "services.example.com".into(), diff --git a/crates/openshell-driver-kubernetes/src/config.rs b/crates/openshell-driver-kubernetes/src/config.rs index 207fcfd92b..af2bfbad63 100644 --- a/crates/openshell-driver-kubernetes/src/config.rs +++ b/crates/openshell-driver-kubernetes/src/config.rs @@ -1148,6 +1148,7 @@ mod tests { assert!(!config.app_listener.common.enabled); assert!(config.validate().is_ok()); config.app_listener.common = openshell_core::app_listener::AppListenerConfig { + public_url: None, enabled: true, port: 9443, domain: "services.example.com".into(), diff --git a/crates/openshell-sdk/src/client.rs b/crates/openshell-sdk/src/client.rs index d0904245bc..ccbdcf4276 100644 --- a/crates/openshell-sdk/src/client.rs +++ b/crates/openshell-sdk/src/client.rs @@ -1492,6 +1492,8 @@ fn sandbox_from_response(sandbox: Option) -> Result fn sandbox_from_create_response(response: proto::SandboxResponse) -> Result { let mut sandbox = sandbox_from_response(response.sandbox)?; sandbox.service_urls = response.service_urls; + sandbox.application_service_urls = response.application_service_urls; + sandbox.gateway_service_urls = response.gateway_service_urls; Ok(sandbox) } diff --git a/crates/openshell-sdk/src/types.rs b/crates/openshell-sdk/src/types.rs index 571ee42b68..97c1fc7574 100644 --- a/crates/openshell-sdk/src/types.rs +++ b/crates/openshell-sdk/src/types.rs @@ -402,6 +402,10 @@ pub struct SandboxRef { /// Service URLs returned by sandbox creation, keyed by service name. The /// empty key identifies the unnamed service. Non-create reads leave this empty. pub service_urls: HashMap, + /// Configured application origins; these do not establish installation readiness. + pub application_service_urls: HashMap, + /// Gateway-routed alternatives. + pub gateway_service_urls: HashMap, pub restart_count: u32, pub next_restart_at_ms: Option, pub main_process_started_at_ms: Option, @@ -455,6 +459,8 @@ impl SandboxRef { .then_some(sandbox.host_key_fingerprint), created_from_workload_template, service_urls: HashMap::new(), + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), restart_count, next_restart_at_ms, main_process_started_at_ms, diff --git a/crates/openshell-sdk/tests/client_mock.rs b/crates/openshell-sdk/tests/client_mock.rs index 849ac497b1..26d820377b 100644 --- a/crates/openshell-sdk/tests/client_mock.rs +++ b/crates/openshell-sdk/tests/client_mock.rs @@ -364,7 +364,7 @@ impl OpenShell for TestOpenShell { } else { req.name.clone() }; - let service_urls = req + let service_urls: HashMap = req .service_exposures .iter() .map(|exposure| { @@ -376,6 +376,11 @@ impl OpenShell for TestOpenShell { .collect(); *self.state.last_create.lock().await = Some(req); Ok(Response::new(proto::SandboxResponse { + application_service_urls: service_urls.clone(), + gateway_service_urls: HashMap::from([( + "web".into(), + "https://web.gateway.test:8080/".into(), + )]), sandbox: Some(sandbox_with_phase(&name, proto::SandboxPhase::Provisioning)), service_urls, })) @@ -446,6 +451,8 @@ impl OpenShell for TestOpenShell { ); *self.state.last_stop.lock().await = Some(request); Ok(Response::new(proto::SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -463,6 +470,8 @@ impl OpenShell for TestOpenShell { ); *self.state.last_start.lock().await = Some(request); Ok(Response::new(proto::SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -480,6 +489,8 @@ impl OpenShell for TestOpenShell { ); *self.state.last_suspend.lock().await = Some(request); Ok(Response::new(proto::SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -497,6 +508,8 @@ impl OpenShell for TestOpenShell { ); *self.state.last_resume.lock().await = Some(request); Ok(Response::new(proto::SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -538,6 +551,8 @@ impl OpenShell for TestOpenShell { sandbox.metadata.as_mut().unwrap().id.clone_from(id); } Ok(Response::new(proto::SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -1220,6 +1235,11 @@ async fn create_sandbox_passes_spec_through() { result.service_urls.get("web").map(String::as_str), Some("https://web.example.test/") ); + assert_eq!(result.application_service_urls, result.service_urls); + assert_eq!( + result.gateway_service_urls["web"], + "https://web.gateway.test:8080/" + ); let observed = state.last_create.lock().await.clone().unwrap(); assert_eq!(observed.name, "my-box"); diff --git a/crates/openshell-server/README.md b/crates/openshell-server/README.md index 195b576190..062c07dd9d 100644 --- a/crates/openshell-server/README.md +++ b/crates/openshell-server/README.md @@ -230,3 +230,13 @@ Watches refresh and reauthorize each second, use a one-message buffer, and end after one minute or a five-second blocked send. Each gateway process accepts at most 32 watches. Reconnect and relist on stream termination; revisions are opaque equality tokens, not resumable cursors or an ordering across gateway replicas. + +## Application URL publication + +`supervisor.app_listener.public_url` is an optional HTTPS origin matching the +listener domain. It requires explicit listener enablement. Service responses +return preferred `url`, configured `application_url`, and a gateway alternative +`gateway_url`. Sandbox creation supplies equivalent service-name maps. Current +deployment origins are recomputed for durable replay without repeating the +mutation or changing resource identities. These are configured addresses, not +installation, ingress acceptance, or application health signals. diff --git a/crates/openshell-server/src/grpc/mutation_replay.rs b/crates/openshell-server/src/grpc/mutation_replay.rs index 1a39b3dea0..075500fb0c 100644 --- a/crates/openshell-server/src/grpc/mutation_replay.rs +++ b/crates/openshell-server/src/grpc/mutation_replay.rs @@ -124,6 +124,7 @@ pub(super) trait Mutation: Message + Default + Send + Sync + 'static { request: Request, ) -> impl Future, Status>> + Send; fn capture(response: &Response) -> Result; + fn refresh_replay(_state: &ServerState, _response: &mut Self::Output) {} fn restore( store: &Store, success: Success, @@ -311,7 +312,9 @@ async fn execute_owned( return Err(replay_unavailable()); } let success = previous.success.ok_or_else(uncertain)?; - let mut response = Response::new(M::restore(&state.store, success).await?); + let mut output = M::restore(&state.store, success).await?; + M::refresh_replay(state, &mut output); + let mut response = Response::new(output); response.metadata_mut().insert( "openshell-replayed", "true".parse().expect("static metadata"), diff --git a/crates/openshell-server/src/grpc/mutation_replay/ordinary.rs b/crates/openshell-server/src/grpc/mutation_replay/ordinary.rs index 25410043f6..7c3f4c03f6 100644 --- a/crates/openshell-server/src/grpc/mutation_replay/ordinary.rs +++ b/crates/openshell-server/src/grpc/mutation_replay/ordinary.rs @@ -335,7 +335,7 @@ async fn profile_scope( } macro_rules! mutation { - ($req:ty, $resp:ty, $method:literal, $handler:path, $auth:expr, $capture:expr, $restore:expr) => { + ($req:ty, $resp:ty, $method:literal, $handler:path, $auth:expr, $capture:expr, $restore:expr $(, $refresh:expr)?) => { impl Mutation for $req { type Output = $resp; const METHOD: &'static str = $method; @@ -362,12 +362,15 @@ macro_rules! mutation { async fn restore(store: &Store, success: Success) -> Result { ($restore)(store, outcome(success)?).await } + fn refresh_replay(_state: &ServerState, _response: &mut Self::Output) { + $(($refresh)(_state, _response);)? + } } }; } macro_rules! scoped_mutation { - ($req:ty, $resp:ty, $method:literal, $handler:path, $role:ident, $capture:expr, $restore:expr) => { + ($req:ty, $resp:ty, $method:literal, $handler:path, $role:ident, $capture:expr, $restore:expr $(, $refresh:expr)?) => { mutation!( $req, $resp, @@ -383,13 +386,13 @@ macro_rules! scoped_mutation { .await }, $capture, - $restore + $restore $(, $refresh)? ); }; } macro_rules! sandbox_scoped_mutation { - ($req:ty, $resp:ty, $method:literal, $handler:path, $role:ident, $capture:expr, $restore:expr) => { + ($req:ty, $resp:ty, $method:literal, $handler:path, $role:ident, $capture:expr, $restore:expr $(, $refresh:expr)?) => { mutation!( $req, $resp, @@ -405,7 +408,7 @@ macro_rules! sandbox_scoped_mutation { .await }, $capture, - $restore + $restore $(, $refresh)? ); }; } @@ -440,6 +443,8 @@ macro_rules! sandbox_mutation { return Err(replay_unavailable()); }; Ok(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(live(store, &id).await?), service_urls: HashMap::new(), }) @@ -466,10 +471,13 @@ scoped_mutation!( return Err(replay_unavailable()); }; Ok(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(live(store, &id).await?), service_urls, }) - } + }, + sandbox::refresh_response_urls ); sandbox_mutation!( StartSandboxRequest, @@ -585,10 +593,13 @@ sandbox_scoped_mutation!( }; let _: Sandbox = live(store, &sandbox_id).await?; Ok(ServiceEndpointResponse { + application_url: String::new(), + gateway_url: String::new(), endpoint: Some(reference.restore(store).await?), url, }) - } + }, + service::refresh_response_urls ); macro_rules! provider_mutation { diff --git a/crates/openshell-server/src/grpc/mutation_replay/tests.rs b/crates/openshell-server/src/grpc/mutation_replay/tests.rs index fe9e2c20d0..39f9f398a2 100644 --- a/crates/openshell-server/src/grpc/mutation_replay/tests.rs +++ b/crates/openshell-server/src/grpc/mutation_replay/tests.rs @@ -93,6 +93,65 @@ fn canonical_payload_ignores_map_order_and_id_but_preserves_presence() { assert_ne!(absent, fingerprint(&template).unwrap()); } +#[tokio::test] +async fn service_url_replay_uses_current_origin_without_repeating_mutation() { + let directory = tempfile::tempdir().unwrap(); + let key = directory.path().join("private-key"); + std::fs::write(&key, b"test-only stable private fingerprint material").unwrap(); + let mut state = test_server_state().await; + let config = &mut Arc::get_mut(&mut state).unwrap().config; + config.gateway_jwt = Some(openshell_core::config::GatewayJwtConfig { + signing_key_path: key, + public_key_path: directory.path().join("public"), + kid_path: directory.path().join("kid"), + gateway_id: "test".into(), + ttl_secs: None, + }); + let request = CreateSandboxRequest { + name: "origin-replay".into(), + spec: Some(SandboxSpec::default()), + workspace_scope: Some(openshell_core::proto::workspace_selector("default")), + service_exposures: vec![SandboxServiceExposure { + service: "web".into(), + target_port: 8080, + ..Default::default() + }], + request_id: uuid::Uuid::new_v4().to_string(), + ..Default::default() + }; + let original = run(&state, authed_request(request.clone())) + .await + .unwrap() + .into_inner(); + Arc::get_mut(&mut state) + .unwrap() + .config + .supervisor_app_listener = openshell_core::app_listener::AppListenerConfig { + enabled: true, + port: 9443, + domain: "services.example.com".into(), + public_url: Some("https://services.example.com:10443".into()), + }; + let replay = run(&state, authed_request(request)).await.unwrap(); + assert_eq!(replay.metadata().get("openshell-replayed").unwrap(), "true"); + assert_eq!( + original.sandbox.as_ref().unwrap().metadata, + replay.get_ref().sandbox.as_ref().unwrap().metadata + ); + assert_eq!( + replay.get_ref().service_urls["web"], + "https://default--origin-replay--web.services.example.com:10443/" + ); + assert_eq!( + replay.get_ref().application_service_urls, + replay.get_ref().service_urls + ); + assert_eq!( + replay.get_ref().gateway_service_urls, + original.gateway_service_urls + ); +} + #[tokio::test] async fn create_sandbox_replay_preserves_service_urls() { let directory = tempfile::tempdir().unwrap(); diff --git a/crates/openshell-server/src/grpc/sandbox.rs b/crates/openshell-server/src/grpc/sandbox.rs index 77a54a2bc8..e57df20385 100644 --- a/crates/openshell-server/src/grpc/sandbox.rs +++ b/crates/openshell-server/src/grpc/sandbox.rs @@ -726,6 +726,8 @@ async fn handle_create_sandbox_inner( .await?; let mut service_urls = HashMap::with_capacity(request.service_exposures.len()); + let mut application_service_urls = HashMap::new(); + let mut gateway_service_urls = HashMap::new(); for exposure in &request.service_exposures { let endpoint = match super::service::expose_service_endpoint( state, @@ -767,7 +769,12 @@ async fn handle_create_sandbox_inner( return Err(exposure_error); } }; - service_urls.insert(exposure.service.clone(), endpoint.into_inner().url); + let endpoint = endpoint.into_inner(); + if !endpoint.application_url.is_empty() { + application_service_urls.insert(exposure.service.clone(), endpoint.application_url); + } + gateway_service_urls.insert(exposure.service.clone(), endpoint.gateway_url); + service_urls.insert(exposure.service.clone(), endpoint.url); } info!( @@ -776,6 +783,8 @@ async fn handle_create_sandbox_inner( "CreateSandbox request completed successfully" ); Ok(Response::new(SandboxResponse { + application_service_urls, + gateway_service_urls, sandbox: Some(sandbox), service_urls, })) @@ -957,6 +966,8 @@ pub(super) async fn handle_get_sandbox( None }; let mut response = Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), }); @@ -1780,6 +1791,8 @@ async fn handle_stop_sandbox_inner( let sandbox = state.compute.stop_sandbox(workspace, name).await?; info!(sandbox_name = %name, "StopSandbox request completed successfully"); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -1835,6 +1848,8 @@ async fn handle_start_sandbox_inner( .project_endpoint_status(&mut sandbox, remote_authority); info!(sandbox_name = %name, "StartSandbox request completed successfully"); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -1876,6 +1891,8 @@ async fn handle_suspend_sandbox_inner( let sandbox = state.compute.suspend_sandbox(workspace, name).await?; info!(sandbox_name = %name, "SuspendSandbox request completed successfully"); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -1932,6 +1949,8 @@ async fn handle_resume_sandbox_inner( .project_endpoint_status(&mut sandbox, remote_authority); info!(sandbox_name = %name, "ResumeSandbox request completed successfully"); Ok(Response::new(SandboxResponse { + application_service_urls: HashMap::new(), + gateway_service_urls: HashMap::new(), sandbox: Some(sandbox), service_urls: HashMap::new(), })) @@ -4185,6 +4204,39 @@ async fn run_exec_with_russh( // Tests // --------------------------------------------------------------------------- +/// Replays preserve original service names and sandbox identity while using +/// current deployment origins. No service mutation is performed here. +pub(super) fn refresh_response_urls(state: &ServerState, response: &mut SandboxResponse) { + let Some(sandbox) = response.sandbox.as_ref() else { + return; + }; + response.application_service_urls.clear(); + response.gateway_service_urls.clear(); + for (service, url) in &mut response.service_urls { + let gateway = crate::service_routing::endpoint_url( + &state.config, + sandbox.object_workspace(), + sandbox.object_name(), + service, + ) + .unwrap_or_default(); + let application = state.config.supervisor_app_listener.service_url( + sandbox.object_workspace(), + sandbox.object_name(), + service, + ); + response + .gateway_service_urls + .insert(service.clone(), gateway.clone()); + *url = application.clone().unwrap_or(gateway); + if let Some(application) = application { + response + .application_service_urls + .insert(service.clone(), application); + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/openshell-server/src/grpc/service.rs b/crates/openshell-server/src/grpc/service.rs index e3a1728bf4..212902d7bf 100644 --- a/crates/openshell-server/src/grpc/service.rs +++ b/crates/openshell-server/src/grpc/service.rs @@ -214,14 +214,13 @@ pub(super) async fn expose_service_endpoint( meta.resource_version = result.resource_version; } - let url = service_routing::endpoint_url(&state.config, workspace, sandbox_name, service) - .unwrap_or_default(); - service_routing::emit_service_endpoint_config_event(&endpoint, &url, created); - - Ok(Response::new(ServiceEndpointResponse { - endpoint: Some(endpoint), - url, - })) + let response = service_endpoint_response(state, endpoint); + service_routing::emit_service_endpoint_config_event( + response.endpoint.as_ref().expect("endpoint populated"), + &response.url, + created, + ); + Ok(Response::new(response)) } pub(super) async fn handle_get_service( @@ -478,14 +477,40 @@ fn service_endpoint_response( Ok(ServiceAuthorizationMode::Unspecified | ServiceAuthorizationMode::Strip) | Err(_) => ServiceAuthorizationMode::Strip as i32, }; - let workspace = endpoint.object_workspace(); - let url = - service_routing::endpoint_url(&state.config, workspace, &endpoint.sandbox, &endpoint.name) - .unwrap_or_default(); - ServiceEndpointResponse { + let mut response = ServiceEndpointResponse { endpoint: Some(endpoint), - url, - } + ..Default::default() + }; + refresh_response_urls(state, &mut response); + response +} + +/// Recompute presentation from current configuration, including durable replays. +pub(super) fn refresh_response_urls(state: &ServerState, response: &mut ServiceEndpointResponse) { + let Some(endpoint) = response.endpoint.as_ref() else { + return; + }; + response.gateway_url = service_routing::endpoint_url( + &state.config, + endpoint.object_workspace(), + &endpoint.sandbox, + &endpoint.name, + ) + .unwrap_or_default(); + response.application_url = state + .config + .supervisor_app_listener + .service_url( + endpoint.object_workspace(), + &endpoint.sandbox, + &endpoint.name, + ) + .unwrap_or_default(); + response.url = if response.application_url.is_empty() { + response.gateway_url.clone() + } else { + response.application_url.clone() + }; } #[allow(clippy::result_large_err)] @@ -564,6 +589,99 @@ mod tests { state.store.put_message(&sandbox).await.unwrap(); } + #[tokio::test] + async fn configured_application_origin_is_published_before_installation() { + let mut state = test_server_state().await; + Arc::get_mut(&mut state) + .unwrap() + .config + .supervisor_app_listener = openshell_core::app_listener::AppListenerConfig { + enabled: true, + port: 9443, + domain: "services.example.com".into(), + public_url: Some("https://services.example.com:10443".into()), + }; + seed_sandbox(&state, "demo").await; + for name in ["", "web"] { + let created = handle_expose_service( + &state, + authed_request(ExposeServiceRequest { + workspace_scope: Some(openshell_core::proto::workspace_selector("default")), + sandbox: "demo".into(), + name: name.into(), + target_port: 8080, + ..Default::default() + }), + ) + .await + .unwrap() + .into_inner(); + let label = if name.is_empty() { + "default--demo" + } else { + "default--demo--web" + }; + assert_eq!( + created.url, + format!("https://{label}.services.example.com:10443/") + ); + assert_eq!(created.application_url, created.url); + assert!(created.gateway_url.contains("openshell.localhost")); + let fetched = handle_get_service( + &state, + authed_request(GetServiceRequest { + workspace_scope: Some(openshell_core::proto::workspace_selector("default")), + sandbox: "demo".into(), + name: name.into(), + }), + ) + .await + .unwrap() + .into_inner(); + assert_eq!(created, fetched); + } + } + + #[tokio::test] + async fn hashed_gateway_url_keeps_the_independent_application_origin() { + let mut state = test_server_state().await; + let config = &mut Arc::get_mut(&mut state).unwrap().config; + config.name = "gateway-a".into(); + config.service_routing.service_hostname_format = ServiceHostnameFormat::Hashed; + config.service_routing.base_domains = vec!["gateway.example.com".into()]; + config.supervisor_app_listener = openshell_core::app_listener::AppListenerConfig { + enabled: true, + port: 9443, + domain: "services.example.com".into(), + public_url: Some("https://services.example.com:10443".into()), + }; + let mut response = ServiceEndpointResponse { + endpoint: Some(ServiceEndpoint { + metadata: Some(ObjectMeta { + workspace: "default".into(), + ..Default::default() + }), + sandbox: "demo".into(), + name: "web".into(), + ..Default::default() + }), + ..Default::default() + }; + refresh_response_urls(&state, &mut response); + let gateway = url::Url::parse(&response.gateway_url).unwrap(); + let label = + service_routing::service_route_hash_label("gateway-a", "default", "demo", Some("web")); + assert_eq!( + gateway.host_str(), + Some(format!("{label}.gateway.example.com").as_str()) + ); + assert_eq!( + response.application_url, + "https://default--demo--web.services.example.com:10443/" + ); + assert_eq!(response.url, response.application_url); + } + #[test] fn validates_good_endpoint_name() { validate_endpoint_name("service", "web-api", 28).unwrap(); @@ -576,6 +694,7 @@ mod tests { .expect("unshared test state") .config .supervisor_app_listener = openshell_core::app_listener::AppListenerConfig { + public_url: None, enabled: true, port: 9443, domain: "services.example.com".into(), diff --git a/crates/openshell-server/src/grpc/service_advertisement.rs b/crates/openshell-server/src/grpc/service_advertisement.rs index e7238de593..74f7651878 100644 --- a/crates/openshell-server/src/grpc/service_advertisement.rs +++ b/crates/openshell-server/src/grpc/service_advertisement.rs @@ -631,6 +631,7 @@ pub mod tests { .unwrap() .config .supervisor_app_listener = openshell_core::app_listener::AppListenerConfig { + public_url: None, enabled: true, port: 9443, domain: "services.example.com".into(), diff --git a/crates/openshell-server/src/storage_proto.rs b/crates/openshell-server/src/storage_proto.rs index acc16a918b..274799a610 100644 --- a/crates/openshell-server/src/storage_proto.rs +++ b/crates/openshell-server/src/storage_proto.rs @@ -164,7 +164,7 @@ mod tests { // SandboxPhase enum. Stored rows never carried those values, so prior // payloads decode unchanged. const PUBLIC_RPC_SCHEMA_SHA256: &str = - "b289c550eee1fe2fcadd6bb5fc59d6625a940af44eca277fbcd9ee256447f2de"; + "8176663e842c3febc30686fc78341eaeca8249e1161336117abbeeb25e19c331"; const DURABLE_SCHEMA_SHA256: &str = "ffb20595e36032a9476d1c6956e2dcdc814f85286fc4735751e5ec6f499ea9ed"; const PUBLIC_DURABLE_OVERLAP_SHA256: &str = @@ -702,7 +702,7 @@ mod tests { overlap_hash.as_str(), ), ( - (340, 31), + (342, 31), (95, 22), (83, 22), PUBLIC_RPC_SCHEMA_SHA256, diff --git a/crates/openshell-supervisor/src/app_listener.rs b/crates/openshell-supervisor/src/app_listener.rs index df2d3dd3b6..8208d2ba42 100644 --- a/crates/openshell-supervisor/src/app_listener.rs +++ b/crates/openshell-supervisor/src/app_listener.rs @@ -68,6 +68,7 @@ impl Config { }; let address: SocketAddr = address.parse().into_diagnostic()?; openshell_core::app_listener::AppListenerConfig { + public_url: None, enabled: true, port: address.port(), domain: domain.clone(), diff --git a/docs/how-it-works/gateways/configuration.mdx b/docs/how-it-works/gateways/configuration.mdx index cb120472a6..ea2cf456b6 100644 --- a/docs/how-it-works/gateways/configuration.mdx +++ b/docs/how-it-works/gateways/configuration.mdx @@ -1702,6 +1702,7 @@ ingress remains available independently. enabled = true port = 9443 domain = "services.example.com" +public_url = "https://services.example.com" [openshell.drivers.kubernetes.sandbox_runtime.app_listener] tls_secret_name = "openshell-app-tls" @@ -1734,9 +1735,8 @@ Expose services with the existing commands. For direct listener testing, an unnamed service on sandbox `demo` in workspace `default` uses SNI and Host `default--demo.services.example.com`; a service named `web` uses `default--demo--web.services.example.com`. Configure DNS or your ingress to reach -the owning supervisor while preserving that hostname. The discovery API supplies accepted supervisor endpoints. Application URL -publication is separate work; current CLI URLs still identify the existing -gateway path. +the owning supervisor while preserving that hostname. The discovery API supplies accepted supervisor endpoints. Configure `public_url` +to publish the application origin; otherwise CLI URLs retain the gateway path. Enabled supervisors report installed service routes through their authenticated gateway sessions. The gateway accepts only current configuration and ownership, @@ -1766,3 +1766,23 @@ and HTTP authority when routing directly to the endpoint. Remove absent routes and expire cached entries even during discovery errors. An API error does not mean the workspace has no routes. Watches end after one minute; reconnect and relist when they end. Discovery-only machine credentials are separate work. + +Set `public_url` to the external HTTPS origin of your application ingress. Its +hostname must match `domain`; it cannot contain credentials, a path, query, or +fragment. A nondefault public port is supported, for example +`https://services.example.com:10443`. This port is independent of the internal +listener `port` and the gateway API address. Setting `public_url` requires +explicit listener enablement and does not create DNS, certificates, or ingress. + +When configured, service responses return the application address as `url` and +`application_url`, with `gateway_url` available as a separate alternative. +Create-time exposure returns corresponding preferred, application, and gateway +URL maps. CLI and SDK callers preserve the application origin, including its +port, when the gateway is reached through a port-forward. Without `public_url`, +the existing gateway URL behavior remains. Replayed mutations retain their +original resource identities and use the current URL configuration. A configured +URL does not mean that a supervisor installed the route or ingress is ready. + +Upgrade the CLI alongside the gateway when enabling `public_url`. Older CLI +versions can replace the public application port with the gateway connection's +port. diff --git a/proto/openshell.proto b/proto/openshell.proto index 641059c459..3522916f1a 100644 --- a/proto/openshell.proto +++ b/proto/openshell.proto @@ -1556,6 +1556,11 @@ message SandboxResponse { // Service URLs created by CreateSandbox, keyed by service name. The empty // key identifies the unnamed service. Other sandbox RPCs return an empty map. map service_urls = 2; + // Configured application origins for the same services. These are + // authoritative public addresses, not installation or health evidence. + map application_service_urls = 3; + // Gateway-routed alternatives, independent of application ingress. + map gateway_service_urls = 4; } // List sandboxes response. @@ -1938,10 +1943,15 @@ message ServiceEndpoint { ServiceAuthorizationMode authorization_mode = 7; } -// Response containing a service endpoint and, when available, its local URL. +// Service addresses. A configured address does not establish readiness. message ServiceEndpointResponse { ServiceEndpoint endpoint = 1; + // Preferred address: application_url when configured, otherwise gateway_url. string url = 2; + // Authoritative configured public application address. Preserve its port. + string application_url = 3; + // Gateway-routed alternative; existing gateway routing remains available. + string gateway_url = 4; } // Revoke SSH session request. diff --git a/python/openshell/sandbox.py b/python/openshell/sandbox.py index 2eaf6a64fa..d8f98615d6 100644 --- a/python/openshell/sandbox.py +++ b/python/openshell/sandbox.py @@ -535,10 +535,24 @@ class SandboxRef: ) # Stable SSH host identity; absent on older runtimes. host_key_fingerprint: str | None = None + application_service_urls: Mapping[str, str] = field( + default_factory=_ImmutableLabels, compare=False + ) + gateway_service_urls: Mapping[str, str] = field( + default_factory=_ImmutableLabels, compare=False + ) def __post_init__(self) -> None: object.__setattr__(self, "labels", _ImmutableLabels(self.labels)) object.__setattr__(self, "service_urls", _ImmutableLabels(self.service_urls)) + object.__setattr__( + self, + "application_service_urls", + _ImmutableLabels(self.application_service_urls), + ) + object.__setattr__( + self, "gateway_service_urls", _ImmutableLabels(self.gateway_service_urls) + ) @property def phase(self) -> int: @@ -880,7 +894,12 @@ def create( ), timeout=self._timeout, ) - sandbox_ref = _sandbox_ref(response.sandbox, response.service_urls) + sandbox_ref = _sandbox_ref( + response.sandbox, + response.service_urls, + response.application_service_urls, + response.gateway_service_urls, + ) if sandbox_ref.id == "": raise SandboxError("CreateSandbox returned empty sandbox id") return sandbox_ref @@ -909,7 +928,12 @@ def create_from_template( ), timeout=self._timeout, ) - sandbox_ref = _sandbox_ref(response.sandbox, response.service_urls) + sandbox_ref = _sandbox_ref( + response.sandbox, + response.service_urls, + response.application_service_urls, + response.gateway_service_urls, + ) if sandbox_ref.id == "": raise SandboxError("CreateSandbox returned empty sandbox id") return sandbox_ref @@ -1887,6 +1911,8 @@ def _sandbox_conditions( def _sandbox_ref( sandbox: openshell_pb2.Sandbox, service_urls: Mapping[str, str] | None = None, + application_service_urls: Mapping[str, str] | None = None, + gateway_service_urls: Mapping[str, str] | None = None, ) -> SandboxRef: status = sandbox.status if sandbox.HasField("status") else None provenance = ( @@ -1919,6 +1945,8 @@ def _sandbox_ref( labels=sandbox.metadata.labels if sandbox.metadata else {}, created_from_workload_template=provenance, service_urls=service_urls or {}, + application_service_urls=application_service_urls or {}, + gateway_service_urls=gateway_service_urls or {}, host_key_fingerprint=sandbox.host_key_fingerprint or None, ) diff --git a/python/openshell/sandbox_test.py b/python/openshell/sandbox_test.py index 82de216263..b289ba55ff 100644 --- a/python/openshell/sandbox_test.py +++ b/python/openshell/sandbox_test.py @@ -2111,6 +2111,14 @@ def CreateSandbox( dict(request.labels), workspace=_request_workspace(request) or "default", ), + application_service_urls={ + exposure.service: f"https://{exposure.service}.example.test/" + for exposure in request.service_exposures + }, + gateway_service_urls={ + exposure.service: f"https://{exposure.service}.gateway.test:8080/" + for exposure in request.service_exposures + }, service_urls={ exposure.service: f"https://{exposure.service}.example.test/" for exposure in request.service_exposures @@ -2279,6 +2287,27 @@ def test_create_forwards_service_exposures() -> None: "": "https://.example.test/", "metrics": "https://metrics.example.test/", } + assert dict(ref.application_service_urls) == dict(ref.service_urls) + assert ref.gateway_service_urls["metrics"] == "https://metrics.gateway.test:8080/" + with pytest.raises(TypeError): + ref.application_service_urls["metrics"] = "changed" # type: ignore[index] + + +def test_application_addresses_preserve_existing_positional_sandbox_ref() -> None: + original = _sandbox_ref(_make_sandbox_proto("id", "demo")) + ref = SandboxRef( + original.id, + original.name, + original.workspace, + original.status, + {}, + None, + {}, + "SHA256:test-host-identity", + ) + assert ref.host_key_fingerprint == "SHA256:test-host-identity" + assert dict(ref.application_service_urls) == {} + assert dict(ref.gateway_service_urls) == {} def test_create_from_template_forwards_workload_template() -> None: diff --git a/sdk/go/openshell/v1/internal/converter/service.go b/sdk/go/openshell/v1/internal/converter/service.go index bb2803c6bb..7bf2b9a670 100644 --- a/sdk/go/openshell/v1/internal/converter/service.go +++ b/sdk/go/openshell/v1/internal/converter/service.go @@ -17,7 +17,9 @@ func ServiceEndpointFromProto(resp *pb.ServiceEndpointResponse) *types.ServiceEn } result := &types.ServiceEndpoint{ - URL: resp.GetUrl(), + URL: resp.GetUrl(), + ApplicationURL: resp.GetApplicationUrl(), + GatewayURL: resp.GetGatewayUrl(), } if ep := resp.GetEndpoint(); ep != nil { @@ -56,7 +58,9 @@ func ServiceEndpointToProto(se *types.ServiceEndpoint) *pb.ServiceEndpointRespon Domain: se.Domain, AuthorizationMode: serviceAuthorizationModeToProto(se.AuthorizationMode), }, - Url: se.URL, + Url: se.URL, + ApplicationUrl: se.ApplicationURL, + GatewayUrl: se.GatewayURL, } } diff --git a/sdk/go/openshell/v1/internal/converter/service_test.go b/sdk/go/openshell/v1/internal/converter/service_test.go index 6db09701e3..227b8ddba0 100644 --- a/sdk/go/openshell/v1/internal/converter/service_test.go +++ b/sdk/go/openshell/v1/internal/converter/service_test.go @@ -26,7 +26,9 @@ func TestServiceEndpointFromProto(t *testing.T) { Domain: true, AuthorizationMode: pb.ServiceAuthorizationMode_SERVICE_AUTHORIZATION_MODE_BEARER_PASSTHROUGH, }, - Url: "https://svc-1.example.com", + Url: "https://svc-1.example.com", + ApplicationUrl: "https://svc-1.example.com", + GatewayUrl: "https://gateway-svc.example.com:8080", } se := ServiceEndpointFromProto(resp) @@ -40,6 +42,9 @@ func TestServiceEndpointFromProto(t *testing.T) { assert.True(t, se.Domain) assert.Equal(t, v1.ServiceAuthorizationModeBearerPassthrough, se.AuthorizationMode) assert.Equal(t, "https://svc-1.example.com", se.URL) + assert.Equal(t, resp.ApplicationUrl, se.ApplicationURL) + assert.Equal(t, resp.GatewayUrl, se.GatewayURL) + assert.Equal(t, resp, ServiceEndpointToProto(se)) } func TestServiceEndpointFromProto_NilEndpoint(t *testing.T) { diff --git a/sdk/go/openshell/v1/sandbox_client.go b/sdk/go/openshell/v1/sandbox_client.go index d3b36cbdd8..d0b0ef3ec5 100644 --- a/sdk/go/openshell/v1/sandbox_client.go +++ b/sdk/go/openshell/v1/sandbox_client.go @@ -50,6 +50,8 @@ func (s *sandboxClient) Create(ctx context.Context, workspace, name string, spec sandbox := converter.SandboxFromProto(resp.GetSandbox()) if sandbox != nil { sandbox.ServiceURLs = converter.CopyStringMap(resp.GetServiceUrls()) + sandbox.ApplicationServiceURLs = converter.CopyStringMap(resp.GetApplicationServiceUrls()) + sandbox.GatewayServiceURLs = converter.CopyStringMap(resp.GetGatewayServiceUrls()) } return sandbox, nil } @@ -82,6 +84,8 @@ func (s *sandboxClient) CreateFromTemplate(ctx context.Context, workspace, name, sandbox := converter.SandboxFromProto(resp.GetSandbox()) if sandbox != nil { sandbox.ServiceURLs = converter.CopyStringMap(resp.GetServiceUrls()) + sandbox.ApplicationServiceURLs = converter.CopyStringMap(resp.GetApplicationServiceUrls()) + sandbox.GatewayServiceURLs = converter.CopyStringMap(resp.GetGatewayServiceUrls()) } return sandbox, nil } diff --git a/sdk/go/openshell/v1/types/sandbox.go b/sdk/go/openshell/v1/types/sandbox.go index f1cedb595f..0836ea5e10 100644 --- a/sdk/go/openshell/v1/types/sandbox.go +++ b/sdk/go/openshell/v1/types/sandbox.go @@ -22,7 +22,9 @@ type Sandbox struct { Status SandboxStatus // ServiceURLs is populated by create operations and keyed by service name. // The empty key identifies the unnamed service. - ServiceURLs map[string]string + ServiceURLs map[string]string + ApplicationServiceURLs map[string]string + GatewayServiceURLs map[string]string } // SandboxSpec holds the desired state of a sandbox. diff --git a/sdk/go/openshell/v1/types/service.go b/sdk/go/openshell/v1/types/service.go index 5ae7aa0b9e..b7713477c3 100644 --- a/sdk/go/openshell/v1/types/service.go +++ b/sdk/go/openshell/v1/types/service.go @@ -28,6 +28,8 @@ type ServiceEndpoint struct { Name string TargetPort uint32 Domain bool + ApplicationURL string + GatewayURL string URL string Workspace string AuthorizationMode ServiceAuthorizationMode diff --git a/sdk/go/proto/openshellv1/openshell.pb.go b/sdk/go/proto/openshellv1/openshell.pb.go index c4a17cad65..360278ed6b 100644 --- a/sdk/go/proto/openshellv1/openshell.pb.go +++ b/sdk/go/proto/openshellv1/openshell.pb.go @@ -4939,9 +4939,14 @@ type SandboxResponse struct { Sandbox *Sandbox `protobuf:"bytes,1,opt,name=sandbox,proto3" json:"sandbox,omitempty"` // Service URLs created by CreateSandbox, keyed by service name. The empty // key identifies the unnamed service. Other sandbox RPCs return an empty map. - ServiceUrls map[string]string `protobuf:"bytes,2,rep,name=service_urls,json=serviceUrls,proto3" json:"service_urls,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + ServiceUrls map[string]string `protobuf:"bytes,2,rep,name=service_urls,json=serviceUrls,proto3" json:"service_urls,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Configured application origins for the same services. These are + // authoritative public addresses, not installation or health evidence. + ApplicationServiceUrls map[string]string `protobuf:"bytes,3,rep,name=application_service_urls,json=applicationServiceUrls,proto3" json:"application_service_urls,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Gateway-routed alternatives, independent of application ingress. + GatewayServiceUrls map[string]string `protobuf:"bytes,4,rep,name=gateway_service_urls,json=gatewayServiceUrls,proto3" json:"gateway_service_urls,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SandboxResponse) Reset() { @@ -4988,6 +4993,20 @@ func (x *SandboxResponse) GetServiceUrls() map[string]string { return nil } +func (x *SandboxResponse) GetApplicationServiceUrls() map[string]string { + if x != nil { + return x.ApplicationServiceUrls + } + return nil +} + +func (x *SandboxResponse) GetGatewayServiceUrls() map[string]string { + if x != nil { + return x.GatewayServiceUrls + } + return nil +} + // List sandboxes response. type ListSandboxesResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -6919,11 +6938,16 @@ func (x *ServiceEndpoint) GetAuthorizationMode() ServiceAuthorizationMode { return ServiceAuthorizationMode_SERVICE_AUTHORIZATION_MODE_UNSPECIFIED } -// Response containing a service endpoint and, when available, its local URL. +// Service addresses. A configured address does not establish readiness. type ServiceEndpointResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Endpoint *ServiceEndpoint `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Endpoint *ServiceEndpoint `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + // Preferred address: application_url when configured, otherwise gateway_url. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + // Authoritative configured public application address. Preserve its port. + ApplicationUrl string `protobuf:"bytes,3,opt,name=application_url,json=applicationUrl,proto3" json:"application_url,omitempty"` + // Gateway-routed alternative; existing gateway routing remains available. + GatewayUrl string `protobuf:"bytes,4,opt,name=gateway_url,json=gatewayUrl,proto3" json:"gateway_url,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -6972,6 +6996,20 @@ func (x *ServiceEndpointResponse) GetUrl() string { return "" } +func (x *ServiceEndpointResponse) GetApplicationUrl() string { + if x != nil { + return x.ApplicationUrl + } + return "" +} + +func (x *ServiceEndpointResponse) GetGatewayUrl() string { + if x != nil { + return x.GatewayUrl + } + return "" +} + // Revoke SSH session request. type RevokeSshSessionRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -20396,12 +20434,20 @@ const file_openshell_proto_rawDesc = "" + "\x14ResumeSandboxRequest\x12R\n" + "\x0fworkspace_scope\x18\x02 \x01(\v2).openshell.datamodel.v1.WorkspaceSelectorR\x0eworkspaceScope\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x127\n" + - "\x18restart_if_restore_fails\x18\x03 \x01(\bR\x15restartIfRestoreFails\"\xd5\x01\n" + + "\x18restart_if_restore_fails\x18\x03 \x01(\bR\x15restartIfRestoreFails\"\xc5\x04\n" + "\x0fSandboxResponse\x12/\n" + "\asandbox\x18\x01 \x01(\v2\x15.openshell.v1.SandboxR\asandbox\x12Q\n" + - "\fservice_urls\x18\x02 \x03(\v2..openshell.v1.SandboxResponse.ServiceUrlsEntryR\vserviceUrls\x1a>\n" + + "\fservice_urls\x18\x02 \x03(\v2..openshell.v1.SandboxResponse.ServiceUrlsEntryR\vserviceUrls\x12s\n" + + "\x18application_service_urls\x18\x03 \x03(\v29.openshell.v1.SandboxResponse.ApplicationServiceUrlsEntryR\x16applicationServiceUrls\x12g\n" + + "\x14gateway_service_urls\x18\x04 \x03(\v25.openshell.v1.SandboxResponse.GatewayServiceUrlsEntryR\x12gatewayServiceUrls\x1a>\n" + "\x10ServiceUrlsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aI\n" + + "\x1bApplicationServiceUrlsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aE\n" + + "\x17GatewayServiceUrlsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"t\n" + "\x15ListSandboxesResponse\x123\n" + "\tsandboxes\x18\x01 \x03(\v2\x15.openshell.v1.SandboxR\tsandboxes\x12&\n" + @@ -20561,10 +20607,13 @@ const file_openshell_proto_rawDesc = "" + "\vtarget_port\x18\x05 \x01(\rR\n" + "targetPort\x12\x16\n" + "\x06domain\x18\x06 \x01(\bR\x06domain\x12U\n" + - "\x12authorization_mode\x18\a \x01(\x0e2&.openshell.v1.ServiceAuthorizationModeR\x11authorizationMode\"f\n" + + "\x12authorization_mode\x18\a \x01(\x0e2&.openshell.v1.ServiceAuthorizationModeR\x11authorizationMode\"\xb0\x01\n" + "\x17ServiceEndpointResponse\x129\n" + "\bendpoint\x18\x01 \x01(\v2\x1d.openshell.v1.ServiceEndpointR\bendpoint\x12\x10\n" + - "\x03url\x18\x02 \x01(\tR\x03url\"Z\n" + + "\x03url\x18\x02 \x01(\tR\x03url\x12'\n" + + "\x0fapplication_url\x18\x03 \x01(\tR\x0eapplicationUrl\x12\x1f\n" + + "\vgateway_url\x18\x04 \x01(\tR\n" + + "gatewayUrl\"Z\n" + "\x17RevokeSshSessionRequest\x12\x1a\n" + "\x05token\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01R\x05token\x12#\n" + "\rallow_missing\x18\x02 \x01(\bR\fallowMissing\"b\n" + @@ -21960,7 +22009,7 @@ func file_openshell_proto_rawDescGZIP() []byte { } var file_openshell_proto_enumTypes = make([]protoimpl.EnumInfo, 22) -var file_openshell_proto_msgTypes = make([]protoimpl.MessageInfo, 286) +var file_openshell_proto_msgTypes = make([]protoimpl.MessageInfo, 288) var file_openshell_proto_goTypes = []any{ (ExtensionKind)(0), // 0: openshell.v1.ExtensionKind (SandboxPhase)(0), // 1: openshell.v1.SandboxPhase @@ -22253,50 +22302,52 @@ var file_openshell_proto_goTypes = []any{ nil, // 288: openshell.v1.CreateSandboxRequest.LabelsEntry nil, // 289: openshell.v1.CreateSandboxRequest.AnnotationsEntry nil, // 290: openshell.v1.SandboxResponse.ServiceUrlsEntry - nil, // 291: openshell.v1.ExecSandboxRequest.EnvironmentEntry - nil, // 292: openshell.v1.SandboxLogLine.FieldsEntry - nil, // 293: openshell.v1.GetProviderCredentialsResponse.CredentialsEntry - nil, // 294: openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry - nil, // 295: openshell.v1.ConfigureProviderRefreshRequest.MaterialEntry - nil, // 296: openshell.v1.ProviderProfile.AnnotationsEntry - nil, // 297: openshell.v1.GetSandboxProviderEnvironmentResponse.EnvironmentEntry - nil, // 298: openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry - nil, // 299: openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry - nil, // 300: openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry - nil, // 301: openshell.v1.GetSandboxProviderEnvironmentResponse.FilesEntry - nil, // 302: openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry - nil, // 303: openshell.v1.ProviderEnvironmentSnapshot.FilesEntry - nil, // 304: openshell.v1.UpdateConfigRequest.AnnotationsEntry - nil, // 305: openshell.v1.UpdateConfigResponse.AnnotationsEntry - nil, // 306: openshell.v1.SandboxPolicyRevision.ProvenanceEntry - nil, // 307: openshell.v1.CreateWorkspaceRequest.LabelsEntry - (*timestamppb.Timestamp)(nil), // 308: google.protobuf.Timestamp - (*datamodelv1.ObjectMeta)(nil), // 309: openshell.datamodel.v1.ObjectMeta - (*sandboxv1.SandboxPolicy)(nil), // 310: openshell.sandbox.v1.SandboxPolicy - (*structpb.Struct)(nil), // 311: google.protobuf.Struct - (*durationpb.Duration)(nil), // 312: google.protobuf.Duration - (*datamodelv1.WorkspaceSelector)(nil), // 313: openshell.datamodel.v1.WorkspaceSelector - (*datamodelv1.Provider)(nil), // 314: openshell.datamodel.v1.Provider - (sandboxv1.PolicySource)(0), // 315: openshell.sandbox.v1.PolicySource - (*sandboxv1.NetworkEndpoint)(nil), // 316: openshell.sandbox.v1.NetworkEndpoint - (*sandboxv1.NetworkBinary)(nil), // 317: openshell.sandbox.v1.NetworkBinary - (*sandboxv1.SettingValue)(nil), // 318: openshell.sandbox.v1.SettingValue - (*sandboxv1.NetworkPolicyRule)(nil), // 319: openshell.sandbox.v1.NetworkPolicyRule - (*sandboxv1.L7DenyRule)(nil), // 320: openshell.sandbox.v1.L7DenyRule - (*sandboxv1.L7Rule)(nil), // 321: openshell.sandbox.v1.L7Rule - (*sandboxv1.SandboxConfigSnapshot)(nil), // 322: openshell.sandbox.v1.SandboxConfigSnapshot - (*datamodelv1.Workspace)(nil), // 323: openshell.datamodel.v1.Workspace - (*sandboxv1.SandboxServiceRoute)(nil), // 324: openshell.sandbox.v1.SandboxServiceRoute - (*sandboxv1.GetSandboxConfigRequest)(nil), // 325: openshell.sandbox.v1.GetSandboxConfigRequest - (*sandboxv1.GetGatewayConfigRequest)(nil), // 326: openshell.sandbox.v1.GetGatewayConfigRequest - (*sandboxv1.GetSandboxConfigResponse)(nil), // 327: openshell.sandbox.v1.GetSandboxConfigResponse - (*sandboxv1.GetGatewayConfigResponse)(nil), // 328: openshell.sandbox.v1.GetGatewayConfigResponse + nil, // 291: openshell.v1.SandboxResponse.ApplicationServiceUrlsEntry + nil, // 292: openshell.v1.SandboxResponse.GatewayServiceUrlsEntry + nil, // 293: openshell.v1.ExecSandboxRequest.EnvironmentEntry + nil, // 294: openshell.v1.SandboxLogLine.FieldsEntry + nil, // 295: openshell.v1.GetProviderCredentialsResponse.CredentialsEntry + nil, // 296: openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry + nil, // 297: openshell.v1.ConfigureProviderRefreshRequest.MaterialEntry + nil, // 298: openshell.v1.ProviderProfile.AnnotationsEntry + nil, // 299: openshell.v1.GetSandboxProviderEnvironmentResponse.EnvironmentEntry + nil, // 300: openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry + nil, // 301: openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry + nil, // 302: openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry + nil, // 303: openshell.v1.GetSandboxProviderEnvironmentResponse.FilesEntry + nil, // 304: openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry + nil, // 305: openshell.v1.ProviderEnvironmentSnapshot.FilesEntry + nil, // 306: openshell.v1.UpdateConfigRequest.AnnotationsEntry + nil, // 307: openshell.v1.UpdateConfigResponse.AnnotationsEntry + nil, // 308: openshell.v1.SandboxPolicyRevision.ProvenanceEntry + nil, // 309: openshell.v1.CreateWorkspaceRequest.LabelsEntry + (*timestamppb.Timestamp)(nil), // 310: google.protobuf.Timestamp + (*datamodelv1.ObjectMeta)(nil), // 311: openshell.datamodel.v1.ObjectMeta + (*sandboxv1.SandboxPolicy)(nil), // 312: openshell.sandbox.v1.SandboxPolicy + (*structpb.Struct)(nil), // 313: google.protobuf.Struct + (*durationpb.Duration)(nil), // 314: google.protobuf.Duration + (*datamodelv1.WorkspaceSelector)(nil), // 315: openshell.datamodel.v1.WorkspaceSelector + (*datamodelv1.Provider)(nil), // 316: openshell.datamodel.v1.Provider + (sandboxv1.PolicySource)(0), // 317: openshell.sandbox.v1.PolicySource + (*sandboxv1.NetworkEndpoint)(nil), // 318: openshell.sandbox.v1.NetworkEndpoint + (*sandboxv1.NetworkBinary)(nil), // 319: openshell.sandbox.v1.NetworkBinary + (*sandboxv1.SettingValue)(nil), // 320: openshell.sandbox.v1.SettingValue + (*sandboxv1.NetworkPolicyRule)(nil), // 321: openshell.sandbox.v1.NetworkPolicyRule + (*sandboxv1.L7DenyRule)(nil), // 322: openshell.sandbox.v1.L7DenyRule + (*sandboxv1.L7Rule)(nil), // 323: openshell.sandbox.v1.L7Rule + (*sandboxv1.SandboxConfigSnapshot)(nil), // 324: openshell.sandbox.v1.SandboxConfigSnapshot + (*datamodelv1.Workspace)(nil), // 325: openshell.datamodel.v1.Workspace + (*sandboxv1.SandboxServiceRoute)(nil), // 326: openshell.sandbox.v1.SandboxServiceRoute + (*sandboxv1.GetSandboxConfigRequest)(nil), // 327: openshell.sandbox.v1.GetSandboxConfigRequest + (*sandboxv1.GetGatewayConfigRequest)(nil), // 328: openshell.sandbox.v1.GetGatewayConfigRequest + (*sandboxv1.GetSandboxConfigResponse)(nil), // 329: openshell.sandbox.v1.GetSandboxConfigResponse + (*sandboxv1.GetGatewayConfigResponse)(nil), // 330: openshell.sandbox.v1.GetGatewayConfigResponse } var file_openshell_proto_depIdxs = []int32{ - 308, // 0: openshell.v1.IssueSandboxTokenResponse.expiration_time:type_name -> google.protobuf.Timestamp - 308, // 1: openshell.v1.RefreshSandboxTokenResponse.expiration_time:type_name -> google.protobuf.Timestamp + 310, // 0: openshell.v1.IssueSandboxTokenResponse.expiration_time:type_name -> google.protobuf.Timestamp + 310, // 1: openshell.v1.RefreshSandboxTokenResponse.expiration_time:type_name -> google.protobuf.Timestamp 263, // 2: openshell.v1.RefreshSandboxTokenResponse.extension_credentials:type_name -> openshell.v1.ExtensionServiceCredential - 308, // 3: openshell.v1.RefreshSandboxTokenResponse.sandbox_expiration_time:type_name -> google.protobuf.Timestamp + 310, // 3: openshell.v1.RefreshSandboxTokenResponse.sandbox_expiration_time:type_name -> google.protobuf.Timestamp 14, // 4: openshell.v1.HealthResponse.status:type_name -> openshell.v1.ServiceStatus 14, // 5: openshell.v1.GetGatewayInfoResponse.status:type_name -> openshell.v1.ServiceStatus 33, // 6: openshell.v1.GetGatewayInfoResponse.compute_drivers:type_name -> openshell.v1.ComputeDriverInfo @@ -22307,546 +22358,548 @@ var file_openshell_proto_depIdxs = []int32{ 36, // 11: openshell.v1.ResourceCapabilities.cpu:type_name -> openshell.v1.CpuResourceCapabilities 37, // 12: openshell.v1.ResourceCapabilities.memory:type_name -> openshell.v1.MemoryResourceCapabilities 38, // 13: openshell.v1.ResourceCapabilities.gpu:type_name -> openshell.v1.GpuResourceCapabilities - 309, // 14: openshell.v1.Sandbox.metadata:type_name -> openshell.datamodel.v1.ObjectMeta + 311, // 14: openshell.v1.Sandbox.metadata:type_name -> openshell.datamodel.v1.ObjectMeta 40, // 15: openshell.v1.Sandbox.spec:type_name -> openshell.v1.SandboxSpec 51, // 16: openshell.v1.Sandbox.status:type_name -> openshell.v1.SandboxStatus 50, // 17: openshell.v1.Sandbox.created_from_workload_template:type_name -> openshell.v1.SandboxWorkloadTemplateProvenance 282, // 18: openshell.v1.SandboxSpec.environment:type_name -> openshell.v1.SandboxSpec.EnvironmentEntry 43, // 19: openshell.v1.SandboxSpec.template:type_name -> openshell.v1.SandboxTemplate - 310, // 20: openshell.v1.SandboxSpec.policy:type_name -> openshell.sandbox.v1.SandboxPolicy + 312, // 20: openshell.v1.SandboxSpec.policy:type_name -> openshell.sandbox.v1.SandboxPolicy 41, // 21: openshell.v1.SandboxSpec.resource_requirements:type_name -> openshell.v1.ResourceRequirements 17, // 22: openshell.v1.SandboxSpec.restart_policy:type_name -> openshell.v1.SandboxRestartPolicy 42, // 23: openshell.v1.ResourceRequirements.gpu:type_name -> openshell.v1.GpuResourceRequirements 283, // 24: openshell.v1.SandboxTemplate.labels:type_name -> openshell.v1.SandboxTemplate.LabelsEntry 284, // 25: openshell.v1.SandboxTemplate.annotations:type_name -> openshell.v1.SandboxTemplate.AnnotationsEntry 285, // 26: openshell.v1.SandboxTemplate.environment:type_name -> openshell.v1.SandboxTemplate.EnvironmentEntry - 311, // 27: openshell.v1.SandboxTemplate.resources:type_name -> google.protobuf.Struct - 311, // 28: openshell.v1.SandboxTemplate.driver_config:type_name -> google.protobuf.Struct - 309, // 29: openshell.v1.SandboxWorkloadTemplate.metadata:type_name -> openshell.datamodel.v1.ObjectMeta + 313, // 27: openshell.v1.SandboxTemplate.resources:type_name -> google.protobuf.Struct + 313, // 28: openshell.v1.SandboxTemplate.driver_config:type_name -> google.protobuf.Struct + 311, // 29: openshell.v1.SandboxWorkloadTemplate.metadata:type_name -> openshell.datamodel.v1.ObjectMeta 45, // 30: openshell.v1.SandboxWorkloadTemplate.spec:type_name -> openshell.v1.SandboxWorkloadTemplateSpec 46, // 31: openshell.v1.SandboxWorkloadTemplateSpec.workload:type_name -> openshell.v1.SandboxWorkloadConfig - 311, // 32: openshell.v1.SandboxWorkloadTemplateSpec.driver_config:type_name -> google.protobuf.Struct + 313, // 32: openshell.v1.SandboxWorkloadTemplateSpec.driver_config:type_name -> google.protobuf.Struct 48, // 33: openshell.v1.SandboxWorkloadTemplateSpec.desired_service_level:type_name -> openshell.v1.SandboxServiceLevel 286, // 34: openshell.v1.SandboxWorkloadConfig.environment:type_name -> openshell.v1.SandboxWorkloadConfig.EnvironmentEntry 47, // 35: openshell.v1.SandboxWorkloadConfig.resources:type_name -> openshell.v1.SandboxResources 42, // 36: openshell.v1.SandboxResources.gpu:type_name -> openshell.v1.GpuResourceRequirements 49, // 37: openshell.v1.SandboxServiceLevel.startup:type_name -> openshell.v1.SandboxStartup - 312, // 38: openshell.v1.SandboxStartup.ready_within:type_name -> google.protobuf.Duration + 314, // 38: openshell.v1.SandboxStartup.ready_within:type_name -> google.protobuf.Duration 52, // 39: openshell.v1.SandboxStatus.conditions:type_name -> openshell.v1.SandboxCondition 1, // 40: openshell.v1.SandboxStatus.phase:type_name -> openshell.v1.SandboxPhase 269, // 41: openshell.v1.SandboxStatus.endpoint_statuses:type_name -> openshell.v1.EndpointStatus 185, // 42: openshell.v1.SandboxStatus.configuration_admission:type_name -> openshell.v1.SandboxConfigurationAdmission 270, // 43: openshell.v1.SandboxStatus.provisioning:type_name -> openshell.v1.SandboxProvisioning - 308, // 44: openshell.v1.SandboxStatus.next_restart_time:type_name -> google.protobuf.Timestamp - 308, // 45: openshell.v1.SandboxStatus.main_process_started_time:type_name -> google.protobuf.Timestamp + 310, // 44: openshell.v1.SandboxStatus.next_restart_time:type_name -> google.protobuf.Timestamp + 310, // 45: openshell.v1.SandboxStatus.main_process_started_time:type_name -> google.protobuf.Timestamp 267, // 46: openshell.v1.SandboxStatus.last_token_grant_failure:type_name -> openshell.v1.TokenGrantFailureObservation - 308, // 47: openshell.v1.SandboxCondition.transition_time:type_name -> google.protobuf.Timestamp - 308, // 48: openshell.v1.PlatformEvent.event_time:type_name -> google.protobuf.Timestamp + 310, // 47: openshell.v1.SandboxCondition.transition_time:type_name -> google.protobuf.Timestamp + 310, // 48: openshell.v1.PlatformEvent.event_time:type_name -> google.protobuf.Timestamp 287, // 49: openshell.v1.PlatformEvent.metadata:type_name -> openshell.v1.PlatformEvent.MetadataEntry - 313, // 50: openshell.v1.CreateSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 50: openshell.v1.CreateSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector 40, // 51: openshell.v1.CreateSandboxRequest.spec:type_name -> openshell.v1.SandboxSpec 288, // 52: openshell.v1.CreateSandboxRequest.labels:type_name -> openshell.v1.CreateSandboxRequest.LabelsEntry 289, // 53: openshell.v1.CreateSandboxRequest.annotations:type_name -> openshell.v1.CreateSandboxRequest.AnnotationsEntry 271, // 54: openshell.v1.CreateSandboxRequest.service_exposures:type_name -> openshell.v1.SandboxServiceExposure - 313, // 55: openshell.v1.CreateSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 55: openshell.v1.CreateSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector 44, // 56: openshell.v1.CreateSandboxTemplateRequest.template:type_name -> openshell.v1.SandboxWorkloadTemplate - 313, // 57: openshell.v1.GetSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 58: openshell.v1.ListSandboxTemplatesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 59: openshell.v1.DeleteSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 57: openshell.v1.GetSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 58: openshell.v1.ListSandboxTemplatesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 59: openshell.v1.DeleteSandboxTemplateRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector 44, // 60: openshell.v1.SandboxTemplateResponse.template:type_name -> openshell.v1.SandboxWorkloadTemplate 44, // 61: openshell.v1.ListSandboxTemplatesResponse.templates:type_name -> openshell.v1.SandboxWorkloadTemplate 18, // 62: openshell.v1.DeleteSandboxTemplateResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 313, // 63: openshell.v1.BeginRootfsTarStagingRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 308, // 64: openshell.v1.BeginRootfsTarStagingResponse.expiration_time:type_name -> google.protobuf.Timestamp - 313, // 65: openshell.v1.GetSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 66: openshell.v1.ListSandboxesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 67: openshell.v1.ListSandboxProvidersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 68: openshell.v1.AttachSandboxProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 69: openshell.v1.DetachSandboxProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 70: openshell.v1.DeleteSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 71: openshell.v1.StopSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 72: openshell.v1.StartSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 73: openshell.v1.SuspendSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 74: openshell.v1.ResumeSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 63: openshell.v1.BeginRootfsTarStagingRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 310, // 64: openshell.v1.BeginRootfsTarStagingResponse.expiration_time:type_name -> google.protobuf.Timestamp + 315, // 65: openshell.v1.GetSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 66: openshell.v1.ListSandboxesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 67: openshell.v1.ListSandboxProvidersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 68: openshell.v1.AttachSandboxProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 69: openshell.v1.DetachSandboxProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 70: openshell.v1.DeleteSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 71: openshell.v1.StopSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 72: openshell.v1.StartSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 73: openshell.v1.SuspendSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 74: openshell.v1.ResumeSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector 39, // 75: openshell.v1.SandboxResponse.sandbox:type_name -> openshell.v1.Sandbox 290, // 76: openshell.v1.SandboxResponse.service_urls:type_name -> openshell.v1.SandboxResponse.ServiceUrlsEntry - 39, // 77: openshell.v1.ListSandboxesResponse.sandboxes:type_name -> openshell.v1.Sandbox - 314, // 78: openshell.v1.ListSandboxProvidersResponse.providers:type_name -> openshell.datamodel.v1.Provider - 39, // 79: openshell.v1.AttachSandboxProviderResponse.sandbox:type_name -> openshell.v1.Sandbox - 83, // 80: openshell.v1.AttachSandboxProviderResponse.receipt:type_name -> openshell.v1.ProviderMutationReceipt - 39, // 81: openshell.v1.DetachSandboxProviderResponse.sandbox:type_name -> openshell.v1.Sandbox - 83, // 82: openshell.v1.DetachSandboxProviderResponse.receipt:type_name -> openshell.v1.ProviderMutationReceipt - 81, // 83: openshell.v1.ConfigSnapshotRevision.sandbox_config:type_name -> openshell.v1.SandboxConfigRevision - 79, // 84: openshell.v1.ConfigSnapshotRevision.provider_target:type_name -> openshell.v1.ProviderDesiredIdentity - 315, // 85: openshell.v1.SandboxConfigRevision.policy_source:type_name -> openshell.sandbox.v1.PolicySource - 5, // 86: openshell.v1.ConfigUpdateOperation.component:type_name -> openshell.v1.ConfigComponent - 80, // 87: openshell.v1.ConfigUpdateOperation.target_revision:type_name -> openshell.v1.ConfigSnapshotRevision - 7, // 88: openshell.v1.ConfigUpdateOperation.state:type_name -> openshell.v1.ConfigUpdateOperationState - 6, // 89: openshell.v1.ConfigUpdateOperation.outcome:type_name -> openshell.v1.ConfigApplyOutcome - 308, // 90: openshell.v1.ConfigUpdateOperation.created_time:type_name -> google.protobuf.Timestamp - 308, // 91: openshell.v1.ConfigUpdateOperation.updated_time:type_name -> google.protobuf.Timestamp - 308, // 92: openshell.v1.ConfigUpdateOperation.completed_time:type_name -> google.protobuf.Timestamp - 2, // 93: openshell.v1.ProviderMutationReceipt.kind:type_name -> openshell.v1.ProviderMutationKind - 79, // 94: openshell.v1.ProviderMutationReceipt.desired:type_name -> openshell.v1.ProviderDesiredIdentity - 308, // 95: openshell.v1.ProviderMutationReceipt.persisted_time:type_name -> google.protobuf.Timestamp - 4, // 96: openshell.v1.ProviderReadinessObservation.reason:type_name -> openshell.v1.ProviderReadinessReason - 83, // 97: openshell.v1.ProviderReadinessStatus.receipt:type_name -> openshell.v1.ProviderMutationReceipt - 3, // 98: openshell.v1.ProviderReadinessStatus.state:type_name -> openshell.v1.ProviderReadinessState - 4, // 99: openshell.v1.ProviderReadinessStatus.reason:type_name -> openshell.v1.ProviderReadinessReason - 84, // 100: openshell.v1.ProviderReadinessStatus.observed:type_name -> openshell.v1.ProviderReadinessObservation - 308, // 101: openshell.v1.ProviderReadinessStatus.observed_time:type_name -> google.protobuf.Timestamp - 308, // 102: openshell.v1.ProviderReadinessStatus.evaluated_time:type_name -> google.protobuf.Timestamp - 82, // 103: openshell.v1.ProviderReadinessStatus.operation:type_name -> openshell.v1.ConfigUpdateOperation - 313, // 104: openshell.v1.GetSandboxProviderStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 85, // 105: openshell.v1.GetSandboxProviderStatusResponse.status:type_name -> openshell.v1.ProviderReadinessStatus - 84, // 106: openshell.v1.ReportProviderReadinessRequest.observation:type_name -> openshell.v1.ProviderReadinessObservation - 312, // 107: openshell.v1.ReportProviderReadinessResponse.report_interval:type_name -> google.protobuf.Duration - 312, // 108: openshell.v1.ReportProviderReadinessResponse.observation_ttl:type_name -> google.protobuf.Duration - 18, // 109: openshell.v1.DeleteSandboxResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 313, // 110: openshell.v1.CreateSshSessionRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 308, // 111: openshell.v1.CreateSshSessionResponse.expiration_time:type_name -> google.protobuf.Timestamp - 313, // 112: openshell.v1.ExposeServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 20, // 113: openshell.v1.ExposeServiceRequest.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode - 313, // 114: openshell.v1.GetServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 115: openshell.v1.ListServicesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 100, // 116: openshell.v1.ListServicesResponse.services:type_name -> openshell.v1.ServiceEndpointResponse - 313, // 117: openshell.v1.DeleteServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 18, // 118: openshell.v1.DeleteServiceResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 309, // 119: openshell.v1.ServiceEndpoint.metadata:type_name -> openshell.datamodel.v1.ObjectMeta - 20, // 120: openshell.v1.ServiceEndpoint.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode - 99, // 121: openshell.v1.ServiceEndpointResponse.endpoint:type_name -> openshell.v1.ServiceEndpoint - 18, // 122: openshell.v1.RevokeSshSessionResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 313, // 123: openshell.v1.ExecSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 291, // 124: openshell.v1.ExecSandboxRequest.environment:type_name -> openshell.v1.ExecSandboxRequest.EnvironmentEntry - 312, // 125: openshell.v1.ExecSandboxRequest.execution_timeout:type_name -> google.protobuf.Duration - 104, // 126: openshell.v1.ExecSandboxEvent.stdout:type_name -> openshell.v1.ExecSandboxStdout - 105, // 127: openshell.v1.ExecSandboxEvent.stderr:type_name -> openshell.v1.ExecSandboxStderr - 106, // 128: openshell.v1.ExecSandboxEvent.exit:type_name -> openshell.v1.ExecSandboxExit - 210, // 129: openshell.v1.TcpForwardInit.ssh:type_name -> openshell.v1.SshRelayTarget - 211, // 130: openshell.v1.TcpForwardInit.tcp:type_name -> openshell.v1.TcpRelayTarget - 108, // 131: openshell.v1.TcpForwardFrame.init:type_name -> openshell.v1.TcpForwardInit - 103, // 132: openshell.v1.ExecSandboxInput.start:type_name -> openshell.v1.ExecSandboxRequest - 111, // 133: openshell.v1.ExecSandboxInput.resize:type_name -> openshell.v1.ExecSandboxWindowResize - 309, // 134: openshell.v1.SshSession.metadata:type_name -> openshell.datamodel.v1.ObjectMeta - 308, // 135: openshell.v1.SshSession.expiration_time:type_name -> google.protobuf.Timestamp - 313, // 136: openshell.v1.WatchSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 308, // 137: openshell.v1.WatchSandboxRequest.since_time:type_name -> google.protobuf.Timestamp - 39, // 138: openshell.v1.SandboxStreamEvent.sandbox:type_name -> openshell.v1.Sandbox - 115, // 139: openshell.v1.SandboxStreamEvent.log:type_name -> openshell.v1.SandboxLogLine - 53, // 140: openshell.v1.SandboxStreamEvent.event:type_name -> openshell.v1.PlatformEvent - 116, // 141: openshell.v1.SandboxStreamEvent.warning:type_name -> openshell.v1.SandboxStreamWarning - 227, // 142: openshell.v1.SandboxStreamEvent.draft_policy_update:type_name -> openshell.v1.DraftPolicyUpdate - 308, // 143: openshell.v1.SandboxLogLine.event_time:type_name -> google.protobuf.Timestamp - 292, // 144: openshell.v1.SandboxLogLine.fields:type_name -> openshell.v1.SandboxLogLine.FieldsEntry - 313, // 145: openshell.v1.CreateProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 314, // 146: openshell.v1.CreateProviderRequest.provider:type_name -> openshell.datamodel.v1.Provider - 313, // 147: openshell.v1.GetProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 148: openshell.v1.GetProviderCredentialsRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 312, // 149: openshell.v1.GetProviderCredentialsRequest.minimum_remaining_lifetime:type_name -> google.protobuf.Duration - 308, // 150: openshell.v1.ProviderCredentialValue.expiration_time:type_name -> google.protobuf.Timestamp - 293, // 151: openshell.v1.GetProviderCredentialsResponse.credentials:type_name -> openshell.v1.GetProviderCredentialsResponse.CredentialsEntry - 313, // 152: openshell.v1.ListProvidersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 153: openshell.v1.UpdateProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 314, // 154: openshell.v1.UpdateProviderRequest.provider:type_name -> openshell.datamodel.v1.Provider - 294, // 155: openshell.v1.UpdateProviderRequest.credential_expiration_times:type_name -> openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry - 313, // 156: openshell.v1.DeleteProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 314, // 157: openshell.v1.ProviderResponse.provider:type_name -> openshell.datamodel.v1.Provider - 83, // 158: openshell.v1.ProviderResponse.target_receipts:type_name -> openshell.v1.ProviderMutationReceipt - 314, // 159: openshell.v1.ListProvidersResponse.providers:type_name -> openshell.datamodel.v1.Provider - 313, // 160: openshell.v1.ListProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 161: openshell.v1.GetProviderProfileRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 148, // 162: openshell.v1.ProviderProfileImportItem.profile:type_name -> openshell.v1.ProviderProfile - 312, // 163: openshell.v1.ProviderCredentialTokenGrant.cache_ttl:type_name -> google.protobuf.Duration - 131, // 164: openshell.v1.ProviderCredentialTokenGrant.audience_overrides:type_name -> openshell.v1.ProviderCredentialTokenGrantAudienceOverride - 8, // 165: openshell.v1.ProviderCredentialTokenGrant.grant_type:type_name -> openshell.v1.ProviderCredentialTokenGrantType - 132, // 166: openshell.v1.ProviderCredentialTokenGrant.subject_token:type_name -> openshell.v1.ProviderCredentialTokenGrantSubjectToken - 137, // 167: openshell.v1.ProviderProfileCredential.refresh:type_name -> openshell.v1.ProviderCredentialRefresh - 133, // 168: openshell.v1.ProviderProfileCredential.token_grant:type_name -> openshell.v1.ProviderCredentialTokenGrant - 9, // 169: openshell.v1.ProviderCredentialRefresh.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy - 312, // 170: openshell.v1.ProviderCredentialRefresh.refresh_before:type_name -> google.protobuf.Duration - 312, // 171: openshell.v1.ProviderCredentialRefresh.max_lifetime:type_name -> google.protobuf.Duration - 135, // 172: openshell.v1.ProviderCredentialRefresh.material:type_name -> openshell.v1.ProviderCredentialRefreshMaterial - 136, // 173: openshell.v1.ProviderCredentialRefresh.additional_outputs:type_name -> openshell.v1.ProviderCredentialRefreshOutput - 9, // 174: openshell.v1.ProviderCredentialRefreshStatus.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy - 308, // 175: openshell.v1.ProviderCredentialRefreshStatus.expiration_time:type_name -> google.protobuf.Timestamp - 308, // 176: openshell.v1.ProviderCredentialRefreshStatus.next_refresh_time:type_name -> google.protobuf.Timestamp - 308, // 177: openshell.v1.ProviderCredentialRefreshStatus.last_refresh_time:type_name -> google.protobuf.Timestamp - 16, // 178: openshell.v1.ProviderCredentialRefreshStatus.recovery_action:type_name -> openshell.v1.ProviderCredentialRefreshRecoveryAction - 308, // 179: openshell.v1.ProviderCredentialRefreshStatus.last_error_time:type_name -> google.protobuf.Timestamp - 313, // 180: openshell.v1.GetProviderRefreshStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 138, // 181: openshell.v1.GetProviderRefreshStatusResponse.credentials:type_name -> openshell.v1.ProviderCredentialRefreshStatus - 313, // 182: openshell.v1.ConfigureProviderRefreshRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 9, // 183: openshell.v1.ConfigureProviderRefreshRequest.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy - 295, // 184: openshell.v1.ConfigureProviderRefreshRequest.material:type_name -> openshell.v1.ConfigureProviderRefreshRequest.MaterialEntry - 308, // 185: openshell.v1.ConfigureProviderRefreshRequest.expiration_time:type_name -> google.protobuf.Timestamp - 138, // 186: openshell.v1.ConfigureProviderRefreshResponse.status:type_name -> openshell.v1.ProviderCredentialRefreshStatus - 313, // 187: openshell.v1.RotateProviderCredentialRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 138, // 188: openshell.v1.RotateProviderCredentialResponse.status:type_name -> openshell.v1.ProviderCredentialRefreshStatus - 313, // 189: openshell.v1.DeleteProviderRefreshRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 18, // 190: openshell.v1.DeleteProviderRefreshResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 10, // 191: openshell.v1.ProviderProfile.category:type_name -> openshell.v1.ProviderProfileCategory - 134, // 192: openshell.v1.ProviderProfile.credentials:type_name -> openshell.v1.ProviderProfileCredential - 316, // 193: openshell.v1.ProviderProfile.endpoints:type_name -> openshell.sandbox.v1.NetworkEndpoint - 317, // 194: openshell.v1.ProviderProfile.binaries:type_name -> openshell.sandbox.v1.NetworkBinary - 139, // 195: openshell.v1.ProviderProfile.discovery:type_name -> openshell.v1.ProviderProfileDiscovery - 296, // 196: openshell.v1.ProviderProfile.annotations:type_name -> openshell.v1.ProviderProfile.AnnotationsEntry - 149, // 197: openshell.v1.ProviderProfile.files:type_name -> openshell.v1.ProviderProfileFile - 148, // 198: openshell.v1.ProviderProfileResponse.profile:type_name -> openshell.v1.ProviderProfile - 148, // 199: openshell.v1.ListProviderProfilesResponse.profiles:type_name -> openshell.v1.ProviderProfile - 313, // 200: openshell.v1.ImportProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 129, // 201: openshell.v1.ImportProviderProfilesRequest.profiles:type_name -> openshell.v1.ProviderProfileImportItem - 130, // 202: openshell.v1.ImportProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic - 148, // 203: openshell.v1.ImportProviderProfilesResponse.profiles:type_name -> openshell.v1.ProviderProfile - 313, // 204: openshell.v1.UpdateProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 129, // 205: openshell.v1.UpdateProviderProfilesRequest.profile:type_name -> openshell.v1.ProviderProfileImportItem - 130, // 206: openshell.v1.UpdateProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic - 148, // 207: openshell.v1.UpdateProviderProfilesResponse.profile:type_name -> openshell.v1.ProviderProfile - 313, // 208: openshell.v1.LintProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 129, // 209: openshell.v1.LintProviderProfilesRequest.profiles:type_name -> openshell.v1.ProviderProfileImportItem - 130, // 210: openshell.v1.LintProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic - 18, // 211: openshell.v1.DeleteProviderResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 313, // 212: openshell.v1.DeleteProviderProfileRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 18, // 213: openshell.v1.DeleteProviderProfileResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 162, // 214: openshell.v1.StaticCredentialBinding.endpoints:type_name -> openshell.v1.StaticCredentialEndpointBinding - 297, // 215: openshell.v1.GetSandboxProviderEnvironmentResponse.environment:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.EnvironmentEntry - 298, // 216: openshell.v1.GetSandboxProviderEnvironmentResponse.credential_expiration_times:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry - 299, // 217: openshell.v1.GetSandboxProviderEnvironmentResponse.dynamic_credentials:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry - 300, // 218: openshell.v1.GetSandboxProviderEnvironmentResponse.static_credential_bindings:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry - 4, // 219: openshell.v1.GetSandboxProviderEnvironmentResponse.readiness_reason:type_name -> openshell.v1.ProviderReadinessReason - 301, // 220: openshell.v1.GetSandboxProviderEnvironmentResponse.files:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.FilesEntry - 11, // 221: openshell.v1.ProviderEnvironmentValue.classification:type_name -> openshell.v1.ProviderEnvironmentValueClassification - 163, // 222: openshell.v1.ProviderEnvironmentValue.static_credential_binding:type_name -> openshell.v1.StaticCredentialBinding - 308, // 223: openshell.v1.ProviderEnvironmentValue.expiration_time:type_name -> google.protobuf.Timestamp - 165, // 224: openshell.v1.ProviderEnvironmentSnapshot.values:type_name -> openshell.v1.ProviderEnvironmentValue - 302, // 225: openshell.v1.ProviderEnvironmentSnapshot.dynamic_credentials:type_name -> openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry - 4, // 226: openshell.v1.ProviderEnvironmentSnapshot.readiness_reason:type_name -> openshell.v1.ProviderReadinessReason - 303, // 227: openshell.v1.ProviderEnvironmentSnapshot.files:type_name -> openshell.v1.ProviderEnvironmentSnapshot.FilesEntry - 312, // 228: openshell.v1.ExchangeProviderSubjectTokenResponse.expires_after:type_name -> google.protobuf.Duration - 313, // 229: openshell.v1.UpdateConfigRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 310, // 230: openshell.v1.UpdateConfigRequest.policy:type_name -> openshell.sandbox.v1.SandboxPolicy - 318, // 231: openshell.v1.UpdateConfigRequest.setting_value:type_name -> openshell.sandbox.v1.SettingValue - 170, // 232: openshell.v1.UpdateConfigRequest.merge_operations:type_name -> openshell.v1.PolicyMergeOperation - 304, // 233: openshell.v1.UpdateConfigRequest.annotations:type_name -> openshell.v1.UpdateConfigRequest.AnnotationsEntry - 171, // 234: openshell.v1.PolicyMergeOperation.add_rule:type_name -> openshell.v1.AddNetworkRule - 172, // 235: openshell.v1.PolicyMergeOperation.remove_endpoint:type_name -> openshell.v1.RemoveNetworkEndpoint - 173, // 236: openshell.v1.PolicyMergeOperation.remove_rule:type_name -> openshell.v1.RemoveNetworkRule - 175, // 237: openshell.v1.PolicyMergeOperation.add_deny_rules:type_name -> openshell.v1.AddDenyRules - 176, // 238: openshell.v1.PolicyMergeOperation.add_allow_rules:type_name -> openshell.v1.AddAllowRules - 177, // 239: openshell.v1.PolicyMergeOperation.remove_binary:type_name -> openshell.v1.RemoveNetworkBinary - 319, // 240: openshell.v1.AddNetworkRule.rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule - 317, // 241: openshell.v1.L7RuleTarget.binaries:type_name -> openshell.sandbox.v1.NetworkBinary - 320, // 242: openshell.v1.AddDenyRules.deny_rules:type_name -> openshell.sandbox.v1.L7DenyRule - 174, // 243: openshell.v1.AddDenyRules.target:type_name -> openshell.v1.L7RuleTarget - 321, // 244: openshell.v1.AddAllowRules.rules:type_name -> openshell.sandbox.v1.L7Rule - 174, // 245: openshell.v1.AddAllowRules.target:type_name -> openshell.v1.L7RuleTarget - 305, // 246: openshell.v1.UpdateConfigResponse.annotations:type_name -> openshell.v1.UpdateConfigResponse.AnnotationsEntry - 313, // 247: openshell.v1.GetSandboxPolicyStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 188, // 248: openshell.v1.GetSandboxPolicyStatusResponse.revision:type_name -> openshell.v1.SandboxPolicyRevision - 313, // 249: openshell.v1.ListSandboxPoliciesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 188, // 250: openshell.v1.ListSandboxPoliciesResponse.revisions:type_name -> openshell.v1.SandboxPolicyRevision - 13, // 251: openshell.v1.ReportPolicyStatusRequest.status:type_name -> openshell.v1.PolicyStatus - 12, // 252: openshell.v1.SandboxConfigurationAdmission.state:type_name -> openshell.v1.ConfigurationAdmissionState - 185, // 253: openshell.v1.ReportSandboxConfigurationRequest.admission:type_name -> openshell.v1.SandboxConfigurationAdmission - 13, // 254: openshell.v1.SandboxPolicyRevision.status:type_name -> openshell.v1.PolicyStatus - 308, // 255: openshell.v1.SandboxPolicyRevision.created_time:type_name -> google.protobuf.Timestamp - 308, // 256: openshell.v1.SandboxPolicyRevision.loaded_time:type_name -> google.protobuf.Timestamp - 310, // 257: openshell.v1.SandboxPolicyRevision.policy:type_name -> openshell.sandbox.v1.SandboxPolicy - 306, // 258: openshell.v1.SandboxPolicyRevision.provenance:type_name -> openshell.v1.SandboxPolicyRevision.ProvenanceEntry - 313, // 259: openshell.v1.GetSandboxLogsRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 308, // 260: openshell.v1.GetSandboxLogsRequest.since_time:type_name -> google.protobuf.Timestamp - 115, // 261: openshell.v1.PushSandboxLogsRequest.logs:type_name -> openshell.v1.SandboxLogLine - 115, // 262: openshell.v1.GetSandboxLogsResponse.logs:type_name -> openshell.v1.SandboxLogLine - 195, // 263: openshell.v1.SupervisorMessage.hello:type_name -> openshell.v1.SupervisorHello - 203, // 264: openshell.v1.SupervisorMessage.heartbeat:type_name -> openshell.v1.SupervisorHeartbeat - 220, // 265: openshell.v1.SupervisorMessage.relay_open_result:type_name -> openshell.v1.RelayOpenResult - 221, // 266: openshell.v1.SupervisorMessage.relay_close:type_name -> openshell.v1.RelayClose - 199, // 267: openshell.v1.SupervisorMessage.config_update_result:type_name -> openshell.v1.ConfigUpdateResult - 274, // 268: openshell.v1.SupervisorMessage.service_advertisement:type_name -> openshell.v1.SupervisorServiceAdvertisement - 196, // 269: openshell.v1.GatewayMessage.session_accepted:type_name -> openshell.v1.SessionAccepted - 201, // 270: openshell.v1.GatewayMessage.session_rejected:type_name -> openshell.v1.SessionRejected - 204, // 271: openshell.v1.GatewayMessage.heartbeat:type_name -> openshell.v1.GatewayHeartbeat - 209, // 272: openshell.v1.GatewayMessage.relay_open:type_name -> openshell.v1.RelayOpen - 221, // 273: openshell.v1.GatewayMessage.relay_close:type_name -> openshell.v1.RelayClose - 202, // 274: openshell.v1.GatewayMessage.session_redirect:type_name -> openshell.v1.SessionRedirect - 197, // 275: openshell.v1.GatewayMessage.config_update:type_name -> openshell.v1.ConfigUpdate - 273, // 276: openshell.v1.GatewayMessage.service_route_lease:type_name -> openshell.v1.ServiceRouteLease - 197, // 277: openshell.v1.SessionAccepted.bootstrap:type_name -> openshell.v1.ConfigUpdate - 312, // 278: openshell.v1.SessionAccepted.heartbeat_interval:type_name -> google.protobuf.Duration - 322, // 279: openshell.v1.ConfigUpdate.sandbox_config:type_name -> openshell.sandbox.v1.SandboxConfigSnapshot - 166, // 280: openshell.v1.ConfigUpdate.provider_environment:type_name -> openshell.v1.ProviderEnvironmentSnapshot - 6, // 281: openshell.v1.ConfigUpdateResult.outcome:type_name -> openshell.v1.ConfigApplyOutcome - 198, // 282: openshell.v1.ConfigUpdateResult.failure:type_name -> openshell.v1.ConfigApplyFailure - 185, // 283: openshell.v1.ConfigUpdateResult.admission:type_name -> openshell.v1.SandboxConfigurationAdmission - 200, // 284: openshell.v1.ConfigUpdateResult.policy_load:type_name -> openshell.v1.PolicyLoadResult - 210, // 285: openshell.v1.RelayOpen.ssh:type_name -> openshell.v1.SshRelayTarget - 211, // 286: openshell.v1.RelayOpen.tcp:type_name -> openshell.v1.TcpRelayTarget - 212, // 287: openshell.v1.RelayFrame.init:type_name -> openshell.v1.RelayInit - 209, // 288: openshell.v1.PeerRelayInit.relay_open:type_name -> openshell.v1.RelayOpen - 214, // 289: openshell.v1.PeerRelayFrame.init:type_name -> openshell.v1.PeerRelayInit - 216, // 290: openshell.v1.PeerNotifyConfigUpdateRequest.sandbox:type_name -> openshell.v1.PeerConfigSandboxTarget - 217, // 291: openshell.v1.PeerNotifyConfigUpdateRequest.provider:type_name -> openshell.v1.PeerConfigProviderTarget - 308, // 292: openshell.v1.DenialSummary.first_seen_time:type_name -> google.protobuf.Timestamp - 308, // 293: openshell.v1.DenialSummary.last_seen_time:type_name -> google.protobuf.Timestamp - 222, // 294: openshell.v1.DenialSummary.l7_request_samples:type_name -> openshell.v1.L7RequestSample - 224, // 295: openshell.v1.NetworkActivitySummary.denials_by_group:type_name -> openshell.v1.DenialGroupCount - 319, // 296: openshell.v1.PolicyChunk.proposed_rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule - 308, // 297: openshell.v1.PolicyChunk.created_time:type_name -> google.protobuf.Timestamp - 308, // 298: openshell.v1.PolicyChunk.decided_time:type_name -> google.protobuf.Timestamp - 308, // 299: openshell.v1.PolicyChunk.first_seen_time:type_name -> google.protobuf.Timestamp - 308, // 300: openshell.v1.PolicyChunk.last_seen_time:type_name -> google.protobuf.Timestamp - 310, // 301: openshell.v1.PolicyChunk.current_effective_policy:type_name -> openshell.sandbox.v1.SandboxPolicy - 310, // 302: openshell.v1.PolicyChunk.candidate_effective_policy:type_name -> openshell.sandbox.v1.SandboxPolicy - 313, // 303: openshell.v1.SubmitPolicyAnalysisRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 223, // 304: openshell.v1.SubmitPolicyAnalysisRequest.summaries:type_name -> openshell.v1.DenialSummary - 226, // 305: openshell.v1.SubmitPolicyAnalysisRequest.proposed_chunks:type_name -> openshell.v1.PolicyChunk - 225, // 306: openshell.v1.SubmitPolicyAnalysisRequest.network_activity_summaries:type_name -> openshell.v1.NetworkActivitySummary - 313, // 307: openshell.v1.GetDraftPolicyRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 226, // 308: openshell.v1.GetDraftPolicyResponse.chunks:type_name -> openshell.v1.PolicyChunk - 308, // 309: openshell.v1.GetDraftPolicyResponse.last_analyzed_time:type_name -> google.protobuf.Timestamp - 313, // 310: openshell.v1.ApproveDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 311: openshell.v1.RejectDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 312: openshell.v1.ApproveAllDraftChunksRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 236, // 313: openshell.v1.ApproveAllDraftChunksRequest.approvals:type_name -> openshell.v1.DraftChunkApproval - 313, // 314: openshell.v1.EditDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 319, // 315: openshell.v1.EditDraftChunkRequest.proposed_rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule - 313, // 316: openshell.v1.UndoDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 317: openshell.v1.ClearDraftChunksRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 313, // 318: openshell.v1.GetDraftHistoryRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 308, // 319: openshell.v1.DraftHistoryEntry.event_time:type_name -> google.protobuf.Timestamp - 246, // 320: openshell.v1.GetDraftHistoryResponse.entries:type_name -> openshell.v1.DraftHistoryEntry - 307, // 321: openshell.v1.CreateWorkspaceRequest.labels:type_name -> openshell.v1.CreateWorkspaceRequest.LabelsEntry - 323, // 322: openshell.v1.CreateWorkspaceResponse.workspace:type_name -> openshell.datamodel.v1.Workspace - 323, // 323: openshell.v1.GetWorkspaceResponse.workspace:type_name -> openshell.datamodel.v1.Workspace - 323, // 324: openshell.v1.ListWorkspacesResponse.workspaces:type_name -> openshell.datamodel.v1.Workspace - 18, // 325: openshell.v1.DeleteWorkspaceResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 309, // 326: openshell.v1.WorkspaceMember.metadata:type_name -> openshell.datamodel.v1.ObjectMeta - 15, // 327: openshell.v1.WorkspaceMember.role:type_name -> openshell.v1.WorkspaceRole - 313, // 328: openshell.v1.AddWorkspaceMemberRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 15, // 329: openshell.v1.AddWorkspaceMemberRequest.role:type_name -> openshell.v1.WorkspaceRole - 256, // 330: openshell.v1.AddWorkspaceMemberResponse.member:type_name -> openshell.v1.WorkspaceMember - 313, // 331: openshell.v1.RemoveWorkspaceMemberRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 18, // 332: openshell.v1.RemoveWorkspaceMemberResponse.outcome:type_name -> openshell.v1.DeletionOutcome - 313, // 333: openshell.v1.ListWorkspaceMembersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 256, // 334: openshell.v1.ListWorkspaceMembersResponse.members:type_name -> openshell.v1.WorkspaceMember - 308, // 335: openshell.v1.ExtensionServiceCredential.expiration_time:type_name -> google.protobuf.Timestamp - 19, // 336: openshell.v1.EndpointObservation.result:type_name -> openshell.v1.EndpointResult - 272, // 337: openshell.v1.EndpointObservation.failure:type_name -> openshell.v1.EndpointFailure - 264, // 338: openshell.v1.ReportEndpointStatusRequest.observations:type_name -> openshell.v1.EndpointObservation - 266, // 339: openshell.v1.ReportEndpointStatusRequest.token_grant_status:type_name -> openshell.v1.TokenGrantStatus - 267, // 340: openshell.v1.TokenGrantStatus.last_failure:type_name -> openshell.v1.TokenGrantFailureObservation - 272, // 341: openshell.v1.TokenGrantFailureObservation.failure:type_name -> openshell.v1.EndpointFailure - 19, // 342: openshell.v1.EndpointStatus.last_result:type_name -> openshell.v1.EndpointResult - 308, // 343: openshell.v1.EndpointStatus.last_reported_time:type_name -> google.protobuf.Timestamp - 272, // 344: openshell.v1.EndpointStatus.last_failure:type_name -> openshell.v1.EndpointFailure - 308, // 345: openshell.v1.SandboxProvisioning.configuration_change_time:type_name -> google.protobuf.Timestamp - 308, // 346: openshell.v1.SandboxProvisioning.first_rejection_time:type_name -> google.protobuf.Timestamp - 308, // 347: openshell.v1.SandboxProvisioning.deadline:type_name -> google.protobuf.Timestamp - 308, // 348: openshell.v1.SandboxProvisioning.timeout_time:type_name -> google.protobuf.Timestamp - 308, // 349: openshell.v1.SandboxProvisioning.cleanup_completed_time:type_name -> google.protobuf.Timestamp - 308, // 350: openshell.v1.SandboxProvisioning.cleanup_retry_time:type_name -> google.protobuf.Timestamp - 308, // 351: openshell.v1.SandboxProvisioning.attachment_change_time:type_name -> google.protobuf.Timestamp - 308, // 352: openshell.v1.SandboxProvisioning.preparation_deadline:type_name -> google.protobuf.Timestamp - 308, // 353: openshell.v1.SandboxProvisioning.admission_start_time:type_name -> google.protobuf.Timestamp - 20, // 354: openshell.v1.SandboxServiceExposure.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode - 21, // 355: openshell.v1.EndpointFailure.domain:type_name -> openshell.v1.EndpointFailureDomain - 16, // 356: openshell.v1.EndpointFailure.recovery_action:type_name -> openshell.v1.ProviderCredentialRefreshRecoveryAction - 312, // 357: openshell.v1.ServiceRouteLease.duration:type_name -> google.protobuf.Duration - 308, // 358: openshell.v1.ServiceRouteLease.expires_at:type_name -> google.protobuf.Timestamp - 324, // 359: openshell.v1.SupervisorServiceAdvertisement.routes:type_name -> openshell.sandbox.v1.SandboxServiceRoute - 313, // 360: openshell.v1.GetServiceRouteSnapshotRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 279, // 361: openshell.v1.GetServiceRouteSnapshotResponse.snapshot:type_name -> openshell.v1.ServiceRouteSnapshot - 313, // 362: openshell.v1.WatchServiceRoutesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector - 279, // 363: openshell.v1.WatchServiceRoutesResponse.snapshot:type_name -> openshell.v1.ServiceRouteSnapshot - 281, // 364: openshell.v1.ServiceRouteSnapshot.routes:type_name -> openshell.v1.DiscoveredServiceRoute - 280, // 365: openshell.v1.DiscoveredServiceRoute.endpoint:type_name -> openshell.v1.ServiceRouteEndpoint - 308, // 366: openshell.v1.DiscoveredServiceRoute.expires_at:type_name -> google.protobuf.Timestamp - 120, // 367: openshell.v1.GetProviderCredentialsResponse.CredentialsEntry.value:type_name -> openshell.v1.ProviderCredentialValue - 308, // 368: openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry.value:type_name -> google.protobuf.Timestamp - 308, // 369: openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry.value:type_name -> google.protobuf.Timestamp - 134, // 370: openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry.value:type_name -> openshell.v1.ProviderProfileCredential - 163, // 371: openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry.value:type_name -> openshell.v1.StaticCredentialBinding - 134, // 372: openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry.value:type_name -> openshell.v1.ProviderProfileCredential - 26, // 373: openshell.v1.OpenShell.Health:input_type -> openshell.v1.HealthRequest - 28, // 374: openshell.v1.OpenShell.GetCurrentUser:input_type -> openshell.v1.GetCurrentUserRequest - 30, // 375: openshell.v1.OpenShell.GetGatewayInfo:input_type -> openshell.v1.GetGatewayInfoRequest - 54, // 376: openshell.v1.OpenShell.CreateSandbox:input_type -> openshell.v1.CreateSandboxRequest - 62, // 377: openshell.v1.OpenShell.BeginRootfsTarStaging:input_type -> openshell.v1.BeginRootfsTarStagingRequest - 64, // 378: openshell.v1.OpenShell.GetSandbox:input_type -> openshell.v1.GetSandboxRequest - 65, // 379: openshell.v1.OpenShell.ListSandboxes:input_type -> openshell.v1.ListSandboxesRequest - 55, // 380: openshell.v1.OpenShell.CreateSandboxTemplate:input_type -> openshell.v1.CreateSandboxTemplateRequest - 56, // 381: openshell.v1.OpenShell.GetSandboxTemplate:input_type -> openshell.v1.GetSandboxTemplateRequest - 57, // 382: openshell.v1.OpenShell.ListSandboxTemplates:input_type -> openshell.v1.ListSandboxTemplatesRequest - 58, // 383: openshell.v1.OpenShell.DeleteSandboxTemplate:input_type -> openshell.v1.DeleteSandboxTemplateRequest - 66, // 384: openshell.v1.OpenShell.ListSandboxProviders:input_type -> openshell.v1.ListSandboxProvidersRequest - 67, // 385: openshell.v1.OpenShell.AttachSandboxProvider:input_type -> openshell.v1.AttachSandboxProviderRequest - 68, // 386: openshell.v1.OpenShell.DetachSandboxProvider:input_type -> openshell.v1.DetachSandboxProviderRequest - 86, // 387: openshell.v1.OpenShell.GetSandboxProviderStatus:input_type -> openshell.v1.GetSandboxProviderStatusRequest - 69, // 388: openshell.v1.OpenShell.DeleteSandbox:input_type -> openshell.v1.DeleteSandboxRequest - 70, // 389: openshell.v1.OpenShell.StopSandbox:input_type -> openshell.v1.StopSandboxRequest - 71, // 390: openshell.v1.OpenShell.StartSandbox:input_type -> openshell.v1.StartSandboxRequest - 72, // 391: openshell.v1.OpenShell.SuspendSandbox:input_type -> openshell.v1.SuspendSandboxRequest - 73, // 392: openshell.v1.OpenShell.ResumeSandbox:input_type -> openshell.v1.ResumeSandboxRequest - 91, // 393: openshell.v1.OpenShell.CreateSshSession:input_type -> openshell.v1.CreateSshSessionRequest - 93, // 394: openshell.v1.OpenShell.ExposeService:input_type -> openshell.v1.ExposeServiceRequest - 94, // 395: openshell.v1.OpenShell.GetService:input_type -> openshell.v1.GetServiceRequest - 95, // 396: openshell.v1.OpenShell.ListServices:input_type -> openshell.v1.ListServicesRequest - 275, // 397: openshell.v1.OpenShell.GetServiceRouteSnapshot:input_type -> openshell.v1.GetServiceRouteSnapshotRequest - 277, // 398: openshell.v1.OpenShell.WatchServiceRoutes:input_type -> openshell.v1.WatchServiceRoutesRequest - 97, // 399: openshell.v1.OpenShell.DeleteService:input_type -> openshell.v1.DeleteServiceRequest - 101, // 400: openshell.v1.OpenShell.RevokeSshSession:input_type -> openshell.v1.RevokeSshSessionRequest - 103, // 401: openshell.v1.OpenShell.ExecSandbox:input_type -> openshell.v1.ExecSandboxRequest - 109, // 402: openshell.v1.OpenShell.ForwardTcp:input_type -> openshell.v1.TcpForwardFrame - 110, // 403: openshell.v1.OpenShell.ExecSandboxInteractive:input_type -> openshell.v1.ExecSandboxInput - 117, // 404: openshell.v1.OpenShell.CreateProvider:input_type -> openshell.v1.CreateProviderRequest - 118, // 405: openshell.v1.OpenShell.GetProvider:input_type -> openshell.v1.GetProviderRequest - 119, // 406: openshell.v1.OpenShell.GetProviderCredentials:input_type -> openshell.v1.GetProviderCredentialsRequest - 122, // 407: openshell.v1.OpenShell.ListProviders:input_type -> openshell.v1.ListProvidersRequest - 127, // 408: openshell.v1.OpenShell.ListProviderProfiles:input_type -> openshell.v1.ListProviderProfilesRequest - 128, // 409: openshell.v1.OpenShell.GetProviderProfile:input_type -> openshell.v1.GetProviderProfileRequest - 152, // 410: openshell.v1.OpenShell.ImportProviderProfiles:input_type -> openshell.v1.ImportProviderProfilesRequest - 154, // 411: openshell.v1.OpenShell.UpdateProviderProfiles:input_type -> openshell.v1.UpdateProviderProfilesRequest - 156, // 412: openshell.v1.OpenShell.LintProviderProfiles:input_type -> openshell.v1.LintProviderProfilesRequest - 123, // 413: openshell.v1.OpenShell.UpdateProvider:input_type -> openshell.v1.UpdateProviderRequest - 140, // 414: openshell.v1.OpenShell.GetProviderRefreshStatus:input_type -> openshell.v1.GetProviderRefreshStatusRequest - 142, // 415: openshell.v1.OpenShell.ConfigureProviderRefresh:input_type -> openshell.v1.ConfigureProviderRefreshRequest - 144, // 416: openshell.v1.OpenShell.RotateProviderCredential:input_type -> openshell.v1.RotateProviderCredentialRequest - 146, // 417: openshell.v1.OpenShell.DeleteProviderRefresh:input_type -> openshell.v1.DeleteProviderRefreshRequest - 124, // 418: openshell.v1.OpenShell.DeleteProvider:input_type -> openshell.v1.DeleteProviderRequest - 159, // 419: openshell.v1.OpenShell.DeleteProviderProfile:input_type -> openshell.v1.DeleteProviderProfileRequest - 325, // 420: openshell.v1.OpenShell.GetSandboxConfig:input_type -> openshell.sandbox.v1.GetSandboxConfigRequest - 326, // 421: openshell.v1.OpenShell.GetGatewayConfig:input_type -> openshell.sandbox.v1.GetGatewayConfigRequest - 169, // 422: openshell.v1.OpenShell.UpdateConfig:input_type -> openshell.v1.UpdateConfigRequest - 179, // 423: openshell.v1.OpenShell.GetSandboxPolicyStatus:input_type -> openshell.v1.GetSandboxPolicyStatusRequest - 181, // 424: openshell.v1.OpenShell.ListSandboxPolicies:input_type -> openshell.v1.ListSandboxPoliciesRequest - 183, // 425: openshell.v1.OpenShell.ReportPolicyStatus:input_type -> openshell.v1.ReportPolicyStatusRequest - 265, // 426: openshell.v1.OpenShell.ReportEndpointStatus:input_type -> openshell.v1.ReportEndpointStatusRequest - 88, // 427: openshell.v1.OpenShell.ReportProviderReadiness:input_type -> openshell.v1.ReportProviderReadinessRequest - 186, // 428: openshell.v1.OpenShell.ReportSandboxConfiguration:input_type -> openshell.v1.ReportSandboxConfigurationRequest - 161, // 429: openshell.v1.OpenShell.GetSandboxProviderEnvironment:input_type -> openshell.v1.GetSandboxProviderEnvironmentRequest - 167, // 430: openshell.v1.OpenShell.ExchangeProviderSubjectToken:input_type -> openshell.v1.ExchangeProviderSubjectTokenRequest - 189, // 431: openshell.v1.OpenShell.GetSandboxLogs:input_type -> openshell.v1.GetSandboxLogsRequest - 190, // 432: openshell.v1.OpenShell.PushSandboxLogs:input_type -> openshell.v1.PushSandboxLogsRequest - 193, // 433: openshell.v1.OpenShell.ConnectSupervisor:input_type -> openshell.v1.SupervisorMessage - 205, // 434: openshell.v1.OpenShell.ReportMainProcessExit:input_type -> openshell.v1.ReportMainProcessExitRequest - 207, // 435: openshell.v1.OpenShell.FinalizeMainProcessExit:input_type -> openshell.v1.FinalizeMainProcessExitRequest - 213, // 436: openshell.v1.OpenShell.RelayStream:input_type -> openshell.v1.RelayFrame - 215, // 437: openshell.v1.OpenShell.PeerRelay:input_type -> openshell.v1.PeerRelayFrame - 88, // 438: openshell.v1.OpenShell.PeerReportProviderReadiness:input_type -> openshell.v1.ReportProviderReadinessRequest - 265, // 439: openshell.v1.OpenShell.PeerReportEndpointStatus:input_type -> openshell.v1.ReportEndpointStatusRequest - 86, // 440: openshell.v1.OpenShell.PeerGetSandboxProviderStatus:input_type -> openshell.v1.GetSandboxProviderStatusRequest - 218, // 441: openshell.v1.OpenShell.PeerNotifyConfigUpdate:input_type -> openshell.v1.PeerNotifyConfigUpdateRequest - 113, // 442: openshell.v1.OpenShell.WatchSandbox:input_type -> openshell.v1.WatchSandboxRequest - 228, // 443: openshell.v1.OpenShell.SubmitPolicyAnalysis:input_type -> openshell.v1.SubmitPolicyAnalysisRequest - 230, // 444: openshell.v1.OpenShell.GetDraftPolicy:input_type -> openshell.v1.GetDraftPolicyRequest - 232, // 445: openshell.v1.OpenShell.ApproveDraftChunk:input_type -> openshell.v1.ApproveDraftChunkRequest - 234, // 446: openshell.v1.OpenShell.RejectDraftChunk:input_type -> openshell.v1.RejectDraftChunkRequest - 237, // 447: openshell.v1.OpenShell.ApproveAllDraftChunks:input_type -> openshell.v1.ApproveAllDraftChunksRequest - 239, // 448: openshell.v1.OpenShell.EditDraftChunk:input_type -> openshell.v1.EditDraftChunkRequest - 241, // 449: openshell.v1.OpenShell.UndoDraftChunk:input_type -> openshell.v1.UndoDraftChunkRequest - 243, // 450: openshell.v1.OpenShell.ClearDraftChunks:input_type -> openshell.v1.ClearDraftChunksRequest - 245, // 451: openshell.v1.OpenShell.GetDraftHistory:input_type -> openshell.v1.GetDraftHistoryRequest - 22, // 452: openshell.v1.OpenShell.IssueSandboxToken:input_type -> openshell.v1.IssueSandboxTokenRequest - 24, // 453: openshell.v1.OpenShell.RefreshSandboxToken:input_type -> openshell.v1.RefreshSandboxTokenRequest - 248, // 454: openshell.v1.OpenShell.CreateWorkspace:input_type -> openshell.v1.CreateWorkspaceRequest - 250, // 455: openshell.v1.OpenShell.GetWorkspace:input_type -> openshell.v1.GetWorkspaceRequest - 252, // 456: openshell.v1.OpenShell.ListWorkspaces:input_type -> openshell.v1.ListWorkspacesRequest - 254, // 457: openshell.v1.OpenShell.DeleteWorkspace:input_type -> openshell.v1.DeleteWorkspaceRequest - 257, // 458: openshell.v1.OpenShell.AddWorkspaceMember:input_type -> openshell.v1.AddWorkspaceMemberRequest - 259, // 459: openshell.v1.OpenShell.RemoveWorkspaceMember:input_type -> openshell.v1.RemoveWorkspaceMemberRequest - 261, // 460: openshell.v1.OpenShell.ListWorkspaceMembers:input_type -> openshell.v1.ListWorkspaceMembersRequest - 27, // 461: openshell.v1.OpenShell.Health:output_type -> openshell.v1.HealthResponse - 29, // 462: openshell.v1.OpenShell.GetCurrentUser:output_type -> openshell.v1.GetCurrentUserResponse - 31, // 463: openshell.v1.OpenShell.GetGatewayInfo:output_type -> openshell.v1.GetGatewayInfoResponse - 74, // 464: openshell.v1.OpenShell.CreateSandbox:output_type -> openshell.v1.SandboxResponse - 63, // 465: openshell.v1.OpenShell.BeginRootfsTarStaging:output_type -> openshell.v1.BeginRootfsTarStagingResponse - 74, // 466: openshell.v1.OpenShell.GetSandbox:output_type -> openshell.v1.SandboxResponse - 75, // 467: openshell.v1.OpenShell.ListSandboxes:output_type -> openshell.v1.ListSandboxesResponse - 59, // 468: openshell.v1.OpenShell.CreateSandboxTemplate:output_type -> openshell.v1.SandboxTemplateResponse - 59, // 469: openshell.v1.OpenShell.GetSandboxTemplate:output_type -> openshell.v1.SandboxTemplateResponse - 60, // 470: openshell.v1.OpenShell.ListSandboxTemplates:output_type -> openshell.v1.ListSandboxTemplatesResponse - 61, // 471: openshell.v1.OpenShell.DeleteSandboxTemplate:output_type -> openshell.v1.DeleteSandboxTemplateResponse - 76, // 472: openshell.v1.OpenShell.ListSandboxProviders:output_type -> openshell.v1.ListSandboxProvidersResponse - 77, // 473: openshell.v1.OpenShell.AttachSandboxProvider:output_type -> openshell.v1.AttachSandboxProviderResponse - 78, // 474: openshell.v1.OpenShell.DetachSandboxProvider:output_type -> openshell.v1.DetachSandboxProviderResponse - 87, // 475: openshell.v1.OpenShell.GetSandboxProviderStatus:output_type -> openshell.v1.GetSandboxProviderStatusResponse - 90, // 476: openshell.v1.OpenShell.DeleteSandbox:output_type -> openshell.v1.DeleteSandboxResponse - 74, // 477: openshell.v1.OpenShell.StopSandbox:output_type -> openshell.v1.SandboxResponse - 74, // 478: openshell.v1.OpenShell.StartSandbox:output_type -> openshell.v1.SandboxResponse - 74, // 479: openshell.v1.OpenShell.SuspendSandbox:output_type -> openshell.v1.SandboxResponse - 74, // 480: openshell.v1.OpenShell.ResumeSandbox:output_type -> openshell.v1.SandboxResponse - 92, // 481: openshell.v1.OpenShell.CreateSshSession:output_type -> openshell.v1.CreateSshSessionResponse - 100, // 482: openshell.v1.OpenShell.ExposeService:output_type -> openshell.v1.ServiceEndpointResponse - 100, // 483: openshell.v1.OpenShell.GetService:output_type -> openshell.v1.ServiceEndpointResponse - 96, // 484: openshell.v1.OpenShell.ListServices:output_type -> openshell.v1.ListServicesResponse - 276, // 485: openshell.v1.OpenShell.GetServiceRouteSnapshot:output_type -> openshell.v1.GetServiceRouteSnapshotResponse - 278, // 486: openshell.v1.OpenShell.WatchServiceRoutes:output_type -> openshell.v1.WatchServiceRoutesResponse - 98, // 487: openshell.v1.OpenShell.DeleteService:output_type -> openshell.v1.DeleteServiceResponse - 102, // 488: openshell.v1.OpenShell.RevokeSshSession:output_type -> openshell.v1.RevokeSshSessionResponse - 107, // 489: openshell.v1.OpenShell.ExecSandbox:output_type -> openshell.v1.ExecSandboxEvent - 109, // 490: openshell.v1.OpenShell.ForwardTcp:output_type -> openshell.v1.TcpForwardFrame - 107, // 491: openshell.v1.OpenShell.ExecSandboxInteractive:output_type -> openshell.v1.ExecSandboxEvent - 125, // 492: openshell.v1.OpenShell.CreateProvider:output_type -> openshell.v1.ProviderResponse - 125, // 493: openshell.v1.OpenShell.GetProvider:output_type -> openshell.v1.ProviderResponse - 121, // 494: openshell.v1.OpenShell.GetProviderCredentials:output_type -> openshell.v1.GetProviderCredentialsResponse - 126, // 495: openshell.v1.OpenShell.ListProviders:output_type -> openshell.v1.ListProvidersResponse - 151, // 496: openshell.v1.OpenShell.ListProviderProfiles:output_type -> openshell.v1.ListProviderProfilesResponse - 150, // 497: openshell.v1.OpenShell.GetProviderProfile:output_type -> openshell.v1.ProviderProfileResponse - 153, // 498: openshell.v1.OpenShell.ImportProviderProfiles:output_type -> openshell.v1.ImportProviderProfilesResponse - 155, // 499: openshell.v1.OpenShell.UpdateProviderProfiles:output_type -> openshell.v1.UpdateProviderProfilesResponse - 157, // 500: openshell.v1.OpenShell.LintProviderProfiles:output_type -> openshell.v1.LintProviderProfilesResponse - 125, // 501: openshell.v1.OpenShell.UpdateProvider:output_type -> openshell.v1.ProviderResponse - 141, // 502: openshell.v1.OpenShell.GetProviderRefreshStatus:output_type -> openshell.v1.GetProviderRefreshStatusResponse - 143, // 503: openshell.v1.OpenShell.ConfigureProviderRefresh:output_type -> openshell.v1.ConfigureProviderRefreshResponse - 145, // 504: openshell.v1.OpenShell.RotateProviderCredential:output_type -> openshell.v1.RotateProviderCredentialResponse - 147, // 505: openshell.v1.OpenShell.DeleteProviderRefresh:output_type -> openshell.v1.DeleteProviderRefreshResponse - 158, // 506: openshell.v1.OpenShell.DeleteProvider:output_type -> openshell.v1.DeleteProviderResponse - 160, // 507: openshell.v1.OpenShell.DeleteProviderProfile:output_type -> openshell.v1.DeleteProviderProfileResponse - 327, // 508: openshell.v1.OpenShell.GetSandboxConfig:output_type -> openshell.sandbox.v1.GetSandboxConfigResponse - 328, // 509: openshell.v1.OpenShell.GetGatewayConfig:output_type -> openshell.sandbox.v1.GetGatewayConfigResponse - 178, // 510: openshell.v1.OpenShell.UpdateConfig:output_type -> openshell.v1.UpdateConfigResponse - 180, // 511: openshell.v1.OpenShell.GetSandboxPolicyStatus:output_type -> openshell.v1.GetSandboxPolicyStatusResponse - 182, // 512: openshell.v1.OpenShell.ListSandboxPolicies:output_type -> openshell.v1.ListSandboxPoliciesResponse - 184, // 513: openshell.v1.OpenShell.ReportPolicyStatus:output_type -> openshell.v1.ReportPolicyStatusResponse - 268, // 514: openshell.v1.OpenShell.ReportEndpointStatus:output_type -> openshell.v1.ReportEndpointStatusResponse - 89, // 515: openshell.v1.OpenShell.ReportProviderReadiness:output_type -> openshell.v1.ReportProviderReadinessResponse - 187, // 516: openshell.v1.OpenShell.ReportSandboxConfiguration:output_type -> openshell.v1.ReportSandboxConfigurationResponse - 164, // 517: openshell.v1.OpenShell.GetSandboxProviderEnvironment:output_type -> openshell.v1.GetSandboxProviderEnvironmentResponse - 168, // 518: openshell.v1.OpenShell.ExchangeProviderSubjectToken:output_type -> openshell.v1.ExchangeProviderSubjectTokenResponse - 192, // 519: openshell.v1.OpenShell.GetSandboxLogs:output_type -> openshell.v1.GetSandboxLogsResponse - 191, // 520: openshell.v1.OpenShell.PushSandboxLogs:output_type -> openshell.v1.PushSandboxLogsResponse - 194, // 521: openshell.v1.OpenShell.ConnectSupervisor:output_type -> openshell.v1.GatewayMessage - 206, // 522: openshell.v1.OpenShell.ReportMainProcessExit:output_type -> openshell.v1.ReportMainProcessExitResponse - 208, // 523: openshell.v1.OpenShell.FinalizeMainProcessExit:output_type -> openshell.v1.FinalizeMainProcessExitResponse - 213, // 524: openshell.v1.OpenShell.RelayStream:output_type -> openshell.v1.RelayFrame - 215, // 525: openshell.v1.OpenShell.PeerRelay:output_type -> openshell.v1.PeerRelayFrame - 89, // 526: openshell.v1.OpenShell.PeerReportProviderReadiness:output_type -> openshell.v1.ReportProviderReadinessResponse - 268, // 527: openshell.v1.OpenShell.PeerReportEndpointStatus:output_type -> openshell.v1.ReportEndpointStatusResponse - 87, // 528: openshell.v1.OpenShell.PeerGetSandboxProviderStatus:output_type -> openshell.v1.GetSandboxProviderStatusResponse - 219, // 529: openshell.v1.OpenShell.PeerNotifyConfigUpdate:output_type -> openshell.v1.PeerNotifyConfigUpdateResponse - 114, // 530: openshell.v1.OpenShell.WatchSandbox:output_type -> openshell.v1.SandboxStreamEvent - 229, // 531: openshell.v1.OpenShell.SubmitPolicyAnalysis:output_type -> openshell.v1.SubmitPolicyAnalysisResponse - 231, // 532: openshell.v1.OpenShell.GetDraftPolicy:output_type -> openshell.v1.GetDraftPolicyResponse - 233, // 533: openshell.v1.OpenShell.ApproveDraftChunk:output_type -> openshell.v1.ApproveDraftChunkResponse - 235, // 534: openshell.v1.OpenShell.RejectDraftChunk:output_type -> openshell.v1.RejectDraftChunkResponse - 238, // 535: openshell.v1.OpenShell.ApproveAllDraftChunks:output_type -> openshell.v1.ApproveAllDraftChunksResponse - 240, // 536: openshell.v1.OpenShell.EditDraftChunk:output_type -> openshell.v1.EditDraftChunkResponse - 242, // 537: openshell.v1.OpenShell.UndoDraftChunk:output_type -> openshell.v1.UndoDraftChunkResponse - 244, // 538: openshell.v1.OpenShell.ClearDraftChunks:output_type -> openshell.v1.ClearDraftChunksResponse - 247, // 539: openshell.v1.OpenShell.GetDraftHistory:output_type -> openshell.v1.GetDraftHistoryResponse - 23, // 540: openshell.v1.OpenShell.IssueSandboxToken:output_type -> openshell.v1.IssueSandboxTokenResponse - 25, // 541: openshell.v1.OpenShell.RefreshSandboxToken:output_type -> openshell.v1.RefreshSandboxTokenResponse - 249, // 542: openshell.v1.OpenShell.CreateWorkspace:output_type -> openshell.v1.CreateWorkspaceResponse - 251, // 543: openshell.v1.OpenShell.GetWorkspace:output_type -> openshell.v1.GetWorkspaceResponse - 253, // 544: openshell.v1.OpenShell.ListWorkspaces:output_type -> openshell.v1.ListWorkspacesResponse - 255, // 545: openshell.v1.OpenShell.DeleteWorkspace:output_type -> openshell.v1.DeleteWorkspaceResponse - 258, // 546: openshell.v1.OpenShell.AddWorkspaceMember:output_type -> openshell.v1.AddWorkspaceMemberResponse - 260, // 547: openshell.v1.OpenShell.RemoveWorkspaceMember:output_type -> openshell.v1.RemoveWorkspaceMemberResponse - 262, // 548: openshell.v1.OpenShell.ListWorkspaceMembers:output_type -> openshell.v1.ListWorkspaceMembersResponse - 461, // [461:549] is the sub-list for method output_type - 373, // [373:461] is the sub-list for method input_type - 373, // [373:373] is the sub-list for extension type_name - 373, // [373:373] is the sub-list for extension extendee - 0, // [0:373] is the sub-list for field type_name + 291, // 77: openshell.v1.SandboxResponse.application_service_urls:type_name -> openshell.v1.SandboxResponse.ApplicationServiceUrlsEntry + 292, // 78: openshell.v1.SandboxResponse.gateway_service_urls:type_name -> openshell.v1.SandboxResponse.GatewayServiceUrlsEntry + 39, // 79: openshell.v1.ListSandboxesResponse.sandboxes:type_name -> openshell.v1.Sandbox + 316, // 80: openshell.v1.ListSandboxProvidersResponse.providers:type_name -> openshell.datamodel.v1.Provider + 39, // 81: openshell.v1.AttachSandboxProviderResponse.sandbox:type_name -> openshell.v1.Sandbox + 83, // 82: openshell.v1.AttachSandboxProviderResponse.receipt:type_name -> openshell.v1.ProviderMutationReceipt + 39, // 83: openshell.v1.DetachSandboxProviderResponse.sandbox:type_name -> openshell.v1.Sandbox + 83, // 84: openshell.v1.DetachSandboxProviderResponse.receipt:type_name -> openshell.v1.ProviderMutationReceipt + 81, // 85: openshell.v1.ConfigSnapshotRevision.sandbox_config:type_name -> openshell.v1.SandboxConfigRevision + 79, // 86: openshell.v1.ConfigSnapshotRevision.provider_target:type_name -> openshell.v1.ProviderDesiredIdentity + 317, // 87: openshell.v1.SandboxConfigRevision.policy_source:type_name -> openshell.sandbox.v1.PolicySource + 5, // 88: openshell.v1.ConfigUpdateOperation.component:type_name -> openshell.v1.ConfigComponent + 80, // 89: openshell.v1.ConfigUpdateOperation.target_revision:type_name -> openshell.v1.ConfigSnapshotRevision + 7, // 90: openshell.v1.ConfigUpdateOperation.state:type_name -> openshell.v1.ConfigUpdateOperationState + 6, // 91: openshell.v1.ConfigUpdateOperation.outcome:type_name -> openshell.v1.ConfigApplyOutcome + 310, // 92: openshell.v1.ConfigUpdateOperation.created_time:type_name -> google.protobuf.Timestamp + 310, // 93: openshell.v1.ConfigUpdateOperation.updated_time:type_name -> google.protobuf.Timestamp + 310, // 94: openshell.v1.ConfigUpdateOperation.completed_time:type_name -> google.protobuf.Timestamp + 2, // 95: openshell.v1.ProviderMutationReceipt.kind:type_name -> openshell.v1.ProviderMutationKind + 79, // 96: openshell.v1.ProviderMutationReceipt.desired:type_name -> openshell.v1.ProviderDesiredIdentity + 310, // 97: openshell.v1.ProviderMutationReceipt.persisted_time:type_name -> google.protobuf.Timestamp + 4, // 98: openshell.v1.ProviderReadinessObservation.reason:type_name -> openshell.v1.ProviderReadinessReason + 83, // 99: openshell.v1.ProviderReadinessStatus.receipt:type_name -> openshell.v1.ProviderMutationReceipt + 3, // 100: openshell.v1.ProviderReadinessStatus.state:type_name -> openshell.v1.ProviderReadinessState + 4, // 101: openshell.v1.ProviderReadinessStatus.reason:type_name -> openshell.v1.ProviderReadinessReason + 84, // 102: openshell.v1.ProviderReadinessStatus.observed:type_name -> openshell.v1.ProviderReadinessObservation + 310, // 103: openshell.v1.ProviderReadinessStatus.observed_time:type_name -> google.protobuf.Timestamp + 310, // 104: openshell.v1.ProviderReadinessStatus.evaluated_time:type_name -> google.protobuf.Timestamp + 82, // 105: openshell.v1.ProviderReadinessStatus.operation:type_name -> openshell.v1.ConfigUpdateOperation + 315, // 106: openshell.v1.GetSandboxProviderStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 85, // 107: openshell.v1.GetSandboxProviderStatusResponse.status:type_name -> openshell.v1.ProviderReadinessStatus + 84, // 108: openshell.v1.ReportProviderReadinessRequest.observation:type_name -> openshell.v1.ProviderReadinessObservation + 314, // 109: openshell.v1.ReportProviderReadinessResponse.report_interval:type_name -> google.protobuf.Duration + 314, // 110: openshell.v1.ReportProviderReadinessResponse.observation_ttl:type_name -> google.protobuf.Duration + 18, // 111: openshell.v1.DeleteSandboxResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 315, // 112: openshell.v1.CreateSshSessionRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 310, // 113: openshell.v1.CreateSshSessionResponse.expiration_time:type_name -> google.protobuf.Timestamp + 315, // 114: openshell.v1.ExposeServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 20, // 115: openshell.v1.ExposeServiceRequest.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode + 315, // 116: openshell.v1.GetServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 117: openshell.v1.ListServicesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 100, // 118: openshell.v1.ListServicesResponse.services:type_name -> openshell.v1.ServiceEndpointResponse + 315, // 119: openshell.v1.DeleteServiceRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 18, // 120: openshell.v1.DeleteServiceResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 311, // 121: openshell.v1.ServiceEndpoint.metadata:type_name -> openshell.datamodel.v1.ObjectMeta + 20, // 122: openshell.v1.ServiceEndpoint.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode + 99, // 123: openshell.v1.ServiceEndpointResponse.endpoint:type_name -> openshell.v1.ServiceEndpoint + 18, // 124: openshell.v1.RevokeSshSessionResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 315, // 125: openshell.v1.ExecSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 293, // 126: openshell.v1.ExecSandboxRequest.environment:type_name -> openshell.v1.ExecSandboxRequest.EnvironmentEntry + 314, // 127: openshell.v1.ExecSandboxRequest.execution_timeout:type_name -> google.protobuf.Duration + 104, // 128: openshell.v1.ExecSandboxEvent.stdout:type_name -> openshell.v1.ExecSandboxStdout + 105, // 129: openshell.v1.ExecSandboxEvent.stderr:type_name -> openshell.v1.ExecSandboxStderr + 106, // 130: openshell.v1.ExecSandboxEvent.exit:type_name -> openshell.v1.ExecSandboxExit + 210, // 131: openshell.v1.TcpForwardInit.ssh:type_name -> openshell.v1.SshRelayTarget + 211, // 132: openshell.v1.TcpForwardInit.tcp:type_name -> openshell.v1.TcpRelayTarget + 108, // 133: openshell.v1.TcpForwardFrame.init:type_name -> openshell.v1.TcpForwardInit + 103, // 134: openshell.v1.ExecSandboxInput.start:type_name -> openshell.v1.ExecSandboxRequest + 111, // 135: openshell.v1.ExecSandboxInput.resize:type_name -> openshell.v1.ExecSandboxWindowResize + 311, // 136: openshell.v1.SshSession.metadata:type_name -> openshell.datamodel.v1.ObjectMeta + 310, // 137: openshell.v1.SshSession.expiration_time:type_name -> google.protobuf.Timestamp + 315, // 138: openshell.v1.WatchSandboxRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 310, // 139: openshell.v1.WatchSandboxRequest.since_time:type_name -> google.protobuf.Timestamp + 39, // 140: openshell.v1.SandboxStreamEvent.sandbox:type_name -> openshell.v1.Sandbox + 115, // 141: openshell.v1.SandboxStreamEvent.log:type_name -> openshell.v1.SandboxLogLine + 53, // 142: openshell.v1.SandboxStreamEvent.event:type_name -> openshell.v1.PlatformEvent + 116, // 143: openshell.v1.SandboxStreamEvent.warning:type_name -> openshell.v1.SandboxStreamWarning + 227, // 144: openshell.v1.SandboxStreamEvent.draft_policy_update:type_name -> openshell.v1.DraftPolicyUpdate + 310, // 145: openshell.v1.SandboxLogLine.event_time:type_name -> google.protobuf.Timestamp + 294, // 146: openshell.v1.SandboxLogLine.fields:type_name -> openshell.v1.SandboxLogLine.FieldsEntry + 315, // 147: openshell.v1.CreateProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 316, // 148: openshell.v1.CreateProviderRequest.provider:type_name -> openshell.datamodel.v1.Provider + 315, // 149: openshell.v1.GetProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 150: openshell.v1.GetProviderCredentialsRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 314, // 151: openshell.v1.GetProviderCredentialsRequest.minimum_remaining_lifetime:type_name -> google.protobuf.Duration + 310, // 152: openshell.v1.ProviderCredentialValue.expiration_time:type_name -> google.protobuf.Timestamp + 295, // 153: openshell.v1.GetProviderCredentialsResponse.credentials:type_name -> openshell.v1.GetProviderCredentialsResponse.CredentialsEntry + 315, // 154: openshell.v1.ListProvidersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 155: openshell.v1.UpdateProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 316, // 156: openshell.v1.UpdateProviderRequest.provider:type_name -> openshell.datamodel.v1.Provider + 296, // 157: openshell.v1.UpdateProviderRequest.credential_expiration_times:type_name -> openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry + 315, // 158: openshell.v1.DeleteProviderRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 316, // 159: openshell.v1.ProviderResponse.provider:type_name -> openshell.datamodel.v1.Provider + 83, // 160: openshell.v1.ProviderResponse.target_receipts:type_name -> openshell.v1.ProviderMutationReceipt + 316, // 161: openshell.v1.ListProvidersResponse.providers:type_name -> openshell.datamodel.v1.Provider + 315, // 162: openshell.v1.ListProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 163: openshell.v1.GetProviderProfileRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 148, // 164: openshell.v1.ProviderProfileImportItem.profile:type_name -> openshell.v1.ProviderProfile + 314, // 165: openshell.v1.ProviderCredentialTokenGrant.cache_ttl:type_name -> google.protobuf.Duration + 131, // 166: openshell.v1.ProviderCredentialTokenGrant.audience_overrides:type_name -> openshell.v1.ProviderCredentialTokenGrantAudienceOverride + 8, // 167: openshell.v1.ProviderCredentialTokenGrant.grant_type:type_name -> openshell.v1.ProviderCredentialTokenGrantType + 132, // 168: openshell.v1.ProviderCredentialTokenGrant.subject_token:type_name -> openshell.v1.ProviderCredentialTokenGrantSubjectToken + 137, // 169: openshell.v1.ProviderProfileCredential.refresh:type_name -> openshell.v1.ProviderCredentialRefresh + 133, // 170: openshell.v1.ProviderProfileCredential.token_grant:type_name -> openshell.v1.ProviderCredentialTokenGrant + 9, // 171: openshell.v1.ProviderCredentialRefresh.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy + 314, // 172: openshell.v1.ProviderCredentialRefresh.refresh_before:type_name -> google.protobuf.Duration + 314, // 173: openshell.v1.ProviderCredentialRefresh.max_lifetime:type_name -> google.protobuf.Duration + 135, // 174: openshell.v1.ProviderCredentialRefresh.material:type_name -> openshell.v1.ProviderCredentialRefreshMaterial + 136, // 175: openshell.v1.ProviderCredentialRefresh.additional_outputs:type_name -> openshell.v1.ProviderCredentialRefreshOutput + 9, // 176: openshell.v1.ProviderCredentialRefreshStatus.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy + 310, // 177: openshell.v1.ProviderCredentialRefreshStatus.expiration_time:type_name -> google.protobuf.Timestamp + 310, // 178: openshell.v1.ProviderCredentialRefreshStatus.next_refresh_time:type_name -> google.protobuf.Timestamp + 310, // 179: openshell.v1.ProviderCredentialRefreshStatus.last_refresh_time:type_name -> google.protobuf.Timestamp + 16, // 180: openshell.v1.ProviderCredentialRefreshStatus.recovery_action:type_name -> openshell.v1.ProviderCredentialRefreshRecoveryAction + 310, // 181: openshell.v1.ProviderCredentialRefreshStatus.last_error_time:type_name -> google.protobuf.Timestamp + 315, // 182: openshell.v1.GetProviderRefreshStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 138, // 183: openshell.v1.GetProviderRefreshStatusResponse.credentials:type_name -> openshell.v1.ProviderCredentialRefreshStatus + 315, // 184: openshell.v1.ConfigureProviderRefreshRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 9, // 185: openshell.v1.ConfigureProviderRefreshRequest.strategy:type_name -> openshell.v1.ProviderCredentialRefreshStrategy + 297, // 186: openshell.v1.ConfigureProviderRefreshRequest.material:type_name -> openshell.v1.ConfigureProviderRefreshRequest.MaterialEntry + 310, // 187: openshell.v1.ConfigureProviderRefreshRequest.expiration_time:type_name -> google.protobuf.Timestamp + 138, // 188: openshell.v1.ConfigureProviderRefreshResponse.status:type_name -> openshell.v1.ProviderCredentialRefreshStatus + 315, // 189: openshell.v1.RotateProviderCredentialRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 138, // 190: openshell.v1.RotateProviderCredentialResponse.status:type_name -> openshell.v1.ProviderCredentialRefreshStatus + 315, // 191: openshell.v1.DeleteProviderRefreshRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 18, // 192: openshell.v1.DeleteProviderRefreshResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 10, // 193: openshell.v1.ProviderProfile.category:type_name -> openshell.v1.ProviderProfileCategory + 134, // 194: openshell.v1.ProviderProfile.credentials:type_name -> openshell.v1.ProviderProfileCredential + 318, // 195: openshell.v1.ProviderProfile.endpoints:type_name -> openshell.sandbox.v1.NetworkEndpoint + 319, // 196: openshell.v1.ProviderProfile.binaries:type_name -> openshell.sandbox.v1.NetworkBinary + 139, // 197: openshell.v1.ProviderProfile.discovery:type_name -> openshell.v1.ProviderProfileDiscovery + 298, // 198: openshell.v1.ProviderProfile.annotations:type_name -> openshell.v1.ProviderProfile.AnnotationsEntry + 149, // 199: openshell.v1.ProviderProfile.files:type_name -> openshell.v1.ProviderProfileFile + 148, // 200: openshell.v1.ProviderProfileResponse.profile:type_name -> openshell.v1.ProviderProfile + 148, // 201: openshell.v1.ListProviderProfilesResponse.profiles:type_name -> openshell.v1.ProviderProfile + 315, // 202: openshell.v1.ImportProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 129, // 203: openshell.v1.ImportProviderProfilesRequest.profiles:type_name -> openshell.v1.ProviderProfileImportItem + 130, // 204: openshell.v1.ImportProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic + 148, // 205: openshell.v1.ImportProviderProfilesResponse.profiles:type_name -> openshell.v1.ProviderProfile + 315, // 206: openshell.v1.UpdateProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 129, // 207: openshell.v1.UpdateProviderProfilesRequest.profile:type_name -> openshell.v1.ProviderProfileImportItem + 130, // 208: openshell.v1.UpdateProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic + 148, // 209: openshell.v1.UpdateProviderProfilesResponse.profile:type_name -> openshell.v1.ProviderProfile + 315, // 210: openshell.v1.LintProviderProfilesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 129, // 211: openshell.v1.LintProviderProfilesRequest.profiles:type_name -> openshell.v1.ProviderProfileImportItem + 130, // 212: openshell.v1.LintProviderProfilesResponse.diagnostics:type_name -> openshell.v1.ProviderProfileDiagnostic + 18, // 213: openshell.v1.DeleteProviderResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 315, // 214: openshell.v1.DeleteProviderProfileRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 18, // 215: openshell.v1.DeleteProviderProfileResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 162, // 216: openshell.v1.StaticCredentialBinding.endpoints:type_name -> openshell.v1.StaticCredentialEndpointBinding + 299, // 217: openshell.v1.GetSandboxProviderEnvironmentResponse.environment:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.EnvironmentEntry + 300, // 218: openshell.v1.GetSandboxProviderEnvironmentResponse.credential_expiration_times:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry + 301, // 219: openshell.v1.GetSandboxProviderEnvironmentResponse.dynamic_credentials:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry + 302, // 220: openshell.v1.GetSandboxProviderEnvironmentResponse.static_credential_bindings:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry + 4, // 221: openshell.v1.GetSandboxProviderEnvironmentResponse.readiness_reason:type_name -> openshell.v1.ProviderReadinessReason + 303, // 222: openshell.v1.GetSandboxProviderEnvironmentResponse.files:type_name -> openshell.v1.GetSandboxProviderEnvironmentResponse.FilesEntry + 11, // 223: openshell.v1.ProviderEnvironmentValue.classification:type_name -> openshell.v1.ProviderEnvironmentValueClassification + 163, // 224: openshell.v1.ProviderEnvironmentValue.static_credential_binding:type_name -> openshell.v1.StaticCredentialBinding + 310, // 225: openshell.v1.ProviderEnvironmentValue.expiration_time:type_name -> google.protobuf.Timestamp + 165, // 226: openshell.v1.ProviderEnvironmentSnapshot.values:type_name -> openshell.v1.ProviderEnvironmentValue + 304, // 227: openshell.v1.ProviderEnvironmentSnapshot.dynamic_credentials:type_name -> openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry + 4, // 228: openshell.v1.ProviderEnvironmentSnapshot.readiness_reason:type_name -> openshell.v1.ProviderReadinessReason + 305, // 229: openshell.v1.ProviderEnvironmentSnapshot.files:type_name -> openshell.v1.ProviderEnvironmentSnapshot.FilesEntry + 314, // 230: openshell.v1.ExchangeProviderSubjectTokenResponse.expires_after:type_name -> google.protobuf.Duration + 315, // 231: openshell.v1.UpdateConfigRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 312, // 232: openshell.v1.UpdateConfigRequest.policy:type_name -> openshell.sandbox.v1.SandboxPolicy + 320, // 233: openshell.v1.UpdateConfigRequest.setting_value:type_name -> openshell.sandbox.v1.SettingValue + 170, // 234: openshell.v1.UpdateConfigRequest.merge_operations:type_name -> openshell.v1.PolicyMergeOperation + 306, // 235: openshell.v1.UpdateConfigRequest.annotations:type_name -> openshell.v1.UpdateConfigRequest.AnnotationsEntry + 171, // 236: openshell.v1.PolicyMergeOperation.add_rule:type_name -> openshell.v1.AddNetworkRule + 172, // 237: openshell.v1.PolicyMergeOperation.remove_endpoint:type_name -> openshell.v1.RemoveNetworkEndpoint + 173, // 238: openshell.v1.PolicyMergeOperation.remove_rule:type_name -> openshell.v1.RemoveNetworkRule + 175, // 239: openshell.v1.PolicyMergeOperation.add_deny_rules:type_name -> openshell.v1.AddDenyRules + 176, // 240: openshell.v1.PolicyMergeOperation.add_allow_rules:type_name -> openshell.v1.AddAllowRules + 177, // 241: openshell.v1.PolicyMergeOperation.remove_binary:type_name -> openshell.v1.RemoveNetworkBinary + 321, // 242: openshell.v1.AddNetworkRule.rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule + 319, // 243: openshell.v1.L7RuleTarget.binaries:type_name -> openshell.sandbox.v1.NetworkBinary + 322, // 244: openshell.v1.AddDenyRules.deny_rules:type_name -> openshell.sandbox.v1.L7DenyRule + 174, // 245: openshell.v1.AddDenyRules.target:type_name -> openshell.v1.L7RuleTarget + 323, // 246: openshell.v1.AddAllowRules.rules:type_name -> openshell.sandbox.v1.L7Rule + 174, // 247: openshell.v1.AddAllowRules.target:type_name -> openshell.v1.L7RuleTarget + 307, // 248: openshell.v1.UpdateConfigResponse.annotations:type_name -> openshell.v1.UpdateConfigResponse.AnnotationsEntry + 315, // 249: openshell.v1.GetSandboxPolicyStatusRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 188, // 250: openshell.v1.GetSandboxPolicyStatusResponse.revision:type_name -> openshell.v1.SandboxPolicyRevision + 315, // 251: openshell.v1.ListSandboxPoliciesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 188, // 252: openshell.v1.ListSandboxPoliciesResponse.revisions:type_name -> openshell.v1.SandboxPolicyRevision + 13, // 253: openshell.v1.ReportPolicyStatusRequest.status:type_name -> openshell.v1.PolicyStatus + 12, // 254: openshell.v1.SandboxConfigurationAdmission.state:type_name -> openshell.v1.ConfigurationAdmissionState + 185, // 255: openshell.v1.ReportSandboxConfigurationRequest.admission:type_name -> openshell.v1.SandboxConfigurationAdmission + 13, // 256: openshell.v1.SandboxPolicyRevision.status:type_name -> openshell.v1.PolicyStatus + 310, // 257: openshell.v1.SandboxPolicyRevision.created_time:type_name -> google.protobuf.Timestamp + 310, // 258: openshell.v1.SandboxPolicyRevision.loaded_time:type_name -> google.protobuf.Timestamp + 312, // 259: openshell.v1.SandboxPolicyRevision.policy:type_name -> openshell.sandbox.v1.SandboxPolicy + 308, // 260: openshell.v1.SandboxPolicyRevision.provenance:type_name -> openshell.v1.SandboxPolicyRevision.ProvenanceEntry + 315, // 261: openshell.v1.GetSandboxLogsRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 310, // 262: openshell.v1.GetSandboxLogsRequest.since_time:type_name -> google.protobuf.Timestamp + 115, // 263: openshell.v1.PushSandboxLogsRequest.logs:type_name -> openshell.v1.SandboxLogLine + 115, // 264: openshell.v1.GetSandboxLogsResponse.logs:type_name -> openshell.v1.SandboxLogLine + 195, // 265: openshell.v1.SupervisorMessage.hello:type_name -> openshell.v1.SupervisorHello + 203, // 266: openshell.v1.SupervisorMessage.heartbeat:type_name -> openshell.v1.SupervisorHeartbeat + 220, // 267: openshell.v1.SupervisorMessage.relay_open_result:type_name -> openshell.v1.RelayOpenResult + 221, // 268: openshell.v1.SupervisorMessage.relay_close:type_name -> openshell.v1.RelayClose + 199, // 269: openshell.v1.SupervisorMessage.config_update_result:type_name -> openshell.v1.ConfigUpdateResult + 274, // 270: openshell.v1.SupervisorMessage.service_advertisement:type_name -> openshell.v1.SupervisorServiceAdvertisement + 196, // 271: openshell.v1.GatewayMessage.session_accepted:type_name -> openshell.v1.SessionAccepted + 201, // 272: openshell.v1.GatewayMessage.session_rejected:type_name -> openshell.v1.SessionRejected + 204, // 273: openshell.v1.GatewayMessage.heartbeat:type_name -> openshell.v1.GatewayHeartbeat + 209, // 274: openshell.v1.GatewayMessage.relay_open:type_name -> openshell.v1.RelayOpen + 221, // 275: openshell.v1.GatewayMessage.relay_close:type_name -> openshell.v1.RelayClose + 202, // 276: openshell.v1.GatewayMessage.session_redirect:type_name -> openshell.v1.SessionRedirect + 197, // 277: openshell.v1.GatewayMessage.config_update:type_name -> openshell.v1.ConfigUpdate + 273, // 278: openshell.v1.GatewayMessage.service_route_lease:type_name -> openshell.v1.ServiceRouteLease + 197, // 279: openshell.v1.SessionAccepted.bootstrap:type_name -> openshell.v1.ConfigUpdate + 314, // 280: openshell.v1.SessionAccepted.heartbeat_interval:type_name -> google.protobuf.Duration + 324, // 281: openshell.v1.ConfigUpdate.sandbox_config:type_name -> openshell.sandbox.v1.SandboxConfigSnapshot + 166, // 282: openshell.v1.ConfigUpdate.provider_environment:type_name -> openshell.v1.ProviderEnvironmentSnapshot + 6, // 283: openshell.v1.ConfigUpdateResult.outcome:type_name -> openshell.v1.ConfigApplyOutcome + 198, // 284: openshell.v1.ConfigUpdateResult.failure:type_name -> openshell.v1.ConfigApplyFailure + 185, // 285: openshell.v1.ConfigUpdateResult.admission:type_name -> openshell.v1.SandboxConfigurationAdmission + 200, // 286: openshell.v1.ConfigUpdateResult.policy_load:type_name -> openshell.v1.PolicyLoadResult + 210, // 287: openshell.v1.RelayOpen.ssh:type_name -> openshell.v1.SshRelayTarget + 211, // 288: openshell.v1.RelayOpen.tcp:type_name -> openshell.v1.TcpRelayTarget + 212, // 289: openshell.v1.RelayFrame.init:type_name -> openshell.v1.RelayInit + 209, // 290: openshell.v1.PeerRelayInit.relay_open:type_name -> openshell.v1.RelayOpen + 214, // 291: openshell.v1.PeerRelayFrame.init:type_name -> openshell.v1.PeerRelayInit + 216, // 292: openshell.v1.PeerNotifyConfigUpdateRequest.sandbox:type_name -> openshell.v1.PeerConfigSandboxTarget + 217, // 293: openshell.v1.PeerNotifyConfigUpdateRequest.provider:type_name -> openshell.v1.PeerConfigProviderTarget + 310, // 294: openshell.v1.DenialSummary.first_seen_time:type_name -> google.protobuf.Timestamp + 310, // 295: openshell.v1.DenialSummary.last_seen_time:type_name -> google.protobuf.Timestamp + 222, // 296: openshell.v1.DenialSummary.l7_request_samples:type_name -> openshell.v1.L7RequestSample + 224, // 297: openshell.v1.NetworkActivitySummary.denials_by_group:type_name -> openshell.v1.DenialGroupCount + 321, // 298: openshell.v1.PolicyChunk.proposed_rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule + 310, // 299: openshell.v1.PolicyChunk.created_time:type_name -> google.protobuf.Timestamp + 310, // 300: openshell.v1.PolicyChunk.decided_time:type_name -> google.protobuf.Timestamp + 310, // 301: openshell.v1.PolicyChunk.first_seen_time:type_name -> google.protobuf.Timestamp + 310, // 302: openshell.v1.PolicyChunk.last_seen_time:type_name -> google.protobuf.Timestamp + 312, // 303: openshell.v1.PolicyChunk.current_effective_policy:type_name -> openshell.sandbox.v1.SandboxPolicy + 312, // 304: openshell.v1.PolicyChunk.candidate_effective_policy:type_name -> openshell.sandbox.v1.SandboxPolicy + 315, // 305: openshell.v1.SubmitPolicyAnalysisRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 223, // 306: openshell.v1.SubmitPolicyAnalysisRequest.summaries:type_name -> openshell.v1.DenialSummary + 226, // 307: openshell.v1.SubmitPolicyAnalysisRequest.proposed_chunks:type_name -> openshell.v1.PolicyChunk + 225, // 308: openshell.v1.SubmitPolicyAnalysisRequest.network_activity_summaries:type_name -> openshell.v1.NetworkActivitySummary + 315, // 309: openshell.v1.GetDraftPolicyRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 226, // 310: openshell.v1.GetDraftPolicyResponse.chunks:type_name -> openshell.v1.PolicyChunk + 310, // 311: openshell.v1.GetDraftPolicyResponse.last_analyzed_time:type_name -> google.protobuf.Timestamp + 315, // 312: openshell.v1.ApproveDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 313: openshell.v1.RejectDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 314: openshell.v1.ApproveAllDraftChunksRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 236, // 315: openshell.v1.ApproveAllDraftChunksRequest.approvals:type_name -> openshell.v1.DraftChunkApproval + 315, // 316: openshell.v1.EditDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 321, // 317: openshell.v1.EditDraftChunkRequest.proposed_rule:type_name -> openshell.sandbox.v1.NetworkPolicyRule + 315, // 318: openshell.v1.UndoDraftChunkRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 319: openshell.v1.ClearDraftChunksRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 315, // 320: openshell.v1.GetDraftHistoryRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 310, // 321: openshell.v1.DraftHistoryEntry.event_time:type_name -> google.protobuf.Timestamp + 246, // 322: openshell.v1.GetDraftHistoryResponse.entries:type_name -> openshell.v1.DraftHistoryEntry + 309, // 323: openshell.v1.CreateWorkspaceRequest.labels:type_name -> openshell.v1.CreateWorkspaceRequest.LabelsEntry + 325, // 324: openshell.v1.CreateWorkspaceResponse.workspace:type_name -> openshell.datamodel.v1.Workspace + 325, // 325: openshell.v1.GetWorkspaceResponse.workspace:type_name -> openshell.datamodel.v1.Workspace + 325, // 326: openshell.v1.ListWorkspacesResponse.workspaces:type_name -> openshell.datamodel.v1.Workspace + 18, // 327: openshell.v1.DeleteWorkspaceResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 311, // 328: openshell.v1.WorkspaceMember.metadata:type_name -> openshell.datamodel.v1.ObjectMeta + 15, // 329: openshell.v1.WorkspaceMember.role:type_name -> openshell.v1.WorkspaceRole + 315, // 330: openshell.v1.AddWorkspaceMemberRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 15, // 331: openshell.v1.AddWorkspaceMemberRequest.role:type_name -> openshell.v1.WorkspaceRole + 256, // 332: openshell.v1.AddWorkspaceMemberResponse.member:type_name -> openshell.v1.WorkspaceMember + 315, // 333: openshell.v1.RemoveWorkspaceMemberRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 18, // 334: openshell.v1.RemoveWorkspaceMemberResponse.outcome:type_name -> openshell.v1.DeletionOutcome + 315, // 335: openshell.v1.ListWorkspaceMembersRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 256, // 336: openshell.v1.ListWorkspaceMembersResponse.members:type_name -> openshell.v1.WorkspaceMember + 310, // 337: openshell.v1.ExtensionServiceCredential.expiration_time:type_name -> google.protobuf.Timestamp + 19, // 338: openshell.v1.EndpointObservation.result:type_name -> openshell.v1.EndpointResult + 272, // 339: openshell.v1.EndpointObservation.failure:type_name -> openshell.v1.EndpointFailure + 264, // 340: openshell.v1.ReportEndpointStatusRequest.observations:type_name -> openshell.v1.EndpointObservation + 266, // 341: openshell.v1.ReportEndpointStatusRequest.token_grant_status:type_name -> openshell.v1.TokenGrantStatus + 267, // 342: openshell.v1.TokenGrantStatus.last_failure:type_name -> openshell.v1.TokenGrantFailureObservation + 272, // 343: openshell.v1.TokenGrantFailureObservation.failure:type_name -> openshell.v1.EndpointFailure + 19, // 344: openshell.v1.EndpointStatus.last_result:type_name -> openshell.v1.EndpointResult + 310, // 345: openshell.v1.EndpointStatus.last_reported_time:type_name -> google.protobuf.Timestamp + 272, // 346: openshell.v1.EndpointStatus.last_failure:type_name -> openshell.v1.EndpointFailure + 310, // 347: openshell.v1.SandboxProvisioning.configuration_change_time:type_name -> google.protobuf.Timestamp + 310, // 348: openshell.v1.SandboxProvisioning.first_rejection_time:type_name -> google.protobuf.Timestamp + 310, // 349: openshell.v1.SandboxProvisioning.deadline:type_name -> google.protobuf.Timestamp + 310, // 350: openshell.v1.SandboxProvisioning.timeout_time:type_name -> google.protobuf.Timestamp + 310, // 351: openshell.v1.SandboxProvisioning.cleanup_completed_time:type_name -> google.protobuf.Timestamp + 310, // 352: openshell.v1.SandboxProvisioning.cleanup_retry_time:type_name -> google.protobuf.Timestamp + 310, // 353: openshell.v1.SandboxProvisioning.attachment_change_time:type_name -> google.protobuf.Timestamp + 310, // 354: openshell.v1.SandboxProvisioning.preparation_deadline:type_name -> google.protobuf.Timestamp + 310, // 355: openshell.v1.SandboxProvisioning.admission_start_time:type_name -> google.protobuf.Timestamp + 20, // 356: openshell.v1.SandboxServiceExposure.authorization_mode:type_name -> openshell.v1.ServiceAuthorizationMode + 21, // 357: openshell.v1.EndpointFailure.domain:type_name -> openshell.v1.EndpointFailureDomain + 16, // 358: openshell.v1.EndpointFailure.recovery_action:type_name -> openshell.v1.ProviderCredentialRefreshRecoveryAction + 314, // 359: openshell.v1.ServiceRouteLease.duration:type_name -> google.protobuf.Duration + 310, // 360: openshell.v1.ServiceRouteLease.expires_at:type_name -> google.protobuf.Timestamp + 326, // 361: openshell.v1.SupervisorServiceAdvertisement.routes:type_name -> openshell.sandbox.v1.SandboxServiceRoute + 315, // 362: openshell.v1.GetServiceRouteSnapshotRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 279, // 363: openshell.v1.GetServiceRouteSnapshotResponse.snapshot:type_name -> openshell.v1.ServiceRouteSnapshot + 315, // 364: openshell.v1.WatchServiceRoutesRequest.workspace_scope:type_name -> openshell.datamodel.v1.WorkspaceSelector + 279, // 365: openshell.v1.WatchServiceRoutesResponse.snapshot:type_name -> openshell.v1.ServiceRouteSnapshot + 281, // 366: openshell.v1.ServiceRouteSnapshot.routes:type_name -> openshell.v1.DiscoveredServiceRoute + 280, // 367: openshell.v1.DiscoveredServiceRoute.endpoint:type_name -> openshell.v1.ServiceRouteEndpoint + 310, // 368: openshell.v1.DiscoveredServiceRoute.expires_at:type_name -> google.protobuf.Timestamp + 120, // 369: openshell.v1.GetProviderCredentialsResponse.CredentialsEntry.value:type_name -> openshell.v1.ProviderCredentialValue + 310, // 370: openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry.value:type_name -> google.protobuf.Timestamp + 310, // 371: openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry.value:type_name -> google.protobuf.Timestamp + 134, // 372: openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry.value:type_name -> openshell.v1.ProviderProfileCredential + 163, // 373: openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry.value:type_name -> openshell.v1.StaticCredentialBinding + 134, // 374: openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry.value:type_name -> openshell.v1.ProviderProfileCredential + 26, // 375: openshell.v1.OpenShell.Health:input_type -> openshell.v1.HealthRequest + 28, // 376: openshell.v1.OpenShell.GetCurrentUser:input_type -> openshell.v1.GetCurrentUserRequest + 30, // 377: openshell.v1.OpenShell.GetGatewayInfo:input_type -> openshell.v1.GetGatewayInfoRequest + 54, // 378: openshell.v1.OpenShell.CreateSandbox:input_type -> openshell.v1.CreateSandboxRequest + 62, // 379: openshell.v1.OpenShell.BeginRootfsTarStaging:input_type -> openshell.v1.BeginRootfsTarStagingRequest + 64, // 380: openshell.v1.OpenShell.GetSandbox:input_type -> openshell.v1.GetSandboxRequest + 65, // 381: openshell.v1.OpenShell.ListSandboxes:input_type -> openshell.v1.ListSandboxesRequest + 55, // 382: openshell.v1.OpenShell.CreateSandboxTemplate:input_type -> openshell.v1.CreateSandboxTemplateRequest + 56, // 383: openshell.v1.OpenShell.GetSandboxTemplate:input_type -> openshell.v1.GetSandboxTemplateRequest + 57, // 384: openshell.v1.OpenShell.ListSandboxTemplates:input_type -> openshell.v1.ListSandboxTemplatesRequest + 58, // 385: openshell.v1.OpenShell.DeleteSandboxTemplate:input_type -> openshell.v1.DeleteSandboxTemplateRequest + 66, // 386: openshell.v1.OpenShell.ListSandboxProviders:input_type -> openshell.v1.ListSandboxProvidersRequest + 67, // 387: openshell.v1.OpenShell.AttachSandboxProvider:input_type -> openshell.v1.AttachSandboxProviderRequest + 68, // 388: openshell.v1.OpenShell.DetachSandboxProvider:input_type -> openshell.v1.DetachSandboxProviderRequest + 86, // 389: openshell.v1.OpenShell.GetSandboxProviderStatus:input_type -> openshell.v1.GetSandboxProviderStatusRequest + 69, // 390: openshell.v1.OpenShell.DeleteSandbox:input_type -> openshell.v1.DeleteSandboxRequest + 70, // 391: openshell.v1.OpenShell.StopSandbox:input_type -> openshell.v1.StopSandboxRequest + 71, // 392: openshell.v1.OpenShell.StartSandbox:input_type -> openshell.v1.StartSandboxRequest + 72, // 393: openshell.v1.OpenShell.SuspendSandbox:input_type -> openshell.v1.SuspendSandboxRequest + 73, // 394: openshell.v1.OpenShell.ResumeSandbox:input_type -> openshell.v1.ResumeSandboxRequest + 91, // 395: openshell.v1.OpenShell.CreateSshSession:input_type -> openshell.v1.CreateSshSessionRequest + 93, // 396: openshell.v1.OpenShell.ExposeService:input_type -> openshell.v1.ExposeServiceRequest + 94, // 397: openshell.v1.OpenShell.GetService:input_type -> openshell.v1.GetServiceRequest + 95, // 398: openshell.v1.OpenShell.ListServices:input_type -> openshell.v1.ListServicesRequest + 275, // 399: openshell.v1.OpenShell.GetServiceRouteSnapshot:input_type -> openshell.v1.GetServiceRouteSnapshotRequest + 277, // 400: openshell.v1.OpenShell.WatchServiceRoutes:input_type -> openshell.v1.WatchServiceRoutesRequest + 97, // 401: openshell.v1.OpenShell.DeleteService:input_type -> openshell.v1.DeleteServiceRequest + 101, // 402: openshell.v1.OpenShell.RevokeSshSession:input_type -> openshell.v1.RevokeSshSessionRequest + 103, // 403: openshell.v1.OpenShell.ExecSandbox:input_type -> openshell.v1.ExecSandboxRequest + 109, // 404: openshell.v1.OpenShell.ForwardTcp:input_type -> openshell.v1.TcpForwardFrame + 110, // 405: openshell.v1.OpenShell.ExecSandboxInteractive:input_type -> openshell.v1.ExecSandboxInput + 117, // 406: openshell.v1.OpenShell.CreateProvider:input_type -> openshell.v1.CreateProviderRequest + 118, // 407: openshell.v1.OpenShell.GetProvider:input_type -> openshell.v1.GetProviderRequest + 119, // 408: openshell.v1.OpenShell.GetProviderCredentials:input_type -> openshell.v1.GetProviderCredentialsRequest + 122, // 409: openshell.v1.OpenShell.ListProviders:input_type -> openshell.v1.ListProvidersRequest + 127, // 410: openshell.v1.OpenShell.ListProviderProfiles:input_type -> openshell.v1.ListProviderProfilesRequest + 128, // 411: openshell.v1.OpenShell.GetProviderProfile:input_type -> openshell.v1.GetProviderProfileRequest + 152, // 412: openshell.v1.OpenShell.ImportProviderProfiles:input_type -> openshell.v1.ImportProviderProfilesRequest + 154, // 413: openshell.v1.OpenShell.UpdateProviderProfiles:input_type -> openshell.v1.UpdateProviderProfilesRequest + 156, // 414: openshell.v1.OpenShell.LintProviderProfiles:input_type -> openshell.v1.LintProviderProfilesRequest + 123, // 415: openshell.v1.OpenShell.UpdateProvider:input_type -> openshell.v1.UpdateProviderRequest + 140, // 416: openshell.v1.OpenShell.GetProviderRefreshStatus:input_type -> openshell.v1.GetProviderRefreshStatusRequest + 142, // 417: openshell.v1.OpenShell.ConfigureProviderRefresh:input_type -> openshell.v1.ConfigureProviderRefreshRequest + 144, // 418: openshell.v1.OpenShell.RotateProviderCredential:input_type -> openshell.v1.RotateProviderCredentialRequest + 146, // 419: openshell.v1.OpenShell.DeleteProviderRefresh:input_type -> openshell.v1.DeleteProviderRefreshRequest + 124, // 420: openshell.v1.OpenShell.DeleteProvider:input_type -> openshell.v1.DeleteProviderRequest + 159, // 421: openshell.v1.OpenShell.DeleteProviderProfile:input_type -> openshell.v1.DeleteProviderProfileRequest + 327, // 422: openshell.v1.OpenShell.GetSandboxConfig:input_type -> openshell.sandbox.v1.GetSandboxConfigRequest + 328, // 423: openshell.v1.OpenShell.GetGatewayConfig:input_type -> openshell.sandbox.v1.GetGatewayConfigRequest + 169, // 424: openshell.v1.OpenShell.UpdateConfig:input_type -> openshell.v1.UpdateConfigRequest + 179, // 425: openshell.v1.OpenShell.GetSandboxPolicyStatus:input_type -> openshell.v1.GetSandboxPolicyStatusRequest + 181, // 426: openshell.v1.OpenShell.ListSandboxPolicies:input_type -> openshell.v1.ListSandboxPoliciesRequest + 183, // 427: openshell.v1.OpenShell.ReportPolicyStatus:input_type -> openshell.v1.ReportPolicyStatusRequest + 265, // 428: openshell.v1.OpenShell.ReportEndpointStatus:input_type -> openshell.v1.ReportEndpointStatusRequest + 88, // 429: openshell.v1.OpenShell.ReportProviderReadiness:input_type -> openshell.v1.ReportProviderReadinessRequest + 186, // 430: openshell.v1.OpenShell.ReportSandboxConfiguration:input_type -> openshell.v1.ReportSandboxConfigurationRequest + 161, // 431: openshell.v1.OpenShell.GetSandboxProviderEnvironment:input_type -> openshell.v1.GetSandboxProviderEnvironmentRequest + 167, // 432: openshell.v1.OpenShell.ExchangeProviderSubjectToken:input_type -> openshell.v1.ExchangeProviderSubjectTokenRequest + 189, // 433: openshell.v1.OpenShell.GetSandboxLogs:input_type -> openshell.v1.GetSandboxLogsRequest + 190, // 434: openshell.v1.OpenShell.PushSandboxLogs:input_type -> openshell.v1.PushSandboxLogsRequest + 193, // 435: openshell.v1.OpenShell.ConnectSupervisor:input_type -> openshell.v1.SupervisorMessage + 205, // 436: openshell.v1.OpenShell.ReportMainProcessExit:input_type -> openshell.v1.ReportMainProcessExitRequest + 207, // 437: openshell.v1.OpenShell.FinalizeMainProcessExit:input_type -> openshell.v1.FinalizeMainProcessExitRequest + 213, // 438: openshell.v1.OpenShell.RelayStream:input_type -> openshell.v1.RelayFrame + 215, // 439: openshell.v1.OpenShell.PeerRelay:input_type -> openshell.v1.PeerRelayFrame + 88, // 440: openshell.v1.OpenShell.PeerReportProviderReadiness:input_type -> openshell.v1.ReportProviderReadinessRequest + 265, // 441: openshell.v1.OpenShell.PeerReportEndpointStatus:input_type -> openshell.v1.ReportEndpointStatusRequest + 86, // 442: openshell.v1.OpenShell.PeerGetSandboxProviderStatus:input_type -> openshell.v1.GetSandboxProviderStatusRequest + 218, // 443: openshell.v1.OpenShell.PeerNotifyConfigUpdate:input_type -> openshell.v1.PeerNotifyConfigUpdateRequest + 113, // 444: openshell.v1.OpenShell.WatchSandbox:input_type -> openshell.v1.WatchSandboxRequest + 228, // 445: openshell.v1.OpenShell.SubmitPolicyAnalysis:input_type -> openshell.v1.SubmitPolicyAnalysisRequest + 230, // 446: openshell.v1.OpenShell.GetDraftPolicy:input_type -> openshell.v1.GetDraftPolicyRequest + 232, // 447: openshell.v1.OpenShell.ApproveDraftChunk:input_type -> openshell.v1.ApproveDraftChunkRequest + 234, // 448: openshell.v1.OpenShell.RejectDraftChunk:input_type -> openshell.v1.RejectDraftChunkRequest + 237, // 449: openshell.v1.OpenShell.ApproveAllDraftChunks:input_type -> openshell.v1.ApproveAllDraftChunksRequest + 239, // 450: openshell.v1.OpenShell.EditDraftChunk:input_type -> openshell.v1.EditDraftChunkRequest + 241, // 451: openshell.v1.OpenShell.UndoDraftChunk:input_type -> openshell.v1.UndoDraftChunkRequest + 243, // 452: openshell.v1.OpenShell.ClearDraftChunks:input_type -> openshell.v1.ClearDraftChunksRequest + 245, // 453: openshell.v1.OpenShell.GetDraftHistory:input_type -> openshell.v1.GetDraftHistoryRequest + 22, // 454: openshell.v1.OpenShell.IssueSandboxToken:input_type -> openshell.v1.IssueSandboxTokenRequest + 24, // 455: openshell.v1.OpenShell.RefreshSandboxToken:input_type -> openshell.v1.RefreshSandboxTokenRequest + 248, // 456: openshell.v1.OpenShell.CreateWorkspace:input_type -> openshell.v1.CreateWorkspaceRequest + 250, // 457: openshell.v1.OpenShell.GetWorkspace:input_type -> openshell.v1.GetWorkspaceRequest + 252, // 458: openshell.v1.OpenShell.ListWorkspaces:input_type -> openshell.v1.ListWorkspacesRequest + 254, // 459: openshell.v1.OpenShell.DeleteWorkspace:input_type -> openshell.v1.DeleteWorkspaceRequest + 257, // 460: openshell.v1.OpenShell.AddWorkspaceMember:input_type -> openshell.v1.AddWorkspaceMemberRequest + 259, // 461: openshell.v1.OpenShell.RemoveWorkspaceMember:input_type -> openshell.v1.RemoveWorkspaceMemberRequest + 261, // 462: openshell.v1.OpenShell.ListWorkspaceMembers:input_type -> openshell.v1.ListWorkspaceMembersRequest + 27, // 463: openshell.v1.OpenShell.Health:output_type -> openshell.v1.HealthResponse + 29, // 464: openshell.v1.OpenShell.GetCurrentUser:output_type -> openshell.v1.GetCurrentUserResponse + 31, // 465: openshell.v1.OpenShell.GetGatewayInfo:output_type -> openshell.v1.GetGatewayInfoResponse + 74, // 466: openshell.v1.OpenShell.CreateSandbox:output_type -> openshell.v1.SandboxResponse + 63, // 467: openshell.v1.OpenShell.BeginRootfsTarStaging:output_type -> openshell.v1.BeginRootfsTarStagingResponse + 74, // 468: openshell.v1.OpenShell.GetSandbox:output_type -> openshell.v1.SandboxResponse + 75, // 469: openshell.v1.OpenShell.ListSandboxes:output_type -> openshell.v1.ListSandboxesResponse + 59, // 470: openshell.v1.OpenShell.CreateSandboxTemplate:output_type -> openshell.v1.SandboxTemplateResponse + 59, // 471: openshell.v1.OpenShell.GetSandboxTemplate:output_type -> openshell.v1.SandboxTemplateResponse + 60, // 472: openshell.v1.OpenShell.ListSandboxTemplates:output_type -> openshell.v1.ListSandboxTemplatesResponse + 61, // 473: openshell.v1.OpenShell.DeleteSandboxTemplate:output_type -> openshell.v1.DeleteSandboxTemplateResponse + 76, // 474: openshell.v1.OpenShell.ListSandboxProviders:output_type -> openshell.v1.ListSandboxProvidersResponse + 77, // 475: openshell.v1.OpenShell.AttachSandboxProvider:output_type -> openshell.v1.AttachSandboxProviderResponse + 78, // 476: openshell.v1.OpenShell.DetachSandboxProvider:output_type -> openshell.v1.DetachSandboxProviderResponse + 87, // 477: openshell.v1.OpenShell.GetSandboxProviderStatus:output_type -> openshell.v1.GetSandboxProviderStatusResponse + 90, // 478: openshell.v1.OpenShell.DeleteSandbox:output_type -> openshell.v1.DeleteSandboxResponse + 74, // 479: openshell.v1.OpenShell.StopSandbox:output_type -> openshell.v1.SandboxResponse + 74, // 480: openshell.v1.OpenShell.StartSandbox:output_type -> openshell.v1.SandboxResponse + 74, // 481: openshell.v1.OpenShell.SuspendSandbox:output_type -> openshell.v1.SandboxResponse + 74, // 482: openshell.v1.OpenShell.ResumeSandbox:output_type -> openshell.v1.SandboxResponse + 92, // 483: openshell.v1.OpenShell.CreateSshSession:output_type -> openshell.v1.CreateSshSessionResponse + 100, // 484: openshell.v1.OpenShell.ExposeService:output_type -> openshell.v1.ServiceEndpointResponse + 100, // 485: openshell.v1.OpenShell.GetService:output_type -> openshell.v1.ServiceEndpointResponse + 96, // 486: openshell.v1.OpenShell.ListServices:output_type -> openshell.v1.ListServicesResponse + 276, // 487: openshell.v1.OpenShell.GetServiceRouteSnapshot:output_type -> openshell.v1.GetServiceRouteSnapshotResponse + 278, // 488: openshell.v1.OpenShell.WatchServiceRoutes:output_type -> openshell.v1.WatchServiceRoutesResponse + 98, // 489: openshell.v1.OpenShell.DeleteService:output_type -> openshell.v1.DeleteServiceResponse + 102, // 490: openshell.v1.OpenShell.RevokeSshSession:output_type -> openshell.v1.RevokeSshSessionResponse + 107, // 491: openshell.v1.OpenShell.ExecSandbox:output_type -> openshell.v1.ExecSandboxEvent + 109, // 492: openshell.v1.OpenShell.ForwardTcp:output_type -> openshell.v1.TcpForwardFrame + 107, // 493: openshell.v1.OpenShell.ExecSandboxInteractive:output_type -> openshell.v1.ExecSandboxEvent + 125, // 494: openshell.v1.OpenShell.CreateProvider:output_type -> openshell.v1.ProviderResponse + 125, // 495: openshell.v1.OpenShell.GetProvider:output_type -> openshell.v1.ProviderResponse + 121, // 496: openshell.v1.OpenShell.GetProviderCredentials:output_type -> openshell.v1.GetProviderCredentialsResponse + 126, // 497: openshell.v1.OpenShell.ListProviders:output_type -> openshell.v1.ListProvidersResponse + 151, // 498: openshell.v1.OpenShell.ListProviderProfiles:output_type -> openshell.v1.ListProviderProfilesResponse + 150, // 499: openshell.v1.OpenShell.GetProviderProfile:output_type -> openshell.v1.ProviderProfileResponse + 153, // 500: openshell.v1.OpenShell.ImportProviderProfiles:output_type -> openshell.v1.ImportProviderProfilesResponse + 155, // 501: openshell.v1.OpenShell.UpdateProviderProfiles:output_type -> openshell.v1.UpdateProviderProfilesResponse + 157, // 502: openshell.v1.OpenShell.LintProviderProfiles:output_type -> openshell.v1.LintProviderProfilesResponse + 125, // 503: openshell.v1.OpenShell.UpdateProvider:output_type -> openshell.v1.ProviderResponse + 141, // 504: openshell.v1.OpenShell.GetProviderRefreshStatus:output_type -> openshell.v1.GetProviderRefreshStatusResponse + 143, // 505: openshell.v1.OpenShell.ConfigureProviderRefresh:output_type -> openshell.v1.ConfigureProviderRefreshResponse + 145, // 506: openshell.v1.OpenShell.RotateProviderCredential:output_type -> openshell.v1.RotateProviderCredentialResponse + 147, // 507: openshell.v1.OpenShell.DeleteProviderRefresh:output_type -> openshell.v1.DeleteProviderRefreshResponse + 158, // 508: openshell.v1.OpenShell.DeleteProvider:output_type -> openshell.v1.DeleteProviderResponse + 160, // 509: openshell.v1.OpenShell.DeleteProviderProfile:output_type -> openshell.v1.DeleteProviderProfileResponse + 329, // 510: openshell.v1.OpenShell.GetSandboxConfig:output_type -> openshell.sandbox.v1.GetSandboxConfigResponse + 330, // 511: openshell.v1.OpenShell.GetGatewayConfig:output_type -> openshell.sandbox.v1.GetGatewayConfigResponse + 178, // 512: openshell.v1.OpenShell.UpdateConfig:output_type -> openshell.v1.UpdateConfigResponse + 180, // 513: openshell.v1.OpenShell.GetSandboxPolicyStatus:output_type -> openshell.v1.GetSandboxPolicyStatusResponse + 182, // 514: openshell.v1.OpenShell.ListSandboxPolicies:output_type -> openshell.v1.ListSandboxPoliciesResponse + 184, // 515: openshell.v1.OpenShell.ReportPolicyStatus:output_type -> openshell.v1.ReportPolicyStatusResponse + 268, // 516: openshell.v1.OpenShell.ReportEndpointStatus:output_type -> openshell.v1.ReportEndpointStatusResponse + 89, // 517: openshell.v1.OpenShell.ReportProviderReadiness:output_type -> openshell.v1.ReportProviderReadinessResponse + 187, // 518: openshell.v1.OpenShell.ReportSandboxConfiguration:output_type -> openshell.v1.ReportSandboxConfigurationResponse + 164, // 519: openshell.v1.OpenShell.GetSandboxProviderEnvironment:output_type -> openshell.v1.GetSandboxProviderEnvironmentResponse + 168, // 520: openshell.v1.OpenShell.ExchangeProviderSubjectToken:output_type -> openshell.v1.ExchangeProviderSubjectTokenResponse + 192, // 521: openshell.v1.OpenShell.GetSandboxLogs:output_type -> openshell.v1.GetSandboxLogsResponse + 191, // 522: openshell.v1.OpenShell.PushSandboxLogs:output_type -> openshell.v1.PushSandboxLogsResponse + 194, // 523: openshell.v1.OpenShell.ConnectSupervisor:output_type -> openshell.v1.GatewayMessage + 206, // 524: openshell.v1.OpenShell.ReportMainProcessExit:output_type -> openshell.v1.ReportMainProcessExitResponse + 208, // 525: openshell.v1.OpenShell.FinalizeMainProcessExit:output_type -> openshell.v1.FinalizeMainProcessExitResponse + 213, // 526: openshell.v1.OpenShell.RelayStream:output_type -> openshell.v1.RelayFrame + 215, // 527: openshell.v1.OpenShell.PeerRelay:output_type -> openshell.v1.PeerRelayFrame + 89, // 528: openshell.v1.OpenShell.PeerReportProviderReadiness:output_type -> openshell.v1.ReportProviderReadinessResponse + 268, // 529: openshell.v1.OpenShell.PeerReportEndpointStatus:output_type -> openshell.v1.ReportEndpointStatusResponse + 87, // 530: openshell.v1.OpenShell.PeerGetSandboxProviderStatus:output_type -> openshell.v1.GetSandboxProviderStatusResponse + 219, // 531: openshell.v1.OpenShell.PeerNotifyConfigUpdate:output_type -> openshell.v1.PeerNotifyConfigUpdateResponse + 114, // 532: openshell.v1.OpenShell.WatchSandbox:output_type -> openshell.v1.SandboxStreamEvent + 229, // 533: openshell.v1.OpenShell.SubmitPolicyAnalysis:output_type -> openshell.v1.SubmitPolicyAnalysisResponse + 231, // 534: openshell.v1.OpenShell.GetDraftPolicy:output_type -> openshell.v1.GetDraftPolicyResponse + 233, // 535: openshell.v1.OpenShell.ApproveDraftChunk:output_type -> openshell.v1.ApproveDraftChunkResponse + 235, // 536: openshell.v1.OpenShell.RejectDraftChunk:output_type -> openshell.v1.RejectDraftChunkResponse + 238, // 537: openshell.v1.OpenShell.ApproveAllDraftChunks:output_type -> openshell.v1.ApproveAllDraftChunksResponse + 240, // 538: openshell.v1.OpenShell.EditDraftChunk:output_type -> openshell.v1.EditDraftChunkResponse + 242, // 539: openshell.v1.OpenShell.UndoDraftChunk:output_type -> openshell.v1.UndoDraftChunkResponse + 244, // 540: openshell.v1.OpenShell.ClearDraftChunks:output_type -> openshell.v1.ClearDraftChunksResponse + 247, // 541: openshell.v1.OpenShell.GetDraftHistory:output_type -> openshell.v1.GetDraftHistoryResponse + 23, // 542: openshell.v1.OpenShell.IssueSandboxToken:output_type -> openshell.v1.IssueSandboxTokenResponse + 25, // 543: openshell.v1.OpenShell.RefreshSandboxToken:output_type -> openshell.v1.RefreshSandboxTokenResponse + 249, // 544: openshell.v1.OpenShell.CreateWorkspace:output_type -> openshell.v1.CreateWorkspaceResponse + 251, // 545: openshell.v1.OpenShell.GetWorkspace:output_type -> openshell.v1.GetWorkspaceResponse + 253, // 546: openshell.v1.OpenShell.ListWorkspaces:output_type -> openshell.v1.ListWorkspacesResponse + 255, // 547: openshell.v1.OpenShell.DeleteWorkspace:output_type -> openshell.v1.DeleteWorkspaceResponse + 258, // 548: openshell.v1.OpenShell.AddWorkspaceMember:output_type -> openshell.v1.AddWorkspaceMemberResponse + 260, // 549: openshell.v1.OpenShell.RemoveWorkspaceMember:output_type -> openshell.v1.RemoveWorkspaceMemberResponse + 262, // 550: openshell.v1.OpenShell.ListWorkspaceMembers:output_type -> openshell.v1.ListWorkspaceMembersResponse + 463, // [463:551] is the sub-list for method output_type + 375, // [375:463] is the sub-list for method input_type + 375, // [375:375] is the sub-list for extension type_name + 375, // [375:375] is the sub-list for extension extendee + 0, // [0:375] is the sub-list for field type_name } func init() { file_openshell_proto_init() } @@ -22939,7 +22992,7 @@ func file_openshell_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_openshell_proto_rawDesc), len(file_openshell_proto_rawDesc)), NumEnums: 22, - NumMessages: 286, + NumMessages: 288, NumExtensions: 0, NumServices: 1, }, diff --git a/sdk/typescript/src/client.test.ts b/sdk/typescript/src/client.test.ts index 86fdfa3972..a9167ae58b 100644 --- a/sdk/typescript/src/client.test.ts +++ b/sdk/typescript/src/client.test.ts @@ -708,6 +708,8 @@ describe('create', () => { created = req; return { ...readySandbox('sb', 'sb-id'), + applicationServiceUrls: { '': 'https://sb.example.test/', metrics: 'https://metrics.sb.example.test/' }, + gatewayServiceUrls: { '': 'https://sb.gateway.test:8080/' }, serviceUrls: { '': 'https://sb.example.test/', metrics: 'https://metrics.sb.example.test/', @@ -742,6 +744,8 @@ describe('create', () => { authorizationMode: ProtoServiceAuthorizationMode.BEARER_PASSTHROUGH, }, ]); + expect(result.applicationServiceUrls).toEqual(result.serviceUrls); + expect(result.gatewayServiceUrls['']).toBe('https://sb.gateway.test:8080/'); expect(result.serviceUrls).toEqual({ '': 'https://sb.example.test/', metrics: 'https://metrics.sb.example.test/', diff --git a/sdk/typescript/src/client.ts b/sdk/typescript/src/client.ts index f82242d4a7..9292bbd970 100644 --- a/sdk/typescript/src/client.ts +++ b/sdk/typescript/src/client.ts @@ -246,6 +246,8 @@ export interface SandboxRef { createdFromWorkloadTemplate?: SandboxWorkloadTemplateProvenance; /** Service URLs returned by creation, keyed by service name. */ serviceUrls: Record; + applicationServiceUrls: Record; + gatewayServiceUrls: Record; restartCount: number; /** Creation time in epoch milliseconds; absent when the gateway omits it. */ createdAtMs?: number; @@ -623,7 +625,12 @@ function policySourceName(s: PolicySource): PolicySourceName { return POLICY_SOURCE_NAMES[s] ?? 'unspecified'; } -function sandboxRef(sandbox: Sandbox | undefined, serviceUrls: Record = {}): SandboxRef { +function sandboxRef( + sandbox: Sandbox | undefined, + serviceUrls: Record = {}, + applicationServiceUrls: Record = {}, + gatewayServiceUrls: Record = {}, +): SandboxRef { if (!sandbox) throw new SdkError('invalid_config', 'sandbox missing from gateway response'); const meta = sandbox.metadata; if (!meta?.id || !meta.name) { @@ -646,6 +653,8 @@ function sandboxRef(sandbox: Sandbox | undefined, serviceUrls: Record