@prestyj/cli 4.3.59 → 4.3.83

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.
Files changed (58) hide show
  1. package/dist/cli.js +153 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/pixel-fix-agent.d.ts +24 -0
  4. package/dist/core/pixel-fix-agent.d.ts.map +1 -0
  5. package/dist/core/pixel-fix-agent.js +49 -0
  6. package/dist/core/pixel-fix-agent.js.map +1 -0
  7. package/dist/core/pixel-fix.d.ts +70 -0
  8. package/dist/core/pixel-fix.d.ts.map +1 -0
  9. package/dist/core/pixel-fix.js +302 -0
  10. package/dist/core/pixel-fix.js.map +1 -0
  11. package/dist/core/pixel-fix.test.d.ts +2 -0
  12. package/dist/core/pixel-fix.test.d.ts.map +1 -0
  13. package/dist/core/pixel-fix.test.js +296 -0
  14. package/dist/core/pixel-fix.test.js.map +1 -0
  15. package/dist/core/pixel.d.ts +34 -0
  16. package/dist/core/pixel.d.ts.map +1 -0
  17. package/dist/core/pixel.js +308 -0
  18. package/dist/core/pixel.js.map +1 -0
  19. package/dist/core/pixel.test.d.ts +2 -0
  20. package/dist/core/pixel.test.d.ts.map +1 -0
  21. package/dist/core/pixel.test.js +214 -0
  22. package/dist/core/pixel.test.js.map +1 -0
  23. package/dist/core/source-maps.d.ts +47 -0
  24. package/dist/core/source-maps.d.ts.map +1 -0
  25. package/dist/core/source-maps.js +132 -0
  26. package/dist/core/source-maps.js.map +1 -0
  27. package/dist/core/source-maps.test.d.ts +2 -0
  28. package/dist/core/source-maps.test.d.ts.map +1 -0
  29. package/dist/core/source-maps.test.js +175 -0
  30. package/dist/core/source-maps.test.js.map +1 -0
  31. package/dist/ui/App.d.ts +2 -0
  32. package/dist/ui/App.d.ts.map +1 -1
  33. package/dist/ui/App.js +139 -7
  34. package/dist/ui/App.js.map +1 -1
  35. package/dist/ui/components/InputArea.d.ts +2 -1
  36. package/dist/ui/components/InputArea.d.ts.map +1 -1
  37. package/dist/ui/components/InputArea.js +6 -1
  38. package/dist/ui/components/InputArea.js.map +1 -1
  39. package/dist/ui/components/PixelOverlay.d.ts +11 -0
  40. package/dist/ui/components/PixelOverlay.d.ts.map +1 -0
  41. package/dist/ui/components/PixelOverlay.js +116 -0
  42. package/dist/ui/components/PixelOverlay.js.map +1 -0
  43. package/dist/ui/pixel.d.ts +22 -0
  44. package/dist/ui/pixel.d.ts.map +1 -0
  45. package/dist/ui/pixel.js +394 -0
  46. package/dist/ui/pixel.js.map +1 -0
  47. package/dist/ui/pixel.test.d.ts +2 -0
  48. package/dist/ui/pixel.test.d.ts.map +1 -0
  49. package/dist/ui/pixel.test.js +130 -0
  50. package/dist/ui/pixel.test.js.map +1 -0
  51. package/dist/ui/render.d.ts +2 -0
  52. package/dist/ui/render.d.ts.map +1 -1
  53. package/dist/ui/render.js +2 -0
  54. package/dist/ui/render.js.map +1 -1
  55. package/dist/utils/image.d.ts.map +1 -1
  56. package/dist/utils/image.js +15 -0
  57. package/dist/utils/image.js.map +1 -1
  58. package/package.json +38 -4
