@agentsh/secure-sandbox 0.1.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 (52) hide show
  1. package/README.md +198 -0
  2. package/dist/adapters/blaxel.d.ts +5 -0
  3. package/dist/adapters/blaxel.js +9 -0
  4. package/dist/adapters/blaxel.js.map +1 -0
  5. package/dist/adapters/cloudflare.d.ts +5 -0
  6. package/dist/adapters/cloudflare.js +9 -0
  7. package/dist/adapters/cloudflare.js.map +1 -0
  8. package/dist/adapters/daytona.d.ts +5 -0
  9. package/dist/adapters/daytona.js +9 -0
  10. package/dist/adapters/daytona.js.map +1 -0
  11. package/dist/adapters/e2b.d.ts +5 -0
  12. package/dist/adapters/e2b.js +9 -0
  13. package/dist/adapters/e2b.js.map +1 -0
  14. package/dist/adapters/index.d.ts +6 -0
  15. package/dist/adapters/index.js +26 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/vercel.d.ts +5 -0
  18. package/dist/adapters/vercel.js +8 -0
  19. package/dist/adapters/vercel.js.map +1 -0
  20. package/dist/chunk-2P37YGN7.js +52 -0
  21. package/dist/chunk-2P37YGN7.js.map +1 -0
  22. package/dist/chunk-45FKFVMC.js +55 -0
  23. package/dist/chunk-45FKFVMC.js.map +1 -0
  24. package/dist/chunk-JY5ERJTX.js +49 -0
  25. package/dist/chunk-JY5ERJTX.js.map +1 -0
  26. package/dist/chunk-L4KFLVNU.js +33 -0
  27. package/dist/chunk-L4KFLVNU.js.map +1 -0
  28. package/dist/chunk-LMN3KM53.js +48 -0
  29. package/dist/chunk-LMN3KM53.js.map +1 -0
  30. package/dist/chunk-NWHVZ3DG.js +599 -0
  31. package/dist/chunk-NWHVZ3DG.js.map +1 -0
  32. package/dist/chunk-OANLKSOD.js +28 -0
  33. package/dist/chunk-OANLKSOD.js.map +1 -0
  34. package/dist/chunk-PZ5AY32C.js +10 -0
  35. package/dist/chunk-PZ5AY32C.js.map +1 -0
  36. package/dist/chunk-UYEAO27E.js +65 -0
  37. package/dist/chunk-UYEAO27E.js.map +1 -0
  38. package/dist/esm-7TZRRYDK.js +1375 -0
  39. package/dist/esm-7TZRRYDK.js.map +1 -0
  40. package/dist/index-D0UvBOzr.d.ts +463 -0
  41. package/dist/index-aQ1TVPtG.d.ts +16 -0
  42. package/dist/index.d.ts +77 -0
  43. package/dist/index.js +774 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/policies/index.d.ts +2 -0
  46. package/dist/policies/index.js +26 -0
  47. package/dist/policies/index.js.map +1 -0
  48. package/dist/testing/index.d.ts +13 -0
  49. package/dist/testing/index.js +32 -0
  50. package/dist/testing/index.js.map +1 -0
  51. package/dist/types-BwEbraFo.d.ts +194 -0
  52. package/package.json +99 -0
