@ash-ai/sandbox 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * SnapshotStore — interface for uploading/downloading workspace tarballs to cloud storage.
3
+ *
4
+ * Config via ASH_SNAPSHOT_URL:
5
+ * - Not set → local-only (default, zero config)
6
+ * - s3://bucket/prefix/ → S3
7
+ * - gs://bucket/prefix/ → GCS
8
+ */
9
+ export interface SnapshotStore {
10
+ upload(sessionId: string, tarPath: string): Promise<boolean>;
11
+ download(sessionId: string, destPath: string): Promise<boolean>;
12
+ exists(sessionId: string): Promise<boolean>;
13
+ delete(sessionId: string): Promise<void>;
14
+ }
15
+ /**
16
+ * Parse a snapshot URL and return the appropriate store implementation.
17
+ * Throws on unrecognized scheme.
18
+ */
19
+ export declare function createSnapshotStore(url: string): Promise<SnapshotStore>;
20
+ /**
21
+ * Module-level singleton. Returns null if ASH_SNAPSHOT_URL is not set.
22
+ * Caches the store instance after first call.
23
+ */
24
+ export declare function getSnapshotStore(): Promise<SnapshotStore | null>;
25
+ /**
26
+ * Reset the singleton (for testing).
27
+ */
28
+ export declare function resetSnapshotStore(): void;
29
+ //# sourceMappingURL=snapshot-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsC7E;AAID;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * SnapshotStore — interface for uploading/downloading workspace tarballs to cloud storage.
3
+ *
4
+ * Config via ASH_SNAPSHOT_URL:
5
+ * - Not set → local-only (default, zero config)
6
+ * - s3://bucket/prefix/ → S3
7
+ * - gs://bucket/prefix/ → GCS
8
+ */
9
+ /**
10
+ * Parse a snapshot URL and return the appropriate store implementation.
11
+ * Throws on unrecognized scheme.
12
+ */
13
+ export async function createSnapshotStore(url) {
14
+ if (url.startsWith('s3://')) {
15
+ const rest = url.slice('s3://'.length);
16
+ const slashIdx = rest.indexOf('/');
17
+ const bucket = slashIdx === -1 ? rest : rest.slice(0, slashIdx);
18
+ const prefix = slashIdx === -1 ? '' : rest.slice(slashIdx + 1);
19
+ if (!bucket)
20
+ throw new Error('Invalid S3 URL: missing bucket name');
21
+ try {
22
+ const { S3SnapshotStore } = await import('./snapshot-s3.js');
23
+ return new S3SnapshotStore(bucket, prefix);
24
+ }
25
+ catch (err) {
26
+ if (err instanceof Error && 'code' in err && err.code === 'ERR_MODULE_NOT_FOUND') {
27
+ throw new Error('Install @aws-sdk/client-s3 to use S3 snapshots');
28
+ }
29
+ throw err;
30
+ }
31
+ }
32
+ if (url.startsWith('gs://')) {
33
+ const rest = url.slice('gs://'.length);
34
+ const slashIdx = rest.indexOf('/');
35
+ const bucket = slashIdx === -1 ? rest : rest.slice(0, slashIdx);
36
+ const prefix = slashIdx === -1 ? '' : rest.slice(slashIdx + 1);
37
+ if (!bucket)
38
+ throw new Error('Invalid GCS URL: missing bucket name');
39
+ try {
40
+ const { GcsSnapshotStore } = await import('./snapshot-gcs.js');
41
+ return new GcsSnapshotStore(bucket, prefix);
42
+ }
43
+ catch (err) {
44
+ if (err instanceof Error && 'code' in err && err.code === 'ERR_MODULE_NOT_FOUND') {
45
+ throw new Error('Install @google-cloud/storage to use GCS snapshots');
46
+ }
47
+ throw err;
48
+ }
49
+ }
50
+ throw new Error(`Unsupported snapshot URL scheme: ${url} (expected s3:// or gs://)`);
51
+ }
52
+ let store;
53
+ /**
54
+ * Module-level singleton. Returns null if ASH_SNAPSHOT_URL is not set.
55
+ * Caches the store instance after first call.
56
+ */
57
+ export async function getSnapshotStore() {
58
+ if (store !== undefined)
59
+ return store;
60
+ const url = process.env.ASH_SNAPSHOT_URL;
61
+ if (!url) {
62
+ store = null;
63
+ return null;
64
+ }
65
+ store = await createSnapshotStore(url);
66
+ return store;
67
+ }
68
+ /**
69
+ * Reset the singleton (for testing).
70
+ */
71
+ export function resetSnapshotStore() {
72
+ store = undefined;
73
+ }
74
+ //# sourceMappingURL=snapshot-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ interface StateMetadata {
2
+ sessionId: string;
3
+ agentName: string;
4
+ persistedAt: string;
5
+ }
6
+ /**
7
+ * Copy entire workspace to data/sessions/<id>/workspace/.
8
+ * Preserves all files the agent created plus .claude session state.
9
+ * Best-effort: logs errors but does not throw.
10
+ */
11
+ export declare function persistSessionState(dataDir: string, sessionId: string, workspaceDir: string, agentName: string): boolean;
12
+ /**
13
+ * Restore entire workspace from data/sessions/<id>/workspace/ into the target directory.
14
+ * Returns true if state was restored, false if no persisted state exists.
15
+ */
16
+ export declare function restoreSessionState(dataDir: string, sessionId: string, workspaceDir: string): boolean;
17
+ /**
18
+ * Check if persisted state exists for a session.
19
+ */
20
+ export declare function hasPersistedState(dataDir: string, sessionId: string): boolean;
21
+ /**
22
+ * Delete persisted state for a session.
23
+ */
24
+ export declare function deleteSessionState(dataDir: string, sessionId: string): void;
25
+ /**
26
+ * Read metadata for a persisted session state.
27
+ */
28
+ export declare function getStateMetadata(dataDir: string, sessionId: string): StateMetadata | null;
29
+ /**
30
+ * Tar.gz the local persisted workspace and upload to cloud storage.
31
+ * Returns true on success, false if no store configured or upload fails.
32
+ * Best-effort: logs errors, doesn't throw.
33
+ */
34
+ export declare function syncStateToCloud(dataDir: string, sessionId: string): Promise<boolean>;
35
+ /**
36
+ * Download workspace tarball from cloud storage and extract into the local persist directory.
37
+ * Returns true if state was restored, false if store not configured or key not found.
38
+ */
39
+ export declare function restoreStateFromCloud(dataDir: string, sessionId: string): Promise<boolean>;
40
+ /**
41
+ * Delete cloud snapshot for a session. Best-effort.
42
+ */
43
+ export declare function deleteCloudState(sessionId: string): Promise<void>;
44
+ export {};
45
+ //# sourceMappingURL=state-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-persistence.d.ts","sourceRoot":"","sources":["../src/state-persistence.ts"],"names":[],"mappings":"AA4CA,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CA0BT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAiBT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAG7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQzF;AAID;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB3F;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BhG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE"}
@@ -0,0 +1,208 @@
1
+ import { join, basename } from 'node:path';
2
+ import { cpSync, mkdirSync, rmSync, existsSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs';
3
+ import { execSync } from 'node:child_process';
4
+ import { getSnapshotStore } from './snapshot-store.js';
5
+ const SESSIONS_SUBDIR = 'sessions';
6
+ const WORKSPACE_DIR = 'workspace';
7
+ const METADATA_FILE = 'metadata.json';
8
+ // Directory/file names to skip during workspace persistence.
9
+ // These are large, reproducible, or ephemeral — no value in backing up.
10
+ const SKIP_NAMES = new Set([
11
+ 'node_modules',
12
+ '.git',
13
+ '__pycache__',
14
+ '.cache',
15
+ '.npm',
16
+ '.pnpm-store',
17
+ '.yarn',
18
+ '.venv',
19
+ 'venv',
20
+ '.tmp',
21
+ 'tmp',
22
+ ]);
23
+ // File extensions to skip (temp files, sockets, lock files from running processes)
24
+ const SKIP_EXTENSIONS = new Set([
25
+ '.sock',
26
+ '.lock',
27
+ '.pid',
28
+ ]);
29
+ /**
30
+ * Filter for cpSync — skips large reproducible dirs and ephemeral files.
31
+ */
32
+ function copyFilter(src) {
33
+ const name = basename(src);
34
+ if (SKIP_NAMES.has(name))
35
+ return false;
36
+ for (const ext of SKIP_EXTENSIONS) {
37
+ if (name.endsWith(ext))
38
+ return false;
39
+ }
40
+ return true;
41
+ }
42
+ function sessionStateDir(dataDir, sessionId) {
43
+ return join(dataDir, SESSIONS_SUBDIR, sessionId);
44
+ }
45
+ /**
46
+ * Copy entire workspace to data/sessions/<id>/workspace/.
47
+ * Preserves all files the agent created plus .claude session state.
48
+ * Best-effort: logs errors but does not throw.
49
+ */
50
+ export function persistSessionState(dataDir, sessionId, workspaceDir, agentName) {
51
+ try {
52
+ if (!existsSync(workspaceDir)) {
53
+ return false;
54
+ }
55
+ const destDir = sessionStateDir(dataDir, sessionId);
56
+ const destWorkspace = join(destDir, WORKSPACE_DIR);
57
+ // Remove previous backup, then copy fresh (skipping node_modules, .git, etc.)
58
+ rmSync(destWorkspace, { recursive: true, force: true });
59
+ mkdirSync(destDir, { recursive: true });
60
+ cpSync(workspaceDir, destWorkspace, { recursive: true, filter: copyFilter });
61
+ const metadata = {
62
+ sessionId,
63
+ agentName,
64
+ persistedAt: new Date().toISOString(),
65
+ };
66
+ writeFileSync(join(destDir, METADATA_FILE), JSON.stringify(metadata, null, 2));
67
+ return true;
68
+ }
69
+ catch (err) {
70
+ console.error(`[state-persistence] Failed to persist state for session ${sessionId}:`, err);
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Restore entire workspace from data/sessions/<id>/workspace/ into the target directory.
76
+ * Returns true if state was restored, false if no persisted state exists.
77
+ */
78
+ export function restoreSessionState(dataDir, sessionId, workspaceDir) {
79
+ try {
80
+ const srcDir = sessionStateDir(dataDir, sessionId);
81
+ const srcWorkspace = join(srcDir, WORKSPACE_DIR);
82
+ if (!existsSync(srcWorkspace)) {
83
+ return false;
84
+ }
85
+ mkdirSync(workspaceDir, { recursive: true });
86
+ cpSync(srcWorkspace, workspaceDir, { recursive: true });
87
+ return true;
88
+ }
89
+ catch (err) {
90
+ console.error(`[state-persistence] Failed to restore state for session ${sessionId}:`, err);
91
+ return false;
92
+ }
93
+ }
94
+ /**
95
+ * Check if persisted state exists for a session.
96
+ */
97
+ export function hasPersistedState(dataDir, sessionId) {
98
+ const srcWorkspace = join(sessionStateDir(dataDir, sessionId), WORKSPACE_DIR);
99
+ return existsSync(srcWorkspace);
100
+ }
101
+ /**
102
+ * Delete persisted state for a session.
103
+ */
104
+ export function deleteSessionState(dataDir, sessionId) {
105
+ const dir = sessionStateDir(dataDir, sessionId);
106
+ rmSync(dir, { recursive: true, force: true });
107
+ }
108
+ /**
109
+ * Read metadata for a persisted session state.
110
+ */
111
+ export function getStateMetadata(dataDir, sessionId) {
112
+ try {
113
+ const metaPath = join(sessionStateDir(dataDir, sessionId), METADATA_FILE);
114
+ if (!existsSync(metaPath))
115
+ return null;
116
+ return JSON.parse(readFileSync(metaPath, 'utf-8'));
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ // --- Cloud-backed persistence ---
123
+ /**
124
+ * Tar.gz the local persisted workspace and upload to cloud storage.
125
+ * Returns true on success, false if no store configured or upload fails.
126
+ * Best-effort: logs errors, doesn't throw.
127
+ */
128
+ export async function syncStateToCloud(dataDir, sessionId) {
129
+ try {
130
+ const store = await getSnapshotStore();
131
+ if (!store)
132
+ return false;
133
+ const srcDir = join(sessionStateDir(dataDir, sessionId), WORKSPACE_DIR);
134
+ if (!existsSync(srcDir))
135
+ return false;
136
+ const tarPath = join(sessionStateDir(dataDir, sessionId), 'workspace.tar.gz');
137
+ try {
138
+ execSync(`tar czf ${JSON.stringify(tarPath)} -C ${JSON.stringify(srcDir)} .`, {
139
+ stdio: 'pipe',
140
+ timeout: 60_000,
141
+ });
142
+ const uploaded = await store.upload(sessionId, tarPath);
143
+ return uploaded;
144
+ }
145
+ finally {
146
+ // Clean up tar regardless of upload result
147
+ try {
148
+ unlinkSync(tarPath);
149
+ }
150
+ catch { /* ignore */ }
151
+ }
152
+ }
153
+ catch (err) {
154
+ console.error(`[state-persistence] Cloud sync failed for ${sessionId}:`, err);
155
+ return false;
156
+ }
157
+ }
158
+ /**
159
+ * Download workspace tarball from cloud storage and extract into the local persist directory.
160
+ * Returns true if state was restored, false if store not configured or key not found.
161
+ */
162
+ export async function restoreStateFromCloud(dataDir, sessionId) {
163
+ try {
164
+ const store = await getSnapshotStore();
165
+ if (!store)
166
+ return false;
167
+ const stateDir = sessionStateDir(dataDir, sessionId);
168
+ const tarPath = join(stateDir, 'workspace.tar.gz');
169
+ const destDir = join(stateDir, WORKSPACE_DIR);
170
+ mkdirSync(stateDir, { recursive: true });
171
+ const downloaded = await store.download(sessionId, tarPath);
172
+ if (!downloaded)
173
+ return false;
174
+ try {
175
+ mkdirSync(destDir, { recursive: true });
176
+ execSync(`tar xzf ${JSON.stringify(tarPath)} -C ${JSON.stringify(destDir)}`, {
177
+ stdio: 'pipe',
178
+ timeout: 60_000,
179
+ });
180
+ return true;
181
+ }
182
+ finally {
183
+ try {
184
+ unlinkSync(tarPath);
185
+ }
186
+ catch { /* ignore */ }
187
+ }
188
+ }
189
+ catch (err) {
190
+ console.error(`[state-persistence] Cloud restore failed for ${sessionId}:`, err);
191
+ return false;
192
+ }
193
+ }
194
+ /**
195
+ * Delete cloud snapshot for a session. Best-effort.
196
+ */
197
+ export async function deleteCloudState(sessionId) {
198
+ try {
199
+ const store = await getSnapshotStore();
200
+ if (!store)
201
+ return;
202
+ await store.delete(sessionId);
203
+ }
204
+ catch (err) {
205
+ console.error(`[state-persistence] Cloud delete failed for ${sessionId}:`, err);
206
+ }
207
+ }
208
+ //# sourceMappingURL=state-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-persistence.js","sourceRoot":"","sources":["../src/state-persistence.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@ash-ai/sandbox",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/ash-ai/ash.git",
22
+ "directory": "packages/sandbox"
23
+ },
24
+ "license": "MIT",
25
+ "description": "Sandbox management: process spawning, pool, bridge client, resource limits, state persistence",
26
+ "dependencies": {
27
+ "@ash-ai/shared": "0.0.1"
28
+ },
29
+ "peerDependencies": {
30
+ "@aws-sdk/client-s3": "^3.700.0",
31
+ "@google-cloud/storage": "^7.0.0"
32
+ },
33
+ "peerDependenciesMeta": {
34
+ "@aws-sdk/client-s3": {
35
+ "optional": true
36
+ },
37
+ "@google-cloud/storage": {
38
+ "optional": true
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "clean": "rm -rf dist *.tsbuildinfo",
44
+ "typecheck": "tsc --noEmit"
45
+ }
46
+ }