@patze/code-cli 0.43.0 → 0.43.3
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/CHANGELOG.md +32 -0
- package/VERSION +1 -1
- package/dist/cli/interactive/header.d.ts +2 -0
- package/dist/cli/interactive/header.d.ts.map +1 -1
- package/dist/cli/interactive/header.js +27 -12
- package/dist/cli/interactive/header.js.map +1 -1
- package/dist/cli/interactive/line-editor.d.ts +1 -2
- package/dist/cli/interactive/line-editor.d.ts.map +1 -1
- package/dist/cli/interactive/line-editor.js +32 -35
- package/dist/cli/interactive/line-editor.js.map +1 -1
- package/dist/cli/interactive/model-picker-panel.d.ts.map +1 -1
- package/dist/cli/interactive/model-picker-panel.js +27 -16
- package/dist/cli/interactive/model-picker-panel.js.map +1 -1
- package/dist/cli/interactive/model-tty-picker.d.ts.map +1 -1
- package/dist/cli/interactive/model-tty-picker.js +50 -195
- package/dist/cli/interactive/model-tty-picker.js.map +1 -1
- package/dist/cli/interactive/shell.d.ts.map +1 -1
- package/dist/cli/interactive/shell.js +5 -1
- package/dist/cli/interactive/shell.js.map +1 -1
- package/dist/cli/interactive/tty-arrow-selector.d.ts +10 -0
- package/dist/cli/interactive/tty-arrow-selector.d.ts.map +1 -1
- package/dist/cli/interactive/tty-arrow-selector.js +33 -29
- package/dist/cli/interactive/tty-arrow-selector.js.map +1 -1
- package/dist/cli/interactive/tty-frame.d.ts +25 -0
- package/dist/cli/interactive/tty-frame.d.ts.map +1 -0
- package/dist/cli/interactive/tty-frame.js +149 -0
- package/dist/cli/interactive/tty-frame.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const HIDE_CURSOR = "\x1b[?25l";
|
|
2
|
+
export const SHOW_CURSOR = "\x1b[?25h";
|
|
3
|
+
const SAVE_CURSOR = "\x1b[s";
|
|
4
|
+
const RESTORE_CURSOR = "\x1b[u";
|
|
5
|
+
export function clampLinesToSingleRow(lines, width) {
|
|
6
|
+
const cols = Math.max(1, width);
|
|
7
|
+
return lines.map((line) => clampStyledLineToSingleRow(line, cols));
|
|
8
|
+
}
|
|
9
|
+
function clampStyledLineToSingleRow(line, width) {
|
|
10
|
+
const plain = stripAnsi(line);
|
|
11
|
+
if ([...plain].length <= width) {
|
|
12
|
+
return line;
|
|
13
|
+
}
|
|
14
|
+
const open = line.match(/^(\x1b\[[0-9;]*m)+/);
|
|
15
|
+
const close = line.endsWith("\x1b[0m") ? "\x1b[0m" : "";
|
|
16
|
+
const innerPlain = truncatePlainChars(plain, width);
|
|
17
|
+
if (open) {
|
|
18
|
+
return `${open[0]}${innerPlain}${close}`;
|
|
19
|
+
}
|
|
20
|
+
return innerPlain;
|
|
21
|
+
}
|
|
22
|
+
function truncatePlainChars(text, max) {
|
|
23
|
+
const chars = [...text];
|
|
24
|
+
if (chars.length <= max) {
|
|
25
|
+
return text;
|
|
26
|
+
}
|
|
27
|
+
if (max <= 1) {
|
|
28
|
+
return "…";
|
|
29
|
+
}
|
|
30
|
+
return `${chars.slice(0, max - 1).join("")}…`;
|
|
31
|
+
}
|
|
32
|
+
export function stripAnsi(text) {
|
|
33
|
+
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
34
|
+
}
|
|
35
|
+
/** Terminal row count after soft-wrapping long logical lines. */
|
|
36
|
+
export function countVisualRows(lines, width) {
|
|
37
|
+
const cols = Math.max(1, width);
|
|
38
|
+
let total = 0;
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
total += lineVisualRows(line, cols);
|
|
41
|
+
}
|
|
42
|
+
return total;
|
|
43
|
+
}
|
|
44
|
+
export function lineVisualRows(line, width) {
|
|
45
|
+
const plain = stripAnsi(line);
|
|
46
|
+
const length = [...plain].length;
|
|
47
|
+
return Math.max(1, Math.ceil(length / Math.max(1, width)));
|
|
48
|
+
}
|
|
49
|
+
/** Pin overlay redraws to the cursor position where the picker opened (Codex-style). */
|
|
50
|
+
export class TtyAnchoredOverlay {
|
|
51
|
+
frameRows = 0;
|
|
52
|
+
anchored = false;
|
|
53
|
+
begin(output) {
|
|
54
|
+
output.write(SAVE_CURSOR);
|
|
55
|
+
this.anchored = true;
|
|
56
|
+
this.frameRows = 0;
|
|
57
|
+
}
|
|
58
|
+
redraw(output, lines, width, options) {
|
|
59
|
+
const clamped = clampLinesToSingleRow(lines, width);
|
|
60
|
+
const visualRows = clamped.length;
|
|
61
|
+
let out = HIDE_CURSOR;
|
|
62
|
+
if (this.anchored) {
|
|
63
|
+
out += RESTORE_CURSOR;
|
|
64
|
+
out += clearRowsEscape(this.frameRows);
|
|
65
|
+
if (this.frameRows > 0) {
|
|
66
|
+
out += RESTORE_CURSOR;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (this.frameRows > 0) {
|
|
70
|
+
out += rewindAndClearRowsEscape(this.frameRows);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
out += "\r";
|
|
74
|
+
}
|
|
75
|
+
out += clamped.join("\n");
|
|
76
|
+
if (options?.showCursor !== false) {
|
|
77
|
+
out += SHOW_CURSOR;
|
|
78
|
+
}
|
|
79
|
+
output.write(out);
|
|
80
|
+
this.frameRows = visualRows;
|
|
81
|
+
if (!this.anchored) {
|
|
82
|
+
output.write(SAVE_CURSOR);
|
|
83
|
+
this.anchored = true;
|
|
84
|
+
}
|
|
85
|
+
return visualRows;
|
|
86
|
+
}
|
|
87
|
+
clear(output) {
|
|
88
|
+
if (this.frameRows <= 0) {
|
|
89
|
+
this.anchored = false;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let out = HIDE_CURSOR;
|
|
93
|
+
if (this.anchored) {
|
|
94
|
+
out += RESTORE_CURSOR;
|
|
95
|
+
out += clearRowsEscape(this.frameRows);
|
|
96
|
+
out += RESTORE_CURSOR;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
out += rewindAndClearRowsEscape(this.frameRows);
|
|
100
|
+
}
|
|
101
|
+
out += SHOW_CURSOR;
|
|
102
|
+
out += "\n";
|
|
103
|
+
output.write(out);
|
|
104
|
+
this.frameRows = 0;
|
|
105
|
+
this.anchored = false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function clearRowsEscape(rows) {
|
|
109
|
+
if (rows <= 0) {
|
|
110
|
+
return "";
|
|
111
|
+
}
|
|
112
|
+
let out = "";
|
|
113
|
+
for (let i = 0; i < rows; i += 1) {
|
|
114
|
+
out += "\x1b[2K";
|
|
115
|
+
if (i < rows - 1) {
|
|
116
|
+
out += "\x1b[1B";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
function rewindAndClearRowsEscape(rows) {
|
|
122
|
+
if (rows <= 0) {
|
|
123
|
+
return "\r";
|
|
124
|
+
}
|
|
125
|
+
let out = "";
|
|
126
|
+
for (let i = 0; i < rows; i += 1) {
|
|
127
|
+
out += "\x1b[1A\x1b[2K";
|
|
128
|
+
}
|
|
129
|
+
return `${out}\r`;
|
|
130
|
+
}
|
|
131
|
+
/** @deprecated Prefer TtyAnchoredOverlay for interactive overlays. */
|
|
132
|
+
export function redrawTtyFrame(output, input) {
|
|
133
|
+
const overlay = new TtyAnchoredOverlay();
|
|
134
|
+
if (input.previousRows > 0) {
|
|
135
|
+
overlay["frameRows"] = input.previousRows;
|
|
136
|
+
overlay["anchored"] = false;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
overlay.begin(output);
|
|
140
|
+
}
|
|
141
|
+
return overlay.redraw(output, input.lines, input.width);
|
|
142
|
+
}
|
|
143
|
+
/** @deprecated Prefer TtyAnchoredOverlay.clear */
|
|
144
|
+
export function clearTtyFrame(output, frameRows) {
|
|
145
|
+
const overlay = new TtyAnchoredOverlay();
|
|
146
|
+
overlay["frameRows"] = frameRows;
|
|
147
|
+
overlay.clear(output);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=tty-frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tty-frame.js","sourceRoot":"","sources":["../../../src/cli/interactive/tty-frame.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patze/code-cli",
|
|
3
|
-
"version": "0.43.
|
|
3
|
+
"version": "0.43.3",
|
|
4
4
|
"description": "Patze Code — local terminal coding agent client for PatzeAgents",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"e2e:cloud": "npm run build && node scripts/e2e-cloud.mjs",
|
|
33
33
|
"e2e:cloud:interactive": "npm run build && node scripts/e2e-cloud-interactive.mjs",
|
|
34
34
|
"e2e:cloud:all": "npm run build && node scripts/e2e-cloud.mjs && node scripts/e2e-cloud-interactive.mjs",
|
|
35
|
-
"verify": "node scripts/verify-version.mjs && npm run build && node scripts/verify-pack.mjs && npm run typecheck && npm test && node scripts/smoke-beta.mjs"
|
|
35
|
+
"verify": "node scripts/verify-version.mjs && npm run build && node scripts/verify-pack.mjs && npm run typecheck && npm test && node scripts/smoke-beta.mjs && node scripts/pty-composer-smoke.mjs"
|
|
36
36
|
},
|
|
37
37
|
"keywords": [
|
|
38
38
|
"patze",
|