codeep 1.0.50 → 1.0.52
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/dist/app.js +2 -2
- package/dist/components/AgentProgress.d.ts +9 -0
- package/dist/components/AgentProgress.js +42 -1
- package/dist/utils/tools.js +10 -16
- package/package.json +1 -1
package/dist/app.js
CHANGED
|
@@ -35,7 +35,7 @@ import { saveContext, loadContext, clearContext, mergeContext } from './utils/co
|
|
|
35
35
|
import { performCodeReview, formatReviewResult } from './utils/codeReview.js';
|
|
36
36
|
import { learnFromProject, addCustomRule, getLearningStatus } from './utils/learning.js';
|
|
37
37
|
import { getAllSkills, findSkill, formatSkillsList, formatSkillHelp, generateSkillPrompt, saveCustomSkill, deleteCustomSkill, parseSkillChain, parseSkillArgs, searchSkills, trackSkillUsage, getSkillStats } from './utils/skills.js';
|
|
38
|
-
import { AgentProgress, AgentSummary } from './components/AgentProgress.js';
|
|
38
|
+
import { AgentProgress, AgentSummary, LiveCodeStream } from './components/AgentProgress.js';
|
|
39
39
|
import { createActionLog } from './utils/tools.js';
|
|
40
40
|
export const App = () => {
|
|
41
41
|
const { exit } = useApp();
|
|
@@ -1330,7 +1330,7 @@ export const App = () => {
|
|
|
1330
1330
|
return (_jsx(LanguageSelect, { onClose: () => setScreen('chat'), notify: notify }));
|
|
1331
1331
|
}
|
|
1332
1332
|
// Main chat screen
|
|
1333
|
-
return (_jsxs(Box, { flexDirection: "column", children: [messages.length === 0 && !isLoading && _jsx(Logo, {}), messages.length === 0 && !isLoading && (_jsx(Box, { justifyContent: "center", children: _jsxs(Text, { children: ["Connected to ", _jsx(Text, { color: "#f02a30", children: config.get('model') }), ". Type ", _jsx(Text, { color: "#f02a30", children: "/help" }), " for commands."] }) })), _jsx(MessageList, { messages: messages, streamingContent: streamingContent, scrollOffset: 0, terminalHeight: stdout.rows || 24 }, sessionId), isLoading && !isAgentRunning && _jsx(Loading, { isStreaming: !!streamingContent }), isAgentRunning && (_jsx(AgentProgress, { isRunning: true, iteration: agentIteration, maxIterations: 50, actions: agentActions, currentThinking: agentThinking, dryRun: agentDryRun })), !isAgentRunning && agentResult && (_jsx(AgentSummary, { success: agentResult.success, iterations: agentResult.iterations, actions: agentActions, error: agentResult.error, aborted: agentResult.aborted })), pendingFileChanges.length > 0 && !isLoading && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#f02a30", padding: 1, marginY: 1, children: [_jsxs(Text, { color: "#f02a30", bold: true, children: ["\u2713 Detected ", pendingFileChanges.length, " file change(s):"] }), pendingFileChanges.map((change, i) => {
|
|
1333
|
+
return (_jsxs(Box, { flexDirection: "column", children: [messages.length === 0 && !isLoading && _jsx(Logo, {}), messages.length === 0 && !isLoading && (_jsx(Box, { justifyContent: "center", children: _jsxs(Text, { children: ["Connected to ", _jsx(Text, { color: "#f02a30", children: config.get('model') }), ". Type ", _jsx(Text, { color: "#f02a30", children: "/help" }), " for commands."] }) })), _jsx(MessageList, { messages: messages, streamingContent: streamingContent, scrollOffset: 0, terminalHeight: stdout.rows || 24 }, sessionId), isLoading && !isAgentRunning && _jsx(Loading, { isStreaming: !!streamingContent }), isAgentRunning && (_jsx(LiveCodeStream, { actions: agentActions, isRunning: true })), isAgentRunning && (_jsx(AgentProgress, { isRunning: true, iteration: agentIteration, maxIterations: 50, actions: agentActions, currentThinking: agentThinking, dryRun: agentDryRun })), !isAgentRunning && agentResult && (_jsx(AgentSummary, { success: agentResult.success, iterations: agentResult.iterations, actions: agentActions, error: agentResult.error, aborted: agentResult.aborted })), pendingFileChanges.length > 0 && !isLoading && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#f02a30", padding: 1, marginY: 1, children: [_jsxs(Text, { color: "#f02a30", bold: true, children: ["\u2713 Detected ", pendingFileChanges.length, " file change(s):"] }), pendingFileChanges.map((change, i) => {
|
|
1334
1334
|
const actionColor = change.action === 'delete' ? 'red' : change.action === 'edit' ? 'yellow' : 'green';
|
|
1335
1335
|
const actionLabel = change.action === 'delete' ? 'DELETE' : change.action === 'edit' ? 'EDIT' : 'CREATE';
|
|
1336
1336
|
return (_jsxs(Text, { children: ["\u2022 ", _jsxs(Text, { color: actionColor, children: ["[", actionLabel, "]"] }), " ", change.path, change.action !== 'delete' && change.content.includes('\n') && ` (${change.content.split('\n').length} lines)`] }, i));
|
|
@@ -12,6 +12,15 @@ interface AgentProgressProps {
|
|
|
12
12
|
dryRun?: boolean;
|
|
13
13
|
}
|
|
14
14
|
export declare const AgentProgress: React.FC<AgentProgressProps>;
|
|
15
|
+
/**
|
|
16
|
+
* Live Code Stream component - shows ALL code being written/edited by agent
|
|
17
|
+
* Displayed ABOVE the AgentProgress component
|
|
18
|
+
*/
|
|
19
|
+
interface LiveCodeStreamProps {
|
|
20
|
+
actions: ActionLog[];
|
|
21
|
+
isRunning: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare const LiveCodeStream: React.FC<LiveCodeStreamProps>;
|
|
15
24
|
/**
|
|
16
25
|
* Agent summary component - shown when agent completes
|
|
17
26
|
*/
|
|
@@ -40,7 +40,48 @@ export const AgentProgress = ({ isRunning, iteration, maxIterations, actions, cu
|
|
|
40
40
|
deleted: actions.filter(a => a.type === 'delete' && a.result === 'success').length,
|
|
41
41
|
};
|
|
42
42
|
const totalFileChanges = fileChanges.created + fileChanges.modified + fileChanges.deleted;
|
|
43
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: dryRun ? 'yellow' : '#f02a30', padding: 1, marginY: 1, children: [_jsx(Box, { children: isRunning ? (_jsxs(_Fragment, { children: [_jsxs(Text, { color: dryRun ? 'yellow' : '#f02a30', children: ["[", SPINNER_FRAMES[spinnerFrame], "]"] }), _jsxs(Text, { color: dryRun ? 'yellow' : '#f02a30', bold: true, children: [' ', dryRun ? 'DRY RUN' : 'AGENT', ' '] }), _jsx(Text, { color: "gray", children: "|" }), _jsxs(Text, { color: "cyan", children: [" step ", iteration] }), _jsx(Text, { color: "gray", children: " | " }), actionCounts.reads > 0 && _jsxs(Text, { color: "blue", children: [actionCounts.reads, "R "] }), actionCounts.writes > 0 && _jsxs(Text, { color: "green", children: [actionCounts.writes, "W "] }), actionCounts.edits > 0 && _jsxs(Text, { color: "yellow", children: [actionCounts.edits, "E "] }), actionCounts.commands > 0 && _jsxs(Text, { color: "magenta", children: [actionCounts.commands, "C "] }), actionCounts.searches > 0 && _jsxs(Text, { color: "cyan", children: [actionCounts.searches, "S "] }), actions.length === 0 && _jsx(Text, { color: "gray", children: "0 actions" })] })) : (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", bold: true, children: "[DONE] " }), _jsx(Text, { children: "Agent completed" }), _jsx(Text, { color: "gray", children: " | " }), _jsxs(Text, { color: "white", children: [actions.length, " actions"] })] })) }), isRunning && currentAction && (_jsxs(Box, {
|
|
43
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: dryRun ? 'yellow' : '#f02a30', padding: 1, marginY: 1, children: [_jsx(Box, { children: isRunning ? (_jsxs(_Fragment, { children: [_jsxs(Text, { color: dryRun ? 'yellow' : '#f02a30', children: ["[", SPINNER_FRAMES[spinnerFrame], "]"] }), _jsxs(Text, { color: dryRun ? 'yellow' : '#f02a30', bold: true, children: [' ', dryRun ? 'DRY RUN' : 'AGENT', ' '] }), _jsx(Text, { color: "gray", children: "|" }), _jsxs(Text, { color: "cyan", children: [" step ", iteration] }), _jsx(Text, { color: "gray", children: " | " }), actionCounts.reads > 0 && _jsxs(Text, { color: "blue", children: [actionCounts.reads, "R "] }), actionCounts.writes > 0 && _jsxs(Text, { color: "green", children: [actionCounts.writes, "W "] }), actionCounts.edits > 0 && _jsxs(Text, { color: "yellow", children: [actionCounts.edits, "E "] }), actionCounts.commands > 0 && _jsxs(Text, { color: "magenta", children: [actionCounts.commands, "C "] }), actionCounts.searches > 0 && _jsxs(Text, { color: "cyan", children: [actionCounts.searches, "S "] }), actions.length === 0 && _jsx(Text, { color: "gray", children: "0 actions" })] })) : (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", bold: true, children: "[DONE] " }), _jsx(Text, { children: "Agent completed" }), _jsx(Text, { color: "gray", children: " | " }), _jsxs(Text, { color: "white", children: [actions.length, " actions"] })] })) }), isRunning && currentAction && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "white", bold: true, children: "Now: " }), _jsxs(Text, { color: getActionColor(currentAction.type), children: [getActionLabel(currentAction.type), " "] }), _jsx(Text, { color: "white", children: formatTarget(currentAction.target) })] })), _jsx(Text, { color: "gray", children: '─'.repeat(50) }), recentActions.length > 1 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "gray", dimColor: true, children: "Recent:" }), recentActions.slice(0, -1).map((action, i) => (_jsx(ActionItem, { action: action }, i)))] })), isRunning && totalFileChanges > 0 && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "gray", children: "Changes: " }), fileChanges.created > 0 && _jsxs(Text, { color: "green", children: ["+", fileChanges.created, " "] }), fileChanges.modified > 0 && _jsxs(Text, { color: "yellow", children: ["~", fileChanges.modified, " "] }), fileChanges.deleted > 0 && _jsxs(Text, { color: "red", children: ["-", fileChanges.deleted] })] })), isRunning && currentThinking && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", wrap: "truncate-end", children: ["> ", currentThinking.slice(0, 80), currentThinking.length > 80 ? '...' : ''] }) })), isRunning && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "gray", children: "Press " }), _jsx(Text, { color: "#f02a30", children: "Esc" }), _jsx(Text, { color: "gray", children: " to stop" })] })), !isRunning && totalFileChanges > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: "File Changes:" }), fileChanges.created > 0 && (_jsxs(Text, { color: "green", children: [" + ", fileChanges.created, " file(s) created"] })), fileChanges.modified > 0 && (_jsxs(Text, { color: "yellow", children: [" ~ ", fileChanges.modified, " file(s) modified"] })), fileChanges.deleted > 0 && (_jsxs(Text, { color: "red", children: [" - ", fileChanges.deleted, " file(s) deleted"] }))] }))] }));
|
|
44
|
+
};
|
|
45
|
+
// Helper function for syntax highlighting
|
|
46
|
+
const getCodeColor = (line) => {
|
|
47
|
+
const trimmed = line.trim();
|
|
48
|
+
// Comments
|
|
49
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('/*') || trimmed.startsWith('*')) {
|
|
50
|
+
return 'gray';
|
|
51
|
+
}
|
|
52
|
+
// Keywords
|
|
53
|
+
if (/^(import|export|const|let|var|function|class|interface|type|return|if|else|for|while|async|await)\b/.test(trimmed)) {
|
|
54
|
+
return 'magenta';
|
|
55
|
+
}
|
|
56
|
+
// HTML tags
|
|
57
|
+
if (trimmed.startsWith('<') && (trimmed.includes('>') || trimmed.includes('/>'))) {
|
|
58
|
+
return 'cyan';
|
|
59
|
+
}
|
|
60
|
+
// Strings
|
|
61
|
+
if (trimmed.includes('"') || trimmed.includes("'") || trimmed.includes('`')) {
|
|
62
|
+
return 'green';
|
|
63
|
+
}
|
|
64
|
+
return 'white';
|
|
65
|
+
};
|
|
66
|
+
export const LiveCodeStream = ({ actions, isRunning }) => {
|
|
67
|
+
// Find the current write/edit action with code content
|
|
68
|
+
const currentAction = actions.length > 0 ? actions[actions.length - 1] : null;
|
|
69
|
+
// Only show for write/edit actions with content
|
|
70
|
+
if (!isRunning || !currentAction)
|
|
71
|
+
return null;
|
|
72
|
+
if (currentAction.type !== 'write' && currentAction.type !== 'edit')
|
|
73
|
+
return null;
|
|
74
|
+
if (!currentAction.details)
|
|
75
|
+
return null;
|
|
76
|
+
const code = currentAction.details;
|
|
77
|
+
const filename = currentAction.target.split('/').pop() || currentAction.target;
|
|
78
|
+
const allLines = code.split('\n');
|
|
79
|
+
const totalLines = allLines.length;
|
|
80
|
+
const actionLabel = currentAction.type === 'write' ? 'Creating' : 'Editing';
|
|
81
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\uD83D\uDCDD ", actionLabel, ": "] }), _jsx(Text, { color: "white", bold: true, children: filename }), _jsxs(Text, { color: "gray", children: [" (", totalLines, " lines)"] })] }), _jsx(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 1, children: allLines.map((line, i) => {
|
|
82
|
+
const lineNum = i + 1;
|
|
83
|
+
return (_jsxs(Text, { children: [_jsxs(Text, { color: "gray", dimColor: true, children: [String(lineNum).padStart(4, ' '), " \u2502 "] }), _jsx(Text, { color: getCodeColor(line), children: line })] }, i));
|
|
84
|
+
}) })] }));
|
|
44
85
|
};
|
|
45
86
|
// Helper functions for action display
|
|
46
87
|
const getActionColor = (type) => {
|
package/dist/utils/tools.js
CHANGED
|
@@ -893,29 +893,23 @@ export function createActionLog(toolCall, result) {
|
|
|
893
893
|
toolCall.parameters.pattern ||
|
|
894
894
|
toolCall.parameters.url ||
|
|
895
895
|
'unknown';
|
|
896
|
-
// For write/edit actions, include content
|
|
896
|
+
// For write/edit actions, include FULL content in details for live code view
|
|
897
897
|
let details;
|
|
898
898
|
if (result.success) {
|
|
899
899
|
if (normalizedTool === 'write_file' && toolCall.parameters.content) {
|
|
900
|
-
// Show
|
|
901
|
-
|
|
902
|
-
const lines = content.split('\n').slice(0, 5);
|
|
903
|
-
details = lines.join('\n');
|
|
904
|
-
if (content.split('\n').length > 5) {
|
|
905
|
-
details += '\n...';
|
|
906
|
-
}
|
|
900
|
+
// Show FULL content being written - for live code tracking
|
|
901
|
+
details = toolCall.parameters.content;
|
|
907
902
|
}
|
|
908
903
|
else if (normalizedTool === 'edit_file' && toolCall.parameters.new_text) {
|
|
909
|
-
// Show
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
}
|
|
904
|
+
// Show FULL new text being inserted - for live code tracking
|
|
905
|
+
details = toolCall.parameters.new_text;
|
|
906
|
+
}
|
|
907
|
+
else if (normalizedTool === 'execute_command') {
|
|
908
|
+
// Show command output (limited)
|
|
909
|
+
details = result.output.slice(0, 1000);
|
|
916
910
|
}
|
|
917
911
|
else {
|
|
918
|
-
details = result.output.slice(0,
|
|
912
|
+
details = result.output.slice(0, 500);
|
|
919
913
|
}
|
|
920
914
|
}
|
|
921
915
|
else {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeep",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.52",
|
|
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",
|