reslop 0.2.7 → 0.3.1
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 +30 -1
- package/README.md +16 -14
- package/bin/reslop.js +8 -5
- package/lib/agents/agents.js +573 -0
- package/lib/agents/allow.js +71 -0
- package/lib/agents/allow.json +17 -0
- package/lib/agents/models.js +467 -0
- package/lib/api.js +15 -12
- package/lib/cli.js +43 -68
- package/lib/{files.js → common/files.js} +48 -55
- package/lib/{find.js → common/find.js} +1 -1
- package/lib/common/format.js +101 -0
- package/lib/{utilities.js → common/process.js} +7 -95
- package/lib/common/tasks.json +27 -0
- package/lib/common/utilities.js +112 -0
- package/lib/dashboard/git.js +9 -16
- package/lib/dashboard/model.js +90 -49
- package/lib/dashboard/npm.js +17 -13
- package/lib/dashboard/tree.js +27 -30
- package/lib/{session → dashboard}/watch.js +36 -31
- package/lib/{workspace.js → dashboard/workspace.js} +23 -38
- package/lib/{deps.js → deps/deps.js} +31 -45
- package/lib/{deps-diff.js → deps/diff.js} +35 -25
- package/lib/{manifest.js → deps/manifest.js} +47 -30
- package/lib/diff/align.js +1 -2
- package/lib/diff/diff.js +2 -2
- package/lib/diff/display.js +29 -5
- package/lib/diff/inline.js +10 -14
- package/lib/diff/items.js +6 -4
- package/lib/diff/patch.js +39 -3
- package/lib/diff/unit.js +45 -16
- package/lib/{git-branches.js → git/branches.js} +53 -48
- package/lib/{git-deps.js → git/deps.js} +151 -95
- package/lib/git/git.js +71 -0
- package/lib/git/worktree.js +504 -0
- package/lib/highlight/bash.js +1 -2
- package/lib/highlight/csv.js +1 -2
- package/lib/highlight/dot.js +1 -2
- package/lib/{highlight.js → highlight/highlight.js} +42 -11
- package/lib/highlight/html.js +20 -18
- package/lib/highlight/json.js +1 -2
- package/lib/highlight/log.js +1 -2
- package/lib/highlight/txt.js +1 -2
- package/lib/{session → input}/actions.js +114 -48
- package/lib/{editor.js → input/editor.js} +16 -8
- package/lib/{keys.js → input/keys.js} +24 -45
- package/lib/input/line-edit.js +78 -0
- package/lib/input/menu-pick.js +70 -0
- package/lib/render/agents.js +642 -0
- package/lib/render/branches.js +4 -5
- package/lib/render/commits.js +54 -64
- package/lib/render/{dash-activity.js → dashboard/activity.js} +25 -40
- package/lib/render/{dash-blocks.js → dashboard/blocks.js} +131 -137
- package/lib/render/{dashboard.js → dashboard/dashboard.js} +25 -22
- package/lib/render/diff.js +166 -45
- package/lib/render/field.js +131 -0
- package/lib/render/files.js +9 -14
- package/lib/render/footer.js +385 -0
- package/lib/render/frame.js +123 -25
- package/lib/render/header.js +176 -0
- package/lib/render/log.js +320 -0
- package/lib/render/menu.js +60 -0
- package/lib/render/notes.js +16 -11
- package/lib/render/npm.js +322 -196
- package/lib/render/packages.js +9 -13
- package/lib/render/primitives.js +101 -15
- package/lib/render/render.js +7 -11
- package/lib/render/repos.js +13 -25
- package/lib/render/status.js +370 -0
- package/lib/render/status.json +85 -0
- package/lib/render/{dash-table.js → table.js} +13 -60
- package/lib/render/tiles.js +109 -48
- package/lib/render/unit.js +32 -13
- package/lib/{report-model.js → report/model.js} +4 -6
- package/lib/{report-parse.js → report/parse.js} +9 -14
- package/lib/{report-render.js → report/render.js} +48 -19
- package/lib/{report-run.js → report/run.js} +42 -30
- package/lib/{report-test.js → report/test.js} +56 -55
- package/lib/{report-tools.js → report/tools.js} +24 -33
- package/lib/review/agent-instructions.md +14 -0
- package/lib/review/format.js +420 -0
- package/lib/{review-merge.js → review/merge.js} +9 -8
- package/lib/review/review.js +190 -0
- package/lib/review/store.js +281 -0
- package/lib/review/templates.js +83 -0
- package/lib/runs/commands.js +14 -0
- package/lib/runs/logs.js +299 -0
- package/lib/runs/output.js +174 -0
- package/lib/runs/process.js +113 -0
- package/lib/{runs.js → runs/runs.js} +84 -36
- package/lib/runs/scripts.js +150 -0
- package/lib/session/agents/agents.js +976 -0
- package/lib/session/agents/job.js +320 -0
- package/lib/session/agents/jobs.js +355 -0
- package/lib/session/agents/options.js +153 -0
- package/lib/session/agents/plans.js +83 -0
- package/lib/session/branches.js +33 -40
- package/lib/session/change-actions.js +34 -100
- package/lib/session/commit.js +91 -52
- package/lib/session/compose.js +189 -147
- package/lib/session/dashboard.js +23 -22
- package/lib/session/dispatch.js +86 -21
- package/lib/session/files-pane.js +47 -26
- package/lib/session/find.js +16 -29
- package/lib/session/import.js +93 -0
- package/lib/session/items.js +8 -17
- package/lib/session/lifecycle.js +78 -72
- package/lib/session/load.js +2 -4
- package/lib/session/navigation.js +6 -3
- package/lib/session/npm/history.js +250 -0
- package/lib/session/npm/npm.js +836 -0
- package/lib/session/{packages.js → npm/packages.js} +21 -14
- package/lib/session/ops.js +125 -34
- package/lib/session/pointer.js +202 -10
- package/lib/session/prefs.js +112 -0
- package/lib/session/reads.js +109 -0
- package/lib/session/review.js +28 -10
- package/lib/session/run-panel.js +40 -0
- package/lib/{session.js → session/session.js} +158 -63
- package/lib/session/tasks.js +321 -66
- package/lib/session/templates.js +1 -1
- package/lib/session/terminal.js +94 -12
- package/lib/session/unit.js +35 -30
- package/lib/session/update.js +194 -6
- package/lib/session/view.js +65 -65
- package/lib/session/workspace.js +39 -78
- package/lib/{capabilities.js → source/capabilities.js} +3 -12
- package/lib/{github.js → source/github.js} +102 -32
- package/lib/{gitlab.js → source/gitlab.js} +87 -10
- package/lib/{remote.js → source/remote.js} +144 -40
- package/lib/source/review-threads.graphql +20 -0
- package/lib/source/source.js +74 -0
- package/lib/term/ansi.js +396 -0
- package/lib/{clipboard.js → term/clipboard.js} +3 -6
- package/lib/{select.js → term/select.js} +4 -3
- package/lib/term/themes/dark.json +122 -0
- package/lib/term/themes/light.json +122 -0
- package/lib/term/wide.txt +21 -0
- package/lib/{wrap.js → term/wrap.js} +4 -4
- package/package.json +2 -2
- package/lib/ansi.js +0 -545
- package/lib/detect.js +0 -34
- package/lib/diff/edit.js +0 -33
- package/lib/git-worktree.js +0 -455
- package/lib/git.js +0 -79
- package/lib/npm-commands.js +0 -522
- package/lib/render/chrome.js +0 -806
- package/lib/render/present.js +0 -19
- package/lib/render/report.js +0 -43
- package/lib/render/search.js +0 -25
- package/lib/review.js +0 -745
- package/lib/session/accessors.js +0 -26
- package/lib/session/edit-click.js +0 -57
- package/lib/session/npm.js +0 -452
- package/lib/session/progress.js +0 -41
- package/lib/source.js +0 -36
- package/lib/update.js +0 -192
- /package/lib/{git-reword-todo.js → git/reword-todo.js} +0 -0
package/lib/term/ansi.js
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { resource } = require('../common/utilities.js');
|
|
4
|
+
|
|
5
|
+
const ASCII_RE = /^[\x20-\x7e]*$/;
|
|
6
|
+
// Printable characters that never join a neighbour into one grapheme
|
|
7
|
+
const SOLO_RE = new RegExp(
|
|
8
|
+
'^[\\x20-\\x7e\\u00a0-\\u017f\\u0400-\\u0482\\u048a-\\u04ff' +
|
|
9
|
+
'\\u2010-\\u2027\\u2190-\\u21ff\\u2500-\\u25ff\\u2700-\\u27bf' +
|
|
10
|
+
'\\u2800-\\u28ff]*$',
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
let segmenter = null;
|
|
14
|
+
|
|
15
|
+
const segments = (text) => {
|
|
16
|
+
segmenter ??= new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
17
|
+
return segmenter.segment(text);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const ESC = String.fromCodePoint(0x1b);
|
|
21
|
+
const CSI_RE = `${ESC}\\[[0-9;?]*[ -/]*[@-~]`;
|
|
22
|
+
const OSC_RE = `${ESC}\\][^\x07\x1b]*(?:\x07|${ESC}\\\\)`;
|
|
23
|
+
const ANSI_RE = new RegExp(`${CSI_RE}|${OSC_RE}`, 'g');
|
|
24
|
+
const RESET = `${ESC}[0m`;
|
|
25
|
+
const BOLD = `${ESC}[1m`;
|
|
26
|
+
const EL = `${ESC}[K`;
|
|
27
|
+
const ST = `${ESC}\\`;
|
|
28
|
+
|
|
29
|
+
const WIDE_CP = resource(__dirname, 'wide.txt')
|
|
30
|
+
.split(/[\s-]+/)
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.map((cp) => parseInt(cp, 16));
|
|
33
|
+
|
|
34
|
+
const rgbOf = (hex) =>
|
|
35
|
+
[1, 3, 5].map((at) => parseInt(hex.slice(at, at + 2), 16));
|
|
36
|
+
|
|
37
|
+
const colorsOf = (map) => {
|
|
38
|
+
const colors = {};
|
|
39
|
+
for (const key of Object.keys(map)) colors[key] = rgbOf(map[key]);
|
|
40
|
+
return colors;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const paletteOf = ({ ui, code, logCols }) => ({
|
|
44
|
+
ui: colorsOf(ui),
|
|
45
|
+
code: colorsOf(code),
|
|
46
|
+
logCols: logCols.map(rgbOf),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const PALETTES = {
|
|
50
|
+
dark: paletteOf(require('./themes/dark.json')),
|
|
51
|
+
light: paletteOf(require('./themes/light.json')),
|
|
52
|
+
};
|
|
53
|
+
const THEME_NAMES = Object.keys(PALETTES);
|
|
54
|
+
|
|
55
|
+
const applyColors = (into, from) => {
|
|
56
|
+
for (const key of Object.keys(from)) {
|
|
57
|
+
const src = from[key];
|
|
58
|
+
const dst = into[key];
|
|
59
|
+
dst[0] = src[0];
|
|
60
|
+
dst[1] = src[1];
|
|
61
|
+
dst[2] = src[2];
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const THEME = structuredClone(PALETTES.dark.ui);
|
|
66
|
+
const CODE_FG = structuredClone(PALETTES.dark.code);
|
|
67
|
+
const LOG_COL_FG = structuredClone(PALETTES.dark.logCols);
|
|
68
|
+
let currentTheme = 'dark';
|
|
69
|
+
|
|
70
|
+
const setTheme = (name) => {
|
|
71
|
+
if (!Object.hasOwn(PALETTES, name)) {
|
|
72
|
+
throw new Error(`unknown theme ${name}`);
|
|
73
|
+
}
|
|
74
|
+
const palette = PALETTES[name];
|
|
75
|
+
applyColors(THEME, palette.ui);
|
|
76
|
+
applyColors(CODE_FG, palette.code);
|
|
77
|
+
applyColors(LOG_COL_FG, palette.logCols);
|
|
78
|
+
currentTheme = name;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const themeName = () => currentTheme;
|
|
82
|
+
|
|
83
|
+
const codeFg = (style) => {
|
|
84
|
+
if (typeof style !== 'string') return CODE_FG.plain;
|
|
85
|
+
if (Object.hasOwn(CODE_FG, style)) return CODE_FG[style];
|
|
86
|
+
if (style.startsWith('logCol')) {
|
|
87
|
+
const i = parseInt(style.slice(6), 10);
|
|
88
|
+
return LOG_COL_FG[i % LOG_COL_FG.length];
|
|
89
|
+
}
|
|
90
|
+
return CODE_FG.plain;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const channels = (rgb) => {
|
|
94
|
+
if (typeof rgb === 'number') return `${rgb};${rgb};${rgb}`;
|
|
95
|
+
return `${rgb[0]};${rgb[1]};${rgb[2]}`;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const fg = (rgb) => `${ESC}[38;2;${channels(rgb)}m`;
|
|
99
|
+
|
|
100
|
+
const bg = (rgb) => `${ESC}[48;2;${channels(rgb)}m`;
|
|
101
|
+
|
|
102
|
+
const seq = (fgRgb, bgRgb) => `${fg(fgRgb)}${bg(bgRgb)}`;
|
|
103
|
+
|
|
104
|
+
const paint = (text, fgRgb, bgRgb, color, bold) => {
|
|
105
|
+
if (!color || text === '') return text;
|
|
106
|
+
const mark = bold ? BOLD : '';
|
|
107
|
+
return `${mark}${seq(fgRgb, bgRgb)}${text}${RESET}`;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const hyperlink = (href, label) => {
|
|
111
|
+
const uri = `${href ?? ''}`.replaceAll(ESC, '').replaceAll('\x07', '');
|
|
112
|
+
const text = `${label ?? ''}`;
|
|
113
|
+
if (!uri || !text) return text;
|
|
114
|
+
return `${ESC}]8;;${uri}${ST}${text}${ESC}]8;;${ST}`;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const stripAnsi = (text) => text.replace(ANSI_RE, '');
|
|
118
|
+
|
|
119
|
+
const graphemes = (text) => {
|
|
120
|
+
if (SOLO_RE.test(text)) return text.split('');
|
|
121
|
+
const parts = new Array(text.length);
|
|
122
|
+
let n = 0;
|
|
123
|
+
for (const { segment } of segments(text)) parts[n++] = segment;
|
|
124
|
+
parts.length = n;
|
|
125
|
+
return parts;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const isWide = (cp) => {
|
|
129
|
+
let lo = 0;
|
|
130
|
+
let hi = WIDE_CP.length >> 1;
|
|
131
|
+
while (lo < hi) {
|
|
132
|
+
const mid = (lo + hi) >> 1;
|
|
133
|
+
const start = WIDE_CP[mid << 1];
|
|
134
|
+
const end = WIDE_CP[(mid << 1) + 1];
|
|
135
|
+
if (cp < start) hi = mid;
|
|
136
|
+
else if (cp > end) lo = mid + 1;
|
|
137
|
+
else return true;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const graphemeWidth = (ch, col) => {
|
|
143
|
+
if (ch === '\t') return 8 - (col % 8);
|
|
144
|
+
if (ch === '\n' || ch === '\r') return 0;
|
|
145
|
+
const cp = ch.codePointAt(0);
|
|
146
|
+
if (cp >= 0x20 && cp < 0x7f) return 1;
|
|
147
|
+
if (cp <= 0x1f || cp === 0x7f) return 0;
|
|
148
|
+
if (cp === 0x200d) return 0;
|
|
149
|
+
if (cp >= 0xfe00 && cp <= 0xfe0f) return 0;
|
|
150
|
+
if (isWide(cp)) return 2;
|
|
151
|
+
return 1;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const plainText = (text) => (text.includes(ESC) ? stripAnsi(text) : text);
|
|
155
|
+
|
|
156
|
+
const visibleWidth = (text) => {
|
|
157
|
+
const plain = plainText(text);
|
|
158
|
+
if (ASCII_RE.test(plain)) return plain.length;
|
|
159
|
+
let width = 0;
|
|
160
|
+
for (const ch of graphemes(plain)) {
|
|
161
|
+
width += graphemeWidth(ch, width);
|
|
162
|
+
}
|
|
163
|
+
return width;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const truncateVisible = (text, width, mark = '') => {
|
|
167
|
+
if (width <= 0) return '';
|
|
168
|
+
const plain = plainText(text);
|
|
169
|
+
if (visibleWidth(plain) <= width) return text;
|
|
170
|
+
const markW = mark ? visibleWidth(mark) : 0;
|
|
171
|
+
const fits = markW > 0 && markW <= width;
|
|
172
|
+
const limit = fits ? width - markW : width;
|
|
173
|
+
let out = '';
|
|
174
|
+
if (ASCII_RE.test(plain)) {
|
|
175
|
+
out = plain.slice(0, limit);
|
|
176
|
+
} else {
|
|
177
|
+
let used = 0;
|
|
178
|
+
for (const ch of graphemes(plain)) {
|
|
179
|
+
const w = graphemeWidth(ch, used);
|
|
180
|
+
if (used + w > limit) break;
|
|
181
|
+
out += ch;
|
|
182
|
+
used += w;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return fits ? `${out}${mark}` : out;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const trimVisible = (text, width) => truncateVisible(text, width, '…');
|
|
189
|
+
|
|
190
|
+
const csiLength = (text, index) => {
|
|
191
|
+
if (text[index] !== ESC || text[index + 1] !== '[') return 0;
|
|
192
|
+
let at = index + 2;
|
|
193
|
+
while (at < text.length) {
|
|
194
|
+
const code = text.charCodeAt(at);
|
|
195
|
+
at += 1;
|
|
196
|
+
if (code >= 64 && code <= 126) return at - index;
|
|
197
|
+
}
|
|
198
|
+
return 0;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const oscLength = (text, index) => {
|
|
202
|
+
if (text[index] !== ESC || text[index + 1] !== ']') return 0;
|
|
203
|
+
let at = index + 2;
|
|
204
|
+
while (at < text.length) {
|
|
205
|
+
if (text[at] === '\x07') return at + 1 - index;
|
|
206
|
+
if (text[at] === ESC && text[at + 1] === '\\') return at + 2 - index;
|
|
207
|
+
at += 1;
|
|
208
|
+
}
|
|
209
|
+
return 0;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const ansiLength = (text, index) => {
|
|
213
|
+
const csi = csiLength(text, index);
|
|
214
|
+
return csi || oscLength(text, index);
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const firstGrapheme = (text) => {
|
|
218
|
+
const next = segments(text)[Symbol.iterator]().next();
|
|
219
|
+
if (next.done || !next.value) return '';
|
|
220
|
+
return next.value.segment;
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const graphemeAt = (text, index) => {
|
|
224
|
+
const code = text.charCodeAt(index);
|
|
225
|
+
const plain = code >= 0x20 && code < 0x7f;
|
|
226
|
+
if (plain && !(text.charCodeAt(index + 1) >= 0x300)) return text[index];
|
|
227
|
+
return firstGrapheme(text.slice(index));
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const takeVisible = (text, width) => {
|
|
231
|
+
const raw = `${text ?? ''}`;
|
|
232
|
+
if (width <= 0) return '';
|
|
233
|
+
let used = 0;
|
|
234
|
+
let index = 0;
|
|
235
|
+
let fits = true;
|
|
236
|
+
while (fits && index < raw.length && used < width) {
|
|
237
|
+
const skip = ansiLength(raw, index);
|
|
238
|
+
if (skip) {
|
|
239
|
+
index += skip;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const next = raw.indexOf(ESC, index + 1);
|
|
243
|
+
const run = raw.slice(index, next < 0 ? raw.length : next);
|
|
244
|
+
for (const { segment } of segments(run)) {
|
|
245
|
+
const w = graphemeWidth(segment, used);
|
|
246
|
+
fits = used + w <= width;
|
|
247
|
+
if (!fits) break;
|
|
248
|
+
used += w;
|
|
249
|
+
index += segment.length;
|
|
250
|
+
if (used >= width) break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return raw.slice(0, index);
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
const clipAnsi = (text, width) => {
|
|
257
|
+
const raw = `${text ?? ''}`;
|
|
258
|
+
if (width <= 0) return '';
|
|
259
|
+
if (visibleWidth(raw) <= width) return raw;
|
|
260
|
+
let out = takeVisible(raw, width);
|
|
261
|
+
if (stripAnsi(out) !== stripAnsi(raw)) out += RESET;
|
|
262
|
+
return out;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const dropVisible = (text, skip) => {
|
|
266
|
+
const raw = `${text ?? ''}`;
|
|
267
|
+
if (skip <= 0) return raw;
|
|
268
|
+
let used = 0;
|
|
269
|
+
let index = 0;
|
|
270
|
+
let style = '';
|
|
271
|
+
while (index < raw.length && used < skip) {
|
|
272
|
+
const ansi = ansiLength(raw, index);
|
|
273
|
+
if (ansi) {
|
|
274
|
+
const seq = raw.slice(index, index + ansi);
|
|
275
|
+
if (seq[1] === '[' && seq.endsWith('m')) style = seq;
|
|
276
|
+
index += ansi;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
const ch = graphemeAt(raw, index);
|
|
280
|
+
if (!ch) break;
|
|
281
|
+
const w = graphemeWidth(ch, used);
|
|
282
|
+
if (used + w > skip) break;
|
|
283
|
+
used += w;
|
|
284
|
+
index += ch.length;
|
|
285
|
+
}
|
|
286
|
+
const rest = raw.slice(index);
|
|
287
|
+
if (!style) return rest;
|
|
288
|
+
return `${style}${rest}`;
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
const stampVisible = (line, x, face) => {
|
|
292
|
+
const raw = `${line ?? ''}`;
|
|
293
|
+
const mark = `${face ?? ''}`;
|
|
294
|
+
const at = Math.max(0, x);
|
|
295
|
+
const left = takeVisible(raw, at);
|
|
296
|
+
const right = dropVisible(raw, at + visibleWidth(mark));
|
|
297
|
+
return `${left}${mark}${right}`;
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
const sgrParams = (seq) => {
|
|
301
|
+
const inner = seq.slice(2, -1);
|
|
302
|
+
if (!inner) return [0];
|
|
303
|
+
return inner.split(';').map((part) => (part === '' ? 0 : Number(part)));
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
const colorSpan = (params, index) => {
|
|
307
|
+
const mode = params[index + 1];
|
|
308
|
+
if (mode === 5) return 2;
|
|
309
|
+
if (mode === 2) return 4;
|
|
310
|
+
return 0;
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const keepFgParams = (params) => {
|
|
314
|
+
const kept = [];
|
|
315
|
+
for (let i = 0; i < params.length; i++) {
|
|
316
|
+
const code = params[i];
|
|
317
|
+
if (code === 38 || code === 48) {
|
|
318
|
+
const extra = colorSpan(params, i);
|
|
319
|
+
if (code === 38 && extra) {
|
|
320
|
+
kept.push(code, ...params.slice(i + 1, i + 1 + extra));
|
|
321
|
+
}
|
|
322
|
+
i += extra;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (code >= 40 && code <= 49) continue;
|
|
326
|
+
if (code >= 100 && code <= 107) continue;
|
|
327
|
+
if (code === 7 || code === 27) continue;
|
|
328
|
+
kept.push(code);
|
|
329
|
+
}
|
|
330
|
+
return kept;
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
const foregroundOn = (text, bgRgb) => {
|
|
334
|
+
const raw = `${text ?? ''}`;
|
|
335
|
+
const ground = bg(bgRgb);
|
|
336
|
+
let out = '';
|
|
337
|
+
let index = 0;
|
|
338
|
+
while (index < raw.length) {
|
|
339
|
+
if (raw[index] !== ESC) {
|
|
340
|
+
const next = raw.indexOf(ESC, index);
|
|
341
|
+
const end = next < 0 ? raw.length : next;
|
|
342
|
+
out += raw.slice(index, end);
|
|
343
|
+
index = end;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const skip = ansiLength(raw, index);
|
|
347
|
+
if (!skip) {
|
|
348
|
+
out += raw[index];
|
|
349
|
+
index += 1;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const seq = raw.slice(index, index + skip);
|
|
353
|
+
index += skip;
|
|
354
|
+
if (seq[1] !== '[' || !seq.endsWith('m')) {
|
|
355
|
+
out += seq;
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
const kept = keepFgParams(sgrParams(seq));
|
|
359
|
+
const reset = kept.includes(0);
|
|
360
|
+
const rest = kept.filter((code) => code !== 0);
|
|
361
|
+
if (reset) out += RESET;
|
|
362
|
+
out += ground;
|
|
363
|
+
if (rest.length) out += `${ESC}[${rest.join(';')}m`;
|
|
364
|
+
}
|
|
365
|
+
return out;
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
module.exports = {
|
|
369
|
+
ESC,
|
|
370
|
+
RESET,
|
|
371
|
+
BOLD,
|
|
372
|
+
EL,
|
|
373
|
+
THEME,
|
|
374
|
+
CODE_FG,
|
|
375
|
+
PALETTES,
|
|
376
|
+
THEME_NAMES,
|
|
377
|
+
setTheme,
|
|
378
|
+
themeName,
|
|
379
|
+
codeFg,
|
|
380
|
+
fg,
|
|
381
|
+
bg,
|
|
382
|
+
seq,
|
|
383
|
+
paint,
|
|
384
|
+
hyperlink,
|
|
385
|
+
stripAnsi,
|
|
386
|
+
graphemes,
|
|
387
|
+
graphemeWidth,
|
|
388
|
+
visibleWidth,
|
|
389
|
+
truncateVisible,
|
|
390
|
+
trimVisible,
|
|
391
|
+
firstGrapheme,
|
|
392
|
+
graphemeAt,
|
|
393
|
+
clipAnsi,
|
|
394
|
+
stampVisible,
|
|
395
|
+
foregroundOn,
|
|
396
|
+
};
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const { spawnSync } = childProcess;
|
|
3
|
+
const { spawnSync } = require('node:child_process');
|
|
5
4
|
|
|
6
|
-
const
|
|
7
|
-
const {
|
|
8
|
-
const utilities = require('./utilities.js');
|
|
9
|
-
const { spawnBase } = utilities;
|
|
5
|
+
const { ESC } = require('./ansi.js');
|
|
6
|
+
const { spawnBase } = require('../common/process.js');
|
|
10
7
|
|
|
11
8
|
const CLIP_TIMEOUT_MS = 1000;
|
|
12
9
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const ansi = require('./ansi.js');
|
|
4
4
|
const { ESC, RESET, THEME, seq, fg, bg, stripAnsi, visibleWidth } = ansi;
|
|
5
|
-
const { graphemes, graphemeWidth,
|
|
5
|
+
const { graphemes, graphemeWidth, graphemeAt } = ansi;
|
|
6
6
|
|
|
7
7
|
const CSI_FINAL = /[@-~]/;
|
|
8
8
|
const TRUECOLOR = 2;
|
|
@@ -108,7 +108,7 @@ const parseCells = (line) => {
|
|
|
108
108
|
i += 1;
|
|
109
109
|
continue;
|
|
110
110
|
}
|
|
111
|
-
const ch =
|
|
111
|
+
const ch = graphemeAt(line, i);
|
|
112
112
|
if (!ch) break;
|
|
113
113
|
const width = graphemeWidth(ch, col);
|
|
114
114
|
cells.push({ ch, fg: state.fg, bg: state.bg, col, width });
|
|
@@ -151,7 +151,8 @@ const overlayRange = (line, fromCol, toCol) => {
|
|
|
151
151
|
};
|
|
152
152
|
|
|
153
153
|
const editorSelection = (view) => {
|
|
154
|
-
const
|
|
154
|
+
const taskEdit = view?.pane === 'tasks' ? view.taskEdit : null;
|
|
155
|
+
const source = view?.compose || view?.codeOverlay || taskEdit;
|
|
155
156
|
if (!source || typeof source.anchor !== 'number') return null;
|
|
156
157
|
const cursor = source.cursor ?? 0;
|
|
157
158
|
if (source.anchor === cursor) return null;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ui": {
|
|
3
|
+
"delLineFg": "#cc7a7a",
|
|
4
|
+
"delLineBg": "#3a1a1a",
|
|
5
|
+
"delCharFg": "#ffffff",
|
|
6
|
+
"delCharBg": "#752222",
|
|
7
|
+
"addLineFg": "#7acc8a",
|
|
8
|
+
"addLineBg": "#142814",
|
|
9
|
+
"addCharFg": "#ffffff",
|
|
10
|
+
"addCharBg": "#1a4c26",
|
|
11
|
+
"ctxFg": "#8a8a8a",
|
|
12
|
+
"ctxBg": "#121218",
|
|
13
|
+
"lineNoFg": "#8a8a96",
|
|
14
|
+
"lineNoBg": "#0e0e14",
|
|
15
|
+
"splitGutterFg": "#181824",
|
|
16
|
+
"splitGutterBg": "#181824",
|
|
17
|
+
"headerFg": "#3a3a3a",
|
|
18
|
+
"headerBg": "#e6e6ee",
|
|
19
|
+
"headerChromeFg": "#5a5a5a",
|
|
20
|
+
"headerRepoFg": "#3a3a3a",
|
|
21
|
+
"headerDirFg": "#6e6e6e",
|
|
22
|
+
"headerSlashFg": "#8a8a8a",
|
|
23
|
+
"headerFileFg": "#4e4e4e",
|
|
24
|
+
"chromeFg": "#d0d0e0",
|
|
25
|
+
"chromeBg": "#181824",
|
|
26
|
+
"noteBg": "#242436",
|
|
27
|
+
"buttonFg": "#6a6a7e",
|
|
28
|
+
"buttonBg": "#2a2a40",
|
|
29
|
+
"buttonHotFg": "#ffffff",
|
|
30
|
+
"currentBg": "#a8ccb4",
|
|
31
|
+
"checkFg": "#f4f4fc",
|
|
32
|
+
"checkBg": "#525274",
|
|
33
|
+
"checkDoneFg": "#f0fff4",
|
|
34
|
+
"checkDoneBg": "#225834",
|
|
35
|
+
"errorFg": "#ff8080",
|
|
36
|
+
"warnFg": "#e8c84a",
|
|
37
|
+
"mutedFg": "#7a7a8a",
|
|
38
|
+
"shaFg": "#569cd6",
|
|
39
|
+
"pkgDepFg": "#afe0b9",
|
|
40
|
+
"pkgDevFg": "#9ac4e6",
|
|
41
|
+
"pkgFg": "#c8c8d2",
|
|
42
|
+
"pkgChainFg": "#555562",
|
|
43
|
+
"shaDarkFg": "#154a8c",
|
|
44
|
+
"stagedDelLineFg": "#a0a0a8",
|
|
45
|
+
"stagedDelLineBg": "#202026",
|
|
46
|
+
"stagedDelCharFg": "#f0f0f4",
|
|
47
|
+
"stagedDelCharBg": "#44444e",
|
|
48
|
+
"stagedAddLineFg": "#b0b0b8",
|
|
49
|
+
"stagedAddLineBg": "#26262e",
|
|
50
|
+
"stagedAddCharFg": "#ffffff",
|
|
51
|
+
"stagedAddCharBg": "#4e4e58",
|
|
52
|
+
"dashBg": "#000000",
|
|
53
|
+
"dashTileBg": "#26262a",
|
|
54
|
+
"dashRowBg": "#1c1c1f",
|
|
55
|
+
"dashHeadBg": "#70707c",
|
|
56
|
+
"dashDimHeadBg": "#303038",
|
|
57
|
+
"dashDimTileBg": "#121214",
|
|
58
|
+
"dashDimRowBg": "#0c0c0e",
|
|
59
|
+
"dashHeadMuted": "#f2f2fa",
|
|
60
|
+
"dashCaptionFg": "#a0a0ac",
|
|
61
|
+
"dashDelFg": "#ffd2d2",
|
|
62
|
+
"heatTrack": "#3a3c48",
|
|
63
|
+
"heat1": "#1c3a32",
|
|
64
|
+
"heat2": "#2a5a38",
|
|
65
|
+
"heat3": "#8a6a18",
|
|
66
|
+
"heat4": "#a03a28",
|
|
67
|
+
"heatFg": "#f4f4f8",
|
|
68
|
+
"heatBlink": "#f2e28a",
|
|
69
|
+
"heatBlinkFg": "#1a1608",
|
|
70
|
+
"dashKeyFg": "#ffffff",
|
|
71
|
+
"taskHeadFg": "#ffffff",
|
|
72
|
+
"taskHeadBg": "#3c3c48",
|
|
73
|
+
"searchFg": "#1a1608",
|
|
74
|
+
"searchBg": "#8a6a18",
|
|
75
|
+
"searchOnFg": "#1a1608",
|
|
76
|
+
"searchOnBg": "#f2e28a"
|
|
77
|
+
},
|
|
78
|
+
"code": {
|
|
79
|
+
"keyword": "#c586c0",
|
|
80
|
+
"control": "#c586c0",
|
|
81
|
+
"storage": "#569cd6",
|
|
82
|
+
"literal": "#569cd6",
|
|
83
|
+
"string": "#ce9178",
|
|
84
|
+
"template": "#ce9178",
|
|
85
|
+
"escape": "#d16969",
|
|
86
|
+
"interpolation": "#9cdcfe",
|
|
87
|
+
"number": "#b5cea8",
|
|
88
|
+
"comment": "#6a9955",
|
|
89
|
+
"function": "#dcdcaa",
|
|
90
|
+
"method": "#dcdcaa",
|
|
91
|
+
"className": "#4ec9b0",
|
|
92
|
+
"type": "#4ec9b0",
|
|
93
|
+
"interface": "#4ec9b0",
|
|
94
|
+
"property": "#9cdcfe",
|
|
95
|
+
"variable": "#9cdcfe",
|
|
96
|
+
"parameter": "#9cdcfe",
|
|
97
|
+
"constant": "#4fc1ff",
|
|
98
|
+
"operator": "#d4d4d4",
|
|
99
|
+
"punct": "#d4d4d4",
|
|
100
|
+
"regex": "#d16969",
|
|
101
|
+
"decorator": "#dcdcaa",
|
|
102
|
+
"tag": "#569cd6",
|
|
103
|
+
"attr": "#9cdcfe",
|
|
104
|
+
"plain": "#d4d4d4",
|
|
105
|
+
"punctDim": "#808080",
|
|
106
|
+
"logDate": "#d2d2dc",
|
|
107
|
+
"logError": "#e65a5a",
|
|
108
|
+
"logWarn": "#e6b450",
|
|
109
|
+
"logInfo": "#64aae6",
|
|
110
|
+
"logDebug": "#8ca0b4"
|
|
111
|
+
},
|
|
112
|
+
"logCols": [
|
|
113
|
+
"#d2d2dc",
|
|
114
|
+
"#78b4dc",
|
|
115
|
+
"#b4a0dc",
|
|
116
|
+
"#8cc8a0",
|
|
117
|
+
"#dcb478",
|
|
118
|
+
"#dc8ca0",
|
|
119
|
+
"#a0c8c8",
|
|
120
|
+
"#c8aa8c"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ui": {
|
|
3
|
+
"delLineFg": "#b31d28",
|
|
4
|
+
"delLineBg": "#ffebe9",
|
|
5
|
+
"delCharFg": "#1f2328",
|
|
6
|
+
"delCharBg": "#ffc1c0",
|
|
7
|
+
"addLineFg": "#1a7f37",
|
|
8
|
+
"addLineBg": "#e6ffec",
|
|
9
|
+
"addCharFg": "#1f2328",
|
|
10
|
+
"addCharBg": "#abf2bc",
|
|
11
|
+
"ctxFg": "#57606a",
|
|
12
|
+
"ctxBg": "#f2f4f8",
|
|
13
|
+
"lineNoFg": "#6e7781",
|
|
14
|
+
"lineNoBg": "#eef0f4",
|
|
15
|
+
"splitGutterFg": "#eaeef2",
|
|
16
|
+
"splitGutterBg": "#eaeef2",
|
|
17
|
+
"headerFg": "#24292f",
|
|
18
|
+
"headerBg": "#ffffff",
|
|
19
|
+
"headerChromeFg": "#424a53",
|
|
20
|
+
"headerRepoFg": "#24292f",
|
|
21
|
+
"headerDirFg": "#57606a",
|
|
22
|
+
"headerSlashFg": "#8c959f",
|
|
23
|
+
"headerFileFg": "#1f2328",
|
|
24
|
+
"chromeFg": "#24292f",
|
|
25
|
+
"chromeBg": "#f2f4f8",
|
|
26
|
+
"noteBg": "#f8fbff",
|
|
27
|
+
"buttonFg": "#57606a",
|
|
28
|
+
"buttonBg": "#f7f9fc",
|
|
29
|
+
"buttonHotFg": "#0f1419",
|
|
30
|
+
"currentBg": "#ace1c2",
|
|
31
|
+
"checkFg": "#1f2328",
|
|
32
|
+
"checkBg": "#c8cfd8",
|
|
33
|
+
"checkDoneFg": "#0f3d1f",
|
|
34
|
+
"checkDoneBg": "#abf2bc",
|
|
35
|
+
"errorFg": "#cf222e",
|
|
36
|
+
"warnFg": "#9a6700",
|
|
37
|
+
"mutedFg": "#6e7781",
|
|
38
|
+
"shaFg": "#0550ae",
|
|
39
|
+
"pkgDepFg": "#3ca85a",
|
|
40
|
+
"pkgDevFg": "#3d7ec8",
|
|
41
|
+
"pkgFg": "#9aa2ac",
|
|
42
|
+
"pkgChainFg": "#3a424c",
|
|
43
|
+
"shaDarkFg": "#0b3d70",
|
|
44
|
+
"stagedDelLineFg": "#57606a",
|
|
45
|
+
"stagedDelLineBg": "#f3f4f6",
|
|
46
|
+
"stagedDelCharFg": "#1f2328",
|
|
47
|
+
"stagedDelCharBg": "#d8dce1",
|
|
48
|
+
"stagedAddLineFg": "#424a53",
|
|
49
|
+
"stagedAddLineBg": "#eaecef",
|
|
50
|
+
"stagedAddCharFg": "#0f1419",
|
|
51
|
+
"stagedAddCharBg": "#ccd1d7",
|
|
52
|
+
"dashBg": "#f2f4f8",
|
|
53
|
+
"dashTileBg": "#f8fafe",
|
|
54
|
+
"dashRowBg": "#f5f7fb",
|
|
55
|
+
"dashHeadBg": "#ffffff",
|
|
56
|
+
"dashDimHeadBg": "#d5dae1",
|
|
57
|
+
"dashDimTileBg": "#e6eaf0",
|
|
58
|
+
"dashDimRowBg": "#d8dde4",
|
|
59
|
+
"dashHeadMuted": "#3e4652",
|
|
60
|
+
"dashCaptionFg": "#6e7781",
|
|
61
|
+
"dashDelFg": "#d03a44",
|
|
62
|
+
"heatTrack": "#c5cad3",
|
|
63
|
+
"heat1": "#c8e6d4",
|
|
64
|
+
"heat2": "#7dc896",
|
|
65
|
+
"heat3": "#e6b43c",
|
|
66
|
+
"heat4": "#e07868",
|
|
67
|
+
"heatFg": "#1f2328",
|
|
68
|
+
"heatBlink": "#fff3b0",
|
|
69
|
+
"heatBlinkFg": "#1a1608",
|
|
70
|
+
"dashKeyFg": "#000000",
|
|
71
|
+
"taskHeadFg": "#ffffff",
|
|
72
|
+
"taskHeadBg": "#ffffff",
|
|
73
|
+
"searchFg": "#1a1608",
|
|
74
|
+
"searchBg": "#f0c86a",
|
|
75
|
+
"searchOnFg": "#1a1608",
|
|
76
|
+
"searchOnBg": "#ffe14a"
|
|
77
|
+
},
|
|
78
|
+
"code": {
|
|
79
|
+
"keyword": "#af00db",
|
|
80
|
+
"control": "#af00db",
|
|
81
|
+
"storage": "#0000ff",
|
|
82
|
+
"literal": "#0000ff",
|
|
83
|
+
"string": "#a31515",
|
|
84
|
+
"template": "#a31515",
|
|
85
|
+
"escape": "#ee0000",
|
|
86
|
+
"interpolation": "#001080",
|
|
87
|
+
"number": "#098658",
|
|
88
|
+
"comment": "#008000",
|
|
89
|
+
"function": "#795e26",
|
|
90
|
+
"method": "#795e26",
|
|
91
|
+
"className": "#267f99",
|
|
92
|
+
"type": "#267f99",
|
|
93
|
+
"interface": "#267f99",
|
|
94
|
+
"property": "#001080",
|
|
95
|
+
"variable": "#001080",
|
|
96
|
+
"parameter": "#001080",
|
|
97
|
+
"constant": "#0070c1",
|
|
98
|
+
"operator": "#3c3c3c",
|
|
99
|
+
"punct": "#3c3c3c",
|
|
100
|
+
"regex": "#811f3f",
|
|
101
|
+
"decorator": "#795e26",
|
|
102
|
+
"tag": "#800000",
|
|
103
|
+
"attr": "#e50000",
|
|
104
|
+
"plain": "#1f1f1f",
|
|
105
|
+
"punctDim": "#8c8c8c",
|
|
106
|
+
"logDate": "#3c3c46",
|
|
107
|
+
"logError": "#cd3131",
|
|
108
|
+
"logWarn": "#a06e00",
|
|
109
|
+
"logInfo": "#005ab4",
|
|
110
|
+
"logDebug": "#646e7d"
|
|
111
|
+
},
|
|
112
|
+
"logCols": [
|
|
113
|
+
"#3c3c46",
|
|
114
|
+
"#005f96",
|
|
115
|
+
"#6e46aa",
|
|
116
|
+
"#1e783c",
|
|
117
|
+
"#965f14",
|
|
118
|
+
"#aa325a",
|
|
119
|
+
"#147878",
|
|
120
|
+
"#825a32"
|
|
121
|
+
]
|
|
122
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
1100-115f 231a-231b 2329-232a 23e9-23ec 23f0-23f0 23f3-23f3
|
|
2
|
+
25fd-25fe 2614-2615 2630-2637 2648-2653 267f-267f 268a-268f
|
|
3
|
+
2693-2693 26a1-26a1 26aa-26ab 26bd-26be 26c4-26c5 26ce-26ce
|
|
4
|
+
26d4-26d4 26ea-26ea 26f2-26f3 26f5-26f5 26fa-26fa 26fd-26fd
|
|
5
|
+
2705-2705 270a-270b 2728-2728 274c-274c 274e-274e 2753-2755
|
|
6
|
+
2757-2757 2795-2797 27b0-27b0 27bf-27bf 2b1b-2b1c 2b50-2b50
|
|
7
|
+
2b55-2b55 2e80-2e99 2e9b-2ef3 2f00-2fd5 2ff0-303e 3041-3096
|
|
8
|
+
3099-30ff 3105-312f 3131-318e 3190-31e5 31ef-321e 3220-3247
|
|
9
|
+
3250-a48c a490-a4c6 a960-a97c ac00-d7a3 f900-faff fe10-fe19
|
|
10
|
+
fe30-fe52 fe54-fe66 fe68-fe6b ff01-ff60 ffe0-ffe6 16fe0-16fe4
|
|
11
|
+
16ff0-16ff1 17000-187f7 18800-18cd5 18cff-18d08 1aff0-1aff3 1aff5-1affb
|
|
12
|
+
1affd-1affe 1b000-1b122 1b132-1b132 1b150-1b152 1b155-1b155 1b164-1b167
|
|
13
|
+
1b170-1b2fb 1d300-1d356 1d360-1d376 1f004-1f004 1f0cf-1f0cf 1f18e-1f18e
|
|
14
|
+
1f191-1f19a 1f200-1f202 1f210-1f23b 1f240-1f248 1f250-1f251 1f260-1f265
|
|
15
|
+
1f300-1f320 1f32d-1f335 1f337-1f37c 1f37e-1f393 1f3a0-1f3ca 1f3cf-1f3d3
|
|
16
|
+
1f3e0-1f3f0 1f3f4-1f3f4 1f3f8-1f43e 1f440-1f440 1f442-1f4fc 1f4ff-1f53d
|
|
17
|
+
1f54b-1f54e 1f550-1f567 1f57a-1f57a 1f595-1f596 1f5a4-1f5a4 1f5fb-1f64f
|
|
18
|
+
1f680-1f6c5 1f6cc-1f6cc 1f6d0-1f6d2 1f6d5-1f6d7 1f6dc-1f6df 1f6eb-1f6ec
|
|
19
|
+
1f6f4-1f6fc 1f7e0-1f7eb 1f7f0-1f7f0 1f90c-1f93a 1f93c-1f945 1f947-1f9ff
|
|
20
|
+
1fa70-1fa7c 1fa80-1fa89 1fa8f-1fac6 1face-1fadc 1fadf-1fae9 1faf0-1faf8
|
|
21
|
+
20000-2fffd 30000-3fffd
|