1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//! Sandbox client trait for workspace lifecycle management.
//!
//! The [`SandboxClient`] trait abstracts sandbox provisioning, session
//! management, and snapshot/resume capabilities. Implementations manage
//! the underlying sandbox infrastructure (local directories or Docker
//! containers).
//!
//! # Lifecycle
//!
//! ```text
//! provision(manifest) → SessionHandle
//! start(handle) → Box<dyn SandboxSession>
//! ... operations ...
//! stop(handle)
//! snapshot(handle) → SnapshotId
//! resume(snapshot_id) → SessionHandle
//! ```
use async_trait;
use SandboxSession;
use ;
use crateSandboxError;
use crateManifest;
/// Async trait for sandbox lifecycle management.
///
/// Implementations provide provisioning, session management, and
/// snapshot/resume capabilities for workspace sandboxes.
///
/// # Requirements
///
/// - Implementations must be `Send + Sync` to support use across async
/// task boundaries.
/// - All methods return `Result<T, SandboxError>` for structured error
/// handling.
///
/// # Example
///
/// ```rust,ignore
/// use adk_sandbox::workspace::{SandboxClient, Manifest, SessionHandle};
///
/// async fn run_agent(client: &dyn SandboxClient, manifest: &Manifest) {
/// let handle = client.provision(manifest).await.unwrap();
/// let session = client.start(&handle).await.unwrap();
/// // ... use session for exec_command, read_file, etc. ...
/// client.stop(&handle).await.unwrap();
/// }
/// ```