@lore-co/cli 0.1.28 → 0.1.30
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 +48 -9
- package/dist/agents.d.ts +3 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +31 -7
- package/dist/agents.js.map +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -15
- package/dist/cli.js.map +1 -1
- package/dist/command-help.d.ts +2 -1
- package/dist/command-help.d.ts.map +1 -1
- package/dist/command-help.js +33 -6
- package/dist/command-help.js.map +1 -1
- package/dist/generated-assets.d.ts +9 -4
- package/dist/generated-assets.d.ts.map +1 -1
- package/dist/generated-assets.js +5 -4
- package/dist/generated-assets.js.map +1 -1
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +7 -1
- package/dist/guard.js.map +1 -1
- package/dist/image-capture.d.ts.map +1 -1
- package/dist/image-capture.js +8 -3
- package/dist/image-capture.js.map +1 -1
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +40 -20
- package/dist/live.js.map +1 -1
- package/dist/recovery-cloud-receipt.d.ts +24 -0
- package/dist/recovery-cloud-receipt.d.ts.map +1 -0
- package/dist/recovery-cloud-receipt.js +78 -0
- package/dist/recovery-cloud-receipt.js.map +1 -0
- package/dist/recovery-cloud-workspace.d.ts +11 -0
- package/dist/recovery-cloud-workspace.d.ts.map +1 -0
- package/dist/recovery-cloud-workspace.js +141 -0
- package/dist/recovery-cloud-workspace.js.map +1 -0
- package/dist/recovery-cloud.d.ts +31 -0
- package/dist/recovery-cloud.d.ts.map +1 -0
- package/dist/recovery-cloud.js +242 -0
- package/dist/recovery-cloud.js.map +1 -0
- package/dist/recovery-codex.d.ts +5 -0
- package/dist/recovery-codex.d.ts.map +1 -0
- package/dist/recovery-codex.js +111 -0
- package/dist/recovery-codex.js.map +1 -0
- package/dist/recovery-copilot.d.ts +14 -0
- package/dist/recovery-copilot.d.ts.map +1 -0
- package/dist/recovery-copilot.js +120 -0
- package/dist/recovery-copilot.js.map +1 -0
- package/dist/recovery-desktop.d.ts +7 -0
- package/dist/recovery-desktop.d.ts.map +1 -0
- package/dist/recovery-desktop.js +179 -0
- package/dist/recovery-desktop.js.map +1 -0
- package/dist/recovery-external.d.ts +61 -0
- package/dist/recovery-external.d.ts.map +1 -0
- package/dist/recovery-external.js +98 -0
- package/dist/recovery-external.js.map +1 -0
- package/dist/recovery-hooks.d.ts +5 -0
- package/dist/recovery-hooks.d.ts.map +1 -0
- package/dist/recovery-hooks.js +115 -0
- package/dist/recovery-hooks.js.map +1 -0
- package/dist/recovery-hosts.d.ts +13 -0
- package/dist/recovery-hosts.d.ts.map +1 -0
- package/dist/recovery-hosts.js +326 -0
- package/dist/recovery-hosts.js.map +1 -0
- package/dist/recovery-polytoken.d.ts +14 -0
- package/dist/recovery-polytoken.d.ts.map +1 -0
- package/dist/recovery-polytoken.js +194 -0
- package/dist/recovery-polytoken.js.map +1 -0
- package/dist/recovery-prompt.d.ts +6 -0
- package/dist/recovery-prompt.d.ts.map +1 -0
- package/dist/recovery-prompt.js +53 -0
- package/dist/recovery-prompt.js.map +1 -0
- package/dist/recovery-remote.d.ts +8 -0
- package/dist/recovery-remote.d.ts.map +1 -0
- package/dist/recovery-remote.js +135 -0
- package/dist/recovery-remote.js.map +1 -0
- package/dist/recovery-state.d.ts +25 -1
- package/dist/recovery-state.d.ts.map +1 -1
- package/dist/recovery-state.js +69 -15
- package/dist/recovery-state.js.map +1 -1
- package/dist/recovery-t3.d.ts +17 -0
- package/dist/recovery-t3.d.ts.map +1 -0
- package/dist/recovery-t3.js +58 -0
- package/dist/recovery-t3.js.map +1 -0
- package/dist/recovery-transfer.d.ts +23 -0
- package/dist/recovery-transfer.d.ts.map +1 -0
- package/dist/recovery-transfer.js +234 -0
- package/dist/recovery-transfer.js.map +1 -0
- package/dist/recovery.d.ts +9 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +197 -67
- package/dist/recovery.js.map +1 -1
- package/dist/reliability-store.d.ts +1 -0
- package/dist/reliability-store.d.ts.map +1 -1
- package/dist/reliability-store.js +23 -0
- package/dist/reliability-store.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +39 -11
- package/dist/runtime.js.map +1 -1
- package/dist/self-host.d.ts +1 -1
- package/dist/self-host.js +2 -2
- package/dist/uninstall.d.ts +19 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +135 -0
- package/dist/uninstall.js.map +1 -0
- package/dist/update.js +3 -3
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-t3.js","sourceRoot":"","sources":["../src/recovery-t3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type RecoveryPacket } from "@lore-co/core";
|
|
3
|
+
export { RecoveryPacketSchema, type RecoveryPacket } from "@lore-co/core";
|
|
4
|
+
import { type RecoveryRun } from "./recovery-state.js";
|
|
5
|
+
export declare const MAX_TRANSFER_BYTES: number;
|
|
6
|
+
export declare const RemoteDestinationSchema: z.ZodObject<{
|
|
7
|
+
host: z.ZodString;
|
|
8
|
+
directory: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type RemoteDestination = z.infer<typeof RemoteDestinationSchema>;
|
|
11
|
+
export declare const shellQuote: (value: string) => string;
|
|
12
|
+
/** A self-contained export: no pushed ref or source HEAD is required at the receiver. */
|
|
13
|
+
export declare function createPortableRecoveryPacket(run: RecoveryRun): Promise<RecoveryPacket>;
|
|
14
|
+
/** Exact bytes for dirty tracked files and non-ignored untracked files. Never a truncated diff. */
|
|
15
|
+
export declare function createRecoveryPacket(run: RecoveryRun): Promise<RecoveryPacket>;
|
|
16
|
+
export type RecoveryImportResult = {
|
|
17
|
+
cwd: string;
|
|
18
|
+
digest: string;
|
|
19
|
+
brief: string;
|
|
20
|
+
};
|
|
21
|
+
/** Restore into a new detached worktree, never overwrite the receiving user's checkout. */
|
|
22
|
+
export declare function importRecoveryPacket(repository: string, destination: string, value: unknown, onRestored?: (result: RecoveryImportResult) => Promise<void>): Promise<RecoveryImportResult>;
|
|
23
|
+
//# sourceMappingURL=recovery-transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-transfer.d.ts","sourceRoot":"","sources":["../src/recovery-transfer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAwE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGzF,eAAO,MAAM,kBAAkB,QAA4B,CAAC;AAC5D,eAAO,MAAM,uBAAuB;;;iBAGlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAA+C,CAAC;AA8B3F,yFAAyF;AACzF,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAS5F;AAQD,mGAAmG;AACnG,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAyCpF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElF,2FAA2F;AAC3F,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwD/L"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { chmod, lstat, mkdir, open, realpath, rm, readFile, readlink, mkdtemp, writeFile } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { dirname, basename, isAbsolute, relative, resolve, sep } from "node:path";
|
|
7
|
+
import { randomUUID, createHash } from "node:crypto";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { redactSensitiveText, RecoveryPacketSchema, MAX_RECOVERY_PACKET_BYTES } from "@lore-co/core";
|
|
10
|
+
export { RecoveryPacketSchema } from "@lore-co/core";
|
|
11
|
+
import { recoveryBrief, workspaceSnapshot } from "./recovery-state.js";
|
|
12
|
+
const execFile = promisify(execFileCallback);
|
|
13
|
+
export const MAX_TRANSFER_BYTES = MAX_RECOVERY_PACKET_BYTES;
|
|
14
|
+
export const RemoteDestinationSchema = z.object({
|
|
15
|
+
host: z.string().regex(/^(?:[a-zA-Z0-9_][a-zA-Z0-9_.-]*@)?[a-zA-Z0-9][a-zA-Z0-9_.-]*$/),
|
|
16
|
+
directory: z.string().max(4096).refine(isAbsolute, "Remote repository directory must be absolute"),
|
|
17
|
+
});
|
|
18
|
+
export const shellQuote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
19
|
+
const git = async (cwd, args) => (await execFile("git", args, {
|
|
20
|
+
cwd, encoding: "utf8", timeout: 10000, maxBuffer: MAX_TRANSFER_BYTES, env: { ...process.env, GIT_OPTIONAL_LOCKS: "0" },
|
|
21
|
+
})).stdout;
|
|
22
|
+
function safeRelative(path, allowEmpty = false) {
|
|
23
|
+
if (allowEmpty && path === "")
|
|
24
|
+
return;
|
|
25
|
+
if (!path || isAbsolute(path) || path.includes("\\") || path.includes("\0") || path.split("/").some(part => ["..", ".", ".git", ""].includes(part.toLowerCase())))
|
|
26
|
+
throw new Error("Unsafe recovery transfer path");
|
|
27
|
+
}
|
|
28
|
+
async function workingManifest(root) {
|
|
29
|
+
const paths = [...new Set((await git(root, ["ls-files", "--cached", "--others", "--exclude-standard", "-z"])).split("\0").filter(Boolean))].sort();
|
|
30
|
+
if (paths.length > 20000)
|
|
31
|
+
throw new Error("Workspace exceeds 20,000 files");
|
|
32
|
+
const result = [];
|
|
33
|
+
let bytes = 0;
|
|
34
|
+
for (const path of paths) {
|
|
35
|
+
safeRelative(path);
|
|
36
|
+
const full = resolve(root, path);
|
|
37
|
+
const stat = await lstat(full).catch((e) => { if (e.code === "ENOENT")
|
|
38
|
+
return null; throw e; });
|
|
39
|
+
if (!stat)
|
|
40
|
+
continue;
|
|
41
|
+
bytes += stat.size;
|
|
42
|
+
if (stat.size > MAX_TRANSFER_BYTES || bytes > 64 * 1024 * 1024)
|
|
43
|
+
throw new Error("Workspace exceeds the portable recovery file budget");
|
|
44
|
+
if (await realpath(dirname(full)) !== dirname(full))
|
|
45
|
+
throw new Error("Workspace contains a symlink directory");
|
|
46
|
+
if (!stat.isFile() && !stat.isSymbolicLink())
|
|
47
|
+
throw new Error("Portable recovery does not support submodules or special files");
|
|
48
|
+
let data;
|
|
49
|
+
if (stat.isSymbolicLink())
|
|
50
|
+
data = Buffer.from(await readlink(full));
|
|
51
|
+
else {
|
|
52
|
+
const file = await open(full, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
53
|
+
try {
|
|
54
|
+
data = await file.readFile();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await file.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
result.push({ path, hash: createHash("sha256").update(data).digest("hex"), kind: stat.isSymbolicLink() ? "symlink" : "file", executable: stat.isFile() && !!(stat.mode & 0o111) });
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/** A self-contained export: no pushed ref or source HEAD is required at the receiver. */
|
|
65
|
+
export async function createPortableRecoveryPacket(run) {
|
|
66
|
+
const before = await workingManifest(run.root);
|
|
67
|
+
const packet = await createRecoveryPacket(run);
|
|
68
|
+
const { stdout } = await execFile("git", ["bundle", "create", "-", packet.head, "HEAD"], { cwd: run.root, encoding: "buffer", timeout: 30000, maxBuffer: MAX_TRANSFER_BYTES });
|
|
69
|
+
const manifest = await workingManifest(run.root);
|
|
70
|
+
if (JSON.stringify(before) !== JSON.stringify(manifest) || (await git(run.root, ["rev-parse", "HEAD"])).trim() !== packet.head)
|
|
71
|
+
throw new Error("Workspace changed while exporting; retry when it is idle");
|
|
72
|
+
const portable = RecoveryPacketSchema.parse({ ...packet, bundle: stdout.toString("base64"), manifest });
|
|
73
|
+
if (Buffer.byteLength(JSON.stringify(portable)) > MAX_TRANSFER_BYTES)
|
|
74
|
+
throw new Error("Portable recovery export exceeds 8 MiB; no partial snapshot was saved");
|
|
75
|
+
return portable;
|
|
76
|
+
}
|
|
77
|
+
function rejectCredential(path, data) {
|
|
78
|
+
if (/(?:^|\/)(?:\.env(?:\..*)?|id_(?:rsa|ed25519)|credentials(?:\.json)?|auth\.json)$|\.(?:pem|key|p12)$/iu.test(path) ||
|
|
79
|
+
(data !== undefined && redactSensitiveText(data).text !== data)) {
|
|
80
|
+
throw new Error(`Recovery transfer contains credentials in ${JSON.stringify(path)}. Keep these outside the transferred working changes.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Exact bytes for dirty tracked files and non-ignored untracked files. Never a truncated diff. */
|
|
84
|
+
export async function createRecoveryPacket(run) {
|
|
85
|
+
const before = await workspaceSnapshot(run.cwd);
|
|
86
|
+
if (before.root !== run.root || !/^[0-9a-f]{40,64}$/u.test(before.head))
|
|
87
|
+
throw new Error("Remote recovery requires a committed repository");
|
|
88
|
+
const changed = (await git(run.root, ["diff", "--name-only", "-z", "HEAD", "--"])).split("\0").filter(Boolean);
|
|
89
|
+
for (const path of changed) {
|
|
90
|
+
safeRelative(path);
|
|
91
|
+
rejectCredential(path);
|
|
92
|
+
}
|
|
93
|
+
const patch = await git(run.root, ["diff", "--binary", "--no-ext-diff", "--no-textconv", "HEAD", "--"]);
|
|
94
|
+
rejectCredential("tracked diff", patch);
|
|
95
|
+
// Submodule work cannot be represented by the parent tree's patch.
|
|
96
|
+
if ((await git(run.root, ["diff", "--raw", "HEAD", "--"])).split("\n").some(line => /^:160000|^:\d+ 160000/u.test(line)))
|
|
97
|
+
throw new Error("Remote recovery cannot transfer dirty submodules");
|
|
98
|
+
const files = [];
|
|
99
|
+
let size = Buffer.byteLength(patch);
|
|
100
|
+
const untracked = (await git(run.root, ["ls-files", "--others", "--exclude-standard", "-z"])).split("\0").filter(Boolean);
|
|
101
|
+
const paths = [...new Set([...changed, ...untracked])];
|
|
102
|
+
if (paths.length > 1000)
|
|
103
|
+
throw new Error("Too many untracked files for recovery transfer");
|
|
104
|
+
for (const path of paths) {
|
|
105
|
+
safeRelative(path);
|
|
106
|
+
rejectCredential(path);
|
|
107
|
+
const full = resolve(run.root, path);
|
|
108
|
+
const tracked = changed.includes(path);
|
|
109
|
+
const kind = await lstat(full).catch((error) => { if (tracked && error.code === "ENOENT")
|
|
110
|
+
return null; throw error; });
|
|
111
|
+
// The binary Git patch handles deletions and tracked symlinks.
|
|
112
|
+
if (!kind || (tracked && kind.isSymbolicLink()))
|
|
113
|
+
continue;
|
|
114
|
+
if (kind.isSymbolicLink())
|
|
115
|
+
throw new Error(`Recovery transfer cannot include untracked symbolic link ${JSON.stringify(path)}. Track intentional links in Git; remove or ignore temporary links, then retry.`);
|
|
116
|
+
if (await realpath(dirname(full)) !== dirname(full))
|
|
117
|
+
throw new Error("Recovery transfer cannot follow symlink directories");
|
|
118
|
+
const file = await open(full, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
119
|
+
try {
|
|
120
|
+
const stat = await file.stat();
|
|
121
|
+
if (!stat.isFile() || stat.size > MAX_TRANSFER_BYTES)
|
|
122
|
+
throw new Error("Recovery transfer requires bounded regular files");
|
|
123
|
+
const data = await file.readFile();
|
|
124
|
+
rejectCredential(path, data.toString("utf8"));
|
|
125
|
+
const encoded = data.toString("base64");
|
|
126
|
+
size += Buffer.byteLength(encoded);
|
|
127
|
+
if (size > MAX_TRANSFER_BYTES)
|
|
128
|
+
throw new Error("Recovery transfer exceeds 8 MiB; reduce the working changes first");
|
|
129
|
+
const after = await file.stat();
|
|
130
|
+
if (after.mtimeMs !== stat.mtimeMs || after.size !== stat.size)
|
|
131
|
+
throw new Error("Working file changed during recovery transfer");
|
|
132
|
+
files.push({ path, data: encoded, executable: !!(stat.mode & 0o111), tracked });
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
await file.close();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const after = await workspaceSnapshot(run.cwd);
|
|
139
|
+
if (after.fingerprint !== before.fingerprint)
|
|
140
|
+
throw new Error("Working files changed during recovery transfer; retry from a fresh checkpoint");
|
|
141
|
+
const packet = RecoveryPacketSchema.parse({ version: 1, id: randomUUID(), head: before.head, branch: before.branch,
|
|
142
|
+
relativeCwd: relative(before.root, before.cwd).split(sep).join("/"), brief: recoveryBrief(run, before), patch, files });
|
|
143
|
+
if (Buffer.byteLength(JSON.stringify(packet)) > MAX_TRANSFER_BYTES)
|
|
144
|
+
throw new Error("Recovery transfer exceeds 8 MiB");
|
|
145
|
+
return packet;
|
|
146
|
+
}
|
|
147
|
+
/** Restore into a new detached worktree, never overwrite the receiving user's checkout. */
|
|
148
|
+
export async function importRecoveryPacket(repository, destination, value, onRestored) {
|
|
149
|
+
const packet = RecoveryPacketSchema.parse(value);
|
|
150
|
+
if (Buffer.byteLength(JSON.stringify(packet)) > MAX_TRANSFER_BYTES)
|
|
151
|
+
throw new Error("Recovery transfer exceeds 8 MiB");
|
|
152
|
+
safeRelative(packet.relativeCwd, true);
|
|
153
|
+
const seen = new Set();
|
|
154
|
+
for (const file of packet.files) {
|
|
155
|
+
safeRelative(file.path);
|
|
156
|
+
if (seen.has(file.path))
|
|
157
|
+
throw new Error("Duplicate recovery file");
|
|
158
|
+
seen.add(file.path);
|
|
159
|
+
}
|
|
160
|
+
if (packet.bundle) {
|
|
161
|
+
if (!packet.manifest)
|
|
162
|
+
throw new Error("Portable recovery requires a file manifest");
|
|
163
|
+
const temporary = await mkdtemp(resolve(tmpdir(), "lore-recovery-bundle-"));
|
|
164
|
+
try {
|
|
165
|
+
const bundle = resolve(temporary, "snapshot.bundle");
|
|
166
|
+
await writeFile(bundle, Buffer.from(packet.bundle, "base64"), { mode: 0o600 });
|
|
167
|
+
await git(repository, ["bundle", "verify", bundle]);
|
|
168
|
+
const heads = await git(repository, ["bundle", "list-heads", bundle]);
|
|
169
|
+
if (!heads.split("\n").some(line => line === `${packet.head} HEAD`))
|
|
170
|
+
throw new Error("Snapshot bundle does not match the source HEAD");
|
|
171
|
+
await git(repository, ["-c", "core.hooksPath=/dev/null", "fetch", "--no-tags", "--", bundle, "HEAD"]);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await rm(temporary, { recursive: true, force: true });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
await git(repository, ["cat-file", "-e", `${packet.head}^{commit}`]);
|
|
178
|
+
await mkdir(dirname(destination), { recursive: true, mode: 0o700 });
|
|
179
|
+
destination = resolve(await realpath(dirname(destination)), basename(destination));
|
|
180
|
+
await git(repository, ["-c", "core.hooksPath=/dev/null", "-c", "core.autocrlf=false", "worktree", "add", "--detach", destination, packet.head]);
|
|
181
|
+
try {
|
|
182
|
+
await chmod(destination, 0o700);
|
|
183
|
+
if (packet.patch) {
|
|
184
|
+
const patchFile = resolve(dirname(destination), `${packet.id}.patch`);
|
|
185
|
+
const file = await open(patchFile, "wx", 0o600);
|
|
186
|
+
try {
|
|
187
|
+
await file.writeFile(packet.patch);
|
|
188
|
+
await file.close();
|
|
189
|
+
await git(destination, ["apply", "--check", "--", patchFile]);
|
|
190
|
+
await git(destination, ["apply", "--", patchFile]);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await file.close().catch(() => { });
|
|
194
|
+
await rm(patchFile, { force: true });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
for (const file of packet.files) {
|
|
198
|
+
const full = resolve(destination, file.path);
|
|
199
|
+
let parent = destination;
|
|
200
|
+
for (const part of file.path.split("/").slice(0, -1)) {
|
|
201
|
+
parent = resolve(parent, part);
|
|
202
|
+
await mkdir(parent).catch((error) => { if (error.code !== "EEXIST")
|
|
203
|
+
throw error; });
|
|
204
|
+
if (!(await lstat(parent)).isDirectory())
|
|
205
|
+
throw new Error("Recovery path traverses a symlink");
|
|
206
|
+
}
|
|
207
|
+
if (await realpath(dirname(full)) !== dirname(full))
|
|
208
|
+
throw new Error("Recovery path traverses a symlink");
|
|
209
|
+
const output = await open(full, constants.O_WRONLY | constants.O_CREAT | (file.tracked ? constants.O_TRUNC : constants.O_EXCL) | constants.O_NOFOLLOW, file.executable ? 0o700 : 0o600);
|
|
210
|
+
try {
|
|
211
|
+
await output.writeFile(Buffer.from(file.data, "base64"));
|
|
212
|
+
await output.chmod(file.executable ? 0o700 : 0o600);
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
await output.close();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const cwd = await realpath(resolve(destination, packet.relativeCwd));
|
|
219
|
+
if (cwd !== destination && !cwd.startsWith(destination + sep))
|
|
220
|
+
throw new Error("Recovery cwd leaves the receiving worktree");
|
|
221
|
+
if (packet.manifest && JSON.stringify(await workingManifest(destination)) !== JSON.stringify(packet.manifest))
|
|
222
|
+
throw new Error("Restored files do not match the source snapshot; the agent was not started");
|
|
223
|
+
const result = { cwd, digest: createHash("sha256").update(JSON.stringify(packet)).digest("hex"), brief: packet.brief + `\n\nLore restored this job on this machine in ${JSON.stringify(cwd)} at ${packet.head}. The source paths above are historical; work in this restored directory.` };
|
|
224
|
+
// Commit the caller's receipt while cleanup still owns this newly created worktree.
|
|
225
|
+
if (onRestored)
|
|
226
|
+
await onRestored(result);
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
await git(repository, ["worktree", "remove", "--force", destination]).catch(() => { });
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=recovery-transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-transfer.js","sourceRoot":"","sources":["../src/recovery-transfer.ts"],"names":[],"mappings":"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"}
|
package/dist/recovery.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { LorePaths } from "./cli.js";
|
|
2
2
|
import { type RecoveryRun } from "./recovery-state.js";
|
|
3
3
|
import { findAgentExecutable, type LaunchableAgent, type RecoverySource } from "./agents.js";
|
|
4
|
+
import { type RemoteDestination } from "./recovery-transfer.js";
|
|
4
5
|
export declare function cliInvocation(): string[];
|
|
5
6
|
export declare const findRecoveryExecutable: typeof findAgentExecutable;
|
|
6
7
|
export declare function removeRecoveryShell(text: string): string;
|
|
@@ -9,13 +10,20 @@ export type PreparedRecoveryInstallation = (() => Promise<string>) & {
|
|
|
9
10
|
sources: RecoverySource[];
|
|
10
11
|
fallback: LaunchableAgent;
|
|
11
12
|
};
|
|
12
|
-
|
|
13
|
+
/** Fresh connects enable both directions; explicit routes and off are durable preferences. */
|
|
14
|
+
export declare function prepareAutomaticRecovery(paths: LorePaths, env?: NodeJS.ProcessEnv): Promise<PreparedRecoveryInstallation | undefined>;
|
|
15
|
+
export declare function prepareRecoveryInstallation(paths: LorePaths, fallback: string, env?: NodeJS.ProcessEnv, requestedSources?: readonly RecoverySource[], remote?: RemoteDestination): Promise<PreparedRecoveryInstallation>;
|
|
13
16
|
export declare function recoveryFallback(home: string, source?: RecoverySource): Promise<LaunchableAgent | undefined>;
|
|
17
|
+
export declare function recoveryRoute(home: string, source: RecoverySource): Promise<{
|
|
18
|
+
agent: LaunchableAgent;
|
|
19
|
+
remote?: RemoteDestination;
|
|
20
|
+
} | undefined>;
|
|
14
21
|
export declare function disableRecovery(home: string): Promise<void>;
|
|
15
22
|
export declare function runRecoveryHook(home: string, agent?: RecoverySource): Promise<void>;
|
|
16
23
|
export declare function isInteractiveClaude(args: string[], stdinIsTty: boolean, stdoutIsTty: boolean): boolean;
|
|
17
24
|
/** The wrapper owns input routing; hooks only checkpoint. No terminal text matching. */
|
|
18
25
|
export declare function superviseRecovery(home: string, command: string, args: string[], run: RecoveryRun, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
26
|
+
export declare function launchRecoveredRun(home: string, selected: RecoveryRun, env?: NodeJS.ProcessEnv, onLaunch?: () => Promise<void>, onRestored?: () => Promise<void>): Promise<void>;
|
|
19
27
|
export declare function runRecoveryCommand(args: readonly string[], paths: LorePaths): Promise<void>;
|
|
20
28
|
export declare function runWrappedAgent(args: readonly string[], paths: LorePaths, captureDevin?: boolean): Promise<void>;
|
|
21
29
|
//# sourceMappingURL=recovery.d.ts.map
|
package/dist/recovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,EAG0D,KAAK,WAAW,EAChF,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAmE,mBAAmB,EAAuE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAMnO,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAiBzF,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAGxC;AAED,eAAO,MAAM,sBAAsB,4BAAsB,CAAC;AAyB1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AACD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAE,SAAS,MAAM,EAAgD,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwB3K;AAaD,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9H,8FAA8F;AAC9F,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,oBAAc,GAAG,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,CAkBrI;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,oBAAc,EAAE,gBAAgB,CAAC,EAAE,SAAS,cAAc,EAAE,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAiFxN;AACD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAGlH;AACD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAAS,CAAC,CAIrJ;AACD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,cAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCnG;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAEtG;AAED,wFAAwF;AACxF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,oBAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiJzI;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,oBAAc,EAAE,QAAQ,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB,EAAE,UAAU,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ChN;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDjG;AACD,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpH"}
|