@opencoredev/sandbox-sdk 0.1.1 → 0.2.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 (66) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +3 -1
  3. package/dist/{agentos-DFJ4TFaY.mjs → agentos-CbrZW7R0.mjs} +5 -4
  4. package/dist/{agentos-DFJ4TFaY.mjs.map → agentos-CbrZW7R0.mjs.map} +1 -1
  5. package/dist/ai/harness.d.mts +2 -2
  6. package/dist/ai/harness.mjs +2 -2
  7. package/dist/ai/index.d.mts +1 -1
  8. package/dist/ai/index.mjs +2 -2
  9. package/dist/{ai-DhfwIZdL.mjs → ai-DeFa8yPk.mjs} +2 -2
  10. package/dist/{ai-DhfwIZdL.mjs.map → ai-DeFa8yPk.mjs.map} +1 -1
  11. package/dist/{capabilities-DftdOpIu.d.mts → capabilities-BWvOVFbH.d.mts} +5 -3
  12. package/dist/{capabilities-CEowrzRM.mjs → capabilities-CaSNd6J1.mjs} +29 -3
  13. package/dist/{capabilities-CEowrzRM.mjs.map → capabilities-CaSNd6J1.mjs.map} +1 -1
  14. package/dist/{capabilities-COKpwoFH.mjs → capabilities-xs9kaHrK.mjs} +2 -2
  15. package/dist/{capabilities-COKpwoFH.mjs.map → capabilities-xs9kaHrK.mjs.map} +1 -1
  16. package/dist/{errors-Ch9PHKTd.mjs → errors-BuF9bYOQ.mjs} +10 -3
  17. package/dist/errors-BuF9bYOQ.mjs.map +1 -0
  18. package/dist/eve/index.d.mts +2 -2
  19. package/dist/eve/index.mjs +2 -2
  20. package/dist/{index-Bk6GmoEt.d.mts → index-CkTwqD0X.d.mts} +2 -2
  21. package/dist/{index-BufLdrbp.d.mts → index-Dh9xob2s.d.mts} +2 -2
  22. package/dist/index.d.mts +4 -4
  23. package/dist/index.mjs +6 -4
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/{provider-utils-BjOSWNsh.mjs → managed-provider-BsZGVQ4I.mjs} +4 -57
  26. package/dist/managed-provider-BsZGVQ4I.mjs.map +1 -0
  27. package/dist/mastra/index.d.mts +2 -2
  28. package/dist/mastra/index.mjs +1 -1
  29. package/dist/metadata.d.mts +1 -1
  30. package/dist/metadata.mjs +35 -3
  31. package/dist/metadata.mjs.map +1 -1
  32. package/dist/{provider-BzzkIVmv.d.mts → provider-DOBErkBO.d.mts} +2 -2
  33. package/dist/provider-utils-CfB9nvJx.mjs +57 -0
  34. package/dist/provider-utils-CfB9nvJx.mjs.map +1 -0
  35. package/dist/providers/agentos/index.d.mts +6 -6
  36. package/dist/providers/agentos/index.mjs +7 -6
  37. package/dist/providers/box/index.d.mts +34 -0
  38. package/dist/providers/box/index.mjs +348 -0
  39. package/dist/providers/box/index.mjs.map +1 -0
  40. package/dist/providers/daytona/index.d.mts +5 -5
  41. package/dist/providers/daytona/index.mjs +6 -5
  42. package/dist/providers/daytona/index.mjs.map +1 -1
  43. package/dist/providers/e2b/index.d.mts +5 -5
  44. package/dist/providers/e2b/index.mjs +6 -5
  45. package/dist/providers/e2b/index.mjs.map +1 -1
  46. package/dist/providers/local/index.d.mts +6 -6
  47. package/dist/providers/local/index.mjs +7 -6
  48. package/dist/providers/local/index.mjs.map +1 -1
  49. package/dist/providers/railway/index.d.mts +29 -0
  50. package/dist/providers/railway/index.mjs +211 -0
  51. package/dist/providers/railway/index.mjs.map +1 -0
  52. package/dist/providers/upstash/index.d.mts +5 -5
  53. package/dist/providers/upstash/index.mjs +6 -5
  54. package/dist/providers/upstash/index.mjs.map +1 -1
  55. package/dist/providers/vercel/index.d.mts +5 -5
  56. package/dist/providers/vercel/index.mjs +6 -5
  57. package/dist/providers/vercel/index.mjs.map +1 -1
  58. package/dist/{sandbox-Dco6z9aB.d.mts → sandbox-DdEqoXJF.d.mts} +3 -3
  59. package/dist/{sandbox-rIOcbhtM.mjs → sandbox-DgtY5hvt.mjs} +2 -2
  60. package/dist/{sandbox-rIOcbhtM.mjs.map → sandbox-DgtY5hvt.mjs.map} +1 -1
  61. package/dist/testing/index.d.mts +3 -3
  62. package/dist/testing/index.mjs +3 -3
  63. package/dist/{types-DEi_dfRR.d.mts → types-Bv6I2U1c.d.mts} +2 -2
  64. package/package.json +23 -3
  65. package/dist/errors-Ch9PHKTd.mjs.map +0 -1
  66. package/dist/provider-utils-BjOSWNsh.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencoredev/sandbox-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "One TypeScript SDK for every sandbox provider.",
