@heyditto/cli 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/teleport/api.d.ts +139 -0
- package/dist/teleport/api.js +61 -0
- package/dist/teleport/api.js.map +1 -0
- package/dist/teleport/bundle.d.ts +35 -0
- package/dist/teleport/bundle.js +102 -0
- package/dist/teleport/bundle.js.map +1 -0
- package/dist/teleport/chunks.d.ts +13 -0
- package/dist/teleport/chunks.js +57 -0
- package/dist/teleport/chunks.js.map +1 -0
- package/dist/teleport/commands.d.ts +74 -0
- package/dist/teleport/commands.js +488 -0
- package/dist/teleport/commands.js.map +1 -0
- package/dist/teleport/discover.d.ts +13 -0
- package/dist/teleport/discover.js +64 -0
- package/dist/teleport/discover.js.map +1 -0
- package/dist/teleport/git.d.ts +18 -0
- package/dist/teleport/git.js +41 -0
- package/dist/teleport/git.js.map +1 -0
- package/dist/teleport/harness.d.ts +29 -0
- package/dist/teleport/harness.js +121 -0
- package/dist/teleport/harness.js.map +1 -0
- package/dist/teleport/offload.d.ts +32 -0
- package/dist/teleport/offload.js +83 -0
- package/dist/teleport/offload.js.map +1 -0
- package/dist/teleport/pull.d.ts +12 -0
- package/dist/teleport/pull.js +118 -0
- package/dist/teleport/pull.js.map +1 -0
- package/dist/teleport/push.d.ts +49 -0
- package/dist/teleport/push.js +261 -0
- package/dist/teleport/push.js.map +1 -0
- package/dist/teleport/restore.d.ts +16 -0
- package/dist/teleport/restore.js +163 -0
- package/dist/teleport/restore.js.map +1 -0
- package/dist/teleport/storage.d.ts +53 -0
- package/dist/teleport/storage.js +43 -0
- package/dist/teleport/storage.js.map +1 -0
- package/dist/teleport/types.d.ts +100 -0
- package/dist/teleport/types.js +85 -0
- package/dist/teleport/types.js.map +1 -0
- package/dist/teleport/worktree.d.ts +22 -0
- package/dist/teleport/worktree.js +94 -0
- package/dist/teleport/worktree.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/teleport/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RootKind } from "./types.js";
|
|
2
|
+
export interface Discovery {
|
|
3
|
+
root: string;
|
|
4
|
+
kind: RootKind;
|
|
5
|
+
/** Repo directories relative to root ("." for a single-repo root). */
|
|
6
|
+
repos: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Finds the repositories under a root. A root that is itself a repository is a
|
|
10
|
+
* single-repo capsule; otherwise every `.git` up to `depth` levels down counts
|
|
11
|
+
* (worktrees are repositories too and are captured as such).
|
|
12
|
+
*/
|
|
13
|
+
export declare function discoverRepos(rootInput: string, depth?: number): Promise<Discovery>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { readdir, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isGitRepo, repoRoot } from "./git.js";
|
|
4
|
+
/** Directories never descended into while looking for repositories. */
|
|
5
|
+
const SKIP_DIRS = new Set([
|
|
6
|
+
"node_modules",
|
|
7
|
+
".venv",
|
|
8
|
+
"venv",
|
|
9
|
+
"target",
|
|
10
|
+
"dist",
|
|
11
|
+
"build",
|
|
12
|
+
".next",
|
|
13
|
+
".turbo",
|
|
14
|
+
".cache",
|
|
15
|
+
"__pycache__",
|
|
16
|
+
".git",
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Finds the repositories under a root. A root that is itself a repository is a
|
|
20
|
+
* single-repo capsule; otherwise every `.git` up to `depth` levels down counts
|
|
21
|
+
* (worktrees are repositories too and are captured as such).
|
|
22
|
+
*/
|
|
23
|
+
export async function discoverRepos(rootInput, depth = 3) {
|
|
24
|
+
const resolved = path.resolve(rootInput);
|
|
25
|
+
const info = await stat(resolved).catch(() => undefined);
|
|
26
|
+
if (!info?.isDirectory())
|
|
27
|
+
throw new Error(`not a directory: ${resolved}`);
|
|
28
|
+
// Canonicalize so a symlinked root (e.g. macOS /var → /private/var) matches
|
|
29
|
+
// git's own top-level path.
|
|
30
|
+
const root = await realpath(resolved).catch(() => resolved);
|
|
31
|
+
const top = repoRoot(root);
|
|
32
|
+
if (isGitRepo(root) && top && (await realpath(top).catch(() => top)) === root) {
|
|
33
|
+
return { root, kind: "repo", repos: ["."] };
|
|
34
|
+
}
|
|
35
|
+
const repos = [];
|
|
36
|
+
await walk(root, root, depth, repos);
|
|
37
|
+
repos.sort();
|
|
38
|
+
if (repos.length === 0) {
|
|
39
|
+
throw new Error(`no git repositories found under ${root} (searched ${depth} levels)`);
|
|
40
|
+
}
|
|
41
|
+
return { root, kind: "folder", repos };
|
|
42
|
+
}
|
|
43
|
+
async function walk(root, dir, depth, out) {
|
|
44
|
+
if (depth < 0)
|
|
45
|
+
return;
|
|
46
|
+
let entries;
|
|
47
|
+
try {
|
|
48
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const hasGit = entries.some((e) => e.name === ".git");
|
|
54
|
+
if (hasGit && dir !== root) {
|
|
55
|
+
out.push(path.relative(root, dir).split(path.sep).join("/"));
|
|
56
|
+
return; // nested repos inside a repo are submodules or vendored: leave them to their parent
|
|
57
|
+
}
|
|
58
|
+
for (const e of entries) {
|
|
59
|
+
if (!e.isDirectory() || SKIP_DIRS.has(e.name) || e.name.startsWith("."))
|
|
60
|
+
continue;
|
|
61
|
+
await walk(root, path.join(dir, e.name), depth - 1, out);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/teleport/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface GitResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
status: number | null;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
/** Runs git synchronously; never throws, callers check `ok`. */
|
|
8
|
+
export declare function git(args: string[], cwd: string, input?: string): GitResult;
|
|
9
|
+
export declare function gitOrThrow(args: string[], cwd: string, input?: string): string;
|
|
10
|
+
export declare function isGitRepo(dir: string): boolean;
|
|
11
|
+
/** Top-level directory of the repository containing `dir`. */
|
|
12
|
+
export declare function repoRoot(dir: string): string | undefined;
|
|
13
|
+
export declare function binaryAvailable(command: string): boolean;
|
|
14
|
+
/** Runs a command asynchronously with inherited env, resolving on exit. */
|
|
15
|
+
export declare function runAsync(command: string, args: string[], opts?: {
|
|
16
|
+
cwd?: string;
|
|
17
|
+
input?: string;
|
|
18
|
+
}): Promise<GitResult>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
/** Runs git synchronously; never throws, callers check `ok`. */
|
|
3
|
+
export function git(args, cwd, input) {
|
|
4
|
+
const res = spawnSync("git", args, { cwd, encoding: "utf8", input, maxBuffer: 256 * 1024 * 1024 });
|
|
5
|
+
return { ok: res.status === 0, status: res.status, stdout: res.stdout ?? "", stderr: res.stderr ?? "" };
|
|
6
|
+
}
|
|
7
|
+
export function gitOrThrow(args, cwd, input) {
|
|
8
|
+
const res = git(args, cwd, input);
|
|
9
|
+
if (!res.ok)
|
|
10
|
+
throw new Error(`git ${args.join(" ")} failed in ${cwd}: ${res.stderr.trim() || res.stdout.trim()}`);
|
|
11
|
+
return res.stdout;
|
|
12
|
+
}
|
|
13
|
+
export function isGitRepo(dir) {
|
|
14
|
+
const res = git(["rev-parse", "--is-inside-work-tree"], dir);
|
|
15
|
+
return res.ok && res.stdout.trim() === "true";
|
|
16
|
+
}
|
|
17
|
+
/** Top-level directory of the repository containing `dir`. */
|
|
18
|
+
export function repoRoot(dir) {
|
|
19
|
+
const res = git(["rev-parse", "--show-toplevel"], dir);
|
|
20
|
+
return res.ok ? res.stdout.trim() : undefined;
|
|
21
|
+
}
|
|
22
|
+
export function binaryAvailable(command) {
|
|
23
|
+
const probe = process.platform === "win32" ? "where" : "which";
|
|
24
|
+
return spawnSync(probe, [command], { stdio: "ignore" }).status === 0;
|
|
25
|
+
}
|
|
26
|
+
/** Runs a command asynchronously with inherited env, resolving on exit. */
|
|
27
|
+
export function runAsync(command, args, opts = {}) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const child = spawn(command, args, { cwd: opts.cwd, stdio: [opts.input === undefined ? "ignore" : "pipe", "pipe", "pipe"] });
|
|
30
|
+
let stdout = "";
|
|
31
|
+
let stderr = "";
|
|
32
|
+
child.stdout?.on("data", (c) => (stdout += c));
|
|
33
|
+
child.stderr?.on("data", (c) => (stderr += c));
|
|
34
|
+
child.on("error", reject);
|
|
35
|
+
child.on("close", (status) => resolve({ ok: status === 0, status, stdout, stderr }));
|
|
36
|
+
if (opts.input !== undefined) {
|
|
37
|
+
child.stdin?.end(opts.input);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/teleport/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Compression, type HarnessKind } from "./types.js";
|
|
2
|
+
/** Where a harness stores the session's transcript, relative to $HOME. */
|
|
3
|
+
export interface HarnessLocation {
|
|
4
|
+
kind: HarnessKind;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
/** Files to capture, absolute paths. */
|
|
7
|
+
files: string[];
|
|
8
|
+
/** Absolute directory the session is keyed under (Claude project dir). */
|
|
9
|
+
keyDir?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Locates Claude Code transcript files for a session recorded under `cwd`. */
|
|
12
|
+
export declare function locateClaude(sessionId: string, cwd: string): Promise<HarnessLocation | null>;
|
|
13
|
+
/** Locates a Codex rollout transcript by thread id. */
|
|
14
|
+
export declare function locateCodex(threadId: string): Promise<HarnessLocation | null>;
|
|
15
|
+
export declare function locateHarness(kind: HarnessKind, sessionId: string | undefined, cwd: string): Promise<HarnessLocation | null>;
|
|
16
|
+
export declare function pickCompression(): Compression;
|
|
17
|
+
/** Tars a harness's transcript files (as $HOME-relative paths) into `outFile`. */
|
|
18
|
+
export declare function captureHarness(loc: HarnessLocation, outFile: string, compression?: Compression): Promise<{
|
|
19
|
+
file: string;
|
|
20
|
+
compression: Compression;
|
|
21
|
+
} | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Restores a Claude transcript under a (possibly different) target cwd: extract
|
|
24
|
+
* to a temp home, then rewrite the project-dir slug and any embedded absolute
|
|
25
|
+
* cwd inside the jsonl so `claude --resume <id>` finds the session at the new
|
|
26
|
+
* path. Returns the restored session id.
|
|
27
|
+
*/
|
|
28
|
+
export declare function restoreClaudeTranscript(tarFile: string, compression: Compression, sessionId: string, originalCwd: string, targetCwd: string): Promise<void>;
|
|
29
|
+
export declare function fileSize(p: string): Promise<number>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { access, mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { binaryAvailable } from "./git.js";
|
|
6
|
+
import { cwdSlug } from "./types.js";
|
|
7
|
+
function claudeHome() {
|
|
8
|
+
return process.env.CLAUDE_CONFIG_DIR?.trim() || path.join(os.homedir(), ".claude");
|
|
9
|
+
}
|
|
10
|
+
function codexHome() {
|
|
11
|
+
return process.env.CODEX_HOME?.trim() || path.join(os.homedir(), ".codex");
|
|
12
|
+
}
|
|
13
|
+
/** Locates Claude Code transcript files for a session recorded under `cwd`. */
|
|
14
|
+
export async function locateClaude(sessionId, cwd) {
|
|
15
|
+
const projectDir = path.join(claudeHome(), "projects", cwdSlug(cwd));
|
|
16
|
+
const jsonl = path.join(projectDir, `${sessionId}.jsonl`);
|
|
17
|
+
if (!(await exists(jsonl)))
|
|
18
|
+
return null;
|
|
19
|
+
const files = [jsonl];
|
|
20
|
+
const subdir = path.join(projectDir, sessionId);
|
|
21
|
+
if (await exists(subdir)) {
|
|
22
|
+
for (const f of await walkFiles(subdir))
|
|
23
|
+
files.push(f);
|
|
24
|
+
}
|
|
25
|
+
return { kind: "claude-code", sessionId, files, keyDir: projectDir };
|
|
26
|
+
}
|
|
27
|
+
/** Locates a Codex rollout transcript by thread id. */
|
|
28
|
+
export async function locateCodex(threadId) {
|
|
29
|
+
const sessions = path.join(codexHome(), "sessions");
|
|
30
|
+
if (!(await exists(sessions)))
|
|
31
|
+
return null;
|
|
32
|
+
const matches = (await walkFiles(sessions)).filter((f) => f.endsWith(".jsonl") && path.basename(f).includes(threadId));
|
|
33
|
+
if (matches.length === 0)
|
|
34
|
+
return null;
|
|
35
|
+
return { kind: "codex", sessionId: threadId, files: matches };
|
|
36
|
+
}
|
|
37
|
+
export async function locateHarness(kind, sessionId, cwd) {
|
|
38
|
+
if (!sessionId)
|
|
39
|
+
return null;
|
|
40
|
+
if (kind === "claude-code")
|
|
41
|
+
return locateClaude(sessionId, cwd);
|
|
42
|
+
if (kind === "codex")
|
|
43
|
+
return locateCodex(sessionId);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
export function pickCompression() {
|
|
47
|
+
return binaryAvailable("zstd") ? "zstd" : "gzip";
|
|
48
|
+
}
|
|
49
|
+
/** Tars a harness's transcript files (as $HOME-relative paths) into `outFile`. */
|
|
50
|
+
export async function captureHarness(loc, outFile, compression = pickCompression()) {
|
|
51
|
+
const home = os.homedir();
|
|
52
|
+
const rel = loc.files.map((f) => path.relative(home, f)).filter((r) => !r.startsWith(".."));
|
|
53
|
+
if (rel.length === 0)
|
|
54
|
+
return null;
|
|
55
|
+
await mkdir(path.dirname(outFile), { recursive: true });
|
|
56
|
+
const flag = compression === "zstd" ? "--zstd" : "--gzip";
|
|
57
|
+
const res = spawnSync("tar", ["-c", flag, "-f", outFile, "-C", home, "--null", "-T", "-"], {
|
|
58
|
+
input: `${rel.join("\0")}\0`,
|
|
59
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
60
|
+
});
|
|
61
|
+
if (res.status !== 0)
|
|
62
|
+
throw new Error(`tar failed for harness state: ${res.stderr?.toString().trim()}`);
|
|
63
|
+
return { file: outFile, compression };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Restores a Claude transcript under a (possibly different) target cwd: extract
|
|
67
|
+
* to a temp home, then rewrite the project-dir slug and any embedded absolute
|
|
68
|
+
* cwd inside the jsonl so `claude --resume <id>` finds the session at the new
|
|
69
|
+
* path. Returns the restored session id.
|
|
70
|
+
*/
|
|
71
|
+
export async function restoreClaudeTranscript(tarFile, compression, sessionId, originalCwd, targetCwd) {
|
|
72
|
+
const home = os.homedir();
|
|
73
|
+
const flag = compression === "zstd" ? "--zstd" : "--gzip";
|
|
74
|
+
const res = spawnSync("tar", ["-x", flag, "-f", tarFile, "-C", home], { maxBuffer: 64 * 1024 * 1024 });
|
|
75
|
+
if (res.status !== 0)
|
|
76
|
+
throw new Error(`tar extract failed: ${res.stderr?.toString().trim()}`);
|
|
77
|
+
if (path.resolve(originalCwd) === path.resolve(targetCwd))
|
|
78
|
+
return;
|
|
79
|
+
const fromDir = path.join(claudeHome(), "projects", cwdSlug(originalCwd));
|
|
80
|
+
const toDir = path.join(claudeHome(), "projects", cwdSlug(targetCwd));
|
|
81
|
+
await mkdir(toDir, { recursive: true });
|
|
82
|
+
const fromJsonl = path.join(fromDir, `${sessionId}.jsonl`);
|
|
83
|
+
if (await exists(fromJsonl)) {
|
|
84
|
+
const rewritten = (await readFile(fromJsonl, "utf8")).split(originalCwd).join(targetCwd);
|
|
85
|
+
await writeFile(path.join(toDir, `${sessionId}.jsonl`), rewritten);
|
|
86
|
+
}
|
|
87
|
+
const fromSub = path.join(fromDir, sessionId);
|
|
88
|
+
if (await exists(fromSub)) {
|
|
89
|
+
for (const f of await walkFiles(fromSub)) {
|
|
90
|
+
const relFromSub = path.relative(fromSub, f);
|
|
91
|
+
const dest = path.join(toDir, sessionId, relFromSub);
|
|
92
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
93
|
+
await writeFile(dest, await readFile(f));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function exists(p) {
|
|
98
|
+
try {
|
|
99
|
+
await access(p);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function walkFiles(dir) {
|
|
107
|
+
const out = [];
|
|
108
|
+
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
109
|
+
for (const e of entries) {
|
|
110
|
+
const full = path.join(dir, e.name);
|
|
111
|
+
if (e.isDirectory())
|
|
112
|
+
out.push(...(await walkFiles(full)));
|
|
113
|
+
else if (e.isFile())
|
|
114
|
+
out.push(full);
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
export async function fileSize(p) {
|
|
119
|
+
return (await stat(p)).size;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/teleport/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as tapi from "./api.js";
|
|
2
|
+
export interface UnpushedRepo {
|
|
3
|
+
relPath: string;
|
|
4
|
+
branch: string | null;
|
|
5
|
+
ahead: number;
|
|
6
|
+
reason: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Repositories under `root` that hold work no remote has: commits ahead of an
|
|
10
|
+
* upstream, or a branch with no upstream at all. Offload refuses on these
|
|
11
|
+
* unless the user overrides, because deleting them loses the only copy.
|
|
12
|
+
*/
|
|
13
|
+
export declare function unpushedRepos(root: string): Promise<UnpushedRepo[]>;
|
|
14
|
+
export interface OffloadReadiness {
|
|
15
|
+
ready: boolean;
|
|
16
|
+
mirrors: tapi.MirrorStatus[];
|
|
17
|
+
}
|
|
18
|
+
/** Polls capsule status until every required mirror is complete + verified, or timeout. */
|
|
19
|
+
export declare function waitForOffloadReady(capsuleId: string, opts?: {
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
intervalMs?: number;
|
|
22
|
+
onPoll?: (s: tapi.CapsuleStatus) => void;
|
|
23
|
+
}): Promise<OffloadReadiness>;
|
|
24
|
+
/**
|
|
25
|
+
* Removes the local root once its capsule is verified. On macOS the root is
|
|
26
|
+
* moved into the user's Trash so it is trivially recoverable; elsewhere it is
|
|
27
|
+
* deleted. Never called unless `waitForOffloadReady` returned ready.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deleteLocalRoot(root: string): Promise<{
|
|
30
|
+
method: "trash" | "rm";
|
|
31
|
+
location?: string;
|
|
32
|
+
}>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { rename, rm, stat } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { git, isGitRepo } from "./git.js";
|
|
5
|
+
import * as tapi from "./api.js";
|
|
6
|
+
import { discoverRepos } from "./discover.js";
|
|
7
|
+
/**
|
|
8
|
+
* Repositories under `root` that hold work no remote has: commits ahead of an
|
|
9
|
+
* upstream, or a branch with no upstream at all. Offload refuses on these
|
|
10
|
+
* unless the user overrides, because deleting them loses the only copy.
|
|
11
|
+
*/
|
|
12
|
+
export async function unpushedRepos(root) {
|
|
13
|
+
const discovery = await discoverRepos(root);
|
|
14
|
+
const out = [];
|
|
15
|
+
for (const rel of discovery.repos) {
|
|
16
|
+
const dir = rel === "." ? discovery.root : path.join(discovery.root, rel);
|
|
17
|
+
if (!isGitRepo(dir))
|
|
18
|
+
continue;
|
|
19
|
+
const branchRes = git(["symbolic-ref", "--quiet", "--short", "HEAD"], dir);
|
|
20
|
+
const branch = branchRes.ok ? branchRes.stdout.trim() : null;
|
|
21
|
+
const upstream = branch ? git(["rev-parse", "--abbrev-ref", "@{u}"], dir) : undefined;
|
|
22
|
+
if (!branch) {
|
|
23
|
+
out.push({ relPath: rel, branch, ahead: 0, reason: "detached HEAD" });
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!upstream?.ok) {
|
|
27
|
+
const hasCommits = git(["rev-parse", "--verify", "HEAD"], dir).ok;
|
|
28
|
+
const configured = git(["config", `branch.${branch}.merge`], dir).ok;
|
|
29
|
+
if (hasCommits && configured) {
|
|
30
|
+
// Upstream is configured but its tracking ref is absent (a capsule
|
|
31
|
+
// restored without upstream tips, or a never-fetched remote): we
|
|
32
|
+
// cannot tell what is pushed, so refuse rather than guess.
|
|
33
|
+
out.push({ relPath: rel, branch, ahead: -1, reason: "tracking state unknown; fetch first or pass --allow-unpushed" });
|
|
34
|
+
}
|
|
35
|
+
else if (hasCommits) {
|
|
36
|
+
out.push({ relPath: rel, branch, ahead: 0, reason: "branch has no upstream" });
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const ahead = git(["rev-list", "--count", "@{u}..HEAD"], dir);
|
|
41
|
+
const n = ahead.ok ? Number(ahead.stdout.trim()) : 0;
|
|
42
|
+
if (n > 0)
|
|
43
|
+
out.push({ relPath: rel, branch, ahead: n, reason: `${n} commit(s) not on ${upstream.stdout.trim()}` });
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/** Polls capsule status until every required mirror is complete + verified, or timeout. */
|
|
48
|
+
export async function waitForOffloadReady(capsuleId, opts = {}) {
|
|
49
|
+
const timeout = opts.timeoutMs ?? 10 * 60_000;
|
|
50
|
+
const interval = opts.intervalMs ?? 5_000;
|
|
51
|
+
const deadline = Date.now() + timeout;
|
|
52
|
+
for (;;) {
|
|
53
|
+
const status = await tapi.capsuleStatus(capsuleId);
|
|
54
|
+
opts.onPoll?.(status);
|
|
55
|
+
if (status.offloadReady)
|
|
56
|
+
return { ready: true, mirrors: status.mirrors };
|
|
57
|
+
if (Date.now() >= deadline)
|
|
58
|
+
return { ready: false, mirrors: status.mirrors };
|
|
59
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Removes the local root once its capsule is verified. On macOS the root is
|
|
64
|
+
* moved into the user's Trash so it is trivially recoverable; elsewhere it is
|
|
65
|
+
* deleted. Never called unless `waitForOffloadReady` returned ready.
|
|
66
|
+
*/
|
|
67
|
+
export async function deleteLocalRoot(root) {
|
|
68
|
+
const resolved = path.resolve(root);
|
|
69
|
+
await stat(resolved); // throws if already gone
|
|
70
|
+
if (process.platform === "darwin") {
|
|
71
|
+
const trash = path.join(os.homedir(), ".Trash", `${path.basename(resolved)}-teleport-${Date.now()}`);
|
|
72
|
+
try {
|
|
73
|
+
await rename(resolved, trash);
|
|
74
|
+
return { method: "trash", location: trash };
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// cross-device rename into Trash can fail; fall back to rm
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await rm(resolved, { recursive: true, force: true });
|
|
81
|
+
return { method: "rm" };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=offload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offload.js","sourceRoot":"","sources":["../../src/teleport/offload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type RestoreResult } from "./restore.js";
|
|
2
|
+
/**
|
|
3
|
+
* Downloads a generation's chunks and rebuilds the capsule into `destRoot`.
|
|
4
|
+
* Chunks are verified by sha256 as they land; a mismatch aborts the pull.
|
|
5
|
+
*/
|
|
6
|
+
export declare function pullCapsule(capsuleId: string, generation: number | undefined, destRoot: string, opts?: {
|
|
7
|
+
restoreHarness?: boolean;
|
|
8
|
+
}): Promise<RestoreResult>;
|
|
9
|
+
/** Local record of a capsule's last generation, for thin bundles on the next push. */
|
|
10
|
+
export declare function manifestCachePath(configDir: string, capsuleId: string): string;
|
|
11
|
+
export declare function readCachedManifest(configDir: string, capsuleId: string): Promise<any>;
|
|
12
|
+
export declare function writeCachedManifest(configDir: string, capsuleId: string, manifest: unknown): Promise<void>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import * as tapi from "./api.js";
|
|
5
|
+
import { restoreCapsule } from "./restore.js";
|
|
6
|
+
const GET_CONCURRENCY = 4;
|
|
7
|
+
/**
|
|
8
|
+
* Downloads a generation's chunks and rebuilds the capsule into `destRoot`.
|
|
9
|
+
* Chunks are verified by sha256 as they land; a mismatch aborts the pull.
|
|
10
|
+
*/
|
|
11
|
+
export async function pullCapsule(capsuleId, generation, destRoot, opts = {}) {
|
|
12
|
+
const resolved = await tapi.resolveGeneration(capsuleId, generation);
|
|
13
|
+
const { manifest } = resolved;
|
|
14
|
+
const chunks = [...resolved.chunks];
|
|
15
|
+
await completePackChains(capsuleId, manifest, chunks);
|
|
16
|
+
const chunkDir = await mkdtemp(path.join(os.tmpdir(), "teleport-chunks-"));
|
|
17
|
+
try {
|
|
18
|
+
await downloadChunks(chunks, chunkDir);
|
|
19
|
+
return await restoreCapsule(manifest, (sha) => path.join(chunkDir, sha), destRoot, opts);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await rm(chunkDir, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fallback for manifests whose repos carry only thin packs (older pushes did
|
|
27
|
+
* not reference their basis packs): walk `basisGeneration` back through the
|
|
28
|
+
* capsule's generations until a full pack is found, prepending each basis
|
|
29
|
+
* generation's packs and chunk URLs so the restore has complete history.
|
|
30
|
+
*/
|
|
31
|
+
async function completePackChains(capsuleId, manifest, chunks) {
|
|
32
|
+
const known = new Set(chunks.map((c) => c.sha256));
|
|
33
|
+
const resolvedGenerations = new Map();
|
|
34
|
+
for (const repo of manifest.repos) {
|
|
35
|
+
let guard = 0;
|
|
36
|
+
while (!repo.packs.some((p) => p.kind === "full") && repo.packs.length > 0 && guard++ < 64) {
|
|
37
|
+
const oldest = repo.packs.reduce((a, b) => ((a.basisGeneration ?? 0) <= (b.basisGeneration ?? 0) ? a : b));
|
|
38
|
+
const basisGen = oldest.basisGeneration;
|
|
39
|
+
if (!basisGen)
|
|
40
|
+
break; // thin pack with no recorded basis: nothing more to fetch
|
|
41
|
+
let basis = resolvedGenerations.get(basisGen);
|
|
42
|
+
if (!basis) {
|
|
43
|
+
basis = await tapi.resolveGeneration(capsuleId, basisGen);
|
|
44
|
+
resolvedGenerations.set(basisGen, basis);
|
|
45
|
+
}
|
|
46
|
+
const basisRepo = basis.manifest.repos.find((r) => r.relPath === repo.relPath);
|
|
47
|
+
if (!basisRepo || basisRepo.packs.length === 0)
|
|
48
|
+
break;
|
|
49
|
+
const have = new Set(repo.packs.map((p) => p.chunks.map((c) => c.sha256).join(",")));
|
|
50
|
+
for (const pack of basisRepo.packs) {
|
|
51
|
+
if (have.has(pack.chunks.map((c) => c.sha256).join(",")))
|
|
52
|
+
continue;
|
|
53
|
+
repo.packs.unshift(pack);
|
|
54
|
+
for (const c of pack.chunks) {
|
|
55
|
+
if (known.has(c.sha256))
|
|
56
|
+
continue;
|
|
57
|
+
const url = basis.chunks.find((x) => x.sha256 === c.sha256);
|
|
58
|
+
if (url) {
|
|
59
|
+
chunks.push(url);
|
|
60
|
+
known.add(c.sha256);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function downloadChunks(chunks, dir) {
|
|
68
|
+
const { createHash } = await import("node:crypto");
|
|
69
|
+
let cursor = 0;
|
|
70
|
+
const workers = Array.from({ length: Math.min(GET_CONCURRENCY, chunks.length) }, async () => {
|
|
71
|
+
for (;;) {
|
|
72
|
+
const i = cursor++;
|
|
73
|
+
if (i >= chunks.length)
|
|
74
|
+
return;
|
|
75
|
+
const { sha256, getUrl } = chunks[i];
|
|
76
|
+
const dest = path.join(dir, sha256);
|
|
77
|
+
const buf = await getWithRetry(getUrl);
|
|
78
|
+
const got = createHash("sha256").update(buf).digest("hex");
|
|
79
|
+
if (got !== sha256)
|
|
80
|
+
throw new Error(`chunk ${sha256} failed integrity check (got ${got})`);
|
|
81
|
+
await writeFile(dest, buf);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
await Promise.all(workers);
|
|
85
|
+
}
|
|
86
|
+
async function getWithRetry(url, attempts = 4) {
|
|
87
|
+
let delay = 400;
|
|
88
|
+
for (let attempt = 1;; attempt++) {
|
|
89
|
+
const res = await fetch(url);
|
|
90
|
+
if (res.ok)
|
|
91
|
+
return Buffer.from(await res.arrayBuffer());
|
|
92
|
+
if (attempt >= attempts || (res.status < 500 && res.status !== 429)) {
|
|
93
|
+
throw new Error(`chunk download failed: HTTP ${res.status}`);
|
|
94
|
+
}
|
|
95
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
96
|
+
delay *= 2;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Local record of a capsule's last generation, for thin bundles on the next push. */
|
|
100
|
+
export function manifestCachePath(configDir, capsuleId) {
|
|
101
|
+
return path.join(configDir, "teleport", `${capsuleId}.json`);
|
|
102
|
+
}
|
|
103
|
+
export async function readCachedManifest(configDir, capsuleId) {
|
|
104
|
+
try {
|
|
105
|
+
return JSON.parse(await readFile(manifestCachePath(configDir, capsuleId), "utf8"));
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err.code === "ENOENT")
|
|
109
|
+
return undefined;
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export async function writeCachedManifest(configDir, capsuleId, manifest) {
|
|
114
|
+
const file = manifestCachePath(configDir, capsuleId);
|
|
115
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
116
|
+
await writeFile(file, `${JSON.stringify(manifest, null, 2)}\n`, { mode: 0o600 });
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=pull.js.map
|