@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { LAUNCHABLE_AGENTS, RECOVERY_SOURCES, findAgentExecutable } from "./agents.js";
|
|
5
|
+
import { createRecoveryRun, markRecoveryFailure, RecoveryRunSchema, recoveryRunKey, recoveryStore, recoveryMessageText } from "./recovery-state.js";
|
|
6
|
+
import { recoveryRoute } from "./recovery.js";
|
|
7
|
+
import { offerDesktopRecovery } from "./recovery-desktop.js";
|
|
8
|
+
export const ExternalCheckpoint = z.object({
|
|
9
|
+
host: z.enum(["t3code", "copilot-vscode", "cowork"]),
|
|
10
|
+
sourceAgent: z.enum(RECOVERY_SOURCES),
|
|
11
|
+
sessionId: z.string().min(1).max(500), turnId: z.string().min(1).max(500),
|
|
12
|
+
cwd: z.string().min(1), goal: z.string().min(1).max(24000),
|
|
13
|
+
messages: z.array(z.object({ role: z.enum(["user", "assistant"]), text: z.string().max(24000) })).max(20),
|
|
14
|
+
state: z.enum(["running", "completed", "failed", "cancelled"]),
|
|
15
|
+
reason: z.enum(["rate_limit", "agent_error"]).optional(),
|
|
16
|
+
observedAt: z.number(),
|
|
17
|
+
});
|
|
18
|
+
export const ExternalSettings = z.object({
|
|
19
|
+
fallback: z.enum(LAUNCHABLE_AGENTS),
|
|
20
|
+
t3Database: z.string().optional(),
|
|
21
|
+
coworkRoots: z.array(z.string()).default([]),
|
|
22
|
+
vscodeRoots: z.array(z.string()).default([]),
|
|
23
|
+
vscodeExtension: z.string().optional(),
|
|
24
|
+
vscodeHookFiles: z.array(z.string()).default([]),
|
|
25
|
+
since: z.number(),
|
|
26
|
+
});
|
|
27
|
+
export function externalSessionKey(input) {
|
|
28
|
+
return `external-${createHash("sha256").update(JSON.stringify([input.host, input.sessionId, input.cwd])).digest("hex")}`;
|
|
29
|
+
}
|
|
30
|
+
const safeText = recoveryMessageText;
|
|
31
|
+
/** Accept only host adapters' structured state. Text never determines failure. */
|
|
32
|
+
export async function captureExternalRecovery(home, value, notify) {
|
|
33
|
+
const parsed = ExternalCheckpoint.safeParse(value);
|
|
34
|
+
if (!parsed.success || Date.now() - parsed.data.observedAt > 30000 || parsed.data.observedAt > Date.now() + 5000)
|
|
35
|
+
return;
|
|
36
|
+
const store = recoveryStore(home);
|
|
37
|
+
if (await store.readState("disabled"))
|
|
38
|
+
return;
|
|
39
|
+
const settings = ExternalSettings.safeParse(await store.readState("external-settings"));
|
|
40
|
+
if (!settings.success)
|
|
41
|
+
return;
|
|
42
|
+
const input = parsed.data;
|
|
43
|
+
input.cwd = await realpath(input.cwd);
|
|
44
|
+
if (input.host === "cowork" && !settings.data.coworkRoots.includes(input.cwd))
|
|
45
|
+
return;
|
|
46
|
+
if (input.host === "copilot-vscode" && !settings.data.vscodeRoots.includes(input.cwd))
|
|
47
|
+
return;
|
|
48
|
+
const key = externalSessionKey(input);
|
|
49
|
+
const mapping = z.object({ id: z.uuid() }).safeParse(await store.readState(key));
|
|
50
|
+
let run = mapping.success ? RecoveryRunSchema.safeParse(await store.readState(recoveryRunKey(mapping.data.id))) : undefined;
|
|
51
|
+
if (run?.success && run.data.sourceAgent !== input.sourceAgent) {
|
|
52
|
+
await store.updateState(recoveryRunKey(run.data.id), current => ({ ...RecoveryRunSchema.parse(current), failure: null, turnPending: false }));
|
|
53
|
+
run = undefined;
|
|
54
|
+
}
|
|
55
|
+
if (!run?.success || Date.now() - Date.parse(run.data.startedAt) > 24 * 60 * 60 * 1000) {
|
|
56
|
+
// A resumed observer must not produce a handoff for an old completed chat.
|
|
57
|
+
if (input.state === "completed" || input.state === "cancelled")
|
|
58
|
+
return;
|
|
59
|
+
const route = await recoveryRoute(home, input.sourceAgent);
|
|
60
|
+
const fallback = route?.agent ?? settings.data.fallback;
|
|
61
|
+
if (fallback === input.sourceAgent)
|
|
62
|
+
return;
|
|
63
|
+
if (!route?.remote)
|
|
64
|
+
await findAgentExecutable(fallback);
|
|
65
|
+
const created = await createRecoveryRun(home, input.cwd, input.sourceAgent, fallback, route?.remote);
|
|
66
|
+
await store.writeState(key, { id: created.id });
|
|
67
|
+
run = { success: true, data: created };
|
|
68
|
+
}
|
|
69
|
+
const id = run.data.id;
|
|
70
|
+
await store.updateState(recoveryRunKey(id), current => {
|
|
71
|
+
const latest = RecoveryRunSchema.parse(current);
|
|
72
|
+
if (latest.sourceAgent !== input.sourceAgent)
|
|
73
|
+
return latest;
|
|
74
|
+
if (latest.supersededTurnId === input.turnId)
|
|
75
|
+
return latest;
|
|
76
|
+
if (latest.nativeTurnId !== input.turnId) {
|
|
77
|
+
latest.turn += 1;
|
|
78
|
+
latest.failure = null;
|
|
79
|
+
delete latest.supersededTurnId;
|
|
80
|
+
}
|
|
81
|
+
latest.sessionId = input.sessionId;
|
|
82
|
+
latest.nativeTurnId = input.turnId;
|
|
83
|
+
latest.goal = safeText(input.goal);
|
|
84
|
+
latest.messages = input.messages.map(m => ({ ...m, text: safeText(m.text) }));
|
|
85
|
+
latest.turnPending = input.state === "running" || input.state === "failed";
|
|
86
|
+
if (input.state !== "failed")
|
|
87
|
+
latest.failure = null;
|
|
88
|
+
latest.updatedAt = new Date().toISOString();
|
|
89
|
+
latest.sourceHost = input.host;
|
|
90
|
+
return latest;
|
|
91
|
+
});
|
|
92
|
+
if (input.state === "failed") {
|
|
93
|
+
await markRecoveryFailure(home, RecoveryRunSchema.parse(await store.readState(recoveryRunKey(id))), input.reason ?? "agent_error");
|
|
94
|
+
await offerDesktopRecovery(home, id, notify);
|
|
95
|
+
}
|
|
96
|
+
return id;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=recovery-external.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-external.js","sourceRoot":"","sources":["../src/recovery-external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAwB,MAAM,aAAa,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpJ,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACpD,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACzE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACzG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA6D;IAC9F,OAAO,YAAY,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3H,CAAC;AACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,KAAc,EAAE,MAAoD;IAC9H,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;QAAE,OAAO;IACzH,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;QAAE,OAAO;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,KAAK,CAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO;IACtF,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO;IAC9F,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5H,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9I,GAAG,GAAG,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACvF,2EAA2E;QAC3E,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QACvE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAoB,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzE,IAAI,QAAQ,KAAK,KAAK,CAAC,WAAW;YAAE,OAAO;QAC3C,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACrG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;YAAE,OAAO,MAAM,CAAC;QAC5D,IAAI,MAAM,CAAC,gBAAgB,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QAC5D,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,gBAAgB,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;QACvE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClH,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;QAC3E,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACpD,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;QACnI,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RecoverySource } from "./agents.js";
|
|
2
|
+
/** Native event fields, never text scraped from the agent's answer or terminal. */
|
|
3
|
+
export declare function normalizeRecoveryHook(agent: RecoverySource, value: unknown, env?: NodeJS.ProcessEnv): unknown;
|
|
4
|
+
export declare function mergeNativeRecoveryHooks(agent: "cursor" | "copilot-cli" | "polytoken", value: unknown, command: string | null): unknown;
|
|
5
|
+
//# sourceMappingURL=recovery-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-hooks.d.ts","sourceRoot":"","sources":["../src/recovery-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,oBAAc,GAAG,OAAO,CAmDvG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CA2BvI"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const OWNER = "--owner lore-recovery";
|
|
2
|
+
const isCore = (command) => typeof command === "string" && /--owner\s+lore(?:\s|$)/u.test(command);
|
|
3
|
+
/** Native event fields, never text scraped from the agent's answer or terminal. */
|
|
4
|
+
export function normalizeRecoveryHook(agent, value, env = process.env) {
|
|
5
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
6
|
+
return null;
|
|
7
|
+
const input = { ...value };
|
|
8
|
+
if (input.agent_id || input.isSidechain || input.parent_session_id)
|
|
9
|
+
return null;
|
|
10
|
+
if (agent === "cursor") {
|
|
11
|
+
input.session_id = input.conversation_id;
|
|
12
|
+
input.cwd ??= Array.isArray(input.workspace_roots) && input.workspace_roots.length === 1 ? input.workspace_roots[0] : undefined;
|
|
13
|
+
input.turn_id = input.generation_id;
|
|
14
|
+
if (input.hook_event_name === "beforeSubmitPrompt")
|
|
15
|
+
input.hook_event_name = "UserPromptSubmit";
|
|
16
|
+
else if (input.hook_event_name === "afterAgentResponse") {
|
|
17
|
+
input.hook_event_name = "Checkpoint";
|
|
18
|
+
input.last_assistant_message = input.text;
|
|
19
|
+
}
|
|
20
|
+
else if (input.hook_event_name === "stop") {
|
|
21
|
+
input.hook_event_name = input.status === "error" ? "StopFailure" : "Stop";
|
|
22
|
+
if (input.status === "error")
|
|
23
|
+
input.error = "agent_error";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (agent === "copilot-cli") {
|
|
27
|
+
input.session_id = input.sessionId;
|
|
28
|
+
input.hook_event_name ??= env.LORE_RECOVERY_EVENT;
|
|
29
|
+
if (input.hook_event_name === "userPromptSubmitted") {
|
|
30
|
+
input.hook_event_name = "UserPromptSubmit";
|
|
31
|
+
// The events journal records this same native hook timestamp before user.message.
|
|
32
|
+
if (Number.isSafeInteger(input.timestamp))
|
|
33
|
+
input.turn_id = `hook:${input.timestamp}`;
|
|
34
|
+
}
|
|
35
|
+
else if (input.hook_event_name === "agentStop") {
|
|
36
|
+
input.hook_event_name = "Stop";
|
|
37
|
+
input.last_assistant_message = input.response;
|
|
38
|
+
}
|
|
39
|
+
else if (input.hook_event_name === "errorOccurred") {
|
|
40
|
+
if (input.recoverable !== false || !["model_call", "system"].includes(input.errorContext))
|
|
41
|
+
return null;
|
|
42
|
+
input.hook_event_name = "StopFailure";
|
|
43
|
+
input.error = "agent_error";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (agent === "polytoken") {
|
|
47
|
+
input.hook_event_name ??= input.event ?? env.POLYTOKEN_HOOK_EVENT;
|
|
48
|
+
input.session_id ??= env.POLYTOKEN_SESSION_ID;
|
|
49
|
+
input.cwd ??= env.POLYTOKEN_PROJECT_DIR ?? env.POLYTOKEN_PROJECT_PATH;
|
|
50
|
+
input.turn_id ??= input.prompt_id;
|
|
51
|
+
if (input.hook_event_name === "pre_user_prompt") {
|
|
52
|
+
input.hook_event_name = "UserPromptSubmit";
|
|
53
|
+
input.prompt ??= input.user_prompt ?? input.message?.content;
|
|
54
|
+
}
|
|
55
|
+
else if (input.hook_event_name === "post_model_turn") {
|
|
56
|
+
input.hook_event_name = "Checkpoint";
|
|
57
|
+
input.last_assistant_message ??= input.assistant_message ?? input.response ?? input.text ?? input.message?.content;
|
|
58
|
+
}
|
|
59
|
+
else if (input.hook_event_name === "pre_model_turn")
|
|
60
|
+
input.hook_event_name = "Checkpoint";
|
|
61
|
+
else if (input.hook_event_name === "stop")
|
|
62
|
+
input.hook_event_name = "Stop";
|
|
63
|
+
else
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
else if (agent === "devin") {
|
|
67
|
+
input.cwd ??= env.DEVIN_PROJECT_DIR ?? process.cwd();
|
|
68
|
+
if (["PostToolUse", "PostCompaction"].includes(input.hook_event_name)) {
|
|
69
|
+
input.hook_event_name = "Checkpoint";
|
|
70
|
+
input.last_assistant_message = input.summary ?? `Tool ${String(input.tool_name ?? "result")}: ${JSON.stringify(input.tool_response ?? {})}`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return input;
|
|
74
|
+
}
|
|
75
|
+
export function mergeNativeRecoveryHooks(agent, value, command) {
|
|
76
|
+
if (agent === "polytoken") {
|
|
77
|
+
if (!Array.isArray(value))
|
|
78
|
+
throw new Error("Invalid Polytoken hooks: expected an array.");
|
|
79
|
+
const hooks = value.filter(hook => typeof hook?.handler?.bash !== "string" || !hook.handler.bash.includes(OWNER));
|
|
80
|
+
if (command)
|
|
81
|
+
for (const event of ["pre_user_prompt", "pre_model_turn", "post_model_turn", "stop"]) {
|
|
82
|
+
const core = hooks.findIndex(hook => isCore(hook?.handler?.bash));
|
|
83
|
+
hooks.splice(core < 0 ? hooks.length : core, 0, { name: `Lore recovery ${event}`, event, handler: { bash: command } });
|
|
84
|
+
}
|
|
85
|
+
return hooks;
|
|
86
|
+
}
|
|
87
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
88
|
+
throw new Error(`Invalid ${agent} hooks.`);
|
|
89
|
+
const result = structuredClone(value);
|
|
90
|
+
if (result.hooks !== undefined && (!result.hooks || typeof result.hooks !== "object" || Array.isArray(result.hooks)))
|
|
91
|
+
throw new Error(`Invalid ${agent} hooks.`);
|
|
92
|
+
const hooks = result.hooks ?? {};
|
|
93
|
+
const events = agent === "cursor" ? ["beforeSubmitPrompt", "afterAgentResponse", "stop"] : ["userPromptSubmitted", "agentStop", "errorOccurred"];
|
|
94
|
+
for (const event of events) {
|
|
95
|
+
if (hooks[event] !== undefined && !Array.isArray(hooks[event]))
|
|
96
|
+
throw new Error(`Invalid ${agent} ${event} hooks.`);
|
|
97
|
+
const remaining = (hooks[event] ?? []).filter((hook) => !String(agent === "cursor" ? hook.command ?? "" : hook.bash ?? "").includes(OWNER));
|
|
98
|
+
if (command) {
|
|
99
|
+
const core = remaining.findIndex((hook) => isCore(agent === "cursor" ? hook.command : hook.bash));
|
|
100
|
+
remaining.splice(core < 0 ? remaining.length : core, 0, agent === "cursor" ? { command, timeout: 10 } : { type: "command", bash: `LORE_RECOVERY_EVENT=${event} ${command}`, timeoutSec: 10 });
|
|
101
|
+
}
|
|
102
|
+
if (remaining.length)
|
|
103
|
+
hooks[event] = remaining;
|
|
104
|
+
else
|
|
105
|
+
delete hooks[event];
|
|
106
|
+
}
|
|
107
|
+
if (Object.keys(hooks).length) {
|
|
108
|
+
result.hooks = hooks;
|
|
109
|
+
result.version ??= 1;
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
delete result.hooks;
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=recovery-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-hooks.js","sourceRoot":"","sources":["../src/recovery-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LorePaths } from "./cli.js";
|
|
2
|
+
import { type RecoveryRun } from "./recovery-state.js";
|
|
3
|
+
export declare function readOwnedJson(path: string, max?: number): Promise<any>;
|
|
4
|
+
export declare function installExternalRecovery(paths: LorePaths, hosts: readonly string[], cwd: string, fallback?: string, start?: boolean): Promise<string[]>;
|
|
5
|
+
export declare function installRecoveryMonitor(home: string, start?: boolean): Promise<void>;
|
|
6
|
+
export declare function disableExternalRecovery(home: string): Promise<void>;
|
|
7
|
+
export declare function pollExternalRecovery(home: string, notify?: (home: string, id: string) => Promise<void>): Promise<void>;
|
|
8
|
+
export declare function runExternalMonitor(home: string): Promise<void>;
|
|
9
|
+
export declare function externalCheckpointCommand(home: string): Promise<void>;
|
|
10
|
+
/** Stop offering the old saved result immediately when the editor starts a new prompt. */
|
|
11
|
+
export declare function invalidateEditorRecovery(home: string, value: unknown): Promise<void>;
|
|
12
|
+
export declare function validateExternalRecovery(home: string, run: RecoveryRun): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=recovery-hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-hosts.d.ts","sourceRoot":"","sources":["../src/recovery-hosts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,EAA0E,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAa/H,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAOjF;AAMD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0CzJ;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzE;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B5H;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpE;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,0FAA0F;AAC1F,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5F"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { mkdir, open, readdir, realpath, rename, unlink } from "node:fs/promises";
|
|
4
|
+
import { 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, 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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
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
|
+
export async function pollExternalRecovery(home, notify) {
|
|
145
|
+
const store = recoveryStore(home);
|
|
146
|
+
if (await store.readState("disabled"))
|
|
147
|
+
return;
|
|
148
|
+
const parsed = ExternalSettings.safeParse(await store.readState("external-settings"));
|
|
149
|
+
if (!parsed.success)
|
|
150
|
+
return;
|
|
151
|
+
const settings = parsed.data;
|
|
152
|
+
const health = {};
|
|
153
|
+
if (settings.t3Database) {
|
|
154
|
+
try {
|
|
155
|
+
for (const event of await readT3Checkpoints(settings.t3Database, Math.max(settings.since, Date.now() - 24 * 3600 * 1000))) {
|
|
156
|
+
await captureExternalRecovery(home, event, notify);
|
|
157
|
+
}
|
|
158
|
+
health.t3code = "observing";
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
health.t3code = e.code === "ENOENT" ? "waiting for T3 database" : `unavailable: ${e.message}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (const root of settings.coworkRoots) {
|
|
165
|
+
const folder = resolve(root, ".lore-recovery/cowork");
|
|
166
|
+
const names = (await readdir(folder).catch(() => [])).filter(n => /^[a-f0-9]{64}\.json$/.test(n)).slice(-64);
|
|
167
|
+
for (const name of names) {
|
|
168
|
+
try {
|
|
169
|
+
const event = await readOwnedJson(resolve(folder, name), 256 * 1024);
|
|
170
|
+
if (event.host !== "cowork" || event.sourceAgent !== "claude" || event.observedAt < settings.since || Date.now() - event.observedAt > 24 * 3600 * 1000)
|
|
171
|
+
continue;
|
|
172
|
+
// A shared mount is explicitly paired at connect. Never use a VM's cwd on the host.
|
|
173
|
+
await captureExternalRecovery(home, { ...event, cwd: root, observedAt: Date.now() }, notify);
|
|
174
|
+
health.cowork = event.state === "failed" ? "rate_limit failure hook observed" : "checkpoints observed; cap hook unverified";
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
health.cowork = "unavailable: invalid checkpoint";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
await store.writeState("external-health", { at: new Date().toISOString(), ...health });
|
|
182
|
+
}
|
|
183
|
+
export async function runExternalMonitor(home) {
|
|
184
|
+
const store = recoveryStore(home);
|
|
185
|
+
const owner = randomUUID();
|
|
186
|
+
while (!(await store.readState("disabled")) && (await store.readState("external-settings") || await store.readState("cloud-runners"))) {
|
|
187
|
+
let claimed = false;
|
|
188
|
+
await store.updateState("external-monitor", current => {
|
|
189
|
+
const prior = z.object({ owner: z.string(), until: z.number(), pid: z.number().int().positive() }).safeParse(current);
|
|
190
|
+
if (prior.success && prior.data.owner !== owner && prior.data.until > Date.now()) {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(prior.data.pid, 0);
|
|
193
|
+
return current;
|
|
194
|
+
}
|
|
195
|
+
catch { /* previous login/process ended */ }
|
|
196
|
+
}
|
|
197
|
+
claimed = true;
|
|
198
|
+
return { owner, pid: process.pid, until: Date.now() + 30000 };
|
|
199
|
+
});
|
|
200
|
+
if (!claimed)
|
|
201
|
+
return;
|
|
202
|
+
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() }); });
|
|
203
|
+
await pollExternalRecovery(home).catch(async () => {
|
|
204
|
+
await store.writeState("external-health", { at: new Date().toISOString(), monitor: "A host read failed; retrying" });
|
|
205
|
+
});
|
|
206
|
+
await new Promise(done => setTimeout(done, 1500));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export async function externalCheckpointCommand(home) {
|
|
210
|
+
let body = "";
|
|
211
|
+
for await (const chunk of process.stdin) {
|
|
212
|
+
body += chunk;
|
|
213
|
+
if (Buffer.byteLength(body) > 256 * 1024)
|
|
214
|
+
throw new Error("Checkpoint exceeds recovery input limit");
|
|
215
|
+
}
|
|
216
|
+
const event = JSON.parse(body);
|
|
217
|
+
// This entry point belongs to the installed editor bridge only.
|
|
218
|
+
if (event.host !== "copilot-vscode" || event.sourceAgent !== "copilot-cli")
|
|
219
|
+
throw new Error("Unsupported editor recovery source");
|
|
220
|
+
const id = await captureExternalRecovery(home, event, async () => { });
|
|
221
|
+
const run = id ? RecoveryRunSchema.parse(await recoveryStore(home).readState(recoveryRunKey(id))) : undefined;
|
|
222
|
+
if (run?.failure)
|
|
223
|
+
await recordRecoveryMetric(home, run.id, run.failure.id, "offered");
|
|
224
|
+
process.stdout.write(JSON.stringify({ id, failureId: run?.failure?.id, target: run && AGENTS[run.targetAgent].label }));
|
|
225
|
+
}
|
|
226
|
+
/** Stop offering the old saved result immediately when the editor starts a new prompt. */
|
|
227
|
+
export async function invalidateEditorRecovery(home, value) {
|
|
228
|
+
const input = z.object({ session_id: z.string().min(1).max(500), cwd: z.string() }).safeParse(value);
|
|
229
|
+
if (!input.success)
|
|
230
|
+
return;
|
|
231
|
+
const store = recoveryStore(home), cwd = await realpath(input.data.cwd);
|
|
232
|
+
const settings = ExternalSettings.safeParse(await store.readState("external-settings"));
|
|
233
|
+
if (!settings.success || !settings.data.vscodeRoots.includes(cwd) || await store.readState("disabled"))
|
|
234
|
+
return;
|
|
235
|
+
const key = externalSessionKey({ host: "copilot-vscode", sessionId: input.data.session_id, cwd });
|
|
236
|
+
const mapping = z.object({ id: z.uuid() }).safeParse(await store.readState(key));
|
|
237
|
+
if (!mapping.success)
|
|
238
|
+
return;
|
|
239
|
+
await store.updateState(recoveryRunKey(mapping.data.id), current => {
|
|
240
|
+
const run = RecoveryRunSchema.parse(current);
|
|
241
|
+
run.supersededTurnId = run.nativeTurnId;
|
|
242
|
+
run.failure = null;
|
|
243
|
+
run.turnPending = false;
|
|
244
|
+
return run;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
export async function validateExternalRecovery(home, run) {
|
|
248
|
+
const settings = ExternalSettings.parse(await recoveryStore(home).readState("external-settings"));
|
|
249
|
+
if (run.sourceHost === "t3code") {
|
|
250
|
+
const latest = settings.t3Database ? (await readT3Checkpoints(settings.t3Database, settings.since)).find(e => e.sessionId === run.sessionId) : undefined;
|
|
251
|
+
if (!latest || latest.turnId !== run.nativeTurnId || latest.sourceAgent !== run.sourceAgent || latest.state !== "failed" || await realpath(latest.cwd) !== run.cwd)
|
|
252
|
+
throw new Error("T3 moved on from the failed turn");
|
|
253
|
+
}
|
|
254
|
+
else if (run.sourceHost === "cowork") {
|
|
255
|
+
if (!settings.coworkRoots.includes(run.cwd))
|
|
256
|
+
throw new Error("Cowork workspace is no longer connected");
|
|
257
|
+
const digest = createHash("sha256").update(run.sessionId).digest("hex");
|
|
258
|
+
const latest = await readOwnedJson(resolve(run.cwd, ".lore-recovery/cowork", `${digest}.json`), 256 * 1024);
|
|
259
|
+
if (latest.sessionId !== run.sessionId || latest.turnId !== run.nativeTurnId || latest.state !== "failed")
|
|
260
|
+
throw new Error("Cowork moved on from the failed turn");
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=recovery-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-hosts.js","sourceRoot":"","sources":["../src/recovery-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAoB,MAAM,qBAAqB,CAAC;AAC/H,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,IAAI,GAAG,KAAK;IAClE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC;QAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IACnE,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAAC,CAAC;AAC7F,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACzE,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,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC1J,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACnC,CAAC;AACD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;IACjE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,gDAAgD,CAAC;IACjE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;AAC7D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAEhI,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAgB,EAAE,KAAwB,EAAE,GAAW,EAAE,QAAiB,EAAE,KAAK,GAAG,IAAI;IACpI,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACzF,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnI,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,+GAA+G,CAAC,CAAC;IAC/J,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAqC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/K,IAAI,QAAQ;QAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;IAC1G,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QACtD,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,4IAA4I,CAAC,CAAC;IAC7J,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,wEAAwE;QACxE,+EAA+E;QAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAClI,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7I,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;QACnB,IAAI,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClI,MAAM,OAAO,GAAG,8CAA8C,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,6CAA6C,CAAC;QAC/K,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;QAClM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC1H,MAAM,YAAY,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAAE,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACnH,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtM,OAAO,CAAC,IAAI,CAAC,mNAAmN,CAAC,CAAC;IACpO,CAAC;IACD,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,KAAK,GAAG,IAAI;IACnE,MAAM,OAAO,GAAG,CAAC,GAAG,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAC1D,MAAM,YAAY,CAAC,MAAM,EAAE,yDAAyD,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,eAAe,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnN,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,YAAY,CAAC,OAAO,EAAE,gSAAgS,GAAG,CAAC,MAAM,CAAC,2FAA2F,CAAC,CAAC;;QAClc,MAAM,YAAY,CAAC,OAAO,EAAE,wEAAwE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC5N,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACjL,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtG,IAAI,QAAQ,CAAC,OAAO;QAAE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC;gBAAE,SAAS;YAChE,QAAQ,CAAC,KAAK,CAAC,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjJ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;YACpF,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,UAAU,EAAE,IAAI,KAAK,IAAI;YAAE,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChH,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;QAAE,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5I,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAC3D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACvD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAAoD;IAC3G,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;QAAE,OAAO;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC1H,MAAM,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,MAAM,GAAI,CAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,gBAAiB,CAAW,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACtJ,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;gBACrE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;oBAAE,SAAS;gBACjK,oFAAoF;gBACpF,MAAM,uBAAuB,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC7F,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,2CAA2C,CAAC;YAC9H,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,CAAC,MAAM,GAAG,iCAAiC,CAAC;YAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC9D,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACtI,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE;YACpD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtH,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACjF,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAAC,OAAO,OAAO,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;YACvG,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,mDAAmD,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzN,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAChD,MAAM,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;QACvH,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY;IAC1D,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,IAAI,KAAK,CAAC;QAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAAC,CAAC;IACjK,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,gEAAgE;IAChE,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,WAAW,KAAK,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAClI,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,IAAI,GAAG,EAAE,OAAO;QAAE,MAAM,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACtF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1H,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,KAAc;IACzE,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrG,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;QAAE,OAAO;IAC/G,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO;IAC7B,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QACjE,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC;QAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;QAAC,OAAO,GAAG,CAAC;IACjJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,GAAgB;IAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClG,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzJ,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC1N,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,uBAAuB,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC5G,IAAI,MAAM,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACrK,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|