5
5
  "homepage": "https://sandbox-sdk.app",
6
6
  "license": "MIT",
@@ -46,6 +46,14 @@
46
46
  "types": "./dist/providers/upstash/index.d.mts",
47
47
  "import": "./dist/providers/upstash/index.mjs"
48
48
  },
49
+ "./box": {
50
+ "types": "./dist/providers/box/index.d.mts",
51
+ "import": "./dist/providers/box/index.mjs"
52
+ },
53
+ "./railway": {
54
+ "types": "./dist/providers/railway/index.d.mts",
55
+ "import": "./dist/providers/railway/index.mjs"
56
+ },
49
57
  "./metadata": {
50
58
  "types": "./dist/metadata.d.mts",
51
59
  "import": "./dist/metadata.mjs"
@@ -90,13 +98,16 @@
90
98
  "test:live:integrations": "bun test tests/live/integrations.test.ts",
91
99
  "test:live:mastra": "bun test tests/live/mastra.test.ts",
92
100
  "test:live:vercel": "bun test tests/live/vercel.test.ts",
93
- "test:live:upstash": "bun test tests/live/upstash.test.ts"
101
+ "test:live:upstash": "bun test tests/live/upstash.test.ts",
102
+ "test:live:box": "bun test tests/live/box.test.ts",
103
+ "test:live:railway": "bun test tests/live/railway.test.ts"
94
104
  },
95
105
  "dependencies": {
96
106
  "@rivet-dev/agentos-core": "^0.2.7"
97
107
  },
98
108
  "devDependencies": {
99
109
  "@ai-sdk/harness": "^1",
110
+ "@asciidev/box-sdk": "0.0.24",
100
111
  "@daytona/sdk": "^0.196.0",
101
112
  "@mastra/core": "1.51.0",
102
113
  "@types/bun": "^1.3.14",
@@ -106,18 +117,21 @@
106
117
  "ai": "^7",
107
118
  "e2b": "^2.32.0",
108
119
  "eve": "^0.22",
120
+ "railway": "3.5.7",
109
121
  "tsdown": "^0.16.6",
110
122
  "typescript": "^6.0.3"
111
123
  },
112
124
  "peerDependencies": {
113
125
  "@ai-sdk/harness": "^1.0.0",
126
+ "@asciidev/box-sdk": "^0.0.24",
114
127
  "@daytona/sdk": "^0.196.0",
115
128
  "@mastra/core": ">=1.12.0-0 <2.0.0-0",
116
129
  "@upstash/box": "^0.5.3",
117
130
  "@vercel/sandbox": "^2.5.0",
118
131
  "ai": "^7.0.0",
119
132
  "e2b": "^2.32.0",
120
- "eve": "^0.22.0"
133
+ "eve": "^0.22.0",
134
+ "railway": "^3.5.7"
121
135
  },
