codeep 1.0.59 → 1.0.60
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.
|
@@ -2,7 +2,7 @@ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
/**
|
|
3
3
|
* Agent progress display component
|
|
4
4
|
*/
|
|
5
|
-
import { useState, useEffect
|
|
5
|
+
import { useState, useEffect } from 'react';
|
|
6
6
|
import { Box, Text } from 'ink';
|
|
7
7
|
// Spinner frames for animation (no emojis)
|
|
8
8
|
const SPINNER_FRAMES = ['/', '-', '\\', '|'];
|
|
@@ -140,65 +140,8 @@ const isSectionBreak = (line, prevLine) => {
|
|
|
140
140
|
return false;
|
|
141
141
|
};
|
|
142
142
|
export const LiveCodeStream = ({ actions, isRunning }) => {
|
|
143
|
-
// Use refs for mutable state to minimize re-renders
|
|
144
|
-
const lastActionIdRef = useRef(null);
|
|
145
|
-
const timerRef = useRef(null);
|
|
146
|
-
const visibleEndLineRef = useRef(0);
|
|
147
|
-
// Single state for forcing re-render - increment only when needed
|
|
148
|
-
const [, forceRender] = useState(0);
|
|
149
143
|
// Find the current write/edit action with code content
|
|
150
144
|
const currentAction = actions.length > 0 ? actions[actions.length - 1] : null;
|
|
151
|
-
// Only show for write/edit actions
|
|
152
|
-
const isWriteOrEdit = currentAction && (currentAction.type === 'write' || currentAction.type === 'edit');
|
|
153
|
-
// Create a unique ID for the current action
|
|
154
|
-
const actionId = currentAction ? `${currentAction.target}-${currentAction.timestamp}` : null;
|
|
155
|
-
// Get total lines for current action
|
|
156
|
-
const totalLines = currentAction?.details ? currentAction.details.split('\n').length : 0;
|
|
157
|
-
// Stream lines progressively - minimize state updates
|
|
158
|
-
useEffect(() => {
|
|
159
|
-
// Clear any existing timer
|
|
160
|
-
if (timerRef.current) {
|
|
161
|
-
clearInterval(timerRef.current);
|
|
162
|
-
timerRef.current = null;
|
|
163
|
-
}
|
|
164
|
-
// Only stream for write/edit actions with content
|
|
165
|
-
if (!currentAction || !currentAction.details || !isRunning || !isWriteOrEdit) {
|
|
166
|
-
if (visibleEndLineRef.current !== 0) {
|
|
167
|
-
visibleEndLineRef.current = 0;
|
|
168
|
-
lastActionIdRef.current = null;
|
|
169
|
-
}
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
// If this is a new action, reset and start streaming
|
|
173
|
-
if (actionId !== lastActionIdRef.current) {
|
|
174
|
-
lastActionIdRef.current = actionId;
|
|
175
|
-
const lines = currentAction.details.split('\n').length;
|
|
176
|
-
visibleEndLineRef.current = Math.min(10, lines);
|
|
177
|
-
forceRender(n => n + 1);
|
|
178
|
-
// Only start interval if there are more lines to show
|
|
179
|
-
if (lines > 10) {
|
|
180
|
-
timerRef.current = setInterval(() => {
|
|
181
|
-
const currentLines = currentAction.details?.split('\n').length || 0;
|
|
182
|
-
const newEndLine = Math.min(visibleEndLineRef.current + 10, currentLines);
|
|
183
|
-
if (newEndLine !== visibleEndLineRef.current) {
|
|
184
|
-
visibleEndLineRef.current = newEndLine;
|
|
185
|
-
forceRender(n => n + 1);
|
|
186
|
-
}
|
|
187
|
-
// Stop interval when we've shown all lines
|
|
188
|
-
if (newEndLine >= currentLines && timerRef.current) {
|
|
189
|
-
clearInterval(timerRef.current);
|
|
190
|
-
timerRef.current = null;
|
|
191
|
-
}
|
|
192
|
-
}, 200); // Slower interval to reduce flickering
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return () => {
|
|
196
|
-
if (timerRef.current) {
|
|
197
|
-
clearInterval(timerRef.current);
|
|
198
|
-
timerRef.current = null;
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
}, [actionId, isRunning, isWriteOrEdit, currentAction]);
|
|
202
145
|
// Only show for write/edit actions with content while running
|
|
203
146
|
if (!isRunning || !currentAction)
|
|
204
147
|
return null;
|
|
@@ -212,22 +155,15 @@ export const LiveCodeStream = ({ actions, isRunning }) => {
|
|
|
212
155
|
const ext = getFileExtension(filename);
|
|
213
156
|
const langLabel = getLanguageLabel(ext);
|
|
214
157
|
const allLines = code.split('\n');
|
|
158
|
+
const totalLines = allLines.length;
|
|
215
159
|
const actionLabel = currentAction.type === 'write' ? '✨ Creating' : '✏️ Editing';
|
|
216
160
|
const actionColor = currentAction.type === 'write' ? 'green' : 'yellow';
|
|
217
|
-
//
|
|
218
|
-
const visibleEndLine = visibleEndLineRef.current || Math.min(10, totalLines);
|
|
219
|
-
// Sliding window: show only last 10 lines
|
|
161
|
+
// Show last 10 lines (most recent code being written)
|
|
220
162
|
const WINDOW_SIZE = 10;
|
|
221
|
-
const startLine = Math.max(0,
|
|
222
|
-
const linesToShow = allLines.slice(startLine,
|
|
223
|
-
const remainingLines = totalLines - visibleEndLine;
|
|
163
|
+
const startLine = Math.max(0, totalLines - WINDOW_SIZE);
|
|
164
|
+
const linesToShow = allLines.slice(startLine, totalLines);
|
|
224
165
|
const linesAbove = startLine;
|
|
225
|
-
|
|
226
|
-
const paddedLines = [...linesToShow];
|
|
227
|
-
while (paddedLines.length < WINDOW_SIZE) {
|
|
228
|
-
paddedLines.push('');
|
|
229
|
-
}
|
|
230
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: actionColor, bold: true, children: [actionLabel, " "] }), _jsx(Text, { color: "white", bold: true, children: filename }), _jsxs(Text, { color: "gray", children: [" \u2022 ", langLabel, " \u2022 "] }), _jsx(Text, { color: "cyan", children: visibleEndLine }), _jsxs(Text, { color: "gray", children: ["/", totalLines] }), remainingLines > 0 && _jsx(Text, { color: "yellow", children: " \u25BC" })] }), _jsx(Text, { color: actionColor, children: '─'.repeat(76) }), _jsx(Text, { color: "gray", dimColor: true, children: linesAbove > 0 ? ` ⋮ ${linesAbove} lines above` : ' ' }), paddedLines.map((line, i) => (_jsxs(Text, { children: [_jsxs(Text, { color: "gray", dimColor: true, children: [line ? String(startLine + i + 1).padStart(4, ' ') : ' ', " \u2502", ' '] }), _jsx(Text, { color: line ? getCodeColor(line, ext) : 'gray', children: line.slice(0, 68) }), line.length > 68 && _jsx(Text, { color: "gray", children: "\u2026" })] }, `line-${startLine + i}`))), _jsx(Text, { color: "yellow", children: remainingLines > 0 ? ` ⋮ ${remainingLines} more lines...` : ' ' }), _jsx(Text, { color: actionColor, children: '─'.repeat(76) })] }));
|
|
166
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: actionColor, bold: true, children: [actionLabel, " "] }), _jsx(Text, { color: "white", bold: true, children: filename }), _jsxs(Text, { color: "gray", children: [" \u2022 ", langLabel, " \u2022 "] }), _jsx(Text, { color: "cyan", children: totalLines }), _jsx(Text, { color: "gray", children: " lines" })] }), _jsx(Text, { color: actionColor, children: '─'.repeat(76) }), linesAbove > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: [" \u22EE ", linesAbove, " lines above"] })), linesToShow.map((line, i) => (_jsxs(Text, { children: [_jsxs(Text, { color: "gray", dimColor: true, children: [String(startLine + i + 1).padStart(4, ' '), " \u2502", ' '] }), _jsx(Text, { color: getCodeColor(line, ext), children: line.slice(0, 68) }), line.length > 68 && _jsx(Text, { color: "gray", children: "\u2026" })] }, `line-${startLine + i}`))), _jsx(Text, { color: actionColor, children: '─'.repeat(76) })] }));
|
|
231
167
|
};
|
|
232
168
|
// Helper functions for action display
|
|
233
169
|
const getActionColor = (type) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeep",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.60",
|
|
4
4
|
"description": "AI-powered coding assistant built for the terminal. Multiple LLM providers, project-aware context, and a seamless development workflow.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|