@earendil-works/pi-durable 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +147 -11
  3. package/dist/codemode/codemode.d.ts +173 -0
  4. package/dist/codemode/codemode.d.ts.map +1 -0
  5. package/dist/codemode/codemode.js +886 -0
  6. package/dist/codemode/codemode.js.map +1 -0
  7. package/dist/codemode/describe.d.ts +38 -0
  8. package/dist/codemode/describe.d.ts.map +1 -0
  9. package/dist/codemode/describe.js +119 -0
  10. package/dist/codemode/describe.js.map +1 -0
  11. package/dist/codemode/index.d.ts +3 -0
  12. package/dist/codemode/index.d.ts.map +1 -0
  13. package/dist/codemode/index.js +3 -0
  14. package/dist/codemode/index.js.map +1 -0
  15. package/dist/codemode/models.d.ts +28 -0
  16. package/dist/codemode/models.d.ts.map +1 -0
  17. package/dist/codemode/models.js +231 -0
  18. package/dist/codemode/models.js.map +1 -0
  19. package/dist/codemode/output.d.ts +41 -0
  20. package/dist/codemode/output.d.ts.map +1 -0
  21. package/dist/codemode/output.js +167 -0
  22. package/dist/codemode/output.js.map +1 -0
  23. package/dist/env/index.d.ts +42 -0
  24. package/dist/env/index.d.ts.map +1 -1
  25. package/dist/env/index.js.map +1 -1
  26. package/dist/errors.d.ts +20 -3
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +34 -5
  29. package/dist/errors.js.map +1 -1
  30. package/dist/harness/agent.d.ts +5 -2
  31. package/dist/harness/agent.d.ts.map +1 -1
  32. package/dist/harness/agent.js +69 -25
  33. package/dist/harness/agent.js.map +1 -1
  34. package/dist/harness/compaction.d.ts +6 -1
  35. package/dist/harness/compaction.d.ts.map +1 -1
  36. package/dist/harness/compaction.js +10 -7
  37. package/dist/harness/compaction.js.map +1 -1
  38. package/dist/harness/events.d.ts +35 -15
  39. package/dist/harness/events.d.ts.map +1 -1
  40. package/dist/harness/events.js +77 -23
  41. package/dist/harness/events.js.map +1 -1
  42. package/dist/harness/generation.d.ts +2 -0
  43. package/dist/harness/generation.d.ts.map +1 -1
  44. package/dist/harness/generation.js +31 -8
  45. package/dist/harness/generation.js.map +1 -1
  46. package/dist/harness/harness.d.ts +7 -0
  47. package/dist/harness/harness.d.ts.map +1 -1
  48. package/dist/harness/harness.js +53 -26
  49. package/dist/harness/harness.js.map +1 -1
  50. package/dist/harness/inbox.d.ts +16 -4
  51. package/dist/harness/inbox.d.ts.map +1 -1
  52. package/dist/harness/inbox.js +26 -3
  53. package/dist/harness/inbox.js.map +1 -1
  54. package/dist/harness/live.d.ts +74 -17
  55. package/dist/harness/live.d.ts.map +1 -1
  56. package/dist/harness/live.js +66 -14
  57. package/dist/harness/live.js.map +1 -1
  58. package/dist/harness/scheduler.d.ts +18 -5
  59. package/dist/harness/scheduler.d.ts.map +1 -1
  60. package/dist/harness/scheduler.js +696 -163
  61. package/dist/harness/scheduler.js.map +1 -1
  62. package/dist/harness/submissions.d.ts +7 -4
  63. package/dist/harness/submissions.d.ts.map +1 -1
  64. package/dist/harness/submissions.js +32 -13
  65. package/dist/harness/submissions.js.map +1 -1
  66. package/dist/harness/task-graph.d.ts +1 -1
  67. package/dist/harness/task-graph.d.ts.map +1 -1
  68. package/dist/harness/task-graph.js +15 -10
  69. package/dist/harness/task-graph.js.map +1 -1
  70. package/dist/harness/tool.d.ts +45 -5
  71. package/dist/harness/tool.d.ts.map +1 -1
  72. package/dist/harness/tool.js +377 -62
  73. package/dist/harness/tool.js.map +1 -1
  74. package/dist/harness/types.d.ts +153 -13
  75. package/dist/harness/types.d.ts.map +1 -1
  76. package/dist/harness/types.js.map +1 -1
  77. package/dist/harness/util.d.ts +6 -1
  78. package/dist/harness/util.d.ts.map +1 -1
  79. package/dist/harness/util.js +5 -2
  80. package/dist/harness/util.js.map +1 -1
  81. package/dist/harness/view.d.ts +6 -2
  82. package/dist/harness/view.d.ts.map +1 -1
  83. package/dist/harness/view.js +22 -12
  84. package/dist/harness/view.js.map +1 -1
  85. package/dist/images/cloudflare.d.ts +4 -0
  86. package/dist/images/cloudflare.d.ts.map +1 -0
  87. package/dist/images/cloudflare.js +9 -0
  88. package/dist/images/cloudflare.js.map +1 -0
  89. package/dist/images/exif.d.ts +3 -0
  90. package/dist/images/exif.d.ts.map +1 -0
  91. package/dist/images/exif.js +71 -0
  92. package/dist/images/exif.js.map +1 -0
  93. package/dist/images/index.d.ts +18 -0
  94. package/dist/images/index.d.ts.map +1 -0
  95. package/dist/images/index.js +125 -0
  96. package/dist/images/index.js.map +1 -0
  97. package/dist/images/node-worker.d.ts +17 -0
  98. package/dist/images/node-worker.d.ts.map +1 -0
  99. package/dist/images/node-worker.js +16 -0
  100. package/dist/images/node-worker.js.map +1 -0
  101. package/dist/images/node.d.ts +21 -0
  102. package/dist/images/node.d.ts.map +1 -0
  103. package/dist/images/node.js +121 -0
  104. package/dist/images/node.js.map +1 -0
  105. package/dist/index.d.ts +6 -6
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +3 -3
  108. package/dist/index.js.map +1 -1
  109. package/dist/search.d.ts +13 -0
  110. package/dist/search.d.ts.map +1 -0
  111. package/dist/search.js +85 -0
  112. package/dist/search.js.map +1 -0
  113. package/dist/session/observation.d.ts +10 -3
  114. package/dist/session/observation.d.ts.map +1 -1
  115. package/dist/session/observation.js +24 -34
  116. package/dist/session/observation.js.map +1 -1
  117. package/dist/session/session.d.ts +68 -5
  118. package/dist/session/session.d.ts.map +1 -1
  119. package/dist/session/session.js +461 -49
  120. package/dist/session/session.js.map +1 -1
  121. package/dist/session/transaction.d.ts.map +1 -1
  122. package/dist/session/transaction.js +1 -0
  123. package/dist/session/transaction.js.map +1 -1
  124. package/dist/storage/jsonl/storage.d.ts +4 -0
  125. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  126. package/dist/storage/jsonl/storage.js +2 -1
  127. package/dist/storage/jsonl/storage.js.map +1 -1
  128. package/dist/storage/memory.d.ts.map +1 -1
  129. package/dist/storage/memory.js +8 -10
  130. package/dist/storage/memory.js.map +1 -1
  131. package/dist/storage/scan.d.ts.map +1 -1
  132. package/dist/storage/scan.js +5 -4
  133. package/dist/storage/scan.js.map +1 -1
  134. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  135. package/dist/storage/sqlite/storage.js +10 -12
  136. package/dist/storage/sqlite/storage.js.map +1 -1
  137. package/dist/testing/env-conformance.d.ts.map +1 -1
  138. package/dist/testing/env-conformance.js +100 -0
  139. package/dist/testing/env-conformance.js.map +1 -1
  140. package/dist/testing/runner.d.ts +1 -1
  141. package/dist/testing/runner.d.ts.map +1 -1
  142. package/dist/testing/runner.js.map +1 -1
  143. package/dist/testing/storage-conformance.d.ts.map +1 -1
  144. package/dist/testing/storage-conformance.js +3 -2
  145. package/dist/testing/storage-conformance.js.map +1 -1
  146. package/dist/testing/types.d.ts +2 -0
  147. package/dist/testing/types.d.ts.map +1 -1
  148. package/dist/testing/types.js.map +1 -1
  149. package/dist/tool-search/index.d.ts +2 -0
  150. package/dist/tool-search/index.d.ts.map +1 -0
  151. package/dist/tool-search/index.js +2 -0
  152. package/dist/tool-search/index.js.map +1 -0
  153. package/dist/tool-search/tool-search.d.ts +23 -0
  154. package/dist/tool-search/tool-search.d.ts.map +1 -0
  155. package/dist/tool-search/tool-search.js +84 -0
  156. package/dist/tool-search/tool-search.js.map +1 -0
  157. package/dist/tools/bash.d.ts +10 -2
  158. package/dist/tools/bash.d.ts.map +1 -1
  159. package/dist/tools/bash.js +27 -9
  160. package/dist/tools/bash.js.map +1 -1
  161. package/dist/tools/edit.js +1 -1
  162. package/dist/tools/edit.js.map +1 -1
  163. package/dist/tools/image-processor.d.ts +47 -0
  164. package/dist/tools/image-processor.d.ts.map +1 -0
  165. package/dist/tools/image-processor.js +30 -0
  166. package/dist/tools/image-processor.js.map +1 -0
  167. package/dist/tools/image.d.ts +8 -0
  168. package/dist/tools/image.d.ts.map +1 -1
  169. package/dist/tools/image.js +47 -0
  170. package/dist/tools/image.js.map +1 -1
  171. package/dist/tools/index.d.ts +25 -2
  172. package/dist/tools/index.d.ts.map +1 -1
  173. package/dist/tools/index.js +13 -5
  174. package/dist/tools/index.js.map +1 -1
  175. package/dist/tools/read.d.ts +10 -2
  176. package/dist/tools/read.d.ts.map +1 -1
  177. package/dist/tools/read.js +87 -28
  178. package/dist/tools/read.js.map +1 -1
  179. package/dist/tools/write.js +1 -1
  180. package/dist/tools/write.js.map +1 -1
  181. package/dist/types.d.ts +59 -5
  182. package/dist/types.d.ts.map +1 -1
  183. package/dist/types.js.map +1 -1
  184. package/package.json +43 -4
