naiad-cli 0.2.55 → 0.2.57
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/sync/checkpoint.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { readFileSync,
|
|
1
|
+
import { readFileSync, unlinkSync, rmSync, statSync, openSync, readSync, closeSync, createReadStream } from "fs";
|
|
2
2
|
import { createHash } from "crypto";
|
|
3
|
+
import { findSessionJsonl } from "./session-upload.js";
|
|
3
4
|
const THROTTLE_MS = 30_000;
|
|
4
5
|
const JSONL_MAX_BYTES = 200 * 1024 * 1024;
|
|
5
6
|
const MARKER_LINE = '{"type":"system","message":"[Naiad] Session log truncated — earlier entries exceeded 200MB limit."}\n';
|
|
@@ -145,26 +146,7 @@ export class CheckpointUploader {
|
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
findSessionJsonl() {
|
|
148
|
-
|
|
149
|
-
const files = readdirSync(this.sessionDir).filter((f) => f.endsWith(".jsonl"));
|
|
150
|
-
if (files.length === 0)
|
|
151
|
-
return null;
|
|
152
|
-
// Use the most recently modified
|
|
153
|
-
let best = null;
|
|
154
|
-
let bestMtime = 0;
|
|
155
|
-
for (const f of files) {
|
|
156
|
-
const full = `${this.sessionDir}/${f}`;
|
|
157
|
-
const st = statSync(full);
|
|
158
|
-
if (st.mtimeMs > bestMtime) {
|
|
159
|
-
bestMtime = st.mtimeMs;
|
|
160
|
-
best = full;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return best;
|
|
164
|
-
}
|
|
165
|
-
catch {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
149
|
+
return findSessionJsonl(this.sessionDir);
|
|
168
150
|
}
|
|
169
151
|
prepareSessionJsonl(filePath) {
|
|
170
152
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/sync/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/sync/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { APIClient } from "../api/client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Find the active session JSONL file in a session directory.
|
|
4
|
+
* Returns the most recently modified .jsonl file, or null if none exist.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findSessionJsonl(sessionDir: string): string | null;
|
|
2
7
|
export declare class SessionUploader {
|
|
3
8
|
private client;
|
|
4
9
|
private sessionId;
|
|
5
10
|
private sessionDir;
|
|
6
11
|
private pollTimer;
|
|
7
|
-
private
|
|
12
|
+
private uploadPromise;
|
|
13
|
+
private lastUploadedSize;
|
|
8
14
|
constructor(client: APIClient, sessionId: string, sessionDir: string);
|
|
9
15
|
start(): void;
|
|
10
16
|
stop(): Promise<void>;
|
|
11
17
|
private checkAndUpload;
|
|
18
|
+
private doUpload;
|
|
12
19
|
private uploadFile;
|
|
13
20
|
}
|
|
@@ -1,45 +1,93 @@
|
|
|
1
1
|
import { readFileSync, readdirSync, statSync } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { createHash } from "crypto";
|
|
4
|
+
/**
|
|
5
|
+
* Find the active session JSONL file in a session directory.
|
|
6
|
+
* Returns the most recently modified .jsonl file, or null if none exist.
|
|
7
|
+
*/
|
|
8
|
+
export function findSessionJsonl(sessionDir) {
|
|
9
|
+
try {
|
|
10
|
+
const files = readdirSync(sessionDir).filter((f) => f.endsWith(".jsonl"));
|
|
11
|
+
if (files.length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
let best = null;
|
|
14
|
+
let bestMtime = 0;
|
|
15
|
+
for (const f of files) {
|
|
16
|
+
const full = join(sessionDir, f);
|
|
17
|
+
const st = statSync(full);
|
|
18
|
+
if (st.mtimeMs > bestMtime) {
|
|
19
|
+
bestMtime = st.mtimeMs;
|
|
20
|
+
best = full;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return best;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
4
29
|
const CHUNK_SIZE = 4 * 1024 * 1024; // 4 MiB
|
|
5
30
|
export class SessionUploader {
|
|
6
31
|
client;
|
|
7
32
|
sessionId;
|
|
8
33
|
sessionDir;
|
|
9
34
|
pollTimer = null;
|
|
10
|
-
|
|
35
|
+
uploadPromise = null;
|
|
36
|
+
lastUploadedSize = 0;
|
|
11
37
|
constructor(client, sessionId, sessionDir) {
|
|
12
38
|
this.client = client;
|
|
13
39
|
this.sessionId = sessionId;
|
|
14
40
|
this.sessionDir = sessionDir;
|
|
15
41
|
}
|
|
16
42
|
start() {
|
|
17
|
-
this.pollTimer = setInterval(() =>
|
|
43
|
+
this.pollTimer = setInterval(() => {
|
|
44
|
+
void this.checkAndUpload(false).catch(() => { });
|
|
45
|
+
}, 10_000);
|
|
18
46
|
}
|
|
19
47
|
async stop() {
|
|
20
48
|
if (this.pollTimer) {
|
|
21
49
|
clearInterval(this.pollTimer);
|
|
22
50
|
this.pollTimer = null;
|
|
23
51
|
}
|
|
24
|
-
|
|
52
|
+
// Wait for any in-flight poll upload to finish (ignore errors — we retry below)
|
|
53
|
+
if (this.uploadPromise) {
|
|
54
|
+
await this.uploadPromise.catch(() => { });
|
|
55
|
+
}
|
|
56
|
+
// Final upload + finalize with the complete session data
|
|
57
|
+
await this.checkAndUpload(true);
|
|
25
58
|
}
|
|
26
|
-
async checkAndUpload() {
|
|
27
|
-
|
|
59
|
+
async checkAndUpload(finalize) {
|
|
60
|
+
// If a poll upload is in-flight, skip (but stop() waits and retries)
|
|
61
|
+
if (this.uploadPromise && !finalize)
|
|
28
62
|
return;
|
|
63
|
+
// If stop() is called while a poll is in-flight, it awaits above then enters here
|
|
64
|
+
const p = this.doUpload(finalize);
|
|
65
|
+
this.uploadPromise = p;
|
|
29
66
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
67
|
+
await p;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
if (this.uploadPromise === p)
|
|
71
|
+
this.uploadPromise = null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async doUpload(finalize) {
|
|
75
|
+
const filePath = findSessionJsonl(this.sessionDir);
|
|
76
|
+
if (!filePath)
|
|
77
|
+
return;
|
|
78
|
+
try {
|
|
79
|
+
await this.uploadFile(filePath, finalize);
|
|
34
80
|
}
|
|
35
81
|
catch {
|
|
36
|
-
//
|
|
82
|
+
// Best-effort — recover mode is the safety net
|
|
37
83
|
}
|
|
38
84
|
}
|
|
39
|
-
async uploadFile(filePath) {
|
|
85
|
+
async uploadFile(filePath, finalize) {
|
|
40
86
|
const stat = statSync(filePath);
|
|
41
87
|
if (stat.size === 0)
|
|
42
88
|
return;
|
|
89
|
+
if (!finalize && stat.size === this.lastUploadedSize)
|
|
90
|
+
return;
|
|
43
91
|
const data = readFileSync(filePath);
|
|
44
92
|
const totalBytes = data.length;
|
|
45
93
|
const chunkCount = Math.ceil(totalBytes / CHUNK_SIZE);
|
|
@@ -65,18 +113,16 @@ export class SessionUploader {
|
|
|
65
113
|
throw new Error(`Chunk upload failed: ${res.status}`);
|
|
66
114
|
}
|
|
67
115
|
}
|
|
68
|
-
|
|
116
|
+
this.lastUploadedSize = totalBytes;
|
|
117
|
+
// Only finalize on stop() — intermediate uploads are picked up via recover mode
|
|
118
|
+
if (!finalize)
|
|
119
|
+
return;
|
|
69
120
|
try {
|
|
70
121
|
await this.client.finalizeSession(this.sessionId, totalBytes, chunkCount, fileHash);
|
|
71
122
|
}
|
|
72
|
-
catch
|
|
73
|
-
|
|
74
|
-
this.finalized = true;
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
throw err;
|
|
123
|
+
catch {
|
|
124
|
+
// Best-effort finalize; recover mode handles non-finalized sessions
|
|
78
125
|
}
|
|
79
|
-
this.finalized = true;
|
|
80
126
|
}
|
|
81
127
|
}
|
|
82
128
|
//# sourceMappingURL=session-upload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-upload.js","sourceRoot":"","sources":["../../src/sync/session-upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE5C,MAAM,OAAO,eAAe;IAClB,MAAM,CAAY;IAClB,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,SAAS,GAA0C,IAAI,CAAC;IACxD,
|
|
1
|
+
{"version":3,"file":"session-upload.js","sourceRoot":"","sources":["../../src/sync/session-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -282,6 +282,20 @@ export default function (pi: ExtensionAPI) {
|
|
|
282
282
|
assistantMsg.content = textBlocks.map((b) => b.text).join("");
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
+
// Round-trip thinking/reasoning blocks
|
|
286
|
+
const thinkingBlocks = msg.content.filter((b: any) => b.type === "thinking" && b.thinking?.trim());
|
|
287
|
+
if (thinkingBlocks.length > 0) {
|
|
288
|
+
// Prefer raw reasoning_details if stored (preserves structure for models that need it)
|
|
289
|
+
const rawDetails = thinkingBlocks.flatMap((b: any) => b.rawReasoningDetails || []);
|
|
290
|
+
if (rawDetails.length > 0) {
|
|
291
|
+
assistantMsg.reasoning_details = rawDetails;
|
|
292
|
+
} else {
|
|
293
|
+
// Fall back to flattened reasoning_content string
|
|
294
|
+
const reasoningText = thinkingBlocks.map((b: any) => b.thinking).join("\n");
|
|
295
|
+
assistantMsg.reasoning_content = reasoningText;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
285
299
|
const toolCalls = msg.content.filter((b): b is ToolCall => b.type === "toolCall");
|
|
286
300
|
if (toolCalls.length > 0) {
|
|
287
301
|
assistantMsg.tool_calls = toolCalls.map((tc) => ({
|
|
@@ -294,8 +308,9 @@ export default function (pi: ExtensionAPI) {
|
|
|
294
308
|
}));
|
|
295
309
|
}
|
|
296
310
|
|
|
297
|
-
// Skip empty assistant messages
|
|
298
|
-
|
|
311
|
+
// Skip truly empty assistant messages (but keep thinking-only or tool-only)
|
|
312
|
+
const hasReasoning = assistantMsg.reasoning_details || assistantMsg.reasoning_content;
|
|
313
|
+
if (assistantMsg.content === null && !assistantMsg.tool_calls && !hasReasoning) continue;
|
|
299
314
|
messages.push(assistantMsg);
|
|
300
315
|
} else if (msg.role === "toolResult") {
|
|
301
316
|
const textResult = msg.content
|
|
@@ -436,6 +451,13 @@ export default function (pi: ExtensionAPI) {
|
|
|
436
451
|
toolCall: block as ToolCall,
|
|
437
452
|
partial: output,
|
|
438
453
|
});
|
|
454
|
+
} else if (block.type === "thinking") {
|
|
455
|
+
stream.push({
|
|
456
|
+
type: "thinking_end",
|
|
457
|
+
contentIndex: blockIndex(),
|
|
458
|
+
content: block.thinking,
|
|
459
|
+
partial: output,
|
|
460
|
+
});
|
|
439
461
|
}
|
|
440
462
|
};
|
|
441
463
|
|
|
@@ -471,6 +493,40 @@ export default function (pi: ExtensionAPI) {
|
|
|
471
493
|
}
|
|
472
494
|
}
|
|
473
495
|
|
|
496
|
+
// Handle reasoning/thinking deltas FIRST (reasoning precedes content/tool_calls)
|
|
497
|
+
// OpenRouter normalized format: reasoning_details array
|
|
498
|
+
const reasoningDetails = choice.delta?.reasoning_details;
|
|
499
|
+
if (reasoningDetails && Array.isArray(reasoningDetails)) {
|
|
500
|
+
for (const detail of reasoningDetails) {
|
|
501
|
+
const reasoningText = detail.text ?? detail.summary ?? "";
|
|
502
|
+
if (!reasoningText) continue;
|
|
503
|
+
|
|
504
|
+
if (!currentBlock || currentBlock.type !== "thinking") {
|
|
505
|
+
finishCurrentBlock(currentBlock);
|
|
506
|
+
currentBlock = { type: "thinking", thinking: "", rawReasoningDetails: [] };
|
|
507
|
+
output.content.push(currentBlock);
|
|
508
|
+
stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
|
|
509
|
+
}
|
|
510
|
+
currentBlock.thinking += reasoningText;
|
|
511
|
+
// Accumulate raw details verbatim for lossless round-tripping
|
|
512
|
+
currentBlock.rawReasoningDetails.push(detail);
|
|
513
|
+
stream.push({ type: "thinking_delta", contentIndex: blockIndex(), delta: reasoningText, partial: output });
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Legacy reasoning/reasoning_content string field (skip if array format already handled)
|
|
518
|
+
const reasoningStr = choice.delta?.reasoning ?? choice.delta?.reasoning_content;
|
|
519
|
+
if (!(reasoningDetails?.length > 0) && reasoningStr && typeof reasoningStr === "string") {
|
|
520
|
+
if (!currentBlock || currentBlock.type !== "thinking") {
|
|
521
|
+
finishCurrentBlock(currentBlock);
|
|
522
|
+
currentBlock = { type: "thinking", thinking: "" };
|
|
523
|
+
output.content.push(currentBlock);
|
|
524
|
+
stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
|
|
525
|
+
}
|
|
526
|
+
currentBlock.thinking += reasoningStr;
|
|
527
|
+
stream.push({ type: "thinking_delta", contentIndex: blockIndex(), delta: reasoningStr, partial: output });
|
|
528
|
+
}
|
|
529
|
+
|
|
474
530
|
// Handle text content delta
|
|
475
531
|
const delta = choice.delta?.content;
|
|
476
532
|
if (delta) {
|