naiad-cli 0.2.40 → 0.2.42
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 +9 -0
- package/dist/api/client.js +22 -3
- package/dist/api/client.js.map +1 -1
- package/dist/callback/server.d.ts +2 -0
- package/dist/callback/server.js +38 -21
- package/dist/callback/server.js.map +1 -1
- package/dist/checkpoint/resume-session.d.ts +3 -0
- package/dist/checkpoint/resume-session.js +8 -6
- package/dist/checkpoint/resume-session.js.map +1 -1
- package/dist/commands/continue.js +58 -43
- package/dist/commands/continue.js.map +1 -1
- package/dist/commands/exec.js +15 -6
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/interactive.js +26 -13
- package/dist/commands/interactive.js.map +1 -1
- package/dist/lifecycle/setup.d.ts +2 -0
- package/dist/lifecycle/setup.js +14 -13
- package/dist/lifecycle/setup.js.map +1 -1
- package/dist/lifecycle/teardown.js +3 -6
- package/dist/lifecycle/teardown.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/workers.js +5 -2
- package/dist/lifecycle/workers.js.map +1 -1
- package/dist/reporting/reporter.d.ts +70 -0
- package/dist/reporting/reporter.js +184 -0
- package/dist/reporting/reporter.js.map +1 -0
- package/dist/sync/checkpoint.d.ts +4 -1
- package/dist/sync/checkpoint.js +15 -4
- package/dist/sync/checkpoint.js.map +1 -1
- package/dist/sync/command-listener.d.ts +3 -0
- package/dist/sync/command-listener.js +10 -5
- package/dist/sync/command-listener.js.map +1 -1
- package/dist/sync/events.d.ts +4 -1
- package/dist/sync/events.js +11 -3
- package/dist/sync/events.js.map +1 -1
- package/extensions/naiad-extension.ts +51 -3
- package/package.json +1 -1
package/dist/api/client.d.ts
CHANGED
|
@@ -127,6 +127,15 @@ export declare class APIClient {
|
|
|
127
127
|
ackCommand(sessionId: string, commandId: number): Promise<void>;
|
|
128
128
|
getCommandStreamUrl(sessionId: string, cursor?: number): string;
|
|
129
129
|
getAuthHeaders(): Record<string, string>;
|
|
130
|
+
postDiagnostics(sessionId: string, items: Array<{
|
|
131
|
+
ts: string;
|
|
132
|
+
source: string;
|
|
133
|
+
severity: string;
|
|
134
|
+
code: string;
|
|
135
|
+
message: string;
|
|
136
|
+
stack?: string;
|
|
137
|
+
meta?: Record<string, unknown>;
|
|
138
|
+
}>): Promise<void>;
|
|
130
139
|
deleteThreadIfEmpty(threadId: string): Promise<boolean>;
|
|
131
140
|
listThreads(params?: {
|
|
132
141
|
status?: string;
|
package/dist/api/client.js
CHANGED
|
@@ -7,15 +7,25 @@ export class APIClient {
|
|
|
7
7
|
}
|
|
8
8
|
async request(method, path, body) {
|
|
9
9
|
const url = `${this.baseUrl}${path}`;
|
|
10
|
-
const
|
|
10
|
+
const opts = {
|
|
11
11
|
method,
|
|
12
12
|
headers: {
|
|
13
13
|
"Content-Type": "application/json",
|
|
14
14
|
"Authorization": `Bearer ${this.apiKey}`,
|
|
15
15
|
},
|
|
16
16
|
body: body ? JSON.stringify(body) : undefined,
|
|
17
|
-
}
|
|
18
|
-
|
|
17
|
+
};
|
|
18
|
+
try {
|
|
19
|
+
return await fetch(url, opts);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
// Retry once on stale keep-alive socket errors (server closed idle connection)
|
|
23
|
+
const causeCode = err?.cause?.code;
|
|
24
|
+
if (causeCode === "UND_ERR_SOCKET" || causeCode === "ECONNRESET") {
|
|
25
|
+
return await fetch(url, opts);
|
|
26
|
+
}
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
19
29
|
}
|
|
20
30
|
async listModels() {
|
|
21
31
|
const res = await this.request("GET", "/api/v1/models");
|
|
@@ -185,6 +195,15 @@ export class APIClient {
|
|
|
185
195
|
Authorization: `Bearer ${this.apiKey}`,
|
|
186
196
|
};
|
|
187
197
|
}
|
|
198
|
+
async postDiagnostics(sessionId, items) {
|
|
199
|
+
const res = await this.request("POST", `/api/v1/sessions/${sessionId}/diagnostics`, { items });
|
|
200
|
+
if (res.status === 202 || res.status === 200)
|
|
201
|
+
return;
|
|
202
|
+
// 5xx / 429 → throw so caller can retry; 4xx → drop silently
|
|
203
|
+
if (res.status >= 500 || res.status === 429) {
|
|
204
|
+
throw new Error(`Diagnostics flush failed: ${res.status}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
188
207
|
async deleteThreadIfEmpty(threadId) {
|
|
189
208
|
const res = await this.request("DELETE", `/api/v1/threads/${threadId}`);
|
|
190
209
|
if (res.status === 204)
|
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,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UiCommandQueue } from "../reporting/reporter.js";
|
|
1
2
|
export interface CallbackEvent {
|
|
2
3
|
type: string;
|
|
3
4
|
data: unknown;
|
|
@@ -5,6 +6,7 @@ export interface CallbackEvent {
|
|
|
5
6
|
}
|
|
6
7
|
export interface CallbackServer {
|
|
7
8
|
url: string;
|
|
9
|
+
uiCommands: UiCommandQueue;
|
|
8
10
|
drain(): CallbackEvent[];
|
|
9
11
|
close(): Promise<void>;
|
|
10
12
|
}
|
package/dist/callback/server.js
CHANGED
|
@@ -1,32 +1,48 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
|
+
import { createUiCommandQueue } from "../reporting/reporter.js";
|
|
2
3
|
export async function startCallbackServer() {
|
|
3
4
|
const events = [];
|
|
5
|
+
const uiCommands = createUiCommandQueue();
|
|
4
6
|
const server = createServer((req, res) => {
|
|
5
|
-
if (req.method
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
if (req.method === "POST" && req.url === "/events") {
|
|
8
|
+
let body = "";
|
|
9
|
+
req.on("data", (chunk) => {
|
|
10
|
+
body += chunk.toString();
|
|
11
|
+
});
|
|
12
|
+
req.on("end", () => {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(body);
|
|
15
|
+
events.push({
|
|
16
|
+
type: parsed.type,
|
|
17
|
+
data: parsed.data,
|
|
18
|
+
timestamp: Date.now(),
|
|
19
|
+
});
|
|
20
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
21
|
+
res.end(JSON.stringify({ ok: true }));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
25
|
+
res.end(JSON.stringify({ ok: false, error: "invalid json" }));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
8
28
|
return;
|
|
9
29
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const parsed = JSON.parse(body);
|
|
17
|
-
events.push({
|
|
18
|
-
type: parsed.type,
|
|
19
|
-
data: parsed.data,
|
|
20
|
-
timestamp: Date.now(),
|
|
21
|
-
});
|
|
22
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
23
|
-
res.end(JSON.stringify({ ok: true }));
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
30
|
+
if (req.method === "GET" && req.url?.startsWith("/ui-commands")) {
|
|
31
|
+
const parsed = new URL(req.url, "http://localhost");
|
|
32
|
+
const raw = parsed.searchParams.get("cursor");
|
|
33
|
+
const cursor = raw === null ? 0 : Number.parseInt(raw, 10);
|
|
34
|
+
if (!Number.isSafeInteger(cursor) || cursor < 0) {
|
|
26
35
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
27
|
-
res.end(JSON.stringify({ ok: false, error: "invalid
|
|
36
|
+
res.end(JSON.stringify({ ok: false, error: "invalid cursor" }));
|
|
37
|
+
return;
|
|
28
38
|
}
|
|
29
|
-
|
|
39
|
+
const commands = uiCommands.drain(cursor);
|
|
40
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
41
|
+
res.end(JSON.stringify({ commands }));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
res.writeHead(404);
|
|
45
|
+
res.end();
|
|
30
46
|
});
|
|
31
47
|
await new Promise((resolve) => {
|
|
32
48
|
server.listen(0, "127.0.0.1", () => resolve());
|
|
@@ -35,6 +51,7 @@ export async function startCallbackServer() {
|
|
|
35
51
|
const url = `http://127.0.0.1:${addr.port}/events`;
|
|
36
52
|
return {
|
|
37
53
|
url,
|
|
54
|
+
uiCommands,
|
|
38
55
|
drain() {
|
|
39
56
|
return events.splice(0);
|
|
40
57
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/callback/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/callback/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { APIClient } from "../api/client.js";
|
|
2
|
+
import type { Reporter } from "../reporting/reporter.js";
|
|
2
3
|
/**
|
|
3
4
|
* Resolve the parent session ID to resume conversation context from.
|
|
4
5
|
*
|
|
@@ -27,6 +28,7 @@ export declare function downloadResumeSessionJsonl(params: {
|
|
|
27
28
|
client: APIClient;
|
|
28
29
|
sourceSessionId: string;
|
|
29
30
|
destDir: string;
|
|
31
|
+
reporter: Reporter;
|
|
30
32
|
}): Promise<string | undefined>;
|
|
31
33
|
/**
|
|
32
34
|
* Convenience: resolve parent session + download session.jsonl in one call.
|
|
@@ -38,5 +40,6 @@ export declare function prepareResumeSessionFile(params: {
|
|
|
38
40
|
currentSessionId: string;
|
|
39
41
|
currentAttempt: number;
|
|
40
42
|
destDir: string;
|
|
43
|
+
reporter: Reporter;
|
|
41
44
|
explicitParentSessionId?: string;
|
|
42
45
|
}): Promise<string | undefined>;
|
|
@@ -49,22 +49,23 @@ export async function downloadResumeSessionJsonl(params) {
|
|
|
49
49
|
try {
|
|
50
50
|
const data = await params.client.downloadSession(params.sourceSessionId, { recover: true });
|
|
51
51
|
if (data.length === 0) {
|
|
52
|
-
|
|
52
|
+
params.reporter.progress(`[naiad] Session stream empty on attempt ${i + 1}/${maxAttempts}`);
|
|
53
53
|
if (i < maxAttempts - 1)
|
|
54
54
|
continue;
|
|
55
55
|
return undefined;
|
|
56
56
|
}
|
|
57
57
|
const filePath = join(params.destDir, "session.jsonl");
|
|
58
58
|
writeFileSync(filePath, data);
|
|
59
|
-
|
|
59
|
+
params.reporter.progress(`[naiad] Downloaded session JSONL from stream (${(data.length / 1024).toFixed(1)}KB)`);
|
|
60
60
|
return filePath;
|
|
61
61
|
}
|
|
62
62
|
catch (err) {
|
|
63
63
|
if (i < maxAttempts - 1) {
|
|
64
|
-
|
|
64
|
+
params.reporter.progress(`[naiad] Session stream download attempt ${i + 1} failed, retrying...`);
|
|
65
65
|
continue;
|
|
66
66
|
}
|
|
67
|
-
|
|
67
|
+
params.reporter.capture("session_stream_download_failed", err);
|
|
68
|
+
params.reporter.progress("[naiad] Failed to download session stream");
|
|
68
69
|
return undefined;
|
|
69
70
|
}
|
|
70
71
|
}
|
|
@@ -77,14 +78,15 @@ export async function downloadResumeSessionJsonl(params) {
|
|
|
77
78
|
export async function prepareResumeSessionFile(params) {
|
|
78
79
|
const parentId = await resolveParentSessionId(params);
|
|
79
80
|
if (!parentId) {
|
|
80
|
-
|
|
81
|
+
params.reporter.progress("[naiad] No prior session found for conversation context");
|
|
81
82
|
return undefined;
|
|
82
83
|
}
|
|
83
|
-
|
|
84
|
+
params.reporter.progress(`[naiad] Fetching conversation context from session ${parentId}...`);
|
|
84
85
|
return downloadResumeSessionJsonl({
|
|
85
86
|
client: params.client,
|
|
86
87
|
sourceSessionId: parentId,
|
|
87
88
|
destDir: params.destDir,
|
|
89
|
+
reporter: params.reporter,
|
|
88
90
|
});
|
|
89
91
|
}
|
|
90
92
|
//# sourceMappingURL=resume-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-session.js","sourceRoot":"","sources":["../../src/checkpoint/resume-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"resume-session.js","sourceRoot":"","sources":["../../src/checkpoint/resume-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,12 @@ import { startWorkers } from "../lifecycle/workers.js";
|
|
|
9
9
|
import { teardownLifecycle } from "../lifecycle/teardown.js";
|
|
10
10
|
import { findPackageRoot } from "../utils/package-root.js";
|
|
11
11
|
import { CommandListener } from "../sync/command-listener.js";
|
|
12
|
+
import { StderrReporter } from "../reporting/reporter.js";
|
|
12
13
|
export async function continueCommand(config, threadId) {
|
|
13
14
|
const client = new APIClient(config);
|
|
15
|
+
const reporter = new StderrReporter();
|
|
14
16
|
// 1. Get thread metadata
|
|
15
|
-
|
|
17
|
+
reporter.progress("[naiad] Fetching thread metadata...");
|
|
16
18
|
const thread = await client.getThread(threadId);
|
|
17
19
|
if (!thread.repo_full_name) {
|
|
18
20
|
console.error("Error: This thread predates remote resume support and cannot be continued.");
|
|
@@ -29,22 +31,22 @@ export async function continueCommand(config, threadId) {
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
catch {
|
|
32
|
-
|
|
34
|
+
reporter.progress("[naiad] Warning: Could not verify local repo against thread repo");
|
|
33
35
|
}
|
|
34
36
|
// 3. Call POST /threads/{id}/continue
|
|
35
|
-
|
|
37
|
+
reporter.progress("[naiad] Requesting continue...");
|
|
36
38
|
const continueResult = await client.continueThread(threadId, "local");
|
|
37
39
|
const sessionId = continueResult.session_id;
|
|
38
40
|
const attempt = continueResult.attempt;
|
|
39
41
|
const parentSessionId = continueResult.parent_session_id;
|
|
40
|
-
|
|
42
|
+
reporter.progress(`[naiad] New session: ${sessionId}, attempt: ${attempt}`);
|
|
41
43
|
// 4. Download and restore checkpoint from parent session
|
|
42
44
|
let sessionJsonlPath;
|
|
43
45
|
if (parentSessionId) {
|
|
44
|
-
sessionJsonlPath = await restoreCheckpoint(client, parentSessionId, thread);
|
|
46
|
+
sessionJsonlPath = await restoreCheckpoint(client, parentSessionId, thread, reporter);
|
|
45
47
|
}
|
|
46
48
|
else {
|
|
47
|
-
|
|
49
|
+
reporter.progress("[naiad] No parent session — starting fresh");
|
|
48
50
|
}
|
|
49
51
|
// 5. Validate API key by listing models
|
|
50
52
|
const { models, seer_model_id: seerModelId, seer_reasoning_effort: seerReasoningEffort, default_model_id: defaultModelId } = await client.listModels();
|
|
@@ -53,6 +55,8 @@ export async function continueCommand(config, threadId) {
|
|
|
53
55
|
const model = (defaultModelId && models.some(m => m.id === defaultModelId)) ? defaultModelId : models[0].id;
|
|
54
56
|
const agentId = randomUUID();
|
|
55
57
|
const sessionDir = mkdtempSync(join(tmpdir(), "naiad-session-"));
|
|
58
|
+
reporter.setLogPath(join(sessionDir, "diagnostics.jsonl"));
|
|
59
|
+
reporter.configureFlusher(client, sessionId);
|
|
56
60
|
const pkgRoot = findPackageRoot();
|
|
57
61
|
const extensionPath = join(pkgRoot, "extensions", "naiad-extension.ts");
|
|
58
62
|
// Capture base_sha
|
|
@@ -69,7 +73,7 @@ export async function continueCommand(config, threadId) {
|
|
|
69
73
|
await client.patchSession(sessionId, { base_sha: baseSha });
|
|
70
74
|
}
|
|
71
75
|
catch (err) {
|
|
72
|
-
|
|
76
|
+
reporter.capture("base_sha_store_failed", err);
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
79
|
// Transition to RUNNING
|
|
@@ -87,6 +91,7 @@ export async function continueCommand(config, threadId) {
|
|
|
87
91
|
externalThread: false,
|
|
88
92
|
baseSha,
|
|
89
93
|
attempt,
|
|
94
|
+
reporter,
|
|
90
95
|
};
|
|
91
96
|
// Launch pi
|
|
92
97
|
const piEnv = {
|
|
@@ -126,22 +131,23 @@ export async function continueCommand(config, threadId) {
|
|
|
126
131
|
sessionId,
|
|
127
132
|
sessionDir,
|
|
128
133
|
piProcess: pi.process,
|
|
134
|
+
reporter,
|
|
129
135
|
});
|
|
130
136
|
commandListener.start();
|
|
131
|
-
|
|
137
|
+
reporter.progress("[naiad] Command listener started (remote control enabled)");
|
|
132
138
|
}
|
|
133
139
|
// Start preemption heartbeat (20s interval)
|
|
134
140
|
const heartbeatTimer = setInterval(async () => {
|
|
135
141
|
try {
|
|
136
142
|
const res = await client.postHeartbeatWithPreemption(agentId, threadId, sessionId, attempt);
|
|
137
143
|
if (res.should_exit) {
|
|
138
|
-
|
|
144
|
+
reporter.progress("[naiad] Session preempted — shutting down");
|
|
139
145
|
clearInterval(heartbeatTimer);
|
|
140
146
|
await pi.shutdown();
|
|
141
147
|
}
|
|
142
148
|
}
|
|
143
149
|
catch (err) {
|
|
144
|
-
|
|
150
|
+
reporter.capture("heartbeat_preemption_check_failed", err);
|
|
145
151
|
}
|
|
146
152
|
}, 20_000);
|
|
147
153
|
// Process pi events
|
|
@@ -150,7 +156,7 @@ export async function continueCommand(config, threadId) {
|
|
|
150
156
|
if (event.type === "checkpoint") {
|
|
151
157
|
const data = event.data ?? event;
|
|
152
158
|
workers.checkpoint.handleCheckpoint(data).catch((err) => {
|
|
153
|
-
|
|
159
|
+
reporter.capture("checkpoint_handling_failed", err);
|
|
154
160
|
});
|
|
155
161
|
return;
|
|
156
162
|
}
|
|
@@ -181,22 +187,23 @@ export async function continueCommand(config, threadId) {
|
|
|
181
187
|
});
|
|
182
188
|
clearInterval(heartbeatTimer);
|
|
183
189
|
process.stdout.write("\n");
|
|
184
|
-
|
|
190
|
+
reporter.progress("[naiad] Agent finished, flushing...");
|
|
185
191
|
commandListener?.stop();
|
|
186
192
|
await workers.stop();
|
|
187
193
|
await teardownLifecycle({ ctx, exitCode });
|
|
188
194
|
process.exit(exitCode);
|
|
189
195
|
}
|
|
190
|
-
async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
191
|
-
|
|
196
|
+
async function restoreCheckpoint(client, parentSessionId, thread, reporter) {
|
|
197
|
+
reporter.progress("[naiad] Downloading checkpoint from parent session...");
|
|
192
198
|
const tmpDir = mkdtempSync(join(tmpdir(), "naiad-restore-"));
|
|
193
199
|
let checkpoint;
|
|
194
200
|
try {
|
|
195
201
|
checkpoint = await client.downloadCheckpoint(parentSessionId);
|
|
196
202
|
}
|
|
197
203
|
catch (err) {
|
|
198
|
-
|
|
199
|
-
|
|
204
|
+
reporter.capture("checkpoint_download_failed", err);
|
|
205
|
+
reporter.progress("[naiad] Failed to download checkpoint — falling back to conversation context");
|
|
206
|
+
return downloadConversationContext(client, parentSessionId, tmpDir, reporter);
|
|
200
207
|
}
|
|
201
208
|
// Download manifest
|
|
202
209
|
let manifest;
|
|
@@ -210,20 +217,21 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
210
217
|
}
|
|
211
218
|
}
|
|
212
219
|
catch (err) {
|
|
213
|
-
|
|
220
|
+
reporter.capture("manifest_download_failed", err);
|
|
221
|
+
reporter.progress("[naiad] Failed to download manifest");
|
|
214
222
|
}
|
|
215
223
|
if (!manifest) {
|
|
216
|
-
|
|
217
|
-
return downloadConversationContext(client, parentSessionId, tmpDir);
|
|
224
|
+
reporter.progress("[naiad] No checkpoint manifest — skipping git restore");
|
|
225
|
+
return downloadConversationContext(client, parentSessionId, tmpDir, reporter);
|
|
218
226
|
}
|
|
219
227
|
if (manifest.version !== 1) {
|
|
220
|
-
|
|
221
|
-
return downloadConversationContext(client, parentSessionId, tmpDir);
|
|
228
|
+
reporter.progress("[naiad] Unknown checkpoint version: " + manifest.version);
|
|
229
|
+
return downloadConversationContext(client, parentSessionId, tmpDir, reporter);
|
|
222
230
|
}
|
|
223
231
|
const baseSha = manifest.base_sha;
|
|
224
232
|
if (!baseSha) {
|
|
225
|
-
|
|
226
|
-
return downloadConversationContext(client, parentSessionId, tmpDir);
|
|
233
|
+
reporter.progress("[naiad] No base_sha in manifest — skipping git restore");
|
|
234
|
+
return downloadConversationContext(client, parentSessionId, tmpDir, reporter);
|
|
227
235
|
}
|
|
228
236
|
// Download artifacts
|
|
229
237
|
const skippedArtifacts = manifest.skipped_artifacts || [];
|
|
@@ -238,7 +246,8 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
238
246
|
}
|
|
239
247
|
}
|
|
240
248
|
catch (err) {
|
|
241
|
-
|
|
249
|
+
reporter.capture("patch_download_failed", err);
|
|
250
|
+
reporter.progress("[naiad] Failed to download patch");
|
|
242
251
|
}
|
|
243
252
|
}
|
|
244
253
|
let untrackedData = null;
|
|
@@ -252,7 +261,8 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
252
261
|
}
|
|
253
262
|
}
|
|
254
263
|
catch (err) {
|
|
255
|
-
|
|
264
|
+
reporter.capture("untracked_download_failed", err);
|
|
265
|
+
reporter.progress("[naiad] Failed to download untracked archive");
|
|
256
266
|
}
|
|
257
267
|
}
|
|
258
268
|
// Verify checksum (git state only — conversation context is sourced separately)
|
|
@@ -276,28 +286,30 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
276
286
|
// May be a pre-v0.2.24 checkpoint that included session data in the hash.
|
|
277
287
|
// Since we no longer have the checkpoint session artifact to verify against,
|
|
278
288
|
// log a warning but proceed — git restore is still best-effort.
|
|
279
|
-
|
|
289
|
+
reporter.progress("[naiad] Checkpoint checksum mismatch (may be pre-v0.2.24 format) — proceeding with git restore");
|
|
280
290
|
}
|
|
281
291
|
// Restore git state
|
|
282
292
|
try {
|
|
283
|
-
|
|
293
|
+
reporter.progress("[naiad] Fetching origin...");
|
|
284
294
|
execFileSync("git", ["fetch", "origin"], { stdio: "pipe" });
|
|
285
295
|
}
|
|
286
296
|
catch (err) {
|
|
287
|
-
|
|
297
|
+
reporter.capture("git_fetch_failed", err);
|
|
298
|
+
reporter.progress("[naiad] git fetch failed");
|
|
288
299
|
}
|
|
289
300
|
const ref = thread.ref || "HEAD";
|
|
290
301
|
try {
|
|
291
|
-
|
|
302
|
+
reporter.progress(`[naiad] Checking out ${ref} at ${baseSha}...`);
|
|
292
303
|
execFileSync("git", ["checkout", "-B", ref, baseSha], { stdio: "pipe" });
|
|
293
304
|
}
|
|
294
305
|
catch (err) {
|
|
295
|
-
|
|
306
|
+
reporter.capture("git_checkout_failed", err);
|
|
307
|
+
reporter.progress("[naiad] git checkout failed");
|
|
296
308
|
try {
|
|
297
309
|
execFileSync("git", ["checkout", baseSha], { stdio: "pipe" });
|
|
298
310
|
}
|
|
299
311
|
catch {
|
|
300
|
-
|
|
312
|
+
reporter.progress("[naiad] Fallback checkout failed — continuing anyway");
|
|
301
313
|
}
|
|
302
314
|
}
|
|
303
315
|
// Apply patch
|
|
@@ -305,11 +317,12 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
305
317
|
const patchPath = join(tmpDir, "patch.bin");
|
|
306
318
|
writeFileSync(patchPath, patchData);
|
|
307
319
|
try {
|
|
308
|
-
|
|
320
|
+
reporter.progress("[naiad] Applying checkpoint patch...");
|
|
309
321
|
execFileSync("git", ["apply", "--3way", patchPath], { stdio: "pipe" });
|
|
310
322
|
}
|
|
311
323
|
catch (err) {
|
|
312
|
-
|
|
324
|
+
reporter.capture("patch_apply_failed", err);
|
|
325
|
+
reporter.progress("[naiad] Patch apply failed, resetting to base SHA");
|
|
313
326
|
try {
|
|
314
327
|
execFileSync("git", ["checkout", "--force", baseSha], { stdio: "pipe" });
|
|
315
328
|
}
|
|
@@ -327,12 +340,12 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
327
340
|
const listing = execFileSync("tar", ["-tzf", untrackedPath], { encoding: "utf8", maxBuffer: 10 * 1024 * 1024 });
|
|
328
341
|
const entries = listing.split("\n").filter(Boolean);
|
|
329
342
|
if (entries.length > 10000) {
|
|
330
|
-
|
|
343
|
+
reporter.progress("[naiad] Too many untracked files (>10000), skipping extraction");
|
|
331
344
|
}
|
|
332
345
|
else {
|
|
333
346
|
const invalid = entries.some(e => e.includes("..") || e.startsWith("/") || e.startsWith(".git/") || e.split("/").length > 50);
|
|
334
347
|
if (invalid) {
|
|
335
|
-
|
|
348
|
+
reporter.progress("[naiad] Unsafe paths in untracked archive, skipping extraction");
|
|
336
349
|
}
|
|
337
350
|
else {
|
|
338
351
|
const extractDir = join(tmpDir, "untracked");
|
|
@@ -359,17 +372,18 @@ async function restoreCheckpoint(client, parentSessionId, thread) {
|
|
|
359
372
|
const { copyFileSync } = await import("fs");
|
|
360
373
|
copyFileSync(src, dst);
|
|
361
374
|
}
|
|
362
|
-
|
|
375
|
+
reporter.progress(`[naiad] Restored ${entries.length} untracked files`);
|
|
363
376
|
}
|
|
364
377
|
}
|
|
365
378
|
}
|
|
366
379
|
catch (err) {
|
|
367
|
-
|
|
380
|
+
reporter.capture("untracked_restore_failed", err);
|
|
381
|
+
reporter.progress("[naiad] Failed to restore untracked files");
|
|
368
382
|
}
|
|
369
383
|
}
|
|
370
|
-
return downloadConversationContext(client, parentSessionId, tmpDir);
|
|
384
|
+
return downloadConversationContext(client, parentSessionId, tmpDir, reporter);
|
|
371
385
|
}
|
|
372
|
-
async function downloadConversationContext(client, parentSessionId, tmpDir) {
|
|
386
|
+
async function downloadConversationContext(client, parentSessionId, tmpDir, reporter) {
|
|
373
387
|
const maxAttempts = 5;
|
|
374
388
|
const delays = [0, 2000, 5000, 10000, 15000];
|
|
375
389
|
for (let i = 0; i < maxAttempts; i++) {
|
|
@@ -381,16 +395,17 @@ async function downloadConversationContext(client, parentSessionId, tmpDir) {
|
|
|
381
395
|
if (data.length > 0) {
|
|
382
396
|
const filePath = join(tmpDir, "session.jsonl");
|
|
383
397
|
writeFileSync(filePath, data);
|
|
384
|
-
|
|
398
|
+
reporter.progress(`[naiad] Downloaded conversation context from session stream (${(data.length / 1024).toFixed(1)}KB)`);
|
|
385
399
|
return filePath;
|
|
386
400
|
}
|
|
387
|
-
|
|
401
|
+
reporter.progress(`[naiad] Session stream empty on attempt ${i + 1}/${maxAttempts}`);
|
|
388
402
|
}
|
|
389
403
|
catch (err) {
|
|
390
|
-
|
|
404
|
+
reporter.capture("session_stream_download_failed", err);
|
|
405
|
+
reporter.progress(`[naiad] Session stream download attempt ${i + 1} failed`);
|
|
391
406
|
}
|
|
392
407
|
}
|
|
393
|
-
|
|
408
|
+
reporter.progress("[naiad] No conversation context available from parent session");
|
|
394
409
|
return undefined;
|
|
395
410
|
}
|
|
396
411
|
function parseRepoFullName(url) {
|