@lore-co/cli 0.1.27 → 0.1.29
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 +59 -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 +182 -71
- package/dist/cli.js.map +1 -1
- package/dist/command-help.d.ts +34 -0
- package/dist/command-help.d.ts.map +1 -0
- package/dist/command-help.js +227 -0
- package/dist/command-help.js.map +1 -0
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +15 -2
- package/dist/demo.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 +4 -3
- package/dist/guard.js.map +1 -1
- 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 +113 -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 +263 -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-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 +22 -0
- package/dist/recovery-transfer.d.ts.map +1 -0
- package/dist/recovery-transfer.js +228 -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 +187 -47
- package/dist/recovery.js.map +1 -1
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -0
- 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 +128 -0
- package/dist/uninstall.js.map +1 -0
- package/dist/update.js +3 -3
- package/package.json +3 -3
package/dist/guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAiIzE,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAwIf"}
|
package/dist/guard.js
CHANGED
|
@@ -11,9 +11,10 @@ const GUARD_HELP = `lore guard
|
|
|
11
11
|
Control Context Guard: proactive Lore context at action boundaries.
|
|
12
12
|
|
|
13
13
|
Modes:
|
|
14
|
-
off
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
off Do not evaluate actions against rules. Agents can still request
|
|
15
|
+
context, and connected hooks may record activity.
|
|
16
|
+
assist Share relevant context before supported actions without
|
|
17
|
+
requiring confirmation.
|
|
17
18
|
enforce Lore can require confirmation for actions that conflict with
|
|
18
19
|
required (governed) rules.
|
|
19
20
|
|
package/dist/guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,GAG3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAwB,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAE7C,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type CloudOffer, type RecoveryPacket } from "@lore-co/core";
|
|
3
|
+
export declare const SnapshotChunk: z.ZodObject<{
|
|
4
|
+
index: z.ZodNumber;
|
|
5
|
+
total: z.ZodNumber;
|
|
6
|
+
digest: z.ZodString;
|
|
7
|
+
data: z.ZodString;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
export declare function readCloudSnapshot(offer: CloudOffer, get: (index: number) => Promise<z.infer<typeof SnapshotChunk>>): Promise<RecoveryPacket>;
|
|
10
|
+
export declare function runCloudWorkspaceCommand(args: readonly string[], home: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=recovery-cloud-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-cloud-workspace.d.ts","sourceRoot":"","sources":["../src/recovery-cloud-workspace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAOpI,eAAO,MAAM,aAAa;;;;;iBAAwK,CAAC;AAInM,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAclJ;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDnG"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { CloudOfferSchema, CloudRepositorySchema, RecoveryPacketSchema } from "@lore-co/core";
|
|
5
|
+
import { createPortableRecoveryPacket, importRecoveryPacket, MAX_TRANSFER_BYTES } from "./recovery-transfer.js";
|
|
6
|
+
import { createRecoveryRun } from "./recovery-state.js";
|
|
7
|
+
import { execFile as callback } from "node:child_process";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
const execFile = promisify(callback);
|
|
10
|
+
const ok = z.object({ ok: z.boolean() });
|
|
11
|
+
export const SnapshotChunk = z.object({ index: z.number().int().nonnegative(), total: z.number().int().min(1).max(32), digest: z.string().regex(/^[a-f0-9]{64}$/), data: z.string().max(524288) });
|
|
12
|
+
const digest = (v) => createHash("sha256").update(v).digest("hex");
|
|
13
|
+
const repo = async (cwd) => CloudRepositorySchema.parse((await execFile("git", ["remote", "get-url", "origin"], { cwd, timeout: 5000 })).stdout.trim().replace(/^git@github\.com:/, "https://github.com/").replace(/\.git$/, ""));
|
|
14
|
+
export async function readCloudSnapshot(offer, get) {
|
|
15
|
+
if (!offer.snapshot)
|
|
16
|
+
throw new Error("No workspace snapshot is available");
|
|
17
|
+
let data = "", total = 1;
|
|
18
|
+
for (let index = 0; index < total; index++) {
|
|
19
|
+
const chunk = SnapshotChunk.parse(await get(index));
|
|
20
|
+
if (chunk.index !== index || chunk.digest !== offer.snapshot.digest || (index && chunk.total !== total))
|
|
21
|
+
throw new Error("Snapshot chunks do not match the accepted offer");
|
|
22
|
+
total = chunk.total;
|
|
23
|
+
data += chunk.data;
|
|
24
|
+
if (data.length > Math.ceil(MAX_TRANSFER_BYTES / 3) * 4)
|
|
25
|
+
throw new Error("Snapshot exceeds the transfer limit");
|
|
26
|
+
}
|
|
27
|
+
const raw = Buffer.from(data, "base64").toString("utf8");
|
|
28
|
+
if (Buffer.byteLength(raw) !== offer.snapshot.bytes || digest(raw) !== offer.snapshot.digest)
|
|
29
|
+
throw new Error("Snapshot digest does not match; no files were restored");
|
|
30
|
+
const packet = RecoveryPacketSchema.parse(JSON.parse(raw));
|
|
31
|
+
if (!packet.bundle || !packet.manifest || packet.head !== offer.snapshot.head)
|
|
32
|
+
throw new Error("Snapshot is incomplete");
|
|
33
|
+
return packet;
|
|
34
|
+
}
|
|
35
|
+
export async function runCloudWorkspaceCommand(args, home) {
|
|
36
|
+
const option = (key) => { const i = args.indexOf(key); return i < 0 ? undefined : args[i + 1]; };
|
|
37
|
+
const apiUrl = new URL(option("--api-url") ?? "");
|
|
38
|
+
if (apiUrl.username || apiUrl.password || apiUrl.search || apiUrl.hash || apiUrl.pathname !== "/" || (apiUrl.protocol !== "https:" && !(apiUrl.protocol === "http:" && ["127.0.0.1", "localhost", "[::1]"].includes(apiUrl.hostname))))
|
|
39
|
+
throw new Error("Use the Lore server HTTPS origin (loopback HTTP is allowed for tests)");
|
|
40
|
+
const receive = args[0] === "receive", id = z.uuid().parse(option(receive ? "--offer" : "--job"));
|
|
41
|
+
const token = process.env[receive ? "LORE_CLOUD_RECEIVE_TOKEN" : "LORE_CLOUD_SOURCE_TOKEN"];
|
|
42
|
+
if (!token || !/^[a-f0-9]{64}$/.test(token))
|
|
43
|
+
throw new Error("Set the job-scoped credential in the environment before starting this command");
|
|
44
|
+
const base = `/v1/cloud-recovery/${receive ? "receivers" : "sources"}/${id}`;
|
|
45
|
+
async function request(path, schema, body) {
|
|
46
|
+
const response = await fetch(apiUrl.origin + base + path, { method: "POST", redirect: "error", headers: { authorization: `Bearer ${token}`, "content-type": "application/json" }, body: JSON.stringify(body ?? {}), signal: AbortSignal.timeout(15000) });
|
|
47
|
+
if (!response.ok)
|
|
48
|
+
throw new Error(`Workspace transfer HTTP ${response.status}; check pairing and offer state`);
|
|
49
|
+
const chunks = [];
|
|
50
|
+
let bytes = 0;
|
|
51
|
+
if (response.body)
|
|
52
|
+
for await (const chunk of response.body) {
|
|
53
|
+
bytes += chunk.byteLength;
|
|
54
|
+
if (bytes > 1024 * 1024)
|
|
55
|
+
throw new Error("Workspace response exceeds 1 MiB");
|
|
56
|
+
chunks.push(Buffer.from(chunk));
|
|
57
|
+
}
|
|
58
|
+
return schema.parse(JSON.parse(Buffer.concat(chunks).toString("utf8")));
|
|
59
|
+
}
|
|
60
|
+
if (receive) {
|
|
61
|
+
const offer = await request("/poll", CloudOfferSchema);
|
|
62
|
+
if (await repo(process.cwd()) !== offer.observation.repository)
|
|
63
|
+
throw new Error("Receiving checkout does not match the accepted repository");
|
|
64
|
+
const packet = await readCloudSnapshot(offer, i => request(`/chunks/${i}`, SnapshotChunk));
|
|
65
|
+
const restored = await importRecoveryPacket(process.cwd(), resolve(home, ".lore/recovery/cloud-worktrees", id), packet);
|
|
66
|
+
await request("/restored", ok, { digest: offer.snapshot.digest });
|
|
67
|
+
process.stdout.write(JSON.stringify({ cwd: restored.cwd, digest: restored.digest, brief: restored.brief }) + "\n");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
let stopped = false, failures = 0;
|
|
71
|
+
const stop = () => { stopped = true; };
|
|
72
|
+
process.once("SIGINT", stop);
|
|
73
|
+
process.once("SIGTERM", stop);
|
|
74
|
+
process.stdout.write("Cloud workspace exporter started. It waits for a verified failure in the paired job.\n");
|
|
75
|
+
try {
|
|
76
|
+
do {
|
|
77
|
+
try {
|
|
78
|
+
const polled = await request("/poll", z.object({ repository: CloudRepositorySchema, sessionId: z.string(), offer: CloudOfferSchema.nullable() }));
|
|
79
|
+
if (await repo(process.cwd()) !== polled.repository)
|
|
80
|
+
throw new Error("Exporter checkout does not match the paired repository");
|
|
81
|
+
if (polled.offer) {
|
|
82
|
+
const offer = polled.offer;
|
|
83
|
+
if (offer.sessionId !== polled.sessionId || offer.observation.state !== "failed" || offer.status !== "offered")
|
|
84
|
+
throw new Error("Export request does not match the paired failure");
|
|
85
|
+
const run = await createRecoveryRun(home, process.cwd(), offer.provider, "codex");
|
|
86
|
+
run.goal = offer.observation.goal;
|
|
87
|
+
run.messages = offer.observation.messages;
|
|
88
|
+
run.sessionId = offer.sessionId;
|
|
89
|
+
const raw = JSON.stringify(await createPortableRecoveryPacket(run)), encoded = Buffer.from(raw).toString("base64"), sha = digest(raw), total = Math.ceil(encoded.length / 524288);
|
|
90
|
+
for (let index = 0; index < total; index++)
|
|
91
|
+
await request(`/offers/${offer.id}/chunks`, ok, { revision: offer.revision, digest: sha, index, total, data: encoded.slice(index * 524288, (index + 1) * 524288) });
|
|
92
|
+
await request(`/offers/${offer.id}/complete`, ok);
|
|
93
|
+
process.stdout.write(`Workspace snapshot exported for offer ${offer.id}.\n`);
|
|
94
|
+
}
|
|
95
|
+
failures = 0;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const message = error instanceof Error ? error.message : "Workspace export failed";
|
|
99
|
+
if (args.includes("--once") || /HTTP (?:400|401|403|404)/.test(message) || ++failures >= 3)
|
|
100
|
+
throw error;
|
|
101
|
+
process.stderr.write(`Workspace export could not finish; retrying (${failures}/3). No partial snapshot was accepted.\n`);
|
|
102
|
+
}
|
|
103
|
+
if (args.includes("--once") || stopped)
|
|
104
|
+
break;
|
|
105
|
+
await new Promise(done => setTimeout(done, 5000));
|
|
106
|
+
} while (!stopped);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
process.removeListener("SIGINT", stop);
|
|
110
|
+
process.removeListener("SIGTERM", stop);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=recovery-cloud-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-cloud-workspace.js","sourceRoot":"","sources":["../src/recovery-cloud-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type CloudOffer, type RecoveryPacket } from "@lore-co/core";
|
|
3
|
+
import { type ConnectorConfig, type LorePaths } from "./cli.js";
|
|
4
|
+
declare const Runner: z.ZodObject<{
|
|
5
|
+
id: z.ZodUUID;
|
|
6
|
+
secret: z.ZodString;
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
cwd: z.ZodString;
|
|
9
|
+
repository: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
|
|
10
|
+
agents: z.ZodArray<z.ZodEnum<{
|
|
11
|
+
cursor: "cursor";
|
|
12
|
+
devin: "devin";
|
|
13
|
+
claude: "claude";
|
|
14
|
+
codex: "codex";
|
|
15
|
+
opencode: "opencode";
|
|
16
|
+
"copilot-cli": "copilot-cli";
|
|
17
|
+
polytoken: "polytoken";
|
|
18
|
+
}>>;
|
|
19
|
+
remote: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
host: z.ZodString;
|
|
21
|
+
directory: z.ZodString;
|
|
22
|
+
}, z.core.$strip>>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
type Runner = z.infer<typeof Runner>;
|
|
25
|
+
export declare function cloudRepository(remote: string): string;
|
|
26
|
+
export declare function prepareCloudWorktree(home: string, runner: Runner, offer: CloudOffer, runGit?: (cwd: string, args: string[]) => Promise<string>, packet?: RecoveryPacket): Promise<string>;
|
|
27
|
+
export declare function launchCloudOffer(paths: LorePaths, config: ConnectorConfig, runner: Runner, id: string, prepare?: typeof prepareCloudWorktree): Promise<void>;
|
|
28
|
+
export declare function pollCloudRunners(home: string): Promise<void>;
|
|
29
|
+
export declare function runCloudRecoveryCommand(args: readonly string[], paths: LorePaths, config: ConnectorConfig | null): Promise<void>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=recovery-cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-cloud.d.ts","sourceRoot":"","sources":["../src/recovery-cloud.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAgE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACnI,OAAO,EAAqC,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AASnG,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;iBAAyM,CAAC;AACtN,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAerC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AACD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAJ1E,MAAM,QAAQ,MAAM,EAAE,oBAI0D,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlJ;AAcD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,8BAAuB,iBAgC3I;AACD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BlE;AACD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtI"}
|
|
@@ -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"}
|