122
136
  "peerDependenciesMeta": {
123
137
  "e2b": {
@@ -132,6 +146,12 @@
132
146
  "@upstash/box": {
133
147
  "optional": true
134
148
  },
149
+ "@asciidev/box-sdk": {
150
+ "optional": true
151
+ },
152
+ "railway": {
153
+ "optional": true
154
+ },
135
155
  "ai": {
136
156
  "optional": true
137
157
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors-Ch9PHKTd.mjs","names":[],"sources":["../src/core/errors.ts"],"sourcesContent":["export const sandboxErrorCodes = [\n \"authentication\",\n \"permission\",\n \"not_found\",\n \"timeout\",\n \"rate_limited\",\n \"unavailable\",\n \"unsupported\",\n \"invalid_input\",\n \"conflict\",\n \"terminated\",\n \"process_failed\",\n \"internal\",\n] as const;\n\nexport type SandboxErrorCode = (typeof sandboxErrorCodes)[number];\n\nconst sensitive =\n /((?:token|key|secret|authorization|credential|signature)=?)[^\\s&,]+|https?:\\/\\/[^\\s]+(?:token|sig|signature|key)=[^\\s&]+/gi;\n\nexport function redactSensitive(value: string): string {\n return value.replace(sensitive, \"$1[REDACTED]\");\n}\n\nexport class SandboxError extends Error {\n readonly code: SandboxErrorCode;\n readonly provider: string;\n readonly operation?: string;\n readonly retryable: boolean;\n override readonly cause?: unknown;\n\n constructor(options: {\n code: SandboxErrorCode;\n provider: string;\n message: string;\n operation?: string;\n retryable?: boolean;\n cause?: unknown;\n }) {\n super(redactSensitive(options.message), { cause: options.cause });\n this.name = \"SandboxError\";\n this.code = options.code;\n this.provider = options.provider;\n this.operation = options.operation;\n this.retryable =\n options.retryable ?? [\"rate_limited\", \"timeout\", \"unavailable\"].includes(options.code);\n this.cause = options.cause;\n }\n\n override toString(): string {\n return `${this.name} [${this.code}]: ${this.message}`;\n }\n}\n\nexport function isSandboxError(error: unknown): error is SandboxError {\n return error instanceof SandboxError;\n}\n\nexport function normalizeError(\n provider: string,\n operation: string,\n error: unknown,\n fallback: SandboxErrorCode = \"internal\",\n): SandboxError {\n if (isSandboxError(error)) return error;\n const message = error instanceof Error ? error.message : \"Unknown provider error\";\n const lower = message.toLowerCase();\n const code =\n lower.includes(\"unauthorized\") || lower.includes(\"api key\")\n ? \"authentication\"\n : lower.includes(\"forbidden\") || lower.includes(\"permission\")\n ? \"permission\"\n : lower.includes(\"not found\") || lower.includes(\"enoent\")\n ? \"not_found\"\n : lower.includes(\"timeout\") || lower.includes(\"timed out\")\n ? \"timeout\"\n : lower.includes(\"rate limit\") || lower.includes(\"429\")\n ? \"rate_limited\"\n : lower.includes(\"already exists\") || lower.includes(\"conflict\")\n ? \"conflict\"\n : fallback;\n return new SandboxError({ code, provider, operation, message, cause: error });\n}\n"],"mappings":";AAAA,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAID,MAAM,YACJ;AAEF,SAAgB,gBAAgB,OAAuB;AACrD,QAAO,MAAM,QAAQ,WAAW,eAAe;;AAGjD,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAkB;CAElB,YAAY,SAOT;AACD,QAAM,gBAAgB,QAAQ,QAAQ,EAAE,EAAE,OAAO,QAAQ,OAAO,CAAC;AACjE,OAAK,OAAO;AACZ,OAAK,OAAO,QAAQ;AACpB,OAAK,WAAW,QAAQ;AACxB,OAAK,YAAY,QAAQ;AACzB,OAAK,YACH,QAAQ,aAAa;GAAC;GAAgB;GAAW;GAAc,CAAC,SAAS,QAAQ,KAAK;AACxF,OAAK,QAAQ,QAAQ;;CAGvB,AAAS,WAAmB;AAC1B,SAAO,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK;;;AAIhD,SAAgB,eAAe,OAAuC;AACpE,QAAO,iBAAiB;;AAG1B,SAAgB,eACd,UACA,WACA,OACA,WAA6B,YACf;AACd,KAAI,eAAe,MAAM,CAAE,QAAO;CAClC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;CACzD,MAAM,QAAQ,QAAQ,aAAa;AAenC,QAAO,IAAI,aAAa;EAAE,MAbxB,MAAM,SAAS,eAAe,IAAI,MAAM,SAAS,UAAU,GACvD,mBACA,MAAM,SAAS,YAAY,IAAI,MAAM,SAAS,aAAa,GACzD,eACA,MAAM,SAAS,YAAY,IAAI,MAAM,SAAS,SAAS,GACrD,cACA,MAAM,SAAS,UAAU,IAAI,MAAM,SAAS,YAAY,GACtD,YACA,MAAM,SAAS,aAAa,IAAI,MAAM,SAAS,MAAM,GACnD,iBACA,MAAM,SAAS,iBAAiB,IAAI,MAAM,SAAS,WAAW,GAC5D,aACA;EACgB;EAAU;EAAW;EAAS,OAAO;EAAO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-utils-BjOSWNsh.mjs","names":["managed: ManagedSandboxProvider","ownedTemplate: Promise<TemplateFile[]> | undefined","result: TemplateFile[]"],"sources":["../src/internal/managed-provider.ts","../src/internal/provider-utils.ts"],"sourcesContent":["import { SandboxError } from \"../core/errors\";\nimport type {\n ManagedSandboxProvider,\n ManagedSandboxSession,\n SandboxProvider,\n} from \"../core/provider\";\nimport { createSandbox } from \"../core/sandbox\";\nimport type { Sandbox } from \"../core/types\";\nimport type { SandboxNetworkPolicy } from \"../core/provider\";\n\ntype TemplateFile = { path: string; content: Uint8Array };\n\n/**\n * Shared managed lifecycle for built-in providers. Provider-native implementations\n * can replace this optional surface without changing `createSandbox()`.\n */\nexport function withManagedSessions<TRaw>(\n provider: SandboxProvider<TRaw>,\n configuredPorts: ReadonlyArray<number> = [],\n lifecycle: {\n stop?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n resume?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n destroy?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n setPorts?: (\n sandbox: Sandbox<TRaw>,\n ports: ReadonlyArray<number>,\n signal?: AbortSignal,\n ) => Promise<void>;\n setNetworkPolicy?: (sandbox: Sandbox<TRaw>, policy: SandboxNetworkPolicy) => Promise<void>;\n } = {},\n): SandboxProvider<TRaw> {\n const sessions = new Map<string, ManagedSandboxSession>();\n const templates = new Map<string, Promise<TemplateFile[]>>();\n\n const managed: ManagedSandboxProvider = {\n async create(options) {\n const existing = sessions.get(options.sessionId);\n if (existing) return existing;\n const sandbox = await createSandbox({\n provider,\n cwd: options.cwd,\n env: options.env,\n signal: options.signal,\n });\n const ports = new Set([...configuredPorts, ...(options.ports ?? [])]);\n let ownedTemplate: Promise<TemplateFile[]> | undefined;\n try {\n if (options.identity) {\n let template = templates.get(options.identity);\n if (!template) {\n template = (async () => {\n await options.onFirstCreate?.(sandbox);\n return captureFiles(sandbox, sandbox.cwd);\n })();\n ownedTemplate = template;\n templates.set(options.identity, template);\n await template;\n } else {\n await restoreFiles(sandbox, await template);\n }\n } else {\n await options.onFirstCreate?.(sandbox);\n }\n const session = createManagedSession(\n options.sessionId,\n sandbox,\n ports,\n sessions,\n lifecycle,\n );\n sessions.set(options.sessionId, session);\n return session;\n } catch (error) {\n if (\n options.identity &&\n ownedTemplate &&\n templates.get(options.identity) === ownedTemplate\n ) {\n templates.delete(options.identity);\n }\n try {\n if (lifecycle.destroy) await lifecycle.destroy(sandbox);\n else await sandbox.stop();\n } catch (cleanupError) {\n if (error instanceof Error) {\n Object.defineProperty(error, \"cleanupError\", {\n value: cleanupError,\n enumerable: false,\n });\n }\n }\n throw error;\n }\n },\n async resume(options) {\n const session = sessions.get(options.sessionId);\n if (!session) {\n throw new SandboxError({\n code: \"not_found\",\n provider: provider.id,\n operation: \"managed.resume\",\n message: `Managed sandbox session not found: ${options.sessionId}`,\n });\n }\n await session.resume();\n return session;\n },\n };\n return { ...provider, managed };\n}\n\nfunction createManagedSession<TRaw>(\n id: string,\n sandbox: Sandbox<TRaw>,\n initialPorts: Set<number>,\n sessions: Map<string, ManagedSandboxSession>,\n lifecycle: {\n stop?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n resume?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n destroy?: (sandbox: Sandbox<TRaw>) => Promise<void>;\n setPorts?: (\n sandbox: Sandbox<TRaw>,\n ports: ReadonlyArray<number>,\n signal?: AbortSignal,\n ) => Promise<void>;\n setNetworkPolicy?: (sandbox: Sandbox<TRaw>, policy: SandboxNetworkPolicy) => Promise<void>;\n },\n): ManagedSandboxSession {\n let destroyed = false;\n let stopped = false;\n const assertActive = () => {\n if (destroyed) {\n throw new SandboxError({\n code: \"terminated\",\n provider: sandbox.provider,\n operation: \"managed.session\",\n message: `Managed sandbox session has been destroyed: ${id}`,\n });\n }\n };\n const session: ManagedSandboxSession = {\n id,\n sandbox,\n defaultWorkingDirectory: sandbox.cwd,\n get ports() {\n return [...initialPorts];\n },\n async getPortUrl({ port, protocol }) {\n assertActive();\n if (!initialPorts.has(port)) {\n throw new SandboxError({\n code: \"invalid_input\",\n provider: sandbox.provider,\n operation: \"managed.getPortUrl\",\n message: `Port ${port} is not exposed by this session`,\n });\n }\n const exposed = await sandbox.ports.expose(port);\n const url = new URL(exposed.url);\n if (protocol) url.protocol = `${protocol}:`;\n return url.toString().replace(/\\/$/, \"\");\n },\n async stop() {\n assertActive();\n if (stopped) return;\n await lifecycle.stop?.(sandbox);\n stopped = true;\n },\n async resume() {\n assertActive();\n if (!stopped) return;\n await lifecycle.resume?.(sandbox);\n stopped = false;\n },\n async destroy() {\n if (destroyed) return;\n destroyed = true;\n sessions.delete(id);\n if (lifecycle.destroy) await lifecycle.destroy(sandbox);\n else await sandbox.stop();\n },\n ...(lifecycle.setPorts\n ? {\n async setPorts(ports: ReadonlyArray<number>, options?: { signal?: AbortSignal }) {\n assertActive();\n await lifecycle.setPorts!(sandbox, ports, options?.signal);\n initialPorts.clear();\n for (const port of ports) initialPorts.add(port);\n },\n }\n : {}),\n ...(lifecycle.setNetworkPolicy\n ? {\n setNetworkPolicy: (policy: SandboxNetworkPolicy) => {\n assertActive();\n return lifecycle.setNetworkPolicy!(sandbox, policy);\n },\n }\n : {}),\n };\n return session;\n}\n\nasync function captureFiles(sandbox: Sandbox, path: string): Promise<TemplateFile[]> {\n const result: TemplateFile[] = [];\n for (const entry of await sandbox.files.list(path)) {\n if (entry.type === \"directory\") result.push(...(await captureFiles(sandbox, entry.path)));\n else if (entry.type === \"file\")\n result.push({\n path: entry.path,\n content: await sandbox.files.read(entry.path),\n });\n }\n return result;\n}\n\nasync function restoreFiles(sandbox: Sandbox, files: ReadonlyArray<TemplateFile>): Promise<void> {\n await Promise.all(files.map((file) => sandbox.files.write(file.path, file.content)));\n}\n","import { SandboxError } from \"../core/errors\";\nimport type { CommandInput, ExposedPort, FileValue, SandboxSnapshot } from \"../core/types\";\n\nexport async function toUint8Array(value: FileValue): Promise<Uint8Array> {\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (value instanceof Blob) return new Uint8Array(await value.arrayBuffer());\n const response = new Response(value);\n return new Uint8Array(await response.arrayBuffer());\n}\n\nexport function commandString(input: CommandInput): string {\n if (typeof input === \"string\") return input;\n return [input.command, ...(input.args ?? [])].map(shellQuote).join(\" \");\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\nexport function portResult(\n port: number,\n url: string,\n isPublic: boolean,\n authenticated: boolean,\n request?: (path?: string, init?: RequestInit) => Promise<Response>,\n): ExposedPort {\n return {\n port,\n url,\n public: isPublic,\n authenticated,\n request,\n toJSON: () => ({\n port,\n url: authenticated ? redactUrl(url) : url,\n public: isPublic,\n authenticated,\n }),\n };\n}\n\nfunction redactUrl(url: string): string {\n const parsed = new URL(url);\n for (const key of parsed.searchParams.keys()) parsed.searchParams.set(key, \"[REDACTED]\");\n return parsed.toString();\n}\n\nexport function unsupported(provider: string, operation: string): never {\n throw new SandboxError({\n code: \"unsupported\",\n provider,\n operation,\n message: `${provider} does not support normalized ${operation}`,\n });\n}\n\nexport function unsupportedSnapshots(provider: string) {\n return {\n create: async (): Promise<SandboxSnapshot> => unsupported(provider, \"snapshot.create\"),\n delete: async (): Promise<void> => unsupported(provider, \"snapshot.delete\"),\n restore: async (): Promise<void> => unsupported(provider, \"snapshot.restore\"),\n };\n}\n"],"mappings":"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"}