codeep 1.0.49 → 1.0.51
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 +14 -9
- package/dist/components/AgentProgress.js +22 -1
- package/dist/utils/agent.d.ts +1 -1
- package/dist/utils/agent.js +2 -2
- package/dist/utils/tools.js +10 -16
- package/package.json +1 -1
package/dist/app.js
CHANGED
|
@@ -36,6 +36,7 @@ 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
38
|
import { AgentProgress, AgentSummary } from './components/AgentProgress.js';
|
|
39
|
+
import { createActionLog } from './utils/tools.js';
|
|
39
40
|
export const App = () => {
|
|
40
41
|
const { exit } = useApp();
|
|
41
42
|
const { stdout } = useStdout();
|
|
@@ -272,19 +273,23 @@ export const App = () => {
|
|
|
272
273
|
setAgentIteration(iteration);
|
|
273
274
|
},
|
|
274
275
|
onToolCall: (tool) => {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
276
|
+
// Create a placeholder action - will be updated by onToolResult
|
|
277
|
+
const placeholderResult = {
|
|
278
|
+
success: true,
|
|
279
|
+
output: '',
|
|
280
|
+
tool: tool.tool,
|
|
281
|
+
parameters: tool.parameters,
|
|
282
|
+
};
|
|
283
|
+
const actionLog = createActionLog(tool, placeholderResult);
|
|
284
|
+
setAgentActions(prev => [...prev, actionLog]);
|
|
281
285
|
},
|
|
282
|
-
onToolResult: (result) => {
|
|
286
|
+
onToolResult: (result, toolCall) => {
|
|
287
|
+
// Replace the last action with the complete one
|
|
288
|
+
const actionLog = createActionLog(toolCall, result);
|
|
283
289
|
setAgentActions(prev => {
|
|
284
290
|
const updated = [...prev];
|
|
285
291
|
if (updated.length > 0) {
|
|
286
|
-
updated[updated.length - 1]
|
|
287
|
-
updated[updated.length - 1].details = result.success ? result.output.slice(0, 100) : result.error;
|
|
292
|
+
updated[updated.length - 1] = actionLog;
|
|
288
293
|
}
|
|
289
294
|
return updated;
|
|
290
295
|
});
|
|
@@ -40,7 +40,28 @@ 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, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { 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) })] }), (currentAction.type === 'write' || currentAction.type === 'edit') && currentAction.details && (_jsxs(Box, { flexDirection: "column",
|
|
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, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { 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) })] }), (currentAction.type === 'write' || currentAction.type === 'edit') && currentAction.details && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", bold: true, children: "\uD83D\uDCDD Live Code:" }), _jsxs(Text, { color: "gray", children: [" ", currentAction.target.split('/').pop()] }), _jsxs(Text, { color: "gray", dimColor: true, children: [" (", currentAction.details.split('\n').length, " lines)"] })] }), _jsx(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 0, children: currentAction.details.split('\n').map((line, i) => (_jsxs(Text, { children: [_jsxs(Text, { color: "gray", dimColor: true, children: [String(i + 1).padStart(3, ' '), " \u2502 "] }), _jsx(Text, { color: getCodeColor(line), children: line })] }, i))) })] }))] })), _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';
|
|
44
65
|
};
|
|
45
66
|
// Helper functions for action display
|
|
46
67
|
const getActionColor = (type) => {
|
package/dist/utils/agent.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface AgentOptions {
|
|
|
10
10
|
maxIterations: number;
|
|
11
11
|
maxDuration: number;
|
|
12
12
|
onToolCall?: (tool: ToolCall) => void;
|
|
13
|
-
onToolResult?: (result: ToolResult) => void;
|
|
13
|
+
onToolResult?: (result: ToolResult, toolCall: ToolCall) => void;
|
|
14
14
|
onIteration?: (iteration: number, message: string) => void;
|
|
15
15
|
onThinking?: (text: string) => void;
|
|
16
16
|
onVerification?: (results: VerifyResult[]) => void;
|
package/dist/utils/agent.js
CHANGED
|
@@ -680,7 +680,7 @@ export async function runAgent(prompt, projectContext, options = {}) {
|
|
|
680
680
|
// Actually execute the tool
|
|
681
681
|
toolResult = executeTool(toolCall, projectContext.root || process.cwd());
|
|
682
682
|
}
|
|
683
|
-
opts.onToolResult?.(toolResult);
|
|
683
|
+
opts.onToolResult?.(toolResult, toolCall);
|
|
684
684
|
// Log action
|
|
685
685
|
const actionLog = createActionLog(toolCall, toolResult);
|
|
686
686
|
actions.push(actionLog);
|
|
@@ -770,7 +770,7 @@ export async function runAgent(prompt, projectContext, options = {}) {
|
|
|
770
770
|
for (const toolCall of fixToolCalls) {
|
|
771
771
|
opts.onToolCall?.(toolCall);
|
|
772
772
|
const toolResult = executeTool(toolCall, projectContext.root || process.cwd());
|
|
773
|
-
opts.onToolResult?.(toolResult);
|
|
773
|
+
opts.onToolResult?.(toolResult, toolCall);
|
|
774
774
|
const actionLog = createActionLog(toolCall, toolResult);
|
|
775
775
|
actions.push(actionLog);
|
|
776
776
|
if (toolResult.success) {
|
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.51",
|
|
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",
|