@@ -1 +1 @@
1
- {"version":3,"file":"env-conformance.js","sourceRoot":"","sources":["../../src/testing/env-conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT, withAbortSignal } from \"@earendil-works/chord/context\";\nimport {\n\ttype ExecutionEnv,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype Result,\n\ttype ShellOutputInfo,\n\ttype WatchChange,\n\ttype WatchTarget,\n} from \"../env/index.ts\";\nimport type { EnvConformanceCase, EnvConformanceOptions } from \"./types.ts\";\n\nconst context = BACKGROUND_CONTEXT;\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\ntype EnvTest = (env: ExecutionEnv) => Promise<void>;\n\nfunction abortedContext(): Context {\n\tconst controller = new AbortController();\n\tcontroller.abort();\n\treturn withAbortSignal(controller.signal, BACKGROUND_CONTEXT);\n}\n\nfunction errorCode(result: Result<unknown, { code: string }>): string | undefined {\n\treturn result.ok ? undefined : result.error.code;\n}\n\nasync function readAll(\n\tenv: ExecutionEnv,\n\tpath: string,\n\tmaxEntries: number,\n): Promise<{ pages: FileInfo[][]; done: boolean }> {\n\tconst reader = getOrThrow(await env.openDirReader(path, context));\n\tconst pages: FileInfo[][] = [];\n\ttry {\n\t\tfor (let page = 0; page < 1000; page++) {\n\t\t\tconst next = getOrThrow(await reader.next(maxEntries, context));\n\t\t\tpages.push(next.entries);\n\t\t\tif (next.done) return { pages, done: true };\n\t\t}\n\t\treturn { pages, done: false };\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/** Whether a change reports `path`: an overflow, or a reported path at or above it. */\nfunction covers(change: WatchChange, path: string): boolean {\n\tif (\"overflow\" in change) return true;\n\tif (!(\"paths\" in change)) return false;\n\treturn change.paths.some(\n\t\t(reported) => path === reported || path.startsWith(`${reported}/`) || path.startsWith(`${reported}\\\\`),\n\t);\n}\n\n/** Watch `targets` while `run` changes files, with a helper that waits for a change reporting a path. */\nasync function watching(\n\tenv: ExecutionEnv,\n\ttargets: readonly WatchTarget[],\n\trun: (helpers: {\n\t\treadonly changes: WatchChange[];\n\t\t/** Wait up to three seconds for a change, after the call, that reports `path`. */\n\t\texpectChange(path: string, change: () => Promise<void>): Promise<void>;\n\t\tabsolute(path: string): Promise<string>;\n\t}) => Promise<void>,\n): Promise<void> {\n\tconst changes: WatchChange[] = [];\n\tconst watcher = getOrThrow(await env.watch(targets, (change) => changes.push(change), context));\n\ttry {\n\t\tconst absolute = async (path: string) => getOrThrow(await env.absolutePath(path, context));\n\t\tawait run({\n\t\t\tchanges,\n\t\t\tabsolute,\n\t\t\tasync expectChange(path, change) {\n\t\t\t\tconst target = await absolute(path);\n\t\t\t\tconst from = changes.length;\n\t\t\t\tawait change();\n\t\t\t\tconst deadline = Date.now() + 3000;\n\t\t\t\twhile (!changes.slice(from).some((entry) => covers(entry, target))) {\n\t\t\t\t\tif (Date.now() > deadline) {\n\t\t\t\t\t\tthrow new Error(`No change reported ${target}; got ${JSON.stringify(changes.slice(from))}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 20));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t} finally {\n\t\tawait watcher.close(context);\n\t}\n}\n\n/**\n * Creates runner-independent cases for an `ExecutionEnv`. `withEnv` must call and await its callback exactly once per\n * case with an environment whose `cwd` is a fresh, empty, writable directory.\n */\nexport function createEnvConformance(options: EnvConformanceOptions): readonly EnvConformanceCase[] {\n\tconst assert = options.assertions;\n\tconst shell = options.shell ?? [\"sh\", \"-c\"];\n\tconst symlinks = options.symlinks ?? true;\n\tconst createCase = (name: string, test: EnvTest, timeoutMs?: number): EnvConformanceCase => ({\n\t\tname,\n\t\t...(timeoutMs === undefined ? {} : { timeoutMs }),\n\t\trun: () => options.withEnv(test),\n\t});\n\t// Watch cases wait up to three seconds per step, longer than test runners allow by default.\n\tconst watchCase = (name: string, test: EnvTest): EnvConformanceCase => createCase(name, test, 30_000);\n\tconst execCollect = async (env: ExecutionEnv, command: string | readonly string[], cwd?: string) => {\n\t\tconst output: Record<ShellOutputInfo[\"stream\"], string> = { stdout: \"\", stderr: \"\" };\n\t\tconst result = await env.exec(\n\t\t\tcommand,\n\t\t\t{\n\t\t\t\t...(cwd === undefined ? {} : { cwd }),\n\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\toutput[info.stream] += text;\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t\treturn { result, ...output };\n\t};\n\n\tconst cases: EnvConformanceCase[] = [\n\t\tcreateCase(\"binary reader reads byte ranges of the opened file\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"data.txt\", \"hello world\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"data.txt\", undefined, context));\n\t\t\tconst info = getOrThrow(await reader.info(context));\n\t\t\tassert.partialDeepEqual(info, { name: \"data.txt\", kind: \"file\", size: 11 });\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 5, context))), \"hello\");\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(6, 100, context))), \"world\");\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(11, 4, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(50, 1, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(3, 0, context)).length, 0);\n\t\t\tassert.strictEqual(errorCode(await reader.read(-1, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1.5, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.info(context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"binary reader scans lines like decoding the whole file\", async (env) => {\n\t\t\t// A byte-order mark, an invalid sequence before a newline, an empty line, a later U+FEFF, and no final newline.\n\t\t\tconst bytes = Uint8Array.from([\n\t\t\t\t0xef, 0xbb, 0xbf, 0x61, 0x0a, 0xe2, 0x82, 0x0a, 0x0a, 0xef, 0xbb, 0xbf, 0x62, 0x0a, 0xc3, 0xa9,\n\t\t\t]);\n\t\t\tgetOrThrow(await env.writeFile(\"lines.txt\", bytes, context));\n\t\t\tconst lines = new TextDecoder().decode(bytes).split(\"\\n\");\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"lines.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tconst ranges: [number, number | undefined][] = [\n\t\t\t\t\t[0, undefined],\n\t\t\t\t\t[0, 1],\n\t\t\t\t\t[1, 3],\n\t\t\t\t\t[2, 3],\n\t\t\t\t\t[3, undefined],\n\t\t\t\t\t[4, 9],\n\t\t\t\t];\n\t\t\t\tfor (const [startLine, endLine] of ranges) {\n\t\t\t\t\tconst scan = getOrThrow(\n\t\t\t\t\t\tawait reader.scanLines({ startLine, ...(endLine === undefined ? {} : { endLine }) }, context),\n\t\t\t\t\t);\n\t\t\t\t\tconst selected = lines.slice(startLine, endLine);\n\t\t\t\t\tconst range = (from: number, to: number) =>\n\t\t\t\t\t\tnew TextDecoder(\"utf-8\", { ignoreBOM: from > 0 }).decode(bytes.subarray(from, to));\n\t\t\t\t\tassert.strictEqual(scan.newlines, lines.length - 1);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.end), selected.join(\"\\n\"));\n\t\t\t\t\tassert.strictEqual(scan.selectedBytes, encoder.encode(selected.join(\"\\n\")).length);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.firstLineEnd), lines[startLine]);\n\t\t\t\t\tassert.strictEqual(scan.firstLineBytes, encoder.encode(lines[startLine]).length);\n\t\t\t\t}\n\t\t\t\tassert.partialDeepEqual(getOrThrow(await reader.scanLines({ startLine: 9 }, context)), {\n\t\t\t\t\tstart: bytes.length,\n\t\t\t\t\tend: bytes.length,\n\t\t\t\t\tselectedBytes: 0,\n\t\t\t\t});\n\t\t\t\tassert.strictEqual(errorCode(await reader.scanLines({ startLine: 2, endLine: 2 }, context)), \"invalid\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader keeps reading the file it opened after a rename\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"one\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"a.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tgetOrThrow(await env.renameFile(\"a.txt\", \"b.txt\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"two\", context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 10, context))), \"one\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader refuses directories, missing files and aborted opens\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"dir\", undefined, context)), \"is_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"missing.txt\", undefined, context)), \"not_found\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"file.txt\", undefined, abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader pages every entry exactly once\", async (env) => {\n\t\t\tconst names = [\"a.txt\", \"b.txt\", \"c.txt\", \"d.txt\", \"e.txt\"];\n\t\t\tfor (const name of names) getOrThrow(await env.writeFile(name, name, context));\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst { pages, done } = await readAll(env, \".\", 2);\n\t\t\tassert.ok(done, \"directory reader reached the end\");\n\t\t\tfor (const page of pages) assert.ok(page.length <= 2, \"page within maxEntries\");\n\t\t\tconst entries = pages.flat();\n\t\t\tassert.deepEqual(entries.map((entry) => entry.name).sort(), [...names, \"sub\"].sort());\n\t\t\tassert.strictEqual(entries.find((entry) => entry.name === \"sub\")?.kind, \"directory\");\n\t\t\tassert.partialDeepEqual(\n\t\t\t\tentries.find((entry) => entry.name === \"a.txt\"),\n\t\t\t\t{ kind: \"file\", size: 5 },\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\"directory reader reports the end and refuses use after close\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"empty\", context));\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.strictEqual(errorCode(await reader.next(0, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader refuses missing paths and files\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\"missing\", context)), \"not_found\");\n\t\t\tconst file = await env.openDirReader(\"file.txt\", context);\n\t\t\tassert.strictEqual(errorCode(file), \"not_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\".\", abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader skips entries removed during enumeration\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.writeFile(`dir/${name}`, name, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"dir\", context));\n\t\t\ttry {\n\t\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.remove(`dir/${name}`, undefined, context));\n\t\t\t\tconst entries: FileInfo[] = [];\n\t\t\t\tfor (let page = 0; page < 10; page++) {\n\t\t\t\t\tconst next = getOrThrow(await reader.next(10, context));\n\t\t\t\t\tentries.push(...next.entries);\n\t\t\t\t\tif (next.done) break;\n\t\t\t\t}\n\t\t\t\tassert.deepEqual(entries, []);\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing file's creation, changes, replacement and removal\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\t// Editors replace a file by renaming a new one over it.\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md.tmp\", \"three\", context));\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"AGENTS.md.tmp\", \"AGENTS.md\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"four\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.remove(\"AGENTS.md\", undefined, context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing target whose ancestors are created\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"a/b/c/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"a/b/c/AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"a/b/c/AGENTS.md\", \"x\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows directories created together with their contents\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\t// Written before any watcher on the new directories can exist.\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/c/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/c/SKILL.md\", \"deeper\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps watching a path whose parent is renamed and recreated\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"proj/.pi/skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"proj/.pi/skills\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"proj/.pi\", \"proj/old\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch skips excluded entries and reports a rename out of them\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tconst targets: WatchTarget[] = [\n\t\t\t\t{ path: \"skills\", recursive: true, exclude: { hidden: true, names: [\"node_modules\"] } },\n\t\t\t];\n\t\t\tawait watching(env, targets, async ({ changes, expectChange, absolute }) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/node_modules/dep/SKILL.md\", \"dep\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/.SKILL.md.tmp\", \"draft\", context));\n\t\t\t\tawait expectChange(\"skills/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/.SKILL.md.tmp\", \"skills/SKILL.md\", context));\n\t\t\t\t});\n\t\t\t\tconst hidden = [await absolute(\"skills/node_modules\"), await absolute(\"skills/.SKILL.md.tmp\")];\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tif (!(\"paths\" in change)) continue;\n\t\t\t\t\tfor (const path of change.paths) {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t!hidden.some((excluded) => path === excluded || path.startsWith(excluded)),\n\t\t\t\t\t\t\t`excluded ${path}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps recursive coverage where a non-recursive target overlaps\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/one.md\", \"one\", context));\n\t\t\tconst targets: WatchTarget[] = [{ path: \"skills\" }, { path: \"skills\", recursive: true }];\n\t\t\tawait watching(env, targets, async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a/two.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/two.md\", \"two\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows a directory replaced at the same path\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/a\", \"skills-old\", context));\n\t\t\t\t\tgetOrThrow(await env.createDir(\"skills/a\", undefined, context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch stops reporting once closed\", async (env) => {\n\t\t\tconst changes: WatchChange[] = [];\n\t\t\tconst watcher = getOrThrow(await env.watch([{ path: \"file.txt\" }], (change) => changes.push(change), context));\n\t\t\tassert.ok(watcher.mode === \"native\" || watcher.mode === \"polling\", \"watcher reports its mode\");\n\t\t\tawait watcher.close(context);\n\t\t\tawait watcher.close(context);\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tassert.deepEqual(changes, []);\n\t\t}),\n\n\t\tcreateCase(\"argv exec passes arguments to the program without shell parsing\", async (env) => {\n\t\t\tconst hostile = \"it's $(touch pwned) `touch pwned` *; touch pwned\";\n\t\t\tconst { result, stdout } = await execCollect(env, [\n\t\t\t\t...shell,\n\t\t\t\t'printf \"%s|%s\" \"$1\" \"$2\"',\n\t\t\t\t\"argv0\",\n\t\t\t\thostile,\n\t\t\t\t\"a b\",\n\t\t\t]);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tassert.strictEqual(stdout, `${hostile}|a b`);\n\t\t\tassert.strictEqual(getOrThrow(await env.exists(\"pwned\", context)), false);\n\t\t}),\n\n\t\tcreateCase(\"exec reports the stream of every chunk in both forms\", async (env) => {\n\t\t\tconst script = \"printf out; printf err >&2; printf more\";\n\t\t\tconst argv = await execCollect(env, [...shell, script]);\n\t\t\tassert.strictEqual(getOrThrow(argv.result).exitCode, 0);\n\t\t\tassert.strictEqual(argv.stdout, \"outmore\");\n\t\t\tassert.strictEqual(argv.stderr, \"err\");\n\t\t\tconst string = await execCollect(env, script);\n\t\t\tassert.strictEqual(getOrThrow(string.result).exitCode, 0);\n\t\t\tassert.strictEqual(string.stdout, \"outmore\");\n\t\t\tassert.strictEqual(string.stderr, \"err\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec honors cwd and exit codes\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst made = await execCollect(env, [...shell, \"printf x > made.txt; exit 3\"], \"sub\");\n\t\t\tassert.strictEqual(getOrThrow(made.result).exitCode, 3);\n\t\t\tassert.strictEqual(getOrThrow(await env.readTextFile(\"sub/made.txt\", context)), \"x\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec reports missing programs and empty argv as spawn errors\", async (env) => {\n\t\t\tassert.strictEqual(\n\t\t\t\terrorCode(await env.exec([\"pi-durable-conformance-missing-program\"], undefined, context)),\n\t\t\t\t\"spawn_error\",\n\t\t\t);\n\t\t\tassert.strictEqual(errorCode(await env.exec([], undefined, context)), \"spawn_error\");\n\t\t}),\n\n\t\tcreateCase(\"windowed exec keeps the exact tail and counts what it skips\", async (env) => {\n\t\t\tconst lines = 2000;\n\t\t\tconst window = { maxBytes: 200, maxLines: 5, minIntervalMs: 0, bytesPerSecond: 1_000_000_000 };\n\t\t\tlet bytes = 0;\n\t\t\tlet newlines = 0;\n\t\t\tlet tail = \"\";\n\t\t\tconst result = await env.exec(\n\t\t\t\t[...shell, `i=0; while [ $i -lt ${lines} ]; do echo line-$i; i=$((i+1)); done`],\n\t\t\t\t{\n\t\t\t\t\twindow,\n\t\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\t\tif (info.skipped !== undefined) {\n\t\t\t\t\t\t\tbytes += info.skipped.bytes;\n\t\t\t\t\t\t\tnewlines += info.skipped.newlines;\n\t\t\t\t\t\t\tconst after = encoder.encode(text).length;\n\t\t\t\t\t\t\tconst afterNewlines = text.split(\"\\n\").length - 1;\n\t\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t\tafter > window.maxBytes || afterNewlines > window.maxLines,\n\t\t\t\t\t\t\t\t\"a skip is followed by more than the window\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttail = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbytes += encoder.encode(text).length;\n\t\t\t\t\t\tnewlines += text.split(\"\\n\").length - 1;\n\t\t\t\t\t\ttail += text;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tconst expected = Array.from({ length: lines }, (_, index) => `line-${index}\\n`);\n\t\t\tassert.strictEqual(bytes, expected.join(\"\").length);\n\t\t\tassert.strictEqual(newlines, lines);\n\t\t\tassert.ok(tail.endsWith(expected.slice(-window.maxLines).join(\"\")), \"the delivered output ends with the tail\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec distinguishes timeout from abort\", async (env) => {\n\t\t\tconst timedOut = await env.exec([...shell, \"sleep 2\"], { timeout: 0.1 }, context);\n\t\t\tassert.strictEqual(errorCode(timedOut), \"timeout\");\n\t\t\tconst controller = new AbortController();\n\t\t\tconst running = env.exec([...shell, \"sleep 2\"], undefined, withAbortSignal(controller.signal, context));\n\t\t\tsetTimeout(() => controller.abort(), 100);\n\t\t\tassert.strictEqual(errorCode(await running), \"aborted\");\n\t\t}),\n\t];\n\n\tif (symlinks) {\n\t\tcases.push(\n\t\t\tcreateCase(\"binary reader follows symlinks unless noFollow refuses the final one\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"target.txt\", \"target\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/inner.txt\", \"inner\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s target.txt link.txt && ln -s sub dirlink\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\n\t\t\t\tconst followed = getOrThrow(await env.openBinaryReader(\"link.txt\", undefined, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await followed.read(0, 10, context))), \"target\");\n\t\t\t\tawait followed.close(context);\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\terrorCode(await env.openBinaryReader(\"link.txt\", { noFollow: true }, context)),\n\t\t\t\t\t\"invalid\",\n\t\t\t\t);\n\n\t\t\t\t// Only the final component is refused; earlier symlinked directories still resolve.\n\t\t\t\tconst inner = getOrThrow(await env.openBinaryReader(\"dirlink/inner.txt\", { noFollow: true }, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await inner.read(0, 10, context))), \"inner\");\n\t\t\t\tawait inner.close(context);\n\t\t\t}),\n\n\t\t\twatchCase(\"watch reports changes to the file a watched symbolic link points to\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"one\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"config\", undefined, context));\n\t\t\t\tconst linked = await env.exec([...shell, \"ln -s ../data/real.md config/AGENTS.md\"], undefined, context);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tawait watching(env, [{ path: \"config/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\t\tawait expectChange(\"config/AGENTS.md\", async () => {\n\t\t\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"two!\", context));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn cases;\n}\n"]}
1
+ {"version":3,"file":"env-conformance.js","sourceRoot":"","sources":["../../src/testing/env-conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT, withAbortSignal } from \"@earendil-works/chord/context\";\nimport {\n\ttype ExecutionEnv,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype ListFilesOptions,\n\ttype Result,\n\ttype ShellOutputInfo,\n\ttype WatchChange,\n\ttype WatchTarget,\n} from \"../env/index.ts\";\nimport type { EnvConformanceCase, EnvConformanceOptions } from \"./types.ts\";\n\nconst context = BACKGROUND_CONTEXT;\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\ntype EnvTest = (env: ExecutionEnv) => Promise<void>;\n\nfunction abortedContext(): Context {\n\tconst controller = new AbortController();\n\tcontroller.abort();\n\treturn withAbortSignal(controller.signal, BACKGROUND_CONTEXT);\n}\n\nfunction errorCode(result: Result<unknown, { code: string }>): string | undefined {\n\treturn result.ok ? undefined : result.error.code;\n}\n\nasync function readAll(\n\tenv: ExecutionEnv,\n\tpath: string,\n\tmaxEntries: number,\n): Promise<{ pages: FileInfo[][]; done: boolean }> {\n\tconst reader = getOrThrow(await env.openDirReader(path, context));\n\tconst pages: FileInfo[][] = [];\n\ttry {\n\t\tfor (let page = 0; page < 1000; page++) {\n\t\t\tconst next = getOrThrow(await reader.next(maxEntries, context));\n\t\t\tpages.push(next.entries);\n\t\t\tif (next.done) return { pages, done: true };\n\t\t}\n\t\treturn { pages, done: false };\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/** A listing as `<kind letter> <path>` lines (`f`, `d`, `l`), with its truncation. */\nasync function listed(\n\tenv: ExecutionEnv,\n\tpath: string,\n\toptions?: ListFilesOptions,\n): Promise<{ entries: string[]; truncated: boolean }> {\n\tif (env.listFiles === undefined) throw new Error(\"The environment does not implement listFiles\");\n\tconst listing = getOrThrow(await env.listFiles(path, options, context));\n\tconst letter = { file: \"f\", directory: \"d\", symlink: \"l\" } as const;\n\treturn {\n\t\tentries: listing.entries.map((entry) => `${letter[entry.kind]} ${entry.path}`),\n\t\ttruncated: listing.truncated,\n\t};\n}\n\n/** Whether a change reports `path`: an overflow, or a reported path at or above it. */\nfunction covers(change: WatchChange, path: string): boolean {\n\tif (\"overflow\" in change) return true;\n\tif (!(\"paths\" in change)) return false;\n\treturn change.paths.some(\n\t\t(reported) => path === reported || path.startsWith(`${reported}/`) || path.startsWith(`${reported}\\\\`),\n\t);\n}\n\n/** Watch `targets` while `run` changes files, with a helper that waits for a change reporting a path. */\nasync function watching(\n\tenv: ExecutionEnv,\n\ttargets: readonly WatchTarget[],\n\trun: (helpers: {\n\t\treadonly changes: WatchChange[];\n\t\t/** Wait up to three seconds for a change, after the call, that reports `path`. */\n\t\texpectChange(path: string, change: () => Promise<void>): Promise<void>;\n\t\tabsolute(path: string): Promise<string>;\n\t}) => Promise<void>,\n): Promise<void> {\n\tconst changes: WatchChange[] = [];\n\tconst watcher = getOrThrow(await env.watch(targets, (change) => changes.push(change), context));\n\ttry {\n\t\tconst absolute = async (path: string) => getOrThrow(await env.absolutePath(path, context));\n\t\tawait run({\n\t\t\tchanges,\n\t\t\tabsolute,\n\t\t\tasync expectChange(path, change) {\n\t\t\t\tconst target = await absolute(path);\n\t\t\t\tconst from = changes.length;\n\t\t\t\tawait change();\n\t\t\t\tconst deadline = Date.now() + 3000;\n\t\t\t\twhile (!changes.slice(from).some((entry) => covers(entry, target))) {\n\t\t\t\t\tif (Date.now() > deadline) {\n\t\t\t\t\t\tthrow new Error(`No change reported ${target}; got ${JSON.stringify(changes.slice(from))}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 20));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t} finally {\n\t\tawait watcher.close(context);\n\t}\n}\n\n/**\n * Creates runner-independent cases for an `ExecutionEnv`. `withEnv` must call and await its callback exactly once per\n * case with an environment whose `cwd` is a fresh, empty, writable directory.\n */\nexport function createEnvConformance(options: EnvConformanceOptions): readonly EnvConformanceCase[] {\n\tconst assert = options.assertions;\n\tconst shell = options.shell ?? [\"sh\", \"-c\"];\n\tconst symlinks = options.symlinks ?? true;\n\tconst createCase = (name: string, test: EnvTest, timeoutMs?: number): EnvConformanceCase => ({\n\t\tname,\n\t\t...(timeoutMs === undefined ? {} : { timeoutMs }),\n\t\trun: () => options.withEnv(test),\n\t});\n\t// Watch cases wait up to three seconds per step, longer than test runners allow by default.\n\tconst watchCase = (name: string, test: EnvTest): EnvConformanceCase => createCase(name, test, 30_000);\n\tconst execCollect = async (env: ExecutionEnv, command: string | readonly string[], cwd?: string) => {\n\t\tconst output: Record<ShellOutputInfo[\"stream\"], string> = { stdout: \"\", stderr: \"\" };\n\t\tconst result = await env.exec(\n\t\t\tcommand,\n\t\t\t{\n\t\t\t\t...(cwd === undefined ? {} : { cwd }),\n\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\toutput[info.stream] += text;\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t\treturn { result, ...output };\n\t};\n\n\tconst cases: EnvConformanceCase[] = [\n\t\tcreateCase(\"binary reader reads byte ranges of the opened file\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"data.txt\", \"hello world\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"data.txt\", undefined, context));\n\t\t\tconst info = getOrThrow(await reader.info(context));\n\t\t\tassert.partialDeepEqual(info, { name: \"data.txt\", kind: \"file\", size: 11 });\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 5, context))), \"hello\");\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(6, 100, context))), \"world\");\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(11, 4, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(50, 1, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(3, 0, context)).length, 0);\n\t\t\tassert.strictEqual(errorCode(await reader.read(-1, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1.5, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.info(context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"binary reader scans lines like decoding the whole file\", async (env) => {\n\t\t\t// A byte-order mark, an invalid sequence before a newline, an empty line, a later U+FEFF, and no final newline.\n\t\t\tconst bytes = Uint8Array.from([\n\t\t\t\t0xef, 0xbb, 0xbf, 0x61, 0x0a, 0xe2, 0x82, 0x0a, 0x0a, 0xef, 0xbb, 0xbf, 0x62, 0x0a, 0xc3, 0xa9,\n\t\t\t]);\n\t\t\tgetOrThrow(await env.writeFile(\"lines.txt\", bytes, context));\n\t\t\tconst lines = new TextDecoder().decode(bytes).split(\"\\n\");\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"lines.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tconst ranges: [number, number | undefined][] = [\n\t\t\t\t\t[0, undefined],\n\t\t\t\t\t[0, 1],\n\t\t\t\t\t[1, 3],\n\t\t\t\t\t[2, 3],\n\t\t\t\t\t[3, undefined],\n\t\t\t\t\t[4, 9],\n\t\t\t\t];\n\t\t\t\tfor (const [startLine, endLine] of ranges) {\n\t\t\t\t\tconst scan = getOrThrow(\n\t\t\t\t\t\tawait reader.scanLines({ startLine, ...(endLine === undefined ? {} : { endLine }) }, context),\n\t\t\t\t\t);\n\t\t\t\t\tconst selected = lines.slice(startLine, endLine);\n\t\t\t\t\tconst range = (from: number, to: number) =>\n\t\t\t\t\t\tnew TextDecoder(\"utf-8\", { ignoreBOM: from > 0 }).decode(bytes.subarray(from, to));\n\t\t\t\t\tassert.strictEqual(scan.newlines, lines.length - 1);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.end), selected.join(\"\\n\"));\n\t\t\t\t\tassert.strictEqual(scan.selectedBytes, encoder.encode(selected.join(\"\\n\")).length);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.firstLineEnd), lines[startLine]);\n\t\t\t\t\tassert.strictEqual(scan.firstLineBytes, encoder.encode(lines[startLine]).length);\n\t\t\t\t}\n\t\t\t\tassert.partialDeepEqual(getOrThrow(await reader.scanLines({ startLine: 9 }, context)), {\n\t\t\t\t\tstart: bytes.length,\n\t\t\t\t\tend: bytes.length,\n\t\t\t\t\tselectedBytes: 0,\n\t\t\t\t});\n\t\t\t\tassert.strictEqual(errorCode(await reader.scanLines({ startLine: 2, endLine: 2 }, context)), \"invalid\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader keeps reading the file it opened after a rename\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"one\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"a.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tgetOrThrow(await env.renameFile(\"a.txt\", \"b.txt\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"two\", context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 10, context))), \"one\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader refuses directories, missing files and aborted opens\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"dir\", undefined, context)), \"is_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"missing.txt\", undefined, context)), \"not_found\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"file.txt\", undefined, abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader pages every entry exactly once\", async (env) => {\n\t\t\tconst names = [\"a.txt\", \"b.txt\", \"c.txt\", \"d.txt\", \"e.txt\"];\n\t\t\tfor (const name of names) getOrThrow(await env.writeFile(name, name, context));\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst { pages, done } = await readAll(env, \".\", 2);\n\t\t\tassert.ok(done, \"directory reader reached the end\");\n\t\t\tfor (const page of pages) assert.ok(page.length <= 2, \"page within maxEntries\");\n\t\t\tconst entries = pages.flat();\n\t\t\tassert.deepEqual(entries.map((entry) => entry.name).sort(), [...names, \"sub\"].sort());\n\t\t\tassert.strictEqual(entries.find((entry) => entry.name === \"sub\")?.kind, \"directory\");\n\t\t\tassert.partialDeepEqual(\n\t\t\t\tentries.find((entry) => entry.name === \"a.txt\"),\n\t\t\t\t{ kind: \"file\", size: 5 },\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\"directory reader reports the end and refuses use after close\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"empty\", context));\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.strictEqual(errorCode(await reader.next(0, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader refuses missing paths and files\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\"missing\", context)), \"not_found\");\n\t\t\tconst file = await env.openDirReader(\"file.txt\", context);\n\t\t\tassert.strictEqual(errorCode(file), \"not_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\".\", abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader skips entries removed during enumeration\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.writeFile(`dir/${name}`, name, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"dir\", context));\n\t\t\ttry {\n\t\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.remove(`dir/${name}`, undefined, context));\n\t\t\t\tconst entries: FileInfo[] = [];\n\t\t\t\tfor (let page = 0; page < 10; page++) {\n\t\t\t\t\tconst next = getOrThrow(await reader.next(10, context));\n\t\t\t\t\tentries.push(...next.entries);\n\t\t\t\t\tif (next.done) break;\n\t\t\t\t}\n\t\t\t\tassert.deepEqual(entries, []);\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing file's creation, changes, replacement and removal\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\t// Editors replace a file by renaming a new one over it.\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md.tmp\", \"three\", context));\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"AGENTS.md.tmp\", \"AGENTS.md\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"four\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.remove(\"AGENTS.md\", undefined, context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing target whose ancestors are created\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"a/b/c/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"a/b/c/AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"a/b/c/AGENTS.md\", \"x\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows directories created together with their contents\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\t// Written before any watcher on the new directories can exist.\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/c/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/c/SKILL.md\", \"deeper\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps watching a path whose parent is renamed and recreated\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"proj/.pi/skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"proj/.pi/skills\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"proj/.pi\", \"proj/old\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch skips excluded entries and reports a rename out of them\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tconst targets: WatchTarget[] = [\n\t\t\t\t{ path: \"skills\", recursive: true, exclude: { hidden: true, names: [\"node_modules\"] } },\n\t\t\t];\n\t\t\tawait watching(env, targets, async ({ changes, expectChange, absolute }) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/node_modules/dep/SKILL.md\", \"dep\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/.SKILL.md.tmp\", \"draft\", context));\n\t\t\t\tawait expectChange(\"skills/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/.SKILL.md.tmp\", \"skills/SKILL.md\", context));\n\t\t\t\t});\n\t\t\t\tconst hidden = [await absolute(\"skills/node_modules\"), await absolute(\"skills/.SKILL.md.tmp\")];\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tif (!(\"paths\" in change)) continue;\n\t\t\t\t\tfor (const path of change.paths) {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t!hidden.some((excluded) => path === excluded || path.startsWith(excluded)),\n\t\t\t\t\t\t\t`excluded ${path}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps recursive coverage where a non-recursive target overlaps\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/one.md\", \"one\", context));\n\t\t\tconst targets: WatchTarget[] = [{ path: \"skills\" }, { path: \"skills\", recursive: true }];\n\t\t\tawait watching(env, targets, async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a/two.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/two.md\", \"two\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows a directory replaced at the same path\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/a\", \"skills-old\", context));\n\t\t\t\t\tgetOrThrow(await env.createDir(\"skills/a\", undefined, context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch stops reporting once closed\", async (env) => {\n\t\t\tconst changes: WatchChange[] = [];\n\t\t\tconst watcher = getOrThrow(await env.watch([{ path: \"file.txt\" }], (change) => changes.push(change), context));\n\t\t\tassert.ok(watcher.mode === \"native\" || watcher.mode === \"polling\", \"watcher reports its mode\");\n\t\t\tawait watcher.close(context);\n\t\t\tawait watcher.close(context);\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tassert.deepEqual(changes, []);\n\t\t}),\n\n\t\tcreateCase(\"argv exec passes arguments to the program without shell parsing\", async (env) => {\n\t\t\tconst hostile = \"it's $(touch pwned) `touch pwned` *; touch pwned\";\n\t\t\tconst { result, stdout } = await execCollect(env, [\n\t\t\t\t...shell,\n\t\t\t\t'printf \"%s|%s\" \"$1\" \"$2\"',\n\t\t\t\t\"argv0\",\n\t\t\t\thostile,\n\t\t\t\t\"a b\",\n\t\t\t]);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tassert.strictEqual(stdout, `${hostile}|a b`);\n\t\t\tassert.strictEqual(getOrThrow(await env.exists(\"pwned\", context)), false);\n\t\t}),\n\n\t\tcreateCase(\"exec reports the stream of every chunk in both forms\", async (env) => {\n\t\t\tconst script = \"printf out; printf err >&2; printf more\";\n\t\t\tconst argv = await execCollect(env, [...shell, script]);\n\t\t\tassert.strictEqual(getOrThrow(argv.result).exitCode, 0);\n\t\t\tassert.strictEqual(argv.stdout, \"outmore\");\n\t\t\tassert.strictEqual(argv.stderr, \"err\");\n\t\t\tconst string = await execCollect(env, script);\n\t\t\tassert.strictEqual(getOrThrow(string.result).exitCode, 0);\n\t\t\tassert.strictEqual(string.stdout, \"outmore\");\n\t\t\tassert.strictEqual(string.stderr, \"err\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec honors cwd and exit codes\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst made = await execCollect(env, [...shell, \"printf x > made.txt; exit 3\"], \"sub\");\n\t\t\tassert.strictEqual(getOrThrow(made.result).exitCode, 3);\n\t\t\tassert.strictEqual(getOrThrow(await env.readTextFile(\"sub/made.txt\", context)), \"x\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec reports missing programs and empty argv as spawn errors\", async (env) => {\n\t\t\tassert.strictEqual(\n\t\t\t\terrorCode(await env.exec([\"pi-durable-conformance-missing-program\"], undefined, context)),\n\t\t\t\t\"spawn_error\",\n\t\t\t);\n\t\t\tassert.strictEqual(errorCode(await env.exec([], undefined, context)), \"spawn_error\");\n\t\t}),\n\n\t\tcreateCase(\"windowed exec keeps the exact tail and counts what it skips\", async (env) => {\n\t\t\tconst lines = 2000;\n\t\t\tconst window = { maxBytes: 200, maxLines: 5, minIntervalMs: 0, bytesPerSecond: 1_000_000_000 };\n\t\t\tlet bytes = 0;\n\t\t\tlet newlines = 0;\n\t\t\tlet tail = \"\";\n\t\t\tconst result = await env.exec(\n\t\t\t\t[...shell, `i=0; while [ $i -lt ${lines} ]; do echo line-$i; i=$((i+1)); done`],\n\t\t\t\t{\n\t\t\t\t\twindow,\n\t\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\t\tif (info.skipped !== undefined) {\n\t\t\t\t\t\t\tbytes += info.skipped.bytes;\n\t\t\t\t\t\t\tnewlines += info.skipped.newlines;\n\t\t\t\t\t\t\tconst after = encoder.encode(text).length;\n\t\t\t\t\t\t\tconst afterNewlines = text.split(\"\\n\").length - 1;\n\t\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t\tafter > window.maxBytes || afterNewlines > window.maxLines,\n\t\t\t\t\t\t\t\t\"a skip is followed by more than the window\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttail = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbytes += encoder.encode(text).length;\n\t\t\t\t\t\tnewlines += text.split(\"\\n\").length - 1;\n\t\t\t\t\t\ttail += text;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tconst expected = Array.from({ length: lines }, (_, index) => `line-${index}\\n`);\n\t\t\tassert.strictEqual(bytes, expected.join(\"\").length);\n\t\t\tassert.strictEqual(newlines, lines);\n\t\t\tassert.ok(tail.endsWith(expected.slice(-window.maxLines).join(\"\")), \"the delivered output ends with the tail\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec distinguishes timeout from abort\", async (env) => {\n\t\t\tconst timedOut = await env.exec([...shell, \"sleep 2\"], { timeout: 0.1 }, context);\n\t\t\tassert.strictEqual(errorCode(timedOut), \"timeout\");\n\t\t\tconst controller = new AbortController();\n\t\t\tconst running = env.exec([...shell, \"sleep 2\"], undefined, withAbortSignal(controller.signal, context));\n\t\t\tsetTimeout(() => controller.abort(), 100);\n\t\t\tassert.strictEqual(errorCode(await running), \"aborted\");\n\t\t}),\n\t];\n\n\tif (options.listFiles) {\n\t\tconst writeAll = async (env: ExecutionEnv, files: readonly string[]) => {\n\t\t\tfor (const file of files) getOrThrow(await env.writeFile(file, \"\", context));\n\t\t};\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists files and directories depth first in name order\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"b.txt\", \"a/z.txt\", \"a/b/c.txt\", \".hidden/x\", \"A.txt\"]);\n\t\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\t\tassert.deepEqual(await listed(env, \".\"), {\n\t\t\t\t\tentries: [\n\t\t\t\t\t\t\"d .hidden\",\n\t\t\t\t\t\t\"f .hidden/x\",\n\t\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\t\"d a\",\n\t\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\t\"d empty\",\n\t\t\t\t\t],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { hidden: false })).entries, [\n\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\"d a\",\n\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\"d empty\",\n\t\t\t\t]);\n\t\t\t\tconst expected = { entries: [\"d b\", \"f b/c.txt\", \"f z.txt\"], truncated: false };\n\t\t\t\tassert.deepEqual(await listed(env, \"a\"), expected);\n\t\t\t\tassert.deepEqual(await listed(env, getOrThrow(await env.absolutePath(\"a\", context))), expected);\n\t\t\t\tassert.deepEqual(await listed(env, \"empty\"), { entries: [], truncated: false });\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles skips what git ignores in work trees, .git, and excluded names\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"keep.txt\", \"out/x.js\", \"sub/keep.txt\", \"sub/drop.log\", \"node_modules/m/i.js\"]);\n\t\t\t\tgetOrThrow(await env.writeFile(\".gitignore\", \"out/\\n*.log\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/.gitignore\", \"!keep.txt\\n\", context));\n\t\t\t\t// Not a work tree yet: `.gitignore` files have no effect.\n\t\t\t\tassert.ok((await listed(env, \".\")).entries.includes(\"f out/x.js\"));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/HEAD\", \"ref: refs/heads/main\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/info/exclude\", \"keep.txt\\n\", context));\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { exclude: [\"node_modules\"] })).entries, [\n\t\t\t\t\t\"f .gitignore\",\n\t\t\t\t\t\"d sub\",\n\t\t\t\t\t\"f sub/.gitignore\",\n\t\t\t\t\t\"f sub/keep.txt\",\n\t\t\t\t]);\n\t\t\t\t// A directory inside the work tree applies its parents' rules.\n\t\t\t\tassert.deepEqual((await listed(env, \"sub\")).entries, [\"f .gitignore\", \"f keep.txt\"]);\n\t\t\t\tconst all = (await listed(env, \".\", { gitignore: false })).entries;\n\t\t\t\tassert.ok(\n\t\t\t\t\tall.includes(\"f out/x.js\") && all.includes(\"f node_modules/m/i.js\") && all.includes(\"f keep.txt\"),\n\t\t\t\t);\n\t\t\t\tassert.ok(!all.some((entry) => entry.includes(\".git/\") || entry === \"d .git\"));\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles stops at its bounds and reports truncated\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"a\", \"b\", \"c\"]);\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 2 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 3 }), {\n\t\t\t\t\tentries: [\"f a\", \"f b\", \"f c\"],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\t// Each entry counts its path plus two bytes.\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxBytes: 6 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 0 }), { entries: [], truncated: true });\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { maxEntries: -1 }, context)), \"invalid\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { timeoutMs: 1.5 }, context)), \"invalid\");\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles fails on missing directories, files, and aborts\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"\", context));\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"missing\", undefined, context)), \"not_found\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"file.txt\", undefined, context)), \"not_directory\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", undefined, abortedContext())), \"aborted\");\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks && options.listFiles) {\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists symbolic links without following them\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"dir/inner.txt\", \"\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s dir link && ln -s missing dangling && ln -s .. dir/loop\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tassert.deepEqual((await listed(env, \".\")).entries, [\n\t\t\t\t\t\"l dangling\",\n\t\t\t\t\t\"d dir\",\n\t\t\t\t\t\"f dir/inner.txt\",\n\t\t\t\t\t\"l dir/loop\",\n\t\t\t\t\t\"l link\",\n\t\t\t\t]);\n\t\t\t\t// The listed directory itself may be a link.\n\t\t\t\tassert.deepEqual((await listed(env, \"link\")).entries, [\"f inner.txt\", \"l loop\"]);\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks) {\n\t\tcases.push(\n\t\t\tcreateCase(\"binary reader follows symlinks unless noFollow refuses the final one\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"target.txt\", \"target\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/inner.txt\", \"inner\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s target.txt link.txt && ln -s sub dirlink\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\n\t\t\t\tconst followed = getOrThrow(await env.openBinaryReader(\"link.txt\", undefined, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await followed.read(0, 10, context))), \"target\");\n\t\t\t\tawait followed.close(context);\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\terrorCode(await env.openBinaryReader(\"link.txt\", { noFollow: true }, context)),\n\t\t\t\t\t\"invalid\",\n\t\t\t\t);\n\n\t\t\t\t// Only the final component is refused; earlier symlinked directories still resolve.\n\t\t\t\tconst inner = getOrThrow(await env.openBinaryReader(\"dirlink/inner.txt\", { noFollow: true }, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await inner.read(0, 10, context))), \"inner\");\n\t\t\t\tawait inner.close(context);\n\t\t\t}),\n\n\t\t\twatchCase(\"watch reports changes to the file a watched symbolic link points to\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"one\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"config\", undefined, context));\n\t\t\t\tconst linked = await env.exec([...shell, \"ln -s ../data/real.md config/AGENTS.md\"], undefined, context);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tawait watching(env, [{ path: \"config/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\t\tawait expectChange(\"config/AGENTS.md\", async () => {\n\t\t\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"two!\", context));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn cases;\n}\n"]}
@@ -8,5 +8,5 @@ export interface StorageConformanceRunner {
8
8
  /** Registers the runner-independent cases with a Vitest/Jest-compatible test runner. */
9
9
  export declare function registerStorageConformance(runner: StorageConformanceRunner, name: string, withStorage: StorageConformanceProvider): void;
10
10
  /** Registers the runner-independent `ExecutionEnv` cases with a Vitest/Jest-compatible test runner. */
11
- export declare function registerEnvConformance(runner: StorageConformanceRunner, name: string, withEnv: EnvConformanceProvider, options?: Pick<EnvConformanceOptions, "shell" | "symlinks">): void;
11
+ export declare function registerEnvConformance(runner: StorageConformanceRunner, name: string, withEnv: EnvConformanceProvider, options?: Pick<EnvConformanceOptions, "shell" | "symlinks" | "listFiles">): void;
12
12
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE5G,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACtF;AAED,wFAAwF;AACxF,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,0BAA0B,GACrC,IAAI,CAQN;AAED,uGAAuG;AACvG,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,EAC/B,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,UAAU,CAAM,GAC7D,IAAI,CAKN"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE5G,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACtF;AAED,wFAAwF;AACxF,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,0BAA0B,GACrC,IAAI,CAQN;AAED,uGAAuG;AACvG,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,EAC/B,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAM,GAC3E,IAAI,CAKN"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAmB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AASpE,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CACzC,MAAgC,EAChC,IAAY,EACZ,WAAuC;IAEvC,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACtC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC;QACjD,WAAW;KACX,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1B,KAAK,MAAM,QAAQ,IAAI,KAAK;YAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CACrC,MAAgC,EAChC,IAAY,EACZ,OAA+B,EAC/B,OAAO,GAAsD,EAAE;IAE/D,MAAM,KAAK,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/G,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1B,KAAK,MAAM,QAAQ,IAAI,KAAK;YAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { createExpectAssertions, type ExpectLike } from \"./assertions.ts\";\nimport { createEnvConformance } from \"./env-conformance.ts\";\nimport { createStorageConformance } from \"./storage-conformance.ts\";\nimport type { EnvConformanceOptions, EnvConformanceProvider, StorageConformanceProvider } from \"./types.ts\";\n\nexport interface StorageConformanceRunner {\n\treadonly describe: (name: string, suite: () => void) => unknown;\n\treadonly expect: ExpectLike;\n\treadonly it: (name: string, test: () => Promise<void>, timeoutMs?: number) => unknown;\n}\n\n/** Registers the runner-independent cases with a Vitest/Jest-compatible test runner. */\nexport function registerStorageConformance(\n\trunner: StorageConformanceRunner,\n\tname: string,\n\twithStorage: StorageConformanceProvider,\n): void {\n\tconst cases = createStorageConformance({\n\t\tassertions: createExpectAssertions(runner.expect),\n\t\twithStorage,\n\t});\n\trunner.describe(name, () => {\n\t\tfor (const testCase of cases) runner.it(testCase.name, testCase.run);\n\t});\n}\n\n/** Registers the runner-independent `ExecutionEnv` cases with a Vitest/Jest-compatible test runner. */\nexport function registerEnvConformance(\n\trunner: StorageConformanceRunner,\n\tname: string,\n\twithEnv: EnvConformanceProvider,\n\toptions: Pick<EnvConformanceOptions, \"shell\" | \"symlinks\"> = {},\n): void {\n\tconst cases = createEnvConformance({ ...options, assertions: createExpectAssertions(runner.expect), withEnv });\n\trunner.describe(name, () => {\n\t\tfor (const testCase of cases) runner.it(testCase.name, testCase.run, testCase.timeoutMs);\n\t});\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAmB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AASpE,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CACzC,MAAgC,EAChC,IAAY,EACZ,WAAuC;IAEvC,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACtC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC;QACjD,WAAW;KACX,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1B,KAAK,MAAM,QAAQ,IAAI,KAAK;YAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CACrC,MAAgC,EAChC,IAAY,EACZ,OAA+B,EAC/B,OAAO,GAAoE,EAAE;IAE7E,MAAM,KAAK,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/G,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QAC1B,KAAK,MAAM,QAAQ,IAAI,KAAK;YAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { createExpectAssertions, type ExpectLike } from \"./assertions.ts\";\nimport { createEnvConformance } from \"./env-conformance.ts\";\nimport { createStorageConformance } from \"./storage-conformance.ts\";\nimport type { EnvConformanceOptions, EnvConformanceProvider, StorageConformanceProvider } from \"./types.ts\";\n\nexport interface StorageConformanceRunner {\n\treadonly describe: (name: string, suite: () => void) => unknown;\n\treadonly expect: ExpectLike;\n\treadonly it: (name: string, test: () => Promise<void>, timeoutMs?: number) => unknown;\n}\n\n/** Registers the runner-independent cases with a Vitest/Jest-compatible test runner. */\nexport function registerStorageConformance(\n\trunner: StorageConformanceRunner,\n\tname: string,\n\twithStorage: StorageConformanceProvider,\n): void {\n\tconst cases = createStorageConformance({\n\t\tassertions: createExpectAssertions(runner.expect),\n\t\twithStorage,\n\t});\n\trunner.describe(name, () => {\n\t\tfor (const testCase of cases) runner.it(testCase.name, testCase.run);\n\t});\n}\n\n/** Registers the runner-independent `ExecutionEnv` cases with a Vitest/Jest-compatible test runner. */\nexport function registerEnvConformance(\n\trunner: StorageConformanceRunner,\n\tname: string,\n\twithEnv: EnvConformanceProvider,\n\toptions: Pick<EnvConformanceOptions, \"shell\" | \"symlinks\" | \"listFiles\"> = {},\n): void {\n\tconst cases = createEnvConformance({ ...options, assertions: createExpectAssertions(runner.expect), withEnv });\n\trunner.describe(name, () => {\n\t\tfor (const testCase of cases) runner.it(testCase.name, testCase.run, testCase.timeoutMs);\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"storage-conformance.d.ts","sourceRoot":"","sources":["../../src/testing/storage-conformance.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAgC,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAsElH,8GAA8G;AAC9G,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,SAAS,sBAAsB,EAAE,CA+hD9G"}
1
+ {"version":3,"file":"storage-conformance.d.ts","sourceRoot":"","sources":["../../src/testing/storage-conformance.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAgC,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAsElH,8GAA8G;AAC9G,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,SAAS,sBAAsB,EAAE,CAgiD9G"}
@@ -891,7 +891,8 @@ export function createStorageConformance(options) {
891
891
  catch (error) {
892
892
  conflictError = error;
893
893
  }
894
- expect(conflictError?.name).toBe("StorageRejected");
894
+ // Rejected without effect: the copy and the retirement in the same batch are both absent.
895
+ expect(conflictError instanceof Error).toBe(true);
895
896
  expect(await storage.document(conflictId, "current", context)).toBeUndefined();
896
897
  expect((await storage.document(currentCopyId, "current", context))?.value).toEqual({
897
898
  count: 2,
@@ -911,7 +912,7 @@ export function createStorageConformance(options) {
911
912
  catch (error) {
912
913
  mismatchError = error;
913
914
  }
914
- expect(mismatchError?.name).toBe("StorageRejected");
915
+ expect(mismatchError instanceof Error).toBe(true);
915
916
  expect(await storage.document(mismatchId, "current", context)).toBeUndefined();
916
917
  }),
917
918
  createCase(options, "uses bases for version transitions and rejects historical reads of current-only documents", async (storage) => {