@@ -4,12 +4,12 @@ use clap::{Args, Parser, Subcommand};
44use serde:: Deserialize ;
55use serde_json:: { json, Value } ;
66use sparsekernel_core:: {
7- probe_browser_endpoint, AppendTranscriptEventInput , ArtifactStore , AuditInput , BrowserBroker ,
8- CapabilityCheck , CompleteToolCallInput , CreateToolCallInput , EnqueueTaskInput ,
9- GrantCapabilityInput , LedgerToolBroker , ListBrowserObservationsInput , ListBrowserTargetsInput ,
10- LocalSandboxBroker , MockBrowserBroker , RecordBrowserObservationInput , RecordBrowserTargetInput ,
11- SandboxBroker , SparseKernelDb , SparseKernelPaths , ToolBroker , UpsertSessionInput ,
12- SPARSEKERNEL_PROTOCOL_VERSION ,
7+ probe_browser_endpoint, probe_sandbox_backends , AppendTranscriptEventInput , ArtifactStore ,
8+ AuditInput , BrowserBroker , CapabilityCheck , CompleteToolCallInput , CreateToolCallInput ,
9+ EnqueueTaskInput , GrantCapabilityInput , LedgerToolBroker , ListBrowserObservationsInput ,
10+ ListBrowserTargetsInput , LocalSandboxBroker , MockBrowserBroker , RecordBrowserObservationInput ,
11+ RecordBrowserTargetInput , SandboxBroker , SparseKernelDb , SparseKernelPaths , ToolBroker ,
12+ UpsertSessionInput , SPARSEKERNEL_PROTOCOL_VERSION ,
1313} ;
1414use std:: collections:: HashMap ;
1515use std:: error:: Error ;
@@ -1312,7 +1312,8 @@ pub fn handle_api_request_with_daemon_state(
13121312 "artifacts.file-transfer.v1" ,
13131313 "capabilities.v1" ,
13141314 "browser-broker.v1" ,
1315- "sandbox-broker.v1"
1315+ "sandbox-broker.v1" ,
1316+ "sandbox-backends.probe.v1"
13161317 ] ,
13171318 } ) ,
13181319 } ,
@@ -1621,6 +1622,10 @@ pub fn handle_api_request_with_daemon_state(
16211622 body : json ! ( { "released" : broker. release_sandbox( & input. allocation_id) ? } ) ,
16221623 }
16231624 }
1625+ ( "GET" , "/sandbox/backends/probe" ) => ApiReply {
1626+ status_code : 200 ,
1627+ body : serde_json:: to_value ( probe_sandbox_backends ( ) ) ?,
1628+ } ,
16241629 ( "POST" , "/leases/release-expired" ) => {
16251630 let input: ReleaseExpiredLeasesRequest = if body. is_empty ( ) {
16261631 ReleaseExpiredLeasesRequest { now : None }
@@ -2429,6 +2434,17 @@ mod tests {
24292434 assert_eq ! ( released[ "released" ] , true ) ;
24302435 }
24312436
2437+ #[ test]
2438+ fn sandbox_probe_api_reports_backend_boundaries ( ) {
2439+ let mut db = SparseKernelDb :: open ( ":memory:" ) . unwrap ( ) ;
2440+ let probes = handle_api_request ( & mut db, "GET" , "/sandbox/backends/probe" , & [ ] )
2441+ . unwrap ( )
2442+ . body ;
2443+ assert ! ( probes. as_array( ) . unwrap( ) . iter( ) . any( |probe| {
2444+ probe[ "backend" ] == "local/no_isolation" && probe[ "hard_boundary" ] == false
2445+ } ) ) ;
2446+ }
2447+
24322448 #[ test]
24332449 fn browser_probe_api_checks_loopback_cdp_endpoint ( ) {
24342450 let mut db = SparseKernelDb :: open ( ":memory:" ) . unwrap ( ) ;
0 commit comments