@aiassesstech/sam 0.2.4 → 0.3.0

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.
Files changed (43) hide show
  1. package/dist/cli/runner.d.ts +1 -0
  2. package/dist/cli/runner.d.ts.map +1 -1
  3. package/dist/cli/runner.js +5 -1
  4. package/dist/cli/runner.js.map +1 -1
  5. package/dist/cli/setup.d.ts +1 -0
  6. package/dist/cli/setup.d.ts.map +1 -1
  7. package/dist/cli/setup.js +125 -2
  8. package/dist/cli/setup.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/plugin.d.ts.map +1 -1
  14. package/dist/plugin.js +19 -2
  15. package/dist/plugin.js.map +1 -1
  16. package/dist/sandbox/sandbox-manager.d.ts +58 -0
  17. package/dist/sandbox/sandbox-manager.d.ts.map +1 -0
  18. package/dist/sandbox/sandbox-manager.js +373 -0
  19. package/dist/sandbox/sandbox-manager.js.map +1 -0
  20. package/dist/sandbox/types.d.ts +65 -0
  21. package/dist/sandbox/types.d.ts.map +1 -0
  22. package/dist/sandbox/types.js +14 -0
  23. package/dist/sandbox/types.js.map +1 -0
  24. package/dist/tools/sam-artifact.d.ts +43 -0
  25. package/dist/tools/sam-artifact.d.ts.map +1 -0
  26. package/dist/tools/sam-artifact.js +102 -0
  27. package/dist/tools/sam-artifact.js.map +1 -0
  28. package/dist/tools/sam-execute.d.ts +60 -0
  29. package/dist/tools/sam-execute.d.ts.map +1 -0
  30. package/dist/tools/sam-execute.js +109 -0
  31. package/dist/tools/sam-execute.js.map +1 -0
  32. package/dist/tools/sam-sandbox.d.ts +29 -0
  33. package/dist/tools/sam-sandbox.d.ts.map +1 -0
  34. package/dist/tools/sam-sandbox.js +83 -0
  35. package/dist/tools/sam-sandbox.js.map +1 -0
  36. package/dist/tools/sam-status.js +1 -1
  37. package/dist/tools/sam-test.d.ts +55 -0
  38. package/dist/tools/sam-test.d.ts.map +1 -0
  39. package/dist/tools/sam-test.js +191 -0
  40. package/dist/tools/sam-test.js.map +1 -0
  41. package/docker/Dockerfile +16 -0
  42. package/openclaw.plugin.json +1 -1
  43. package/package.json +2 -1
