pi-one-ui 0.1.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.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/extensions/app/config/renderer.ts +452 -0
  4. package/extensions/app/config/shell.ts +2484 -0
  5. package/extensions/app/ownership.ts +18 -0
  6. package/extensions/app/panel.ts +533 -0
  7. package/extensions/app/presets.ts +36 -0
  8. package/extensions/features/agent-summary/core.ts +194 -0
  9. package/extensions/features/agent-summary/index.ts +37 -0
  10. package/extensions/features/compact-thinking.ts +1262 -0
  11. package/extensions/features/context.ts +857 -0
  12. package/extensions/features/reference/index.ts +643 -0
  13. package/extensions/features/reference/session.ts +278 -0
  14. package/extensions/features/reference/subagent.ts +218 -0
  15. package/extensions/features/shell/aliases.ts +28 -0
  16. package/extensions/features/shell/flush-docked-bash.ts +39 -0
  17. package/extensions/features/shell/startup-header.ts +357 -0
  18. package/extensions/features/shell/working-message.ts +226 -0
  19. package/extensions/index.ts +52 -0
  20. package/extensions/shell/accent-rail-editor.ts +112 -0
  21. package/extensions/shell/accent-rail-layout-patch.ts +530 -0
  22. package/extensions/shell/completion-menu.ts +186 -0
  23. package/extensions/shell/editor-metadata-format.ts +287 -0
  24. package/extensions/shell/editor-transfer.ts +73 -0
  25. package/extensions/shell/extension-status.ts +102 -0
  26. package/extensions/shell/footer-format.ts +388 -0
  27. package/extensions/shell/footer-layout.ts +144 -0
  28. package/extensions/shell/footer.ts +1035 -0
  29. package/extensions/shell/format.ts +577 -0
  30. package/extensions/shell/git.ts +434 -0
  31. package/extensions/shell/icons.ts +261 -0
  32. package/extensions/shell/index.ts +1659 -0
  33. package/extensions/shell/interaction-summary.ts +1194 -0
  34. package/extensions/shell/live-context.ts +82 -0
  35. package/extensions/shell/minimalist-editor.ts +548 -0
  36. package/extensions/shell/package-version.ts +675 -0
  37. package/extensions/shell/project-refresh.ts +130 -0
  38. package/extensions/shell/project-state.ts +60 -0
  39. package/extensions/shell/prototype-patch-registry.ts +183 -0
  40. package/extensions/shell/runtime.ts +915 -0
  41. package/extensions/shell/selector-border.ts +109 -0
  42. package/extensions/shell/session-lifecycle.ts +60 -0
  43. package/extensions/shell/settings-command.ts +2144 -0
  44. package/extensions/shell/settings-previews.ts +137 -0
  45. package/extensions/shell/state.ts +83 -0
  46. package/extensions/shell/style.ts +480 -0
  47. package/extensions/shell/telemetry.ts +90 -0
  48. package/extensions/shell/ui.ts +1326 -0
  49. package/extensions/shell/user-message-osc.ts +279 -0
  50. package/extensions/shell/user-message-styles.ts +266 -0
  51. package/extensions/shell/user-message.ts +226 -0
  52. package/extensions/shell/working-line-messages.ts +24 -0
  53. package/extensions/shell/working-line-spinners.ts +54 -0
  54. package/extensions/shell/working-line.ts +1603 -0
  55. package/extensions/tools/ansi-color.ts +44 -0
  56. package/extensions/tools/ansi-text.ts +52 -0
  57. package/extensions/tools/component-tree.ts +37 -0
  58. package/extensions/tools/format.ts +28 -0
  59. package/extensions/tools/fullscreen-detect.ts +11 -0
  60. package/extensions/tools/patch-keys.ts +158 -0
  61. package/extensions/tools/sgr-mouse.ts +59 -0
  62. package/extensions/tools/tool-loading-icon.ts +20 -0
  63. package/extensions/tools/tool-result-sanitize.ts +27 -0
  64. package/extensions/transcript/index.ts +65 -0
  65. package/extensions/transcript/renderer/compact-mode.ts +1443 -0
  66. package/extensions/transcript/renderer/default-mode.ts +735 -0
  67. package/extensions/transcript/renderer/index.ts +286 -0
  68. package/extensions/transcript/renderer/markdown-enhance.ts +325 -0
  69. package/extensions/transcript/renderer/mouse/hover.ts +175 -0
  70. package/extensions/transcript/renderer/mouse/interaction.ts +1016 -0
  71. package/extensions/transcript/renderer/mouse/layout.ts +207 -0
  72. package/extensions/transcript/renderer/mouse/packets.ts +96 -0
  73. package/extensions/transcript/renderer/mouse/scroll.ts +211 -0
  74. package/extensions/transcript/renderer/tool/diff/ATTRIBUTION.md +28 -0
  75. package/extensions/transcript/renderer/tool/diff/ansi-utils.ts +128 -0
  76. package/extensions/transcript/renderer/tool/diff/diff-component.ts +112 -0
  77. package/extensions/transcript/renderer/tool/diff/diff-edit-render.ts +255 -0
  78. package/extensions/transcript/renderer/tool/diff/diff-header.ts +184 -0
  79. package/extensions/transcript/renderer/tool/diff/diff-highlight.ts +131 -0
  80. package/extensions/transcript/renderer/tool/diff/diff-inline.ts +350 -0
  81. package/extensions/transcript/renderer/tool/diff/diff-layout.ts +870 -0
  82. package/extensions/transcript/renderer/tool/diff/diff-limits.ts +189 -0
  83. package/extensions/transcript/renderer/tool/diff/diff-palette.ts +436 -0
  84. package/extensions/transcript/renderer/tool/diff/diff-parse.ts +536 -0
  85. package/extensions/transcript/renderer/tool/diff/diff-presentation.ts +79 -0
  86. package/extensions/transcript/renderer/tool/diff/diff-renderer.ts +29 -0
  87. package/extensions/transcript/renderer/tool/diff/diff-text.ts +57 -0
  88. package/extensions/transcript/renderer/tool/diff/diff-write-render.ts +629 -0
  89. package/extensions/transcript/renderer/tool/diff/index.ts +147 -0
  90. package/extensions/transcript/renderer/tool/diff/line-width-safety.ts +100 -0
  91. package/extensions/transcript/renderer/tool/diff/shiki-highlight.ts +104 -0
  92. package/extensions/transcript/renderer/tool/diff/write-execution.ts +124 -0
  93. package/extensions/transcript/renderer/tool/grouping.ts +619 -0
  94. package/extensions/transcript/renderer/tool/message-display.ts +183 -0
  95. package/extensions/transcript/renderer/tool/names.ts +195 -0
  96. package/extensions/transcript/renderer/tool/result.ts +842 -0
  97. package/extensions/transcript/renderer/tool/show-more-hint.ts +42 -0
  98. package/extensions/transcript/renderer/transcript-refresh.ts +79 -0
  99. package/package.json +58 -0
  100. package/themes/cc-dark.json +91 -0
  101. package/themes/cc-light.json +91 -0
