@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.
Files changed (105) hide show
  1. package/README.md +48 -9
  2. package/dist/agents.d.ts +3 -1
  3. package/dist/agents.d.ts.map +1 -1
  4. package/dist/agents.js +31 -7
  5. package/dist/agents.js.map +1 -1
  6. package/dist/cli.d.ts +8 -0
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +97 -15
  9. package/dist/cli.js.map +1 -1
  10. package/dist/command-help.d.ts +2 -1
  11. package/dist/command-help.d.ts.map +1 -1
  12. package/dist/command-help.js +33 -6
  13. package/dist/command-help.js.map +1 -1
  14. package/dist/generated-assets.d.ts +9 -4
  15. package/dist/generated-assets.d.ts.map +1 -1
  16. package/dist/generated-assets.js +5 -4
  17. package/dist/generated-assets.js.map +1 -1
  18. package/dist/guard.d.ts.map +1 -1
  19. package/dist/guard.js +7 -1
  20. package/dist/guard.js.map +1 -1
  21. package/dist/image-capture.d.ts.map +1 -1
  22. package/dist/image-capture.js +8 -3
  23. package/dist/image-capture.js.map +1 -1
  24. package/dist/live.d.ts.map +1 -1
  25. package/dist/live.js +40 -20
  26. package/dist/live.js.map +1 -1
  27. package/dist/recovery-cloud-receipt.d.ts +24 -0
  28. package/dist/recovery-cloud-receipt.d.ts.map +1 -0
  29. package/dist/recovery-cloud-receipt.js +78 -0
  30. package/dist/recovery-cloud-receipt.js.map +1 -0
  31. package/dist/recovery-cloud-workspace.d.ts +11 -0
  32. package/dist/recovery-cloud-workspace.d.ts.map +1 -0
  33. package/dist/recovery-cloud-workspace.js +141 -0
  34. package/dist/recovery-cloud-workspace.js.map +1 -0
  35. package/dist/recovery-cloud.d.ts +31 -0
  36. package/dist/recovery-cloud.d.ts.map +1 -0
  37. package/dist/recovery-cloud.js +242 -0
  38. package/dist/recovery-cloud.js.map +1 -0
  39. package/dist/recovery-codex.d.ts +5 -0
  40. package/dist/recovery-codex.d.ts.map +1 -0
  41. package/dist/recovery-codex.js +111 -0
  42. package/dist/recovery-codex.js.map +1 -0
  43. package/dist/recovery-copilot.d.ts +14 -0
  44. package/dist/recovery-copilot.d.ts.map +1 -0
  45. package/dist/recovery-copilot.js +120 -0
  46. package/dist/recovery-copilot.js.map +1 -0
  47. package/dist/recovery-desktop.d.ts +7 -0
  48. package/dist/recovery-desktop.d.ts.map +1 -0
  49. package/dist/recovery-desktop.js +179 -0
  50. package/dist/recovery-desktop.js.map +1 -0
  51. package/dist/recovery-external.d.ts +61 -0
  52. package/dist/recovery-external.d.ts.map +1 -0
  53. package/dist/recovery-external.js +98 -0
  54. package/dist/recovery-external.js.map +1 -0
  55. package/dist/recovery-hooks.d.ts +5 -0
  56. package/dist/recovery-hooks.d.ts.map +1 -0
  57. package/dist/recovery-hooks.js +115 -0
  58. package/dist/recovery-hooks.js.map +1 -0
  59. package/dist/recovery-hosts.d.ts +13 -0
  60. package/dist/recovery-hosts.d.ts.map +1 -0
  61. package/dist/recovery-hosts.js +326 -0
  62. package/dist/recovery-hosts.js.map +1 -0
  63. package/dist/recovery-polytoken.d.ts +14 -0
  64. package/dist/recovery-polytoken.d.ts.map +1 -0
  65. package/dist/recovery-polytoken.js +194 -0
  66. package/dist/recovery-polytoken.js.map +1 -0
  67. package/dist/recovery-prompt.d.ts +6 -0
  68. package/dist/recovery-prompt.d.ts.map +1 -0
  69. package/dist/recovery-prompt.js +53 -0
  70. package/dist/recovery-prompt.js.map +1 -0
  71. package/dist/recovery-remote.d.ts +8 -0
  72. package/dist/recovery-remote.d.ts.map +1 -0
  73. package/dist/recovery-remote.js +135 -0
  74. package/dist/recovery-remote.js.map +1 -0
  75. package/dist/recovery-state.d.ts +25 -1
  76. package/dist/recovery-state.d.ts.map +1 -1
  77. package/dist/recovery-state.js +69 -15
  78. package/dist/recovery-state.js.map +1 -1
  79. package/dist/recovery-t3.d.ts +17 -0
  80. package/dist/recovery-t3.d.ts.map +1 -0
  81. package/dist/recovery-t3.js +58 -0
  82. package/dist/recovery-t3.js.map +1 -0
  83. package/dist/recovery-transfer.d.ts +23 -0
  84. package/dist/recovery-transfer.d.ts.map +1 -0
  85. package/dist/recovery-transfer.js +234 -0
  86. package/dist/recovery-transfer.js.map +1 -0
  87. package/dist/recovery.d.ts +9 -1
  88. package/dist/recovery.d.ts.map +1 -1
  89. package/dist/recovery.js +197 -67
  90. package/dist/recovery.js.map +1 -1
  91. package/dist/reliability-store.d.ts +1 -0
  92. package/dist/reliability-store.d.ts.map +1 -1
  93. package/dist/reliability-store.js +23 -0
  94. package/dist/reliability-store.js.map +1 -1
  95. package/dist/runtime.d.ts.map +1 -1
  96. package/dist/runtime.js +39 -11
  97. package/dist/runtime.js.map +1 -1
  98. package/dist/self-host.d.ts +1 -1
  99. package/dist/self-host.js +2 -2
  100. package/dist/uninstall.d.ts +19 -0
  101. package/dist/uninstall.d.ts.map +1 -0
  102. package/dist/uninstall.js +135 -0
  103. package/dist/uninstall.js.map +1 -0
  104. package/dist/update.js +3 -3
  105. package/package.json +3 -3
