@langchain/sandbox-standard-tests 0.0.3
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/LICENSE +21 -0
- package/README.md +246 -0
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/sandbox-BX7bEJLz.d.cts +168 -0
- package/dist/sandbox-C1ApHibz.js +1157 -0
- package/dist/sandbox-C1ApHibz.js.map +1 -0
- package/dist/sandbox-C22TOwhI.cjs +1169 -0
- package/dist/sandbox-C22TOwhI.cjs.map +1 -0
- package/dist/sandbox-CWDp3zl_.d.ts +168 -0
- package/dist/vitest.cjs +43 -0
- package/dist/vitest.cjs.map +1 -0
- package/dist/vitest.d.cts +19 -0
- package/dist/vitest.d.ts +19 -0
- package/dist/vitest.js +41 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-C1ApHibz.js","names":[],"sources":["../src/tests/lifecycle.ts","../src/tests/command-execution.ts","../src/tests/file-operations.ts","../src/tests/write.ts","../src/tests/read.ts","../src/tests/edit.ts","../src/tests/ls-info.ts","../src/tests/grep-raw.ts","../src/tests/glob-info.ts","../src/tests/initial-files.ts","../src/tests/integration.ts","../src/sandbox.ts"],"sourcesContent":["import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\nimport { withRetry } from \"../sandbox.js\";\n\n/**\n * Register sandbox lifecycle tests (create, isRunning, close, two-step init).\n *\n * These tests use both the shared sandbox (for id/isRunning checks) and\n * temporary sandboxes (for close and two-step initialization).\n */\nexport function registerLifecycleTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect, beforeAll, afterAll } = config.runner;\n\n const describeSkipIf =\n describe.skipIf ??\n ((condition: boolean) =>\n condition ? (describe.skip ?? (() => {})) : describe);\n\n const itSkipIf =\n it.skipIf ?? ((condition: boolean) => (condition ? () => {} : it));\n\n describe(\"sandbox lifecycle\", () => {\n it(\n \"should create sandbox and have a valid id\",\n () => {\n const shared = getShared();\n expect(shared).toBeDefined();\n expect(shared.id).toBeDefined();\n expect(typeof shared.id).toBe(\"string\");\n expect(shared.id.length).toBeGreaterThan(0);\n },\n timeout,\n );\n\n it(\n \"should have isRunning as true after creation\",\n () => {\n expect(getShared().isRunning).toBe(true);\n },\n timeout,\n );\n\n const canBeClosed = typeof config.closeSandbox === \"function\";\n describeSkipIf(!canBeClosed)(\"close\", () => {\n let tmp: T;\n\n beforeAll(async () => {\n tmp = await withRetry(() => config.createSandbox());\n }, timeout);\n\n afterAll(async () => {\n try {\n await config.closeSandbox?.(tmp);\n } catch {\n // Ignore cleanup errors\n }\n }, timeout);\n\n it(\n \"should close sandbox successfully\",\n async () => {\n expect(tmp.isRunning).toBe(true);\n\n await config.closeSandbox?.(tmp);\n\n expect(tmp.isRunning).toBe(false);\n },\n timeout,\n );\n });\n\n describe(\"two-step initialization\", () => {\n let tmp: T;\n\n afterAll(async () => {\n try {\n if (tmp) await config.closeSandbox?.(tmp);\n } catch {\n // Ignore cleanup errors\n }\n }, timeout);\n\n itSkipIf(!config.createUninitializedSandbox)(\n \"should work with two-step initialization\",\n async () => {\n tmp = config.createUninitializedSandbox!();\n\n expect(tmp.isRunning).toBe(false);\n\n await withRetry(() => tmp.initialize!());\n\n expect(tmp.isRunning).toBe(true);\n expect(tmp.id).toBeDefined();\n },\n timeout,\n );\n });\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register command execution tests (echo, exit codes, multiline, stderr, env vars).\n */\nexport function registerCommandExecutionTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"command execution\", () => {\n it(\n \"should run a simple echo command\",\n async () => {\n const result = await getShared().execute('echo \"hello\"');\n\n expect(result.exitCode).toBe(0);\n expect(result.output.trim()).toBe(\"hello\");\n expect(result.truncated).toBe(false);\n },\n timeout,\n );\n\n it(\n \"should capture non-zero exit code\",\n async () => {\n const result = await getShared().execute(\"exit 42\");\n\n expect(result.exitCode).toBe(42);\n },\n timeout,\n );\n\n it(\n \"should capture multiline output\",\n async () => {\n const result = await getShared().execute(\n 'echo \"line1\" && echo \"line2\" && echo \"line3\"',\n );\n\n expect(result.exitCode).toBe(0);\n expect(result.output).toContain(\"line1\");\n expect(result.output).toContain(\"line2\");\n expect(result.output).toContain(\"line3\");\n },\n timeout,\n );\n\n it(\n \"should capture stderr output\",\n async () => {\n const result = await getShared().execute('echo \"error message\" >&2');\n\n // stderr should be included in output\n expect(result.output).toContain(\"error message\");\n },\n timeout,\n );\n\n it(\n \"should handle command with environment variables\",\n async () => {\n const result = await getShared().execute(\n 'export MY_VAR=\"test_value\" && echo $MY_VAR',\n );\n\n expect(result.exitCode).toBe(0);\n expect(result.output.trim()).toBe(\"test_value\");\n },\n timeout,\n );\n\n it(\n \"should handle non-existent command\",\n async () => {\n const result = await getShared().execute(\"nonexistent_command_12345\");\n\n expect(result.exitCode).not.toBe(0);\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register basic file operation tests (upload, download, read, write, edit, multiple files).\n */\nexport function registerFileOperationTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"file operations\", () => {\n it(\n \"should upload files to sandbox\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"test-upload.txt\");\n\n const content = new TextEncoder().encode(\"Hello from test file!\");\n const results = await shared.uploadFiles([[filePath, content]]);\n\n expect(results.length).toBe(1);\n expect(results[0].path).toBe(filePath);\n expect(results[0].error).toBeNull();\n\n // Verify file exists using execute\n const checkResult = await shared.execute(`cat ${filePath}`);\n expect(checkResult.output.trim()).toBe(\"Hello from test file!\");\n },\n timeout,\n );\n\n it(\n \"should download files from sandbox\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"test-download.txt\");\n\n // First create a file\n const encoder = new TextEncoder();\n await shared.uploadFiles([\n [filePath, encoder.encode(\"Download test content\")],\n ]);\n\n // Now download it\n const results = await shared.downloadFiles([filePath]);\n\n expect(results.length).toBe(1);\n expect(results[0].error).toBeNull();\n expect(results[0].content).not.toBeNull();\n\n const content = new TextDecoder().decode(results[0].content!);\n expect(content.trim()).toBe(\"Download test content\");\n },\n timeout,\n );\n\n it(\n \"should handle file not found on download\",\n async () => {\n const filePath = config.resolvePath(\"nonexistent-file-12345.txt\");\n\n const results = await getShared().downloadFiles([filePath]);\n\n expect(results.length).toBe(1);\n expect(results[0].content).toBeNull();\n expect(results[0].error).toBe(\"file_not_found\");\n },\n timeout,\n );\n\n it(\n \"should use inherited read method from BaseSandbox\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"read-test.txt\");\n\n // Create a file first\n const encoder = new TextEncoder();\n await shared.uploadFiles([\n [filePath, encoder.encode(\"Read test content\")],\n ]);\n\n // Use inherited read method\n const content = await shared.read(filePath);\n\n expect(content).toContain(\"Read test content\");\n },\n timeout,\n );\n\n it(\n \"should use inherited write method from BaseSandbox\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"write-test.txt\");\n\n // Use inherited write method\n await shared.write(filePath, \"Written via BaseSandbox\");\n\n // Verify using execute\n const result = await shared.execute(`cat ${filePath}`);\n expect(result.output.trim()).toBe(\"Written via BaseSandbox\");\n },\n timeout,\n );\n\n it(\n \"should use inherited edit method from BaseSandbox\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"edit-test.txt\");\n\n // Create initial file\n await shared.write(filePath, \"Hello World\");\n\n // Use inherited edit method\n await shared.edit(filePath, \"Hello World\", \"Hello Edited World\");\n\n // Verify the edit\n const result = await shared.execute(`cat ${filePath}`);\n expect(result.output.trim()).toBe(\"Hello Edited World\");\n },\n timeout,\n );\n\n it(\n \"should upload multiple files at once\",\n async () => {\n const shared = getShared();\n const path1 = config.resolvePath(\"multi1.txt\");\n const path2 = config.resolvePath(\"multi2.txt\");\n const path3 = config.resolvePath(\"multi3.txt\");\n\n const encoder = new TextEncoder();\n const results = await shared.uploadFiles([\n [path1, encoder.encode(\"Content 1\")],\n [path2, encoder.encode(\"Content 2\")],\n [path3, encoder.encode(\"Content 3\")],\n ]);\n\n expect(results.length).toBe(3);\n expect(results.every((r) => r.error === null)).toBe(true);\n\n // Verify all files exist\n const checkResult = await shared.execute(\n `cat ${path1} ${path2} ${path3}`,\n );\n expect(checkResult.output).toContain(\"Content 1\");\n expect(checkResult.output).toContain(\"Content 2\");\n expect(checkResult.output).toContain(\"Content 3\");\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register detailed write() tests (new file, parent dirs, existing file,\n * special chars, empty, spaces, unicode, slashes, long content, newlines).\n */\nexport function registerWriteTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"write\", () => {\n it(\n \"should write a new file with basic content\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-new.txt\");\n const content = \"Hello, sandbox!\\nLine 2\\nLine 3\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n expect(result.path).toBe(filePath);\n\n // Verify file was created\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should create parent directories automatically\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\n \"wt-parents/deep/nested/dir/file.txt\",\n );\n const content = \"Nested file content\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should fail when writing to an existing file\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-existing.txt\");\n\n // Create file first\n await shared.write(filePath, \"First content\");\n\n // Try to write again\n const result = await shared.write(filePath, \"Second content\");\n\n expect(result.error).toBeDefined();\n expect(result.error!.toLowerCase()).toContain(\"already exists\");\n\n // Verify original content unchanged\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output.trim()).toBe(\"First content\");\n },\n timeout,\n );\n\n it(\n \"should handle special characters and escape sequences\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-special.txt\");\n const content =\n \"Special chars: $VAR, `command`, $(subshell)\\nTab\\there\\nBackslash: \\\\\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n // Verify content is preserved exactly\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should write an empty file\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-empty.txt\");\n\n const result = await shared.write(filePath, \"\");\n\n expect(result.error).toBeUndefined();\n\n // Verify file exists\n const execResult = await shared.execute(\n `[ -f ${filePath} ] && echo 'exists' || echo 'missing'`,\n );\n expect(execResult.output).toContain(\"exists\");\n },\n timeout,\n );\n\n it(\n \"should write a file with spaces in the path\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\n \"wt-spaces/dir with spaces/file name.txt\",\n );\n const content = \"Content in file with spaces\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n // Verify file was created (quote path for shell)\n const execResult = await shared.execute(`cat '${filePath}'`);\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should write unicode content\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-unicode.txt\");\n const content =\n \"Hello \\u{1F44B} \\u4E16\\u754C \\u0645\\u0631\\u062D\\u0628\\u0627 \\u041F\\u0440\\u0438\\u0432\\u0435\\u0442 \\u{1F30D}\\nLine with \\u00E9mojis \\u{1F389}\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should handle consecutive slashes in path\",\n async () => {\n const shared = getShared();\n const basePath = config.resolvePath(\"wt-slashes\");\n // Use double slashes — the filesystem should normalize them\n const filePath = `${basePath}//subdir///file.txt`;\n const content = \"Content\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n // Verify file exists via normalized path\n const execResult = await shared.execute(\n `cat ${basePath}/subdir/file.txt`,\n );\n expect(execResult.output.trim()).toBe(content);\n },\n timeout,\n );\n\n it(\n \"should write very long content (1000 lines)\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-long.txt\");\n const lines = Array.from(\n { length: 1000 },\n (_, i) => `Line ${i} with some content here`,\n );\n const content = lines.join(\"\\n\");\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n // Verify file has correct number of lines\n const execResult = await shared.execute(`wc -l < ${filePath}`);\n // wc -l counts newlines: 1000 lines joined by \\n = 999 newlines\n expect(execResult.output.trim()).toMatch(/^(999|1000)$/);\n },\n timeout,\n );\n\n it(\n \"should write content with only newlines\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"wt-newlines.txt\");\n const content = \"\\n\\n\\n\\n\\n\";\n\n const result = await shared.write(filePath, content);\n\n expect(result.error).toBeUndefined();\n\n const execResult = await shared.execute(`wc -l < ${filePath}`);\n expect(execResult.output.trim()).toBe(\"5\");\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register detailed read() tests (basic, nonexistent, empty, offset, limit,\n * offset+limit, unicode, long lines, zero limit, offset beyond, chunked).\n */\nexport function registerReadTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"read\", () => {\n it(\n \"should read a file with line numbers\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-basic.txt\");\n await shared.write(filePath, \"Line 1\\nLine 2\\nLine 3\");\n\n const result = await shared.read(filePath);\n\n expect(result).not.toContain(\"Error:\");\n expect(result).toContain(\"Line 1\");\n expect(result).toContain(\"Line 2\");\n expect(result).toContain(\"Line 3\");\n },\n timeout,\n );\n\n it(\n \"should return error for nonexistent file\",\n async () => {\n const filePath = config.resolvePath(\"rd-nonexistent-xyz.txt\");\n\n const result = await getShared().read(filePath);\n\n expect(result).toContain(\"Error:\");\n expect(result.toLowerCase()).toContain(\"not found\");\n },\n timeout,\n );\n\n it(\n \"should handle reading an empty file\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-empty.txt\");\n await shared.write(filePath, \"\");\n\n const result = await shared.read(filePath);\n\n // Empty files should return empty or a system message\n expect(result.toLowerCase()).not.toContain(\"error:\");\n },\n timeout,\n );\n\n it(\n \"should read with offset parameter\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-offset.txt\");\n const content = Array.from(\n { length: 10 },\n (_, i) => `Row_${i + 1}_content`,\n ).join(\"\\n\");\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath, 5);\n\n // offset=5 means skip first 5 lines → start from line 6\n expect(result).toContain(\"Row_6_content\");\n expect(result).not.toContain(\"Row_1_content\");\n },\n timeout,\n );\n\n it(\n \"should read with limit parameter\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-limit.txt\");\n const content = Array.from(\n { length: 100 },\n (_, i) => `Row_${i + 1}_content`,\n ).join(\"\\n\");\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath, 0, 5);\n\n expect(result).toContain(\"Row_1_content\");\n expect(result).toContain(\"Row_5_content\");\n expect(result).not.toContain(\"Row_6_content\");\n },\n timeout,\n );\n\n it(\n \"should read with both offset and limit\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-offset-limit.txt\");\n const content = Array.from(\n { length: 20 },\n (_, i) => `Row_${i + 1}_content`,\n ).join(\"\\n\");\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath, 10, 5);\n\n // Should have lines 11–15\n expect(result).toContain(\"Row_11_content\");\n expect(result).toContain(\"Row_15_content\");\n expect(result).not.toContain(\"Row_10_content\");\n expect(result).not.toContain(\"Row_16_content\");\n },\n timeout,\n );\n\n it(\n \"should read unicode content\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-unicode.txt\");\n const content =\n \"Hello \\u{1F44B} \\u4E16\\u754C\\n\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442 \\u043C\\u0438\\u0440\\n\\u0645\\u0631\\u062D\\u0628\\u0627 \\u0627\\u0644\\u0639\\u0627\\u0644\\u0645\";\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath);\n\n expect(result).not.toContain(\"Error:\");\n expect(result).toContain(\"\\u{1F44B}\");\n expect(result).toContain(\"\\u4E16\\u754C\");\n expect(result).toContain(\"\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442\");\n },\n timeout,\n );\n\n it(\n \"should handle files with very long lines\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-long-lines.txt\");\n const longLine = \"x\".repeat(3000);\n const content = `Short line\\n${longLine}\\nAnother short line`;\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath);\n\n // Should still read successfully (implementation may truncate)\n expect(result).not.toContain(\"Error:\");\n expect(result).toContain(\"Short line\");\n },\n timeout,\n );\n\n it(\n \"should return nothing with limit=0\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-zero-limit.txt\");\n await shared.write(filePath, \"Line 1\\nLine 2\\nLine 3\");\n\n const result = await shared.read(filePath, 0, 0);\n\n // Should return empty or no content lines\n expect(result).not.toContain(\"Line 1\");\n },\n timeout,\n );\n\n it(\n \"should handle offset beyond file length\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-offset-beyond.txt\");\n await shared.write(filePath, \"Line 1\\nLine 2\\nLine 3\");\n\n const result = await shared.read(filePath, 100, 10);\n\n expect(result).not.toContain(\"Line 1\");\n expect(result).not.toContain(\"Line 2\");\n expect(result).not.toContain(\"Line 3\");\n },\n timeout,\n );\n\n it(\n \"should handle offset exactly at file length\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-offset-exact.txt\");\n // 5 lines\n const content = Array.from(\n { length: 5 },\n (_, i) => `Line ${i + 1}`,\n ).join(\"\\n\");\n await shared.write(filePath, content);\n\n const result = await shared.read(filePath, 5, 10);\n\n // offset=5 means skip all 5 lines → nothing left\n expect(result).not.toContain(\"Line 1\");\n expect(result).not.toContain(\"Line 5\");\n },\n timeout,\n );\n\n it(\n \"should read a large file in chunks\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"rd-chunked.txt\");\n const content = Array.from(\n { length: 1000 },\n (_, i) => `Line_${String(i).padStart(4, \"0\")}_content`,\n ).join(\"\\n\");\n await shared.write(filePath, content);\n\n // Read first chunk\n const chunk1 = await shared.read(filePath, 0, 100);\n expect(chunk1).toContain(\"Line_0000_content\");\n expect(chunk1).toContain(\"Line_0099_content\");\n expect(chunk1).not.toContain(\"Line_0100_content\");\n\n // Read middle chunk\n const chunk2 = await shared.read(filePath, 500, 100);\n expect(chunk2).toContain(\"Line_0500_content\");\n expect(chunk2).toContain(\"Line_0599_content\");\n expect(chunk2).not.toContain(\"Line_0499_content\");\n\n // Read last chunk\n const chunk3 = await shared.read(filePath, 900, 100);\n expect(chunk3).toContain(\"Line_0900_content\");\n expect(chunk3).toContain(\"Line_0999_content\");\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register detailed edit() tests (single/multi occurrence, replaceAll,\n * not found, special chars, multiline, delete, identical, unicode,\n * whitespace, long strings, line endings, partial match).\n */\nexport function registerEditTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"edit\", () => {\n it(\n \"should edit a single occurrence\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-single.txt\");\n await shared.write(filePath, \"Hello world\\nGoodbye world\\nHello again\");\n\n const result = await shared.edit(filePath, \"Goodbye\", \"Farewell\");\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Farewell world\");\n expect(content).not.toContain(\"Goodbye\");\n },\n timeout,\n );\n\n it(\n \"should fail with multiple occurrences without replaceAll\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-multi-fail.txt\");\n await shared.write(filePath, \"apple\\nbanana\\napple\\norange\\napple\");\n\n const result = await shared.edit(filePath, \"apple\", \"pear\", false);\n\n expect(result.error).toBeDefined();\n expect(result.error!.toLowerCase()).toContain(\"multiple\");\n\n // Verify file unchanged\n const content = await shared.read(filePath);\n expect(content).toContain(\"apple\");\n expect(content).not.toContain(\"pear\");\n },\n timeout,\n );\n\n it(\n \"should replace all occurrences with replaceAll=true\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-replace-all.txt\");\n await shared.write(filePath, \"apple\\nbanana\\napple\\norange\\napple\");\n\n const result = await shared.edit(filePath, \"apple\", \"pear\", true);\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(3);\n\n // Verify all replaced\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output).not.toContain(\"apple\");\n const pearCount = execResult.output.split(\"pear\").length - 1;\n expect(pearCount).toBe(3);\n },\n timeout,\n );\n\n it(\n \"should return error when string is not found\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-not-found.txt\");\n await shared.write(filePath, \"Hello world\");\n\n const result = await shared.edit(\n filePath,\n \"nonexistent\",\n \"replacement\",\n );\n\n expect(result.error).toBeDefined();\n expect(result.error!.toLowerCase()).toContain(\"not found\");\n },\n timeout,\n );\n\n it(\n \"should return error for nonexistent file\",\n async () => {\n const filePath = config.resolvePath(\"ed-nonexistent-xyz.txt\");\n\n const result = await getShared().edit(filePath, \"old\", \"new\");\n\n expect(result.error).toBeDefined();\n expect(result.error!.toLowerCase()).toContain(\"not found\");\n },\n timeout,\n );\n\n it(\n \"should handle special characters and regex metacharacters\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-special.txt\");\n await shared.write(\n filePath,\n \"Price: $100.00\\nPattern: [a-z]*\\nPath: /usr/bin\",\n );\n\n // Test with dollar signs\n const result1 = await shared.edit(filePath, \"$100.00\", \"$200.00\");\n expect(result1.error).toBeUndefined();\n\n // Test with regex metacharacters\n const result2 = await shared.edit(filePath, \"[a-z]*\", \"[0-9]+\");\n expect(result2.error).toBeUndefined();\n\n // Verify changes\n const content = await shared.read(filePath);\n expect(content).toContain(\"$200.00\");\n expect(content).toContain(\"[0-9]+\");\n },\n timeout,\n );\n\n it(\n \"should handle multiline string replacement\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-multiline.txt\");\n await shared.write(filePath, \"Line 1\\nLine 2\\nLine 3\");\n\n const result = await shared.edit(\n filePath,\n \"Line 1\\nLine 2\",\n \"Combined\",\n );\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Combined\");\n expect(content).toContain(\"Line 3\");\n expect(content).not.toContain(\"Line 1\");\n },\n timeout,\n );\n\n it(\n \"should delete content by replacing with empty string\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-delete.txt\");\n await shared.write(\n filePath,\n \"Keep this\\nDelete this part\\nKeep this too\",\n );\n\n const result = await shared.edit(filePath, \"Delete this part\\n\", \"\");\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Keep this\");\n expect(content).toContain(\"Keep this too\");\n expect(content).not.toContain(\"Delete this part\");\n },\n timeout,\n );\n\n it(\n \"should handle identical old and new strings\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-identical.txt\");\n await shared.write(filePath, \"Same text\");\n\n const result = await shared.edit(filePath, \"Same text\", \"Same text\");\n\n // Should succeed with 1 occurrence\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Same text\");\n },\n timeout,\n );\n\n it(\n \"should handle unicode content\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-unicode.txt\");\n await shared.write(\n filePath,\n \"Hello \\u{1F44B} world\\n\\u4E16\\u754C is beautiful\",\n );\n\n const result = await shared.edit(filePath, \"\\u{1F44B}\", \"\\u{1F30D}\");\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"\\u{1F30D}\");\n expect(content).not.toContain(\"\\u{1F44B}\");\n },\n timeout,\n );\n\n it(\n \"should handle whitespace-only strings\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-whitespace.txt\");\n await shared.write(filePath, \"Line1 Line2\"); // 4 spaces\n\n const result = await shared.edit(filePath, \" \", \" \"); // 4→1 space\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Line1 Line2\");\n },\n timeout,\n );\n\n it(\n \"should handle very long old and new strings\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-long.txt\");\n const oldString = \"x\".repeat(1000);\n const newString = \"y\".repeat(1000);\n await shared.write(filePath, `Start\\n${oldString}\\nEnd`);\n\n const result = await shared.edit(filePath, oldString, newString);\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"y\".repeat(100)); // partial check\n expect(content).not.toContain(\"x\".repeat(100));\n },\n timeout,\n );\n\n it(\n \"should preserve line endings correctly\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-line-endings.txt\");\n await shared.write(filePath, \"Line 1\\nLine 2\\nLine 3\\n\");\n\n const result = await shared.edit(filePath, \"Line 2\", \"Modified Line 2\");\n\n expect(result.error).toBeUndefined();\n\n const content = await shared.read(filePath);\n expect(content).toContain(\"Line 1\");\n expect(content).toContain(\"Modified Line 2\");\n expect(content).toContain(\"Line 3\");\n },\n timeout,\n );\n\n it(\n \"should edit a substring within a line\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"ed-partial.txt\");\n await shared.write(\n filePath,\n \"The quick brown fox jumps over the lazy dog\",\n );\n\n const result = await shared.edit(filePath, \"brown fox\", \"red cat\");\n\n expect(result.error).toBeUndefined();\n expect(result.occurrences).toBe(1);\n\n const execResult = await shared.execute(`cat ${filePath}`);\n expect(execResult.output).toContain(\"The quick red cat jumps\");\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register lsInfo() tests (absolute paths, files + subdirs, empty dir,\n * nonexistent dir, hidden files, spaces, unicode, large dir, trailing slash,\n * special characters).\n */\nexport function registerLsInfoTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"lsInfo\", () => {\n it(\n \"should return absolute paths\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-absolute\");\n await shared.write(`${baseDir}/file.txt`, \"content\");\n\n const result = await shared.lsInfo(baseDir);\n\n expect(result.length).toBe(1);\n expect(result[0].path).toBe(`${baseDir}/file.txt`);\n },\n timeout,\n );\n\n it(\n \"should list files and subdirectories\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-basic\");\n await shared.write(`${baseDir}/file1.txt`, \"content1\");\n await shared.write(`${baseDir}/file2.txt`, \"content2\");\n await shared.execute(`mkdir -p '${baseDir}/subdir'`);\n\n const result = await shared.lsInfo(baseDir);\n\n expect(result.length).toBe(3);\n const paths = result.map((info) => info.path.replace(/\\/$/, \"\"));\n expect(paths).toContain(`${baseDir}/file1.txt`);\n expect(paths).toContain(`${baseDir}/file2.txt`);\n expect(paths).toContain(`${baseDir}/subdir`);\n\n // Check is_dir flag\n for (const info of result) {\n if (info.path.replace(/\\/$/, \"\").endsWith(\"/subdir\")) {\n expect(info.is_dir).toBe(true);\n } else {\n expect(info.is_dir).toBe(false);\n }\n }\n },\n timeout,\n );\n\n it(\n \"should return empty list for empty directory\",\n async () => {\n const shared = getShared();\n const emptyDir = config.resolvePath(\"li-empty-dir\");\n await shared.execute(`mkdir -p '${emptyDir}'`);\n\n const result = await shared.lsInfo(emptyDir);\n\n expect(result).toEqual([]);\n },\n timeout,\n );\n\n it(\n \"should return empty list for nonexistent directory\",\n async () => {\n const nonexistentDir = config.resolvePath(\"li-does-not-exist-12345\");\n\n const result = await getShared().lsInfo(nonexistentDir);\n\n expect(result).toEqual([]);\n },\n timeout,\n );\n\n it(\n \"should include hidden files\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-hidden\");\n await shared.write(`${baseDir}/.hidden`, \"hidden content\");\n await shared.write(`${baseDir}/visible.txt`, \"visible content\");\n\n const result = await shared.lsInfo(baseDir);\n\n const paths = result.map((info) => info.path);\n expect(paths).toContain(`${baseDir}/.hidden`);\n expect(paths).toContain(`${baseDir}/visible.txt`);\n },\n timeout,\n );\n\n it(\n \"should handle directories with spaces in names\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-spaces\");\n await shared.write(`${baseDir}/file with spaces.txt`, \"content\");\n await shared.execute(`mkdir -p '${baseDir}/dir with spaces'`);\n\n const result = await shared.lsInfo(baseDir);\n\n const paths = result.map((info) => info.path.replace(/\\/$/, \"\"));\n expect(paths).toContain(`${baseDir}/file with spaces.txt`);\n expect(paths).toContain(`${baseDir}/dir with spaces`);\n },\n timeout,\n );\n\n it(\n \"should handle unicode filenames\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-unicode\");\n await shared.write(\n `${baseDir}/\\u6D4B\\u8BD5\\u6587\\u4EF6.txt`,\n \"content\",\n );\n await shared.write(\n `${baseDir}/\\u0444\\u0430\\u0439\\u043B.txt`,\n \"content\",\n );\n\n const result = await shared.lsInfo(baseDir);\n\n expect(result.length).toBe(2);\n },\n timeout,\n );\n\n it(\n \"should handle large directories\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-large\");\n // Create 50 files in a single command for speed\n await shared.execute(\n `mkdir -p '${baseDir}' && cd '${baseDir}' && ` +\n \"for i in $(seq 0 49); do \" +\n \"echo 'content' > file_$(printf '%03d' $i).txt; done\",\n );\n\n const result = await shared.lsInfo(baseDir);\n\n expect(result.length).toBe(50);\n const paths = result.map((info) => info.path);\n expect(paths).toContain(`${baseDir}/file_000.txt`);\n expect(paths).toContain(`${baseDir}/file_049.txt`);\n },\n timeout,\n );\n\n it(\n \"should handle trailing slash in path\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-trailing\");\n await shared.write(`${baseDir}/file.txt`, \"content\");\n\n // List with trailing slash\n const result = await shared.lsInfo(`${baseDir}/`);\n\n // Should work the same as without trailing slash\n expect(result.length).toBeGreaterThanOrEqual(1);\n },\n timeout,\n );\n\n it(\n \"should handle special characters in filenames\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"li-special-chars\");\n await shared.write(`${baseDir}/file(1).txt`, \"content\");\n await shared.write(`${baseDir}/file-3.txt`, \"content\");\n\n const result = await shared.lsInfo(baseDir);\n\n const paths = result.map((info) => info.path);\n expect(paths).toContain(`${baseDir}/file(1).txt`);\n expect(paths).toContain(`${baseDir}/file-3.txt`);\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register grepRaw() tests (basic search, glob filter, no matches,\n * multi matches, literal matching, unicode, case sensitivity, special chars,\n * empty dir, nested dirs, line numbers).\n */\nexport function registerGrepRawTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"grepRaw\", () => {\n it(\n \"should find basic literal pattern matches\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-basic\");\n await shared.write(\n `${baseDir}/file1.txt`,\n \"Hello world\\nGoodbye world\",\n );\n await shared.write(\n `${baseDir}/file2.txt`,\n \"Hello there\\nGoodbye friend\",\n );\n\n const result = await shared.grepRaw(\"Hello\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(2);\n\n const paths = matches.map((m) => m.path);\n expect(paths.some((p) => p.includes(\"file1.txt\"))).toBe(true);\n expect(paths.some((p) => p.includes(\"file2.txt\"))).toBe(true);\n\n for (const match of matches) {\n expect(match.line).toBe(1);\n expect(match.text).toContain(\"Hello\");\n }\n },\n timeout,\n );\n\n it(\n \"should filter files with glob pattern\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-glob\");\n await shared.write(`${baseDir}/test.txt`, \"pattern_match\");\n await shared.write(`${baseDir}/test.py`, \"pattern_match\");\n await shared.write(`${baseDir}/test.md`, \"pattern_match\");\n\n const result = await shared.grepRaw(\"pattern_match\", baseDir, \"*.py\");\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(1);\n expect(matches[0].path).toContain(\"test.py\");\n },\n timeout,\n );\n\n it(\n \"should return empty array when no matches found\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-no-match\");\n await shared.write(`${baseDir}/file.txt`, \"Hello world\");\n\n const result = await shared.grepRaw(\"nonexistent_str\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n expect(\n (\n result as Array<{\n path: string;\n line: number;\n text: string;\n }>\n ).length,\n ).toBe(0);\n },\n timeout,\n );\n\n it(\n \"should find multiple matches in a single file\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-multi\");\n await shared.write(\n `${baseDir}/fruits.txt`,\n \"apple\\nbanana\\napple\\norange\\napple\",\n );\n\n const result = await shared.grepRaw(\"apple\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(3);\n\n const lineNumbers = matches.map((m) => m.line);\n expect(lineNumbers).toEqual([1, 3, 5]);\n },\n timeout,\n );\n\n it(\n \"should match literal strings not regex\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-literal\");\n await shared.write(\n `${baseDir}/numbers.txt`,\n \"test123\\ntest456\\nabcdef\",\n );\n\n const result = await shared.grepRaw(\"test123\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(1);\n expect(matches[0].text).toContain(\"test123\");\n },\n timeout,\n );\n\n it(\n \"should find unicode patterns\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-unicode\");\n await shared.write(\n `${baseDir}/unicode.txt`,\n \"Hello \\u4E16\\u754C\\n\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442 \\u043C\\u0438\\u0440\\n\\u6D4B\\u8BD5 pattern\",\n );\n\n const result = await shared.grepRaw(\"\\u4E16\\u754C\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(1);\n expect(matches[0].text).toContain(\"\\u4E16\\u754C\");\n },\n timeout,\n );\n\n it(\n \"should be case-sensitive by default\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-case\");\n await shared.write(`${baseDir}/case.txt`, \"Hello\\nhello\\nHELLO\");\n\n const result = await shared.grepRaw(\"Hello\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n // Should only match \"Hello\", not \"hello\" or \"HELLO\"\n expect(matches.length).toBe(1);\n expect(matches[0].text).toContain(\"Hello\");\n },\n timeout,\n );\n\n it(\n \"should handle special characters as literals\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-special\");\n await shared.write(\n `${baseDir}/special.txt`,\n \"Price: $100\\nPath: /usr/bin\\nPattern: [a-z]*\",\n );\n\n // Test with dollar sign (literal)\n const result1 = await shared.grepRaw(\"$100\", baseDir);\n expect(Array.isArray(result1)).toBe(true);\n const matches1 = result1 as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches1.length).toBe(1);\n expect(matches1[0].text).toContain(\"$100\");\n\n // Test with brackets (literal)\n const result2 = await shared.grepRaw(\"[a-z]*\", baseDir);\n expect(Array.isArray(result2)).toBe(true);\n const matches2 = result2 as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches2.length).toBe(1);\n expect(matches2[0].text).toContain(\"[a-z]*\");\n },\n timeout,\n );\n\n it(\n \"should return empty array for empty directory\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-empty-dir\");\n await shared.execute(`mkdir -p '${baseDir}'`);\n\n const result = await shared.grepRaw(\"anything\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n expect(\n (\n result as Array<{\n path: string;\n line: number;\n text: string;\n }>\n ).length,\n ).toBe(0);\n },\n timeout,\n );\n\n it(\n \"should search recursively across nested directories\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-nested\");\n await shared.write(`${baseDir}/root.txt`, \"target_nested here\");\n await shared.write(`${baseDir}/sub1/level1.txt`, \"target_nested here\");\n await shared.write(\n `${baseDir}/sub1/sub2/level2.txt`,\n \"target_nested here\",\n );\n\n const result = await shared.grepRaw(\"target_nested\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(3);\n },\n timeout,\n );\n\n it(\n \"should report correct line numbers\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gr-line-nums\");\n const content = Array.from(\n { length: 100 },\n (_, i) => `Line ${i + 1}`,\n ).join(\"\\n\");\n await shared.write(`${baseDir}/long.txt`, content);\n\n const result = await shared.grepRaw(\"Line 50\", baseDir);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as Array<{\n path: string;\n line: number;\n text: string;\n }>;\n expect(matches.length).toBe(1);\n expect(matches[0].line).toBe(50);\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register globInfo() tests (wildcard, recursive, no matches, directories,\n * extension filter, hidden files, character classes, question mark,\n * multiple extensions, deeply nested).\n */\nexport function registerGlobInfoTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"globInfo\", () => {\n it(\n \"should match basic wildcard pattern\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-basic\");\n await shared.write(`${baseDir}/file1.txt`, \"content\");\n await shared.write(`${baseDir}/file2.txt`, \"content\");\n await shared.write(`${baseDir}/file3.py`, \"content\");\n\n const result = await shared.globInfo(\"*.txt\", baseDir);\n\n expect(result.length).toBe(2);\n const paths = result.map((info) => info.path);\n expect(paths).toContain(\"file1.txt\");\n expect(paths).toContain(\"file2.txt\");\n expect(paths.every((p) => !p.endsWith(\".py\"))).toBe(true);\n },\n timeout,\n );\n\n it(\n \"should match recursive pattern (**)\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-recursive\");\n await shared.write(`${baseDir}/root.txt`, \"content\");\n await shared.write(`${baseDir}/subdir1/nested1.txt`, \"content\");\n await shared.write(`${baseDir}/subdir2/nested2.txt`, \"content\");\n\n const result = await shared.globInfo(\"**/*.txt\", baseDir);\n\n expect(result.length).toBeGreaterThanOrEqual(2);\n const paths = result.map((info) => info.path);\n expect(paths.some((p) => p.includes(\"nested1.txt\"))).toBe(true);\n expect(paths.some((p) => p.includes(\"nested2.txt\"))).toBe(true);\n },\n timeout,\n );\n\n it(\n \"should return empty array when no matches\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-no-match\");\n await shared.write(`${baseDir}/file.txt`, \"content\");\n\n const result = await shared.globInfo(\"*.py\", baseDir);\n\n expect(result).toEqual([]);\n },\n timeout,\n );\n\n it(\n \"should include directories in results\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-dirs\");\n await shared.execute(`mkdir -p '${baseDir}/dir1' '${baseDir}/dir2'`);\n await shared.write(`${baseDir}/file.txt`, \"content\");\n\n const result = await shared.globInfo(\"*\", baseDir);\n\n expect(result.length).toBe(3);\n\n const dirCount = result.filter((info) => info.is_dir).length;\n const fileCount = result.filter((info) => !info.is_dir).length;\n expect(dirCount).toBe(2);\n expect(fileCount).toBe(1);\n },\n timeout,\n );\n\n it(\n \"should match specific file extensions\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-ext\");\n await shared.write(`${baseDir}/test.py`, \"content\");\n await shared.write(`${baseDir}/test.txt`, \"content\");\n await shared.write(`${baseDir}/test.md`, \"content\");\n\n const result = await shared.globInfo(\"*.py\", baseDir);\n\n expect(result.length).toBe(1);\n expect(result[0].path).toContain(\"test.py\");\n },\n timeout,\n );\n\n it(\n \"should match hidden files explicitly\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-hidden\");\n await shared.write(`${baseDir}/.hidden1`, \"content\");\n await shared.write(`${baseDir}/.hidden2`, \"content\");\n await shared.write(`${baseDir}/visible.txt`, \"content\");\n\n const result = await shared.globInfo(\".*\", baseDir);\n\n const paths = result.map((info) => info.path);\n expect(\n paths.some((p) => p.includes(\".hidden1\") || p.includes(\".hidden2\")),\n ).toBe(true);\n // Should not match visible.txt\n expect(paths.every((p) => !p.includes(\"visible\"))).toBe(true);\n },\n timeout,\n );\n\n it(\n \"should match character class patterns\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-charclass\");\n await shared.write(`${baseDir}/file1.txt`, \"content\");\n await shared.write(`${baseDir}/file2.txt`, \"content\");\n await shared.write(`${baseDir}/file3.txt`, \"content\");\n await shared.write(`${baseDir}/fileA.txt`, \"content\");\n\n const result = await shared.globInfo(\"file[1-2].txt\", baseDir);\n\n expect(result.length).toBe(2);\n const paths = result.map((info) => info.path);\n expect(paths).toContain(\"file1.txt\");\n expect(paths).toContain(\"file2.txt\");\n expect(paths).not.toContain(\"file3.txt\");\n expect(paths).not.toContain(\"fileA.txt\");\n },\n timeout,\n );\n\n it(\n \"should match single character wildcard (?)\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-question\");\n await shared.write(`${baseDir}/file1.txt`, \"content\");\n await shared.write(`${baseDir}/file2.txt`, \"content\");\n await shared.write(`${baseDir}/file10.txt`, \"content\");\n\n const result = await shared.globInfo(\"file?.txt\", baseDir);\n\n // Should match file1.txt and file2.txt, but not file10.txt\n expect(result.length).toBe(2);\n const paths = result.map((info) => info.path);\n expect(paths).not.toContain(\"file10.txt\");\n },\n timeout,\n );\n\n it(\n \"should match multiple extensions separately\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-multi-ext\");\n await shared.write(`${baseDir}/file.txt`, \"content\");\n await shared.write(`${baseDir}/file.py`, \"content\");\n await shared.write(`${baseDir}/file.md`, \"content\");\n await shared.write(`${baseDir}/file.js`, \"content\");\n\n const resultTxt = await shared.globInfo(\"*.txt\", baseDir);\n const resultPy = await shared.globInfo(\"*.py\", baseDir);\n\n expect(resultTxt.length).toBe(1);\n expect(resultPy.length).toBe(1);\n },\n timeout,\n );\n\n it(\n \"should match deeply nested patterns\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"gl-deep\");\n await shared.write(`${baseDir}/a/b/c/d/deep.txt`, \"content\");\n await shared.write(`${baseDir}/a/b/other.txt`, \"content\");\n\n const result = await shared.globInfo(\"**/deep.txt\", baseDir);\n\n expect(result.length).toBeGreaterThanOrEqual(1);\n expect(result.some((info) => info.path.includes(\"deep.txt\"))).toBe(\n true,\n );\n },\n timeout,\n );\n });\n}\n","import { withRetry } from \"../sandbox.js\";\nimport type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register initialFiles tests (basic, deeply nested, empty).\n *\n * These tests create temporary sandboxes and tear them down immediately.\n */\nexport function registerInitialFilesTests<T extends SandboxInstance>(\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"initialFiles\", () => {\n it(\n \"should create sandbox with initial files\",\n async () => {\n const initPath = config.resolvePath(\"init-test.txt\");\n const nestedPath = config.resolvePath(\"nested/dir/file.txt\");\n\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [initPath]: \"Hello from initial file!\",\n [nestedPath]: \"Nested content\",\n },\n }),\n );\n\n try {\n expect(tmp.isRunning).toBe(true);\n\n // Verify files exist using cat\n const result1 = await tmp.execute(`cat ${initPath}`);\n expect(result1.exitCode).toBe(0);\n expect(result1.output.trim()).toBe(\"Hello from initial file!\");\n\n const result2 = await tmp.execute(`cat ${nestedPath}`);\n expect(result2.exitCode).toBe(0);\n expect(result2.output.trim()).toBe(\"Nested content\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should create sandbox with deeply nested initial files\",\n async () => {\n const buttonPath = config.resolvePath(\n \"src/components/Button/index.tsx\",\n );\n const helperPath = config.resolvePath(\"src/utils/helpers/string.ts\");\n\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [buttonPath]:\n \"export const Button = () => <button>Click</button>;\",\n [helperPath]:\n \"export const capitalize = (s: string) => s.toUpperCase();\",\n },\n }),\n );\n\n try {\n expect(tmp.isRunning).toBe(true);\n\n // Verify file contents\n const buttonContent = await tmp.execute(`cat ${buttonPath}`);\n expect(buttonContent.output).toContain(\"Button\");\n\n const helperContent = await tmp.execute(`cat ${helperPath}`);\n expect(helperContent.output).toContain(\"capitalize\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should create sandbox with empty initialFiles object\",\n async () => {\n const tmp = await withRetry(() =>\n config.createSandbox({ initialFiles: {} }),\n );\n\n try {\n expect(tmp.isRunning).toBe(true);\n\n // Sandbox should work normally\n const result = await tmp.execute('echo \"Works!\"');\n expect(result.exitCode).toBe(0);\n expect(result.output).toContain(\"Works!\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should make initialFiles accessible via read()\",\n async () => {\n const filePath = config.resolvePath(\"init-read-test.txt\");\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [filePath]: \"Content for read test\",\n },\n }),\n );\n\n try {\n const content = await tmp.read(filePath);\n expect(content).toContain(\"Content for read test\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should make initialFiles accessible via downloadFiles()\",\n async () => {\n const filePath = config.resolvePath(\"init-download-test.txt\");\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [filePath]: \"Content for download test\",\n },\n }),\n );\n\n try {\n const results = await tmp.downloadFiles([filePath]);\n expect(results[0].error).toBeNull();\n expect(results[0].content).not.toBeNull();\n const content = new TextDecoder().decode(results[0].content!);\n expect(content).toContain(\"Content for download test\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should execute a script created via initialFiles\",\n async () => {\n const scriptPath = config.resolvePath(\"init-script.sh\");\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [scriptPath]: '#!/bin/sh\\necho \"Hello from initialFiles script\"',\n },\n }),\n );\n\n try {\n const result = await tmp.execute(`sh ${scriptPath}`);\n expect(result.exitCode).toBe(0);\n expect(result.output.trim()).toBe(\"Hello from initialFiles script\");\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n\n it(\n \"should make initialFiles in subdirectories visible via lsInfo()\",\n async () => {\n const dirPath = config.resolvePath(\"init-ls-dir\");\n const filePath = `${dirPath}/file.txt`;\n const tmp = await withRetry(() =>\n config.createSandbox({\n initialFiles: {\n [filePath]: \"ls test content\",\n },\n }),\n );\n\n try {\n const entries = await tmp.lsInfo(dirPath);\n const paths = entries.map((e) => e.path.replace(/\\/$/, \"\"));\n expect(paths).toContain(filePath);\n } finally {\n await config.closeSandbox?.(tmp);\n }\n },\n timeout,\n );\n });\n}\n","import type { SandboxInstance, StandardTestsConfig } from \"../types.js\";\n\n/**\n * Register integration workflow tests that combine multiple operations.\n */\nexport function registerIntegrationTests<T extends SandboxInstance>(\n getShared: () => T,\n config: StandardTestsConfig<T>,\n timeout: number,\n): void {\n const { describe, it, expect } = config.runner;\n\n describe(\"integration workflows\", () => {\n it(\n \"should complete a write-read-edit-read workflow\",\n async () => {\n const shared = getShared();\n const filePath = config.resolvePath(\"intg-workflow.txt\");\n\n // Write initial content\n const writeResult = await shared.write(filePath, \"Original content\");\n expect(writeResult.error).toBeUndefined();\n\n // Read it back\n const content = await shared.read(filePath);\n expect(content).toContain(\"Original content\");\n\n // Edit it\n const editResult = await shared.edit(filePath, \"Original\", \"Modified\");\n expect(editResult.error).toBeUndefined();\n\n // Read again to verify\n const updatedContent = await shared.read(filePath);\n expect(updatedContent).toContain(\"Modified content\");\n expect(updatedContent).not.toContain(\"Original\");\n },\n timeout,\n );\n\n it(\n \"should handle complex directory operations\",\n async () => {\n const shared = getShared();\n const baseDir = config.resolvePath(\"intg-complex\");\n\n // Create directory structure with files\n await shared.write(`${baseDir}/root.txt`, \"root file\");\n await shared.write(`${baseDir}/subdir1/file1.txt`, \"file 1\");\n await shared.write(`${baseDir}/subdir1/file2.py`, \"file 2\");\n await shared.write(`${baseDir}/subdir2/file3.txt`, \"file 3\");\n\n // List root directory\n const lsResult = await shared.lsInfo(baseDir);\n const lsPaths = lsResult.map((info) => info.path.replace(/\\/$/, \"\"));\n expect(lsPaths).toContain(`${baseDir}/root.txt`);\n expect(lsPaths).toContain(`${baseDir}/subdir1`);\n expect(lsPaths).toContain(`${baseDir}/subdir2`);\n\n // Glob for txt files\n const globResult = await shared.globInfo(\"**/*.txt\", baseDir);\n expect(globResult.length).toBe(3);\n\n // Grep for a pattern\n const grepResult = await shared.grepRaw(\"file\", baseDir);\n expect(Array.isArray(grepResult)).toBe(true);\n expect(\n (\n grepResult as Array<{\n path: string;\n line: number;\n text: string;\n }>\n ).length,\n ).toBeGreaterThanOrEqual(3);\n },\n timeout,\n );\n });\n}\n","/**\n * Standard integration test suite for sandbox providers.\n *\n * This module provides a reusable set of integration tests that verify\n * common sandbox behavior across all provider implementations. Each provider\n * calls `sandboxStandardTests()` with its own configuration to run these\n * tests against its sandbox implementation.\n *\n * **Design**: A single shared sandbox is created once (in `beforeAll`) and\n * reused across all command-execution and file-operation tests. Only\n * lifecycle tests that verify create/close behaviour and initialFiles tests\n * that require a fresh sandbox spin up a temporary instance — and they tear\n * it down immediately inside the test so the concurrent sandbox count never\n * exceeds 2.\n *\n * Tests cover:\n * - Sandbox lifecycle (create, isRunning, close, two-step initialization)\n * - Command execution (echo, exit codes, multiline output, stderr, env vars)\n * - File operations (upload, download, read, write, edit, multiple files)\n * - write() (new file, parent dirs, existing file, special chars, unicode, long content)\n * - read() (basic, nonexistent, offset, limit, offset+limit, unicode, chunked)\n * - edit() (single/multi occurrence, replaceAll, not found, special chars, multiline, unicode)\n * - lsInfo() (basic listing, empty dir, hidden files, large dir, absolute paths)\n * - grepRaw() (basic search, glob filter, case sensitivity, nested dirs, unicode)\n * - globInfo() (wildcard, recursive, extension filter, character classes, deeply nested)\n * - Initial files support (basic, nested, empty)\n * - Integration workflows (write-read-edit, complex directory operations)\n * - Error handling (file not found, non-existent command)\n */\n\nimport { registerLifecycleTests } from \"./tests/lifecycle.js\";\nimport { registerCommandExecutionTests } from \"./tests/command-execution.js\";\nimport { registerFileOperationTests } from \"./tests/file-operations.js\";\nimport { registerWriteTests } from \"./tests/write.js\";\nimport { registerReadTests } from \"./tests/read.js\";\nimport { registerEditTests } from \"./tests/edit.js\";\nimport { registerLsInfoTests } from \"./tests/ls-info.js\";\nimport { registerGrepRawTests } from \"./tests/grep-raw.js\";\nimport { registerGlobInfoTests } from \"./tests/glob-info.js\";\nimport { registerInitialFilesTests } from \"./tests/initial-files.js\";\nimport { registerIntegrationTests } from \"./tests/integration.js\";\nimport type { SandboxInstance, StandardTestsConfig, SuiteFn } from \"./types.js\";\n/**\n * Default number of retry attempts for sandbox creation.\n */\nconst DEFAULT_MAX_RETRIES = 5;\n\n/**\n * Default delay in milliseconds between retries.\n */\nconst DEFAULT_RETRY_DELAY_MS = 15_000;\n\n/**\n * Retry an async operation with a fixed delay between attempts.\n *\n * Useful for working around transient sandbox concurrency limits:\n * when a provider rejects creation because the organisation has too\n * many running sandboxes, waiting a short while and retrying usually\n * succeeds once a previous sandbox finishes shutting down.\n *\n * @param fn - The async operation to attempt\n * @param maxRetries - Maximum number of attempts (default: 3)\n * @param delayMs - Milliseconds to wait between attempts (default: 10 000)\n * @returns The result of the first successful attempt\n *\n * @example\n * ```ts\n * const sandbox = await withRetry(() => DenoSandbox.create({ memoryMb: 768 }));\n * ```\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n maxRetries: number = DEFAULT_MAX_RETRIES,\n delayMs: number = DEFAULT_RETRY_DELAY_MS,\n): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt < maxRetries) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Run the standard sandbox integration tests against a provider.\n *\n * A single shared sandbox is created in `beforeAll` and reused for the\n * majority of tests (command execution, file operations). Tests that\n * inherently need their own sandbox (lifecycle close/init, initialFiles)\n * create a temporary one and destroy it immediately, so the concurrent\n * sandbox count never exceeds **2** (shared + 1 temporary).\n *\n * @example\n * ```ts\n * import { sandboxStandardTests } from \"@langchain/sandbox-standard-tests/vitest\";\n * import { ModalSandbox } from \"./sandbox.js\";\n *\n * sandboxStandardTests({\n * name: \"ModalSandbox\",\n * skip: !process.env.MODAL_TOKEN_ID,\n * timeout: 180_000,\n * createSandbox: (opts) =>\n * ModalSandbox.create({ imageName: \"alpine:3.21\", ...opts }),\n * createUninitializedSandbox: () =>\n * new ModalSandbox({ imageName: \"alpine:3.21\" }),\n * closeSandbox: (sb) => sb.close(),\n * resolvePath: (name) => `/tmp/${name}`,\n * });\n * ```\n */\nexport function sandboxStandardTests<T extends SandboxInstance>(\n config: StandardTestsConfig<T>,\n): void {\n const { describe, beforeAll, afterAll } = config.runner;\n const timeout = config.timeout ?? 120_000;\n\n // Resolve the right describe variant based on skip / sequential flags.\n // When the runner doesn't provide .skip or .sequential we fall back to\n // a no-op or to the plain describe, respectively.\n let outerDescribe: SuiteFn;\n if (config.skip) {\n outerDescribe = describe.skip ?? (() => {});\n } else if (config.sequential) {\n outerDescribe = describe.sequential ?? describe;\n } else {\n outerDescribe = describe;\n }\n\n outerDescribe(`${config.name} Standard Tests`, () => {\n let shared: T;\n const getShared = () => shared;\n\n beforeAll(async () => {\n shared = await withRetry(() => config.createSandbox());\n }, timeout);\n\n afterAll(async () => {\n try {\n await config.closeSandbox?.(shared);\n } catch {\n // Ignore cleanup errors\n }\n }, timeout);\n\n registerLifecycleTests(getShared, config, timeout);\n registerCommandExecutionTests(getShared, config, timeout);\n registerFileOperationTests(getShared, config, timeout);\n registerWriteTests(getShared, config, timeout);\n registerReadTests(getShared, config, timeout);\n registerEditTests(getShared, config, timeout);\n registerLsInfoTests(getShared, config, timeout);\n registerGrepRawTests(getShared, config, timeout);\n registerGlobInfoTests(getShared, config, timeout);\n registerInitialFilesTests(config, timeout);\n registerIntegrationTests(getShared, config, timeout);\n });\n}\n"],"mappings":"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"}
|