@@ -0,0 +1,373 @@
1
+ /**
2
+ * SandboxManager — Docker container lifecycle for code execution
3
+ *
4
+ * Handles the per-execution container lifecycle:
5
+ * 1. Create container with resource limits
6
+ * 2. Copy input files into /workspace
7
+ * 3. Execute code as builder user
8
+ * 4. Capture stdout/stderr/exit code
9
+ * 5. Extract output files from /workspace
10
+ * 6. Destroy container
11
+ *
12
+ * VPS constraint: Only one sandbox runs at a time (4GB RAM CX23).
13
+ * All Docker operations use CLI commands via child_process.
14
+ */
15
+ import { execFile, spawn } from 'node:child_process';
16
+ import * as fs from 'node:fs';
17
+ import * as path from 'node:path';
18
+ import * as crypto from 'node:crypto';
19
+ import { promisify } from 'node:util';
20
+ import { DEFAULT_SANDBOX_CONFIG } from './types.js';
21
+ const execFileAsync = promisify(execFile);
22
+ export class SandboxManager {
23
+ config;
24
+ artifactBase;
25
+ busy = false;
26
+ constructor(config = {}, openclawHome) {
27
+ this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config };
28
+ const home = openclawHome || process.env.OPENCLAW_HOME ||
29
+ path.join(process.env.HOME || '/root', '.openclaw');
30
+ this.artifactBase = path.join(home, this.config.artifactDir);
31
+ fs.mkdirSync(this.artifactBase, { recursive: true });
32
+ }
33
+ async execute(language, code, files = [], opts = {}) {
34
+ if (this.busy) {
35
+ throw new Error('Sandbox busy — only one execution at a time (VPS resource constraint)');
36
+ }
37
+ this.busy = true;
38
+ const startTime = Date.now();
39
+ const containerId = `sam-sandbox-${Date.now()}`;
40
+ const timeout = opts.timeoutMs ?? this.config.timeoutMs;
41
+ try {
42
+ await this.createContainer(containerId, opts.networkEnabled ?? this.config.networkEnabled);
43
+ for (const file of files) {
44
+ await this.writeFileToContainer(containerId, file);
45
+ }
46
+ const entryFile = this.writeEntryScript(language, code);
47
+ await this.writeFileToContainer(containerId, entryFile);
48
+ const cmd = this.buildExecCommand(language);
49
+ const { stdout, stderr, exitCode, timedOut } = await this.execInContainer(containerId, cmd, timeout);
50
+ const filesCreated = await this.listContainerFiles(containerId);
51
+ if (opts.erId) {
52
+ await this.extractArtifacts(containerId, opts.erId);
53
+ }
54
+ const executionTimeMs = Date.now() - startTime;
55
+ return {
56
+ stdout,
57
+ stderr,
58
+ exitCode,
59
+ executionTimeMs,
60
+ memoryPeakMb: 0,
61
+ filesCreated,
62
+ timedOut,
63
+ containerId,
64
+ };
65
+ }
66
+ finally {
67
+ await this.destroyContainer(containerId).catch(() => { });
68
+ this.busy = false;
69
+ }
70
+ }
71
+ async getStatus() {
72
+ const dockerAvailable = await this.isDockerAvailable();
73
+ const imageExists = dockerAvailable ? await this.imageExists() : false;
74
+ const runningContainers = dockerAvailable ? await this.countRunningContainers() : 0;
75
+ const artifactDiskUsageMb = this.getArtifactDiskUsage();
76
+ return {
77
+ dockerAvailable,
78
+ imageExists,
79
+ runningContainers,
80
+ artifactDiskUsageMb,
81
+ };
82
+ }
83
+ async buildImage() {
84
+ const dockerfilePath = this.findDockerfile();
85
+ if (!dockerfilePath) {
86
+ return { success: false, output: 'Dockerfile not found' };
87
+ }
88
+ try {
89
+ const { stdout, stderr } = await execFileAsync('docker', [
90
+ 'build', '-t', this.config.image, '-f', dockerfilePath, path.dirname(dockerfilePath),
91
+ ], { timeout: 5 * 60 * 1000 });
92
+ return { success: true, output: stdout + stderr };
93
+ }
94
+ catch (err) {
95
+ return { success: false, output: err.stderr || err.message };
96
+ }
97
+ }
98
+ async cleanup() {
99
+ let removed = 0;
100
+ try {
101
+ const { stdout } = await execFileAsync('docker', [
102
+ 'ps', '-a', '--filter', 'name=sam-sandbox-', '--format', '{{.ID}}',
103
+ ]);
104
+ const ids = stdout.trim().split('\n').filter(Boolean);
105
+ for (const id of ids) {
106
+ await execFileAsync('docker', ['rm', '-f', id]).catch(() => { });
107
+ removed++;
108
+ }
109
+ }
110
+ catch { /* no containers */ }
111
+ const reclaimedMb = this.cleanupOldArtifacts();
112
+ return { removed, reclaimedMb };
113
+ }
114
+ // Artifact management
115
+ listArtifacts(erId) {
116
+ if (!fs.existsSync(this.artifactBase))
117
+ return [];
118
+ const dirs = fs.readdirSync(this.artifactBase, { withFileTypes: true })
119
+ .filter((d) => d.isDirectory())
120
+ .filter((d) => !erId || d.name.startsWith(erId));
121
+ return dirs.map((d) => {
122
+ const dirPath = path.join(this.artifactBase, d.name);
123
+ const files = this.readdirDeep(dirPath);
124
+ const sizeMb = files.reduce((sum, f) => {
125
+ try {
126
+ return sum + fs.statSync(f).size;
127
+ }
128
+ catch {
129
+ return sum;
130
+ }
131
+ }, 0) / (1024 * 1024);
132
+ const parts = d.name.split('_');
133
+ return {
134
+ erId: parts[0] || d.name,
135
+ timestamp: parts[1] || new Date().toISOString(),
136
+ files: files.map((f) => path.relative(dirPath, f)),
137
+ sizeMb: Math.round(sizeMb * 100) / 100,
138
+ };
139
+ });
140
+ }
141
+ async packageArtifact(erId, selfReviewNotes) {
142
+ const artifacts = this.listArtifacts(erId);
143
+ if (artifacts.length === 0)
144
+ throw new Error(`No artifacts found for ${erId}`);
145
+ const latest = artifacts[artifacts.length - 1];
146
+ const artifactDir = path.join(this.artifactBase, `${latest.erId}_${latest.timestamp}`);
147
+ const manifest = {
148
+ erId,
149
+ buildTimestamp: new Date().toISOString(),
150
+ files: latest.files.map((f) => {
151
+ const fullPath = path.join(artifactDir, f);
152
+ const content = fs.existsSync(fullPath) ? fs.readFileSync(fullPath) : Buffer.alloc(0);
153
+ return {
154
+ filename: f,
155
+ sizeBytes: content.length,
156
+ sha256: crypto.createHash('sha256').update(content).digest('hex'),
157
+ };
158
+ }),
159
+ selfReviewNotes,
160
+ };
161
+ fs.writeFileSync(path.join(artifactDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
162
+ const tarPath = path.join(this.artifactBase, `${erId}-artifact.tar.gz`);
163
+ await execFileAsync('tar', ['-czf', tarPath, '-C', this.artifactBase, path.basename(artifactDir)]);
164
+ return tarPath;
165
+ }
166
+ // ── Private: Docker Operations ─────────────────────────────────
167
+ async createContainer(id, networkEnabled) {
168
+ const args = [
169
+ 'run', '-d',
170
+ '--name', id,
171
+ '--cpus', String(this.config.cpuLimit),
172
+ '--memory', this.config.memoryLimit,
173
+ '--pids-limit', String(this.config.maxPids),
174
+ '--read-only',
175
+ '--tmpfs', `/workspace:rw,size=${this.config.diskLimit}`,
176
+ '--tmpfs', '/tmp:rw,size=100m',
177
+ ];
178
+ if (!networkEnabled) {
179
+ args.push('--network', 'none');
180
+ }
181
+ args.push(this.config.image, 'sleep', '3600');
182
+ await execFileAsync('docker', args);
183
+ }
184
+ async writeFileToContainer(containerId, file) {
185
+ const tmpDir = fs.mkdtempSync(path.join('/tmp', 'sam-sandbox-'));
186
+ const tmpFile = path.join(tmpDir, file.filename);
187
+ const dir = path.dirname(tmpFile);
188
+ fs.mkdirSync(dir, { recursive: true });
189
+ fs.writeFileSync(tmpFile, file.content);
190
+ await execFileAsync('docker', ['cp', tmpFile, `${containerId}:/workspace/${file.filename}`]);
191
+ fs.rmSync(tmpDir, { recursive: true, force: true });
192
+ }
193
+ async execInContainer(containerId, command, timeoutMs) {
194
+ return new Promise((resolve) => {
195
+ let stdout = '';
196
+ let stderr = '';
197
+ let timedOut = false;
198
+ const proc = spawn('docker', ['exec', containerId, ...command], {
199
+ timeout: timeoutMs,
200
+ });
201
+ proc.stdout.on('data', (d) => { stdout += d.toString(); });
202
+ proc.stderr.on('data', (d) => { stderr += d.toString(); });
203
+ const timer = setTimeout(() => {
204
+ timedOut = true;
205
+ proc.kill('SIGTERM');
206
+ setTimeout(() => proc.kill('SIGKILL'), 5000);
207
+ }, timeoutMs);
208
+ proc.on('close', (code) => {
209
+ clearTimeout(timer);
210
+ resolve({
211
+ stdout: stdout.slice(0, 500_000),
212
+ stderr: stderr.slice(0, 500_000),
213
+ exitCode: code ?? 1,
214
+ timedOut,
215
+ });
216
+ });
217
+ proc.on('error', (err) => {
218
+ clearTimeout(timer);
219
+ resolve({ stdout, stderr: stderr + err.message, exitCode: 1, timedOut: false });
220
+ });
221
+ });
222
+ }
223
+ async listContainerFiles(containerId) {
224
+ try {
225
+ const { stdout } = await execFileAsync('docker', [
226
+ 'exec', containerId, 'find', '/workspace', '-type', 'f', '-not', '-name', '._sam_entry.*',
227
+ ]);
228
+ return stdout.trim().split('\n').filter(Boolean)
229
+ .map((f) => f.replace('/workspace/', ''));
230
+ }
231
+ catch {
232
+ return [];
233
+ }
234
+ }
235
+ async extractArtifacts(containerId, erId) {
236
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
237
+ const destDir = path.join(this.artifactBase, `${erId}_${timestamp}`);
238
+ fs.mkdirSync(destDir, { recursive: true });
239
+ try {
240
+ await execFileAsync('docker', ['cp', `${containerId}:/workspace/.`, destDir]);
241
+ }
242
+ catch {
243
+ console.warn(`[sam] Could not extract artifacts for ${erId}`);
244
+ }
245
+ }
246
+ async destroyContainer(containerId) {
247
+ await execFileAsync('docker', ['rm', '-f', containerId]).catch(() => { });
248
+ }
249
+ async isDockerAvailable() {
250
+ try {
251
+ await execFileAsync('docker', ['info'], { timeout: 5000 });
252
+ return true;
253
+ }
254
+ catch {
255
+ return false;
256
+ }
257
+ }
258
+ async imageExists() {
259
+ try {
260
+ await execFileAsync('docker', ['image', 'inspect', this.config.image]);
261
+ return true;
262
+ }
263
+ catch {
264
+ return false;
265
+ }
266
+ }
267
+ async countRunningContainers() {
268
+ try {
269
+ const { stdout } = await execFileAsync('docker', [
270
+ 'ps', '--filter', 'name=sam-sandbox-', '--format', '{{.ID}}',
271
+ ]);
272
+ return stdout.trim().split('\n').filter(Boolean).length;
273
+ }
274
+ catch {
275
+ return 0;
276
+ }
277
+ }
278
+ // ── Private: Helpers ───────────────────────────────────────────
279
+ writeEntryScript(language, code) {
280
+ const runners = {
281
+ nodejs: { filename: '._sam_entry.js', wrap: (c) => c },
282
+ python: { filename: '._sam_entry.py', wrap: (c) => c },
283
+ bash: { filename: '._sam_entry.sh', wrap: (c) => `#!/bin/bash\nset -euo pipefail\n${c}` },
284
+ };
285
+ const runner = runners[language];
286
+ return { filename: runner.filename, content: runner.wrap(code) };
287
+ }
288
+ buildExecCommand(language) {
289
+ const cmds = {
290
+ nodejs: ['node', '/workspace/._sam_entry.js'],
291
+ python: ['python3', '/workspace/._sam_entry.py'],
292
+ bash: ['bash', '/workspace/._sam_entry.sh'],
293
+ };
294
+ return cmds[language];
295
+ }
296
+ findDockerfile() {
297
+ const candidates = [
298
+ path.join(process.cwd(), 'docker', 'Dockerfile'),
299
+ path.join(__dirname, '..', '..', 'docker', 'Dockerfile'),
300
+ ];
301
+ // When running via npx, resolve relative to the package
302
+ try {
303
+ const pkgDir = path.resolve(__dirname, '..', '..');
304
+ candidates.push(path.join(pkgDir, 'docker', 'Dockerfile'));
305
+ }
306
+ catch { /* ignore */ }
307
+ for (const c of candidates) {
308
+ if (fs.existsSync(c))
309
+ return c;
310
+ }
311
+ return null;
312
+ }
313
+ getArtifactDiskUsage() {
314
+ if (!fs.existsSync(this.artifactBase))
315
+ return 0;
316
+ const files = this.readdirDeep(this.artifactBase);
317
+ const bytes = files.reduce((sum, f) => {
318
+ try {
319
+ return sum + fs.statSync(f).size;
320
+ }
321
+ catch {
322
+ return sum;
323
+ }
324
+ }, 0);
325
+ return Math.round(bytes / (1024 * 1024) * 100) / 100;
326
+ }
327
+ cleanupOldArtifacts() {
328
+ if (!fs.existsSync(this.artifactBase))
329
+ return 0;
330
+ const cutoff = Date.now() - (7 * 24 * 60 * 60 * 1000);
331
+ let reclaimedBytes = 0;
332
+ const entries = fs.readdirSync(this.artifactBase, { withFileTypes: true });
333
+ for (const entry of entries) {
334
+ if (!entry.isDirectory())
335
+ continue;
336
+ const dirPath = path.join(this.artifactBase, entry.name);
337
+ try {
338
+ const stat = fs.statSync(dirPath);
339
+ if (stat.mtimeMs < cutoff) {
340
+ const files = this.readdirDeep(dirPath);
341
+ reclaimedBytes += files.reduce((s, f) => {
342
+ try {
343
+ return s + fs.statSync(f).size;
344
+ }
345
+ catch {
346
+ return s;
347
+ }
348
+ }, 0);
349
+ fs.rmSync(dirPath, { recursive: true, force: true });
350
+ }
351
+ }
352
+ catch { /* skip */ }
353
+ }
354
+ return Math.round(reclaimedBytes / (1024 * 1024) * 100) / 100;
355
+ }
356
+ readdirDeep(dir) {
357
+ const results = [];
358
+ if (!fs.existsSync(dir))
359
+ return results;
360
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
361
+ for (const entry of entries) {
362
+ const fullPath = path.join(dir, entry.name);
363
+ if (entry.isDirectory()) {
364
+ results.push(...this.readdirDeep(fullPath));
365
+ }
366
+ else {
367
+ results.push(fullPath);
368
+ }
369
+ }
370
+ return results;
371
+ }
372
+ }
373
+ //# sourceMappingURL=sandbox-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-manager.js","sourceRoot":"","sources":["../../src/sandbox/sandbox-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Sandbox Types — Docker execution environment types
3
+ */
4
+ export interface SandboxConfig {
5
+ image: string;
6
+ cpuLimit: number;
7
+ memoryLimit: string;
8
+ diskLimit: string;
9
+ timeoutMs: number;
10
+ maxPids: number;
11
+ networkEnabled: boolean;
12
+ artifactDir: string;
13
+ }
14
+ export declare const DEFAULT_SANDBOX_CONFIG: SandboxConfig;
15
+ export interface SandboxFile {
16
+ filename: string;
17
+ content: string;
18
+ }
19
+ export interface ExecutionResult {
20
+ stdout: string;
21
+ stderr: string;
22
+ exitCode: number;
23
+ executionTimeMs: number;
24
+ memoryPeakMb: number;
25
+ filesCreated: string[];
26
+ timedOut: boolean;
27
+ containerId: string;
28
+ }
29
+ export interface TestResult {
30
+ passed: number;
31
+ failed: number;
32
+ skipped: number;
33
+ failureDetails: Array<{
34
+ testName: string;
35
+ error: string;
36
+ expected?: string;
37
+ actual?: string;
38
+ }>;
39
+ executionTimeMs: number;
40
+ rawOutput: string;
41
+ }
42
+ export interface ArtifactManifest {
43
+ erId: string;
44
+ buildTimestamp: string;
45
+ files: Array<{
46
+ filename: string;
47
+ sizeBytes: number;
48
+ sha256: string;
49
+ }>;
50
+ testResults?: {
51
+ passed: number;
52
+ failed: number;
53
+ skipped: number;
54
+ };
55
+ selfReviewNotes?: string;
56
+ }
57
+ export type SandboxLanguage = 'nodejs' | 'python' | 'bash';
58
+ export interface SandboxStatus {
59
+ dockerAvailable: boolean;
60
+ imageExists: boolean;
61
+ imageVersion?: string;
62
+ runningContainers: number;
63
+ artifactDiskUsageMb: number;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,EAAE,aASpC,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Sandbox Types — Docker execution environment types
3
+ */
4
+ export const DEFAULT_SANDBOX_CONFIG = {
5
+ image: 'sam-sandbox:latest',
6
+ cpuLimit: 1,
7
+ memoryLimit: '512m',
8
+ diskLimit: '1g',
9
+ timeoutMs: 10 * 60 * 1000,
10
+ maxPids: 256,
11
+ networkEnabled: false,
12
+ artifactDir: '.sam-artifacts',
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,KAAK,EAAE,oBAAoB;IAC3B,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACzB,OAAO,EAAE,GAAG;IACZ,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,gBAAgB;CAC9B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * sam_artifact — Package build artifacts for Archie review
3
+ *
4
+ * Actions: list, package, cleanup
5
+ */
6
+ import type { SandboxManager } from '../sandbox/sandbox-manager.js';
7
+ export declare function createArtifactTool(sandbox: SandboxManager): {
8
+ name: string;
9
+ description: string;
10
+ parameters: {
11
+ type: "object";
12
+ properties: {
13
+ action: {
14
+ type: string;
15
+ enum: string[];
16
+ description: string;
17
+ };
18
+ er_id: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ self_review_notes: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ };
27
+ required: string[];
28
+ };
29
+ execute(_toolCallId: string, params: Record<string, unknown>): Promise<{
30
+ content: {
31
+ type: string;
32
+ text: string;
33
+ }[];
34
+ isError?: undefined;
35
+ } | {
36
+ content: {
37
+ type: string;
38
+ text: string;
39
+ }[];
40
+ isError: boolean;
41
+ }>;
42
+ };
43
+ //# sourceMappingURL=sam-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sam-artifact.d.ts","sourceRoot":"","sources":["../../src/tools/sam-artifact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;kBAyB5B,MAAM,EAAE;;yBAEP,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAwErE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * sam_artifact — Package build artifacts for Archie review
3
+ *
4
+ * Actions: list, package, cleanup
5
+ */
6
+ export function createArtifactTool(sandbox) {
7
+ return {
8
+ name: 'sam_artifact',
9
+ description: 'Manage build artifacts. ' +
10
+ 'list: Show all artifacts with ER-ID, timestamp, file count, size. ' +
11
+ 'package: Create tar.gz of artifact directory with manifest.json. ' +
12
+ 'cleanup: Remove artifacts older than 7 days.',
13
+ parameters: {
14
+ type: 'object',
15
+ properties: {
16
+ action: {
17
+ type: 'string',
18
+ enum: ['list', 'package', 'cleanup'],
19
+ description: 'Artifact management action',
20
+ },
21
+ er_id: {
22
+ type: 'string',
23
+ description: 'Engineering Request ID (required for package, optional filter for list)',
24
+ },
25
+ self_review_notes: {
26
+ type: 'string',
27
+ description: 'Self-review notes to include in the artifact manifest (for package)',
28
+ },
29
+ },
30
+ required: ['action'],
31
+ },
32
+ async execute(_toolCallId, params) {
33
+ try {
34
+ const action = params.action;
35
+ const erId = params.er_id;
36
+ if (action === 'list') {
37
+ const artifacts = sandbox.listArtifacts(erId);
38
+ return {
39
+ content: [{
40
+ type: 'text',
41
+ text: JSON.stringify({
42
+ action: 'list',
43
+ count: artifacts.length,
44
+ artifacts: artifacts.map((a) => ({
45
+ erId: a.erId,
46
+ timestamp: a.timestamp,
47
+ fileCount: a.files.length,
48
+ sizeMb: a.sizeMb,
49
+ })),
50
+ }, null, 2),
51
+ }],
52
+ };
53
+ }
54
+ if (action === 'package') {
55
+ if (!erId) {
56
+ return {
57
+ content: [{ type: 'text', text: 'er_id is required for package action' }],
58
+ isError: true,
59
+ };
60
+ }
61
+ const selfReviewNotes = params.self_review_notes;
62
+ const tarPath = await sandbox.packageArtifact(erId, selfReviewNotes);
63
+ return {
64
+ content: [{
65
+ type: 'text',
66
+ text: JSON.stringify({
67
+ action: 'package',
68
+ erId,
69
+ artifactPath: tarPath,
70
+ message: `Artifact packaged for Archie review: ${tarPath}`,
71
+ }, null, 2),
72
+ }],
73
+ };
74
+ }
75
+ if (action === 'cleanup') {
76
+ const result = await sandbox.cleanup();
77
+ return {
78
+ content: [{
79
+ type: 'text',
80
+ text: JSON.stringify({
81
+ action: 'cleanup',
82
+ containersRemoved: result.removed,
83
+ diskReclaimedMb: result.reclaimedMb,
84
+ }, null, 2),
85
+ }],
86
+ };
87
+ }
88
+ return {
89
+ content: [{ type: 'text', text: `Unknown action: ${action}` }],
90
+ isError: true,
91
+ };
92
+ }
93
+ catch (err) {
94
+ return {
95
+ content: [{ type: 'text', text: `sam_artifact error: ${err instanceof Error ? err.message : String(err)}` }],
96
+ isError: true,
97
+ };
98
+ }
99
+ },
100
+ };
101
+ }
102
+ //# sourceMappingURL=sam-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sam-artifact.js","sourceRoot":"","sources":["../../src/tools/sam-artifact.ts"],"names":[],"mappings":"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"}