attocode 0.1.4 → 0.1.6
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 +36 -1
- package/dist/src/agent.d.ts +40 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +492 -37
- package/dist/src/agent.js.map +1 -1
- package/dist/src/core/index.d.ts +1 -6
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +4 -7
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/defaults.d.ts +1 -1
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.js +8 -1
- package/dist/src/integrations/agent-registry.js.map +1 -1
- package/dist/src/integrations/codebase-context.d.ts +163 -0
- package/dist/src/integrations/codebase-context.d.ts.map +1 -1
- package/dist/src/integrations/codebase-context.js +462 -0
- package/dist/src/integrations/codebase-context.js.map +1 -1
- package/dist/src/integrations/economics.d.ts +94 -2
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +265 -12
- package/dist/src/integrations/economics.js.map +1 -1
- package/dist/src/integrations/file-change-tracker.d.ts +1 -0
- package/dist/src/integrations/file-change-tracker.d.ts.map +1 -1
- package/dist/src/integrations/file-change-tracker.js +30 -12
- package/dist/src/integrations/file-change-tracker.js.map +1 -1
- package/dist/src/integrations/graph-visualization.d.ts +72 -0
- package/dist/src/integrations/graph-visualization.d.ts.map +1 -0
- package/dist/src/integrations/graph-visualization.js +383 -0
- package/dist/src/integrations/graph-visualization.js.map +1 -0
- package/dist/src/integrations/index.d.ts +2 -1
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +2 -0
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/memory.d.ts +8 -0
- package/dist/src/integrations/memory.d.ts.map +1 -1
- package/dist/src/integrations/memory.js +23 -0
- package/dist/src/integrations/memory.js.map +1 -1
- package/dist/src/integrations/pending-plan.d.ts +26 -1
- package/dist/src/integrations/pending-plan.d.ts.map +1 -1
- package/dist/src/integrations/pending-plan.js +131 -3
- package/dist/src/integrations/pending-plan.js.map +1 -1
- package/dist/src/integrations/planning.d.ts +19 -0
- package/dist/src/integrations/planning.d.ts.map +1 -1
- package/dist/src/integrations/planning.js +78 -4
- package/dist/src/integrations/planning.js.map +1 -1
- package/dist/src/integrations/safety.d.ts +4 -0
- package/dist/src/integrations/safety.d.ts.map +1 -1
- package/dist/src/integrations/safety.js +46 -7
- package/dist/src/integrations/safety.js.map +1 -1
- package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
- package/dist/src/integrations/sqlite-store.js +7 -1
- package/dist/src/integrations/sqlite-store.js.map +1 -1
- package/dist/src/main.js +0 -0
- package/dist/src/modes.d.ts +7 -0
- package/dist/src/modes.d.ts.map +1 -1
- package/dist/src/modes.js +69 -2
- package/dist/src/modes.js.map +1 -1
- package/dist/src/providers/llm-resilience.d.ts +8 -0
- package/dist/src/providers/llm-resilience.d.ts.map +1 -1
- package/dist/src/providers/llm-resilience.js +36 -0
- package/dist/src/providers/llm-resilience.js.map +1 -1
- package/dist/src/tools/agent.d.ts +20 -0
- package/dist/src/tools/agent.d.ts.map +1 -1
- package/dist/src/tools/agent.js +114 -0
- package/dist/src/tools/agent.js.map +1 -1
- package/dist/src/tools/file.d.ts.map +1 -1
- package/dist/src/tools/file.js +17 -3
- package/dist/src/tools/file.js.map +1 -1
- package/dist/src/tracing/trace-collector.d.ts +11 -1
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +92 -12
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +6 -0
- package/dist/src/tracing/types.d.ts.map +1 -1
- package/dist/src/tracing/types.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +244 -66
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/components/CollapsibleDiffView.d.ts +49 -0
- package/dist/src/tui/components/CollapsibleDiffView.d.ts.map +1 -0
- package/dist/src/tui/components/CollapsibleDiffView.js +302 -0
- package/dist/src/tui/components/CollapsibleDiffView.js.map +1 -0
- package/dist/src/tui/components/DiffView.d.ts +55 -0
- package/dist/src/tui/components/DiffView.d.ts.map +1 -0
- package/dist/src/tui/components/DiffView.js +356 -0
- package/dist/src/tui/components/DiffView.js.map +1 -0
- package/dist/src/tui/components/FileChangeSummary.d.ts +48 -0
- package/dist/src/tui/components/FileChangeSummary.d.ts.map +1 -0
- package/dist/src/tui/components/FileChangeSummary.js +152 -0
- package/dist/src/tui/components/FileChangeSummary.js.map +1 -0
- package/dist/src/tui/components/SideBySideDiff.d.ts +62 -0
- package/dist/src/tui/components/SideBySideDiff.d.ts.map +1 -0
- package/dist/src/tui/components/SideBySideDiff.js +320 -0
- package/dist/src/tui/components/SideBySideDiff.js.map +1 -0
- package/dist/src/tui/components/SyntaxText.d.ts +47 -0
- package/dist/src/tui/components/SyntaxText.d.ts.map +1 -0
- package/dist/src/tui/components/SyntaxText.js +43 -0
- package/dist/src/tui/components/SyntaxText.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +5 -0
- package/dist/src/tui/components/index.d.ts.map +1 -1
- package/dist/src/tui/components/index.js +7 -0
- package/dist/src/tui/components/index.js.map +1 -1
- package/dist/src/tui/syntax/index.d.ts +12 -0
- package/dist/src/tui/syntax/index.d.ts.map +1 -0
- package/dist/src/tui/syntax/index.js +14 -0
- package/dist/src/tui/syntax/index.js.map +1 -0
- package/dist/src/tui/syntax/languages/bash.d.ts +8 -0
- package/dist/src/tui/syntax/languages/bash.d.ts.map +1 -0
- package/dist/src/tui/syntax/languages/bash.js +296 -0
- package/dist/src/tui/syntax/languages/bash.js.map +1 -0
- package/dist/src/tui/syntax/languages/javascript.d.ts +8 -0
- package/dist/src/tui/syntax/languages/javascript.d.ts.map +1 -0
- package/dist/src/tui/syntax/languages/javascript.js +253 -0
- package/dist/src/tui/syntax/languages/javascript.js.map +1 -0
- package/dist/src/tui/syntax/languages/json.d.ts +8 -0
- package/dist/src/tui/syntax/languages/json.d.ts.map +1 -0
- package/dist/src/tui/syntax/languages/json.js +112 -0
- package/dist/src/tui/syntax/languages/json.js.map +1 -0
- package/dist/src/tui/syntax/languages/python.d.ts +8 -0
- package/dist/src/tui/syntax/languages/python.d.ts.map +1 -0
- package/dist/src/tui/syntax/languages/python.js +232 -0
- package/dist/src/tui/syntax/languages/python.js.map +1 -0
- package/dist/src/tui/syntax/lexer.d.ts +51 -0
- package/dist/src/tui/syntax/lexer.d.ts.map +1 -0
- package/dist/src/tui/syntax/lexer.js +131 -0
- package/dist/src/tui/syntax/lexer.js.map +1 -0
- package/dist/src/types.d.ts +56 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* DiffView Component
|
|
4
|
+
*
|
|
5
|
+
* Displays unified diff with color coding for additions/deletions.
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Collapsed summary (+N/-M) or expanded full diff
|
|
8
|
+
* - Line numbers (optional)
|
|
9
|
+
* - Word-level diff highlighting within modified lines
|
|
10
|
+
* - Parsed UnifiedDiff format for structured rendering
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* // Simple string diff
|
|
15
|
+
* <DiffView diff={diffString} expanded={true} />
|
|
16
|
+
*
|
|
17
|
+
* // With line numbers
|
|
18
|
+
* <DiffView diff={diffString} expanded={true} showLineNumbers={true} />
|
|
19
|
+
*
|
|
20
|
+
* // With word-level highlighting (shows exactly what changed within lines)
|
|
21
|
+
* <DiffView parsedDiff={parsed} expanded={true} showWordDiff={true} />
|
|
22
|
+
*
|
|
23
|
+
* // Full featured: line numbers + word diff
|
|
24
|
+
* const parsed = parseUnifiedDiff(diffString);
|
|
25
|
+
* <DiffView parsedDiff={parsed[0]} expanded={true} showLineNumbers={true} showWordDiff={true} />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import { memo, useMemo } from 'react';
|
|
29
|
+
import { Box, Text } from 'ink';
|
|
30
|
+
import { diffWords } from 'diff';
|
|
31
|
+
import { tokenize, detectLanguage, getTokenColor } from '../syntax/index.js';
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// COLORS
|
|
34
|
+
// =============================================================================
|
|
35
|
+
const COLORS = {
|
|
36
|
+
addition: '#98FB98', // Green for additions
|
|
37
|
+
deletion: '#FF6B6B', // Red for deletions
|
|
38
|
+
context: '#666666', // Gray for context
|
|
39
|
+
hunkHeader: '#87CEEB', // Cyan for @@ lines
|
|
40
|
+
fileHeader: '#DDA0DD', // Purple for --- +++ lines
|
|
41
|
+
lineNumber: '#555555', // Dim for line numbers
|
|
42
|
+
};
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// HELPER FUNCTIONS
|
|
45
|
+
// =============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Parse diff statistics from a unified diff string.
|
|
48
|
+
*/
|
|
49
|
+
function parseDiffStats(diff) {
|
|
50
|
+
const lines = diff.split('\n');
|
|
51
|
+
let additions = 0;
|
|
52
|
+
let deletions = 0;
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
55
|
+
additions++;
|
|
56
|
+
}
|
|
57
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
58
|
+
deletions++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { additions, deletions };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get stats from a parsed diff.
|
|
65
|
+
*/
|
|
66
|
+
function getParsedDiffStats(diff) {
|
|
67
|
+
let additions = 0;
|
|
68
|
+
let deletions = 0;
|
|
69
|
+
for (const hunk of diff.hunks) {
|
|
70
|
+
for (const line of hunk.lines) {
|
|
71
|
+
if (line.type === 'add')
|
|
72
|
+
additions++;
|
|
73
|
+
else if (line.type === 'remove')
|
|
74
|
+
deletions++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { additions, deletions };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get color for a diff line based on its prefix.
|
|
81
|
+
*/
|
|
82
|
+
function getDiffLineColor(line) {
|
|
83
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
84
|
+
return COLORS.addition;
|
|
85
|
+
}
|
|
86
|
+
if (line.startsWith('-') && !line.startsWith('---')) {
|
|
87
|
+
return COLORS.deletion;
|
|
88
|
+
}
|
|
89
|
+
if (line.startsWith('@@')) {
|
|
90
|
+
return COLORS.hunkHeader;
|
|
91
|
+
}
|
|
92
|
+
if (line.startsWith('---') || line.startsWith('+++')) {
|
|
93
|
+
return COLORS.fileHeader;
|
|
94
|
+
}
|
|
95
|
+
return COLORS.context;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get color for a DiffLine type.
|
|
99
|
+
*/
|
|
100
|
+
function getLineTypeColor(type) {
|
|
101
|
+
switch (type) {
|
|
102
|
+
case 'add': return COLORS.addition;
|
|
103
|
+
case 'remove': return COLORS.deletion;
|
|
104
|
+
default: return COLORS.context;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get prefix character for a DiffLine type.
|
|
109
|
+
*/
|
|
110
|
+
function getLinePrefix(type) {
|
|
111
|
+
switch (type) {
|
|
112
|
+
case 'add': return '+';
|
|
113
|
+
case 'remove': return '-';
|
|
114
|
+
default: return ' ';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Pair up adjacent removed and added lines for word-level diffing.
|
|
119
|
+
* Returns Map<lineIndex, pairedLineContent> for lines that should show word diffs.
|
|
120
|
+
*/
|
|
121
|
+
function findLinePairs(lines) {
|
|
122
|
+
const pairs = new Map();
|
|
123
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
124
|
+
const current = lines[i];
|
|
125
|
+
const next = lines[i + 1];
|
|
126
|
+
// If we have a remove followed by an add, they're likely a modification
|
|
127
|
+
if (current.type === 'remove' && next.type === 'add') {
|
|
128
|
+
pairs.set(i, next.content); // removed line paired with added content
|
|
129
|
+
pairs.set(i + 1, current.content); // added line paired with removed content
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return pairs;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Render word-level diff between old and new content.
|
|
136
|
+
*/
|
|
137
|
+
function renderWordDiff(oldContent, newContent, lineType) {
|
|
138
|
+
const changes = diffWords(oldContent, newContent);
|
|
139
|
+
return changes.map((change, i) => {
|
|
140
|
+
// For a removed line, highlight what was removed
|
|
141
|
+
// For an added line, highlight what was added
|
|
142
|
+
if (lineType === 'remove') {
|
|
143
|
+
if (change.removed) {
|
|
144
|
+
// This part was removed - highlight it strongly
|
|
145
|
+
return (_jsx(Text, { color: COLORS.deletion, bold: true, inverse: true, children: change.value }, i));
|
|
146
|
+
}
|
|
147
|
+
else if (change.added) {
|
|
148
|
+
// This part was added in the new version - don't show on removed line
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
// Unchanged part
|
|
152
|
+
return _jsx(Text, { color: COLORS.deletion, children: change.value }, i);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// lineType === 'add'
|
|
156
|
+
if (change.added) {
|
|
157
|
+
// This part was added - highlight it strongly
|
|
158
|
+
return (_jsx(Text, { color: COLORS.addition, bold: true, inverse: true, children: change.value }, i));
|
|
159
|
+
}
|
|
160
|
+
else if (change.removed) {
|
|
161
|
+
// This part was in the old version - don't show on added line
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
// Unchanged part
|
|
165
|
+
return _jsx(Text, { color: COLORS.addition, children: change.value }, i);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Render content with syntax highlighting.
|
|
171
|
+
*/
|
|
172
|
+
function renderSyntaxHighlight(content, theme, language, baseColor) {
|
|
173
|
+
if (!language) {
|
|
174
|
+
return _jsx(Text, { color: baseColor, children: content });
|
|
175
|
+
}
|
|
176
|
+
const tokens = tokenize(content, language);
|
|
177
|
+
return tokens.map((token, i) => (_jsx(Text, { color: getTokenColor(token.type, theme), children: token.content }, i)));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Render word-level diff with syntax highlighting.
|
|
181
|
+
* Combines word-diff highlighting with syntax colors.
|
|
182
|
+
*/
|
|
183
|
+
function renderWordDiffWithSyntax(oldContent, newContent, lineType, theme, language) {
|
|
184
|
+
const changes = diffWords(oldContent, newContent);
|
|
185
|
+
const elements = [];
|
|
186
|
+
let keyIndex = 0;
|
|
187
|
+
for (const change of changes) {
|
|
188
|
+
if (lineType === 'remove') {
|
|
189
|
+
if (change.removed) {
|
|
190
|
+
// Removed content - use inverse highlighting
|
|
191
|
+
elements.push(_jsx(Text, { color: COLORS.deletion, bold: true, inverse: true, children: change.value }, keyIndex++));
|
|
192
|
+
}
|
|
193
|
+
else if (change.added) {
|
|
194
|
+
// Skip added content on removed line
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Unchanged - apply syntax highlighting
|
|
199
|
+
if (language) {
|
|
200
|
+
const tokens = tokenize(change.value, language);
|
|
201
|
+
for (const token of tokens) {
|
|
202
|
+
elements.push(_jsx(Text, { color: getTokenColor(token.type, theme), children: token.content }, keyIndex++));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
elements.push(_jsx(Text, { color: COLORS.deletion, children: change.value }, keyIndex++));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// lineType === 'add'
|
|
212
|
+
if (change.added) {
|
|
213
|
+
// Added content - use inverse highlighting
|
|
214
|
+
elements.push(_jsx(Text, { color: COLORS.addition, bold: true, inverse: true, children: change.value }, keyIndex++));
|
|
215
|
+
}
|
|
216
|
+
else if (change.removed) {
|
|
217
|
+
// Skip removed content on added line
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// Unchanged - apply syntax highlighting
|
|
222
|
+
if (language) {
|
|
223
|
+
const tokens = tokenize(change.value, language);
|
|
224
|
+
for (const token of tokens) {
|
|
225
|
+
elements.push(_jsx(Text, { color: getTokenColor(token.type, theme), children: token.content }, keyIndex++));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
elements.push(_jsx(Text, { color: COLORS.addition, children: change.value }, keyIndex++));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return _jsx(_Fragment, { children: elements });
|
|
235
|
+
}
|
|
236
|
+
// =============================================================================
|
|
237
|
+
// SUB-COMPONENTS
|
|
238
|
+
// =============================================================================
|
|
239
|
+
/**
|
|
240
|
+
* Render diff summary (collapsed view).
|
|
241
|
+
*/
|
|
242
|
+
const DiffSummary = memo(function DiffSummary({ additions, deletions, }) {
|
|
243
|
+
return (_jsxs(Text, { children: [_jsxs(Text, { color: COLORS.addition, children: ["+", additions] }), _jsx(Text, { color: COLORS.context, children: "/" }), _jsxs(Text, { color: COLORS.deletion, children: ["-", deletions] })] }));
|
|
244
|
+
});
|
|
245
|
+
/**
|
|
246
|
+
* Render a single diff line with optional line numbers and word-level highlighting.
|
|
247
|
+
*/
|
|
248
|
+
const DiffLineView = memo(function DiffLineView({ line, showLineNumbers, lineNumberWidth = 4, pairedContent, showWordDiff, syntaxHighlight, theme, language, }) {
|
|
249
|
+
const color = getLineTypeColor(line.type);
|
|
250
|
+
const prefix = getLinePrefix(line.type);
|
|
251
|
+
// Determine if we should render word-level diff
|
|
252
|
+
const useWordDiff = showWordDiff && pairedContent !== undefined &&
|
|
253
|
+
(line.type === 'add' || line.type === 'remove');
|
|
254
|
+
// Determine if we should use syntax highlighting
|
|
255
|
+
const useSyntax = syntaxHighlight && theme && language;
|
|
256
|
+
// Render the content
|
|
257
|
+
let contentNode;
|
|
258
|
+
if (useWordDiff && useSyntax) {
|
|
259
|
+
// Word diff with syntax highlighting
|
|
260
|
+
contentNode = (_jsxs(Text, { children: [_jsx(Text, { color: color, children: prefix }), renderWordDiffWithSyntax(line.type === 'remove' ? line.content : pairedContent, line.type === 'add' ? line.content : pairedContent, line.type, theme, language)] }));
|
|
261
|
+
}
|
|
262
|
+
else if (useWordDiff) {
|
|
263
|
+
// Word diff without syntax
|
|
264
|
+
contentNode = (_jsxs(Text, { children: [_jsx(Text, { color: color, children: prefix }), renderWordDiff(line.type === 'remove' ? line.content : pairedContent, line.type === 'add' ? line.content : pairedContent, line.type)] }));
|
|
265
|
+
}
|
|
266
|
+
else if (useSyntax) {
|
|
267
|
+
// Syntax highlighting without word diff
|
|
268
|
+
contentNode = (_jsxs(Text, { children: [_jsx(Text, { color: color, children: prefix }), renderSyntaxHighlight(line.content, theme, language, color)] }));
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Plain text
|
|
272
|
+
contentNode = _jsxs(Text, { color: color, children: [prefix, line.content] });
|
|
273
|
+
}
|
|
274
|
+
if (showLineNumbers) {
|
|
275
|
+
const oldNum = line.oldLineNumber?.toString().padStart(lineNumberWidth) ?? ' '.repeat(lineNumberWidth);
|
|
276
|
+
const newNum = line.newLineNumber?.toString().padStart(lineNumberWidth) ?? ' '.repeat(lineNumberWidth);
|
|
277
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: COLORS.lineNumber, dimColor: true, children: oldNum }), _jsx(Text, { children: " " }), _jsx(Text, { color: COLORS.lineNumber, dimColor: true, children: newNum }), _jsx(Text, { children: " " }), contentNode] }));
|
|
278
|
+
}
|
|
279
|
+
return contentNode;
|
|
280
|
+
});
|
|
281
|
+
/**
|
|
282
|
+
* Render a hunk header (@@...@@).
|
|
283
|
+
*/
|
|
284
|
+
const HunkHeaderView = memo(function HunkHeaderView({ hunk, showLineNumbers, lineNumberWidth = 4, }) {
|
|
285
|
+
const header = `@@ -${hunk.oldStart},${hunk.oldCount} +${hunk.newStart},${hunk.newCount} @@`;
|
|
286
|
+
const gutterWidth = showLineNumbers ? (lineNumberWidth * 2 + 2) : 0;
|
|
287
|
+
return (_jsxs(Box, { children: [showLineNumbers && _jsx(Text, { color: COLORS.lineNumber, children: ' '.repeat(gutterWidth) }), _jsx(Text, { color: COLORS.hunkHeader, children: header })] }));
|
|
288
|
+
});
|
|
289
|
+
/**
|
|
290
|
+
* Render a single hunk.
|
|
291
|
+
*/
|
|
292
|
+
const HunkView = memo(function HunkView({ hunk, showLineNumbers, lineNumberWidth, maxLines, showWordDiff, syntaxHighlight, theme, language, }) {
|
|
293
|
+
const linesToShow = maxLines ? hunk.lines.slice(0, maxLines) : hunk.lines;
|
|
294
|
+
const hasMore = maxLines && hunk.lines.length > maxLines;
|
|
295
|
+
// Pre-compute line pairs for word-level diffing
|
|
296
|
+
const linePairs = useMemo(() => {
|
|
297
|
+
if (!showWordDiff)
|
|
298
|
+
return new Map();
|
|
299
|
+
return findLinePairs(linesToShow);
|
|
300
|
+
}, [showWordDiff, linesToShow]);
|
|
301
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(HunkHeaderView, { hunk: hunk, showLineNumbers: showLineNumbers, lineNumberWidth: lineNumberWidth }), linesToShow.map((line, i) => (_jsx(DiffLineView, { line: line, showLineNumbers: showLineNumbers, lineNumberWidth: lineNumberWidth, pairedContent: linePairs.get(i), showWordDiff: showWordDiff, syntaxHighlight: syntaxHighlight, theme: theme, language: language }, i))), hasMore && (_jsxs(Text, { color: COLORS.context, dimColor: true, children: ["... (", hunk.lines.length - (maxLines ?? 0), " more lines in hunk)"] }))] }));
|
|
302
|
+
});
|
|
303
|
+
// =============================================================================
|
|
304
|
+
// MAIN COMPONENT
|
|
305
|
+
// =============================================================================
|
|
306
|
+
export const DiffView = memo(function DiffView({ diff, parsedDiff, expanded, maxLines = 50, showLineNumbers = false, lineNumberWidth = 4, showWordDiff = false, syntaxHighlight = false, theme, filePath, }) {
|
|
307
|
+
// Use parsed diff if provided, otherwise fall back to string diff
|
|
308
|
+
const hasParsedDiff = parsedDiff !== undefined;
|
|
309
|
+
const hasStringDiff = diff !== undefined && diff.trim().length > 0;
|
|
310
|
+
// Detect language for syntax highlighting
|
|
311
|
+
const detectedLanguage = useMemo(() => {
|
|
312
|
+
if (!syntaxHighlight)
|
|
313
|
+
return null;
|
|
314
|
+
// Try to detect from filePath prop first
|
|
315
|
+
if (filePath) {
|
|
316
|
+
return detectLanguage(filePath);
|
|
317
|
+
}
|
|
318
|
+
// Fall back to parsed diff paths
|
|
319
|
+
if (hasParsedDiff) {
|
|
320
|
+
const path = parsedDiff.newPath || parsedDiff.oldPath;
|
|
321
|
+
if (path)
|
|
322
|
+
return detectLanguage(path);
|
|
323
|
+
}
|
|
324
|
+
return null;
|
|
325
|
+
}, [syntaxHighlight, filePath, hasParsedDiff, parsedDiff]);
|
|
326
|
+
// Compute stats
|
|
327
|
+
const stats = useMemo(() => {
|
|
328
|
+
if (hasParsedDiff) {
|
|
329
|
+
return getParsedDiffStats(parsedDiff);
|
|
330
|
+
}
|
|
331
|
+
if (hasStringDiff) {
|
|
332
|
+
return parseDiffStats(diff);
|
|
333
|
+
}
|
|
334
|
+
return { additions: 0, deletions: 0 };
|
|
335
|
+
}, [diff, parsedDiff, hasParsedDiff, hasStringDiff]);
|
|
336
|
+
// No content
|
|
337
|
+
if (!hasParsedDiff && !hasStringDiff) {
|
|
338
|
+
return _jsx(Text, { color: COLORS.context, dimColor: true, children: "No changes" });
|
|
339
|
+
}
|
|
340
|
+
// Collapsed view: just show +N/-M summary
|
|
341
|
+
if (!expanded) {
|
|
342
|
+
return _jsx(DiffSummary, { additions: stats.additions, deletions: stats.deletions });
|
|
343
|
+
}
|
|
344
|
+
// Expanded view with parsed diff (structured rendering)
|
|
345
|
+
if (hasParsedDiff) {
|
|
346
|
+
const linesPerHunk = maxLines ? Math.ceil(maxLines / Math.max(parsedDiff.hunks.length, 1)) : undefined;
|
|
347
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: COLORS.fileHeader, bold: true, children: [parsedDiff.isNewFile ? 'New: ' : parsedDiff.isDeletedFile ? 'Deleted: ' : 'Modified: ', parsedDiff.newPath] }), _jsx(DiffSummary, { additions: stats.additions, deletions: stats.deletions })] }), _jsx(Box, { flexDirection: "column", marginLeft: 1, marginTop: 1, children: parsedDiff.hunks.map((hunk, i) => (_jsx(HunkView, { hunk: hunk, showLineNumbers: showLineNumbers, lineNumberWidth: lineNumberWidth, maxLines: linesPerHunk, showWordDiff: showWordDiff, syntaxHighlight: syntaxHighlight, theme: theme, language: detectedLanguage }, i))) })] }));
|
|
348
|
+
}
|
|
349
|
+
// Expanded view with string diff (legacy rendering)
|
|
350
|
+
const lines = diff.split('\n');
|
|
351
|
+
const displayLines = lines.slice(0, maxLines);
|
|
352
|
+
const hasMore = lines.length > maxLines;
|
|
353
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: COLORS.fileHeader, bold: true, children: "Diff:" }), _jsx(DiffSummary, { additions: stats.additions, deletions: stats.deletions })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, marginTop: 1, children: [displayLines.map((line, i) => (_jsx(Text, { color: getDiffLineColor(line), children: line || ' ' }, i))), hasMore && (_jsxs(Text, { color: COLORS.context, dimColor: true, children: ["... (", lines.length - maxLines, " more lines)"] }))] })] }));
|
|
354
|
+
});
|
|
355
|
+
export default DiffView;
|
|
356
|
+
//# sourceMappingURL=DiffView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffView.js","sourceRoot":"","sources":["../../../../src/tui/components/DiffView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileChangeSummary Component
|
|
3
|
+
*
|
|
4
|
+
* Displays a summary of all files changed during a session.
|
|
5
|
+
* Shows total additions/deletions and per-file breakdown.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Collapsed mode: Just totals
|
|
9
|
+
* - Expanded mode: Full file list with stats
|
|
10
|
+
* - Visual indicators for new vs modified files
|
|
11
|
+
* - Sortable by various criteria
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <FileChangeSummary
|
|
16
|
+
* changes={[
|
|
17
|
+
* { path: 'src/index.ts', additions: 10, deletions: 5, type: 'modify' },
|
|
18
|
+
* { path: 'src/new.ts', additions: 50, deletions: 0, type: 'create' },
|
|
19
|
+
* ]}
|
|
20
|
+
* expanded={true}
|
|
21
|
+
* />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export interface FileChange {
|
|
25
|
+
/** File path (relative to project root) */
|
|
26
|
+
path: string;
|
|
27
|
+
/** Number of lines added */
|
|
28
|
+
additions: number;
|
|
29
|
+
/** Number of lines deleted */
|
|
30
|
+
deletions: number;
|
|
31
|
+
/** Type of change */
|
|
32
|
+
type: 'create' | 'modify' | 'delete' | 'rename';
|
|
33
|
+
/** For renames, the original path */
|
|
34
|
+
oldPath?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface FileChangeSummaryProps {
|
|
37
|
+
/** List of file changes */
|
|
38
|
+
changes: FileChange[];
|
|
39
|
+
/** Whether to show expanded view with per-file details */
|
|
40
|
+
expanded?: boolean;
|
|
41
|
+
/** Sort order for file list */
|
|
42
|
+
sortBy?: 'path' | 'additions' | 'deletions' | 'total';
|
|
43
|
+
/** Maximum files to show in expanded view */
|
|
44
|
+
maxFiles?: number;
|
|
45
|
+
}
|
|
46
|
+
export declare const FileChangeSummary: import("react").NamedExoticComponent<FileChangeSummaryProps>;
|
|
47
|
+
export default FileChangeSummary;
|
|
48
|
+
//# sourceMappingURL=FileChangeSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileChangeSummary.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/FileChangeSummary.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAChD,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoJD,eAAO,MAAM,iBAAiB,8DA6G5B,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* FileChangeSummary Component
|
|
4
|
+
*
|
|
5
|
+
* Displays a summary of all files changed during a session.
|
|
6
|
+
* Shows total additions/deletions and per-file breakdown.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Collapsed mode: Just totals
|
|
10
|
+
* - Expanded mode: Full file list with stats
|
|
11
|
+
* - Visual indicators for new vs modified files
|
|
12
|
+
* - Sortable by various criteria
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <FileChangeSummary
|
|
17
|
+
* changes={[
|
|
18
|
+
* { path: 'src/index.ts', additions: 10, deletions: 5, type: 'modify' },
|
|
19
|
+
* { path: 'src/new.ts', additions: 50, deletions: 0, type: 'create' },
|
|
20
|
+
* ]}
|
|
21
|
+
* expanded={true}
|
|
22
|
+
* />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { memo, useMemo } from 'react';
|
|
26
|
+
import { Box, Text } from 'ink';
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// COLORS
|
|
29
|
+
// =============================================================================
|
|
30
|
+
const COLORS = {
|
|
31
|
+
addition: '#98FB98',
|
|
32
|
+
deletion: '#FF6B6B',
|
|
33
|
+
create: '#87CEEB',
|
|
34
|
+
modify: '#DDA0DD',
|
|
35
|
+
delete: '#FF6B6B',
|
|
36
|
+
rename: '#FFD700',
|
|
37
|
+
border: '#444444',
|
|
38
|
+
muted: '#666666',
|
|
39
|
+
};
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// HELPER FUNCTIONS
|
|
42
|
+
// =============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Get status indicator for a file change type.
|
|
45
|
+
*/
|
|
46
|
+
function getStatusIndicator(type) {
|
|
47
|
+
switch (type) {
|
|
48
|
+
case 'create':
|
|
49
|
+
return { char: 'A', color: COLORS.create };
|
|
50
|
+
case 'modify':
|
|
51
|
+
return { char: 'M', color: COLORS.modify };
|
|
52
|
+
case 'delete':
|
|
53
|
+
return { char: 'D', color: COLORS.delete };
|
|
54
|
+
case 'rename':
|
|
55
|
+
return { char: 'R', color: COLORS.rename };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sort file changes by specified criteria.
|
|
60
|
+
*/
|
|
61
|
+
function sortChanges(changes, sortBy) {
|
|
62
|
+
const sorted = [...changes];
|
|
63
|
+
switch (sortBy) {
|
|
64
|
+
case 'additions':
|
|
65
|
+
return sorted.sort((a, b) => b.additions - a.additions);
|
|
66
|
+
case 'deletions':
|
|
67
|
+
return sorted.sort((a, b) => b.deletions - a.deletions);
|
|
68
|
+
case 'total':
|
|
69
|
+
return sorted.sort((a, b) => (b.additions + b.deletions) - (a.additions + a.deletions));
|
|
70
|
+
case 'path':
|
|
71
|
+
default:
|
|
72
|
+
return sorted.sort((a, b) => a.path.localeCompare(b.path));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Truncate path for display, showing end of path.
|
|
77
|
+
*/
|
|
78
|
+
function truncatePath(path, maxWidth) {
|
|
79
|
+
if (path.length <= maxWidth)
|
|
80
|
+
return path;
|
|
81
|
+
return '…' + path.slice(-(maxWidth - 1));
|
|
82
|
+
}
|
|
83
|
+
// =============================================================================
|
|
84
|
+
// SUB-COMPONENTS
|
|
85
|
+
// =============================================================================
|
|
86
|
+
/**
|
|
87
|
+
* Render a single file change row.
|
|
88
|
+
*/
|
|
89
|
+
const FileChangeRow = memo(function FileChangeRow({ change, maxPathWidth, }) {
|
|
90
|
+
const status = getStatusIndicator(change.type);
|
|
91
|
+
const displayPath = change.type === 'rename' && change.oldPath
|
|
92
|
+
? `${truncatePath(change.oldPath, maxPathWidth / 2 - 2)} → ${truncatePath(change.path, maxPathWidth / 2 - 2)}`
|
|
93
|
+
: truncatePath(change.path, maxPathWidth);
|
|
94
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: status.color, bold: true, children: status.char }), _jsx(Text, { children: " " }), _jsx(Text, { color: COLORS.muted, children: displayPath }), _jsx(Text, { children: " " }), change.additions > 0 && (_jsxs(Text, { color: COLORS.addition, children: ["+", change.additions] })), change.additions > 0 && change.deletions > 0 && (_jsx(Text, { color: COLORS.muted, children: "/" })), change.deletions > 0 && (_jsxs(Text, { color: COLORS.deletion, children: ["-", change.deletions] }))] }));
|
|
95
|
+
});
|
|
96
|
+
/**
|
|
97
|
+
* Render a visual stats bar.
|
|
98
|
+
*/
|
|
99
|
+
const StatsBar = memo(function StatsBar({ additions, deletions, maxWidth = 20, }) {
|
|
100
|
+
const total = additions + deletions;
|
|
101
|
+
if (total === 0)
|
|
102
|
+
return null;
|
|
103
|
+
const addWidth = Math.round((additions / total) * maxWidth);
|
|
104
|
+
const delWidth = maxWidth - addWidth;
|
|
105
|
+
return (_jsxs(Box, { children: [_jsx(Text, { backgroundColor: COLORS.addition, children: ' '.repeat(Math.max(1, addWidth)) }), _jsx(Text, { backgroundColor: COLORS.deletion, children: ' '.repeat(Math.max(1, delWidth)) })] }));
|
|
106
|
+
});
|
|
107
|
+
// =============================================================================
|
|
108
|
+
// MAIN COMPONENT
|
|
109
|
+
// =============================================================================
|
|
110
|
+
export const FileChangeSummary = memo(function FileChangeSummary({ changes, expanded = false, sortBy = 'path', maxFiles = 20, }) {
|
|
111
|
+
// Calculate totals
|
|
112
|
+
const stats = useMemo(() => {
|
|
113
|
+
let additions = 0;
|
|
114
|
+
let deletions = 0;
|
|
115
|
+
let created = 0;
|
|
116
|
+
let modified = 0;
|
|
117
|
+
let deleted = 0;
|
|
118
|
+
let renamed = 0;
|
|
119
|
+
for (const change of changes) {
|
|
120
|
+
additions += change.additions;
|
|
121
|
+
deletions += change.deletions;
|
|
122
|
+
switch (change.type) {
|
|
123
|
+
case 'create':
|
|
124
|
+
created++;
|
|
125
|
+
break;
|
|
126
|
+
case 'modify':
|
|
127
|
+
modified++;
|
|
128
|
+
break;
|
|
129
|
+
case 'delete':
|
|
130
|
+
deleted++;
|
|
131
|
+
break;
|
|
132
|
+
case 'rename':
|
|
133
|
+
renamed++;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { additions, deletions, created, modified, deleted, renamed };
|
|
138
|
+
}, [changes]);
|
|
139
|
+
// Sort and limit changes for display
|
|
140
|
+
const displayChanges = useMemo(() => {
|
|
141
|
+
const sorted = sortChanges(changes, sortBy);
|
|
142
|
+
return sorted.slice(0, maxFiles);
|
|
143
|
+
}, [changes, sortBy, maxFiles]);
|
|
144
|
+
const hasMore = changes.length > maxFiles;
|
|
145
|
+
// Empty state
|
|
146
|
+
if (changes.length === 0) {
|
|
147
|
+
return (_jsx(Box, { borderStyle: "round", borderColor: COLORS.border, paddingX: 1, children: _jsx(Text, { color: COLORS.muted, dimColor: true, children: "No changes in this session" }) }));
|
|
148
|
+
}
|
|
149
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: COLORS.border, paddingX: 1, children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, children: "Session Changes: " }), _jsxs(Text, { color: COLORS.addition, children: ["+", stats.additions] }), _jsx(Text, { color: COLORS.muted, children: "/" }), _jsxs(Text, { color: COLORS.deletion, children: ["-", stats.deletions] }), _jsx(Text, { color: COLORS.muted, children: " in " }), _jsxs(Text, { children: [changes.length, " file", changes.length !== 1 ? 's' : ''] })] }), _jsx(Box, { marginTop: 1, children: _jsx(StatsBar, { additions: stats.additions, deletions: stats.deletions, maxWidth: 30 }) }), _jsxs(Box, { marginTop: 1, children: [stats.created > 0 && (_jsxs(Text, { color: COLORS.create, children: [stats.created, " new "] })), stats.modified > 0 && (_jsxs(Text, { color: COLORS.modify, children: [stats.modified, " modified "] })), stats.deleted > 0 && (_jsxs(Text, { color: COLORS.delete, children: [stats.deleted, " deleted "] })), stats.renamed > 0 && (_jsxs(Text, { color: COLORS.rename, children: [stats.renamed, " renamed "] }))] }), expanded && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [displayChanges.map((change, i) => (_jsx(FileChangeRow, { change: change, maxPathWidth: 50 }, `${change.path}-${i}`))), hasMore && (_jsxs(Text, { color: COLORS.muted, dimColor: true, children: ["... and ", changes.length - maxFiles, " more files"] }))] }))] }));
|
|
150
|
+
});
|
|
151
|
+
export default FileChangeSummary;
|
|
152
|
+
//# sourceMappingURL=FileChangeSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileChangeSummary.js","sourceRoot":"","sources":["../../../../src/tui/components/FileChangeSummary.tsx"],"names":[],"mappings":"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"}
|