@computesdk/modal 1.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.
package/dist/index.js ADDED
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ modal: () => modal
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+ var import_computesdk = require("computesdk");
27
+ var import_modal = require("modal");
28
+ var modal = (0, import_computesdk.createProvider)({
29
+ name: "modal",
30
+ methods: {
31
+ sandbox: {
32
+ // Collection operations (map to compute.sandbox.*)
33
+ create: async (config, options) => {
34
+ const tokenId = config.tokenId || typeof process !== "undefined" && process.env?.MODAL_TOKEN_ID || "";
35
+ const tokenSecret = config.tokenSecret || typeof process !== "undefined" && process.env?.MODAL_TOKEN_SECRET || "";
36
+ if (!tokenId || !tokenSecret) {
37
+ throw new Error(
38
+ `Missing Modal API credentials. Provide 'tokenId' and 'tokenSecret' in config or set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET environment variables. Get your credentials from https://modal.com/`
39
+ );
40
+ }
41
+ try {
42
+ (0, import_modal.initializeClient)({ tokenId, tokenSecret });
43
+ let sandbox;
44
+ let sandboxId;
45
+ if (options?.sandboxId) {
46
+ sandbox = await import_modal.Sandbox.fromId(options.sandboxId);
47
+ sandboxId = options.sandboxId;
48
+ } else {
49
+ const app = await import_modal.App.lookup("computesdk-modal", { createIfMissing: true });
50
+ const image = await app.imageFromRegistry("python:3.13-slim");
51
+ sandbox = await app.createSandbox(image);
52
+ sandboxId = sandbox.sandboxId;
53
+ }
54
+ const modalSandbox = {
55
+ sandbox,
56
+ sandboxId
57
+ };
58
+ return {
59
+ sandbox: modalSandbox,
60
+ sandboxId
61
+ };
62
+ } catch (error) {
63
+ if (error instanceof Error) {
64
+ if (error.message.includes("unauthorized") || error.message.includes("credentials")) {
65
+ throw new Error(
66
+ `Modal authentication failed. Please check your MODAL_TOKEN_ID and MODAL_TOKEN_SECRET environment variables. Get your credentials from https://modal.com/`
67
+ );
68
+ }
69
+ if (error.message.includes("quota") || error.message.includes("limit")) {
70
+ throw new Error(
71
+ `Modal quota exceeded. Please check your usage at https://modal.com/`
72
+ );
73
+ }
74
+ }
75
+ throw new Error(
76
+ `Failed to create Modal sandbox: ${error instanceof Error ? error.message : String(error)}`
77
+ );
78
+ }
79
+ },
80
+ getById: async (config, sandboxId) => {
81
+ const tokenId = config.tokenId || process.env.MODAL_TOKEN_ID;
82
+ const tokenSecret = config.tokenSecret || process.env.MODAL_TOKEN_SECRET;
83
+ try {
84
+ (0, import_modal.initializeClient)({ tokenId, tokenSecret });
85
+ const sandbox = await import_modal.Sandbox.fromId(sandboxId);
86
+ const modalSandbox = {
87
+ sandbox,
88
+ sandboxId
89
+ };
90
+ return {
91
+ sandbox: modalSandbox,
92
+ sandboxId
93
+ };
94
+ } catch (error) {
95
+ return null;
96
+ }
97
+ },
98
+ list: async (_config) => {
99
+ throw new Error(
100
+ `Modal provider does not support listing sandboxes. Modal sandboxes are managed individually through the Modal console. Use getById to reconnect to specific sandboxes by ID.`
101
+ );
102
+ },
103
+ destroy: async (_config, sandboxId) => {
104
+ try {
105
+ const sandbox = await import_modal.Sandbox.fromId(sandboxId);
106
+ if (sandbox && typeof sandbox.terminate === "function") {
107
+ await sandbox.terminate();
108
+ }
109
+ } catch (error) {
110
+ }
111
+ },
112
+ // Instance operations (map to individual Sandbox methods)
113
+ runCode: async (modalSandbox, code, runtime) => {
114
+ const startTime = Date.now();
115
+ try {
116
+ const effectiveRuntime = runtime || // Strong Python indicators
117
+ (code.includes("print(") || code.includes("import ") || code.includes("def ") || code.includes("sys.") || code.includes("json.") || code.includes("__") || code.includes('f"') || code.includes("f'") ? "python" : "python");
118
+ if (effectiveRuntime !== "python") {
119
+ throw new Error("Modal provider currently only supports Python runtime");
120
+ }
121
+ const process2 = await modalSandbox.sandbox.exec(["python3", "-c", code]);
122
+ const exitCode = await process2.wait();
123
+ let stdout = "";
124
+ let stderr = "";
125
+ if (process2.stdout && typeof process2.stdout.read === "function") {
126
+ try {
127
+ const stdoutData = await process2.stdout.read();
128
+ stdout = typeof stdoutData === "string" ? stdoutData : new TextDecoder().decode(stdoutData);
129
+ } catch (e) {
130
+ }
131
+ }
132
+ if (process2.stderr && typeof process2.stderr.read === "function") {
133
+ try {
134
+ const stderrData = await process2.stderr.read();
135
+ stderr = typeof stderrData === "string" ? stderrData : new TextDecoder().decode(stderrData);
136
+ } catch (e) {
137
+ }
138
+ }
139
+ if (exitCode !== 0 && stderr && (stderr.includes("SyntaxError") || stderr.includes("invalid syntax"))) {
140
+ throw new Error(`Syntax error: ${stderr.trim()}`);
141
+ }
142
+ return {
143
+ stdout: stdout || "",
144
+ stderr: stderr || "",
145
+ exitCode: exitCode || 0,
146
+ executionTime: Date.now() - startTime,
147
+ sandboxId: modalSandbox.sandboxId,
148
+ provider: "modal"
149
+ };
150
+ } catch (error) {
151
+ if (error instanceof Error && error.message.includes("Syntax error")) {
152
+ throw error;
153
+ }
154
+ throw new Error(
155
+ `Modal execution failed: ${error instanceof Error ? error.message : String(error)}`
156
+ );
157
+ }
158
+ },
159
+ runCommand: async (modalSandbox, command, args = []) => {
160
+ const startTime = Date.now();
161
+ try {
162
+ const commandArray = [command, ...args];
163
+ const process2 = await modalSandbox.sandbox.exec(commandArray);
164
+ const exitCode = await process2.wait();
165
+ let stdout = "";
166
+ let stderr = "";
167
+ if (process2.stdout && typeof process2.stdout.read === "function") {
168
+ try {
169
+ const stdoutData = await process2.stdout.read();
170
+ stdout = typeof stdoutData === "string" ? stdoutData : new TextDecoder().decode(stdoutData);
171
+ } catch (e) {
172
+ }
173
+ }
174
+ if (process2.stderr && typeof process2.stderr.read === "function") {
175
+ try {
176
+ const stderrData = await process2.stderr.read();
177
+ stderr = typeof stderrData === "string" ? stderrData : new TextDecoder().decode(stderrData);
178
+ } catch (e) {
179
+ }
180
+ }
181
+ return {
182
+ stdout: stdout || "",
183
+ stderr: stderr || "",
184
+ exitCode: exitCode || 0,
185
+ executionTime: Date.now() - startTime,
186
+ sandboxId: modalSandbox.sandboxId,
187
+ provider: "modal"
188
+ };
189
+ } catch (error) {
190
+ return {
191
+ stdout: "",
192
+ stderr: error instanceof Error ? error.message : String(error),
193
+ exitCode: 127,
194
+ // Command not found exit code
195
+ executionTime: Date.now() - startTime,
196
+ sandboxId: modalSandbox.sandboxId,
197
+ provider: "modal"
198
+ };
199
+ }
200
+ },
201
+ getInfo: async (modalSandbox) => {
202
+ let status = "running";
203
+ try {
204
+ const pollResult = await modalSandbox.sandbox.poll();
205
+ if (pollResult !== null) {
206
+ status = pollResult === 0 ? "stopped" : "error";
207
+ }
208
+ } catch (error) {
209
+ status = "running";
210
+ }
211
+ return {
212
+ id: modalSandbox.sandboxId,
213
+ provider: "modal",
214
+ runtime: "python",
215
+ // Modal default
216
+ status,
217
+ createdAt: /* @__PURE__ */ new Date(),
218
+ timeout: 3e5,
219
+ metadata: {
220
+ modalSandboxId: modalSandbox.sandboxId,
221
+ realModalImplementation: true
222
+ }
223
+ };
224
+ },
225
+ // Optional filesystem methods - Modal supports filesystem operations
226
+ filesystem: {
227
+ readFile: async (modalSandbox, path) => {
228
+ try {
229
+ const file = await modalSandbox.sandbox.open(path);
230
+ let content = "";
231
+ if (file && typeof file.read === "function") {
232
+ const data = await file.read();
233
+ content = typeof data === "string" ? data : new TextDecoder().decode(data);
234
+ }
235
+ if (file && typeof file.close === "function") {
236
+ await file.close();
237
+ }
238
+ return content;
239
+ } catch (error) {
240
+ try {
241
+ const process2 = await modalSandbox.sandbox.exec(["cat", path]);
242
+ await process2.wait();
243
+ let content = "";
244
+ if (process2.stdout && typeof process2.stdout.read === "function") {
245
+ const data = await process2.stdout.read();
246
+ content = typeof data === "string" ? data : new TextDecoder().decode(data);
247
+ }
248
+ return content;
249
+ } catch (fallbackError) {
250
+ throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);
251
+ }
252
+ }
253
+ },
254
+ writeFile: async (modalSandbox, path, content) => {
255
+ try {
256
+ const file = await modalSandbox.sandbox.open(path);
257
+ if (file && typeof file.write === "function") {
258
+ await file.write(content);
259
+ }
260
+ if (file && typeof file.close === "function") {
261
+ await file.close();
262
+ }
263
+ } catch (error) {
264
+ try {
265
+ const escapedContent = content.replace(/'/g, `'"'"'`);
266
+ const process2 = await modalSandbox.sandbox.exec(["sh", "-c", `echo '${escapedContent}' > "${path}"`]);
267
+ await process2.wait();
268
+ } catch (fallbackError) {
269
+ throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);
270
+ }
271
+ }
272
+ },
273
+ mkdir: async (modalSandbox, path) => {
274
+ try {
275
+ const process2 = await modalSandbox.sandbox.exec(["mkdir", "-p", path]);
276
+ const exitCode = await process2.wait();
277
+ if (exitCode !== 0) {
278
+ let stderr = "";
279
+ if (process2.stderr && typeof process2.stderr.read === "function") {
280
+ const data = await process2.stderr.read();
281
+ stderr = typeof data === "string" ? data : new TextDecoder().decode(data);
282
+ }
283
+ throw new Error(`mkdir failed with exit code ${exitCode}: ${stderr}`);
284
+ }
285
+ } catch (error) {
286
+ throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);
287
+ }
288
+ },
289
+ readdir: async (modalSandbox, path) => {
290
+ try {
291
+ const process2 = await modalSandbox.sandbox.exec(["ls", "-la", "--time-style=iso", path]);
292
+ const exitCode = await process2.wait();
293
+ if (exitCode !== 0) {
294
+ let stderr = "";
295
+ if (process2.stderr && typeof process2.stderr.read === "function") {
296
+ const data = await process2.stderr.read();
297
+ stderr = typeof data === "string" ? data : new TextDecoder().decode(data);
298
+ }
299
+ throw new Error(`ls failed with exit code ${exitCode}: ${stderr}`);
300
+ }
301
+ let output = "";
302
+ if (process2.stdout && typeof process2.stdout.read === "function") {
303
+ const data = await process2.stdout.read();
304
+ output = typeof data === "string" ? data : new TextDecoder().decode(data);
305
+ }
306
+ const lines = output.split("\n").slice(1);
307
+ return lines.filter((line) => line.trim()).map((line) => {
308
+ const parts = line.trim().split(/\s+/);
309
+ const permissions = parts[0] || "";
310
+ const size = parseInt(parts[4]) || 0;
311
+ const dateStr = (parts[5] || "") + " " + (parts[6] || "");
312
+ const date = dateStr.trim() ? new Date(dateStr) : /* @__PURE__ */ new Date();
313
+ const name = parts.slice(8).join(" ") || "unknown";
314
+ return {
315
+ name,
316
+ path: `${path}/${name}`,
317
+ isDirectory: permissions.startsWith("d"),
318
+ size,
319
+ lastModified: isNaN(date.getTime()) ? /* @__PURE__ */ new Date() : date
320
+ };
321
+ });
322
+ } catch (error) {
323
+ throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);
324
+ }
325
+ },
326
+ exists: async (modalSandbox, path) => {
327
+ try {
328
+ const process2 = await modalSandbox.sandbox.exec(["test", "-e", path]);
329
+ const exitCode = await process2.wait();
330
+ return exitCode === 0;
331
+ } catch (error) {
332
+ return false;
333
+ }
334
+ },
335
+ remove: async (modalSandbox, path) => {
336
+ try {
337
+ const process2 = await modalSandbox.sandbox.exec(["rm", "-rf", path]);
338
+ const exitCode = await process2.wait();
339
+ if (exitCode !== 0) {
340
+ let stderr = "";
341
+ if (process2.stderr && typeof process2.stderr.read === "function") {
342
+ const data = await process2.stderr.read();
343
+ stderr = typeof data === "string" ? data : new TextDecoder().decode(data);
344
+ }
345
+ throw new Error(`rm failed with exit code ${exitCode}: ${stderr}`);
346
+ }
347
+ } catch (error) {
348
+ throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+ });
355
+ // Annotate the CommonJS export names for ESM import in node:
356
+ 0 && (module.exports = {
357
+ modal
358
+ });
359
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Modal Provider - Factory-based Implementation\n * \n * Full-featured provider with serverless sandbox execution using the factory pattern.\n * Leverages Modal's JavaScript SDK for real sandbox management.\n * \n * Note: Modal's JavaScript SDK is in alpha. This implementation provides a working\n * foundation but may need updates as the Modal API evolves.\n */\n\nimport { createProvider } from 'computesdk';\nimport type { \n ExecutionResult, \n SandboxInfo, \n Runtime,\n CreateSandboxOptions,\n FileEntry\n} from 'computesdk';\n\n// Import Modal SDK\nimport { App, Sandbox, initializeClient } from 'modal';\n\n/**\n * Modal-specific configuration options\n */\nexport interface ModalConfig {\n /** Modal API token ID - if not provided, will fallback to MODAL_TOKEN_ID environment variable */\n tokenId?: string;\n /** Modal API token secret - if not provided, will fallback to MODAL_TOKEN_SECRET environment variable */\n tokenSecret?: string;\n /** Default runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Modal environment (sandbox or main) */\n environment?: string;\n}\n\n/**\n * Modal sandbox interface - wraps Modal's Sandbox class\n */\ninterface ModalSandbox {\n sandbox: any; // Modal Sandbox instance (using any due to alpha SDK)\n sandboxId: string;\n}\n\n/**\n * Create a Modal provider instance using the factory pattern\n */\nexport const modal = createProvider<ModalSandbox, ModalConfig>({\n name: 'modal',\n methods: {\n sandbox: {\n // Collection operations (map to compute.sandbox.*)\n create: async (config: ModalConfig, options?: CreateSandboxOptions) => {\n // Validate API credentials\n const tokenId = config.tokenId || (typeof process !== 'undefined' && process.env?.MODAL_TOKEN_ID) || '';\n const tokenSecret = config.tokenSecret || (typeof process !== 'undefined' && process.env?.MODAL_TOKEN_SECRET) || '';\n\n if (!tokenId || !tokenSecret) {\n throw new Error(\n `Missing Modal API credentials. Provide 'tokenId' and 'tokenSecret' in config or set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET environment variables. Get your credentials from https://modal.com/`\n );\n }\n\n try {\n // Initialize Modal client with credentials\n initializeClient({ tokenId, tokenSecret });\n\n let sandbox: any;\n let sandboxId: string;\n\n if (options?.sandboxId) {\n // Reconnect to existing Modal sandbox\n sandbox = await Sandbox.fromId(options.sandboxId);\n sandboxId = options.sandboxId;\n } else {\n // Create new Modal sandbox using working pattern from debug\n const app = await App.lookup('computesdk-modal', { createIfMissing: true });\n const image = await app.imageFromRegistry('python:3.13-slim');\n sandbox = await app.createSandbox(image);\n sandboxId = sandbox.sandboxId;\n }\n\n const modalSandbox: ModalSandbox = {\n sandbox,\n sandboxId\n };\n\n return {\n sandbox: modalSandbox,\n sandboxId\n };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('unauthorized') || error.message.includes('credentials')) {\n throw new Error(\n `Modal authentication failed. Please check your MODAL_TOKEN_ID and MODAL_TOKEN_SECRET environment variables. Get your credentials from https://modal.com/`\n );\n }\n if (error.message.includes('quota') || error.message.includes('limit')) {\n throw new Error(\n `Modal quota exceeded. Please check your usage at https://modal.com/`\n );\n }\n }\n throw new Error(\n `Failed to create Modal sandbox: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n getById: async (config: ModalConfig, sandboxId: string) => {\n const tokenId = config.tokenId || process.env.MODAL_TOKEN_ID!;\n const tokenSecret = config.tokenSecret || process.env.MODAL_TOKEN_SECRET!;\n\n try {\n initializeClient({ tokenId, tokenSecret });\n const sandbox = await Sandbox.fromId(sandboxId);\n\n const modalSandbox: ModalSandbox = {\n sandbox,\n sandboxId\n };\n\n return {\n sandbox: modalSandbox,\n sandboxId\n };\n } catch (error) {\n // Sandbox doesn't exist or can't be accessed\n return null;\n }\n },\n\n list: async (_config: ModalConfig) => {\n throw new Error(\n `Modal provider does not support listing sandboxes. Modal sandboxes are managed individually through the Modal console. Use getById to reconnect to specific sandboxes by ID.`\n );\n },\n\n destroy: async (_config: ModalConfig, sandboxId: string) => {\n try {\n const sandbox = await Sandbox.fromId(sandboxId);\n if (sandbox && typeof sandbox.terminate === 'function') {\n await sandbox.terminate();\n }\n } catch (error) {\n // Sandbox might already be terminated or doesn't exist\n // This is acceptable for destroy operations\n }\n },\n\n // Instance operations (map to individual Sandbox methods)\n runCode: async (modalSandbox: ModalSandbox, code: string, runtime?: Runtime): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n // Auto-detect runtime if not specified\n const effectiveRuntime = runtime || (\n // Strong Python indicators\n code.includes('print(') || \n code.includes('import ') ||\n code.includes('def ') ||\n code.includes('sys.') ||\n code.includes('json.') ||\n code.includes('__') ||\n code.includes('f\"') ||\n code.includes(\"f'\")\n ? 'python'\n // Default to Python for Modal (primarily Python-focused)\n : 'python'\n );\n \n // Modal primarily supports Python execution\n if (effectiveRuntime !== 'python') {\n throw new Error('Modal provider currently only supports Python runtime');\n }\n\n // Execute code using Modal's exec method\n // Use python3 with -c flag to execute code directly\n const process = await modalSandbox.sandbox.exec(['python3', '-c', code]);\n \n // Wait for process completion\n const exitCode = await process.wait();\n \n // Read stdout and stderr from the process streams\n let stdout = '';\n let stderr = '';\n \n // Handle Modal's stream objects\n if (process.stdout && typeof process.stdout.read === 'function') {\n try {\n const stdoutData = await process.stdout.read();\n stdout = typeof stdoutData === 'string' ? stdoutData : new TextDecoder().decode(stdoutData);\n } catch (e) {\n // If reading fails, stdout remains empty\n }\n }\n \n if (process.stderr && typeof process.stderr.read === 'function') {\n try {\n const stderrData = await process.stderr.read();\n stderr = typeof stderrData === 'string' ? stderrData : new TextDecoder().decode(stderrData);\n } catch (e) {\n // If reading fails, stderr remains empty\n }\n }\n\n // Check for syntax errors in stderr\n if (exitCode !== 0 && stderr && (\n stderr.includes('SyntaxError') || \n stderr.includes('invalid syntax')\n )) {\n throw new Error(`Syntax error: ${stderr.trim()}`);\n }\n\n return {\n stdout: stdout || '',\n stderr: stderr || '',\n exitCode: exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId: modalSandbox.sandboxId,\n provider: 'modal'\n };\n } catch (error) {\n // Handle syntax errors and runtime errors\n if (error instanceof Error && error.message.includes('Syntax error')) {\n throw error; // Re-throw syntax errors\n }\n \n throw new Error(\n `Modal execution failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n\n runCommand: async (modalSandbox: ModalSandbox, command: string, args: string[] = []): Promise<ExecutionResult> => {\n const startTime = Date.now();\n\n try {\n // Execute command using Modal's exec method\n const commandArray = [command, ...args];\n const process = await modalSandbox.sandbox.exec(commandArray);\n \n // Wait for process completion\n const exitCode = await process.wait();\n \n // Read stdout and stderr from the process streams\n let stdout = '';\n let stderr = '';\n \n // Handle Modal's stream objects\n if (process.stdout && typeof process.stdout.read === 'function') {\n try {\n const stdoutData = await process.stdout.read();\n stdout = typeof stdoutData === 'string' ? stdoutData : new TextDecoder().decode(stdoutData);\n } catch (e) {\n // If reading fails, stdout remains empty\n }\n }\n \n if (process.stderr && typeof process.stderr.read === 'function') {\n try {\n const stderrData = await process.stderr.read();\n stderr = typeof stderrData === 'string' ? stderrData : new TextDecoder().decode(stderrData);\n } catch (e) {\n // If reading fails, stderr remains empty\n }\n }\n\n return {\n stdout: stdout || '',\n stderr: stderr || '',\n exitCode: exitCode || 0,\n executionTime: Date.now() - startTime,\n sandboxId: modalSandbox.sandboxId,\n provider: 'modal'\n };\n } catch (error) {\n // For command failures, return error info instead of throwing\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 127, // Command not found exit code\n executionTime: Date.now() - startTime,\n sandboxId: modalSandbox.sandboxId,\n provider: 'modal'\n };\n }\n },\n\n getInfo: async (modalSandbox: ModalSandbox): Promise<SandboxInfo> => {\n // Get actual sandbox status using Modal's poll method\n let status: 'running' | 'stopped' | 'error' = 'running';\n try {\n const pollResult = await modalSandbox.sandbox.poll();\n if (pollResult !== null) {\n // Sandbox has finished\n status = pollResult === 0 ? 'stopped' : 'error';\n }\n } catch (error) {\n // If polling fails, assume running\n status = 'running';\n }\n\n return {\n id: modalSandbox.sandboxId,\n provider: 'modal',\n runtime: 'python', // Modal default\n status,\n createdAt: new Date(),\n timeout: 300000,\n metadata: {\n modalSandboxId: modalSandbox.sandboxId,\n realModalImplementation: true\n }\n };\n },\n\n // Optional filesystem methods - Modal supports filesystem operations\n filesystem: {\n readFile: async (modalSandbox: ModalSandbox, path: string): Promise<string> => {\n try {\n // Use Modal's file open API to read files\n const file = await modalSandbox.sandbox.open(path);\n \n // Read the entire file content\n let content = '';\n if (file && typeof file.read === 'function') {\n const data = await file.read();\n content = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n \n // Close the file if it has a close method\n if (file && typeof file.close === 'function') {\n await file.close();\n }\n \n return content;\n } catch (error) {\n // Fallback to using cat command if direct file API fails\n try {\n const process = await modalSandbox.sandbox.exec(['cat', path]);\n await process.wait();\n \n let content = '';\n if (process.stdout && typeof process.stdout.read === 'function') {\n const data = await process.stdout.read();\n content = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n \n return content;\n } catch (fallbackError) {\n throw new Error(`Failed to read file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n },\n\n writeFile: async (modalSandbox: ModalSandbox, path: string, content: string): Promise<void> => {\n try {\n // Use Modal's file open API to write files\n const file = await modalSandbox.sandbox.open(path);\n \n // Write content to the file\n if (file && typeof file.write === 'function') {\n await file.write(content);\n }\n \n // Close the file if it has a close method\n if (file && typeof file.close === 'function') {\n await file.close();\n }\n } catch (error) {\n // Fallback to using echo command if direct file API fails\n try {\n // Escape content for shell command\n const escapedContent = content.replace(/'/g, \"'\\\"'\\\"'\");\n const process = await modalSandbox.sandbox.exec(['sh', '-c', `echo '${escapedContent}' > \"${path}\"`]);\n await process.wait();\n } catch (fallbackError) {\n throw new Error(`Failed to write file ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n },\n\n mkdir: async (modalSandbox: ModalSandbox, path: string): Promise<void> => {\n try {\n const process = await modalSandbox.sandbox.exec(['mkdir', '-p', path]);\n const exitCode = await process.wait();\n \n if (exitCode !== 0) {\n let stderr = '';\n if (process.stderr && typeof process.stderr.read === 'function') {\n const data = await process.stderr.read();\n stderr = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n throw new Error(`mkdir failed with exit code ${exitCode}: ${stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to create directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n readdir: async (modalSandbox: ModalSandbox, path: string): Promise<FileEntry[]> => {\n try {\n const process = await modalSandbox.sandbox.exec(['ls', '-la', '--time-style=iso', path]);\n const exitCode = await process.wait();\n \n if (exitCode !== 0) {\n let stderr = '';\n if (process.stderr && typeof process.stderr.read === 'function') {\n const data = await process.stderr.read();\n stderr = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n throw new Error(`ls failed with exit code ${exitCode}: ${stderr}`);\n }\n \n let output = '';\n if (process.stdout && typeof process.stdout.read === 'function') {\n const data = await process.stdout.read();\n output = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n \n const lines = output.split('\\n').slice(1); // Skip header line\n \n return lines.filter(line => line.trim()).map(line => {\n const parts = line.trim().split(/\\s+/);\n const permissions = parts[0] || '';\n const size = parseInt(parts[4]) || 0;\n const dateStr = (parts[5] || '') + ' ' + (parts[6] || '');\n const date = dateStr.trim() ? new Date(dateStr) : new Date();\n const name = parts.slice(8).join(' ') || 'unknown';\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory: permissions.startsWith('d'),\n size,\n lastModified: isNaN(date.getTime()) ? new Date() : date\n };\n });\n } catch (error) {\n throw new Error(`Failed to read directory ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n exists: async (modalSandbox: ModalSandbox, path: string): Promise<boolean> => {\n try {\n const process = await modalSandbox.sandbox.exec(['test', '-e', path]);\n const exitCode = await process.wait();\n return exitCode === 0;\n } catch (error) {\n return false;\n }\n },\n\n remove: async (modalSandbox: ModalSandbox, path: string): Promise<void> => {\n try {\n const process = await modalSandbox.sandbox.exec(['rm', '-rf', path]);\n const exitCode = await process.wait();\n \n if (exitCode !== 0) {\n let stderr = '';\n if (process.stderr && typeof process.stderr.read === 'function') {\n const data = await process.stderr.read();\n stderr = typeof data === 'string' ? data : new TextDecoder().decode(data);\n }\n throw new Error(`rm failed with exit code ${exitCode}: ${stderr}`);\n }\n } catch (error) {\n throw new Error(`Failed to remove ${path}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n }\n});"],"mappings":"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","names":["process"]}