@getollie/cli 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -14
- package/dist/cli.js +42 -125
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -9
- package/dist/index.js +11 -90
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,6 @@ export { CommandResult, Sandbox } from 'bash-tool';
|
|
|
3
3
|
import { ModelMessage } from 'ai';
|
|
4
4
|
import { Bash } from 'just-bash';
|
|
5
5
|
|
|
6
|
-
interface SandboxMount {
|
|
7
|
-
hostPath: string;
|
|
8
|
-
mountPoint: string;
|
|
9
|
-
}
|
|
10
|
-
declare function validateSandboxMounts(mounts: SandboxMount[]): SandboxMount[];
|
|
11
|
-
declare function parseSandboxMounts(specs?: string[]): SandboxMount[];
|
|
12
|
-
|
|
13
6
|
type ExecutorKind = "none" | "local" | "daytona";
|
|
14
7
|
|
|
15
8
|
interface ExecutorContext {
|
|
@@ -67,7 +60,6 @@ interface GitCommandOptions {
|
|
|
67
60
|
}
|
|
68
61
|
interface CreateJustBashOptions {
|
|
69
62
|
git?: GitCommandOptions | false;
|
|
70
|
-
mounts?: SandboxMount[];
|
|
71
63
|
}
|
|
72
64
|
|
|
73
65
|
declare const SANDBOX_WORKSPACE_PATH = "/workspace";
|
|
@@ -78,4 +70,4 @@ declare const packageName = "@getollie/cli";
|
|
|
78
70
|
declare const cliName = "ollie";
|
|
79
71
|
declare const packageVersion = "0.2.0";
|
|
80
72
|
|
|
81
|
-
export { type CreateJustBashOptions, type DelegatedTaskResult, type ExecutorContext, type ExecutorKind, type ExecutorProvider, type ExecutorSession, type GitAuth, type GitCommandOptions, SANDBOX_WORKSPACE_PATH, type
|
|
73
|
+
export { type CreateJustBashOptions, type DelegatedTaskResult, type ExecutorContext, type ExecutorKind, type ExecutorProvider, type ExecutorSession, type GitAuth, type GitCommandOptions, SANDBOX_WORKSPACE_PATH, type TaskDelegator, type WorkspaceSyncResult, cliName, createJustBash, isJustBashAvailable, packageName, packageVersion };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/sandbox/just-bash.ts
|
|
4
|
-
import { realpathSync
|
|
4
|
+
import { realpathSync, statSync } from "fs";
|
|
5
5
|
import { Bash, InMemoryFs, MountableFs, ReadWriteFs } from "just-bash";
|
|
6
6
|
|
|
7
7
|
// src/sandbox/git/index.ts
|
|
@@ -881,108 +881,31 @@ Supported commands: ${COMMANDS.join(", ")}
|
|
|
881
881
|
});
|
|
882
882
|
}
|
|
883
883
|
|
|
884
|
-
// src/sandbox/mounts.ts
|
|
885
|
-
import { realpathSync, statSync } from "fs";
|
|
886
|
-
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
|
-
var SANDBOX_WORKSPACE_PATH = "/workspace";
|
|
900
|
-
function pathsOverlap(left, right) {
|
|
901
|
-
return left === right || left.startsWith(`${right}/`) || right.startsWith(`${left}/`);
|
|
902
|
-
}
|
|
903
|
-
function validateMountPoint(mountPoint) {
|
|
904
|
-
if (!posix3.isAbsolute(mountPoint) || mountPoint === "/" || mountPoint.includes("\\") || mountPoint.includes("\0") || posix3.normalize(mountPoint) !== mountPoint) {
|
|
905
|
-
throw new CliError(
|
|
906
|
-
`Mount point must be a normalized absolute sandbox path other than /: ${mountPoint}`
|
|
907
|
-
);
|
|
908
|
-
}
|
|
909
|
-
if (pathsOverlap(mountPoint, SANDBOX_WORKSPACE_PATH)) {
|
|
910
|
-
throw new CliError(`Mount point must be outside ${SANDBOX_WORKSPACE_PATH}: ${mountPoint}`);
|
|
911
|
-
}
|
|
912
|
-
}
|
|
913
|
-
function validateSandboxMounts(mounts) {
|
|
914
|
-
const validated = [];
|
|
915
|
-
for (const mount of mounts) {
|
|
916
|
-
validateMountPoint(mount.mountPoint);
|
|
917
|
-
let hostPath;
|
|
918
|
-
try {
|
|
919
|
-
hostPath = realpathSync(resolve(mount.hostPath));
|
|
920
|
-
if (!statSync(hostPath).isDirectory()) {
|
|
921
|
-
throw new Error("not a directory");
|
|
922
|
-
}
|
|
923
|
-
} catch {
|
|
924
|
-
throw new CliError(
|
|
925
|
-
`Mount source does not exist or is not a directory: ${resolve(mount.hostPath)}`
|
|
926
|
-
);
|
|
927
|
-
}
|
|
928
|
-
const conflict = validated.find(
|
|
929
|
-
(candidate) => pathsOverlap(candidate.mountPoint, mount.mountPoint)
|
|
930
|
-
);
|
|
931
|
-
if (conflict) {
|
|
932
|
-
throw new CliError(
|
|
933
|
-
`Mount points must not overlap: ${conflict.mountPoint} and ${mount.mountPoint}`
|
|
934
|
-
);
|
|
935
|
-
}
|
|
936
|
-
validated.push({ hostPath, mountPoint: mount.mountPoint });
|
|
937
|
-
}
|
|
938
|
-
return validated;
|
|
939
|
-
}
|
|
940
|
-
function parseSandboxMounts(specs = []) {
|
|
941
|
-
const mounts = specs.map((spec) => {
|
|
942
|
-
const separator = spec.lastIndexOf(":");
|
|
943
|
-
if (separator <= 0 || separator === spec.length - 1) {
|
|
944
|
-
throw new CliError(
|
|
945
|
-
`Invalid mount ${JSON.stringify(spec)}. Expected <host-path>:<sandbox-path>`
|
|
946
|
-
);
|
|
947
|
-
}
|
|
948
|
-
return {
|
|
949
|
-
hostPath: spec.slice(0, separator),
|
|
950
|
-
mountPoint: spec.slice(separator + 1)
|
|
951
|
-
};
|
|
952
|
-
});
|
|
953
|
-
return validateSandboxMounts(mounts);
|
|
954
|
-
}
|
|
955
|
-
|
|
956
884
|
// src/sandbox/just-bash.ts
|
|
957
|
-
var
|
|
885
|
+
var SANDBOX_WORKSPACE_PATH = "/workspace";
|
|
958
886
|
function canonicalizeWorkspaceRoot(workspaceRoot) {
|
|
959
|
-
const canonicalRoot =
|
|
960
|
-
if (!
|
|
887
|
+
const canonicalRoot = realpathSync(workspaceRoot);
|
|
888
|
+
if (!statSync(canonicalRoot).isDirectory()) {
|
|
961
889
|
throw new Error("The sandbox workspace root must be a directory");
|
|
962
890
|
}
|
|
963
891
|
return canonicalRoot;
|
|
964
892
|
}
|
|
965
|
-
function createWorkspaceFs(workspaceRoot
|
|
893
|
+
function createWorkspaceFs(workspaceRoot) {
|
|
966
894
|
const root = canonicalizeWorkspaceRoot(workspaceRoot);
|
|
967
|
-
const additionalMounts = validateSandboxMounts(options.mounts ?? []).map((mount) => ({
|
|
968
|
-
mountPoint: mount.mountPoint,
|
|
969
|
-
filesystem: new ReadWriteFs({ root: mount.hostPath, allowSymlinks: false })
|
|
970
|
-
}));
|
|
971
895
|
return new MountableFs({
|
|
972
896
|
base: new InMemoryFs(),
|
|
973
897
|
mounts: [
|
|
974
898
|
{
|
|
975
|
-
mountPoint:
|
|
899
|
+
mountPoint: SANDBOX_WORKSPACE_PATH,
|
|
976
900
|
filesystem: new ReadWriteFs({ root, allowSymlinks: false })
|
|
977
|
-
}
|
|
978
|
-
...additionalMounts
|
|
901
|
+
}
|
|
979
902
|
]
|
|
980
903
|
});
|
|
981
904
|
}
|
|
982
905
|
function createJustBash(workspaceRoot, options = {}) {
|
|
983
906
|
return new Bash({
|
|
984
|
-
fs: createWorkspaceFs(workspaceRoot
|
|
985
|
-
cwd:
|
|
907
|
+
fs: createWorkspaceFs(workspaceRoot),
|
|
908
|
+
cwd: SANDBOX_WORKSPACE_PATH,
|
|
986
909
|
env: {
|
|
987
910
|
HOME: "/home/user",
|
|
988
911
|
TERM: "xterm-256color"
|
|
@@ -1011,13 +934,11 @@ var packageName = "@getollie/cli";
|
|
|
1011
934
|
var cliName = "ollie";
|
|
1012
935
|
var packageVersion = "0.2.0";
|
|
1013
936
|
export {
|
|
1014
|
-
|
|
937
|
+
SANDBOX_WORKSPACE_PATH,
|
|
1015
938
|
cliName,
|
|
1016
939
|
createJustBash,
|
|
1017
940
|
isJustBashAvailable,
|
|
1018
941
|
packageName,
|
|
1019
|
-
packageVersion
|
|
1020
|
-
parseSandboxMounts,
|
|
1021
|
-
validateSandboxMounts
|
|
942
|
+
packageVersion
|
|
1022
943
|
};
|
|
1023
944
|
//# sourceMappingURL=index.js.map
|
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/sandbox/git/index.ts","../src/sandbox/git/fs-adapter.ts","../src/sandbox/git/http-adapter.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\";\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) {\n const root = canonicalizeWorkspaceRoot(workspaceRoot);\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 ],\n });\n}\n\nexport function createJustBash(workspaceRoot: string, options: CreateJustBashOptions = {}): Bash {\n return new Bash({\n fs: createWorkspaceFs(workspaceRoot),\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","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 { CreateJustBashOptions, GitAuth, GitCommandOptions } from \"./sandbox/index.js\";\nexport { createJustBash, isJustBashAvailable, SANDBOX_WORKSPACE_PATH } from \"./sandbox/index.js\";\n"],"mappings":"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","names":["posix","virtualPath","posix","branch","output","key","value"]}
|