@getollie/cli 0.2.1 → 0.2.2
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/README.md +3 -14
- package/dist/cli.js +197 -85
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.js +51 -39
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -7,14 +7,20 @@ interface SandboxMount {
|
|
|
7
7
|
hostPath: string;
|
|
8
8
|
mountPoint: string;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
interface ValidateSandboxMountOptions {
|
|
11
|
+
reservedMountPoint?: string | null;
|
|
12
|
+
}
|
|
13
|
+
declare function validateSandboxMounts(mounts: SandboxMount[], options?: ValidateSandboxMountOptions): SandboxMount[];
|
|
14
|
+
declare function parseSandboxMounts(specs?: string[], options?: ValidateSandboxMountOptions): SandboxMount[];
|
|
12
15
|
|
|
13
16
|
type ExecutorKind = "none" | "local" | "daytona";
|
|
14
17
|
|
|
15
18
|
interface ExecutorContext {
|
|
16
19
|
kind: "local" | "daytona";
|
|
17
20
|
workspacePath: string;
|
|
21
|
+
workingDirectory?: string;
|
|
22
|
+
cwdPreserved?: boolean;
|
|
23
|
+
cwdLimitation?: string;
|
|
18
24
|
isolated: boolean;
|
|
19
25
|
networkAccess: "none" | "restricted" | "full";
|
|
20
26
|
}
|
|
@@ -68,6 +74,10 @@ interface GitCommandOptions {
|
|
|
68
74
|
interface CreateJustBashOptions {
|
|
69
75
|
git?: GitCommandOptions | false;
|
|
70
76
|
mounts?: SandboxMount[];
|
|
77
|
+
/** Sandbox destination for workspaceRoot. Defaults to /workspace. */
|
|
78
|
+
workspaceMountPoint?: string;
|
|
79
|
+
/** Initial sandbox working directory. Defaults to workspaceMountPoint. */
|
|
80
|
+
sandboxCwd?: string;
|
|
71
81
|
}
|
|
72
82
|
|
|
73
83
|
declare const SANDBOX_WORKSPACE_PATH = "/workspace";
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
import { realpathSync as realpathSync2, statSync as statSync2 } from "fs";
|
|
5
5
|
import { Bash, InMemoryFs, MountableFs, ReadWriteFs } from "just-bash";
|
|
6
6
|
|
|
7
|
+
// src/utils/errors.ts
|
|
8
|
+
var CliError = class extends Error {
|
|
9
|
+
constructor(message, exitCode = 1) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.exitCode = exitCode;
|
|
12
|
+
this.name = "CliError";
|
|
13
|
+
}
|
|
14
|
+
exitCode;
|
|
15
|
+
};
|
|
16
|
+
|
|
7
17
|
// src/sandbox/git/index.ts
|
|
8
18
|
import { posix as posix2 } from "path";
|
|
9
19
|
import { createTwoFilesPatch } from "diff";
|
|
@@ -884,49 +894,44 @@ Supported commands: ${COMMANDS.join(", ")}
|
|
|
884
894
|
// src/sandbox/mounts.ts
|
|
885
895
|
import { realpathSync, statSync } from "fs";
|
|
886
896
|
import { posix as posix3, resolve } from "path";
|
|
887
|
-
|
|
888
|
-
// src/utils/errors.ts
|
|
889
|
-
var CliError = class extends Error {
|
|
890
|
-
constructor(message, exitCode = 1) {
|
|
891
|
-
super(message);
|
|
892
|
-
this.exitCode = exitCode;
|
|
893
|
-
this.name = "CliError";
|
|
894
|
-
}
|
|
895
|
-
exitCode;
|
|
896
|
-
};
|
|
897
|
-
|
|
898
|
-
// src/sandbox/mounts.ts
|
|
899
897
|
var SANDBOX_WORKSPACE_PATH = "/workspace";
|
|
900
|
-
function
|
|
898
|
+
function sandboxPathsOverlap(left, right) {
|
|
901
899
|
return left === right || left.startsWith(`${right}/`) || right.startsWith(`${left}/`);
|
|
902
900
|
}
|
|
903
|
-
function
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
901
|
+
function sandboxPathContains(parent, child) {
|
|
902
|
+
return parent === child || child.startsWith(`${parent}/`);
|
|
903
|
+
}
|
|
904
|
+
function validateSandboxPath(path, label = "Sandbox path") {
|
|
905
|
+
if (!posix3.isAbsolute(path) || path.includes("\\") || path.includes("\0") || path.split("/").includes("..") || posix3.normalize(path) !== path) {
|
|
906
|
+
throw new CliError(`${label} must be a normalized absolute sandbox path: ${path}`);
|
|
908
907
|
}
|
|
909
|
-
|
|
910
|
-
|
|
908
|
+
return path;
|
|
909
|
+
}
|
|
910
|
+
function validateMountPoint(mountPoint) {
|
|
911
|
+
validateSandboxPath(mountPoint, "Mount point");
|
|
912
|
+
if (mountPoint === "/") {
|
|
913
|
+
throw new CliError(`Mount point must be a normalized absolute sandbox path other than /: ${mountPoint}`);
|
|
911
914
|
}
|
|
912
915
|
}
|
|
913
|
-
function validateSandboxMounts(mounts) {
|
|
916
|
+
function validateSandboxMounts(mounts, options = {}) {
|
|
917
|
+
const reservedMountPoint = options.reservedMountPoint === void 0 ? SANDBOX_WORKSPACE_PATH : options.reservedMountPoint;
|
|
914
918
|
const validated = [];
|
|
915
919
|
for (const mount of mounts) {
|
|
916
920
|
validateMountPoint(mount.mountPoint);
|
|
921
|
+
if (reservedMountPoint && sandboxPathsOverlap(mount.mountPoint, reservedMountPoint)) {
|
|
922
|
+
throw new CliError(`Mount point must be outside ${reservedMountPoint}: ${mount.mountPoint}`);
|
|
923
|
+
}
|
|
917
924
|
let hostPath;
|
|
918
925
|
try {
|
|
919
926
|
hostPath = realpathSync(resolve(mount.hostPath));
|
|
920
|
-
if (!statSync(hostPath).isDirectory())
|
|
921
|
-
throw new Error("not a directory");
|
|
922
|
-
}
|
|
927
|
+
if (!statSync(hostPath).isDirectory()) throw new Error("not a directory");
|
|
923
928
|
} catch {
|
|
924
929
|
throw new CliError(
|
|
925
|
-
`Mount source does not exist or is not a directory: ${resolve(mount.hostPath)}`
|
|
930
|
+
`Mount source host path does not exist or is not a directory: ${resolve(mount.hostPath)}`
|
|
926
931
|
);
|
|
927
932
|
}
|
|
928
933
|
const conflict = validated.find(
|
|
929
|
-
(candidate) =>
|
|
934
|
+
(candidate) => sandboxPathsOverlap(candidate.mountPoint, mount.mountPoint)
|
|
930
935
|
);
|
|
931
936
|
if (conflict) {
|
|
932
937
|
throw new CliError(
|
|
@@ -937,7 +942,7 @@ function validateSandboxMounts(mounts) {
|
|
|
937
942
|
}
|
|
938
943
|
return validated;
|
|
939
944
|
}
|
|
940
|
-
function parseSandboxMounts(specs = []) {
|
|
945
|
+
function parseSandboxMounts(specs = [], options) {
|
|
941
946
|
const mounts = specs.map((spec) => {
|
|
942
947
|
const separator = spec.lastIndexOf(":");
|
|
943
948
|
if (separator <= 0 || separator === spec.length - 1) {
|
|
@@ -945,12 +950,9 @@ function parseSandboxMounts(specs = []) {
|
|
|
945
950
|
`Invalid mount ${JSON.stringify(spec)}. Expected <host-path>:<sandbox-path>`
|
|
946
951
|
);
|
|
947
952
|
}
|
|
948
|
-
return {
|
|
949
|
-
hostPath: spec.slice(0, separator),
|
|
950
|
-
mountPoint: spec.slice(separator + 1)
|
|
951
|
-
};
|
|
953
|
+
return { hostPath: spec.slice(0, separator), mountPoint: spec.slice(separator + 1) };
|
|
952
954
|
});
|
|
953
|
-
return validateSandboxMounts(mounts);
|
|
955
|
+
return validateSandboxMounts(mounts, options);
|
|
954
956
|
}
|
|
955
957
|
|
|
956
958
|
// src/sandbox/just-bash.ts
|
|
@@ -964,7 +966,11 @@ function canonicalizeWorkspaceRoot(workspaceRoot) {
|
|
|
964
966
|
}
|
|
965
967
|
function createWorkspaceFs(workspaceRoot, options) {
|
|
966
968
|
const root = canonicalizeWorkspaceRoot(workspaceRoot);
|
|
967
|
-
const
|
|
969
|
+
const workspaceMountPoint = options.workspaceMountPoint ?? SANDBOX_WORKSPACE_PATH2;
|
|
970
|
+
validateSandboxPath(workspaceMountPoint, "Workspace mount point");
|
|
971
|
+
const additionalMounts = validateSandboxMounts(options.mounts ?? [], {
|
|
972
|
+
reservedMountPoint: workspaceMountPoint
|
|
973
|
+
}).map((mount) => ({
|
|
968
974
|
mountPoint: mount.mountPoint,
|
|
969
975
|
filesystem: new ReadWriteFs({ root: mount.hostPath, allowSymlinks: false })
|
|
970
976
|
}));
|
|
@@ -972,7 +978,7 @@ function createWorkspaceFs(workspaceRoot, options) {
|
|
|
972
978
|
base: new InMemoryFs(),
|
|
973
979
|
mounts: [
|
|
974
980
|
{
|
|
975
|
-
mountPoint:
|
|
981
|
+
mountPoint: workspaceMountPoint,
|
|
976
982
|
filesystem: new ReadWriteFs({ root, allowSymlinks: false })
|
|
977
983
|
},
|
|
978
984
|
...additionalMounts
|
|
@@ -980,13 +986,19 @@ function createWorkspaceFs(workspaceRoot, options) {
|
|
|
980
986
|
});
|
|
981
987
|
}
|
|
982
988
|
function createJustBash(workspaceRoot, options = {}) {
|
|
989
|
+
const workspaceMountPoint = options.workspaceMountPoint ?? SANDBOX_WORKSPACE_PATH2;
|
|
990
|
+
const sandboxCwd = options.sandboxCwd ?? workspaceMountPoint;
|
|
991
|
+
validateSandboxPath(sandboxCwd, "Sandbox cwd");
|
|
992
|
+
const configuredMountPoints = [workspaceMountPoint, ...(options.mounts ?? []).map((m) => m.mountPoint)];
|
|
993
|
+
if (!configuredMountPoints.some((mountPoint) => sandboxPathContains(mountPoint, sandboxCwd))) {
|
|
994
|
+
throw new CliError(
|
|
995
|
+
`Sandbox cwd ${sandboxCwd} is not contained by the primary workspace or any configured mount.`
|
|
996
|
+
);
|
|
997
|
+
}
|
|
983
998
|
return new Bash({
|
|
984
999
|
fs: createWorkspaceFs(workspaceRoot, options),
|
|
985
|
-
cwd:
|
|
986
|
-
env: {
|
|
987
|
-
HOME: "/home/user",
|
|
988
|
-
TERM: "xterm-256color"
|
|
989
|
-
},
|
|
1000
|
+
cwd: sandboxCwd,
|
|
1001
|
+
env: { HOME: "/home/user", TERM: "xterm-256color" },
|
|
990
1002
|
python: true,
|
|
991
1003
|
javascript: true,
|
|
992
1004
|
customCommands: options.git === false ? [] : [createGitCommand(options.git)],
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sandbox/just-bash.ts","../src/sandbox/git/index.ts","../src/sandbox/git/fs-adapter.ts","../src/sandbox/git/http-adapter.ts","../src/sandbox/mounts.ts","../src/utils/errors.ts","../src/index.ts"],"sourcesContent":["import { realpathSync, statSync } from \"node:fs\";\nimport { Bash, InMemoryFs, MountableFs, ReadWriteFs } from \"just-bash\";\nimport { createGitCommand } from \"./git/index.js\";\nimport type { CreateJustBashOptions } from \"./git/types.js\";\nimport { validateSandboxMounts } from \"./mounts.js\";\n\nexport const SANDBOX_WORKSPACE_PATH = \"/workspace\";\n\nfunction canonicalizeWorkspaceRoot(workspaceRoot: string): string {\n const canonicalRoot = realpathSync(workspaceRoot);\n if (!statSync(canonicalRoot).isDirectory()) {\n throw new Error(\"The sandbox workspace root must be a directory\");\n }\n return canonicalRoot;\n}\n\nfunction createWorkspaceFs(workspaceRoot: string, options: CreateJustBashOptions) {\n const root = canonicalizeWorkspaceRoot(workspaceRoot);\n const additionalMounts = validateSandboxMounts(options.mounts ?? []).map((mount) => ({\n mountPoint: mount.mountPoint,\n filesystem: new ReadWriteFs({ root: mount.hostPath, allowSymlinks: false }),\n }));\n return new MountableFs({\n base: new InMemoryFs(),\n mounts: [\n {\n mountPoint: SANDBOX_WORKSPACE_PATH,\n filesystem: new ReadWriteFs({ root, allowSymlinks: false }),\n },\n ...additionalMounts,\n ],\n });\n}\n\nexport function createJustBash(workspaceRoot: string, options: CreateJustBashOptions = {}): Bash {\n return new Bash({\n fs: createWorkspaceFs(workspaceRoot, options),\n cwd: SANDBOX_WORKSPACE_PATH,\n env: {\n HOME: \"/home/user\",\n TERM: \"xterm-256color\",\n },\n python: true,\n javascript: true,\n customCommands: options.git === false ? [] : [createGitCommand(options.git)],\n network: {\n dangerouslyAllowFullInternetAccess: true,\n maxResponseSize: 100 * 1024 * 1024,\n },\n });\n}\n\nexport async function isJustBashAvailable(): Promise<boolean> {\n try {\n const bash = new Bash();\n await bash.exec(\"echo ok\");\n return true;\n } catch {\n return false;\n }\n}\n","import { posix } from \"node:path\";\nimport { createTwoFilesPatch } from \"diff\";\nimport * as git from \"isomorphic-git\";\nimport { type CommandContext, defineCommand, type ExecResult } from \"just-bash\";\nimport { createGitFs } from \"./fs-adapter.js\";\nimport { createGitHttp, validateRemoteUrl } from \"./http-adapter.js\";\nimport type { GitCommandOptions, GitHandlerContext } from \"./types.js\";\n\nconst WORKSPACE = \"/workspace\";\nconst VERSION = \"ollie-git/0.1 (isomorphic-git)\";\nconst COMMANDS = [\n \"init\",\n \"clone\",\n \"status\",\n \"add\",\n \"commit\",\n \"log\",\n \"diff\",\n \"branch\",\n \"checkout\",\n \"remote\",\n \"config\",\n \"fetch\",\n \"pull\",\n \"push\",\n];\n\nclass UsageError extends Error {}\n\nfunction ok(stdout = \"\"): ExecResult {\n return { stdout, stderr: \"\", exitCode: 0 };\n}\n\nfunction usage(message?: string): never {\n throw new UsageError(message ?? \"unsupported arguments\");\n}\n\nfunction assertNotAborted(ctx: CommandContext): void {\n if (ctx.signal?.aborted) throw new Error(\"operation aborted\");\n}\n\nfunction virtualPath(ctx: CommandContext, input = \".\"): string {\n if (input.includes(\"\\0\") || input.includes(\"\\\\\")) throw new Error(\"invalid path\");\n const resolved = ctx.fs.resolvePath(ctx.cwd, input);\n if (resolved !== WORKSPACE && !resolved.startsWith(`${WORKSPACE}/`)) {\n throw new Error(\"path is outside /workspace\");\n }\n return resolved;\n}\n\nasync function repositoryDir(ctx: CommandContext): Promise<string> {\n let current = virtualPath(ctx);\n while (current === WORKSPACE || current.startsWith(`${WORKSPACE}/`)) {\n if (await ctx.fs.exists(posix.join(current, \".git\"))) return current;\n if (current === WORKSPACE) break;\n current = posix.dirname(current);\n }\n throw new Error(\"not a git repository (or any parent up to /workspace)\");\n}\n\nfunction optionValue(args: string[], names: string[]): { value?: string; rest: string[] } {\n let value: string | undefined;\n const rest: string[] = [];\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (arg && names.includes(arg)) {\n const next = args[++index];\n if (!next) usage(`${arg} requires a value`);\n value = next;\n } else if (arg && names.some((name) => arg.startsWith(`${name}=`))) {\n value = arg.slice(arg.indexOf(\"=\") + 1);\n } else if (arg) rest.push(arg);\n }\n return { value, rest };\n}\n\nfunction flag(args: string[], names: string[]): { enabled: boolean; rest: string[] } {\n let enabled = false;\n const rest = args.filter((arg) => {\n if (names.includes(arg)) {\n enabled = true;\n return false;\n }\n return true;\n });\n return { enabled, rest };\n}\n\nfunction rejectOptions(args: string[]): void {\n const unknown = args.find((arg) => arg.startsWith(\"-\"));\n if (unknown) usage(`unsupported option '${unknown}'`);\n}\n\nfunction positiveInteger(value: string | undefined, option: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) usage(`${option} requires a positive integer`);\n return parsed;\n}\n\nfunction authFor(context: GitHandlerContext, url?: string) {\n if (!url || !context.options.resolveAuth) return undefined;\n return async () => context.options.resolveAuth?.(url);\n}\n\nasync function remoteUrl(context: GitHandlerContext, dir: string, remote: string): Promise<string> {\n const value = await git.getConfig({ fs: context.fs, dir, path: `remote.${remote}.url` });\n if (!value) throw new Error(`remote '${remote}' has no URL`);\n return validateRemoteUrl(value);\n}\n\nconst GLOBAL_CONFIG_PATH = \"/home/user/.gitconfig\";\n\nasync function readGlobalConfig(ctx: CommandContext): Promise<Map<string, string>> {\n if (!(await ctx.fs.exists(GLOBAL_CONFIG_PATH))) return new Map();\n const values = new Map<string, string>();\n let section = \"\";\n for (const rawLine of (await ctx.fs.readFile(GLOBAL_CONFIG_PATH)).split(\"\\n\")) {\n const line = rawLine.trim();\n const sectionMatch = /^\\[([^\\]]+)\\]$/.exec(line);\n if (sectionMatch?.[1]) {\n section = sectionMatch[1].trim().toLowerCase();\n continue;\n }\n const valueMatch = /^([^=]+)=(.*)$/.exec(line);\n if (section && valueMatch?.[1] !== undefined && valueMatch[2] !== undefined) {\n values.set(`${section}.${valueMatch[1].trim().toLowerCase()}`, valueMatch[2].trim());\n }\n }\n return values;\n}\n\nasync function writeGlobalConfig(ctx: CommandContext, values: Map<string, string>): Promise<void> {\n const sections = new Map<string, Array<[string, string]>>();\n for (const [path, value] of [...values].sort(([left], [right]) => left.localeCompare(right))) {\n const separator = path.indexOf(\".\");\n if (separator < 1) usage(\"config key must contain a section\");\n const section = path.slice(0, separator);\n const name = path.slice(separator + 1);\n const entries = sections.get(section) ?? [];\n entries.push([name, value]);\n sections.set(section, entries);\n }\n const content = [...sections]\n .map(\n ([section, entries]) =>\n `[${section}]\\n${entries.map(([key, value]) => `\\t${key} = ${value}`).join(\"\\n\")}`,\n )\n .join(\"\\n\");\n await ctx.fs.mkdir(posix.dirname(GLOBAL_CONFIG_PATH), { recursive: true });\n await ctx.fs.writeFile(GLOBAL_CONFIG_PATH, content ? `${content}\\n` : \"\");\n}\n\nasync function handleInit(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const branchOpt = optionValue(args, [\"-b\", \"--initial-branch\"]);\n rejectOptions(branchOpt.rest);\n if (branchOpt.rest.length > 1) usage(\"git init accepts at most one directory\");\n const dir = virtualPath(context.command, branchOpt.rest[0]);\n await context.command.fs.mkdir(dir, { recursive: true }).catch(async () => {\n if (!(await context.command.fs.exists(dir)))\n throw new Error(\"cannot create repository directory\");\n });\n await git.init({ fs: context.fs, dir, defaultBranch: branchOpt.value ?? \"main\" });\n return ok(`Initialized empty Git repository in ${posix.join(dir, \".git\")}/\\n`);\n}\n\nasync function handleStatus(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const shortFlag = flag(args, [\"-s\", \"--short\", \"--porcelain\"]);\n rejectOptions(shortFlag.rest);\n if (shortFlag.rest.length) usage();\n const dir = await repositoryDir(context.command);\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n const lines = matrix\n .filter(([, head, workdir, stage]) => head !== workdir || workdir !== stage)\n .map(([path, head, workdir, stage]) => {\n let x = \" \";\n let y = \" \";\n if (head === 0 && stage !== 0) x = \"A\";\n else if (head !== stage) x = stage === 0 ? \"D\" : \"M\";\n if (workdir !== stage) y = workdir === 0 ? \"D\" : \"M\";\n if (head === 0 && stage === 0 && workdir !== 0) return `?? ${path}`;\n return `${x}${y} ${path}`;\n });\n if (shortFlag.enabled) return ok(lines.length ? `${lines.join(\"\\n\")}\\n` : \"\");\n const branch = (await git.currentBranch({ fs: context.fs, dir })) ?? \"HEAD detached\";\n return ok(\n `On branch ${branch}\\n${lines.length ? `${lines.join(\"\\n\")}\\n` : \"nothing to commit, working tree clean\\n\"}`,\n );\n}\n\nasync function handleAdd(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const separator = args.indexOf(\"--\");\n const optionArgs = separator < 0 ? args : args.slice(0, separator);\n const literalPaths = separator < 0 ? [] : args.slice(separator + 1);\n const allFlag = flag(optionArgs, [\"-A\", \"--all\"]);\n rejectOptions(allFlag.rest);\n const paths = [...allFlag.rest, ...literalPaths];\n if (!allFlag.enabled && paths.length === 0) usage(\"nothing specified\");\n const dir = await repositoryDir(context.command);\n const all = allFlag.enabled || paths.includes(\".\");\n if (all) {\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n for (const [filepath, , workdir, stage] of matrix) {\n assertNotAborted(context.command);\n if (workdir === stage) continue;\n if (workdir === 0) await git.remove({ fs: context.fs, dir, filepath });\n else await git.add({ fs: context.fs, dir, filepath });\n }\n } else {\n for (const filepath of paths) {\n if (\n filepath.startsWith(\"/\") ||\n filepath.split(\"/\").some((segment) => segment === \"..\" || segment === \".git\")\n )\n throw new Error(\"invalid pathspec\");\n await git.add({ fs: context.fs, dir, filepath });\n }\n }\n return ok();\n}\n\nfunction parseAuthor(value: string): { name: string; email: string } {\n const match = /^(.*?)\\s*<([^<>]+)>$/.exec(value);\n if (!match?.[1] || !match[2]) usage(\"--author must be 'Name <email>'\");\n return { name: match[1].trim(), email: match[2] };\n}\n\nasync function handleCommit(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const messageOpt = optionValue(args, [\"-m\", \"--message\"]);\n const authorOpt = optionValue(messageOpt.rest, [\"--author\"]);\n rejectOptions(authorOpt.rest);\n if (authorOpt.rest.length || !messageOpt.value) usage(\"git commit requires -m <message>\");\n const dir = await repositoryDir(context.command);\n const globalConfig = await readGlobalConfig(context.command);\n const repoName = await git.getConfig({ fs: context.fs, dir, path: \"user.name\" });\n const repoEmail = await git.getConfig({ fs: context.fs, dir, path: \"user.email\" });\n const configuredAuthor =\n repoName && repoEmail\n ? { name: repoName, email: repoEmail }\n : globalConfig.get(\"user.name\") && globalConfig.get(\"user.email\")\n ? {\n name: globalConfig.get(\"user.name\") as string,\n email: globalConfig.get(\"user.email\") as string,\n }\n : context.options.author;\n const author = authorOpt.value ? parseAuthor(authorOpt.value) : configuredAuthor;\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n if (!matrix.some(([, headStatus, , stageStatus]) => headStatus !== stageStatus)) {\n const message = matrix.some(([, , workdirStatus, stageStatus]) => workdirStatus !== stageStatus)\n ? \"no changes added to commit\"\n : \"nothing to commit, working tree clean\";\n throw new Error(message);\n }\n const oid = await git.commit({ fs: context.fs, dir, message: messageOpt.value, author });\n const branch = (await git.currentBranch({ fs: context.fs, dir })) ?? \"detached HEAD\";\n return ok(`[${branch} ${oid.slice(0, 7)}] ${messageOpt.value.split(\"\\n\")[0]}\\n`);\n}\n\nasync function handleLog(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const countOpt = optionValue(args, [\"-n\", \"--max-count\"]);\n const onelineFlag = flag(countOpt.rest, [\"--oneline\"]);\n rejectOptions(onelineFlag.rest);\n if (onelineFlag.rest.length > 1) usage();\n const depth = countOpt.value ? Number.parseInt(countOpt.value, 10) : 20;\n if (!Number.isFinite(depth) || depth < 1) usage(\"invalid max count\");\n const dir = await repositoryDir(context.command);\n const commits = await git.log({ fs: context.fs, dir, ref: onelineFlag.rest[0] ?? \"HEAD\", depth });\n if (onelineFlag.enabled) {\n return ok(\n commits\n .map((entry) => `${entry.oid.slice(0, 7)} ${entry.commit.message.split(\"\\n\")[0]}`)\n .join(\"\\n\") + (commits.length ? \"\\n\" : \"\"),\n );\n }\n return ok(\n commits\n .map(\n (entry) =>\n `commit ${entry.oid}\\nAuthor: ${entry.commit.author.name} <${entry.commit.author.email}>\\n\\n ${entry.commit.message.trim().replaceAll(\"\\n\", \"\\n \")}\\n`,\n )\n .join(\"\\n\"),\n );\n}\n\nasync function handleDiff(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const cachedFlag = flag(args, [\"--cached\", \"--staged\"]);\n rejectOptions(cachedFlag.rest);\n const dir = await repositoryDir(context.command);\n const selected = cachedFlag.rest.map((path) => path.replace(/^\\.\\//, \"\").replace(/\\/$/, \"\"));\n const decoder = new TextDecoder();\n const patch = (filepath: string, oldBytes: Uint8Array, newBytes: Uint8Array) => {\n if (oldBytes.includes(0) || newBytes.includes(0)) {\n return `Binary files a/${filepath} and b/${filepath} differ\\n`;\n }\n return createTwoFilesPatch(\n `a/${filepath}`,\n `b/${filepath}`,\n decoder.decode(oldBytes),\n decoder.decode(newBytes),\n \"\",\n \"\",\n { context: 3 },\n );\n };\n const matrix = await git.statusMatrix({\n fs: context.fs,\n dir,\n filepaths: selected.length ? selected : undefined,\n });\n const stageOids = new Map<string, string>();\n await git.walk({\n fs: context.fs,\n dir,\n trees: [git.STAGE()],\n map: async (filepath, [entry]) => {\n if (entry && (await entry.type()) !== \"tree\") stageOids.set(filepath, await entry.oid());\n },\n });\n const head = await git.resolveRef({ fs: context.fs, dir, ref: \"HEAD\" }).catch(() => undefined);\n const empty = new Uint8Array();\n const readStage = async (filepath: string) => {\n const oid = stageOids.get(filepath);\n return oid ? (await git.readBlob({ fs: context.fs, dir, oid })).blob : empty;\n };\n const patches: string[] = [];\n for (const [filepath, headStatus, workdirStatus, stageStatus] of matrix) {\n const changed = cachedFlag.enabled ? headStatus !== stageStatus : workdirStatus !== stageStatus;\n if (!changed) continue;\n const oldBytes = cachedFlag.enabled\n ? head && headStatus !== 0\n ? (await git.readBlob({ fs: context.fs, dir, oid: head, filepath })).blob\n : empty\n : await readStage(filepath);\n const newBytes = cachedFlag.enabled\n ? await readStage(filepath)\n : workdirStatus === 0\n ? empty\n : await context.command.fs.readFileBuffer(posix.join(dir, filepath));\n patches.push(patch(filepath, oldBytes, newBytes));\n }\n return ok(patches.join(\"\"));\n}\n\nasync function handleBranch(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const deleteFlag = flag(args, [\"-d\", \"-D\", \"--delete\"]);\n rejectOptions(deleteFlag.rest);\n const dir = await repositoryDir(context.command);\n if (deleteFlag.enabled) {\n if (deleteFlag.rest.length !== 1) usage(\"branch deletion requires one name\");\n await git.deleteBranch({ fs: context.fs, dir, ref: deleteFlag.rest[0] as string });\n return ok(`Deleted branch ${deleteFlag.rest[0]}.\\n`);\n }\n if (deleteFlag.rest.length) {\n if (deleteFlag.rest.length > 2) usage();\n await git.branch({\n fs: context.fs,\n dir,\n ref: deleteFlag.rest[0] as string,\n object: deleteFlag.rest[1],\n });\n return ok();\n }\n const [branches, current] = await Promise.all([\n git.listBranches({ fs: context.fs, dir }),\n git.currentBranch({ fs: context.fs, dir }),\n ]);\n return ok(\n branches.map((name) => `${name === current ? \"*\" : \" \"} ${name}`).join(\"\\n\") +\n (branches.length ? \"\\n\" : \"\"),\n );\n}\n\nasync function readCheckoutBlob(\n context: GitHandlerContext,\n dir: string,\n commitOid: string,\n filepath: string,\n): Promise<Uint8Array> {\n let treeOid = (await git.readCommit({ fs: context.fs, dir, oid: commitOid })).commit.tree;\n const segments = filepath.split(\"/\").filter(Boolean);\n for (let index = 0; index < segments.length; index++) {\n const entries = (await git.readTree({ fs: context.fs, dir, oid: treeOid })).tree;\n const entry = entries.find((candidate) => candidate.path === segments[index]);\n if (!entry) throw new Error(`path '${filepath}' does not exist in the selected ref`);\n if (entry.mode === \"120000\") throw new Error(\"symbolic links are not supported in the sandbox\");\n if (index === segments.length - 1) {\n if (entry.type !== \"blob\") throw new Error(`path '${filepath}' is not a file`);\n return (await git.readBlob({ fs: context.fs, dir, oid: entry.oid })).blob;\n }\n if (entry.type !== \"tree\") throw new Error(`path '${filepath}' is not a file`);\n treeOid = entry.oid;\n }\n throw new Error(\"invalid checkout path\");\n}\n\nasync function handleCheckout(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const separator = args.indexOf(\"--\");\n const commandArgs = separator >= 0 ? args.slice(0, separator) : args;\n const filepaths = separator >= 0 ? args.slice(separator + 1) : [];\n const createOpt = optionValue(commandArgs, [\"-b\"]);\n const forceFlag = flag(createOpt.rest, [\"-f\", \"--force\"]);\n rejectOptions(forceFlag.rest);\n const dir = await repositoryDir(context.command);\n if (filepaths.length) {\n if (createOpt.value || forceFlag.rest.length > 1) usage();\n if (filepaths.some((path) => path.startsWith(\"/\") || path.split(\"/\").includes(\"..\"))) {\n throw new Error(\"invalid checkout path\");\n }\n const ref = forceFlag.rest[0] ?? \"HEAD\";\n const oid = await git.resolveRef({ fs: context.fs, dir, ref });\n for (const filepath of filepaths) {\n const blob = await readCheckoutBlob(context, dir, oid, filepath);\n await context.command.fs.writeFile(posix.join(dir, filepath), blob);\n }\n return ok();\n }\n if (separator >= 0) usage(\"checkout requires at least one path after --\");\n if (createOpt.value) {\n if (forceFlag.rest.length > 1) usage();\n await git.branch({\n fs: context.fs,\n dir,\n ref: createOpt.value,\n object: forceFlag.rest[0],\n checkout: true,\n });\n await git.checkout({ fs: context.fs, dir, ref: createOpt.value, force: forceFlag.enabled });\n return ok(`Switched to a new branch '${createOpt.value}'\\n`);\n }\n if (forceFlag.rest.length !== 1) usage(\"checkout requires one branch or ref\");\n await git.checkout({ fs: context.fs, dir, ref: forceFlag.rest[0], force: forceFlag.enabled });\n return ok(`Switched to '${forceFlag.rest[0]}'\\n`);\n}\n\nasync function handleRemote(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const dir = await repositoryDir(context.command);\n if (!args.length || (args.length === 1 && args[0] === \"-v\")) {\n const remotes = await git.listRemotes({ fs: context.fs, dir });\n const verbose = args[0] === \"-v\";\n return ok(\n remotes\n .map(({ remote, url }) =>\n verbose ? `${remote}\\t${url} (fetch)\\n${remote}\\t${url} (push)` : remote,\n )\n .join(\"\\n\") + (remotes.length ? \"\\n\" : \"\"),\n );\n }\n const [action, name, value, ...rest] = args;\n if (rest.length || !name) usage();\n if (action === \"add\") {\n if (!value) usage(\"remote add requires a URL\");\n validateRemoteUrl(value);\n await git.addRemote({ fs: context.fs, dir, remote: name, url: value });\n return ok();\n }\n if (action === \"remove\" || action === \"rm\") {\n if (value) usage();\n await git.deleteRemote({ fs: context.fs, dir, remote: name });\n return ok();\n }\n if (action === \"get-url\") {\n if (value) usage();\n const url = await remoteUrl(context, dir, name);\n return ok(`${url}\\n`);\n }\n if (action === \"set-url\") {\n if (!value) usage();\n validateRemoteUrl(value);\n await git.setConfig({ fs: context.fs, dir, path: `remote.${name}.url`, value });\n return ok();\n }\n usage();\n}\n\nasync function handleConfig(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const globalFlag = flag(args, [\"--global\"]);\n const unsetFlag = flag(globalFlag.rest, [\"--unset\"]);\n const listFlag = flag(unsetFlag.rest, [\"--list\", \"-l\"]);\n rejectOptions(listFlag.rest);\n const globalValues = globalFlag.enabled ? await readGlobalConfig(context.command) : undefined;\n const dir = globalFlag.enabled ? undefined : await repositoryDir(context.command);\n if (listFlag.enabled) {\n if (listFlag.rest.length) usage();\n if (globalValues) {\n const output = [...globalValues].map(([key, value]) => `${key}=${value}`).join(\"\\n\");\n return ok(output ? `${output}\\n` : \"\");\n }\n const keys = [\"user.name\", \"user.email\", \"core.repositoryformatversion\", \"core.bare\"];\n const values = await Promise.all(\n keys.map(\n async (key) => [key, await git.getConfig({ fs: context.fs, dir, path: key })] as const,\n ),\n );\n const output = values\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n return ok(output ? `${output}\\n` : \"\");\n }\n const [key, value, ...rest] = listFlag.rest;\n if (rest.length || !key) usage();\n if (!key.includes(\".\")) usage(\"config key must contain a section\");\n if (globalValues) {\n if (unsetFlag.enabled) {\n if (value) usage();\n globalValues.delete(key.toLowerCase());\n await writeGlobalConfig(context.command, globalValues);\n return ok();\n }\n if (value === undefined) {\n const found = globalValues.get(key.toLowerCase());\n return found === undefined ? { stdout: \"\", stderr: \"\", exitCode: 1 } : ok(`${found}\\n`);\n }\n globalValues.set(key.toLowerCase(), value);\n await writeGlobalConfig(context.command, globalValues);\n return ok();\n }\n if (unsetFlag.enabled) {\n if (value) usage();\n await git.setConfig({ fs: context.fs, dir, path: key, value: undefined });\n return ok();\n }\n if (value === undefined) {\n const found = await git.getConfig({ fs: context.fs, dir, path: key });\n return found === undefined ? { stdout: \"\", stderr: \"\", exitCode: 1 } : ok(`${found}\\n`);\n }\n await git.setConfig({ fs: context.fs, dir, path: key, value });\n return ok();\n}\n\nasync function handleClone(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const branchOpt = optionValue(args, [\"-b\", \"--branch\"]);\n const depthOpt = optionValue(branchOpt.rest, [\"--depth\"]);\n const singleFlag = flag(depthOpt.rest, [\"--single-branch\"]);\n const noCheckoutFlag = flag(singleFlag.rest, [\"--no-checkout\"]);\n rejectOptions(noCheckoutFlag.rest);\n const [rawUrl, destination, ...rest] = noCheckoutFlag.rest;\n if (!rawUrl || rest.length) usage(\"clone requires a URL and optional directory\");\n const url = validateRemoteUrl(rawUrl);\n const inferred = posix.basename(new URL(url).pathname).replace(/\\.git$/, \"\") || \"repository\";\n const dir = virtualPath(context.command, destination ?? inferred);\n const depth = positiveInteger(depthOpt.value, \"--depth\");\n await git.clone({\n fs: context.fs,\n http: context.http,\n dir,\n url,\n ref: branchOpt.value,\n depth,\n singleBranch: singleFlag.enabled || Boolean(branchOpt.value),\n noCheckout: noCheckoutFlag.enabled,\n onAuth: authFor(context, url),\n });\n return ok(`Cloning into '${destination ?? inferred}'...\\n`);\n}\n\nasync function handleFetch(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const depthOpt = optionValue(args, [\"--depth\"]);\n rejectOptions(depthOpt.rest);\n if (depthOpt.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = depthOpt.rest[0] ?? \"origin\";\n const url = await remoteUrl(context, dir, remote);\n await git.fetch({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref: depthOpt.rest[1],\n depth: positiveInteger(depthOpt.value, \"--depth\"),\n onAuth: authFor(context, url),\n });\n return ok();\n}\n\nasync function handlePull(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const ffFlag = flag(args, [\"--ff-only\"]);\n rejectOptions(ffFlag.rest);\n if (ffFlag.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = ffFlag.rest[0] ?? \"origin\";\n const url = await remoteUrl(context, dir, remote);\n await git.pull({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref: ffFlag.rest[1],\n fastForwardOnly: true,\n // isomorphic-git requires an author even when fastForwardOnly prevents merge commits.\n author: context.options.author ?? { name: \"Ollie Git\", email: \"git@localhost\" },\n onAuth: authFor(context, url),\n });\n return ok(\"Already up to date or fast-forwarded.\\n\");\n}\n\nasync function handlePush(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const forceFlag = flag(args, [\"--force\", \"-f\"]);\n const upstreamFlag = flag(forceFlag.rest, [\"--set-upstream\", \"-u\"]);\n rejectOptions(upstreamFlag.rest);\n if (upstreamFlag.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = upstreamFlag.rest[0] ?? \"origin\";\n const ref = upstreamFlag.rest[1] ?? (await git.currentBranch({ fs: context.fs, dir }));\n if (!ref) throw new Error(\"cannot determine branch to push\");\n const url = await remoteUrl(context, dir, remote);\n const result = await git.push({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref,\n force: forceFlag.enabled,\n onAuth: authFor(context, url),\n });\n if (!result.ok) {\n const refError = Object.values(result.refs).find((status) => !status.ok)?.error;\n throw new Error(result.error ?? refError ?? \"remote rejected the push\");\n }\n if (upstreamFlag.enabled) {\n await git.setConfig({ fs: context.fs, dir, path: `branch.${ref}.remote`, value: remote });\n await git.setConfig({\n fs: context.fs,\n dir,\n path: `branch.${ref}.merge`,\n value: `refs/heads/${ref}`,\n });\n }\n return ok(`To ${url}\\n`);\n}\n\nconst handlers: Record<\n string,\n (context: GitHandlerContext, args: string[]) => Promise<ExecResult>\n> = {\n init: handleInit,\n clone: handleClone,\n status: handleStatus,\n add: handleAdd,\n commit: handleCommit,\n log: handleLog,\n diff: handleDiff,\n branch: handleBranch,\n checkout: handleCheckout,\n remote: handleRemote,\n config: handleConfig,\n fetch: handleFetch,\n pull: handlePull,\n push: handlePush,\n};\n\nfunction redact(message: string, secrets: Set<string>): string {\n let result = message\n .replace(/https:\\/\\/[^\\s/@]+@/g, \"https://\")\n .replaceAll(process.cwd(), \"<host>\");\n for (const secret of secrets) {\n if (secret) result = result.replaceAll(secret, \"<redacted>\");\n }\n return result;\n}\n\nexport function createGitCommand(options: GitCommandOptions = {}) {\n return defineCommand(\"git\", async (args, command) => {\n const secrets = new Set<string>();\n const safeOptions: GitCommandOptions = options.resolveAuth\n ? {\n ...options,\n resolveAuth: async (url) => {\n const auth = await options.resolveAuth?.(url);\n if (auth?.username) secrets.add(auth.username);\n if (auth?.password) secrets.add(auth.password);\n return auth;\n },\n }\n : options;\n try {\n if (!args.length || args[0] === \"help\" || args.includes(\"--help\")) {\n return ok(`usage: git <command> [options]\\n\\nSupported commands: ${COMMANDS.join(\", \")}\\n`);\n }\n if (args[0] === \"--version\" || args[0] === \"-v\") return ok(`${VERSION}\\n`);\n const subcommand = args[0];\n const handler = subcommand ? handlers[subcommand] : undefined;\n if (!handler) usage(`'${subcommand ?? \"\"}' is not a supported git command`);\n assertNotAborted(command);\n return await handler(\n {\n command,\n fs: createGitFs(command.fs),\n http: createGitHttp(command),\n options: safeOptions,\n },\n args.slice(1),\n );\n } catch (error) {\n const message = redact(\n error instanceof Error ? error.message : \"unknown Git failure\",\n secrets,\n );\n const exitCode =\n error instanceof UsageError\n ? 129\n : /not a git repository|NotFoundError/.test(message)\n ? 128\n : 1;\n return {\n stdout: \"\",\n stderr: `${error instanceof UsageError ? \"error\" : \"fatal\"}: ${message}\\n`,\n exitCode,\n };\n }\n });\n}\n\nexport type { CreateJustBashOptions, GitAuth, GitCommandOptions } from \"./types.js\";\n","import { posix } from \"node:path\";\nimport type { IFileSystem } from \"just-bash\";\n\nconst ROOT = \"/workspace\";\n\nfunction safePath(path: string): string {\n if (path.includes(\"\\0\") || path.includes(\"\\\\\")) {\n throw Object.assign(new Error(\"Invalid virtual Git path\"), { code: \"EINVAL\" });\n }\n const normalized = posix.resolve(path);\n if (normalized !== ROOT && !normalized.startsWith(`${ROOT}/`)) {\n throw Object.assign(new Error(\"Git path is outside /workspace\"), { code: \"EACCES\" });\n }\n return normalized;\n}\n\nfunction normalizeError(error: unknown): never {\n if (error instanceof Error) {\n const coded = error as Error & { code?: string };\n if (!coded.code) {\n if (/not found|does not exist|enoent/i.test(error.message)) coded.code = \"ENOENT\";\n else if (/exist/i.test(error.message)) coded.code = \"EEXIST\";\n else if (/directory/i.test(error.message)) coded.code = \"ENOTDIR\";\n else coded.code = \"EIO\";\n }\n throw coded;\n }\n throw Object.assign(new Error(\"Virtual filesystem operation failed\"), { code: \"EIO\" });\n}\n\nasync function ensureParent(fs: IFileSystem, path: string): Promise<void> {\n const parent = posix.dirname(path);\n if (!(await fs.exists(parent))) await fs.mkdir(parent, { recursive: true });\n}\n\nfunction statShape(stat: Awaited<ReturnType<IFileSystem[\"stat\"]>>) {\n const typeMode = stat.isDirectory ? 0o040000 : stat.isSymbolicLink ? 0o120000 : 0o100000;\n const mode = typeMode | (stat.mode & 0o7777);\n return {\n isFile: () => stat.isFile,\n isDirectory: () => stat.isDirectory,\n isSymbolicLink: () => stat.isSymbolicLink,\n mode,\n size: stat.size,\n mtime: stat.mtime,\n mtimeMs: stat.mtime.getTime(),\n ctimeMs: stat.mtime.getTime(),\n ino: 0,\n uid: 0,\n gid: 0,\n dev: 0,\n };\n}\n\nexport function createGitFs(fs: IFileSystem) {\n const promises = {\n async readFile(path: string, options?: { encoding?: string } | string) {\n try {\n const virtualPath = safePath(path);\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n return encoding ? fs.readFile(virtualPath, \"utf8\") : fs.readFileBuffer(virtualPath);\n } catch (error) {\n normalizeError(error);\n }\n },\n async writeFile(path: string, data: string | Uint8Array) {\n try {\n const virtualPath = safePath(path);\n await ensureParent(fs, virtualPath);\n await fs.writeFile(virtualPath, data);\n } catch (error) {\n normalizeError(error);\n }\n },\n async unlink(path: string) {\n try {\n await fs.rm(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async readdir(path: string) {\n try {\n return await fs.readdir(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async mkdir(path: string) {\n try {\n await fs.mkdir(safePath(path), { recursive: true });\n } catch (error) {\n normalizeError(error);\n }\n },\n async rmdir(path: string) {\n try {\n await fs.rm(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async rename(from: string, to: string) {\n try {\n await ensureParent(fs, safePath(to));\n await fs.mv(safePath(from), safePath(to));\n } catch (error) {\n normalizeError(error);\n }\n },\n async stat(path: string) {\n try {\n return statShape(await fs.stat(safePath(path)));\n } catch (error) {\n normalizeError(error);\n }\n },\n async lstat(path: string) {\n try {\n return statShape(await fs.lstat(safePath(path)));\n } catch (error) {\n normalizeError(error);\n }\n },\n async readlink(path: string) {\n try {\n return await fs.readlink(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async symlink(target: string, path: string) {\n try {\n await fs.symlink(target, safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async chmod(path: string, mode: number) {\n try {\n await fs.chmod(safePath(path), mode);\n } catch (error) {\n normalizeError(error);\n }\n },\n async utimes(path: string, atime: Date, mtime: Date) {\n try {\n await fs.utimes(safePath(path), atime, mtime);\n } catch (error) {\n normalizeError(error);\n }\n },\n };\n return { promises };\n}\n","import type { GitHttpRequest, HttpClient } from \"isomorphic-git\";\nimport type { CommandContext } from \"just-bash\";\n\nfunction isPrivateLiteralHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (host === \"localhost\" || host.endsWith(\".localhost\") || host === \"::1\") return true;\n const octets = host.split(\".\").map(Number);\n if (octets.length !== 4 || octets.some((octet) => !Number.isInteger(octet))) return false;\n return (\n octets[0] === 10 ||\n octets[0] === 127 ||\n (octets[0] === 169 && octets[1] === 254) ||\n (octets[0] === 172 && (octets[1] as number) >= 16 && (octets[1] as number) <= 31) ||\n (octets[0] === 192 && octets[1] === 168)\n );\n}\n\nexport function validateRemoteUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Only absolute HTTPS remote URLs are supported\");\n }\n if (url.protocol !== \"https:\") throw new Error(\"Only HTTPS remote URLs are supported\");\n if (url.username || url.password) throw new Error(\"Remote URLs must not contain credentials\");\n if (url.hash) throw new Error(\"Remote URLs must not contain fragments\");\n if (isPrivateLiteralHost(url.hostname)) {\n throw new Error(\"Remote URLs must not target local or private hosts\");\n }\n return url.toString();\n}\n\nasync function collectBody(\n body?: AsyncIterableIterator<Uint8Array>,\n signal?: AbortSignal,\n): Promise<Uint8Array> {\n if (!body) return new Uint8Array();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for await (const chunk of body) {\n if (signal?.aborted) throw new Error(\"Git operation was aborted\");\n chunks.push(chunk);\n size += chunk.byteLength;\n }\n const result = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return result;\n}\n\nasync function* oneChunk(body: Uint8Array): AsyncIterableIterator<Uint8Array> {\n yield body;\n}\n\nexport function createGitHttp(ctx: CommandContext): HttpClient {\n return {\n async request(request: GitHttpRequest) {\n if (!ctx.fetch) throw new Error(\"Network access is not configured for this sandbox\");\n if (ctx.signal?.aborted) throw new Error(\"Git operation was aborted\");\n const url = validateRemoteUrl(request.url);\n const bytes = await collectBody(request.body, ctx.signal);\n const response = await ctx.fetch(url, {\n method: request.method ?? \"GET\",\n headers: request.headers,\n // SecureFetch forwards BodyInit values unchanged, but its public type is narrower.\n body: bytes.length > 0 ? (bytes as unknown as string) : undefined,\n followRedirects: true,\n });\n if (ctx.signal?.aborted) throw new Error(\"Git operation was aborted\");\n const finalUrl = validateRemoteUrl(response.url);\n return {\n url: finalUrl,\n method: request.method,\n headers: response.headers,\n body: oneChunk(response.body),\n statusCode: response.status,\n statusMessage: response.statusText,\n };\n },\n };\n}\n","import { realpathSync, statSync } from \"node:fs\";\nimport { posix, resolve } from \"node:path\";\nimport { CliError } from \"../utils/errors.js\";\n\nconst SANDBOX_WORKSPACE_PATH = \"/workspace\";\n\nexport interface SandboxMount {\n hostPath: string;\n mountPoint: string;\n}\n\nfunction pathsOverlap(left: string, right: string): boolean {\n return (\n left === right || left.startsWith(`${right}/`) || right.startsWith(`${left}/`)\n );\n}\n\nfunction validateMountPoint(mountPoint: string): void {\n if (\n !posix.isAbsolute(mountPoint) ||\n mountPoint === \"/\" ||\n mountPoint.includes(\"\\\\\") ||\n mountPoint.includes(\"\\0\") ||\n posix.normalize(mountPoint) !== mountPoint\n ) {\n throw new CliError(\n `Mount point must be a normalized absolute sandbox path other than /: ${mountPoint}`,\n );\n }\n if (pathsOverlap(mountPoint, SANDBOX_WORKSPACE_PATH)) {\n throw new CliError(`Mount point must be outside ${SANDBOX_WORKSPACE_PATH}: ${mountPoint}`);\n }\n}\n\nexport function validateSandboxMounts(mounts: SandboxMount[]): SandboxMount[] {\n const validated: SandboxMount[] = [];\n for (const mount of mounts) {\n validateMountPoint(mount.mountPoint);\n\n let hostPath: string;\n try {\n hostPath = realpathSync(resolve(mount.hostPath));\n if (!statSync(hostPath).isDirectory()) {\n throw new Error(\"not a directory\");\n }\n } catch {\n throw new CliError(\n `Mount source does not exist or is not a directory: ${resolve(mount.hostPath)}`,\n );\n }\n\n const conflict = validated.find((candidate) =>\n pathsOverlap(candidate.mountPoint, mount.mountPoint),\n );\n if (conflict) {\n throw new CliError(\n `Mount points must not overlap: ${conflict.mountPoint} and ${mount.mountPoint}`,\n );\n }\n validated.push({ hostPath, mountPoint: mount.mountPoint });\n }\n return validated;\n}\n\nexport function parseSandboxMounts(specs: string[] = []): SandboxMount[] {\n const mounts = specs.map((spec) => {\n const separator = spec.lastIndexOf(\":\");\n if (separator <= 0 || separator === spec.length - 1) {\n throw new CliError(\n `Invalid mount ${JSON.stringify(spec)}. Expected <host-path>:<sandbox-path>`,\n );\n }\n return {\n hostPath: spec.slice(0, separator),\n mountPoint: spec.slice(separator + 1),\n };\n });\n return validateSandboxMounts(mounts);\n}\n","export class CliError extends Error {\n constructor(\n message: string,\n readonly exitCode = 1,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n","export const packageName = \"@getollie/cli\";\nexport const cliName = \"ollie\";\nexport const packageVersion = \"0.2.0\";\n\nexport type { CommandResult, Sandbox } from \"bash-tool\";\nexport type { ExecutorKind } from \"./config.js\";\nexport type {\n DelegatedTaskResult,\n ExecutorContext,\n ExecutorProvider,\n ExecutorSession,\n TaskDelegator,\n WorkspaceSyncResult,\n} from \"./executor/types.js\";\nexport type {\n CreateJustBashOptions,\n GitAuth,\n GitCommandOptions,\n SandboxMount,\n} from \"./sandbox/index.js\";\nexport {\n createJustBash,\n isJustBashAvailable,\n parseSandboxMounts,\n SANDBOX_WORKSPACE_PATH,\n validateSandboxMounts,\n} from \"./sandbox/index.js\";\n"],"mappings":"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","names":["realpathSync","statSync","posix","virtualPath","posix","branch","output","key","value","posix","posix","SANDBOX_WORKSPACE_PATH","realpathSync","statSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/sandbox/just-bash.ts","../src/utils/errors.ts","../src/sandbox/git/index.ts","../src/sandbox/git/fs-adapter.ts","../src/sandbox/git/http-adapter.ts","../src/sandbox/mounts.ts","../src/index.ts"],"sourcesContent":["import { realpathSync, statSync } from \"node:fs\";\nimport { Bash, InMemoryFs, MountableFs, ReadWriteFs } from \"just-bash\";\nimport { CliError } from \"../utils/errors.js\";\nimport { createGitCommand } from \"./git/index.js\";\nimport type { CreateJustBashOptions } from \"./git/types.js\";\nimport {\n sandboxPathContains,\n validateSandboxMounts,\n validateSandboxPath,\n} from \"./mounts.js\";\n\nexport const SANDBOX_WORKSPACE_PATH = \"/workspace\";\n\nfunction canonicalizeWorkspaceRoot(workspaceRoot: string): string {\n const canonicalRoot = realpathSync(workspaceRoot);\n if (!statSync(canonicalRoot).isDirectory()) {\n throw new Error(\"The sandbox workspace root must be a directory\");\n }\n return canonicalRoot;\n}\n\nfunction createWorkspaceFs(workspaceRoot: string, options: CreateJustBashOptions) {\n const root = canonicalizeWorkspaceRoot(workspaceRoot);\n const workspaceMountPoint = options.workspaceMountPoint ?? SANDBOX_WORKSPACE_PATH;\n validateSandboxPath(workspaceMountPoint, \"Workspace mount point\");\n const additionalMounts = validateSandboxMounts(options.mounts ?? [], {\n reservedMountPoint: workspaceMountPoint,\n }).map((mount) => ({\n mountPoint: mount.mountPoint,\n filesystem: new ReadWriteFs({ root: mount.hostPath, allowSymlinks: false }),\n }));\n return new MountableFs({\n base: new InMemoryFs(),\n mounts: [\n {\n mountPoint: workspaceMountPoint,\n filesystem: new ReadWriteFs({ root, allowSymlinks: false }),\n },\n ...additionalMounts,\n ],\n });\n}\n\nexport function createJustBash(workspaceRoot: string, options: CreateJustBashOptions = {}): Bash {\n const workspaceMountPoint = options.workspaceMountPoint ?? SANDBOX_WORKSPACE_PATH;\n const sandboxCwd = options.sandboxCwd ?? workspaceMountPoint;\n validateSandboxPath(sandboxCwd, \"Sandbox cwd\");\n const configuredMountPoints = [workspaceMountPoint, ...(options.mounts ?? []).map((m) => m.mountPoint)];\n if (!configuredMountPoints.some((mountPoint) => sandboxPathContains(mountPoint, sandboxCwd))) {\n throw new CliError(\n `Sandbox cwd ${sandboxCwd} is not contained by the primary workspace or any configured mount.`,\n );\n }\n return new Bash({\n fs: createWorkspaceFs(workspaceRoot, options),\n cwd: sandboxCwd,\n env: { HOME: \"/home/user\", TERM: \"xterm-256color\" },\n python: true,\n javascript: true,\n customCommands: options.git === false ? [] : [createGitCommand(options.git)],\n network: {\n dangerouslyAllowFullInternetAccess: true,\n maxResponseSize: 100 * 1024 * 1024,\n },\n });\n}\n\nexport async function isJustBashAvailable(): Promise<boolean> {\n try {\n const bash = new Bash();\n await bash.exec(\"echo ok\");\n return true;\n } catch {\n return false;\n }\n}\n","export class CliError extends Error {\n constructor(\n message: string,\n readonly exitCode = 1,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n","import { posix } from \"node:path\";\nimport { createTwoFilesPatch } from \"diff\";\nimport * as git from \"isomorphic-git\";\nimport { type CommandContext, defineCommand, type ExecResult } from \"just-bash\";\nimport { createGitFs } from \"./fs-adapter.js\";\nimport { createGitHttp, validateRemoteUrl } from \"./http-adapter.js\";\nimport type { GitCommandOptions, GitHandlerContext } from \"./types.js\";\n\nconst WORKSPACE = \"/workspace\";\nconst VERSION = \"ollie-git/0.1 (isomorphic-git)\";\nconst COMMANDS = [\n \"init\",\n \"clone\",\n \"status\",\n \"add\",\n \"commit\",\n \"log\",\n \"diff\",\n \"branch\",\n \"checkout\",\n \"remote\",\n \"config\",\n \"fetch\",\n \"pull\",\n \"push\",\n];\n\nclass UsageError extends Error {}\n\nfunction ok(stdout = \"\"): ExecResult {\n return { stdout, stderr: \"\", exitCode: 0 };\n}\n\nfunction usage(message?: string): never {\n throw new UsageError(message ?? \"unsupported arguments\");\n}\n\nfunction assertNotAborted(ctx: CommandContext): void {\n if (ctx.signal?.aborted) throw new Error(\"operation aborted\");\n}\n\nfunction virtualPath(ctx: CommandContext, input = \".\"): string {\n if (input.includes(\"\\0\") || input.includes(\"\\\\\")) throw new Error(\"invalid path\");\n const resolved = ctx.fs.resolvePath(ctx.cwd, input);\n if (resolved !== WORKSPACE && !resolved.startsWith(`${WORKSPACE}/`)) {\n throw new Error(\"path is outside /workspace\");\n }\n return resolved;\n}\n\nasync function repositoryDir(ctx: CommandContext): Promise<string> {\n let current = virtualPath(ctx);\n while (current === WORKSPACE || current.startsWith(`${WORKSPACE}/`)) {\n if (await ctx.fs.exists(posix.join(current, \".git\"))) return current;\n if (current === WORKSPACE) break;\n current = posix.dirname(current);\n }\n throw new Error(\"not a git repository (or any parent up to /workspace)\");\n}\n\nfunction optionValue(args: string[], names: string[]): { value?: string; rest: string[] } {\n let value: string | undefined;\n const rest: string[] = [];\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (arg && names.includes(arg)) {\n const next = args[++index];\n if (!next) usage(`${arg} requires a value`);\n value = next;\n } else if (arg && names.some((name) => arg.startsWith(`${name}=`))) {\n value = arg.slice(arg.indexOf(\"=\") + 1);\n } else if (arg) rest.push(arg);\n }\n return { value, rest };\n}\n\nfunction flag(args: string[], names: string[]): { enabled: boolean; rest: string[] } {\n let enabled = false;\n const rest = args.filter((arg) => {\n if (names.includes(arg)) {\n enabled = true;\n return false;\n }\n return true;\n });\n return { enabled, rest };\n}\n\nfunction rejectOptions(args: string[]): void {\n const unknown = args.find((arg) => arg.startsWith(\"-\"));\n if (unknown) usage(`unsupported option '${unknown}'`);\n}\n\nfunction positiveInteger(value: string | undefined, option: string): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) usage(`${option} requires a positive integer`);\n return parsed;\n}\n\nfunction authFor(context: GitHandlerContext, url?: string) {\n if (!url || !context.options.resolveAuth) return undefined;\n return async () => context.options.resolveAuth?.(url);\n}\n\nasync function remoteUrl(context: GitHandlerContext, dir: string, remote: string): Promise<string> {\n const value = await git.getConfig({ fs: context.fs, dir, path: `remote.${remote}.url` });\n if (!value) throw new Error(`remote '${remote}' has no URL`);\n return validateRemoteUrl(value);\n}\n\nconst GLOBAL_CONFIG_PATH = \"/home/user/.gitconfig\";\n\nasync function readGlobalConfig(ctx: CommandContext): Promise<Map<string, string>> {\n if (!(await ctx.fs.exists(GLOBAL_CONFIG_PATH))) return new Map();\n const values = new Map<string, string>();\n let section = \"\";\n for (const rawLine of (await ctx.fs.readFile(GLOBAL_CONFIG_PATH)).split(\"\\n\")) {\n const line = rawLine.trim();\n const sectionMatch = /^\\[([^\\]]+)\\]$/.exec(line);\n if (sectionMatch?.[1]) {\n section = sectionMatch[1].trim().toLowerCase();\n continue;\n }\n const valueMatch = /^([^=]+)=(.*)$/.exec(line);\n if (section && valueMatch?.[1] !== undefined && valueMatch[2] !== undefined) {\n values.set(`${section}.${valueMatch[1].trim().toLowerCase()}`, valueMatch[2].trim());\n }\n }\n return values;\n}\n\nasync function writeGlobalConfig(ctx: CommandContext, values: Map<string, string>): Promise<void> {\n const sections = new Map<string, Array<[string, string]>>();\n for (const [path, value] of [...values].sort(([left], [right]) => left.localeCompare(right))) {\n const separator = path.indexOf(\".\");\n if (separator < 1) usage(\"config key must contain a section\");\n const section = path.slice(0, separator);\n const name = path.slice(separator + 1);\n const entries = sections.get(section) ?? [];\n entries.push([name, value]);\n sections.set(section, entries);\n }\n const content = [...sections]\n .map(\n ([section, entries]) =>\n `[${section}]\\n${entries.map(([key, value]) => `\\t${key} = ${value}`).join(\"\\n\")}`,\n )\n .join(\"\\n\");\n await ctx.fs.mkdir(posix.dirname(GLOBAL_CONFIG_PATH), { recursive: true });\n await ctx.fs.writeFile(GLOBAL_CONFIG_PATH, content ? `${content}\\n` : \"\");\n}\n\nasync function handleInit(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const branchOpt = optionValue(args, [\"-b\", \"--initial-branch\"]);\n rejectOptions(branchOpt.rest);\n if (branchOpt.rest.length > 1) usage(\"git init accepts at most one directory\");\n const dir = virtualPath(context.command, branchOpt.rest[0]);\n await context.command.fs.mkdir(dir, { recursive: true }).catch(async () => {\n if (!(await context.command.fs.exists(dir)))\n throw new Error(\"cannot create repository directory\");\n });\n await git.init({ fs: context.fs, dir, defaultBranch: branchOpt.value ?? \"main\" });\n return ok(`Initialized empty Git repository in ${posix.join(dir, \".git\")}/\\n`);\n}\n\nasync function handleStatus(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const shortFlag = flag(args, [\"-s\", \"--short\", \"--porcelain\"]);\n rejectOptions(shortFlag.rest);\n if (shortFlag.rest.length) usage();\n const dir = await repositoryDir(context.command);\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n const lines = matrix\n .filter(([, head, workdir, stage]) => head !== workdir || workdir !== stage)\n .map(([path, head, workdir, stage]) => {\n let x = \" \";\n let y = \" \";\n if (head === 0 && stage !== 0) x = \"A\";\n else if (head !== stage) x = stage === 0 ? \"D\" : \"M\";\n if (workdir !== stage) y = workdir === 0 ? \"D\" : \"M\";\n if (head === 0 && stage === 0 && workdir !== 0) return `?? ${path}`;\n return `${x}${y} ${path}`;\n });\n if (shortFlag.enabled) return ok(lines.length ? `${lines.join(\"\\n\")}\\n` : \"\");\n const branch = (await git.currentBranch({ fs: context.fs, dir })) ?? \"HEAD detached\";\n return ok(\n `On branch ${branch}\\n${lines.length ? `${lines.join(\"\\n\")}\\n` : \"nothing to commit, working tree clean\\n\"}`,\n );\n}\n\nasync function handleAdd(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const separator = args.indexOf(\"--\");\n const optionArgs = separator < 0 ? args : args.slice(0, separator);\n const literalPaths = separator < 0 ? [] : args.slice(separator + 1);\n const allFlag = flag(optionArgs, [\"-A\", \"--all\"]);\n rejectOptions(allFlag.rest);\n const paths = [...allFlag.rest, ...literalPaths];\n if (!allFlag.enabled && paths.length === 0) usage(\"nothing specified\");\n const dir = await repositoryDir(context.command);\n const all = allFlag.enabled || paths.includes(\".\");\n if (all) {\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n for (const [filepath, , workdir, stage] of matrix) {\n assertNotAborted(context.command);\n if (workdir === stage) continue;\n if (workdir === 0) await git.remove({ fs: context.fs, dir, filepath });\n else await git.add({ fs: context.fs, dir, filepath });\n }\n } else {\n for (const filepath of paths) {\n if (\n filepath.startsWith(\"/\") ||\n filepath.split(\"/\").some((segment) => segment === \"..\" || segment === \".git\")\n )\n throw new Error(\"invalid pathspec\");\n await git.add({ fs: context.fs, dir, filepath });\n }\n }\n return ok();\n}\n\nfunction parseAuthor(value: string): { name: string; email: string } {\n const match = /^(.*?)\\s*<([^<>]+)>$/.exec(value);\n if (!match?.[1] || !match[2]) usage(\"--author must be 'Name <email>'\");\n return { name: match[1].trim(), email: match[2] };\n}\n\nasync function handleCommit(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const messageOpt = optionValue(args, [\"-m\", \"--message\"]);\n const authorOpt = optionValue(messageOpt.rest, [\"--author\"]);\n rejectOptions(authorOpt.rest);\n if (authorOpt.rest.length || !messageOpt.value) usage(\"git commit requires -m <message>\");\n const dir = await repositoryDir(context.command);\n const globalConfig = await readGlobalConfig(context.command);\n const repoName = await git.getConfig({ fs: context.fs, dir, path: \"user.name\" });\n const repoEmail = await git.getConfig({ fs: context.fs, dir, path: \"user.email\" });\n const configuredAuthor =\n repoName && repoEmail\n ? { name: repoName, email: repoEmail }\n : globalConfig.get(\"user.name\") && globalConfig.get(\"user.email\")\n ? {\n name: globalConfig.get(\"user.name\") as string,\n email: globalConfig.get(\"user.email\") as string,\n }\n : context.options.author;\n const author = authorOpt.value ? parseAuthor(authorOpt.value) : configuredAuthor;\n const matrix = await git.statusMatrix({ fs: context.fs, dir });\n if (!matrix.some(([, headStatus, , stageStatus]) => headStatus !== stageStatus)) {\n const message = matrix.some(([, , workdirStatus, stageStatus]) => workdirStatus !== stageStatus)\n ? \"no changes added to commit\"\n : \"nothing to commit, working tree clean\";\n throw new Error(message);\n }\n const oid = await git.commit({ fs: context.fs, dir, message: messageOpt.value, author });\n const branch = (await git.currentBranch({ fs: context.fs, dir })) ?? \"detached HEAD\";\n return ok(`[${branch} ${oid.slice(0, 7)}] ${messageOpt.value.split(\"\\n\")[0]}\\n`);\n}\n\nasync function handleLog(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const countOpt = optionValue(args, [\"-n\", \"--max-count\"]);\n const onelineFlag = flag(countOpt.rest, [\"--oneline\"]);\n rejectOptions(onelineFlag.rest);\n if (onelineFlag.rest.length > 1) usage();\n const depth = countOpt.value ? Number.parseInt(countOpt.value, 10) : 20;\n if (!Number.isFinite(depth) || depth < 1) usage(\"invalid max count\");\n const dir = await repositoryDir(context.command);\n const commits = await git.log({ fs: context.fs, dir, ref: onelineFlag.rest[0] ?? \"HEAD\", depth });\n if (onelineFlag.enabled) {\n return ok(\n commits\n .map((entry) => `${entry.oid.slice(0, 7)} ${entry.commit.message.split(\"\\n\")[0]}`)\n .join(\"\\n\") + (commits.length ? \"\\n\" : \"\"),\n );\n }\n return ok(\n commits\n .map(\n (entry) =>\n `commit ${entry.oid}\\nAuthor: ${entry.commit.author.name} <${entry.commit.author.email}>\\n\\n ${entry.commit.message.trim().replaceAll(\"\\n\", \"\\n \")}\\n`,\n )\n .join(\"\\n\"),\n );\n}\n\nasync function handleDiff(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const cachedFlag = flag(args, [\"--cached\", \"--staged\"]);\n rejectOptions(cachedFlag.rest);\n const dir = await repositoryDir(context.command);\n const selected = cachedFlag.rest.map((path) => path.replace(/^\\.\\//, \"\").replace(/\\/$/, \"\"));\n const decoder = new TextDecoder();\n const patch = (filepath: string, oldBytes: Uint8Array, newBytes: Uint8Array) => {\n if (oldBytes.includes(0) || newBytes.includes(0)) {\n return `Binary files a/${filepath} and b/${filepath} differ\\n`;\n }\n return createTwoFilesPatch(\n `a/${filepath}`,\n `b/${filepath}`,\n decoder.decode(oldBytes),\n decoder.decode(newBytes),\n \"\",\n \"\",\n { context: 3 },\n );\n };\n const matrix = await git.statusMatrix({\n fs: context.fs,\n dir,\n filepaths: selected.length ? selected : undefined,\n });\n const stageOids = new Map<string, string>();\n await git.walk({\n fs: context.fs,\n dir,\n trees: [git.STAGE()],\n map: async (filepath, [entry]) => {\n if (entry && (await entry.type()) !== \"tree\") stageOids.set(filepath, await entry.oid());\n },\n });\n const head = await git.resolveRef({ fs: context.fs, dir, ref: \"HEAD\" }).catch(() => undefined);\n const empty = new Uint8Array();\n const readStage = async (filepath: string) => {\n const oid = stageOids.get(filepath);\n return oid ? (await git.readBlob({ fs: context.fs, dir, oid })).blob : empty;\n };\n const patches: string[] = [];\n for (const [filepath, headStatus, workdirStatus, stageStatus] of matrix) {\n const changed = cachedFlag.enabled ? headStatus !== stageStatus : workdirStatus !== stageStatus;\n if (!changed) continue;\n const oldBytes = cachedFlag.enabled\n ? head && headStatus !== 0\n ? (await git.readBlob({ fs: context.fs, dir, oid: head, filepath })).blob\n : empty\n : await readStage(filepath);\n const newBytes = cachedFlag.enabled\n ? await readStage(filepath)\n : workdirStatus === 0\n ? empty\n : await context.command.fs.readFileBuffer(posix.join(dir, filepath));\n patches.push(patch(filepath, oldBytes, newBytes));\n }\n return ok(patches.join(\"\"));\n}\n\nasync function handleBranch(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const deleteFlag = flag(args, [\"-d\", \"-D\", \"--delete\"]);\n rejectOptions(deleteFlag.rest);\n const dir = await repositoryDir(context.command);\n if (deleteFlag.enabled) {\n if (deleteFlag.rest.length !== 1) usage(\"branch deletion requires one name\");\n await git.deleteBranch({ fs: context.fs, dir, ref: deleteFlag.rest[0] as string });\n return ok(`Deleted branch ${deleteFlag.rest[0]}.\\n`);\n }\n if (deleteFlag.rest.length) {\n if (deleteFlag.rest.length > 2) usage();\n await git.branch({\n fs: context.fs,\n dir,\n ref: deleteFlag.rest[0] as string,\n object: deleteFlag.rest[1],\n });\n return ok();\n }\n const [branches, current] = await Promise.all([\n git.listBranches({ fs: context.fs, dir }),\n git.currentBranch({ fs: context.fs, dir }),\n ]);\n return ok(\n branches.map((name) => `${name === current ? \"*\" : \" \"} ${name}`).join(\"\\n\") +\n (branches.length ? \"\\n\" : \"\"),\n );\n}\n\nasync function readCheckoutBlob(\n context: GitHandlerContext,\n dir: string,\n commitOid: string,\n filepath: string,\n): Promise<Uint8Array> {\n let treeOid = (await git.readCommit({ fs: context.fs, dir, oid: commitOid })).commit.tree;\n const segments = filepath.split(\"/\").filter(Boolean);\n for (let index = 0; index < segments.length; index++) {\n const entries = (await git.readTree({ fs: context.fs, dir, oid: treeOid })).tree;\n const entry = entries.find((candidate) => candidate.path === segments[index]);\n if (!entry) throw new Error(`path '${filepath}' does not exist in the selected ref`);\n if (entry.mode === \"120000\") throw new Error(\"symbolic links are not supported in the sandbox\");\n if (index === segments.length - 1) {\n if (entry.type !== \"blob\") throw new Error(`path '${filepath}' is not a file`);\n return (await git.readBlob({ fs: context.fs, dir, oid: entry.oid })).blob;\n }\n if (entry.type !== \"tree\") throw new Error(`path '${filepath}' is not a file`);\n treeOid = entry.oid;\n }\n throw new Error(\"invalid checkout path\");\n}\n\nasync function handleCheckout(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const separator = args.indexOf(\"--\");\n const commandArgs = separator >= 0 ? args.slice(0, separator) : args;\n const filepaths = separator >= 0 ? args.slice(separator + 1) : [];\n const createOpt = optionValue(commandArgs, [\"-b\"]);\n const forceFlag = flag(createOpt.rest, [\"-f\", \"--force\"]);\n rejectOptions(forceFlag.rest);\n const dir = await repositoryDir(context.command);\n if (filepaths.length) {\n if (createOpt.value || forceFlag.rest.length > 1) usage();\n if (filepaths.some((path) => path.startsWith(\"/\") || path.split(\"/\").includes(\"..\"))) {\n throw new Error(\"invalid checkout path\");\n }\n const ref = forceFlag.rest[0] ?? \"HEAD\";\n const oid = await git.resolveRef({ fs: context.fs, dir, ref });\n for (const filepath of filepaths) {\n const blob = await readCheckoutBlob(context, dir, oid, filepath);\n await context.command.fs.writeFile(posix.join(dir, filepath), blob);\n }\n return ok();\n }\n if (separator >= 0) usage(\"checkout requires at least one path after --\");\n if (createOpt.value) {\n if (forceFlag.rest.length > 1) usage();\n await git.branch({\n fs: context.fs,\n dir,\n ref: createOpt.value,\n object: forceFlag.rest[0],\n checkout: true,\n });\n await git.checkout({ fs: context.fs, dir, ref: createOpt.value, force: forceFlag.enabled });\n return ok(`Switched to a new branch '${createOpt.value}'\\n`);\n }\n if (forceFlag.rest.length !== 1) usage(\"checkout requires one branch or ref\");\n await git.checkout({ fs: context.fs, dir, ref: forceFlag.rest[0], force: forceFlag.enabled });\n return ok(`Switched to '${forceFlag.rest[0]}'\\n`);\n}\n\nasync function handleRemote(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const dir = await repositoryDir(context.command);\n if (!args.length || (args.length === 1 && args[0] === \"-v\")) {\n const remotes = await git.listRemotes({ fs: context.fs, dir });\n const verbose = args[0] === \"-v\";\n return ok(\n remotes\n .map(({ remote, url }) =>\n verbose ? `${remote}\\t${url} (fetch)\\n${remote}\\t${url} (push)` : remote,\n )\n .join(\"\\n\") + (remotes.length ? \"\\n\" : \"\"),\n );\n }\n const [action, name, value, ...rest] = args;\n if (rest.length || !name) usage();\n if (action === \"add\") {\n if (!value) usage(\"remote add requires a URL\");\n validateRemoteUrl(value);\n await git.addRemote({ fs: context.fs, dir, remote: name, url: value });\n return ok();\n }\n if (action === \"remove\" || action === \"rm\") {\n if (value) usage();\n await git.deleteRemote({ fs: context.fs, dir, remote: name });\n return ok();\n }\n if (action === \"get-url\") {\n if (value) usage();\n const url = await remoteUrl(context, dir, name);\n return ok(`${url}\\n`);\n }\n if (action === \"set-url\") {\n if (!value) usage();\n validateRemoteUrl(value);\n await git.setConfig({ fs: context.fs, dir, path: `remote.${name}.url`, value });\n return ok();\n }\n usage();\n}\n\nasync function handleConfig(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const globalFlag = flag(args, [\"--global\"]);\n const unsetFlag = flag(globalFlag.rest, [\"--unset\"]);\n const listFlag = flag(unsetFlag.rest, [\"--list\", \"-l\"]);\n rejectOptions(listFlag.rest);\n const globalValues = globalFlag.enabled ? await readGlobalConfig(context.command) : undefined;\n const dir = globalFlag.enabled ? undefined : await repositoryDir(context.command);\n if (listFlag.enabled) {\n if (listFlag.rest.length) usage();\n if (globalValues) {\n const output = [...globalValues].map(([key, value]) => `${key}=${value}`).join(\"\\n\");\n return ok(output ? `${output}\\n` : \"\");\n }\n const keys = [\"user.name\", \"user.email\", \"core.repositoryformatversion\", \"core.bare\"];\n const values = await Promise.all(\n keys.map(\n async (key) => [key, await git.getConfig({ fs: context.fs, dir, path: key })] as const,\n ),\n );\n const output = values\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n return ok(output ? `${output}\\n` : \"\");\n }\n const [key, value, ...rest] = listFlag.rest;\n if (rest.length || !key) usage();\n if (!key.includes(\".\")) usage(\"config key must contain a section\");\n if (globalValues) {\n if (unsetFlag.enabled) {\n if (value) usage();\n globalValues.delete(key.toLowerCase());\n await writeGlobalConfig(context.command, globalValues);\n return ok();\n }\n if (value === undefined) {\n const found = globalValues.get(key.toLowerCase());\n return found === undefined ? { stdout: \"\", stderr: \"\", exitCode: 1 } : ok(`${found}\\n`);\n }\n globalValues.set(key.toLowerCase(), value);\n await writeGlobalConfig(context.command, globalValues);\n return ok();\n }\n if (unsetFlag.enabled) {\n if (value) usage();\n await git.setConfig({ fs: context.fs, dir, path: key, value: undefined });\n return ok();\n }\n if (value === undefined) {\n const found = await git.getConfig({ fs: context.fs, dir, path: key });\n return found === undefined ? { stdout: \"\", stderr: \"\", exitCode: 1 } : ok(`${found}\\n`);\n }\n await git.setConfig({ fs: context.fs, dir, path: key, value });\n return ok();\n}\n\nasync function handleClone(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const branchOpt = optionValue(args, [\"-b\", \"--branch\"]);\n const depthOpt = optionValue(branchOpt.rest, [\"--depth\"]);\n const singleFlag = flag(depthOpt.rest, [\"--single-branch\"]);\n const noCheckoutFlag = flag(singleFlag.rest, [\"--no-checkout\"]);\n rejectOptions(noCheckoutFlag.rest);\n const [rawUrl, destination, ...rest] = noCheckoutFlag.rest;\n if (!rawUrl || rest.length) usage(\"clone requires a URL and optional directory\");\n const url = validateRemoteUrl(rawUrl);\n const inferred = posix.basename(new URL(url).pathname).replace(/\\.git$/, \"\") || \"repository\";\n const dir = virtualPath(context.command, destination ?? inferred);\n const depth = positiveInteger(depthOpt.value, \"--depth\");\n await git.clone({\n fs: context.fs,\n http: context.http,\n dir,\n url,\n ref: branchOpt.value,\n depth,\n singleBranch: singleFlag.enabled || Boolean(branchOpt.value),\n noCheckout: noCheckoutFlag.enabled,\n onAuth: authFor(context, url),\n });\n return ok(`Cloning into '${destination ?? inferred}'...\\n`);\n}\n\nasync function handleFetch(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const depthOpt = optionValue(args, [\"--depth\"]);\n rejectOptions(depthOpt.rest);\n if (depthOpt.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = depthOpt.rest[0] ?? \"origin\";\n const url = await remoteUrl(context, dir, remote);\n await git.fetch({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref: depthOpt.rest[1],\n depth: positiveInteger(depthOpt.value, \"--depth\"),\n onAuth: authFor(context, url),\n });\n return ok();\n}\n\nasync function handlePull(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const ffFlag = flag(args, [\"--ff-only\"]);\n rejectOptions(ffFlag.rest);\n if (ffFlag.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = ffFlag.rest[0] ?? \"origin\";\n const url = await remoteUrl(context, dir, remote);\n await git.pull({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref: ffFlag.rest[1],\n fastForwardOnly: true,\n // isomorphic-git requires an author even when fastForwardOnly prevents merge commits.\n author: context.options.author ?? { name: \"Ollie Git\", email: \"git@localhost\" },\n onAuth: authFor(context, url),\n });\n return ok(\"Already up to date or fast-forwarded.\\n\");\n}\n\nasync function handlePush(context: GitHandlerContext, args: string[]): Promise<ExecResult> {\n const forceFlag = flag(args, [\"--force\", \"-f\"]);\n const upstreamFlag = flag(forceFlag.rest, [\"--set-upstream\", \"-u\"]);\n rejectOptions(upstreamFlag.rest);\n if (upstreamFlag.rest.length > 2) usage();\n const dir = await repositoryDir(context.command);\n const remote = upstreamFlag.rest[0] ?? \"origin\";\n const ref = upstreamFlag.rest[1] ?? (await git.currentBranch({ fs: context.fs, dir }));\n if (!ref) throw new Error(\"cannot determine branch to push\");\n const url = await remoteUrl(context, dir, remote);\n const result = await git.push({\n fs: context.fs,\n http: context.http,\n dir,\n remote,\n ref,\n force: forceFlag.enabled,\n onAuth: authFor(context, url),\n });\n if (!result.ok) {\n const refError = Object.values(result.refs).find((status) => !status.ok)?.error;\n throw new Error(result.error ?? refError ?? \"remote rejected the push\");\n }\n if (upstreamFlag.enabled) {\n await git.setConfig({ fs: context.fs, dir, path: `branch.${ref}.remote`, value: remote });\n await git.setConfig({\n fs: context.fs,\n dir,\n path: `branch.${ref}.merge`,\n value: `refs/heads/${ref}`,\n });\n }\n return ok(`To ${url}\\n`);\n}\n\nconst handlers: Record<\n string,\n (context: GitHandlerContext, args: string[]) => Promise<ExecResult>\n> = {\n init: handleInit,\n clone: handleClone,\n status: handleStatus,\n add: handleAdd,\n commit: handleCommit,\n log: handleLog,\n diff: handleDiff,\n branch: handleBranch,\n checkout: handleCheckout,\n remote: handleRemote,\n config: handleConfig,\n fetch: handleFetch,\n pull: handlePull,\n push: handlePush,\n};\n\nfunction redact(message: string, secrets: Set<string>): string {\n let result = message\n .replace(/https:\\/\\/[^\\s/@]+@/g, \"https://\")\n .replaceAll(process.cwd(), \"<host>\");\n for (const secret of secrets) {\n if (secret) result = result.replaceAll(secret, \"<redacted>\");\n }\n return result;\n}\n\nexport function createGitCommand(options: GitCommandOptions = {}) {\n return defineCommand(\"git\", async (args, command) => {\n const secrets = new Set<string>();\n const safeOptions: GitCommandOptions = options.resolveAuth\n ? {\n ...options,\n resolveAuth: async (url) => {\n const auth = await options.resolveAuth?.(url);\n if (auth?.username) secrets.add(auth.username);\n if (auth?.password) secrets.add(auth.password);\n return auth;\n },\n }\n : options;\n try {\n if (!args.length || args[0] === \"help\" || args.includes(\"--help\")) {\n return ok(`usage: git <command> [options]\\n\\nSupported commands: ${COMMANDS.join(\", \")}\\n`);\n }\n if (args[0] === \"--version\" || args[0] === \"-v\") return ok(`${VERSION}\\n`);\n const subcommand = args[0];\n const handler = subcommand ? handlers[subcommand] : undefined;\n if (!handler) usage(`'${subcommand ?? \"\"}' is not a supported git command`);\n assertNotAborted(command);\n return await handler(\n {\n command,\n fs: createGitFs(command.fs),\n http: createGitHttp(command),\n options: safeOptions,\n },\n args.slice(1),\n );\n } catch (error) {\n const message = redact(\n error instanceof Error ? error.message : \"unknown Git failure\",\n secrets,\n );\n const exitCode =\n error instanceof UsageError\n ? 129\n : /not a git repository|NotFoundError/.test(message)\n ? 128\n : 1;\n return {\n stdout: \"\",\n stderr: `${error instanceof UsageError ? \"error\" : \"fatal\"}: ${message}\\n`,\n exitCode,\n };\n }\n });\n}\n\nexport type { CreateJustBashOptions, GitAuth, GitCommandOptions } from \"./types.js\";\n","import { posix } from \"node:path\";\nimport type { IFileSystem } from \"just-bash\";\n\nconst ROOT = \"/workspace\";\n\nfunction safePath(path: string): string {\n if (path.includes(\"\\0\") || path.includes(\"\\\\\")) {\n throw Object.assign(new Error(\"Invalid virtual Git path\"), { code: \"EINVAL\" });\n }\n const normalized = posix.resolve(path);\n if (normalized !== ROOT && !normalized.startsWith(`${ROOT}/`)) {\n throw Object.assign(new Error(\"Git path is outside /workspace\"), { code: \"EACCES\" });\n }\n return normalized;\n}\n\nfunction normalizeError(error: unknown): never {\n if (error instanceof Error) {\n const coded = error as Error & { code?: string };\n if (!coded.code) {\n if (/not found|does not exist|enoent/i.test(error.message)) coded.code = \"ENOENT\";\n else if (/exist/i.test(error.message)) coded.code = \"EEXIST\";\n else if (/directory/i.test(error.message)) coded.code = \"ENOTDIR\";\n else coded.code = \"EIO\";\n }\n throw coded;\n }\n throw Object.assign(new Error(\"Virtual filesystem operation failed\"), { code: \"EIO\" });\n}\n\nasync function ensureParent(fs: IFileSystem, path: string): Promise<void> {\n const parent = posix.dirname(path);\n if (!(await fs.exists(parent))) await fs.mkdir(parent, { recursive: true });\n}\n\nfunction statShape(stat: Awaited<ReturnType<IFileSystem[\"stat\"]>>) {\n const typeMode = stat.isDirectory ? 0o040000 : stat.isSymbolicLink ? 0o120000 : 0o100000;\n const mode = typeMode | (stat.mode & 0o7777);\n return {\n isFile: () => stat.isFile,\n isDirectory: () => stat.isDirectory,\n isSymbolicLink: () => stat.isSymbolicLink,\n mode,\n size: stat.size,\n mtime: stat.mtime,\n mtimeMs: stat.mtime.getTime(),\n ctimeMs: stat.mtime.getTime(),\n ino: 0,\n uid: 0,\n gid: 0,\n dev: 0,\n };\n}\n\nexport function createGitFs(fs: IFileSystem) {\n const promises = {\n async readFile(path: string, options?: { encoding?: string } | string) {\n try {\n const virtualPath = safePath(path);\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n return encoding ? fs.readFile(virtualPath, \"utf8\") : fs.readFileBuffer(virtualPath);\n } catch (error) {\n normalizeError(error);\n }\n },\n async writeFile(path: string, data: string | Uint8Array) {\n try {\n const virtualPath = safePath(path);\n await ensureParent(fs, virtualPath);\n await fs.writeFile(virtualPath, data);\n } catch (error) {\n normalizeError(error);\n }\n },\n async unlink(path: string) {\n try {\n await fs.rm(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async readdir(path: string) {\n try {\n return await fs.readdir(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async mkdir(path: string) {\n try {\n await fs.mkdir(safePath(path), { recursive: true });\n } catch (error) {\n normalizeError(error);\n }\n },\n async rmdir(path: string) {\n try {\n await fs.rm(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async rename(from: string, to: string) {\n try {\n await ensureParent(fs, safePath(to));\n await fs.mv(safePath(from), safePath(to));\n } catch (error) {\n normalizeError(error);\n }\n },\n async stat(path: string) {\n try {\n return statShape(await fs.stat(safePath(path)));\n } catch (error) {\n normalizeError(error);\n }\n },\n async lstat(path: string) {\n try {\n return statShape(await fs.lstat(safePath(path)));\n } catch (error) {\n normalizeError(error);\n }\n },\n async readlink(path: string) {\n try {\n return await fs.readlink(safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async symlink(target: string, path: string) {\n try {\n await fs.symlink(target, safePath(path));\n } catch (error) {\n normalizeError(error);\n }\n },\n async chmod(path: string, mode: number) {\n try {\n await fs.chmod(safePath(path), mode);\n } catch (error) {\n normalizeError(error);\n }\n },\n async utimes(path: string, atime: Date, mtime: Date) {\n try {\n await fs.utimes(safePath(path), atime, mtime);\n } catch (error) {\n normalizeError(error);\n }\n },\n };\n return { promises };\n}\n","import type { GitHttpRequest, HttpClient } from \"isomorphic-git\";\nimport type { CommandContext } from \"just-bash\";\n\nfunction isPrivateLiteralHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (host === \"localhost\" || host.endsWith(\".localhost\") || host === \"::1\") return true;\n const octets = host.split(\".\").map(Number);\n if (octets.length !== 4 || octets.some((octet) => !Number.isInteger(octet))) return false;\n return (\n octets[0] === 10 ||\n octets[0] === 127 ||\n (octets[0] === 169 && octets[1] === 254) ||\n (octets[0] === 172 && (octets[1] as number) >= 16 && (octets[1] as number) <= 31) ||\n (octets[0] === 192 && octets[1] === 168)\n );\n}\n\nexport function validateRemoteUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Only absolute HTTPS remote URLs are supported\");\n }\n if (url.protocol !== \"https:\") throw new Error(\"Only HTTPS remote URLs are supported\");\n if (url.username || url.password) throw new Error(\"Remote URLs must not contain credentials\");\n if (url.hash) throw new Error(\"Remote URLs must not contain fragments\");\n if (isPrivateLiteralHost(url.hostname)) {\n throw new Error(\"Remote URLs must not target local or private hosts\");\n }\n return url.toString();\n}\n\nasync function collectBody(\n body?: AsyncIterableIterator<Uint8Array>,\n signal?: AbortSignal,\n): Promise<Uint8Array> {\n if (!body) return new Uint8Array();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for await (const chunk of body) {\n if (signal?.aborted) throw new Error(\"Git operation was aborted\");\n chunks.push(chunk);\n size += chunk.byteLength;\n }\n const result = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return result;\n}\n\nasync function* oneChunk(body: Uint8Array): AsyncIterableIterator<Uint8Array> {\n yield body;\n}\n\nexport function createGitHttp(ctx: CommandContext): HttpClient {\n return {\n async request(request: GitHttpRequest) {\n if (!ctx.fetch) throw new Error(\"Network access is not configured for this sandbox\");\n if (ctx.signal?.aborted) throw new Error(\"Git operation was aborted\");\n const url = validateRemoteUrl(request.url);\n const bytes = await collectBody(request.body, ctx.signal);\n const response = await ctx.fetch(url, {\n method: request.method ?? \"GET\",\n headers: request.headers,\n // SecureFetch forwards BodyInit values unchanged, but its public type is narrower.\n body: bytes.length > 0 ? (bytes as unknown as string) : undefined,\n followRedirects: true,\n });\n if (ctx.signal?.aborted) throw new Error(\"Git operation was aborted\");\n const finalUrl = validateRemoteUrl(response.url);\n return {\n url: finalUrl,\n method: request.method,\n headers: response.headers,\n body: oneChunk(response.body),\n statusCode: response.status,\n statusMessage: response.statusText,\n };\n },\n };\n}\n","import { realpathSync, statSync } from \"node:fs\";\nimport { posix, resolve } from \"node:path\";\nimport { CliError } from \"../utils/errors.js\";\n\nconst SANDBOX_WORKSPACE_PATH = \"/workspace\";\n\nexport interface SandboxMount {\n hostPath: string;\n mountPoint: string;\n}\n\nexport function sandboxPathsOverlap(left: string, right: string): boolean {\n return left === right || left.startsWith(`${right}/`) || right.startsWith(`${left}/`);\n}\n\nexport function sandboxPathContains(parent: string, child: string): boolean {\n return parent === child || child.startsWith(`${parent}/`);\n}\n\nexport function validateSandboxPath(path: string, label = \"Sandbox path\"): string {\n if (\n !posix.isAbsolute(path) ||\n path.includes(\"\\\\\") ||\n path.includes(\"\\0\") ||\n path.split(\"/\").includes(\"..\") ||\n posix.normalize(path) !== path\n ) {\n throw new CliError(`${label} must be a normalized absolute sandbox path: ${path}`);\n }\n return path;\n}\n\nfunction validateMountPoint(mountPoint: string): void {\n validateSandboxPath(mountPoint, \"Mount point\");\n if (mountPoint === \"/\") {\n throw new CliError(`Mount point must be a normalized absolute sandbox path other than /: ${mountPoint}`);\n }\n}\n\nexport interface ValidateSandboxMountOptions {\n reservedMountPoint?: string | null;\n}\n\nexport function validateSandboxMounts(\n mounts: SandboxMount[],\n options: ValidateSandboxMountOptions = {},\n): SandboxMount[] {\n const reservedMountPoint =\n options.reservedMountPoint === undefined ? SANDBOX_WORKSPACE_PATH : options.reservedMountPoint;\n const validated: SandboxMount[] = [];\n for (const mount of mounts) {\n validateMountPoint(mount.mountPoint);\n if (reservedMountPoint && sandboxPathsOverlap(mount.mountPoint, reservedMountPoint)) {\n throw new CliError(`Mount point must be outside ${reservedMountPoint}: ${mount.mountPoint}`);\n }\n\n let hostPath: string;\n try {\n hostPath = realpathSync(resolve(mount.hostPath));\n if (!statSync(hostPath).isDirectory()) throw new Error(\"not a directory\");\n } catch {\n throw new CliError(\n `Mount source host path does not exist or is not a directory: ${resolve(mount.hostPath)}`,\n );\n }\n\n const conflict = validated.find((candidate) =>\n sandboxPathsOverlap(candidate.mountPoint, mount.mountPoint),\n );\n if (conflict) {\n throw new CliError(\n `Mount points must not overlap: ${conflict.mountPoint} and ${mount.mountPoint}`,\n );\n }\n validated.push({ hostPath, mountPoint: mount.mountPoint });\n }\n return validated;\n}\n\nexport function parseSandboxMounts(\n specs: string[] = [],\n options?: ValidateSandboxMountOptions,\n): SandboxMount[] {\n const mounts = specs.map((spec) => {\n const separator = spec.lastIndexOf(\":\");\n if (separator <= 0 || separator === spec.length - 1) {\n throw new CliError(\n `Invalid mount ${JSON.stringify(spec)}. Expected <host-path>:<sandbox-path>`,\n );\n }\n return { hostPath: spec.slice(0, separator), mountPoint: spec.slice(separator + 1) };\n });\n return validateSandboxMounts(mounts, options);\n}\n","export const packageName = \"@getollie/cli\";\nexport const cliName = \"ollie\";\nexport const packageVersion = \"0.2.0\";\n\nexport type { CommandResult, Sandbox } from \"bash-tool\";\nexport type { ExecutorKind } from \"./config.js\";\nexport type {\n DelegatedTaskResult,\n ExecutorContext,\n ExecutorProvider,\n ExecutorSession,\n TaskDelegator,\n WorkspaceSyncResult,\n} from \"./executor/types.js\";\nexport type {\n CreateJustBashOptions,\n GitAuth,\n GitCommandOptions,\n SandboxMount,\n} from \"./sandbox/index.js\";\nexport {\n createJustBash,\n isJustBashAvailable,\n parseSandboxMounts,\n SANDBOX_WORKSPACE_PATH,\n validateSandboxMounts,\n} from \"./sandbox/index.js\";\n"],"mappings":";;;AAAA,SAAS,gBAAAA,eAAc,YAAAC,iBAAgB;AACvC,SAAS,MAAM,YAAY,aAAa,mBAAmB;;;ACDpD,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACS,WAAW,GACpB;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;;;ACRA,SAAS,SAAAC,cAAa;AACtB,SAAS,2BAA2B;AACpC,YAAY,SAAS;AACrB,SAA8B,qBAAsC;;;ACHpE,SAAS,aAAa;AAGtB,IAAM,OAAO;AAEb,SAAS,SAAS,MAAsB;AACtC,MAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AAC9C,UAAM,OAAO,OAAO,IAAI,MAAM,0BAA0B,GAAG,EAAE,MAAM,SAAS,CAAC;AAAA,EAC/E;AACA,QAAM,aAAa,MAAM,QAAQ,IAAI;AACrC,MAAI,eAAe,QAAQ,CAAC,WAAW,WAAW,GAAG,IAAI,GAAG,GAAG;AAC7D,UAAM,OAAO,OAAO,IAAI,MAAM,gCAAgC,GAAG,EAAE,MAAM,SAAS,CAAC;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,iBAAiB,OAAO;AAC1B,UAAM,QAAQ;AACd,QAAI,CAAC,MAAM,MAAM;AACf,UAAI,mCAAmC,KAAK,MAAM,OAAO,EAAG,OAAM,OAAO;AAAA,eAChE,SAAS,KAAK,MAAM,OAAO,EAAG,OAAM,OAAO;AAAA,eAC3C,aAAa,KAAK,MAAM,OAAO,EAAG,OAAM,OAAO;AAAA,UACnD,OAAM,OAAO;AAAA,IACpB;AACA,UAAM;AAAA,EACR;AACA,QAAM,OAAO,OAAO,IAAI,MAAM,qCAAqC,GAAG,EAAE,MAAM,MAAM,CAAC;AACvF;AAEA,eAAe,aAAa,IAAiB,MAA6B;AACxE,QAAM,SAAS,MAAM,QAAQ,IAAI;AACjC,MAAI,CAAE,MAAM,GAAG,OAAO,MAAM,EAAI,OAAM,GAAG,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC5E;AAEA,SAAS,UAAU,MAAgD;AACjE,QAAM,WAAW,KAAK,cAAc,QAAW,KAAK,iBAAiB,QAAW;AAChF,QAAM,OAAO,WAAY,KAAK,OAAO;AACrC,SAAO;AAAA,IACL,QAAQ,MAAM,KAAK;AAAA,IACnB,aAAa,MAAM,KAAK;AAAA,IACxB,gBAAgB,MAAM,KAAK;AAAA,IAC3B;AAAA,IACA,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK,MAAM,QAAQ;AAAA,IAC5B,SAAS,KAAK,MAAM,QAAQ;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEO,SAAS,YAAY,IAAiB;AAC3C,QAAM,WAAW;AAAA,IACf,MAAM,SAAS,MAAc,SAA0C;AACrE,UAAI;AACF,cAAMC,eAAc,SAAS,IAAI;AACjC,cAAM,WAAW,OAAO,YAAY,WAAW,UAAU,SAAS;AAClE,eAAO,WAAW,GAAG,SAASA,cAAa,MAAM,IAAI,GAAG,eAAeA,YAAW;AAAA,MACpF,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,MAAc,MAA2B;AACvD,UAAI;AACF,cAAMA,eAAc,SAAS,IAAI;AACjC,cAAM,aAAa,IAAIA,YAAW;AAClC,cAAM,GAAG,UAAUA,cAAa,IAAI;AAAA,MACtC,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,MAAc;AACzB,UAAI;AACF,cAAM,GAAG,GAAG,SAAS,IAAI,CAAC;AAAA,MAC5B,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,MAAc;AAC1B,UAAI;AACF,eAAO,MAAM,GAAG,QAAQ,SAAS,IAAI,CAAC;AAAA,MACxC,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,MAAc;AACxB,UAAI;AACF,cAAM,GAAG,MAAM,SAAS,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MACpD,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,MAAc;AACxB,UAAI;AACF,cAAM,GAAG,GAAG,SAAS,IAAI,CAAC;AAAA,MAC5B,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,MAAc,IAAY;AACrC,UAAI;AACF,cAAM,aAAa,IAAI,SAAS,EAAE,CAAC;AACnC,cAAM,GAAG,GAAG,SAAS,IAAI,GAAG,SAAS,EAAE,CAAC;AAAA,MAC1C,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,KAAK,MAAc;AACvB,UAAI;AACF,eAAO,UAAU,MAAM,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,MAChD,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,MAAc;AACxB,UAAI;AACF,eAAO,UAAU,MAAM,GAAG,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,MACjD,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAc;AAC3B,UAAI;AACF,eAAO,MAAM,GAAG,SAAS,SAAS,IAAI,CAAC;AAAA,MACzC,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,QAAgB,MAAc;AAC1C,UAAI;AACF,cAAM,GAAG,QAAQ,QAAQ,SAAS,IAAI,CAAC;AAAA,MACzC,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,MAAc,MAAc;AACtC,UAAI;AACF,cAAM,GAAG,MAAM,SAAS,IAAI,GAAG,IAAI;AAAA,MACrC,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,MAAc,OAAa,OAAa;AACnD,UAAI;AACF,cAAM,GAAG,OAAO,SAAS,IAAI,GAAG,OAAO,KAAK;AAAA,MAC9C,SAAS,OAAO;AACd,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS;AACpB;;;ACvJA,SAAS,qBAAqB,UAA2B;AACvD,QAAM,OAAO,SAAS,YAAY,EAAE,QAAQ,YAAY,EAAE;AAC1D,MAAI,SAAS,eAAe,KAAK,SAAS,YAAY,KAAK,SAAS,MAAO,QAAO;AAClF,QAAM,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACzC,MAAI,OAAO,WAAW,KAAK,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,KAAK,CAAC,EAAG,QAAO;AACpF,SACE,OAAO,CAAC,MAAM,MACd,OAAO,CAAC,MAAM,OACb,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,OACnC,OAAO,CAAC,MAAM,OAAQ,OAAO,CAAC,KAAgB,MAAO,OAAO,CAAC,KAAgB,MAC7E,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM;AAExC;AAEO,SAAS,kBAAkB,OAAuB;AACvD,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,MAAI,IAAI,aAAa,SAAU,OAAM,IAAI,MAAM,sCAAsC;AACrF,MAAI,IAAI,YAAY,IAAI,SAAU,OAAM,IAAI,MAAM,0CAA0C;AAC5F,MAAI,IAAI,KAAM,OAAM,IAAI,MAAM,wCAAwC;AACtE,MAAI,qBAAqB,IAAI,QAAQ,GAAG;AACtC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,eAAe,YACb,MACA,QACqB;AACrB,MAAI,CAAC,KAAM,QAAO,IAAI,WAAW;AACjC,QAAM,SAAuB,CAAC;AAC9B,MAAI,OAAO;AACX,mBAAiB,SAAS,MAAM;AAC9B,QAAI,QAAQ,QAAS,OAAM,IAAI,MAAM,2BAA2B;AAChE,WAAO,KAAK,KAAK;AACjB,YAAQ,MAAM;AAAA,EAChB;AACA,QAAM,SAAS,IAAI,WAAW,IAAI;AAClC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,OAAO,MAAM;AACxB,cAAU,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAEA,gBAAgB,SAAS,MAAqD;AAC5E,QAAM;AACR;AAEO,SAAS,cAAc,KAAiC;AAC7D,SAAO;AAAA,IACL,MAAM,QAAQ,SAAyB;AACrC,UAAI,CAAC,IAAI,MAAO,OAAM,IAAI,MAAM,mDAAmD;AACnF,UAAI,IAAI,QAAQ,QAAS,OAAM,IAAI,MAAM,2BAA2B;AACpE,YAAM,MAAM,kBAAkB,QAAQ,GAAG;AACzC,YAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM,IAAI,MAAM;AACxD,YAAM,WAAW,MAAM,IAAI,MAAM,KAAK;AAAA,QACpC,QAAQ,QAAQ,UAAU;AAAA,QAC1B,SAAS,QAAQ;AAAA;AAAA,QAEjB,MAAM,MAAM,SAAS,IAAK,QAA8B;AAAA,QACxD,iBAAiB;AAAA,MACnB,CAAC;AACD,UAAI,IAAI,QAAQ,QAAS,OAAM,IAAI,MAAM,2BAA2B;AACpE,YAAM,WAAW,kBAAkB,SAAS,GAAG;AAC/C,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,SAAS,SAAS;AAAA,QAClB,MAAM,SAAS,SAAS,IAAI;AAAA,QAC5B,YAAY,SAAS;AAAA,QACrB,eAAe,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;AF5EA,IAAM,YAAY;AAClB,IAAM,UAAU;AAChB,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAN,cAAyB,MAAM;AAAC;AAEhC,SAAS,GAAG,SAAS,IAAgB;AACnC,SAAO,EAAE,QAAQ,QAAQ,IAAI,UAAU,EAAE;AAC3C;AAEA,SAAS,MAAM,SAAyB;AACtC,QAAM,IAAI,WAAW,WAAW,uBAAuB;AACzD;AAEA,SAAS,iBAAiB,KAA2B;AACnD,MAAI,IAAI,QAAQ,QAAS,OAAM,IAAI,MAAM,mBAAmB;AAC9D;AAEA,SAAS,YAAY,KAAqB,QAAQ,KAAa;AAC7D,MAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,cAAc;AAChF,QAAM,WAAW,IAAI,GAAG,YAAY,IAAI,KAAK,KAAK;AAClD,MAAI,aAAa,aAAa,CAAC,SAAS,WAAW,GAAG,SAAS,GAAG,GAAG;AACnE,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,eAAe,cAAc,KAAsC;AACjE,MAAI,UAAU,YAAY,GAAG;AAC7B,SAAO,YAAY,aAAa,QAAQ,WAAW,GAAG,SAAS,GAAG,GAAG;AACnE,QAAI,MAAM,IAAI,GAAG,OAAOC,OAAM,KAAK,SAAS,MAAM,CAAC,EAAG,QAAO;AAC7D,QAAI,YAAY,UAAW;AAC3B,cAAUA,OAAM,QAAQ,OAAO;AAAA,EACjC;AACA,QAAM,IAAI,MAAM,uDAAuD;AACzE;AAEA,SAAS,YAAY,MAAgB,OAAqD;AACxF,MAAI;AACJ,QAAM,OAAiB,CAAC;AACxB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,OAAO,MAAM,SAAS,GAAG,GAAG;AAC9B,YAAM,OAAO,KAAK,EAAE,KAAK;AACzB,UAAI,CAAC,KAAM,OAAM,GAAG,GAAG,mBAAmB;AAC1C,cAAQ;AAAA,IACV,WAAW,OAAO,MAAM,KAAK,CAAC,SAAS,IAAI,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG;AAClE,cAAQ,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,IACxC,WAAW,IAAK,MAAK,KAAK,GAAG;AAAA,EAC/B;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,SAAS,KAAK,MAAgB,OAAuD;AACnF,MAAI,UAAU;AACd,QAAM,OAAO,KAAK,OAAO,CAAC,QAAQ;AAChC,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,gBAAU;AACV,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AACtD,MAAI,QAAS,OAAM,uBAAuB,OAAO,GAAG;AACtD;AAEA,SAAS,gBAAgB,OAA2B,QAAoC;AACtF,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,EAAG,OAAM,GAAG,MAAM,8BAA8B;AAC/F,SAAO;AACT;AAEA,SAAS,QAAQ,SAA4B,KAAc;AACzD,MAAI,CAAC,OAAO,CAAC,QAAQ,QAAQ,YAAa,QAAO;AACjD,SAAO,YAAY,QAAQ,QAAQ,cAAc,GAAG;AACtD;AAEA,eAAe,UAAU,SAA4B,KAAa,QAAiC;AACjG,QAAM,QAAQ,MAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,UAAU,MAAM,OAAO,CAAC;AACvF,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,WAAW,MAAM,cAAc;AAC3D,SAAO,kBAAkB,KAAK;AAChC;AAEA,IAAM,qBAAqB;AAE3B,eAAe,iBAAiB,KAAmD;AACjF,MAAI,CAAE,MAAM,IAAI,GAAG,OAAO,kBAAkB,EAAI,QAAO,oBAAI,IAAI;AAC/D,QAAM,SAAS,oBAAI,IAAoB;AACvC,MAAI,UAAU;AACd,aAAW,YAAY,MAAM,IAAI,GAAG,SAAS,kBAAkB,GAAG,MAAM,IAAI,GAAG;AAC7E,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,eAAe,iBAAiB,KAAK,IAAI;AAC/C,QAAI,eAAe,CAAC,GAAG;AACrB,gBAAU,aAAa,CAAC,EAAE,KAAK,EAAE,YAAY;AAC7C;AAAA,IACF;AACA,UAAM,aAAa,iBAAiB,KAAK,IAAI;AAC7C,QAAI,WAAW,aAAa,CAAC,MAAM,UAAa,WAAW,CAAC,MAAM,QAAW;AAC3E,aAAO,IAAI,GAAG,OAAO,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,CAAC;AAAA,IACrF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAqB,QAA4C;AAChG,QAAM,WAAW,oBAAI,IAAqC;AAC1D,aAAW,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,GAAG;AAC5F,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,QAAI,YAAY,EAAG,OAAM,mCAAmC;AAC5D,UAAM,UAAU,KAAK,MAAM,GAAG,SAAS;AACvC,UAAM,OAAO,KAAK,MAAM,YAAY,CAAC;AACrC,UAAM,UAAU,SAAS,IAAI,OAAO,KAAK,CAAC;AAC1C,YAAQ,KAAK,CAAC,MAAM,KAAK,CAAC;AAC1B,aAAS,IAAI,SAAS,OAAO;AAAA,EAC/B;AACA,QAAM,UAAU,CAAC,GAAG,QAAQ,EACzB;AAAA,IACC,CAAC,CAAC,SAAS,OAAO,MAChB,IAAI,OAAO;AAAA,EAAM,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,IAAK,GAAG,MAAM,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EACpF,EACC,KAAK,IAAI;AACZ,QAAM,IAAI,GAAG,MAAMA,OAAM,QAAQ,kBAAkB,GAAG,EAAE,WAAW,KAAK,CAAC;AACzE,QAAM,IAAI,GAAG,UAAU,oBAAoB,UAAU,GAAG,OAAO;AAAA,IAAO,EAAE;AAC1E;AAEA,eAAe,WAAW,SAA4B,MAAqC;AACzF,QAAM,YAAY,YAAY,MAAM,CAAC,MAAM,kBAAkB,CAAC;AAC9D,gBAAc,UAAU,IAAI;AAC5B,MAAI,UAAU,KAAK,SAAS,EAAG,OAAM,wCAAwC;AAC7E,QAAM,MAAM,YAAY,QAAQ,SAAS,UAAU,KAAK,CAAC,CAAC;AAC1D,QAAM,QAAQ,QAAQ,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,YAAY;AACzE,QAAI,CAAE,MAAM,QAAQ,QAAQ,GAAG,OAAO,GAAG;AACvC,YAAM,IAAI,MAAM,oCAAoC;AAAA,EACxD,CAAC;AACD,QAAU,SAAK,EAAE,IAAI,QAAQ,IAAI,KAAK,eAAe,UAAU,SAAS,OAAO,CAAC;AAChF,SAAO,GAAG,uCAAuCA,OAAM,KAAK,KAAK,MAAM,CAAC;AAAA,CAAK;AAC/E;AAEA,eAAe,aAAa,SAA4B,MAAqC;AAC3F,QAAM,YAAY,KAAK,MAAM,CAAC,MAAM,WAAW,aAAa,CAAC;AAC7D,gBAAc,UAAU,IAAI;AAC5B,MAAI,UAAU,KAAK,OAAQ,OAAM;AACjC,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,SAAS,MAAU,iBAAa,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAC7D,QAAM,QAAQ,OACX,OAAO,CAAC,CAAC,EAAE,MAAM,SAAS,KAAK,MAAM,SAAS,WAAW,YAAY,KAAK,EAC1E,IAAI,CAAC,CAAC,MAAM,MAAM,SAAS,KAAK,MAAM;AACrC,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,SAAS,KAAK,UAAU,EAAG,KAAI;AAAA,aAC1B,SAAS,MAAO,KAAI,UAAU,IAAI,MAAM;AACjD,QAAI,YAAY,MAAO,KAAI,YAAY,IAAI,MAAM;AACjD,QAAI,SAAS,KAAK,UAAU,KAAK,YAAY,EAAG,QAAO,MAAM,IAAI;AACjE,WAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;AAAA,EACzB,CAAC;AACH,MAAI,UAAU,QAAS,QAAO,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,IAAO,EAAE;AAC5E,QAAMC,UAAU,MAAU,kBAAc,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAM;AACrE,SAAO;AAAA,IACL,aAAaA,OAAM;AAAA,EAAK,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,IAAO,yCAAyC;AAAA,EAC5G;AACF;AAEA,eAAe,UAAU,SAA4B,MAAqC;AACxF,QAAM,YAAY,KAAK,QAAQ,IAAI;AACnC,QAAM,aAAa,YAAY,IAAI,OAAO,KAAK,MAAM,GAAG,SAAS;AACjE,QAAM,eAAe,YAAY,IAAI,CAAC,IAAI,KAAK,MAAM,YAAY,CAAC;AAClE,QAAM,UAAU,KAAK,YAAY,CAAC,MAAM,OAAO,CAAC;AAChD,gBAAc,QAAQ,IAAI;AAC1B,QAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,GAAG,YAAY;AAC/C,MAAI,CAAC,QAAQ,WAAW,MAAM,WAAW,EAAG,OAAM,mBAAmB;AACrE,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,MAAM,QAAQ,WAAW,MAAM,SAAS,GAAG;AACjD,MAAI,KAAK;AACP,UAAM,SAAS,MAAU,iBAAa,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAC7D,eAAW,CAAC,UAAU,EAAE,SAAS,KAAK,KAAK,QAAQ;AACjD,uBAAiB,QAAQ,OAAO;AAChC,UAAI,YAAY,MAAO;AACvB,UAAI,YAAY,EAAG,OAAU,WAAO,EAAE,IAAI,QAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,UAChE,OAAU,QAAI,EAAE,IAAI,QAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,IACtD;AAAA,EACF,OAAO;AACL,eAAW,YAAY,OAAO;AAC5B,UACE,SAAS,WAAW,GAAG,KACvB,SAAS,MAAM,GAAG,EAAE,KAAK,CAAC,YAAY,YAAY,QAAQ,YAAY,MAAM;AAE5E,cAAM,IAAI,MAAM,kBAAkB;AACpC,YAAU,QAAI,EAAE,IAAI,QAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO,GAAG;AACZ;AAEA,SAAS,YAAY,OAAgD;AACnE,QAAM,QAAQ,uBAAuB,KAAK,KAAK;AAC/C,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAG,OAAM,iCAAiC;AACrE,SAAO,EAAE,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,MAAM,CAAC,EAAE;AAClD;AAEA,eAAe,aAAa,SAA4B,MAAqC;AAC3F,QAAM,aAAa,YAAY,MAAM,CAAC,MAAM,WAAW,CAAC;AACxD,QAAM,YAAY,YAAY,WAAW,MAAM,CAAC,UAAU,CAAC;AAC3D,gBAAc,UAAU,IAAI;AAC5B,MAAI,UAAU,KAAK,UAAU,CAAC,WAAW,MAAO,OAAM,kCAAkC;AACxF,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,eAAe,MAAM,iBAAiB,QAAQ,OAAO;AAC3D,QAAM,WAAW,MAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,YAAY,CAAC;AAC/E,QAAM,YAAY,MAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,aAAa,CAAC;AACjF,QAAM,mBACJ,YAAY,YACR,EAAE,MAAM,UAAU,OAAO,UAAU,IACnC,aAAa,IAAI,WAAW,KAAK,aAAa,IAAI,YAAY,IAC5D;AAAA,IACE,MAAM,aAAa,IAAI,WAAW;AAAA,IAClC,OAAO,aAAa,IAAI,YAAY;AAAA,EACtC,IACA,QAAQ,QAAQ;AACxB,QAAM,SAAS,UAAU,QAAQ,YAAY,UAAU,KAAK,IAAI;AAChE,QAAM,SAAS,MAAU,iBAAa,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAC7D,MAAI,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,MAAM,eAAe,WAAW,GAAG;AAC/E,UAAM,UAAU,OAAO,KAAK,CAAC,CAAC,EAAE,EAAE,eAAe,WAAW,MAAM,kBAAkB,WAAW,IAC3F,+BACA;AACJ,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,QAAM,MAAM,MAAU,WAAO,EAAE,IAAI,QAAQ,IAAI,KAAK,SAAS,WAAW,OAAO,OAAO,CAAC;AACvF,QAAMA,UAAU,MAAU,kBAAc,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAM;AACrE,SAAO,GAAG,IAAIA,OAAM,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,WAAW,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;AAAA,CAAI;AACjF;AAEA,eAAe,UAAU,SAA4B,MAAqC;AACxF,QAAM,WAAW,YAAY,MAAM,CAAC,MAAM,aAAa,CAAC;AACxD,QAAM,cAAc,KAAK,SAAS,MAAM,CAAC,WAAW,CAAC;AACrD,gBAAc,YAAY,IAAI;AAC9B,MAAI,YAAY,KAAK,SAAS,EAAG,OAAM;AACvC,QAAM,QAAQ,SAAS,QAAQ,OAAO,SAAS,SAAS,OAAO,EAAE,IAAI;AACrE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,OAAM,mBAAmB;AACnE,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,UAAU,MAAU,QAAI,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,KAAK,QAAQ,MAAM,CAAC;AAChG,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL,QACG,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,EAChF,KAAK,IAAI,KAAK,QAAQ,SAAS,OAAO;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AAAA,IACL,QACG;AAAA,MACC,CAAC,UACC,UAAU,MAAM,GAAG;AAAA,UAAa,MAAM,OAAO,OAAO,IAAI,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA;AAAA,MAAY,MAAM,OAAO,QAAQ,KAAK,EAAE,WAAW,MAAM,QAAQ,CAAC;AAAA;AAAA,IAC5J,EACC,KAAK,IAAI;AAAA,EACd;AACF;AAEA,eAAe,WAAW,SAA4B,MAAqC;AACzF,QAAM,aAAa,KAAK,MAAM,CAAC,YAAY,UAAU,CAAC;AACtD,gBAAc,WAAW,IAAI;AAC7B,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,WAAW,WAAW,KAAK,IAAI,CAAC,SAAS,KAAK,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE,CAAC;AAC3F,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,CAAC,UAAkB,UAAsB,aAAyB;AAC9E,QAAI,SAAS,SAAS,CAAC,KAAK,SAAS,SAAS,CAAC,GAAG;AAChD,aAAO,kBAAkB,QAAQ,UAAU,QAAQ;AAAA;AAAA,IACrD;AACA,WAAO;AAAA,MACL,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,QAAQ,OAAO,QAAQ;AAAA,MACvB,QAAQ,OAAO,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,MACA,EAAE,SAAS,EAAE;AAAA,IACf;AAAA,EACF;AACA,QAAM,SAAS,MAAU,iBAAa;AAAA,IACpC,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA,WAAW,SAAS,SAAS,WAAW;AAAA,EAC1C,CAAC;AACD,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAU,SAAK;AAAA,IACb,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA,OAAO,CAAK,UAAM,CAAC;AAAA,IACnB,KAAK,OAAO,UAAU,CAAC,KAAK,MAAM;AAChC,UAAI,SAAU,MAAM,MAAM,KAAK,MAAO,OAAQ,WAAU,IAAI,UAAU,MAAM,MAAM,IAAI,CAAC;AAAA,IACzF;AAAA,EACF,CAAC;AACD,QAAM,OAAO,MAAU,eAAW,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,OAAO,CAAC,EAAE,MAAM,MAAM,MAAS;AAC7F,QAAM,QAAQ,IAAI,WAAW;AAC7B,QAAM,YAAY,OAAO,aAAqB;AAC5C,UAAM,MAAM,UAAU,IAAI,QAAQ;AAClC,WAAO,OAAO,MAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO;AAAA,EACzE;AACA,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,UAAU,YAAY,eAAe,WAAW,KAAK,QAAQ;AACvE,UAAM,UAAU,WAAW,UAAU,eAAe,cAAc,kBAAkB;AACpF,QAAI,CAAC,QAAS;AACd,UAAM,WAAW,WAAW,UACxB,QAAQ,eAAe,KACpB,MAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,MAAM,SAAS,CAAC,GAAG,OACnE,QACF,MAAM,UAAU,QAAQ;AAC5B,UAAM,WAAW,WAAW,UACxB,MAAM,UAAU,QAAQ,IACxB,kBAAkB,IAChB,QACA,MAAM,QAAQ,QAAQ,GAAG,eAAeD,OAAM,KAAK,KAAK,QAAQ,CAAC;AACvE,YAAQ,KAAK,MAAM,UAAU,UAAU,QAAQ,CAAC;AAAA,EAClD;AACA,SAAO,GAAG,QAAQ,KAAK,EAAE,CAAC;AAC5B;AAEA,eAAe,aAAa,SAA4B,MAAqC;AAC3F,QAAM,aAAa,KAAK,MAAM,CAAC,MAAM,MAAM,UAAU,CAAC;AACtD,gBAAc,WAAW,IAAI;AAC7B,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,MAAI,WAAW,SAAS;AACtB,QAAI,WAAW,KAAK,WAAW,EAAG,OAAM,mCAAmC;AAC3E,UAAU,iBAAa,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,WAAW,KAAK,CAAC,EAAY,CAAC;AACjF,WAAO,GAAG,kBAAkB,WAAW,KAAK,CAAC,CAAC;AAAA,CAAK;AAAA,EACrD;AACA,MAAI,WAAW,KAAK,QAAQ;AAC1B,QAAI,WAAW,KAAK,SAAS,EAAG,OAAM;AACtC,UAAU,WAAO;AAAA,MACf,IAAI,QAAQ;AAAA,MACZ;AAAA,MACA,KAAK,WAAW,KAAK,CAAC;AAAA,MACtB,QAAQ,WAAW,KAAK,CAAC;AAAA,IAC3B,CAAC;AACD,WAAO,GAAG;AAAA,EACZ;AACA,QAAM,CAAC,UAAU,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,iBAAa,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAAA,IACpC,kBAAc,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAAA,EAC3C,CAAC;AACD,SAAO;AAAA,IACL,SAAS,IAAI,CAAC,SAAS,GAAG,SAAS,UAAU,MAAM,GAAG,IAAI,IAAI,EAAE,EAAE,KAAK,IAAI,KACxE,SAAS,SAAS,OAAO;AAAA,EAC9B;AACF;AAEA,eAAe,iBACb,SACA,KACA,WACA,UACqB;AACrB,MAAI,WAAW,MAAU,eAAW,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU,CAAC,GAAG,OAAO;AACrF,QAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACnD,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,UAAM,WAAW,MAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,QAAQ,CAAC,GAAG;AAC5E,UAAM,QAAQ,QAAQ,KAAK,CAAC,cAAc,UAAU,SAAS,SAAS,KAAK,CAAC;AAC5E,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,SAAS,QAAQ,sCAAsC;AACnF,QAAI,MAAM,SAAS,SAAU,OAAM,IAAI,MAAM,iDAAiD;AAC9F,QAAI,UAAU,SAAS,SAAS,GAAG;AACjC,UAAI,MAAM,SAAS,OAAQ,OAAM,IAAI,MAAM,SAAS,QAAQ,iBAAiB;AAC7E,cAAQ,MAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,GAAG;AAAA,IACvE;AACA,QAAI,MAAM,SAAS,OAAQ,OAAM,IAAI,MAAM,SAAS,QAAQ,iBAAiB;AAC7E,cAAU,MAAM;AAAA,EAClB;AACA,QAAM,IAAI,MAAM,uBAAuB;AACzC;AAEA,eAAe,eAAe,SAA4B,MAAqC;AAC7F,QAAM,YAAY,KAAK,QAAQ,IAAI;AACnC,QAAM,cAAc,aAAa,IAAI,KAAK,MAAM,GAAG,SAAS,IAAI;AAChE,QAAM,YAAY,aAAa,IAAI,KAAK,MAAM,YAAY,CAAC,IAAI,CAAC;AAChE,QAAM,YAAY,YAAY,aAAa,CAAC,IAAI,CAAC;AACjD,QAAM,YAAY,KAAK,UAAU,MAAM,CAAC,MAAM,SAAS,CAAC;AACxD,gBAAc,UAAU,IAAI;AAC5B,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,MAAI,UAAU,QAAQ;AACpB,QAAI,UAAU,SAAS,UAAU,KAAK,SAAS,EAAG,OAAM;AACxD,QAAI,UAAU,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI,CAAC,GAAG;AACpF,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,MAAM,UAAU,KAAK,CAAC,KAAK;AACjC,UAAM,MAAM,MAAU,eAAW,EAAE,IAAI,QAAQ,IAAI,KAAK,IAAI,CAAC;AAC7D,eAAW,YAAY,WAAW;AAChC,YAAM,OAAO,MAAM,iBAAiB,SAAS,KAAK,KAAK,QAAQ;AAC/D,YAAM,QAAQ,QAAQ,GAAG,UAAUA,OAAM,KAAK,KAAK,QAAQ,GAAG,IAAI;AAAA,IACpE;AACA,WAAO,GAAG;AAAA,EACZ;AACA,MAAI,aAAa,EAAG,OAAM,8CAA8C;AACxE,MAAI,UAAU,OAAO;AACnB,QAAI,UAAU,KAAK,SAAS,EAAG,OAAM;AACrC,UAAU,WAAO;AAAA,MACf,IAAI,QAAQ;AAAA,MACZ;AAAA,MACA,KAAK,UAAU;AAAA,MACf,QAAQ,UAAU,KAAK,CAAC;AAAA,MACxB,UAAU;AAAA,IACZ,CAAC;AACD,UAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU,OAAO,OAAO,UAAU,QAAQ,CAAC;AAC1F,WAAO,GAAG,6BAA6B,UAAU,KAAK;AAAA,CAAK;AAAA,EAC7D;AACA,MAAI,UAAU,KAAK,WAAW,EAAG,OAAM,qCAAqC;AAC5E,QAAU,aAAS,EAAE,IAAI,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC,GAAG,OAAO,UAAU,QAAQ,CAAC;AAC5F,SAAO,GAAG,gBAAgB,UAAU,KAAK,CAAC,CAAC;AAAA,CAAK;AAClD;AAEA,eAAe,aAAa,SAA4B,MAAqC;AAC3F,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,MAAI,CAAC,KAAK,UAAW,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,MAAO;AAC3D,UAAM,UAAU,MAAU,gBAAY,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AAC7D,UAAM,UAAU,KAAK,CAAC,MAAM;AAC5B,WAAO;AAAA,MACL,QACG;AAAA,QAAI,CAAC,EAAE,QAAQ,IAAI,MAClB,UAAU,GAAG,MAAM,IAAK,GAAG;AAAA,EAAa,MAAM,IAAK,GAAG,YAAY;AAAA,MACpE,EACC,KAAK,IAAI,KAAK,QAAQ,SAAS,OAAO;AAAA,IAC3C;AAAA,EACF;AACA,QAAM,CAAC,QAAQ,MAAM,OAAO,GAAG,IAAI,IAAI;AACvC,MAAI,KAAK,UAAU,CAAC,KAAM,OAAM;AAChC,MAAI,WAAW,OAAO;AACpB,QAAI,CAAC,MAAO,OAAM,2BAA2B;AAC7C,sBAAkB,KAAK;AACvB,UAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,QAAQ,MAAM,KAAK,MAAM,CAAC;AACrE,WAAO,GAAG;AAAA,EACZ;AACA,MAAI,WAAW,YAAY,WAAW,MAAM;AAC1C,QAAI,MAAO,OAAM;AACjB,UAAU,iBAAa,EAAE,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC5D,WAAO,GAAG;AAAA,EACZ;AACA,MAAI,WAAW,WAAW;AACxB,QAAI,MAAO,OAAM;AACjB,UAAM,MAAM,MAAM,UAAU,SAAS,KAAK,IAAI;AAC9C,WAAO,GAAG,GAAG,GAAG;AAAA,CAAI;AAAA,EACtB;AACA,MAAI,WAAW,WAAW;AACxB,QAAI,CAAC,MAAO,OAAM;AAClB,sBAAkB,KAAK;AACvB,UAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,UAAU,IAAI,QAAQ,MAAM,CAAC;AAC9E,WAAO,GAAG;AAAA,EACZ;AACA,QAAM;AACR;AAEA,eAAe,aAAa,SAA4B,MAAqC;AAC3F,QAAM,aAAa,KAAK,MAAM,CAAC,UAAU,CAAC;AAC1C,QAAM,YAAY,KAAK,WAAW,MAAM,CAAC,SAAS,CAAC;AACnD,QAAM,WAAW,KAAK,UAAU,MAAM,CAAC,UAAU,IAAI,CAAC;AACtD,gBAAc,SAAS,IAAI;AAC3B,QAAM,eAAe,WAAW,UAAU,MAAM,iBAAiB,QAAQ,OAAO,IAAI;AACpF,QAAM,MAAM,WAAW,UAAU,SAAY,MAAM,cAAc,QAAQ,OAAO;AAChF,MAAI,SAAS,SAAS;AACpB,QAAI,SAAS,KAAK,OAAQ,OAAM;AAChC,QAAI,cAAc;AAChB,YAAME,UAAS,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAACC,MAAKC,MAAK,MAAM,GAAGD,IAAG,IAAIC,MAAK,EAAE,EAAE,KAAK,IAAI;AACnF,aAAO,GAAGF,UAAS,GAAGA,OAAM;AAAA,IAAO,EAAE;AAAA,IACvC;AACA,UAAM,OAAO,CAAC,aAAa,cAAc,gCAAgC,WAAW;AACpF,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,KAAK;AAAA,QACH,OAAOC,SAAQ,CAACA,MAAK,MAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAMA,KAAI,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AACA,UAAM,SAAS,OACZ,OAAO,CAAC,CAAC,EAAEC,MAAK,MAAMA,WAAU,MAAS,EACzC,IAAI,CAAC,CAACD,MAAKC,MAAK,MAAM,GAAGD,IAAG,IAAIC,MAAK,EAAE,EACvC,KAAK,IAAI;AACZ,WAAO,GAAG,SAAS,GAAG,MAAM;AAAA,IAAO,EAAE;AAAA,EACvC;AACA,QAAM,CAAC,KAAK,OAAO,GAAG,IAAI,IAAI,SAAS;AACvC,MAAI,KAAK,UAAU,CAAC,IAAK,OAAM;AAC/B,MAAI,CAAC,IAAI,SAAS,GAAG,EAAG,OAAM,mCAAmC;AACjE,MAAI,cAAc;AAChB,QAAI,UAAU,SAAS;AACrB,UAAI,MAAO,OAAM;AACjB,mBAAa,OAAO,IAAI,YAAY,CAAC;AACrC,YAAM,kBAAkB,QAAQ,SAAS,YAAY;AACrD,aAAO,GAAG;AAAA,IACZ;AACA,QAAI,UAAU,QAAW;AACvB,YAAM,QAAQ,aAAa,IAAI,IAAI,YAAY,CAAC;AAChD,aAAO,UAAU,SAAY,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,EAAE,IAAI,GAAG,GAAG,KAAK;AAAA,CAAI;AAAA,IACxF;AACA,iBAAa,IAAI,IAAI,YAAY,GAAG,KAAK;AACzC,UAAM,kBAAkB,QAAQ,SAAS,YAAY;AACrD,WAAO,GAAG;AAAA,EACZ;AACA,MAAI,UAAU,SAAS;AACrB,QAAI,MAAO,OAAM;AACjB,UAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAK,OAAO,OAAU,CAAC;AACxE,WAAO,GAAG;AAAA,EACZ;AACA,MAAI,UAAU,QAAW;AACvB,UAAM,QAAQ,MAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC;AACpE,WAAO,UAAU,SAAY,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,EAAE,IAAI,GAAG,GAAG,KAAK;AAAA,CAAI;AAAA,EACxF;AACA,QAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC;AAC7D,SAAO,GAAG;AACZ;AAEA,eAAe,YAAY,SAA4B,MAAqC;AAC1F,QAAM,YAAY,YAAY,MAAM,CAAC,MAAM,UAAU,CAAC;AACtD,QAAM,WAAW,YAAY,UAAU,MAAM,CAAC,SAAS,CAAC;AACxD,QAAM,aAAa,KAAK,SAAS,MAAM,CAAC,iBAAiB,CAAC;AAC1D,QAAM,iBAAiB,KAAK,WAAW,MAAM,CAAC,eAAe,CAAC;AAC9D,gBAAc,eAAe,IAAI;AACjC,QAAM,CAAC,QAAQ,aAAa,GAAG,IAAI,IAAI,eAAe;AACtD,MAAI,CAAC,UAAU,KAAK,OAAQ,OAAM,6CAA6C;AAC/E,QAAM,MAAM,kBAAkB,MAAM;AACpC,QAAM,WAAWJ,OAAM,SAAS,IAAI,IAAI,GAAG,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,KAAK;AAChF,QAAM,MAAM,YAAY,QAAQ,SAAS,eAAe,QAAQ;AAChE,QAAM,QAAQ,gBAAgB,SAAS,OAAO,SAAS;AACvD,QAAU,UAAM;AAAA,IACd,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK,UAAU;AAAA,IACf;AAAA,IACA,cAAc,WAAW,WAAW,QAAQ,UAAU,KAAK;AAAA,IAC3D,YAAY,eAAe;AAAA,IAC3B,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B,CAAC;AACD,SAAO,GAAG,iBAAiB,eAAe,QAAQ;AAAA,CAAQ;AAC5D;AAEA,eAAe,YAAY,SAA4B,MAAqC;AAC1F,QAAM,WAAW,YAAY,MAAM,CAAC,SAAS,CAAC;AAC9C,gBAAc,SAAS,IAAI;AAC3B,MAAI,SAAS,KAAK,SAAS,EAAG,OAAM;AACpC,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,SAAS,SAAS,KAAK,CAAC,KAAK;AACnC,QAAM,MAAM,MAAM,UAAU,SAAS,KAAK,MAAM;AAChD,QAAU,UAAM;AAAA,IACd,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK,SAAS,KAAK,CAAC;AAAA,IACpB,OAAO,gBAAgB,SAAS,OAAO,SAAS;AAAA,IAChD,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B,CAAC;AACD,SAAO,GAAG;AACZ;AAEA,eAAe,WAAW,SAA4B,MAAqC;AACzF,QAAM,SAAS,KAAK,MAAM,CAAC,WAAW,CAAC;AACvC,gBAAc,OAAO,IAAI;AACzB,MAAI,OAAO,KAAK,SAAS,EAAG,OAAM;AAClC,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,SAAS,OAAO,KAAK,CAAC,KAAK;AACjC,QAAM,MAAM,MAAM,UAAU,SAAS,KAAK,MAAM;AAChD,QAAU,SAAK;AAAA,IACb,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,KAAK,OAAO,KAAK,CAAC;AAAA,IAClB,iBAAiB;AAAA;AAAA,IAEjB,QAAQ,QAAQ,QAAQ,UAAU,EAAE,MAAM,aAAa,OAAO,gBAAgB;AAAA,IAC9E,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B,CAAC;AACD,SAAO,GAAG,yCAAyC;AACrD;AAEA,eAAe,WAAW,SAA4B,MAAqC;AACzF,QAAM,YAAY,KAAK,MAAM,CAAC,WAAW,IAAI,CAAC;AAC9C,QAAM,eAAe,KAAK,UAAU,MAAM,CAAC,kBAAkB,IAAI,CAAC;AAClE,gBAAc,aAAa,IAAI;AAC/B,MAAI,aAAa,KAAK,SAAS,EAAG,OAAM;AACxC,QAAM,MAAM,MAAM,cAAc,QAAQ,OAAO;AAC/C,QAAM,SAAS,aAAa,KAAK,CAAC,KAAK;AACvC,QAAM,MAAM,aAAa,KAAK,CAAC,KAAM,MAAU,kBAAc,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC;AACpF,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAC3D,QAAM,MAAM,MAAM,UAAU,SAAS,KAAK,MAAM;AAChD,QAAM,SAAS,MAAU,SAAK;AAAA,IAC5B,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AAAA,IACjB,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,WAAW,OAAO,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG;AAC1E,UAAM,IAAI,MAAM,OAAO,SAAS,YAAY,0BAA0B;AAAA,EACxE;AACA,MAAI,aAAa,SAAS;AACxB,UAAU,cAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,MAAM,UAAU,GAAG,WAAW,OAAO,OAAO,CAAC;AACxF,UAAU,cAAU;AAAA,MAClB,IAAI,QAAQ;AAAA,MACZ;AAAA,MACA,MAAM,UAAU,GAAG;AAAA,MACnB,OAAO,cAAc,GAAG;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,SAAO,GAAG,MAAM,GAAG;AAAA,CAAI;AACzB;AAEA,IAAM,WAGF;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,SAAS,OAAO,SAAiB,SAA8B;AAC7D,MAAI,SAAS,QACV,QAAQ,wBAAwB,UAAU,EAC1C,WAAW,QAAQ,IAAI,GAAG,QAAQ;AACrC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAQ,UAAS,OAAO,WAAW,QAAQ,YAAY;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,UAA6B,CAAC,GAAG;AAChE,SAAO,cAAc,OAAO,OAAO,MAAM,YAAY;AACnD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,cAAiC,QAAQ,cAC3C;AAAA,MACE,GAAG;AAAA,MACH,aAAa,OAAO,QAAQ;AAC1B,cAAM,OAAO,MAAM,QAAQ,cAAc,GAAG;AAC5C,YAAI,MAAM,SAAU,SAAQ,IAAI,KAAK,QAAQ;AAC7C,YAAI,MAAM,SAAU,SAAQ,IAAI,KAAK,QAAQ;AAC7C,eAAO;AAAA,MACT;AAAA,IACF,IACA;AACJ,QAAI;AACF,UAAI,CAAC,KAAK,UAAU,KAAK,CAAC,MAAM,UAAU,KAAK,SAAS,QAAQ,GAAG;AACjE,eAAO,GAAG;AAAA;AAAA,sBAAyD,SAAS,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,MAC5F;AACA,UAAI,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,MAAM,KAAM,QAAO,GAAG,GAAG,OAAO;AAAA,CAAI;AACzE,YAAM,aAAa,KAAK,CAAC;AACzB,YAAM,UAAU,aAAa,SAAS,UAAU,IAAI;AACpD,UAAI,CAAC,QAAS,OAAM,IAAI,cAAc,EAAE,kCAAkC;AAC1E,uBAAiB,OAAO;AACxB,aAAO,MAAM;AAAA,QACX;AAAA,UACE;AAAA,UACA,IAAI,YAAY,QAAQ,EAAE;AAAA,UAC1B,MAAM,cAAc,OAAO;AAAA,UAC3B,SAAS;AAAA,QACX;AAAA,QACA,KAAK,MAAM,CAAC;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU;AAAA,QACd,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACzC;AAAA,MACF;AACA,YAAM,WACJ,iBAAiB,aACb,MACA,qCAAqC,KAAK,OAAO,IAC/C,MACA;AACR,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,GAAG,iBAAiB,aAAa,UAAU,OAAO,KAAK,OAAO;AAAA;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AGvsBA,SAAS,cAAc,gBAAgB;AACvC,SAAS,SAAAK,QAAO,eAAe;AAG/B,IAAM,yBAAyB;AAOxB,SAAS,oBAAoB,MAAc,OAAwB;AACxE,SAAO,SAAS,SAAS,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI,GAAG;AACtF;AAEO,SAAS,oBAAoB,QAAgB,OAAwB;AAC1E,SAAO,WAAW,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG;AAC1D;AAEO,SAAS,oBAAoB,MAAc,QAAQ,gBAAwB;AAChF,MACE,CAACC,OAAM,WAAW,IAAI,KACtB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,IAAI,KAClB,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI,KAC7BA,OAAM,UAAU,IAAI,MAAM,MAC1B;AACA,UAAM,IAAI,SAAS,GAAG,KAAK,gDAAgD,IAAI,EAAE;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,YAA0B;AACpD,sBAAoB,YAAY,aAAa;AAC7C,MAAI,eAAe,KAAK;AACtB,UAAM,IAAI,SAAS,wEAAwE,UAAU,EAAE;AAAA,EACzG;AACF;AAMO,SAAS,sBACd,QACA,UAAuC,CAAC,GACxB;AAChB,QAAM,qBACJ,QAAQ,uBAAuB,SAAY,yBAAyB,QAAQ;AAC9E,QAAM,YAA4B,CAAC;AACnC,aAAW,SAAS,QAAQ;AAC1B,uBAAmB,MAAM,UAAU;AACnC,QAAI,sBAAsB,oBAAoB,MAAM,YAAY,kBAAkB,GAAG;AACnF,YAAM,IAAI,SAAS,+BAA+B,kBAAkB,KAAK,MAAM,UAAU,EAAE;AAAA,IAC7F;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,aAAa,QAAQ,MAAM,QAAQ,CAAC;AAC/C,UAAI,CAAC,SAAS,QAAQ,EAAE,YAAY,EAAG,OAAM,IAAI,MAAM,iBAAiB;AAAA,IAC1E,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,gEAAgE,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACzF;AAAA,IACF;AAEA,UAAM,WAAW,UAAU;AAAA,MAAK,CAAC,cAC/B,oBAAoB,UAAU,YAAY,MAAM,UAAU;AAAA,IAC5D;AACA,QAAI,UAAU;AACZ,YAAM,IAAI;AAAA,QACR,kCAAkC,SAAS,UAAU,QAAQ,MAAM,UAAU;AAAA,MAC/E;AAAA,IACF;AACA,cAAU,KAAK,EAAE,UAAU,YAAY,MAAM,WAAW,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEO,SAAS,mBACd,QAAkB,CAAC,GACnB,SACgB;AAChB,QAAM,SAAS,MAAM,IAAI,CAAC,SAAS;AACjC,UAAM,YAAY,KAAK,YAAY,GAAG;AACtC,QAAI,aAAa,KAAK,cAAc,KAAK,SAAS,GAAG;AACnD,YAAM,IAAI;AAAA,QACR,iBAAiB,KAAK,UAAU,IAAI,CAAC;AAAA,MACvC;AAAA,IACF;AACA,WAAO,EAAE,UAAU,KAAK,MAAM,GAAG,SAAS,GAAG,YAAY,KAAK,MAAM,YAAY,CAAC,EAAE;AAAA,EACrF,CAAC;AACD,SAAO,sBAAsB,QAAQ,OAAO;AAC9C;;;ALlFO,IAAMC,0BAAyB;AAEtC,SAAS,0BAA0B,eAA+B;AAChE,QAAM,gBAAgBC,cAAa,aAAa;AAChD,MAAI,CAACC,UAAS,aAAa,EAAE,YAAY,GAAG;AAC1C,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,eAAuB,SAAgC;AAChF,QAAM,OAAO,0BAA0B,aAAa;AACpD,QAAM,sBAAsB,QAAQ,uBAAuBF;AAC3D,sBAAoB,qBAAqB,uBAAuB;AAChE,QAAM,mBAAmB,sBAAsB,QAAQ,UAAU,CAAC,GAAG;AAAA,IACnE,oBAAoB;AAAA,EACtB,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,IACjB,YAAY,MAAM;AAAA,IAClB,YAAY,IAAI,YAAY,EAAE,MAAM,MAAM,UAAU,eAAe,MAAM,CAAC;AAAA,EAC5E,EAAE;AACF,SAAO,IAAI,YAAY;AAAA,IACrB,MAAM,IAAI,WAAW;AAAA,IACrB,QAAQ;AAAA,MACN;AAAA,QACE,YAAY;AAAA,QACZ,YAAY,IAAI,YAAY,EAAE,MAAM,eAAe,MAAM,CAAC;AAAA,MAC5D;AAAA,MACA,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACH;AAEO,SAAS,eAAe,eAAuB,UAAiC,CAAC,GAAS;AAC/F,QAAM,sBAAsB,QAAQ,uBAAuBA;AAC3D,QAAM,aAAa,QAAQ,cAAc;AACzC,sBAAoB,YAAY,aAAa;AAC7C,QAAM,wBAAwB,CAAC,qBAAqB,IAAI,QAAQ,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACtG,MAAI,CAAC,sBAAsB,KAAK,CAAC,eAAe,oBAAoB,YAAY,UAAU,CAAC,GAAG;AAC5F,UAAM,IAAI;AAAA,MACR,eAAe,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,IAAI,KAAK;AAAA,IACd,IAAI,kBAAkB,eAAe,OAAO;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK,EAAE,MAAM,cAAc,MAAM,iBAAiB;AAAA,IAClD,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB,QAAQ,QAAQ,QAAQ,CAAC,IAAI,CAAC,iBAAiB,QAAQ,GAAG,CAAC;AAAA,IAC3E,SAAS;AAAA,MACP,oCAAoC;AAAA,MACpC,iBAAiB,MAAM,OAAO;AAAA,IAChC;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,sBAAwC;AAC5D,MAAI;AACF,UAAM,OAAO,IAAI,KAAK;AACtB,UAAM,KAAK,KAAK,SAAS;AACzB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AM3EO,IAAM,cAAc;AACpB,IAAM,UAAU;AAChB,IAAM,iBAAiB;","names":["realpathSync","statSync","posix","virtualPath","posix","branch","output","key","value","posix","posix","SANDBOX_WORKSPACE_PATH","realpathSync","statSync"]}
|