@@ -0,0 +1,132 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { dirname, join, posix } from "node:path";
3
+ import { TraceMap, originalPositionFor } from "@jridgewell/trace-mapping";
4
+ const COMMON_BUILD_DIRS = ["dist", "build", ".next", "out", "public", ".vite"];
5
+ const MAX_DEPTH = 4;
6
+ export class SourceMapResolver {
7
+ projectDir;
8
+ cache = new Map();
9
+ constructor(projectDir) {
10
+ this.projectDir = projectDir;
11
+ }
12
+ /**
13
+ * Resolve a minified stack into the original source. Frames that can't
14
+ * be resolved are returned unchanged so the caller still sees something.
15
+ */
16
+ resolveStack(stack) {
17
+ return stack.map((f) => this.resolveFrame(f));
18
+ }
19
+ resolveFrame(frame) {
20
+ const minifiedName = filenameFromUrl(frame.file);
21
+ if (!minifiedName)
22
+ return frame;
23
+ const entry = this.findMap(minifiedName);
24
+ if (!entry)
25
+ return frame;
26
+ let resolved;
27
+ try {
28
+ resolved = originalPositionFor(entry.trace, { line: frame.line, column: frame.col });
29
+ }
30
+ catch {
31
+ return frame;
32
+ }
33
+ if (!resolved.source)
34
+ return frame;
35
+ const sourceAbs = posix.normalize(posix.join(entry.mapDir, resolved.source));
36
+ return {
37
+ file: sourceAbs,
38
+ line: resolved.line ?? frame.line,
39
+ col: resolved.column ?? frame.col,
40
+ fn: resolved.name || frame.fn,
41
+ in_app: !sourceAbs.includes("/node_modules/") && !sourceAbs.startsWith("webpack:///"),
42
+ };
43
+ }
44
+ findMap(minifiedName) {
45
+ const cached = this.cache.get(minifiedName);
46
+ if (cached !== undefined)
47
+ return cached;
48
+ const result = this.searchForMap(minifiedName);
49
+ this.cache.set(minifiedName, result);
50
+ return result;
51
+ }
52
+ searchForMap(minifiedName) {
53
+ for (const dir of COMMON_BUILD_DIRS) {
54
+ const root = join(this.projectDir, dir);
55
+ if (!existsSync(root))
56
+ continue;
57
+ const found = walkForMap(root, minifiedName, MAX_DEPTH);
58
+ if (found)
59
+ return loadMap(found);
60
+ }
61
+ const rootCandidate = join(this.projectDir, minifiedName + ".map");
62
+ if (existsSync(rootCandidate))
63
+ return loadMap(rootCandidate);
64
+ return null;
65
+ }
66
+ }
67
+ function filenameFromUrl(file) {
68
+ if (!file)
69
+ return null;
70
+ const cleaned = file.split("?")[0].split("#")[0];
71
+ const last = cleaned.split("/").pop();
72
+ return last || null;
73
+ }
74
+ function walkForMap(root, minifiedName, depth) {
75
+ const target = minifiedName + ".map";
76
+ const direct = join(root, target);
77
+ if (existsSync(direct))
78
+ return direct;
79
+ if (depth <= 0)
80
+ return null;
81
+ let entries;
82
+ try {
83
+ entries = readdirSync(root);
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ for (const entry of entries) {
89
+ if (entry.startsWith("."))
90
+ continue;
91
+ const child = join(root, entry);
92
+ if (!isDirectorySafe(child))
93
+ continue;
94
+ const found = walkForMap(child, minifiedName, depth - 1);
95
+ if (found)
96
+ return found;
97
+ }
98
+ return null;
99
+ }
100
+ function isDirectorySafe(path) {
101
+ try {
102
+ return statSync(path).isDirectory();
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ function loadMap(mapPath) {
109
+ try {
110
+ const raw = readFileSync(mapPath, "utf8");
111
+ const parsed = JSON.parse(raw);
112
+ return { trace: new TraceMap(parsed), mapDir: dirname(mapPath) };
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ /**
119
+ * Best-effort wrapper that swallows all errors. The runner calls this on
120
+ * every error fetch — if anything goes wrong, we don't want to break the
121
+ * whole TUI.
122
+ */
123
+ export function tryResolveStack(stack, projectDir) {
124
+ try {
125
+ const resolver = new SourceMapResolver(projectDir);
126
+ return resolver.resolveStack(stack);
127
+ }
128
+ catch {
129
+ return stack;
130
+ }
131
+ }
132
+ //# sourceMappingURL=source-maps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.js","sourceRoot":"","sources":["../../src/core/source-maps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=source-maps.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.test.d.ts","sourceRoot":"","sources":["../../src/core/source-maps.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,175 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { SourceMapResolver, tryResolveStack } from "./source-maps.js";
6
+ let dir;
7
+ beforeEach(() => {
8
+ dir = mkdtempSync(join(tmpdir(), "ez-pixel-srcmap-"));
9
+ });
10
+ afterEach(() => rmSync(dir, { recursive: true, force: true }));
11
+ /**
12
+ * Build a synthetic source map for a tiny minified file. We don't go
13
+ * through a real bundler — we hand-craft the map so the test is fast
14
+ * and deterministic. The format follows the v3 source-map spec:
15
+ * https://sourcemaps.info/spec.html
16
+ *
17
+ * Source: src/foo.ts at line 5, col 10, function name "thrower"
18
+ * Maps to minified: line 1, col 100
19
+ *
20
+ * VLQ encoding: AAAA = 0,0,0,0 ; gGAGW = 0,4,0,5,11 (we don't need to
21
+ * decode by hand — we just emit a known-good mapping using a single
22
+ * segment that the trace-mapping lib understands).
23
+ *
24
+ * The `mappings` field below is hand-encoded for ONE segment:
25
+ * minified col 100 → source 0, line 5, col 10, name 0
26
+ * In VLQ this is "oGAKAA":
27
+ * o = 7 bits = relative col delta of 100 (encoded by us via the lib)
28
+ * Rather than encode by hand we use a real generator.
29
+ */
30
+ function makeFixture() {
31
+ // Use a real source-map generator approach: we ship a tiny generated map.
32
+ // For a synthetic test, we use a manually-written but spec-valid map by
33
+ // letting trace-mapping decode our segments. Easier: encode VLQ at runtime
34
+ // via a minimal helper.
35
+ // VLQ encode helpers (one segment of 5 ints):
36
+ const VLQ_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
37
+ const encode = (n) => {
38
+ let value = n < 0 ? (-n << 1) | 1 : n << 1;
39
+ let out = "";
40
+ do {
41
+ let digit = value & 31;
42
+ value >>>= 5;
43
+ if (value > 0)
44
+ digit |= 32;
45
+ out += VLQ_CHARS[digit];
46
+ } while (value > 0);
47
+ return out;
48
+ };
49
+ const seg = (genCol, srcIdx, line, col, nameIdx) => encode(genCol) + encode(srcIdx) + encode(line) + encode(col) + encode(nameIdx);
50
+ // Single segment: minified col 100 → src[0], line 4 (0-indexed), col 10, name[0]
51
+ // Source maps use 0-indexed lines internally; trace-mapping returns 1-indexed.
52
+ const mappings = seg(100, 0, 4, 10, 0);
53
+ return {
54
+ version: 3,
55
+ file: "main.min.js",
56
+ sources: ["src/foo.ts"],
57
+ names: ["thrower"],
58
+ mappings,
59
+ };
60
+ }
61
+ describe("SourceMapResolver", () => {
62
+ it("resolves a minified frame to its original source", () => {
63
+ mkdirSync(join(dir, "dist"));
64
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
65
+ const resolver = new SourceMapResolver(dir);
66
+ const resolved = resolver.resolveFrame({
67
+ file: "https://app.com/dist/main.min.js",
68
+ line: 1,
69
+ col: 100,
70
+ fn: "<anon>",
71
+ in_app: true,
72
+ });
73
+ // The fixture maps (line=1, col=100) → src/foo.ts line 5, col 10, name "thrower"
74
+ expect(resolved.fn).toBe("thrower");
75
+ expect(resolved.line).toBe(5);
76
+ expect(resolved.col).toBe(10);
77
+ expect(resolved.file.endsWith("src/foo.ts")).toBe(true);
78
+ });
79
+ it("returns the frame unchanged when no map is found", () => {
80
+ const resolver = new SourceMapResolver(dir);
81
+ const original = {
82
+ file: "https://app.com/main.min.js",
83
+ line: 1,
84
+ col: 100,
85
+ fn: "x",
86
+ in_app: true,
87
+ };
88
+ expect(resolver.resolveFrame(original)).toEqual(original);
89
+ });
90
+ it("walks nested build directories to find maps", () => {
91
+ mkdirSync(join(dir, "build", "static", "js"), { recursive: true });
92
+ writeFileSync(join(dir, "build", "static", "js", "main.min.js.map"), JSON.stringify(makeFixture()));
93
+ const resolver = new SourceMapResolver(dir);
94
+ const resolved = resolver.resolveFrame({
95
+ file: "https://app.com/static/js/main.min.js",
96
+ line: 1,
97
+ col: 100,
98
+ fn: "<anon>",
99
+ in_app: true,
100
+ });
101
+ expect(resolved.line).toBe(5);
102
+ });
103
+ it("strips query strings from the URL when matching .map filename", () => {
104
+ mkdirSync(join(dir, "dist"));
105
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
106
+ const resolver = new SourceMapResolver(dir);
107
+ const resolved = resolver.resolveFrame({
108
+ file: "https://app.com/dist/main.min.js?v=cachebuster",
109
+ line: 1,
110
+ col: 100,
111
+ fn: "<anon>",
112
+ in_app: true,
113
+ });
114
+ expect(resolved.line).toBe(5);
115
+ });
116
+ it("falls back gracefully if the map file is corrupt JSON", () => {
117
+ mkdirSync(join(dir, "dist"));
118
+ writeFileSync(join(dir, "dist", "main.min.js.map"), "{ not valid json");
119
+ const resolver = new SourceMapResolver(dir);
120
+ const original = {
121
+ file: "https://app.com/dist/main.min.js",
122
+ line: 1,
123
+ col: 100,
124
+ fn: "x",
125
+ in_app: true,
126
+ };
127
+ expect(resolver.resolveFrame(original)).toEqual(original);
128
+ });
129
+ it("caches map lookups so repeated frames are cheap", () => {
130
+ mkdirSync(join(dir, "dist"));
131
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
132
+ const resolver = new SourceMapResolver(dir);
133
+ const frame = {
134
+ file: "https://app.com/dist/main.min.js",
135
+ line: 1,
136
+ col: 100,
137
+ fn: "<anon>",
138
+ in_app: true,
139
+ };
140
+ const a = resolver.resolveFrame(frame);
141
+ const b = resolver.resolveFrame(frame);
142
+ expect(a).toEqual(b);
143
+ });
144
+ });
145
+ describe("tryResolveStack", () => {
146
+ it("resolves a multi-frame stack and preserves frame order", () => {
147
+ mkdirSync(join(dir, "dist"));
148
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
149
+ const stack = [
150
+ {
151
+ file: "https://app.com/dist/main.min.js",
152
+ line: 1,
153
+ col: 100,
154
+ fn: "<anon>",
155
+ in_app: true,
156
+ },
157
+ {
158
+ file: "https://app.com/dist/main.min.js",
159
+ line: 1,
160
+ col: 100,
161
+ fn: "<anon>",
162
+ in_app: true,
163
+ },
164
+ ];
165
+ const resolved = tryResolveStack(stack, dir);
166
+ expect(resolved).toHaveLength(2);
167
+ expect(resolved[0]?.line).toBe(5);
168
+ expect(resolved[1]?.line).toBe(5);
169
+ });
170
+ it("never throws — returns input unchanged on any failure", () => {
171
+ const result = tryResolveStack([{ file: "x", line: 1, col: 1, fn: "f", in_app: true }], "/nonexistent/path");
172
+ expect(result).toEqual([{ file: "x", line: 1, col: 1, fn: "f", in_app: true }]);
173
+ });
174
+ });
175
+ //# sourceMappingURL=source-maps.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.test.js","sourceRoot":"","sources":["../../src/core/source-maps.test.ts"],"names":[],"mappings":"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"}
package/dist/ui/App.d.ts CHANGED
@@ -175,6 +175,8 @@ export interface AppProps {
175
175
  current: (planPath: string) => Promise<string>;
176
176
  };
177
177
  skills?: Skill[];
178
+ initialOverlay?: "pixel";
179
+ rebuildToolsForCwd?: (cwd: string) => AgentTool[];
178
180
  }
179
181
  export declare function App(props: AppProps): import("react/jsx-runtime").JSX.Element;
180
182
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AAE/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAiBjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAyBjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAQ/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAwD3D,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAKD,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,aAAa,GACb,YAAY,GACZ,mBAAmB,GACnB,kBAAkB,GAClB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,aAAa,GACb,YAAY,GACZ,UAAU,GACV,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,aAAa,CAAC;AA6LlB,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAC5B,MAAM,EACN;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAC9D,CAAC;IACF,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACxD,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACnE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAID,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,2CA4lElC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
package/dist/ui/App.js CHANGED
@@ -28,6 +28,7 @@ import { Banner } from "./components/Banner.js";
28
28
  import { PlanOverlay } from "./components/PlanOverlay.js";
29
29
  import { ModelSelector } from "./components/ModelSelector.js";
30
30
  import { TaskOverlay } from "./components/TaskOverlay.js";
31
+ import { PixelOverlay } from "./components/PixelOverlay.js";
31
32
  import { SkillsOverlay } from "./components/SkillsOverlay.js";
32
33
  import { EyesOverlay } from "./components/EyesOverlay.js";
33
34
  import { ThemeSelector } from "./components/ThemeSelector.js";
@@ -303,14 +304,18 @@ export function App(props) {
303
304
  });
304
305
  // Items from the current/last turn — rendered in the live area so they stay visible
305
306
  const [liveItems, setLiveItems] = useState([]);
306
- const [overlay, setOverlay] = useState(null);
307
+ const [overlay, setOverlay] = useState(props.initialOverlay ?? null);
307
308
  const [taskCount, setTaskCount] = useState(() => getTaskCount(props.cwd));
308
309
  const [eyesCount, setEyesCount] = useState(() => isEyesActive(props.cwd) ? journalCount({ status: "open" }, props.cwd) : undefined);
309
310
  const [updatePending, setUpdatePending] = useState(() => getPendingUpdate(props.version) !== null);
310
311
  const [runAllTasks, setRunAllTasks] = useState(false);
311
312
  const runAllTasksRef = useRef(false);
312
313
  const startTaskRef = useRef(() => { });
314
+ const runAllPixelRef = useRef(false);
315
+ const currentPixelFixRef = useRef(null);
316
+ const startPixelFixRef = useRef(() => { });
313
317
  const cwdRef = useRef(props.cwd);
318
+ const [displayedCwd, setDisplayedCwd] = useState(props.cwd);
314
319
  const [staticKey, setStaticKey] = useState(0);
315
320
  const [doneStatus, setDoneStatus] = useState(null);
316
321
  // Suppress "done" status when a plan overlay is about to open
@@ -352,10 +357,11 @@ export function App(props) {
352
357
  const activeApiKey = currentCreds?.accessToken ?? props.apiKey;
353
358
  const activeAccountId = currentCreds?.accountId ?? props.accountId;
354
359
  const activeBaseUrl = currentCreds?.baseUrl ?? props.baseUrl;
355
- // Load git branch
360
+ // Load git branch — re-runs whenever the displayed cwd changes (e.g. when
361
+ // a pixel fix moves the agent into a different project root).
356
362
  useEffect(() => {
357
- getGitBranch(props.cwd).then(setGitBranch);
358
- }, [props.cwd]);
363
+ getGitBranch(displayedCwd).then(setGitBranch);
364
+ }, [displayedCwd]);
359
365
  // Periodic update check during long sessions
360
366
  useEffect(() => {
361
367
  startPeriodicUpdateCheck(props.version, (msg) => {
@@ -1053,10 +1059,47 @@ export function App(props) {
1053
1059
  }
1054
1060
  }, 500);
1055
1061
  }
1062
+ // Pixel fix: observe branch + commits, patch status, optionally pick
1063
+ // up the next open error if run-all is active.
1064
+ const pendingFix = currentPixelFixRef.current;
1065
+ if (pendingFix) {
1066
+ currentPixelFixRef.current = null;
1067
+ void (async () => {
1068
+ try {
1069
+ const { finalizePixelFix } = await import("../core/pixel-fix.js");
1070
+ const result = await finalizePixelFix(pendingFix);
1071
+ log("INFO", "pixel", `Pixel fix done: ${result.outcome}`, {
1072
+ errorId: pendingFix.errorId,
1073
+ reason: result.reason,
1074
+ });
1075
+ }
1076
+ catch (err) {
1077
+ log("ERROR", "pixel", `Pixel finalize failed: ${err.message}`);
1078
+ }
1079
+ if (runAllPixelRef.current) {
1080
+ setTimeout(() => {
1081
+ void (async () => {
1082
+ const { fetchPixelEntries } = await import("../core/pixel.js");
1083
+ const data = await fetchPixelEntries();
1084
+ const next = data.entries.find((e) => e.status === "open");
1085
+ if (next) {
1086
+ startPixelFixRef.current(next.errorId);
1087
+ }
1088
+ else {
1089
+ setRunAllPixel(false);
1090
+ log("INFO", "pixel", "Run-all complete — no more open errors");
1091
+ }
1092
+ })();
1093
+ }, 500);
1094
+ }
1095
+ })();
1096
+ }
1056
1097
  }, []),
1057
1098
  onAborted: useCallback(() => {
1058
1099
  log("WARN", "agent", "Agent run aborted by user");
1059
1100
  setRunAllTasks(false);
1101
+ setRunAllPixel(false);
1102
+ currentPixelFixRef.current = null;
1060
1103
  setDoneStatus(null);
1061
1104
  setLiveItems((prev) => {
1062
1105
  const next = prev.map((item) => {
@@ -1640,7 +1683,7 @@ export function App(props) {
1640
1683
  case "tombstone":
1641
1684
  return null;
1642
1685
  case "banner":
1643
- return (_jsx(Banner, { version: props.version, model: currentModel, provider: currentProvider, cwd: props.cwd, taskCount: taskCount }, item.id));
1686
+ return (_jsx(Banner, { version: props.version, model: currentModel, provider: currentProvider, cwd: displayedCwd, taskCount: taskCount }, item.id));
1644
1687
  case "user":
1645
1688
  return (_jsx(UserMessage, { text: item.text, imageCount: item.imageCount, pasteInfo: item.pasteInfo }, item.id));
1646
1689
  case "task":
@@ -1732,11 +1775,83 @@ export function App(props) {
1732
1775
  useEffect(() => {
1733
1776
  runAllTasksRef.current = runAllTasks;
1734
1777
  }, [runAllTasks]);
1778
+ const startPixelFix = useCallback((errorId) => {
1779
+ void (async () => {
1780
+ try {
1781
+ const { preparePixelFix } = await import("../core/pixel-fix.js");
1782
+ const prep = await preparePixelFix(errorId);
1783
+ currentPixelFixRef.current = prep;
1784
+ // Move the agent into the error's project root. Four things must
1785
+ // change in lockstep, otherwise the agent (or the chrome around
1786
+ // it) shows the wrong project:
1787
+ // 1. process.cwd — for any code reading it directly
1788
+ // 2. cwd-bound tools (read/write/bash/grep/…) — baked at creation
1789
+ // 3. the system prompt's "Working directory: …" line — the only
1790
+ // place the model itself learns where it is
1791
+ // 4. displayedCwd state — Banner + Footer read this for display
1792
+ try {
1793
+ process.chdir(prep.projectPath);
1794
+ }
1795
+ catch (err) {
1796
+ log("WARN", "pixel", `chdir failed: ${err.message}`);
1797
+ }
1798
+ cwdRef.current = prep.projectPath;
1799
+ setDisplayedCwd(prep.projectPath);
1800
+ if (props.rebuildToolsForCwd) {
1801
+ setCurrentTools(props.rebuildToolsForCwd(prep.projectPath));
1802
+ }
1803
+ const newSystemPrompt = await buildSystemPrompt(prep.projectPath, props.skills, false, undefined);
1804
+ // Now that the cwd swap is committed, reset chat. Doing this BEFORE
1805
+ // the chdir would print a banner with the old cwd, then bumping
1806
+ // staticKey would print a second banner with the new cwd — leaving
1807
+ // two banners stacked in the scrollback.
1808
+ stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1809
+ setHistory([{ kind: "banner", id: "banner" }]);
1810
+ setLiveItems([]);
1811
+ setStaticKey((k) => k + 1);
1812
+ messagesRef.current = messagesRef.current.slice(0, 1);
1813
+ agentLoop.reset();
1814
+ persistedIndexRef.current = messagesRef.current.length;
1815
+ const sm = sessionManagerRef.current;
1816
+ if (sm) {
1817
+ void sm.create(prep.projectPath, currentProvider, currentModel).then((s) => {
1818
+ sessionPathRef.current = s.path;
1819
+ log("INFO", "pixel", "New session for pixel fix", { path: s.path });
1820
+ });
1821
+ }
1822
+ if (messagesRef.current[0]?.role === "system") {
1823
+ messagesRef.current[0] = { role: "system", content: newSystemPrompt };
1824
+ }
1825
+ else {
1826
+ messagesRef.current.unshift({ role: "system", content: newSystemPrompt });
1827
+ }
1828
+ const title = `Fix ${errorId.slice(0, 12)}… in ${prep.projectName}`;
1829
+ const taskItem = { kind: "task", title, id: getId() };
1830
+ setLastUserMessage(title);
1831
+ setDoneStatus(null);
1832
+ setLiveItems([taskItem]);
1833
+ await agentLoop.run(prep.prompt);
1834
+ }
1835
+ catch (err) {
1836
+ const msg = err instanceof Error ? err.message : String(err);
1837
+ log("ERROR", "pixel", msg);
1838
+ currentPixelFixRef.current = null;
1839
+ setRunAllPixel(false);
1840
+ setLiveItems((prev) => [...prev, { kind: "error", message: msg, id: getId() }]);
1841
+ }
1842
+ })();
1843
+ }, [props.cwd, stdout, agentLoop, currentProvider, currentModel]);
1844
+ startPixelFixRef.current = startPixelFix;
1845
+ const [runAllPixel, setRunAllPixel] = useState(false);
1846
+ useEffect(() => {
1847
+ runAllPixelRef.current = runAllPixel;
1848
+ }, [runAllPixel]);
1735
1849
  const isTaskView = overlay === "tasks";
1736
1850
  const isSkillsView = overlay === "skills";
1737
1851
  const isPlanView = overlay === "plan";
1738
1852
  const isEyesView = overlay === "eyes";
1739
- const isOverlayView = isTaskView || isSkillsView || isPlanView || isEyesView;
1853
+ const isPixelView = overlay === "pixel";
1854
+ const isOverlayView = isTaskView || isSkillsView || isPlanView || isEyesView || isPixelView;
1740
1855
  return (_jsxs(Box, { flexDirection: "column", width: columns, children: [_jsx(Static, { items: isOverlayView ? [] : history, style: { width: "100%" }, children: (item) => (_jsx(Box, { flexDirection: "column", paddingRight: 1, children: renderItem(item) }, item.id)) }, `${resizeKey}-${staticKey}`), isTaskView ? (_jsx(TaskOverlay, { cwd: props.cwd, agentRunning: agentLoop.isRunning, onClose: () => {
1741
1856
  stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1742
1857
  setTaskCount(getTaskCount(props.cwd));
@@ -1753,6 +1868,20 @@ export function App(props) {
1753
1868
  markTaskInProgress(props.cwd, next.id);
1754
1869
  startTask(next.title, next.prompt, next.id);
1755
1870
  }
1871
+ } })) : isPixelView ? (_jsx(PixelOverlay, { version: props.version, agentRunning: agentLoop.isRunning, onClose: () => {
1872
+ stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1873
+ setStaticKey((k) => k + 1);
1874
+ setOverlay(null);
1875
+ }, onFixOne: (entry) => {
1876
+ setOverlay(null);
1877
+ startPixelFix(entry.errorId);
1878
+ }, onFixAll: (entries) => {
1879
+ const first = entries.find((e) => e.status === "open") ?? entries[0];
1880
+ if (!first)
1881
+ return;
1882
+ setOverlay(null);
1883
+ setRunAllPixel(true);
1884
+ startPixelFix(first.errorId);
1756
1885
  } })) : isSkillsView ? (_jsx(SkillsOverlay, { cwd: props.cwd, onClose: () => {
1757
1886
  stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1758
1887
  setStaticKey((k) => k + 1);
@@ -1849,6 +1978,9 @@ export function App(props) {
1849
1978
  }, onToggleSkills: () => {
1850
1979
  stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1851
1980
  setOverlay("skills");
1981
+ }, onTogglePixel: () => {
1982
+ stdout?.write("\x1b[2J\x1b[3J\x1b[H");
1983
+ setOverlay("pixel");
1852
1984
  }, onTogglePlanMode: () => {
1853
1985
  const next = !planMode;
1854
1986
  setPlanMode(next);
@@ -1862,6 +1994,6 @@ export function App(props) {
1862
1994
  id: getId(),
1863
1995
  },
1864
1996
  ]);
1865
- }, cwd: props.cwd, commands: allCommands, eyesCount: eyesCount }), overlay === "model" ? (_jsx(ModelSelector, { onSelect: handleModelSelect, onCancel: () => setOverlay(null), loggedInProviders: props.loggedInProviders ?? [currentProvider], currentModel: currentModel, currentProvider: currentProvider })) : overlay === "theme" ? (_jsx(ThemeSelector, { onSelect: handleThemeSelect, onCancel: () => setOverlay(null), currentTheme: theme.name })) : (_jsx(Footer, { model: currentModel, tokensIn: agentLoop.contextUsed, cwd: props.cwd, gitBranch: gitBranch, thinkingEnabled: thinkingEnabled, planMode: planMode, exitPending: exitPending })), buddyEnabled && _jsx(Buddy, { phase: agentLoop.activityPhase }), (bgTasks.length > 0 || (eyesCount !== undefined && eyesCount > 0) || updatePending) && (_jsxs(Box, { children: [bgTasks.length > 0 && (_jsx(BackgroundTasksBar, { tasks: bgTasks, focused: taskBarFocused, expanded: taskBarExpanded, selectedIndex: selectedTaskIndex, onExpand: handleTaskBarExpand, onCollapse: handleTaskBarCollapse, onKill: handleTaskKill, onExit: handleTaskBarExit, onNavigate: handleTaskNavigate })), eyesCount !== undefined && eyesCount > 0 && (_jsx(Box, { paddingLeft: bgTasks.length > 0 ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.accent, bold: true, children: `${eyesCount} eyes signal${eyesCount === 1 ? "" : "s"} · Run /eyes-improve to enhance GG Coder` }) })), updatePending && (_jsx(Box, { paddingLeft: bgTasks.length > 0 || (eyesCount !== undefined && eyesCount > 0) ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.success, bold: true, children: "\u2728 Update ready \u00B7 restart to apply" }) }))] }))] }))] }));
1997
+ }, cwd: props.cwd, commands: allCommands, eyesCount: eyesCount }), overlay === "model" ? (_jsx(ModelSelector, { onSelect: handleModelSelect, onCancel: () => setOverlay(null), loggedInProviders: props.loggedInProviders ?? [currentProvider], currentModel: currentModel, currentProvider: currentProvider })) : overlay === "theme" ? (_jsx(ThemeSelector, { onSelect: handleThemeSelect, onCancel: () => setOverlay(null), currentTheme: theme.name })) : (_jsx(Footer, { model: currentModel, tokensIn: agentLoop.contextUsed, cwd: displayedCwd, gitBranch: gitBranch, thinkingEnabled: thinkingEnabled, planMode: planMode, exitPending: exitPending })), buddyEnabled && _jsx(Buddy, { phase: agentLoop.activityPhase }), (bgTasks.length > 0 || (eyesCount !== undefined && eyesCount > 0) || updatePending) && (_jsxs(Box, { children: [bgTasks.length > 0 && (_jsx(BackgroundTasksBar, { tasks: bgTasks, focused: taskBarFocused, expanded: taskBarExpanded, selectedIndex: selectedTaskIndex, onExpand: handleTaskBarExpand, onCollapse: handleTaskBarCollapse, onKill: handleTaskKill, onExit: handleTaskBarExit, onNavigate: handleTaskNavigate })), eyesCount !== undefined && eyesCount > 0 && (_jsx(Box, { paddingLeft: bgTasks.length > 0 ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.accent, bold: true, children: `${eyesCount} eyes signal${eyesCount === 1 ? "" : "s"} · Run /eyes-improve to enhance EZ Coder` }) })), updatePending && (_jsx(Box, { paddingLeft: bgTasks.length > 0 || (eyesCount !== undefined && eyesCount > 0) ? 2 : 1, paddingRight: 1, children: _jsx(Text, { color: theme.success, bold: true, children: "\u2728 Update ready \u00B7 restart to apply" }) }))] }))] }))] }));
1866
1998
  }
1867
1999
  //# sourceMappingURL=App.js.map