naiad-cli 0.2.6 → 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 +121 -1
- package/package.json +1 -1
package/dist/commands/exec.js
CHANGED
|
@@ -3,6 +3,7 @@ import { launchPi } from "../pi/launcher.js";
|
|
|
3
3
|
import { setupLifecycle } from "../lifecycle/setup.js";
|
|
4
4
|
import { startWorkers } from "../lifecycle/workers.js";
|
|
5
5
|
import { teardownLifecycle } from "../lifecycle/teardown.js";
|
|
6
|
+
import { CommandListener } from "../sync/command-listener.js";
|
|
6
7
|
export async function execCommand(config, prompt, opts = {}) {
|
|
7
8
|
const ctx = await setupLifecycle({
|
|
8
9
|
config,
|
|
@@ -26,25 +27,49 @@ export async function execCommand(config, prompt, opts = {}) {
|
|
|
26
27
|
writeFileSync(opts.output, JSON.stringify(partial, null, 2));
|
|
27
28
|
}
|
|
28
29
|
// Launch pi in RPC mode
|
|
30
|
+
const piEnv = {
|
|
31
|
+
NAIAD_INFERENCE_URL: `${config.apiUrl}/api/v1/inference`,
|
|
32
|
+
NAIAD_API_KEY: config.apiKey,
|
|
33
|
+
NAIAD_THREAD_ID: ctx.threadId,
|
|
34
|
+
NAIAD_SESSION_ID: ctx.sessionId,
|
|
35
|
+
NAIAD_MODEL: ctx.model,
|
|
36
|
+
NAIAD_MODELS_JSON: JSON.stringify(ctx.allModels),
|
|
37
|
+
};
|
|
38
|
+
if (ctx.baseSha) {
|
|
39
|
+
piEnv.NAIAD_BASE_SHA = ctx.baseSha;
|
|
40
|
+
}
|
|
29
41
|
const pi = launchPi({
|
|
30
42
|
model: ctx.model,
|
|
31
43
|
models: ctx.allModels.map((m) => m.id),
|
|
32
44
|
sessionDir: ctx.sessionDir,
|
|
33
45
|
extensionPath: ctx.extensionPath,
|
|
34
|
-
env:
|
|
35
|
-
NAIAD_INFERENCE_URL: `${config.apiUrl}/api/v1/inference`,
|
|
36
|
-
NAIAD_API_KEY: config.apiKey,
|
|
37
|
-
NAIAD_THREAD_ID: ctx.threadId,
|
|
38
|
-
NAIAD_SESSION_ID: ctx.sessionId,
|
|
39
|
-
NAIAD_MODEL: ctx.model,
|
|
40
|
-
NAIAD_MODELS_JSON: JSON.stringify(ctx.allModels),
|
|
41
|
-
},
|
|
46
|
+
env: piEnv,
|
|
42
47
|
});
|
|
43
48
|
// Start background workers
|
|
44
49
|
const workers = startWorkers(ctx);
|
|
50
|
+
// Start command listener for remote control (GHA sessions)
|
|
51
|
+
let commandListener = null;
|
|
52
|
+
if (ctx.remoteControlEnabled) {
|
|
53
|
+
commandListener = new CommandListener({
|
|
54
|
+
client: ctx.client,
|
|
55
|
+
sessionId: ctx.sessionId,
|
|
56
|
+
sessionDir: ctx.sessionDir,
|
|
57
|
+
piProcess: pi.process,
|
|
58
|
+
});
|
|
59
|
+
commandListener.start();
|
|
60
|
+
console.error("[naiad] Command listener started (remote control enabled)");
|
|
61
|
+
}
|
|
45
62
|
// Process pi events
|
|
46
63
|
let agentEnded = false;
|
|
47
64
|
pi.onEvent((event) => {
|
|
65
|
+
// Handle checkpoint messages from extension
|
|
66
|
+
if (event.type === "checkpoint") {
|
|
67
|
+
const data = event.data ?? event;
|
|
68
|
+
workers.checkpoint.handleCheckpoint(data).catch((err) => {
|
|
69
|
+
console.error("[naiad] Checkpoint handling failed:", err);
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
48
73
|
// Forward all events to the spool
|
|
49
74
|
workers.eventSpool.pushEvent(event.type, event);
|
|
50
75
|
// Print assistant message content to stdout
|
|
@@ -79,6 +104,7 @@ export async function execCommand(config, prompt, opts = {}) {
|
|
|
79
104
|
// Flush and finalize
|
|
80
105
|
process.stdout.write("\n");
|
|
81
106
|
console.error("[naiad] Agent finished, flushing...");
|
|
107
|
+
commandListener?.stop();
|
|
82
108
|
await workers.stop();
|
|
83
109
|
await teardownLifecycle({ ctx, exitCode });
|
|
84
110
|
// Phase 2 output: write final result before exit
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { mkdtempSync, writeFileSync } from "fs";
|
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { tmpdir } from "os";
|
|
4
4
|
import { randomUUID } from "crypto";
|
|
5
|
+
import { execSync } from "child_process";
|
|
5
6
|
import { APIClient } from "../api/client.js";
|
|
6
7
|
import { launchPiInteractive } from "../pi/launcher.js";
|
|
7
8
|
import { startCallbackServer } from "../callback/server.js";
|
|
@@ -42,7 +43,9 @@ export async function interactiveCommand(config, options) {
|
|
|
42
43
|
sessionId = session.id;
|
|
43
44
|
console.error(`[naiad] Created session: ${sessionId} (resuming thread ${threadId})`);
|
|
44
45
|
// Transition thread back to RUNNING
|
|
45
|
-
await client.
|
|
46
|
+
const resumedThread = await client.getThread(threadId);
|
|
47
|
+
const attempt = resumedThread.current_attempt;
|
|
48
|
+
await client.updateThread(threadId, { status: "RUNNING", attempt });
|
|
46
49
|
}
|
|
47
50
|
else {
|
|
48
51
|
// New session flow
|
|
@@ -52,7 +55,21 @@ export async function interactiveCommand(config, options) {
|
|
|
52
55
|
const session = await client.createSession(threadId, agentId);
|
|
53
56
|
sessionId = session.id;
|
|
54
57
|
console.error(`[naiad] Created session: ${sessionId}`);
|
|
55
|
-
await client.updateThread(threadId, { status: "RUNNING" });
|
|
58
|
+
await client.updateThread(threadId, { status: "RUNNING", attempt: 1 });
|
|
59
|
+
}
|
|
60
|
+
// Capture base SHA
|
|
61
|
+
let baseSha;
|
|
62
|
+
try {
|
|
63
|
+
baseSha = execSync("git rev-parse HEAD", { encoding: "utf8" }).trim();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Not in a git repo
|
|
67
|
+
}
|
|
68
|
+
if (baseSha) {
|
|
69
|
+
try {
|
|
70
|
+
await client.patchSession(sessionId, { base_sha: baseSha });
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
56
73
|
}
|
|
57
74
|
const ctx = {
|
|
58
75
|
config,
|
|
@@ -65,6 +82,7 @@ export async function interactiveCommand(config, options) {
|
|
|
65
82
|
sessionDir,
|
|
66
83
|
extensionPath,
|
|
67
84
|
externalThread: false,
|
|
85
|
+
baseSha,
|
|
68
86
|
};
|
|
69
87
|
// Start callback server
|
|
70
88
|
const callbackServer = await startCallbackServer();
|
|
@@ -72,21 +90,25 @@ export async function interactiveCommand(config, options) {
|
|
|
72
90
|
// Guard against EIO on inherited stdin after pi exits and releases the PTY
|
|
73
91
|
process.stdin.on("error", () => { });
|
|
74
92
|
// Launch pi in interactive mode
|
|
93
|
+
const piEnv = {
|
|
94
|
+
NAIAD_INFERENCE_URL: `${config.apiUrl}/api/v1/inference`,
|
|
95
|
+
NAIAD_API_KEY: config.apiKey,
|
|
96
|
+
NAIAD_THREAD_ID: threadId,
|
|
97
|
+
NAIAD_SESSION_ID: sessionId,
|
|
98
|
+
NAIAD_MODEL: model,
|
|
99
|
+
NAIAD_MODELS_JSON: JSON.stringify(models),
|
|
100
|
+
NAIAD_CALLBACK_URL: callbackServer.url,
|
|
101
|
+
};
|
|
102
|
+
if (baseSha) {
|
|
103
|
+
piEnv.NAIAD_BASE_SHA = baseSha;
|
|
104
|
+
}
|
|
75
105
|
const pi = launchPiInteractive({
|
|
76
106
|
model,
|
|
77
107
|
models: models.map((m) => m.id),
|
|
78
108
|
sessionDir,
|
|
79
109
|
extensionPath,
|
|
80
110
|
resumeSessionFile,
|
|
81
|
-
env:
|
|
82
|
-
NAIAD_INFERENCE_URL: `${config.apiUrl}/api/v1/inference`,
|
|
83
|
-
NAIAD_API_KEY: config.apiKey,
|
|
84
|
-
NAIAD_THREAD_ID: threadId,
|
|
85
|
-
NAIAD_SESSION_ID: sessionId,
|
|
86
|
-
NAIAD_MODEL: model,
|
|
87
|
-
NAIAD_MODELS_JSON: JSON.stringify(models),
|
|
88
|
-
NAIAD_CALLBACK_URL: callbackServer.url,
|
|
89
|
-
},
|
|
111
|
+
env: piEnv,
|
|
90
112
|
});
|
|
91
113
|
// Start background workers
|
|
92
114
|
const workers = startWorkers(ctx);
|
|
@@ -94,7 +116,14 @@ export async function interactiveCommand(config, options) {
|
|
|
94
116
|
const eventPump = setInterval(() => {
|
|
95
117
|
const events = callbackServer.drain();
|
|
96
118
|
for (const ev of events) {
|
|
97
|
-
|
|
119
|
+
if (ev.type === "checkpoint") {
|
|
120
|
+
workers.checkpoint.handleCheckpoint(ev.data).catch((err) => {
|
|
121
|
+
console.error("[naiad] Checkpoint handling failed:", err);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
workers.eventSpool.pushEvent(ev.type, ev.data);
|
|
126
|
+
}
|
|
98
127
|
}
|
|
99
128
|
}, 200);
|
|
100
129
|
// Wait for pi to exit
|
|
@@ -108,7 +137,12 @@ export async function interactiveCommand(config, options) {
|
|
|
108
137
|
// Drain any remaining callback events
|
|
109
138
|
const remaining = callbackServer.drain();
|
|
110
139
|
for (const ev of remaining) {
|
|
111
|
-
|
|
140
|
+
if (ev.type === "checkpoint") {
|
|
141
|
+
await workers.checkpoint.handleCheckpoint(ev.data, true);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
workers.eventSpool.pushEvent(ev.type, ev.data);
|
|
145
|
+
}
|
|
112
146
|
}
|
|
113
147
|
console.error("[naiad] Pi exited, flushing...");
|
|
114
148
|
// Stop workers and callback server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"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"}
|
package/dist/config/config.d.ts
CHANGED
package/dist/config/config.js
CHANGED
|
@@ -4,7 +4,8 @@ import { homedir } from "os";
|
|
|
4
4
|
export function loadConfig() {
|
|
5
5
|
const apiUrl = process.env.NAIAD_API_URL || loadFromFile("api_url") || "http://localhost:3000";
|
|
6
6
|
const apiKey = process.env.NAIAD_API_KEY || loadFromFile("api_key") || "";
|
|
7
|
-
|
|
7
|
+
const isGHA = !!process.env.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
8
|
+
return { apiUrl, apiKey, isGHA };
|
|
8
9
|
}
|
|
9
10
|
function loadFromFile(key) {
|
|
10
11
|
const configPath = join(homedir(), ".naiad", "config.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAQ7B,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC;IAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,13 +4,15 @@ import { parseArgs } from "node:util";
|
|
|
4
4
|
import { loadConfig } from "./config/config.js";
|
|
5
5
|
import { execCommand } from "./commands/exec.js";
|
|
6
6
|
import { interactiveCommand } from "./commands/interactive.js";
|
|
7
|
+
import { continueCommand } from "./commands/continue.js";
|
|
7
8
|
const args = process.argv.slice(2);
|
|
8
9
|
if (args.includes("--help") || args.includes("-h")) {
|
|
9
10
|
console.log(`naiad - Naiad 2.0 CLI
|
|
10
11
|
|
|
11
12
|
Usage:
|
|
12
|
-
naiad [options]
|
|
13
|
-
naiad exec [options] "<prompt>"
|
|
13
|
+
naiad [options] Interactive mode (default)
|
|
14
|
+
naiad exec [options] "<prompt>" Headless mode
|
|
15
|
+
naiad continue <thread-id> Resume a thread locally
|
|
14
16
|
|
|
15
17
|
Interactive options:
|
|
16
18
|
--model <model_id> Model to use (default: first active model from server)
|
|
@@ -28,18 +30,33 @@ Exec options:
|
|
|
28
30
|
--output <path> Write result JSON to file
|
|
29
31
|
--thread <thread_id> Attach to existing thread (skip thread creation)
|
|
30
32
|
|
|
33
|
+
Continue options:
|
|
34
|
+
<thread-id> Thread ID to resume
|
|
35
|
+
|
|
31
36
|
Environment:
|
|
32
37
|
NAIAD_API_URL Platform API URL (default: http://localhost:3000)
|
|
33
38
|
NAIAD_API_KEY API key for authentication`);
|
|
34
39
|
process.exit(0);
|
|
35
40
|
}
|
|
36
41
|
const config = loadConfig();
|
|
37
|
-
if (!config.apiKey) {
|
|
42
|
+
if (!config.apiKey && !config.isGHA) {
|
|
38
43
|
console.error("Error: NAIAD_API_KEY is required. Set it via environment variable or ~/.naiad/config.json");
|
|
39
44
|
process.exit(1);
|
|
40
45
|
}
|
|
41
46
|
const command = args[0];
|
|
42
|
-
if (command === "
|
|
47
|
+
if (command === "continue") {
|
|
48
|
+
const continueArgs = args.slice(1);
|
|
49
|
+
const threadIdArg = continueArgs[0];
|
|
50
|
+
if (!threadIdArg) {
|
|
51
|
+
console.error("Error: thread-id is required. Usage: naiad continue <thread-id>");
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
continueCommand(config, threadIdArg).catch((err) => {
|
|
55
|
+
console.error("Error:", err.message || err);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
else if (command === "exec") {
|
|
43
60
|
const execArgv = args.slice(1);
|
|
44
61
|
let values;
|
|
45
62
|
let positionals;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lifecycle/setup.js
CHANGED
|
@@ -2,6 +2,7 @@ import { mkdtempSync } from "fs";
|
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { tmpdir } from "os";
|
|
4
4
|
import { randomUUID } from "crypto";
|
|
5
|
+
import { execSync } from "child_process";
|
|
5
6
|
import { APIClient } from "../api/client.js";
|
|
6
7
|
import { findPackageRoot } from "../utils/package-root.js";
|
|
7
8
|
export async function setupLifecycle(params) {
|
|
@@ -32,13 +33,51 @@ export async function setupLifecycle(params) {
|
|
|
32
33
|
threadId = thread.id;
|
|
33
34
|
console.error(`[naiad] Created thread: ${threadId}`);
|
|
34
35
|
}
|
|
35
|
-
//
|
|
36
|
+
// Capture base SHA from git before session creation
|
|
37
|
+
let baseSha;
|
|
38
|
+
try {
|
|
39
|
+
baseSha = execSync("git rev-parse HEAD", { encoding: "utf8" }).trim();
|
|
40
|
+
console.error(`[naiad] Captured base SHA: ${baseSha}`);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
console.error("[naiad] Not in a git repo or git not available, skipping base SHA capture");
|
|
44
|
+
}
|
|
45
|
+
// Session setup: reuse existing session for attached threads, create new for fresh
|
|
36
46
|
const agentId = randomUUID();
|
|
37
47
|
const runtime = params.source === "github" ? "github_actions" : "local_cli";
|
|
38
|
-
|
|
39
|
-
|
|
48
|
+
let session;
|
|
49
|
+
let attempt;
|
|
50
|
+
if (params.threadId) {
|
|
51
|
+
// Attach mode: the platform already created a session for this attempt.
|
|
52
|
+
// Reuse it instead of creating a new one (would violate unique index).
|
|
53
|
+
// Filter by current_attempt to avoid attaching to a stale session.
|
|
54
|
+
const thread = await client.getThread(threadId);
|
|
55
|
+
const currentAttempt = thread.current_attempt;
|
|
56
|
+
const sessions = await client.listThreadSessions(threadId);
|
|
57
|
+
const active = sessions.find((s) => s.status === "ACTIVE" && s.attempt === currentAttempt);
|
|
58
|
+
if (!active) {
|
|
59
|
+
throw new Error(`No active session found for thread ${threadId} attempt ${currentAttempt}. The platform may not have created one yet.`);
|
|
60
|
+
}
|
|
61
|
+
session = active;
|
|
62
|
+
attempt = currentAttempt;
|
|
63
|
+
console.error(`[naiad] Reusing existing session: ${session.id} (attempt ${attempt})`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
session = await client.createSession(threadId, agentId, runtime);
|
|
67
|
+
attempt = 1;
|
|
68
|
+
console.error(`[naiad] Created session: ${session.id}`);
|
|
69
|
+
// Store base_sha in session record (only for fresh sessions we created)
|
|
70
|
+
if (baseSha) {
|
|
71
|
+
try {
|
|
72
|
+
await client.patchSession(session.id, { base_sha: baseSha });
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error("[naiad] Failed to store base SHA in session:", err);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
40
79
|
// Transition to RUNNING
|
|
41
|
-
await client.updateThread(threadId, { status: "RUNNING" });
|
|
80
|
+
await client.updateThread(threadId, { status: "RUNNING", attempt });
|
|
42
81
|
// Set up session dir
|
|
43
82
|
const sessionDir = mkdtempSync(join(tmpdir(), "naiad-session-"));
|
|
44
83
|
// Resolve extension path relative to package root
|
|
@@ -55,6 +94,9 @@ export async function setupLifecycle(params) {
|
|
|
55
94
|
sessionDir,
|
|
56
95
|
extensionPath,
|
|
57
96
|
externalThread: !!params.threadId,
|
|
97
|
+
baseSha,
|
|
98
|
+
remoteControlEnabled: session.remote_control_enabled ?? false,
|
|
99
|
+
attempt,
|
|
58
100
|
};
|
|
59
101
|
}
|
|
60
102
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lifecycle/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lifecycle/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,11 @@ export async function teardownLifecycle(params) {
|
|
|
16
16
|
await ctx.client.updateThread(ctx.threadId, {
|
|
17
17
|
status: "FAILED",
|
|
18
18
|
error: errorMessage || `pi exited with code ${exitCode}`,
|
|
19
|
+
attempt: ctx.attempt,
|
|
19
20
|
});
|
|
20
21
|
}
|
|
21
22
|
else {
|
|
22
|
-
await ctx.client.updateThread(ctx.threadId, { status: "COMPLETED" });
|
|
23
|
+
await ctx.client.updateThread(ctx.threadId, { status: "COMPLETED", attempt: ctx.attempt });
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/lifecycle/teardown.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAIvC;IACC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,WAAW,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,kEAAkE;IAClE,oEAAoE;IACpE,wDAAwD;IACxD,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC1C,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,YAAY,IAAI,uBAAuB,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/lifecycle/teardown.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAIvC;IACC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,WAAW,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,kEAAkE;IAClE,oEAAoE;IACpE,wDAAwD;IACxD,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC1C,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,YAAY,IAAI,uBAAuB,QAAQ,EAAE;oBACxD,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,iEAAiE;YACjE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC,CAAC;IAChE,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import type { APIClient } from "../api/client.js";
|
|
|
3
3
|
import type { EventSpool } from "../sync/events.js";
|
|
4
4
|
import type { SessionUploader } from "../sync/session-upload.js";
|
|
5
5
|
import type { HeartbeatReporter } from "../sync/heartbeat.js";
|
|
6
|
+
import type { CheckpointUploader } from "../sync/checkpoint.js";
|
|
6
7
|
export interface LifecycleContext {
|
|
7
8
|
config: NaiadConfig;
|
|
8
9
|
client: APIClient;
|
|
@@ -19,10 +20,14 @@ export interface LifecycleContext {
|
|
|
19
20
|
sessionDir: string;
|
|
20
21
|
extensionPath: string;
|
|
21
22
|
externalThread: boolean;
|
|
23
|
+
baseSha?: string;
|
|
24
|
+
remoteControlEnabled?: boolean;
|
|
25
|
+
attempt?: number;
|
|
22
26
|
}
|
|
23
27
|
export interface Workers {
|
|
24
28
|
eventSpool: EventSpool;
|
|
25
29
|
uploader: SessionUploader;
|
|
26
30
|
heartbeat: HeartbeatReporter;
|
|
31
|
+
checkpoint: CheckpointUploader;
|
|
27
32
|
stop(): Promise<void>;
|
|
28
33
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EventSpool } from "../sync/events.js";
|
|
2
2
|
import { SessionUploader } from "../sync/session-upload.js";
|
|
3
3
|
import { HeartbeatReporter } from "../sync/heartbeat.js";
|
|
4
|
+
import { CheckpointUploader } from "../sync/checkpoint.js";
|
|
4
5
|
export function startWorkers(ctx) {
|
|
5
6
|
const eventSpool = new EventSpool(ctx.client, ctx.threadId, ctx.sessionId);
|
|
6
7
|
eventSpool.start();
|
|
@@ -8,12 +9,15 @@ export function startWorkers(ctx) {
|
|
|
8
9
|
uploader.start();
|
|
9
10
|
const heartbeat = new HeartbeatReporter(ctx.client, ctx.agentId, ctx.threadId, ctx.sessionId);
|
|
10
11
|
heartbeat.start();
|
|
12
|
+
const checkpoint = new CheckpointUploader(ctx.client, ctx.sessionId, ctx.sessionDir, ctx.attempt ?? 1);
|
|
11
13
|
return {
|
|
12
14
|
eventSpool,
|
|
13
15
|
uploader,
|
|
14
16
|
heartbeat,
|
|
17
|
+
checkpoint,
|
|
15
18
|
async stop() {
|
|
16
19
|
heartbeat.stop();
|
|
20
|
+
await checkpoint.flushOnExit();
|
|
17
21
|
await eventSpool.stop();
|
|
18
22
|
await uploader.stop();
|
|
19
23
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../../src/lifecycle/workers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../../src/lifecycle/workers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,UAAU,YAAY,CAAC,GAAqB;IAChD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3E,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAChF,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEjB,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9F,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAEvG,OAAO;QACL,UAAU;QACV,QAAQ;QACR,SAAS;QACT,UAAU;QACV,KAAK,CAAC,IAAI;YACR,SAAS,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { APIClient } from "../api/client.js";
|
|
2
|
+
export interface CheckpointMessage {
|
|
3
|
+
base_sha: string;
|
|
4
|
+
head_sha: string;
|
|
5
|
+
patchPath: string | null;
|
|
6
|
+
untrackedPath: string | null;
|
|
7
|
+
untrackedFiles: string[];
|
|
8
|
+
patchBytes: number;
|
|
9
|
+
patchExceededMaxBuffer: boolean;
|
|
10
|
+
skippedArtifacts: string[];
|
|
11
|
+
timestamp: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class CheckpointUploader {
|
|
14
|
+
private client;
|
|
15
|
+
private sessionId;
|
|
16
|
+
private sessionDir;
|
|
17
|
+
private attempt;
|
|
18
|
+
private lastUploadAt;
|
|
19
|
+
private pendingCheckpoint;
|
|
20
|
+
constructor(client: APIClient, sessionId: string, sessionDir: string, attempt: number);
|
|
21
|
+
handleCheckpoint(msg: CheckpointMessage, forceUpload?: boolean): Promise<void>;
|
|
22
|
+
flushOnExit(): Promise<void>;
|
|
23
|
+
private uploadCheckpoint;
|
|
24
|
+
private uploadArtifact;
|
|
25
|
+
private findSessionJsonl;
|
|
26
|
+
private prepareSessionJsonl;
|
|
27
|
+
private readAndHash;
|
|
28
|
+
private cleanupTempFiles;
|
|
29
|
+
}
|