@kenkaiiii/ggcoder 4.3.205 → 4.3.207
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/cli.js +38 -26
- package/dist/cli.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +6 -0
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +16 -0
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/goal-controller.d.ts +57 -0
- package/dist/core/goal-controller.d.ts.map +1 -0
- package/dist/core/goal-controller.js +285 -0
- package/dist/core/goal-controller.js.map +1 -0
- package/dist/core/goal-controller.test.d.ts +2 -0
- package/dist/core/goal-controller.test.d.ts.map +1 -0
- package/dist/core/goal-controller.test.js +419 -0
- package/dist/core/goal-controller.test.js.map +1 -0
- package/dist/core/goal-lifecycle-smoke.test.d.ts +2 -0
- package/dist/core/goal-lifecycle-smoke.test.d.ts.map +1 -0
- package/dist/core/goal-lifecycle-smoke.test.js +207 -0
- package/dist/core/goal-lifecycle-smoke.test.js.map +1 -0
- package/dist/core/goal-store.d.ts +164 -0
- package/dist/core/goal-store.d.ts.map +1 -0
- package/dist/core/goal-store.js +721 -0
- package/dist/core/goal-store.js.map +1 -0
- package/dist/core/goal-store.test.d.ts +2 -0
- package/dist/core/goal-store.test.d.ts.map +1 -0
- package/dist/core/goal-store.test.js +341 -0
- package/dist/core/goal-store.test.js.map +1 -0
- package/dist/core/goal-verifier.d.ts +17 -0
- package/dist/core/goal-verifier.d.ts.map +1 -0
- package/dist/core/goal-verifier.js +84 -0
- package/dist/core/goal-verifier.js.map +1 -0
- package/dist/core/goal-verifier.test.d.ts +2 -0
- package/dist/core/goal-verifier.test.d.ts.map +1 -0
- package/dist/core/goal-verifier.test.js +88 -0
- package/dist/core/goal-verifier.test.js.map +1 -0
- package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts +2 -0
- package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts.map +1 -0
- package/dist/core/goal-worker-dev-server-lifecycle.test.js +68 -0
- package/dist/core/goal-worker-dev-server-lifecycle.test.js.map +1 -0
- package/dist/core/goal-worker.d.ts +51 -0
- package/dist/core/goal-worker.d.ts.map +1 -0
- package/dist/core/goal-worker.js +339 -0
- package/dist/core/goal-worker.js.map +1 -0
- package/dist/core/goal-worker.test.d.ts +2 -0
- package/dist/core/goal-worker.test.d.ts.map +1 -0
- package/dist/core/goal-worker.test.js +224 -0
- package/dist/core/goal-worker.test.js.map +1 -0
- package/dist/core/model-registry.test.js +51 -1
- package/dist/core/model-registry.test.js.map +1 -1
- package/dist/core/oauth/gemini.d.ts.map +1 -1
- package/dist/core/oauth/gemini.js +138 -30
- package/dist/core/oauth/gemini.js.map +1 -1
- package/dist/core/oauth/gemini.test.d.ts +2 -0
- package/dist/core/oauth/gemini.test.d.ts.map +1 -0
- package/dist/core/oauth/gemini.test.js +154 -0
- package/dist/core/oauth/gemini.test.js.map +1 -0
- package/dist/core/process-manager-dev-server-repro.test.d.ts +2 -0
- package/dist/core/process-manager-dev-server-repro.test.d.ts.map +1 -0
- package/dist/core/process-manager-dev-server-repro.test.js +100 -0
- package/dist/core/process-manager-dev-server-repro.test.js.map +1 -0
- package/dist/core/process-manager.js +2 -2
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +125 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +38 -0
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +20 -11
- package/dist/interactive.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +19 -50
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +124 -1
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/edit-diff.d.ts.map +1 -1
- package/dist/tools/edit-diff.js +71 -32
- package/dist/tools/edit-diff.js.map +1 -1
- package/dist/tools/edit-diff.test.js +14 -0
- package/dist/tools/edit-diff.test.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +38 -18
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +56 -6
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/enter-plan.d.ts.map +1 -1
- package/dist/tools/enter-plan.js +1 -0
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/goals.d.ts +110 -0
- package/dist/tools/goals.d.ts.map +1 -0
- package/dist/tools/goals.js +500 -0
- package/dist/tools/goals.js.map +1 -0
- package/dist/tools/goals.test.d.ts +2 -0
- package/dist/tools/goals.test.d.ts.map +1 -0
- package/dist/tools/goals.test.js +431 -0
- package/dist/tools/goals.test.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/source-path.d.ts +9 -0
- package/dist/tools/source-path.d.ts.map +1 -0
- package/dist/tools/source-path.js +119 -0
- package/dist/tools/source-path.js.map +1 -0
- package/dist/tools/source-path.test.d.ts +2 -0
- package/dist/tools/source-path.test.d.ts.map +1 -0
- package/dist/tools/source-path.test.js +80 -0
- package/dist/tools/source-path.test.js.map +1 -0
- package/dist/tools/subagent.js +16 -0
- package/dist/tools/subagent.js.map +1 -1
- package/dist/ui/App.d.ts +73 -4
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +1068 -140
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/activity-phrases.d.ts.map +1 -1
- package/dist/ui/activity-phrases.js +7 -3
- package/dist/ui/activity-phrases.js.map +1 -1
- package/dist/ui/app-state-persistence.test.d.ts +2 -0
- package/dist/ui/app-state-persistence.test.d.ts.map +1 -0
- package/dist/ui/app-state-persistence.test.js +130 -0
- package/dist/ui/app-state-persistence.test.js.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts +16 -1
- package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
- package/dist/ui/components/BackgroundTasksBar.js +15 -2
- package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
- package/dist/ui/components/Banner.d.ts +2 -1
- package/dist/ui/components/Banner.d.ts.map +1 -1
- package/dist/ui/components/Banner.js +3 -3
- package/dist/ui/components/Banner.js.map +1 -1
- package/dist/ui/components/GoalOverlay.d.ts +74 -0
- package/dist/ui/components/GoalOverlay.d.ts.map +1 -0
- package/dist/ui/components/GoalOverlay.js +675 -0
- package/dist/ui/components/GoalOverlay.js.map +1 -0
- package/dist/ui/components/GoalStatusBar.d.ts +24 -0
- package/dist/ui/components/GoalStatusBar.d.ts.map +1 -0
- package/dist/ui/components/GoalStatusBar.js +113 -0
- package/dist/ui/components/GoalStatusBar.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +2 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +44 -2
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/InputArea.test.d.ts +2 -0
- package/dist/ui/components/InputArea.test.d.ts.map +1 -0
- package/dist/ui/components/InputArea.test.js +79 -0
- package/dist/ui/components/InputArea.test.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +96 -3
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/footer-status-layout.test.d.ts +2 -0
- package/dist/ui/footer-status-layout.test.d.ts.map +1 -0
- package/dist/ui/footer-status-layout.test.js +56 -0
- package/dist/ui/footer-status-layout.test.js.map +1 -0
- package/dist/ui/goal-events.d.ts +107 -0
- package/dist/ui/goal-events.d.ts.map +1 -0
- package/dist/ui/goal-events.js +323 -0
- package/dist/ui/goal-events.js.map +1 -0
- package/dist/ui/goal-events.test.d.ts +2 -0
- package/dist/ui/goal-events.test.d.ts.map +1 -0
- package/dist/ui/goal-events.test.js +293 -0
- package/dist/ui/goal-events.test.js.map +1 -0
- package/dist/ui/goal-overlay.test.d.ts +2 -0
- package/dist/ui/goal-overlay.test.d.ts.map +1 -0
- package/dist/ui/goal-overlay.test.js +276 -0
- package/dist/ui/goal-overlay.test.js.map +1 -0
- package/dist/ui/goal-status-bar.test.d.ts +2 -0
- package/dist/ui/goal-status-bar.test.d.ts.map +1 -0
- package/dist/ui/goal-status-bar.test.js +143 -0
- package/dist/ui/goal-status-bar.test.js.map +1 -0
- package/dist/ui/live-item-flush.test.js +48 -0
- package/dist/ui/live-item-flush.test.js.map +1 -1
- package/dist/ui/render.d.ts +11 -4
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +12 -3
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/scroll-stabilization.test.d.ts +2 -0
- package/dist/ui/scroll-stabilization.test.d.ts.map +1 -0
- package/dist/ui/scroll-stabilization.test.js +70 -0
- package/dist/ui/scroll-stabilization.test.js.map +1 -0
- package/dist/ui/slash-command-images.test.d.ts +2 -0
- package/dist/ui/slash-command-images.test.d.ts.map +1 -0
- package/dist/ui/slash-command-images.test.js +47 -0
- package/dist/ui/slash-command-images.test.js.map +1 -0
- package/dist/utils/format.js +44 -0
- package/dist/utils/format.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
EventEmitter.captureRejections = true;
|
|
4
|
+
import { PassThrough } from "node:stream";
|
|
5
|
+
import fs from "node:fs/promises";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { projectDir } from "./goal-store.js";
|
|
9
|
+
const spawnMock = vi.hoisted(() => vi.fn());
|
|
10
|
+
vi.mock("node:child_process", () => ({ spawn: spawnMock }));
|
|
11
|
+
vi.mock("node:fs/promises", async () => {
|
|
12
|
+
const actual = await vi.importActual("node:fs/promises");
|
|
13
|
+
const writeFile = vi.fn((file, data, options) => actual.writeFile(file, data, options));
|
|
14
|
+
return { ...actual, writeFile };
|
|
15
|
+
});
|
|
16
|
+
class FakeChild extends EventEmitter {
|
|
17
|
+
stdout = new PassThrough();
|
|
18
|
+
stderr = new PassThrough();
|
|
19
|
+
pid = 4242;
|
|
20
|
+
kill = vi.fn();
|
|
21
|
+
}
|
|
22
|
+
let tmpBase;
|
|
23
|
+
let tmpProject;
|
|
24
|
+
let child;
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
vi.useFakeTimers();
|
|
27
|
+
tmpBase = await fs.mkdtemp(path.join(os.tmpdir(), "goal-verifier-test-base-"));
|
|
28
|
+
tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "goal-verifier-test-project-"));
|
|
29
|
+
process.env.GG_GOALS_BASE = tmpBase;
|
|
30
|
+
child = new FakeChild();
|
|
31
|
+
spawnMock.mockReturnValue(child);
|
|
32
|
+
});
|
|
33
|
+
afterEach(async () => {
|
|
34
|
+
vi.useRealTimers();
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
delete process.env.GG_GOALS_BASE;
|
|
37
|
+
await fs.rm(tmpBase, { recursive: true, force: true });
|
|
38
|
+
await fs.rm(tmpProject, { recursive: true, force: true });
|
|
39
|
+
});
|
|
40
|
+
describe("runGoalVerifierCommand", () => {
|
|
41
|
+
it("records spawn errors as failed verifier artifacts", async () => {
|
|
42
|
+
const { runGoalVerifierCommand } = await import("./goal-verifier.js");
|
|
43
|
+
const resultPromise = runGoalVerifierCommand({
|
|
44
|
+
cwd: tmpProject,
|
|
45
|
+
runId: "goal-a",
|
|
46
|
+
command: "missing-verifier",
|
|
47
|
+
now: () => 1234,
|
|
48
|
+
});
|
|
49
|
+
await vi.waitFor(() => expect(child.listenerCount("error")).toBeGreaterThan(0));
|
|
50
|
+
child.listeners("error").forEach((listener) => listener.call(child, new Error("spawn ENOENT")));
|
|
51
|
+
child.emit("close", 1);
|
|
52
|
+
const result = await resultPromise;
|
|
53
|
+
expect(result.failureClass).toBe("verifier_spawn_error");
|
|
54
|
+
expect(result.verification).toMatchObject({
|
|
55
|
+
status: "fail",
|
|
56
|
+
command: "missing-verifier",
|
|
57
|
+
exitCode: 1,
|
|
58
|
+
summary: "Verifier process error: spawn ENOENT",
|
|
59
|
+
});
|
|
60
|
+
expect(result.verification.outputPath).toBe(path.join(projectDir(tmpProject), "verifiers", "goal-a-1234.log"));
|
|
61
|
+
await expect(fs.readFile(result.verification.outputPath, "utf-8")).resolves.toContain("Verifier process error: spawn ENOENT");
|
|
62
|
+
});
|
|
63
|
+
it("times out hung verifiers, kills them, and writes stable output artifacts", async () => {
|
|
64
|
+
const { runGoalVerifierCommand } = await import("./goal-verifier.js");
|
|
65
|
+
const resultPromise = runGoalVerifierCommand({
|
|
66
|
+
cwd: tmpProject,
|
|
67
|
+
runId: "goal-a",
|
|
68
|
+
command: "sleep forever",
|
|
69
|
+
timeoutMs: 25,
|
|
70
|
+
now: () => 2000,
|
|
71
|
+
});
|
|
72
|
+
await vi.waitFor(() => expect(child.listenerCount("close")).toBeGreaterThan(0));
|
|
73
|
+
await vi.waitFor(() => expect(child.stdout.listenerCount("data")).toBeGreaterThan(0));
|
|
74
|
+
child.stdout
|
|
75
|
+
.listeners("data")
|
|
76
|
+
.forEach((listener) => listener.call(child.stdout, Buffer.from("partial output")));
|
|
77
|
+
await vi.advanceTimersByTimeAsync(25);
|
|
78
|
+
child.emit("close", 124);
|
|
79
|
+
const result = await resultPromise;
|
|
80
|
+
expect(child.kill).toHaveBeenCalledWith("SIGTERM");
|
|
81
|
+
expect(result.failureClass).toBe("verifier_timeout");
|
|
82
|
+
expect(result.verification).toMatchObject({ status: "fail", exitCode: 124 });
|
|
83
|
+
expect(result.verification.summary).toContain("Verifier timed out after 25ms");
|
|
84
|
+
expect(result.verification.outputPath).toBe(path.join(projectDir(tmpProject), "verifiers", "goal-a-2000.log"));
|
|
85
|
+
await expect(fs.readFile(result.verification.outputPath, "utf-8")).resolves.toContain("Verifier timed out after 25ms");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=goal-verifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-verifier.test.js","sourceRoot":"","sources":["../../src/core/goal-verifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-worker-dev-server-lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/core/goal-worker-dev-server-lifecycle.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { ProcessManager } from "./process-manager.js";
|
|
6
|
+
import { createBashTool } from "../tools/bash.js";
|
|
7
|
+
import { createTaskOutputTool } from "../tools/task-output.js";
|
|
8
|
+
const toolContext = () => ({ toolCallId: "test", signal: new AbortController().signal });
|
|
9
|
+
async function waitForToolOutput(taskOutput, id, predicate) {
|
|
10
|
+
let combined = "";
|
|
11
|
+
for (let i = 0; i < 50; i += 1) {
|
|
12
|
+
const output = await taskOutput.execute({ id, from_start: false }, toolContext());
|
|
13
|
+
combined += String(output);
|
|
14
|
+
if (predicate(combined))
|
|
15
|
+
return combined;
|
|
16
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
17
|
+
}
|
|
18
|
+
throw new Error(`Timed out waiting for worker tool output. Saw:\n${combined}`);
|
|
19
|
+
}
|
|
20
|
+
function parseBackgroundId(output) {
|
|
21
|
+
const match = output.match(/^ID: (.+)$/m);
|
|
22
|
+
if (!match)
|
|
23
|
+
throw new Error(`No background process id in output:\n${output}`);
|
|
24
|
+
return match[1].trim();
|
|
25
|
+
}
|
|
26
|
+
async function writeDevServerFixture(tmpDir) {
|
|
27
|
+
const fixture = path.join(tmpDir, "worker-dev-server.mjs");
|
|
28
|
+
await fs.writeFile(fixture, `import http from 'node:http';\n` +
|
|
29
|
+
`const server = http.createServer((_req, res) => res.end('ok'));\n` +
|
|
30
|
+
`server.listen(0, '127.0.0.1', () => {\n` +
|
|
31
|
+
` const address = server.address();\n` +
|
|
32
|
+
` console.log('WORKER_DEV_SERVER_READY ' + address.port);\n` +
|
|
33
|
+
`});\n` +
|
|
34
|
+
`const interval = setInterval(() => console.log('WORKER_DEV_SERVER_TICK'), 250);\n` +
|
|
35
|
+
`process.on('SIGTERM', () => {\n` +
|
|
36
|
+
` console.log('WORKER_DEV_SERVER_SIGTERM');\n` +
|
|
37
|
+
` clearInterval(interval);\n` +
|
|
38
|
+
` server.close(() => process.exit(0));\n` +
|
|
39
|
+
`});\n`);
|
|
40
|
+
return fixture;
|
|
41
|
+
}
|
|
42
|
+
describe("Goal worker dev-server lifecycle", () => {
|
|
43
|
+
let manager;
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
manager?.shutdownAll();
|
|
46
|
+
});
|
|
47
|
+
it("keeps worker-owned background dev servers available during the worker and cleans them up on worker CLI shutdown", async () => {
|
|
48
|
+
manager = new ProcessManager();
|
|
49
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-worker-dev-server-"));
|
|
50
|
+
const fixture = await writeDevServerFixture(tmpDir);
|
|
51
|
+
const bash = createBashTool(tmpDir, manager);
|
|
52
|
+
const taskOutput = createTaskOutputTool(manager);
|
|
53
|
+
const startOutput = await bash.execute({ command: `${process.execPath} ${fixture}`, run_in_background: true }, toolContext());
|
|
54
|
+
const id = parseBackgroundId(String(startOutput));
|
|
55
|
+
const ready = await waitForToolOutput(taskOutput, id, (output) => output.includes("WORKER_DEV_SERVER_READY"));
|
|
56
|
+
expect(ready).toContain("Process");
|
|
57
|
+
expect(ready).toContain("running");
|
|
58
|
+
manager.shutdownAll();
|
|
59
|
+
let final = await manager.readOutput(id, true);
|
|
60
|
+
for (let i = 0; i < 20 && !final.output.includes("WORKER_DEV_SERVER_SIGTERM"); i += 1) {
|
|
61
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
62
|
+
final = await manager.readOutput(id, true);
|
|
63
|
+
}
|
|
64
|
+
expect(final.isRunning).toBe(false);
|
|
65
|
+
expect(final.output).toContain("WORKER_DEV_SERVER_READY");
|
|
66
|
+
}, 15_000);
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=goal-worker-dev-server-lifecycle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-worker-dev-server-lifecycle.test.js","sourceRoot":"","sources":["../../src/core/goal-worker-dev-server-lifecycle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Provider } from "@kenkaiiii/gg-ai";
|
|
2
|
+
export interface GoalWorkerRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
pid: number;
|
|
5
|
+
goalRunId: string;
|
|
6
|
+
goalTaskId: string;
|
|
7
|
+
cwd: string;
|
|
8
|
+
provider: Provider;
|
|
9
|
+
model: string;
|
|
10
|
+
startedAt: string;
|
|
11
|
+
logFile: string;
|
|
12
|
+
status: "running" | "done" | "failed" | "stopped";
|
|
13
|
+
exitCode: number | null;
|
|
14
|
+
currentActivity?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GoalWorkerToolUse {
|
|
17
|
+
name: string;
|
|
18
|
+
ok: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface GoalWorkerCompletion {
|
|
21
|
+
worker: GoalWorkerRecord;
|
|
22
|
+
summary: string;
|
|
23
|
+
status: "done" | "failed";
|
|
24
|
+
exitCode: number;
|
|
25
|
+
toolsUsed: GoalWorkerToolUse[];
|
|
26
|
+
reason?: "exit" | "spawn_error" | "timeout";
|
|
27
|
+
}
|
|
28
|
+
export type GoalWorkerCompletionListener = (completion: GoalWorkerCompletion) => void;
|
|
29
|
+
export interface GoalWorkerContext {
|
|
30
|
+
cwd: string;
|
|
31
|
+
goalRunId: string;
|
|
32
|
+
goalTaskId: string;
|
|
33
|
+
taskTitle?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface StartGoalWorkerOptions extends GoalWorkerContext {
|
|
36
|
+
provider: Provider;
|
|
37
|
+
model: string;
|
|
38
|
+
prompt: string;
|
|
39
|
+
systemPrompt?: string;
|
|
40
|
+
parentCacheKey?: string;
|
|
41
|
+
maxTurns?: number;
|
|
42
|
+
onComplete?: (completion: GoalWorkerCompletion) => void;
|
|
43
|
+
}
|
|
44
|
+
export declare function buildGoalWorkerSystemPrompt(context: GoalWorkerContext): string;
|
|
45
|
+
export declare function subscribeGoalWorkerCompletions(listener: GoalWorkerCompletionListener, projectPath?: string): () => void;
|
|
46
|
+
export declare function startGoalWorker(options: StartGoalWorkerOptions): Promise<GoalWorkerRecord>;
|
|
47
|
+
export declare function listGoalWorkers(projectPath?: string): GoalWorkerRecord[];
|
|
48
|
+
export declare function stopGoalWorker(workerId: string): Promise<string>;
|
|
49
|
+
export declare function shutdownGoalWorkers(projectPath?: string): void;
|
|
50
|
+
export declare function hasGoalWorkerLog(record: GoalWorkerRecord): boolean;
|
|
51
|
+
//# sourceMappingURL=goal-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-worker.d.ts","sourceRoot":"","sources":["../../src/core/goal-worker.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAejD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,UAAU,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAOtF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACzD;AAYD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAW9E;AAiCD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,4BAA4B,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,IAAI,CAqBZ;AA0BD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4MhG;AAED,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAGxE;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BtE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { createWriteStream, existsSync } from "node:fs";
|
|
4
|
+
import { mkdir } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { killProcessTree } from "../utils/process.js";
|
|
8
|
+
import { log } from "./logger.js";
|
|
9
|
+
import { appendGoalEvidence, projectDir, updateGoalTask, upsertGoalRun, getGoalRun, } from "./goal-store.js";
|
|
10
|
+
const DEFAULT_GOAL_WORKER_MAX_TURNS = 12;
|
|
11
|
+
const MAX_SUMMARY_CHARS = 4000;
|
|
12
|
+
const workers = new Map();
|
|
13
|
+
const children = new Map();
|
|
14
|
+
const completionSubscriptions = new Set();
|
|
15
|
+
const pendingCompletions = [];
|
|
16
|
+
const MAX_PENDING_COMPLETIONS = 100;
|
|
17
|
+
function getCliPath() {
|
|
18
|
+
return process.argv[1] ?? "";
|
|
19
|
+
}
|
|
20
|
+
export function buildGoalWorkerSystemPrompt(context) {
|
|
21
|
+
const title = context.taskTitle ? ` (${context.taskTitle})` : "";
|
|
22
|
+
return ("You are a disposable Goal worker running inside the same project as the main GG Coder session. " +
|
|
23
|
+
`Goal context: cwd=${context.cwd}; run_id=${context.goalRunId}; task_id=${context.goalTaskId}${title}. ` +
|
|
24
|
+
"Follow only the assigned Goal task prompt, which is passed as this worker's user message. Keep changes focused, use local/free tools, source_path/docs/kencode real-code research when relevant, and translate the requested outcome into observable proof: ask what would prove this goal actually worked end-to-end, then create the simplest reliable local/free proof path for the domain. " +
|
|
25
|
+
"create needed scripts/fixtures/harnesses and use tests, local CLIs, dev servers, browser/simulator/device screenshots, video/frame inspection, logs, generated assets, protocol traces, database assertions, API probes, contract tests, performance measurements, source/docs comparison, or other artifacts as appropriate; for mobile/UI, prefer local simulator/browser evidence such as iOS Simulator screenshots when available before requiring a physical phone. " +
|
|
26
|
+
"Run requested verification and update durable Goal state with the goals tool using command/file evidence, screenshot/log evidence, not narrative or human visual inspection. Worker-started background processes, including dev servers, are worker-owned and are cleaned up when this worker CLI exits; if a later worker/verifier needs a persistent server, record instructions or metadata for the orchestrator to start/provide the localhost URL instead of relying on your background process. " +
|
|
27
|
+
`Record evidence and task status with goals({ action: "evidence" | "task", run_id: "${context.goalRunId}", task_id: "${context.goalTaskId}", ... }) for goal ${context.goalRunId}, task ${context.goalTaskId}. ` +
|
|
28
|
+
"Do not mark the whole goal complete; only the orchestrator/verifier can complete it.");
|
|
29
|
+
}
|
|
30
|
+
function appendSummary(summary, text) {
|
|
31
|
+
const next = summary + text;
|
|
32
|
+
return next.length > MAX_SUMMARY_CHARS ? next.slice(next.length - MAX_SUMMARY_CHARS) : next;
|
|
33
|
+
}
|
|
34
|
+
function completionMatchesProject(completion, projectPath) {
|
|
35
|
+
return projectPath === undefined || completion.worker.cwd === projectPath;
|
|
36
|
+
}
|
|
37
|
+
function emitGoalWorkerCompletion(completion) {
|
|
38
|
+
let delivered = false;
|
|
39
|
+
for (const subscription of completionSubscriptions) {
|
|
40
|
+
if (!completionMatchesProject(completion, subscription.projectPath))
|
|
41
|
+
continue;
|
|
42
|
+
delivered = true;
|
|
43
|
+
try {
|
|
44
|
+
subscription.listener(completion);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
log("ERROR", "goal-worker", err instanceof Error ? err.message : String(err));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (delivered)
|
|
51
|
+
return;
|
|
52
|
+
pendingCompletions.push(completion);
|
|
53
|
+
if (pendingCompletions.length > MAX_PENDING_COMPLETIONS) {
|
|
54
|
+
pendingCompletions.splice(0, pendingCompletions.length - MAX_PENDING_COMPLETIONS);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function subscribeGoalWorkerCompletions(listener, projectPath) {
|
|
58
|
+
const subscription = { listener, projectPath };
|
|
59
|
+
completionSubscriptions.add(subscription);
|
|
60
|
+
for (let index = 0; index < pendingCompletions.length;) {
|
|
61
|
+
const completion = pendingCompletions[index];
|
|
62
|
+
if (!completionMatchesProject(completion, projectPath)) {
|
|
63
|
+
index += 1;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
pendingCompletions.splice(index, 1);
|
|
67
|
+
try {
|
|
68
|
+
listener(completion);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
log("ERROR", "goal-worker", err instanceof Error ? err.message : String(err));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return () => {
|
|
75
|
+
completionSubscriptions.delete(subscription);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function formatActivity(name, args) {
|
|
79
|
+
const firstString = Object.values(args).find((value) => typeof value === "string");
|
|
80
|
+
return firstString ? `${name}: ${firstString.slice(0, 80)}` : name;
|
|
81
|
+
}
|
|
82
|
+
async function setRunWorker(cwd, runId, workerId) {
|
|
83
|
+
const run = await getGoalRun(cwd, runId);
|
|
84
|
+
if (!run)
|
|
85
|
+
return;
|
|
86
|
+
const patch = workerId
|
|
87
|
+
? { ...run, activeWorkerId: workerId, status: "running" }
|
|
88
|
+
: {
|
|
89
|
+
...run,
|
|
90
|
+
activeWorkerId: undefined,
|
|
91
|
+
status: run.status === "running" ? "ready" : run.status,
|
|
92
|
+
};
|
|
93
|
+
await upsertGoalRun(cwd, patch);
|
|
94
|
+
}
|
|
95
|
+
export async function startGoalWorker(options) {
|
|
96
|
+
const cliPath = getCliPath();
|
|
97
|
+
if (!cliPath)
|
|
98
|
+
throw new Error("Cannot start Goal worker: CLI path is unavailable.");
|
|
99
|
+
const existing = listGoalWorkers(options.cwd).find((worker) => worker.goalRunId === options.goalRunId && worker.status === "running");
|
|
100
|
+
if (existing)
|
|
101
|
+
return existing;
|
|
102
|
+
const workerId = randomUUID().slice(0, 8);
|
|
103
|
+
const workerDir = join(projectDir(options.cwd), "workers");
|
|
104
|
+
await mkdir(workerDir, { recursive: true });
|
|
105
|
+
const logFile = join(workerDir, `${workerId}.ndjson`);
|
|
106
|
+
const logStream = createWriteStream(logFile, { flags: "a" });
|
|
107
|
+
const cliArgs = [
|
|
108
|
+
"--json",
|
|
109
|
+
"--provider",
|
|
110
|
+
options.provider,
|
|
111
|
+
"--model",
|
|
112
|
+
options.model,
|
|
113
|
+
"--max-turns",
|
|
114
|
+
String(options.maxTurns ?? DEFAULT_GOAL_WORKER_MAX_TURNS),
|
|
115
|
+
"--system-prompt",
|
|
116
|
+
options.systemPrompt ??
|
|
117
|
+
buildGoalWorkerSystemPrompt({
|
|
118
|
+
cwd: options.cwd,
|
|
119
|
+
goalRunId: options.goalRunId,
|
|
120
|
+
goalTaskId: options.goalTaskId,
|
|
121
|
+
...(options.taskTitle ? { taskTitle: options.taskTitle } : {}),
|
|
122
|
+
}),
|
|
123
|
+
];
|
|
124
|
+
if (options.parentCacheKey) {
|
|
125
|
+
cliArgs.push("--prompt-cache-key", `${options.parentCacheKey}:goal`);
|
|
126
|
+
}
|
|
127
|
+
cliArgs.push(options.prompt);
|
|
128
|
+
const child = spawn(process.execPath, [cliPath, ...cliArgs], {
|
|
129
|
+
cwd: options.cwd,
|
|
130
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
131
|
+
env: { ...process.env },
|
|
132
|
+
});
|
|
133
|
+
const record = {
|
|
134
|
+
id: workerId,
|
|
135
|
+
pid: child.pid ?? 0,
|
|
136
|
+
goalRunId: options.goalRunId,
|
|
137
|
+
goalTaskId: options.goalTaskId,
|
|
138
|
+
cwd: options.cwd,
|
|
139
|
+
provider: options.provider,
|
|
140
|
+
model: options.model,
|
|
141
|
+
startedAt: new Date().toISOString(),
|
|
142
|
+
logFile,
|
|
143
|
+
status: "running",
|
|
144
|
+
exitCode: null,
|
|
145
|
+
};
|
|
146
|
+
workers.set(workerId, record);
|
|
147
|
+
children.set(workerId, child);
|
|
148
|
+
await updateGoalTask(options.cwd, options.goalRunId, options.goalTaskId, {
|
|
149
|
+
status: "running",
|
|
150
|
+
workerId,
|
|
151
|
+
});
|
|
152
|
+
await setRunWorker(options.cwd, options.goalRunId, workerId);
|
|
153
|
+
let summary = "";
|
|
154
|
+
let stderr = "";
|
|
155
|
+
const activeTools = new Map();
|
|
156
|
+
const toolsUsed = [];
|
|
157
|
+
const rl = createInterface({ input: child.stdout });
|
|
158
|
+
rl.on("line", (line) => {
|
|
159
|
+
logStream.write(line + "\n");
|
|
160
|
+
try {
|
|
161
|
+
const event = JSON.parse(line);
|
|
162
|
+
if (event.type === "text_delta" && typeof event.text === "string") {
|
|
163
|
+
summary = appendSummary(summary, event.text);
|
|
164
|
+
}
|
|
165
|
+
else if (event.type === "tool_call_start") {
|
|
166
|
+
const name = typeof event.name === "string" ? event.name : "tool";
|
|
167
|
+
const toolCallId = typeof event.toolCallId === "string" ? event.toolCallId : randomUUID();
|
|
168
|
+
activeTools.set(toolCallId, name);
|
|
169
|
+
const args = typeof event.args === "object" && event.args !== null
|
|
170
|
+
? event.args
|
|
171
|
+
: {};
|
|
172
|
+
record.currentActivity = formatActivity(name, args);
|
|
173
|
+
void appendGoalEvidence(options.cwd, options.goalRunId, {
|
|
174
|
+
kind: "log",
|
|
175
|
+
label: `Worker ${workerId} tool start`,
|
|
176
|
+
content: record.currentActivity,
|
|
177
|
+
path: logFile,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (event.type === "tool_call_end") {
|
|
181
|
+
const toolCallId = typeof event.toolCallId === "string" ? event.toolCallId : "";
|
|
182
|
+
const name = activeTools.get(toolCallId);
|
|
183
|
+
activeTools.delete(toolCallId);
|
|
184
|
+
if (name)
|
|
185
|
+
toolsUsed.push({ name, ok: event.isError !== true });
|
|
186
|
+
}
|
|
187
|
+
else if (event.type === "agent_done") {
|
|
188
|
+
summary = appendSummary(summary, "\n[agent_done]");
|
|
189
|
+
}
|
|
190
|
+
else if (event.type === "error") {
|
|
191
|
+
const message = typeof event.message === "string" ? event.message : "Worker error";
|
|
192
|
+
summary = appendSummary(summary, `\n[error] ${message}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
summary = appendSummary(summary, line + "\n");
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
child.stderr?.on("data", (chunk) => {
|
|
200
|
+
const text = chunk.toString("utf-8");
|
|
201
|
+
stderr = appendSummary(stderr, text);
|
|
202
|
+
logStream.write(JSON.stringify({ type: "stderr", text }) + "\n");
|
|
203
|
+
});
|
|
204
|
+
child.on("close", (code) => {
|
|
205
|
+
void (async () => {
|
|
206
|
+
rl.close();
|
|
207
|
+
logStream.end();
|
|
208
|
+
children.delete(workerId);
|
|
209
|
+
record.exitCode = code;
|
|
210
|
+
if (record.status === "stopped") {
|
|
211
|
+
log("INFO", "goal-worker", `Worker ${workerId} stopped`, {
|
|
212
|
+
code: String(code ?? 1),
|
|
213
|
+
goalRunId: options.goalRunId,
|
|
214
|
+
goalTaskId: options.goalTaskId,
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
record.status = code === 0 ? "done" : "failed";
|
|
219
|
+
const finalSummary = summary.trim() || stderr.trim() || (code === 0 ? "Worker completed." : "Worker failed.");
|
|
220
|
+
const finalCode = code ?? (record.status === "done" ? 0 : 1);
|
|
221
|
+
await updateGoalTask(options.cwd, options.goalRunId, options.goalTaskId, {
|
|
222
|
+
status: code === 0 ? "done" : "failed",
|
|
223
|
+
workerId,
|
|
224
|
+
lastSummary: finalSummary,
|
|
225
|
+
});
|
|
226
|
+
await appendGoalEvidence(options.cwd, options.goalRunId, {
|
|
227
|
+
kind: "log",
|
|
228
|
+
label: `Worker ${workerId} ${record.status}`,
|
|
229
|
+
content: finalSummary,
|
|
230
|
+
path: logFile,
|
|
231
|
+
});
|
|
232
|
+
await setRunWorker(options.cwd, options.goalRunId, undefined);
|
|
233
|
+
const completion = {
|
|
234
|
+
worker: { ...record },
|
|
235
|
+
summary: finalSummary,
|
|
236
|
+
status: record.status,
|
|
237
|
+
exitCode: finalCode,
|
|
238
|
+
toolsUsed: [...toolsUsed],
|
|
239
|
+
reason: "exit",
|
|
240
|
+
};
|
|
241
|
+
options.onComplete?.(completion);
|
|
242
|
+
emitGoalWorkerCompletion(completion);
|
|
243
|
+
log("INFO", "goal-worker", `Worker ${workerId} exited`, {
|
|
244
|
+
code: String(code ?? 1),
|
|
245
|
+
goalRunId: options.goalRunId,
|
|
246
|
+
goalTaskId: options.goalTaskId,
|
|
247
|
+
});
|
|
248
|
+
})().catch((err) => {
|
|
249
|
+
log("ERROR", "goal-worker", err instanceof Error ? err.message : String(err));
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
child.on("error", (err) => {
|
|
253
|
+
void (async () => {
|
|
254
|
+
logStream.end();
|
|
255
|
+
children.delete(workerId);
|
|
256
|
+
record.exitCode = 1;
|
|
257
|
+
record.status = "failed";
|
|
258
|
+
const finalSummary = `Failed to spawn Goal worker: ${err.message}`;
|
|
259
|
+
await updateGoalTask(options.cwd, options.goalRunId, options.goalTaskId, {
|
|
260
|
+
status: "failed",
|
|
261
|
+
workerId,
|
|
262
|
+
lastSummary: finalSummary,
|
|
263
|
+
});
|
|
264
|
+
await appendGoalEvidence(options.cwd, options.goalRunId, {
|
|
265
|
+
kind: "log",
|
|
266
|
+
label: `Worker ${workerId} spawn failed`,
|
|
267
|
+
content: err.message,
|
|
268
|
+
path: logFile,
|
|
269
|
+
});
|
|
270
|
+
await setRunWorker(options.cwd, options.goalRunId, undefined);
|
|
271
|
+
const completion = {
|
|
272
|
+
worker: { ...record },
|
|
273
|
+
summary: finalSummary,
|
|
274
|
+
status: "failed",
|
|
275
|
+
exitCode: 1,
|
|
276
|
+
toolsUsed: [...toolsUsed],
|
|
277
|
+
reason: "spawn_error",
|
|
278
|
+
};
|
|
279
|
+
options.onComplete?.(completion);
|
|
280
|
+
emitGoalWorkerCompletion(completion);
|
|
281
|
+
})().catch((error) => {
|
|
282
|
+
log("ERROR", "goal-worker", error instanceof Error ? error.message : String(error));
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
log("INFO", "goal-worker", `Worker ${workerId} started`, {
|
|
286
|
+
pid: String(record.pid),
|
|
287
|
+
goalRunId: options.goalRunId,
|
|
288
|
+
goalTaskId: options.goalTaskId,
|
|
289
|
+
});
|
|
290
|
+
return record;
|
|
291
|
+
}
|
|
292
|
+
export function listGoalWorkers(projectPath) {
|
|
293
|
+
const records = [...workers.values()];
|
|
294
|
+
return projectPath ? records.filter((record) => record.cwd === projectPath) : records;
|
|
295
|
+
}
|
|
296
|
+
export async function stopGoalWorker(workerId) {
|
|
297
|
+
const record = workers.get(workerId);
|
|
298
|
+
if (!record)
|
|
299
|
+
return `No Goal worker with id "${workerId}".`;
|
|
300
|
+
const child = children.get(workerId);
|
|
301
|
+
if (!child || record.status !== "running")
|
|
302
|
+
return `Goal worker ${workerId} is not running.`;
|
|
303
|
+
record.status = "stopped";
|
|
304
|
+
try {
|
|
305
|
+
if (child.pid)
|
|
306
|
+
killProcessTree(child.pid);
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
child.kill("SIGTERM");
|
|
310
|
+
}
|
|
311
|
+
children.delete(workerId);
|
|
312
|
+
await updateGoalTask(record.cwd, record.goalRunId, record.goalTaskId, {
|
|
313
|
+
status: "blocked",
|
|
314
|
+
workerId,
|
|
315
|
+
lastSummary: "Worker stopped by user.",
|
|
316
|
+
});
|
|
317
|
+
await appendGoalEvidence(record.cwd, record.goalRunId, {
|
|
318
|
+
kind: "summary",
|
|
319
|
+
label: `Worker ${workerId} stopped`,
|
|
320
|
+
content: "Worker stopped by user.",
|
|
321
|
+
path: record.logFile,
|
|
322
|
+
});
|
|
323
|
+
await setRunWorker(record.cwd, record.goalRunId, undefined);
|
|
324
|
+
return `Goal worker ${workerId} stopped.`;
|
|
325
|
+
}
|
|
326
|
+
export function shutdownGoalWorkers(projectPath) {
|
|
327
|
+
for (const record of listGoalWorkers(projectPath)) {
|
|
328
|
+
const child = children.get(record.id);
|
|
329
|
+
if (!child || !child.pid)
|
|
330
|
+
continue;
|
|
331
|
+
killProcessTree(child.pid);
|
|
332
|
+
children.delete(record.id);
|
|
333
|
+
record.status = "stopped";
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export function hasGoalWorkerLog(record) {
|
|
337
|
+
return existsSync(record.logFile);
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=goal-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-worker.js","sourceRoot":"","sources":["../../src/core/goal-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-worker.test.d.ts","sourceRoot":"","sources":["../../src/core/goal-worker.test.ts"],"names":[],"mappings":""}
|