@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.
- package/dist/cli.js +153 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/pixel-fix-agent.d.ts +24 -0
- package/dist/core/pixel-fix-agent.d.ts.map +1 -0
- package/dist/core/pixel-fix-agent.js +49 -0
- package/dist/core/pixel-fix-agent.js.map +1 -0
- package/dist/core/pixel-fix.d.ts +70 -0
- package/dist/core/pixel-fix.d.ts.map +1 -0
- package/dist/core/pixel-fix.js +302 -0
- package/dist/core/pixel-fix.js.map +1 -0
- package/dist/core/pixel-fix.test.d.ts +2 -0
- package/dist/core/pixel-fix.test.d.ts.map +1 -0
- package/dist/core/pixel-fix.test.js +296 -0
- package/dist/core/pixel-fix.test.js.map +1 -0
- package/dist/core/pixel.d.ts +34 -0
- package/dist/core/pixel.d.ts.map +1 -0
- package/dist/core/pixel.js +308 -0
- package/dist/core/pixel.js.map +1 -0
- package/dist/core/pixel.test.d.ts +2 -0
- package/dist/core/pixel.test.d.ts.map +1 -0
- package/dist/core/pixel.test.js +214 -0
- package/dist/core/pixel.test.js.map +1 -0
- package/dist/core/source-maps.d.ts +47 -0
- package/dist/core/source-maps.d.ts.map +1 -0
- package/dist/core/source-maps.js +132 -0
- package/dist/core/source-maps.js.map +1 -0
- package/dist/core/source-maps.test.d.ts +2 -0
- package/dist/core/source-maps.test.d.ts.map +1 -0
- package/dist/core/source-maps.test.js +175 -0
- package/dist/core/source-maps.test.js.map +1 -0
- package/dist/ui/App.d.ts +2 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +139 -7
- package/dist/ui/App.js.map +1 -1
- 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 +6 -1
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/PixelOverlay.d.ts +11 -0
- package/dist/ui/components/PixelOverlay.d.ts.map +1 -0
- package/dist/ui/components/PixelOverlay.js +116 -0
- package/dist/ui/components/PixelOverlay.js.map +1 -0
- package/dist/ui/pixel.d.ts +22 -0
- package/dist/ui/pixel.d.ts.map +1 -0
- package/dist/ui/pixel.js +394 -0
- package/dist/ui/pixel.js.map +1 -0
- package/dist/ui/pixel.test.d.ts +2 -0
- package/dist/ui/pixel.test.d.ts.map +1 -0
- package/dist/ui/pixel.test.js +130 -0
- package/dist/ui/pixel.test.js.map +1 -0
- package/dist/ui/render.d.ts +2 -0
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js +15 -0
- package/dist/utils/image.js.map +1 -1
- 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 @@
|
|
|
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 {};
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -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;
|
|
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(
|
|
358
|
-
}, [
|
|
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:
|
|
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
|
|
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:
|
|
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
|