naiad-cli 0.2.7 → 0.2.8
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/dist/api/client.d.ts +64 -0
- package/dist/api/client.js +72 -0
- package/dist/api/client.js.map +1 -1
- package/dist/commands/continue.d.ts +2 -0
- package/dist/commands/continue.js +402 -0
- package/dist/commands/continue.js.map +1 -0
- package/dist/commands/exec.js +34 -8
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/interactive.js +47 -13
- package/dist/commands/interactive.js.map +1 -1
- package/dist/config/config.d.ts +1 -0
- package/dist/config/config.js +2 -1
- package/dist/config/config.js.map +1 -1
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/setup.js +46 -4
- package/dist/lifecycle/setup.js.map +1 -1
- package/dist/lifecycle/teardown.js +2 -1
- package/dist/lifecycle/teardown.js.map +1 -1
- package/dist/lifecycle/types.d.ts +5 -0
- package/dist/lifecycle/workers.js +4 -0
- package/dist/lifecycle/workers.js.map +1 -1
- package/dist/sync/checkpoint.d.ts +29 -0
- package/dist/sync/checkpoint.js +240 -0
- package/dist/sync/checkpoint.js.map +1 -0
- package/dist/sync/command-listener.d.ts +25 -0
- package/dist/sync/command-listener.js +152 -0
- package/dist/sync/command-listener.js.map +1 -0
- package/extensions/naiad-extension.ts +113 -1
- package/package.json +1 -1
package/dist/api/client.d.ts
CHANGED
|
@@ -25,12 +25,14 @@ export declare class APIClient {
|
|
|
25
25
|
status?: string;
|
|
26
26
|
error?: string;
|
|
27
27
|
result?: unknown;
|
|
28
|
+
attempt?: number;
|
|
28
29
|
}): Promise<{
|
|
29
30
|
id: string;
|
|
30
31
|
status: string;
|
|
31
32
|
}>;
|
|
32
33
|
createSession(threadId: string, agentId: string, runtime?: string): Promise<{
|
|
33
34
|
id: string;
|
|
35
|
+
remote_control_enabled?: boolean;
|
|
34
36
|
}>;
|
|
35
37
|
updateSession(sessionId: string, status: string): Promise<void>;
|
|
36
38
|
postEvents(threadId: string, sessionId: string, events: Array<{
|
|
@@ -66,8 +68,56 @@ export declare class APIClient {
|
|
|
66
68
|
attempt: number;
|
|
67
69
|
status: string;
|
|
68
70
|
started_at: string;
|
|
71
|
+
remote_control_enabled?: boolean;
|
|
69
72
|
}>>;
|
|
70
73
|
downloadSession(sessionId: string): Promise<Buffer>;
|
|
74
|
+
requestCheckpointPolicies(sessionId: string): Promise<CheckpointPoliciesResponse>;
|
|
75
|
+
patchSession(sessionId: string, update: {
|
|
76
|
+
git_patch_key?: string;
|
|
77
|
+
session_jsonl_key?: string;
|
|
78
|
+
base_sha?: string;
|
|
79
|
+
}): Promise<void>;
|
|
80
|
+
getThread(threadId: string): Promise<{
|
|
81
|
+
id: string;
|
|
82
|
+
status: string;
|
|
83
|
+
owner_id: string;
|
|
84
|
+
repo_full_name?: string;
|
|
85
|
+
ref?: string;
|
|
86
|
+
base_ref?: string;
|
|
87
|
+
base_sha?: string;
|
|
88
|
+
installation_id?: number;
|
|
89
|
+
current_attempt: number;
|
|
90
|
+
prompt: string;
|
|
91
|
+
title?: string;
|
|
92
|
+
}>;
|
|
93
|
+
continueThread(threadId: string, targetRuntime: string, prompt?: string): Promise<{
|
|
94
|
+
session_id: string;
|
|
95
|
+
attempt: number;
|
|
96
|
+
parent_session_id?: string;
|
|
97
|
+
thread_status: string;
|
|
98
|
+
prompt?: string;
|
|
99
|
+
remote_control_enabled?: boolean;
|
|
100
|
+
}>;
|
|
101
|
+
downloadCheckpoint(sessionId: string): Promise<{
|
|
102
|
+
artifacts: Record<string, {
|
|
103
|
+
url: string;
|
|
104
|
+
expires_at: string;
|
|
105
|
+
}>;
|
|
106
|
+
}>;
|
|
107
|
+
postHeartbeatWithPreemption(agentId: string, threadId: string, sessionId: string, attempt: number): Promise<{
|
|
108
|
+
should_exit: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
postEventsWithAttempt(threadId: string, sessionId: string, attempt: number, events: Array<{
|
|
111
|
+
client_seq: number;
|
|
112
|
+
event_type: string;
|
|
113
|
+
data: unknown;
|
|
114
|
+
}>): Promise<{
|
|
115
|
+
accepted: number;
|
|
116
|
+
duplicates: number;
|
|
117
|
+
}>;
|
|
118
|
+
ackCommand(sessionId: string, commandId: number): Promise<void>;
|
|
119
|
+
getCommandStreamUrl(sessionId: string, cursor?: number): string;
|
|
120
|
+
getAuthHeaders(): Record<string, string>;
|
|
71
121
|
listThreads(params?: {
|
|
72
122
|
status?: string;
|
|
73
123
|
limit?: number;
|
|
@@ -81,3 +131,17 @@ export declare class APIClient {
|
|
|
81
131
|
total: number;
|
|
82
132
|
}>;
|
|
83
133
|
}
|
|
134
|
+
export interface ArtifactPolicy {
|
|
135
|
+
url: string;
|
|
136
|
+
fields: Record<string, string>;
|
|
137
|
+
max_bytes: number;
|
|
138
|
+
expires_at: string;
|
|
139
|
+
}
|
|
140
|
+
export interface CheckpointPoliciesResponse {
|
|
141
|
+
artifacts: {
|
|
142
|
+
"patch.bin": ArtifactPolicy;
|
|
143
|
+
"manifest.json": ArtifactPolicy;
|
|
144
|
+
"untracked.tar.gz": ArtifactPolicy;
|
|
145
|
+
"session.jsonl": ArtifactPolicy;
|
|
146
|
+
};
|
|
147
|
+
}
|
package/dist/api/client.js
CHANGED
|
@@ -112,6 +112,78 @@ export class APIClient {
|
|
|
112
112
|
throw new Error(`Failed to download session: ${res.status} ${await res.text()}`);
|
|
113
113
|
return Buffer.from(await res.arrayBuffer());
|
|
114
114
|
}
|
|
115
|
+
async requestCheckpointPolicies(sessionId) {
|
|
116
|
+
const res = await this.request("POST", `/api/v1/sessions/${sessionId}/checkpoint`, {
|
|
117
|
+
artifacts: ["patch.bin", "manifest.json", "untracked.tar.gz", "session.jsonl"],
|
|
118
|
+
});
|
|
119
|
+
if (!res.ok)
|
|
120
|
+
throw new Error(`Failed to get checkpoint policies: ${res.status} ${await res.text()}`);
|
|
121
|
+
return res.json();
|
|
122
|
+
}
|
|
123
|
+
async patchSession(sessionId, update) {
|
|
124
|
+
const res = await this.request("PATCH", `/api/v1/sessions/${sessionId}`, update);
|
|
125
|
+
if (!res.ok)
|
|
126
|
+
throw new Error(`Failed to patch session: ${res.status} ${await res.text()}`);
|
|
127
|
+
}
|
|
128
|
+
async getThread(threadId) {
|
|
129
|
+
const res = await this.request("GET", `/api/v1/threads/${threadId}`);
|
|
130
|
+
if (!res.ok)
|
|
131
|
+
throw new Error(`Failed to get thread: ${res.status} ${await res.text()}`);
|
|
132
|
+
return res.json();
|
|
133
|
+
}
|
|
134
|
+
async continueThread(threadId, targetRuntime, prompt) {
|
|
135
|
+
const body = { target_runtime: targetRuntime };
|
|
136
|
+
if (prompt)
|
|
137
|
+
body.prompt = prompt;
|
|
138
|
+
const res = await this.request("POST", `/api/v1/threads/${threadId}/continue`, body);
|
|
139
|
+
if (!res.ok) {
|
|
140
|
+
const text = await res.text();
|
|
141
|
+
throw new Error(`Failed to continue thread: ${res.status} ${text}`);
|
|
142
|
+
}
|
|
143
|
+
return res.json();
|
|
144
|
+
}
|
|
145
|
+
async downloadCheckpoint(sessionId) {
|
|
146
|
+
const res = await this.request("GET", `/api/v1/sessions/${sessionId}/checkpoint`);
|
|
147
|
+
if (!res.ok)
|
|
148
|
+
throw new Error(`Failed to get checkpoint: ${res.status} ${await res.text()}`);
|
|
149
|
+
return res.json();
|
|
150
|
+
}
|
|
151
|
+
async postHeartbeatWithPreemption(agentId, threadId, sessionId, attempt) {
|
|
152
|
+
const res = await this.request("POST", "/api/v1/agents/heartbeat", {
|
|
153
|
+
agent_id: agentId,
|
|
154
|
+
thread_id: threadId,
|
|
155
|
+
session_id: sessionId,
|
|
156
|
+
attempt,
|
|
157
|
+
status: "working",
|
|
158
|
+
});
|
|
159
|
+
if (!res.ok)
|
|
160
|
+
throw new Error(`Failed to post heartbeat: ${res.status} ${await res.text()}`);
|
|
161
|
+
return res.json();
|
|
162
|
+
}
|
|
163
|
+
async postEventsWithAttempt(threadId, sessionId, attempt, events) {
|
|
164
|
+
const res = await this.request("POST", `/api/v1/threads/${threadId}/events`, {
|
|
165
|
+
session_id: sessionId,
|
|
166
|
+
attempt,
|
|
167
|
+
events,
|
|
168
|
+
});
|
|
169
|
+
if (!res.ok)
|
|
170
|
+
throw new Error(`Failed to post events: ${res.status} ${await res.text()}`);
|
|
171
|
+
return res.json();
|
|
172
|
+
}
|
|
173
|
+
async ackCommand(sessionId, commandId) {
|
|
174
|
+
const res = await this.request("POST", `/api/v1/sessions/${sessionId}/commands/${commandId}/ack`);
|
|
175
|
+
if (!res.ok)
|
|
176
|
+
throw new Error(`Failed to ack command: ${res.status} ${await res.text()}`);
|
|
177
|
+
}
|
|
178
|
+
getCommandStreamUrl(sessionId, cursor) {
|
|
179
|
+
const cursorParam = cursor && cursor > 0 ? `?cursor=${cursor}` : "";
|
|
180
|
+
return `${this.baseUrl}/api/v1/sessions/${sessionId}/commands/stream${cursorParam}`;
|
|
181
|
+
}
|
|
182
|
+
getAuthHeaders() {
|
|
183
|
+
return {
|
|
184
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
115
187
|
async listThreads(params) {
|
|
116
188
|
const searchParams = new URLSearchParams();
|
|
117
189
|
if (params?.status)
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,IAAc;QAChE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzF,OAAO,GAAG,CAAC,IAAI,EAA+H,CAAC;IACjJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,IAKlC;QACC,MAAM,IAAI,GAA4B;YACpC,MAAM;YACN,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;YAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK;YAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;SAC7B,CAAC;QACF,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3F,OAAO,GAAG,CAAC,IAAI,EAA6C,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { execSync, execFileSync } from "child_process";
|
|
2
|
+
import { existsSync, writeFileSync, mkdirSync, mkdtempSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { tmpdir } from "os";
|
|
5
|
+
import { randomUUID, createHash } from "crypto";
|
|
6
|
+
import { APIClient } from "../api/client.js";
|
|
7
|
+
import { launchPi } from "../pi/launcher.js";
|
|
8
|
+
import { startWorkers } from "../lifecycle/workers.js";
|
|
9
|
+
import { teardownLifecycle } from "../lifecycle/teardown.js";
|
|
10
|
+
import { findPackageRoot } from "../utils/package-root.js";
|
|
11
|
+
import { CommandListener } from "../sync/command-listener.js";
|
|
12
|
+
export async function continueCommand(config, threadId) {
|
|
13
|
+
const client = new APIClient(config);
|
|
14
|
+
// 1. Get thread metadata
|
|
15
|
+
console.error("[naiad] Fetching thread metadata...");
|
|
16
|
+
const thread = await client.getThread(threadId);
|
|
17
|
+
if (!thread.repo_full_name) {
|
|
18
|
+
console.error("Error: This thread predates remote resume support and cannot be continued.");
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// 2. Verify local repo matches thread
|
|
22
|
+
try {
|
|
23
|
+
const remoteUrl = execSync("git remote get-url origin", { encoding: "utf8" }).trim();
|
|
24
|
+
const localRepo = parseRepoFullName(remoteUrl);
|
|
25
|
+
if (localRepo && thread.repo_full_name &&
|
|
26
|
+
localRepo.toLowerCase() !== thread.repo_full_name.toLowerCase()) {
|
|
27
|
+
console.error(`Error: Local repo (${localRepo}) does not match thread repo (${thread.repo_full_name})`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
console.error("[naiad] Warning: Could not verify local repo against thread repo");
|
|
33
|
+
}
|
|
34
|
+
// 3. Call POST /threads/{id}/continue
|
|
35
|
+
console.error("[naiad] Requesting continue...");
|
|
36
|
+
const continueResult = await client.continueThread(threadId, "local");
|
|
37
|
+
const sessionId = continueResult.session_id;
|
|
38
|
+
const attempt = continueResult.attempt;
|
|
39
|
+
const parentSessionId = continueResult.parent_session_id;
|
|
40
|
+
console.error(`[naiad] New session: ${sessionId}, attempt: ${attempt}`);
|
|
41
|
+
// 4. Download and restore checkpoint from parent session
|
|
42
|
+
let sessionJsonlPath;
|
|
43
|
+
if (parentSessionId) {
|
|
44
|
+
sessionJsonlPath = await restoreCheckpoint(client, parentSessionId, thread);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.error("[naiad] No parent session — starting fresh");
|
|
48
|
+
}
|
|
49
|
+
// 5. Validate API key by listing models
|
|
50
|
+
const { models } = await client.listModels();
|
|
51
|
+
if (models.length === 0)
|
|
52
|
+
throw new Error("No models available");
|
|
53
|
+
const model = models[0].id;
|
|
54
|
+
const agentId = randomUUID();
|
|
55
|
+
const sessionDir = mkdtempSync(join(tmpdir(), "naiad-session-"));
|
|
56
|
+
const pkgRoot = findPackageRoot();
|
|
57
|
+
const extensionPath = join(pkgRoot, "extensions", "naiad-extension.ts");
|
|
58
|
+
// Capture base_sha
|
|
59
|
+
let baseSha;
|
|
60
|
+
try {
|
|
61
|
+
baseSha = execFileSync("git", ["rev-parse", "HEAD"], { encoding: "utf8" }).trim();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// not in git repo
|
|
65
|
+
}
|
|
66
|
+
// Store base_sha in session record
|
|
67
|
+
if (baseSha) {
|
|
68
|
+
try {
|
|
69
|
+
await client.patchSession(sessionId, { base_sha: baseSha });
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("[naiad] Failed to store base SHA in session:", err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Transition to RUNNING
|
|
76
|
+
await client.updateThread(threadId, { status: "RUNNING", attempt });
|
|
77
|
+
const ctx = {
|
|
78
|
+
config,
|
|
79
|
+
client,
|
|
80
|
+
model,
|
|
81
|
+
allModels: models,
|
|
82
|
+
agentId,
|
|
83
|
+
threadId,
|
|
84
|
+
sessionId,
|
|
85
|
+
sessionDir,
|
|
86
|
+
extensionPath,
|
|
87
|
+
externalThread: false,
|
|
88
|
+
baseSha,
|
|
89
|
+
attempt,
|
|
90
|
+
};
|
|
91
|
+
// Launch pi
|
|
92
|
+
const piEnv = {
|
|
93
|
+
NAIAD_INFERENCE_URL: `${config.apiUrl}/api/v1/inference`,
|
|
94
|
+
NAIAD_API_KEY: config.apiKey,
|
|
95
|
+
NAIAD_THREAD_ID: threadId,
|
|
96
|
+
NAIAD_SESSION_ID: sessionId,
|
|
97
|
+
NAIAD_MODEL: model,
|
|
98
|
+
NAIAD_MODELS_JSON: JSON.stringify(models),
|
|
99
|
+
};
|
|
100
|
+
if (baseSha)
|
|
101
|
+
piEnv.NAIAD_BASE_SHA = baseSha;
|
|
102
|
+
const piOpts = {
|
|
103
|
+
model,
|
|
104
|
+
models: models.map((m) => m.id),
|
|
105
|
+
sessionDir,
|
|
106
|
+
extensionPath,
|
|
107
|
+
env: piEnv,
|
|
108
|
+
};
|
|
109
|
+
if (sessionJsonlPath) {
|
|
110
|
+
piOpts.resumeSessionFile = sessionJsonlPath;
|
|
111
|
+
}
|
|
112
|
+
const pi = launchPi(piOpts);
|
|
113
|
+
// Start background workers (includes heartbeat)
|
|
114
|
+
const workers = startWorkers(ctx);
|
|
115
|
+
// Start command listener for remote control (GHA sessions)
|
|
116
|
+
let commandListener = null;
|
|
117
|
+
if (continueResult.remote_control_enabled) {
|
|
118
|
+
commandListener = new CommandListener({
|
|
119
|
+
client,
|
|
120
|
+
sessionId,
|
|
121
|
+
sessionDir,
|
|
122
|
+
piProcess: pi.process,
|
|
123
|
+
});
|
|
124
|
+
commandListener.start();
|
|
125
|
+
console.error("[naiad] Command listener started (remote control enabled)");
|
|
126
|
+
}
|
|
127
|
+
// Start preemption heartbeat (20s interval)
|
|
128
|
+
const heartbeatTimer = setInterval(async () => {
|
|
129
|
+
try {
|
|
130
|
+
const res = await client.postHeartbeatWithPreemption(agentId, threadId, sessionId, attempt);
|
|
131
|
+
if (res.should_exit) {
|
|
132
|
+
console.error("[naiad] Session preempted — shutting down");
|
|
133
|
+
clearInterval(heartbeatTimer);
|
|
134
|
+
await pi.shutdown();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error("[heartbeat] Preemption check failed:", err);
|
|
139
|
+
}
|
|
140
|
+
}, 20_000);
|
|
141
|
+
// Process pi events
|
|
142
|
+
let agentEnded = false;
|
|
143
|
+
pi.onEvent((event) => {
|
|
144
|
+
if (event.type === "checkpoint") {
|
|
145
|
+
const data = event.data ?? event;
|
|
146
|
+
workers.checkpoint.handleCheckpoint(data).catch((err) => {
|
|
147
|
+
console.error("[naiad] Checkpoint handling failed:", err);
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
workers.eventSpool.pushEvent(event.type, event);
|
|
152
|
+
if (event.type === "message_update") {
|
|
153
|
+
const assistantEvent = event.assistantMessageEvent;
|
|
154
|
+
if (assistantEvent?.type === "text_delta") {
|
|
155
|
+
process.stdout.write(assistantEvent.delta ?? "");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (event.type === "agent_end")
|
|
159
|
+
agentEnded = true;
|
|
160
|
+
});
|
|
161
|
+
// Send prompt if the continue response included one (it won't for local, but just in case)
|
|
162
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
163
|
+
// If the thread had a prompt, send a follow_up to let pi know we're continuing
|
|
164
|
+
pi.sendPrompt("Continue from where the previous session left off.");
|
|
165
|
+
const exitCode = await new Promise((resolve) => {
|
|
166
|
+
pi.process.on("exit", (code, signal) => {
|
|
167
|
+
resolve(signal ? 1 : (code ?? 0));
|
|
168
|
+
});
|
|
169
|
+
const checkInterval = setInterval(() => {
|
|
170
|
+
if (agentEnded) {
|
|
171
|
+
clearInterval(checkInterval);
|
|
172
|
+
pi.shutdown().then(() => { });
|
|
173
|
+
}
|
|
174
|
+
}, 100);
|
|
175
|
+
});
|
|
176
|
+
clearInterval(heartbeatTimer);
|
|
177
|
+
process.stdout.write("\n");
|
|
178
|
+
console.error("[naiad] Agent finished, flushing...");
|
|
179
|
+
commandListener?.stop();
|
|
180
|
+
await workers.stop();
|
|
181
|
+
await teardownLifecycle({ ctx, exitCode });
|
|
182
|
+
process.exit(exitCode);
|
|
183
|
+
}
|
|
184
|
+
async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
185
|
+
console.error("[naiad] Downloading checkpoint from parent session...");
|
|
186
|
+
let checkpoint;
|
|
187
|
+
try {
|
|
188
|
+
checkpoint = await client.downloadCheckpoint(parentSessionId);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
console.error("[naiad] Failed to download checkpoint:", err);
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
const tmpDir = mkdtempSync(join(tmpdir(), "naiad-restore-"));
|
|
195
|
+
// Download manifest
|
|
196
|
+
let manifest;
|
|
197
|
+
try {
|
|
198
|
+
const manifestArt = checkpoint.artifacts["manifest.json"];
|
|
199
|
+
if (manifestArt?.url) {
|
|
200
|
+
const res = await fetch(manifestArt.url);
|
|
201
|
+
if (res.ok) {
|
|
202
|
+
manifest = await res.json();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
console.error("[naiad] Failed to download manifest:", err);
|
|
208
|
+
}
|
|
209
|
+
if (!manifest) {
|
|
210
|
+
console.error("[naiad] No checkpoint manifest — starting from clean state");
|
|
211
|
+
return tryDownloadSessionJsonl(checkpoint, tmpDir);
|
|
212
|
+
}
|
|
213
|
+
if (manifest.version !== 1) {
|
|
214
|
+
console.error("[naiad] Unknown checkpoint version:", manifest.version);
|
|
215
|
+
return tryDownloadSessionJsonl(checkpoint, tmpDir);
|
|
216
|
+
}
|
|
217
|
+
const baseSha = manifest.base_sha;
|
|
218
|
+
if (!baseSha) {
|
|
219
|
+
console.error("[naiad] No base_sha in manifest — skipping git restore");
|
|
220
|
+
return tryDownloadSessionJsonl(checkpoint, tmpDir);
|
|
221
|
+
}
|
|
222
|
+
// Download artifacts
|
|
223
|
+
const skippedArtifacts = manifest.skipped_artifacts || [];
|
|
224
|
+
let patchData = null;
|
|
225
|
+
if (!skippedArtifacts.includes("patch") && manifest.patch_key) {
|
|
226
|
+
try {
|
|
227
|
+
const patchArt = checkpoint.artifacts["patch.bin"];
|
|
228
|
+
if (patchArt?.url) {
|
|
229
|
+
const res = await fetch(patchArt.url);
|
|
230
|
+
if (res.ok)
|
|
231
|
+
patchData = Buffer.from(await res.arrayBuffer());
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
console.error("[naiad] Failed to download patch:", err);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
let untrackedData = null;
|
|
239
|
+
if (!skippedArtifacts.includes("untracked") && manifest.untracked_key) {
|
|
240
|
+
try {
|
|
241
|
+
const untrackedArt = checkpoint.artifacts["untracked.tar.gz"];
|
|
242
|
+
if (untrackedArt?.url) {
|
|
243
|
+
const res = await fetch(untrackedArt.url);
|
|
244
|
+
if (res.ok)
|
|
245
|
+
untrackedData = Buffer.from(await res.arrayBuffer());
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.error("[naiad] Failed to download untracked archive:", err);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Download session JSONL
|
|
253
|
+
const sessionJsonlPath = await tryDownloadSessionJsonl(checkpoint, tmpDir);
|
|
254
|
+
// Verify checksum
|
|
255
|
+
const hash = createHash("sha256");
|
|
256
|
+
hash.update(manifest.base_sha, "utf8");
|
|
257
|
+
hash.update("\n");
|
|
258
|
+
hash.update(manifest.head_sha, "utf8");
|
|
259
|
+
if (!skippedArtifacts.includes("patch") && patchData) {
|
|
260
|
+
hash.update("\n");
|
|
261
|
+
hash.update(patchData);
|
|
262
|
+
}
|
|
263
|
+
if (!skippedArtifacts.includes("untracked") && untrackedData) {
|
|
264
|
+
hash.update("\n");
|
|
265
|
+
hash.update(untrackedData);
|
|
266
|
+
}
|
|
267
|
+
if (!skippedArtifacts.includes("session") && sessionJsonlPath) {
|
|
268
|
+
const { readFileSync } = await import("fs");
|
|
269
|
+
const sessionData = readFileSync(sessionJsonlPath);
|
|
270
|
+
hash.update("\n");
|
|
271
|
+
hash.update(sessionData);
|
|
272
|
+
}
|
|
273
|
+
const computedChecksum = "sha256:" + hash.digest("hex");
|
|
274
|
+
let checksumValid = true;
|
|
275
|
+
if (manifest.checksum && computedChecksum !== manifest.checksum) {
|
|
276
|
+
console.error("[naiad] Checkpoint integrity check failed — starting from clean checkout");
|
|
277
|
+
checksumValid = false;
|
|
278
|
+
}
|
|
279
|
+
// Restore git state
|
|
280
|
+
try {
|
|
281
|
+
console.error("[naiad] Fetching origin...");
|
|
282
|
+
execFileSync("git", ["fetch", "origin"], { stdio: "pipe" });
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
console.error("[naiad] git fetch failed:", err);
|
|
286
|
+
}
|
|
287
|
+
const ref = thread.ref || "HEAD";
|
|
288
|
+
try {
|
|
289
|
+
console.error(`[naiad] Checking out ${ref} at ${baseSha}...`);
|
|
290
|
+
execFileSync("git", ["checkout", "-B", ref, baseSha], { stdio: "pipe" });
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
console.error("[naiad] git checkout failed:", err);
|
|
294
|
+
try {
|
|
295
|
+
execFileSync("git", ["checkout", baseSha], { stdio: "pipe" });
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
console.error("[naiad] Fallback checkout failed — continuing anyway");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Apply patch
|
|
302
|
+
if (checksumValid && patchData && patchData.length > 0) {
|
|
303
|
+
const patchPath = join(tmpDir, "patch.bin");
|
|
304
|
+
writeFileSync(patchPath, patchData);
|
|
305
|
+
try {
|
|
306
|
+
console.error("[naiad] Applying checkpoint patch...");
|
|
307
|
+
execFileSync("git", ["apply", "--3way", patchPath], { stdio: "pipe" });
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
console.error("[naiad] Patch apply failed, resetting to base SHA");
|
|
311
|
+
try {
|
|
312
|
+
execFileSync("git", ["checkout", "--force", baseSha], { stdio: "pipe" });
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// continue anyway
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Extract untracked files (with path traversal protection)
|
|
320
|
+
if (checksumValid && untrackedData && untrackedData.length > 0) {
|
|
321
|
+
try {
|
|
322
|
+
const untrackedPath = join(tmpDir, "untracked.tar.gz");
|
|
323
|
+
writeFileSync(untrackedPath, untrackedData);
|
|
324
|
+
// Pre-extract validation
|
|
325
|
+
const listing = execFileSync("tar", ["-tzf", untrackedPath], { encoding: "utf8", maxBuffer: 10 * 1024 * 1024 });
|
|
326
|
+
const entries = listing.split("\n").filter(Boolean);
|
|
327
|
+
if (entries.length > 10000) {
|
|
328
|
+
console.error("[naiad] Too many untracked files (>10000), skipping extraction");
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const invalid = entries.some(e => e.includes("..") || e.startsWith("/") || e.startsWith(".git/") || e.split("/").length > 50);
|
|
332
|
+
if (invalid) {
|
|
333
|
+
console.error("[naiad] Unsafe paths in untracked archive, skipping extraction");
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
const extractDir = join(tmpDir, "untracked");
|
|
337
|
+
mkdirSync(extractDir, { recursive: true });
|
|
338
|
+
execFileSync("tar", ["xzf", untrackedPath, "-C", extractDir, "--no-same-owner", "--no-same-permissions"], { stdio: "pipe" });
|
|
339
|
+
// Move files to working directory
|
|
340
|
+
for (const entry of entries) {
|
|
341
|
+
if (!entry || entry.endsWith("/"))
|
|
342
|
+
continue;
|
|
343
|
+
const src = join(extractDir, entry);
|
|
344
|
+
const dst = join(process.cwd(), entry);
|
|
345
|
+
if (!existsSync(src))
|
|
346
|
+
continue;
|
|
347
|
+
// Don't overwrite tracked files
|
|
348
|
+
try {
|
|
349
|
+
execFileSync("git", ["ls-files", "--error-unmatch", entry], { stdio: "pipe" });
|
|
350
|
+
continue; // file is tracked, skip
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// not tracked, proceed
|
|
354
|
+
}
|
|
355
|
+
const dstDir = join(dst, "..");
|
|
356
|
+
mkdirSync(dstDir, { recursive: true });
|
|
357
|
+
const { copyFileSync } = await import("fs");
|
|
358
|
+
copyFileSync(src, dst);
|
|
359
|
+
}
|
|
360
|
+
console.error(`[naiad] Restored ${entries.length} untracked files`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
console.error("[naiad] Failed to restore untracked files:", err);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return sessionJsonlPath;
|
|
369
|
+
}
|
|
370
|
+
async function tryDownloadSessionJsonl(checkpoint, tmpDir) {
|
|
371
|
+
try {
|
|
372
|
+
const sessionArt = checkpoint.artifacts["session.jsonl"];
|
|
373
|
+
if (!sessionArt?.url)
|
|
374
|
+
return undefined;
|
|
375
|
+
const res = await fetch(sessionArt.url);
|
|
376
|
+
if (!res.ok)
|
|
377
|
+
return undefined;
|
|
378
|
+
const data = Buffer.from(await res.arrayBuffer());
|
|
379
|
+
if (data.length === 0)
|
|
380
|
+
return undefined;
|
|
381
|
+
const path = join(tmpDir, "session.jsonl");
|
|
382
|
+
writeFileSync(path, data);
|
|
383
|
+
console.error(`[naiad] Downloaded session JSONL (${(data.length / 1024).toFixed(1)}KB)`);
|
|
384
|
+
return path;
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
console.error("[naiad] Failed to download session JSONL:", err);
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function parseRepoFullName(url) {
|
|
392
|
+
// Handle SSH format: git@github.com:owner/repo.git
|
|
393
|
+
const sshMatch = url.match(/git@github\.com:(.+?)(?:\.git)?$/);
|
|
394
|
+
if (sshMatch)
|
|
395
|
+
return sshMatch[1];
|
|
396
|
+
// Handle HTTPS format: https://github.com/owner/repo.git
|
|
397
|
+
const httpsMatch = url.match(/github\.com\/(.+?)(?:\.git)?$/);
|
|
398
|
+
if (httpsMatch)
|
|
399
|
+
return httpsMatch[1];
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=continue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue.js","sourceRoot":"","sources":["../../src/commands/continue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAqB,MAAM,IAAI,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAKhD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAmB,EAAE,QAAgB;IACzE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAErC,yBAAyB;IACzB,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,SAAS,IAAI,MAAM,CAAC,cAAc;YAClC,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,sBAAsB,SAAS,iCAAiC,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;YACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACpF,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEtE,MAAM,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;IACvC,MAAM,eAAe,GAAG,cAAc,CAAC,iBAAiB,CAAC;IAEzD,OAAO,CAAC,KAAK,CAAC,wBAAwB,SAAS,cAAc,OAAO,EAAE,CAAC,CAAC;IAExE,yDAAyD;IACzD,IAAI,gBAAoC,CAAC;IACzC,IAAI,eAAe,EAAE,CAAC;QACpB,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC;IAExE,mBAAmB;IACnB,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpE,MAAM,GAAG,GAAG;QACV,MAAM;QACN,MAAM;QACN,KAAK;QACL,SAAS,EAAE,MAAM;QACjB,OAAO;QACP,QAAQ;QACR,SAAS;QACT,UAAU;QACV,aAAa;QACb,cAAc,EAAE,KAAK;QACrB,OAAO;QACP,OAAO;KACR,CAAC;IAEF,YAAY;IACZ,MAAM,KAAK,GAA2B;QACpC,mBAAmB,EAAE,GAAG,MAAM,CAAC,MAAM,mBAAmB;QACxD,aAAa,EAAE,MAAM,CAAC,MAAM;QAC5B,eAAe,EAAE,QAAQ;QACzB,gBAAgB,EAAE,SAAS;QAC3B,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KAC1C,CAAC;IACF,IAAI,OAAO;QAAE,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;IAE5C,MAAM,MAAM,GAAQ;QAClB,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,UAAU;QACV,aAAa;QACb,GAAG,EAAE,KAAK;KACX,CAAC;IACF,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE5B,gDAAgD;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAElC,2DAA2D;IAC3D,IAAI,eAAe,GAA2B,IAAI,CAAC;IACnD,IAAI,cAAc,CAAC,sBAAsB,EAAE,CAAC;QAC1C,eAAe,GAAG,IAAI,eAAe,CAAC;YACpC,MAAM;YACN,SAAS;YACT,UAAU;YACV,SAAS,EAAE,EAAE,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,eAAe,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC7E,CAAC;IAED,4CAA4C;IAC5C,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5F,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC9B,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,oBAAoB;IACpB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,EAAE,CAAC,OAAO,CAAC,CAAC,KAAiB,EAAE,EAAE;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,IAAI,GAAI,KAAiC,CAAC,IAAI,IAAI,KAAK,CAAC;YAC9D,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAoC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtF,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,cAAc,GAAI,KAAiC,CAAC,qBAA4D,CAAC;YACvH,IAAI,cAAc,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,cAAc,CAAC,KAAgB,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,UAAU,GAAG,IAAI,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,2FAA2F;IAC3F,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzD,+EAA+E;IAC/E,EAAE,CAAC,UAAU,CAAC,oDAAoD,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrD,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,UAAU,EAAE,CAAC;gBACf,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC7B,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAErD,eAAe,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE3C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAiB,EACjB,eAAuB,EACvB,MAAoE;IAEpE,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAEvE,IAAI,UAA8E,CAAC;IACnF,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE7D,oBAAoB;IACpB,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,WAAW,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,qBAAqB;IACrB,MAAM,gBAAgB,GAAa,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEpE,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,QAAQ,EAAE,GAAG,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,GAAG,CAAC,EAAE;oBAAE,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC9D,IAAI,YAAY,EAAE,GAAG,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,EAAE;oBAAE,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE3E,kBAAkB;IAClB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,aAAa,EAAE,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC;QAC9D,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,aAAa,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5C,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACnE,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3E,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,aAAa,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACvD,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAE5C,yBAAyB;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;YAChH,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEpD,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,CAC3F,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBAClF,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;oBAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3C,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAE7H,kCAAkC;oBAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;wBAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;4BAAE,SAAS;wBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;wBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;wBACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;4BAAE,SAAS;wBAE/B,gCAAgC;wBAChC,IAAI,CAAC;4BACH,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;4BAC/E,SAAS,CAAC,wBAAwB;wBACpC,CAAC;wBAAC,MAAM,CAAC;4BACP,uBAAuB;wBACzB,CAAC;wBAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBAC/B,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBACvC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC5C,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACzB,CAAC;oBACD,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,UAA8E,EAC9E,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,EAAE,GAAG;YAAE,OAAO,SAAS,CAAC;QAEvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC3C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,mDAAmD;IACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC/D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEjC,yDAAyD;IACzD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC9D,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAErC,OAAO,IAAI,CAAC;AACd,CAAC"}
|