@earendil-works/pi-durable 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +17 -4
- package/dist/codemode/codemode.d.ts +2 -1
- package/dist/codemode/codemode.d.ts.map +1 -1
- package/dist/codemode/codemode.js +1 -37
- package/dist/codemode/codemode.js.map +1 -1
- package/dist/codemode/models.d.ts +2 -1
- package/dist/codemode/models.d.ts.map +1 -1
- package/dist/codemode/models.js.map +1 -1
- package/dist/documents.d.ts +1 -1
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -1
- package/dist/documents.js.map +1 -1
- package/dist/entries.d.ts +1 -1
- package/dist/entries.d.ts.map +1 -1
- package/dist/entries.js.map +1 -1
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/env/node-watch.d.ts +1 -1
- package/dist/env/node-watch.d.ts.map +1 -1
- package/dist/env/node-watch.js.map +1 -1
- package/dist/env/node.d.ts +1 -1
- package/dist/env/node.d.ts.map +1 -1
- package/dist/env/node.js.map +1 -1
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +27 -1
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +8 -3
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +21 -9
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +1 -1
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/define.d.ts +1 -1
- package/dist/harness/define.d.ts.map +1 -1
- package/dist/harness/define.js.map +1 -1
- package/dist/harness/generation.d.ts +1 -1
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +6 -4
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +1 -1
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +2 -1
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +1 -1
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/json.d.ts +1 -1
- package/dist/harness/json.d.ts.map +1 -1
- package/dist/harness/json.js.map +1 -1
- package/dist/harness/live.d.ts +2 -1
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/partial-changes.d.ts +1 -1
- package/dist/harness/partial-changes.d.ts.map +1 -1
- package/dist/harness/partial-changes.js +1 -0
- package/dist/harness/partial-changes.js.map +1 -1
- package/dist/harness/prompt.d.ts +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/provider.d.ts +1 -1
- package/dist/harness/provider.d.ts.map +1 -1
- package/dist/harness/provider.js.map +1 -1
- package/dist/harness/registry-reader.d.ts +1 -1
- package/dist/harness/registry-reader.d.ts.map +1 -1
- package/dist/harness/registry-reader.js.map +1 -1
- package/dist/harness/scheduler.d.ts +2 -1
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +42 -13
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +1 -1
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +1 -1
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +3 -1
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +1 -1
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/tool.d.ts +1 -1
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +1 -1
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/transcript.d.ts +1 -1
- package/dist/harness/transcript.d.ts.map +1 -1
- package/dist/harness/transcript.js.map +1 -1
- package/dist/harness/types.d.ts +21 -4
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +2 -1
- package/dist/harness/usage.d.ts.map +1 -1
- package/dist/harness/usage.js +1 -1
- package/dist/harness/usage.js.map +1 -1
- package/dist/harness/util.d.ts +1 -1
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +2 -1
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +1 -1
- package/dist/harness/view.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/session/cached-storage.d.ts +2 -1
- package/dist/session/cached-storage.d.ts.map +1 -1
- package/dist/session/cached-storage.js.map +1 -1
- package/dist/session/forks.d.ts +1 -1
- package/dist/session/forks.d.ts.map +1 -1
- package/dist/session/forks.js.map +1 -1
- package/dist/session/keys.d.ts +2 -1
- package/dist/session/keys.d.ts.map +1 -1
- package/dist/session/keys.js.map +1 -1
- package/dist/session/session.d.ts +3 -1
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +1 -1
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts +4 -3
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +3 -3
- package/dist/session/transaction.js.map +1 -1
- package/dist/session/writer.d.ts +1 -1
- package/dist/session/writer.d.ts.map +1 -1
- package/dist/session/writer.js.map +1 -1
- package/dist/storage/indexeddb.d.ts +2 -1
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/indexeddb.js.map +1 -1
- package/dist/storage/jsonl/index.d.ts +1 -1
- package/dist/storage/jsonl/index.d.ts.map +1 -1
- package/dist/storage/jsonl/index.js +1 -1
- package/dist/storage/jsonl/index.js.map +1 -1
- package/dist/storage/jsonl/node.d.ts +3 -3
- package/dist/storage/jsonl/node.d.ts.map +1 -1
- package/dist/storage/jsonl/node.js +2 -2
- package/dist/storage/jsonl/node.js.map +1 -1
- package/dist/storage/jsonl/storage.d.ts +32 -3
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +70 -19
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts +2 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite/commit.d.ts +52 -0
- package/dist/storage/sqlite/commit.d.ts.map +1 -0
- package/dist/storage/sqlite/commit.js +371 -0
- package/dist/storage/sqlite/commit.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +33 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +53 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/statements.d.ts +13 -0
- package/dist/storage/sqlite/statements.d.ts.map +1 -0
- package/dist/storage/sqlite/statements.js +88 -0
- package/dist/storage/sqlite/statements.js.map +1 -0
- package/dist/storage/sqlite/storage.d.ts +12 -11
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +44 -259
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/storage/store/commit.d.ts +2 -2
- package/dist/storage/store/commit.d.ts.map +1 -1
- package/dist/storage/store/commit.js +1 -1
- package/dist/storage/store/commit.js.map +1 -1
- package/dist/storage/store/documents.d.ts +1 -1
- package/dist/storage/store/documents.d.ts.map +1 -1
- package/dist/storage/store/documents.js +1 -1
- package/dist/storage/store/documents.js.map +1 -1
- package/dist/storage/store/queries.d.ts +2 -2
- package/dist/storage/store/queries.d.ts.map +1 -1
- package/dist/storage/store/queries.js.map +1 -1
- package/dist/storage/store/storage.d.ts +3 -2
- package/dist/storage/store/storage.d.ts.map +1 -1
- package/dist/storage/store/storage.js +1 -1
- package/dist/storage/store/storage.js.map +1 -1
- package/dist/storage/store/tables.d.ts +31 -31
- package/dist/storage/store/tables.d.ts.map +1 -1
- package/dist/storage/store/tables.js +1 -1
- package/dist/storage/store/tables.js.map +1 -1
- package/dist/testing/commit-writes.d.ts +1 -1
- package/dist/testing/commit-writes.d.ts.map +1 -1
- package/dist/testing/commit-writes.js.map +1 -1
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/storage-benchmark.js.map +1 -1
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/tool-search/tool-search.d.ts +2 -2
- package/dist/tool-search/tool-search.d.ts.map +1 -1
- package/dist/tool-search/tool-search.js +18 -6
- package/dist/tool-search/tool-search.js.map +1 -1
- package/dist/tools/bash.d.ts +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/file-mutation-queue.d.ts +1 -1
- package/dist/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/tools/file-mutation-queue.js.map +1 -1
- package/dist/tools/path-utils.d.ts +1 -1
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/read.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
|
@@ -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 FileChange,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype ListFilesOptions,\n\ttype Result,\n\ttype ShellOutputInfo,\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: FileChange, path: string): boolean {\n\tif (change.kind === \"overflow\") return true;\n\tif (change.kind !== \"paths\") 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: FileChange[];\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: FileChange[] = [];\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.stop(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 (change.kind !== \"paths\") 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 stopped\", async (env) => {\n\t\t\tconst changes: FileChange[] = [];\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.stop(context);\n\t\t\tawait watcher.stop(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"]}
|
|
1
|
+
{"version":3,"file":"env-conformance.js","sourceRoot":"","sources":["../../src/testing/env-conformance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAIN,UAAU,GAKV,MAAM,iBAAiB,CAAC;AAGzB,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAIlC,SAAS,cAAc;IACtB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,MAAyC;IAC3D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,OAAO,CACrB,GAAiB,EACjB,IAAY,EACZ,UAAkB;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,CAAC;QACJ,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,sFAAsF;AACtF,KAAK,UAAU,MAAM,CACpB,GAAiB,EACjB,IAAY,EACZ,OAA0B;IAE1B,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAW,CAAC;IACpE,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9E,SAAS,EAAE,OAAO,CAAC,SAAS;KAC5B,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,MAAM,CAAC,MAAkB,EAAE,IAAY;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CACvB,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC,CACtG,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,KAAK,UAAU,QAAQ,CACtB,GAAiB,EACjB,OAA+B,EAC/B,GAKmB;IAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,GAAG,CAAC;YACT,OAAO;YACP,QAAQ;YACR,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM;gBAC9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC5B,MAAM,MAAM,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBACnC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;oBACpE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;wBAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7F,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAa,EAAE,SAAkB,EAAsB,EAAE,CAAC,CAAC;QAC5F,IAAI;QACJ,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;KAChC,CAAC,CAAC;IACH,4FAA4F;IAC5F,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAa,EAAsB,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtG,MAAM,WAAW,GAAG,KAAK,EAAE,GAAiB,EAAE,OAAmC,EAAE,GAAY,EAAE,EAAE;QAClG,MAAM,MAAM,GAA8C,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,OAAO,EACP;YACC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;YAC7B,CAAC;SACD,EACD,OAAO,CACP,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAyB;QACnC,UAAU,CAAC,oDAAoD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5F,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACpF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC,CAAC;QAEF,UAAU,CAAC,wDAAwD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAClF,gHAAgH;YAChH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;gBAC7B,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;aAC9F,CAAC,CAAC;YACH,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACvF,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAmC;oBAC9C,CAAC,CAAC,EAAE,SAAS,CAAC;oBACd,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,SAAS,CAAC;oBACd,CAAC,CAAC,EAAE,CAAC,CAAC;iBACN,CAAC;gBACF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG,UAAU,CACtB,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAC7F,CAAC;oBACF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAC1C,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBACpF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACpD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACnF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC3E,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE;oBACtF,KAAK,EAAE,KAAK,CAAC,MAAM;oBACnB,GAAG,EAAE,KAAK,CAAC,MAAM;oBACjB,aAAa,EAAE,CAAC;iBAChB,CAAC,CAAC;gBACH,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzG,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,UAAU,CAAC,+DAA+D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACnF,IAAI,CAAC;gBACJ,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC5D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1F,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,UAAU,CAAC,oEAAoE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACrG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC1G,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/G,CAAC,CAAC;QAEF,UAAU,CAAC,iDAAiD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3E,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5D,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACrF,MAAM,CAAC,gBAAgB,CACtB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CACzB,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,CAAC,8DAA8D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,UAAU,CAAC,kDAAkD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACxF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1F,CAAC,CAAC;QAEF,UAAU,CAAC,2DAA2D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClG,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC;gBACJ,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;oBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpG,MAAM,OAAO,GAAe,EAAE,CAAC;gBAC/B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,IAAI;wBAAE,MAAM;gBACtB,CAAC;gBACD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,SAAS,CAAC,2EAA2E,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACvE,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,wDAAwD;gBACxD,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;oBACnE,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,4DAA4D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC7E,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,gEAAgE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACrF,+DAA+D;gBAC/D,MAAM,YAAY,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBACpD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBACpD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;oBACtD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,mEAAmE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YACtE,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC9F,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;oBACrD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;oBACrD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,+DAA+D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAkB;gBAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;aACvF,CAAC;YACF,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC1E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1E,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtF,CAAC,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC/F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;wBAAE,SAAS;oBACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjC,MAAM,CAAC,EAAE,CACR,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC1E,YAAY,IAAI,EAAE,CAClB,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,sEAAsE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACvD,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,qDAAqD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACrF,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;oBACzC,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;oBACpE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;oBAC9C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;oBAC9C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,oCAAoC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/G,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAC/F,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,UAAU,CAAC,iEAAiE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3F,MAAM,OAAO,GAAG,kDAAkD,CAAC;YACnE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;gBACjD,GAAG,KAAK;gBACR,0BAA0B;gBAC1B,OAAO;gBACP,OAAO;gBACP,KAAK;aACL,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,UAAU,CAAC,sDAAsD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChF,MAAM,MAAM,GAAG,yCAAyC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEF,UAAU,CAAC,qCAAqC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,6BAA6B,CAAC,EAAE,KAAK,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtF,CAAC,CAAC;QAEF,UAAU,CAAC,mEAAmE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7F,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,wCAAwC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EACzF,aAAa,CACb,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACtF,CAAC,CAAC;QAEF,UAAU,CAAC,6DAA6D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACvF,MAAM,KAAK,GAAG,IAAI,CAAC;YACnB,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;YAC/F,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,uBAAuB,KAAK,uCAAuC,CAAC,EAC/E;gBACC,MAAM;gBACN,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;oBAClC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAChC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC5B,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAClC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;wBAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;wBAClD,MAAM,CAAC,EAAE,CACR,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,EAC1D,4CAA4C,CAC5C,CAAC;wBACF,IAAI,GAAG,EAAE,CAAC;oBACX,CAAC;oBACD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;oBACrC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxC,IAAI,IAAI,IAAI,CAAC;gBACd,CAAC;aACD,EACD,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAChF,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,yCAAyC,CAAC,CAAC;QAChH,CAAC,CAAC;QAEF,UAAU,CAAC,4CAA4C,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAClF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YACxG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC,CAAC;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAiB,EAAE,KAAwB,EAAE,EAAE;YACtE,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC;QACF,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,iEAAiE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3F,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBACxC,OAAO,EAAE;oBACR,WAAW;oBACX,aAAa;oBACb,SAAS;oBACT,KAAK;oBACL,OAAO;oBACP,aAAa;oBACb,WAAW;oBACX,SAAS;oBACT,SAAS;iBACT;gBACD,SAAS,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;gBACrE,SAAS;gBACT,KAAK;gBACL,OAAO;gBACP,aAAa;gBACb,WAAW;gBACX,SAAS;gBACT,SAAS;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAChF,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAChG,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,EAEF,UAAU,CAAC,0EAA0E,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;YACrG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YACxE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1E,0DAA0D;YAC1D,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;YACnE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC,CAAC;YAChF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;gBACjF,cAAc;gBACd,OAAO;gBACP,kBAAkB;gBAClB,gBAAgB;aAChB,CAAC,CAAC;YACH,+DAA+D;YAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;YACrF,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,MAAM,CAAC,EAAE,CACR,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CACjG,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,EAEF,UAAU,CAAC,qDAAqD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/E,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1G,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;gBAC9B,SAAS,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,6CAA6C;YAC7C,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxG,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9F,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClG,CAAC,CAAC,EAEF,UAAU,CAAC,2DAA2D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAChG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACrG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClG,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,uDAAuD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,+DAA+D,CAAC,EAC3E,SAAS,EACT,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE;gBAClD,YAAY;gBACZ,OAAO;gBACP,iBAAiB;gBACjB,YAAY;gBACZ,QAAQ;aACR,CAAC,CAAC;YACH,6CAA6C;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,sEAAsE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,gDAAgD,CAAC,EAC5D,SAAS,EACT,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC9F,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,EAC9E,SAAS,CACT,CAAC;YAEF,oFAAoF;YACpF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACvG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC,EAEF,SAAS,CAAC,qEAAqE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAChE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,wCAAwC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACxG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC9E,MAAM,YAAY,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;oBACjD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord/context\";\nimport { BACKGROUND_CONTEXT, withAbortSignal } from \"@earendil-works/chord/context\";\nimport {\n\ttype ExecutionEnv,\n\ttype FileChange,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype ListFilesOptions,\n\ttype Result,\n\ttype ShellOutputInfo,\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: FileChange, path: string): boolean {\n\tif (change.kind === \"overflow\") return true;\n\tif (change.kind !== \"paths\") 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: FileChange[];\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: FileChange[] = [];\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.stop(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 (change.kind !== \"paths\") 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 stopped\", async (env) => {\n\t\t\tconst changes: FileChange[] = [];\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.stop(context);\n\t\t\tawait watcher.stop(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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-benchmark.js","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type {\n\tConversationId,\n\tDocumentCreate,\n\tDocumentId,\n\tEntryId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { commitWrites } from \"./commit-writes.ts\";\n\nexport type StorageBenchmarkScale = {\n\treadonly name: string;\n\treadonly entryCount: number;\n\treadonly taskCount: number;\n\treadonly documentCount: number;\n};\n\nexport const STORAGE_MEMORY_SCALES: readonly StorageBenchmarkScale[] = [\n\t{ name: \"1k\", entryCount: 1_000, taskCount: 200, documentCount: 200 },\n\t{ name: \"10k\", entryCount: 10_000, taskCount: 2_000, documentCount: 2_000 },\n];\n\nexport const TIMING_SCALE: StorageBenchmarkScale = {\n\tname: \"timing\",\n\tentryCount: 1_000,\n\ttaskCount: 300,\n\tdocumentCount: 300,\n};\n\nconst REPLAY_TAILS = [0, 16, 128, 1_024] as const;\nconst HISTORY_SEGMENT_LENGTH = 128;\nconst FORK_DEPTH = 8;\nconst ENTRIES_PER_FORK = 32;\nconst BATCH_SIZE = 100;\n\nexport function storageBenchmarkPrimaryRecordCount(scale: StorageBenchmarkScale): number {\n\treturn (\n\t\t1 +\n\t\tscale.entryCount +\n\t\tscale.taskCount +\n\t\tscale.documentCount +\n\t\tREPLAY_TAILS.length +\n\t\t1 +\n\t\tFORK_DEPTH * (1 + ENTRIES_PER_FORK)\n\t);\n}\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\nexport type StorageBenchmarkDataset = {\n\treadonly firstEntryId: EntryId;\n\treadonly filteredTaskCount: number;\n\treadonly exactDocumentId: DocumentId;\n\treadonly exactDocumentKey: string;\n\treadonly replayDocumentIds: Readonly<Record<(typeof REPLAY_TAILS)[number], DocumentId>>;\n\treadonly historicalDocumentId: DocumentId;\n\treadonly ancientAt: Seq;\n\treadonly recentAt: Seq;\n\treadonly deepestConversationId: ConversationId;\n\treadonly ancestorHeadEntryId: EntryId;\n};\n\nfunction task(id: TaskId<JsonValue>, index: number): StoredTask {\n\tconst statuses = [\"pending\", \"running\", \"terminal\"] as const;\n\tconst status = statuses[index % statuses.length];\n\tconst common = {\n\t\tid,\n\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\tkind: index % 4 === 0 ? \"benchmark.filtered\" : \"benchmark.other\",\n\t\tversion: 1,\n\t\tinput: { index },\n\t\tbackground: index % 5 === 0,\n\t\tabortRequested: index % 7 === 0,\n\t};\n\tif (status === \"terminal\") {\n\t\treturn { ...common, state: { status, outcome: { status: \"completed\", result: { index } } } };\n\t}\n\treturn { ...common, state: { status, checkpoint: { index, payload: \"x\".repeat(64) } } };\n}\n\n/** Seed deterministic representative data through only the public `Storage` contract. */\nexport async function seedStorageBenchmark(\n\tstorage: Storage,\n\tscale: StorageBenchmarkScale = TIMING_SCALE,\n): Promise<StorageBenchmarkDataset> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\n\tlet firstEntryId: EntryId | undefined;\n\tfor (let start = 0; start < scale.entryCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.entryCount); index++) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tif (index === 0) firstEntryId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"entry\",\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.entry\",\n\t\t\t\t\t...(index === 0 ? { head: id } : {}),\n\t\t\t\t\tdata: { index, text: `entry-${index}-${\"x\".repeat(96)}` },\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tfor (let start = 0; start < scale.taskCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.taskCount); index++) {\n\t\t\twrites.push({ type: \"task\", value: task(await storage.mintId<TaskId<JsonValue>>(), index) });\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tlet exactDocumentId: DocumentId | undefined;\n\tfor (let start = 0; start < scale.documentCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.documentCount); index++) {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\texactDocumentId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: { id, kind: \"benchmark.family\", key: `key-${index}`, scope: { kind: \"session\" } },\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { index, text: \"x\".repeat(128) } },\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tconst replayEntries = await Promise.all(\n\t\tREPLAY_TAILS.map(async (tail) => {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\treturn { tail, id };\n\t\t}),\n\t);\n\tawait commitWrites(\n\t\tstorage,\n\t\treplayEntries.map(({ tail, id }) => ({\n\t\t\ttype: \"document.create\" as const,\n\t\t\trecord: {\n\t\t\t\tid,\n\t\t\t\tkind: \"benchmark.replay\",\n\t\t\t\tkey: String(tail),\n\t\t\t\tscope: { kind: \"conversation\" as const, conversationId: ROOT_CONVERSATION_ID },\n\t\t\t\thistory: \"rewindable\" as const,\n\t\t\t\tfork: \"asOf\" as const,\n\t\t\t},\n\t\t\tcontent: { kind: \"base\" as const, version: 1, value: { count: 0, text: \"x\".repeat(64) } },\n\t\t})),\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tfor (let count = 1; count <= REPLAY_TAILS.at(-1)!; count++) {\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\treplayEntries\n\t\t\t\t.filter(({ tail }) => count <= tail)\n\t\t\t\t.map(({ id }) => ({\n\t\t\t\t\ttype: \"document.change\" as const,\n\t\t\t\t\tid,\n\t\t\t\t\tcontent: { kind: \"delta\" as const, version: 1, ops: [[\"s\", [\"count\"], count] as const] },\n\t\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tconst historicalDocumentId = await storage.mintId<DocumentId>();\n\tconst historicalRecord = {\n\t\tid: historicalDocumentId,\n\t\tkind: \"benchmark.history\",\n\t\tscope: { kind: \"conversation\", conversationId: ROOT_CONVERSATION_ID },\n\t\thistory: \"rewindable\",\n\t\tfork: \"asOf\",\n\t} satisfies DocumentCreate;\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: historicalRecord,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: 0 } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tlet ancientAt: Seq | undefined;\n\tfor (let count = 1; count <= HISTORY_SEGMENT_LENGTH; count++) {\n\t\tancientAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.change\",\n\t\t\t\tid: historicalDocumentId,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: HISTORY_SEGMENT_LENGTH } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tif (ancientAt === undefined) throw new Error(\"Benchmark history seed produced no commits\");\n\tlet recentAt = ancientAt;\n\tfor (let count = HISTORY_SEGMENT_LENGTH + 1; count <= HISTORY_SEGMENT_LENGTH * 2; count++) {\n\t\trecentAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tif (firstEntryId === undefined) throw new Error(\"Benchmark scale must create entries\");\n\tlet parentConversationId = ROOT_CONVERSATION_ID;\n\tlet parentAt = firstEntryId;\n\tlet deepestConversationId = ROOT_CONVERSATION_ID;\n\tfor (let depth = 0; depth < FORK_DEPTH; depth++) {\n\t\tconst conversationId = await storage.mintId<ConversationId>();\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\tvalue: { id: conversationId, parent: { conversationId: parentConversationId, at: parentAt } },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tconst ids = await Promise.all(Array.from({ length: ENTRIES_PER_FORK }, () => storage.mintId<EntryId>()));\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\tids.map((id, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: \"benchmark.fork\",\n\t\t\t\t\tdata: { depth, index },\n\t\t\t\t},\n\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tparentConversationId = conversationId;\n\t\tparentAt = ids.at(-1)!;\n\t\tdeepestConversationId = conversationId;\n\t}\n\n\tif (exactDocumentId === undefined) throw new Error(\"Benchmark scale must create documents\");\n\treturn {\n\t\tfirstEntryId,\n\t\tfilteredTaskCount: Math.min(50, Math.ceil(scale.taskCount / 60)),\n\t\texactDocumentId,\n\t\texactDocumentKey: `key-${scale.documentCount - 1}`,\n\t\treplayDocumentIds: Object.fromEntries(replayEntries.map(({ tail, id }) => [tail, id])) as Record<\n\t\t\t(typeof REPLAY_TAILS)[number],\n\t\t\tDocumentId\n\t\t>,\n\t\thistoricalDocumentId,\n\t\tancientAt,\n\t\trecentAt,\n\t\tdeepestConversationId,\n\t\tancestorHeadEntryId: firstEntryId,\n\t};\n}\n\nexport type StorageReadBenchmark = {\n\treadonly name: string;\n\trun(storage: Storage, dataset: StorageBenchmarkDataset): Promise<number>;\n\texpected(dataset: StorageBenchmarkDataset): number;\n};\n\nexport const STORAGE_READ_BENCHMARKS: readonly StorageReadBenchmark[] = [\n\t{\n\t\tname: \"exact entry lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.entry(dataset.firstEntryId, BACKGROUND_CONTEXT))?.entry.id ?? -1;\n\t\t},\n\t\texpected: ({ firstEntryId }) => firstEntryId,\n\t},\n\t{\n\t\tname: \"entry page scan (100)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries({ conversationId: ROOT_CONVERSATION_ID }, 100, undefined, BACKGROUND_CONTEXT)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"filtered task scan (50)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanTasks(\n\t\t\t\t\t{ kind: \"benchmark.filtered\", status: \"pending\", background: true },\n\t\t\t\t\t50,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: ({ filteredTaskCount }) => filteredTaskCount,\n\t},\n\t{\n\t\tname: \"exact document address among many\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"benchmark.family\", key: dataset.exactDocumentKey, scope: { kind: \"session\" } },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t)\n\t\t\t\t)?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ exactDocumentId }) => exactDocumentId,\n\t},\n\t...REPLAY_TAILS.map(\n\t\t(tail): StorageReadBenchmark => ({\n\t\t\tname: `document replay tail (${tail})`,\n\t\t\tasync run(storage, dataset) {\n\t\t\t\treturn Number(\n\t\t\t\t\t(await storage.document(dataset.replayDocumentIds[tail], \"current\", BACKGROUND_CONTEXT))?.value.count,\n\t\t\t\t);\n\t\t\t},\n\t\t\texpected: () => tail,\n\t\t}),\n\t),\n\t{\n\t\tname: \"ancient historical read before newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.ancientAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH,\n\t},\n\t{\n\t\tname: \"recent historical read after newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.recentAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH * 2,\n\t},\n\t{\n\t\tname: \"fork-depth history scan (100)\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t{ conversationId: dataset.deepestConversationId },\n\t\t\t\t\t100,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"fork-depth head lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(await storage.findLatestHeadMarker(dataset.deepestConversationId, undefined, BACKGROUND_CONTEXT))?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ ancestorHeadEntryId }) => ancestorHeadEntryId,\n\t},\n];\n\nexport type StorageWriteBenchmark = {\n\treadonly name: string;\n\treadonly expected: number;\n\trun(storage: Storage): Promise<number>;\n};\n\n/** Seed the common state expected by every write benchmark sample. */\nexport async function seedStorageWriteBenchmark(storage: Storage): Promise<void> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\tawait commitWrites(\n\t\tstorage,\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: 100 }, async (_, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.baseline\",\n\t\t\t\t\tdata: { index },\n\t\t\t\t},\n\t\t\t})),\n\t\t),\n\t\tBACKGROUND_CONTEXT,\n\t);\n}\n\nexport const STORAGE_WRITE_BENCHMARKS: readonly StorageWriteBenchmark[] = [\n\t{\n\t\tname: \"commit one entry\",\n\t\texpected: 1,\n\t\tasync run(storage) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tawait commitWrites(\n\t\t\t\tstorage,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\treturn 1;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit 100 entries\",\n\t\texpected: 100,\n\t\tasync run(storage) {\n\t\t\tconst writes = await Promise.all(\n\t\t\t\tArray.from(\n\t\t\t\t\t{ length: 100 },\n\t\t\t\t\tasync (_, index): Promise<StorageWrite> => ({\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { index, text: \"x\".repeat(128) },\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\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit mixed entry/task/submission/document\",\n\t\texpected: 4,\n\t\tasync run(storage) {\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst documentId = await storage.mintId<DocumentId>();\n\t\t\tconst writes: readonly StorageWrite[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\tvalue: { id: entryId, conversationId: ROOT_CONVERSATION_ID, kind: \"benchmark.mixed\" },\n\t\t\t\t},\n\t\t\t\t{ type: \"task\", value: task(taskId, taskId) },\n\t\t\t\t{\n\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tid: submissionId,\n\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\trequestId: `benchmark-${submissionId}`,\n\t\t\t\t\t\ttype: \"write\",\n\t\t\t\t\t\tstatus: \"done\",\n\t\t\t\t\t\tentry: entryId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\trecord: { id: documentId, kind: \"benchmark.mixed\", key: String(documentId), scope: { kind: \"session\" } },\n\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { entryId, taskId } },\n\t\t\t\t},\n\t\t\t];\n\t\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n];\n"]}
|
|
1
|
+
{"version":3,"file":"storage-benchmark.js","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type { JsonValue } from \"@earendil-works/chord/json\";\nimport type {\n\tConversationId,\n\tDocumentCreate,\n\tDocumentId,\n\tEntryId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { commitWrites } from \"./commit-writes.ts\";\n\nexport type StorageBenchmarkScale = {\n\treadonly name: string;\n\treadonly entryCount: number;\n\treadonly taskCount: number;\n\treadonly documentCount: number;\n};\n\nexport const STORAGE_MEMORY_SCALES: readonly StorageBenchmarkScale[] = [\n\t{ name: \"1k\", entryCount: 1_000, taskCount: 200, documentCount: 200 },\n\t{ name: \"10k\", entryCount: 10_000, taskCount: 2_000, documentCount: 2_000 },\n];\n\nexport const TIMING_SCALE: StorageBenchmarkScale = {\n\tname: \"timing\",\n\tentryCount: 1_000,\n\ttaskCount: 300,\n\tdocumentCount: 300,\n};\n\nconst REPLAY_TAILS = [0, 16, 128, 1_024] as const;\nconst HISTORY_SEGMENT_LENGTH = 128;\nconst FORK_DEPTH = 8;\nconst ENTRIES_PER_FORK = 32;\nconst BATCH_SIZE = 100;\n\nexport function storageBenchmarkPrimaryRecordCount(scale: StorageBenchmarkScale): number {\n\treturn (\n\t\t1 +\n\t\tscale.entryCount +\n\t\tscale.taskCount +\n\t\tscale.documentCount +\n\t\tREPLAY_TAILS.length +\n\t\t1 +\n\t\tFORK_DEPTH * (1 + ENTRIES_PER_FORK)\n\t);\n}\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\nexport type StorageBenchmarkDataset = {\n\treadonly firstEntryId: EntryId;\n\treadonly filteredTaskCount: number;\n\treadonly exactDocumentId: DocumentId;\n\treadonly exactDocumentKey: string;\n\treadonly replayDocumentIds: Readonly<Record<(typeof REPLAY_TAILS)[number], DocumentId>>;\n\treadonly historicalDocumentId: DocumentId;\n\treadonly ancientAt: Seq;\n\treadonly recentAt: Seq;\n\treadonly deepestConversationId: ConversationId;\n\treadonly ancestorHeadEntryId: EntryId;\n};\n\nfunction task(id: TaskId<JsonValue>, index: number): StoredTask {\n\tconst statuses = [\"pending\", \"running\", \"terminal\"] as const;\n\tconst status = statuses[index % statuses.length];\n\tconst common = {\n\t\tid,\n\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\tkind: index % 4 === 0 ? \"benchmark.filtered\" : \"benchmark.other\",\n\t\tversion: 1,\n\t\tinput: { index },\n\t\tbackground: index % 5 === 0,\n\t\tabortRequested: index % 7 === 0,\n\t};\n\tif (status === \"terminal\") {\n\t\treturn { ...common, state: { status, outcome: { status: \"completed\", result: { index } } } };\n\t}\n\treturn { ...common, state: { status, checkpoint: { index, payload: \"x\".repeat(64) } } };\n}\n\n/** Seed deterministic representative data through only the public `Storage` contract. */\nexport async function seedStorageBenchmark(\n\tstorage: Storage,\n\tscale: StorageBenchmarkScale = TIMING_SCALE,\n): Promise<StorageBenchmarkDataset> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\n\tlet firstEntryId: EntryId | undefined;\n\tfor (let start = 0; start < scale.entryCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.entryCount); index++) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tif (index === 0) firstEntryId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"entry\",\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.entry\",\n\t\t\t\t\t...(index === 0 ? { head: id } : {}),\n\t\t\t\t\tdata: { index, text: `entry-${index}-${\"x\".repeat(96)}` },\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tfor (let start = 0; start < scale.taskCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.taskCount); index++) {\n\t\t\twrites.push({ type: \"task\", value: task(await storage.mintId<TaskId<JsonValue>>(), index) });\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tlet exactDocumentId: DocumentId | undefined;\n\tfor (let start = 0; start < scale.documentCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.documentCount); index++) {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\texactDocumentId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: { id, kind: \"benchmark.family\", key: `key-${index}`, scope: { kind: \"session\" } },\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { index, text: \"x\".repeat(128) } },\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tconst replayEntries = await Promise.all(\n\t\tREPLAY_TAILS.map(async (tail) => {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\treturn { tail, id };\n\t\t}),\n\t);\n\tawait commitWrites(\n\t\tstorage,\n\t\treplayEntries.map(({ tail, id }) => ({\n\t\t\ttype: \"document.create\" as const,\n\t\t\trecord: {\n\t\t\t\tid,\n\t\t\t\tkind: \"benchmark.replay\",\n\t\t\t\tkey: String(tail),\n\t\t\t\tscope: { kind: \"conversation\" as const, conversationId: ROOT_CONVERSATION_ID },\n\t\t\t\thistory: \"rewindable\" as const,\n\t\t\t\tfork: \"asOf\" as const,\n\t\t\t},\n\t\t\tcontent: { kind: \"base\" as const, version: 1, value: { count: 0, text: \"x\".repeat(64) } },\n\t\t})),\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tfor (let count = 1; count <= REPLAY_TAILS.at(-1)!; count++) {\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\treplayEntries\n\t\t\t\t.filter(({ tail }) => count <= tail)\n\t\t\t\t.map(({ id }) => ({\n\t\t\t\t\ttype: \"document.change\" as const,\n\t\t\t\t\tid,\n\t\t\t\t\tcontent: { kind: \"delta\" as const, version: 1, ops: [[\"s\", [\"count\"], count] as const] },\n\t\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tconst historicalDocumentId = await storage.mintId<DocumentId>();\n\tconst historicalRecord = {\n\t\tid: historicalDocumentId,\n\t\tkind: \"benchmark.history\",\n\t\tscope: { kind: \"conversation\", conversationId: ROOT_CONVERSATION_ID },\n\t\thistory: \"rewindable\",\n\t\tfork: \"asOf\",\n\t} satisfies DocumentCreate;\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: historicalRecord,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: 0 } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tlet ancientAt: Seq | undefined;\n\tfor (let count = 1; count <= HISTORY_SEGMENT_LENGTH; count++) {\n\t\tancientAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.change\",\n\t\t\t\tid: historicalDocumentId,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: HISTORY_SEGMENT_LENGTH } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tif (ancientAt === undefined) throw new Error(\"Benchmark history seed produced no commits\");\n\tlet recentAt = ancientAt;\n\tfor (let count = HISTORY_SEGMENT_LENGTH + 1; count <= HISTORY_SEGMENT_LENGTH * 2; count++) {\n\t\trecentAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tif (firstEntryId === undefined) throw new Error(\"Benchmark scale must create entries\");\n\tlet parentConversationId = ROOT_CONVERSATION_ID;\n\tlet parentAt = firstEntryId;\n\tlet deepestConversationId = ROOT_CONVERSATION_ID;\n\tfor (let depth = 0; depth < FORK_DEPTH; depth++) {\n\t\tconst conversationId = await storage.mintId<ConversationId>();\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\tvalue: { id: conversationId, parent: { conversationId: parentConversationId, at: parentAt } },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tconst ids = await Promise.all(Array.from({ length: ENTRIES_PER_FORK }, () => storage.mintId<EntryId>()));\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\tids.map((id, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: \"benchmark.fork\",\n\t\t\t\t\tdata: { depth, index },\n\t\t\t\t},\n\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tparentConversationId = conversationId;\n\t\tparentAt = ids.at(-1)!;\n\t\tdeepestConversationId = conversationId;\n\t}\n\n\tif (exactDocumentId === undefined) throw new Error(\"Benchmark scale must create documents\");\n\treturn {\n\t\tfirstEntryId,\n\t\tfilteredTaskCount: Math.min(50, Math.ceil(scale.taskCount / 60)),\n\t\texactDocumentId,\n\t\texactDocumentKey: `key-${scale.documentCount - 1}`,\n\t\treplayDocumentIds: Object.fromEntries(replayEntries.map(({ tail, id }) => [tail, id])) as Record<\n\t\t\t(typeof REPLAY_TAILS)[number],\n\t\t\tDocumentId\n\t\t>,\n\t\thistoricalDocumentId,\n\t\tancientAt,\n\t\trecentAt,\n\t\tdeepestConversationId,\n\t\tancestorHeadEntryId: firstEntryId,\n\t};\n}\n\nexport type StorageReadBenchmark = {\n\treadonly name: string;\n\trun(storage: Storage, dataset: StorageBenchmarkDataset): Promise<number>;\n\texpected(dataset: StorageBenchmarkDataset): number;\n};\n\nexport const STORAGE_READ_BENCHMARKS: readonly StorageReadBenchmark[] = [\n\t{\n\t\tname: \"exact entry lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.entry(dataset.firstEntryId, BACKGROUND_CONTEXT))?.entry.id ?? -1;\n\t\t},\n\t\texpected: ({ firstEntryId }) => firstEntryId,\n\t},\n\t{\n\t\tname: \"entry page scan (100)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries({ conversationId: ROOT_CONVERSATION_ID }, 100, undefined, BACKGROUND_CONTEXT)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"filtered task scan (50)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanTasks(\n\t\t\t\t\t{ kind: \"benchmark.filtered\", status: \"pending\", background: true },\n\t\t\t\t\t50,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: ({ filteredTaskCount }) => filteredTaskCount,\n\t},\n\t{\n\t\tname: \"exact document address among many\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"benchmark.family\", key: dataset.exactDocumentKey, scope: { kind: \"session\" } },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t)\n\t\t\t\t)?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ exactDocumentId }) => exactDocumentId,\n\t},\n\t...REPLAY_TAILS.map(\n\t\t(tail): StorageReadBenchmark => ({\n\t\t\tname: `document replay tail (${tail})`,\n\t\t\tasync run(storage, dataset) {\n\t\t\t\treturn Number(\n\t\t\t\t\t(await storage.document(dataset.replayDocumentIds[tail], \"current\", BACKGROUND_CONTEXT))?.value.count,\n\t\t\t\t);\n\t\t\t},\n\t\t\texpected: () => tail,\n\t\t}),\n\t),\n\t{\n\t\tname: \"ancient historical read before newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.ancientAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH,\n\t},\n\t{\n\t\tname: \"recent historical read after newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.recentAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH * 2,\n\t},\n\t{\n\t\tname: \"fork-depth history scan (100)\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t{ conversationId: dataset.deepestConversationId },\n\t\t\t\t\t100,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"fork-depth head lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(await storage.findLatestHeadMarker(dataset.deepestConversationId, undefined, BACKGROUND_CONTEXT))?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ ancestorHeadEntryId }) => ancestorHeadEntryId,\n\t},\n];\n\nexport type StorageWriteBenchmark = {\n\treadonly name: string;\n\treadonly expected: number;\n\trun(storage: Storage): Promise<number>;\n};\n\n/** Seed the common state expected by every write benchmark sample. */\nexport async function seedStorageWriteBenchmark(storage: Storage): Promise<void> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\tawait commitWrites(\n\t\tstorage,\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: 100 }, async (_, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.baseline\",\n\t\t\t\t\tdata: { index },\n\t\t\t\t},\n\t\t\t})),\n\t\t),\n\t\tBACKGROUND_CONTEXT,\n\t);\n}\n\nexport const STORAGE_WRITE_BENCHMARKS: readonly StorageWriteBenchmark[] = [\n\t{\n\t\tname: \"commit one entry\",\n\t\texpected: 1,\n\t\tasync run(storage) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tawait commitWrites(\n\t\t\t\tstorage,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\treturn 1;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit 100 entries\",\n\t\texpected: 100,\n\t\tasync run(storage) {\n\t\t\tconst writes = await Promise.all(\n\t\t\t\tArray.from(\n\t\t\t\t\t{ length: 100 },\n\t\t\t\t\tasync (_, index): Promise<StorageWrite> => ({\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { index, text: \"x\".repeat(128) },\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\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit mixed entry/task/submission/document\",\n\t\texpected: 4,\n\t\tasync run(storage) {\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst documentId = await storage.mintId<DocumentId>();\n\t\t\tconst writes: readonly StorageWrite[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\tvalue: { id: entryId, conversationId: ROOT_CONVERSATION_ID, kind: \"benchmark.mixed\" },\n\t\t\t\t},\n\t\t\t\t{ type: \"task\", value: task(taskId, taskId) },\n\t\t\t\t{\n\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tid: submissionId,\n\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\trequestId: `benchmark-${submissionId}`,\n\t\t\t\t\t\ttype: \"write\",\n\t\t\t\t\t\tstatus: \"done\",\n\t\t\t\t\t\tentry: entryId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\trecord: { id: documentId, kind: \"benchmark.mixed\", key: String(documentId), scope: { kind: \"session\" } },\n\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { entryId, taskId } },\n\t\t\t\t},\n\t\t\t];\n\t\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n];\n"]}
|