@serjm/deepseek-code 0.3.1 → 0.4.0
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 +20 -0
- package/README.md +12 -0
- package/README.ru.md +12 -0
- package/dist/api/index.d.ts +4 -4
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +17 -5
- package/dist/api/index.js.map +1 -1
- package/dist/cli/headless.d.ts.map +1 -1
- package/dist/cli/headless.js +2 -0
- package/dist/cli/headless.js.map +1 -1
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +188 -79
- package/dist/commands/index.js.map +1 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +4 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/core/agent-loop.d.ts +27 -1
- package/dist/core/agent-loop.d.ts.map +1 -1
- package/dist/core/agent-loop.js +165 -10
- package/dist/core/agent-loop.js.map +1 -1
- package/dist/core/i18n.d.ts +2 -0
- package/dist/core/i18n.d.ts.map +1 -1
- package/dist/core/i18n.js +15 -9
- package/dist/core/i18n.js.map +1 -1
- package/dist/core/metrics.d.ts +53 -0
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +205 -6
- package/dist/core/metrics.js.map +1 -1
- package/dist/tools/chrome.js +53 -53
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +30 -8
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/types.d.ts +28 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +10 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +13 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/activity-cards.js +9 -9
- package/dist/ui/activity-cards.js.map +1 -1
- package/dist/ui/app.d.ts.map +1 -1
- package/dist/ui/app.js +59 -14
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/chat-view.js +2 -2
- package/dist/ui/chat-view.js.map +1 -1
- package/dist/ui/input-bar.d.ts.map +1 -1
- package/dist/ui/input-bar.js +268 -70
- package/dist/ui/input-bar.js.map +1 -1
- package/dist/ui/markdown-view.d.ts +9 -0
- package/dist/ui/markdown-view.d.ts.map +1 -1
- package/dist/ui/markdown-view.js +70 -34
- package/dist/ui/markdown-view.js.map +1 -1
- package/dist/ui/reasoning-view.js +1 -1
- package/dist/ui/reasoning-view.js.map +1 -1
- package/dist/ui/results-panel.js +1 -1
- package/dist/ui/results-panel.js.map +1 -1
- package/dist/ui/setup-wizard.js +5 -5
- package/dist/ui/setup-wizard.js.map +1 -1
- package/dist/ui/status-bar.js +1 -1
- package/dist/ui/status-bar.js.map +1 -1
- package/dist/ui/tool-activity-card.js +9 -9
- package/dist/ui/tool-activity-card.js.map +1 -1
- package/dist/ui/tool-call-view.js +7 -7
- package/dist/ui/tool-call-view.js.map +1 -1
- package/package.json +2 -1
package/dist/core/metrics.d.ts
CHANGED
|
@@ -1,24 +1,64 @@
|
|
|
1
1
|
export interface TokenUsage {
|
|
2
2
|
input: number;
|
|
3
|
+
cacheHitInput: number;
|
|
4
|
+
cacheMissInput: number;
|
|
3
5
|
output: number;
|
|
6
|
+
reasoningOutput: number;
|
|
4
7
|
total: number;
|
|
5
8
|
}
|
|
9
|
+
export interface GitStatusSnapshot {
|
|
10
|
+
dirty: string[];
|
|
11
|
+
untracked: string[];
|
|
12
|
+
added: string[];
|
|
13
|
+
deleted: string[];
|
|
14
|
+
all: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Safely capture git status --porcelain output.
|
|
18
|
+
* Returns null outside git repos or on any error.
|
|
19
|
+
*/
|
|
20
|
+
export declare function captureGitStatus(cwd: string): GitStatusSnapshot | null;
|
|
21
|
+
/**
|
|
22
|
+
* Parse git status --porcelain output into GitStatusSnapshot.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parsePorcelain(stdout: string): GitStatusSnapshot;
|
|
6
25
|
export declare class MetricsCollector {
|
|
7
26
|
private startTime;
|
|
8
27
|
private _toolCalls;
|
|
9
28
|
private _inputTokens;
|
|
29
|
+
private _cacheHitInputTokens;
|
|
30
|
+
private _cacheMissInputTokens;
|
|
10
31
|
private _outputTokens;
|
|
32
|
+
private _reasoningOutputTokens;
|
|
11
33
|
private _lastInputTokens;
|
|
34
|
+
private _apiCalls;
|
|
12
35
|
private toolTimings;
|
|
13
36
|
private toolCallLog;
|
|
37
|
+
private _gitBaseline;
|
|
38
|
+
private _gitFinal;
|
|
14
39
|
get toolCalls(): number;
|
|
15
40
|
get inputTokens(): number;
|
|
16
41
|
get outputTokens(): number;
|
|
42
|
+
get cacheHitInputTokens(): number;
|
|
43
|
+
get cacheMissInputTokens(): number;
|
|
44
|
+
get reasoningOutputTokens(): number;
|
|
17
45
|
get totalTokens(): number;
|
|
46
|
+
get apiCalls(): number;
|
|
18
47
|
get elapsedMs(): number;
|
|
48
|
+
/** Get a copy of the tool call log for budget/inspection purposes */
|
|
49
|
+
get toolCallLogEntries(): Array<{
|
|
50
|
+
tool: string;
|
|
51
|
+
duration: number;
|
|
52
|
+
success: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
/** Get count of a specific tool in the call log */
|
|
55
|
+
getToolCallCount(name: string): number;
|
|
56
|
+
/** Get count of tool calls matching any of the given names */
|
|
57
|
+
getToolCallCountAny(names: string[]): number;
|
|
19
58
|
recordToolCallStart(toolName: string): void;
|
|
20
59
|
recordToolCallEnd(toolName: string, success?: boolean): void;
|
|
21
60
|
recordTokens(input: number, output: number): void;
|
|
61
|
+
recordUsage(usage: Partial<TokenUsage>): void;
|
|
22
62
|
/**
|
|
23
63
|
* Get current context window usage as % of max context.
|
|
24
64
|
* Uses last API request's prompt_tokens — the actual size of the current window.
|
|
@@ -32,5 +72,18 @@ export declare class MetricsCollector {
|
|
|
32
72
|
getContextUsagePercent(maxContext?: number): number;
|
|
33
73
|
getSummary(model?: string): string;
|
|
34
74
|
reset(): void;
|
|
75
|
+
/** Capture git baseline at the start of a session. */
|
|
76
|
+
captureGitBaseline(cwd: string): void;
|
|
77
|
+
/** Capture git final at the end of a session. */
|
|
78
|
+
captureGitFinal(cwd: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get a structured change report comparing baseline and final statuses.
|
|
81
|
+
* Returns null if either baseline or final hasn't been captured.
|
|
82
|
+
*/
|
|
83
|
+
getGitChangeReport(): {
|
|
84
|
+
beforeRun: string[];
|
|
85
|
+
duringRun: string[];
|
|
86
|
+
newUntracked: string[];
|
|
87
|
+
} | null;
|
|
35
88
|
}
|
|
36
89
|
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/core/metrics.js
CHANGED
|
@@ -1,12 +1,99 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
1
2
|
import { MODEL_PRICING } from '../config/defaults.js';
|
|
3
|
+
/**
|
|
4
|
+
* Safely capture git status --porcelain output.
|
|
5
|
+
* Returns null outside git repos or on any error.
|
|
6
|
+
*/
|
|
7
|
+
export function captureGitStatus(cwd) {
|
|
8
|
+
try {
|
|
9
|
+
const stdout = execSync('git status --porcelain', {
|
|
10
|
+
cwd,
|
|
11
|
+
encoding: 'utf-8',
|
|
12
|
+
timeout: 5000,
|
|
13
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
14
|
+
});
|
|
15
|
+
return parsePorcelain(stdout);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse git status --porcelain output into GitStatusSnapshot.
|
|
23
|
+
*/
|
|
24
|
+
export function parsePorcelain(stdout) {
|
|
25
|
+
const lines = stdout.split(/\r?\n/).filter(Boolean);
|
|
26
|
+
const dirty = [];
|
|
27
|
+
const untracked = [];
|
|
28
|
+
const added = [];
|
|
29
|
+
const deleted = [];
|
|
30
|
+
const allMap = new Map();
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
// XY <path> or XY "<quoted path>"
|
|
33
|
+
const match = line.match(/^([ MADRC?!]{2})\s+(.+)$/);
|
|
34
|
+
if (!match)
|
|
35
|
+
continue;
|
|
36
|
+
const xy = match[1];
|
|
37
|
+
let path = match[2];
|
|
38
|
+
// Remove surrounding quotes that git adds for special characters
|
|
39
|
+
if (path.startsWith('"') && path.endsWith('"')) {
|
|
40
|
+
path = path.slice(1, -1);
|
|
41
|
+
}
|
|
42
|
+
const staged = xy[0];
|
|
43
|
+
const worktree = xy[1];
|
|
44
|
+
// Untracked: ??
|
|
45
|
+
if (staged === '?' && worktree === '?') {
|
|
46
|
+
untracked.push(path);
|
|
47
|
+
allMap.set(path, true);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Added (staged): A<space>
|
|
51
|
+
if (staged === 'A') {
|
|
52
|
+
added.push(path);
|
|
53
|
+
allMap.set(path, true);
|
|
54
|
+
}
|
|
55
|
+
// Deleted: D<space> or <space>D
|
|
56
|
+
if (staged === 'D' || worktree === 'D') {
|
|
57
|
+
deleted.push(path);
|
|
58
|
+
allMap.set(path, true);
|
|
59
|
+
}
|
|
60
|
+
// Modified: M<space>, <space>M, MM, or renamed (R)
|
|
61
|
+
if (staged === 'M' || worktree === 'M' ||
|
|
62
|
+
staged === 'R' || worktree === 'R') {
|
|
63
|
+
dirty.push(path);
|
|
64
|
+
allMap.set(path, true);
|
|
65
|
+
}
|
|
66
|
+
// Also handle staged modifications with other indicators
|
|
67
|
+
if (staged !== '?' && worktree !== '?' && !['A', 'D', 'M', 'R'].includes(staged) && !['D', 'M', 'R'].includes(worktree)) {
|
|
68
|
+
// Anything else that's not clean: treat as dirty
|
|
69
|
+
if (staged !== ' ' || worktree !== ' ') {
|
|
70
|
+
dirty.push(path);
|
|
71
|
+
allMap.set(path, true);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
dirty,
|
|
77
|
+
untracked,
|
|
78
|
+
added,
|
|
79
|
+
deleted,
|
|
80
|
+
all: Array.from(allMap.keys()),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
2
83
|
export class MetricsCollector {
|
|
3
84
|
startTime = Date.now();
|
|
4
85
|
_toolCalls = 0;
|
|
5
86
|
_inputTokens = 0;
|
|
87
|
+
_cacheHitInputTokens = 0;
|
|
88
|
+
_cacheMissInputTokens = 0;
|
|
6
89
|
_outputTokens = 0;
|
|
90
|
+
_reasoningOutputTokens = 0;
|
|
7
91
|
_lastInputTokens = 0;
|
|
92
|
+
_apiCalls = 0;
|
|
8
93
|
toolTimings = new Map();
|
|
9
94
|
toolCallLog = [];
|
|
95
|
+
_gitBaseline = null;
|
|
96
|
+
_gitFinal = null;
|
|
10
97
|
get toolCalls() {
|
|
11
98
|
return this._toolCalls;
|
|
12
99
|
}
|
|
@@ -16,12 +103,37 @@ export class MetricsCollector {
|
|
|
16
103
|
get outputTokens() {
|
|
17
104
|
return this._outputTokens;
|
|
18
105
|
}
|
|
106
|
+
get cacheHitInputTokens() {
|
|
107
|
+
return this._cacheHitInputTokens;
|
|
108
|
+
}
|
|
109
|
+
get cacheMissInputTokens() {
|
|
110
|
+
return this._cacheMissInputTokens;
|
|
111
|
+
}
|
|
112
|
+
get reasoningOutputTokens() {
|
|
113
|
+
return this._reasoningOutputTokens;
|
|
114
|
+
}
|
|
19
115
|
get totalTokens() {
|
|
20
116
|
return this._inputTokens + this._outputTokens;
|
|
21
117
|
}
|
|
118
|
+
get apiCalls() {
|
|
119
|
+
return this._apiCalls;
|
|
120
|
+
}
|
|
22
121
|
get elapsedMs() {
|
|
23
122
|
return Date.now() - this.startTime;
|
|
24
123
|
}
|
|
124
|
+
/** Get a copy of the tool call log for budget/inspection purposes */
|
|
125
|
+
get toolCallLogEntries() {
|
|
126
|
+
return [...this.toolCallLog];
|
|
127
|
+
}
|
|
128
|
+
/** Get count of a specific tool in the call log */
|
|
129
|
+
getToolCallCount(name) {
|
|
130
|
+
return this.toolCallLog.filter(t => t.tool === name).length;
|
|
131
|
+
}
|
|
132
|
+
/** Get count of tool calls matching any of the given names */
|
|
133
|
+
getToolCallCountAny(names) {
|
|
134
|
+
const nameSet = new Set(names);
|
|
135
|
+
return this.toolCallLog.filter(t => nameSet.has(t.tool)).length;
|
|
136
|
+
}
|
|
25
137
|
recordToolCallStart(toolName) {
|
|
26
138
|
this.toolTimings.set(toolName, { start: Date.now() });
|
|
27
139
|
}
|
|
@@ -35,10 +147,23 @@ export class MetricsCollector {
|
|
|
35
147
|
}
|
|
36
148
|
}
|
|
37
149
|
recordTokens(input, output) {
|
|
150
|
+
this.recordUsage({ input, cacheMissInput: input, output });
|
|
151
|
+
}
|
|
152
|
+
recordUsage(usage) {
|
|
153
|
+
const cacheHitInput = usage.cacheHitInput ?? 0;
|
|
154
|
+
const explicitCacheMissInput = usage.cacheMissInput ?? 0;
|
|
155
|
+
const input = usage.input ?? (cacheHitInput + explicitCacheMissInput);
|
|
156
|
+
const cacheMissInput = (cacheHitInput > 0 || explicitCacheMissInput > 0)
|
|
157
|
+
? explicitCacheMissInput
|
|
158
|
+
: input;
|
|
38
159
|
this._inputTokens += input;
|
|
39
|
-
this.
|
|
160
|
+
this._cacheHitInputTokens += cacheHitInput;
|
|
161
|
+
this._cacheMissInputTokens += cacheMissInput;
|
|
162
|
+
this._outputTokens += usage.output ?? 0;
|
|
163
|
+
this._reasoningOutputTokens += usage.reasoningOutput ?? 0;
|
|
40
164
|
if (input > 0)
|
|
41
165
|
this._lastInputTokens = input;
|
|
166
|
+
this._apiCalls++;
|
|
42
167
|
}
|
|
43
168
|
/**
|
|
44
169
|
* Get current context window usage as % of max context.
|
|
@@ -51,13 +176,17 @@ export class MetricsCollector {
|
|
|
51
176
|
}
|
|
52
177
|
estimatedCostUSD(model = 'deepseek-chat') {
|
|
53
178
|
const pricing = MODEL_PRICING[model] ?? MODEL_PRICING['deepseek-chat'];
|
|
54
|
-
return (this.
|
|
179
|
+
return (this._cacheHitInputTokens / 1_000_000) * pricing.cacheHitInputPer1M +
|
|
180
|
+
(this._cacheMissInputTokens / 1_000_000) * pricing.cacheMissInputPer1M +
|
|
55
181
|
(this._outputTokens / 1_000_000) * pricing.outputPer1M;
|
|
56
182
|
}
|
|
57
183
|
getTokenUsage() {
|
|
58
184
|
return {
|
|
59
185
|
input: this._inputTokens,
|
|
186
|
+
cacheHitInput: this._cacheHitInputTokens,
|
|
187
|
+
cacheMissInput: this._cacheMissInputTokens,
|
|
60
188
|
output: this._outputTokens,
|
|
189
|
+
reasoningOutput: this._reasoningOutputTokens,
|
|
61
190
|
total: this.totalTokens,
|
|
62
191
|
};
|
|
63
192
|
}
|
|
@@ -76,10 +205,48 @@ export class MetricsCollector {
|
|
|
76
205
|
const cost = this.estimatedCostUSD(model);
|
|
77
206
|
const costStr = cost > 0 ? ` · $${cost.toFixed(4)}` : '';
|
|
78
207
|
let summary = '\n\n━━━ Execution Summary ━━━\n';
|
|
79
|
-
|
|
80
|
-
|
|
208
|
+
// API calls count
|
|
209
|
+
const apiCallStr = this._apiCalls > 0
|
|
210
|
+
? `API calls: ${this._apiCalls}\n`
|
|
211
|
+
: '';
|
|
212
|
+
summary += apiCallStr;
|
|
213
|
+
// Session input/output totals (sum across all API calls)
|
|
214
|
+
const inputStr = this._inputTokens.toLocaleString();
|
|
215
|
+
const outputStr = this._outputTokens.toLocaleString();
|
|
216
|
+
const totalStr = this.totalTokens.toLocaleString();
|
|
217
|
+
const reasoningStr = this._reasoningOutputTokens > 0
|
|
218
|
+
? ` (reasoning: ${this._reasoningOutputTokens.toLocaleString()})`
|
|
219
|
+
: '';
|
|
220
|
+
summary += ` Session input tokens: ${inputStr}`;
|
|
221
|
+
if (this._cacheHitInputTokens > 0 || this._cacheMissInputTokens > 0) {
|
|
222
|
+
summary += ` (cache hit: ${this._cacheHitInputTokens.toLocaleString()}, cache miss: ${this._cacheMissInputTokens.toLocaleString()})`;
|
|
223
|
+
}
|
|
224
|
+
summary += '\n';
|
|
225
|
+
summary += ` Session output tokens: ${outputStr}${reasoningStr}\n`;
|
|
226
|
+
summary += ` Session total tokens: ${totalStr}\n`;
|
|
227
|
+
// Last request context window (the actual size of the last prompt)
|
|
228
|
+
const contextPercent = this.getCurrentWindowPercent();
|
|
229
|
+
if (contextPercent > 0 && this._lastInputTokens > 0) {
|
|
230
|
+
summary += `\nLast request context: ${this._lastInputTokens.toLocaleString()} tokens (${contextPercent}% of 128k window)\n`;
|
|
231
|
+
}
|
|
232
|
+
// Git change report
|
|
233
|
+
const gitReport = this.getGitChangeReport();
|
|
234
|
+
if (gitReport && (gitReport.duringRun.length > 0 || gitReport.newUntracked.length > 0 || gitReport.beforeRun.length > 0)) {
|
|
235
|
+
const formatList = (items) => {
|
|
236
|
+
if (items.length === 0)
|
|
237
|
+
return '(none)';
|
|
238
|
+
const limited = items.slice(0, 10);
|
|
239
|
+
const suffix = items.length > 10 ? ', ... +' + (items.length - 10) + ' more' : '';
|
|
240
|
+
return limited.join(', ') + suffix;
|
|
241
|
+
};
|
|
242
|
+
summary += '\nFiles:\n';
|
|
243
|
+
summary += ` changed during run: ${formatList(gitReport.duringRun)}\n`;
|
|
244
|
+
summary += ` new untracked: ${formatList(gitReport.newUntracked)}\n`;
|
|
245
|
+
summary += ` dirty before run: ${formatList(gitReport.beforeRun)}\n`;
|
|
246
|
+
}
|
|
247
|
+
// Tool breakdown
|
|
81
248
|
if (this.toolCallLog.length > 0) {
|
|
82
|
-
|
|
249
|
+
summary += '\n';
|
|
83
250
|
const groups = new Map();
|
|
84
251
|
for (const call of this.toolCallLog) {
|
|
85
252
|
const g = groups.get(call.tool) ?? { count: 0, totalDuration: 0, success: 0, fail: 0 };
|
|
@@ -93,8 +260,9 @@ export class MetricsCollector {
|
|
|
93
260
|
}
|
|
94
261
|
groups.set(call.tool, g);
|
|
95
262
|
}
|
|
96
|
-
summary += `Tools: ${Array.from(groups.entries()).map(([name, g]) => `${name}
|
|
263
|
+
summary += `Tools: ${Array.from(groups.entries()).map(([name, g]) => `${name} x${g.count}${g.fail > 0 ? ` (${g.success} ok ${g.fail} failed)` : ''}`).join(', ')}\n`;
|
|
97
264
|
}
|
|
265
|
+
summary += `Time: ${mins}m ${secs}s${costStr}\n`;
|
|
98
266
|
summary += '━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
|
|
99
267
|
return summary;
|
|
100
268
|
}
|
|
@@ -102,10 +270,41 @@ export class MetricsCollector {
|
|
|
102
270
|
this.startTime = Date.now();
|
|
103
271
|
this._toolCalls = 0;
|
|
104
272
|
this._inputTokens = 0;
|
|
273
|
+
this._cacheHitInputTokens = 0;
|
|
274
|
+
this._cacheMissInputTokens = 0;
|
|
105
275
|
this._outputTokens = 0;
|
|
276
|
+
this._reasoningOutputTokens = 0;
|
|
106
277
|
this._lastInputTokens = 0;
|
|
278
|
+
this._apiCalls = 0;
|
|
107
279
|
this.toolTimings.clear();
|
|
108
280
|
this.toolCallLog = [];
|
|
281
|
+
this._gitBaseline = null;
|
|
282
|
+
this._gitFinal = null;
|
|
283
|
+
}
|
|
284
|
+
/** Capture git baseline at the start of a session. */
|
|
285
|
+
captureGitBaseline(cwd) {
|
|
286
|
+
this._gitBaseline = captureGitStatus(cwd);
|
|
287
|
+
}
|
|
288
|
+
/** Capture git final at the end of a session. */
|
|
289
|
+
captureGitFinal(cwd) {
|
|
290
|
+
this._gitFinal = captureGitStatus(cwd);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get a structured change report comparing baseline and final statuses.
|
|
294
|
+
* Returns null if either baseline or final hasn't been captured.
|
|
295
|
+
*/
|
|
296
|
+
getGitChangeReport() {
|
|
297
|
+
if (this._gitBaseline === null || this._gitFinal === null)
|
|
298
|
+
return null;
|
|
299
|
+
const baselineSet = new Set(this._gitBaseline.all);
|
|
300
|
+
const baselineUntrackedSet = new Set(this._gitBaseline.untracked);
|
|
301
|
+
const duringRun = this._gitFinal.all.filter(p => !baselineSet.has(p));
|
|
302
|
+
const newUntracked = this._gitFinal.untracked.filter(p => !baselineUntrackedSet.has(p));
|
|
303
|
+
return {
|
|
304
|
+
beforeRun: [...this._gitBaseline.all],
|
|
305
|
+
duringRun,
|
|
306
|
+
newUntracked,
|
|
307
|
+
};
|
|
109
308
|
}
|
|
110
309
|
}
|
|
111
310
|
//# sourceMappingURL=metrics.js.map
|
package/dist/core/metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/chrome.js
CHANGED
|
@@ -576,26 +576,26 @@ export function getLastBrowserTestResult() {
|
|
|
576
576
|
* Returns the server and the URL.
|
|
577
577
|
*/
|
|
578
578
|
async function startTestServer() {
|
|
579
|
-
const html = `<!DOCTYPE html>
|
|
580
|
-
<html lang="en">
|
|
581
|
-
<head><meta charset="UTF-8"><title>Browser Test Page</title></head>
|
|
582
|
-
<body>
|
|
583
|
-
<h1 id="test-title">Browser Test</h1>
|
|
584
|
-
<p id="test-paragraph">Hello, world!</p>
|
|
585
|
-
<button id="test-button" onclick="document.getElementById('test-output').textContent='clicked'">Click Me</button>
|
|
586
|
-
<input id="test-input" type="text" placeholder="Type here">
|
|
587
|
-
<label><input type="checkbox" id="test-checkbox" checked> Checkbox</label>
|
|
588
|
-
<label><input type="radio" name="test-radio" id="radio-1" checked> Radio 1</label>
|
|
589
|
-
<label><input type="radio" name="test-radio" id="radio-2"> Radio 2</label>
|
|
590
|
-
<div id="test-output"></div>
|
|
591
|
-
<script>
|
|
592
|
-
console.log('Browser test page loaded');
|
|
593
|
-
console.error('Test error message');
|
|
594
|
-
localStorage.setItem('test-key', 'test-value');
|
|
595
|
-
sessionStorage.setItem('session-key', 'session-value');
|
|
596
|
-
document.cookie = 'test-cookie=chocolate-chip; path=/';
|
|
597
|
-
</script>
|
|
598
|
-
</body>
|
|
579
|
+
const html = `<!DOCTYPE html>
|
|
580
|
+
<html lang="en">
|
|
581
|
+
<head><meta charset="UTF-8"><title>Browser Test Page</title></head>
|
|
582
|
+
<body>
|
|
583
|
+
<h1 id="test-title">Browser Test</h1>
|
|
584
|
+
<p id="test-paragraph">Hello, world!</p>
|
|
585
|
+
<button id="test-button" onclick="document.getElementById('test-output').textContent='clicked'">Click Me</button>
|
|
586
|
+
<input id="test-input" type="text" placeholder="Type here">
|
|
587
|
+
<label><input type="checkbox" id="test-checkbox" checked> Checkbox</label>
|
|
588
|
+
<label><input type="radio" name="test-radio" id="radio-1" checked> Radio 1</label>
|
|
589
|
+
<label><input type="radio" name="test-radio" id="radio-2"> Radio 2</label>
|
|
590
|
+
<div id="test-output"></div>
|
|
591
|
+
<script>
|
|
592
|
+
console.log('Browser test page loaded');
|
|
593
|
+
console.error('Test error message');
|
|
594
|
+
localStorage.setItem('test-key', 'test-value');
|
|
595
|
+
sessionStorage.setItem('session-key', 'session-value');
|
|
596
|
+
document.cookie = 'test-cookie=chocolate-chip; path=/';
|
|
597
|
+
</script>
|
|
598
|
+
</body>
|
|
599
599
|
</html>`;
|
|
600
600
|
return new Promise((resolve, reject) => {
|
|
601
601
|
const server = createServer((_req, res) => {
|
|
@@ -668,23 +668,23 @@ export async function browserTest(options) {
|
|
|
668
668
|
}
|
|
669
669
|
if (!testUrl) {
|
|
670
670
|
// Fall back to data: URL for basic tests, skip storage/network
|
|
671
|
-
const dataUrl = `data:text/html,<!DOCTYPE html>
|
|
672
|
-
<html lang="en">
|
|
673
|
-
<head><meta charset="UTF-8"><title>Browser Test Page</title></head>
|
|
674
|
-
<body>
|
|
675
|
-
<h1 id="test-title">Browser Test</h1>
|
|
676
|
-
<p id="test-paragraph">Hello, world!</p>
|
|
677
|
-
<button id="test-button" onclick="document.getElementById('test-output').textContent='clicked'">Click Me</button>
|
|
678
|
-
<input id="test-input" type="text" placeholder="Type here">
|
|
679
|
-
<label><input type="checkbox" id="test-checkbox" checked> Checkbox</label>
|
|
680
|
-
<label><input type="radio" name="test-radio" id="radio-1" checked> Radio 1</label>
|
|
681
|
-
<label><input type="radio" name="test-radio" id="radio-2"> Radio 2</label>
|
|
682
|
-
<div id="test-output"></div>
|
|
683
|
-
<script>
|
|
684
|
-
console.log('Browser test page loaded');
|
|
685
|
-
console.error('Test error message');
|
|
686
|
-
</script>
|
|
687
|
-
</body>
|
|
671
|
+
const dataUrl = `data:text/html,<!DOCTYPE html>
|
|
672
|
+
<html lang="en">
|
|
673
|
+
<head><meta charset="UTF-8"><title>Browser Test Page</title></head>
|
|
674
|
+
<body>
|
|
675
|
+
<h1 id="test-title">Browser Test</h1>
|
|
676
|
+
<p id="test-paragraph">Hello, world!</p>
|
|
677
|
+
<button id="test-button" onclick="document.getElementById('test-output').textContent='clicked'">Click Me</button>
|
|
678
|
+
<input id="test-input" type="text" placeholder="Type here">
|
|
679
|
+
<label><input type="checkbox" id="test-checkbox" checked> Checkbox</label>
|
|
680
|
+
<label><input type="radio" name="test-radio" id="radio-1" checked> Radio 1</label>
|
|
681
|
+
<label><input type="radio" name="test-radio" id="radio-2"> Radio 2</label>
|
|
682
|
+
<div id="test-output"></div>
|
|
683
|
+
<script>
|
|
684
|
+
console.log('Browser test page loaded');
|
|
685
|
+
console.error('Test error message');
|
|
686
|
+
</script>
|
|
687
|
+
</body>
|
|
688
688
|
</html>`;
|
|
689
689
|
const baseArgs = { url: dataUrl, sameTab: true, timeout: 30000 };
|
|
690
690
|
async function runDataStep(name, action, extraArgs) {
|
|
@@ -1026,22 +1026,22 @@ function buildRealTestReport(results, totalCalls, totalSites) {
|
|
|
1026
1026
|
}
|
|
1027
1027
|
export const chromeTool = {
|
|
1028
1028
|
name: 'chrome',
|
|
1029
|
-
description: `Control a real browser through a native Chrome runtime.
|
|
1030
|
-
Use it for UI validation, rendered DOM inspection, console and network debugging,
|
|
1031
|
-
screenshots, and multi-step browser workflows when terminal tools are not enough.
|
|
1032
|
-
If the task mentions localhost pages, forms, browser bugs, screenshots, rendered state,
|
|
1033
|
-
console output, or network requests, this is the primary tool.
|
|
1034
|
-
|
|
1035
|
-
Examples:
|
|
1036
|
-
- { "action": "open", "url": "https://example.com" }
|
|
1037
|
-
- { "action": "text", "url": "https://example.com", "selector": "h1" }
|
|
1038
|
-
- { "action": "click", "url": "https://example.com", "selector": ".submit-btn" }
|
|
1039
|
-
- { "action": "fill", "url": "https://example.com/login", "selector": "#email", "text": "user@example.com" }
|
|
1040
|
-
- { "action": "eval", "url": "https://example.com", "code": "document.title" }
|
|
1041
|
-
- { "action": "network", "url": "https://example.com", "api": true }
|
|
1042
|
-
- { "action": "state" }
|
|
1043
|
-
- { "action": "shot", "url": "https://example.com", "output": "screenshot.png", "full": true }
|
|
1044
|
-
- Use "sameTab": true for multi-step flows in one tab.
|
|
1029
|
+
description: `Control a real browser through a native Chrome runtime.
|
|
1030
|
+
Use it for UI validation, rendered DOM inspection, console and network debugging,
|
|
1031
|
+
screenshots, and multi-step browser workflows when terminal tools are not enough.
|
|
1032
|
+
If the task mentions localhost pages, forms, browser bugs, screenshots, rendered state,
|
|
1033
|
+
console output, or network requests, this is the primary tool.
|
|
1034
|
+
|
|
1035
|
+
Examples:
|
|
1036
|
+
- { "action": "open", "url": "https://example.com" }
|
|
1037
|
+
- { "action": "text", "url": "https://example.com", "selector": "h1" }
|
|
1038
|
+
- { "action": "click", "url": "https://example.com", "selector": ".submit-btn" }
|
|
1039
|
+
- { "action": "fill", "url": "https://example.com/login", "selector": "#email", "text": "user@example.com" }
|
|
1040
|
+
- { "action": "eval", "url": "https://example.com", "code": "document.title" }
|
|
1041
|
+
- { "action": "network", "url": "https://example.com", "api": true }
|
|
1042
|
+
- { "action": "state" }
|
|
1043
|
+
- { "action": "shot", "url": "https://example.com", "output": "screenshot.png", "full": true }
|
|
1044
|
+
- Use "sameTab": true for multi-step flows in one tab.
|
|
1045
1045
|
- Use "headless": true for automation or CI-safe browser execution.`,
|
|
1046
1046
|
parameters: chromeParameters,
|
|
1047
1047
|
execute: async (args) => {
|
package/dist/tools/edit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,YAAY,CAAA;AAGvD,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,YAAY,CAAA;AAGvD,eAAO,MAAM,QAAQ,EAAE,IAoGtB,CAAA"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -37,6 +37,18 @@ export const editTool = {
|
|
|
37
37
|
try {
|
|
38
38
|
assertPathInWorkspace(filePath);
|
|
39
39
|
const content = await readFile(filePath, 'utf-8');
|
|
40
|
+
// Check if old_string exists
|
|
41
|
+
const index = content.indexOf(oldString);
|
|
42
|
+
if (index === -1) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
output: '',
|
|
46
|
+
error: 'String not found in file',
|
|
47
|
+
changed: false,
|
|
48
|
+
verified: false,
|
|
49
|
+
changedFiles: [],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
40
52
|
if (replaceAll) {
|
|
41
53
|
const replaced = content.replaceAll(oldString, newString);
|
|
42
54
|
if (replaced === content) {
|
|
@@ -44,28 +56,35 @@ export const editTool = {
|
|
|
44
56
|
success: false,
|
|
45
57
|
output: '',
|
|
46
58
|
error: 'String not found in file',
|
|
59
|
+
changed: false,
|
|
60
|
+
verified: false,
|
|
61
|
+
changedFiles: [],
|
|
47
62
|
};
|
|
48
63
|
}
|
|
49
64
|
await writeFile(filePath, replaced, 'utf-8');
|
|
65
|
+
// Verify by re-reading
|
|
66
|
+
const writtenContent = await readFile(filePath, 'utf-8');
|
|
67
|
+
const verified = writtenContent === replaced;
|
|
50
68
|
return {
|
|
51
69
|
success: true,
|
|
52
70
|
output: `Replaced all occurrences in ${filePath}`,
|
|
71
|
+
changed: true,
|
|
72
|
+
verified,
|
|
73
|
+
changedFiles: [filePath],
|
|
53
74
|
};
|
|
54
75
|
}
|
|
55
76
|
else {
|
|
56
|
-
const index = content.indexOf(oldString);
|
|
57
|
-
if (index === -1) {
|
|
58
|
-
return {
|
|
59
|
-
success: false,
|
|
60
|
-
output: '',
|
|
61
|
-
error: 'String not found in file',
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
77
|
const replaced = content.replace(oldString, newString);
|
|
65
78
|
await writeFile(filePath, replaced, 'utf-8');
|
|
79
|
+
// Verify by re-reading
|
|
80
|
+
const writtenContent = await readFile(filePath, 'utf-8');
|
|
81
|
+
const verified = writtenContent === replaced;
|
|
66
82
|
return {
|
|
67
83
|
success: true,
|
|
68
84
|
output: `Successfully edited ${filePath}`,
|
|
85
|
+
changed: true,
|
|
86
|
+
verified,
|
|
87
|
+
changedFiles: [filePath],
|
|
69
88
|
};
|
|
70
89
|
}
|
|
71
90
|
}
|
|
@@ -74,6 +93,9 @@ export const editTool = {
|
|
|
74
93
|
success: false,
|
|
75
94
|
output: '',
|
|
76
95
|
error: `Failed to edit file: ${err.message}`,
|
|
96
|
+
changed: false,
|
|
97
|
+
verified: false,
|
|
98
|
+
changedFiles: [],
|
|
77
99
|
};
|
|
78
100
|
}
|
|
79
101
|
},
|
package/dist/tools/edit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,iFAAiF;IAC9F,UAAU,EAAE;QACV;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,KAAK,CAAC,OAAO,CAAE,IAA6B;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAmB,CAAA;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAoB,CAAA;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAoB,CAAA;QAC3C,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;QAErC,IAAI,CAAC;YACH,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC/B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAEjD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBACzD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAE;wBACV,KAAK,EAAE,0BAA0B;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
|