@@ -0,0 +1,350 @@
1
+ import { normalizeCodeWhitespace } from "./diff-text.ts";
2
+ import type {
3
+ DiffLineEntry,
4
+ DiffMetaEntry,
5
+ ParsedDiffEntry,
6
+ } from "./diff-parse.ts";
7
+
8
+ export interface DiffSpan {
9
+ start: number;
10
+ end: number;
11
+ }
12
+
13
+ export interface SplitDiffRow {
14
+ left?: DiffLineEntry;
15
+ right?: DiffLineEntry;
16
+ meta?: DiffMetaEntry;
17
+ hunkIndex: number | null;
18
+ }
19
+
20
+ const MAX_INLINE_DIFF_LINE_LENGTH = 700;
21
+
22
+ function tokenizeInlineDiff(
23
+ input: string,
24
+ ): Array<{ value: string; start: number; end: number }> {
25
+ if (!input) {
26
+ return [];
27
+ }
28
+
29
+ const tokens: Array<{ value: string; start: number; end: number }> = [];
30
+ const pattern = /(\s+|[A-Za-z0-9_]+|[^A-Za-z0-9_\s])/g;
31
+ let match: RegExpExecArray | null;
32
+
33
+ while ((match = pattern.exec(input)) !== null) {
34
+ const value = match[0] ?? "";
35
+ if (!value) {
36
+ continue;
37
+ }
38
+ tokens.push({
39
+ value,
40
+ start: match.index,
41
+ end: match.index + value.length,
42
+ });
43
+ }
44
+
45
+ if (tokens.length === 0 && input.length > 0) {
46
+ tokens.push({ value: input, start: 0, end: input.length });
47
+ }
48
+
49
+ return tokens;
50
+ }
51
+
52
+ export function mergeSpans(spans: DiffSpan[]): DiffSpan[] {
53
+ if (spans.length <= 1) {
54
+ return spans;
55
+ }
56
+
57
+ const sorted = [...spans].sort((a, b) => a.start - b.start);
58
+ const merged: DiffSpan[] = [sorted[0]];
59
+
60
+ for (let index = 1; index < sorted.length; index++) {
61
+ const current = sorted[index];
62
+ const previous = merged[merged.length - 1];
63
+ if (!current || !previous) {
64
+ continue;
65
+ }
66
+
67
+ if (current.start <= previous.end) {
68
+ previous.end = Math.max(previous.end, current.end);
69
+ continue;
70
+ }
71
+
72
+ merged.push({ ...current });
73
+ }
74
+
75
+ return merged;
76
+ }
77
+
78
+ function tokensToDiffSpans(
79
+ text: string,
80
+ tokens: Array<{ value: string; start: number; end: number }>,
81
+ changedIndexes: Set<number>,
82
+ ): DiffSpan[] {
83
+ if (tokens.length === 0 || changedIndexes.size === 0) {
84
+ return [];
85
+ }
86
+
87
+ const spans: DiffSpan[] = [];
88
+ let start: number | null = null;
89
+ let end = -1;
90
+
91
+ for (let index = 0; index < tokens.length; index++) {
92
+ if (!changedIndexes.has(index)) {
93
+ if (start !== null && end > start) {
94
+ spans.push({ start, end });
95
+ start = null;
96
+ end = -1;
97
+ }
98
+ continue;
99
+ }
100
+
101
+ const token = tokens[index];
102
+ if (!token) {
103
+ continue;
104
+ }
105
+
106
+ if (start === null) {
107
+ start = token.start;
108
+ end = token.end;
109
+ } else {
110
+ end = token.end;
111
+ }
112
+ }
113
+
114
+ if (start !== null && end > start) {
115
+ spans.push({ start, end });
116
+ }
117
+
118
+ const trimmed: DiffSpan[] = [];
119
+ for (const span of spans) {
120
+ let spanStart = span.start;
121
+ let spanEnd = span.end;
122
+
123
+ while (spanStart < spanEnd && /\s/.test(text[spanStart] ?? "")) {
124
+ spanStart++;
125
+ }
126
+ while (spanEnd > spanStart && /\s/.test(text[spanEnd - 1] ?? "")) {
127
+ spanEnd--;
128
+ }
129
+ if (spanEnd > spanStart) {
130
+ trimmed.push({ start: spanStart, end: spanEnd });
131
+ }
132
+ }
133
+
134
+ return mergeSpans(trimmed);
135
+ }
136
+
137
+ function computeInlineDiffSpans(
138
+ leftLine: string,
139
+ rightLine: string,
140
+ ): { left: DiffSpan[]; right: DiffSpan[] } {
141
+ if (leftLine === rightLine) {
142
+ return { left: [], right: [] };
143
+ }
144
+ if (
145
+ leftLine.length > MAX_INLINE_DIFF_LINE_LENGTH ||
146
+ rightLine.length > MAX_INLINE_DIFF_LINE_LENGTH
147
+ ) {
148
+ return { left: [], right: [] };
149
+ }
150
+
151
+ const leftTokens = tokenizeInlineDiff(leftLine);
152
+ const rightTokens = tokenizeInlineDiff(rightLine);
153
+ const leftCount = leftTokens.length;
154
+ const rightCount = rightTokens.length;
155
+
156
+ if (leftCount === 0 || rightCount === 0) {
157
+ return {
158
+ left:
159
+ leftLine.trim().length > 0 ? [{ start: 0, end: leftLine.length }] : [],
160
+ right:
161
+ rightLine.trim().length > 0
162
+ ? [{ start: 0, end: rightLine.length }]
163
+ : [],
164
+ };
165
+ }
166
+
167
+ const table: number[][] = Array.from({ length: leftCount + 1 }, () =>
168
+ Array<number>(rightCount + 1).fill(0),
169
+ );
170
+
171
+ for (let leftIndex = 1; leftIndex <= leftCount; leftIndex++) {
172
+ const leftToken = leftTokens[leftIndex - 1];
173
+ for (let rightIndex = 1; rightIndex <= rightCount; rightIndex++) {
174
+ const rightToken = rightTokens[rightIndex - 1];
175
+ if (leftToken?.value === rightToken?.value) {
176
+ table[leftIndex][rightIndex] =
177
+ (table[leftIndex - 1]?.[rightIndex - 1] ?? 0) + 1;
178
+ } else {
179
+ const top = table[leftIndex - 1]?.[rightIndex] ?? 0;
180
+ const side = table[leftIndex]?.[rightIndex - 1] ?? 0;
181
+ table[leftIndex][rightIndex] = Math.max(top, side);
182
+ }
183
+ }
184
+ }
185
+
186
+ const changedLeft = new Set<number>();
187
+ const changedRight = new Set<number>();
188
+ let leftCursor = leftCount;
189
+ let rightCursor = rightCount;
190
+
191
+ while (leftCursor > 0 && rightCursor > 0) {
192
+ const leftToken = leftTokens[leftCursor - 1];
193
+ const rightToken = rightTokens[rightCursor - 1];
194
+ if (leftToken?.value === rightToken?.value) {
195
+ leftCursor--;
196
+ rightCursor--;
197
+ continue;
198
+ }
199
+
200
+ const top = table[leftCursor - 1]?.[rightCursor] ?? 0;
201
+ const side = table[leftCursor]?.[rightCursor - 1] ?? 0;
202
+ if (top >= side) {
203
+ changedLeft.add(leftCursor - 1);
204
+ leftCursor--;
205
+ } else {
206
+ changedRight.add(rightCursor - 1);
207
+ rightCursor--;
208
+ }
209
+ }
210
+
211
+ while (leftCursor > 0) {
212
+ changedLeft.add(leftCursor - 1);
213
+ leftCursor--;
214
+ }
215
+ while (rightCursor > 0) {
216
+ changedRight.add(rightCursor - 1);
217
+ rightCursor--;
218
+ }
219
+
220
+ return {
221
+ left: tokensToDiffSpans(leftLine, leftTokens, changedLeft),
222
+ right: tokensToDiffSpans(rightLine, rightTokens, changedRight),
223
+ };
224
+ }
225
+
226
+ function collectConsecutiveLineEntries(
227
+ entries: ParsedDiffEntry[],
228
+ startIndex: number,
229
+ lineKind: DiffLineEntry["lineKind"],
230
+ ): { collected: DiffLineEntry[]; nextIndex: number } {
231
+ const collected: DiffLineEntry[] = [];
232
+ let index = startIndex;
233
+ while (index < entries.length) {
234
+ const candidate = entries[index];
235
+ if (
236
+ !candidate ||
237
+ candidate.kind !== "line" ||
238
+ candidate.lineKind !== lineKind
239
+ ) {
240
+ break;
241
+ }
242
+ collected.push(candidate);
243
+ index++;
244
+ }
245
+ return { collected, nextIndex: index };
246
+ }
247
+
248
+ export function buildSplitRows(entries: ParsedDiffEntry[]): SplitDiffRow[] {
249
+ const rows: SplitDiffRow[] = [];
250
+ let index = 0;
251
+
252
+ while (index < entries.length) {
253
+ const entry = entries[index];
254
+ if (!entry) {
255
+ break;
256
+ }
257
+
258
+ if (entry.kind !== "line") {
259
+ rows.push({ meta: entry, hunkIndex: entry.hunkIndex || null });
260
+ index++;
261
+ continue;
262
+ }
263
+
264
+ if (entry.lineKind === "remove") {
265
+ const removedResult = collectConsecutiveLineEntries(
266
+ entries,
267
+ index,
268
+ "remove",
269
+ );
270
+ const removed = removedResult.collected;
271
+ const addedResult = collectConsecutiveLineEntries(
272
+ entries,
273
+ removedResult.nextIndex,
274
+ "add",
275
+ );
276
+ const added = addedResult.collected;
277
+ index = addedResult.nextIndex;
278
+
279
+ const pairCount = Math.max(removed.length, added.length);
280
+ for (let pairIndex = 0; pairIndex < pairCount; pairIndex++) {
281
+ const left = removed[pairIndex];
282
+ const right = added[pairIndex];
283
+ rows.push({
284
+ left,
285
+ right,
286
+ hunkIndex: left?.hunkIndex ?? right?.hunkIndex ?? null,
287
+ });
288
+ }
289
+ continue;
290
+ }
291
+
292
+ if (entry.lineKind === "add") {
293
+ rows.push({ right: entry, hunkIndex: entry.hunkIndex || null });
294
+ index++;
295
+ continue;
296
+ }
297
+
298
+ rows.push({
299
+ left: entry,
300
+ right: entry,
301
+ hunkIndex: entry.hunkIndex || null,
302
+ });
303
+ index++;
304
+ }
305
+
306
+ return rows;
307
+ }
308
+
309
+ export function getCellLineNumber(
310
+ line: DiffLineEntry,
311
+ side: "left" | "right",
312
+ ): number | null {
313
+ if (side === "left") {
314
+ return (
315
+ line.oldLineNumber ??
316
+ (line.lineKind === "context" ? line.newLineNumber : null)
317
+ );
318
+ }
319
+ return (
320
+ line.newLineNumber ??
321
+ (line.lineKind === "context" ? line.oldLineNumber : null)
322
+ );
323
+ }
324
+
325
+ export function buildInlineHighlightMap(
326
+ rows: SplitDiffRow[],
327
+ ): WeakMap<DiffLineEntry, DiffSpan[]> {
328
+ const highlights = new WeakMap<DiffLineEntry, DiffSpan[]>();
329
+
330
+ for (const row of rows) {
331
+ if (!row.left || !row.right) {
332
+ continue;
333
+ }
334
+ if (row.left.lineKind !== "remove" || row.right.lineKind !== "add") {
335
+ continue;
336
+ }
337
+
338
+ const leftText = normalizeCodeWhitespace(row.left.content);
339
+ const rightText = normalizeCodeWhitespace(row.right.content);
340
+ const inline = computeInlineDiffSpans(leftText, rightText);
341
+ if (inline.left.length > 0) {
342
+ highlights.set(row.left, inline.left);
343
+ }
344
+ if (inline.right.length > 0) {
345
+ highlights.set(row.right, inline.right);
346
+ }
347
+ }
348
+
349
+ return highlights;
350
+ }