@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,242 @@
|
|
|
1
|
+
import { spawn, execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { mkdir, realpath, open } from "node:fs/promises";
|
|
4
|
+
import { constants } from "node:fs";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { CloudOfferSchema, CloudRepositorySchema, RecoveryAgentSchema } from "@lore-co/core";
|
|
8
|
+
import { getLorePaths, readConnectorConfig } from "./cli.js";
|
|
9
|
+
import { loreApiRequest } from "./api.js";
|
|
10
|
+
import { recoveryStore, createRecoveryRun, markRecoveryFailure, recoveryRunKey } from "./recovery-state.js";
|
|
11
|
+
import { AGENTS, LAUNCHABLE_AGENTS, findAgentExecutable, isLaunchable } from "./agents.js";
|
|
12
|
+
import { cliInvocation, launchRecoveredRun } from "./recovery.js";
|
|
13
|
+
import { installRecoveryMonitor } from "./recovery-hosts.js";
|
|
14
|
+
import { RemoteDestinationSchema, shellQuote, importRecoveryPacket } from "./recovery-transfer.js";
|
|
15
|
+
import { readCloudSnapshot, SnapshotChunk, runCloudWorkspaceCommand } from "./recovery-cloud-workspace.js";
|
|
16
|
+
const execFile = promisify(execFileCallback);
|
|
17
|
+
const Runner = z.object({ id: z.uuid(), secret: z.string(), name: z.string(), cwd: z.string(), repository: CloudRepositorySchema, agents: z.array(RecoveryAgentSchema), remote: RemoteDestinationSchema.optional() });
|
|
18
|
+
const Runners = z.array(Runner);
|
|
19
|
+
const ok = z.object({ ok: z.boolean() });
|
|
20
|
+
const Receipts = z.array(z.object({ id: z.uuid(), runnerId: z.uuid(), result: z.string() }));
|
|
21
|
+
async function flushCloudReceipts(home, config, runners) {
|
|
22
|
+
const store = recoveryStore(home);
|
|
23
|
+
for (const receipt of Receipts.parse(await store.readState("cloud-receipts") ?? [])) {
|
|
24
|
+
const runner = runners.find(r => r.id === receipt.runnerId);
|
|
25
|
+
if (!runner)
|
|
26
|
+
continue;
|
|
27
|
+
try {
|
|
28
|
+
await loreApiRequest(config, "POST", `/v1/cloud-recovery/runners/${runner.id}/offers/${receipt.id}/result`, ok, { secret: runner.secret, status: "launched", result: receipt.result });
|
|
29
|
+
await store.updateState("cloud-receipts", current => Receipts.parse(current ?? []).filter(r => r.id !== receipt.id));
|
|
30
|
+
}
|
|
31
|
+
catch { /* Preserve the receipt and retry reporting, never the agent launch. */ }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const git = async (cwd, args) => (await execFile("git", ["-c", "core.hooksPath=/dev/null", ...args], { cwd, timeout: 60000, maxBuffer: 2 * 1024 * 1024, env: { ...process.env, GIT_TERMINAL_PROMPT: "0" } })).stdout.trim();
|
|
35
|
+
export function cloudRepository(remote) {
|
|
36
|
+
return CloudRepositorySchema.parse(remote.replace(/^git@github\.com:/, "https://github.com/").replace(/\.git$/, ""));
|
|
37
|
+
}
|
|
38
|
+
export async function prepareCloudWorktree(home, runner, offer, runGit = git, packet) {
|
|
39
|
+
if (offer.observation.repository !== runner.repository || cloudRepository(await runGit(runner.cwd, ["remote", "get-url", "origin"])) !== runner.repository)
|
|
40
|
+
throw new Error("Runner repository no longer matches the accepted cloud job");
|
|
41
|
+
if (offer.snapshot) {
|
|
42
|
+
if (!packet)
|
|
43
|
+
throw new Error("Download and verify the accepted snapshot before restoring");
|
|
44
|
+
return (await importRecoveryPacket(runner.cwd, resolve(home, ".lore/recovery/cloud-worktrees", offer.id), packet)).cwd;
|
|
45
|
+
}
|
|
46
|
+
const ref = offer.observation.ref;
|
|
47
|
+
if (!ref)
|
|
48
|
+
throw new Error("No pushed checkpoint is available");
|
|
49
|
+
// Fetch only from the locally paired origin, never a URL from provider output.
|
|
50
|
+
const localRef = `refs/lore-recovery/${offer.id}`;
|
|
51
|
+
await runGit(runner.cwd, ["fetch", "--no-tags", "--", "origin", `+${ref}:${localRef}`]);
|
|
52
|
+
const head = await runGit(runner.cwd, ["rev-parse", "--verify", `${localRef}^{commit}`]);
|
|
53
|
+
if (!/^[a-f0-9]{40,64}$/.test(head))
|
|
54
|
+
throw new Error("Invalid checkpoint commit");
|
|
55
|
+
const directory = resolve(home, ".lore/recovery/cloud-worktrees", offer.id);
|
|
56
|
+
await mkdir(resolve(directory, ".."), { recursive: true, mode: 0o700 });
|
|
57
|
+
await runGit(runner.cwd, ["-c", "core.autocrlf=false", "worktree", "add", "--detach", directory, head]);
|
|
58
|
+
return await realpath(directory);
|
|
59
|
+
}
|
|
60
|
+
async function openLaunchTerminal(home, runnerId, offerId) {
|
|
61
|
+
const directory = resolve(home, ".lore/recovery/offers");
|
|
62
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
63
|
+
const path = resolve(directory, `${offerId}.command`);
|
|
64
|
+
const file = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o700);
|
|
65
|
+
try {
|
|
66
|
+
await file.writeFile(`#!/bin/sh\nexec env -u BUN_OPTIONS -u BUN_BE_BUN PATH=${shellQuote(process.env.PATH ?? "/usr/bin:/bin")} LORE_HOME=${shellQuote(home)} ${[...cliInvocation(), "recovery", "cloud", "launch", runnerId, offerId].map(shellQuote).join(" ")}\n`);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await file.close();
|
|
70
|
+
}
|
|
71
|
+
const command = process.platform === "darwin" ? "open" : "x-terminal-emulator";
|
|
72
|
+
await new Promise((done, reject) => {
|
|
73
|
+
const child = spawn(command, process.platform === "darwin" ? ["-a", "Terminal", path] : ["-e", "/bin/sh", path], { detached: true, stdio: "ignore" });
|
|
74
|
+
child.once("error", reject);
|
|
75
|
+
if (process.platform === "darwin")
|
|
76
|
+
child.once("exit", c => c === 0 ? done() : reject(new Error("Could not open launch terminal")));
|
|
77
|
+
else {
|
|
78
|
+
child.unref();
|
|
79
|
+
done();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export async function launchCloudOffer(paths, config, runner, id, prepare = prepareCloudWorktree) {
|
|
84
|
+
if (await recoveryStore(paths.home).readState("disabled"))
|
|
85
|
+
throw new Error("Recovery is disabled");
|
|
86
|
+
const base = `/v1/cloud-recovery/runners/${runner.id}/offers/${id}`;
|
|
87
|
+
const offer = await loreApiRequest(config, "POST", base + "/claim", CloudOfferSchema, { secret: runner.secret });
|
|
88
|
+
let reported = false;
|
|
89
|
+
try {
|
|
90
|
+
if (offer.destination?.kind !== "runner" || offer.destination.runnerId !== runner.id || !runner.agents.includes(offer.destination.agent) || offer.provider === offer.destination.agent)
|
|
91
|
+
throw new Error("Invalid accepted destination");
|
|
92
|
+
const packet = offer.snapshot ? await readCloudSnapshot(offer, index => loreApiRequest(config, "POST", `${base}/snapshot/${index}`, SnapshotChunk, { secret: runner.secret })) : undefined;
|
|
93
|
+
const cwd = await prepare(paths.home, runner, offer, undefined, packet);
|
|
94
|
+
const run = await createRecoveryRun(paths.home, cwd, offer.provider, offer.destination.agent, runner.remote);
|
|
95
|
+
run.goal = offer.observation.goal;
|
|
96
|
+
run.messages = [...offer.observation.messages.slice(-19), { role: "assistant", text: offer.snapshot ? `Lore restored the exported workspace captured at ${offer.snapshot.capturedAt}, including unpushed Git history and eligible working files. File hashes were verified. Ignored files and running processes are excluded. Inspect current files before continuing.` : `Lore restored only the pushed checkpoint ${offer.observation.ref}. Uncommitted source-cloud edits were not transferred. Inspect current files before continuing.` }];
|
|
97
|
+
run.portableTransfer = !!offer.snapshot;
|
|
98
|
+
run.sessionId = offer.sessionId;
|
|
99
|
+
run.turnPending = true;
|
|
100
|
+
run.turn = 1;
|
|
101
|
+
await recoveryStore(paths.home).writeState(recoveryRunKey(run.id), run);
|
|
102
|
+
await markRecoveryFailure(paths.home, run, offer.observation.reason ?? "agent_error");
|
|
103
|
+
const ready = (await import("./recovery-state.js")).RecoveryRunSchema.parse(await recoveryStore(paths.home).readState(recoveryRunKey(run.id)));
|
|
104
|
+
if (runner.remote) {
|
|
105
|
+
// The standard worker importer requires the source commit to exist there.
|
|
106
|
+
const remoteUrl = await execFile("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10", "--", runner.remote.host, ["git", "-C", runner.remote.directory, "remote", "get-url", "origin"].map(shellQuote).join(" ")], { timeout: 15000 });
|
|
107
|
+
if (cloudRepository(remoteUrl.stdout.trim()) !== runner.repository)
|
|
108
|
+
throw new Error("SSH worker repository does not match this cloud job");
|
|
109
|
+
if (!offer.snapshot)
|
|
110
|
+
await execFile("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10", "--", runner.remote.host, ["git", "-C", runner.remote.directory, "fetch", "--no-tags", "--", "origin", offer.observation.ref].map(shellQuote).join(" ")], { timeout: 60000 });
|
|
111
|
+
}
|
|
112
|
+
await launchRecoveredRun(paths.home, ready, process.env, async () => {
|
|
113
|
+
reported = true;
|
|
114
|
+
await recoveryStore(paths.home).updateState("cloud-receipts", current => [...Receipts.parse(current ?? []).filter(r => r.id !== id), { id, runnerId: runner.id, result: `Started ${AGENTS[ready.targetAgent].label} from ${offer.snapshot ? 'the verified workspace snapshot' : `pushed checkpoint ${offer.observation.ref}`}.` }].slice(-100));
|
|
115
|
+
await flushCloudReceipts(paths.home, config, [runner]);
|
|
116
|
+
}, async () => { if (offer.snapshot)
|
|
117
|
+
await loreApiRequest(config, "POST", base + "/restored", ok, { secret: runner.secret, digest: offer.snapshot.digest }); });
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (!reported)
|
|
121
|
+
await loreApiRequest(config, "POST", base + "/result", ok, { secret: runner.secret, status: "failed", result: "The runner could not confirm launch. Check the runner terminal; the original checkout is unchanged." }).catch(() => { });
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export async function pollCloudRunners(home) {
|
|
126
|
+
const store = recoveryStore(home);
|
|
127
|
+
if (await store.readState("disabled"))
|
|
128
|
+
return;
|
|
129
|
+
const runners = Runners.parse(await store.readState("cloud-runners") ?? []);
|
|
130
|
+
if (!runners.length)
|
|
131
|
+
return;
|
|
132
|
+
const last = z.number().safeParse(await store.readState("cloud-last-poll"));
|
|
133
|
+
if (last.success && Date.now() - last.data < 5000)
|
|
134
|
+
return;
|
|
135
|
+
await store.writeState("cloud-last-poll", Date.now());
|
|
136
|
+
const config = await readConnectorConfig(getLorePaths(home));
|
|
137
|
+
if (!config?.dashboardUrl)
|
|
138
|
+
return;
|
|
139
|
+
await flushCloudReceipts(home, config, runners);
|
|
140
|
+
for (const runner of runners) {
|
|
141
|
+
const reply = await loreApiRequest(config, "POST", `/v1/cloud-recovery/runners/${runner.id}/poll`, z.object({ offers: z.array(CloudOfferSchema), pending: z.array(CloudOfferSchema).default([]) }), { secret: runner.secret });
|
|
142
|
+
for (const offer of reply.pending) {
|
|
143
|
+
const key = `cloud-notice-${offer.id}`;
|
|
144
|
+
let fresh = false;
|
|
145
|
+
await store.updateState(key, previous => { if (previous)
|
|
146
|
+
return previous; fresh = true; return { at: Date.now() }; });
|
|
147
|
+
if (fresh) {
|
|
148
|
+
const url = new URL("recovery", config.dashboardUrl.replace(/\/?$/, "/"));
|
|
149
|
+
if (!["http:", "https:"].includes(url.protocol))
|
|
150
|
+
throw new Error("Invalid Lore dashboard URL");
|
|
151
|
+
try {
|
|
152
|
+
await execFile(process.platform === "darwin" ? "open" : "xdg-open", [url.href], { timeout: 5000 });
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
await store.deleteState(key);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
for (const offer of reply.offers) {
|
|
160
|
+
let fresh = false;
|
|
161
|
+
await store.updateState(`cloud-dispatch-${offer.id}`, previous => { if (previous)
|
|
162
|
+
return previous; fresh = true; return { at: Date.now() }; });
|
|
163
|
+
if (!fresh)
|
|
164
|
+
continue;
|
|
165
|
+
try {
|
|
166
|
+
await openLaunchTerminal(home, runner.id, offer.id);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
await store.deleteState(`cloud-dispatch-${offer.id}`);
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
await store.writeState("cloud-runner-health", { at: Date.now(), status: "connected" });
|
|
175
|
+
}
|
|
176
|
+
export async function runCloudRecoveryCommand(args, paths, config) {
|
|
177
|
+
if (["source", "receive"].includes(args[0] ?? "") && !args.includes("--help"))
|
|
178
|
+
return runCloudWorkspaceCommand(args, paths.home);
|
|
179
|
+
if (!args.length || args.includes("--help")) {
|
|
180
|
+
process.stdout.write("lore recovery cloud runner --name <name> [--agent <tool>] [--ssh user@host --directory /repo]\nPair the current GitHub checkout once; dashboard acceptance starts the chosen agent locally or over SSH.\nlore recovery cloud status\nlore recovery cloud off\nProvider keys and watched sessions are configured in the hosted Recovery page.\n");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const store = recoveryStore(paths.home);
|
|
184
|
+
if (args[0] === "off") {
|
|
185
|
+
if (config)
|
|
186
|
+
for (const runner of Runners.parse(await store.readState("cloud-runners") ?? []))
|
|
187
|
+
await loreApiRequest(config, "POST", `/v1/cloud-recovery/runners/${runner.id}/remove`, ok, { secret: runner.secret }).catch(() => { });
|
|
188
|
+
await store.deleteState("cloud-runners");
|
|
189
|
+
process.stdout.write("Cloud runner disconnected.\n");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!config)
|
|
193
|
+
throw new Error("Connect to Lore before pairing a cloud recovery runner");
|
|
194
|
+
if (args[0] === "status") {
|
|
195
|
+
process.stdout.write(JSON.stringify(await store.readState("cloud-runner-health") ?? { status: "not connected" }, null, 2) + "\n");
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (args[0] === "launch") {
|
|
199
|
+
const runner = Runners.parse(await store.readState("cloud-runners") ?? []).find(r => r.id === args[1]);
|
|
200
|
+
if (!runner)
|
|
201
|
+
throw new Error("Runner is no longer paired");
|
|
202
|
+
await launchCloudOffer(paths, config, runner, z.uuid().parse(args[2]));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (args[0] !== "runner")
|
|
206
|
+
throw new Error("Unknown cloud recovery command");
|
|
207
|
+
const option = (key) => { const i = args.indexOf(key); return i < 0 ? undefined : args[i + 1]; };
|
|
208
|
+
if (!config.dashboardUrl)
|
|
209
|
+
throw new Error("Reconnect Lore with --dashboard-url before pairing a cloud runner");
|
|
210
|
+
const name = option("--name");
|
|
211
|
+
if (!name)
|
|
212
|
+
throw new Error("Choose a runner name with --name");
|
|
213
|
+
const cwd = await realpath(process.cwd()), repository = cloudRepository(await git(cwd, ["remote", "get-url", "origin"]));
|
|
214
|
+
const host = option("--ssh"), directory = option("--directory");
|
|
215
|
+
const remote = host ? RemoteDestinationSchema.parse({ host, directory }) : undefined;
|
|
216
|
+
const explicit = option("--agent");
|
|
217
|
+
if (explicit && !isLaunchable(explicit))
|
|
218
|
+
throw new Error("Unknown destination agent");
|
|
219
|
+
const agents = explicit ? [RecoveryAgentSchema.parse(explicit)] : (await Promise.all(LAUNCHABLE_AGENTS.map(async (a) => await findAgentExecutable(a).then(() => a, () => undefined)))).filter((a) => !!a);
|
|
220
|
+
if (!agents.length)
|
|
221
|
+
throw new Error("Install a destination coding tool first");
|
|
222
|
+
if (remote) {
|
|
223
|
+
if (!explicit)
|
|
224
|
+
throw new Error("SSH runners require an explicit --agent");
|
|
225
|
+
await (await import("./recovery-remote.js")).verifyRemoteDestination(remote, agents[0]);
|
|
226
|
+
}
|
|
227
|
+
else
|
|
228
|
+
for (const agent of agents)
|
|
229
|
+
await findAgentExecutable(agent);
|
|
230
|
+
const previous = Runners.parse(await store.readState("cloud-runners") ?? []);
|
|
231
|
+
if (previous.some(r => r.cwd === cwd && r.name === name)) {
|
|
232
|
+
await installRecoveryMonitor(paths.home);
|
|
233
|
+
process.stdout.write("Runner is already paired; monitor started.\n");
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const registered = await loreApiRequest(config, "POST", "/v1/cloud-recovery/runners", z.object({ id: z.uuid(), secret: z.string() }), { name, repository, agents, location: remote ? "ssh" : "local" });
|
|
237
|
+
await store.writeState("cloud-runners", [...previous, { ...registered, name, cwd, repository, agents, ...(remote ? { remote } : {}) }]);
|
|
238
|
+
await store.deleteState("disabled");
|
|
239
|
+
await installRecoveryMonitor(paths.home);
|
|
240
|
+
process.stdout.write(`Cloud recovery runner ${JSON.stringify(name)} paired. Choose it in the hosted Recovery page.\n`);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=recovery-cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-cloud.js","sourceRoot":"","sources":["../src/recovery-cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Only structured protocol errors qualify. An answer mentioning limits does not. */
|
|
2
|
+
export declare function codexFailureReason(turn: unknown, expectedTurn: string): "rate_limit" | "agent_error" | undefined;
|
|
3
|
+
/** Read persisted turns without resuming, subscribing to, or steering the job. */
|
|
4
|
+
export declare function observeCodexRecovery(home: string, runId: string, command: string, env?: NodeJS.ProcessEnv): () => void;
|
|
5
|
+
//# sourceMappingURL=recovery-codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-codex.d.ts","sourceRoot":"","sources":["../src/recovery-codex.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAShH;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,oBAAc,GAAG,MAAM,IAAI,CAgEhH"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { markRecoveryFailure, RecoveryRunSchema, recoveryRunKey, recoveryStore } from "./recovery-state.js";
|
|
3
|
+
/** Only structured protocol errors qualify. An answer mentioning limits does not. */
|
|
4
|
+
export function codexFailureReason(turn, expectedTurn) {
|
|
5
|
+
if (!turn || typeof turn !== "object")
|
|
6
|
+
return;
|
|
7
|
+
const value = turn;
|
|
8
|
+
if (value.id !== expectedTurn || value.status !== "failed" || !value.error)
|
|
9
|
+
return;
|
|
10
|
+
const info = value.error.codexErrorInfo;
|
|
11
|
+
if (info === "usageLimitExceeded")
|
|
12
|
+
return "rate_limit";
|
|
13
|
+
if (info && typeof info === "object" && "httpConnectionFailed" in info &&
|
|
14
|
+
info.httpConnectionFailed?.httpStatusCode === 429)
|
|
15
|
+
return "rate_limit";
|
|
16
|
+
return "agent_error";
|
|
17
|
+
}
|
|
18
|
+
/** Read persisted turns without resuming, subscribing to, or steering the job. */
|
|
19
|
+
export function observeCodexRecovery(home, runId, command, env = process.env) {
|
|
20
|
+
let stopped = false, busy = false, initialized = false, sequence = 0;
|
|
21
|
+
let child;
|
|
22
|
+
let buffer = "";
|
|
23
|
+
const pending = new Map();
|
|
24
|
+
const stop = () => {
|
|
25
|
+
stopped = true;
|
|
26
|
+
clearInterval(timer);
|
|
27
|
+
for (const request of pending.values()) {
|
|
28
|
+
clearTimeout(request.timer);
|
|
29
|
+
request.reject(new Error("Codex recovery observer stopped"));
|
|
30
|
+
}
|
|
31
|
+
pending.clear();
|
|
32
|
+
child?.kill();
|
|
33
|
+
const process = child;
|
|
34
|
+
if (process) {
|
|
35
|
+
const force = setTimeout(() => process.kill("SIGKILL"), 1000);
|
|
36
|
+
force.unref();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const request = (method, params) => new Promise((resolve, reject) => {
|
|
40
|
+
const id = ++sequence;
|
|
41
|
+
const timeout = setTimeout(() => { pending.delete(id); reject(new Error("Codex recovery read timed out")); }, 4000);
|
|
42
|
+
pending.set(id, { resolve, reject, timer: timeout });
|
|
43
|
+
child.stdin.write(JSON.stringify({ id, method, params }) + "\n");
|
|
44
|
+
});
|
|
45
|
+
const poll = async () => {
|
|
46
|
+
if (busy || stopped)
|
|
47
|
+
return;
|
|
48
|
+
busy = true;
|
|
49
|
+
try {
|
|
50
|
+
const parsed = RecoveryRunSchema.safeParse(await recoveryStore(home).readState(recoveryRunKey(runId)));
|
|
51
|
+
if (!parsed.success || !parsed.data.turnPending || parsed.data.failure || !parsed.data.sessionId || !parsed.data.nativeTurnId)
|
|
52
|
+
return;
|
|
53
|
+
const run = parsed.data;
|
|
54
|
+
if (!child) {
|
|
55
|
+
child = spawn(command, ["app-server"], { env, stdio: ["pipe", "pipe", "ignore"] });
|
|
56
|
+
child.once("error", stop);
|
|
57
|
+
child.once("exit", stop);
|
|
58
|
+
child.stdin.on("error", stop);
|
|
59
|
+
child.stdout.on("data", chunk => {
|
|
60
|
+
buffer += String(chunk);
|
|
61
|
+
if (Buffer.byteLength(buffer) > 4 * 1024 * 1024) {
|
|
62
|
+
stop();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
let newline;
|
|
66
|
+
while ((newline = buffer.indexOf("\n")) >= 0) {
|
|
67
|
+
const line = buffer.slice(0, newline);
|
|
68
|
+
buffer = buffer.slice(newline + 1);
|
|
69
|
+
try {
|
|
70
|
+
const message = JSON.parse(line), waiting = pending.get(message.id);
|
|
71
|
+
if (!waiting)
|
|
72
|
+
continue;
|
|
73
|
+
clearTimeout(waiting.timer);
|
|
74
|
+
pending.delete(message.id);
|
|
75
|
+
if (message.error)
|
|
76
|
+
waiting.reject(new Error("Codex recovery read unavailable"));
|
|
77
|
+
else
|
|
78
|
+
waiting.resolve(message.result);
|
|
79
|
+
}
|
|
80
|
+
catch { /* Non-protocol output cannot trigger a handoff. */ }
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (!initialized) {
|
|
85
|
+
await request("initialize", { clientInfo: { name: "lore-recovery-reader", version: "1" }, capabilities: { experimentalApi: true } });
|
|
86
|
+
child.stdin.write(JSON.stringify({ method: "initialized" }) + "\n");
|
|
87
|
+
initialized = true;
|
|
88
|
+
}
|
|
89
|
+
let turns;
|
|
90
|
+
try {
|
|
91
|
+
const result = await request("thread/turns/list", { threadId: run.sessionId, limit: 1, sortDirection: "desc", itemsView: "notLoaded" });
|
|
92
|
+
turns = result.data ?? [];
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Older app servers expose the stable thread/read method only.
|
|
96
|
+
const result = await request("thread/read", { threadId: run.sessionId, includeTurns: true });
|
|
97
|
+
turns = result.thread?.turns?.slice(-1) ?? [];
|
|
98
|
+
}
|
|
99
|
+
const reason = codexFailureReason(turns[0], run.nativeTurnId);
|
|
100
|
+
if (reason)
|
|
101
|
+
await markRecoveryFailure(home, run, reason);
|
|
102
|
+
}
|
|
103
|
+
catch { /* Process-exit recovery remains available on older hosts. */ }
|
|
104
|
+
finally {
|
|
105
|
+
busy = false;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const timer = setInterval(() => { void poll(); }, 1000);
|
|
109
|
+
return stop;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=recovery-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-codex.js","sourceRoot":"","sources":["../src/recovery-codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5G,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,YAAoB;IACpE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,MAAM,KAAK,GAAG,IAAgF,CAAC;IAC/F,IAAI,KAAK,CAAC,EAAE,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO;IACnF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;IACxC,IAAI,IAAI,KAAK,oBAAoB;QAAE,OAAO,YAAY,CAAC;IACvD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,sBAAsB,IAAI,IAAI;QACnE,IAAI,CAAC,oBAAqD,EAAE,cAAc,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IAC3G,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAClG,IAAI,OAAO,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC;IACrE,IAAI,KAA2C,CAAC;IAChD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoG,CAAC;IAC5H,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,GAAG,IAAI,CAAC;QAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IAChG,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,MAAe,EAAgB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjG,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC;QACtB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpH,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,KAAM,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,IAAI,IAAI,OAAO;YAAE,OAAO;QAC5B,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YACtI,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAAC,KAAK,CAAC,KAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACpF,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;oBAC/B,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;oBACxB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,OAAO;oBAAC,CAAC;oBACpE,IAAI,OAAO,CAAC;oBACZ,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;wBAC1E,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BACpE,IAAI,CAAC,OAAO;gCAAE,SAAS;4BACvB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BACxD,IAAI,OAAO,CAAC,KAAK;gCAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;;gCAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACxH,CAAC;wBAAC,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,OAAO,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACrI,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAC,WAAW,GAAG,IAAI,CAAC;YAC3F,CAAC;YACD,IAAI,KAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;gBACxI,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;gBAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7F,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,CAAC;YACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,YAAa,CAAC,CAAC;YAC/D,IAAI,MAAM;gBAAE,MAAM,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC,CAAC,6DAA6D,CAAC,CAAC;gBACjE,CAAC;YAAC,IAAI,GAAG,KAAK,CAAC;QAAC,CAAC;IAC3B,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type RecoveryRun } from "./recovery-state.js";
|
|
2
|
+
/** Copilot 1.0.83 emits recoverable hooks during retries, then session.error
|
|
3
|
+
* after assistant.turn_end. Only that terminal event can trigger recovery.
|
|
4
|
+
* Bind it to the exact prompt hook, not matching prompt text or a guessed turn.
|
|
5
|
+
*/
|
|
6
|
+
export declare function copilotJournalFailure(text: string, run: RecoveryRun): {
|
|
7
|
+
reason: "rate_limit" | "agent_error";
|
|
8
|
+
messages: {
|
|
9
|
+
role: "user" | "assistant";
|
|
10
|
+
text: string;
|
|
11
|
+
}[];
|
|
12
|
+
} | undefined;
|
|
13
|
+
export declare function observeCopilotRecovery(home: string, id: string, env?: NodeJS.ProcessEnv): () => void;
|
|
14
|
+
//# sourceMappingURL=recovery-copilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-copilot.d.ts","sourceRoot":"","sources":["../src/recovery-copilot.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8F,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnJ;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW;;;;;;cAmCnE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAc,GAAG,MAAM,IAAI,CAoC9F"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { open, realpath } from "node:fs/promises";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { RecoveryRunSchema, recoveryRunKey, recoveryStore, recoveryMessageText, markRecoveryFailure } from "./recovery-state.js";
|
|
5
|
+
/** Copilot 1.0.83 emits recoverable hooks during retries, then session.error
|
|
6
|
+
* after assistant.turn_end. Only that terminal event can trigger recovery.
|
|
7
|
+
* Bind it to the exact prompt hook, not matching prompt text or a guessed turn.
|
|
8
|
+
*/
|
|
9
|
+
export function copilotJournalFailure(text, run) {
|
|
10
|
+
if (!run.sessionId || !run.nativeTurnId?.startsWith("hook:"))
|
|
11
|
+
return;
|
|
12
|
+
const events = [];
|
|
13
|
+
for (const line of text.split("\n").slice(0, -1)) {
|
|
14
|
+
try {
|
|
15
|
+
const value = JSON.parse(line);
|
|
16
|
+
if (value && typeof value === "object")
|
|
17
|
+
events.push(value);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return;
|
|
21
|
+
} // Incomplete final records are excluded; malformed journals fail closed.
|
|
22
|
+
}
|
|
23
|
+
const start = events[0];
|
|
24
|
+
if (start?.type !== "session.start" || start.data?.sessionId !== run.sessionId || start.data?.context?.cwd !== run.cwd)
|
|
25
|
+
return;
|
|
26
|
+
let bound = false, user, ended = false, failure;
|
|
27
|
+
const messages = [];
|
|
28
|
+
for (const event of events) {
|
|
29
|
+
const data = event.data;
|
|
30
|
+
if (!data || data.parentToolCallId || data.parentAgentId)
|
|
31
|
+
continue;
|
|
32
|
+
if (event.type === "hook.start" && data.hookType === "userPromptSubmitted") {
|
|
33
|
+
bound = data.input?.sessionId === run.sessionId && `hook:${data.input?.timestamp}` === run.nativeTurnId;
|
|
34
|
+
user = undefined;
|
|
35
|
+
ended = false;
|
|
36
|
+
failure = undefined;
|
|
37
|
+
}
|
|
38
|
+
else if (event.type === "user.message") {
|
|
39
|
+
if (typeof data.content === "string")
|
|
40
|
+
messages.push({ role: "user", text: recoveryMessageText(data.content) });
|
|
41
|
+
if (user)
|
|
42
|
+
bound = false; // A queued/subsequent message is not the inspected turn.
|
|
43
|
+
user = data;
|
|
44
|
+
ended = false;
|
|
45
|
+
failure = undefined;
|
|
46
|
+
}
|
|
47
|
+
else if (event.type === "assistant.message" && typeof data.content === "string") {
|
|
48
|
+
messages.push({ role: "assistant", text: recoveryMessageText(data.content) });
|
|
49
|
+
}
|
|
50
|
+
else if (event.type === "assistant.turn_start") {
|
|
51
|
+
ended = false;
|
|
52
|
+
failure = undefined;
|
|
53
|
+
}
|
|
54
|
+
else if (event.type === "assistant.turn_end") {
|
|
55
|
+
ended = bound && typeof user?.turnId === "string" && !!user.turnId && data.turnId === user.turnId;
|
|
56
|
+
}
|
|
57
|
+
else if (["abort", "session.resume"].includes(event.type)) {
|
|
58
|
+
bound = false;
|
|
59
|
+
failure = undefined;
|
|
60
|
+
}
|
|
61
|
+
else if (event.type === "session.error" && bound && ended) {
|
|
62
|
+
if (data.errorType === "rate_limit" || data.statusCode === 429)
|
|
63
|
+
failure = "rate_limit";
|
|
64
|
+
else if (["authentication", "model_call", "system"].includes(data.errorType))
|
|
65
|
+
failure = "agent_error";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return failure && bound ? { reason: failure, messages: messages.slice(-20) } : undefined;
|
|
69
|
+
}
|
|
70
|
+
export function observeCopilotRecovery(home, id, env = process.env) {
|
|
71
|
+
let stopped = false, busy = false, lastRead = "";
|
|
72
|
+
const poll = async () => {
|
|
73
|
+
if (stopped || busy)
|
|
74
|
+
return;
|
|
75
|
+
busy = true;
|
|
76
|
+
try {
|
|
77
|
+
const store = recoveryStore(home), run = RecoveryRunSchema.parse(await store.readState(recoveryRunKey(id)));
|
|
78
|
+
if (!run.turnPending || run.failure || !run.sessionId || !/^[a-zA-Z0-9-]{1,100}$/.test(run.sessionId))
|
|
79
|
+
return;
|
|
80
|
+
const root = await realpath(resolve(env.COPILOT_HOME || resolve(env.HOME || home, ".copilot"), "session-state"));
|
|
81
|
+
const directory = resolve(root, run.sessionId);
|
|
82
|
+
if (await realpath(directory) !== directory)
|
|
83
|
+
return;
|
|
84
|
+
const file = await open(resolve(directory, "events.jsonl"), constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
85
|
+
let text;
|
|
86
|
+
try {
|
|
87
|
+
const stat = await file.stat();
|
|
88
|
+
if (!stat.isFile() || stat.size > 8 * 1024 * 1024 || (process.getuid && stat.uid !== process.getuid()))
|
|
89
|
+
return;
|
|
90
|
+
const signature = `${run.sessionId}:${run.turn}:${stat.ino}:${stat.size}:${stat.mtimeMs}`;
|
|
91
|
+
if (signature === lastRead)
|
|
92
|
+
return;
|
|
93
|
+
const buffer = Buffer.alloc(stat.size);
|
|
94
|
+
const { bytesRead } = await file.read(buffer, 0, buffer.length, 0);
|
|
95
|
+
text = buffer.subarray(0, bytesRead).toString("utf8");
|
|
96
|
+
lastRead = signature;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
await file.close();
|
|
100
|
+
}
|
|
101
|
+
const result = copilotJournalFailure(text, run);
|
|
102
|
+
if (!result || stopped)
|
|
103
|
+
return;
|
|
104
|
+
await store.updateState(recoveryRunKey(id), current => {
|
|
105
|
+
const latest = RecoveryRunSchema.parse(current);
|
|
106
|
+
if (latest.turn === run.turn && latest.sessionId === run.sessionId && latest.nativeTurnId === run.nativeTurnId && result.messages.length)
|
|
107
|
+
latest.messages = result.messages;
|
|
108
|
+
return latest;
|
|
109
|
+
});
|
|
110
|
+
await markRecoveryFailure(home, run, result.reason);
|
|
111
|
+
}
|
|
112
|
+
catch { /* Unsupported/missing journals cannot trigger a guessed handoff. */ }
|
|
113
|
+
finally {
|
|
114
|
+
busy = false;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const timer = setInterval(() => { void poll(); }, 350);
|
|
118
|
+
return () => { stopped = true; clearInterval(timer); };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=recovery-copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-copilot.js","sourceRoot":"","sources":["../src/recovery-copilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type RecoverySource } from "./agents.js";
|
|
2
|
+
/** An IDE hook has no parent PTY. Start a terminal that owns the confirmation. */
|
|
3
|
+
export declare function openRecoveryTerminal(home: string, id: string): Promise<void>;
|
|
4
|
+
export declare function offerDesktopRecovery(home: string, id: string, notify?: typeof openRecoveryTerminal): Promise<void>;
|
|
5
|
+
export declare function captureDesktopRecovery(home: string, agent: RecoverySource, value: unknown): Promise<string | undefined>;
|
|
6
|
+
export declare function runDesktopRecovery(args: readonly string[], home: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=recovery-desktop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-desktop.d.ts","sourceRoot":"","sources":["../src/recovery-desktop.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAA+B,MAAM,aAAa,CAAC;AAc/E,kFAAkF;AAClF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,8BAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAajH;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqB7H;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C7F"}
|