@kenkaiiii/ggcoder 4.3.59 → 4.3.61

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.
@@ -0,0 +1,258 @@
1
+ import { spawn } from "node:child_process";
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import chalk from "chalk";
6
+ import { DEFAULT_INGEST_URL } from "@kenkaiiii/gg-pixel";
7
+ export async function fixError(errorId, opts = {}) {
8
+ const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\/+$/, "");
9
+ const fetchFn = opts.fetchFn ?? fetch;
10
+ const home = opts.homeDir ?? homedir();
11
+ const error = await fetchError(fetchFn, ingestUrl, errorId);
12
+ const project = lookupProject(home, error.project_id);
13
+ const branch = `fix/pixel-${error.id}`;
14
+ await patchError(fetchFn, ingestUrl, error.id, { status: "in_progress", branch });
15
+ const exitCode = await runAgent({
16
+ cwd: project.path,
17
+ prompt: buildAgentPrompt(error, branch),
18
+ systemPrompt: AGENT_SYSTEM_PROMPT,
19
+ spawnFn: opts.spawnFn ?? spawn,
20
+ ggcoderBin: opts.ggcoderBin ?? "ggcoder",
21
+ inheritStdio: opts.inheritStdio ?? true,
22
+ maxTurns: opts.maxTurns ?? 60,
23
+ });
24
+ const observed = await observeOutcome(project.path, branch, opts.spawnFn ?? spawn);
25
+ let outcome;
26
+ let reason;
27
+ if (exitCode !== 0) {
28
+ outcome = "failed";
29
+ reason = `Agent exited with code ${exitCode}`;
30
+ }
31
+ else if (!observed.branchExists) {
32
+ outcome = "failed";
33
+ reason = `Branch ${branch} was not created`;
34
+ }
35
+ else if (!observed.hasCommits) {
36
+ outcome = "failed";
37
+ reason = `Branch ${branch} has no new commits`;
38
+ }
39
+ else {
40
+ outcome = "awaiting_review";
41
+ reason = `Branch ${branch} created with ${observed.commitCount} commit(s) — ready for review`;
42
+ }
43
+ await patchError(fetchFn, ingestUrl, error.id, { status: outcome, branch });
44
+ return { errorId: error.id, projectName: project.name, branch, outcome, reason };
45
+ }
46
+ export async function runQueue(opts = {}) {
47
+ const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\/+$/, "");
48
+ const fetchFn = opts.fetchFn ?? fetch;
49
+ const home = opts.homeDir ?? homedir();
50
+ const log = opts.onProgress ?? ((msg) => console.log(msg));
51
+ const projectsPath = join(home, ".gg", "projects.json");
52
+ if (!existsSync(projectsPath)) {
53
+ log(chalk.dim("No projects registered. Run `ggcoder pixel install` first."));
54
+ return { fixed: 0, failed: 0, total: 0 };
55
+ }
56
+ const projects = JSON.parse(readFileSync(projectsPath, "utf8"));
57
+ const queue = [];
58
+ for (const [projectId, project] of Object.entries(projects)) {
59
+ try {
60
+ const res = await fetchFn(`${ingestUrl}/api/projects/${projectId}/errors?status=open`);
61
+ if (!res.ok)
62
+ continue;
63
+ const body = (await res.json());
64
+ for (const e of body.errors) {
65
+ queue.push({ projectName: project.name, errorId: e.id });
66
+ }
67
+ }
68
+ catch {
69
+ // skip unreachable project
70
+ }
71
+ }
72
+ if (queue.length === 0) {
73
+ log(chalk.hex("#4ade80")("No open errors. Queue is clean."));
74
+ return { fixed: 0, failed: 0, total: 0 };
75
+ }
76
+ log(chalk.bold(`Fixing ${queue.length} ${queue.length === 1 ? "error" : "errors"}...`));
77
+ log("");
78
+ let fixed = 0;
79
+ let failed = 0;
80
+ for (const item of queue) {
81
+ log(chalk.hex("#a78bfa").bold(`▸ ${item.projectName}`) + chalk.dim(` ${item.errorId}`));
82
+ try {
83
+ const result = await fixError(item.errorId, opts);
84
+ if (result.outcome === "awaiting_review") {
85
+ log(chalk.hex("#4ade80")(` ✓ ${result.reason}`));
86
+ fixed++;
87
+ }
88
+ else {
89
+ log(chalk.hex("#ef4444")(` ✗ ${result.reason}`));
90
+ failed++;
91
+ }
92
+ }
93
+ catch (err) {
94
+ log(chalk.hex("#ef4444")(` ✗ ${err instanceof Error ? err.message : String(err)}`));
95
+ failed++;
96
+ }
97
+ log("");
98
+ }
99
+ return { fixed, failed, total: queue.length };
100
+ }
101
+ const AGENT_SYSTEM_PROMPT = `You are a gg-pixel fix-queue agent. Your single job for this session is to fix the one specific error described in the user message.
102
+
103
+ Required workflow:
104
+ 1. Investigate the error using the location, code context, and stack frames in the user message.
105
+ 2. Make the fix.
106
+ 3. Create the git branch named in the user message (do not push it, do not switch back to main).
107
+ 4. Commit your changes on that branch.
108
+ 5. If the project has quality checks (e.g. \`pnpm check\`, \`pnpm test\`, \`pytest\`, \`cargo check\`), run them and only commit if they pass.
109
+ 6. Stop. Do not merge. Do not open a PR.
110
+
111
+ After your last commit, the runner observes git state to mark the error as "awaiting_review" (success) or "failed".`;
112
+ export function buildAgentPrompt(error, branch) {
113
+ const stack = parseStackJson(error.stack);
114
+ const ctx = parseCodeContext(error.code_context);
115
+ const lines = [];
116
+ lines.push("An error has been identified in this project. Investigate and fix it.");
117
+ lines.push("");
118
+ lines.push(`Error: ${error.type ?? "Error"} — ${error.message ?? "(no message)"}`);
119
+ const topInApp = stack.find((f) => f.in_app) ?? stack[0];
120
+ if (topInApp)
121
+ lines.push(`Location: ${topInApp.file}:${topInApp.line}`);
122
+ if (ctx && ctx.lines.length > 0) {
123
+ lines.push("");
124
+ lines.push("Code at site:");
125
+ const startLine = ctx.error_line - Math.floor((ctx.lines.length - 1) / 2);
126
+ ctx.lines.forEach((line, i) => {
127
+ const lineNum = startLine + i;
128
+ const marker = lineNum === ctx.error_line ? ">" : " ";
129
+ lines.push(` ${marker}${String(lineNum).padStart(4)} | ${line}`);
130
+ });
131
+ }
132
+ if (stack.length > 0) {
133
+ lines.push("");
134
+ lines.push("Stack:");
135
+ for (const f of stack.slice(0, 10)) {
136
+ const lib = f.in_app ? "" : " (lib)";
137
+ lines.push(` ${f.fn || "<anon>"} ${f.file}:${f.line}${lib}`);
138
+ }
139
+ }
140
+ if (error.runtime)
141
+ lines.push(`\nRuntime: ${error.runtime}`);
142
+ lines.push(`Occurrences: ${error.occurrences}`);
143
+ if (error.recurrence_count > 0) {
144
+ lines.push("");
145
+ lines.push(`Recurrence: this is the ${ordinal(error.recurrence_count)} time this fingerprint has appeared after a previous fix was merged. The earlier fix did not hold — investigate why.`);
146
+ }
147
+ lines.push("");
148
+ lines.push("When done:");
149
+ lines.push(` 1. Create branch: ${branch}`);
150
+ lines.push(" 2. Commit the fix on that branch");
151
+ lines.push(" 3. Run the project's quality checks (only commit if they pass)");
152
+ lines.push("");
153
+ lines.push("Do not merge. Do not push. Do not switch back to main.");
154
+ return lines.join("\n");
155
+ }
156
+ async function fetchError(fetchFn, ingestUrl, errorId) {
157
+ const res = await fetchFn(`${ingestUrl}/api/errors/${errorId}`);
158
+ if (!res.ok)
159
+ throw new Error(`GET /api/errors/${errorId} failed: ${res.status}`);
160
+ return (await res.json());
161
+ }
162
+ function lookupProject(home, projectId) {
163
+ const projectsPath = join(home, ".gg", "projects.json");
164
+ if (!existsSync(projectsPath)) {
165
+ throw new Error(`No projects mapping at ${projectsPath} — run \`ggcoder pixel install\` in the project first.`);
166
+ }
167
+ const projects = JSON.parse(readFileSync(projectsPath, "utf8"));
168
+ const project = projects[projectId];
169
+ if (!project) {
170
+ throw new Error(`No local mapping for project ${projectId} in ${projectsPath}. Run \`ggcoder pixel install\` in the project's directory.`);
171
+ }
172
+ return project;
173
+ }
174
+ async function patchError(fetchFn, ingestUrl, errorId, body) {
175
+ const res = await fetchFn(`${ingestUrl}/api/errors/${errorId}`, {
176
+ method: "PATCH",
177
+ headers: { "content-type": "application/json" },
178
+ body: JSON.stringify(body),
179
+ });
180
+ if (!res.ok)
181
+ throw new Error(`PATCH /api/errors/${errorId} failed: ${res.status}`);
182
+ }
183
+ async function runAgent(opts) {
184
+ return new Promise((resolve, reject) => {
185
+ const args = [
186
+ "--json",
187
+ "--max-turns",
188
+ String(opts.maxTurns),
189
+ "--system-prompt",
190
+ opts.systemPrompt,
191
+ opts.prompt,
192
+ ];
193
+ const child = opts.spawnFn(opts.ggcoderBin, args, {
194
+ cwd: opts.cwd,
195
+ stdio: opts.inheritStdio ? "inherit" : ["ignore", "pipe", "pipe"],
196
+ });
197
+ child.on("error", reject);
198
+ child.on("exit", (code) => resolve(code ?? 1));
199
+ });
200
+ }
201
+ async function observeOutcome(cwd, branch, spawnFn) {
202
+ const exists = await runGit(cwd, ["show-ref", "--verify", `refs/heads/${branch}`], spawnFn);
203
+ if (exists.code !== 0)
204
+ return { branchExists: false, hasCommits: false, commitCount: 0 };
205
+ let baseBranch = null;
206
+ for (const candidate of ["main", "master"]) {
207
+ const r = await runGit(cwd, ["show-ref", "--verify", `refs/heads/${candidate}`], spawnFn);
208
+ if (r.code === 0) {
209
+ baseBranch = candidate;
210
+ break;
211
+ }
212
+ }
213
+ if (!baseBranch)
214
+ return { branchExists: true, hasCommits: false, commitCount: 0 };
215
+ const ahead = await runGit(cwd, ["rev-list", "--count", `${baseBranch}..${branch}`], spawnFn);
216
+ const count = ahead.code === 0 ? parseInt(ahead.stdout.trim(), 10) || 0 : 0;
217
+ return { branchExists: true, hasCommits: count > 0, commitCount: count };
218
+ }
219
+ function runGit(cwd, args, spawnFn) {
220
+ return new Promise((resolve) => {
221
+ const child = spawnFn("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
222
+ let stdout = "";
223
+ let stderr = "";
224
+ child.stdout?.on("data", (b) => (stdout += b.toString()));
225
+ child.stderr?.on("data", (b) => (stderr += b.toString()));
226
+ child.on("error", () => resolve({ code: 1, stdout, stderr }));
227
+ child.on("exit", (code) => resolve({ code: code ?? 1, stdout, stderr }));
228
+ });
229
+ }
230
+ function parseStackJson(raw) {
231
+ if (!raw)
232
+ return [];
233
+ try {
234
+ const parsed = JSON.parse(raw);
235
+ if (Array.isArray(parsed))
236
+ return parsed;
237
+ }
238
+ catch {
239
+ // ignore
240
+ }
241
+ return [];
242
+ }
243
+ function parseCodeContext(raw) {
244
+ if (!raw)
245
+ return null;
246
+ try {
247
+ return JSON.parse(raw);
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ }
253
+ function ordinal(n) {
254
+ const s = ["th", "st", "nd", "rd"];
255
+ const v = n % 100;
256
+ return `${n}${s[(v - 20) % 10] ?? s[v] ?? s[0]}`;
257
+ }
258
+ //# sourceMappingURL=pixel-fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-fix.js","sourceRoot":"","sources":["../../src/core/pixel-fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pixel-fix.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-fix.test.d.ts","sourceRoot":"","sources":["../../src/core/pixel-fix.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { EventEmitter } from "node:events";
6
+ import { buildAgentPrompt, fixError, } from "./pixel-fix.js";
7
+ let home;
8
+ beforeEach(() => {
9
+ home = mkdtempSync(join(tmpdir(), "ggcoder-fix-"));
10
+ });
11
+ afterEach(() => rmSync(home, { recursive: true, force: true }));
12
+ function setupProjectMapping(projectId, name, path) {
13
+ mkdirSync(join(home, ".gg"), { recursive: true });
14
+ writeFileSync(join(home, ".gg", "projects.json"), JSON.stringify({ [projectId]: { name, path } }));
15
+ }
16
+ const baseError = {
17
+ id: "err_abc123",
18
+ project_id: "proj_p1",
19
+ fingerprint: "fp",
20
+ status: "open",
21
+ type: "TypeError",
22
+ message: "Cannot read properties of undefined (reading 'name')",
23
+ stack: JSON.stringify([
24
+ { fn: "UserCard", file: "/repo/src/UserCard.tsx", line: 42, col: 23, in_app: true },
25
+ { fn: "lib", file: "/repo/node_modules/react/index.js", line: 1, col: 1, in_app: false },
26
+ ]),
27
+ code_context: JSON.stringify({
28
+ file: "/repo/src/UserCard.tsx",
29
+ error_line: 42,
30
+ lines: [
31
+ "function UserCard({ user }: Props) {",
32
+ " return (",
33
+ " <div>{user.name}</div>",
34
+ " );",
35
+ "}",
36
+ ],
37
+ }),
38
+ runtime: "node-22",
39
+ occurrences: 47,
40
+ recurrence_count: 0,
41
+ branch: null,
42
+ };
43
+ describe("buildAgentPrompt", () => {
44
+ it("includes the error type, message, and in-app location", () => {
45
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
46
+ expect(prompt).toContain("TypeError");
47
+ expect(prompt).toContain("Cannot read properties of undefined");
48
+ expect(prompt).toContain("Location: /repo/src/UserCard.tsx:42");
49
+ });
50
+ it("renders the code window with a marker on the error line", () => {
51
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
52
+ expect(prompt).toContain("> ");
53
+ expect(prompt).toContain("<div>{user.name}</div>");
54
+ });
55
+ it("renders the stack with (lib) for non-in-app frames", () => {
56
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
57
+ expect(prompt).toMatch(/UserCard\s+\/repo\/src\/UserCard\.tsx:42(?!\s*\(lib\))/);
58
+ expect(prompt).toMatch(/\/repo\/node_modules\/react\/index\.js:1\s+\(lib\)/);
59
+ });
60
+ it("includes the branch instruction", () => {
61
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
62
+ expect(prompt).toContain("Create branch: fix/pixel-err_abc123");
63
+ expect(prompt).toContain("Do not merge");
64
+ });
65
+ it("flags recurrence when recurrence_count > 0", () => {
66
+ const prompt = buildAgentPrompt({ ...baseError, recurrence_count: 2 }, "fix/pixel-x");
67
+ expect(prompt).toContain("2nd time");
68
+ expect(prompt).toContain("earlier fix did not hold");
69
+ });
70
+ });
71
+ function makeFakeChild(exitCode, stdout = "", stderr = "") {
72
+ const child = new EventEmitter();
73
+ child.stdout = new EventEmitter();
74
+ child.stderr = new EventEmitter();
75
+ setImmediate(() => {
76
+ if (stdout)
77
+ child.stdout.emit("data", Buffer.from(stdout));
78
+ if (stderr)
79
+ child.stderr.emit("data", Buffer.from(stderr));
80
+ child.emit("exit", exitCode);
81
+ });
82
+ return child;
83
+ }
84
+ function buildSpawnFn(handlers) {
85
+ const calls = [];
86
+ let i = 0;
87
+ const fn = (command, args, options) => {
88
+ const call = { command, args, options };
89
+ calls.push(call);
90
+ const handler = handlers[Math.min(i, handlers.length - 1)];
91
+ i++;
92
+ if (!handler)
93
+ throw new Error(`unexpected spawn call: ${command} ${args.join(" ")}`);
94
+ return handler(call);
95
+ };
96
+ return { fn, calls };
97
+ }
98
+ function fakeFetchScript(handlers) {
99
+ const calls = [];
100
+ let i = 0;
101
+ const fn = (async (input, init) => {
102
+ const url = String(input);
103
+ const method = (init?.method ?? "GET").toUpperCase();
104
+ calls.push({ method, url });
105
+ const handler = handlers[Math.min(i, handlers.length - 1)];
106
+ i++;
107
+ if (!handler)
108
+ throw new Error(`unexpected fetch: ${method} ${url}`);
109
+ return handler({ method, url });
110
+ });
111
+ return { fn, calls };
112
+ }
113
+ describe("fixError — orchestration", () => {
114
+ it("marks awaiting_review when the agent succeeds, branch exists, and has commits", async () => {
115
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
116
+ const { fn: fetchFn, calls: fetchCalls } = fakeFetchScript([
117
+ // GET /api/errors/err_abc123
118
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
119
+ // PATCH in_progress
120
+ () => new Response(JSON.stringify({ ...baseError, status: "in_progress" }), { status: 200 }),
121
+ // PATCH awaiting_review
122
+ () => new Response(JSON.stringify({ ...baseError, status: "awaiting_review" }), { status: 200 }),
123
+ ]);
124
+ const { fn: spawnFn, calls: spawnCalls } = buildSpawnFn([
125
+ // ggcoder agent run
126
+ () => makeFakeChild(0),
127
+ // git show-ref --verify refs/heads/fix/pixel-err_abc123
128
+ () => makeFakeChild(0),
129
+ // git show-ref --verify refs/heads/main
130
+ () => makeFakeChild(0),
131
+ // git rev-list --count main..fix/pixel-err_abc123
132
+ () => makeFakeChild(0, "3\n"),
133
+ ]);
134
+ const result = await fixError("err_abc123", {
135
+ homeDir: home,
136
+ fetchFn,
137
+ spawnFn,
138
+ inheritStdio: false,
139
+ });
140
+ expect(result.outcome).toBe("awaiting_review");
141
+ expect(result.branch).toBe("fix/pixel-err_abc123");
142
+ expect(result.reason).toContain("3 commit");
143
+ // First call to ggcoder uses the right cwd and args
144
+ const ggCall = spawnCalls[0];
145
+ expect(ggCall?.command).toBe("ggcoder");
146
+ expect(ggCall?.args).toContain("--json");
147
+ expect(ggCall?.args).toContain("--system-prompt");
148
+ expect(ggCall?.options.cwd).toBe("/tmp/demo-app");
149
+ // Status PATCH sequence: in_progress, then awaiting_review
150
+ const patchBodies = fetchCalls.filter((c) => c.method === "PATCH").map((c) => c.url);
151
+ expect(patchBodies).toEqual([
152
+ "https://gg-pixel-server.buzzbeamaustralia.workers.dev/api/errors/err_abc123",
153
+ "https://gg-pixel-server.buzzbeamaustralia.workers.dev/api/errors/err_abc123",
154
+ ]);
155
+ });
156
+ it("marks failed when the agent exits non-zero", async () => {
157
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
158
+ const { fn: fetchFn } = fakeFetchScript([
159
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
160
+ () => new Response("{}", { status: 200 }), // PATCH in_progress
161
+ () => new Response("{}", { status: 200 }), // PATCH failed
162
+ ]);
163
+ const { fn: spawnFn } = buildSpawnFn([() => makeFakeChild(1)]);
164
+ const result = await fixError("err_abc123", {
165
+ homeDir: home,
166
+ fetchFn,
167
+ spawnFn,
168
+ inheritStdio: false,
169
+ });
170
+ expect(result.outcome).toBe("failed");
171
+ expect(result.reason).toContain("exited with code 1");
172
+ });
173
+ it("marks failed when the branch was not created", async () => {
174
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
175
+ const { fn: fetchFn } = fakeFetchScript([
176
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
177
+ () => new Response("{}", { status: 200 }),
178
+ () => new Response("{}", { status: 200 }),
179
+ ]);
180
+ const { fn: spawnFn } = buildSpawnFn([
181
+ () => makeFakeChild(0), // ggcoder ok
182
+ () => makeFakeChild(1), // git show-ref FAIL
183
+ ]);
184
+ const result = await fixError("err_abc123", {
185
+ homeDir: home,
186
+ fetchFn,
187
+ spawnFn,
188
+ inheritStdio: false,
189
+ });
190
+ expect(result.outcome).toBe("failed");
191
+ expect(result.reason).toContain("not created");
192
+ });
193
+ it("marks failed when the branch exists but has no commits ahead of main", async () => {
194
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
195
+ const { fn: fetchFn } = fakeFetchScript([
196
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
197
+ () => new Response("{}", { status: 200 }),
198
+ () => new Response("{}", { status: 200 }),
199
+ ]);
200
+ const { fn: spawnFn } = buildSpawnFn([
201
+ () => makeFakeChild(0), // ggcoder
202
+ () => makeFakeChild(0), // branch exists
203
+ () => makeFakeChild(0), // main exists
204
+ () => makeFakeChild(0, "0\n"), // 0 commits ahead
205
+ ]);
206
+ const result = await fixError("err_abc123", {
207
+ homeDir: home,
208
+ fetchFn,
209
+ spawnFn,
210
+ inheritStdio: false,
211
+ });
212
+ expect(result.outcome).toBe("failed");
213
+ expect(result.reason).toContain("no new commits");
214
+ });
215
+ it("falls back to master when main does not exist", async () => {
216
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
217
+ const { fn: fetchFn } = fakeFetchScript([
218
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
219
+ () => new Response("{}", { status: 200 }),
220
+ () => new Response("{}", { status: 200 }),
221
+ ]);
222
+ const { fn: spawnFn, calls: spawnCalls } = buildSpawnFn([
223
+ () => makeFakeChild(0), // ggcoder
224
+ () => makeFakeChild(0), // branch exists
225
+ () => makeFakeChild(1), // main missing
226
+ () => makeFakeChild(0), // master exists
227
+ () => makeFakeChild(0, "2\n"), // 2 commits ahead of master
228
+ ]);
229
+ const result = await fixError("err_abc123", {
230
+ homeDir: home,
231
+ fetchFn,
232
+ spawnFn,
233
+ inheritStdio: false,
234
+ });
235
+ expect(result.outcome).toBe("awaiting_review");
236
+ const masterCall = spawnCalls.find((c) => c.args.includes("master..fix/pixel-err_abc123"));
237
+ expect(masterCall).toBeTruthy();
238
+ });
239
+ it("throws when no projects.json mapping exists for the project_id", async () => {
240
+ // No setupProjectMapping call — projects.json doesn't exist
241
+ const { fn: fetchFn } = fakeFetchScript([
242
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
243
+ ]);
244
+ const { fn: spawnFn } = buildSpawnFn([]);
245
+ await expect(fixError("err_abc123", {
246
+ homeDir: home,
247
+ fetchFn,
248
+ spawnFn,
249
+ inheritStdio: false,
250
+ })).rejects.toThrow(/No projects mapping/);
251
+ });
252
+ it("throws when the project_id has no entry in projects.json", async () => {
253
+ setupProjectMapping("proj_OTHER", "x", "/x");
254
+ const { fn: fetchFn } = fakeFetchScript([
255
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
256
+ ]);
257
+ const { fn: spawnFn } = buildSpawnFn([]);
258
+ await expect(fixError("err_abc123", {
259
+ homeDir: home,
260
+ fetchFn,
261
+ spawnFn,
262
+ inheritStdio: false,
263
+ })).rejects.toThrow(/No local mapping for project proj_p1/);
264
+ });
265
+ });
266
+ describe("fixError — wiring", () => {
267
+ it("marks the error in_progress before spawning the agent", async () => {
268
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
269
+ const observed = [];
270
+ const { fn: fetchFn } = fakeFetchScript([
271
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
272
+ () => {
273
+ observed.push("PATCH-1");
274
+ return new Response("{}", { status: 200 });
275
+ },
276
+ () => {
277
+ observed.push("PATCH-2");
278
+ return new Response("{}", { status: 200 });
279
+ },
280
+ ]);
281
+ const { fn: spawnFn } = buildSpawnFn([
282
+ () => {
283
+ observed.push("SPAWN");
284
+ return makeFakeChild(0);
285
+ },
286
+ () => makeFakeChild(0),
287
+ () => makeFakeChild(0),
288
+ () => makeFakeChild(0, "1\n"),
289
+ ]);
290
+ await fixError("err_abc123", { homeDir: home, fetchFn, spawnFn, inheritStdio: false });
291
+ expect(observed).toEqual(["PATCH-1", "SPAWN", "PATCH-2"]);
292
+ });
293
+ });
294
+ // Silence vitest unused import warning
295
+ void vi;
296
+ //# sourceMappingURL=pixel-fix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-fix.test.js","sourceRoot":"","sources":["../../src/core/pixel-fix.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ interface ListOptions {
2
+ ingestUrl?: string;
3
+ homeDir?: string;
4
+ fetchFn?: typeof fetch;
5
+ }
6
+ export declare function listAllErrors(opts?: ListOptions): Promise<void>;
7
+ interface InstallCliOptions {
8
+ ingestUrl?: string;
9
+ name?: string;
10
+ skipPackageInstall: boolean;
11
+ }
12
+ export declare function runPixelInstall(opts: InstallCliOptions): Promise<void>;
13
+ export {};
14
+ //# sourceMappingURL=pixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel.d.ts","sourceRoot":"","sources":["../../src/core/pixel.ts"],"names":[],"mappings":"AAwBA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzE;AA4FD,UAAU,iBAAiB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5E"}