@@ -0,0 +1,326 @@
1
+ import { spawn } from "node:child_process";
2
+ import { constants } from "node:fs";
3
+ import { mkdir, open, readdir, realpath, rename, rmdir, unlink } from "node:fs/promises";
4
+ import { basename, dirname, resolve } from "node:path";
5
+ import { createHash, randomUUID } from "node:crypto";
6
+ import { z } from "zod";
7
+ import { AGENTS, LAUNCHABLE_AGENTS, findAgentExecutable, isLaunchable } from "./agents.js";
8
+ import { cliInvocation, recoveryFallback } from "./recovery.js";
9
+ import { recoveryStore, RecoveryRunSchema, recoveryRunKey, recordRecoveryMetric } from "./recovery-state.js";
10
+ import { captureExternalRecovery, ExternalCheckpoint, ExternalSettings, externalSessionKey } from "./recovery-external.js";
11
+ import { readT3Checkpoints } from "./recovery-t3.js";
12
+ import { VSCODE_RECOVERY_ASSETS } from "./generated-assets.js";
13
+ import { shellQuote } from "./recovery-transfer.js";
14
+ async function privateWrite(path, text, mode = 0o600) {
15
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
16
+ const temporary = `${path}.${randomUUID()}`;
17
+ const file = await open(temporary, "wx", mode);
18
+ try {
19
+ await file.writeFile(text);
20
+ }
21
+ finally {
22
+ await file.close();
23
+ }
24
+ try {
25
+ await rename(temporary, path);
26
+ }
27
+ finally {
28
+ await unlink(temporary).catch(() => { });
29
+ }
30
+ }
31
+ export async function readOwnedJson(path, max = 1024 * 1024) {
32
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
33
+ try {
34
+ const stat = await file.stat();
35
+ if (!stat.isFile() || stat.size > max || (process.getuid && stat.uid !== process.getuid()))
36
+ throw new Error("Recovery input is not a bounded owned file");
37
+ return JSON.parse(await file.readFile("utf8"));
38
+ }
39
+ finally {
40
+ await file.close();
41
+ }
42
+ }
43
+ const startupPath = (home) => process.platform === "darwin"
44
+ ? resolve(home, "Library/LaunchAgents/co.uselore.recovery.plist")
45
+ : resolve(home, ".config/autostart/lore-recovery.desktop");
46
+ const xml = (s) => s.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;");
47
+ export async function installExternalRecovery(paths, hosts, cwd, fallback, start = true) {
48
+ const selected = hosts.filter(h => ["t3code", "cowork", "copilot-vscode"].includes(h));
49
+ if (!selected.length || await recoveryStore(paths.home).readState("disabled"))
50
+ return [];
51
+ const prior = ExternalSettings.safeParse(await recoveryStore(paths.home).readState("external-settings"));
52
+ const chosen = fallback ?? (prior.success ? prior.data.fallback : await recoveryFallback(paths.home)) ??
53
+ (await Promise.all(LAUNCHABLE_AGENTS.map(async (a) => await findAgentExecutable(a).then(() => a, () => undefined)))).find(Boolean);
54
+ if (!chosen || !isLaunchable(chosen))
55
+ return ["Host recovery needs an available fallback coding tool. Reconnect with --fallback <tool> after installing one."];
56
+ const root = await realpath(cwd);
57
+ const settings = prior.success ? prior.data : { fallback: chosen, coworkRoots: [], vscodeRoots: [], vscodeHookFiles: [], since: Date.now() };
58
+ if (fallback)
59
+ settings.fallback = chosen;
60
+ const notices = [];
61
+ if (selected.includes("t3code"))
62
+ settings.t3Database = resolve(dirname(paths.t3Settings), "state.sqlite");
63
+ if (selected.includes("cowork")) {
64
+ const folder = resolve(root, ".lore-recovery/cowork");
65
+ await privateWrite(resolve(root, ".lore-recovery/.gitignore"), "*\n");
66
+ await privateWrite(resolve(folder, "bridge.json"), JSON.stringify({ version: 1 }));
67
+ if (!settings.coworkRoots.includes(root))
68
+ settings.coworkRoots.push(root);
69
+ notices.push("Cowork checkpoints are connected for this shared folder. Cap recovery remains unverified until Cowork emits a rate_limit StopFailure hook.");
70
+ }
71
+ if (selected.includes("copilot-vscode")) {
72
+ if (!settings.vscodeRoots.includes(root))
73
+ settings.vscodeRoots.push(root);
74
+ // VS Code supports unpacked extensions in its user extension directory.
75
+ // Keep connection data out of workspace-controlled settings and command lines.
76
+ const folder = resolve(process.env.VSCODE_EXTENSIONS || resolve(paths.home, ".vscode/extensions"), "lore-co.lore-recovery-0.1.0");
77
+ settings.vscodeExtension = folder;
78
+ const hooks = await readOwnedJson(paths.copilotVscodeHooks).catch(e => { if (e.code === "ENOENT")
79
+ return {}; throw e; });
80
+ if (hooks.hooks && (!hooks.hooks || typeof hooks.hooks !== "object" || Array.isArray(hooks.hooks)))
81
+ throw new Error("Invalid VS Code hooks");
82
+ hooks.hooks ??= {};
83
+ if (hooks.hooks.UserPromptSubmit && !Array.isArray(hooks.hooks.UserPromptSubmit))
84
+ throw new Error("Invalid VS Code prompt hooks");
85
+ const command = `env -u BUN_OPTIONS -u BUN_BE_BUN LORE_HOME=${shellQuote(paths.home)} ${cliInvocation().map(shellQuote).join(" ")} recovery editor-hook --owner lore-recovery`;
86
+ hooks.hooks.UserPromptSubmit = [{ type: "command", command, timeout: 5 }, ...(hooks.hooks.UserPromptSubmit ?? []).filter((h) => !String(h.command ?? "").includes("--owner lore-recovery"))];
87
+ if (!settings.vscodeHookFiles.includes(paths.copilotVscodeHooks))
88
+ settings.vscodeHookFiles.push(paths.copilotVscodeHooks);
89
+ await privateWrite(paths.copilotVscodeHooks, JSON.stringify(hooks, null, 2) + "\n");
90
+ for (const [name, text] of Object.entries(VSCODE_RECOVERY_ASSETS))
91
+ await privateWrite(resolve(folder, name), text);
92
+ await privateWrite(resolve(folder, "connection.json"), JSON.stringify({ home: paths.home, invocation: cliInvocation(), path: process.env.PATH, roots: settings.vscodeRoots, since: settings.since }));
93
+ notices.push("Lore Recovery editor integration installed. Reload VS Code once; it reads active Copilot responses when their request IDs match a saved session. New unsaved and background chats use the saved-session fallback.");
94
+ }
95
+ await recoveryStore(paths.home).writeState("external-settings", settings);
96
+ if (settings.t3Database || settings.coworkRoots.length) {
97
+ await installRecoveryMonitor(paths.home, start);
98
+ }
99
+ return notices;
100
+ }
101
+ export async function installRecoveryMonitor(home, start = true) {
102
+ const command = [...cliInvocation(), "recovery", "monitor"];
103
+ const script = resolve(home, ".lore/recovery/monitor.sh");
104
+ await privateWrite(script, `#!/bin/sh\nexec env -u BUN_OPTIONS -u BUN_BE_BUN PATH=${shellQuote(process.env.PATH || "/usr/bin:/bin")} LORE_HOME=${shellQuote(home)} ${command.map(shellQuote).join(" ")}\n`, 0o700);
105
+ const startup = startupPath(home);
106
+ if (process.platform === "darwin")
107
+ await privateWrite(startup, `<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>Label</key><string>co.uselore.recovery</string><key>ProgramArguments</key><array><string>/bin/sh</string><string>${xml(script)}</string></array><key>RunAtLoad</key><true/><key>KeepAlive</key><false/></dict></plist>\n`);
108
+ else
109
+ await privateWrite(startup, `[Desktop Entry]\nType=Application\nName=Lore recovery\nExec=/bin/sh "${script.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%")}"\nX-GNOME-Autostart-enabled=true\n`);
110
+ await recoveryStore(home).writeState("external-startup", { path: startup });
111
+ if (start) {
112
+ const child = spawn(command[0], command.slice(1), { detached: true, stdio: "ignore", env: { ...process.env, LORE_HOME: home, BUN_OPTIONS: undefined, BUN_BE_BUN: undefined } });
113
+ child.once("error", () => { });
114
+ child.unref();
115
+ }
116
+ }
117
+ export async function disableExternalRecovery(home) {
118
+ const settings = ExternalSettings.safeParse(await recoveryStore(home).readState("external-settings"));
119
+ if (settings.success)
120
+ for (const path of settings.data.vscodeHookFiles) {
121
+ const document = await readOwnedJson(path).catch(e => { if (e.code === "ENOENT")
122
+ return undefined; throw e; });
123
+ if (!Array.isArray(document?.hooks?.UserPromptSubmit))
124
+ continue;
125
+ document.hooks.UserPromptSubmit = document.hooks.UserPromptSubmit.filter((h) => !String(h.command ?? "").includes("--owner lore-recovery"));
126
+ if (!document.hooks.UserPromptSubmit.length)
127
+ delete document.hooks.UserPromptSubmit;
128
+ await privateWrite(path, JSON.stringify(document, null, 2) + "\n");
129
+ }
130
+ if (settings.success && settings.data.vscodeExtension) {
131
+ const file = resolve(settings.data.vscodeExtension, "connection.json");
132
+ const connection = await readOwnedJson(file, 32000).catch(() => undefined);
133
+ if (connection?.home === home)
134
+ await privateWrite(file, JSON.stringify({ ...connection, disabled: true }));
135
+ }
136
+ const state = z.object({ path: z.string() }).safeParse(await recoveryStore(home).readState("external-startup"));
137
+ if (state.success && state.data.path === startupPath(home))
138
+ await unlink(state.data.path).catch(e => { if (e.code !== "ENOENT")
139
+ throw e; });
140
+ await recoveryStore(home).deleteState("external-settings");
141
+ await recoveryStore(home).deleteState("cloud-runners");
142
+ await recoveryStore(home).deleteState("external-startup");
143
+ }
144
+ const COWORK_CHECKPOINT_MAX_AGE = 24 * 3600 * 1000;
145
+ const COWORK_CHECKPOINT_LIMIT = 64;
146
+ async function readCoworkCheckpoint(path) {
147
+ const event = ExternalCheckpoint.parse(await readOwnedJson(path, 256 * 1024));
148
+ const digest = createHash("sha256").update(event.sessionId).digest("hex");
149
+ if (event.host !== "cowork" || event.sourceAgent !== "claude" || basename(path) !== `${digest}.json`) {
150
+ throw new Error("Invalid Cowork checkpoint identity");
151
+ }
152
+ return event;
153
+ }
154
+ async function pruneCoworkCheckpoint(path, cutoff) {
155
+ // Share the producer's per-session lock. Never wait for or steal a writer's
156
+ // lock, and re-read after acquiring it: the session may have just resumed.
157
+ const lock = path.replace(/\.json$/, ".lock");
158
+ try {
159
+ await mkdir(lock, { mode: 0o700 });
160
+ }
161
+ catch {
162
+ return;
163
+ }
164
+ try {
165
+ const current = await readCoworkCheckpoint(path);
166
+ if (current.observedAt >= cutoff)
167
+ return current;
168
+ await unlink(path);
169
+ }
170
+ finally {
171
+ await rmdir(lock).catch(() => { });
172
+ }
173
+ }
174
+ async function collectCoworkCheckpoints(folder, since) {
175
+ const now = Date.now(), cutoff = now - COWORK_CHECKPOINT_MAX_AGE;
176
+ const names = (await readdir(folder).catch(() => [])).filter(name => /^[a-f0-9]{64}\.json$/.test(name));
177
+ const checkpoints = [];
178
+ let invalid = false;
179
+ // Shared mounts can change mtimes. Use the recorded observation time and
180
+ // filter before capping; bound open files and retained bodies during scans.
181
+ for (let offset = 0; offset < names.length; offset += 8) {
182
+ const batch = await Promise.all(names.slice(offset, offset + 8).map(async (name) => {
183
+ try {
184
+ const path = resolve(folder, name);
185
+ let event = await readCoworkCheckpoint(path);
186
+ if (event.observedAt < cutoff)
187
+ event = await pruneCoworkCheckpoint(path, cutoff);
188
+ if (!event || event.observedAt < since || event.observedAt > now + 5000)
189
+ return;
190
+ return event;
191
+ }
192
+ catch (error) {
193
+ if (error.code !== "ENOENT")
194
+ invalid = true;
195
+ return;
196
+ }
197
+ }));
198
+ for (const event of batch)
199
+ if (event)
200
+ checkpoints.push(event);
201
+ checkpoints.sort((a, b) => b.observedAt - a.observedAt || a.sessionId.localeCompare(b.sessionId));
202
+ checkpoints.splice(COWORK_CHECKPOINT_LIMIT);
203
+ }
204
+ return { checkpoints, invalid };
205
+ }
206
+ export async function pollExternalRecovery(home, notify) {
207
+ const store = recoveryStore(home);
208
+ if (await store.readState("disabled"))
209
+ return;
210
+ const parsed = ExternalSettings.safeParse(await store.readState("external-settings"));
211
+ if (!parsed.success)
212
+ return;
213
+ const settings = parsed.data;
214
+ const health = {};
215
+ if (settings.t3Database) {
216
+ try {
217
+ for (const event of await readT3Checkpoints(settings.t3Database, Math.max(settings.since, Date.now() - 24 * 3600 * 1000))) {
218
+ await captureExternalRecovery(home, event, notify);
219
+ }
220
+ health.t3code = "observing";
221
+ }
222
+ catch (e) {
223
+ health.t3code = e.code === "ENOENT" ? "waiting for T3 database" : `unavailable: ${e.message}`;
224
+ }
225
+ }
226
+ for (const root of settings.coworkRoots) {
227
+ const folder = resolve(root, ".lore-recovery/cowork");
228
+ const { checkpoints, invalid } = await collectCoworkCheckpoints(folder, settings.since);
229
+ if (invalid)
230
+ health.cowork ??= "unavailable: invalid checkpoint";
231
+ for (const event of checkpoints) {
232
+ try {
233
+ // A shared mount is explicitly paired at connect. Never use a VM's cwd on the host.
234
+ await captureExternalRecovery(home, { ...event, cwd: root, observedAt: Date.now() }, notify);
235
+ if (event.state === "failed" || health.cowork !== "rate_limit failure hook observed") {
236
+ health.cowork = event.state === "failed" ? "rate_limit failure hook observed" : "checkpoints observed; cap hook unverified";
237
+ }
238
+ }
239
+ catch {
240
+ health.cowork = "unavailable: invalid checkpoint";
241
+ }
242
+ }
243
+ }
244
+ await store.writeState("external-health", { at: new Date().toISOString(), ...health });
245
+ }
246
+ export async function runExternalMonitor(home) {
247
+ const store = recoveryStore(home);
248
+ const owner = randomUUID();
249
+ while (!(await store.readState("disabled")) && (await store.readState("external-settings") || await store.readState("cloud-runners"))) {
250
+ let claimed = false;
251
+ await store.updateState("external-monitor", current => {
252
+ const prior = z.object({ owner: z.string(), until: z.number(), pid: z.number().int().positive() }).safeParse(current);
253
+ if (prior.success && prior.data.owner !== owner && prior.data.until > Date.now()) {
254
+ try {
255
+ process.kill(prior.data.pid, 0);
256
+ return current;
257
+ }
258
+ catch { /* previous login/process ended */ }
259
+ }
260
+ claimed = true;
261
+ return { owner, pid: process.pid, until: Date.now() + 30000 };
262
+ });
263
+ if (!claimed)
264
+ return;
265
+ await (await import("./recovery-cloud.js")).pollCloudRunners(home).catch(async () => { await store.writeState("cloud-runner-health", { error: "Cloud runner poll failed; check Lore connectivity", at: Date.now() }); });
266
+ await pollExternalRecovery(home).catch(async () => {
267
+ await store.writeState("external-health", { at: new Date().toISOString(), monitor: "A host read failed; retrying" });
268
+ });
269
+ await new Promise(done => setTimeout(done, 1500));
270
+ }
271
+ }
272
+ export async function externalCheckpointCommand(home) {
273
+ let body = "";
274
+ for await (const chunk of process.stdin) {
275
+ body += chunk;
276
+ if (Buffer.byteLength(body) > 256 * 1024)
277
+ throw new Error("Checkpoint exceeds recovery input limit");
278
+ }
279
+ const event = JSON.parse(body);
280
+ // This entry point belongs to the installed editor bridge only.
281
+ if (event.host !== "copilot-vscode" || event.sourceAgent !== "copilot-cli")
282
+ throw new Error("Unsupported editor recovery source");
283
+ const id = await captureExternalRecovery(home, event, async () => { });
284
+ const run = id ? RecoveryRunSchema.parse(await recoveryStore(home).readState(recoveryRunKey(id))) : undefined;
285
+ if (run?.failure)
286
+ await recordRecoveryMetric(home, run.id, run.failure.id, "offered");
287
+ process.stdout.write(JSON.stringify({ id, failureId: run?.failure?.id, target: run && AGENTS[run.targetAgent].label }));
288
+ }
289
+ /** Stop offering the old saved result immediately when the editor starts a new prompt. */
290
+ export async function invalidateEditorRecovery(home, value) {
291
+ const input = z.object({ session_id: z.string().min(1).max(500), cwd: z.string() }).safeParse(value);
292
+ if (!input.success)
293
+ return;
294
+ const store = recoveryStore(home), cwd = await realpath(input.data.cwd);
295
+ const settings = ExternalSettings.safeParse(await store.readState("external-settings"));
296
+ if (!settings.success || !settings.data.vscodeRoots.includes(cwd) || await store.readState("disabled"))
297
+ return;
298
+ const key = externalSessionKey({ host: "copilot-vscode", sessionId: input.data.session_id, cwd });
299
+ const mapping = z.object({ id: z.uuid() }).safeParse(await store.readState(key));
300
+ if (!mapping.success)
301
+ return;
302
+ await store.updateState(recoveryRunKey(mapping.data.id), current => {
303
+ const run = RecoveryRunSchema.parse(current);
304
+ run.supersededTurnId = run.nativeTurnId;
305
+ run.failure = null;
306
+ run.turnPending = false;
307
+ return run;
308
+ });
309
+ }
310
+ export async function validateExternalRecovery(home, run) {
311
+ const settings = ExternalSettings.parse(await recoveryStore(home).readState("external-settings"));
312
+ if (run.sourceHost === "t3code") {
313
+ const latest = settings.t3Database ? (await readT3Checkpoints(settings.t3Database, settings.since)).find(e => e.sessionId === run.sessionId) : undefined;
314
+ if (!latest || latest.turnId !== run.nativeTurnId || latest.sourceAgent !== run.sourceAgent || latest.state !== "failed" || await realpath(latest.cwd) !== run.cwd)
315
+ throw new Error("T3 moved on from the failed turn");
316
+ }
317
+ else if (run.sourceHost === "cowork") {
318
+ if (!settings.coworkRoots.includes(run.cwd))
319
+ throw new Error("Cowork workspace is no longer connected");
320
+ const digest = createHash("sha256").update(run.sessionId).digest("hex");
321
+ const latest = await readOwnedJson(resolve(run.cwd, ".lore-recovery/cowork", `${digest}.json`), 256 * 1024);
322
+ if (latest.sessionId !== run.sessionId || latest.turnId !== run.nativeTurnId || latest.state !== "failed")
323
+ throw new Error("Cowork moved on from the failed turn");
324
+ }
325
+ }
326
+ //# sourceMappingURL=recovery-hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-hosts.js","sourceRoot":"","sources":["../src/recovery-hosts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type RecoveryRun } from "./recovery-state.js";
2
+ export declare function polytokenConnection(run: RecoveryRun, env?: NodeJS.ProcessEnv): Promise<{
3
+ base: string;
4
+ headers: {
5
+ Authorization: string;
6
+ };
7
+ json: (path: string, method?: string) => Promise<any>;
8
+ }>;
9
+ export declare function polytokenFailureReason(value: unknown, sessionId: string, promptId: string): "rate_limit" | "agent_error" | undefined;
10
+ /** Subscribe before pre_model_turn returns, so an immediate 429 cannot be missed. */
11
+ export declare function observePolytokenRecovery(home: string, id: string, env?: NodeJS.ProcessEnv): () => void;
12
+ /** A failed turn can leave the daemon active. Yes cancels that exact saved prompt. */
13
+ export declare function verifyPolytokenStopped(run: RecoveryRun, env?: NodeJS.ProcessEnv): Promise<void>;
14
+ //# sourceMappingURL=recovery-polytoken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-polytoken.d.ts","sourceRoot":"","sources":["../src/recovery-polytoken.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8F,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMnJ,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,oBAAc;;;;;iBAejD,MAAM;GAajC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAOpI;AA4BD,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAc,GAAG,MAAM,IAAI,CA4ChG;AAED,sFAAsF;AACtF,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,oBAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/F"}
@@ -0,0 +1,194 @@
1
+ import { open, realpath } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { z } from "zod";
5
+ import { RecoveryRunSchema, recoveryRunKey, recoveryStore, markRecoveryFailure, recoveryMessageText } from "./recovery-state.js";
6
+ import { readOwnedJson } from "./recovery-hosts.js";
7
+ const SessionId = z.string().regex(/^[0-9abcdefghjkmnpqrstvwxyz]{6}-[a-z][a-z0-9_]*(?:-[a-z][a-z0-9_]*)?$/u);
8
+ const Registry = z.object({ session_id: SessionId, port: z.number().int().min(1).max(65535), pid: z.number().int().positive(),
9
+ project_path: z.string(), credential_file_path: z.string(), parent_session_id: z.object({ kind: z.literal("standalone") }), non_interactive: z.literal(false).optional() });
10
+ export async function polytokenConnection(run, env = process.env) {
11
+ const id = SessionId.parse(run.sessionId);
12
+ const root = env.LORE_POLYTOKEN_SESSIONS_DIR || resolve(env.XDG_DATA_HOME || resolve(env.HOME || "", ".local/share"), "polytoken/sessions");
13
+ const directory = await realpath(resolve(root, id));
14
+ const record = Registry.parse(await readOwnedJson(resolve(directory, "record.json"), 16000));
15
+ if (record.session_id !== id || await realpath(record.project_path) !== run.root || await realpath(record.credential_file_path) !== resolve(directory, "credential.json"))
16
+ throw new Error("Polytoken registry does not match this session/worktree");
17
+ const file = await open(resolve(directory, "credential.json"), constants.O_RDONLY | constants.O_NOFOLLOW);
18
+ let token;
19
+ try {
20
+ const stat = await file.stat();
21
+ if (!stat.isFile() || stat.size > 16000 || stat.mode & 0o077 || process.getuid && stat.uid !== process.getuid())
22
+ throw new Error("Polytoken credential must be private and owned");
23
+ token = z.object({ version: z.literal(1), token: z.string().min(32).max(500) }).parse(JSON.parse(await file.readFile("utf8"))).token;
24
+ }
25
+ finally {
26
+ await file.close();
27
+ }
28
+ const base = `http://127.0.0.1:${record.port}`;
29
+ const headers = { Authorization: `Bearer ${token}` };
30
+ async function json(path, method = "GET") {
31
+ const response = await fetch(base + path, { method, headers, redirect: "error", signal: AbortSignal.timeout(2500) });
32
+ if (path === "/turn/cancel" && method === "POST" && response.status === 409) {
33
+ await response.body?.cancel();
34
+ return { loreNoActiveTurn: true };
35
+ }
36
+ if (!response.ok)
37
+ throw new Error(`Polytoken ${path.split("?")[0]} returned HTTP ${response.status}`);
38
+ let body = "";
39
+ for await (const chunk of response.body ?? []) {
40
+ body += Buffer.from(chunk).toString("utf8");
41
+ if (Buffer.byteLength(body) > 2 * 1024 * 1024) {
42
+ await response.body?.cancel().catch(() => { });
43
+ throw new Error("Polytoken response exceeds recovery read limit");
44
+ }
45
+ }
46
+ return JSON.parse(body);
47
+ }
48
+ const health = await json("/health");
49
+ if (health.session_id !== id || health.pid !== record.pid || await realpath(health.project_path) !== run.root || health.parent_session_id?.kind !== "standalone")
50
+ throw new Error("Polytoken daemon identity changed");
51
+ return { base, headers, json };
52
+ }
53
+ export function polytokenFailureReason(value, sessionId, promptId) {
54
+ const parsed = z.object({ session_id: z.string(), event: z.object({ type: z.string(), prompt_id: z.string().optional(), subagent_handle: z.string().nullish(), error: z.object({ type: z.string() }).optional() }) }).safeParse(value);
55
+ if (!parsed.success || parsed.data.session_id !== sessionId)
56
+ return;
57
+ const event = parsed.data.event;
58
+ if (event.subagent_handle || event.prompt_id !== promptId || event.type !== "model_error")
59
+ return;
60
+ if (event.error?.type === "rate_limited")
61
+ return "rate_limit";
62
+ if (["auth_failed", "login_required", "model_not_found", "account_model_mismatch", "context_too_large", "transport", "protocol_malformed", "other"].includes(event.error?.type ?? ""))
63
+ return "agent_error";
64
+ }
65
+ async function refreshPolytokenContext(home, run, connection) {
66
+ const head = await connection.json("/history?limit=20");
67
+ const total = z.number().int().nonnegative().parse(head.total_projected_items);
68
+ const tail = total <= 20 ? head : await connection.json(`/history?offset=${Math.max(0, total - 40)}&limit=40`);
69
+ if (head.session_id !== run.sessionId || tail.session_id !== run.sessionId || !Array.isArray(tail.items))
70
+ return;
71
+ const users = tail.items.filter((item) => item.type === "user");
72
+ if (users.at(-1)?.prompt_id !== run.nativeTurnId)
73
+ return;
74
+ const safe = recoveryMessageText;
75
+ const messages = tail.items.flatMap((item) => {
76
+ if (item.type === "user" && typeof item.content === "string")
77
+ return [{ role: "user", text: safe(item.content) }];
78
+ if (item.type === "assistant" && Array.isArray(item.blocks)) {
79
+ const text = item.blocks.filter((b) => b.type === "text" && typeof b.text === "string").map((b) => b.text).join("\n");
80
+ return text ? [{ role: "assistant", text: safe(text) }] : [];
81
+ }
82
+ return [];
83
+ }).slice(-20);
84
+ const goal = Array.isArray(head.items) ? head.items.find((item) => item.type === "user" && typeof item.content === "string")?.content : undefined;
85
+ await recoveryStore(home).updateState(recoveryRunKey(run.id), value => {
86
+ const current = RecoveryRunSchema.parse(value);
87
+ if (current.turn !== run.turn || current.nativeTurnId !== run.nativeTurnId || current.sessionId !== run.sessionId)
88
+ return current;
89
+ if (messages.length)
90
+ current.messages = messages;
91
+ if (goal)
92
+ current.goal = safe(goal);
93
+ return current;
94
+ });
95
+ }
96
+ /** Subscribe before pre_model_turn returns, so an immediate 429 cannot be missed. */
97
+ export function observePolytokenRecovery(home, id, env = process.env) {
98
+ const store = recoveryStore(home);
99
+ let stopped = false;
100
+ let controller;
101
+ const work = async () => {
102
+ while (!stopped) {
103
+ try {
104
+ const run = RecoveryRunSchema.parse(await store.readState(recoveryRunKey(id)));
105
+ if (!run.sessionId || !run.nativeTurnId || !run.turnPending) {
106
+ await new Promise(done => setTimeout(done, 100));
107
+ continue;
108
+ }
109
+ const connection = await polytokenConnection(run, env);
110
+ controller = new AbortController();
111
+ const timeout = setTimeout(() => controller?.abort(), 2500);
112
+ let response;
113
+ try {
114
+ response = await fetch(connection.base + "/events", { headers: connection.headers, redirect: "error", signal: controller.signal });
115
+ }
116
+ finally {
117
+ clearTimeout(timeout);
118
+ }
119
+ if (!response.ok || !response.body)
120
+ throw new Error("Polytoken event stream unavailable");
121
+ await store.writeState(`polytoken-ready-${id}`, { sessionId: run.sessionId, pid: process.pid, at: Date.now() });
122
+ let buffer = "";
123
+ const decoder = new TextDecoder();
124
+ for await (const chunk of response.body) {
125
+ if (stopped)
126
+ break;
127
+ buffer += decoder.decode(chunk, { stream: true });
128
+ if (Buffer.byteLength(buffer) > 1024 * 1024)
129
+ throw new Error("Polytoken event exceeds recovery limit");
130
+ let end;
131
+ while ((end = buffer.indexOf("\n")) >= 0) {
132
+ const line = buffer.slice(0, end).trimEnd();
133
+ buffer = buffer.slice(end + 1);
134
+ if (!line.startsWith("data:"))
135
+ continue;
136
+ let event;
137
+ try {
138
+ event = JSON.parse(line.slice(5));
139
+ }
140
+ catch {
141
+ continue;
142
+ }
143
+ const current = RecoveryRunSchema.parse(await store.readState(recoveryRunKey(id)));
144
+ const reason = current.nativeTurnId && current.sessionId ? polytokenFailureReason(event, current.sessionId, current.nativeTurnId) : undefined;
145
+ if (reason) {
146
+ await refreshPolytokenContext(home, current, connection).catch(() => { });
147
+ await markRecoveryFailure(home, current, reason);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch { /* A later pre-model hook retries the subscription; never scrape UI text. */ }
153
+ finally {
154
+ const ready = await store.readState(`polytoken-ready-${id}`);
155
+ if (ready?.pid === process.pid)
156
+ await store.deleteState(`polytoken-ready-${id}`);
157
+ controller?.abort();
158
+ }
159
+ if (!stopped)
160
+ await new Promise(done => setTimeout(done, 250));
161
+ }
162
+ };
163
+ void work();
164
+ return () => { stopped = true; controller?.abort(); };
165
+ }
166
+ /** A failed turn can leave the daemon active. Yes cancels that exact saved prompt. */
167
+ export async function verifyPolytokenStopped(run, env = process.env) {
168
+ const connection = await polytokenConnection(run, env);
169
+ const head = await connection.json("/history?limit=1");
170
+ const total = z.number().int().nonnegative().parse(head.total_projected_items);
171
+ const tail = await connection.json(`/history?offset=${Math.max(0, total - 100)}&limit=100`);
172
+ const latest = Array.isArray(tail.items) ? tail.items.filter((item) => item.type === "user").at(-1) : undefined;
173
+ if (tail.session_id !== run.sessionId || latest?.prompt_id !== run.nativeTurnId)
174
+ throw new Error("Polytoken has moved to another prompt");
175
+ const state = await connection.json("/state");
176
+ if (state.turn_in_flight !== false) {
177
+ if ((await connection.json("/turn/cancel", "POST")).loreNoActiveTurn === true)
178
+ return;
179
+ const deadline = Date.now() + 2500;
180
+ while (Date.now() < deadline) {
181
+ const next = await connection.json("/state");
182
+ if (next.turn_in_flight === false)
183
+ return;
184
+ // Older daemons omit turn_in_flight. Their documented 409 is the idle acknowledgement.
185
+ if (next.turn_in_flight === undefined && (await connection.json("/turn/cancel", "POST")).loreNoActiveTurn === true)
186
+ return;
187
+ await new Promise(done => setTimeout(done, 100));
188
+ }
189
+ throw new Error("Polytoken did not stop the failed turn; handoff was not launched");
190
+ }
191
+ if (state.turn_in_flight !== false)
192
+ throw new Error("Polytoken did not expose its turn state");
193
+ }
194
+ //# sourceMappingURL=recovery-polytoken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-polytoken.js","sourceRoot":"","sources":["../src/recovery-polytoken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAoB,MAAM,qBAAqB,CAAC;AACnJ,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;AAC7G,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC3H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9K,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAgB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAC3E,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,cAAc,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC5I,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7F,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACtP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1G,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACnL,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACvI,CAAC;YAAS,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IACjC,MAAM,IAAI,GAAG,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;IACrD,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,MAAM,GAAG,KAAK;QAC9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrH,IAAI,IAAI,KAAK,cAAc,IAAI,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5E,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAAC,CAAC;QAAC,CAAC;QACpQ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,iBAAiB,EAAE,IAAI,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,SAAiB,EAAE,QAAgB;IACxF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO;IAClG,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,cAAc;QAAE,OAAO,YAAY,CAAC;IAC9D,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,aAAa,CAAC;AAC9M,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,GAAgB,EAAE,UAA2D;IAChI,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;IAC/G,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO;IACjH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,GAAG,CAAC,YAAY;QAAE,OAAO;IACzD,MAAM,IAAI,GAAG,mBAAmB,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;QAChD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3H,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACvJ,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE;QACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC;QAClI,IAAI,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjD,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,EAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAClF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,OAAO,GAAG,KAAK,CAAC;IAAC,IAAI,UAAuC,CAAC;IACpG,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,OAAO,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC5H,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvD,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC5D,IAAI,QAAkB,CAAC;gBACvB,IAAI,CAAC;oBAAC,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAAC,CAAC;wBACnI,CAAC;oBAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC1F,MAAM,KAAK,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChH,IAAI,MAAM,GAAG,EAAE,CAAC;gBAAC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;gBACnD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,IAAI,OAAO;wBAAE,MAAM;oBACnB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;oBACvG,IAAI,GAAW,CAAC;oBAChB,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;wBAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBAC5E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;4BAAE,SAAS;wBACxC,IAAI,KAAU,CAAC;wBAAC,IAAI,CAAC;4BAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBAC9E,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACnF,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC9I,IAAI,MAAM,EAAE,CAAC;4BACX,MAAM,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BACzE,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;wBACnD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,4EAA4E,CAAC,CAAC;oBAChF,CAAC;gBACP,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,CAA4B,CAAC;gBACxF,IAAI,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG;oBAAE,MAAM,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBACjF,UAAU,EAAE,KAAK,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;IACF,KAAK,IAAI,EAAE,CAAC;IACZ,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAgB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAC9E,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrH,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,SAAS,KAAK,GAAG,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1I,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,KAAK,IAAI;YAAE,OAAO;QACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK;gBAAE,OAAO;YAC1C,uFAAuF;YACvF,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,KAAK,IAAI;gBAAE,OAAO;YAC3H,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AACjG,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Decode only the offer's input, leaving the source agent's stdin untouched. */
2
+ export declare function createRecoveryPrompt(onAnswer: (yes: boolean) => void, onInvalid: () => void): {
3
+ write(chunk: Buffer): void;
4
+ dispose: () => void;
5
+ };
6
+ //# sourceMappingURL=recovery-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-prompt.d.ts","sourceRoot":"","sources":["../src/recovery-prompt.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI;iBA+B3E,MAAM,GAAG,IAAI;mBA5BR,IAAI;EA+BzB"}