@@ -0,0 +1,28 @@
1
+ // src/core/shell.ts
2
+ var SAFE_ARG = /^[a-zA-Z0-9._\-\/=:@]+$/;
3
+ function quoteArg(arg) {
4
+ if (SAFE_ARG.test(arg)) return arg;
5
+ return "'" + arg.replace(/'/g, "'\\''") + "'";
6
+ }
7
+ function shellEscape(cmd, args) {
8
+ if (!args || args.length === 0) return cmd;
9
+ const escaped = args.map(quoteArg);
10
+ return [cmd, ...escaped].join(" ");
11
+ }
12
+ var SAFE_ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;
13
+ function envPrefix(env) {
14
+ if (!env) return "";
15
+ const parts = [];
16
+ for (const [k, v] of Object.entries(env)) {
17
+ if (!SAFE_ENV_KEY.test(k)) continue;
18
+ parts.push(`${k}=${quoteArg(v)}`);
19
+ }
20
+ if (parts.length === 0) return "";
21
+ return parts.join(" ") + " ";
22
+ }
23
+
24
+ export {
25
+ shellEscape,
26
+ envPrefix
27
+ };
28
+ //# sourceMappingURL=chunk-OANLKSOD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/shell.ts"],"sourcesContent":["/**\n * Shell escape utility for safe command construction.\n *\n * Joins a command and its arguments into a single shell-safe string.\n * Args containing shell metacharacters or spaces are wrapped in single quotes,\n * with internal single quotes escaped as `'\\''`.\n */\n\n/** A string is \"safe\" (no quoting needed) if it matches this pattern. */\nconst SAFE_ARG = /^[a-zA-Z0-9._\\-\\/=:@]+$/;\n\nfunction quoteArg(arg: string): string {\n if (SAFE_ARG.test(arg)) return arg;\n return \"'\" + arg.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\nexport function shellEscape(cmd: string, args?: string[]): string {\n if (!args || args.length === 0) return cmd;\n const escaped = args.map(quoteArg);\n return [cmd, ...escaped].join(' ');\n}\n\n/** Env key must be a valid shell identifier: letters, digits, underscores, starting with non-digit. */\nconst SAFE_ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Convert env vars to inline shell assignments prefix.\n * e.g. { TRACEPARENT: '00-abc-def-01' } → \"TRACEPARENT='00-abc-def-01' \"\n * Returns empty string if env is undefined or empty.\n * Keys that don't match a strict identifier pattern are silently skipped.\n */\nexport function envPrefix(env?: Record<string, string>): string {\n if (!env) return '';\n const parts: string[] = [];\n for (const [k, v] of Object.entries(env)) {\n if (!SAFE_ENV_KEY.test(k)) continue;\n parts.push(`${k}=${quoteArg(v)}`);\n }\n if (parts.length === 0) return '';\n return parts.join(' ') + ' ';\n}\n"],"mappings":";AASA,IAAM,WAAW;AAEjB,SAAS,SAAS,KAAqB;AACrC,MAAI,SAAS,KAAK,GAAG,EAAG,QAAO;AAC/B,SAAO,MAAM,IAAI,QAAQ,MAAM,OAAO,IAAI;AAC5C;AAEO,SAAS,YAAY,KAAa,MAAyB;AAChE,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AACvC,QAAM,UAAU,KAAK,IAAI,QAAQ;AACjC,SAAO,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG;AACnC;AAGA,IAAM,eAAe;AAQd,SAAS,UAAU,KAAsC;AAC9D,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,CAAC,aAAa,KAAK,CAAC,EAAG;AAC3B,UAAM,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE;AAAA,EAClC;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,GAAG,IAAI;AAC3B;","names":[]}
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,65 @@
1
+ import {
2
+ envPrefix,
3
+ shellEscape
4
+ } from "./chunk-OANLKSOD.js";
5
+
6
+ // src/adapters/blaxel.ts
7
+ function blaxel(sandbox) {
8
+ return {
9
+ async exec(cmd, args, opts) {
10
+ let command = `${envPrefix(opts?.env)}${shellEscape(cmd, args)}`;
11
+ if (opts?.sudo) command = `sudo ${command}`;
12
+ const execOpts = {
13
+ command,
14
+ waitForCompletion: !opts?.detached,
15
+ timeout: 60
16
+ };
17
+ if (opts?.cwd) execOpts.workingDir = opts.cwd;
18
+ if (opts?.detached) {
19
+ execOpts.command = `nohup ${command} > /dev/null 2>&1 &`;
20
+ sandbox.process.exec(execOpts).catch(() => {
21
+ });
22
+ return { stdout: "", stderr: "", exitCode: 0 };
23
+ }
24
+ const result = await sandbox.process.exec(execOpts);
25
+ return {
26
+ stdout: result.stdout ?? "",
27
+ stderr: result.stderr ?? "",
28
+ exitCode: result.exitCode ?? 0
29
+ };
30
+ },
31
+ async writeFile(path, content) {
32
+ const buf = Buffer.isBuffer(content) ? content : Buffer.from(content);
33
+ const b64 = buf.toString("base64");
34
+ const command = shellEscape("sh", ["-c", 'printf "%s" "$1" | base64 -d > "$2"', "_", b64, path]);
35
+ const result = await sandbox.process.exec({
36
+ command,
37
+ waitForCompletion: true,
38
+ timeout: 60
39
+ });
40
+ if ((result.exitCode ?? 0) !== 0) {
41
+ throw new Error(`writeFile failed (exit ${result.exitCode}): ${result.stderr ?? ""}`);
42
+ }
43
+ },
44
+ async readFile(path) {
45
+ const command = shellEscape("cat", [path]);
46
+ const result = await sandbox.process.exec({
47
+ command,
48
+ waitForCompletion: true,
49
+ timeout: 60
50
+ });
51
+ if ((result.exitCode ?? 0) !== 0) {
52
+ throw new Error(`readFile failed (exit ${result.exitCode}): ${result.stderr ?? ""}`);
53
+ }
54
+ return result.stdout ?? "";
55
+ },
56
+ async stop() {
57
+ await sandbox.delete();
58
+ }
59
+ };
60
+ }
61
+
62
+ export {
63
+ blaxel
64
+ };
65
+ //# sourceMappingURL=chunk-UYEAO27E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/blaxel.ts"],"sourcesContent":["import type { SandboxAdapter } from '../core/types.js';\nimport { shellEscape, envPrefix } from '../core/shell.js';\n\nexport function blaxel(sandbox: any): SandboxAdapter {\n return {\n async exec(cmd, args, opts) {\n let command = `${envPrefix(opts?.env)}${shellEscape(cmd, args)}`;\n if (opts?.sudo) command = `sudo ${command}`;\n\n const execOpts: Record<string, unknown> = {\n command,\n waitForCompletion: !opts?.detached,\n timeout: 60,\n };\n if (opts?.cwd) execOpts.workingDir = opts.cwd;\n\n if (opts?.detached) {\n execOpts.command = `nohup ${command} > /dev/null 2>&1 &`;\n sandbox.process.exec(execOpts).catch(() => {});\n return { stdout: '', stderr: '', exitCode: 0 };\n }\n\n const result = await sandbox.process.exec(execOpts);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode ?? 0,\n };\n },\n async writeFile(path, content) {\n const buf = Buffer.isBuffer(content) ? content : Buffer.from(content);\n const b64 = buf.toString('base64');\n const command = shellEscape('sh', ['-c', 'printf \"%s\" \"$1\" | base64 -d > \"$2\"', '_', b64, path]);\n const result = await sandbox.process.exec({\n command,\n waitForCompletion: true,\n timeout: 60,\n });\n if ((result.exitCode ?? 0) !== 0) {\n throw new Error(`writeFile failed (exit ${result.exitCode}): ${result.stderr ?? ''}`);\n }\n },\n async readFile(path) {\n const command = shellEscape('cat', [path]);\n const result = await sandbox.process.exec({\n command,\n waitForCompletion: true,\n timeout: 60,\n });\n if ((result.exitCode ?? 0) !== 0) {\n throw new Error(`readFile failed (exit ${result.exitCode}): ${result.stderr ?? ''}`);\n }\n return result.stdout ?? '';\n },\n async stop() {\n await sandbox.delete();\n },\n };\n}\n"],"mappings":";;;;;;AAGO,SAAS,OAAO,SAA8B;AACnD,SAAO;AAAA,IACL,MAAM,KAAK,KAAK,MAAM,MAAM;AAC1B,UAAI,UAAU,GAAG,UAAU,MAAM,GAAG,CAAC,GAAG,YAAY,KAAK,IAAI,CAAC;AAC9D,UAAI,MAAM,KAAM,WAAU,QAAQ,OAAO;AAEzC,YAAM,WAAoC;AAAA,QACxC;AAAA,QACA,mBAAmB,CAAC,MAAM;AAAA,QAC1B,SAAS;AAAA,MACX;AACA,UAAI,MAAM,IAAK,UAAS,aAAa,KAAK;AAE1C,UAAI,MAAM,UAAU;AAClB,iBAAS,UAAU,SAAS,OAAO;AACnC,gBAAQ,QAAQ,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC7C,eAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,EAAE;AAAA,MAC/C;AAEA,YAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK,QAAQ;AAClD,aAAO;AAAA,QACL,QAAQ,OAAO,UAAU;AAAA,QACzB,QAAQ,OAAO,UAAU;AAAA,QACzB,UAAU,OAAO,YAAY;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,MAAM,UAAU,MAAM,SAAS;AAC7B,YAAM,MAAM,OAAO,SAAS,OAAO,IAAI,UAAU,OAAO,KAAK,OAAO;AACpE,YAAM,MAAM,IAAI,SAAS,QAAQ;AACjC,YAAM,UAAU,YAAY,MAAM,CAAC,MAAM,uCAAuC,KAAK,KAAK,IAAI,CAAC;AAC/F,YAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK;AAAA,QACxC;AAAA,QACA,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AACD,WAAK,OAAO,YAAY,OAAO,GAAG;AAChC,cAAM,IAAI,MAAM,0BAA0B,OAAO,QAAQ,MAAM,OAAO,UAAU,EAAE,EAAE;AAAA,MACtF;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM;AACnB,YAAM,UAAU,YAAY,OAAO,CAAC,IAAI,CAAC;AACzC,YAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK;AAAA,QACxC;AAAA,QACA,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AACD,WAAK,OAAO,YAAY,OAAO,GAAG;AAChC,cAAM,IAAI,MAAM,yBAAyB,OAAO,QAAQ,MAAM,OAAO,UAAU,EAAE,EAAE;AAAA,MACrF;AACA,aAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,IACA,MAAM,OAAO;AACX,YAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,EACF;AACF;","names":[]}