@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +12 -0
  3. package/README.ru.md +12 -0
  4. package/dist/api/index.d.ts +4 -4
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +17 -5
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/cli/headless.d.ts.map +1 -1
  9. package/dist/cli/headless.js +2 -0
  10. package/dist/cli/headless.js.map +1 -1
  11. package/dist/commands/index.d.ts +7 -0
  12. package/dist/commands/index.d.ts.map +1 -1
  13. package/dist/commands/index.js +188 -79
  14. package/dist/commands/index.js.map +1 -1
  15. package/dist/config/defaults.d.ts +2 -1
  16. package/dist/config/defaults.d.ts.map +1 -1
  17. package/dist/config/defaults.js +4 -2
  18. package/dist/config/defaults.js.map +1 -1
  19. package/dist/core/agent-loop.d.ts +27 -1
  20. package/dist/core/agent-loop.d.ts.map +1 -1
  21. package/dist/core/agent-loop.js +165 -10
  22. package/dist/core/agent-loop.js.map +1 -1
  23. package/dist/core/i18n.d.ts +2 -0
  24. package/dist/core/i18n.d.ts.map +1 -1
  25. package/dist/core/i18n.js +15 -9
  26. package/dist/core/i18n.js.map +1 -1
  27. package/dist/core/metrics.d.ts +53 -0
  28. package/dist/core/metrics.d.ts.map +1 -1
  29. package/dist/core/metrics.js +205 -6
  30. package/dist/core/metrics.js.map +1 -1
  31. package/dist/tools/chrome.js +53 -53
  32. package/dist/tools/edit.d.ts.map +1 -1
  33. package/dist/tools/edit.js +30 -8
  34. package/dist/tools/edit.js.map +1 -1
  35. package/dist/tools/types.d.ts +28 -0
  36. package/dist/tools/types.d.ts.map +1 -1
  37. package/dist/tools/types.js +10 -0
  38. package/dist/tools/types.js.map +1 -1
  39. package/dist/tools/write.d.ts.map +1 -1
  40. package/dist/tools/write.js +13 -1
  41. package/dist/tools/write.js.map +1 -1
  42. package/dist/ui/activity-cards.js +9 -9
  43. package/dist/ui/activity-cards.js.map +1 -1
  44. package/dist/ui/app.d.ts.map +1 -1
  45. package/dist/ui/app.js +59 -14
  46. package/dist/ui/app.js.map +1 -1
  47. package/dist/ui/chat-view.js +2 -2
  48. package/dist/ui/chat-view.js.map +1 -1
  49. package/dist/ui/input-bar.d.ts.map +1 -1
  50. package/dist/ui/input-bar.js +268 -70
  51. package/dist/ui/input-bar.js.map +1 -1
  52. package/dist/ui/markdown-view.d.ts +9 -0
  53. package/dist/ui/markdown-view.d.ts.map +1 -1
  54. package/dist/ui/markdown-view.js +70 -34
  55. package/dist/ui/markdown-view.js.map +1 -1
  56. package/dist/ui/reasoning-view.js +1 -1
  57. package/dist/ui/reasoning-view.js.map +1 -1
  58. package/dist/ui/results-panel.js +1 -1
  59. package/dist/ui/results-panel.js.map +1 -1
  60. package/dist/ui/setup-wizard.js +5 -5
  61. package/dist/ui/setup-wizard.js.map +1 -1
  62. package/dist/ui/status-bar.js +1 -1
  63. package/dist/ui/status-bar.js.map +1 -1
  64. package/dist/ui/tool-activity-card.js +9 -9
  65. package/dist/ui/tool-activity-card.js.map +1 -1
  66. package/dist/ui/tool-call-view.js +7 -7
  67. package/dist/ui/tool-call-view.js.map +1 -1
  68. package/package.json +2 -1
@@ -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":"AAEA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,WAAW,CAA+D;IAClF,OAAO,CAAC,WAAW,CAAkE;IAErF,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,YAAY,IAAK,MAAM,CAE1B;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,mBAAmB,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5C,iBAAiB,CAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI;IAUnE,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlD;;;OAGG;IACH,uBAAuB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK9D,gBAAgB,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAM1D,aAAa,IAAK,UAAU;IAQ5B;;OAEG;IACH,sBAAsB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK7D,UAAU,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IA8BpD,KAAK,IAAK,IAAI;CASf"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,GAAG,EAAE,MAAM,EAAE,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAYvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAsEjE;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,qBAAqB,CAAY;IACzC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAA+D;IAClF,OAAO,CAAC,WAAW,CAAkE;IACrF,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,SAAS,CAAiC;IAElD,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,YAAY,IAAK,MAAM,CAE1B;IAED,IAAI,mBAAmB,IAAK,MAAM,CAEjC;IAED,IAAI,oBAAoB,IAAK,MAAM,CAElC;IAED,IAAI,qBAAqB,IAAK,MAAM,CAEnC;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,QAAQ,IAAK,MAAM,CAEtB;IAED,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,qEAAqE;IACrE,IAAI,kBAAkB,IAAK,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAErF;IAED,mDAAmD;IACnD,gBAAgB,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAIvC,8DAA8D;IAC9D,mBAAmB,CAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAK7C,mBAAmB,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5C,iBAAiB,CAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI;IAUnE,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlD,WAAW,CAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAiB9C;;;OAGG;IACH,uBAAuB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK9D,gBAAgB,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAO1D,aAAa,IAAK,UAAU;IAW5B;;OAEG;IACH,sBAAsB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK7D,UAAU,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAyEpD,KAAK,IAAK,IAAI;IAgBd,sDAAsD;IACtD,kBAAkB,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAItC,iDAAiD;IACjD,eAAe,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAInC;;;OAGG;IACH,kBAAkB,IAAK;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;CAenG"}
@@ -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._outputTokens += output;
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._inputTokens / 1_000_000) * pricing.inputPer1M +
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
- summary += `Tool uses: ${this._toolCalls} · Tokens: ${this.totalTokens.toLocaleString()} (in: ${this._inputTokens.toLocaleString()}, out: ${this._outputTokens.toLocaleString()})${costStr} · Time: ${mins}m ${secs}s\n`;
80
- // Add compact tool breakdown if there were calls
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
- // Group by tool name for compact display
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} ×${g.count}${g.fail > 0 ? ` (${g.success} ${g.fail})` : ''}`).join(', ')}\n`;
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
@@ -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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"}
@@ -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) => {
@@ -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,IA6EtB,CAAA"}
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"}
@@ -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
  },
@@ -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;qBAClC,CAAA;gBACH,CAAC;gBACD,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAC5C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,+BAA+B,QAAQ,EAAE;iBAClD,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAE;wBACV,KAAK,EAAE,0BAA0B;qBAClC,CAAA;gBACH,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBACtD,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAC5C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,uBAAuB,QAAQ,EAAE;iBAC1C,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,wBAAyB,GAAa,CAAC,OAAO,EAAE;aACxD,CAAA;QACH,CAAC;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}